From 7504fe61b843b6e637138903cf7f1290f1c665fe Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 7 May 2025 18:45:45 +0300 Subject: [PATCH 0001/1674] Post 3.14.0b1 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index c9dd659046a367..03ac5843b62066 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -24,7 +24,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.14.0b1" +#define PY_VERSION "3.14.0b1+" /*--end constants--*/ From 0eb2291a7e85062dba387dfecaee94858db8a0a9 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Wed, 7 May 2025 16:35:46 -0500 Subject: [PATCH 0002/1674] [3.14] Forward-port 'check-abi' CI job from 3.13 (GH-133614) Also add the python3.14.abi file as generated by the new job and remove the 'main branch only' entry from .gitignore. The only difference from the 3.13 job is the addition of `with.python-version: 3.x` to the `setup-python` configuration to pacify a warning. --- .github/workflows/build.yml | 47 + .gitignore | 3 - Doc/data/python3.14.abi | 31341 ++++++++++++++++++++++++++++++++++ 3 files changed, 31388 insertions(+), 3 deletions(-) create mode 100644 Doc/data/python3.14.abi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b192508c78685c..3478af18f0e9cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,6 +43,53 @@ jobs: if: fromJSON(needs.build-context.outputs.run-docs) uses: ./.github/workflows/reusable-docs.yml + check-abi: + name: 'Check if the ABI has changed' + runs-on: ubuntu-22.04 # 24.04 causes spurious errors + needs: build-context + if: needs.build-context.outputs.run-tests == 'true' + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install dependencies + run: | + sudo ./.github/workflows/posix-deps-apt.sh + sudo apt-get install -yq abigail-tools + - name: Build CPython + env: + CFLAGS: -g3 -O0 + run: | + # Build Python with the libpython dynamic library + ./configure --enable-shared + make -j4 + - name: Check for changes in the ABI + id: check + run: | + if ! make check-abidump; then + echo "Generated ABI file is not up to date." + echo "Please add the release manager of this branch as a reviewer of this PR." + 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/getting-started/setup-building/index.html#regenerate-the-abi-dump" + echo "" + exit 1 + fi + - name: Generate updated ABI files + if: ${{ failure() && steps.check.conclusion == 'failure' }} + run: | + make regen-abidump + - 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 diff --git a/.gitignore b/.gitignore index 2a6f249275c32e..7965f6a404368e 100644 --- a/.gitignore +++ b/.gitignore @@ -170,6 +170,3 @@ Python/frozen_modules/MANIFEST # Ignore ./python binary on Unix but still look into ./Python/ directory. /python !/Python/ - -# main branch only: ABI files are not checked/maintained. -Doc/data/python*.abi diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi new file mode 100644 index 00000000000000..c13b44e0945389 --- /dev/null +++ b/Doc/data/python3.14.abi @@ -0,0 +1,31341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e2d440ebc6d2457d23c80da75a5b1b40b17f0b4e Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Wed, 7 May 2025 18:03:30 -0400 Subject: [PATCH 0003/1674] [3.14] gh-131535: Fix stale example in html.parser docs, make examples doctests (GH-131551) (GH-133589) (cherry picked from commit ee76e36d76a0e6916c0afc41228b043ab5174685) --- Doc/library/html.parser.rst | 51 +++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst index 6d433b5a04fc4a..dd67fc34e856f1 100644 --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -43,7 +43,9 @@ Example HTML Parser Application As a basic example, below is a simple HTML parser that uses the :class:`HTMLParser` class to print out start tags, end tags, and data -as they are encountered:: +as they are encountered: + +.. testcode:: from html.parser import HTMLParser @@ -63,7 +65,7 @@ as they are encountered:: The output will then be: -.. code-block:: none +.. testoutput:: Encountered a start tag: html Encountered a start tag: head @@ -230,7 +232,9 @@ Examples -------- The following class implements a parser that will be used to illustrate more -examples:: +examples: + +.. testcode:: from html.parser import HTMLParser from html.entities import name2codepoint @@ -266,13 +270,17 @@ examples:: parser = MyHTMLParser() -Parsing a doctype:: +Parsing a doctype: + +.. doctest:: >>> parser.feed('') Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" -Parsing an element with a few attributes and a title:: +Parsing an element with a few attributes and a title: + +.. doctest:: >>> parser.feed('The Python logo') Start tag: img @@ -285,7 +293,9 @@ Parsing an element with a few attributes and a title:: End tag : h1 The content of ``script`` and ``style`` elements is returned as is, without -further parsing:: +further parsing: + +.. doctest:: >>> parser.feed('') Start tag: style @@ -300,16 +310,25 @@ further parsing:: Data : alert("hello!"); End tag : script -Parsing comments:: +Parsing comments: + +.. doctest:: - >>> parser.feed('' + >>> parser.feed('' ... '') - Comment : a comment + Comment : a comment Comment : [if IE 9]>IE-specific content'``):: +correct char (note: these 3 references are all equivalent to ``'>'``): +.. doctest:: + + >>> parser = MyHTMLParser() + >>> parser.feed('>>>') + Data : >>> + + >>> parser = MyHTMLParser(convert_charrefs=False) >>> parser.feed('>>>') Named ent: > Num ent : > @@ -317,18 +336,22 @@ correct char (note: these 3 references are all equivalent to ``'>'``):: Feeding incomplete chunks to :meth:`~HTMLParser.feed` works, but :meth:`~HTMLParser.handle_data` might be called more than once -(unless *convert_charrefs* is set to ``True``):: +(unless *convert_charrefs* is set to ``True``): - >>> for chunk in ['buff', 'ered ', 'text']: +.. doctest:: + + >>> for chunk in ['buff', 'ered', ' text']: ... parser.feed(chunk) ... Start tag: span Data : buff Data : ered - Data : text + Data : text End tag : span -Parsing invalid HTML (e.g. unquoted attributes) also works:: +Parsing invalid HTML (e.g. unquoted attributes) also works: + +.. doctest:: >>> parser.feed('

tag soup

') Start tag: p From cc588aaa5f9cd0e412fe6cc434f74c0039937418 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 00:10:51 +0200 Subject: [PATCH 0004/1674] [3.14] gh-133361: move the explanation of dict equal before its use (GH-133424) (#133620) gh-133361: move the explanation of dict equal before its use (GH-133424) Also move up the explanation of insertion order preservation. Both paragraphs seemed out of place down where they were. --------- (cherry picked from commit 61ac88c06e0286cfc6465a47552d41b7dd7e083e) Co-authored-by: Yongzi Li <1538321957@qq.com> Co-authored-by: Terry Jan Reedy --- Doc/library/stdtypes.rst | 55 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 39aaa5da0786f8..61d39a6671caed 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4823,7 +4823,13 @@ can be used interchangeably to index the same dictionary entry. being added is already present, the value from the keyword argument replaces the value from the positional argument. - To illustrate, the following examples all return a dictionary equal to + Providing keyword arguments as in the first example only works for keys that + are valid Python identifiers. Otherwise, any valid keys can be used. + + Dictionaries compare equal if and only if they have the same ``(key, + value)`` pairs (regardless of ordering). Order comparisons ('<', '<=', '>=', '>') raise + :exc:`TypeError`. To illustrate dictionary creation and equality, + the following examples all return a dictionary equal to ``{"one": 1, "two": 2, "three": 3}``:: >>> a = dict(one=1, two=2, three=3) @@ -4838,6 +4844,27 @@ can be used interchangeably to index the same dictionary entry. Providing keyword arguments as in the first example only works for keys that are valid Python identifiers. Otherwise, any valid keys can be used. + Dictionaries preserve insertion order. Note that updating a key does not + affect the order. Keys added after deletion are inserted at the end. :: + + >>> d = {"one": 1, "two": 2, "three": 3, "four": 4} + >>> d + {'one': 1, 'two': 2, 'three': 3, 'four': 4} + >>> list(d) + ['one', 'two', 'three', 'four'] + >>> list(d.values()) + [1, 2, 3, 4] + >>> d["one"] = 42 + >>> d + {'one': 42, 'two': 2, 'three': 3, 'four': 4} + >>> del d["two"] + >>> d["two"] = None + >>> d + {'one': 42, 'three': 3, 'four': 4, 'two': None} + + .. versionchanged:: 3.7 + Dictionary order is guaranteed to be insertion order. This behavior was + an implementation detail of CPython from 3.6. These are the operations that dictionaries support (and therefore, custom mapping types should support too): @@ -5008,32 +5035,6 @@ can be used interchangeably to index the same dictionary entry. .. versionadded:: 3.9 - Dictionaries compare equal if and only if they have the same ``(key, - value)`` pairs (regardless of ordering). Order comparisons ('<', '<=', '>=', '>') raise - :exc:`TypeError`. - - Dictionaries preserve insertion order. Note that updating a key does not - affect the order. Keys added after deletion are inserted at the end. :: - - >>> d = {"one": 1, "two": 2, "three": 3, "four": 4} - >>> d - {'one': 1, 'two': 2, 'three': 3, 'four': 4} - >>> list(d) - ['one', 'two', 'three', 'four'] - >>> list(d.values()) - [1, 2, 3, 4] - >>> d["one"] = 42 - >>> d - {'one': 42, 'two': 2, 'three': 3, 'four': 4} - >>> del d["two"] - >>> d["two"] = None - >>> d - {'one': 42, 'three': 3, 'four': 4, 'two': None} - - .. versionchanged:: 3.7 - Dictionary order is guaranteed to be insertion order. This behavior was - an implementation detail of CPython from 3.6. - Dictionaries and dictionary views are reversible. :: >>> d = {"one": 1, "two": 2, "three": 3, "four": 4} From c98b5a9369e863d56cf4f919445ca6d743369530 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 00:20:17 +0200 Subject: [PATCH 0005/1674] [3.14] gh-133558: Skip test_pdb tests on FreeBSD (GH-133566) (#133616) gh-133558: Skip test_pdb tests on FreeBSD (GH-133566) '\x08' is not interpreted as backspace on FreeBSD. (cherry picked from commit 79b8a32fcb30b2c6549bacecdc7081ebd50d6e17) Co-authored-by: Victor Stinner --- Lib/test/test_pdb.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 54797d7898ff33..68c2b508fa64dc 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -4848,6 +4848,8 @@ def f(): self.assertIn(b'I love Python', output) + @unittest.skipIf(sys.platform.startswith('freebsd'), + '\\x08 is not interpreted as backspace on FreeBSD') def test_multiline_auto_indent(self): script = textwrap.dedent(""" import pdb; pdb.Pdb().set_trace() @@ -4886,6 +4888,8 @@ def test_multiline_completion(self): self.assertIn(b'42', output) + @unittest.skipIf(sys.platform.startswith('freebsd'), + '\\x08 is not interpreted as backspace on FreeBSD') def test_multiline_indent_completion(self): script = textwrap.dedent(""" import pdb; pdb.Pdb().set_trace() From 54c3aa1597ef3b7a967a27a5ea8577cefeb59769 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 00:26:06 +0200 Subject: [PATCH 0006/1674] [3.14] gh-133516: Raise `ValueError` when constants `True`, `False` or `None` are used as an identifier after NFKC normalization (GH-133523) (#133596) --- Lib/test/test_ast/test_ast.py | 11 +++++++++++ ...2025-05-06-15-01-41.gh-issue-133516.RqWVf2.rst | 2 ++ Parser/pegen.c | 15 +++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-06-15-01-41.gh-issue-133516.RqWVf2.rst diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 09cf3186e05cc1..02628868db008c 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -821,6 +821,17 @@ def test_constant_as_name(self): with self.assertRaisesRegex(ValueError, f"identifier field can't represent '{constant}' constant"): compile(expr, "", "eval") + def test_constant_as_unicode_name(self): + constants = [ + ("True", b"Tru\xe1\xb5\x89"), + ("False", b"Fal\xc5\xbfe"), + ("None", b"N\xc2\xbane"), + ] + for constant in constants: + with self.assertRaisesRegex(ValueError, + f"identifier field can't represent '{constant[0]}' constant"): + ast.parse(constant[1], mode="eval") + def test_precedence_enum(self): class _Precedence(enum.IntEnum): """Precedence table that originated from python grammar.""" diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-06-15-01-41.gh-issue-133516.RqWVf2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-06-15-01-41.gh-issue-133516.RqWVf2.rst new file mode 100644 index 00000000000000..b93ba11f93252b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-06-15-01-41.gh-issue-133516.RqWVf2.rst @@ -0,0 +1,2 @@ +Raise :exc:`ValueError` when constants ``True``, ``False`` or ``None`` are +used as an identifier after NFKC normalization. diff --git a/Parser/pegen.c b/Parser/pegen.c index 3efeba78450d1a..81aad47010181c 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -549,6 +549,21 @@ _PyPegen_new_identifier(Parser *p, const char *n) } id = id2; } + static const char * const forbidden[] = { + "None", + "True", + "False", + NULL + }; + for (int i = 0; forbidden[i] != NULL; i++) { + if (_PyUnicode_EqualToASCIIString(id, forbidden[i])) { + PyErr_Format(PyExc_ValueError, + "identifier field can't represent '%s' constant", + forbidden[i]); + Py_DECREF(id); + goto error; + } + } PyInterpreterState *interp = _PyInterpreterState_GET(); _PyUnicode_InternImmortal(interp, &id); if (_PyArena_AddPyObject(p->arena, id) < 0) From c39bc81b70cdd67b72a3c12cf2c6418414e266c9 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 7 May 2025 18:00:33 -0600 Subject: [PATCH 0007/1674] [3.14] gh-132775: Unrevert "Add _PyCode_VerifyStateless()" (gh-133625) This reverts commit 3c73cf5 (gh-133497), which itself reverted the original commit d270bb5 (gh-133221). We reverted the original change due to failing android tests. The checks in _PyCode_CheckNoInternalState() were too strict, so we've relaxed them. --- Include/internal/pycore_code.h | 41 ++++++ Include/internal/pycore_function.h | 7 ++ Include/internal/pycore_opcode_utils.h | 2 + Lib/test/_code_definitions.py | 26 ++++ Lib/test/test_code.py | 54 +++++--- Modules/_testinternalcapi.c | 43 +++++++ Objects/codeobject.c | 168 ++++++++++++++++++++++--- Objects/funcobject.c | 54 ++++++++ 8 files changed, 358 insertions(+), 37 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index b135e30b7ad62a..37a747aa4e3e46 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -614,6 +614,47 @@ PyAPI_FUNC(int) _PyCode_SetUnboundVarCounts( PyObject *globalsns, PyObject *builtinsns); + +/* "Stateless" code is a function or code object which does not rely on + * external state or internal state. It may rely on arguments and + * builtins, but not globals or a closure. Thus it does not rely + * on __globals__ or __closure__, and a stateless function + * is equivalent to its code object. + * + * Stateless code also does not keep any persistent state + * of its own, so it can't have any executors, monitoring, + * instrumentation, or "extras" (i.e. co_extra). + * + * Stateless code may create nested functions, including closures. + * However, nested functions must themselves be stateless, except they + * *can* close on the enclosing locals. + * + * Stateless code may return any value, including nested functions and closures. + * + * Stateless code that takes no arguments and doesn't return anything + * may be treated like a script. + * + * We consider stateless code to be "portable" if it does not return + * any object that holds a reference to any of the code's locals. Thus + * generators and coroutines are not portable. Likewise a function + * that returns a closure is not portable. The concept of + * portability is useful in cases where the code is run + * in a different execution context than where + * the return value will be used. */ + +PyAPI_FUNC(int) _PyCode_CheckNoInternalState(PyCodeObject *, const char **); +PyAPI_FUNC(int) _PyCode_CheckNoExternalState( + PyCodeObject *, + _PyCode_var_counts_t *, + const char **); +PyAPI_FUNC(int) _PyCode_VerifyStateless( + PyThreadState *, + PyCodeObject *, + PyObject *globalnames, + PyObject *globalsns, + PyObject *builtinsns); + +PyAPI_FUNC(int) _PyCode_CheckPureFunction(PyCodeObject *, const char **); PyAPI_FUNC(int) _PyCode_ReturnsOnlyNone(PyCodeObject *); diff --git a/Include/internal/pycore_function.h b/Include/internal/pycore_function.h index 209252b2ddc0de..a30d52d49bdc4d 100644 --- a/Include/internal/pycore_function.h +++ b/Include/internal/pycore_function.h @@ -35,6 +35,13 @@ PyFunctionObject *_PyFunction_LookupByVersion(uint32_t version, PyObject **p_cod extern PyObject *_Py_set_function_type_params( PyThreadState* unused, PyObject *func, PyObject *type_params); + +/* See pycore_code.h for explanation about what "stateless" means. */ + +PyAPI_FUNC(int) +_PyFunction_VerifyStateless(PyThreadState *, PyObject *); + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_opcode_utils.h b/Include/internal/pycore_opcode_utils.h index 62af06dc01c125..79a1a242556a52 100644 --- a/Include/internal/pycore_opcode_utils.h +++ b/Include/internal/pycore_opcode_utils.h @@ -56,6 +56,8 @@ extern "C" { #define IS_RETURN_OPCODE(opcode) \ (opcode == RETURN_VALUE) +#define IS_RAISE_OPCODE(opcode) \ + (opcode == RAISE_VARARGS || opcode == RERAISE) /* Flags used in the oparg for MAKE_FUNCTION */ diff --git a/Lib/test/_code_definitions.py b/Lib/test/_code_definitions.py index c3daa0dccf5df3..d64ac45d85f396 100644 --- a/Lib/test/_code_definitions.py +++ b/Lib/test/_code_definitions.py @@ -178,6 +178,32 @@ def ham_C_closure(z): *NESTED_FUNCTIONS, ] +STATELESS_FUNCTIONS = [ + spam, + spam_minimal, + spam_with_builtins, + spam_args_attrs_and_builtins, + spam_returns_arg, + spam_annotated, + spam_with_inner_not_closure, + spam_with_inner_closure, + spam_N, + spam_C, + spam_NN, + spam_NC, + spam_CN, + spam_CC, + eggs_nested, + eggs_nested_N, + ham_nested, + ham_C_nested +] +STATELESS_CODE = [ + *STATELESS_FUNCTIONS, + spam_with_globals_and_builtins, + spam_full, +] + # generators diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index b646042a3b84b0..6715ee051336a1 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -220,6 +220,7 @@ import _testinternalcapi except ModuleNotFoundError: _testinternalcapi = None +import test._code_definitions as defs COPY_FREE_VARS = opmap['COPY_FREE_VARS'] @@ -671,7 +672,6 @@ def test_local_kinds(self): VARARGS = CO_FAST_LOCAL | CO_FAST_ARG_VAR | CO_FAST_ARG_POS VARKWARGS = CO_FAST_LOCAL | CO_FAST_ARG_VAR | CO_FAST_ARG_KW - import test._code_definitions as defs funcs = { defs.spam_minimal: {}, defs.spam_with_builtins: { @@ -897,7 +897,6 @@ def new_var_counts(*, }, } - import test._code_definitions as defs funcs = { defs.spam_minimal: new_var_counts(), defs.spam_with_builtins: new_var_counts( @@ -1025,42 +1024,35 @@ def new_var_counts(*, counts = _testinternalcapi.get_code_var_counts(func.__code__) self.assertEqual(counts, expected) - def func_with_globals_and_builtins(): - mod1 = _testinternalcapi - mod2 = dis - mods = (mod1, mod2) - checks = tuple(callable(m) for m in mods) - return callable(mod2), tuple(mods), list(mods), checks - - func = func_with_globals_and_builtins + func = defs.spam_with_globals_and_builtins with self.subTest(f'{func} code'): expected = new_var_counts( - purelocals=4, - globalvars=5, + purelocals=5, + globalvars=6, ) counts = _testinternalcapi.get_code_var_counts(func.__code__) self.assertEqual(counts, expected) with self.subTest(f'{func} with own globals and builtins'): expected = new_var_counts( - purelocals=4, - globalvars=(2, 3), + purelocals=5, + globalvars=(2, 4), ) counts = _testinternalcapi.get_code_var_counts(func) self.assertEqual(counts, expected) with self.subTest(f'{func} without globals'): expected = new_var_counts( - purelocals=4, - globalvars=(0, 3, 2), + purelocals=5, + globalvars=(0, 4, 2), ) counts = _testinternalcapi.get_code_var_counts(func, globalsns={}) self.assertEqual(counts, expected) with self.subTest(f'{func} without both'): expected = new_var_counts( - purelocals=4, - globalvars=5, + purelocals=5, + globalvars=6, ) counts = _testinternalcapi.get_code_var_counts(func, globalsns={}, builtinsns={}) @@ -1068,12 +1060,34 @@ def func_with_globals_and_builtins(): with self.subTest(f'{func} without builtins'): expected = new_var_counts( - purelocals=4, - globalvars=(2, 0, 3), + purelocals=5, + globalvars=(2, 0, 4), ) counts = _testinternalcapi.get_code_var_counts(func, builtinsns={}) self.assertEqual(counts, expected) + @unittest.skipIf(_testinternalcapi is None, "missing _testinternalcapi") + def test_stateless(self): + self.maxDiff = None + + for func in defs.STATELESS_CODE: + with self.subTest((func, '(code)')): + _testinternalcapi.verify_stateless_code(func.__code__) + for func in defs.STATELESS_FUNCTIONS: + with self.subTest((func, '(func)')): + _testinternalcapi.verify_stateless_code(func) + + for func in defs.FUNCTIONS: + if func not in defs.STATELESS_CODE: + with self.subTest((func, '(code)')): + with self.assertRaises(Exception): + _testinternalcapi.verify_stateless_code(func.__code__) + + if func not in defs.STATELESS_FUNCTIONS: + with self.subTest((func, '(func)')): + with self.assertRaises(Exception): + _testinternalcapi.verify_stateless_code(func) + def isinterned(s): return s is sys.intern(('_' + s + '_')[1:-1]) diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index ae060c95fd5a01..63f1d079d8d312 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1165,6 +1165,47 @@ get_code_var_counts(PyObject *self, PyObject *_args, PyObject *_kwargs) return NULL; } +static PyObject * +verify_stateless_code(PyObject *self, PyObject *args, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *codearg; + PyObject *globalnames = NULL; + PyObject *globalsns = NULL; + PyObject *builtinsns = NULL; + static char *kwlist[] = {"code", "globalnames", + "globalsns", "builtinsns", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "O|O!O!O!:get_code_var_counts", kwlist, + &codearg, &PySet_Type, &globalnames, + &PyDict_Type, &globalsns, &PyDict_Type, &builtinsns)) + { + return NULL; + } + if (PyFunction_Check(codearg)) { + if (globalsns == NULL) { + globalsns = PyFunction_GET_GLOBALS(codearg); + } + if (builtinsns == NULL) { + builtinsns = PyFunction_GET_BUILTINS(codearg); + } + codearg = PyFunction_GET_CODE(codearg); + } + else if (!PyCode_Check(codearg)) { + PyErr_SetString(PyExc_TypeError, + "argument must be a code object or a function"); + return NULL; + } + PyCodeObject *code = (PyCodeObject *)codearg; + + if (_PyCode_VerifyStateless( + tstate, code, globalnames, globalsns, builtinsns) < 0) + { + return NULL; + } + Py_RETURN_NONE; +} + #ifdef _Py_TIER2 static PyObject * @@ -2292,6 +2333,8 @@ static PyMethodDef module_functions[] = { {"get_co_localskinds", get_co_localskinds, METH_O, NULL}, {"get_code_var_counts", _PyCFunction_CAST(get_code_var_counts), METH_VARARGS | METH_KEYWORDS, NULL}, + {"verify_stateless_code", _PyCFunction_CAST(verify_stateless_code), + METH_VARARGS | METH_KEYWORDS, NULL}, #ifdef _Py_TIER2 {"add_executor_dependency", add_executor_dependency, METH_VARARGS, NULL}, {"invalidate_executors", invalidate_executors, METH_O, NULL}, diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 92eaf5e00bc7dd..4f06a36a130207 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1955,12 +1955,130 @@ _PyCode_SetUnboundVarCounts(PyThreadState *tstate, } +int +_PyCode_CheckNoInternalState(PyCodeObject *co, const char **p_errmsg) +{ + const char *errmsg = NULL; + // We don't worry about co_executors, co_instrumentation, + // or co_monitoring. They are essentially ephemeral. + if (co->co_extra != NULL) { + errmsg = "only basic code objects are supported"; + } + + if (errmsg != NULL) { + if (p_errmsg != NULL) { + *p_errmsg = errmsg; + } + return 0; + } + return 1; +} + +int +_PyCode_CheckNoExternalState(PyCodeObject *co, _PyCode_var_counts_t *counts, + const char **p_errmsg) +{ + const char *errmsg = NULL; + assert(counts->locals.hidden.total == 0); + if (counts->numfree > 0) { // It's a closure. + errmsg = "closures not supported"; + } + else if (counts->unbound.globals.numglobal > 0) { + errmsg = "globals not supported"; + } + else if (counts->unbound.globals.numbuiltin > 0 + && counts->unbound.globals.numunknown > 0) + { + errmsg = "globals not supported"; + } + // Otherwise we don't check counts.unbound.globals.numunknown since we can't + // distinguish beween globals and builtins here. + + if (errmsg != NULL) { + if (p_errmsg != NULL) { + *p_errmsg = errmsg; + } + return 0; + } + return 1; +} + +int +_PyCode_VerifyStateless(PyThreadState *tstate, + PyCodeObject *co, PyObject *globalnames, + PyObject *globalsns, PyObject *builtinsns) +{ + const char *errmsg; + _PyCode_var_counts_t counts = {0}; + _PyCode_GetVarCounts(co, &counts); + if (_PyCode_SetUnboundVarCounts( + tstate, co, &counts, globalnames, NULL, + globalsns, builtinsns) < 0) + { + return -1; + } + // We may consider relaxing the internal state constraints + // if it becomes a problem. + if (!_PyCode_CheckNoInternalState(co, &errmsg)) { + _PyErr_SetString(tstate, PyExc_ValueError, errmsg); + return -1; + } + if (builtinsns != NULL) { + // Make sure the next check will fail for globals, + // even if there aren't any builtins. + counts.unbound.globals.numbuiltin += 1; + } + if (!_PyCode_CheckNoExternalState(co, &counts, &errmsg)) { + _PyErr_SetString(tstate, PyExc_ValueError, errmsg); + return -1; + } + // Note that we don't check co->co_flags & CO_NESTED for anything here. + return 0; +} + + +int +_PyCode_CheckPureFunction(PyCodeObject *co, const char **p_errmsg) +{ + const char *errmsg = NULL; + if (co->co_flags & CO_GENERATOR) { + errmsg = "generators not supported"; + } + else if (co->co_flags & CO_COROUTINE) { + errmsg = "coroutines not supported"; + } + else if (co->co_flags & CO_ITERABLE_COROUTINE) { + errmsg = "coroutines not supported"; + } + else if (co->co_flags & CO_ASYNC_GENERATOR) { + errmsg = "generators not supported"; + } + + if (errmsg != NULL) { + if (p_errmsg != NULL) { + *p_errmsg = errmsg; + } + return 0; + } + return 1; +} + /* Here "value" means a non-None value, since a bare return is identical * to returning None explicitly. Likewise a missing return statement * at the end of the function is turned into "return None". */ static int code_returns_only_none(PyCodeObject *co) { + if (!_PyCode_CheckPureFunction(co, NULL)) { + return 0; + } + int len = (int)Py_SIZE(co); + assert(len > 0); + + // The last instruction either returns or raises. We can take advantage + // of that for a quick exit. + _Py_CODEUNIT final = _Py_GetBaseCodeUnit(co, len-1); + // Look up None in co_consts. Py_ssize_t nconsts = PyTuple_Size(co->co_consts); int none_index = 0; @@ -1971,26 +2089,42 @@ code_returns_only_none(PyCodeObject *co) } if (none_index == nconsts) { // None wasn't there, which means there was no implicit return, - // "return", or "return None". That means there must be - // an explicit return (non-None). - return 0; - } + // "return", or "return None". - // Walk the bytecode, looking for RETURN_VALUE. - Py_ssize_t len = Py_SIZE(co); - for (int i = 0; i < len; i += _PyInstruction_GetLength(co, i)) { - _Py_CODEUNIT inst = _Py_GetBaseCodeUnit(co, i); - if (IS_RETURN_OPCODE(inst.op.code)) { - assert(i != 0); - // Ignore it if it returns None. - _Py_CODEUNIT prev = _Py_GetBaseCodeUnit(co, i-1); - if (prev.op.code == LOAD_CONST) { - // We don't worry about EXTENDED_ARG for now. - if (prev.op.arg == none_index) { - continue; + // That means there must be + // an explicit return (non-None), or it only raises. + if (IS_RETURN_OPCODE(final.op.code)) { + // It was an explicit return (non-None). + return 0; + } + // It must end with a raise then. We still have to walk the + // bytecode to see if there's any explicit return (non-None). + assert(IS_RAISE_OPCODE(final.op.code)); + for (int i = 0; i < len; i += _PyInstruction_GetLength(co, i)) { + _Py_CODEUNIT inst = _Py_GetBaseCodeUnit(co, i); + if (IS_RETURN_OPCODE(inst.op.code)) { + // We alraedy know it isn't returning None. + return 0; + } + } + // It must only raise. + } + else { + // Walk the bytecode, looking for RETURN_VALUE. + for (int i = 0; i < len; i += _PyInstruction_GetLength(co, i)) { + _Py_CODEUNIT inst = _Py_GetBaseCodeUnit(co, i); + if (IS_RETURN_OPCODE(inst.op.code)) { + assert(i != 0); + // Ignore it if it returns None. + _Py_CODEUNIT prev = _Py_GetBaseCodeUnit(co, i-1); + if (prev.op.code == LOAD_CONST) { + // We don't worry about EXTENDED_ARG for now. + if (prev.op.arg == none_index) { + continue; + } } + return 0; } - return 0; } } return 1; diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 56df5730db0c55..27214a129c2fb8 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -1,12 +1,14 @@ /* Function object implementation */ #include "Python.h" +#include "pycore_code.h" // _PyCode_VerifyStateless() #include "pycore_dict.h" // _Py_INCREF_DICT() #include "pycore_function.h" // _PyFunction_Vectorcall #include "pycore_long.h" // _PyLong_GetOne() #include "pycore_modsupport.h" // _PyArg_NoKeywords() #include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "pycore_pyerrors.h" // _PyErr_Occurred() +#include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_stats.h" @@ -1240,6 +1242,58 @@ PyTypeObject PyFunction_Type = { }; +int +_PyFunction_VerifyStateless(PyThreadState *tstate, PyObject *func) +{ + assert(!PyErr_Occurred()); + assert(PyFunction_Check(func)); + + // Check the globals. + PyObject *globalsns = PyFunction_GET_GLOBALS(func); + if (globalsns != NULL && !PyDict_Check(globalsns)) { + _PyErr_Format(tstate, PyExc_TypeError, + "unsupported globals %R", globalsns); + return -1; + } + // Check the builtins. + PyObject *builtinsns = PyFunction_GET_BUILTINS(func); + if (builtinsns != NULL && !PyDict_Check(builtinsns)) { + _PyErr_Format(tstate, PyExc_TypeError, + "unsupported builtins %R", builtinsns); + return -1; + } + // Disallow __defaults__. + PyObject *defaults = PyFunction_GET_DEFAULTS(func); + if (defaults != NULL && defaults != Py_None && PyDict_Size(defaults) > 0) + { + _PyErr_SetString(tstate, PyExc_ValueError, "defaults not supported"); + return -1; + } + // Disallow __kwdefaults__. + PyObject *kwdefaults = PyFunction_GET_KW_DEFAULTS(func); + if (kwdefaults != NULL && kwdefaults != Py_None + && PyDict_Size(kwdefaults) > 0) + { + _PyErr_SetString(tstate, PyExc_ValueError, + "keyword defaults not supported"); + return -1; + } + // Disallow __closure__. + PyObject *closure = PyFunction_GET_CLOSURE(func); + if (closure != NULL && closure != Py_None && PyTuple_GET_SIZE(closure) > 0) + { + _PyErr_SetString(tstate, PyExc_ValueError, "closures not supported"); + return -1; + } + // Check the code. + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + if (_PyCode_VerifyStateless(tstate, co, NULL, globalsns, builtinsns) < 0) { + return -1; + } + return 0; +} + + static int functools_copy_attr(PyObject *wrapper, PyObject *wrapped, PyObject *name) { From 9e1aa354aed03cff100b3ff0d1d6d13ecbb370ab Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 03:37:03 +0200 Subject: [PATCH 0008/1674] [3.14] gh-133551: Support t-strings in annotationlib (GH-133553) (#133628) gh-133551: Support t-strings in annotationlib (GH-133553) I don't know why you'd use t-strings in annotations, but now if you do, the STRING format will do a great job of recovering the source code. (cherry picked from commit 90f476e0f8dbb3a8603f67200c2422fb098c166c) Co-authored-by: Jelle Zijlstra --- Lib/annotationlib.py | 36 ++++++++++++++++++ Lib/test/.ruff.toml | 3 +- Lib/test/test_annotationlib.py | 38 +++++++++++++++++++ ...-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst | 2 + 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index c0b1d4395d14ed..32b8553458930c 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -305,6 +305,9 @@ def __repr__(self): return f"ForwardRef({self.__forward_arg__!r}{''.join(extra)})" +_Template = type(t"") + + class _Stringifier: # Must match the slots on ForwardRef, so we can turn an instance of one into an # instance of the other in place. @@ -341,6 +344,8 @@ def __convert_to_ast(self, other): if isinstance(other.__ast_node__, str): return ast.Name(id=other.__ast_node__), other.__extra_names__ return other.__ast_node__, other.__extra_names__ + elif type(other) is _Template: + return _template_to_ast(other), None elif ( # In STRING format we don't bother with the create_unique_name() dance; # it's better to emit the repr() of the object instead of an opaque name. @@ -560,6 +565,32 @@ def unary_op(self): del _make_unary_op +def _template_to_ast(template): + values = [] + for part in template: + match part: + case str(): + values.append(ast.Constant(value=part)) + # Interpolation, but we don't want to import the string module + case _: + interp = ast.Interpolation( + str=part.expression, + value=ast.parse(part.expression), + conversion=( + ord(part.conversion) + if part.conversion is not None + else -1 + ), + format_spec=( + ast.Constant(value=part.format_spec) + if part.format_spec != "" + else None + ), + ) + values.append(interp) + return ast.TemplateStr(values=values) + + class _StringifierDict(dict): def __init__(self, namespace, *, globals=None, owner=None, is_class=False, format): super().__init__(namespace) @@ -784,6 +815,8 @@ def _stringify_single(anno): # We have to handle str specially to support PEP 563 stringified annotations. elif isinstance(anno, str): return anno + elif isinstance(anno, _Template): + return ast.unparse(_template_to_ast(anno)) else: return repr(anno) @@ -976,6 +1009,9 @@ def type_repr(value): if value.__module__ == "builtins": return value.__qualname__ return f"{value.__module__}.{value.__qualname__}" + elif isinstance(value, _Template): + tree = _template_to_ast(value) + return ast.unparse(tree) if value is ...: return "..." return repr(value) diff --git a/Lib/test/.ruff.toml b/Lib/test/.ruff.toml index a1eac32a83aae3..7aa8a4785d6844 100644 --- a/Lib/test/.ruff.toml +++ b/Lib/test/.ruff.toml @@ -9,8 +9,9 @@ extend-exclude = [ "encoded_modules/module_iso_8859_1.py", "encoded_modules/module_koi8_r.py", # SyntaxError because of t-strings - "test_tstring.py", + "test_annotationlib.py", "test_string/test_templatelib.py", + "test_tstring.py", # New grammar constructions may not yet be recognized by Ruff, # and tests re-use the same names as only the grammar is being checked. "test_grammar.py", diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index c3c245ddaf86d1..4af97c82de9d46 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -7,6 +7,7 @@ import functools import itertools import pickle +from string.templatelib import Interpolation, Template import typing import unittest from annotationlib import ( @@ -273,6 +274,43 @@ def f( }, ) + def test_template_str(self): + def f( + x: t"{a}", + y: list[t"{a}"], + z: t"{a:b} {c!r} {d!s:t}", + a: t"a{b}c{d}e{f}g", + b: t"{a:{1}}", + c: t"{a | b * c}", + ): pass + + annos = get_annotations(f, format=Format.STRING) + self.assertEqual(annos, { + "x": "t'{a}'", + "y": "list[t'{a}']", + "z": "t'{a:b} {c!r} {d!s:t}'", + "a": "t'a{b}c{d}e{f}g'", + # interpolations in the format spec are eagerly evaluated so we can't recover the source + "b": "t'{a:1}'", + "c": "t'{a | b * c}'", + }) + + def g( + x: t"{a}", + ): ... + + annos = get_annotations(g, format=Format.FORWARDREF) + templ = annos["x"] + # Template and Interpolation don't have __eq__ so we have to compare manually + self.assertIsInstance(templ, Template) + self.assertEqual(templ.strings, ("", "")) + self.assertEqual(len(templ.interpolations), 1) + interp = templ.interpolations[0] + self.assertEqual(interp.value, support.EqualToForwardRef("a", owner=g)) + self.assertEqual(interp.expression, "a") + self.assertIsNone(interp.conversion) + self.assertEqual(interp.format_spec, "") + def test_getitem(self): def f(x: undef1[str, undef2]): pass diff --git a/Misc/NEWS.d/next/Library/2025-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst b/Misc/NEWS.d/next/Library/2025-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst new file mode 100644 index 00000000000000..7fedc0818dc469 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst @@ -0,0 +1,2 @@ +Support t-strings (:pep:`750`) in :mod:`annotationlib`. Patch by Jelle +Zijlstra. From ca3e3b8a272c06ef31c36365b2ae39f457c747a0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 03:40:41 +0200 Subject: [PATCH 0009/1674] [3.14] gh-127833: lexical analysis: Add backticks to BOM example (GH-132407) (#133632) gh-127833: lexical analysis: Add backticks to BOM example (GH-132407) (cherry picked from commit 0552ce0fb24d33b51fdd02a589ede95aabc0d8b5) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/reference/lexical_analysis.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index ff801a7d4fc494..b8453946362867 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -99,7 +99,7 @@ which is recognized by Bram Moolenaar's VIM. 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. +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 From aadfc2cbc7d98294b3a2ad0e72fe36f5527e21f7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 03:54:42 +0200 Subject: [PATCH 0010/1674] [3.14] gh-133555: Allow regenerating the parser with Python < 3.14 (GH-133557) (#133630) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-133555: Allow regenerating the parser with Python < 3.14 (GH-133557) (cherry picked from commit b48599b8017f896c965e89c402bb70feef49808a) Co-authored-by: Alex Prengère <2138730+alexprengere@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Grammar/Tokens | 5 +++++ Tools/peg_generator/pegen/parser_generator.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/Grammar/Tokens b/Grammar/Tokens index e40a4437afb009..0547e6ed08f79a 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -1,3 +1,8 @@ +# When adding new tokens, remember to update the PEG generator in +# Tools/peg_generator/pegen/parser_generator.py +# This will ensure that older versions of Python can generate a Python parser +# using "python -m pegen python ". + ENDMARKER NAME NUMBER diff --git a/Tools/peg_generator/pegen/parser_generator.py b/Tools/peg_generator/pegen/parser_generator.py index 6ce0649aefe7ff..52ae743c26b6b8 100644 --- a/Tools/peg_generator/pegen/parser_generator.py +++ b/Tools/peg_generator/pegen/parser_generator.py @@ -81,6 +81,11 @@ def __init__(self, rules: Dict[str, Rule], tokens: Set[str]): self.tokens.add("FSTRING_START") self.tokens.add("FSTRING_END") self.tokens.add("FSTRING_MIDDLE") + # If python < 3.14 add the virtual tstring tokens + if sys.version_info < (3, 14, 0, 'beta', 1): + self.tokens.add("TSTRING_START") + self.tokens.add("TSTRING_END") + self.tokens.add("TSTRING_MIDDLE") def visit_NameLeaf(self, node: NameLeaf) -> None: if node.value not in self.rules and node.value not in self.tokens: From f12e576128b2d8b201a9a59fa75296085212a4df Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 05:01:33 +0200 Subject: [PATCH 0011/1674] [3.14] gh-133551: Skip annotationlib for now in ast roundtrip tests (GH-133634) (#133636) gh-133551: Skip annotationlib for now in ast roundtrip tests (GH-133634) (cherry picked from commit 0a3ccb8dff2bd140f800d9e0b00549d8f1ead929) Co-authored-by: Jelle Zijlstra --- Lib/test/test_unparse.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index d3af7a8489e650..5616129eb63c2f 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -942,6 +942,7 @@ def files_to_test(cls): for directory in cls.test_directories for item in directory.glob("*.py") if not item.name.startswith("bad") + and item.name != "annotationlib.py" # gh-133581: t"" does not roundtrip ] # Test limited subset of files unless the 'cpu' resource is specified. From e8c279f394d3b6f834e10a18ff0a7ee65630db0b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 08:32:05 +0200 Subject: [PATCH 0012/1674] [3.14] gh-133403: Type `Tools/build/update_file.py` and check it with `mypy` (GH-133404) (#133603) gh-133403: Type `Tools/build/update_file.py` and check it with `mypy` (GH-133404) (cherry picked from commit 50b52cba2d13a1854bc835412ac3f3c0ad42b5ba) Co-authored-by: sobolevn Co-authored-by: Zachary Ware --- Tools/build/mypy.ini | 6 +++++- Tools/build/update_file.py | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Tools/build/mypy.ini b/Tools/build/mypy.ini index 06224163884a98..db546c6fb3481c 100644 --- a/Tools/build/mypy.ini +++ b/Tools/build/mypy.ini @@ -1,7 +1,9 @@ [mypy] files = Tools/build/compute-changes.py, - Tools/build/generate_sbom.py + Tools/build/generate_sbom.py, + Tools/build/update_file.py + pretty = True # Make sure Python can still be built @@ -10,6 +12,8 @@ python_version = 3.10 # ...And be strict: strict = True +strict_bytes = True +local_partial_types = True extra_checks = True enable_error_code = ignore-without-code,redundant-expr,truthy-bool,possibly-undefined warn_unreachable = True diff --git a/Tools/build/update_file.py b/Tools/build/update_file.py index b4182c1d0cb638..b4a5fb6e778ae8 100644 --- a/Tools/build/update_file.py +++ b/Tools/build/update_file.py @@ -6,14 +6,27 @@ actually change the in-tree generated code. """ +from __future__ import annotations + import contextlib import os import os.path import sys +TYPE_CHECKING = False +if TYPE_CHECKING: + import typing + from collections.abc import Iterator + from io import TextIOWrapper + + _Outcome: typing.TypeAlias = typing.Literal['created', 'updated', 'same'] + @contextlib.contextmanager -def updating_file_with_tmpfile(filename, tmpfile=None): +def updating_file_with_tmpfile( + filename: str, + tmpfile: str | None = None, +) -> Iterator[tuple[TextIOWrapper, TextIOWrapper]]: """A context manager for updating a file via a temp file. The context manager provides two open files: the source file open @@ -46,13 +59,18 @@ def updating_file_with_tmpfile(filename, tmpfile=None): update_file_with_tmpfile(filename, tmpfile) -def update_file_with_tmpfile(filename, tmpfile, *, create=False): +def update_file_with_tmpfile( + filename: str, + tmpfile: str, + *, + create: bool = False, +) -> _Outcome: try: targetfile = open(filename, 'rb') except FileNotFoundError: if not create: raise # re-raise - outcome = 'created' + outcome: _Outcome = 'created' os.replace(tmpfile, filename) else: with targetfile: From c6a56e3d91be353c657b517f6b6394ec5323e5e7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 09:11:49 +0200 Subject: [PATCH 0013/1674] [3.14] gh-132983: Remove pyzstd in identifiers (GH-133535) (#133629) --- Modules/_zstd/_zstdmodule.h | 13 ------------- Modules/_zstd/compressor.c | 16 ++++++++-------- Modules/_zstd/decompressor.c | 12 ++++++------ 3 files changed, 14 insertions(+), 27 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.h b/Modules/_zstd/_zstdmodule.h index 9322ee259c5124..1e9e4c75056831 100644 --- a/Modules/_zstd/_zstdmodule.h +++ b/Modules/_zstd/_zstdmodule.h @@ -172,19 +172,6 @@ set_parameter_error(const _zstd_state* const state, int is_compress, static const char init_twice_msg[] = "__init__ method is called twice."; -extern int -_PyZstd_load_c_dict(ZstdCompressor *self, PyObject *dict); - -extern int -_PyZstd_load_d_dict(ZstdDecompressor *self, PyObject *dict); - -extern int -_PyZstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, - const char *arg_name, const char *arg_type); - -extern int -_PyZstd_set_d_parameters(ZstdDecompressor *self, PyObject *options); - extern PyObject * decompress_impl(ZstdDecompressor *self, ZSTD_inBuffer *in, Py_ssize_t max_length, diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index b735981e7476d5..9a3d8dedcf235e 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -25,9 +25,9 @@ class _zstd.ZstdCompressor "ZstdCompressor *" "clinic_state()->ZstdCompressor_ty #define ZstdCompressor_CAST(op) ((ZstdCompressor *)op) -int -_PyZstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, - const char *arg_name, const char* arg_type) +static int +_zstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, + const char *arg_name, const char* arg_type) { size_t zstd_ret; _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); @@ -197,8 +197,8 @@ _get_CDict(ZstdDict *self, int compressionLevel) return cdict; } -int -_PyZstd_load_c_dict(ZstdCompressor *self, PyObject *dict) { +static int +_zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) { size_t zstd_ret; _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); @@ -385,20 +385,20 @@ _zstd_ZstdCompressor___init___impl(ZstdCompressor *self, PyObject *level, /* Set compressLevel/options to compression context */ if (level != Py_None) { - if (_PyZstd_set_c_parameters(self, level, "level", "int") < 0) { + if (_zstd_set_c_parameters(self, level, "level", "int") < 0) { return -1; } } if (options != Py_None) { - if (_PyZstd_set_c_parameters(self, options, "options", "dict") < 0) { + if (_zstd_set_c_parameters(self, options, "options", "dict") < 0) { return -1; } } /* Load dictionary to compression context */ if (zstd_dict != Py_None) { - if (_PyZstd_load_c_dict(self, zstd_dict) < 0) { + if (_zstd_load_c_dict(self, zstd_dict) < 0) { return -1; } diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index a4be180c0088fc..748947af79c3f7 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -61,8 +61,8 @@ _get_DDict(ZstdDict *self) } /* Set decompression parameters to decompression context */ -int -_PyZstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) +static int +_zstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) { size_t zstd_ret; PyObject *key, *value; @@ -120,8 +120,8 @@ _PyZstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) } /* Load dictionary or prefix to decompression context */ -int -_PyZstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) +static int +_zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) { size_t zstd_ret; _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); @@ -709,7 +709,7 @@ _zstd_ZstdDecompressor___init___impl(ZstdDecompressor *self, /* Load dictionary to decompression context */ if (zstd_dict != Py_None) { - if (_PyZstd_load_d_dict(self, zstd_dict) < 0) { + if (_zstd_load_d_dict(self, zstd_dict) < 0) { return -1; } @@ -720,7 +720,7 @@ _zstd_ZstdDecompressor___init___impl(ZstdDecompressor *self, /* Set option to decompression context */ if (options != Py_None) { - if (_PyZstd_set_d_parameters(self, options) < 0) { + if (_zstd_set_d_parameters(self, options) < 0) { return -1; } } From effe8d4971f6441efe897b2ba4a991ee39e73f1d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 10:26:14 +0200 Subject: [PATCH 0014/1674] [3.14] gh-125028: Prohibit placeholders in partial keywords (GH-126062) (GH-133645) (cherry picked from commit afed5f88359c73f798ff6f0064e37ac1a1f0759b) Co-authored-by: dgpb <3577712+dg-pb@users.noreply.github.com> --- Doc/library/functools.rst | 3 +-- Lib/functools.py | 3 +++ Lib/test/test_functools.py | 19 +++++++++++++++++++ ...-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst | 1 + Modules/_functoolsmodule.c | 13 +++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2024-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 3a933dff057bbb..3e75621be6dad3 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -403,8 +403,7 @@ The :mod:`functools` module defines the following functions: >>> remove_first_dear(message) 'Hello, dear world!' - :data:`!Placeholder` has no special treatment when used in a keyword - argument to :func:`!partial`. + :data:`!Placeholder` cannot be passed to :func:`!partial` as a keyword argument. .. versionchanged:: 3.14 Added support for :data:`Placeholder` in positional arguments. diff --git a/Lib/functools.py b/Lib/functools.py index 714070c6ac9460..7f0eac3f650209 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -323,6 +323,9 @@ def _partial_new(cls, func, /, *args, **keywords): "or a descriptor") if args and args[-1] is Placeholder: raise TypeError("trailing Placeholders are not allowed") + for value in keywords.values(): + if value is Placeholder: + raise TypeError("Placeholder cannot be passed as a keyword argument") if isinstance(func, base_cls): pto_phcount = func._phcount tot_args = func.args diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 2e794b0fc95a22..f7e09fd771eaf2 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -21,6 +21,7 @@ import contextlib from inspect import Signature +from test.support import ALWAYS_EQ from test.support import import_helper from test.support import threading_helper from test.support import cpython_only @@ -244,6 +245,13 @@ def test_placeholders(self): actual_args, actual_kwds = p('x', 'y') self.assertEqual(actual_args, ('x', 0, 'y', 1)) self.assertEqual(actual_kwds, {}) + # Checks via `is` and not `eq` + # thus ALWAYS_EQ isn't treated as Placeholder + p = self.partial(capture, ALWAYS_EQ) + actual_args, actual_kwds = p() + self.assertEqual(len(actual_args), 1) + self.assertIs(actual_args[0], ALWAYS_EQ) + self.assertEqual(actual_kwds, {}) def test_placeholders_optimization(self): PH = self.module.Placeholder @@ -260,6 +268,17 @@ def test_placeholders_optimization(self): self.assertEqual(p2.args, (PH, 0)) self.assertEqual(p2(1), ((1, 0), {})) + def test_placeholders_kw_restriction(self): + PH = self.module.Placeholder + with self.assertRaisesRegex(TypeError, "Placeholder"): + self.partial(capture, a=PH) + # Passes, as checks via `is` and not `eq` + p = self.partial(capture, a=ALWAYS_EQ) + actual_args, actual_kwds = p() + self.assertEqual(actual_args, ()) + self.assertEqual(len(actual_kwds), 1) + self.assertIs(actual_kwds['a'], ALWAYS_EQ) + def test_construct_placeholder_singleton(self): PH = self.module.Placeholder tp = type(PH) diff --git a/Misc/NEWS.d/next/Library/2024-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst b/Misc/NEWS.d/next/Library/2024-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst new file mode 100644 index 00000000000000..09ebee4d41b68e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst @@ -0,0 +1 @@ +:data:`functools.Placeholder` cannot be passed to :func:`functools.partial` as a keyword argument. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index e6c454faf4b16f..899eef50ecc600 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -196,6 +196,19 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } + /* keyword Placeholder prohibition */ + if (kw != NULL) { + PyObject *key, *val; + Py_ssize_t pos = 0; + while (PyDict_Next(kw, &pos, &key, &val)) { + if (val == phold) { + PyErr_SetString(PyExc_TypeError, + "Placeholder cannot be passed as a keyword argument"); + return NULL; + } + } + } + /* check wrapped function / object */ pto_args = pto_kw = NULL; int res = PyObject_TypeCheck(func, state->partial_type); From d35c0e48da81f76db54e9165f01c5b3c5f8c92e8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 10:34:20 +0200 Subject: [PATCH 0015/1674] [3.14] gh-133641: Doc: Add missing source link in ``concurrent.futures`` (GH-133642) (#133643) gh-133641: Doc: Add missing source link in ``concurrent.futures`` (GH-133642) (cherry picked from commit 4fcd37756382206e5a4a387cec9266815adca007) Co-authored-by: Jonas Obrist Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/concurrent.futures.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 7efae9e628b828..3c8d9ab111e09e 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -6,8 +6,9 @@ .. versionadded:: 3.2 -**Source code:** :source:`Lib/concurrent/futures/thread.py` -and :source:`Lib/concurrent/futures/process.py` +**Source code:** :source:`Lib/concurrent/futures/thread.py`, +:source:`Lib/concurrent/futures/process.py`, +and :source:`Lib/concurrent/futures/interpreter.py` -------------- From 2de8a8b7e93e9bcddfea56b4f58a5e3efb5c284d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 10:50:57 +0200 Subject: [PATCH 0016/1674] [3.14] gh-133639: Fix `test_auto_indent_default()` doesn't run `input_code` (GH-133640) (#133646) --- Lib/test/test_pyrepl/test_pyrepl.py | 5 +++++ .../Tests/2025-05-08-15-06-01.gh-issue-133639.50-kbV.rst | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2025-05-08-15-06-01.gh-issue-133639.50-kbV.rst diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 93029ab6e080ba..fc8114891d12dd 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -452,6 +452,11 @@ def test_auto_indent_default(self): ) # fmt: on + events = code_to_events(input_code) + reader = self.prepare_reader(events) + output = multiline_input(reader) + self.assertEqual(output, output_code) + def test_auto_indent_continuation(self): # auto indenting according to previous user indentation # fmt: off diff --git a/Misc/NEWS.d/next/Tests/2025-05-08-15-06-01.gh-issue-133639.50-kbV.rst b/Misc/NEWS.d/next/Tests/2025-05-08-15-06-01.gh-issue-133639.50-kbV.rst new file mode 100644 index 00000000000000..68826cd95fa2b0 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-05-08-15-06-01.gh-issue-133639.50-kbV.rst @@ -0,0 +1,2 @@ +Fix ``TestPyReplAutoindent.test_auto_indent_default()`` doesn't run +``input_code``. From 3cd4c2db7bebc63b9773d0cda5ae1ea7b3a1b634 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 11:28:58 +0200 Subject: [PATCH 0017/1674] [3.14] Doc: Allow translating a code block in the tutorial (GH-131353) (#133648) Doc: Allow translating a code block in the tutorial (GH-131353) (cherry picked from commit 3224b99872d8ed030181e5d009ea64e8672a68ee) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Chris Markiewicz Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/tutorial/introduction.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index bec5da8fd759ac..cdb35da7bc95ba 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -147,6 +147,8 @@ Python can manipulate text (represented by type :class:`str`, so-called "``Yay! :)``". They can be enclosed in single quotes (``'...'``) or double quotes (``"..."``) with the same result [#]_. +.. code-block:: pycon + >>> 'spam eggs' # single quotes 'spam eggs' >>> "Paris rabbit got your back :)! Yay!" # double quotes From a0203362568ade0bc30f22a8abb22a3387c329f1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 11:46:47 +0200 Subject: [PATCH 0018/1674] [3.14] gh-127833: Add links to token types to the lexical analysis intro (GH-131468) (#133652) gh-127833: Add links to token types to the lexical analysis intro (GH-131468) (cherry picked from commit 45bb5ba61a8d6dcaa44312b67fe6bade5e2ad992) Co-authored-by: Petr Viktorin Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/reference/lexical_analysis.rst | 62 +++++++++++++++++++----------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index b8453946362867..001e2547fe8031 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -35,11 +35,11 @@ Logical lines .. index:: logical line, physical line, line joining, NEWLINE token -The end of a logical line is represented by the token NEWLINE. Statements -cannot cross logical line boundaries except where NEWLINE is allowed by the -syntax (e.g., between statements in compound statements). A logical line is -constructed from one or more *physical lines* by following the explicit or -implicit *line joining* rules. +The end of a logical line is represented by the token :data:`~token.NEWLINE`. +Statements cannot cross logical line boundaries except where :data:`!NEWLINE` +is allowed by the syntax (e.g., between statements in compound statements). +A logical line is constructed from one or more *physical lines* by following +the explicit or implicit *line joining* rules. .. _physical-lines: @@ -160,11 +160,12 @@ Blank lines .. index:: single: blank line A logical line that contains only spaces, tabs, formfeeds and possibly a -comment, is ignored (i.e., no NEWLINE token is generated). During interactive -input of statements, handling of a blank line may differ depending on the -implementation of the read-eval-print loop. In the standard interactive -interpreter, an entirely blank logical line (i.e. one containing not even -whitespace or a comment) terminates a multi-line statement. +comment, is ignored (i.e., no :data:`~token.NEWLINE` token is generated). +During interactive input of statements, handling of a blank line may differ +depending on the implementation of the read-eval-print loop. +In the standard interactive interpreter, an entirely blank logical line (that +is, one containing not even whitespace or a comment) terminates a multi-line +statement. .. _indentation: @@ -202,19 +203,20 @@ the space count to zero). .. index:: INDENT token, DEDENT token -The indentation levels of consecutive lines are used to generate INDENT and -DEDENT tokens, using a stack, as follows. +The indentation levels of consecutive lines are used to generate +:data:`~token.INDENT` and :data:`~token.DEDENT` tokens, using a stack, +as follows. Before the first line of the file is read, a single zero is pushed on the stack; this will never be popped off again. The numbers pushed on the stack will always be strictly increasing from bottom to top. At the beginning of each logical line, the line's indentation level is compared to the top of the stack. If it is equal, nothing happens. If it is larger, it is pushed on the stack, and -one INDENT token is generated. If it is smaller, it *must* be one of the +one :data:`!INDENT` token is generated. If it is smaller, it *must* be one of the numbers occurring on the stack; all numbers on the stack that are larger are -popped off, and for each number popped off a DEDENT token is generated. At the -end of the file, a DEDENT token is generated for each number remaining on the -stack that is larger than zero. +popped off, and for each number popped off a :data:`!DEDENT` token is generated. +At the end of the file, a :data:`!DEDENT` token is generated for each number +remaining on the stack that is larger than zero. Here is an example of a correctly (though confusingly) indented piece of Python code:: @@ -254,8 +256,18 @@ Whitespace between tokens Except at the beginning of a logical line or in string literals, the whitespace characters space, tab and formfeed can be used interchangeably to separate tokens. Whitespace is needed between two tokens only if their concatenation -could otherwise be interpreted as a different token (e.g., ab is one token, but -a b is two tokens). +could otherwise be interpreted as a different token. For example, ``ab`` is one +token, but ``a b`` is two tokens. However, ``+a`` and ``+ a`` both produce +two tokens, ``+`` and ``a``, as ``+a`` is not a valid token. + + +.. _endmarker-token: + +End marker +---------- + +At the end of non-interactive input, the lexical analyzer generates an +:data:`~token.ENDMARKER` token. .. _other-tokens: @@ -263,11 +275,15 @@ a b is two tokens). Other tokens ============ -Besides NEWLINE, INDENT and DEDENT, the following categories of tokens exist: -*identifiers*, *keywords*, *literals*, *operators*, and *delimiters*. Whitespace -characters (other than line terminators, discussed earlier) are not tokens, but -serve to delimit tokens. Where ambiguity exists, a token comprises the longest -possible string that forms a legal token, when read from left to right. +Besides :data:`~token.NEWLINE`, :data:`~token.INDENT` and :data:`~token.DEDENT`, +the following categories of tokens exist: +*identifiers* and *keywords* (:data:`~token.NAME`), *literals* (such as +:data:`~token.NUMBER` and :data:`~token.STRING`), and other symbols +(*operators* and *delimiters*, :data:`~token.OP`). +Whitespace characters (other than logical line terminators, discussed earlier) +are not tokens, but serve to delimit tokens. +Where ambiguity exists, a token comprises the longest possible string that +forms a legal token, when read from left to right. .. _identifiers: From 0f7046b18760c42da8676fea0421b25d67fb32e6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 11:54:44 +0200 Subject: [PATCH 0019/1674] [3.14] gh-133583: Add support for fixed size unsigned integers in argument parsing (GH-133584) (GH-133650) * Add Argument Clinic converters: uint8, uint16, uint32, uint64. * Add private C API: _PyLong_UInt8_Converter(), _PyLong_UInt16_Converter(), _PyLong_UInt32_Converter(), _PyLong_UInt64_Converter(). (cherry picked from commit 4c914e7a36033d5e8d52cdef3a4063eb9b012ed2) Co-authored-by: Serhiy Storchaka --- Include/internal/pycore_long.h | 5 ++ Lib/test/test_clinic.py | 4 + Modules/_lzmamodule.c | 25 +++--- Modules/clinic/socketmodule.c.h | 3 +- Modules/socketmodule.c | 15 +--- Objects/longobject.c | 4 + Tools/clinic/libclinic/converters.py | 124 +++++++++++++-------------- 7 files changed, 87 insertions(+), 93 deletions(-) diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index ed6c435316708e..3196d1b82084b9 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -158,6 +158,11 @@ 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 *); +PyAPI_FUNC(int) _PyLong_UInt8_Converter(PyObject *, void *); +PyAPI_FUNC(int) _PyLong_UInt16_Converter(PyObject *, void *); +PyAPI_FUNC(int) _PyLong_UInt32_Converter(PyObject *, void *); +PyAPI_FUNC(int) _PyLong_UInt64_Converter(PyObject *, void *); + /* Long value tag bits: * 0-1: Sign bits value = (1-sign), ie. negative=2, positive=0, zero=1. * 2: Set to 1 for the small ints diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 0c99620e27cde4..90b7d343cea583 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2835,6 +2835,10 @@ def test_cli_converters(self): "size_t", "slice_index", "str", + "uint16", + "uint32", + "uint64", + "uint8", "unicode", "unsigned_char", "unsigned_int", diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index f9b4c2a170e9c5..462c2181fa6036 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -17,6 +17,7 @@ #include +#include "pycore_long.h" // _PyLong_UInt32_Converter() // Blocks output buffer wrappers #include "pycore_blocks_output_buffer.h" @@ -223,8 +224,6 @@ FUNCNAME(PyObject *obj, void *ptr) \ return 1; \ } -INT_TYPE_CONVERTER_FUNC(uint32_t, uint32_converter) -INT_TYPE_CONVERTER_FUNC(uint64_t, uint64_converter) INT_TYPE_CONVERTER_FUNC(lzma_vli, lzma_vli_converter) INT_TYPE_CONVERTER_FUNC(lzma_mode, lzma_mode_converter) INT_TYPE_CONVERTER_FUNC(lzma_match_finder, lzma_mf_converter) @@ -254,7 +253,7 @@ parse_filter_spec_lzma(_lzma_state *state, PyObject *spec) return NULL; } if (preset_obj != NULL) { - int ok = uint32_converter(preset_obj, &preset); + int ok = _PyLong_UInt32_Converter(preset_obj, &preset); Py_DECREF(preset_obj); if (!ok) { return NULL; @@ -275,14 +274,14 @@ parse_filter_spec_lzma(_lzma_state *state, PyObject *spec) if (!PyArg_ParseTupleAndKeywords(state->empty_tuple, spec, "|OOO&O&O&O&O&O&O&O&", optnames, &id, &preset_obj, - uint32_converter, &options->dict_size, - uint32_converter, &options->lc, - uint32_converter, &options->lp, - uint32_converter, &options->pb, + _PyLong_UInt32_Converter, &options->dict_size, + _PyLong_UInt32_Converter, &options->lc, + _PyLong_UInt32_Converter, &options->lp, + _PyLong_UInt32_Converter, &options->pb, lzma_mode_converter, &options->mode, - uint32_converter, &options->nice_len, + _PyLong_UInt32_Converter, &options->nice_len, lzma_mf_converter, &options->mf, - uint32_converter, &options->depth)) { + _PyLong_UInt32_Converter, &options->depth)) { PyErr_SetString(PyExc_ValueError, "Invalid filter specifier for LZMA filter"); PyMem_Free(options); @@ -301,7 +300,7 @@ parse_filter_spec_delta(_lzma_state *state, PyObject *spec) lzma_options_delta *options; if (!PyArg_ParseTupleAndKeywords(state->empty_tuple, spec, "|OO&", optnames, - &id, uint32_converter, &dist)) { + &id, _PyLong_UInt32_Converter, &dist)) { PyErr_SetString(PyExc_ValueError, "Invalid filter specifier for delta filter"); return NULL; @@ -325,7 +324,7 @@ parse_filter_spec_bcj(_lzma_state *state, PyObject *spec) lzma_options_bcj *options; if (!PyArg_ParseTupleAndKeywords(state->empty_tuple, spec, "|OO&", optnames, - &id, uint32_converter, &start_offset)) { + &id, _PyLong_UInt32_Converter, &start_offset)) { PyErr_SetString(PyExc_ValueError, "Invalid filter specifier for BCJ filter"); return NULL; @@ -806,7 +805,7 @@ Compressor_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) return NULL; } - if (preset_obj != Py_None && !uint32_converter(preset_obj, &preset)) { + if (preset_obj != Py_None && !_PyLong_UInt32_Converter(preset_obj, &preset)) { return NULL; } @@ -1226,7 +1225,7 @@ _lzma_LZMADecompressor_impl(PyTypeObject *type, int format, "Cannot specify memory limit with FORMAT_RAW"); return NULL; } - if (!uint64_converter(memlimit, &memlimit_)) { + if (!_PyLong_UInt64_Converter(memlimit, &memlimit_)) { return NULL; } } diff --git a/Modules/clinic/socketmodule.c.h b/Modules/clinic/socketmodule.c.h index 70ebbaa876b32b..573903be87e6ea 100644 --- a/Modules/clinic/socketmodule.c.h +++ b/Modules/clinic/socketmodule.c.h @@ -6,6 +6,7 @@ preserve # include "pycore_gc.h" // PyGC_Head # include "pycore_runtime.h" // _Py_ID() #endif +#include "pycore_long.h" // _PyLong_UInt16_Converter() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() PyDoc_STRVAR(_socket_socket_close__doc__, @@ -369,4 +370,4 @@ _socket_if_indextoname(PyObject *module, PyObject *arg) #ifndef _SOCKET_IF_INDEXTONAME_METHODDEF #define _SOCKET_IF_INDEXTONAME_METHODDEF #endif /* !defined(_SOCKET_IF_INDEXTONAME_METHODDEF) */ -/*[clinic end generated code: output=c971b79d2193b426 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=07776dd21d1e3b56 input=a9049054013a1b77]*/ diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 47958379263793..77bc4314808235 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -638,33 +638,22 @@ _PyLong_##NAME##_Converter(PyObject *obj, void *ptr) \ return 1; \ } -UNSIGNED_INT_CONVERTER(UInt16, uint16_t) -UNSIGNED_INT_CONVERTER(UInt32, uint32_t) - #if defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) # ifdef MS_WINDOWS UNSIGNED_INT_CONVERTER(NetIfindex, NET_IFINDEX) # else - UNSIGNED_INT_CONVERTER(NetIfindex, unsigned int) +# define _PyLong_NetIfindex_Converter _PyLong_UnsignedInt_Converter # define NET_IFINDEX unsigned int # endif #endif // defined(HAVE_IF_NAMEINDEX) || defined(MS_WINDOWS) /*[python input] -class uint16_converter(CConverter): - type = "uint16_t" - converter = '_PyLong_UInt16_Converter' - -class uint32_converter(CConverter): - type = "uint32_t" - converter = '_PyLong_UInt32_Converter' - class NET_IFINDEX_converter(CConverter): type = "NET_IFINDEX" converter = '_PyLong_NetIfindex_Converter' [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=3de2e4a03fbf83b8]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=1cf809c40a407c34]*/ /*[clinic input] module _socket diff --git a/Objects/longobject.c b/Objects/longobject.c index 40d90ecf4fa068..0b2dfa003fac53 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1760,6 +1760,10 @@ UNSIGNED_INT_CONVERTER(UnsignedInt, unsigned int) UNSIGNED_INT_CONVERTER(UnsignedLong, unsigned long) UNSIGNED_INT_CONVERTER(UnsignedLongLong, unsigned long long) UNSIGNED_INT_CONVERTER(Size_t, size_t) +UNSIGNED_INT_CONVERTER(UInt8, uint8_t) +UNSIGNED_INT_CONVERTER(UInt16, uint16_t) +UNSIGNED_INT_CONVERTER(UInt32, uint32_t) +UNSIGNED_INT_CONVERTER(UInt64, uint64_t) #define CHECK_BINOP(v,w) \ diff --git a/Tools/clinic/libclinic/converters.py b/Tools/clinic/libclinic/converters.py index 633fb5f56a6693..39d0ac557a60f5 100644 --- a/Tools/clinic/libclinic/converters.py +++ b/Tools/clinic/libclinic/converters.py @@ -17,6 +17,54 @@ TypeSet = set[bltns.type[object]] +class BaseUnsignedIntConverter(CConverter): + + def use_converter(self) -> None: + if self.converter: + self.add_include('pycore_long.h', + f'{self.converter}()') + + def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: + if not limited_capi: + return super().parse_arg(argname, displayname, limited_capi=limited_capi) + return self.format_code(""" + {{{{ + Py_ssize_t _bytes = PyLong_AsNativeBytes({argname}, &{paramname}, sizeof({type}), + Py_ASNATIVEBYTES_NATIVE_ENDIAN | + Py_ASNATIVEBYTES_ALLOW_INDEX | + Py_ASNATIVEBYTES_REJECT_NEGATIVE | + Py_ASNATIVEBYTES_UNSIGNED_BUFFER); + if (_bytes < 0) {{{{ + goto exit; + }}}} + if ((size_t)_bytes > sizeof({type})) {{{{ + PyErr_SetString(PyExc_OverflowError, + "Python int too large for C {type}"); + goto exit; + }}}} + }}}} + """, + argname=argname, + type=self.type) + + +class uint8_converter(BaseUnsignedIntConverter): + type = "uint8_t" + converter = '_PyLong_UInt8_Converter' + +class uint16_converter(BaseUnsignedIntConverter): + type = "uint16_t" + converter = '_PyLong_UInt16_Converter' + +class uint32_converter(BaseUnsignedIntConverter): + type = "uint32_t" + converter = '_PyLong_UInt32_Converter' + +class uint64_converter(BaseUnsignedIntConverter): + type = "uint64_t" + converter = '_PyLong_UInt64_Converter' + + class bool_converter(CConverter): type = 'int' default_type = bool @@ -211,29 +259,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st return super().parse_arg(argname, displayname, limited_capi=limited_capi) -def format_inline_unsigned_int_converter(self: CConverter, argname: str) -> str: - return self.format_code(""" - {{{{ - Py_ssize_t _bytes = PyLong_AsNativeBytes({argname}, &{paramname}, sizeof({type}), - Py_ASNATIVEBYTES_NATIVE_ENDIAN | - Py_ASNATIVEBYTES_ALLOW_INDEX | - Py_ASNATIVEBYTES_REJECT_NEGATIVE | - Py_ASNATIVEBYTES_UNSIGNED_BUFFER); - if (_bytes < 0) {{{{ - goto exit; - }}}} - if ((size_t)_bytes > sizeof({type})) {{{{ - PyErr_SetString(PyExc_OverflowError, - "Python int too large for C {type}"); - goto exit; - }}}} - }}}} - """, - argname=argname, - type=self.type) - - -class unsigned_short_converter(CConverter): +class unsigned_short_converter(BaseUnsignedIntConverter): type = 'unsigned short' default_type = int c_ignored_default = "0" @@ -244,11 +270,6 @@ def converter_init(self, *, bitwise: bool = False) -> None: else: self.converter = '_PyLong_UnsignedShort_Converter' - def use_converter(self) -> None: - if self.converter == '_PyLong_UnsignedShort_Converter': - self.add_include('pycore_long.h', - '_PyLong_UnsignedShort_Converter()') - def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'H': return self.format_code(""" @@ -258,9 +279,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st }}}} """, argname=argname) - if not limited_capi: - return super().parse_arg(argname, displayname, limited_capi=limited_capi) - return format_inline_unsigned_int_converter(self, argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) @add_legacy_c_converter('C', accept={str}) @@ -311,7 +330,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st return super().parse_arg(argname, displayname, limited_capi=limited_capi) -class unsigned_int_converter(CConverter): +class unsigned_int_converter(BaseUnsignedIntConverter): type = 'unsigned int' default_type = int c_ignored_default = "0" @@ -322,11 +341,6 @@ def converter_init(self, *, bitwise: bool = False) -> None: else: self.converter = '_PyLong_UnsignedInt_Converter' - def use_converter(self) -> None: - if self.converter == '_PyLong_UnsignedInt_Converter': - self.add_include('pycore_long.h', - '_PyLong_UnsignedInt_Converter()') - def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'I': return self.format_code(""" @@ -336,9 +350,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st }}}} """, argname=argname) - if not limited_capi: - return super().parse_arg(argname, displayname, limited_capi=limited_capi) - return format_inline_unsigned_int_converter(self, argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class long_converter(CConverter): @@ -359,7 +371,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st return super().parse_arg(argname, displayname, limited_capi=limited_capi) -class unsigned_long_converter(CConverter): +class unsigned_long_converter(BaseUnsignedIntConverter): type = 'unsigned long' default_type = int c_ignored_default = "0" @@ -370,11 +382,6 @@ def converter_init(self, *, bitwise: bool = False) -> None: else: self.converter = '_PyLong_UnsignedLong_Converter' - def use_converter(self) -> None: - if self.converter == '_PyLong_UnsignedLong_Converter': - self.add_include('pycore_long.h', - '_PyLong_UnsignedLong_Converter()') - def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'k': return self.format_code(""" @@ -387,9 +394,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st argname=argname, bad_argument=self.bad_argument(displayname, 'int', limited_capi=limited_capi), ) - if not limited_capi: - return super().parse_arg(argname, displayname, limited_capi=limited_capi) - return format_inline_unsigned_int_converter(self, argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class long_long_converter(CConverter): @@ -410,7 +415,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st return super().parse_arg(argname, displayname, limited_capi=limited_capi) -class unsigned_long_long_converter(CConverter): +class unsigned_long_long_converter(BaseUnsignedIntConverter): type = 'unsigned long long' default_type = int c_ignored_default = "0" @@ -421,11 +426,6 @@ def converter_init(self, *, bitwise: bool = False) -> None: else: self.converter = '_PyLong_UnsignedLongLong_Converter' - def use_converter(self) -> None: - if self.converter == '_PyLong_UnsignedLongLong_Converter': - self.add_include('pycore_long.h', - '_PyLong_UnsignedLongLong_Converter()') - def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'K': return self.format_code(""" @@ -438,9 +438,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st argname=argname, bad_argument=self.bad_argument(displayname, 'int', limited_capi=limited_capi), ) - if not limited_capi: - return super().parse_arg(argname, displayname, limited_capi=limited_capi) - return format_inline_unsigned_int_converter(self, argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class Py_ssize_t_converter(CConverter): @@ -557,15 +555,11 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st argname=argname) -class size_t_converter(CConverter): +class size_t_converter(BaseUnsignedIntConverter): type = 'size_t' converter = '_PyLong_Size_t_Converter' c_ignored_default = "0" - def use_converter(self) -> None: - self.add_include('pycore_long.h', - '_PyLong_Size_t_Converter()') - def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None: if self.format_unit == 'n': return self.format_code(""" @@ -575,9 +569,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st }}}} """, argname=argname) - if not limited_capi: - return super().parse_arg(argname, displayname, limited_capi=limited_capi) - return format_inline_unsigned_int_converter(self, argname) + return super().parse_arg(argname, displayname, limited_capi=limited_capi) class fildes_converter(CConverter): From caeb422cbca5a4470d406b52f3a712305214982e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 13:36:38 +0200 Subject: [PATCH 0020/1674] gh-133597: Fix memory leak if error occurred in _sys_getwindowsversion_from_kernel32 (GH-133598) (cherry picked from commit 0ec8fc83a83914d2ae97e52529e98ce63aaf831c) Co-authored-by: Sergey Miryanov --- Python/sysmodule.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 00dce4527fbb90..41b9a6b276a3b1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1670,6 +1670,9 @@ _sys_getwindowsversion_from_kernel32(void) !GetFileVersionInfoW(kernel32_path, 0, verblock_size, verblock) || !VerQueryValueW(verblock, L"", (LPVOID)&ffi, &ffi_len)) { PyErr_SetFromWindowsErr(0); + if (verblock) { + PyMem_RawFree(verblock); + } return NULL; } From 863722be6b7c31c69dbf931581a531979dd28203 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 15:24:38 +0200 Subject: [PATCH 0021/1674] [3.14] gh-133454: Mark tests with many threads that use much memory as bigmem (GH-133456) (GH-133663) (cherry picked from commit 26839eae2079bd797491dfdcc00eaca1dbcbf77c) Co-authored-by: Serhiy Storchaka --- Lib/test/test_asyncio/test_ssl.py | 10 ++++++---- Lib/test/test_importlib/test_threaded_import.py | 15 ++++++++++----- Lib/test/test_threadedtempfile.py | 4 +++- Lib/test/test_threading.py | 6 ++++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_asyncio/test_ssl.py b/Lib/test/test_asyncio/test_ssl.py index 986ecc2c5a964b..3a7185cd8974d0 100644 --- a/Lib/test/test_asyncio/test_ssl.py +++ b/Lib/test/test_asyncio/test_ssl.py @@ -195,9 +195,10 @@ async def wait_closed(self, obj): except (BrokenPipeError, ConnectionError): pass - def test_create_server_ssl_1(self): + @support.bigmemtest(size=25, memuse=90*2**20, dry_run=False) + def test_create_server_ssl_1(self, size): CNT = 0 # number of clients that were successful - TOTAL_CNT = 25 # total number of clients that test will create + TOTAL_CNT = size # total number of clients that test will create TIMEOUT = support.LONG_TIMEOUT # timeout for this test A_DATA = b'A' * 1024 * BUF_MULTIPLIER @@ -1038,9 +1039,10 @@ async def run_main(): self.loop.run_until_complete(run_main()) - def test_create_server_ssl_over_ssl(self): + @support.bigmemtest(size=25, memuse=90*2**20, dry_run=False) + def test_create_server_ssl_over_ssl(self, size): CNT = 0 # number of clients that were successful - TOTAL_CNT = 25 # total number of clients that test will create + TOTAL_CNT = size # total number of clients that test will create TIMEOUT = support.LONG_TIMEOUT # timeout for this test A_DATA = b'A' * 1024 * BUF_MULTIPLIER diff --git a/Lib/test/test_importlib/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py index 9af1e4d505c66e..f78dc399720c86 100644 --- a/Lib/test/test_importlib/test_threaded_import.py +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -135,10 +135,12 @@ def check_parallel_module_init(self, mock_os): if verbose: print("OK.") - def test_parallel_module_init(self): + @support.bigmemtest(size=50, memuse=76*2**20, dry_run=False) + def test_parallel_module_init(self, size): self.check_parallel_module_init() - def test_parallel_meta_path(self): + @support.bigmemtest(size=50, memuse=76*2**20, dry_run=False) + def test_parallel_meta_path(self, size): finder = Finder() sys.meta_path.insert(0, finder) try: @@ -148,7 +150,8 @@ def test_parallel_meta_path(self): finally: sys.meta_path.remove(finder) - def test_parallel_path_hooks(self): + @support.bigmemtest(size=50, memuse=76*2**20, dry_run=False) + def test_parallel_path_hooks(self, size): # Here the Finder instance is only used to check concurrent calls # to path_hook(). finder = Finder() @@ -242,13 +245,15 @@ def target(): __import__(TESTFN) del sys.modules[TESTFN] - def test_concurrent_futures_circular_import(self): + @support.bigmemtest(size=1, memuse=1.8*2**30, dry_run=False) + def test_concurrent_futures_circular_import(self, size): # Regression test for bpo-43515 fn = os.path.join(os.path.dirname(__file__), 'partial', 'cfimport.py') script_helper.assert_python_ok(fn) - def test_multiprocessing_pool_circular_import(self): + @support.bigmemtest(size=1, memuse=1.8*2**30, dry_run=False) + def test_multiprocessing_pool_circular_import(self, size): # Regression test for bpo-41567 fn = os.path.join(os.path.dirname(__file__), 'partial', 'pool_in_threads.py') diff --git a/Lib/test/test_threadedtempfile.py b/Lib/test/test_threadedtempfile.py index 420fc6ec8be3d8..acb427b0c78ae9 100644 --- a/Lib/test/test_threadedtempfile.py +++ b/Lib/test/test_threadedtempfile.py @@ -15,6 +15,7 @@ import tempfile +from test import support from test.support import threading_helper import unittest import io @@ -49,7 +50,8 @@ def run(self): class ThreadedTempFileTest(unittest.TestCase): - def test_main(self): + @support.bigmemtest(size=NUM_THREADS, memuse=60*2**20, dry_run=False) + def test_main(self, size): threads = [TempFileGreedy() for i in range(NUM_THREADS)] with threading_helper.start_threads(threads, startEvent.set): pass diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 4ab38c2598b50a..abe63c10c0ac7c 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -530,7 +530,8 @@ def test_enumerate_after_join(self): finally: sys.setswitchinterval(old_interval) - def test_join_from_multiple_threads(self): + @support.bigmemtest(size=20, memuse=72*2**20, dry_run=False) + def test_join_from_multiple_threads(self, size): # Thread.join() should be thread-safe errors = [] @@ -1431,7 +1432,8 @@ def worker(): self._run_and_join(script) @unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug") - def test_4_daemon_threads(self): + @support.bigmemtest(size=40, memuse=70*2**20, dry_run=False) + def test_4_daemon_threads(self, size): # Check that a daemon thread cannot crash the interpreter on shutdown # by manipulating internal structures that are being disposed of in # the main thread. From 153496921a05e205d4c45c4a64888ccd43148897 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 15:40:44 +0200 Subject: [PATCH 0022/1674] [3.14] gh-133581: Improve AST unparsing of t-strings (GH-133635) (#133666) gh-133581: Improve AST unparsing of t-strings (GH-133635) (cherry picked from commit bfac7d2edc6e461e21b4762f8db03fca85f3a0be) Co-authored-by: Jelle Zijlstra --- Lib/_ast_unparse.py | 12 ++++-- Lib/test/test_future_stmt/test_future.py | 5 +++ Lib/test/test_unparse.py | 10 ++++- ...-05-07-19-16-41.gh-issue-133581.kERUCJ.rst | 4 ++ Python/ast_unparse.c | 38 ++++++++++++------- 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-07-19-16-41.gh-issue-133581.kERUCJ.rst diff --git a/Lib/_ast_unparse.py b/Lib/_ast_unparse.py index 0b669edb2ffec6..c25066eb107de1 100644 --- a/Lib/_ast_unparse.py +++ b/Lib/_ast_unparse.py @@ -627,6 +627,9 @@ def _write_ftstring(self, values, prefix): self._ftstring_helper(fstring_parts) def _tstring_helper(self, node): + if not node.values: + self._write_ftstring([], "t") + return last_idx = 0 for i, value in enumerate(node.values): # This can happen if we have an implicit concat of a t-string @@ -679,9 +682,12 @@ def _unparse_interpolation_value(self, inner): unparser.set_precedence(_Precedence.TEST.next(), inner) return unparser.visit(inner) - def _write_interpolation(self, node): + def _write_interpolation(self, node, is_interpolation=False): with self.delimit("{", "}"): - expr = self._unparse_interpolation_value(node.value) + if is_interpolation: + expr = node.str + else: + expr = self._unparse_interpolation_value(node.value) if expr.startswith("{"): # Separate pair of opening brackets as "{ {" self.write(" ") @@ -696,7 +702,7 @@ def visit_FormattedValue(self, node): self._write_interpolation(node) def visit_Interpolation(self, node): - self._write_interpolation(node) + self._write_interpolation(node, is_interpolation=True) def visit_Name(self, node): self.write(node.id) diff --git a/Lib/test/test_future_stmt/test_future.py b/Lib/test/test_future_stmt/test_future.py index 42c6cb3fefac33..71f1e616116d81 100644 --- a/Lib/test/test_future_stmt/test_future.py +++ b/Lib/test/test_future_stmt/test_future.py @@ -422,6 +422,11 @@ def test_annotations(self): eq('(((a)))', 'a') eq('(((a, b)))', '(a, b)') eq("1 + 2 + 3") + eq("t''") + eq("t'{a + b}'") + eq("t'{a!s}'") + eq("t'{a:b}'") + eq("t'{a:b=}'") def test_fstring_debug_annotations(self): # f-strings with '=' don't round trip very well, so set the expected diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 5616129eb63c2f..d4db5e60af7978 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -817,6 +817,15 @@ def test_type_params(self): self.check_ast_roundtrip("def f[T: int = int, **P = int, *Ts = *int]():\n pass") self.check_ast_roundtrip("class C[T: int = int, **P = int, *Ts = *int]():\n pass") + def test_tstr(self): + self.check_ast_roundtrip("t'{a + b}'") + self.check_ast_roundtrip("t'{a + b:x}'") + self.check_ast_roundtrip("t'{a + b!s}'") + self.check_ast_roundtrip("t'{ {a}}'") + self.check_ast_roundtrip("t'{ {a}=}'") + self.check_ast_roundtrip("t'{{a}}'") + self.check_ast_roundtrip("t''") + class ManualASTCreationTestCase(unittest.TestCase): """Test that AST nodes created without a type_params field unparse correctly.""" @@ -942,7 +951,6 @@ def files_to_test(cls): for directory in cls.test_directories for item in directory.glob("*.py") if not item.name.startswith("bad") - and item.name != "annotationlib.py" # gh-133581: t"" does not roundtrip ] # Test limited subset of files unless the 'cpu' resource is specified. diff --git a/Misc/NEWS.d/next/Library/2025-05-07-19-16-41.gh-issue-133581.kERUCJ.rst b/Misc/NEWS.d/next/Library/2025-05-07-19-16-41.gh-issue-133581.kERUCJ.rst new file mode 100644 index 00000000000000..3749904cd9b8f1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-07-19-16-41.gh-issue-133581.kERUCJ.rst @@ -0,0 +1,4 @@ +Improve unparsing of t-strings in :func:`ast.unparse` and ``from __future__ +import annotations``. Empty t-strings now round-trip correctly and +formatting in interpolations is preserved. +Patch by Jelle Zijlstra. diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index c121ec096aebf4..ae623e0b4171f8 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -702,6 +702,13 @@ append_templatestr(PyUnicodeWriter *writer, expr_ty e) Py_ssize_t last_idx = 0; Py_ssize_t len = asdl_seq_LEN(e->v.TemplateStr.values); + if (len == 0) { + int result = _write_values_subarray(writer, e->v.TemplateStr.values, + 0, len - 1, 't', arena); + _PyArena_Free(arena); + return result; + } + for (Py_ssize_t i = 0; i < len; i++) { expr_ty value = asdl_seq_GET(e->v.TemplateStr.values, i); @@ -774,32 +781,37 @@ append_joinedstr(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) } static int -append_interpolation_value(PyUnicodeWriter *writer, expr_ty e) +append_interpolation_str(PyUnicodeWriter *writer, PyObject *str) { const char *outer_brace = "{"; - /* Grammar allows PR_TUPLE, but use >PR_TEST for adding parenthesis - around a lambda with ':' */ - PyObject *temp_fv_str = expr_as_unicode(e, PR_TEST + 1); - if (!temp_fv_str) { - return -1; - } - if (PyUnicode_Find(temp_fv_str, _Py_LATIN1_CHR('{'), 0, 1, 1) == 0) { + if (PyUnicode_Find(str, _Py_LATIN1_CHR('{'), 0, 1, 1) == 0) { /* Expression starts with a brace, split it with a space from the outer one. */ outer_brace = "{ "; } if (-1 == append_charp(writer, outer_brace)) { - Py_DECREF(temp_fv_str); return -1; } - if (-1 == PyUnicodeWriter_WriteStr(writer, temp_fv_str)) { - Py_DECREF(temp_fv_str); + if (-1 == PyUnicodeWriter_WriteStr(writer, str)) { return -1; } - Py_DECREF(temp_fv_str); return 0; } +static int +append_interpolation_value(PyUnicodeWriter *writer, expr_ty e) +{ + /* Grammar allows PR_TUPLE, but use >PR_TEST for adding parenthesis + around a lambda with ':' */ + PyObject *temp_fv_str = expr_as_unicode(e, PR_TEST + 1); + if (!temp_fv_str) { + return -1; + } + int result = append_interpolation_str(writer, temp_fv_str); + Py_DECREF(temp_fv_str); + return result; +} + static int append_interpolation_conversion(PyUnicodeWriter *writer, int conversion) { @@ -843,7 +855,7 @@ append_interpolation_format_spec(PyUnicodeWriter *writer, expr_ty e) static int append_interpolation(PyUnicodeWriter *writer, expr_ty e) { - if (-1 == append_interpolation_value(writer, e->v.Interpolation.value)) { + if (-1 == append_interpolation_str(writer, e->v.Interpolation.str)) { return -1; } From dc1a4dda88637d551d0be26632186be10343b098 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 17:19:58 +0200 Subject: [PATCH 0023/1674] [3.14] gh-131031: Fix test_pickle when invoked directly (GH-133356) (GH-133673) (cherry picked from commit e15bbfafbcc9153fa0b05beb806984e288fdefe4) Co-authored-by: Serhiy Storchaka --- Lib/test/pickletester.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index bdc7ef62943a28..dcba6369541049 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2272,7 +2272,11 @@ def test_nonencodable_module_name_error(self): def test_nested_lookup_error(self): # Nested name does not exist - obj = REX('AbstractPickleTests.spam') + global TestGlobal + class TestGlobal: + class A: + pass + obj = REX('TestGlobal.A.B.C') obj.__module__ = __name__ for proto in protocols: with self.subTest(proto=proto): @@ -2280,9 +2284,9 @@ def test_nested_lookup_error(self): self.dumps(obj, proto) self.assertEqual(str(cm.exception), f"Can't pickle {obj!r}: " - f"it's not found as {__name__}.AbstractPickleTests.spam") + f"it's not found as {__name__}.TestGlobal.A.B.C") self.assertEqual(str(cm.exception.__context__), - "type object 'AbstractPickleTests' has no attribute 'spam'") + "type object 'A' has no attribute 'B'") obj.__module__ = None for proto in protocols: @@ -2290,21 +2294,25 @@ def test_nested_lookup_error(self): with self.assertRaises(pickle.PicklingError) as cm: self.dumps(obj, proto) self.assertEqual(str(cm.exception), - f"Can't pickle {obj!r}: it's not found as __main__.AbstractPickleTests.spam") + f"Can't pickle {obj!r}: " + f"it's not found as __main__.TestGlobal.A.B.C") self.assertEqual(str(cm.exception.__context__), - "module '__main__' has no attribute 'AbstractPickleTests'") + "module '__main__' has no attribute 'TestGlobal'") def test_wrong_object_lookup_error(self): # Name is bound to different object - obj = REX('AbstractPickleTests') + global TestGlobal + class TestGlobal: + pass + obj = REX('TestGlobal') obj.__module__ = __name__ - AbstractPickleTests.ham = [] for proto in protocols: with self.subTest(proto=proto): with self.assertRaises(pickle.PicklingError) as cm: self.dumps(obj, proto) self.assertEqual(str(cm.exception), - f"Can't pickle {obj!r}: it's not the same object as {__name__}.AbstractPickleTests") + f"Can't pickle {obj!r}: " + f"it's not the same object as {__name__}.TestGlobal") self.assertIsNone(cm.exception.__context__) obj.__module__ = None @@ -2313,9 +2321,10 @@ def test_wrong_object_lookup_error(self): with self.assertRaises(pickle.PicklingError) as cm: self.dumps(obj, proto) self.assertEqual(str(cm.exception), - f"Can't pickle {obj!r}: it's not found as __main__.AbstractPickleTests") + f"Can't pickle {obj!r}: " + f"it's not found as __main__.TestGlobal") self.assertEqual(str(cm.exception.__context__), - "module '__main__' has no attribute 'AbstractPickleTests'") + "module '__main__' has no attribute 'TestGlobal'") def test_local_lookup_error(self): # Test that whichmodule() errors out cleanly when looking up From 10595486860aa054c9d7ad236cc50064e7b800d5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 May 2025 18:05:34 +0200 Subject: [PATCH 0024/1674] [3.14] gh-132775: Add _PyCode_GetScriptXIData() (gh-133676) This converts functions, code, str, bytes, bytearray, and memoryview objects to PyCodeObject, and ensure that the object looks like a script. That means no args, no return, and no closure. _PyCode_GetPureScriptXIData() takes it a step further and ensures there are no globals. We also add _PyObject_SupportedAsScript() to the internal C-API. (cherry picked from commit c81fa2b9cd1ed4d4ff5c13984d6582c27e5f2633, AKA gh-133480) Co-authored-by: Eric Snow --- Include/internal/pycore_crossinterp.h | 8 ++ Include/internal/pycore_pythonrun.h | 1 + Lib/test/_code_definitions.py | 53 +++++++++++ Lib/test/test_code.py | 27 ++++++ Lib/test/test_crossinterp.py | 120 ++++++++++++++++++++++++ Modules/_testinternalcapi.c | 10 ++ Python/crossinterp.c | 127 ++++++++++++++++++++++++++ Python/pythonrun.c | 20 ++++ 8 files changed, 366 insertions(+) diff --git a/Include/internal/pycore_crossinterp.h b/Include/internal/pycore_crossinterp.h index 9de61ef54125d5..9c9b2c2f9c599d 100644 --- a/Include/internal/pycore_crossinterp.h +++ b/Include/internal/pycore_crossinterp.h @@ -191,6 +191,14 @@ PyAPI_FUNC(int) _PyCode_GetXIData( PyThreadState *, PyObject *, _PyXIData_t *); +PyAPI_FUNC(int) _PyCode_GetScriptXIData( + PyThreadState *, + PyObject *, + _PyXIData_t *); +PyAPI_FUNC(int) _PyCode_GetPureScriptXIData( + PyThreadState *, + PyObject *, + _PyXIData_t *); /* using cross-interpreter data */ diff --git a/Include/internal/pycore_pythonrun.h b/Include/internal/pycore_pythonrun.h index 0bfc5704dc4c59..7daed1326af8d5 100644 --- a/Include/internal/pycore_pythonrun.h +++ b/Include/internal/pycore_pythonrun.h @@ -25,6 +25,7 @@ extern int _PyRun_InteractiveLoopObject( PyObject *filename, PyCompilerFlags *flags); +extern int _PyObject_SupportedAsScript(PyObject *); extern const char* _Py_SourceAsString( PyObject *cmd, const char *funcname, diff --git a/Lib/test/_code_definitions.py b/Lib/test/_code_definitions.py index d64ac45d85f396..733a15b25f6894 100644 --- a/Lib/test/_code_definitions.py +++ b/Lib/test/_code_definitions.py @@ -1,4 +1,32 @@ +def simple_script(): + assert True + + +def complex_script(): + obj = 'a string' + pickle = __import__('pickle') + def spam_minimal(): + pass + spam_minimal() + data = pickle.dumps(obj) + res = pickle.loads(data) + assert res == obj, (res, obj) + + +def script_with_globals(): + obj1, obj2 = spam(42) + assert obj1 == 42 + assert obj2 is None + + +def script_with_explicit_empty_return(): + return None + + +def script_with_return(): + return True + def spam_minimal(): # no arg defaults or kwarg defaults @@ -141,6 +169,11 @@ def ham_C_closure(z): TOP_FUNCTIONS = [ # shallow + simple_script, + complex_script, + script_with_globals, + script_with_explicit_empty_return, + script_with_return, spam_minimal, spam_with_builtins, spam_with_globals_and_builtins, @@ -179,6 +212,10 @@ def ham_C_closure(z): ] STATELESS_FUNCTIONS = [ + simple_script, + complex_script, + script_with_explicit_empty_return, + script_with_return, spam, spam_minimal, spam_with_builtins, @@ -200,10 +237,26 @@ def ham_C_closure(z): ] STATELESS_CODE = [ *STATELESS_FUNCTIONS, + script_with_globals, spam_with_globals_and_builtins, spam_full, ] +PURE_SCRIPT_FUNCTIONS = [ + simple_script, + complex_script, + script_with_explicit_empty_return, + spam_minimal, + spam_with_builtins, + spam_with_inner_not_closure, + spam_with_inner_closure, +] +SCRIPT_FUNCTIONS = [ + *PURE_SCRIPT_FUNCTIONS, + script_with_globals, + spam_with_globals_and_builtins, +] + # generators diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 6715ee051336a1..32cf8aacaf6b72 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -673,6 +673,20 @@ def test_local_kinds(self): VARKWARGS = CO_FAST_LOCAL | CO_FAST_ARG_VAR | CO_FAST_ARG_KW funcs = { + defs.simple_script: {}, + defs.complex_script: { + 'obj': CO_FAST_LOCAL, + 'pickle': CO_FAST_LOCAL, + 'spam_minimal': CO_FAST_LOCAL, + 'data': CO_FAST_LOCAL, + 'res': CO_FAST_LOCAL, + }, + defs.script_with_globals: { + 'obj1': CO_FAST_LOCAL, + 'obj2': CO_FAST_LOCAL, + }, + defs.script_with_explicit_empty_return: {}, + defs.script_with_return: {}, defs.spam_minimal: {}, defs.spam_with_builtins: { 'x': CO_FAST_LOCAL, @@ -898,6 +912,19 @@ def new_var_counts(*, } funcs = { + defs.simple_script: new_var_counts(), + defs.complex_script: new_var_counts( + purelocals=5, + globalvars=1, + attrs=2, + ), + defs.script_with_globals: new_var_counts( + purelocals=2, + globalvars=1, + ), + defs.script_with_explicit_empty_return: new_var_counts(), + defs.script_with_return: new_var_counts(), + defs.spam_minimal: new_var_counts(), defs.spam_minimal: new_var_counts(), defs.spam_with_builtins: new_var_counts( purelocals=4, diff --git a/Lib/test/test_crossinterp.py b/Lib/test/test_crossinterp.py index 5ac0080db435a8..b366a29645e9f2 100644 --- a/Lib/test/test_crossinterp.py +++ b/Lib/test/test_crossinterp.py @@ -758,6 +758,126 @@ def test_other_objects(self): ]) +class PureShareableScriptTests(_GetXIDataTests): + + MODE = 'script-pure' + + VALID_SCRIPTS = [ + '', + 'spam', + '# a comment', + 'print("spam")', + 'raise Exception("spam")', + """if True: + do_something() + """, + """if True: + def spam(x): + return x + class Spam: + def eggs(self): + return 42 + x = Spam().eggs() + raise ValueError(spam(x)) + """, + ] + INVALID_SCRIPTS = [ + ' pass', # IndentationError + '----', # SyntaxError + """if True: + def spam(): + # no body + spam() + """, # IndentationError + ] + + def test_valid_str(self): + self.assert_roundtrip_not_equal([ + *self.VALID_SCRIPTS, + ], expecttype=types.CodeType) + + def test_invalid_str(self): + self.assert_not_shareable([ + *self.INVALID_SCRIPTS, + ]) + + def test_valid_bytes(self): + self.assert_roundtrip_not_equal([ + *(s.encode('utf8') for s in self.VALID_SCRIPTS), + ], expecttype=types.CodeType) + + def test_invalid_bytes(self): + self.assert_not_shareable([ + *(s.encode('utf8') for s in self.INVALID_SCRIPTS), + ]) + + def test_pure_script_code(self): + self.assert_roundtrip_equal_not_identical([ + *(f.__code__ for f in defs.PURE_SCRIPT_FUNCTIONS), + ]) + + def test_impure_script_code(self): + self.assert_not_shareable([ + *(f.__code__ for f in defs.SCRIPT_FUNCTIONS + if f not in defs.PURE_SCRIPT_FUNCTIONS), + ]) + + def test_other_code(self): + self.assert_not_shareable([ + *(f.__code__ for f in defs.FUNCTIONS + if f not in defs.SCRIPT_FUNCTIONS), + *(f.__code__ for f in defs.FUNCTION_LIKE), + ]) + + def test_pure_script_function(self): + self.assert_roundtrip_not_equal([ + *defs.PURE_SCRIPT_FUNCTIONS, + ], expecttype=types.CodeType) + + def test_impure_script_function(self): + self.assert_not_shareable([ + *(f for f in defs.SCRIPT_FUNCTIONS + if f not in defs.PURE_SCRIPT_FUNCTIONS), + ]) + + def test_other_function(self): + self.assert_not_shareable([ + *(f for f in defs.FUNCTIONS + if f not in defs.SCRIPT_FUNCTIONS), + *defs.FUNCTION_LIKE, + ]) + + def test_other_objects(self): + self.assert_not_shareable([ + None, + True, + False, + Ellipsis, + NotImplemented, + (), + [], + {}, + object(), + ]) + + +class ShareableScriptTests(PureShareableScriptTests): + + MODE = 'script' + + def test_impure_script_code(self): + self.assert_roundtrip_equal_not_identical([ + *(f.__code__ for f in defs.SCRIPT_FUNCTIONS + if f not in defs.PURE_SCRIPT_FUNCTIONS), + ]) + + def test_impure_script_function(self): + self.assert_roundtrip_not_equal([ + *(f for f in defs.SCRIPT_FUNCTIONS + if f not in defs.PURE_SCRIPT_FUNCTIONS), + ], expecttype=types.CodeType) + + class ShareableTypeTests(_GetXIDataTests): MODE = 'xidata' diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 63f1d079d8d312..3030f45d72cefa 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1989,6 +1989,16 @@ get_crossinterp_data(PyObject *self, PyObject *args, PyObject *kwargs) goto error; } } + else if (strcmp(mode, "script") == 0) { + if (_PyCode_GetScriptXIData(tstate, obj, xidata) != 0) { + goto error; + } + } + else if (strcmp(mode, "script-pure") == 0) { + if (_PyCode_GetPureScriptXIData(tstate, obj, xidata) != 0) { + goto error; + } + } else { PyErr_Format(PyExc_ValueError, "unsupported mode %R", modeobj); goto error; diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 74ce02f1a26401..7d7e6551c3f2d2 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -6,8 +6,10 @@ #include "osdefs.h" // MAXPATHLEN #include "pycore_ceval.h" // _Py_simple_func #include "pycore_crossinterp.h" // _PyXIData_t +#include "pycore_function.h" // _PyFunction_VerifyStateless() #include "pycore_initconfig.h" // _PyStatus_OK() #include "pycore_namespace.h" // _PyNamespace_New() +#include "pycore_pythonrun.h" // _Py_SourceAsString() #include "pycore_typeobject.h" // _PyStaticType_InitBuiltin() @@ -784,6 +786,131 @@ _PyMarshal_GetXIData(PyThreadState *tstate, PyObject *obj, _PyXIData_t *xidata) } +/* script wrapper */ + +static int +verify_script(PyThreadState *tstate, PyCodeObject *co, int checked, int pure) +{ + // Make sure it isn't a closure and (optionally) doesn't use globals. + PyObject *builtins = NULL; + if (pure) { + builtins = _PyEval_GetBuiltins(tstate); + assert(builtins != NULL); + } + if (checked) { + assert(_PyCode_VerifyStateless(tstate, co, NULL, NULL, builtins) == 0); + } + else if (_PyCode_VerifyStateless(tstate, co, NULL, NULL, builtins) < 0) { + return -1; + } + // Make sure it doesn't have args. + if (co->co_argcount > 0 + || co->co_posonlyargcount > 0 + || co->co_kwonlyargcount > 0 + || co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) + { + _PyErr_SetString(tstate, PyExc_ValueError, + "code with args not supported"); + return -1; + } + // Make sure it doesn't return anything. + if (!_PyCode_ReturnsOnlyNone(co)) { + _PyErr_SetString(tstate, PyExc_ValueError, + "code that returns a value is not a script"); + return -1; + } + return 0; +} + +static int +get_script_xidata(PyThreadState *tstate, PyObject *obj, int pure, + _PyXIData_t *xidata) +{ + // Get the corresponding code object. + PyObject *code = NULL; + int checked = 0; + if (PyCode_Check(obj)) { + code = obj; + Py_INCREF(code); + } + else if (PyFunction_Check(obj)) { + code = PyFunction_GET_CODE(obj); + assert(code != NULL); + Py_INCREF(code); + if (pure) { + if (_PyFunction_VerifyStateless(tstate, obj) < 0) { + goto error; + } + checked = 1; + } + } + else { + const char *filename = " - {% endif %} - - {% if builder != "htmlhelp" %} + {% endif %} + {% if pagename == 'whatsnew/changelog' and not embedded %} {% endif %} {% endif %} From 4adb1ddac8860131c86898ddaa3d31a77b98bfce Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 14 May 2025 20:18:04 +0200 Subject: [PATCH 0098/1674] [3.14] Improve tests for str to Fraction conversion (GH-134010) (GH-134016) (cherry picked from commit 17d0fec702e43e27a9c3f37f8abe06a19b656bed) Co-authored-by: Serhiy Storchaka --- Lib/test/test_fractions.py | 207 +++++++++++++++++-------------------- 1 file changed, 97 insertions(+), 110 deletions(-) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 84faa63606439e..37de3ad380e633 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -1,7 +1,7 @@ """Tests for Lib/fractions.py.""" from decimal import Decimal -from test.support import requires_IEEE_754 +from test.support import requires_IEEE_754, adjust_int_max_str_digits import math import numbers import operator @@ -395,12 +395,14 @@ class B(metaclass=M): def testFromString(self): self.assertEqual((5, 1), _components(F("5"))) + self.assertEqual((5, 1), _components(F("005"))) self.assertEqual((3, 2), _components(F("3/2"))) self.assertEqual((3, 2), _components(F("3 / 2"))) self.assertEqual((3, 2), _components(F(" \n +3/2"))) self.assertEqual((-3, 2), _components(F("-3/2 "))) - self.assertEqual((13, 2), _components(F(" 013/02 \n "))) + self.assertEqual((13, 2), _components(F(" 0013/002 \n "))) self.assertEqual((16, 5), _components(F(" 3.2 "))) + self.assertEqual((16, 5), _components(F("003.2"))) self.assertEqual((-16, 5), _components(F(" -3.2 "))) self.assertEqual((-3, 1), _components(F(" -3. "))) self.assertEqual((3, 5), _components(F(" .6 "))) @@ -419,116 +421,101 @@ def testFromString(self): self.assertRaisesMessage( ZeroDivisionError, "Fraction(3, 0)", F, "3/0") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '3/'", - F, "3/") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '/2'", - F, "/2") - self.assertRaisesMessage( - # Denominators don't need a sign. - ValueError, "Invalid literal for Fraction: '3/+2'", - F, "3/+2") - self.assertRaisesMessage( - # Imitate float's parsing. - ValueError, "Invalid literal for Fraction: '+ 3/2'", - F, "+ 3/2") - self.assertRaisesMessage( - # Avoid treating '.' as a regex special character. - ValueError, "Invalid literal for Fraction: '3a2'", - F, "3a2") - self.assertRaisesMessage( - # Don't accept combinations of decimals and rationals. - ValueError, "Invalid literal for Fraction: '3/7.2'", - F, "3/7.2") - self.assertRaisesMessage( - # Don't accept combinations of decimals and rationals. - ValueError, "Invalid literal for Fraction: '3.2/7'", - F, "3.2/7") - self.assertRaisesMessage( - # Allow 3. and .3, but not . - ValueError, "Invalid literal for Fraction: '.'", - F, ".") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '_'", - F, "_") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '_1'", - F, "_1") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1__2'", - F, "1__2") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '/_'", - F, "/_") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1_/'", - F, "1_/") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '_1/'", - F, "_1/") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1__2/'", - F, "1__2/") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1/_'", - F, "1/_") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1/_1'", - F, "1/_1") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1/1__2'", - F, "1/1__2") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1._111'", - F, "1._111") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1.1__1'", - F, "1.1__1") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1.1e+_1'", - F, "1.1e+_1") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1.1e+1__1'", - F, "1.1e+1__1") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '123.dd'", - F, "123.dd") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '123.5_dd'", - F, "123.5_dd") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: 'dd.5'", - F, "dd.5") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '7_dd'", - F, "7_dd") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1/dd'", - F, "1/dd") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1/123_dd'", - F, "1/123_dd") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '789edd'", - F, "789edd") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '789e2_dd'", - F, "789e2_dd") + + def check_invalid(s): + msg = "Invalid literal for Fraction: " + repr(s) + self.assertRaisesMessage(ValueError, msg, F, s) + + check_invalid("3/") + check_invalid("/2") + # Denominators don't need a sign. + check_invalid("3/+2") + check_invalid("3/-2") + # Imitate float's parsing. + check_invalid("+ 3/2") + check_invalid("- 3/2") + # Avoid treating '.' as a regex special character. + check_invalid("3a2") + # Don't accept combinations of decimals and rationals. + check_invalid("3/7.2") + check_invalid("3.2/7") + # No space around dot. + check_invalid("3 .2") + check_invalid("3. 2") + # No space around e. + check_invalid("3.2 e1") + check_invalid("3.2e 1") + # Fractional part don't need a sign. + check_invalid("3.+2") + check_invalid("3.-2") + # Only accept base 10. + check_invalid("0x10") + check_invalid("0x10/1") + check_invalid("1/0x10") + check_invalid("0x10.") + check_invalid("0x10.1") + check_invalid("1.0x10") + check_invalid("1.0e0x10") + # Only accept decimal digits. + check_invalid("³") + check_invalid("³/2") + check_invalid("3/²") + check_invalid("³.2") + check_invalid("3.²") + check_invalid("3.2e²") + check_invalid("¼") + # Allow 3. and .3, but not . + check_invalid(".") + check_invalid("_") + check_invalid("_1") + check_invalid("1__2") + check_invalid("/_") + check_invalid("1_/") + check_invalid("_1/") + check_invalid("1__2/") + check_invalid("1/_") + check_invalid("1/_1") + check_invalid("1/1__2") + check_invalid("1._111") + check_invalid("1.1__1") + check_invalid("1.1e+_1") + check_invalid("1.1e+1__1") + check_invalid("123.dd") + check_invalid("123.5_dd") + check_invalid("dd.5") + check_invalid("7_dd") + check_invalid("1/dd") + check_invalid("1/123_dd") + check_invalid("789edd") + check_invalid("789e2_dd") # Test catastrophic backtracking. val = "9"*50 + "_" - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '" + val + "'", - F, val) - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1/" + val + "'", - F, "1/" + val) - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1." + val + "'", - F, "1." + val) - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '1.1+e" + val + "'", - F, "1.1+e" + val) + check_invalid(val) + check_invalid("1/" + val) + check_invalid("1." + val) + check_invalid("." + val) + check_invalid("1.1+e" + val) + check_invalid("1.1e" + val) + + def test_limit_int(self): + maxdigits = 5000 + with adjust_int_max_str_digits(maxdigits): + val = '1' * maxdigits + num = (10**maxdigits - 1)//9 + self.assertEqual((num, 1), _components(F(val))) + self.assertRaises(ValueError, F, val + '1') + self.assertEqual((num, 2), _components(F(val + '/2'))) + self.assertRaises(ValueError, F, val + '1/2') + self.assertEqual((1, num), _components(F('1/' + val))) + self.assertRaises(ValueError, F, '1/1' + val) + self.assertEqual(((10**(maxdigits+1) - 1)//9, 10**maxdigits), + _components(F('1.' + val))) + self.assertRaises(ValueError, F, '1.1' + val) + self.assertEqual((num, 10**maxdigits), _components(F('.' + val))) + self.assertRaises(ValueError, F, '.1' + val) + self.assertRaises(ValueError, F, '1.1e1' + val) + self.assertEqual((11, 10), _components(F('1.1e' + '0' * maxdigits))) + self.assertRaises(ValueError, F, '1.1e' + '0' * (maxdigits+1)) def testImmutable(self): r = F(7, 3) From b6299e8f16c1e6ab1d3dab42f9803e00fb0bdddb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 03:32:45 +0200 Subject: [PATCH 0099/1674] [3.14] gh-133986: Document string split algorithm when sep is None and maxsplit is 0 (GH-133987) (#133993) --------- (cherry picked from commit 3e23047363f384b7254b7af51afe4e353be94167) Co-authored-by: Joey Smith Co-authored-by: Ned Batchelder Co-authored-by: Semyon Moroz --- Doc/library/stdtypes.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 1d9a655c7664ea..3486a18b5cb1f0 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2269,6 +2269,18 @@ expression support in the :mod:`re` module). >>> ' 1 2 3 '.split() ['1', '2', '3'] + If *sep* is not specified or is ``None`` and *maxsplit* is ``0``, only + leading runs of consecutive whitespace are considered. + + For example:: + + >>> "".split(None, 0) + [] + >>> " ".split(None, 0) + [] + >>> " foo ".split(maxsplit=0) + ['foo '] + .. index:: single: universal newlines; str.splitlines method From f2a4b1066be66574a147bc353efc91a6dc65753d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 08:39:39 +0200 Subject: [PATCH 0100/1674] [3.14] gh-133970: Make PEP750 types generic (GH-133976) (#134029) gh-133970: Make PEP750 types generic (GH-133976) (cherry picked from commit c3a1da5b9397867e6b3169dd17cb33ef2898da4a) Co-authored-by: sobolevn --- Lib/test/test_genericalias.py | 6 +++++- .../Library/2025-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst | 2 ++ Objects/interpolationobject.c | 2 ++ Objects/templateobject.c | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 8d21ded45014ba..ea0dc241e39475 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -61,6 +61,7 @@ from tkinter import Event except ImportError: Event = None +from string.templatelib import Template, Interpolation from typing import TypeVar T = TypeVar('T') @@ -139,7 +140,10 @@ class BaseTest(unittest.TestCase): DictReader, DictWriter, array, staticmethod, - classmethod] + classmethod, + Template, + Interpolation, + ] if ctypes is not None: generic_types.extend((ctypes.Array, ctypes.LibraryLoader, ctypes.py_object)) if ValueProxy is not None: diff --git a/Misc/NEWS.d/next/Library/2025-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst b/Misc/NEWS.d/next/Library/2025-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst new file mode 100644 index 00000000000000..ddf456d3939056 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst @@ -0,0 +1,2 @@ +Make :class:`!string.templatelib.Template` and +:class:`!string.templatelib.Interpolation` generic. diff --git a/Objects/interpolationobject.c b/Objects/interpolationobject.c index aaea3b8c0670c9..a5d407a7b0e296 100644 --- a/Objects/interpolationobject.c +++ b/Objects/interpolationobject.c @@ -137,6 +137,8 @@ interpolation_reduce(PyObject *op, PyObject *Py_UNUSED(dummy)) static PyMethodDef interpolation_methods[] = { {"__reduce__", interpolation_reduce, METH_NOARGS, PyDoc_STR("__reduce__() -> (cls, state)")}, + {"__class_getitem__", Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL}, }; diff --git a/Objects/templateobject.c b/Objects/templateobject.c index 7d356980b56cbb..06cb19e0b6d056 100644 --- a/Objects/templateobject.c +++ b/Objects/templateobject.c @@ -444,6 +444,8 @@ template_reduce(PyObject *op, PyObject *Py_UNUSED(dummy)) static PyMethodDef template_methods[] = { {"__reduce__", template_reduce, METH_NOARGS, NULL}, + {"__class_getitem__", Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL}, }; From fede4ed1d34242b9354e202727a7456562f2294d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 09:47:24 +0200 Subject: [PATCH 0101/1674] [3.14] Test also error messages in test_limit_int. (GH-134018) (GH-134033) (cherry picked from commit e123a1d09bcb75aae0c53d9d732de5d9a1252efe) Co-authored-by: Serhiy Storchaka --- Lib/test/test_fractions.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 37de3ad380e633..96b3f30519459b 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -500,22 +500,23 @@ def check_invalid(s): def test_limit_int(self): maxdigits = 5000 with adjust_int_max_str_digits(maxdigits): + msg = 'Exceeds the limit' val = '1' * maxdigits num = (10**maxdigits - 1)//9 self.assertEqual((num, 1), _components(F(val))) - self.assertRaises(ValueError, F, val + '1') + self.assertRaisesRegex(ValueError, msg, F, val + '1') self.assertEqual((num, 2), _components(F(val + '/2'))) - self.assertRaises(ValueError, F, val + '1/2') + self.assertRaisesRegex(ValueError, msg, F, val + '1/2') self.assertEqual((1, num), _components(F('1/' + val))) - self.assertRaises(ValueError, F, '1/1' + val) + self.assertRaisesRegex(ValueError, msg, F, '1/1' + val) self.assertEqual(((10**(maxdigits+1) - 1)//9, 10**maxdigits), _components(F('1.' + val))) - self.assertRaises(ValueError, F, '1.1' + val) + self.assertRaisesRegex(ValueError, msg, F, '1.1' + val) self.assertEqual((num, 10**maxdigits), _components(F('.' + val))) - self.assertRaises(ValueError, F, '.1' + val) - self.assertRaises(ValueError, F, '1.1e1' + val) + self.assertRaisesRegex(ValueError, msg, F, '.1' + val) + self.assertRaisesRegex(ValueError, msg, F, '1.1e1' + val) self.assertEqual((11, 10), _components(F('1.1e' + '0' * maxdigits))) - self.assertRaises(ValueError, F, '1.1e' + '0' * (maxdigits+1)) + self.assertRaisesRegex(ValueError, msg, F, '1.1e' + '0' * (maxdigits+1)) def testImmutable(self): r = F(7, 3) From 620065c33e1176a1074e2dd2b311c02d6b04ea42 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 11:39:20 +0200 Subject: [PATCH 0102/1674] [3.14] gh-133403: Check `Tools/build/deepfreeze.py` with mypy (GH-133802) (#134038) gh-133403: Check `Tools/build/deepfreeze.py` with mypy (GH-133802) (cherry picked from commit 7eaa09739059aaac4812395f8d6bb586af8eadcc) Co-authored-by: sobolevn --- .github/workflows/mypy.yml | 2 ++ Tools/build/.ruff.toml | 2 +- Tools/build/deepfreeze.py | 51 ++++++++++++++++++++++++-------------- Tools/build/mypy.ini | 4 ++- Tools/build/umarshal.py | 11 ++++---- 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 2c7c4945b8b8c2..9dbdd606fff472 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -14,10 +14,12 @@ on: - "Lib/tomllib/**" - "Misc/mypy/**" - "Tools/build/compute-changes.py" + - "Tools/build/deepfreeze.py" - "Tools/build/generate_sbom.py" - "Tools/build/generate-build-details.py" - "Tools/build/verify_ensurepip_wheels.py" - "Tools/build/update_file.py" + - "Tools/build/umarshal.py" - "Tools/cases_generator/**" - "Tools/clinic/**" - "Tools/jit/**" diff --git a/Tools/build/.ruff.toml b/Tools/build/.ruff.toml index fa7689d45dbcb7..dcbf2936290f12 100644 --- a/Tools/build/.ruff.toml +++ b/Tools/build/.ruff.toml @@ -1,7 +1,7 @@ extend = "../../.ruff.toml" # Inherit the project-wide settings [per-file-target-version] -"deepfreeze.py" = "py310" +"deepfreeze.py" = "py311" # requires `code.co_exceptiontable` "stable_abi.py" = "py311" # requires 'tomllib' [format] diff --git a/Tools/build/deepfreeze.py b/Tools/build/deepfreeze.py index 23f58447937976..2b9f03aebb6d7e 100644 --- a/Tools/build/deepfreeze.py +++ b/Tools/build/deepfreeze.py @@ -2,9 +2,12 @@ The script may be executed by _bootstrap_python interpreter. Shared library extension modules are not available in that case. -On Windows, and in cross-compilation cases, it is executed -by Python 3.10, and 3.11 features are not available. +Requires 3.11+ to be executed, +because relies on `code.co_qualname` and `code.co_exceptiontable`. """ + +from __future__ import annotations + import argparse import builtins import collections @@ -13,10 +16,14 @@ import re import time import types -from typing import TextIO import umarshal +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Iterator + from typing import Any, TextIO + ROOT = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) verbose = False @@ -45,8 +52,8 @@ def make_string_literal(b: bytes) -> str: next_code_version = 1 -def get_localsplus(code: types.CodeType): - a = collections.defaultdict(int) +def get_localsplus(code: types.CodeType) -> tuple[tuple[str, ...], bytes]: + a: collections.defaultdict[str, int] = collections.defaultdict(int) for name in code.co_varnames: a[name] |= CO_FAST_LOCAL for name in code.co_cellvars: @@ -136,7 +143,7 @@ def get_identifiers_and_strings(self) -> tuple[set[str], dict[str, str]]: return identifiers, strings @contextlib.contextmanager - def indent(self) -> None: + def indent(self) -> Iterator[None]: save_level = self.level try: self.level += 1 @@ -148,7 +155,7 @@ def write(self, arg: str) -> None: self.file.writelines((" "*self.level, arg, "\n")) @contextlib.contextmanager - def block(self, prefix: str, suffix: str = "") -> None: + def block(self, prefix: str, suffix: str = "") -> Iterator[None]: self.write(prefix + " {") with self.indent(): yield @@ -250,9 +257,17 @@ def generate_code(self, name: str, code: types.CodeType) -> str: co_names = self.generate(name + "_names", code.co_names) co_filename = self.generate(name + "_filename", code.co_filename) co_name = self.generate(name + "_name", code.co_name) - co_qualname = self.generate(name + "_qualname", code.co_qualname) co_linetable = self.generate(name + "_linetable", code.co_linetable) - co_exceptiontable = self.generate(name + "_exceptiontable", code.co_exceptiontable) + # We use 3.10 for type checking, but this module requires 3.11 + # TODO: bump python version for this script. + co_qualname = self.generate( + name + "_qualname", + code.co_qualname, # type: ignore[attr-defined] + ) + co_exceptiontable = self.generate( + name + "_exceptiontable", + code.co_exceptiontable, # type: ignore[attr-defined] + ) # These fields are not directly accessible localsplusnames, localspluskinds = get_localsplus(code) co_localsplusnames = self.generate(name + "_localsplusnames", localsplusnames) @@ -379,13 +394,13 @@ def generate_complex(self, name: str, z: complex) -> str: self.write(f".cval = {{ {z.real}, {z.imag} }},") return f"&{name}.ob_base" - def generate_frozenset(self, name: str, fs: frozenset[object]) -> str: + def generate_frozenset(self, name: str, fs: frozenset[Any]) -> str: try: - fs = sorted(fs) + fs_sorted = sorted(fs) except TypeError: # frozen set with incompatible types, fallback to repr() - fs = sorted(fs, key=repr) - ret = self.generate_tuple(name, tuple(fs)) + fs_sorted = sorted(fs, key=repr) + ret = self.generate_tuple(name, tuple(fs_sorted)) self.write("// TODO: The above tuple should be a frozenset") return ret @@ -402,7 +417,7 @@ def generate(self, name: str, obj: object) -> str: # print(f"Cache hit {key!r:.40}: {self.cache[key]!r:.40}") return self.cache[key] self.misses += 1 - if isinstance(obj, (types.CodeType, umarshal.Code)) : + if isinstance(obj, types.CodeType) : val = self.generate_code(name, obj) elif isinstance(obj, tuple): val = self.generate_tuple(name, obj) @@ -458,7 +473,7 @@ def decode_frozen_data(source: str) -> types.CodeType: if re.match(FROZEN_DATA_LINE, line): values.extend([int(x) for x in line.split(",") if x.strip()]) data = bytes(values) - return umarshal.loads(data) + return umarshal.loads(data) # type: ignore[no-any-return] def generate(args: list[str], output: TextIO) -> None: @@ -494,12 +509,12 @@ def generate(args: list[str], output: TextIO) -> None: help="Input file and module name (required) in file:modname format") @contextlib.contextmanager -def report_time(label: str): - t0 = time.time() +def report_time(label: str) -> Iterator[None]: + t0 = time.perf_counter() try: yield finally: - t1 = time.time() + t1 = time.perf_counter() if verbose: print(f"{label}: {t1-t0:.3f} sec") diff --git a/Tools/build/mypy.ini b/Tools/build/mypy.ini index 62d7e150fd8521..123dc895f90a1f 100644 --- a/Tools/build/mypy.ini +++ b/Tools/build/mypy.ini @@ -4,10 +4,12 @@ # .github/workflows/mypy.yml files = Tools/build/compute-changes.py, + Tools/build/deepfreeze.py, Tools/build/generate-build-details.py, Tools/build/generate_sbom.py, Tools/build/verify_ensurepip_wheels.py, - Tools/build/update_file.py + Tools/build/update_file.py, + Tools/build/umarshal.py pretty = True diff --git a/Tools/build/umarshal.py b/Tools/build/umarshal.py index 679fa7caf9f931..865cffc2440122 100644 --- a/Tools/build/umarshal.py +++ b/Tools/build/umarshal.py @@ -145,12 +145,12 @@ def r_PyLong(self) -> int: def r_float_bin(self) -> float: buf = self.r_string(8) import struct # Lazy import to avoid breaking UNIX build - return struct.unpack("d", buf)[0] + return struct.unpack("d", buf)[0] # type: ignore[no-any-return] def r_float_str(self) -> float: n = self.r_byte() buf = self.r_string(n) - return ast.literal_eval(buf.decode("ascii")) + return ast.literal_eval(buf.decode("ascii")) # type: ignore[no-any-return] def r_ref_reserve(self, flag: int) -> int: if flag: @@ -306,7 +306,7 @@ def loads(data: bytes) -> Any: return r.r_object() -def main(): +def main() -> None: # Test import marshal import pprint @@ -314,8 +314,9 @@ def main(): data = marshal.dumps(sample) retval = loads(data) assert retval == sample, retval - sample = main.__code__ - data = marshal.dumps(sample) + + sample2 = main.__code__ + data = marshal.dumps(sample2) retval = loads(data) assert isinstance(retval, Code), retval pprint.pprint(retval.__dict__) From 29d69e8b661e5d4d270f44c03a2c678cc3ebc58d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 15:34:50 +0200 Subject: [PATCH 0103/1674] [3.14] gh-77065: add missing parameter `echo_char` in `getpass.fallback_getpass` (GH-133849) (#134053) gh-77065: add missing parameter `echo_char` in `getpass.fallback_getpass` (GH-133849) (cherry picked from commit d029a1a1cba515510f31c9e88b7c2a6b7ebee2a7) Co-authored-by: Semyon Moroz --- Lib/getpass.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/getpass.py b/Lib/getpass.py index f571425e54178a..a4dbd2ea6502d4 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -132,14 +132,15 @@ def win_getpass(prompt='Password: ', stream=None, *, echo_char=None): return pw -def fallback_getpass(prompt='Password: ', stream=None): +def fallback_getpass(prompt='Password: ', stream=None, *, echo_char=None): + _check_echo_char(echo_char) import warnings warnings.warn("Can not control echo on the terminal.", GetPassWarning, stacklevel=2) if not stream: stream = sys.stderr print("Warning: Password input may be echoed.", file=stream) - return _raw_input(prompt, stream) + return _raw_input(prompt, stream, echo_char=echo_char) def _check_echo_char(echo_char): From 31deafb8eee8c07a084c77e57101d99a2b993698 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 15:37:41 +0200 Subject: [PATCH 0104/1674] [3.14] gh-133410: Fix PR detection in build workflow (GH-133671) (#134055) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/reusable-context.yml | 1 + Tools/build/compute-changes.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-context.yml b/.github/workflows/reusable-context.yml index 73dc254edc5fbc..d2668ddcac1a3d 100644 --- a/.github/workflows/reusable-context.yml +++ b/.github/workflows/reusable-context.yml @@ -97,6 +97,7 @@ jobs: run: python Tools/build/compute-changes.py env: GITHUB_DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + GITHUB_EVENT_NAME: ${{ github.event_name }} CCF_TARGET_REF: ${{ github.base_ref || github.event.repository.default_branch }} CCF_HEAD_REF: ${{ github.event.pull_request.head.sha || github.sha }} diff --git a/Tools/build/compute-changes.py b/Tools/build/compute-changes.py index cfdd55fd1925fd..b5993d29b92972 100644 --- a/Tools/build/compute-changes.py +++ b/Tools/build/compute-changes.py @@ -57,7 +57,7 @@ class Outputs: def compute_changes() -> None: target_branch, head_ref = git_refs() - if target_branch and head_ref: + if os.environ.get("GITHUB_EVENT_NAME", "") == "pull_request": # Getting changed files only makes sense on a pull request files = get_changed_files(target_branch, head_ref) outputs = process_changed_files(files) From 438f464a5a402ad6901578469dbca7b67c3e11dc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 17:41:37 +0200 Subject: [PATCH 0105/1674] [3.14] gh-77065: Use `putwch` instead of `putch` in `getpass.win_getpass` (GH-134058) (#134059) gh-77065: Use `putwch` instead of `putch` in `getpass.win_getpass` (GH-134058) (cherry picked from commit 52a7a22a6b85a470e993b3399b0ee043e5c3596e) Co-authored-by: Semyon Moroz --- Lib/getpass.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/getpass.py b/Lib/getpass.py index a4dbd2ea6502d4..1dd40e25e09068 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -119,9 +119,9 @@ def win_getpass(prompt='Password: ', stream=None, *, echo_char=None): raise KeyboardInterrupt if c == '\b': if echo_char and pw: - msvcrt.putch('\b') - msvcrt.putch(' ') - msvcrt.putch('\b') + msvcrt.putwch('\b') + msvcrt.putwch(' ') + msvcrt.putwch('\b') pw = pw[:-1] else: pw = pw + c From ba06ccbb6dc207526ff09a6fec5cac424acfc62a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 15 May 2025 23:18:26 +0200 Subject: [PATCH 0106/1674] Improve the administrative install docs for Python Install Manager (GH-134066) (cherry picked from commit 6a2296329117463fd09abc73656f1d7b48076100) Co-authored-by: Steve Dower --- Doc/using/windows.rst | 46 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 38b97a34fcda31..cd22148b531b84 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -98,8 +98,9 @@ does not affect any installs of Python runtimes. Uninstalling the Python install manager does not uninstall any Python runtimes. If you are not able to install an MSIX in your context, for example, you are -using automated deployment software that does not support it, please see -:ref:`pymanager-advancedinstall` below for more information. +using automated deployment software that does not support it, or are targeting +Windows Server 2019, please see :ref:`pymanager-advancedinstall` below for more +information. Basic Use @@ -515,6 +516,11 @@ per-machine installs to its default location in Program Files. It will attempt to modify the system :envvar:`PATH` environment variable to include this install location, but be sure to validate this on your configuration. +.. note:: + + Windows Server 2019 is the only version of Windows that CPython supports that + does not support MSIX. For Windows Server 2019, you should use the MSI. + Be aware that the MSI package does not bundle any runtimes, and so is not suitable for installs into offline environments without also creating an offline install index. See :ref:`pymanager-offline` and :ref:`pymanager-admin-config` @@ -535,13 +541,32 @@ depending on whether it was installed from python.org or through the Windows Store. Attempting to run the executable directly from Program Files is not recommended. -To programmatically install or uninstall the MSIX without using your -distribution platform's native support, the `Add-AppxPackage -`_ and -`Remove-AppxPackage `_ -PowerShell cmdlets are simplest to use: +To programmatically install the Python install manager, it is easiest to use +WinGet, which is included with all supported versions of Windows: -.. code:: +.. code-block:: powershell + + $> winget install 9NQ7512CXL7T -e --accept-package-agreements --disable-interactivity + + # Optionally run the configuration checker and accept all changes + $> py install --configure -y + +To download the Python install manager and install on another machine, the +following WinGet command will download the required files from the Store to your +Downloads directory (add ``-d `` to customize the output location). +This also generates a YAML file that appears to be unnecessary, as the +downloaded MSIX can be installed by launching or using the commands below. + +.. code-block:: powershell + + $> winget download 9NQ7512CXL7T -e --skip-license --accept-package-agreements --disable-interactivity + +To programmatically install or uninstall an MSIX using only PowerShell, the +`Add-AppxPackage `_ +and `Remove-AppxPackage `_ +PowerShell cmdlets are recommended: + +.. code-block:: powershell $> Add-AppxPackage C:\Downloads\python-manager-25.0.msix ... @@ -555,6 +580,11 @@ to install the Python install manager for all users from the MSIX package. Users will still need to install their own copies of Python itself, as there is no way to trigger those installs without being a logged in user. +Note that the MSIX downloadable from the Store and from the Python website are +subtly different and cannot be installed at the same time. Wherever possible, +we suggest using the above commands to download the package from the Store to +reduce the risk of setting up conflicting installs. + .. _pymanager-admin-config: Administrative Configuration From 5374762234389e93c6ec305371e91f7b6e09e8ca Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 12:04:24 +0200 Subject: [PATCH 0107/1674] [3.14] gh-130000: Release the GIL in winreg when doing Windows API calls (GH-130001) (#134072) gh-130000: Release the GIL in winreg when doing Windows API calls (GH-130001) (cherry picked from commit 7a504b3d5da98874536834481539c19ba4a265af) Co-authored-by: AN Long --- PC/winreg.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/PC/winreg.c b/PC/winreg.c index c0de5c1353a349..c342be92b98f08 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -426,7 +426,9 @@ PyHKEY_Close(winreg_state *st, PyObject *ob_handle) if (PyHKEY_Check(st, ob_handle)) { ((PyHKEYObject*)ob_handle)->hkey = 0; } + Py_BEGIN_ALLOW_THREADS rc = key ? RegCloseKey(key) : ERROR_SUCCESS; + Py_END_ALLOW_THREADS if (rc != ERROR_SUCCESS) PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey"); return rc == ERROR_SUCCESS; @@ -499,14 +501,21 @@ PyWinObject_CloseHKEY(winreg_state *st, PyObject *obHandle) } #if SIZEOF_LONG >= SIZEOF_HKEY else if (PyLong_Check(obHandle)) { - long rc = RegCloseKey((HKEY)PyLong_AsLong(obHandle)); + long rc; + Py_BEGIN_ALLOW_THREADS + rc = RegCloseKey((HKEY)PyLong_AsLong(obHandle)); + Py_END_ALLOW_THREADS ok = (rc == ERROR_SUCCESS); if (!ok) PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey"); } #else else if (PyLong_Check(obHandle)) { - long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle)); + long rc; + HKEY hkey = (HKEY)PyLong_AsVoidPtr(obHandle); + Py_BEGIN_ALLOW_THREADS + rc = RegCloseKey(hkey); + Py_END_ALLOW_THREADS ok = (rc == ERROR_SUCCESS); if (!ok) PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey"); @@ -924,7 +933,9 @@ winreg_CreateKey_impl(PyObject *module, HKEY key, const wchar_t *sub_key) (Py_ssize_t)KEY_WRITE) < 0) { return NULL; } + Py_BEGIN_ALLOW_THREADS rc = RegCreateKeyW(key, sub_key, &retKey); + Py_END_ALLOW_THREADS if (rc != ERROR_SUCCESS) { PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey"); return NULL; @@ -973,8 +984,10 @@ winreg_CreateKeyEx_impl(PyObject *module, HKEY key, const wchar_t *sub_key, (Py_ssize_t)access) < 0) { return NULL; } + Py_BEGIN_ALLOW_THREADS rc = RegCreateKeyExW(key, sub_key, reserved, NULL, 0, access, NULL, &retKey, NULL); + Py_END_ALLOW_THREADS if (rc != ERROR_SUCCESS) { PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx"); return NULL; @@ -1187,10 +1200,12 @@ winreg_EnumValue_impl(PyObject *module, HKEY key, int index) (Py_ssize_t)key, index) < 0) { return NULL; } - if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, - &retValueSize, &retDataSize, NULL, NULL)) - != ERROR_SUCCESS) + + Py_BEGIN_ALLOW_THREADS + rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + &retValueSize, &retDataSize, NULL, NULL); + Py_END_ALLOW_THREADS + if (rc != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey"); ++retValueSize; /* include null terminators */ @@ -1477,9 +1492,11 @@ winreg_QueryInfoKey_impl(PyObject *module, HKEY key) if (PySys_Audit("winreg.QueryInfoKey", "n", (Py_ssize_t)key) < 0) { return NULL; } - if ((rc = RegQueryInfoKeyW(key, NULL, NULL, 0, &nSubKeys, NULL, NULL, - &nValues, NULL, NULL, NULL, &ft)) - != ERROR_SUCCESS) { + Py_BEGIN_ALLOW_THREADS + rc = RegQueryInfoKeyW(key, NULL, NULL, 0, &nSubKeys, NULL, NULL, + &nValues, NULL, NULL, NULL, &ft); + Py_END_ALLOW_THREADS + if (rc != ERROR_SUCCESS) { return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey"); } li.LowPart = ft.dwLowDateTime; @@ -1587,7 +1604,9 @@ winreg_QueryValue_impl(PyObject *module, HKEY key, const wchar_t *sub_key) PyMem_Free(pbuf); } if (childKey != key) { + Py_BEGIN_ALLOW_THREADS RegCloseKey(childKey); + Py_END_ALLOW_THREADS } return result; } @@ -1625,7 +1644,9 @@ winreg_QueryValueEx_impl(PyObject *module, HKEY key, const wchar_t *name) (Py_ssize_t)key, NULL, name) < 0) { return NULL; } + Py_BEGIN_ALLOW_THREADS rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize); + Py_END_ALLOW_THREADS if (rc == ERROR_MORE_DATA) bufSize = 256; else if (rc != ERROR_SUCCESS) @@ -1637,8 +1658,10 @@ winreg_QueryValueEx_impl(PyObject *module, HKEY key, const wchar_t *name) while (1) { retSize = bufSize; + Py_BEGIN_ALLOW_THREADS rc = RegQueryValueExW(key, name, NULL, &typ, (BYTE *)retBuf, &retSize); + Py_END_ALLOW_THREADS if (rc != ERROR_MORE_DATA) break; From 7725ba84619330e071bf0d91a3e4f0d61d17650d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 12:49:08 +0200 Subject: [PATCH 0108/1674] [3.14] gh-134069: bump HACL* revision to incoporate `memset_s` (GH-134027) (#134084) Bumps the HACL* revision to include recent revisions that corrects issues building with legacy/cross-platform macOS SDKs. (cherry picked from commit 1566c34dc76ec6139e6827fbab6d76e084a63d9d) Signed-off-by: aeiouaeiouaeiouaeiouaeiouaeiou Co-authored-by: aeiouaeiouaeiouaeiouaeiouaeiou --- Misc/sbom.spdx.json | 52 +- Modules/_hacl/Hacl_Hash_Blake2b.c | 52 +- Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c | 52 +- Modules/_hacl/Hacl_Hash_Blake2s.c | 52 +- Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c | 52 +- Modules/_hacl/Hacl_Hash_MD5.c | 523 +++++++----------- Modules/_hacl/Hacl_Hash_SHA1.c | 12 +- Modules/_hacl/Hacl_Hash_SHA2.c | 42 +- Modules/_hacl/Hacl_Hash_SHA3.c | 22 +- Modules/_hacl/Hacl_Streaming_HMAC.c | 127 ++--- Modules/_hacl/Lib_Memzero0.c | 20 +- .../include/krml/FStar_UInt128_Verified.h | 45 +- Modules/_hacl/refresh.sh | 2 +- 13 files changed, 405 insertions(+), 648 deletions(-) diff --git a/Misc/sbom.spdx.json b/Misc/sbom.spdx.json index 4a697d047ca6e4..10a5c646d2a59e 100644 --- a/Misc/sbom.spdx.json +++ b/Misc/sbom.spdx.json @@ -314,11 +314,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "4b6e7696e8d84f322fb24b1fbb08ccb9b0e7d51b" + "checksumValue": "808af7ff8a2cb2b4ef3a9ce3dbfef58d90828c9f" }, { "algorithm": "SHA256", - "checksumValue": "50a65a34a7a7569eedf7fa864a7892eeee5840a7fdf6fa8f1e87d42c65f6c877" + "checksumValue": "6a492aa586f2d10b1b300ce8ce4c72c976ff7548fee667aded2253f99969ac87" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2b.c" @@ -342,11 +342,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "0f75e44a42775247a46acc2beaa6bae8f199a3d9" + "checksumValue": "1bb072f2be9e5d194274fdcc87825cb094e4b32e" }, { "algorithm": "SHA256", - "checksumValue": "03b612c24193464ed6848aeebbf44f9266b78ec6eed2486056211cde8992c49a" + "checksumValue": "9eb22953ce60dde9dc970fec9dfce9d94235f4b7ccd8f0151cad4707dc835d1d" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c" @@ -384,11 +384,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "65bf44140691b046dcfed3ab1576dbf8bbf96dc5" + "checksumValue": "cdd6e9ca86dbede92d1a47b9224d2af70c599a71" }, { "algorithm": "SHA256", - "checksumValue": "0f98959dafffce039ade9d296f7a05bed151c9c512498f48e4b326a5523a240b" + "checksumValue": "f3204f3e60734d811b6630f879b69ce54eaf367f3fca5889c1026e7a1f3ee1e4" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2s.c" @@ -412,11 +412,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "0da9782455923aede8d8dce9dfdc38f4fc1de572" + "checksumValue": "4056bb6e3ed184400d1610bdfd4260b3fd05ccbb" }, { "algorithm": "SHA256", - "checksumValue": "2d17ae768fd3d7d6decddd8b4aaf23ce02a809ee62bb98da32c8a7f54acf92d0" + "checksumValue": "c93746df2f219cbb1634ee6fb0ab1c4cbd381d1f36c637114c68346c9935326d" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c" @@ -454,11 +454,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "38e8d96ef1879480780494058a93cec181f8d6d7" + "checksumValue": "61f678cd9234c6eab5d4409ae66f470b068b959b" }, { "algorithm": "SHA256", - "checksumValue": "61e77d2063cf60c96e9ce06af215efe5d42c43026833bffed5732326fe97ed1e" + "checksumValue": "5b91ed0339074e2e546119833398e2cdb7190c33a59c405bf43b2417c789547d" } ], "fileName": "Modules/_hacl/Hacl_Hash_MD5.c" @@ -482,11 +482,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "986dd5ba0b34d15f3e5e5c656979aea1b502e8aa" + "checksumValue": "c7fc5c9721caf37c5a24c9beff27b0ac2ed68cc9" }, { "algorithm": "SHA256", - "checksumValue": "38d5f1f2e67a0eb30789f81fc56c07a6e7246e2b1be6c65485bcca1dcd0e0806" + "checksumValue": "ce08721d491f3b8a9bd4cde6c27bfcc8fc01471512ccca4bd3c0b764cb551d29" } ], "fileName": "Modules/_hacl/Hacl_Hash_SHA1.c" @@ -510,11 +510,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "f732a6710fe3e13cd28130f0f20504e347d1c412" + "checksumValue": "fffe8c4f67669ac8ccd87c2e0f95db2427481df1" }, { "algorithm": "SHA256", - "checksumValue": "86cf32e4d1f3ba93a94108271923fdafe2204447792a918acf4a2250f352dbde" + "checksumValue": "f8af382de7e29a73c726f9c70770498ddd99e2c4702489ed6e634f0b68597c95" } ], "fileName": "Modules/_hacl/Hacl_Hash_SHA2.c" @@ -538,11 +538,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "50f75337b31f509b5bfcc7ebb3d066b82a0f1b33" + "checksumValue": "77d3d879dfa5949030bca0e8ee75d3d369ec54a7" }, { "algorithm": "SHA256", - "checksumValue": "c9e1442899e5b902fa39f413f1a3131f7ab5c2283d5100dc8ac675a7d5ebbdf1" + "checksumValue": "8744f5b6e054c3e5c44f413a60f9154b76dd7230135dcee26fd063755ec64be1" } ], "fileName": "Modules/_hacl/Hacl_Hash_SHA3.c" @@ -566,11 +566,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "8140310f505bb2619a749777a91487d666237bcf" + "checksumValue": "417e68ac8498cb2f93a06a19003ea1cc3f0f6753" }, { "algorithm": "SHA256", - "checksumValue": "9d95e6a651c22185d9b7c38f363d30159f810e6fcdc2208f29492837ed891e82" + "checksumValue": "843db4bba78a476d4d53dabe4eed5c9235f490ccc9fdaf19e22af488af858920" } ], "fileName": "Modules/_hacl/Hacl_Streaming_HMAC.c" @@ -608,11 +608,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "c9651ef21479c4d8a3b04c5baa1902866dbb1cdf" + "checksumValue": "0a0b7f3714167ad45ddf5a6a48d76f525a119c9c" }, { "algorithm": "SHA256", - "checksumValue": "e039c82ba670606ca111573942baad800f75da467abbc74cd7d1fe175ebcdfaf" + "checksumValue": "135d4afb4812468885c963c9c87a55ba5fae9181df4431af5fbad08588dda229" } ], "fileName": "Modules/_hacl/Lib_Memzero0.c" @@ -622,11 +622,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "eaa543c778300238dc23034aafeada0951154af1" + "checksumValue": "911c97a0f24067635b164fbca49da76055f192cd" }, { "algorithm": "SHA256", - "checksumValue": "3fd2552d527a23110d61ad2811c774810efb1eaee008f136c2a0d609daa77f5b" + "checksumValue": "972b5111ebada8e11dd60df3119da1af505fd3e0b6c782ead6cab7f1daf134f1" } ], "fileName": "Modules/_hacl/include/krml/FStar_UInt128_Verified.h" @@ -1752,14 +1752,14 @@ "checksums": [ { "algorithm": "SHA256", - "checksumValue": "02dfcf0c79d488b120d7f2c2a0f9206301c7927ed5106545e0b6f2aef88da76a" + "checksumValue": "39f6fd4f2fe98aecc995a2fd980fae0e0835cef6e563ebbf25f69d3d3102bafd" } ], - "downloadLocation": "https://github.com/hacl-star/hacl-star/archive/7720f6d4fc0468a99d5ea6120976bcc271e42727.zip", + "downloadLocation": "https://github.com/hacl-star/hacl-star/archive/4ef25b547b377dcef855db4289c6a00580e7221c.zip", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:hacl-star:hacl-star:7720f6d4fc0468a99d5ea6120976bcc271e42727:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:hacl-star:hacl-star:4ef25b547b377dcef855db4289c6a00580e7221c:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], @@ -1767,7 +1767,7 @@ "name": "hacl-star", "originator": "Organization: HACL* Developers", "primaryPackagePurpose": "SOURCE", - "versionInfo": "7720f6d4fc0468a99d5ea6120976bcc271e42727" + "versionInfo": "4ef25b547b377dcef855db4289c6a00580e7221c" }, { "SPDXID": "SPDXRef-PACKAGE-macholib", diff --git a/Modules/_hacl/Hacl_Hash_Blake2b.c b/Modules/_hacl/Hacl_Hash_Blake2b.c index 21ab2b88c799a6..a5b75d61798949 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2b.c +++ b/Modules/_hacl/Hacl_Hash_Blake2b.c @@ -544,11 +544,9 @@ void Hacl_Hash_Blake2b_init(uint64_t *hash, uint32_t kk, uint32_t nn) uint64_t x = r; os[i] = x;); tmp[0U] = - (uint64_t)nn1 - ^ - ((uint64_t)kk1 - << 8U - ^ ((uint64_t)p.fanout << 16U ^ ((uint64_t)p.depth << 24U ^ (uint64_t)p.leaf_length << 32U))); + (uint64_t)nn1 ^ + ((uint64_t)kk1 << 8U ^ + ((uint64_t)p.fanout << 16U ^ ((uint64_t)p.depth << 24U ^ (uint64_t)p.leaf_length << 32U))); tmp[1U] = p.node_offset; tmp[2U] = (uint64_t)p.node_depth ^ (uint64_t)p.inner_length << 8U; tmp[3U] = 0ULL; @@ -860,14 +858,10 @@ static Hacl_Hash_Blake2b_state_t uint64_t x = r4; os[i0] = x;); tmp[0U] = - (uint64_t)nn1 - ^ - ((uint64_t)kk2 - << 8U - ^ - ((uint64_t)pv.fanout - << 16U - ^ ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); + (uint64_t)nn1 ^ + ((uint64_t)kk2 << 8U ^ + ((uint64_t)pv.fanout << 16U ^ + ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); tmp[1U] = pv.node_offset; tmp[2U] = (uint64_t)pv.node_depth ^ (uint64_t)pv.inner_length << 8U; tmp[3U] = 0ULL; @@ -1059,11 +1053,9 @@ static void reset_raw(Hacl_Hash_Blake2b_state_t *state, Hacl_Hash_Blake2b_params uint64_t x = r; os[i0] = x;); tmp[0U] = - (uint64_t)nn1 - ^ - ((uint64_t)kk2 - << 8U - ^ ((uint64_t)pv.fanout << 16U ^ ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); + (uint64_t)nn1 ^ + ((uint64_t)kk2 << 8U ^ + ((uint64_t)pv.fanout << 16U ^ ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); tmp[1U] = pv.node_offset; tmp[2U] = (uint64_t)pv.node_depth ^ (uint64_t)pv.inner_length << 8U; tmp[3U] = 0ULL; @@ -1200,8 +1192,7 @@ Hacl_Hash_Blake2b_update(Hacl_Hash_Blake2b_state_t *state, uint8_t *chunk, uint3 uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Hash_Blake2b_state_t){ .block_state = block_state1, @@ -1265,8 +1256,7 @@ Hacl_Hash_Blake2b_update(Hacl_Hash_Blake2b_state_t *state, uint8_t *chunk, uint3 nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2b_state_t){ .block_state = block_state1, @@ -1296,8 +1286,7 @@ Hacl_Hash_Blake2b_update(Hacl_Hash_Blake2b_state_t *state, uint8_t *chunk, uint3 uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Hash_Blake2b_state_t){ .block_state = block_state10, @@ -1359,8 +1348,7 @@ Hacl_Hash_Blake2b_update(Hacl_Hash_Blake2b_state_t *state, uint8_t *chunk, uint3 nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2b_state_t){ .block_state = block_state1, @@ -1690,14 +1678,10 @@ Hacl_Hash_Blake2b_hash_with_key_and_params( uint64_t x = r; os[i] = x;); tmp[0U] = - (uint64_t)nn - ^ - ((uint64_t)kk - << 8U - ^ - ((uint64_t)params.fanout - << 16U - ^ ((uint64_t)params.depth << 24U ^ (uint64_t)params.leaf_length << 32U))); + (uint64_t)nn ^ + ((uint64_t)kk << 8U ^ + ((uint64_t)params.fanout << 16U ^ + ((uint64_t)params.depth << 24U ^ (uint64_t)params.leaf_length << 32U))); tmp[1U] = params.node_offset; tmp[2U] = (uint64_t)params.node_depth ^ (uint64_t)params.inner_length << 8U; tmp[3U] = 0ULL; diff --git a/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c b/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c index c4d9b4a689d28f..f955f1c6115b1e 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c +++ b/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c @@ -274,11 +274,9 @@ Hacl_Hash_Blake2b_Simd256_init(Lib_IntVector_Intrinsics_vec256 *hash, uint32_t k uint64_t x = r; os[i] = x;); tmp[0U] = - (uint64_t)nn1 - ^ - ((uint64_t)kk1 - << 8U - ^ ((uint64_t)p.fanout << 16U ^ ((uint64_t)p.depth << 24U ^ (uint64_t)p.leaf_length << 32U))); + (uint64_t)nn1 ^ + ((uint64_t)kk1 << 8U ^ + ((uint64_t)p.fanout << 16U ^ ((uint64_t)p.depth << 24U ^ (uint64_t)p.leaf_length << 32U))); tmp[1U] = p.node_offset; tmp[2U] = (uint64_t)p.node_depth ^ (uint64_t)p.inner_length << 8U; tmp[3U] = 0ULL; @@ -746,14 +744,10 @@ static Hacl_Hash_Blake2b_Simd256_state_t uint64_t x = r4; os[i0] = x;); tmp[0U] = - (uint64_t)nn1 - ^ - ((uint64_t)kk2 - << 8U - ^ - ((uint64_t)pv.fanout - << 16U - ^ ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); + (uint64_t)nn1 ^ + ((uint64_t)kk2 << 8U ^ + ((uint64_t)pv.fanout << 16U ^ + ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); tmp[1U] = pv.node_offset; tmp[2U] = (uint64_t)pv.node_depth ^ (uint64_t)pv.inner_length << 8U; tmp[3U] = 0ULL; @@ -936,11 +930,9 @@ reset_raw(Hacl_Hash_Blake2b_Simd256_state_t *state, Hacl_Hash_Blake2b_params_and uint64_t x = r; os[i0] = x;); tmp[0U] = - (uint64_t)nn1 - ^ - ((uint64_t)kk2 - << 8U - ^ ((uint64_t)pv.fanout << 16U ^ ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); + (uint64_t)nn1 ^ + ((uint64_t)kk2 << 8U ^ + ((uint64_t)pv.fanout << 16U ^ ((uint64_t)pv.depth << 24U ^ (uint64_t)pv.leaf_length << 32U))); tmp[1U] = pv.node_offset; tmp[2U] = (uint64_t)pv.node_depth ^ (uint64_t)pv.inner_length << 8U; tmp[3U] = 0ULL; @@ -1075,8 +1067,7 @@ Hacl_Hash_Blake2b_Simd256_update( uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Hash_Blake2b_Simd256_state_t){ .block_state = block_state1, @@ -1140,8 +1131,7 @@ Hacl_Hash_Blake2b_Simd256_update( nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2b_Simd256_state_t){ .block_state = block_state1, @@ -1171,8 +1161,7 @@ Hacl_Hash_Blake2b_Simd256_update( uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Hash_Blake2b_Simd256_state_t){ .block_state = block_state10, @@ -1234,8 +1223,7 @@ Hacl_Hash_Blake2b_Simd256_update( nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2b_Simd256_state_t){ .block_state = block_state1, @@ -1578,14 +1566,10 @@ Hacl_Hash_Blake2b_Simd256_hash_with_key_and_params( uint64_t x = r; os[i] = x;); tmp[0U] = - (uint64_t)nn - ^ - ((uint64_t)kk - << 8U - ^ - ((uint64_t)params.fanout - << 16U - ^ ((uint64_t)params.depth << 24U ^ (uint64_t)params.leaf_length << 32U))); + (uint64_t)nn ^ + ((uint64_t)kk << 8U ^ + ((uint64_t)params.fanout << 16U ^ + ((uint64_t)params.depth << 24U ^ (uint64_t)params.leaf_length << 32U))); tmp[1U] = params.node_offset; tmp[2U] = (uint64_t)params.node_depth ^ (uint64_t)params.inner_length << 8U; tmp[3U] = 0ULL; diff --git a/Modules/_hacl/Hacl_Hash_Blake2s.c b/Modules/_hacl/Hacl_Hash_Blake2s.c index 730ba135afb2fb..0d4fcc7f3951fc 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2s.c +++ b/Modules/_hacl/Hacl_Hash_Blake2s.c @@ -543,13 +543,13 @@ void Hacl_Hash_Blake2s_init(uint32_t *hash, uint32_t kk, uint32_t nn) uint32_t x = r; os[i] = x;); tmp[0U] = - (uint32_t)(uint8_t)nn - ^ ((uint32_t)(uint8_t)kk << 8U ^ ((uint32_t)p.fanout << 16U ^ (uint32_t)p.depth << 24U)); + (uint32_t)(uint8_t)nn ^ + ((uint32_t)(uint8_t)kk << 8U ^ ((uint32_t)p.fanout << 16U ^ (uint32_t)p.depth << 24U)); tmp[1U] = p.leaf_length; tmp[2U] = (uint32_t)p.node_offset; tmp[3U] = - (uint32_t)(p.node_offset >> 32U) - ^ ((uint32_t)p.node_depth << 16U ^ (uint32_t)p.inner_length << 24U); + (uint32_t)(p.node_offset >> 32U) ^ + ((uint32_t)p.node_depth << 16U ^ (uint32_t)p.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; @@ -846,16 +846,14 @@ static Hacl_Hash_Blake2s_state_t uint32_t x = r4; os[i0] = x;); tmp[0U] = - (uint32_t)pv.digest_length - ^ - ((uint32_t)pv.key_length - << 8U - ^ ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); + (uint32_t)pv.digest_length ^ + ((uint32_t)pv.key_length << 8U ^ + ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); tmp[1U] = pv.leaf_length; tmp[2U] = (uint32_t)pv.node_offset; tmp[3U] = - (uint32_t)(pv.node_offset >> 32U) - ^ ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); + (uint32_t)(pv.node_offset >> 32U) ^ + ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; @@ -1042,13 +1040,13 @@ static void reset_raw(Hacl_Hash_Blake2s_state_t *state, Hacl_Hash_Blake2b_params uint32_t x = r; os[i0] = x;); tmp[0U] = - (uint32_t)pv.digest_length - ^ ((uint32_t)pv.key_length << 8U ^ ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); + (uint32_t)pv.digest_length ^ + ((uint32_t)pv.key_length << 8U ^ ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); tmp[1U] = pv.leaf_length; tmp[2U] = (uint32_t)pv.node_offset; tmp[3U] = - (uint32_t)(pv.node_offset >> 32U) - ^ ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); + (uint32_t)(pv.node_offset >> 32U) ^ + ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; @@ -1182,8 +1180,7 @@ Hacl_Hash_Blake2s_update(Hacl_Hash_Blake2s_state_t *state, uint8_t *chunk, uint3 uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Hash_Blake2s_state_t){ .block_state = block_state1, @@ -1237,8 +1234,7 @@ Hacl_Hash_Blake2s_update(Hacl_Hash_Blake2s_state_t *state, uint8_t *chunk, uint3 Hacl_Hash_Blake2s_update_multi(data1_len, wv, hash, total_len1, data1, nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2s_state_t){ .block_state = block_state1, @@ -1268,8 +1264,7 @@ Hacl_Hash_Blake2s_update(Hacl_Hash_Blake2s_state_t *state, uint8_t *chunk, uint3 uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Hash_Blake2s_state_t){ .block_state = block_state10, @@ -1321,8 +1316,7 @@ Hacl_Hash_Blake2s_update(Hacl_Hash_Blake2s_state_t *state, uint8_t *chunk, uint3 Hacl_Hash_Blake2s_update_multi(data1_len, wv, hash, total_len1, data1, nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2s_state_t){ .block_state = block_state1, @@ -1639,16 +1633,14 @@ Hacl_Hash_Blake2s_hash_with_key_and_params( uint32_t x = r; os[i] = x;); tmp[0U] = - (uint32_t)params.digest_length - ^ - ((uint32_t)params.key_length - << 8U - ^ ((uint32_t)params.fanout << 16U ^ (uint32_t)params.depth << 24U)); + (uint32_t)params.digest_length ^ + ((uint32_t)params.key_length << 8U ^ + ((uint32_t)params.fanout << 16U ^ (uint32_t)params.depth << 24U)); tmp[1U] = params.leaf_length; tmp[2U] = (uint32_t)params.node_offset; tmp[3U] = - (uint32_t)(params.node_offset >> 32U) - ^ ((uint32_t)params.node_depth << 16U ^ (uint32_t)params.inner_length << 24U); + (uint32_t)(params.node_offset >> 32U) ^ + ((uint32_t)params.node_depth << 16U ^ (uint32_t)params.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; diff --git a/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c b/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c index 7e9cd79544f8f1..fa46be045f3441 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c +++ b/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c @@ -271,13 +271,13 @@ Hacl_Hash_Blake2s_Simd128_init(Lib_IntVector_Intrinsics_vec128 *hash, uint32_t k uint32_t x = r; os[i] = x;); tmp[0U] = - (uint32_t)(uint8_t)nn - ^ ((uint32_t)(uint8_t)kk << 8U ^ ((uint32_t)p.fanout << 16U ^ (uint32_t)p.depth << 24U)); + (uint32_t)(uint8_t)nn ^ + ((uint32_t)(uint8_t)kk << 8U ^ ((uint32_t)p.fanout << 16U ^ (uint32_t)p.depth << 24U)); tmp[1U] = p.leaf_length; tmp[2U] = (uint32_t)p.node_offset; tmp[3U] = - (uint32_t)(p.node_offset >> 32U) - ^ ((uint32_t)p.node_depth << 16U ^ (uint32_t)p.inner_length << 24U); + (uint32_t)(p.node_offset >> 32U) ^ + ((uint32_t)p.node_depth << 16U ^ (uint32_t)p.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; @@ -736,16 +736,14 @@ static Hacl_Hash_Blake2s_Simd128_state_t uint32_t x = r4; os[i0] = x;); tmp[0U] = - (uint32_t)pv.digest_length - ^ - ((uint32_t)pv.key_length - << 8U - ^ ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); + (uint32_t)pv.digest_length ^ + ((uint32_t)pv.key_length << 8U ^ + ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); tmp[1U] = pv.leaf_length; tmp[2U] = (uint32_t)pv.node_offset; tmp[3U] = - (uint32_t)(pv.node_offset >> 32U) - ^ ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); + (uint32_t)(pv.node_offset >> 32U) ^ + ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; @@ -923,13 +921,13 @@ reset_raw(Hacl_Hash_Blake2s_Simd128_state_t *state, Hacl_Hash_Blake2b_params_and uint32_t x = r; os[i0] = x;); tmp[0U] = - (uint32_t)pv.digest_length - ^ ((uint32_t)pv.key_length << 8U ^ ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); + (uint32_t)pv.digest_length ^ + ((uint32_t)pv.key_length << 8U ^ ((uint32_t)pv.fanout << 16U ^ (uint32_t)pv.depth << 24U)); tmp[1U] = pv.leaf_length; tmp[2U] = (uint32_t)pv.node_offset; tmp[3U] = - (uint32_t)(pv.node_offset >> 32U) - ^ ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); + (uint32_t)(pv.node_offset >> 32U) ^ + ((uint32_t)pv.node_depth << 16U ^ (uint32_t)pv.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; @@ -1061,8 +1059,7 @@ Hacl_Hash_Blake2s_Simd128_update( uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Hash_Blake2s_Simd128_state_t){ .block_state = block_state1, @@ -1116,8 +1113,7 @@ Hacl_Hash_Blake2s_Simd128_update( Hacl_Hash_Blake2s_Simd128_update_multi(data1_len, wv, hash, total_len1, data1, nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2s_Simd128_state_t){ .block_state = block_state1, @@ -1147,8 +1143,7 @@ Hacl_Hash_Blake2s_Simd128_update( uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Hash_Blake2s_Simd128_state_t){ .block_state = block_state10, @@ -1200,8 +1195,7 @@ Hacl_Hash_Blake2s_Simd128_update( Hacl_Hash_Blake2s_Simd128_update_multi(data1_len, wv, hash, total_len1, data1, nb); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_Blake2s_Simd128_state_t){ .block_state = block_state1, @@ -1531,16 +1525,14 @@ Hacl_Hash_Blake2s_Simd128_hash_with_key_and_params( uint32_t x = r; os[i] = x;); tmp[0U] = - (uint32_t)params.digest_length - ^ - ((uint32_t)params.key_length - << 8U - ^ ((uint32_t)params.fanout << 16U ^ (uint32_t)params.depth << 24U)); + (uint32_t)params.digest_length ^ + ((uint32_t)params.key_length << 8U ^ + ((uint32_t)params.fanout << 16U ^ (uint32_t)params.depth << 24U)); tmp[1U] = params.leaf_length; tmp[2U] = (uint32_t)params.node_offset; tmp[3U] = - (uint32_t)(params.node_offset >> 32U) - ^ ((uint32_t)params.node_depth << 16U ^ (uint32_t)params.inner_length << 24U); + (uint32_t)(params.node_offset >> 32U) ^ + ((uint32_t)params.node_depth << 16U ^ (uint32_t)params.inner_length << 24U); uint32_t tmp0 = tmp[0U]; uint32_t tmp1 = tmp[1U]; uint32_t tmp2 = tmp[2U]; diff --git a/Modules/_hacl/Hacl_Hash_MD5.c b/Modules/_hacl/Hacl_Hash_MD5.c index 75ce8d2926e6e1..305c75483c06ea 100644 --- a/Modules/_hacl/Hacl_Hash_MD5.c +++ b/Modules/_hacl/Hacl_Hash_MD5.c @@ -66,11 +66,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti0 = _t[0U]; uint32_t v = - vb0 - + - ((va + ((vb0 & vc0) | (~vb0 & vd0)) + xk + ti0) - << 7U - | (va + ((vb0 & vc0) | (~vb0 & vd0)) + xk + ti0) >> 25U); + vb0 + + ((va + ((vb0 & vc0) | (~vb0 & vd0)) + xk + ti0) << 7U | + (va + ((vb0 & vc0) | (~vb0 & vd0)) + xk + ti0) >> 25U); abcd[0U] = v; uint32_t va0 = abcd[3U]; uint32_t vb1 = abcd[0U]; @@ -82,11 +80,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti1 = _t[1U]; uint32_t v0 = - vb1 - + - ((va0 + ((vb1 & vc1) | (~vb1 & vd1)) + xk0 + ti1) - << 12U - | (va0 + ((vb1 & vc1) | (~vb1 & vd1)) + xk0 + ti1) >> 20U); + vb1 + + ((va0 + ((vb1 & vc1) | (~vb1 & vd1)) + xk0 + ti1) << 12U | + (va0 + ((vb1 & vc1) | (~vb1 & vd1)) + xk0 + ti1) >> 20U); abcd[3U] = v0; uint32_t va1 = abcd[2U]; uint32_t vb2 = abcd[3U]; @@ -98,11 +94,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti2 = _t[2U]; uint32_t v1 = - vb2 - + - ((va1 + ((vb2 & vc2) | (~vb2 & vd2)) + xk1 + ti2) - << 17U - | (va1 + ((vb2 & vc2) | (~vb2 & vd2)) + xk1 + ti2) >> 15U); + vb2 + + ((va1 + ((vb2 & vc2) | (~vb2 & vd2)) + xk1 + ti2) << 17U | + (va1 + ((vb2 & vc2) | (~vb2 & vd2)) + xk1 + ti2) >> 15U); abcd[2U] = v1; uint32_t va2 = abcd[1U]; uint32_t vb3 = abcd[2U]; @@ -114,11 +108,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti3 = _t[3U]; uint32_t v2 = - vb3 - + - ((va2 + ((vb3 & vc3) | (~vb3 & vd3)) + xk2 + ti3) - << 22U - | (va2 + ((vb3 & vc3) | (~vb3 & vd3)) + xk2 + ti3) >> 10U); + vb3 + + ((va2 + ((vb3 & vc3) | (~vb3 & vd3)) + xk2 + ti3) << 22U | + (va2 + ((vb3 & vc3) | (~vb3 & vd3)) + xk2 + ti3) >> 10U); abcd[1U] = v2; uint32_t va3 = abcd[0U]; uint32_t vb4 = abcd[1U]; @@ -130,11 +122,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti4 = _t[4U]; uint32_t v3 = - vb4 - + - ((va3 + ((vb4 & vc4) | (~vb4 & vd4)) + xk3 + ti4) - << 7U - | (va3 + ((vb4 & vc4) | (~vb4 & vd4)) + xk3 + ti4) >> 25U); + vb4 + + ((va3 + ((vb4 & vc4) | (~vb4 & vd4)) + xk3 + ti4) << 7U | + (va3 + ((vb4 & vc4) | (~vb4 & vd4)) + xk3 + ti4) >> 25U); abcd[0U] = v3; uint32_t va4 = abcd[3U]; uint32_t vb5 = abcd[0U]; @@ -146,11 +136,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti5 = _t[5U]; uint32_t v4 = - vb5 - + - ((va4 + ((vb5 & vc5) | (~vb5 & vd5)) + xk4 + ti5) - << 12U - | (va4 + ((vb5 & vc5) | (~vb5 & vd5)) + xk4 + ti5) >> 20U); + vb5 + + ((va4 + ((vb5 & vc5) | (~vb5 & vd5)) + xk4 + ti5) << 12U | + (va4 + ((vb5 & vc5) | (~vb5 & vd5)) + xk4 + ti5) >> 20U); abcd[3U] = v4; uint32_t va5 = abcd[2U]; uint32_t vb6 = abcd[3U]; @@ -162,11 +150,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti6 = _t[6U]; uint32_t v5 = - vb6 - + - ((va5 + ((vb6 & vc6) | (~vb6 & vd6)) + xk5 + ti6) - << 17U - | (va5 + ((vb6 & vc6) | (~vb6 & vd6)) + xk5 + ti6) >> 15U); + vb6 + + ((va5 + ((vb6 & vc6) | (~vb6 & vd6)) + xk5 + ti6) << 17U | + (va5 + ((vb6 & vc6) | (~vb6 & vd6)) + xk5 + ti6) >> 15U); abcd[2U] = v5; uint32_t va6 = abcd[1U]; uint32_t vb7 = abcd[2U]; @@ -178,11 +164,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti7 = _t[7U]; uint32_t v6 = - vb7 - + - ((va6 + ((vb7 & vc7) | (~vb7 & vd7)) + xk6 + ti7) - << 22U - | (va6 + ((vb7 & vc7) | (~vb7 & vd7)) + xk6 + ti7) >> 10U); + vb7 + + ((va6 + ((vb7 & vc7) | (~vb7 & vd7)) + xk6 + ti7) << 22U | + (va6 + ((vb7 & vc7) | (~vb7 & vd7)) + xk6 + ti7) >> 10U); abcd[1U] = v6; uint32_t va7 = abcd[0U]; uint32_t vb8 = abcd[1U]; @@ -194,11 +178,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti8 = _t[8U]; uint32_t v7 = - vb8 - + - ((va7 + ((vb8 & vc8) | (~vb8 & vd8)) + xk7 + ti8) - << 7U - | (va7 + ((vb8 & vc8) | (~vb8 & vd8)) + xk7 + ti8) >> 25U); + vb8 + + ((va7 + ((vb8 & vc8) | (~vb8 & vd8)) + xk7 + ti8) << 7U | + (va7 + ((vb8 & vc8) | (~vb8 & vd8)) + xk7 + ti8) >> 25U); abcd[0U] = v7; uint32_t va8 = abcd[3U]; uint32_t vb9 = abcd[0U]; @@ -210,11 +192,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti9 = _t[9U]; uint32_t v8 = - vb9 - + - ((va8 + ((vb9 & vc9) | (~vb9 & vd9)) + xk8 + ti9) - << 12U - | (va8 + ((vb9 & vc9) | (~vb9 & vd9)) + xk8 + ti9) >> 20U); + vb9 + + ((va8 + ((vb9 & vc9) | (~vb9 & vd9)) + xk8 + ti9) << 12U | + (va8 + ((vb9 & vc9) | (~vb9 & vd9)) + xk8 + ti9) >> 20U); abcd[3U] = v8; uint32_t va9 = abcd[2U]; uint32_t vb10 = abcd[3U]; @@ -226,11 +206,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti10 = _t[10U]; uint32_t v9 = - vb10 - + - ((va9 + ((vb10 & vc10) | (~vb10 & vd10)) + xk9 + ti10) - << 17U - | (va9 + ((vb10 & vc10) | (~vb10 & vd10)) + xk9 + ti10) >> 15U); + vb10 + + ((va9 + ((vb10 & vc10) | (~vb10 & vd10)) + xk9 + ti10) << 17U | + (va9 + ((vb10 & vc10) | (~vb10 & vd10)) + xk9 + ti10) >> 15U); abcd[2U] = v9; uint32_t va10 = abcd[1U]; uint32_t vb11 = abcd[2U]; @@ -242,11 +220,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti11 = _t[11U]; uint32_t v10 = - vb11 - + - ((va10 + ((vb11 & vc11) | (~vb11 & vd11)) + xk10 + ti11) - << 22U - | (va10 + ((vb11 & vc11) | (~vb11 & vd11)) + xk10 + ti11) >> 10U); + vb11 + + ((va10 + ((vb11 & vc11) | (~vb11 & vd11)) + xk10 + ti11) << 22U | + (va10 + ((vb11 & vc11) | (~vb11 & vd11)) + xk10 + ti11) >> 10U); abcd[1U] = v10; uint32_t va11 = abcd[0U]; uint32_t vb12 = abcd[1U]; @@ -258,11 +234,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti12 = _t[12U]; uint32_t v11 = - vb12 - + - ((va11 + ((vb12 & vc12) | (~vb12 & vd12)) + xk11 + ti12) - << 7U - | (va11 + ((vb12 & vc12) | (~vb12 & vd12)) + xk11 + ti12) >> 25U); + vb12 + + ((va11 + ((vb12 & vc12) | (~vb12 & vd12)) + xk11 + ti12) << 7U | + (va11 + ((vb12 & vc12) | (~vb12 & vd12)) + xk11 + ti12) >> 25U); abcd[0U] = v11; uint32_t va12 = abcd[3U]; uint32_t vb13 = abcd[0U]; @@ -274,11 +248,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti13 = _t[13U]; uint32_t v12 = - vb13 - + - ((va12 + ((vb13 & vc13) | (~vb13 & vd13)) + xk12 + ti13) - << 12U - | (va12 + ((vb13 & vc13) | (~vb13 & vd13)) + xk12 + ti13) >> 20U); + vb13 + + ((va12 + ((vb13 & vc13) | (~vb13 & vd13)) + xk12 + ti13) << 12U | + (va12 + ((vb13 & vc13) | (~vb13 & vd13)) + xk12 + ti13) >> 20U); abcd[3U] = v12; uint32_t va13 = abcd[2U]; uint32_t vb14 = abcd[3U]; @@ -290,11 +262,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti14 = _t[14U]; uint32_t v13 = - vb14 - + - ((va13 + ((vb14 & vc14) | (~vb14 & vd14)) + xk13 + ti14) - << 17U - | (va13 + ((vb14 & vc14) | (~vb14 & vd14)) + xk13 + ti14) >> 15U); + vb14 + + ((va13 + ((vb14 & vc14) | (~vb14 & vd14)) + xk13 + ti14) << 17U | + (va13 + ((vb14 & vc14) | (~vb14 & vd14)) + xk13 + ti14) >> 15U); abcd[2U] = v13; uint32_t va14 = abcd[1U]; uint32_t vb15 = abcd[2U]; @@ -306,11 +276,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti15 = _t[15U]; uint32_t v14 = - vb15 - + - ((va14 + ((vb15 & vc15) | (~vb15 & vd15)) + xk14 + ti15) - << 22U - | (va14 + ((vb15 & vc15) | (~vb15 & vd15)) + xk14 + ti15) >> 10U); + vb15 + + ((va14 + ((vb15 & vc15) | (~vb15 & vd15)) + xk14 + ti15) << 22U | + (va14 + ((vb15 & vc15) | (~vb15 & vd15)) + xk14 + ti15) >> 10U); abcd[1U] = v14; uint32_t va15 = abcd[0U]; uint32_t vb16 = abcd[1U]; @@ -322,11 +290,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti16 = _t[16U]; uint32_t v15 = - vb16 - + - ((va15 + ((vb16 & vd16) | (vc16 & ~vd16)) + xk15 + ti16) - << 5U - | (va15 + ((vb16 & vd16) | (vc16 & ~vd16)) + xk15 + ti16) >> 27U); + vb16 + + ((va15 + ((vb16 & vd16) | (vc16 & ~vd16)) + xk15 + ti16) << 5U | + (va15 + ((vb16 & vd16) | (vc16 & ~vd16)) + xk15 + ti16) >> 27U); abcd[0U] = v15; uint32_t va16 = abcd[3U]; uint32_t vb17 = abcd[0U]; @@ -338,11 +304,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti17 = _t[17U]; uint32_t v16 = - vb17 - + - ((va16 + ((vb17 & vd17) | (vc17 & ~vd17)) + xk16 + ti17) - << 9U - | (va16 + ((vb17 & vd17) | (vc17 & ~vd17)) + xk16 + ti17) >> 23U); + vb17 + + ((va16 + ((vb17 & vd17) | (vc17 & ~vd17)) + xk16 + ti17) << 9U | + (va16 + ((vb17 & vd17) | (vc17 & ~vd17)) + xk16 + ti17) >> 23U); abcd[3U] = v16; uint32_t va17 = abcd[2U]; uint32_t vb18 = abcd[3U]; @@ -354,11 +318,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti18 = _t[18U]; uint32_t v17 = - vb18 - + - ((va17 + ((vb18 & vd18) | (vc18 & ~vd18)) + xk17 + ti18) - << 14U - | (va17 + ((vb18 & vd18) | (vc18 & ~vd18)) + xk17 + ti18) >> 18U); + vb18 + + ((va17 + ((vb18 & vd18) | (vc18 & ~vd18)) + xk17 + ti18) << 14U | + (va17 + ((vb18 & vd18) | (vc18 & ~vd18)) + xk17 + ti18) >> 18U); abcd[2U] = v17; uint32_t va18 = abcd[1U]; uint32_t vb19 = abcd[2U]; @@ -370,11 +332,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti19 = _t[19U]; uint32_t v18 = - vb19 - + - ((va18 + ((vb19 & vd19) | (vc19 & ~vd19)) + xk18 + ti19) - << 20U - | (va18 + ((vb19 & vd19) | (vc19 & ~vd19)) + xk18 + ti19) >> 12U); + vb19 + + ((va18 + ((vb19 & vd19) | (vc19 & ~vd19)) + xk18 + ti19) << 20U | + (va18 + ((vb19 & vd19) | (vc19 & ~vd19)) + xk18 + ti19) >> 12U); abcd[1U] = v18; uint32_t va19 = abcd[0U]; uint32_t vb20 = abcd[1U]; @@ -386,11 +346,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti20 = _t[20U]; uint32_t v19 = - vb20 - + - ((va19 + ((vb20 & vd20) | (vc20 & ~vd20)) + xk19 + ti20) - << 5U - | (va19 + ((vb20 & vd20) | (vc20 & ~vd20)) + xk19 + ti20) >> 27U); + vb20 + + ((va19 + ((vb20 & vd20) | (vc20 & ~vd20)) + xk19 + ti20) << 5U | + (va19 + ((vb20 & vd20) | (vc20 & ~vd20)) + xk19 + ti20) >> 27U); abcd[0U] = v19; uint32_t va20 = abcd[3U]; uint32_t vb21 = abcd[0U]; @@ -402,11 +360,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti21 = _t[21U]; uint32_t v20 = - vb21 - + - ((va20 + ((vb21 & vd21) | (vc21 & ~vd21)) + xk20 + ti21) - << 9U - | (va20 + ((vb21 & vd21) | (vc21 & ~vd21)) + xk20 + ti21) >> 23U); + vb21 + + ((va20 + ((vb21 & vd21) | (vc21 & ~vd21)) + xk20 + ti21) << 9U | + (va20 + ((vb21 & vd21) | (vc21 & ~vd21)) + xk20 + ti21) >> 23U); abcd[3U] = v20; uint32_t va21 = abcd[2U]; uint32_t vb22 = abcd[3U]; @@ -418,11 +374,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti22 = _t[22U]; uint32_t v21 = - vb22 - + - ((va21 + ((vb22 & vd22) | (vc22 & ~vd22)) + xk21 + ti22) - << 14U - | (va21 + ((vb22 & vd22) | (vc22 & ~vd22)) + xk21 + ti22) >> 18U); + vb22 + + ((va21 + ((vb22 & vd22) | (vc22 & ~vd22)) + xk21 + ti22) << 14U | + (va21 + ((vb22 & vd22) | (vc22 & ~vd22)) + xk21 + ti22) >> 18U); abcd[2U] = v21; uint32_t va22 = abcd[1U]; uint32_t vb23 = abcd[2U]; @@ -434,11 +388,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti23 = _t[23U]; uint32_t v22 = - vb23 - + - ((va22 + ((vb23 & vd23) | (vc23 & ~vd23)) + xk22 + ti23) - << 20U - | (va22 + ((vb23 & vd23) | (vc23 & ~vd23)) + xk22 + ti23) >> 12U); + vb23 + + ((va22 + ((vb23 & vd23) | (vc23 & ~vd23)) + xk22 + ti23) << 20U | + (va22 + ((vb23 & vd23) | (vc23 & ~vd23)) + xk22 + ti23) >> 12U); abcd[1U] = v22; uint32_t va23 = abcd[0U]; uint32_t vb24 = abcd[1U]; @@ -450,11 +402,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti24 = _t[24U]; uint32_t v23 = - vb24 - + - ((va23 + ((vb24 & vd24) | (vc24 & ~vd24)) + xk23 + ti24) - << 5U - | (va23 + ((vb24 & vd24) | (vc24 & ~vd24)) + xk23 + ti24) >> 27U); + vb24 + + ((va23 + ((vb24 & vd24) | (vc24 & ~vd24)) + xk23 + ti24) << 5U | + (va23 + ((vb24 & vd24) | (vc24 & ~vd24)) + xk23 + ti24) >> 27U); abcd[0U] = v23; uint32_t va24 = abcd[3U]; uint32_t vb25 = abcd[0U]; @@ -466,11 +416,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti25 = _t[25U]; uint32_t v24 = - vb25 - + - ((va24 + ((vb25 & vd25) | (vc25 & ~vd25)) + xk24 + ti25) - << 9U - | (va24 + ((vb25 & vd25) | (vc25 & ~vd25)) + xk24 + ti25) >> 23U); + vb25 + + ((va24 + ((vb25 & vd25) | (vc25 & ~vd25)) + xk24 + ti25) << 9U | + (va24 + ((vb25 & vd25) | (vc25 & ~vd25)) + xk24 + ti25) >> 23U); abcd[3U] = v24; uint32_t va25 = abcd[2U]; uint32_t vb26 = abcd[3U]; @@ -482,11 +430,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti26 = _t[26U]; uint32_t v25 = - vb26 - + - ((va25 + ((vb26 & vd26) | (vc26 & ~vd26)) + xk25 + ti26) - << 14U - | (va25 + ((vb26 & vd26) | (vc26 & ~vd26)) + xk25 + ti26) >> 18U); + vb26 + + ((va25 + ((vb26 & vd26) | (vc26 & ~vd26)) + xk25 + ti26) << 14U | + (va25 + ((vb26 & vd26) | (vc26 & ~vd26)) + xk25 + ti26) >> 18U); abcd[2U] = v25; uint32_t va26 = abcd[1U]; uint32_t vb27 = abcd[2U]; @@ -498,11 +444,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti27 = _t[27U]; uint32_t v26 = - vb27 - + - ((va26 + ((vb27 & vd27) | (vc27 & ~vd27)) + xk26 + ti27) - << 20U - | (va26 + ((vb27 & vd27) | (vc27 & ~vd27)) + xk26 + ti27) >> 12U); + vb27 + + ((va26 + ((vb27 & vd27) | (vc27 & ~vd27)) + xk26 + ti27) << 20U | + (va26 + ((vb27 & vd27) | (vc27 & ~vd27)) + xk26 + ti27) >> 12U); abcd[1U] = v26; uint32_t va27 = abcd[0U]; uint32_t vb28 = abcd[1U]; @@ -514,11 +458,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti28 = _t[28U]; uint32_t v27 = - vb28 - + - ((va27 + ((vb28 & vd28) | (vc28 & ~vd28)) + xk27 + ti28) - << 5U - | (va27 + ((vb28 & vd28) | (vc28 & ~vd28)) + xk27 + ti28) >> 27U); + vb28 + + ((va27 + ((vb28 & vd28) | (vc28 & ~vd28)) + xk27 + ti28) << 5U | + (va27 + ((vb28 & vd28) | (vc28 & ~vd28)) + xk27 + ti28) >> 27U); abcd[0U] = v27; uint32_t va28 = abcd[3U]; uint32_t vb29 = abcd[0U]; @@ -530,11 +472,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti29 = _t[29U]; uint32_t v28 = - vb29 - + - ((va28 + ((vb29 & vd29) | (vc29 & ~vd29)) + xk28 + ti29) - << 9U - | (va28 + ((vb29 & vd29) | (vc29 & ~vd29)) + xk28 + ti29) >> 23U); + vb29 + + ((va28 + ((vb29 & vd29) | (vc29 & ~vd29)) + xk28 + ti29) << 9U | + (va28 + ((vb29 & vd29) | (vc29 & ~vd29)) + xk28 + ti29) >> 23U); abcd[3U] = v28; uint32_t va29 = abcd[2U]; uint32_t vb30 = abcd[3U]; @@ -546,11 +486,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti30 = _t[30U]; uint32_t v29 = - vb30 - + - ((va29 + ((vb30 & vd30) | (vc30 & ~vd30)) + xk29 + ti30) - << 14U - | (va29 + ((vb30 & vd30) | (vc30 & ~vd30)) + xk29 + ti30) >> 18U); + vb30 + + ((va29 + ((vb30 & vd30) | (vc30 & ~vd30)) + xk29 + ti30) << 14U | + (va29 + ((vb30 & vd30) | (vc30 & ~vd30)) + xk29 + ti30) >> 18U); abcd[2U] = v29; uint32_t va30 = abcd[1U]; uint32_t vb31 = abcd[2U]; @@ -562,11 +500,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti31 = _t[31U]; uint32_t v30 = - vb31 - + - ((va30 + ((vb31 & vd31) | (vc31 & ~vd31)) + xk30 + ti31) - << 20U - | (va30 + ((vb31 & vd31) | (vc31 & ~vd31)) + xk30 + ti31) >> 12U); + vb31 + + ((va30 + ((vb31 & vd31) | (vc31 & ~vd31)) + xk30 + ti31) << 20U | + (va30 + ((vb31 & vd31) | (vc31 & ~vd31)) + xk30 + ti31) >> 12U); abcd[1U] = v30; uint32_t va31 = abcd[0U]; uint32_t vb32 = abcd[1U]; @@ -578,11 +514,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti32 = _t[32U]; uint32_t v31 = - vb32 - + - ((va31 + (vb32 ^ (vc32 ^ vd32)) + xk31 + ti32) - << 4U - | (va31 + (vb32 ^ (vc32 ^ vd32)) + xk31 + ti32) >> 28U); + vb32 + + ((va31 + (vb32 ^ (vc32 ^ vd32)) + xk31 + ti32) << 4U | + (va31 + (vb32 ^ (vc32 ^ vd32)) + xk31 + ti32) >> 28U); abcd[0U] = v31; uint32_t va32 = abcd[3U]; uint32_t vb33 = abcd[0U]; @@ -594,11 +528,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti33 = _t[33U]; uint32_t v32 = - vb33 - + - ((va32 + (vb33 ^ (vc33 ^ vd33)) + xk32 + ti33) - << 11U - | (va32 + (vb33 ^ (vc33 ^ vd33)) + xk32 + ti33) >> 21U); + vb33 + + ((va32 + (vb33 ^ (vc33 ^ vd33)) + xk32 + ti33) << 11U | + (va32 + (vb33 ^ (vc33 ^ vd33)) + xk32 + ti33) >> 21U); abcd[3U] = v32; uint32_t va33 = abcd[2U]; uint32_t vb34 = abcd[3U]; @@ -610,11 +542,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti34 = _t[34U]; uint32_t v33 = - vb34 - + - ((va33 + (vb34 ^ (vc34 ^ vd34)) + xk33 + ti34) - << 16U - | (va33 + (vb34 ^ (vc34 ^ vd34)) + xk33 + ti34) >> 16U); + vb34 + + ((va33 + (vb34 ^ (vc34 ^ vd34)) + xk33 + ti34) << 16U | + (va33 + (vb34 ^ (vc34 ^ vd34)) + xk33 + ti34) >> 16U); abcd[2U] = v33; uint32_t va34 = abcd[1U]; uint32_t vb35 = abcd[2U]; @@ -626,11 +556,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti35 = _t[35U]; uint32_t v34 = - vb35 - + - ((va34 + (vb35 ^ (vc35 ^ vd35)) + xk34 + ti35) - << 23U - | (va34 + (vb35 ^ (vc35 ^ vd35)) + xk34 + ti35) >> 9U); + vb35 + + ((va34 + (vb35 ^ (vc35 ^ vd35)) + xk34 + ti35) << 23U | + (va34 + (vb35 ^ (vc35 ^ vd35)) + xk34 + ti35) >> 9U); abcd[1U] = v34; uint32_t va35 = abcd[0U]; uint32_t vb36 = abcd[1U]; @@ -642,11 +570,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti36 = _t[36U]; uint32_t v35 = - vb36 - + - ((va35 + (vb36 ^ (vc36 ^ vd36)) + xk35 + ti36) - << 4U - | (va35 + (vb36 ^ (vc36 ^ vd36)) + xk35 + ti36) >> 28U); + vb36 + + ((va35 + (vb36 ^ (vc36 ^ vd36)) + xk35 + ti36) << 4U | + (va35 + (vb36 ^ (vc36 ^ vd36)) + xk35 + ti36) >> 28U); abcd[0U] = v35; uint32_t va36 = abcd[3U]; uint32_t vb37 = abcd[0U]; @@ -658,11 +584,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti37 = _t[37U]; uint32_t v36 = - vb37 - + - ((va36 + (vb37 ^ (vc37 ^ vd37)) + xk36 + ti37) - << 11U - | (va36 + (vb37 ^ (vc37 ^ vd37)) + xk36 + ti37) >> 21U); + vb37 + + ((va36 + (vb37 ^ (vc37 ^ vd37)) + xk36 + ti37) << 11U | + (va36 + (vb37 ^ (vc37 ^ vd37)) + xk36 + ti37) >> 21U); abcd[3U] = v36; uint32_t va37 = abcd[2U]; uint32_t vb38 = abcd[3U]; @@ -674,11 +598,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti38 = _t[38U]; uint32_t v37 = - vb38 - + - ((va37 + (vb38 ^ (vc38 ^ vd38)) + xk37 + ti38) - << 16U - | (va37 + (vb38 ^ (vc38 ^ vd38)) + xk37 + ti38) >> 16U); + vb38 + + ((va37 + (vb38 ^ (vc38 ^ vd38)) + xk37 + ti38) << 16U | + (va37 + (vb38 ^ (vc38 ^ vd38)) + xk37 + ti38) >> 16U); abcd[2U] = v37; uint32_t va38 = abcd[1U]; uint32_t vb39 = abcd[2U]; @@ -690,11 +612,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti39 = _t[39U]; uint32_t v38 = - vb39 - + - ((va38 + (vb39 ^ (vc39 ^ vd39)) + xk38 + ti39) - << 23U - | (va38 + (vb39 ^ (vc39 ^ vd39)) + xk38 + ti39) >> 9U); + vb39 + + ((va38 + (vb39 ^ (vc39 ^ vd39)) + xk38 + ti39) << 23U | + (va38 + (vb39 ^ (vc39 ^ vd39)) + xk38 + ti39) >> 9U); abcd[1U] = v38; uint32_t va39 = abcd[0U]; uint32_t vb40 = abcd[1U]; @@ -706,11 +626,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti40 = _t[40U]; uint32_t v39 = - vb40 - + - ((va39 + (vb40 ^ (vc40 ^ vd40)) + xk39 + ti40) - << 4U - | (va39 + (vb40 ^ (vc40 ^ vd40)) + xk39 + ti40) >> 28U); + vb40 + + ((va39 + (vb40 ^ (vc40 ^ vd40)) + xk39 + ti40) << 4U | + (va39 + (vb40 ^ (vc40 ^ vd40)) + xk39 + ti40) >> 28U); abcd[0U] = v39; uint32_t va40 = abcd[3U]; uint32_t vb41 = abcd[0U]; @@ -722,11 +640,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti41 = _t[41U]; uint32_t v40 = - vb41 - + - ((va40 + (vb41 ^ (vc41 ^ vd41)) + xk40 + ti41) - << 11U - | (va40 + (vb41 ^ (vc41 ^ vd41)) + xk40 + ti41) >> 21U); + vb41 + + ((va40 + (vb41 ^ (vc41 ^ vd41)) + xk40 + ti41) << 11U | + (va40 + (vb41 ^ (vc41 ^ vd41)) + xk40 + ti41) >> 21U); abcd[3U] = v40; uint32_t va41 = abcd[2U]; uint32_t vb42 = abcd[3U]; @@ -738,11 +654,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti42 = _t[42U]; uint32_t v41 = - vb42 - + - ((va41 + (vb42 ^ (vc42 ^ vd42)) + xk41 + ti42) - << 16U - | (va41 + (vb42 ^ (vc42 ^ vd42)) + xk41 + ti42) >> 16U); + vb42 + + ((va41 + (vb42 ^ (vc42 ^ vd42)) + xk41 + ti42) << 16U | + (va41 + (vb42 ^ (vc42 ^ vd42)) + xk41 + ti42) >> 16U); abcd[2U] = v41; uint32_t va42 = abcd[1U]; uint32_t vb43 = abcd[2U]; @@ -754,11 +668,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti43 = _t[43U]; uint32_t v42 = - vb43 - + - ((va42 + (vb43 ^ (vc43 ^ vd43)) + xk42 + ti43) - << 23U - | (va42 + (vb43 ^ (vc43 ^ vd43)) + xk42 + ti43) >> 9U); + vb43 + + ((va42 + (vb43 ^ (vc43 ^ vd43)) + xk42 + ti43) << 23U | + (va42 + (vb43 ^ (vc43 ^ vd43)) + xk42 + ti43) >> 9U); abcd[1U] = v42; uint32_t va43 = abcd[0U]; uint32_t vb44 = abcd[1U]; @@ -770,11 +682,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti44 = _t[44U]; uint32_t v43 = - vb44 - + - ((va43 + (vb44 ^ (vc44 ^ vd44)) + xk43 + ti44) - << 4U - | (va43 + (vb44 ^ (vc44 ^ vd44)) + xk43 + ti44) >> 28U); + vb44 + + ((va43 + (vb44 ^ (vc44 ^ vd44)) + xk43 + ti44) << 4U | + (va43 + (vb44 ^ (vc44 ^ vd44)) + xk43 + ti44) >> 28U); abcd[0U] = v43; uint32_t va44 = abcd[3U]; uint32_t vb45 = abcd[0U]; @@ -786,11 +696,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti45 = _t[45U]; uint32_t v44 = - vb45 - + - ((va44 + (vb45 ^ (vc45 ^ vd45)) + xk44 + ti45) - << 11U - | (va44 + (vb45 ^ (vc45 ^ vd45)) + xk44 + ti45) >> 21U); + vb45 + + ((va44 + (vb45 ^ (vc45 ^ vd45)) + xk44 + ti45) << 11U | + (va44 + (vb45 ^ (vc45 ^ vd45)) + xk44 + ti45) >> 21U); abcd[3U] = v44; uint32_t va45 = abcd[2U]; uint32_t vb46 = abcd[3U]; @@ -802,11 +710,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti46 = _t[46U]; uint32_t v45 = - vb46 - + - ((va45 + (vb46 ^ (vc46 ^ vd46)) + xk45 + ti46) - << 16U - | (va45 + (vb46 ^ (vc46 ^ vd46)) + xk45 + ti46) >> 16U); + vb46 + + ((va45 + (vb46 ^ (vc46 ^ vd46)) + xk45 + ti46) << 16U | + (va45 + (vb46 ^ (vc46 ^ vd46)) + xk45 + ti46) >> 16U); abcd[2U] = v45; uint32_t va46 = abcd[1U]; uint32_t vb47 = abcd[2U]; @@ -818,11 +724,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti47 = _t[47U]; uint32_t v46 = - vb47 - + - ((va46 + (vb47 ^ (vc47 ^ vd47)) + xk46 + ti47) - << 23U - | (va46 + (vb47 ^ (vc47 ^ vd47)) + xk46 + ti47) >> 9U); + vb47 + + ((va46 + (vb47 ^ (vc47 ^ vd47)) + xk46 + ti47) << 23U | + (va46 + (vb47 ^ (vc47 ^ vd47)) + xk46 + ti47) >> 9U); abcd[1U] = v46; uint32_t va47 = abcd[0U]; uint32_t vb48 = abcd[1U]; @@ -834,11 +738,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti48 = _t[48U]; uint32_t v47 = - vb48 - + - ((va47 + (vc48 ^ (vb48 | ~vd48)) + xk47 + ti48) - << 6U - | (va47 + (vc48 ^ (vb48 | ~vd48)) + xk47 + ti48) >> 26U); + vb48 + + ((va47 + (vc48 ^ (vb48 | ~vd48)) + xk47 + ti48) << 6U | + (va47 + (vc48 ^ (vb48 | ~vd48)) + xk47 + ti48) >> 26U); abcd[0U] = v47; uint32_t va48 = abcd[3U]; uint32_t vb49 = abcd[0U]; @@ -850,11 +752,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti49 = _t[49U]; uint32_t v48 = - vb49 - + - ((va48 + (vc49 ^ (vb49 | ~vd49)) + xk48 + ti49) - << 10U - | (va48 + (vc49 ^ (vb49 | ~vd49)) + xk48 + ti49) >> 22U); + vb49 + + ((va48 + (vc49 ^ (vb49 | ~vd49)) + xk48 + ti49) << 10U | + (va48 + (vc49 ^ (vb49 | ~vd49)) + xk48 + ti49) >> 22U); abcd[3U] = v48; uint32_t va49 = abcd[2U]; uint32_t vb50 = abcd[3U]; @@ -866,11 +766,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti50 = _t[50U]; uint32_t v49 = - vb50 - + - ((va49 + (vc50 ^ (vb50 | ~vd50)) + xk49 + ti50) - << 15U - | (va49 + (vc50 ^ (vb50 | ~vd50)) + xk49 + ti50) >> 17U); + vb50 + + ((va49 + (vc50 ^ (vb50 | ~vd50)) + xk49 + ti50) << 15U | + (va49 + (vc50 ^ (vb50 | ~vd50)) + xk49 + ti50) >> 17U); abcd[2U] = v49; uint32_t va50 = abcd[1U]; uint32_t vb51 = abcd[2U]; @@ -882,11 +780,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti51 = _t[51U]; uint32_t v50 = - vb51 - + - ((va50 + (vc51 ^ (vb51 | ~vd51)) + xk50 + ti51) - << 21U - | (va50 + (vc51 ^ (vb51 | ~vd51)) + xk50 + ti51) >> 11U); + vb51 + + ((va50 + (vc51 ^ (vb51 | ~vd51)) + xk50 + ti51) << 21U | + (va50 + (vc51 ^ (vb51 | ~vd51)) + xk50 + ti51) >> 11U); abcd[1U] = v50; uint32_t va51 = abcd[0U]; uint32_t vb52 = abcd[1U]; @@ -898,11 +794,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti52 = _t[52U]; uint32_t v51 = - vb52 - + - ((va51 + (vc52 ^ (vb52 | ~vd52)) + xk51 + ti52) - << 6U - | (va51 + (vc52 ^ (vb52 | ~vd52)) + xk51 + ti52) >> 26U); + vb52 + + ((va51 + (vc52 ^ (vb52 | ~vd52)) + xk51 + ti52) << 6U | + (va51 + (vc52 ^ (vb52 | ~vd52)) + xk51 + ti52) >> 26U); abcd[0U] = v51; uint32_t va52 = abcd[3U]; uint32_t vb53 = abcd[0U]; @@ -914,11 +808,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti53 = _t[53U]; uint32_t v52 = - vb53 - + - ((va52 + (vc53 ^ (vb53 | ~vd53)) + xk52 + ti53) - << 10U - | (va52 + (vc53 ^ (vb53 | ~vd53)) + xk52 + ti53) >> 22U); + vb53 + + ((va52 + (vc53 ^ (vb53 | ~vd53)) + xk52 + ti53) << 10U | + (va52 + (vc53 ^ (vb53 | ~vd53)) + xk52 + ti53) >> 22U); abcd[3U] = v52; uint32_t va53 = abcd[2U]; uint32_t vb54 = abcd[3U]; @@ -930,11 +822,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti54 = _t[54U]; uint32_t v53 = - vb54 - + - ((va53 + (vc54 ^ (vb54 | ~vd54)) + xk53 + ti54) - << 15U - | (va53 + (vc54 ^ (vb54 | ~vd54)) + xk53 + ti54) >> 17U); + vb54 + + ((va53 + (vc54 ^ (vb54 | ~vd54)) + xk53 + ti54) << 15U | + (va53 + (vc54 ^ (vb54 | ~vd54)) + xk53 + ti54) >> 17U); abcd[2U] = v53; uint32_t va54 = abcd[1U]; uint32_t vb55 = abcd[2U]; @@ -946,11 +836,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti55 = _t[55U]; uint32_t v54 = - vb55 - + - ((va54 + (vc55 ^ (vb55 | ~vd55)) + xk54 + ti55) - << 21U - | (va54 + (vc55 ^ (vb55 | ~vd55)) + xk54 + ti55) >> 11U); + vb55 + + ((va54 + (vc55 ^ (vb55 | ~vd55)) + xk54 + ti55) << 21U | + (va54 + (vc55 ^ (vb55 | ~vd55)) + xk54 + ti55) >> 11U); abcd[1U] = v54; uint32_t va55 = abcd[0U]; uint32_t vb56 = abcd[1U]; @@ -962,11 +850,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti56 = _t[56U]; uint32_t v55 = - vb56 - + - ((va55 + (vc56 ^ (vb56 | ~vd56)) + xk55 + ti56) - << 6U - | (va55 + (vc56 ^ (vb56 | ~vd56)) + xk55 + ti56) >> 26U); + vb56 + + ((va55 + (vc56 ^ (vb56 | ~vd56)) + xk55 + ti56) << 6U | + (va55 + (vc56 ^ (vb56 | ~vd56)) + xk55 + ti56) >> 26U); abcd[0U] = v55; uint32_t va56 = abcd[3U]; uint32_t vb57 = abcd[0U]; @@ -978,11 +864,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti57 = _t[57U]; uint32_t v56 = - vb57 - + - ((va56 + (vc57 ^ (vb57 | ~vd57)) + xk56 + ti57) - << 10U - | (va56 + (vc57 ^ (vb57 | ~vd57)) + xk56 + ti57) >> 22U); + vb57 + + ((va56 + (vc57 ^ (vb57 | ~vd57)) + xk56 + ti57) << 10U | + (va56 + (vc57 ^ (vb57 | ~vd57)) + xk56 + ti57) >> 22U); abcd[3U] = v56; uint32_t va57 = abcd[2U]; uint32_t vb58 = abcd[3U]; @@ -994,11 +878,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti58 = _t[58U]; uint32_t v57 = - vb58 - + - ((va57 + (vc58 ^ (vb58 | ~vd58)) + xk57 + ti58) - << 15U - | (va57 + (vc58 ^ (vb58 | ~vd58)) + xk57 + ti58) >> 17U); + vb58 + + ((va57 + (vc58 ^ (vb58 | ~vd58)) + xk57 + ti58) << 15U | + (va57 + (vc58 ^ (vb58 | ~vd58)) + xk57 + ti58) >> 17U); abcd[2U] = v57; uint32_t va58 = abcd[1U]; uint32_t vb59 = abcd[2U]; @@ -1010,11 +892,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti59 = _t[59U]; uint32_t v58 = - vb59 - + - ((va58 + (vc59 ^ (vb59 | ~vd59)) + xk58 + ti59) - << 21U - | (va58 + (vc59 ^ (vb59 | ~vd59)) + xk58 + ti59) >> 11U); + vb59 + + ((va58 + (vc59 ^ (vb59 | ~vd59)) + xk58 + ti59) << 21U | + (va58 + (vc59 ^ (vb59 | ~vd59)) + xk58 + ti59) >> 11U); abcd[1U] = v58; uint32_t va59 = abcd[0U]; uint32_t vb60 = abcd[1U]; @@ -1026,11 +906,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti60 = _t[60U]; uint32_t v59 = - vb60 - + - ((va59 + (vc60 ^ (vb60 | ~vd60)) + xk59 + ti60) - << 6U - | (va59 + (vc60 ^ (vb60 | ~vd60)) + xk59 + ti60) >> 26U); + vb60 + + ((va59 + (vc60 ^ (vb60 | ~vd60)) + xk59 + ti60) << 6U | + (va59 + (vc60 ^ (vb60 | ~vd60)) + xk59 + ti60) >> 26U); abcd[0U] = v59; uint32_t va60 = abcd[3U]; uint32_t vb61 = abcd[0U]; @@ -1042,11 +920,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti61 = _t[61U]; uint32_t v60 = - vb61 - + - ((va60 + (vc61 ^ (vb61 | ~vd61)) + xk60 + ti61) - << 10U - | (va60 + (vc61 ^ (vb61 | ~vd61)) + xk60 + ti61) >> 22U); + vb61 + + ((va60 + (vc61 ^ (vb61 | ~vd61)) + xk60 + ti61) << 10U | + (va60 + (vc61 ^ (vb61 | ~vd61)) + xk60 + ti61) >> 22U); abcd[3U] = v60; uint32_t va61 = abcd[2U]; uint32_t vb62 = abcd[3U]; @@ -1058,11 +934,9 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti62 = _t[62U]; uint32_t v61 = - vb62 - + - ((va61 + (vc62 ^ (vb62 | ~vd62)) + xk61 + ti62) - << 15U - | (va61 + (vc62 ^ (vb62 | ~vd62)) + xk61 + ti62) >> 17U); + vb62 + + ((va61 + (vc62 ^ (vb62 | ~vd62)) + xk61 + ti62) << 15U | + (va61 + (vc62 ^ (vb62 | ~vd62)) + xk61 + ti62) >> 17U); abcd[2U] = v61; uint32_t va62 = abcd[1U]; uint32_t vb = abcd[2U]; @@ -1074,11 +948,8 @@ static void update(uint32_t *abcd, uint8_t *x) uint32_t ti = _t[63U]; uint32_t v62 = - vb - + - ((va62 + (vc ^ (vb | ~vd)) + xk62 + ti) - << 21U - | (va62 + (vc ^ (vb | ~vd)) + xk62 + ti) >> 11U); + vb + + ((va62 + (vc ^ (vb | ~vd)) + xk62 + ti) << 21U | (va62 + (vc ^ (vb | ~vd)) + xk62 + ti) >> 11U); abcd[1U] = v62; uint32_t a = abcd[0U]; uint32_t b = abcd[1U]; @@ -1282,8 +1153,7 @@ Hacl_Hash_MD5_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -1328,8 +1198,7 @@ Hacl_Hash_MD5_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t Hacl_Hash_MD5_update_multi(block_state1, data1, data1_len / 64U); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -1359,8 +1228,7 @@ Hacl_Hash_MD5_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state10, @@ -1403,8 +1271,7 @@ Hacl_Hash_MD5_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t Hacl_Hash_MD5_update_multi(block_state1, data1, data1_len / 64U); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, diff --git a/Modules/_hacl/Hacl_Hash_SHA1.c b/Modules/_hacl/Hacl_Hash_SHA1.c index 508e447bf275da..97bd4f2204cf24 100644 --- a/Modules/_hacl/Hacl_Hash_SHA1.c +++ b/Modules/_hacl/Hacl_Hash_SHA1.c @@ -315,8 +315,7 @@ Hacl_Hash_SHA1_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_ uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -361,8 +360,7 @@ Hacl_Hash_SHA1_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_ Hacl_Hash_SHA1_update_multi(block_state1, data1, data1_len / 64U); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -392,8 +390,7 @@ Hacl_Hash_SHA1_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_ uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state10, @@ -436,8 +433,7 @@ Hacl_Hash_SHA1_update(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_ Hacl_Hash_SHA1_update_multi(block_state1, data1, data1_len / 64U); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, diff --git a/Modules/_hacl/Hacl_Hash_SHA2.c b/Modules/_hacl/Hacl_Hash_SHA2.c index d612bafa72cdc4..d2ee0c9ef51721 100644 --- a/Modules/_hacl/Hacl_Hash_SHA2.c +++ b/Modules/_hacl/Hacl_Hash_SHA2.c @@ -100,15 +100,14 @@ static inline void sha256_update(uint8_t *b, uint32_t *hash) uint32_t k_e_t = k_t; uint32_t t1 = - h02 - + ((e0 << 26U | e0 >> 6U) ^ ((e0 << 21U | e0 >> 11U) ^ (e0 << 7U | e0 >> 25U))) - + ((e0 & f0) ^ (~e0 & g0)) + h02 + ((e0 << 26U | e0 >> 6U) ^ ((e0 << 21U | e0 >> 11U) ^ (e0 << 7U | e0 >> 25U))) + + ((e0 & f0) ^ (~e0 & g0)) + k_e_t + ws_t; uint32_t t2 = - ((a0 << 30U | a0 >> 2U) ^ ((a0 << 19U | a0 >> 13U) ^ (a0 << 10U | a0 >> 22U))) - + ((a0 & b0) ^ ((a0 & c0) ^ (b0 & c0))); + ((a0 << 30U | a0 >> 2U) ^ ((a0 << 19U | a0 >> 13U) ^ (a0 << 10U | a0 >> 22U))) + + ((a0 & b0) ^ ((a0 & c0) ^ (b0 & c0))); uint32_t a1 = t1 + t2; uint32_t b1 = a0; uint32_t c1 = b0; @@ -301,15 +300,14 @@ static inline void sha512_update(uint8_t *b, uint64_t *hash) uint64_t k_e_t = k_t; uint64_t t1 = - h02 - + ((e0 << 50U | e0 >> 14U) ^ ((e0 << 46U | e0 >> 18U) ^ (e0 << 23U | e0 >> 41U))) - + ((e0 & f0) ^ (~e0 & g0)) + h02 + ((e0 << 50U | e0 >> 14U) ^ ((e0 << 46U | e0 >> 18U) ^ (e0 << 23U | e0 >> 41U))) + + ((e0 & f0) ^ (~e0 & g0)) + k_e_t + ws_t; uint64_t t2 = - ((a0 << 36U | a0 >> 28U) ^ ((a0 << 30U | a0 >> 34U) ^ (a0 << 25U | a0 >> 39U))) - + ((a0 & b0) ^ ((a0 & c0) ^ (b0 & c0))); + ((a0 << 36U | a0 >> 28U) ^ ((a0 << 30U | a0 >> 34U) ^ (a0 << 25U | a0 >> 39U))) + + ((a0 & b0) ^ ((a0 & c0) ^ (b0 & c0))); uint64_t a1 = t1 + t2; uint64_t b1 = a0; uint64_t c1 = b0; @@ -639,8 +637,7 @@ update_224_256(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t chunk uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -685,8 +682,7 @@ update_224_256(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t chunk Hacl_Hash_SHA2_sha256_update_nblocks(data1_len / 64U * 64U, data1, block_state1); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -716,8 +712,7 @@ update_224_256(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t chunk uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state10, @@ -760,8 +755,7 @@ update_224_256(Hacl_Streaming_MD_state_32 *state, uint8_t *chunk, uint32_t chunk Hacl_Hash_SHA2_sha256_update_nblocks(data1_len / 64U * 64U, data1, block_state1); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_32){ .block_state = block_state1, @@ -1205,8 +1199,7 @@ update_384_512(Hacl_Streaming_MD_state_64 *state, uint8_t *chunk, uint32_t chunk uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Streaming_MD_state_64){ .block_state = block_state1, @@ -1251,8 +1244,7 @@ update_384_512(Hacl_Streaming_MD_state_64 *state, uint8_t *chunk, uint32_t chunk Hacl_Hash_SHA2_sha512_update_nblocks(data1_len / 128U * 128U, data1, block_state1); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_64){ .block_state = block_state1, @@ -1282,8 +1274,7 @@ update_384_512(Hacl_Streaming_MD_state_64 *state, uint8_t *chunk, uint32_t chunk uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Streaming_MD_state_64){ .block_state = block_state10, @@ -1326,8 +1317,7 @@ update_384_512(Hacl_Streaming_MD_state_64 *state, uint8_t *chunk, uint32_t chunk Hacl_Hash_SHA2_sha512_update_nblocks(data1_len / 128U * 128U, data1, block_state1); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_MD_state_64){ .block_state = block_state1, diff --git a/Modules/_hacl/Hacl_Hash_SHA3.c b/Modules/_hacl/Hacl_Hash_SHA3.c index 87638df9549fbb..466d2b96c0cdfa 100644 --- a/Modules/_hacl/Hacl_Hash_SHA3.c +++ b/Modules/_hacl/Hacl_Hash_SHA3.c @@ -866,8 +866,7 @@ Hacl_Hash_SHA3_update(Hacl_Hash_SHA3_state_t *state, uint8_t *chunk, uint32_t ch uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ((Hacl_Hash_SHA3_state_t){ .block_state = block_state1, .buf = buf, .total_len = total_len2 }); } else if (sz == 0U) @@ -910,8 +909,7 @@ Hacl_Hash_SHA3_update(Hacl_Hash_SHA3_state_t *state, uint8_t *chunk, uint32_t ch Hacl_Hash_SHA3_update_multi_sha3(a1, s2, data1, data1_len / block_len(a1)); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_SHA3_state_t){ .block_state = block_state1, @@ -941,8 +939,7 @@ Hacl_Hash_SHA3_update(Hacl_Hash_SHA3_state_t *state, uint8_t *chunk, uint32_t ch uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Hash_SHA3_state_t){ .block_state = block_state10, @@ -972,10 +969,8 @@ Hacl_Hash_SHA3_update(Hacl_Hash_SHA3_state_t *state, uint8_t *chunk, uint32_t ch uint32_t ite; if ( - (uint64_t)(chunk_len - diff) - % (uint64_t)block_len(i) - == 0ULL - && (uint64_t)(chunk_len - diff) > 0ULL + (uint64_t)(chunk_len - diff) % (uint64_t)block_len(i) == 0ULL && + (uint64_t)(chunk_len - diff) > 0ULL ) { ite = block_len(i); @@ -994,8 +989,7 @@ Hacl_Hash_SHA3_update(Hacl_Hash_SHA3_state_t *state, uint8_t *chunk, uint32_t ch Hacl_Hash_SHA3_update_multi_sha3(a1, s2, data1, data1_len / block_len(a1)); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Hash_SHA3_state_t){ .block_state = block_state1, @@ -2422,9 +2416,7 @@ Hacl_Hash_SHA3_shake128_squeeze_nblocks( 5U, 1U, _C[i] = - state[i - + 0U] - ^ (state[i + 5U] ^ (state[i + 10U] ^ (state[i + 15U] ^ state[i + 20U])));); + state[i + 0U] ^ (state[i + 5U] ^ (state[i + 10U] ^ (state[i + 15U] ^ state[i + 20U])));); KRML_MAYBE_FOR5(i2, 0U, 5U, diff --git a/Modules/_hacl/Hacl_Streaming_HMAC.c b/Modules/_hacl/Hacl_Streaming_HMAC.c index d28b39792af576..8dd7e2c0bf3e71 100644 --- a/Modules/_hacl/Hacl_Streaming_HMAC.c +++ b/Modules/_hacl/Hacl_Streaming_HMAC.c @@ -198,8 +198,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = ((Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_MD5_a, { .case_MD5_a = s1 } }); + st[0U] = ((Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_MD5_a, { .case_MD5_a = s1 } }); } if (st == NULL) { @@ -220,8 +219,8 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = ((Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA1_a, { .case_SHA1_a = s1 } }); + st[0U] = + ((Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA1_a, { .case_SHA1_a = s1 } }); } if (st == NULL) { @@ -242,8 +241,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA2_224_a, @@ -270,8 +268,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA2_256_a, @@ -298,8 +295,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA2_384_a, @@ -326,8 +322,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA2_512_a, @@ -354,8 +349,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA3_224_a, @@ -382,8 +376,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA3_256_a, @@ -410,8 +403,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA3_384_a, @@ -438,8 +430,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_SHA3_512_a, @@ -466,8 +457,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_Blake2S_a, @@ -495,8 +485,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_Blake2S_128_a, @@ -531,8 +520,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_Blake2B_a, @@ -560,8 +548,7 @@ static Hacl_Agile_Hash_state_s *malloc_(Hacl_Agile_Hash_impl a) *st = (Hacl_Agile_Hash_state_s *)KRML_HOST_MALLOC(sizeof (Hacl_Agile_Hash_state_s)); if (st != NULL) { - st[0U] - = + st[0U] = ( (Hacl_Agile_Hash_state_s){ .tag = Hacl_Agile_Hash_Blake2B_256_a, @@ -2059,8 +2046,8 @@ Hacl_Streaming_HMAC_update( Hacl_Streaming_HMAC_Definitions_index i1 = Hacl_Streaming_HMAC_index_of_state(block_state); if ( - (uint64_t)chunk_len - > max_input_len64(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - total_len + (uint64_t)chunk_len > + max_input_len64(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - total_len ) { return Hacl_Streaming_Types_MaximumLengthExceeded; @@ -2068,9 +2055,7 @@ Hacl_Streaming_HMAC_update( uint32_t sz; if ( - total_len - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - == 0ULL + total_len % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && total_len > 0ULL ) { @@ -2079,8 +2064,8 @@ Hacl_Streaming_HMAC_update( else { sz = - (uint32_t)(total_len - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)(total_len % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } if (chunk_len <= block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - sz) { @@ -2091,9 +2076,7 @@ Hacl_Streaming_HMAC_update( uint32_t sz1; if ( - total_len1 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - == 0ULL + total_len1 % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && total_len1 > 0ULL ) { @@ -2102,14 +2085,13 @@ Hacl_Streaming_HMAC_update( else { sz1 = - (uint32_t)(total_len1 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)(total_len1 % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } uint8_t *buf2 = buf + sz1; memcpy(buf2, chunk, chunk_len * sizeof (uint8_t)); uint64_t total_len2 = total_len1 + (uint64_t)chunk_len; - *state - = + *state = ( (Hacl_Streaming_HMAC_agile_state){ .block_state = block_state1, @@ -2127,9 +2109,7 @@ Hacl_Streaming_HMAC_update( uint32_t sz1; if ( - total_len1 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - == 0ULL + total_len1 % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && total_len1 > 0ULL ) { @@ -2138,8 +2118,8 @@ Hacl_Streaming_HMAC_update( else { sz1 = - (uint32_t)(total_len1 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)(total_len1 % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } if (!(sz1 == 0U)) { @@ -2153,8 +2133,8 @@ Hacl_Streaming_HMAC_update( uint32_t ite; if ( - (uint64_t)chunk_len - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) + (uint64_t)chunk_len % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && (uint64_t)chunk_len > 0ULL ) @@ -2164,8 +2144,8 @@ Hacl_Streaming_HMAC_update( else { ite = - (uint32_t)((uint64_t)chunk_len - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)((uint64_t)chunk_len % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } uint32_t n_blocks = (chunk_len - ite) / block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))); @@ -2178,8 +2158,7 @@ Hacl_Streaming_HMAC_update( update_multi(s11, total_len1, data1, data1_len); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_HMAC_agile_state){ .block_state = block_state1, @@ -2200,9 +2179,8 @@ Hacl_Streaming_HMAC_update( uint32_t sz10; if ( - total_len10 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - == 0ULL + total_len10 % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == + 0ULL && total_len10 > 0ULL ) { @@ -2211,14 +2189,13 @@ Hacl_Streaming_HMAC_update( else { sz10 = - (uint32_t)(total_len10 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)(total_len10 % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } uint8_t *buf2 = buf0 + sz10; memcpy(buf2, chunk1, diff * sizeof (uint8_t)); uint64_t total_len2 = total_len10 + (uint64_t)diff; - *state - = + *state = ( (Hacl_Streaming_HMAC_agile_state){ .block_state = block_state10, @@ -2233,9 +2210,7 @@ Hacl_Streaming_HMAC_update( uint32_t sz1; if ( - total_len1 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - == 0ULL + total_len1 % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && total_len1 > 0ULL ) { @@ -2244,8 +2219,8 @@ Hacl_Streaming_HMAC_update( else { sz1 = - (uint32_t)(total_len1 - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)(total_len1 % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } if (!(sz1 == 0U)) { @@ -2259,8 +2234,8 @@ Hacl_Streaming_HMAC_update( uint32_t ite; if ( - (uint64_t)(chunk_len - diff) - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) + (uint64_t)(chunk_len - diff) % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && (uint64_t)(chunk_len - diff) > 0ULL ) @@ -2270,13 +2245,12 @@ Hacl_Streaming_HMAC_update( else { ite = - (uint32_t)((uint64_t)(chunk_len - diff) - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)((uint64_t)(chunk_len - diff) % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } uint32_t n_blocks = - (chunk_len - diff - ite) - / block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))); + (chunk_len - diff - ite) / block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))); uint32_t data1_len = n_blocks * block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))); uint32_t data2_len = chunk_len - diff - data1_len; @@ -2286,8 +2260,7 @@ Hacl_Streaming_HMAC_update( update_multi(s11, total_len1, data1, data1_len); uint8_t *dst = buf; memcpy(dst, data2, data2_len * sizeof (uint8_t)); - *state - = + *state = ( (Hacl_Streaming_HMAC_agile_state){ .block_state = block_state1, @@ -2324,9 +2297,7 @@ Hacl_Streaming_HMAC_digest( uint32_t r; if ( - total_len - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) - == 0ULL + total_len % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1))) == 0ULL && total_len > 0ULL ) { @@ -2335,8 +2306,8 @@ Hacl_Streaming_HMAC_digest( else { r = - (uint32_t)(total_len - % (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); + (uint32_t)(total_len % + (uint64_t)block_len(alg_of_impl(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)))); } uint8_t *buf_1 = buf_; Hacl_Agile_Hash_state_s *s110 = malloc_(dfst__Hacl_Agile_Hash_impl_uint32_t(i1)); diff --git a/Modules/_hacl/Lib_Memzero0.c b/Modules/_hacl/Lib_Memzero0.c index 28abd1aa4e2d54..f94e0e2254a912 100644 --- a/Modules/_hacl/Lib_Memzero0.c +++ b/Modules/_hacl/Lib_Memzero0.c @@ -11,18 +11,18 @@ #if defined(__APPLE__) && defined(__MACH__) #include // memset_s is available from macOS 10.9, iOS 7, watchOS 2, and on all tvOS and visionOS versions. -# if (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && (MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9)) -# define APPLE_HAS_MEMSET_S 1 -# elif (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0)) -# define APPLE_HAS_MEMSET_S 1 +# if (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && defined(MAC_OS_X_VERSION_10_9) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9)) +# define APPLE_HAS_MEMSET_S +# elif (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_7_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0)) +# define APPLE_HAS_MEMSET_S # elif (defined(TARGET_OS_TV) && TARGET_OS_TV) -# define APPLE_HAS_MEMSET_S 1 -# elif (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && (__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_2_0)) -# define APPLE_HAS_MEMSET_S 1 +# define APPLE_HAS_MEMSET_S +# elif (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && defined(__WATCHOS_2_0) && (__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_2_0)) +# define APPLE_HAS_MEMSET_S # elif (defined(TARGET_OS_VISION) && TARGET_OS_VISION) -# define APPLE_HAS_MEMSET_S 1 +# define APPLE_HAS_MEMSET_S # else -# define APPLE_HAS_MEMSET_S 0 +# undef APPLE_HAS_MEMSET_S # endif #endif @@ -55,7 +55,7 @@ void Lib_Memzero0_memzero0(void *dst, uint64_t len) { #ifdef _WIN32 SecureZeroMemory(dst, len_); - #elif defined(__APPLE__) && defined(__MACH__) && APPLE_HAS_MEMSET_S + #elif defined(__APPLE__) && defined(__MACH__) && defined(APPLE_HAS_MEMSET_S) memset_s(dst, len_, 0, len_); #elif (defined(__linux__) && !defined(LINUX_NO_EXPLICIT_BZERO)) || defined(__FreeBSD__) || defined(__OpenBSD__) explicit_bzero(dst, len_); diff --git a/Modules/_hacl/include/krml/FStar_UInt128_Verified.h b/Modules/_hacl/include/krml/FStar_UInt128_Verified.h index d4a90220beafb5..f85982f33735d3 100644 --- a/Modules/_hacl/include/krml/FStar_UInt128_Verified.h +++ b/Modules/_hacl/include/krml/FStar_UInt128_Verified.h @@ -257,11 +257,11 @@ FStar_UInt128_gte_mask(FStar_UInt128_uint128 a, FStar_UInt128_uint128 b) { FStar_UInt128_uint128 lit; lit.low = - (FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high)) - | (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low)); + (FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high)) | + (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low)); lit.high = - (FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high)) - | (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low)); + (FStar_UInt64_gte_mask(a.high, b.high) & ~FStar_UInt64_eq_mask(a.high, b.high)) | + (FStar_UInt64_eq_mask(a.high, b.high) & FStar_UInt64_gte_mask(a.low, b.low)); return lit; } @@ -294,14 +294,12 @@ static inline FStar_UInt128_uint128 FStar_UInt128_mul32(uint64_t x, uint32_t y) { FStar_UInt128_uint128 lit; lit.low = - FStar_UInt128_u32_combine((x >> FStar_UInt128_u32_32) - * (uint64_t)y - + (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32), + FStar_UInt128_u32_combine((x >> FStar_UInt128_u32_32) * (uint64_t)y + + (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32), FStar_UInt128_u64_mod_32(FStar_UInt128_u64_mod_32(x) * (uint64_t)y)); lit.high = - ((x >> FStar_UInt128_u32_32) - * (uint64_t)y - + (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32)) + ((x >> FStar_UInt128_u32_32) * (uint64_t)y + + (FStar_UInt128_u64_mod_32(x) * (uint64_t)y >> FStar_UInt128_u32_32)) >> FStar_UInt128_u32_32; return lit; } @@ -315,28 +313,19 @@ static inline FStar_UInt128_uint128 FStar_UInt128_mul_wide(uint64_t x, uint64_t { FStar_UInt128_uint128 lit; lit.low = - FStar_UInt128_u32_combine_(FStar_UInt128_u64_mod_32(x) - * (y >> FStar_UInt128_u32_32) - + - FStar_UInt128_u64_mod_32((x >> FStar_UInt128_u32_32) - * FStar_UInt128_u64_mod_32(y) - + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)), + FStar_UInt128_u32_combine_(FStar_UInt128_u64_mod_32(x) * (y >> FStar_UInt128_u32_32) + + FStar_UInt128_u64_mod_32((x >> FStar_UInt128_u32_32) * FStar_UInt128_u64_mod_32(y) + + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)), FStar_UInt128_u64_mod_32(FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y))); lit.high = - (x >> FStar_UInt128_u32_32) - * (y >> FStar_UInt128_u32_32) - + - (((x >> FStar_UInt128_u32_32) - * FStar_UInt128_u64_mod_32(y) - + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)) + (x >> FStar_UInt128_u32_32) * (y >> FStar_UInt128_u32_32) + + (((x >> FStar_UInt128_u32_32) * FStar_UInt128_u64_mod_32(y) + + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32)) >> FStar_UInt128_u32_32) + - ((FStar_UInt128_u64_mod_32(x) - * (y >> FStar_UInt128_u32_32) - + - FStar_UInt128_u64_mod_32((x >> FStar_UInt128_u32_32) - * FStar_UInt128_u64_mod_32(y) - + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32))) + ((FStar_UInt128_u64_mod_32(x) * (y >> FStar_UInt128_u32_32) + + FStar_UInt128_u64_mod_32((x >> FStar_UInt128_u32_32) * FStar_UInt128_u64_mod_32(y) + + (FStar_UInt128_u64_mod_32(x) * FStar_UInt128_u64_mod_32(y) >> FStar_UInt128_u32_32))) >> FStar_UInt128_u32_32); return lit; } diff --git a/Modules/_hacl/refresh.sh b/Modules/_hacl/refresh.sh index d91650b44bb4e7..a6776282423b95 100755 --- a/Modules/_hacl/refresh.sh +++ b/Modules/_hacl/refresh.sh @@ -22,7 +22,7 @@ fi # Update this when updating to a new version after verifying that the changes # the update brings in are good. -expected_hacl_star_rev=7720f6d4fc0468a99d5ea6120976bcc271e42727 +expected_hacl_star_rev=4ef25b547b377dcef855db4289c6a00580e7221c hacl_dir="$(realpath "$1")" cd "$(dirname "$0")" From dda5dc5f06871e871deb322318de7b4a50589baa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 14:26:37 +0200 Subject: [PATCH 0109/1674] [3.14] gh-132388: test HACL* and OpenSSL hash functions in pure Python HMAC (GH-134051) (#134089) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-132388: test HACL* and OpenSSL hash functions in pure Python HMAC (GH-134051) (cherry picked from commit 73d71a416fb05b64c2b43fade5d781a1fa0cb2cd) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/support/hashlib_helper.py | 221 ++++++++++++++++++++++++++++- Lib/test/test_hmac.py | 154 ++++++++++++-------- 2 files changed, 308 insertions(+), 67 deletions(-) diff --git a/Lib/test/support/hashlib_helper.py b/Lib/test/support/hashlib_helper.py index 5043f08dd93de6..7032257b06877a 100644 --- a/Lib/test/support/hashlib_helper.py +++ b/Lib/test/support/hashlib_helper.py @@ -23,6 +23,22 @@ def requires_builtin_hmac(): return unittest.skipIf(_hmac is None, "requires _hmac") +def _missing_hash(digestname, implementation=None, *, exc=None): + parts = ["missing", implementation, f"hash algorithm: {digestname!r}"] + msg = " ".join(filter(None, parts)) + raise unittest.SkipTest(msg) from exc + + +def _openssl_availabillity(digestname, *, usedforsecurity): + try: + _hashlib.new(digestname, usedforsecurity=usedforsecurity) + except AttributeError: + assert _hashlib is None + _missing_hash(digestname, "OpenSSL") + except ValueError as exc: + _missing_hash(digestname, "OpenSSL", exc=exc) + + def _decorate_func_or_class(func_or_class, decorator_func): if not isinstance(func_or_class, type): return decorator_func(func_or_class) @@ -71,8 +87,7 @@ def wrapper(*args, **kwargs): try: test_availability() except ValueError as exc: - msg = f"missing hash algorithm: {digestname!r}" - raise unittest.SkipTest(msg) from exc + _missing_hash(digestname, exc=exc) return func(*args, **kwargs) return wrapper @@ -87,14 +102,44 @@ def requires_openssl_hashdigest(digestname, *, usedforsecurity=True): The hashing algorithm may be missing or blocked by a strict crypto policy. """ def decorator_func(func): - @requires_hashlib() + @requires_hashlib() # avoid checking at each call @functools.wraps(func) def wrapper(*args, **kwargs): + _openssl_availabillity(digestname, usedforsecurity=usedforsecurity) + return func(*args, **kwargs) + return wrapper + + def decorator(func_or_class): + return _decorate_func_or_class(func_or_class, decorator_func) + return decorator + + +def find_openssl_hashdigest_constructor(digestname, *, usedforsecurity=True): + """Find the OpenSSL hash function constructor by its name.""" + assert isinstance(digestname, str), digestname + _openssl_availabillity(digestname, usedforsecurity=usedforsecurity) + # This returns a function of the form _hashlib.openssl_ and + # not a lambda function as it is rejected by _hashlib.hmac_new(). + return getattr(_hashlib, f"openssl_{digestname}") + + +def requires_builtin_hashdigest( + module_name, digestname, *, usedforsecurity=True +): + """Decorator raising SkipTest if a HACL* hashing algorithm is missing. + + - The *module_name* is the C extension module name based on HACL*. + - The *digestname* is one of its member, e.g., 'md5'. + """ + def decorator_func(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + module = import_module(module_name) try: - _hashlib.new(digestname, usedforsecurity=usedforsecurity) - except ValueError: - msg = f"missing OpenSSL hash algorithm: {digestname!r}" - raise unittest.SkipTest(msg) + getattr(module, digestname) + except AttributeError: + fullname = f'{module_name}.{digestname}' + _missing_hash(fullname, implementation="HACL") return func(*args, **kwargs) return wrapper @@ -103,6 +148,168 @@ def decorator(func_or_class): return decorator +def find_builtin_hashdigest_constructor( + module_name, digestname, *, usedforsecurity=True +): + """Find the HACL* hash function constructor. + + - The *module_name* is the C extension module name based on HACL*. + - The *digestname* is one of its member, e.g., 'md5'. + """ + module = import_module(module_name) + try: + constructor = getattr(module, digestname) + constructor(b'', usedforsecurity=usedforsecurity) + except (AttributeError, TypeError, ValueError): + _missing_hash(f'{module_name}.{digestname}', implementation="HACL") + return constructor + + +class HashFunctionsTrait: + """Mixin trait class containing hash functions. + + This class is assumed to have all unitest.TestCase methods but should + not directly inherit from it to prevent the test suite being run on it. + + Subclasses should implement the hash functions by returning an object + that can be recognized as a valid digestmod parameter for both hashlib + and HMAC. In particular, it cannot be a lambda function as it will not + be recognized by hashlib (it will still be accepted by the pure Python + implementation of HMAC). + """ + + ALGORITHMS = [ + 'md5', 'sha1', + 'sha224', 'sha256', 'sha384', 'sha512', + 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + ] + + # Default 'usedforsecurity' to use when looking up a hash function. + usedforsecurity = True + + def _find_constructor(self, name): + # By default, a missing algorithm skips the test that uses it. + self.assertIn(name, self.ALGORITHMS) + self.skipTest(f"missing hash function: {name}") + + @property + def md5(self): + return self._find_constructor("md5") + + @property + def sha1(self): + return self._find_constructor("sha1") + + @property + def sha224(self): + return self._find_constructor("sha224") + + @property + def sha256(self): + return self._find_constructor("sha256") + + @property + def sha384(self): + return self._find_constructor("sha384") + + @property + def sha512(self): + return self._find_constructor("sha512") + + @property + def sha3_224(self): + return self._find_constructor("sha3_224") + + @property + def sha3_256(self): + return self._find_constructor("sha3_256") + + @property + def sha3_384(self): + return self._find_constructor("sha3_384") + + @property + def sha3_512(self): + return self._find_constructor("sha3_512") + + +class NamedHashFunctionsTrait(HashFunctionsTrait): + """Trait containing named hash functions. + + Hash functions are available if and only if they are available in hashlib. + """ + + def _find_constructor(self, name): + self.assertIn(name, self.ALGORITHMS) + return name + + +class OpenSSLHashFunctionsTrait(HashFunctionsTrait): + """Trait containing OpenSSL hash functions. + + Hash functions are available if and only if they are available in _hashlib. + """ + + def _find_constructor(self, name): + self.assertIn(name, self.ALGORITHMS) + return find_openssl_hashdigest_constructor( + name, usedforsecurity=self.usedforsecurity + ) + + +class BuiltinHashFunctionsTrait(HashFunctionsTrait): + """Trait containing HACL* hash functions. + + Hash functions are available if and only if they are available in C. + In particular, HACL* HMAC-MD5 may be available even though HACL* md5 + is not since the former is unconditionally built. + """ + + def _find_constructor_in(self, module, name): + self.assertIn(name, self.ALGORITHMS) + return find_builtin_hashdigest_constructor(module, name) + + @property + def md5(self): + return self._find_constructor_in("_md5", "md5") + + @property + def sha1(self): + return self._find_constructor_in("_sha1", "sha1") + + @property + def sha224(self): + return self._find_constructor_in("_sha2", "sha224") + + @property + def sha256(self): + return self._find_constructor_in("_sha2", "sha256") + + @property + def sha384(self): + return self._find_constructor_in("_sha2", "sha384") + + @property + def sha512(self): + return self._find_constructor_in("_sha2", "sha512") + + @property + def sha3_224(self): + return self._find_constructor_in("_sha3", "sha3_224") + + @property + def sha3_256(self): + return self._find_constructor_in("_sha3","sha3_256") + + @property + def sha3_384(self): + return self._find_constructor_in("_sha3","sha3_384") + + @property + def sha3_512(self): + return self._find_constructor_in("_sha3","sha3_512") + + def find_gil_minsize(modules_names, default=2048): """Get the largest GIL_MINSIZE value for the given cryptographic modules. diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 70c7943772249e..e898644dd8a552 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -1,8 +1,27 @@ +"""Test suite for HMAC. + +Python provides three different implementations of HMAC: + +- OpenSSL HMAC using OpenSSL hash functions. +- HACL* HMAC using HACL* hash functions. +- Generic Python HMAC using user-defined hash functions. + +The generic Python HMAC implementation is able to use OpenSSL +callables or names, HACL* named hash functions or arbitrary +objects implementing PEP 247 interface. + +In the two first cases, Python HMAC wraps a C HMAC object (either OpenSSL +or HACL*-based). As a last resort, HMAC is re-implemented in pure Python. +It is however interesting to test the pure Python implementation against +the OpenSSL and HACL* hash functions. +""" + import binascii import functools import hmac import hashlib import random +import test.support import test.support.hashlib_helper as hashlib_helper import types import unittest @@ -10,6 +29,12 @@ import warnings from _operator import _compare_digest as operator_compare_digest from test.support import check_disallow_instantiation +from test.support.hashlib_helper import ( + BuiltinHashFunctionsTrait, + HashFunctionsTrait, + NamedHashFunctionsTrait, + OpenSSLHashFunctionsTrait, +) from test.support.import_helper import import_fresh_module, import_module try: @@ -382,50 +407,7 @@ class BuiltinAssertersMixin(ThroughBuiltinAPIMixin, AssertersMixin): pass -class HashFunctionsTrait: - """Trait class for 'hashfunc' in hmac_new() and hmac_digest().""" - - ALGORITHMS = [ - 'md5', 'sha1', - 'sha224', 'sha256', 'sha384', 'sha512', - 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', - ] - - # By default, a missing algorithm skips the test that uses it. - _ = property(lambda self: self.skipTest("missing hash function")) - md5 = sha1 = _ - sha224 = sha256 = sha384 = sha512 = _ - sha3_224 = sha3_256 = sha3_384 = sha3_512 = _ - del _ - - -class WithOpenSSLHashFunctions(HashFunctionsTrait): - """Test a HMAC implementation with an OpenSSL-based callable 'hashfunc'.""" - - @classmethod - def setUpClass(cls): - super().setUpClass() - - for name in cls.ALGORITHMS: - @property - @hashlib_helper.requires_openssl_hashdigest(name) - def func(self, *, __name=name): # __name needed to bind 'name' - return getattr(_hashlib, f'openssl_{__name}') - setattr(cls, name, func) - - -class WithNamedHashFunctions(HashFunctionsTrait): - """Test a HMAC implementation with a named 'hashfunc'.""" - - @classmethod - def setUpClass(cls): - super().setUpClass() - - for name in cls.ALGORITHMS: - setattr(cls, name, name) - - -class RFCTestCaseMixin(AssertersMixin, HashFunctionsTrait): +class RFCTestCaseMixin(HashFunctionsTrait, AssertersMixin): """Test HMAC implementations against RFC 2202/4231 and NIST test vectors. - Test vectors for MD5 and SHA-1 are taken from RFC 2202. @@ -739,26 +721,83 @@ def test_sha3_512_nist(self): ) -class PyRFCTestCase(ThroughObjectMixin, PyAssertersMixin, - WithOpenSSLHashFunctions, RFCTestCaseMixin, - unittest.TestCase): +class PurePythonInitHMAC(PyModuleMixin, HashFunctionsTrait): + + @classmethod + def setUpClass(cls): + super().setUpClass() + for meth in ['_init_openssl_hmac', '_init_builtin_hmac']: + fn = getattr(cls.hmac.HMAC, meth) + cm = mock.patch.object(cls.hmac.HMAC, meth, autospec=True, wraps=fn) + cls.enterClassContext(cm) + + @classmethod + def tearDownClass(cls): + cls.hmac.HMAC._init_openssl_hmac.assert_not_called() + cls.hmac.HMAC._init_builtin_hmac.assert_not_called() + # Do not assert that HMAC._init_old() has been called as it's tricky + # to determine whether a test for a specific hash function has been + # executed or not. On regular builds, it will be called but if a + # hash function is not available, it's hard to detect for which + # test we should checj HMAC._init_old() or not. + super().tearDownClass() + + +class PyRFCOpenSSLTestCase(ThroughObjectMixin, + PyAssertersMixin, + OpenSSLHashFunctionsTrait, + RFCTestCaseMixin, + PurePythonInitHMAC, + unittest.TestCase): """Python implementation of HMAC using hmac.HMAC(). - The underlying hash functions are OpenSSL-based. + The underlying hash functions are OpenSSL-based but + _init_old() is used instead of _init_openssl_hmac(). """ -class PyDotNewRFCTestCase(ThroughModuleAPIMixin, PyAssertersMixin, - WithOpenSSLHashFunctions, RFCTestCaseMixin, - unittest.TestCase): +class PyRFCBuiltinTestCase(ThroughObjectMixin, + PyAssertersMixin, + BuiltinHashFunctionsTrait, + RFCTestCaseMixin, + PurePythonInitHMAC, + unittest.TestCase): + """Python implementation of HMAC using hmac.HMAC(). + + The underlying hash functions are HACL*-based but + _init_old() is used instead of _init_builtin_hmac(). + """ + + +class PyDotNewOpenSSLRFCTestCase(ThroughModuleAPIMixin, + PyAssertersMixin, + OpenSSLHashFunctionsTrait, + RFCTestCaseMixin, + PurePythonInitHMAC, + unittest.TestCase): + """Python implementation of HMAC using hmac.new(). + + The underlying hash functions are OpenSSL-based but + _init_old() is used instead of _init_openssl_hmac(). + """ + + +class PyDotNewBuiltinRFCTestCase(ThroughModuleAPIMixin, + PyAssertersMixin, + BuiltinHashFunctionsTrait, + RFCTestCaseMixin, + PurePythonInitHMAC, + unittest.TestCase): """Python implementation of HMAC using hmac.new(). - The underlying hash functions are OpenSSL-based. + The underlying hash functions are HACL-based but + _init_old() is used instead of _init_openssl_hmac(). """ class OpenSSLRFCTestCase(OpenSSLAssertersMixin, - WithOpenSSLHashFunctions, RFCTestCaseMixin, + OpenSSLHashFunctionsTrait, + RFCTestCaseMixin, unittest.TestCase): """OpenSSL implementation of HMAC. @@ -767,7 +806,8 @@ class OpenSSLRFCTestCase(OpenSSLAssertersMixin, class BuiltinRFCTestCase(BuiltinAssertersMixin, - WithNamedHashFunctions, RFCTestCaseMixin, + NamedHashFunctionsTrait, + RFCTestCaseMixin, unittest.TestCase): """Built-in HACL* implementation of HMAC. @@ -784,12 +824,6 @@ def assert_hmac_extra_cases( self.check_hmac_hexdigest(key, msg, hexdigest, digest_size, func) -# TODO(picnixz): once we have a HACL* HMAC, we should also test the Python -# implementation of HMAC with a HACL*-based hash function. For now, we only -# test it partially via the '_sha2' module, but for completeness we could -# also test the RFC test vectors against all possible implementations. - - class DigestModTestCaseMixin(CreatorMixin, DigestMixin): """Tests for the 'digestmod' parameter for hmac_new() and hmac_digest().""" From fe5636ea96b25635a657b281f0148a0533ec1caf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 14:29:40 +0200 Subject: [PATCH 0110/1674] [3.14] gh-124210: Add introduction to `threading` docs (GH-127046) (#134090) Co-authored-by: Semyon Moroz Co-authored-by: Peter Bierma --- Doc/library/threading.rst | 114 +++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 25 deletions(-) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 249c0a5cb035c3..7edcdcabdce1df 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -11,6 +11,52 @@ This module constructs higher-level threading interfaces on top of the lower level :mod:`_thread` module. +.. include:: ../includes/wasm-notavail.rst + +Introduction +------------ + +The :mod:`!threading` module provides a way to run multiple `threads +`_ (smaller +units of a process) concurrently within a single process. It allows for the +creation and management of threads, making it possible to execute tasks in +parallel, sharing memory space. Threads are particularly useful when tasks are +I/O bound, such as file operations or making network requests, +where much of the time is spent waiting for external resources. + +A typical use case for :mod:`!threading` includes managing a pool of worker +threads that can process multiple tasks concurrently. Here's a basic example of +creating and starting threads using :class:`~threading.Thread`:: + + import threading + import time + + def crawl(link, delay=3): + print(f"crawl started for {link}") + time.sleep(delay) # Blocking I/O (simulating a network request) + print(f"crawl ended for {link}") + + links = [ + "https://python.org", + "https://docs.python.org", + "https://peps.python.org", + ] + + # Start threads for each link + threads = [] + for link in links: + # Using `args` to pass positional arguments and `kwargs` for keyword arguments + t = threading.Thread(target=crawl, args=(link,), kwargs={"delay": 2}) + threads.append(t) + + # Start each thread + for t in threads: + t.start() + + # Wait for all threads to finish + for t in threads: + t.join() + .. versionchanged:: 3.7 This module used to be optional, it is now always available. @@ -45,7 +91,25 @@ level :mod:`_thread` module. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously. -.. include:: ../includes/wasm-notavail.rst +GIL and performance considerations +---------------------------------- + +Unlike the :mod:`multiprocessing` module, which uses separate processes to +bypass the :term:`global interpreter lock` (GIL), the threading module operates +within a single process, meaning that all threads share the same memory space. +However, the GIL limits the performance gains of threading when it comes to +CPU-bound tasks, as only one thread can execute Python bytecode at a time. +Despite this, threads remain a useful tool for achieving concurrency in many +scenarios. + +As of Python 3.13, experimental :term:`free-threaded ` builds +can disable the GIL, enabling true parallel execution of threads, but this +feature is not available by default (see :pep:`703`). + +.. TODO: At some point this feature will become available by default. + +Reference +--------- This module defines the following functions: @@ -62,7 +126,7 @@ This module defines the following functions: Return the current :class:`Thread` object, corresponding to the caller's thread of control. If the caller's thread of control was not created through the - :mod:`threading` module, a dummy thread object with limited functionality is + :mod:`!threading` module, a dummy thread object with limited functionality is returned. The function ``currentThread`` is a deprecated alias for this function. @@ -157,13 +221,13 @@ This module defines the following functions: .. index:: single: trace function - Set a trace function for all threads started from the :mod:`threading` module. + Set a trace function for all threads started from the :mod:`!threading` module. The *func* will be passed to :func:`sys.settrace` for each thread, before its :meth:`~Thread.run` method is called. .. function:: settrace_all_threads(func) - Set a trace function for all threads started from the :mod:`threading` module + Set a trace function for all threads started from the :mod:`!threading` module and all Python threads that are currently executing. The *func* will be passed to :func:`sys.settrace` for each thread, before its @@ -186,13 +250,13 @@ This module defines the following functions: .. index:: single: profile function - Set a profile function for all threads started from the :mod:`threading` module. + Set a profile function for all threads started from the :mod:`!threading` module. The *func* will be passed to :func:`sys.setprofile` for each thread, before its :meth:`~Thread.run` method is called. .. function:: setprofile_all_threads(func) - Set a profile function for all threads started from the :mod:`threading` module + Set a profile function for all threads started from the :mod:`!threading` module and all Python threads that are currently executing. The *func* will be passed to :func:`sys.setprofile` for each thread, before its @@ -257,8 +321,8 @@ when implemented, are mapped to module-level functions. All of the methods described below are executed atomically. -Thread-Local Data ------------------ +Thread-local data +^^^^^^^^^^^^^^^^^ Thread-local data is data whose values are thread specific. If you have data that you want to be local to a thread, create a @@ -389,8 +453,8 @@ affects what we see:: .. _thread-objects: -Thread Objects --------------- +Thread objects +^^^^^^^^^^^^^^ The :class:`Thread` class represents an activity that is run in a separate thread of control. There are two ways to specify the activity: by passing a @@ -645,8 +709,8 @@ since it is impossible to detect the termination of alien threads. .. _lock-objects: -Lock Objects ------------- +Lock objects +^^^^^^^^^^^^ A primitive lock is a synchronization primitive that is not owned by a particular thread when locked. In Python, it is currently the lowest level @@ -738,8 +802,8 @@ All methods are executed atomically. .. _rlock-objects: -RLock Objects -------------- +RLock objects +^^^^^^^^^^^^^ A reentrant lock is a synchronization primitive that may be acquired multiple times by the same thread. Internally, it uses the concepts of "owning thread" @@ -848,8 +912,8 @@ call release as many times the lock has been acquired can lead to deadlock. .. _condition-objects: -Condition Objects ------------------ +Condition objects +^^^^^^^^^^^^^^^^^ A condition variable is always associated with some kind of lock; this can be passed in or one will be created by default. Passing one in is useful when @@ -1026,8 +1090,8 @@ item to the buffer only needs to wake up one consumer thread. .. _semaphore-objects: -Semaphore Objects ------------------ +Semaphore objects +^^^^^^^^^^^^^^^^^ This is one of the oldest synchronization primitives in the history of computer science, invented by the early Dutch computer scientist Edsger W. Dijkstra (he @@ -1107,7 +1171,7 @@ Semaphores also support the :ref:`context management protocol `. .. _semaphore-examples: -:class:`Semaphore` Example +:class:`Semaphore` example ^^^^^^^^^^^^^^^^^^^^^^^^^^ Semaphores are often used to guard resources with limited capacity, for example, @@ -1135,8 +1199,8 @@ causes the semaphore to be released more than it's acquired will go undetected. .. _event-objects: -Event Objects -------------- +Event objects +^^^^^^^^^^^^^ This is one of the simplest mechanisms for communication between threads: one thread signals an event and other threads wait for it. @@ -1192,8 +1256,8 @@ method. The :meth:`~Event.wait` method blocks until the flag is true. .. _timer-objects: -Timer Objects -------------- +Timer objects +^^^^^^^^^^^^^ This class represents an action that should be run only after a certain amount of time has passed --- a timer. :class:`Timer` is a subclass of :class:`Thread` @@ -1230,8 +1294,8 @@ For example:: only work if the timer is still in its waiting stage. -Barrier Objects ---------------- +Barrier objects +^^^^^^^^^^^^^^^ .. versionadded:: 3.2 From 2d00484f30a7189bd0e2a4c9b3df7a10173ab72c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 17:37:01 +0200 Subject: [PATCH 0111/1674] [3.14] gh-133515: fix docs for unawaited coroutines in debug mode (GH-134081) (#134093) gh-133515: fix docs for unawaited coroutines in debug mode (GH-134081) (cherry picked from commit d94b1e9cac82143048031530e6c51e59f597bccd) Co-authored-by: Kumar Aditya --- Doc/library/asyncio-dev.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index 44b507a9811116..7831b613bd4a60 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -46,10 +46,6 @@ In addition to enabling the debug mode, consider also: When the debug mode is enabled: -* asyncio checks for :ref:`coroutines that were not awaited - ` and logs them; this mitigates - the "forgotten await" pitfall. - * Many non-threadsafe asyncio APIs (such as :meth:`loop.call_soon` and :meth:`loop.call_at` methods) raise an exception if they are called from a wrong thread. From c8dcde4d5e34893b2017dee6ee50db641514ef34 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 21:20:47 +0200 Subject: [PATCH 0112/1674] [3.14] gh-133286: add explanation about `seq` for pathlib Pattern Language (GH-133340) (#134105) gh-133286: add explanation about `seq` for pathlib Pattern Language (GH-133340) (cherry picked from commit ac8df4b5892d2e4bd99731e7d87223a35c238f81) Co-authored-by: alexey semenyuk --- Doc/library/pathlib.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 7d7692dea5c38c..86351e65dc4ed6 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1781,9 +1781,12 @@ The following wildcards are supported in patterns for ``?`` Matches one non-separator character. ``[seq]`` - Matches one character in *seq*. + Matches one character in *seq*, where *seq* is a sequence of characters. + Range expressions are supported; for example, ``[a-z]`` matches any lowercase ASCII letter. + Multiple ranges can be combined: ``[a-zA-Z0-9_]`` matches any ASCII letter, digit, or underscore. + ``[!seq]`` - Matches one character not in *seq*. + Matches one character not in *seq*, where *seq* follows the same rules as above. For a literal match, wrap the meta-characters in brackets. For example, ``"[?]"`` matches the character ``"?"``. From 7a5851dc902a86d76c194caede9c24e98ec70a37 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 21:23:52 +0200 Subject: [PATCH 0113/1674] [3.14] gh-117026: Remove outdated sentence in SimpleHTTPRequestHandler docs (GH-117027) (GH-134107) The code was changed in 0f7cddc308b297e6a1c2dd61503acea38401656f (bpo-839496/gh-39531). (cherry picked from commit ea2d707bd59963bd4f53407108026930ff12ae56) Co-authored-by: Saleh Dehqanpour --- Doc/library/http.server.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 54df4a7e804d50..02016c789b24b4 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -429,8 +429,7 @@ instantiation, of which this module provides three different variants: ``'Last-Modified:'`` header with the file's modification time. Then follows a blank line signifying the end of the headers, and then the - contents of the file are output. If the file's MIME type starts with - ``text/`` the file is opened in text mode; otherwise binary mode is used. + contents of the file are output. For example usage, see the implementation of the ``test`` function in :source:`Lib/http/server.py`. From f89323236f4669a5b66ed0e8b2f584cb0cb27232 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 May 2025 22:56:24 +0200 Subject: [PATCH 0114/1674] [3.14] gh-134109: Fix showing comments in pydoc output for argparse (GH-134110) (GH-134112) Comments immediately preceding the object's source code are used if the object has no docstring. Comments that do not describe the object should be separated from the following source code by an empty line. (cherry picked from commit 71cf4dd622832848cace358a7f8444243afd2e83) Co-authored-by: Serhiy Storchaka --- Lib/argparse.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Lib/argparse.py b/Lib/argparse.py index f688c38d0d1ae5..d1a6350c3fda6d 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -205,6 +205,7 @@ def _set_color(self, color): # =============================== # Section and indentation methods # =============================== + def _indent(self): self._current_indent += self._indent_increment self._level += 1 @@ -256,6 +257,7 @@ def _add_item(self, func, args): # ======================== # Message building methods # ======================== + def start_section(self, heading): self._indent() section = self._Section(self, self._current_section, heading) @@ -299,6 +301,7 @@ def add_arguments(self, actions): # ======================= # Help-formatting methods # ======================= + def format_help(self): help = self._root_section.format_help() if help: @@ -1467,6 +1470,7 @@ def __init__(self, # ==================== # Registration methods # ==================== + def register(self, registry_name, value, object): registry = self._registries.setdefault(registry_name, {}) registry[value] = object @@ -1477,6 +1481,7 @@ def _registry_get(self, registry_name, value, default=None): # ================================== # Namespace default accessor methods # ================================== + def set_defaults(self, **kwargs): self._defaults.update(kwargs) @@ -1496,6 +1501,7 @@ def get_default(self, dest): # ======================= # Adding argument actions # ======================= + def add_argument(self, *args, **kwargs): """ add_argument(dest, ..., name=value, ...) @@ -1921,6 +1927,7 @@ def identity(string): # ======================= # Pretty __repr__ methods # ======================= + def _get_kwargs(self): names = [ 'prog', @@ -1935,6 +1942,7 @@ def _get_kwargs(self): # ================================== # Optional/Positional adding methods # ================================== + def add_subparsers(self, **kwargs): if self._subparsers is not None: raise ValueError('cannot have multiple subparser arguments') @@ -1988,6 +1996,7 @@ def _get_positional_actions(self): # ===================================== # Command line argument parsing methods # ===================================== + def parse_args(self, args=None, namespace=None): args, argv = self.parse_known_args(args, namespace) if argv: @@ -2582,6 +2591,7 @@ def parse_known_intermixed_args(self, args=None, namespace=None): # ======================== # Value conversion methods # ======================== + def _get_values(self, action, arg_strings): # optional argument produces a default when not present if not arg_strings and action.nargs == OPTIONAL: @@ -2681,6 +2691,7 @@ def _check_value(self, action, value): # ======================= # Help-formatting methods # ======================= + def format_usage(self): formatter = self._get_formatter() formatter.add_usage(self.usage, self._actions, @@ -2718,6 +2729,7 @@ def _get_formatter(self): # ===================== # Help-printing methods # ===================== + def print_usage(self, file=None): if file is None: file = _sys.stdout @@ -2739,6 +2751,7 @@ def _print_message(self, message, file=None): # =============== # Exiting methods # =============== + def exit(self, status=0, message=None): if message: self._print_message(message, _sys.stderr) From 5cdad8c90caa4efbd7846764a37d08402cd5812c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 09:27:38 +0200 Subject: [PATCH 0115/1674] [3.14] gh-133889: Improve tests for SimpleHTTPRequestHandler (GH-134102) (GH-134121) (cherry picked from commit fcaf009907fc39d604907315155c1f1de811dd88) Co-authored-by: Serhiy Storchaka --- Lib/test/test_httpservers.py | 140 ++++++++++++++++++++++++----------- 1 file changed, 98 insertions(+), 42 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 2cafa4e45a1313..4cb78c87ea7670 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -522,34 +522,111 @@ def close_conn(): reader.close() return body + def check_list_dir_dirname(self, dirname, quotedname=None): + fullpath = os.path.join(self.tempdir, dirname) + try: + os.mkdir(os.path.join(self.tempdir, dirname)) + except (OSError, UnicodeEncodeError): + self.skipTest(f'Can not create directory {dirname!a} ' + f'on current file system') + + if quotedname is None: + quotedname = urllib.parse.quote(dirname, errors='surrogatepass') + response = self.request(self.base_url + '/' + quotedname + '/') + body = self.check_status_and_reason(response, HTTPStatus.OK) + displaypath = html.escape(f'{self.base_url}/{dirname}/', quote=False) + enc = sys.getfilesystemencoding() + prefix = f'listing for {displaypath}', body) + self.assertIn(prefix + b'h1>', body) + + def check_list_dir_filename(self, filename): + fullpath = os.path.join(self.tempdir, filename) + content = ascii(fullpath).encode() + (os_helper.TESTFN_UNDECODABLE or b'\xff') + try: + with open(fullpath, 'wb') as f: + f.write(content) + except OSError: + self.skipTest(f'Can not create file {filename!a} ' + f'on current file system') + + response = self.request(self.base_url + '/') + body = self.check_status_and_reason(response, HTTPStatus.OK) + quotedname = urllib.parse.quote(filename, errors='surrogatepass') + enc = response.headers.get_content_charset() + self.assertIsNotNone(enc) + self.assertIn((f'href="{quotedname}"').encode('ascii'), body) + displayname = html.escape(filename, quote=False) + self.assertIn(f'>{displayname}<'.encode(enc, 'surrogateescape'), body) + + response = self.request(self.base_url + '/' + quotedname) + self.check_status_and_reason(response, HTTPStatus.OK, data=content) + + @unittest.skipUnless(os_helper.TESTFN_NONASCII, + 'need os_helper.TESTFN_NONASCII') + def test_list_dir_nonascii_dirname(self): + dirname = os_helper.TESTFN_NONASCII + '.dir' + self.check_list_dir_dirname(dirname) + + @unittest.skipUnless(os_helper.TESTFN_NONASCII, + 'need os_helper.TESTFN_NONASCII') + def test_list_dir_nonascii_filename(self): + filename = os_helper.TESTFN_NONASCII + '.txt' + self.check_list_dir_filename(filename) + @unittest.skipIf(is_apple, 'undecodable name cannot always be decoded on Apple platforms') @unittest.skipIf(sys.platform == 'win32', 'undecodable name cannot be decoded on win32') @unittest.skipUnless(os_helper.TESTFN_UNDECODABLE, 'need os_helper.TESTFN_UNDECODABLE') - def test_undecodable_filename(self): - enc = sys.getfilesystemencoding() + def test_list_dir_undecodable_dirname(self): + dirname = os.fsdecode(os_helper.TESTFN_UNDECODABLE) + '.dir' + self.check_list_dir_dirname(dirname) + + @unittest.skipIf(is_apple, + 'undecodable name cannot always be decoded on Apple platforms') + @unittest.skipIf(sys.platform == 'win32', + 'undecodable name cannot be decoded on win32') + @unittest.skipUnless(os_helper.TESTFN_UNDECODABLE, + 'need os_helper.TESTFN_UNDECODABLE') + def test_list_dir_undecodable_filename(self): filename = os.fsdecode(os_helper.TESTFN_UNDECODABLE) + '.txt' - with open(os.path.join(self.tempdir, filename), 'wb') as f: - f.write(os_helper.TESTFN_UNDECODABLE) - response = self.request(self.base_url + '/') - if is_apple: - # On Apple platforms the HFS+ filesystem replaces bytes that - # aren't valid UTF-8 into a percent-encoded value. - for name in os.listdir(self.tempdir): - if name != 'test': # Ignore a filename created in setUp(). - filename = name - break - body = self.check_status_and_reason(response, HTTPStatus.OK) - quotedname = urllib.parse.quote(filename, errors='surrogatepass') - self.assertIn(('href="%s"' % quotedname) - .encode(enc, 'surrogateescape'), body) - self.assertIn(('>%s<' % html.escape(filename, quote=False)) - .encode(enc, 'surrogateescape'), body) - response = self.request(self.base_url + '/' + quotedname) - self.check_status_and_reason(response, HTTPStatus.OK, - data=os_helper.TESTFN_UNDECODABLE) + self.check_list_dir_filename(filename) + + def test_list_dir_undecodable_dirname2(self): + dirname = '\ufffd.dir' + self.check_list_dir_dirname(dirname, quotedname='%ff.dir') + + @unittest.skipUnless(os_helper.TESTFN_UNENCODABLE, + 'need os_helper.TESTFN_UNENCODABLE') + def test_list_dir_unencodable_dirname(self): + dirname = os_helper.TESTFN_UNENCODABLE + '.dir' + self.check_list_dir_dirname(dirname) + + @unittest.skipUnless(os_helper.TESTFN_UNENCODABLE, + 'need os_helper.TESTFN_UNENCODABLE') + def test_list_dir_unencodable_filename(self): + filename = os_helper.TESTFN_UNENCODABLE + '.txt' + self.check_list_dir_filename(filename) + + def test_list_dir_escape_dirname(self): + # Characters that need special treating in URL or HTML. + for name in ('q?', 'f#', '&', '&', '', '"dq"', "'sq'", + '%A4', '%E2%82%AC'): + with self.subTest(name=name): + dirname = name + '.dir' + self.check_list_dir_dirname(dirname, + quotedname=urllib.parse.quote(dirname, safe='&<>\'"')) + + def test_list_dir_escape_filename(self): + # Characters that need special treating in URL or HTML. + for name in ('q?', 'f#', '&', '&', '', '"dq"', "'sq'", + '%A4', '%E2%82%AC'): + with self.subTest(name=name): + filename = name + '.txt' + self.check_list_dir_filename(filename) + os_helper.unlink(os.path.join(self.tempdir, filename)) def test_undecodable_parameter(self): # sanity check using a valid parameter @@ -731,27 +808,6 @@ def test_path_without_leading_slash(self): self.assertEqual(response.getheader("Location"), self.tempdir_name + "/?hi=1") - def test_html_escape_filename(self): - filename = '.txt' - fullpath = os.path.join(self.tempdir, filename) - - try: - open(fullpath, 'wb').close() - except OSError: - raise unittest.SkipTest('Can not create file %s on current file ' - 'system' % filename) - - try: - response = self.request(self.base_url + '/') - body = self.check_status_and_reason(response, HTTPStatus.OK) - enc = response.headers.get_content_charset() - finally: - os.unlink(fullpath) # avoid affecting test_undecodable_filename - - self.assertIsNotNone(enc) - html_text = '>%s<' % html.escape(filename, quote=False) - self.assertIn(html_text.encode(enc), body) - cgi_file1 = """\ #!%s From d7230e1110f9dd210596349e09c5824862666b5b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 09:37:43 +0200 Subject: [PATCH 0116/1674] [3.14] gh-134098: Fix handling %-encoded trailing slash in SimpleHTTPRequestHandler (GH-134099) (GH-134123) (cherry picked from commit 2f1ecb3bc474a5895dce090cca7b8afe7b560040) Co-authored-by: Serhiy Storchaka --- Lib/http/server.py | 8 ++++---- Lib/test/test_httpservers.py | 11 +++++++++++ .../2025-05-16-20-10-25.gh-issue-134098.YyTkKr.rst | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-16-20-10-25.gh-issue-134098.YyTkKr.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 64f766f9bc2c1b..8be1903743a9a2 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -750,7 +750,7 @@ def send_head(self): f = None if os.path.isdir(path): parts = urllib.parse.urlsplit(self.path) - if not parts.path.endswith('/'): + if not parts.path.endswith(('/', '%2f', '%2F')): # redirect browser - doing basically what apache does self.send_response(HTTPStatus.MOVED_PERMANENTLY) new_parts = (parts[0], parts[1], parts[2] + '/', @@ -890,14 +890,14 @@ def translate_path(self, path): """ # abandon query parameters - path = path.split('?',1)[0] - path = path.split('#',1)[0] + path = path.split('#', 1)[0] + path = path.split('?', 1)[0] # Don't forget explicit trailing slash when normalizing. Issue17324 - trailing_slash = path.rstrip().endswith('/') try: path = urllib.parse.unquote(path, errors='surrogatepass') except UnicodeDecodeError: path = urllib.parse.unquote(path) + trailing_slash = path.endswith('/') path = posixpath.normpath(path) words = path.split('/') words = filter(None, words) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 4cb78c87ea7670..557e698aa3481c 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -692,10 +692,19 @@ def test_get(self): # check for trailing "/" which should return 404. See Issue17324 response = self.request(self.base_url + '/test/') self.check_status_and_reason(response, HTTPStatus.NOT_FOUND) + response = self.request(self.base_url + '/test%2f') + self.check_status_and_reason(response, HTTPStatus.NOT_FOUND) + response = self.request(self.base_url + '/test%2F') + self.check_status_and_reason(response, HTTPStatus.NOT_FOUND) response = self.request(self.base_url + '/') self.check_status_and_reason(response, HTTPStatus.OK) + response = self.request(self.base_url + '%2f') + self.check_status_and_reason(response, HTTPStatus.OK) + response = self.request(self.base_url + '%2F') + self.check_status_and_reason(response, HTTPStatus.OK) response = self.request(self.base_url) self.check_status_and_reason(response, HTTPStatus.MOVED_PERMANENTLY) + self.assertEqual(response.getheader("Location"), self.base_url + "/") self.assertEqual(response.getheader("Content-Length"), "0") response = self.request(self.base_url + '/?hi=2') self.check_status_and_reason(response, HTTPStatus.OK) @@ -801,6 +810,8 @@ def test_path_without_leading_slash(self): self.check_status_and_reason(response, HTTPStatus.OK) response = self.request(self.tempdir_name) self.check_status_and_reason(response, HTTPStatus.MOVED_PERMANENTLY) + self.assertEqual(response.getheader("Location"), + self.tempdir_name + "/") response = self.request(self.tempdir_name + '/?hi=2') self.check_status_and_reason(response, HTTPStatus.OK) response = self.request(self.tempdir_name + '?hi=1') diff --git a/Misc/NEWS.d/next/Library/2025-05-16-20-10-25.gh-issue-134098.YyTkKr.rst b/Misc/NEWS.d/next/Library/2025-05-16-20-10-25.gh-issue-134098.YyTkKr.rst new file mode 100644 index 00000000000000..32eff5371c4f1e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-16-20-10-25.gh-issue-134098.YyTkKr.rst @@ -0,0 +1,2 @@ +Fix handling paths that end with a percent-encoded slash (``%2f`` or +``%2F``) in :class:`http.server.SimpleHTTPRequestHandler`. From 075cabb02650e786008e45b632816c6a723801b0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 10:05:47 +0200 Subject: [PATCH 0117/1674] [3.14] gh-133881: add forward reference to `list.sort()` in lambda expression tutorial (GH-133910) (#134126) gh-133881: add forward reference to `list.sort()` in lambda expression tutorial (GH-133910) (cherry picked from commit c1c9ad1d5a62a591eb2f0f0d29f3fa02e0949f14) Co-authored-by: Oleg Burnaev <51371645+Shepard2154@users.noreply.github.com> --- Doc/tutorial/controlflow.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 95939242fb7d44..9a810f16388b9d 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -999,7 +999,8 @@ scope:: 43 The above example uses a lambda expression to return a function. Another use -is to pass a small function as an argument:: +is to pass a small function as an argument. For instance, :meth:`list.sort` +takes a sorting key function *key* which can be a lambda function:: >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] >>> pairs.sort(key=lambda pair: pair[1]) From 851b26f4bedb37591fc39e7f3d47dc078f34e7f9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 10:06:04 +0200 Subject: [PATCH 0118/1674] [3.14] gh-113878: fix `versionadded` in `dataclasses.field()` documentation (GH-134065) (#134128) gh-113878: fix `versionadded` in `dataclasses.field()` documentation (GH-134065) (cherry picked from commit 9d73875072e20bf3cc87cadc553d6a6fb4f71df5) Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> --- Doc/library/dataclasses.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index 72612211b43d5e..f18c7cc9c02da6 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -304,9 +304,9 @@ Module contents .. versionadded:: 3.10 - - ``doc``: optional docstring for this field. + - *doc*: optional docstring for this field. - .. versionadded:: 3.13 + .. versionadded:: 3.14 If the default value of a field is specified by a call to :func:`!field`, then the class attribute for this field will be From 9f1307afa0e5af8f107a23203b78720a3cfbafc2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 11:04:42 +0200 Subject: [PATCH 0119/1674] [3.14] Docs: C API: Improve documentation around non-Python threads with subinterpreters (GH-131087) (GH-134130) Docs: C API: Improve documentation around non-Python threads with subinterpreters (GH-131087) (cherry picked from commit af6b3b825f3b653ffdb29fc1dd36de8acfe0a641) Co-authored-by: Peter Bierma Co-authored-by: Victor Stinner --- Doc/c-api/init.rst | 59 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index d538ef18fbc25c..4d0c39dc9a19d2 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1083,8 +1083,36 @@ Note that the ``PyGILState_*`` functions assume there is only one global interpreter (created automatically by :c:func:`Py_Initialize`). Python supports the creation of additional interpreters (using :c:func:`Py_NewInterpreter`), but mixing multiple interpreters and the -``PyGILState_*`` API is unsupported. +``PyGILState_*`` API is unsupported. This is because :c:func:`PyGILState_Ensure` +and similar functions default to :term:`attaching ` a +:term:`thread state` for the main interpreter, meaning that the thread can't safely +interact with the calling subinterpreter. + +Supporting subinterpreters in non-Python threads +------------------------------------------------ + +If you would like to support subinterpreters with non-Python created threads, you +must use the ``PyThreadState_*`` API instead of the traditional ``PyGILState_*`` +API. + +In particular, you must store the interpreter state from the calling +function and pass it to :c:func:`PyThreadState_New`, which will ensure that +the :term:`thread state` is targeting the correct interpreter:: + + /* The return value of PyInterpreterState_Get() from the + function that created this thread. */ + PyInterpreterState *interp = ThreadData->interp; + PyThreadState *tstate = PyThreadState_New(interp); + PyThreadState_Swap(tstate); + + /* GIL of the subinterpreter is now held. + Perform Python actions here. */ + result = CallSomeFunction(); + /* evaluate result or handle exception */ + /* Destroy the thread state. No Python API allowed beyond this point. */ + PyThreadState_Clear(tstate); + PyThreadState_DeleteCurrent(); .. _fork-and-threads: @@ -1261,6 +1289,10 @@ code, or when embedding the Python interpreter: .. seealso: :c:func:`PyEval_ReleaseThread` + .. note:: + Similar to :c:func:`PyGILState_Ensure`, this function will hang the + thread if the runtime is finalizing. + The following functions use thread-local storage, and are not compatible with sub-interpreters: @@ -1287,10 +1319,10 @@ with sub-interpreters: When the function returns, there will be an :term:`attached thread state` and the thread will be able to call arbitrary Python code. Failure is a fatal error. - .. note:: - Calling this function from a thread when the runtime is finalizing will - hang the thread until the program exits, even if the thread was not - created by Python. Refer to + .. warning:: + Calling this function when the runtime is finalizing is unsafe. Doing + so will either hang the thread until the program ends, or fully crash + the interpreter in rare cases. Refer to :ref:`cautions-regarding-runtime-finalization` for more details. .. versionchanged:: 3.14 @@ -1307,7 +1339,6 @@ with sub-interpreters: Every call to :c:func:`PyGILState_Ensure` must be matched by a call to :c:func:`PyGILState_Release` on the same thread. - .. c:function:: PyThreadState* PyGILState_GetThisThreadState() Get the :term:`attached thread state` for this thread. May return ``NULL`` if no @@ -1315,20 +1346,30 @@ with sub-interpreters: always has such a thread-state, even if no auto-thread-state call has been made on the main thread. This is mainly a helper/diagnostic function. - .. seealso: :c:func:`PyThreadState_Get`` + .. note:: + This function does not account for :term:`thread states ` created + by something other than :c:func:`PyGILState_Ensure` (such as :c:func:`PyThreadState_New`). + Prefer :c:func:`PyThreadState_Get` or :c:func:`PyThreadState_GetUnchecked` + for most cases. + .. seealso: :c:func:`PyThreadState_Get`` .. c:function:: int PyGILState_Check() Return ``1`` if the current thread is holding the :term:`GIL` and ``0`` otherwise. This function can be called from any thread at any time. - Only if it has had its Python thread state initialized and currently is - holding the :term:`GIL` will it return ``1``. + Only if it has had its :term:`thread state ` initialized + via :c:func:`PyGILState_Ensure` will it return ``1``. This is mainly a helper/diagnostic function. It can be useful for example in callback contexts or memory allocation functions when knowing that the :term:`GIL` is locked can allow the caller to perform sensitive actions or otherwise behave differently. + .. note:: + If the current Python process has ever created a subinterpreter, this + function will *always* return ``1``. Prefer :c:func:`PyThreadState_GetUnchecked` + for most cases. + .. versionadded:: 3.4 From b43e1d0b48584af16fd0c4bda4c0d56bf72bf57a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 14:03:33 +0200 Subject: [PATCH 0120/1674] [3.14] Docs: fix spelling of "test case" in `unittest` documentation (GH-134137) (#134138) Docs: fix spelling of "test case" in `unittest` documentation (GH-134137) (cherry picked from commit b41d79c776af4bfa5d28fc2036c9137978294b6a) Co-authored-by: Clifford Gama <53076065+cliff688@users.noreply.github.com> --- Doc/library/unittest.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 61022fe052ca80..dcdda1719bf593 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -109,7 +109,7 @@ Here is a short script to test three string methods:: unittest.main() -A testcase is created by subclassing :class:`unittest.TestCase`. The three +A test case is created by subclassing :class:`unittest.TestCase`. The three individual tests are defined with methods whose names start with the letters ``test``. This naming convention informs the test runner about which methods represent tests. From cca18fcbe817a24bfeeb7f15a00158f8214e010d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 15:17:23 +0200 Subject: [PATCH 0121/1674] [3.14] gh-88275: Add missing `__init__` method to `match` example (GH-120281) (#134142) gh-88275: Add missing `__init__` method to `match` example (GH-120281) (cherry picked from commit 7a9d46295a497669eaa6e647c33ab71c8cf620a1) Co-authored-by: Kirill Podoprigora --- Doc/whatsnew/3.10.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 3c815721a92f8c..f8df802768a945 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -551,11 +551,12 @@ Patterns and classes If you are using classes to structure your data, you can use as a pattern the class name followed by an argument list resembling a constructor. This -pattern has the ability to capture class attributes into variables:: +pattern has the ability to capture instance attributes into variables:: class Point: - x: int - y: int + def __init__(self, x, y): + self.x = x + self.y = y def location(point): match point: From 1ba5e65b76eb0d745e63691bda7206e66f72a961 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 17 May 2025 21:48:54 +0200 Subject: [PATCH 0122/1674] [3.14] gh-134119: Fix crash from calling next() on exhausted template iterator (GH-134120) (#134153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-134119: Fix crash from calling next() on exhausted template iterator (GH-134120) (cherry picked from commit fc7f4c36664314393bd4c30355e21bd7aeac524d) Co-authored-by: Jelle Zijlstra Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_string/test_templatelib.py | 7 +++++++ .../2025-05-16-20-59-12.gh-issue-134119.w8expI.rst | 2 ++ Objects/templateobject.c | 3 +++ 3 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst diff --git a/Lib/test/test_string/test_templatelib.py b/Lib/test/test_string/test_templatelib.py index 5b9490c2be6de0..85fcff486d6616 100644 --- a/Lib/test/test_string/test_templatelib.py +++ b/Lib/test/test_string/test_templatelib.py @@ -148,6 +148,13 @@ def test_iter(self): self.assertEqual(res[1].format_spec, '') self.assertEqual(res[2], ' yz') + def test_exhausted(self): + # See https://github.com/python/cpython/issues/134119. + template_iter = iter(t"{1}") + self.assertIsInstance(next(template_iter), Interpolation) + self.assertRaises(StopIteration, next, template_iter) + self.assertRaises(StopIteration, next, template_iter) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst new file mode 100644 index 00000000000000..754e816628563e --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst @@ -0,0 +1,2 @@ +Fix crash when calling :func:`next` on an exhausted template string iterator. +Patch by Jelle Zijlstra. diff --git a/Objects/templateobject.c b/Objects/templateobject.c index 06cb19e0b6d056..4293a311c440f7 100644 --- a/Objects/templateobject.c +++ b/Objects/templateobject.c @@ -23,6 +23,9 @@ templateiter_next(PyObject *op) if (self->from_strings) { item = PyIter_Next(self->stringsiter); self->from_strings = 0; + if (item == NULL) { + return NULL; + } if (PyUnicode_GET_LENGTH(item) == 0) { Py_SETREF(item, PyIter_Next(self->interpolationsiter)); self->from_strings = 1; From eaee2ae0333dde4f18bf849e4a90c8eebb7e2cb9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 00:50:00 +0200 Subject: [PATCH 0123/1674] [3.14] gh-134064: Fix sys.remote_exec() error checking (GH-134067) (#134162) gh-134064: Fix sys.remote_exec() error checking (GH-134067) (cherry picked from commit 009e7b36981fd07f7cca1fdcfcf172ce1584fac7) Co-authored-by: Victor Stinner --- Lib/test/test_sys.py | 7 +++++++ Python/sysmodule.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 8af2e3488b48d9..fb1c8492a64d38 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -2176,6 +2176,13 @@ def test_remote_exec_invalid_pid(self): with self.assertRaises(OSError): sys.remote_exec(99999, "print('should not run')") + def test_remote_exec_invalid_script(self): + """Test remote exec with invalid script type""" + with self.assertRaises(TypeError): + sys.remote_exec(0, None) + with self.assertRaises(TypeError): + sys.remote_exec(0, 123) + def test_remote_exec_syntax_error(self): """Test remote exec with syntax error in script""" script = ''' diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b46c2ab7c4483d..8692caa238a64d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2484,7 +2484,7 @@ sys_remote_exec_impl(PyObject *module, int pid, PyObject *script) PyObject *path; const char *debugger_script_path; - if (PyUnicode_FSConverter(script, &path) < 0) { + if (PyUnicode_FSConverter(script, &path) == 0) { return NULL; } debugger_script_path = PyBytes_AS_STRING(path); From bf39decabdc7feff3a7441fa93136c22596c2d67 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 03:54:00 +0200 Subject: [PATCH 0124/1674] [3.14] gh-134150: Clarify distinction between JSON and Python objects (GH-134154) (#134166) gh-134150: Clarify distinction between JSON and Python objects (GH-134154) * gh-134150: Clarify distinction between JSON objects and Python objects in json module docs * Revert change to JSON introduction * Clarify occurrences of "object literal" as JSON (cherry picked from commit fa4e088668d4a41f9be5babe7edd5409290ee92a) Co-authored-by: Micha Albert --- Doc/library/json.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 26579ec6328860..12a5a96a3c56f3 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -18,12 +18,17 @@ is a lightweight data interchange format inspired by `JavaScript `_ object literal syntax (although it is not a strict subset of JavaScript [#rfc-errata]_ ). +.. note:: + The term "object" in the context of JSON processing in Python can be + ambiguous. All values in Python are objects. In JSON, an object refers to + any data wrapped in curly braces, similar to a Python dictionary. + .. warning:: Be cautious when parsing JSON data from untrusted sources. A malicious JSON string may cause the decoder to consume considerable CPU and memory resources. Limiting the size of data to be parsed is recommended. -:mod:`json` exposes an API familiar to users of the standard library +This module exposes an API familiar to users of the standard library :mod:`marshal` and :mod:`pickle` modules. Encoding basic Python object hierarchies:: @@ -60,7 +65,7 @@ Pretty printing:: "6": 7 } -Specializing JSON object encoding:: +Customizing JSON object encoding:: >>> import json >>> def custom_json(obj): @@ -83,7 +88,7 @@ Decoding JSON:: >>> json.load(io) ['streaming API'] -Specializing JSON object decoding:: +Customizing JSON object decoding:: >>> import json >>> def as_complex(dct): @@ -279,7 +284,7 @@ Basic Usage :param object_hook: If set, a function that is called with the result of - any object literal decoded (a :class:`dict`). + any JSON object literal decoded (a :class:`dict`). The return value of this function will be used instead of the :class:`dict`. This feature can be used to implement custom decoders, @@ -289,7 +294,7 @@ Basic Usage :param object_pairs_hook: If set, a function that is called with the result of - any object literal decoded with an ordered list of pairs. + any JSON object literal decoded with an ordered list of pairs. The return value of this function will be used instead of the :class:`dict`. This feature can be used to implement custom decoders. From 8d51ed6b050b2678a8c1ad22b739554171a563cc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 17:08:40 +0200 Subject: [PATCH 0125/1674] [3.14] gh-134100: Fix use-after-free in `PyImport_ImportModuleLevelObject` (GH-134117) (#134171) gh-134100: Fix use-after-free in `PyImport_ImportModuleLevelObject` (GH-134117) (cherry picked from commit 4e9005d32ff466925f40af410f2ea6bf2329bcf8) Co-authored-by: Nico-Posada <102486290+Nico-Posada@users.noreply.github.com> --- .../import_/test_relative_imports.py | 15 +++++++++++++++ ...2025-05-16-17-25-52.gh-issue-134100.5-FbLK.rst | 2 ++ Python/import.c | 4 +++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-17-25-52.gh-issue-134100.5-FbLK.rst diff --git a/Lib/test/test_importlib/import_/test_relative_imports.py b/Lib/test/test_importlib/import_/test_relative_imports.py index e535d119763148..1549cbe96ce2d1 100644 --- a/Lib/test/test_importlib/import_/test_relative_imports.py +++ b/Lib/test/test_importlib/import_/test_relative_imports.py @@ -223,6 +223,21 @@ def test_relative_import_no_package_exists_absolute(self): self.__import__('sys', {'__package__': '', '__spec__': None}, level=1) + def test_malicious_relative_import(self): + # https://github.com/python/cpython/issues/134100 + # Test to make sure UAF bug with error msg doesn't come back to life + import sys + loooong = "".ljust(0x23000, "b") + name = f"a.{loooong}.c" + + with util.uncache(name): + sys.modules[name] = {} + with self.assertRaisesRegex( + KeyError, + r"'a\.b+' not in sys\.modules as expected" + ): + __import__(f"{loooong}.c", {"__package__": "a"}, level=1) + (Frozen_RelativeImports, Source_RelativeImports diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-17-25-52.gh-issue-134100.5-FbLK.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-17-25-52.gh-issue-134100.5-FbLK.rst new file mode 100644 index 00000000000000..d672347f9ad246 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-17-25-52.gh-issue-134100.5-FbLK.rst @@ -0,0 +1,2 @@ +Fix a use-after-free bug that occurs when an imported module isn't +in :data:`sys.modules` after its initial import. Patch by Nico-Posada. diff --git a/Python/import.c b/Python/import.c index afdc28eda31b9b..f24c5716feb6c2 100644 --- a/Python/import.c +++ b/Python/import.c @@ -3852,15 +3852,17 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } final_mod = import_get_module(tstate, to_return); - Py_DECREF(to_return); if (final_mod == NULL) { if (!_PyErr_Occurred(tstate)) { _PyErr_Format(tstate, PyExc_KeyError, "%R not in sys.modules as expected", to_return); } + Py_DECREF(to_return); goto error; } + + Py_DECREF(to_return); } } else { From bb5f92adcf3c35fe9842e564f0ff6d9e5f900ebe Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 17:29:19 +0200 Subject: [PATCH 0126/1674] [3.14] gh-134144: Fix use-after-free in zapthreads() (GH-134145) (#134182) gh-134144: Fix use-after-free in zapthreads() (GH-134145) (cherry picked from commit f2de1e6861c27bd498f598efc01600450979b5f9) Co-authored-by: b-pass --- Lib/test/test_interpreters/test_api.py | 8 +++++ ...-05-17-14-41-21.gh-issue-134144.xVpZik.rst | 1 + Modules/_testinternalcapi.c | 29 ++++++++++++++++--- Python/pystate.c | 9 ++++-- 4 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-05-17-14-41-21.gh-issue-134144.xVpZik.rst diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index 66c7afce88f0d8..1e2d572b1cbb81 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -1452,6 +1452,14 @@ def test_destroy(self): self.assertFalse( self.interp_exists(interpid)) + with self.subTest('basic C-API'): + interpid = _testinternalcapi.create_interpreter() + self.assertTrue( + self.interp_exists(interpid)) + _testinternalcapi.destroy_interpreter(interpid, basic=True) + self.assertFalse( + self.interp_exists(interpid)) + def test_get_config(self): # This test overlaps with # test.test_capi.test_misc.InterpreterConfigTests. diff --git a/Misc/NEWS.d/next/C_API/2025-05-17-14-41-21.gh-issue-134144.xVpZik.rst b/Misc/NEWS.d/next/C_API/2025-05-17-14-41-21.gh-issue-134144.xVpZik.rst new file mode 100644 index 00000000000000..11c7bd59a4dd1d --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-05-17-14-41-21.gh-issue-134144.xVpZik.rst @@ -0,0 +1 @@ +Fix crash when calling :c:func:`Py_EndInterpreter` with a :term:`thread state` that isn't the initial thread for the interpreter. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 92f744c5a5fc70..76bd76cc6b2490 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1690,11 +1690,12 @@ create_interpreter(PyObject *self, PyObject *args, PyObject *kwargs) static PyObject * destroy_interpreter(PyObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"id", NULL}; + static char *kwlist[] = {"id", "basic", NULL}; PyObject *idobj = NULL; + int basic = 0; if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O:destroy_interpreter", kwlist, - &idobj)) + "O|p:destroy_interpreter", kwlist, + &idobj, &basic)) { return NULL; } @@ -1704,7 +1705,27 @@ destroy_interpreter(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - _PyXI_EndInterpreter(interp, NULL, NULL); + if (basic) + { + // Test the basic Py_EndInterpreter with weird out of order thread states + PyThreadState *t1, *t2; + PyThreadState *prev; + t1 = interp->threads.head; + if (t1 == NULL) { + t1 = PyThreadState_New(interp); + } + t2 = PyThreadState_New(interp); + prev = PyThreadState_Swap(t2); + PyThreadState_Clear(t1); + PyThreadState_Delete(t1); + Py_EndInterpreter(t2); + PyThreadState_Swap(prev); + } + else + { + // use the cross interpreter _PyXI_EndInterpreter normally + _PyXI_EndInterpreter(interp, NULL, NULL); + } Py_RETURN_NONE; } diff --git a/Python/pystate.c b/Python/pystate.c index 1ac134400856d4..14ae2748b0bc99 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1908,9 +1908,14 @@ tstate_delete_common(PyThreadState *tstate, int release_gil) static void zapthreads(PyInterpreterState *interp) { + PyThreadState *tstate; /* No need to lock the mutex here because this should only happen - when the threads are all really dead (XXX famous last words). */ - _Py_FOR_EACH_TSTATE_UNLOCKED(interp, tstate) { + when the threads are all really dead (XXX famous last words). + + Cannot use _Py_FOR_EACH_TSTATE_UNLOCKED because we are freeing + the thread states here. + */ + while ((tstate = interp->threads.head) != NULL) { tstate_verify_not_active(tstate); tstate_delete_common(tstate, 0); free_threadstate((_PyThreadStateImpl *)tstate); From 11650c354fc71cd69777bafc44636b9ee6e7391f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 18:29:03 +0200 Subject: [PATCH 0127/1674] [3.14] fix indent in `controlflow.rst` docs (GH-134008) (#134184) fix indent in `controlflow.rst` docs (GH-134008) (cherry picked from commit 4ce91871a9077fcf8806d6fd79bdb32af9587306) Co-authored-by: Yongzi Li <1538321957@qq.com> --- Doc/tutorial/controlflow.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 9a810f16388b9d..5c0e8f34bf82f4 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -1056,7 +1056,7 @@ Here is an example of a multi-line docstring:: >>> print(my_function.__doc__) Do nothing, but document it. - No, really, it doesn't do anything. + No, really, it doesn't do anything. .. _tut-annotations: From 76957eb8ccd98b4647bfc655d145aadd05c977e0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 18:34:19 +0200 Subject: [PATCH 0128/1674] [3.14] document `Py_VISIT` as a macro in the docs (GH-133688) (#134186) document `Py_VISIT` as a macro in the docs (GH-133688) (cherry picked from commit bb32f3c698f5192dddd2d2f33c7c0a3d05afc223) Co-authored-by: da-woods --- Doc/c-api/gcsupport.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index d1f0982b818931..3e23605778f05a 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -180,9 +180,9 @@ provided. In order to use this macro, the :c:member:`~PyTypeObject.tp_traverse` must name its arguments exactly *visit* and *arg*: -.. c:function:: void Py_VISIT(PyObject *o) +.. c:macro:: Py_VISIT(o) - If *o* is not ``NULL``, call the *visit* callback, with arguments *o* + If the :c:expr:`PyObject *` *o* is not ``NULL``, call the *visit* callback, with arguments *o* and *arg*. If *visit* returns a non-zero value, then return it. Using this macro, :c:member:`~PyTypeObject.tp_traverse` handlers look like:: From 70735878ab3fa8180ea21e6e1cd85092673c2a62 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 May 2025 21:16:37 +0200 Subject: [PATCH 0129/1674] [3.14] gh-133889: Only show the path of the URL in the SimpleHTTPRequestHandler page (GH-134135) (GH-134190) The query and fragment are ambiguous and not used. (cherry picked from commit 5cbc8c632e860941602e8f7da9aab52fae40aca6) Co-authored-by: Serhiy Storchaka --- Lib/http/server.py | 7 +++++-- Lib/test/test_httpservers.py | 13 +++++++------ .../2025-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst | 3 +++ 3 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 8be1903743a9a2..31fe9cae781f0a 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -840,11 +840,14 @@ def list_directory(self, path): return None list.sort(key=lambda a: a.lower()) r = [] + displaypath = self.path + displaypath = displaypath.split('#', 1)[0] + displaypath = displaypath.split('?', 1)[0] try: - displaypath = urllib.parse.unquote(self.path, + displaypath = urllib.parse.unquote(displaypath, errors='surrogatepass') except UnicodeDecodeError: - displaypath = urllib.parse.unquote(self.path) + displaypath = urllib.parse.unquote(displaypath) displaypath = html.escape(displaypath, quote=False) enc = sys.getfilesystemencoding() title = f'Directory listing for {displaypath}' diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 557e698aa3481c..9a321952a8d61e 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -628,13 +628,14 @@ def test_list_dir_escape_filename(self): self.check_list_dir_filename(filename) os_helper.unlink(os.path.join(self.tempdir, filename)) - def test_undecodable_parameter(self): - # sanity check using a valid parameter + def test_list_dir_with_query_and_fragment(self): + prefix = f'listing for {self.base_url}/', response) + self.assertIn(prefix + b'h1>', response) response = self.request(self.base_url + '/?x=123').read() - self.assertRegex(response, rf'listing for {self.base_url}/\?x=123'.encode('latin1')) - # now the bogus encoding - response = self.request(self.base_url + '/?x=%bb').read() - self.assertRegex(response, rf'listing for {self.base_url}/\?x=\xef\xbf\xbd'.encode('latin1')) + self.assertIn(prefix + b'title>', response) + self.assertIn(prefix + b'h1>', response) def test_get_dir_redirect_location_domain_injection_bug(self): """Ensure //evil.co/..%2f../../X does not put //evil.co/ in Location. diff --git a/Misc/NEWS.d/next/Library/2025-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst b/Misc/NEWS.d/next/Library/2025-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst new file mode 100644 index 00000000000000..58b213e29f98d8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst @@ -0,0 +1,3 @@ +The generated directory listing page in +:class:`http.server.SimpleHTTPRequestHandler` now only shows the decoded +path component of the requested URL, and not the query and fragment. From 91d71ac1bd68d44a8648e39e24b2f1c26575b8ba Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Sun, 18 May 2025 20:33:14 +0100 Subject: [PATCH 0130/1674] [3.14] gh-134060: Don't create a certain symlink in venv if platform does not support it (GH-134061) --- Lib/venv/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 15e15b7a5184c2..17ee28e826d5cf 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -315,7 +315,7 @@ def setup_python(self, context): os.chmod(path, 0o755) suffixes = ['python', 'python3', f'python3.{sys.version_info[1]}'] - if sys.version_info[:2] == (3, 14): + if sys.version_info[:2] == (3, 14) and sys.getfilesystemencoding() == 'utf-8': suffixes.append('𝜋thon') for suffix in suffixes: path = os.path.join(binpath, suffix) From 9136ccfffef99db5743dd692d10b5d12e405a275 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 11:59:58 +0200 Subject: [PATCH 0131/1674] [3.14] gh-76023: Make os.path.realpath to ignore WinError 1005 in non-strict mode (GH-128328) (GH-134203) (cherry picked from commit d55e11b8049e3abf3cc187b4958224b225a39897) Co-authored-by: BecoKo --- Lib/ntpath.py | 3 ++- .../next/Windows/2025-05-19-03-02-04.gh-issue-76023.vHOf6M.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Windows/2025-05-19-03-02-04.gh-issue-76023.vHOf6M.rst diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 5481bb8888ef59..52ff2af743af6c 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -661,9 +661,10 @@ def _getfinalpathname_nonstrict(path): # 87: ERROR_INVALID_PARAMETER # 123: ERROR_INVALID_NAME # 161: ERROR_BAD_PATHNAME + # 1005: ERROR_UNRECOGNIZED_VOLUME # 1920: ERROR_CANT_ACCESS_FILE # 1921: ERROR_CANT_RESOLVE_FILENAME (implies unfollowable symlink) - allowed_winerror = 1, 2, 3, 5, 21, 32, 50, 53, 65, 67, 87, 123, 161, 1920, 1921 + allowed_winerror = 1, 2, 3, 5, 21, 32, 50, 53, 65, 67, 87, 123, 161, 1005, 1920, 1921 # Non-strict algorithm is to find as much of the target directory # as we can and join the rest. diff --git a/Misc/NEWS.d/next/Windows/2025-05-19-03-02-04.gh-issue-76023.vHOf6M.rst b/Misc/NEWS.d/next/Windows/2025-05-19-03-02-04.gh-issue-76023.vHOf6M.rst new file mode 100644 index 00000000000000..958f4f4a4408f7 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2025-05-19-03-02-04.gh-issue-76023.vHOf6M.rst @@ -0,0 +1 @@ +Make :func:`os.path.realpath` ignore Windows error 1005 when in non-strict mode. From d9c08c57e93802f417fd11ee868cf98805c0bc6b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 13:26:27 +0200 Subject: [PATCH 0132/1674] [3.14] gh-133999: Fix `except` parsing regression in 3.14 (GH-134035) (#134206) gh-133999: Fix `except` parsing regression in 3.14 (GH-134035) (cherry picked from commit 84914ad0e5f96f0ca7238f3b4bc7fc4e50b1abb3) Co-authored-by: sobolevn --- Grammar/python.gram | 4 +-- Lib/test/test_syntax.py | 17 ++++++++++ ...-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst | 2 ++ Parser/parser.c | 32 +++++++++++++------ 4 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 528075b8bc0d71..8b15cf29fa02e2 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -1418,7 +1418,7 @@ invalid_except_stmt: RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized when using 'as'") } | a='except' expression ['as' NAME ] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } | a='except' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } - | 'except' expression 'as' a=expression { + | 'except' expression 'as' a=expression ':' block { RAISE_SYNTAX_ERROR_KNOWN_LOCATION( a, "cannot use except statement with %s", _PyPegen_get_expr_name(a)) } invalid_except_star_stmt: @@ -1426,7 +1426,7 @@ invalid_except_star_stmt: RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized when using 'as'") } | a='except' '*' expression ['as' NAME ] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } | a='except' '*' (NEWLINE | ':') { RAISE_SYNTAX_ERROR("expected one or more exception types") } - | 'except' '*' expression 'as' a=expression { + | 'except' '*' expression 'as' a=expression ':' block { RAISE_SYNTAX_ERROR_KNOWN_LOCATION( a, "cannot use except* statement with %s", _PyPegen_get_expr_name(a)) } invalid_finally_stmt: diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 0ee17849e28121..fadafd9b3d3aea 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -1431,6 +1431,23 @@ Traceback (most recent call last): SyntaxError: cannot use except* statement with literal +Regression tests for gh-133999: + + >>> try: pass + ... except TypeError as name: raise from None + Traceback (most recent call last): + SyntaxError: invalid syntax + + >>> try: pass + ... except* TypeError as name: raise from None + Traceback (most recent call last): + SyntaxError: invalid syntax + + >>> match 1: + ... case 1 | 2 as abc: raise from None + Traceback (most recent call last): + SyntaxError: invalid syntax + Ensure that early = are not matched by the parser as invalid comparisons >>> f(2, 4, x=34); 1 $ 2 Traceback (most recent call last): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst new file mode 100644 index 00000000000000..7d9c49688c3ce2 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst @@ -0,0 +1,2 @@ +Fix :exc:`SyntaxError` regression in :keyword:`except` parsing after +:gh:`123440`. diff --git a/Parser/parser.c b/Parser/parser.c index 509fac7df6e371..dc55e391d29280 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -24202,7 +24202,7 @@ invalid_try_stmt_rule(Parser *p) // | 'except' expression ',' expressions 'as' NAME ':' // | 'except' expression ['as' NAME] NEWLINE // | 'except' NEWLINE -// | 'except' expression 'as' expression +// | 'except' expression 'as' expression ':' block static void * invalid_except_stmt_rule(Parser *p) { @@ -24318,15 +24318,17 @@ invalid_except_stmt_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_except_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' NEWLINE")); } - { // 'except' expression 'as' expression + { // 'except' expression 'as' expression ':' block if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> invalid_except_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression 'as' expression")); + D(fprintf(stderr, "%*c> invalid_except_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression 'as' expression ':' block")); Token * _keyword; Token * _keyword_1; + Token * _literal; expr_ty a; + asdl_stmt_seq* block_var; expr_ty expression_var; if ( (_keyword = _PyPegen_expect_token(p, 677)) // token='except' @@ -24336,9 +24338,13 @@ invalid_except_stmt_rule(Parser *p) (_keyword_1 = _PyPegen_expect_token(p, 680)) // token='as' && (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (block_var = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ invalid_except_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression 'as' expression")); + D(fprintf(stderr, "%*c+ invalid_except_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression 'as' expression ':' block")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use except statement with %s" , _PyPegen_get_expr_name ( a ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24349,7 +24355,7 @@ invalid_except_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_except_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression 'as' expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression 'as' expression ':' block")); } _res = NULL; done: @@ -24361,7 +24367,7 @@ invalid_except_stmt_rule(Parser *p) // | 'except' '*' expression ',' expressions 'as' NAME ':' // | 'except' '*' expression ['as' NAME] NEWLINE // | 'except' '*' (NEWLINE | ':') -// | 'except' '*' expression 'as' expression +// | 'except' '*' expression 'as' expression ':' block static void * invalid_except_star_stmt_rule(Parser *p) { @@ -24486,16 +24492,18 @@ invalid_except_star_stmt_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_except_star_stmt[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' '*' (NEWLINE | ':')")); } - { // 'except' '*' expression 'as' expression + { // 'except' '*' expression 'as' expression ':' block if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> invalid_except_star_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' expression 'as' expression")); + D(fprintf(stderr, "%*c> invalid_except_star_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' expression 'as' expression ':' block")); Token * _keyword; Token * _keyword_1; Token * _literal; + Token * _literal_1; expr_ty a; + asdl_stmt_seq* block_var; expr_ty expression_var; if ( (_keyword = _PyPegen_expect_token(p, 677)) // token='except' @@ -24507,9 +24515,13 @@ invalid_except_star_stmt_rule(Parser *p) (_keyword_1 = _PyPegen_expect_token(p, 680)) // token='as' && (a = expression_rule(p)) // expression + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + && + (block_var = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ invalid_except_star_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' expression 'as' expression")); + D(fprintf(stderr, "%*c+ invalid_except_star_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' expression 'as' expression ':' block")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use except* statement with %s" , _PyPegen_get_expr_name ( a ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24520,7 +24532,7 @@ invalid_except_star_stmt_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_except_star_stmt[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' '*' expression 'as' expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' '*' expression 'as' expression ':' block")); } _res = NULL; done: From e3cc4008c4d73d100fcc0c69f57f925c7470d8d7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 15:49:46 +0200 Subject: [PATCH 0133/1674] [3.14] gh-122055: Clarify documentation for empty matches in RE (GH-133169) (GH-134217) (cherry picked from commit 44b73d3cd4466e148460883acf4494124eae8c91) Co-authored-by: Serhiy Storchaka --- Doc/library/re.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index eb3b1e5549cc98..75ebbf11c8e47c 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -991,8 +991,8 @@ Functions That way, separator components are always found at the same relative indices within the result list. - Empty matches for the pattern split the string only when not adjacent - to a previous empty match. + Adjacent empty matches are not possible, but an empty match can occur + immediately after a non-empty match. .. code:: pycon @@ -1095,9 +1095,12 @@ Functions The optional argument *count* is the maximum number of pattern occurrences to be replaced; *count* must be a non-negative integer. If omitted or zero, all - occurrences will be replaced. Empty matches for the pattern are replaced only - when not adjacent to a previous empty match, so ``sub('x*', '-', 'abxd')`` returns - ``'-a-b--d-'``. + occurrences will be replaced. + + Adjacent empty matches are not possible, but an empty match can occur + immediately after a non-empty match. + As a result, ``sub('x*', '-', 'abxd')`` returns ``'-a-b--d-'`` + instead of ``'-a-b-d-'``. .. index:: single: \g; in regular expressions @@ -1128,8 +1131,7 @@ Functions .. versionchanged:: 3.7 Unknown escapes in *repl* consisting of ``'\'`` and an ASCII letter now are errors. - Empty matches for the pattern are replaced when adjacent to a previous - non-empty match. + An empty match can occur immediately after a non-empty match. .. versionchanged:: 3.12 Group *id* can only contain ASCII digits. From 182464eb9ed1a6d045cd84d4c1851d3804ebc6bd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 16:13:44 +0200 Subject: [PATCH 0134/1674] [3.14] gh-134097: Print number of refs & blocks after each statement in new REPL (gh-134136) (gh-134220) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c31547a5914db93b8b38c6a5261ef716255f3582) Co-authored-by: Kirill Podoprigora Co-authored-by: Łukasz Langa --- Lib/_pyrepl/simple_interact.py | 9 +++++++++ Lib/test/test_pyrepl/test_pyrepl.py | 15 ++++++++++++++- ...2025-05-17-13-46-20.gh-issue-134097.fgkjE1.rst | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-17-13-46-20.gh-issue-134097.fgkjE1.rst diff --git a/Lib/_pyrepl/simple_interact.py b/Lib/_pyrepl/simple_interact.py index b3848833e14208..c23894a34b8b53 100644 --- a/Lib/_pyrepl/simple_interact.py +++ b/Lib/_pyrepl/simple_interact.py @@ -110,6 +110,10 @@ def run_multiline_interactive_console( more_lines = functools.partial(_more_lines, console) input_n = 0 + _is_x_showrefcount_set = sys._xoptions.get("showrefcount") + _is_pydebug_build = hasattr(sys, "gettotalrefcount") + show_ref_count = _is_x_showrefcount_set and _is_pydebug_build + def maybe_run_command(statement: str) -> bool: statement = statement.strip() if statement in console.locals or statement not in REPL_COMMANDS: @@ -167,3 +171,8 @@ def maybe_run_command(statement: str) -> bool: except: console.showtraceback() console.resetbuffer() + if show_ref_count: + console.write( + f"[{sys.gettotalrefcount()} refs," + f" {sys.getallocatedblocks()} blocks]\n" + ) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index fc8114891d12dd..f80755b3368f8f 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -10,7 +10,7 @@ import tempfile from unittest import TestCase, skipUnless, skipIf from unittest.mock import patch -from test.support import force_not_colorized, make_clean_env +from test.support import force_not_colorized, make_clean_env, Py_DEBUG from test.support import SHORT_TIMEOUT, STDLIB_DIR from test.support.import_helper import import_module from test.support.os_helper import EnvironmentVarGuard, unlink @@ -1610,3 +1610,16 @@ def test_prompt_after_help(self): # Extra stuff (newline and `exit` rewrites) are necessary # because of how run_repl works. self.assertNotIn(">>> \n>>> >>>", cleaned_output) + + @skipUnless(Py_DEBUG, '-X showrefcount requires a Python debug build') + def test_showrefcount(self): + env = os.environ.copy() + env.pop("PYTHON_BASIC_REPL", "") + output, _ = self.run_repl("1\n1+2\nexit()\n", cmdline_args=['-Xshowrefcount'], env=env) + matches = re.findall(r'\[-?\d+ refs, \d+ blocks\]', output) + self.assertEqual(len(matches), 3) + + env["PYTHON_BASIC_REPL"] = "1" + output, _ = self.run_repl("1\n1+2\nexit()\n", cmdline_args=['-Xshowrefcount'], env=env) + matches = re.findall(r'\[-?\d+ refs, \d+ blocks\]', output) + self.assertEqual(len(matches), 3) diff --git a/Misc/NEWS.d/next/Library/2025-05-17-13-46-20.gh-issue-134097.fgkjE1.rst b/Misc/NEWS.d/next/Library/2025-05-17-13-46-20.gh-issue-134097.fgkjE1.rst new file mode 100644 index 00000000000000..0b388d9db380f5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-17-13-46-20.gh-issue-134097.fgkjE1.rst @@ -0,0 +1 @@ +Fix interaction of the new :term:`REPL` and :option:`-X showrefcount <-X>` command line option. From a3c3d6f0efd6d1708ed648b461097373ac09005d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 16:39:05 +0200 Subject: [PATCH 0135/1674] [3.14] gh-134158: Fix PyREPL coloring of double braces in f/t-strings (gh-134159) (#134227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Loïc Simon Co-authored-by: Loïc Simon Co-authored-by: Peter Bierma Co-authored-by: Łukasz Langa --- Lib/_pyrepl/utils.py | 8 ++++- Lib/test/test_pyrepl/test_reader.py | 31 +++++++++++++++++++ ...-05-17-20-44-51.gh-issue-134158.ewLNLp.rst | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-44-51.gh-issue-134158.ewLNLp.rst diff --git a/Lib/_pyrepl/utils.py b/Lib/_pyrepl/utils.py index 752049ac05acdf..e04fbdc6c8a5c4 100644 --- a/Lib/_pyrepl/utils.py +++ b/Lib/_pyrepl/utils.py @@ -41,9 +41,15 @@ def from_re(cls, m: Match[str], group: int | str) -> Self: @classmethod def from_token(cls, token: TI, line_len: list[int]) -> Self: + end_offset = -1 + if (token.type in {T.FSTRING_MIDDLE, T.TSTRING_MIDDLE} + and token.string.endswith(("{", "}"))): + # gh-134158: a visible trailing brace comes from a double brace in input + end_offset += 1 + return cls( line_len[token.start[0] - 1] + token.start[1], - line_len[token.end[0] - 1] + token.end[1] - 1, + line_len[token.end[0] - 1] + token.end[1] + end_offset, ) diff --git a/Lib/test/test_pyrepl/test_reader.py b/Lib/test/test_pyrepl/test_reader.py index 57526f88f9384b..1f655264f1c00a 100644 --- a/Lib/test/test_pyrepl/test_reader.py +++ b/Lib/test/test_pyrepl/test_reader.py @@ -517,6 +517,37 @@ def unfinished_function(): self.assert_screen_equal(reader, code, clean=True) self.assert_screen_equal(reader, expected) + def test_syntax_highlighting_literal_brace_in_fstring_or_tstring(self): + code = dedent( + """\ + f"{{" + f"}}" + f"a{{b" + f"a}}b" + f"a{{b}}c" + t"a{{b}}c" + f"{{{0}}}" + f"{ {0} }" + """ + ) + expected = dedent( + """\ + {s}f"{z}{s}<<{z}{s}"{z} + {s}f"{z}{s}>>{z}{s}"{z} + {s}f"{z}{s}a<<{z}{s}b{z}{s}"{z} + {s}f"{z}{s}a>>{z}{s}b{z}{s}"{z} + {s}f"{z}{s}a<<{z}{s}b>>{z}{s}c{z}{s}"{z} + {s}t"{z}{s}a<<{z}{s}b>>{z}{s}c{z}{s}"{z} + {s}f"{z}{s}<<{z}{o}<{z}{n}0{z}{o}>{z}{s}>>{z}{s}"{z} + {s}f"{z}{o}<{z} {o}<{z}{n}0{z}{o}>{z} {o}>{z}{s}"{z} + """ + ).format(**colors).replace("<", "{").replace(">", "}") + events = code_to_events(code) + reader, _ = handle_all_events(events) + self.assert_screen_equal(reader, code, clean=True) + self.maxDiff=None + self.assert_screen_equal(reader, expected) + def test_control_characters(self): code = 'flag = "🏳️‍🌈"' events = code_to_events(code) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-44-51.gh-issue-134158.ewLNLp.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-44-51.gh-issue-134158.ewLNLp.rst new file mode 100644 index 00000000000000..7b8bab739c37c8 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-44-51.gh-issue-134158.ewLNLp.rst @@ -0,0 +1 @@ +Fix coloring of double braces in f-strings and t-strings in the :term:`REPL`. From 7d995ea9fd45258efa8d51f70b92e0cacec74f38 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 16:51:46 +0200 Subject: [PATCH 0136/1674] [3.14] gh-134214: Fix test case in pyrepl (gh-134223) (gh-134229) (cherry picked from commit faebf87b3716f7103ee5410456972db36f4b3ada) Co-authored-by: Jessica Temporal --- Lib/test/test_pyrepl/test_pyrepl.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index f80755b3368f8f..a1cfbe4c3cadb7 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1055,11 +1055,15 @@ def test_parse(self): self.assertEqual(actual, parsed) # The parser should not get tripped up by any # other preceding statements - code = f'import xyz\n{code}' - with self.subTest(code=code): + _code = f'import xyz\n{code}' + parser = ImportParser(_code) + actual = parser.parse() + with self.subTest(code=_code): self.assertEqual(actual, parsed) - code = f'import xyz;{code}' - with self.subTest(code=code): + _code = f'import xyz;{code}' + parser = ImportParser(_code) + actual = parser.parse() + with self.subTest(code=_code): self.assertEqual(actual, parsed) def test_parse_error(self): From c869898f39a64113689b4d674b996d678dec2843 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 17:09:15 +0200 Subject: [PATCH 0137/1674] [3.14] gh-128045: Mark unknown opcodes as deopting to themselves (GH-128044) (#134228) * gh-128045: Mark unknown opcodes as deopting to themselves (GH-128044) --- Include/internal/pycore_opcode_metadata.h | 29 +++++++++++++++++++ .../opcode_metadata_generator.py | 7 +++++ 2 files changed, 36 insertions(+) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 0e34074f1600a7..8d92e29c435056 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1787,6 +1787,35 @@ const uint8_t _PyOpcode_Caches[256] = { extern const uint8_t _PyOpcode_Deopt[256]; #ifdef NEED_OPCODE_METADATA const uint8_t _PyOpcode_Deopt[256] = { + [121] = 121, + [122] = 122, + [123] = 123, + [124] = 124, + [125] = 125, + [126] = 126, + [127] = 127, + [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, [BINARY_OP] = BINARY_OP, [BINARY_OP_ADD_FLOAT] = BINARY_OP, [BINARY_OP_ADD_INT] = BINARY_OP, diff --git a/Tools/cases_generator/opcode_metadata_generator.py b/Tools/cases_generator/opcode_metadata_generator.py index 620e4b6f1f4a69..10567204dcc599 100644 --- a/Tools/cases_generator/opcode_metadata_generator.py +++ b/Tools/cases_generator/opcode_metadata_generator.py @@ -157,6 +157,13 @@ def generate_deopt_table(analysis: Analysis, out: CWriter) -> None: if inst.family is not None: deopt = inst.family.name deopts.append((inst.name, deopt)) + defined = set(analysis.opmap.values()) + for i in range(256): + if i not in defined: + deopts.append((f'{i}', f'{i}')) + + assert len(deopts) == 256 + assert len(set(x[0] for x in deopts)) == 256 for name, deopt in sorted(deopts): out.emit(f"[{name}] = {deopt},\n") out.emit("};\n\n") From 89b744a772978ccd883c289c1a7066c1fb14ac04 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 17:22:14 +0200 Subject: [PATCH 0138/1674] [3.14] gh-125225: Fix column misalignment in help('topics') output (gh-125226) (gh-134225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'help("topics")' output was misaligned due to "ASSIGNMENTEXPRESSIONS" exceeding the implicit maximum default column width of 19 characters. Reduced the number of columns from 4 to 3 in the listtopics() function to allow more space for longer topic names. (cherry picked from commit b22460c44d1bc597c96d4a3d27ad8373d7952820) Co-authored-by: Étienne Pelletier Co-authored-by: Łukasz Langa --- Lib/pydoc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index def76d076a2989..7528178fdcae97 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -2110,7 +2110,7 @@ def intro(self): self.output.write(_introdoc()) def list(self, items, columns=4, width=80): - items = list(sorted(items)) + items = sorted(items) colw = width // columns rows = (len(items) + columns - 1) // columns for row in range(rows): @@ -2142,7 +2142,7 @@ def listtopics(self): Here is a list of available topics. Enter any topic name to get more help. ''') - self.list(self.topics.keys()) + self.list(self.topics.keys(), columns=3) def showtopic(self, topic, more_xrefs=''): try: From 7686c752b308358bccd5e76e8516872e844a1b70 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 19 May 2025 21:24:53 +0100 Subject: [PATCH 0139/1674] [3.14] gh-133779: Revert Windows generation of pyconfig.h and go back to a static header. (GH-133966) Extension builders must specify Py_GIL_DISABLED if they want to link to the free-threaded builds. This was usually the case already, but this change guarantees it in all circumstances. --- Doc/howto/free-threading-extensions.rst | 8 +++++ Doc/whatsnew/3.14.rst | 6 ++++ Include/Python.h | 13 ++++++++ Lib/sysconfig/__init__.py | 2 +- Lib/test/test_sysconfig.py | 5 +-- ...-05-13-13-25-27.gh-issue-133779.-YcTBz.rst | 6 ++++ PC/{pyconfig.h.in => pyconfig.h} | 22 +++++++++---- PCbuild/_freeze_module.vcxproj | 27 +--------------- PCbuild/pyproject.props | 8 ++--- PCbuild/pythoncore.vcxproj | 31 ++----------------- PCbuild/regen.targets | 14 ++++----- Tools/msi/dev/dev_files.wxs | 2 +- Tools/peg_generator/pegen/build.py | 2 ++ 13 files changed, 68 insertions(+), 78 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2025-05-13-13-25-27.gh-issue-133779.-YcTBz.rst rename PC/{pyconfig.h.in => pyconfig.h} (97%) diff --git a/Doc/howto/free-threading-extensions.rst b/Doc/howto/free-threading-extensions.rst index 3f6ee517050bd8..5a3970f15d52d6 100644 --- a/Doc/howto/free-threading-extensions.rst +++ b/Doc/howto/free-threading-extensions.rst @@ -23,6 +23,14 @@ You can use it to enable code that only runs under the free-threaded build:: /* code that only runs in the free-threaded build */ #endif +.. note:: + + On Windows, this macro is not defined automatically, but must be specified + to the compiler when building. The :func:`sysconfig.get_config_var` function + can be used to determine whether the current running interpreter had the + macro defined. + + Module Initialization ===================== diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 11361289874c9d..8f39b99e38e3a5 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -829,6 +829,12 @@ Kumar Aditya, Edgar Margffoy, and many others. Some of these contributors are employed by Meta, which has continued to provide significant engineering resources to support this project. +From 3.14, when compiling extension modules for the free-threaded build of +CPython on Windows, the preprocessor variable ``Py_GIL_DISABLED`` now needs to +be specified by the build backend, as it will no longer be determined +automatically by the C compiler. For a running interpreter, the setting that +was used at compile time can be found using :func:`sysconfig.get_config_var`. + .. _whatsnew314-pyrepl-highlighting: diff --git a/Include/Python.h b/Include/Python.h index 64be80145890a3..f34d581f0b4c91 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -59,6 +59,14 @@ # include // __readgsqword() #endif +// Suppress known warnings in Python header files. +#if defined(_MSC_VER) +// Warning that alignas behaviour has changed. Doesn't affect us, because we +// never relied on the old behaviour. +#pragma warning(push) +#pragma warning(disable: 5274) +#endif + // Include Python header files #include "pyport.h" #include "pymacro.h" @@ -138,4 +146,9 @@ #include "cpython/pyfpe.h" #include "cpython/tracemalloc.h" +// Restore warning filter +#ifdef _MSC_VER +#pragma warning(pop) +#endif + #endif /* !Py_PYTHON_H */ diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py index dad715eb087387..f93b98dd681536 100644 --- a/Lib/sysconfig/__init__.py +++ b/Lib/sysconfig/__init__.py @@ -468,7 +468,7 @@ def get_config_h_filename(): """Return the path of pyconfig.h.""" if _PYTHON_BUILD: if os.name == "nt": - inc_dir = os.path.dirname(sys._base_executable) + inc_dir = os.path.join(_PROJECT_BASE, 'PC') else: inc_dir = _PROJECT_BASE else: diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index 53e55383bf9c72..963cf753ce6178 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -531,13 +531,10 @@ def test_srcdir(self): Python_h = os.path.join(srcdir, 'Include', 'Python.h') self.assertTrue(os.path.exists(Python_h), Python_h) # /PC/pyconfig.h.in always exists even if unused - pyconfig_h = os.path.join(srcdir, 'PC', 'pyconfig.h.in') - self.assertTrue(os.path.exists(pyconfig_h), pyconfig_h) pyconfig_h_in = os.path.join(srcdir, 'pyconfig.h.in') self.assertTrue(os.path.exists(pyconfig_h_in), pyconfig_h_in) if os.name == 'nt': - # /pyconfig.h exists on Windows in a build tree - pyconfig_h = os.path.join(sys.executable, '..', 'pyconfig.h') + pyconfig_h = os.path.join(srcdir, 'PC', 'pyconfig.h') self.assertTrue(os.path.exists(pyconfig_h), pyconfig_h) elif os.name == 'posix': makefile_dir = os.path.dirname(sysconfig.get_makefile_filename()) diff --git a/Misc/NEWS.d/next/Windows/2025-05-13-13-25-27.gh-issue-133779.-YcTBz.rst b/Misc/NEWS.d/next/Windows/2025-05-13-13-25-27.gh-issue-133779.-YcTBz.rst new file mode 100644 index 00000000000000..550600d5eebf11 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2025-05-13-13-25-27.gh-issue-133779.-YcTBz.rst @@ -0,0 +1,6 @@ +Reverts the change to generate different :file:`pyconfig.h` files based on +compiler settings, as it was frequently causing extension builds to break. +In particular, the ``Py_GIL_DISABLED`` preprocessor variable must now always +be defined explicitly when compiling for the experimental free-threaded +runtime. The :func:`sysconfig.get_config_var` function can be used to +determine whether the current runtime was compiled with that flag or not. diff --git a/PC/pyconfig.h.in b/PC/pyconfig.h similarity index 97% rename from PC/pyconfig.h.in rename to PC/pyconfig.h index 9e70303868e5de..66fe2ab0998493 100644 --- a/PC/pyconfig.h.in +++ b/PC/pyconfig.h @@ -94,12 +94,22 @@ WIN32 is still required for the locale module. #endif #endif /* Py_BUILD_CORE || Py_BUILD_CORE_BUILTIN || Py_BUILD_CORE_MODULE */ -/* Define to 1 if you want to disable the GIL */ -/* Uncomment the definition for free-threaded builds, or define it manually - * when compiling extension modules. Note that we test with #ifdef, so - * defining as 0 will still disable the GIL. */ -#ifndef Py_GIL_DISABLED -/* #define Py_GIL_DISABLED 1 */ +/* _DEBUG implies Py_DEBUG */ +#ifdef _DEBUG +# define Py_DEBUG 1 +#endif + +/* Define to 1 when compiling for experimental free-threaded builds */ +#ifdef Py_GIL_DISABLED +/* We undefine if it was set to zero because all later checks are #ifdef. + * Note that non-Windows builds do not do this, and so every effort should + * be made to avoid defining the variable at all when not desired. However, + * sysconfig.get_config_var always returns a 1 or a 0, and so it seems likely + * that a build backend will define it with the value. + */ +#if Py_GIL_DISABLED == 0 +#undef Py_GIL_DISABLED +#endif #endif /* Compiler specific defines */ diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index 8c161835af9a8c..efff6a58d895cb 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -276,7 +276,7 @@ - + @@ -436,31 +436,6 @@ - - - - - - - - - - @(PyConfigH->'%(FullPath)', ';') - $([System.IO.File]::ReadAllText($(PyConfigH))) - $([System.IO.File]::ReadAllText('$(IntDir)pyconfig.h')) - - - $(PyConfigHText.Replace('/* #define Py_GIL_DISABLED 1 */', '#define Py_GIL_DISABLED 1')) - - - - - diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 4e414dc913b9d5..7272542e13a5ca 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -10,10 +10,9 @@ $(MSBuildThisFileDirectory)obj\ $(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\$(ProjectName)\ $(IntDir.Replace(`\\`, `\`)) - - $(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\pythoncore\ $(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)_frozen\ $(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\zlib-ng\ + $(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)_$(Configuration) $(ProjectName) $(TargetName)$(PyDebugExt) false @@ -49,11 +48,12 @@ <_PlatformPreprocessorDefinition Condition="$(Platform) == 'x64'">_WIN64; <_PlatformPreprocessorDefinition Condition="$(Platform) == 'x64' and $(PlatformToolset) != 'ClangCL'">_M_X64;$(_PlatformPreprocessorDefinition) <_Py3NamePreprocessorDefinition>PY3_DLLNAME=L"$(Py3DllName)$(PyDebugExt)"; + <_FreeThreadedPreprocessorDefinition Condition="$(DisableGil) == 'true'">Py_GIL_DISABLED=1; - $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)Include\internal\mimalloc;$(GeneratedPyConfigDir);$(PySourcePath)PC;%(AdditionalIncludeDirectories) - WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PyStatsPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions) + $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)Include\internal\mimalloc;$(PySourcePath)PC;%(AdditionalIncludeDirectories) + WIN32;$(_Py3NamePreprocessorDefinition)$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PyStatsPreprocessorDefinition)$(_PydPreprocessorDefinition)$(_FreeThreadedPreprocessorDefinition)%(PreprocessorDefinitions) _Py_USING_PGO=1;%(PreprocessorDefinitions) MaxSpeed diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 549d6284972afc..32a8f2dbad3d5e 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -102,6 +102,7 @@ /Zm200 %(AdditionalOptions) $(PySourcePath)Modules\_hacl;$(PySourcePath)Modules\_hacl\include;$(PySourcePath)Python;%(AdditionalIncludeDirectories) $(zlibNgDir);$(GeneratedZlibNgDir);%(AdditionalIncludeDirectories) + $(GeneratedJitStencilsDir);%(AdditionalIncludeDirectories) _USRDLL;Py_BUILD_CORE;Py_BUILD_CORE_BUILTIN;Py_ENABLE_SHARED;MS_DLL_ID="$(SysWinVer)";ZLIB_COMPAT;%(PreprocessorDefinitions) _Py_HAVE_ZLIB;%(PreprocessorDefinitions) _Py_JIT;%(PreprocessorDefinitions) @@ -409,7 +410,7 @@ - + @@ -688,34 +689,6 @@ - - - - - - - - - @(PyConfigH->'%(FullPath)', ';') - $([System.IO.File]::ReadAllText($(PyConfigH))) - $([System.IO.File]::ReadAllText('$(IntDir)pyconfig.h')) - - - $(PyConfigHText.Replace('/* #define Py_GIL_DISABLED 1 */', '#define Py_GIL_DISABLED 1')) - - - - - - - - - - - git diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets index 3ad17737807235..21de614e71ddce 100644 --- a/PCbuild/regen.targets +++ b/PCbuild/regen.targets @@ -29,12 +29,12 @@ <_KeywordSources Include="$(PySourcePath)Grammar\python.gram;$(PySourcePath)Grammar\Tokens" /> <_KeywordOutputs Include="$(PySourcePath)Lib\keyword.py" /> - <_JITSources Include="$(PySourcePath)Python\executor_cases.c.h;$(GeneratedPyConfigDir)pyconfig.h;$(PySourcePath)Tools\jit\**"/> + <_JITSources Include="$(PySourcePath)Python\executor_cases.c.h;$(PySourcePath)PC\pyconfig.h;$(PySourcePath)Tools\jit\**"/> - <_JITOutputs Include="$(GeneratedPyConfigDir)jit_stencils.h"/> - <_JITOutputs Include="$(GeneratedPyConfigDir)jit_stencils-aarch64-pc-windows-msvc.h" Condition="$(Platform) == 'ARM64'"/> - <_JITOutputs Include="$(GeneratedPyConfigDir)jit_stencils-i686-pc-windows-msvc.h" Condition="$(Platform) == 'Win32'"/> - <_JITOutputs Include="$(GeneratedPyConfigDir)jit_stencils-x86_64-pc-windows-msvc.h" Condition="$(Platform) == 'x64'"/> + <_JITOutputs Include="$(GeneratedJitStencilsDir)jit_stencils.h"/> + <_JITOutputs Include="$(GeneratedJitStencilsDir)jit_stencils-aarch64-pc-windows-msvc.h" Condition="$(Platform) == 'ARM64'"/> + <_JITOutputs Include="$(GeneratedJitStencilsDir)jit_stencils-i686-pc-windows-msvc.h" Condition="$(Platform) == 'Win32'"/> + <_JITOutputs Include="$(GeneratedJitStencilsDir)jit_stencils-x86_64-pc-windows-msvc.h" Condition="$(Platform) == 'x64'"/> <_CasesSources Include="$(PySourcePath)Python\bytecodes.c;$(PySourcePath)Python\optimizer_bytecodes.c;"/> <_CasesOutputs Include="$(PySourcePath)Python\generated_cases.c.h;$(PySourcePath)Include\opcode_ids.h;$(PySourcePath)Include\internal\pycore_uop_ids.h;$(PySourcePath)Python\opcode_targets.h;$(PySourcePath)Include\internal\pycore_opcode_metadata.h;$(PySourcePath)Include\internal\pycore_uop_metadata.h;$(PySourcePath)Python\optimizer_cases.c.h;$(PySourcePath)Lib\_opcode_metadata.py"/> <_SbomSources Include="$(PySourcePath)PCbuild\get_externals.bat" /> @@ -116,7 +116,7 @@ @@ -126,7 +126,7 @@ $(JITArgs) --debug + WorkingDirectory="$(GeneratedJitStencilsDir)"/> diff --git a/Tools/msi/dev/dev_files.wxs b/Tools/msi/dev/dev_files.wxs index 4357dc86d9d356..21f9c848cc6be5 100644 --- a/Tools/msi/dev/dev_files.wxs +++ b/Tools/msi/dev/dev_files.wxs @@ -3,7 +3,7 @@ - + diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py index 41338c29bdd9eb..be289c352de585 100644 --- a/Tools/peg_generator/pegen/build.py +++ b/Tools/peg_generator/pegen/build.py @@ -108,6 +108,8 @@ def compile_c_extension( extra_compile_args.append("-DPy_BUILD_CORE_MODULE") # Define _Py_TEST_PEGEN to not call PyAST_Validate() in Parser/pegen.c extra_compile_args.append("-D_Py_TEST_PEGEN") + if sys.platform == "win32" and sysconfig.get_config_var("Py_GIL_DISABLED"): + extra_compile_args.append("-DPy_GIL_DISABLED") extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST") if keep_asserts: extra_compile_args.append("-UNDEBUG") From 7cbc3ea8fb1b0f1ac082466e4fc99b740357e675 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 19 May 2025 23:46:50 +0200 Subject: [PATCH 0140/1674] [3.14] gh-134235: Import Autocomplete for Builtin Modules (GH-134277) (#134285) gh-134235: Import Autocomplete for Builtin Modules (GH-134277) * added enhancement auto completing import with sys builtins --------- (cherry picked from commit 8421b03b16a4852a527256cb7cdce2ab2d318548) Co-authored-by: Tom Wang <85062819+tommix626@users.noreply.github.com> Co-authored-by: Hunter --- Lib/_pyrepl/_module_completer.py | 5 +++-- Lib/test/test_pyrepl/test_pyrepl.py | 20 +++++++++++++++++++ ...-05-19-15-05-24.gh-issue-134235.pz9PwV.rst | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst diff --git a/Lib/_pyrepl/_module_completer.py b/Lib/_pyrepl/_module_completer.py index 347f05607c75c5..0606797226d1e0 100644 --- a/Lib/_pyrepl/_module_completer.py +++ b/Lib/_pyrepl/_module_completer.py @@ -81,8 +81,9 @@ def find_modules(self, path: str, prefix: str) -> list[str]: def _find_modules(self, path: str, prefix: str) -> list[str]: if not path: # Top-level import (e.g. `import foo`` or `from foo`)` - return [name for _, name, _ in self.global_cache - if name.startswith(prefix)] + builtin_modules = [name for name in sys.builtin_module_names if name.startswith(prefix)] + third_party_modules = [name for _, name, _ in self.global_cache if name.startswith(prefix)] + return sorted(builtin_modules + third_party_modules) if path.startswith('.'): # Convert relative path to absolute path diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index a1cfbe4c3cadb7..59f5d1f893f9fd 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -959,6 +959,26 @@ def test_import_completions(self): output = reader.readline() self.assertEqual(output, expected) + def test_builtin_completion_top_level(self): + import importlib + # Make iter_modules() search only the standard library. + # This makes the test more reliable in case there are + # other user packages/scripts on PYTHONPATH which can + # intefere with the completions. + lib_path = os.path.dirname(importlib.__path__[0]) + sys.path = [lib_path] + + cases = ( + ("import bui\t\n", "import builtins"), + ("from bui\t\n", "from builtins"), + ) + for code, expected in cases: + with self.subTest(code=code): + events = code_to_events(code) + reader = self.prepare_reader(events, namespace={}) + output = reader.readline() + self.assertEqual(output, expected) + def test_relative_import_completions(self): cases = ( ("from .readl\t\n", "from .readline"), diff --git a/Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst b/Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst new file mode 100644 index 00000000000000..a65df886919145 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst @@ -0,0 +1,2 @@ +Updated tab completion on REPL to include builtin modules. Contributed by +Tom Wang, Hunter Young From e20f05f53fe6a54435923105329c9de24a10fd2e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 02:05:26 +0200 Subject: [PATCH 0141/1674] [3.14] gh-134201: Expand explanation of Base85 encodings in base64 docs (GH-134288) (#134298) gh-134201: Expand explanation of Base85 encodings in base64 docs (GH-134288) Explain history of de-facto standard and how to pick between the two Base-85 encoding functions in the base-64 module. --------- (cherry picked from commit 66aaad61037785639aec393be7618cb54b1372dc) Co-authored-by: Alek Binion Co-authored-by: C.A.M. Gerlach --- Doc/library/base64.rst | 48 ++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index 834ab2536e6c14..529a7242443820 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -15,14 +15,9 @@ This module provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data. -It provides encoding and decoding functions for the encodings specified in -:rfc:`4648`, which defines the Base16, Base32, and Base64 algorithms, -and for the de-facto standard Ascii85 and Base85 encodings. - -The :rfc:`4648` encodings are suitable for encoding binary data so that it can be -safely sent by email, used as parts of URLs, or included as part of an HTTP -POST request. The encoding algorithm is not the same as the -:program:`uuencode` program. +This includes the :ref:`encodings specified in ` +:rfc:`4648` (Base64, Base32 and Base16) +and the non-standard :ref:`Base85 encodings `. There are two interfaces provided by this module. The modern interface supports encoding :term:`bytes-like objects ` to ASCII @@ -30,7 +25,7 @@ supports encoding :term:`bytes-like objects ` to ASCII strings containing ASCII to :class:`bytes`. Both base-64 alphabets defined in :rfc:`4648` (normal, and URL- and filesystem-safe) are supported. -The legacy interface does not support decoding from strings, but it does +The :ref:`legacy interface ` does not support decoding from strings, but it does provide functions for encoding and decoding to and from :term:`file objects `. It only supports the Base64 standard alphabet, and it adds newlines every 76 characters as per :rfc:`2045`. Note that if you are looking @@ -46,7 +41,15 @@ package instead. Any :term:`bytes-like objects ` are now accepted by all encoding and decoding functions in this module. Ascii85/Base85 support added. -The modern interface provides: + +.. _base64-rfc-4648: + +RFC 4648 Encodings +------------------ + +The :rfc:`4648` encodings are suitable for encoding binary data so that it can be +safely sent by email, used as parts of URLs, or included as part of an HTTP +POST request. .. function:: b64encode(s, altchars=None) @@ -181,6 +184,26 @@ The modern interface provides: incorrectly padded or if there are non-alphabet characters present in the input. +.. _base64-base-85: + +Base85 Encodings +----------------- + +Base85 encoding is not formally specified but rather a de facto standard, +thus different systems perform the encoding differently. + +The :func:`a85encode` and :func:`b85encode` functions in this module are two implementations of +the de facto standard. You should call the function with the Base85 +implementation used by the software you intend to work with. + +The two functions present in this module differ in how they handle the following: + +* Whether to include enclosing ``<~`` and ``~>`` markers +* Whether to include newline characters +* The set of ASCII characters used for encoding +* Handling of null bytes + +Refer to the documentation of the individual functions for more information. .. function:: a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False) @@ -262,7 +285,10 @@ The modern interface provides: .. versionadded:: 3.13 -The legacy interface: +.. _base64-legacy: + +Legacy Interface +---------------- .. function:: decode(input, output) From 4effd060fcb309560c0fcbb2201954752cacf72e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 04:25:24 +0200 Subject: [PATCH 0142/1674] [3.14] gh-132983: Convert zstd ``__new__`` methods to Argument Clinic (GH-133860) (#133915) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/data/python3.14.abi | 2441 +++++++++-------- .../pycore_global_objects_fini_generated.h | 1 - Include/internal/pycore_global_strings.h | 1 - .../internal/pycore_runtime_init_generated.h | 1 - .../internal/pycore_unicodeobject_generated.h | 4 - Lib/test/test_zstd.py | 24 +- Modules/_zstd/_zstdmodule.c | 65 +- Modules/_zstd/_zstdmodule.h | 5 +- Modules/_zstd/buffer.h | 5 +- Modules/_zstd/clinic/_zstdmodule.c.h | 22 +- Modules/_zstd/clinic/compressor.c.h | 28 +- Modules/_zstd/clinic/decompressor.c.h | 22 +- Modules/_zstd/clinic/zstddict.c.h | 48 +- Modules/_zstd/compressor.c | 148 +- Modules/_zstd/decompressor.c | 119 +- Modules/_zstd/zstddict.c | 144 +- Modules/_zstd/zstddict.h | 9 +- 17 files changed, 1534 insertions(+), 1553 deletions(-) diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index 88792d211ae2c3..c9959bef98fd07 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -1141,12 +1141,18 @@ + + + + + + @@ -1228,6 +1234,7 @@ + @@ -1283,6 +1290,10 @@ + + + + @@ -1783,7 +1794,7 @@ - + @@ -3970,72 +3981,72 @@ - - + + - + - - - - + + + + - + - - + + - + - - + + - - + + - + - - + + - + - + - - + + - - - - + + + + - - - + + + - - + + - - + + @@ -6475,16 +6486,40 @@ - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -7163,101 +7198,101 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - - - - - + + + + + + @@ -7269,11 +7304,6 @@ - - - - - @@ -8081,89 +8111,94 @@ - - + + - - + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + + + + + + - - + + @@ -8803,116 +8838,136 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - + + - - - - + + + + - - + + - - + + @@ -14391,10 +14446,10 @@ - + - + @@ -17293,33 +17348,33 @@ - - + + - + - - + + - + - + - + - + - + - + - + @@ -17932,18 +17987,18 @@ - + - + - - + + - - + + @@ -18113,7 +18168,7 @@ - + @@ -19132,1246 +19187,1243 @@ - + - + - - + + - - + + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - + - + - - + + - + - - + + - + - + - - + + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - + - + - + - - + + - + - + - - + + - + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - + - + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - - + + - + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - - - + - - + + - - + + @@ -20502,20 +20554,20 @@ - + - + - + - + - + - + @@ -20909,7 +20961,7 @@ - + @@ -21119,7 +21171,7 @@ - + @@ -21127,7 +21179,7 @@ - + @@ -21283,7 +21335,7 @@ - + @@ -21971,12 +22023,12 @@ - + - + @@ -21989,19 +22041,19 @@ - + - + - + - + - + @@ -22013,7 +22065,7 @@ - + @@ -22143,7 +22195,7 @@ - + @@ -23620,6 +23672,11 @@ + + + + + @@ -24429,7 +24486,7 @@ - + @@ -24887,7 +24944,7 @@ - + @@ -26766,33 +26823,33 @@ - + - + - + - + - + - + - + - + - + - - + + @@ -26803,65 +26860,65 @@ - - + + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + @@ -26885,6 +26942,14 @@ + + + + + + + + @@ -26892,6 +26957,10 @@ + + + + @@ -26946,6 +27015,10 @@ + + + + @@ -26988,147 +27061,159 @@ - + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - - - + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - + + - - - - + + + + - - + + + + + + + + + + + + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - + + + + - - - - + + + + - - + + - - + + - - - - + + + + - - + + - - - - - + + + + + - - - - + + + + @@ -28228,24 +28313,24 @@ - + - + - + - + - + - + - + @@ -28547,116 +28632,116 @@ - - - - + + + + - - - - - + + + + + - - + + - + - + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - + + - - + + - - - + + + - + - - - + + + @@ -29637,19 +29722,19 @@ - + - + - + - + @@ -30573,100 +30658,92 @@ - - - - - - - - - - - + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - + + + - - - - + + + + - - - - - + + + + + - - + + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 9bde4faaf5a040..14fe9cdf0c77a0 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -904,7 +904,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(deterministic)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(device)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dict)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dict_content)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dictcomp)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(difference_update)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(digest)); diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 3a83fd6b6042e2..197362a3e98be0 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -395,7 +395,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(deterministic) STRUCT_FOR_ID(device) STRUCT_FOR_ID(dict) - STRUCT_FOR_ID(dict_content) STRUCT_FOR_ID(dictcomp) STRUCT_FOR_ID(difference_update) STRUCT_FOR_ID(digest) diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h index 4a34ffa559e124..cb6e9c0b02ce2c 100644 --- a/Include/internal/pycore_runtime_init_generated.h +++ b/Include/internal/pycore_runtime_init_generated.h @@ -902,7 +902,6 @@ extern "C" { INIT_ID(deterministic), \ INIT_ID(device), \ INIT_ID(dict), \ - INIT_ID(dict_content), \ INIT_ID(dictcomp), \ INIT_ID(difference_update), \ INIT_ID(digest), \ diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h index fefacef77c89ee..dbb0f4e921149c 100644 --- a/Include/internal/pycore_unicodeobject_generated.h +++ b/Include/internal/pycore_unicodeobject_generated.h @@ -1368,10 +1368,6 @@ _PyUnicode_InitStaticStrings(PyInterpreterState *interp) { _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); assert(PyUnicode_GET_LENGTH(string) != 1); - string = &_Py_ID(dict_content); - _PyUnicode_InternStatic(interp, &string); - assert(_PyUnicode_CheckConsistency(string, 1)); - assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dictcomp); _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); diff --git a/Lib/test/test_zstd.py b/Lib/test/test_zstd.py index 83d922d9cf22ac..53ca592ea38828 100644 --- a/Lib/test/test_zstd.py +++ b/Lib/test/test_zstd.py @@ -288,8 +288,8 @@ def test_unknown_compression_parameter(self): KEY = 100001234 option = {CompressionParameter.compression_level: 10, KEY: 200000000} - pattern = r'Zstd compression parameter.*?"unknown parameter \(key %d\)"' \ - % KEY + pattern = (r'Invalid zstd compression parameter.*?' + fr'"unknown parameter \(key {KEY}\)"') with self.assertRaisesRegex(ZstdError, pattern): ZstdCompressor(options=option) @@ -420,8 +420,8 @@ def test_unknown_decompression_parameter(self): KEY = 100001234 options = {DecompressionParameter.window_log_max: DecompressionParameter.window_log_max.bounds()[1], KEY: 200000000} - pattern = r'Zstd decompression parameter.*?"unknown parameter \(key %d\)"' \ - % KEY + pattern = (r'Invalid zstd decompression parameter.*?' + fr'"unknown parameter \(key {KEY}\)"') with self.assertRaisesRegex(ZstdError, pattern): ZstdDecompressor(options=options) @@ -507,7 +507,7 @@ def test_decompress_epilogue_flags(self): self.assertFalse(d.needs_input) def test_decompressor_arg(self): - zd = ZstdDict(b'12345678', True) + zd = ZstdDict(b'12345678', is_raw=True) with self.assertRaises(TypeError): d = ZstdDecompressor(zstd_dict={}) @@ -1021,6 +1021,10 @@ def test_decompressor_skippable(self): class ZstdDictTestCase(unittest.TestCase): def test_is_raw(self): + # must be passed as a keyword argument + with self.assertRaises(TypeError): + ZstdDict(bytes(8), True) + # content < 8 b = b'1234567' with self.assertRaises(ValueError): @@ -1068,9 +1072,9 @@ def test_invalid_dict(self): # corrupted zd = ZstdDict(dict_content, is_raw=False) - with self.assertRaisesRegex(ZstdError, r'ZSTD_CDict.*?corrupted'): + with self.assertRaisesRegex(ZstdError, r'ZSTD_CDict.*?content\.$'): ZstdCompressor(zstd_dict=zd.as_digested_dict) - with self.assertRaisesRegex(ZstdError, r'ZSTD_DDict.*?corrupted'): + with self.assertRaisesRegex(ZstdError, r'ZSTD_DDict.*?content\.$'): ZstdDecompressor(zd) # wrong type @@ -1096,7 +1100,7 @@ def test_train_dict(self): TRAINED_DICT = train_dict(SAMPLES, DICT_SIZE1) - ZstdDict(TRAINED_DICT.dict_content, False) + ZstdDict(TRAINED_DICT.dict_content, is_raw=False) self.assertNotEqual(TRAINED_DICT.dict_id, 0) self.assertGreater(len(TRAINED_DICT.dict_content), 0) @@ -1250,7 +1254,7 @@ def _nbytes(dat): def test_as_prefix(self): # V1 V1 = THIS_FILE_BYTES - zd = ZstdDict(V1, True) + zd = ZstdDict(V1, is_raw=True) # V2 mid = len(V1) // 2 @@ -1266,7 +1270,7 @@ def test_as_prefix(self): self.assertEqual(decompress(dat, zd.as_prefix), V2) # use wrong prefix - zd2 = ZstdDict(SAMPLES[0], True) + zd2 = ZstdDict(SAMPLES[0], is_raw=True) try: decompressed = decompress(dat, zd2.as_prefix) except ZstdError: # expected diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index c3852fe89732bc..0294828aa106ea 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -1,7 +1,4 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ #ifndef Py_BUILD_CORE_BUILTIN # define Py_BUILD_CORE_MODULE 1 @@ -34,17 +31,17 @@ set_zstd_error(const _zstd_state* const state, switch (type) { case ERR_DECOMPRESS: - msg = "Unable to decompress zstd data: %s"; + msg = "Unable to decompress Zstandard data: %s"; break; case ERR_COMPRESS: - msg = "Unable to compress zstd data: %s"; + msg = "Unable to compress Zstandard data: %s"; break; case ERR_LOAD_D_DICT: - msg = "Unable to load zstd dictionary or prefix for decompression: %s"; + msg = "Unable to load Zstandard dictionary or prefix for decompression: %s"; break; case ERR_LOAD_C_DICT: - msg = "Unable to load zstd dictionary or prefix for compression: %s"; + msg = "Unable to load Zstandard dictionary or prefix for compression: %s"; break; case ERR_GET_C_BOUNDS: @@ -58,10 +55,10 @@ set_zstd_error(const _zstd_state* const state, break; case ERR_TRAIN_DICT: - msg = "Unable to train zstd dictionary: %s"; + msg = "Unable to train the Zstandard dictionary: %s"; break; case ERR_FINALIZE_DICT: - msg = "Unable to finalize zstd dictionary: %s"; + msg = "Unable to finalize the Zstandard dictionary: %s"; break; default: @@ -152,7 +149,7 @@ set_parameter_error(const _zstd_state* const state, int is_compress, } if (ZSTD_isError(bounds.error)) { PyErr_Format(state->ZstdError, - "Zstd %s parameter \"%s\" is invalid.", + "Invalid zstd %s parameter \"%s\".", type, name); return; } @@ -187,13 +184,13 @@ _zstd.train_dict The size of the dictionary. / -Internal function, train a zstd dictionary on sample data. +Train a Zstandard dictionary on sample data. [clinic start generated code]*/ static PyObject * _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, PyObject *samples_sizes, Py_ssize_t dict_size) -/*[clinic end generated code: output=8e87fe43935e8f77 input=70fcd8937f2528b6]*/ +/*[clinic end generated code: output=8e87fe43935e8f77 input=d20dedb21c72cb62]*/ { // TODO(emmatyping): The preamble and suffix to this function and _finalize_dict // are pretty similar. We should see if we can refactor them to share that code. @@ -258,7 +255,7 @@ _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, chunk_sizes, (uint32_t)chunks_number); Py_END_ALLOW_THREADS - /* Check zstd dict error */ + /* Check Zstandard dict error */ if (ZDICT_isError(zstd_ret)) { _zstd_state* const mod_state = get_zstd_state(module); set_zstd_error(mod_state, ERR_TRAIN_DICT, zstd_ret); @@ -292,10 +289,10 @@ _zstd.finalize_dict dict_size: Py_ssize_t The size of the dictionary. compression_level: int - Optimize for a specific zstd compression level, 0 means default. + Optimize for a specific Zstandard compression level, 0 means default. / -Internal function, finalize a zstd dictionary. +Finalize a Zstandard dictionary. [clinic start generated code]*/ static PyObject * @@ -303,7 +300,7 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, PyBytesObject *samples_bytes, PyObject *samples_sizes, Py_ssize_t dict_size, int compression_level) -/*[clinic end generated code: output=f91821ba5ae85bda input=130d1508adb55ba1]*/ +/*[clinic end generated code: output=f91821ba5ae85bda input=3c7e2480aa08fb56]*/ { Py_ssize_t chunks_number; size_t *chunk_sizes = NULL; @@ -360,7 +357,7 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, /* Parameters */ - /* Optimize for a specific zstd compression level, 0 means default. */ + /* Optimize for a specific Zstandard compression level, 0 means default. */ params.compressionLevel = compression_level; /* Write log to stderr, 0 = none. */ params.notificationLevel = 0; @@ -376,7 +373,7 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, (uint32_t)chunks_number, params); Py_END_ALLOW_THREADS - /* Check zstd dict error */ + /* Check Zstandard dict error */ if (ZDICT_isError(zstd_ret)) { _zstd_state* const mod_state = get_zstd_state(module); set_zstd_error(mod_state, ERR_FINALIZE_DICT, zstd_ret); @@ -407,12 +404,12 @@ _zstd.get_param_bounds is_compress: bool True for CompressionParameter, False for DecompressionParameter. -Internal function, get CompressionParameter/DecompressionParameter bounds. +Get CompressionParameter/DecompressionParameter bounds. [clinic start generated code]*/ static PyObject * _zstd_get_param_bounds_impl(PyObject *module, int parameter, int is_compress) -/*[clinic end generated code: output=4acf5a876f0620ca input=84e669591e487008]*/ +/*[clinic end generated code: output=4acf5a876f0620ca input=45742ef0a3531b65]*/ { ZSTD_bounds bound; if (is_compress) { @@ -442,14 +439,12 @@ _zstd.get_frame_size A bytes-like object, it should start from the beginning of a frame, and contains at least one complete frame. -Get the size of a zstd frame, including frame header and 4-byte checksum if it has one. - -It will iterate all blocks' headers within a frame, to accumulate the frame size. +Get the size of a Zstandard frame, including the header and optional checksum. [clinic start generated code]*/ static PyObject * _zstd_get_frame_size_impl(PyObject *module, Py_buffer *frame_buffer) -/*[clinic end generated code: output=a7384c2f8780f442 input=7d3ad24311893bf3]*/ +/*[clinic end generated code: output=a7384c2f8780f442 input=3b9f73f8c8129d38]*/ { size_t frame_size; @@ -457,9 +452,9 @@ _zstd_get_frame_size_impl(PyObject *module, Py_buffer *frame_buffer) if (ZSTD_isError(frame_size)) { _zstd_state* const mod_state = get_zstd_state(module); PyErr_Format(mod_state->ZstdError, - "Error when finding the compressed size of a zstd frame. " - "Make sure the frame_buffer argument starts from the " - "beginning of a frame, and its length not less than this " + "Error when finding the compressed size of a Zstandard frame. " + "Ensure the frame_buffer argument starts from the " + "beginning of a frame, and its length is not less than this " "complete frame. Zstd error message: %s.", ZSTD_getErrorName(frame_size)); return NULL; @@ -472,14 +467,14 @@ _zstd_get_frame_size_impl(PyObject *module, Py_buffer *frame_buffer) _zstd.get_frame_info frame_buffer: Py_buffer - A bytes-like object, containing the header of a zstd frame. + A bytes-like object, containing the header of a Zstandard frame. -Internal function, get zstd frame infomation from a frame header. +Get Zstandard frame infomation from a frame header. [clinic start generated code]*/ static PyObject * _zstd_get_frame_info_impl(PyObject *module, Py_buffer *frame_buffer) -/*[clinic end generated code: output=56e033cf48001929 input=1816f14656b6aa22]*/ +/*[clinic end generated code: output=56e033cf48001929 input=94b240583ae22ca5]*/ { uint64_t decompressed_size; uint32_t dict_id; @@ -494,9 +489,9 @@ _zstd_get_frame_info_impl(PyObject *module, Py_buffer *frame_buffer) _zstd_state* const mod_state = get_zstd_state(module); PyErr_SetString(mod_state->ZstdError, "Error when getting information from the header of " - "a zstd frame. Make sure the frame_buffer argument " + "a Zstandard frame. Ensure the frame_buffer argument " "starts from the beginning of a frame, and its length " - "not less than the frame header (6~18 bytes)."); + "is not less than the frame header (6~18 bytes)."); return NULL; } @@ -518,13 +513,13 @@ _zstd.set_parameter_types d_parameter_type: object(subclass_of='&PyType_Type') DecompressionParameter IntEnum type object -Internal function, set CompressionParameter/DecompressionParameter types for validity check. +Set CompressionParameter and DecompressionParameter types for validity check. [clinic start generated code]*/ static PyObject * _zstd_set_parameter_types_impl(PyObject *module, PyObject *c_parameter_type, PyObject *d_parameter_type) -/*[clinic end generated code: output=f3313b1294f19502 input=30402523871b8280]*/ +/*[clinic end generated code: output=f3313b1294f19502 input=75d7a953580fae5f]*/ { _zstd_state* const mod_state = get_zstd_state(module); diff --git a/Modules/_zstd/_zstdmodule.h b/Modules/_zstd/_zstdmodule.h index 00e0d2177f31f6..b36486442c6567 100644 --- a/Modules/_zstd/_zstdmodule.h +++ b/Modules/_zstd/_zstdmodule.h @@ -1,7 +1,4 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ /* Declarations shared between different parts of the _zstd module*/ diff --git a/Modules/_zstd/buffer.h b/Modules/_zstd/buffer.h index c902eef4f8e037..bff3a81d8aa11c 100644 --- a/Modules/_zstd/buffer.h +++ b/Modules/_zstd/buffer.h @@ -1,7 +1,4 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ #ifndef ZSTD_BUFFER_H #define ZSTD_BUFFER_H diff --git a/Modules/_zstd/clinic/_zstdmodule.c.h b/Modules/_zstd/clinic/_zstdmodule.c.h index fc9f49813df6f1..766e1cfa776767 100644 --- a/Modules/_zstd/clinic/_zstdmodule.c.h +++ b/Modules/_zstd/clinic/_zstdmodule.c.h @@ -13,7 +13,7 @@ PyDoc_STRVAR(_zstd_train_dict__doc__, "train_dict($module, samples_bytes, samples_sizes, dict_size, /)\n" "--\n" "\n" -"Internal function, train a zstd dictionary on sample data.\n" +"Train a Zstandard dictionary on sample data.\n" "\n" " samples_bytes\n" " Concatenation of samples.\n" @@ -73,7 +73,7 @@ PyDoc_STRVAR(_zstd_finalize_dict__doc__, " dict_size, compression_level, /)\n" "--\n" "\n" -"Internal function, finalize a zstd dictionary.\n" +"Finalize a Zstandard dictionary.\n" "\n" " custom_dict_bytes\n" " Custom dictionary content.\n" @@ -84,7 +84,7 @@ PyDoc_STRVAR(_zstd_finalize_dict__doc__, " dict_size\n" " The size of the dictionary.\n" " compression_level\n" -" Optimize for a specific zstd compression level, 0 means default."); +" Optimize for a specific Zstandard compression level, 0 means default."); #define _ZSTD_FINALIZE_DICT_METHODDEF \ {"finalize_dict", _PyCFunction_CAST(_zstd_finalize_dict), METH_FASTCALL, _zstd_finalize_dict__doc__}, @@ -149,7 +149,7 @@ PyDoc_STRVAR(_zstd_get_param_bounds__doc__, "get_param_bounds($module, /, parameter, is_compress)\n" "--\n" "\n" -"Internal function, get CompressionParameter/DecompressionParameter bounds.\n" +"Get CompressionParameter/DecompressionParameter bounds.\n" "\n" " parameter\n" " The parameter to get bounds.\n" @@ -220,13 +220,11 @@ PyDoc_STRVAR(_zstd_get_frame_size__doc__, "get_frame_size($module, /, frame_buffer)\n" "--\n" "\n" -"Get the size of a zstd frame, including frame header and 4-byte checksum if it has one.\n" +"Get the size of a Zstandard frame, including the header and optional checksum.\n" "\n" " frame_buffer\n" " A bytes-like object, it should start from the beginning of a frame,\n" -" and contains at least one complete frame.\n" -"\n" -"It will iterate all blocks\' headers within a frame, to accumulate the frame size."); +" and contains at least one complete frame."); #define _ZSTD_GET_FRAME_SIZE_METHODDEF \ {"get_frame_size", _PyCFunction_CAST(_zstd_get_frame_size), METH_FASTCALL|METH_KEYWORDS, _zstd_get_frame_size__doc__}, @@ -291,10 +289,10 @@ PyDoc_STRVAR(_zstd_get_frame_info__doc__, "get_frame_info($module, /, frame_buffer)\n" "--\n" "\n" -"Internal function, get zstd frame infomation from a frame header.\n" +"Get Zstandard frame infomation from a frame header.\n" "\n" " frame_buffer\n" -" A bytes-like object, containing the header of a zstd frame."); +" A bytes-like object, containing the header of a Zstandard frame."); #define _ZSTD_GET_FRAME_INFO_METHODDEF \ {"get_frame_info", _PyCFunction_CAST(_zstd_get_frame_info), METH_FASTCALL|METH_KEYWORDS, _zstd_get_frame_info__doc__}, @@ -359,7 +357,7 @@ PyDoc_STRVAR(_zstd_set_parameter_types__doc__, "set_parameter_types($module, /, c_parameter_type, d_parameter_type)\n" "--\n" "\n" -"Internal function, set CompressionParameter/DecompressionParameter types for validity check.\n" +"Set CompressionParameter and DecompressionParameter types for validity check.\n" "\n" " c_parameter_type\n" " CompressionParameter IntEnum type object\n" @@ -428,4 +426,4 @@ _zstd_set_parameter_types(PyObject *module, PyObject *const *args, Py_ssize_t na exit: return return_value; } -/*[clinic end generated code: output=8445b658dcdcbb9c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=437b084f149e68e5 input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/clinic/compressor.c.h b/Modules/_zstd/clinic/compressor.c.h index d7909cdf89fcd1..f69161b590e5b7 100644 --- a/Modules/_zstd/clinic/compressor.c.h +++ b/Modules/_zstd/clinic/compressor.c.h @@ -8,30 +8,30 @@ preserve #endif #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() -PyDoc_STRVAR(_zstd_ZstdCompressor___init____doc__, +PyDoc_STRVAR(_zstd_ZstdCompressor_new__doc__, "ZstdCompressor(level=None, options=None, zstd_dict=None)\n" "--\n" "\n" "Create a compressor object for compressing data incrementally.\n" "\n" " level\n" -" The compression level to use, defaults to ZSTD_CLEVEL_DEFAULT.\n" +" The compression level to use. Defaults to COMPRESSION_LEVEL_DEFAULT.\n" " options\n" " A dict object that contains advanced compression parameters.\n" " zstd_dict\n" -" A ZstdDict object, a pre-trained zstd dictionary.\n" +" A ZstdDict object, a pre-trained Zstandard dictionary.\n" "\n" "Thread-safe at method level. For one-shot compression, use the compress()\n" "function instead."); -static int -_zstd_ZstdCompressor___init___impl(ZstdCompressor *self, PyObject *level, - PyObject *options, PyObject *zstd_dict); +static PyObject * +_zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, + PyObject *options, PyObject *zstd_dict); -static int -_zstd_ZstdCompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) +static PyObject * +_zstd_ZstdCompressor_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { - int return_value = -1; + PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) #define NUM_KEYWORDS 3 @@ -89,7 +89,7 @@ _zstd_ZstdCompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) } zstd_dict = fastargs[2]; skip_optional_pos: - return_value = _zstd_ZstdCompressor___init___impl((ZstdCompressor *)self, level, options, zstd_dict); + return_value = _zstd_ZstdCompressor_new_impl(type, level, options, zstd_dict); exit: return return_value; @@ -189,9 +189,9 @@ PyDoc_STRVAR(_zstd_ZstdCompressor_flush__doc__, " Can be these 2 values ZstdCompressor.FLUSH_FRAME,\n" " ZstdCompressor.FLUSH_BLOCK\n" "\n" -"Flush any remaining data left in internal buffers. Since zstd data consists\n" -"of one or more independent frames, the compressor object can still be used\n" -"after this method is called."); +"Flush any remaining data left in internal buffers. Since Zstandard data\n" +"consists of one or more independent frames, the compressor object can still\n" +"be used after this method is called."); #define _ZSTD_ZSTDCOMPRESSOR_FLUSH_METHODDEF \ {"flush", _PyCFunction_CAST(_zstd_ZstdCompressor_flush), METH_FASTCALL|METH_KEYWORDS, _zstd_ZstdCompressor_flush__doc__}, @@ -252,4 +252,4 @@ _zstd_ZstdCompressor_flush(PyObject *self, PyObject *const *args, Py_ssize_t nar exit: return return_value; } -/*[clinic end generated code: output=ef69eab155be39f6 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ee2d1dc298de790c input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/clinic/decompressor.c.h b/Modules/_zstd/clinic/decompressor.c.h index 9359c637203f8f..4ecb19e9bde6ed 100644 --- a/Modules/_zstd/clinic/decompressor.c.h +++ b/Modules/_zstd/clinic/decompressor.c.h @@ -10,28 +10,28 @@ preserve #include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() -PyDoc_STRVAR(_zstd_ZstdDecompressor___init____doc__, +PyDoc_STRVAR(_zstd_ZstdDecompressor_new__doc__, "ZstdDecompressor(zstd_dict=None, options=None)\n" "--\n" "\n" "Create a decompressor object for decompressing data incrementally.\n" "\n" " zstd_dict\n" -" A ZstdDict object, a pre-trained zstd dictionary.\n" +" A ZstdDict object, a pre-trained Zstandard dictionary.\n" " options\n" " A dict object that contains advanced decompression parameters.\n" "\n" "Thread-safe at method level. For one-shot decompression, use the decompress()\n" "function instead."); -static int -_zstd_ZstdDecompressor___init___impl(ZstdDecompressor *self, - PyObject *zstd_dict, PyObject *options); +static PyObject * +_zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, + PyObject *options); -static int -_zstd_ZstdDecompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) +static PyObject * +_zstd_ZstdDecompressor_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { - int return_value = -1; + PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) #define NUM_KEYWORDS 2 @@ -82,7 +82,7 @@ _zstd_ZstdDecompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs } options = fastargs[1]; skip_optional_pos: - return_value = _zstd_ZstdDecompressor___init___impl((ZstdDecompressor *)self, zstd_dict, options); + return_value = _zstd_ZstdDecompressor_new_impl(type, zstd_dict, options); exit: return return_value; @@ -130,7 +130,7 @@ PyDoc_STRVAR(_zstd_ZstdDecompressor_decompress__doc__, "Decompress *data*, returning uncompressed bytes if possible, or b\'\' otherwise.\n" "\n" " data\n" -" A bytes-like object, zstd data to be decompressed.\n" +" A bytes-like object, Zstandard data to be decompressed.\n" " max_length\n" " Maximum size of returned data. When it is negative, the size of\n" " output buffer is unlimited. When it is nonnegative, returns at\n" @@ -227,4 +227,4 @@ _zstd_ZstdDecompressor_decompress(PyObject *self, PyObject *const *args, Py_ssiz return return_value; } -/*[clinic end generated code: output=ae703f0465a2906d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7a4d278f9244e684 input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/clinic/zstddict.c.h b/Modules/_zstd/clinic/zstddict.c.h index 4e0f7b64172a74..34e0e4b3ecfe72 100644 --- a/Modules/_zstd/clinic/zstddict.c.h +++ b/Modules/_zstd/clinic/zstddict.c.h @@ -9,35 +9,33 @@ preserve #include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() -PyDoc_STRVAR(_zstd_ZstdDict___init____doc__, -"ZstdDict(dict_content, is_raw=False)\n" +PyDoc_STRVAR(_zstd_ZstdDict_new__doc__, +"ZstdDict(dict_content, /, *, is_raw=False)\n" "--\n" "\n" -"Represents a zstd dictionary, which can be used for compression/decompression.\n" +"Represents a Zstandard dictionary.\n" "\n" " dict_content\n" -" A bytes-like object, dictionary\'s content.\n" +" The content of a Zstandard dictionary as a bytes-like object.\n" " is_raw\n" -" This parameter is for advanced user. True means dict_content\n" -" argument is a \"raw content\" dictionary, free of any format\n" -" restriction. False means dict_content argument is an ordinary\n" -" zstd dictionary, was created by zstd functions, follow a\n" -" specified format.\n" +" If true, perform no checks on *dict_content*, useful for some\n" +" advanced cases. Otherwise, check that the content represents\n" +" a Zstandard dictionary created by the zstd library or CLI.\n" "\n" -"It\'s thread-safe, and can be shared by multiple ZstdCompressor /\n" -"ZstdDecompressor objects."); +"The dictionary can be used for compression or decompression, and can be shared\n" +"by multiple ZstdCompressor or ZstdDecompressor objects."); -static int -_zstd_ZstdDict___init___impl(ZstdDict *self, PyObject *dict_content, - int is_raw); +static PyObject * +_zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject *dict_content, + int is_raw); -static int -_zstd_ZstdDict___init__(PyObject *self, PyObject *args, PyObject *kwargs) +static PyObject * +_zstd_ZstdDict_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { - int return_value = -1; + PyObject *return_value = NULL; #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) - #define NUM_KEYWORDS 2 + #define NUM_KEYWORDS 1 static struct { PyGC_Head _this_is_not_used; PyObject_VAR_HEAD @@ -46,7 +44,7 @@ _zstd_ZstdDict___init__(PyObject *self, PyObject *args, PyObject *kwargs) } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) .ob_hash = -1, - .ob_item = { &_Py_ID(dict_content), &_Py_ID(is_raw), }, + .ob_item = { &_Py_ID(is_raw), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -55,7 +53,7 @@ _zstd_ZstdDict___init__(PyObject *self, PyObject *args, PyObject *kwargs) # define KWTUPLE NULL #endif // !Py_BUILD_CORE - static const char * const _keywords[] = {"dict_content", "is_raw", NULL}; + static const char * const _keywords[] = {"", "is_raw", NULL}; static _PyArg_Parser _parser = { .keywords = _keywords, .fname = "ZstdDict", @@ -70,20 +68,20 @@ _zstd_ZstdDict___init__(PyObject *self, PyObject *args, PyObject *kwargs) int is_raw = 0; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, - /*minpos*/ 1, /*maxpos*/ 2, /*minkw*/ 0, /*varpos*/ 0, argsbuf); + /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); if (!fastargs) { goto exit; } dict_content = fastargs[0]; if (!noptargs) { - goto skip_optional_pos; + goto skip_optional_kwonly; } is_raw = PyObject_IsTrue(fastargs[1]); if (is_raw < 0) { goto exit; } -skip_optional_pos: - return_value = _zstd_ZstdDict___init___impl((ZstdDict *)self, dict_content, is_raw); +skip_optional_kwonly: + return_value = _zstd_ZstdDict_new_impl(type, dict_content, is_raw); exit: return return_value; @@ -204,4 +202,4 @@ _zstd_ZstdDict_as_prefix_get(PyObject *self, void *Py_UNUSED(context)) return return_value; } -/*[clinic end generated code: output=59257c053f74eda7 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bfb31c1187477afd input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index 4f340f56b6fca8..97693fd043efb2 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -1,7 +1,4 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ /* ZstdCompressor class definitions */ @@ -21,7 +18,6 @@ class _zstd.ZstdCompressor "ZstdCompressor *" "&zstd_compressor_type_spec" #include "buffer.h" #include "zstddict.h" -#include // bool #include // offsetof() #include // ZSTD_*() @@ -42,9 +38,6 @@ typedef struct { /* Compression level */ int compression_level; - - /* __init__ has been called, 0 or 1. */ - bool initialized; } ZstdCompressor; #define ZstdCompressor_CAST(op) ((ZstdCompressor *)op) @@ -122,7 +115,7 @@ _zstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, self->compression_level = value_v; } else if (key_v == ZSTD_c_nbWorkers) { - /* From zstd library doc: + /* From the zstd library docs: 1. When nbWorkers >= 1, triggers asynchronous mode when used with ZSTD_compressStream2(). 2, Default value is `0`, aka "single-threaded mode" : no @@ -189,8 +182,8 @@ _get_CDict(ZstdDict *self, int compressionLevel) _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { PyErr_SetString(mod_state->ZstdError, - "Failed to create ZSTD_CDict instance from zstd " - "dictionary content. Maybe the content is corrupted."); + "Failed to create a ZSTD_CDict instance from " + "Zstandard dictionary content."); } goto error; } @@ -318,20 +311,34 @@ _zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) return 0; } +/*[clinic input] +@classmethod +_zstd.ZstdCompressor.__new__ as _zstd_ZstdCompressor_new + level: object = None + The compression level to use. Defaults to COMPRESSION_LEVEL_DEFAULT. + options: object = None + A dict object that contains advanced compression parameters. + zstd_dict: object = None + A ZstdDict object, a pre-trained Zstandard dictionary. + +Create a compressor object for compressing data incrementally. + +Thread-safe at method level. For one-shot compression, use the compress() +function instead. +[clinic start generated code]*/ + static PyObject * -_zstd_ZstdCompressor_new(PyTypeObject *type, PyObject *Py_UNUSED(args), PyObject *Py_UNUSED(kwargs)) +_zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, + PyObject *options, PyObject *zstd_dict) +/*[clinic end generated code: output=cdef61eafecac3d7 input=92de0211ae20ffdc]*/ { - ZstdCompressor *self; - self = PyObject_GC_New(ZstdCompressor, type); + ZstdCompressor* self = PyObject_GC_New(ZstdCompressor, type); if (self == NULL) { goto error; } - self->initialized = 0; - self->dict = NULL; self->use_multithread = 0; - /* Compression context */ self->cctx = ZSTD_createCCtx(); if (self->cctx == NULL) { @@ -346,6 +353,37 @@ _zstd_ZstdCompressor_new(PyTypeObject *type, PyObject *Py_UNUSED(args), PyObject /* Last mode */ self->last_mode = ZSTD_e_end; + if (level != Py_None && options != Py_None) { + PyErr_SetString(PyExc_RuntimeError, "Only one of level or options should be used."); + goto error; + } + + /* Set compressLevel/options to compression context */ + if (level != Py_None) { + if (_zstd_set_c_parameters(self, level, "level", "int") < 0) { + goto error; + } + } + + if (options != Py_None) { + if (_zstd_set_c_parameters(self, options, "options", "dict") < 0) { + goto error; + } + } + + /* Load Zstandard dictionary to compression context */ + self->dict = NULL; + if (zstd_dict != Py_None) { + if (_zstd_load_c_dict(self, zstd_dict) < 0) { + goto error; + } + Py_INCREF(zstd_dict); + self->dict = zstd_dict; + } + + // We can only start GC tracking once self->dict is set. + PyObject_GC_Track(self); + return (PyObject*)self; error: @@ -373,67 +411,6 @@ ZstdCompressor_dealloc(PyObject *ob) Py_DECREF(tp); } -/*[clinic input] -_zstd.ZstdCompressor.__init__ - - level: object = None - The compression level to use, defaults to ZSTD_CLEVEL_DEFAULT. - options: object = None - A dict object that contains advanced compression parameters. - zstd_dict: object = None - A ZstdDict object, a pre-trained zstd dictionary. - -Create a compressor object for compressing data incrementally. - -Thread-safe at method level. For one-shot compression, use the compress() -function instead. -[clinic start generated code]*/ - -static int -_zstd_ZstdCompressor___init___impl(ZstdCompressor *self, PyObject *level, - PyObject *options, PyObject *zstd_dict) -/*[clinic end generated code: output=215e6c4342732f96 input=9f79b0d8d34c8ef0]*/ -{ - if (self->initialized) { - PyErr_SetString(PyExc_RuntimeError, "reinitialization not supported"); - return -1; - } - self->initialized = 1; - - if (level != Py_None && options != Py_None) { - PyErr_SetString(PyExc_RuntimeError, "Only one of level or options should be used."); - return -1; - } - - /* Set compressLevel/options to compression context */ - if (level != Py_None) { - if (_zstd_set_c_parameters(self, level, "level", "int") < 0) { - return -1; - } - } - - if (options != Py_None) { - if (_zstd_set_c_parameters(self, options, "options", "dict") < 0) { - return -1; - } - } - - /* Load dictionary to compression context */ - if (zstd_dict != Py_None) { - if (_zstd_load_c_dict(self, zstd_dict) < 0) { - return -1; - } - - /* Py_INCREF the dict */ - Py_INCREF(zstd_dict); - self->dict = zstd_dict; - } - - // We can only start tracking self with the GC once self->dict is set. - PyObject_GC_Track(self); - return 0; -} - static PyObject * compress_impl(ZstdCompressor *self, Py_buffer *data, ZSTD_EndDirective end_directive) @@ -469,7 +446,7 @@ compress_impl(ZstdCompressor *self, Py_buffer *data, } - /* zstd stream compress */ + /* Zstandard stream compress */ while (1) { Py_BEGIN_ALLOW_THREADS zstd_ret = ZSTD_compressStream2(self->cctx, &out, &in, end_directive); @@ -535,7 +512,7 @@ compress_mt_continue_impl(ZstdCompressor *self, Py_buffer *data) goto error; } - /* zstd stream compress */ + /* Zstandard stream compress */ while (1) { Py_BEGIN_ALLOW_THREADS do { @@ -644,14 +621,14 @@ _zstd.ZstdCompressor.flush Finish the compression process. -Flush any remaining data left in internal buffers. Since zstd data consists -of one or more independent frames, the compressor object can still be used -after this method is called. +Flush any remaining data left in internal buffers. Since Zstandard data +consists of one or more independent frames, the compressor object can still +be used after this method is called. [clinic start generated code]*/ static PyObject * _zstd_ZstdCompressor_flush_impl(ZstdCompressor *self, int mode) -/*[clinic end generated code: output=b7cf2c8d64dcf2e3 input=a766870301932b85]*/ +/*[clinic end generated code: output=b7cf2c8d64dcf2e3 input=0ab19627f323cdbc]*/ { PyObject *ret; @@ -719,10 +696,9 @@ ZstdCompressor_clear(PyObject *ob) static PyType_Slot zstdcompressor_slots[] = { {Py_tp_new, _zstd_ZstdCompressor_new}, {Py_tp_dealloc, ZstdCompressor_dealloc}, - {Py_tp_init, _zstd_ZstdCompressor___init__}, {Py_tp_methods, ZstdCompressor_methods}, {Py_tp_members, ZstdCompressor_members}, - {Py_tp_doc, (char*)_zstd_ZstdCompressor___init____doc__}, + {Py_tp_doc, (void *)_zstd_ZstdCompressor_new__doc__}, {Py_tp_traverse, ZstdCompressor_traverse}, {Py_tp_clear, ZstdCompressor_clear}, {0, 0} diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index dc3e90a22d8dbb..852b796a872eef 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -1,7 +1,4 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ /* ZstdDecompressor class definition */ @@ -48,9 +45,6 @@ typedef struct { /* For ZstdDecompressor, 0 or 1. 1 means the end of the first frame has been reached. */ bool eof; - - /* __init__ has been called, 0 or 1. */ - bool initialized; } ZstdDecompressor; #define ZstdDecompressor_CAST(op) ((ZstdDecompressor *)op) @@ -81,8 +75,8 @@ _get_DDict(ZstdDict *self) _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { PyErr_SetString(mod_state->ZstdError, - "Failed to create ZSTD_DDict instance from zstd " - "dictionary content. Maybe the content is corrupted."); + "Failed to create a ZSTD_DDict instance from " + "Zstandard dictionary content."); } } } @@ -265,8 +259,8 @@ _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) finish ZSTD_decompressStream()'s size_t return value: - - 0 when a frame is completely decoded and fully flushed, zstd's internal - buffer has no data. + - 0 when a frame is completely decoded and fully flushed, + zstd's internal buffer has no data. - An error code, which can be tested using ZSTD_isError(). - Or any other value > 0, which means there is still some decoding or flushing to do to complete current frame. @@ -311,7 +305,7 @@ decompress_impl(ZstdDecompressor *self, ZSTD_inBuffer *in, } /* Need to check out before in. Maybe zstd's internal buffer still has - a few bytes can be output, grow the buffer and continue. */ + a few bytes that can be output, grow the buffer and continue. */ if (out.pos == out.size) { /* Output buffer exhausted */ @@ -373,7 +367,7 @@ stream_decompress(ZstdDecompressor *self, Py_buffer *data, Py_ssize_t max_length /* Check .eof flag */ if (self->eof) { - PyErr_SetString(PyExc_EOFError, "Already at the end of a zstd frame."); + PyErr_SetString(PyExc_EOFError, "Already at the end of a Zstandard frame."); assert(ret == NULL); return NULL; } @@ -530,17 +524,30 @@ stream_decompress(ZstdDecompressor *self, Py_buffer *data, Py_ssize_t max_length } +/*[clinic input] +@classmethod +_zstd.ZstdDecompressor.__new__ as _zstd_ZstdDecompressor_new + zstd_dict: object = None + A ZstdDict object, a pre-trained Zstandard dictionary. + options: object = None + A dict object that contains advanced decompression parameters. + +Create a decompressor object for decompressing data incrementally. + +Thread-safe at method level. For one-shot decompression, use the decompress() +function instead. +[clinic start generated code]*/ + static PyObject * -_zstd_ZstdDecompressor_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +_zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, + PyObject *options) +/*[clinic end generated code: output=590ca65c1102ff4a input=213daa57e3ea4062]*/ { - ZstdDecompressor *self; - self = PyObject_GC_New(ZstdDecompressor, type); + ZstdDecompressor* self = PyObject_GC_New(ZstdDecompressor, type); if (self == NULL) { goto error; } - self->initialized = 0; - self->dict = NULL; self->input_buffer = NULL; self->input_buffer_size = 0; self->in_begin = -1; @@ -562,6 +569,26 @@ _zstd_ZstdDecompressor_new(PyTypeObject *type, PyObject *args, PyObject *kwds) goto error; } + /* Load Zstandard dictionary to decompression context */ + self->dict = NULL; + if (zstd_dict != Py_None) { + if (_zstd_load_d_dict(self, zstd_dict) < 0) { + goto error; + } + Py_INCREF(zstd_dict); + self->dict = zstd_dict; + } + + /* Set option to decompression context */ + if (options != Py_None) { + if (_zstd_set_d_parameters(self, options) < 0) { + goto error; + } + } + + // We can only start GC tracking once self->dict is set. + PyObject_GC_Track(self); + return (PyObject*)self; error: @@ -595,55 +622,6 @@ ZstdDecompressor_dealloc(PyObject *ob) Py_DECREF(tp); } -/*[clinic input] -_zstd.ZstdDecompressor.__init__ - - zstd_dict: object = None - A ZstdDict object, a pre-trained zstd dictionary. - options: object = None - A dict object that contains advanced decompression parameters. - -Create a decompressor object for decompressing data incrementally. - -Thread-safe at method level. For one-shot decompression, use the decompress() -function instead. -[clinic start generated code]*/ - -static int -_zstd_ZstdDecompressor___init___impl(ZstdDecompressor *self, - PyObject *zstd_dict, PyObject *options) -/*[clinic end generated code: output=703af2f1ec226642 input=8fd72999acc1a146]*/ -{ - /* Only called once */ - if (self->initialized) { - PyErr_SetString(PyExc_RuntimeError, "reinitialization not supported"); - return -1; - } - self->initialized = 1; - - /* Load dictionary to decompression context */ - if (zstd_dict != Py_None) { - if (_zstd_load_d_dict(self, zstd_dict) < 0) { - return -1; - } - - /* Py_INCREF the dict */ - Py_INCREF(zstd_dict); - self->dict = zstd_dict; - } - - /* Set option to decompression context */ - if (options != Py_None) { - if (_zstd_set_d_parameters(self, options) < 0) { - return -1; - } - } - - // We can only start tracking self with the GC once self->dict is set. - PyObject_GC_Track(self); - return 0; -} - /*[clinic input] @critical_section @getter @@ -685,7 +663,7 @@ _zstd_ZstdDecompressor_unused_data_get_impl(ZstdDecompressor *self) _zstd.ZstdDecompressor.decompress data: Py_buffer - A bytes-like object, zstd data to be decompressed. + A bytes-like object, Zstandard data to be decompressed. max_length: Py_ssize_t = -1 Maximum size of returned data. When it is negative, the size of output buffer is unlimited. When it is nonnegative, returns at @@ -711,7 +689,7 @@ static PyObject * _zstd_ZstdDecompressor_decompress_impl(ZstdDecompressor *self, Py_buffer *data, Py_ssize_t max_length) -/*[clinic end generated code: output=a4302b3c940dbec6 input=830e455bc9a50b6e]*/ +/*[clinic end generated code: output=a4302b3c940dbec6 input=6463dfdf98091caa]*/ { PyObject *ret; /* Thread-safe code */ @@ -769,11 +747,10 @@ ZstdDecompressor_clear(PyObject *ob) static PyType_Slot ZstdDecompressor_slots[] = { {Py_tp_new, _zstd_ZstdDecompressor_new}, {Py_tp_dealloc, ZstdDecompressor_dealloc}, - {Py_tp_init, _zstd_ZstdDecompressor___init__}, {Py_tp_methods, ZstdDecompressor_methods}, {Py_tp_members, ZstdDecompressor_members}, {Py_tp_getset, ZstdDecompressor_getset}, - {Py_tp_doc, (char*)_zstd_ZstdDecompressor___init____doc__}, + {Py_tp_doc, (void *)_zstd_ZstdDecompressor_new__doc__}, {Py_tp_traverse, ZstdDecompressor_traverse}, {Py_tp_clear, ZstdDecompressor_clear}, {0, 0} diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c index 47bc8a84ca24a7..264946e8da2a99 100644 --- a/Modules/_zstd/zstddict.c +++ b/Modules/_zstd/zstddict.c @@ -1,7 +1,4 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ /* ZstdDict class definitions */ @@ -25,17 +22,35 @@ class _zstd.ZstdDict "ZstdDict *" "&zstd_dict_type_spec" #define ZstdDict_CAST(op) ((ZstdDict *)op) +/*[clinic input] +@classmethod +_zstd.ZstdDict.__new__ as _zstd_ZstdDict_new + dict_content: object + The content of a Zstandard dictionary as a bytes-like object. + / + * + is_raw: bool = False + If true, perform no checks on *dict_content*, useful for some + advanced cases. Otherwise, check that the content represents + a Zstandard dictionary created by the zstd library or CLI. + +Represents a Zstandard dictionary. + +The dictionary can be used for compression or decompression, and can be shared +by multiple ZstdCompressor or ZstdDecompressor objects. +[clinic start generated code]*/ + static PyObject * -_zstd_ZstdDict_new(PyTypeObject *type, PyObject *Py_UNUSED(args), PyObject *Py_UNUSED(kwargs)) +_zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject *dict_content, + int is_raw) +/*[clinic end generated code: output=3ebff839cb3be6d7 input=6b5de413869ae878]*/ { - ZstdDict *self; - self = PyObject_GC_New(ZstdDict, type); + ZstdDict* self = PyObject_GC_New(ZstdDict, type); if (self == NULL) { goto error; } self->dict_content = NULL; - self->initialized = 0; self->d_dict = NULL; /* ZSTD_CDict dict */ @@ -44,6 +59,36 @@ _zstd_ZstdDict_new(PyTypeObject *type, PyObject *Py_UNUSED(args), PyObject *Py_U goto error; } + /* Check dict_content's type */ + self->dict_content = PyBytes_FromObject(dict_content); + if (self->dict_content == NULL) { + PyErr_SetString(PyExc_TypeError, + "dict_content argument should be bytes-like object."); + goto error; + } + + /* Both ordinary dictionary and "raw content" dictionary should + at least 8 bytes */ + if (Py_SIZE(self->dict_content) < 8) { + PyErr_SetString(PyExc_ValueError, + "Zstandard dictionary content should at least 8 bytes."); + goto error; + } + + /* Get dict_id, 0 means "raw content" dictionary. */ + self->dict_id = ZSTD_getDictID_fromDict(PyBytes_AS_STRING(self->dict_content), + Py_SIZE(self->dict_content)); + + /* Check validity for ordinary dictionary */ + if (!is_raw && self->dict_id == 0) { + char *msg = "Invalid Zstandard dictionary and is_raw not set.\n"; + PyErr_SetString(PyExc_ValueError, msg); + goto error; + } + + // Can only track self once self->dict_content is included + PyObject_GC_Track(self); + return (PyObject*)self; error: @@ -72,83 +117,15 @@ ZstdDict_dealloc(PyObject *ob) Py_DECREF(tp); } -/*[clinic input] -_zstd.ZstdDict.__init__ - - dict_content: object - A bytes-like object, dictionary's content. - is_raw: bool = False - This parameter is for advanced user. True means dict_content - argument is a "raw content" dictionary, free of any format - restriction. False means dict_content argument is an ordinary - zstd dictionary, was created by zstd functions, follow a - specified format. - -Represents a zstd dictionary, which can be used for compression/decompression. - -It's thread-safe, and can be shared by multiple ZstdCompressor / -ZstdDecompressor objects. -[clinic start generated code]*/ - -static int -_zstd_ZstdDict___init___impl(ZstdDict *self, PyObject *dict_content, - int is_raw) -/*[clinic end generated code: output=c5f5a0d8377d037c input=e6750f62a513b3ee]*/ -{ - /* Only called once */ - if (self->initialized) { - PyErr_SetString(PyExc_RuntimeError, "reinitialization not supported"); - return -1; - } - self->initialized = 1; - - /* Check dict_content's type */ - self->dict_content = PyBytes_FromObject(dict_content); - if (self->dict_content == NULL) { - PyErr_SetString(PyExc_TypeError, - "dict_content argument should be bytes-like object."); - return -1; - } - - /* Both ordinary dictionary and "raw content" dictionary should - at least 8 bytes */ - if (Py_SIZE(self->dict_content) < 8) { - PyErr_SetString(PyExc_ValueError, - "Zstd dictionary content should at least 8 bytes."); - return -1; - } - - /* Get dict_id, 0 means "raw content" dictionary. */ - self->dict_id = ZSTD_getDictID_fromDict(PyBytes_AS_STRING(self->dict_content), - Py_SIZE(self->dict_content)); - - /* Check validity for ordinary dictionary */ - if (!is_raw && self->dict_id == 0) { - char *msg = "The dict_content argument is not a valid zstd " - "dictionary. The first 4 bytes of a valid zstd dictionary " - "should be a magic number: b'\\x37\\xA4\\x30\\xEC'.\n" - "If you are an advanced user, and can be sure that " - "dict_content argument is a \"raw content\" zstd " - "dictionary, set is_raw parameter to True."; - PyErr_SetString(PyExc_ValueError, msg); - return -1; - } - - // Can only track self once self->dict_content is included - PyObject_GC_Track(self); - return 0; -} - PyDoc_STRVAR(ZstdDict_dictid_doc, -"ID of zstd dictionary, a 32-bit unsigned int value.\n\n" -"Non-zero means ordinary dictionary, was created by zstd functions, follow\n" -"a specified format.\n\n" -"0 means a \"raw content\" dictionary, free of any format restriction, used\n" -"for advanced user."); +"the Zstandard dictionary, an int between 0 and 2**32.\n\n" +"A non-zero value represents an ordinary Zstandard dictionary, " +"conforming to the standardised format.\n\n" +"The special value '0' means a 'raw content' dictionary," +"without any restrictions on format or content."); PyDoc_STRVAR(ZstdDict_dictcontent_doc, -"The content of zstd dictionary, a bytes object, it's the same as dict_content\n" -"argument in ZstdDict.__init__() method. It can be used with other programs."); +"The content of a Zstandard dictionary, as a bytes object."); static PyObject * ZstdDict_str(PyObject *ob) @@ -266,9 +243,8 @@ static PyType_Slot zstddict_slots[] = { {Py_tp_getset, ZstdDict_getset}, {Py_tp_new, _zstd_ZstdDict_new}, {Py_tp_dealloc, ZstdDict_dealloc}, - {Py_tp_init, _zstd_ZstdDict___init__}, {Py_tp_str, ZstdDict_str}, - {Py_tp_doc, (char*)_zstd_ZstdDict___init____doc__}, + {Py_tp_doc, (void *)_zstd_ZstdDict_new__doc__}, {Py_sq_length, ZstdDict_length}, {Py_tp_traverse, ZstdDict_traverse}, {Py_tp_clear, ZstdDict_clear}, diff --git a/Modules/_zstd/zstddict.h b/Modules/_zstd/zstddict.h index e82498f5dd1901..e8a55a3670b869 100644 --- a/Modules/_zstd/zstddict.h +++ b/Modules/_zstd/zstddict.h @@ -1,12 +1,8 @@ -/* -Low level interface to Meta's zstd library for use in the compression.zstd -Python module. -*/ +/* Low level interface to the Zstandard algorthm & the zstd library. */ #ifndef ZSTD_DICT_H #define ZSTD_DICT_H -#include // bool #include // ZSTD_DDict typedef struct { @@ -23,9 +19,6 @@ typedef struct { PyObject *dict_content; /* Dictionary id */ uint32_t dict_id; - - /* __init__ has been called, 0 or 1. */ - bool initialized; } ZstdDict; #endif // !ZSTD_DICT_H From 07a2033fcfabcbfb28450f3106b396b474561e57 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 04:58:51 +0200 Subject: [PATCH 0143/1674] [3.14] gh-132983: Call Py_XDECREF rather than PyObject_GC_Del in failed __new__ (GH-133962) (#134305) gh-132983: Call Py_XDECREF rather than PyObject_GC_Del in failed __new__ (GH-133962) Call Py_XDECREF rather than PyObject_GC_Del in failed __new__ This will call tp_dealloc and clear all members. (cherry picked from commit e575190abbd9409adad3e7fd95424f827236bed9) Co-authored-by: Petr Viktorin --- Modules/_zstd/compressor.c | 10 +++++----- Modules/_zstd/decompressor.c | 10 +++++----- Modules/_zstd/zstddict.c | 9 +++++---- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index 97693fd043efb2..38baee2be1e95b 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -338,6 +338,7 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, } self->use_multithread = 0; + self->dict = NULL; /* Compression context */ self->cctx = ZSTD_createCCtx(); @@ -372,7 +373,6 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, } /* Load Zstandard dictionary to compression context */ - self->dict = NULL; if (zstd_dict != Py_None) { if (_zstd_load_c_dict(self, zstd_dict) < 0) { goto error; @@ -387,9 +387,7 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, return (PyObject*)self; error: - if (self != NULL) { - PyObject_GC_Del(self); - } + Py_XDECREF(self); return NULL; } @@ -401,7 +399,9 @@ ZstdCompressor_dealloc(PyObject *ob) PyObject_GC_UnTrack(self); /* Free compression context */ - ZSTD_freeCCtx(self->cctx); + if (self->cctx) { + ZSTD_freeCCtx(self->cctx); + } /* Py_XDECREF the dict after free the compression context */ Py_CLEAR(self->dict); diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index 852b796a872eef..58f9c9f804e549 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -554,6 +554,7 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, self->in_end = -1; self->unused_data = NULL; self->eof = 0; + self->dict = NULL; /* needs_input flag */ self->needs_input = 1; @@ -570,7 +571,6 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, } /* Load Zstandard dictionary to decompression context */ - self->dict = NULL; if (zstd_dict != Py_None) { if (_zstd_load_d_dict(self, zstd_dict) < 0) { goto error; @@ -592,9 +592,7 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, return (PyObject*)self; error: - if (self != NULL) { - PyObject_GC_Del(self); - } + Py_XDECREF(self); return NULL; } @@ -606,7 +604,9 @@ ZstdDecompressor_dealloc(PyObject *ob) PyObject_GC_UnTrack(self); /* Free decompression context */ - ZSTD_freeDCtx(self->dctx); + if (self->dctx) { + ZSTD_freeDCtx(self->dctx); + } /* Py_CLEAR the dict after free decompression context */ Py_CLEAR(self->dict); diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c index 264946e8da2a99..7df187a6fa69d7 100644 --- a/Modules/_zstd/zstddict.c +++ b/Modules/_zstd/zstddict.c @@ -52,6 +52,7 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject *dict_content, self->dict_content = NULL; self->d_dict = NULL; + self->dict_id = 0; /* ZSTD_CDict dict */ self->c_dicts = PyDict_New(); @@ -92,9 +93,7 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject *dict_content, return (PyObject*)self; error: - if (self != NULL) { - PyObject_GC_Del(self); - } + Py_XDECREF(self); return NULL; } @@ -106,7 +105,9 @@ ZstdDict_dealloc(PyObject *ob) PyObject_GC_UnTrack(self); /* Free ZSTD_DDict instance */ - ZSTD_freeDDict(self->d_dict); + if (self->d_dict) { + ZSTD_freeDDict(self->d_dict); + } /* Release dict_content after Free ZSTD_CDict/ZSTD_DDict instances */ Py_CLEAR(self->dict_content); From 90aa13ae478f1eb1d5d02867382c33ee7670ab5c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 08:53:44 +0200 Subject: [PATCH 0144/1674] [3.14] gh-133374: fix test_python_legacy_windows_stdio (GH-134080) (GH-134314) (cherry picked from commit 652d6938ef8c42c1c4c180c3f0e257c26c6677da) Co-authored-by: Inada Naoki --- Lib/test/test_cmd_line.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 1b40e0d05fe3bc..f540973c11e01c 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -972,10 +972,25 @@ def test_python_legacy_windows_fs_encoding(self): @unittest.skipUnless(support.MS_WINDOWS, 'Test only applicable on Windows') def test_python_legacy_windows_stdio(self): - code = "import sys; print(sys.stdin.encoding, sys.stdout.encoding)" - expected = 'cp' - rc, out, err = assert_python_ok('-c', code, PYTHONLEGACYWINDOWSSTDIO='1') - self.assertIn(expected.encode(), out) + # Test that _WindowsConsoleIO is used when PYTHONLEGACYWINDOWSSTDIO + # is not set. + # We cannot use PIPE becase it prevents creating new console. + # So we use exit code. + code = "import sys; sys.exit(type(sys.stdout.buffer.raw).__name__ != '_WindowsConsoleIO')" + env = os.environ.copy() + env["PYTHONLEGACYWINDOWSSTDIO"] = "" + p = subprocess.run([sys.executable, "-c", code], + creationflags=subprocess.CREATE_NEW_CONSOLE, + env=env) + self.assertEqual(p.returncode, 0) + + # Then test that FIleIO is used when PYTHONLEGACYWINDOWSSTDIO is set. + code = "import sys; sys.exit(type(sys.stdout.buffer.raw).__name__ != 'FileIO')" + env["PYTHONLEGACYWINDOWSSTDIO"] = "1" + p = subprocess.run([sys.executable, "-c", code], + creationflags=subprocess.CREATE_NEW_CONSOLE, + env=env) + self.assertEqual(p.returncode, 0) @unittest.skipIf("-fsanitize" in sysconfig.get_config_vars().get('PY_CFLAGS', ()), "PYTHONMALLOCSTATS doesn't work with ASAN") From 9be3413b60d8fdcc0fed605440815e0532932a39 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 10:18:13 +0200 Subject: [PATCH 0145/1674] [3.14] Clean up test_posixpath (GH-134315) (GH-134316) * Ensure that created files and dirs are always removed after test. Now addCleanup() does not conflict with tearDown(). * Use os_helper.unlink() and os_helper.rmdir(). * Import TESTFN from os_helper. (cherry picked from commit e29171bf8a26b5faf97222e07a7d5f33c9eb272b) Co-authored-by: Serhiy Storchaka --- Lib/test/test_posixpath.py | 86 ++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index fa19d549c26cfa..572ffcf1aae36f 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -9,7 +9,7 @@ from test import test_genericpath from test.support import import_helper from test.support import os_helper -from test.support.os_helper import FakePath +from test.support.os_helper import FakePath, TESTFN from unittest import mock try: @@ -21,7 +21,7 @@ # An absolute path to a temporary filename for testing. We can't rely on TESTFN # being an absolute path, so we need this. -ABSTFN = abspath(os_helper.TESTFN) +ABSTFN = abspath(TESTFN) def skip_if_ABSTFN_contains_backslash(test): """ @@ -33,21 +33,11 @@ def skip_if_ABSTFN_contains_backslash(test): msg = "ABSTFN is not a posix path - tests fail" return [test, unittest.skip(msg)(test)][found_backslash] -def safe_rmdir(dirname): - try: - os.rmdir(dirname) - except OSError: - pass - class PosixPathTest(unittest.TestCase): def setUp(self): - self.tearDown() - - def tearDown(self): for suffix in ["", "1", "2"]: - os_helper.unlink(os_helper.TESTFN + suffix) - safe_rmdir(os_helper.TESTFN + suffix) + self.assertFalse(posixpath.lexists(ABSTFN + suffix)) def test_join(self): fn = posixpath.join @@ -194,25 +184,28 @@ def test_dirname(self): self.assertEqual(posixpath.dirname(b"//foo//bar"), b"//foo") def test_islink(self): - self.assertIs(posixpath.islink(os_helper.TESTFN + "1"), False) - self.assertIs(posixpath.lexists(os_helper.TESTFN + "2"), False) + self.assertIs(posixpath.islink(TESTFN + "1"), False) + self.assertIs(posixpath.lexists(TESTFN + "2"), False) - with open(os_helper.TESTFN + "1", "wb") as f: + self.addCleanup(os_helper.unlink, TESTFN + "1") + with open(TESTFN + "1", "wb") as f: f.write(b"foo") - self.assertIs(posixpath.islink(os_helper.TESTFN + "1"), False) + self.assertIs(posixpath.islink(TESTFN + "1"), False) if os_helper.can_symlink(): - os.symlink(os_helper.TESTFN + "1", os_helper.TESTFN + "2") - self.assertIs(posixpath.islink(os_helper.TESTFN + "2"), True) - os.remove(os_helper.TESTFN + "1") - self.assertIs(posixpath.islink(os_helper.TESTFN + "2"), True) - self.assertIs(posixpath.exists(os_helper.TESTFN + "2"), False) - self.assertIs(posixpath.lexists(os_helper.TESTFN + "2"), True) - - self.assertIs(posixpath.islink(os_helper.TESTFN + "\udfff"), False) - self.assertIs(posixpath.islink(os.fsencode(os_helper.TESTFN) + b"\xff"), False) - self.assertIs(posixpath.islink(os_helper.TESTFN + "\x00"), False) - self.assertIs(posixpath.islink(os.fsencode(os_helper.TESTFN) + b"\x00"), False) + self.addCleanup(os_helper.unlink, TESTFN + "2") + os.symlink(TESTFN + "1", TESTFN + "2") + self.assertIs(posixpath.islink(TESTFN + "2"), True) + os.remove(TESTFN + "1") + self.assertIs(posixpath.islink(TESTFN + "2"), True) + self.assertIs(posixpath.exists(TESTFN + "2"), False) + self.assertIs(posixpath.lexists(TESTFN + "2"), True) + + def test_islink_invalid_paths(self): + self.assertIs(posixpath.islink(TESTFN + "\udfff"), False) + self.assertIs(posixpath.islink(os.fsencode(TESTFN) + b"\xff"), False) + self.assertIs(posixpath.islink(TESTFN + "\x00"), False) + self.assertIs(posixpath.islink(os.fsencode(TESTFN) + b"\x00"), False) def test_ismount(self): self.assertIs(posixpath.ismount("/"), True) @@ -227,7 +220,7 @@ def test_ismount_non_existent(self): os.mkdir(ABSTFN) self.assertIs(posixpath.ismount(ABSTFN), False) finally: - safe_rmdir(ABSTFN) + os_helper.rmdir(ABSTFN) self.assertIs(posixpath.ismount('/\udfff'), False) self.assertIs(posixpath.ismount(b'/\xff'), False) @@ -241,7 +234,7 @@ def test_ismount_symlinks(self): os.symlink("/", ABSTFN) self.assertIs(posixpath.ismount(ABSTFN), False) finally: - os.unlink(ABSTFN) + os_helper.unlink(ABSTFN) @unittest.skipIf(posix is None, "Test requires posix module") def test_ismount_different_device(self): @@ -502,10 +495,10 @@ def test_realpath_relative(self): @skip_if_ABSTFN_contains_backslash def test_realpath_missing_pardir(self): try: - os.symlink(os_helper.TESTFN + "1", os_helper.TESTFN) - self.assertEqual(realpath("nonexistent/../" + os_helper.TESTFN), ABSTFN + "1") + os.symlink(TESTFN + "1", TESTFN) + self.assertEqual(realpath("nonexistent/../" + TESTFN), ABSTFN + "1") finally: - os_helper.unlink(os_helper.TESTFN) + os_helper.unlink(TESTFN) @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -601,7 +594,7 @@ def test_realpath_repeated_indirect_symlinks(self): finally: os_helper.unlink(ABSTFN + '/self') os_helper.unlink(ABSTFN + '/link') - safe_rmdir(ABSTFN) + os_helper.rmdir(ABSTFN) @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -620,7 +613,7 @@ def test_realpath_deep_recursion(self): finally: for i in range(depth + 1): os_helper.unlink(ABSTFN + '/%d' % i) - safe_rmdir(ABSTFN) + os_helper.rmdir(ABSTFN) @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -638,8 +631,8 @@ def test_realpath_resolve_parents(self): self.assertEqual(realpath("a"), ABSTFN + "/y/a") finally: os_helper.unlink(ABSTFN + "/k") - safe_rmdir(ABSTFN + "/y") - safe_rmdir(ABSTFN) + os_helper.rmdir(ABSTFN + "/y") + os_helper.rmdir(ABSTFN) @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -665,9 +658,9 @@ def test_realpath_resolve_before_normalizing(self): ABSTFN + "/k") finally: os_helper.unlink(ABSTFN + "/link-y") - safe_rmdir(ABSTFN + "/k/y") - safe_rmdir(ABSTFN + "/k") - safe_rmdir(ABSTFN) + os_helper.rmdir(ABSTFN + "/k/y") + os_helper.rmdir(ABSTFN + "/k") + os_helper.rmdir(ABSTFN) @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -685,8 +678,8 @@ def test_realpath_resolve_first(self): self.assertEqual(realpath(base + "link/k"), ABSTFN + "/k") finally: os_helper.unlink(ABSTFN + "link") - safe_rmdir(ABSTFN + "/k") - safe_rmdir(ABSTFN) + os_helper.rmdir(ABSTFN + "/k") + os_helper.rmdir(ABSTFN) @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -704,7 +697,7 @@ def test_realpath_unreadable_symlink(self): realpath(ABSTFN, strict=True) finally: os.chmod(ABSTFN, 0o755, follow_symlinks=False) - os.unlink(ABSTFN) + os_helper.unlink(ABSTFN) @skip_if_ABSTFN_contains_backslash def test_realpath_nonterminal_file(self): @@ -743,6 +736,7 @@ def test_realpath_nonterminal_symlink_to_file(self): self.assertRaises(NotADirectoryError, realpath, ABSTFN + "/subdir", strict=True) finally: os_helper.unlink(ABSTFN) + os_helper.unlink(ABSTFN + "1") @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash @@ -764,6 +758,8 @@ def test_realpath_nonterminal_symlink_to_symlinks_to_file(self): self.assertRaises(NotADirectoryError, realpath, ABSTFN + "/subdir", strict=True) finally: os_helper.unlink(ABSTFN) + os_helper.unlink(ABSTFN + "1") + os_helper.unlink(ABSTFN + "2") def test_relpath(self): (real_getcwd, os.getcwd) = (os.getcwd, lambda: r"/home/user/bar") @@ -889,8 +885,8 @@ class PathLikeTests(unittest.TestCase): path = posixpath def setUp(self): - self.file_name = os_helper.TESTFN - self.file_path = FakePath(os_helper.TESTFN) + self.file_name = TESTFN + self.file_path = FakePath(TESTFN) self.addCleanup(os_helper.unlink, self.file_name) with open(self.file_name, 'xb', 0) as file: file.write(b"test_posixpath.PathLikeTests") From ccaf865364692087dc74252dd411f6356a1d43f0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 11:57:39 +0200 Subject: [PATCH 0146/1674] [3.14] gh-131505: Move len boundary assertions before using len. (GH-131536) (GH-134239) gh-131505: Move len boundary assertions before using len. (GH-131536) Move len boundary assertions before using len. (cherry picked from commit c45e661226558e997e265cf53ce1419213cc10b7) Co-authored-by: naya451 <41294408+naya451@users.noreply.github.com> --- Modules/_io/bytesio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index e45a2d1a16dcba..8bc7aeacf294ba 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -583,9 +583,9 @@ _io_BytesIO_readinto_impl(bytesio *self, Py_buffer *buffer) len = 0; } - memcpy(buffer->buf, PyBytes_AS_STRING(self->buf) + self->pos, len); assert(self->pos + len < PY_SSIZE_T_MAX); assert(len >= 0); + memcpy(buffer->buf, PyBytes_AS_STRING(self->buf) + self->pos, len); self->pos += len; return PyLong_FromSsize_t(len); From 9c73a4de0c6f593cfa53afdd21d4aa8da1b15d46 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 12:11:39 +0200 Subject: [PATCH 0147/1674] [3.14] gh-133940: test_strftime incorrectly calculates expected week (GH-134281) (#134301) gh-133940: test_strftime incorrectly calculates expected week (GH-134281) Let the system determine the correct tm_wday and tm_isdst. (cherry picked from commit e3dda8f81832008adf19906004f0cd53de95dd0b) Co-authored-by: Gustaf <79180496+GGyll@users.noreply.github.com> --- Lib/test/test_strftime.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_strftime.py b/Lib/test/test_strftime.py index 752e31359cf206..375f6aaedd8934 100644 --- a/Lib/test/test_strftime.py +++ b/Lib/test/test_strftime.py @@ -39,7 +39,21 @@ def _update_variables(self, now): if now[3] < 12: self.ampm='(AM|am)' else: self.ampm='(PM|pm)' - self.jan1 = time.localtime(time.mktime((now[0], 1, 1, 0, 0, 0, 0, 1, 0))) + jan1 = time.struct_time( + ( + now.tm_year, # Year + 1, # Month (January) + 1, # Day (1st) + 0, # Hour (0) + 0, # Minute (0) + 0, # Second (0) + -1, # tm_wday (will be determined) + 1, # tm_yday (day 1 of the year) + -1, # tm_isdst (let the system determine) + ) + ) + # use mktime to get the correct tm_wday and tm_isdst values + self.jan1 = time.localtime(time.mktime(jan1)) try: if now[8]: self.tz = time.tzname[1] From c23bdc2eced311671d77c5ac2cb450fe4eb1b08e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 12:13:40 +0200 Subject: [PATCH 0148/1674] [3.14] gh-133890: Handle UnicodeEncodeError in tarfile (GH-134147) (GH-134195) UnicodeEncodeError is now handled the same way as OSError during TarFile member extraction. (cherry picked from commit 9983c7d4416cac8deb2fded1ec9c7daf786c3a02) Co-authored-by: Serhiy Storchaka --- Lib/tarfile.py | 4 +- Lib/test/test_tarfile.py | 49 +++++++++++++++++-- ...-05-17-18-08-35.gh-issue-133890.onn9_X.rst | 2 + 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-17-18-08-35.gh-issue-133890.onn9_X.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 13889d768021b1..212b71f6509740 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2439,7 +2439,7 @@ def _get_extract_tarinfo(self, member, filter_function, path): unfiltered = tarinfo try: tarinfo = filter_function(tarinfo, path) - except (OSError, FilterError) as e: + except (OSError, UnicodeEncodeError, FilterError) as e: self._handle_fatal_error(e) except ExtractError as e: self._handle_nonfatal_error(e) @@ -2460,7 +2460,7 @@ def _extract_one(self, tarinfo, path, set_attrs, numeric_owner): self._extract_member(tarinfo, os.path.join(path, tarinfo.name), set_attrs=set_attrs, numeric_owner=numeric_owner) - except OSError as e: + except (OSError, UnicodeEncodeError) as e: self._handle_fatal_error(e) except ExtractError as e: self._handle_nonfatal_error(e) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 2d9649237a9382..2018a20afd1b18 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -3490,11 +3490,12 @@ class ArchiveMaker: with t.open() as tar: ... # `tar` is now a TarFile with 'filename' in it! """ - def __init__(self): + def __init__(self, **kwargs): self.bio = io.BytesIO() + self.tar_kwargs = dict(kwargs) def __enter__(self): - self.tar_w = tarfile.TarFile(mode='w', fileobj=self.bio) + self.tar_w = tarfile.TarFile(mode='w', fileobj=self.bio, **self.tar_kwargs) return self def __exit__(self, *exc): @@ -4073,7 +4074,10 @@ def test_tar_filter(self): # that in the test archive.) with tarfile.TarFile.open(tarname) as tar: for tarinfo in tar.getmembers(): - filtered = tarfile.tar_filter(tarinfo, '') + try: + filtered = tarfile.tar_filter(tarinfo, '') + except UnicodeEncodeError: + continue self.assertIs(filtered.name, tarinfo.name) self.assertIs(filtered.type, tarinfo.type) @@ -4084,11 +4088,48 @@ def test_data_filter(self): for tarinfo in tar.getmembers(): try: filtered = tarfile.data_filter(tarinfo, '') - except tarfile.FilterError: + except (tarfile.FilterError, UnicodeEncodeError): continue self.assertIs(filtered.name, tarinfo.name) self.assertIs(filtered.type, tarinfo.type) + @unittest.skipIf(sys.platform == 'win32', 'requires native bytes paths') + def test_filter_unencodable(self): + # Sanity check using a valid path. + tarinfo = tarfile.TarInfo(os_helper.TESTFN) + filtered = tarfile.tar_filter(tarinfo, '') + self.assertIs(filtered.name, tarinfo.name) + filtered = tarfile.data_filter(tarinfo, '') + self.assertIs(filtered.name, tarinfo.name) + + tarinfo = tarfile.TarInfo('test\x00') + self.assertRaises(ValueError, tarfile.tar_filter, tarinfo, '') + self.assertRaises(ValueError, tarfile.data_filter, tarinfo, '') + tarinfo = tarfile.TarInfo('\ud800') + self.assertRaises(UnicodeEncodeError, tarfile.tar_filter, tarinfo, '') + self.assertRaises(UnicodeEncodeError, tarfile.data_filter, tarinfo, '') + + @unittest.skipIf(sys.platform == 'win32', 'requires native bytes paths') + def test_extract_unencodable(self): + # Create a member with name \xed\xa0\x80 which is UTF-8 encoded + # lone surrogate \ud800. + with ArchiveMaker(encoding='ascii', errors='surrogateescape') as arc: + arc.add('\udced\udca0\udc80') + with os_helper.temp_cwd() as tmp: + tar = arc.open(encoding='utf-8', errors='surrogatepass', + errorlevel=1) + self.assertEqual(tar.getnames(), ['\ud800']) + with self.assertRaises(UnicodeEncodeError): + tar.extractall() + self.assertEqual(os.listdir(), []) + + tar = arc.open(encoding='utf-8', errors='surrogatepass', + errorlevel=0, debug=1) + with support.captured_stderr() as stderr: + tar.extractall() + self.assertEqual(os.listdir(), []) + self.assertIn('tarfile: UnicodeEncodeError ', stderr.getvalue()) + def test_change_default_filter_on_instance(self): tar = tarfile.TarFile(tarname, 'r') def strict_filter(tarinfo, path): diff --git a/Misc/NEWS.d/next/Library/2025-05-17-18-08-35.gh-issue-133890.onn9_X.rst b/Misc/NEWS.d/next/Library/2025-05-17-18-08-35.gh-issue-133890.onn9_X.rst new file mode 100644 index 00000000000000..44565a5424e65b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-17-18-08-35.gh-issue-133890.onn9_X.rst @@ -0,0 +1,2 @@ +The :mod:`tarfile` module now handles :exc:`UnicodeEncodeError` in the same +way as :exc:`OSError` when cannot extract a member. From a3fa72578a68fc4a3caf27b530150cbb7bad8793 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 14:15:34 +0200 Subject: [PATCH 0149/1674] [3.14] gh-53189: Document peculiarities of InteractiveConsole in relation to pickle (GH-123069) (GH-134328) gh-53189: Document peculiarities of InteractiveConsole in relation to pickle (GH-123069) (cherry picked from commit a31bbc951a9d74cd7b9092555c101e51a2b9482b) Co-authored-by: Serhiy Storchaka Co-authored-by: Terry Jan Reedy --- Doc/library/code.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/code.rst b/Doc/library/code.rst index 8f7692df9fb22d..52587c4dd8f8e8 100644 --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -22,6 +22,12 @@ build applications which provide an interactive interpreter prompt. it defaults to a newly created dictionary with key ``'__name__'`` set to ``'__console__'`` and key ``'__doc__'`` set to ``None``. + Note that functions and classes objects created under an + :class:`!InteractiveInterpreter` instance will belong to the namespace + specified by *locals*. + They are only pickleable if *locals* is the namespace of an existing + module. + .. class:: InteractiveConsole(locals=None, filename="", local_exit=False) From 7e67b36d977f480b2cc28fbab671c119d60bc11a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 14:55:21 +0200 Subject: [PATCH 0150/1674] [3.14] gh-117596: Add more tests for os.path with invalid paths (GH-134189) (GH-134265) (cherry picked from commit 871d26987533e81ab63af067e1fc96aa37a26bf7) Co-authored-by: Serhiy Storchaka --- Lib/test/test_ntpath.py | 179 ++++++++++++++++++++++++++++++++++--- Lib/test/test_posixpath.py | 74 +++++++++++++++ 2 files changed, 243 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index c10387b58e3f9c..f83ef225a6e48e 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -124,6 +124,22 @@ def test_splitdrive(self): tester('ntpath.splitdrive("//?/UNC/server/share/dir")', ("//?/UNC/server/share", "/dir")) + def test_splitdrive_invalid_paths(self): + splitdrive = ntpath.splitdrive + self.assertEqual(splitdrive('\\\\ser\x00ver\\sha\x00re\\di\x00r'), + ('\\\\ser\x00ver\\sha\x00re', '\\di\x00r')) + self.assertEqual(splitdrive(b'\\\\ser\x00ver\\sha\x00re\\di\x00r'), + (b'\\\\ser\x00ver\\sha\x00re', b'\\di\x00r')) + self.assertEqual(splitdrive("\\\\\udfff\\\udffe\\\udffd"), + ('\\\\\udfff\\\udffe', '\\\udffd')) + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, splitdrive, b'\\\\\xff\\share\\dir') + self.assertRaises(UnicodeDecodeError, splitdrive, b'\\\\server\\\xff\\dir') + self.assertRaises(UnicodeDecodeError, splitdrive, b'\\\\server\\share\\\xff') + else: + self.assertEqual(splitdrive(b'\\\\\xff\\\xfe\\\xfd'), + (b'\\\\\xff\\\xfe', b'\\\xfd')) + def test_splitroot(self): tester("ntpath.splitroot('')", ('', '', '')) tester("ntpath.splitroot('foo')", ('', '', 'foo')) @@ -214,6 +230,22 @@ def test_splitroot(self): tester('ntpath.splitroot(" :/foo")', (" :", "/", "foo")) tester('ntpath.splitroot("/:/foo")', ("", "/", ":/foo")) + def test_splitroot_invalid_paths(self): + splitroot = ntpath.splitroot + self.assertEqual(splitroot('\\\\ser\x00ver\\sha\x00re\\di\x00r'), + ('\\\\ser\x00ver\\sha\x00re', '\\', 'di\x00r')) + self.assertEqual(splitroot(b'\\\\ser\x00ver\\sha\x00re\\di\x00r'), + (b'\\\\ser\x00ver\\sha\x00re', b'\\', b'di\x00r')) + self.assertEqual(splitroot("\\\\\udfff\\\udffe\\\udffd"), + ('\\\\\udfff\\\udffe', '\\', '\udffd')) + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, splitroot, b'\\\\\xff\\share\\dir') + self.assertRaises(UnicodeDecodeError, splitroot, b'\\\\server\\\xff\\dir') + self.assertRaises(UnicodeDecodeError, splitroot, b'\\\\server\\share\\\xff') + else: + self.assertEqual(splitroot(b'\\\\\xff\\\xfe\\\xfd'), + (b'\\\\\xff\\\xfe', b'\\', b'\xfd')) + def test_split(self): tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar')) tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")', @@ -226,6 +258,21 @@ def test_split(self): tester('ntpath.split("c:/")', ('c:/', '')) tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', '')) + def test_split_invalid_paths(self): + split = ntpath.split + self.assertEqual(split('c:\\fo\x00o\\ba\x00r'), + ('c:\\fo\x00o', 'ba\x00r')) + self.assertEqual(split(b'c:\\fo\x00o\\ba\x00r'), + (b'c:\\fo\x00o', b'ba\x00r')) + self.assertEqual(split('c:\\\udfff\\\udffe'), + ('c:\\\udfff', '\udffe')) + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, split, b'c:\\\xff\\bar') + self.assertRaises(UnicodeDecodeError, split, b'c:\\foo\\\xff') + else: + self.assertEqual(split(b'c:\\\xff\\\xfe'), + (b'c:\\\xff', b'\xfe')) + def test_isabs(self): tester('ntpath.isabs("foo\\bar")', 0) tester('ntpath.isabs("foo/bar")', 0) @@ -333,6 +380,30 @@ def test_join(self): tester("ntpath.join('D:a', './c:b')", 'D:a\\.\\c:b') tester("ntpath.join('D:/a', './c:b')", 'D:\\a\\.\\c:b') + def test_normcase(self): + normcase = ntpath.normcase + self.assertEqual(normcase(''), '') + self.assertEqual(normcase(b''), b'') + self.assertEqual(normcase('ABC'), 'abc') + self.assertEqual(normcase(b'ABC'), b'abc') + self.assertEqual(normcase('\xc4\u0141\u03a8'), '\xe4\u0142\u03c8') + expected = '\u03c9\u2126' if sys.platform == 'win32' else '\u03c9\u03c9' + self.assertEqual(normcase('\u03a9\u2126'), expected) + if sys.platform == 'win32' or sys.getfilesystemencoding() == 'utf-8': + self.assertEqual(normcase('\xc4\u0141\u03a8'.encode()), + '\xe4\u0142\u03c8'.encode()) + self.assertEqual(normcase('\u03a9\u2126'.encode()), + expected.encode()) + + def test_normcase_invalid_paths(self): + normcase = ntpath.normcase + self.assertEqual(normcase('abc\x00def'), 'abc\x00def') + self.assertEqual(normcase(b'abc\x00def'), b'abc\x00def') + self.assertEqual(normcase('\udfff'), '\udfff') + if sys.platform == 'win32': + path = b'ABC' + bytes(range(128, 256)) + self.assertEqual(normcase(path), path.lower()) + def test_normpath(self): tester("ntpath.normpath('A//////././//.//B')", r'A\B') tester("ntpath.normpath('A/./B')", r'A\B') @@ -381,6 +452,21 @@ def test_normpath(self): tester("ntpath.normpath('\\\\')", '\\\\') tester("ntpath.normpath('//?/UNC/server/share/..')", '\\\\?\\UNC\\server\\share\\') + def test_normpath_invalid_paths(self): + normpath = ntpath.normpath + self.assertEqual(normpath('fo\x00o'), 'fo\x00o') + self.assertEqual(normpath(b'fo\x00o'), b'fo\x00o') + self.assertEqual(normpath('fo\x00o\\..\\bar'), 'bar') + self.assertEqual(normpath(b'fo\x00o\\..\\bar'), b'bar') + self.assertEqual(normpath('\udfff'), '\udfff') + self.assertEqual(normpath('\udfff\\..\\foo'), 'foo') + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, normpath, b'\xff') + self.assertRaises(UnicodeDecodeError, normpath, b'\xff\\..\\foo') + else: + self.assertEqual(normpath(b'\xff'), b'\xff') + self.assertEqual(normpath(b'\xff\\..\\foo'), b'foo') + def test_realpath_curdir(self): expected = ntpath.normpath(os.getcwd()) tester("ntpath.realpath('.')", expected) @@ -420,10 +506,6 @@ def test_realpath_basic(self): d = drives.pop().encode() self.assertEqual(ntpath.realpath(d), d) - # gh-106242: Embedded nulls and non-strict fallback to abspath - self.assertEqual(ABSTFN + "\0spam", - ntpath.realpath(os_helper.TESTFN + "\0spam", strict=False)) - @os_helper.skip_unless_symlink @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname') def test_realpath_strict(self): @@ -434,8 +516,51 @@ def test_realpath_strict(self): self.addCleanup(os_helper.unlink, ABSTFN) self.assertRaises(FileNotFoundError, ntpath.realpath, ABSTFN, strict=True) self.assertRaises(FileNotFoundError, ntpath.realpath, ABSTFN + "2", strict=True) + + @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname') + def test_realpath_invalid_paths(self): + realpath = ntpath.realpath + ABSTFN = ntpath.abspath(os_helper.TESTFN) + ABSTFNb = os.fsencode(ABSTFN) + path = ABSTFN + '\x00' + # gh-106242: Embedded nulls and non-strict fallback to abspath + self.assertEqual(realpath(path, strict=False), path) # gh-106242: Embedded nulls should raise OSError (not ValueError) - self.assertRaises(OSError, ntpath.realpath, ABSTFN + "\0spam", strict=True) + self.assertRaises(OSError, realpath, path, strict=True) + path = ABSTFNb + b'\x00' + self.assertEqual(realpath(path, strict=False), path) + self.assertRaises(OSError, realpath, path, strict=True) + path = ABSTFN + '\\nonexistent\\x\x00' + self.assertEqual(realpath(path, strict=False), path) + self.assertRaises(OSError, realpath, path, strict=True) + path = ABSTFNb + b'\\nonexistent\\x\x00' + self.assertEqual(realpath(path, strict=False), path) + self.assertRaises(OSError, realpath, path, strict=True) + path = ABSTFN + '\x00\\..' + self.assertEqual(realpath(path, strict=False), os.getcwd()) + self.assertEqual(realpath(path, strict=True), os.getcwd()) + path = ABSTFNb + b'\x00\\..' + self.assertEqual(realpath(path, strict=False), os.getcwdb()) + self.assertEqual(realpath(path, strict=True), os.getcwdb()) + path = ABSTFN + '\\nonexistent\\x\x00\\..' + self.assertEqual(realpath(path, strict=False), ABSTFN + '\\nonexistent') + self.assertRaises(OSError, realpath, path, strict=True) + path = ABSTFNb + b'\\nonexistent\\x\x00\\..' + self.assertEqual(realpath(path, strict=False), ABSTFNb + b'\\nonexistent') + self.assertRaises(OSError, realpath, path, strict=True) + + path = ABSTFNb + b'\xff' + self.assertRaises(UnicodeDecodeError, realpath, path, strict=False) + self.assertRaises(UnicodeDecodeError, realpath, path, strict=True) + path = ABSTFNb + b'\\nonexistent\\\xff' + self.assertRaises(UnicodeDecodeError, realpath, path, strict=False) + self.assertRaises(UnicodeDecodeError, realpath, path, strict=True) + path = ABSTFNb + b'\xff\\..' + self.assertRaises(UnicodeDecodeError, realpath, path, strict=False) + self.assertRaises(UnicodeDecodeError, realpath, path, strict=True) + path = ABSTFNb + b'\\nonexistent\\\xff\\..' + self.assertRaises(UnicodeDecodeError, realpath, path, strict=False) + self.assertRaises(UnicodeDecodeError, realpath, path, strict=True) @os_helper.skip_unless_symlink @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname') @@ -812,8 +937,6 @@ def test_abspath(self): tester('ntpath.abspath("C:/nul")', "\\\\.\\nul") tester('ntpath.abspath("C:\\nul")', "\\\\.\\nul") self.assertTrue(ntpath.isabs(ntpath.abspath("C:spam"))) - self.assertEqual(ntpath.abspath("C:\x00"), ntpath.join(ntpath.abspath("C:"), "\x00")) - self.assertEqual(ntpath.abspath("\x00:spam"), "\x00:\\spam") tester('ntpath.abspath("//..")', "\\\\") tester('ntpath.abspath("//../")', "\\\\..\\") tester('ntpath.abspath("//../..")', "\\\\..\\") @@ -847,6 +970,26 @@ def test_abspath(self): drive, _ = ntpath.splitdrive(cwd_dir) tester('ntpath.abspath("/abc/")', drive + "\\abc") + def test_abspath_invalid_paths(self): + abspath = ntpath.abspath + if sys.platform == 'win32': + self.assertEqual(abspath("C:\x00"), ntpath.join(abspath("C:"), "\x00")) + self.assertEqual(abspath(b"C:\x00"), ntpath.join(abspath(b"C:"), b"\x00")) + self.assertEqual(abspath("\x00:spam"), "\x00:\\spam") + self.assertEqual(abspath(b"\x00:spam"), b"\x00:\\spam") + self.assertEqual(abspath('c:\\fo\x00o'), 'c:\\fo\x00o') + self.assertEqual(abspath(b'c:\\fo\x00o'), b'c:\\fo\x00o') + self.assertEqual(abspath('c:\\fo\x00o\\..\\bar'), 'c:\\bar') + self.assertEqual(abspath(b'c:\\fo\x00o\\..\\bar'), b'c:\\bar') + self.assertEqual(abspath('c:\\\udfff'), 'c:\\\udfff') + self.assertEqual(abspath('c:\\\udfff\\..\\foo'), 'c:\\foo') + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, abspath, b'c:\\\xff') + self.assertRaises(UnicodeDecodeError, abspath, b'c:\\\xff\\..\\foo') + else: + self.assertEqual(abspath(b'c:\\\xff'), b'c:\\\xff') + self.assertEqual(abspath(b'c:\\\xff\\..\\foo'), b'c:\\foo') + def test_relpath(self): tester('ntpath.relpath("a")', 'a') tester('ntpath.relpath(ntpath.abspath("a"))', 'a') @@ -989,6 +1132,18 @@ def test_ismount(self): self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$")) self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$\\")) + def test_ismount_invalid_paths(self): + ismount = ntpath.ismount + self.assertFalse(ismount("c:\\\udfff")) + if sys.platform == 'win32': + self.assertRaises(ValueError, ismount, "c:\\\x00") + self.assertRaises(ValueError, ismount, b"c:\\\x00") + self.assertRaises(UnicodeDecodeError, ismount, b"c:\\\xff") + else: + self.assertFalse(ismount("c:\\\x00")) + self.assertFalse(ismount(b"c:\\\x00")) + self.assertFalse(ismount(b"c:\\\xff")) + def test_isreserved(self): self.assertFalse(ntpath.isreserved('')) self.assertFalse(ntpath.isreserved('.')) @@ -1095,6 +1250,13 @@ def test_isjunction(self): self.assertFalse(ntpath.isjunction('tmpdir')) self.assertPathEqual(ntpath.realpath('testjunc'), ntpath.realpath('tmpdir')) + def test_isfile_invalid_paths(self): + isfile = ntpath.isfile + self.assertIs(isfile('/tmp\udfffabcds'), False) + self.assertIs(isfile(b'/tmp\xffabcds'), False) + self.assertIs(isfile('/tmp\x00abcds'), False) + self.assertIs(isfile(b'/tmp\x00abcds'), False) + @unittest.skipIf(sys.platform != 'win32', "drive letters are a windows concept") def test_isfile_driveletter(self): drive = os.environ.get('SystemDrive') @@ -1195,9 +1357,6 @@ def _check_function(self, func): def test_path_normcase(self): self._check_function(self.path.normcase) - if sys.platform == 'win32': - self.assertEqual(ntpath.normcase('\u03a9\u2126'), 'ωΩ') - self.assertEqual(ntpath.normcase('abc\x00def'), 'abc\x00def') def test_path_isabs(self): self._check_function(self.path.isabs) diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 572ffcf1aae36f..f3f9895f529470 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -222,6 +222,7 @@ def test_ismount_non_existent(self): finally: os_helper.rmdir(ABSTFN) + def test_ismount_invalid_paths(self): self.assertIs(posixpath.ismount('/\udfff'), False) self.assertIs(posixpath.ismount(b'/\xff'), False) self.assertIs(posixpath.ismount('/\x00'), False) @@ -482,6 +483,79 @@ def test_realpath_strict(self): finally: os_helper.unlink(ABSTFN) + def test_realpath_invalid_paths(self): + path = '/\x00' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(ValueError, realpath, path, strict=True) + path = b'/\x00' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(ValueError, realpath, path, strict=True) + path = '/nonexistent/x\x00' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + path = b'/nonexistent/x\x00' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + path = '/\x00/..' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(ValueError, realpath, path, strict=True) + path = b'/\x00/..' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(ValueError, realpath, path, strict=True) + path = '/nonexistent/x\x00/..' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + path = b'/nonexistent/x\x00/..' + self.assertRaises(ValueError, realpath, path, strict=False) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + + path = '/\udfff' + if sys.platform == 'win32': + self.assertEqual(realpath(path, strict=False), path) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + else: + self.assertRaises(UnicodeEncodeError, realpath, path, strict=False) + self.assertRaises(UnicodeEncodeError, realpath, path, strict=True) + path = '/nonexistent/\udfff' + if sys.platform == 'win32': + self.assertEqual(realpath(path, strict=False), path) + else: + self.assertRaises(UnicodeEncodeError, realpath, path, strict=False) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + path = '/\udfff/..' + if sys.platform == 'win32': + self.assertEqual(realpath(path, strict=False), '/') + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + else: + self.assertRaises(UnicodeEncodeError, realpath, path, strict=False) + self.assertRaises(UnicodeEncodeError, realpath, path, strict=True) + path = '/nonexistent/\udfff/..' + if sys.platform == 'win32': + self.assertEqual(realpath(path, strict=False), '/nonexistent') + else: + self.assertRaises(UnicodeEncodeError, realpath, path, strict=False) + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + + path = b'/\xff' + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, realpath, path, strict=False) + self.assertRaises(UnicodeDecodeError, realpath, path, strict=True) + else: + self.assertEqual(realpath(path, strict=False), path) + if support.is_wasi: + self.assertRaises(OSError, realpath, path, strict=True) + else: + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + path = b'/nonexistent/\xff' + if sys.platform == 'win32': + self.assertRaises(UnicodeDecodeError, realpath, path, strict=False) + else: + self.assertEqual(realpath(path, strict=False), path) + if support.is_wasi: + self.assertRaises(OSError, realpath, path, strict=True) + else: + self.assertRaises(FileNotFoundError, realpath, path, strict=True) + @os_helper.skip_unless_symlink @skip_if_ABSTFN_contains_backslash def test_realpath_relative(self): From 2dedf5eb4523014192927fbeb132f93204d3a5f9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 16:05:16 +0200 Subject: [PATCH 0151/1674] [3.14] gh-62824: Add alias for iso-8859-8-i which is the same as iso-8859-8 (gh-134306) (gh-134330) (cherry picked from commit 5ab66a882d1b5e44ec50b25df116ab209d65863f) Co-authored-by: Bas Bloemsaat Co-authored-by: David Goncalves Co-authored-by: Oleg Iarygin --- Lib/encodings/aliases.py | 2 ++ Lib/test/test_codecs.py | 8 ++++++++ .../Library/2023-02-13-21-56-38.gh-issue-62824.CBZzX3.rst | 1 + 3 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-02-13-21-56-38.gh-issue-62824.CBZzX3.rst diff --git a/Lib/encodings/aliases.py b/Lib/encodings/aliases.py index a94bb270671e37..4ecb6b6e297a13 100644 --- a/Lib/encodings/aliases.py +++ b/Lib/encodings/aliases.py @@ -405,6 +405,8 @@ 'iso_8859_8' : 'iso8859_8', 'iso_8859_8_1988' : 'iso8859_8', 'iso_ir_138' : 'iso8859_8', + 'iso_8859_8_i' : 'iso8859_8', + 'iso_8859_8_e' : 'iso8859_8', # iso8859_9 codec 'csisolatin5' : 'iso8859_9', diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index d42270da15ee32..1d6136405f428c 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3,6 +3,7 @@ import copy import io import pickle +import os import sys import unittest import encodings @@ -3107,6 +3108,13 @@ def test_aliases(self): info = codecs.lookup(alias) self.assertEqual(info.name, expected_name) + def test_alias_modules_exist(self): + encodings_dir = os.path.dirname(encodings.__file__) + for value in encodings.aliases.aliases.values(): + codec_file = os.path.join(encodings_dir, value + ".py") + self.assertTrue(os.path.isfile(codec_file), + "Codec file not found: " + codec_file) + def test_quopri_stateless(self): # Should encode with quotetabs=True encoded = codecs.encode(b"space tab\teol \n", "quopri-codec") diff --git a/Misc/NEWS.d/next/Library/2023-02-13-21-56-38.gh-issue-62824.CBZzX3.rst b/Misc/NEWS.d/next/Library/2023-02-13-21-56-38.gh-issue-62824.CBZzX3.rst new file mode 100644 index 00000000000000..1fe4e47c9ec213 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-13-21-56-38.gh-issue-62824.CBZzX3.rst @@ -0,0 +1 @@ +Fix aliases for ``iso8859_8`` encoding. Patch by Dave Goncalves. From b9a7e79ee1fdbcfdf6b086fc5323063bb4eaad92 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 16:15:18 +0200 Subject: [PATCH 0152/1674] [3.14] gh-128307: Update what's new in 3.13 and 3.14 with create_task changes of asyncio (GH-134304) (#134319) gh-128307: Update what's new in 3.13 and 3.14 with create_task changes of asyncio (GH-134304) (cherry picked from commit 28625d4f956f8d30671aba1daaac9735932983db) Co-authored-by: Guido van Rossum Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/whatsnew/3.13.rst | 16 ++++++++++++++++ Doc/whatsnew/3.14.rst | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index e20e49325c01d5..52bafeb4df7d41 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -730,6 +730,22 @@ asyncio never awaited). (Contributed by Arthur Tacca and Jason Zhang in :gh:`115957`.) +* The function and methods named ``create_task`` have received a new + ``**kwargs`` argument that is passed through to the task constructor. + This change was accidentally added in 3.13.3, + and broke the API contract for custom task factories. + Several third-party task factories implemented workarounds for this. + In 3.13.4 and later releases the old factory contract is honored + once again (until 3.14). + To keep the workarounds working, the extra ``**kwargs`` argument still + allows passing additional keyword arguments to :class:`~asyncio.Task` + and to custom task factories. + + This affects the following function and methods: + :meth:`asyncio.create_task`, + :meth:`asyncio.loop.create_task`, + :meth:`asyncio.TaskGroup.create_task`. + (Contributed by Thomas Grainger in :gh:`128307`.) base64 ------ diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 8f39b99e38e3a5..b192615e173f11 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1064,6 +1064,24 @@ ast (Contributed by Semyon Moroz in :gh:`133367`.) +asyncio +------- + +* The function and methods named :func:`!create_task` now take an arbitrary + list of keyword arguments. All keyword arguments are passed to the + :class:`~asyncio.Task` constructor or the custom task factory. + (See :meth:`~asyncio.loop.set_task_factory` for details.) + The ``name`` and ``context`` keyword arguments are no longer special; + the name should now be set using the ``name`` keyword argument of the factory, + and ``context`` may be ``None``. + + This affects the following function and methods: + :meth:`asyncio.create_task`, + :meth:`asyncio.loop.create_task`, + :meth:`asyncio.TaskGroup.create_task`. + (Contributed by Thomas Grainger in :gh:`128307`.) + + bdb --- From ff0facd33201ae0f4101e73b818b9af15d384455 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 16:52:11 +0200 Subject: [PATCH 0153/1674] [3.14] gh-101100: Fix Sphinx warnings in `library/decimal.rst` (GH-134303) (#134338) Co-authored-by: Yuki Kobayashi --- Doc/conf.py | 1 - Doc/library/decimal.rst | 72 ++++++++++++++++++++++++----------------- Doc/tools/.nitignore | 1 - 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/Doc/conf.py b/Doc/conf.py index 467961dd5e2bff..7fadad66cb3238 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -308,7 +308,6 @@ ('py:attr', '__annotations__'), ('py:meth', '__missing__'), ('py:attr', '__wrapped__'), - ('py:attr', 'decimal.Context.clamp'), ('py:meth', 'index'), # list.index, tuple.index, etc. ] diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index f53c1f3467034e..10ddfa02b43156 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -2,7 +2,7 @@ ===================================================================== .. module:: decimal - :synopsis: Implementation of the General Decimal Arithmetic Specification. + :synopsis: Implementation of the General Decimal Arithmetic Specification. .. moduleauthor:: Eric Price .. moduleauthor:: Facundo Batista @@ -121,7 +121,7 @@ reset them before monitoring a calculation. .. _decimal-tutorial: -Quick-start Tutorial +Quick-start tutorial -------------------- The usual start to using decimals is importing the module, viewing the current @@ -1096,40 +1096,52 @@ In addition to the three supplied contexts, new contexts can be created with the default values are copied from the :const:`DefaultContext`. If the *flags* field is not specified or is :const:`None`, all flags are cleared. - *prec* is an integer in the range [``1``, :const:`MAX_PREC`] that sets - the precision for arithmetic operations in the context. + .. attribute:: prec - The *rounding* option is one of the constants listed in the section - `Rounding Modes`_. + An integer in the range [``1``, :const:`MAX_PREC`] that sets + the precision for arithmetic operations in the context. - The *traps* and *flags* fields list any signals to be set. Generally, new - contexts should only set traps and leave the flags clear. + .. attribute:: rounding - The *Emin* and *Emax* fields are integers specifying the outer limits allowable - for exponents. *Emin* must be in the range [:const:`MIN_EMIN`, ``0``], - *Emax* in the range [``0``, :const:`MAX_EMAX`]. + One of the constants listed in the section `Rounding Modes`_. - The *capitals* field is either ``0`` or ``1`` (the default). If set to - ``1``, exponents are printed with a capital ``E``; otherwise, a - lowercase ``e`` is used: ``Decimal('6.02e+23')``. + .. attribute:: traps + flags - The *clamp* field is either ``0`` (the default) or ``1``. - If set to ``1``, the exponent ``e`` of a :class:`Decimal` - instance representable in this context is strictly limited to the - range ``Emin - prec + 1 <= e <= Emax - prec + 1``. If *clamp* is - ``0`` then a weaker condition holds: the adjusted exponent of - the :class:`Decimal` instance is at most :attr:`~Context.Emax`. When *clamp* is - ``1``, a large normal number will, where possible, have its - exponent reduced and a corresponding number of zeros added to its - coefficient, in order to fit the exponent constraints; this - preserves the value of the number but loses information about - significant trailing zeros. For example:: + Lists of any signals to be set. Generally, new contexts should only set + traps and leave the flags clear. - >>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999') - Decimal('1.23000E+999') + .. attribute:: Emin + Emax - A *clamp* value of ``1`` allows compatibility with the - fixed-width decimal interchange formats specified in IEEE 754. + Integers specifying the outer limits allowable for exponents. *Emin* must + be in the range [:const:`MIN_EMIN`, ``0``], *Emax* in the range + [``0``, :const:`MAX_EMAX`]. + + .. attribute:: capitals + + Either ``0`` or ``1`` (the default). If set to + ``1``, exponents are printed with a capital ``E``; otherwise, a + lowercase ``e`` is used: ``Decimal('6.02e+23')``. + + .. attribute:: clamp + + Either ``0`` (the default) or ``1``. If set to ``1``, the exponent ``e`` + of a :class:`Decimal` instance representable in this context is strictly + limited to the range ``Emin - prec + 1 <= e <= Emax - prec + 1``. + If *clamp* is ``0`` then a weaker condition holds: the adjusted exponent of + the :class:`Decimal` instance is at most :attr:`~Context.Emax`. When *clamp* is + ``1``, a large normal number will, where possible, have its + exponent reduced and a corresponding number of zeros added to its + coefficient, in order to fit the exponent constraints; this + preserves the value of the number but loses information about + significant trailing zeros. For example:: + + >>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999') + Decimal('1.23000E+999') + + A *clamp* value of ``1`` allows compatibility with the + fixed-width decimal interchange formats specified in IEEE 754. The :class:`Context` class defines several general purpose methods as well as a large number of methods for doing arithmetic directly in a given context. @@ -1769,7 +1781,7 @@ The following table summarizes the hierarchy of signals:: .. _decimal-notes: -Floating-Point Notes +Floating-point notes -------------------- diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 926d2cd42bdf02..e3bcb968128d96 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -14,7 +14,6 @@ Doc/c-api/typeobj.rst Doc/extending/extending.rst Doc/library/ast.rst Doc/library/asyncio-extending.rst -Doc/library/decimal.rst Doc/library/email.charset.rst Doc/library/email.compat32-message.rst Doc/library/email.parser.rst From dc5866ab250f641df6ed78c943b0d36d6a4c04c2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 18:25:04 +0200 Subject: [PATCH 0154/1674] [3.14] gh-129748: Update mimalloc to use atomic store for mi_block_set_nextx (GH-134238) (gh-134352) gh-129748: Update mimalloc to use atomic store for mi_block_set_nextx (GH-134238) (cherry picked from commit 317c49622397222b7c7fb49837e6b1fd7e82a80d) Co-authored-by: Donghee Na --- Include/internal/mimalloc/mimalloc/internal.h | 8 ++++---- Include/internal/mimalloc/mimalloc/types.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Include/internal/mimalloc/mimalloc/internal.h b/Include/internal/mimalloc/mimalloc/internal.h index d97f51b8eefbe5..71b7ea702d6c5e 100644 --- a/Include/internal/mimalloc/mimalloc/internal.h +++ b/Include/internal/mimalloc/mimalloc/internal.h @@ -634,10 +634,10 @@ static inline mi_block_t* mi_block_nextx( const void* null, const mi_block_t* bl 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); + next = (mi_block_t*)mi_ptr_decode(null, mi_atomic_load_relaxed(&block->next), keys); #else MI_UNUSED(keys); MI_UNUSED(null); - next = (mi_block_t*)block->next; + next = (mi_block_t*)mi_atomic_load_relaxed(&block->next); #endif mi_track_mem_noaccess(block,sizeof(mi_block_t)); return next; @@ -646,10 +646,10 @@ static inline mi_block_t* mi_block_nextx( const void* null, const mi_block_t* bl 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); + mi_atomic_store_relaxed(&block->next, mi_ptr_encode(null, next, keys)); #else MI_UNUSED(keys); MI_UNUSED(null); - block->next = (mi_encoded_t)next; + mi_atomic_store_relaxed(&block->next, (mi_encoded_t)next); #endif mi_track_mem_noaccess(block,sizeof(mi_block_t)); } diff --git a/Include/internal/mimalloc/mimalloc/types.h b/Include/internal/mimalloc/mimalloc/types.h index 354839ba955b36..4f77bd7bc525db 100644 --- a/Include/internal/mimalloc/mimalloc/types.h +++ b/Include/internal/mimalloc/mimalloc/types.h @@ -235,7 +235,7 @@ typedef size_t mi_threadid_t; // free lists contain blocks typedef struct mi_block_s { - mi_encoded_t next; + _Atomic(mi_encoded_t) next; } mi_block_t; From 8e8d5c91cd9e161a74463ebbee7a1a563d12b637 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 18:46:52 +0200 Subject: [PATCH 0155/1674] [3.14] gh-132542: Set native thread ID after fork (GH-132701) (GH-134356) (cherry picked from commit 6b735023132a4ac9dc5b849d982104eeb1e8bdad) Co-authored-by: Noam Cohen --- Lib/test/test_threading.py | 28 +++++++++++++++++++ Lib/threading.py | 2 ++ ...-04-19-17-16-46.gh-issue-132542.7T_TY_.rst | 2 ++ 3 files changed, 32 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-17-16-46.gh-issue-132542.7T_TY_.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index abe63c10c0ac7c..dc7172db04c5b7 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1352,6 +1352,34 @@ def do_flush(*args, **kwargs): ''') assert_python_ok("-c", script) + @skip_unless_reliable_fork + def test_native_id_after_fork(self): + script = """if True: + import threading + import os + from test import support + + parent_thread_native_id = threading.current_thread().native_id + print(parent_thread_native_id, flush=True) + assert parent_thread_native_id == threading.get_native_id() + childpid = os.fork() + if childpid == 0: + print(threading.current_thread().native_id, flush=True) + assert threading.current_thread().native_id == threading.get_native_id() + else: + try: + assert parent_thread_native_id == threading.current_thread().native_id + assert parent_thread_native_id == threading.get_native_id() + finally: + support.wait_process(childpid, exitcode=0) + """ + rc, out, err = assert_python_ok('-c', script) + self.assertEqual(rc, 0) + self.assertEqual(err, b"") + native_ids = out.strip().splitlines() + self.assertEqual(len(native_ids), 2) + self.assertNotEqual(native_ids[0], native_ids[1]) + class ThreadJoinOnShutdown(BaseTestCase): def _run_and_join(self, script): diff --git a/Lib/threading.py b/Lib/threading.py index 39a1a7f4cdfda0..fa290d17c635ab 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -951,6 +951,8 @@ def _after_fork(self, new_ident=None): # This thread is alive. self._ident = new_ident assert self._os_thread_handle.ident == new_ident + if _HAVE_THREAD_NATIVE_ID: + self._set_native_id() else: # Otherwise, the thread is dead, Jim. _PyThread_AfterFork() # already marked our handle done. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-17-16-46.gh-issue-132542.7T_TY_.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-17-16-46.gh-issue-132542.7T_TY_.rst new file mode 100644 index 00000000000000..c69ce5efdedcca --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-17-16-46.gh-issue-132542.7T_TY_.rst @@ -0,0 +1,2 @@ +Update :attr:`Thread.native_id ` after +:manpage:`fork(2)` to ensure accuracy. Patch by Noam Cohen. From 402d983f27fd37ff6530ef9f04ad3e66402e4173 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 18:47:42 +0200 Subject: [PATCH 0156/1674] [3.14] gh-128002: add what's new docs for `asyncio` (GH-134324) (#134362) gh-128002: add what's new docs for `asyncio` (GH-134324) (cherry picked from commit 0584533dc70b4efdb65fd53fbb5beddbc7a302a8) Co-authored-by: Kumar Aditya --- Doc/whatsnew/3.14.rst | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index b192615e173f11..604f3365ebffcc 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1997,11 +1997,19 @@ Optimizations asyncio ------- -* :mod:`asyncio` now uses double linked list implementation for native tasks - which speeds up execution by 10% on standard pyperformance benchmarks and - reduces memory usage. +* :mod:`asyncio` has a new per-thread double linked list implementation internally for + :class:`native tasks ` which speeds up execution by 10-20% on standard + pyperformance benchmarks and reduces memory usage. + This enables external introspection tools such as + :ref:`python -m asyncio pstree ` + to introspect the call graph of asyncio tasks running in all threads. (Contributed by Kumar Aditya in :gh:`107803`.) +* :mod:`asyncio` has first class support for :term:`free-threading builds `. + This enables parallel execution of multiple event loops across different threads and scales + linearly with the number of threads. + (Contributed by Kumar Aditya in :gh:`128002`.) + * :mod:`asyncio` has new utility functions for introspecting and printing the program's call graph: :func:`asyncio.capture_call_graph` and :func:`asyncio.print_call_graph`. @@ -2083,7 +2091,6 @@ Deprecated * :class:`asyncio.WindowsProactorEventLoopPolicy` * :func:`asyncio.get_event_loop_policy` * :func:`asyncio.set_event_loop_policy` - * :func:`asyncio.set_event_loop` Users should use :func:`asyncio.run` or :class:`asyncio.Runner` with *loop_factory* to use the desired event loop implementation. From 6d4b56d2f3501401d7ce86c3fd9002ee878d5a1d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 19:02:55 +0200 Subject: [PATCH 0157/1674] [3.14] gh-127945: Update What's New in Python 3.14 for free-threaded ctypes (GH-134332) (#134364) gh-127945: Update What's New in Python 3.14 for free-threaded ctypes (GH-134332) (cherry picked from commit b430e92dd80105e97b945a78a48bce13564bf843) Co-authored-by: Kumar Aditya --- Doc/whatsnew/3.14.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 604f3365ebffcc..88e52015bdc2b1 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1200,6 +1200,9 @@ ctypes making it a :term:`generic type`. (Contributed by Brian Schubert in :gh:`132168`.) +* :mod:`ctypes` now supports :term:`free-threading builds `. + (Contributed by Kumar Aditya and Peter Bierma in :gh:`127945`.) + curses ------ From 6074e1e6c4be0b12c6c6b9af95ac5673a60a8c22 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 19:11:01 +0200 Subject: [PATCH 0158/1674] [3.14] gh-75459: Doc: C API: Improve object life cycle documentation (GH-125962) (GH-134344) gh-75459: Doc: C API: Improve object life cycle documentation (GH-125962) * Add "cyclic isolate" to the glossary. * Add a new "Object Life Cycle" page. * Improve docs for related API, with special focus on cross-references and warnings (cherry picked from commit 3246ea514d6da6ff09f411e22b3ba61a7de84a74) Co-authored-by: Richard Hansen Co-authored-by: Petr Viktorin Co-authored-by: Peter Bierma --- .gitattributes | 2 + Doc/c-api/allocation.rst | 132 +++++++++-- Doc/c-api/gcsupport.rst | 57 +++++ Doc/c-api/lifecycle.dot | 156 ++++++++++++ Doc/c-api/lifecycle.dot.css | 21 ++ Doc/c-api/lifecycle.dot.pdf | Bin 0 -> 19328 bytes Doc/c-api/lifecycle.dot.svg | 374 +++++++++++++++++++++++++++++ Doc/c-api/lifecycle.rst | 273 +++++++++++++++++++++ Doc/c-api/memory.rst | 18 ++ Doc/c-api/objimpl.rst | 1 + Doc/c-api/type.rst | 25 +- Doc/c-api/typeobj.rst | 458 +++++++++++++++++++++++++++--------- Doc/glossary.rst | 6 + 13 files changed, 1386 insertions(+), 137 deletions(-) create mode 100644 Doc/c-api/lifecycle.dot create mode 100644 Doc/c-api/lifecycle.dot.css create mode 100644 Doc/c-api/lifecycle.dot.pdf create mode 100644 Doc/c-api/lifecycle.dot.svg create mode 100644 Doc/c-api/lifecycle.rst diff --git a/.gitattributes b/.gitattributes index 2f5a030981fb94..5682b9150a36e2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,6 +10,7 @@ *.ico binary *.jpg binary *.pck binary +*.pdf binary *.png binary *.psd binary *.tar binary @@ -67,6 +68,7 @@ PCbuild/readme.txt dos **/clinic/*.cpp.h generated **/clinic/*.h.h generated *_db.h generated +Doc/c-api/lifecycle.dot.svg generated Doc/data/stable_abi.dat generated Doc/library/token-list.inc generated Include/internal/pycore_ast.h generated diff --git a/Doc/c-api/allocation.rst b/Doc/c-api/allocation.rst index 7cbc99ad145ad4..f8d01a3f29b30e 100644 --- a/Doc/c-api/allocation.rst +++ b/Doc/c-api/allocation.rst @@ -16,7 +16,20 @@ Allocating Objects on the Heap Initialize a newly allocated object *op* with its type and initial reference. Returns the initialized object. Other fields of the object are - not affected. + not initialized. Despite its name, this function is unrelated to the + object's :meth:`~object.__init__` method (:c:member:`~PyTypeObject.tp_init` + slot). Specifically, this function does **not** call the object's + :meth:`!__init__` method. + + In general, consider this function to be a low-level routine. Use + :c:member:`~PyTypeObject.tp_alloc` where possible. + For implementing :c:member:`!tp_alloc` for your type, prefer + :c:func:`PyType_GenericAlloc` or :c:func:`PyObject_New`. + + .. note:: + + This function only initializes the object's memory corresponding to the + initial :c:type:`PyObject` structure. It does not zero the rest. .. c:function:: PyVarObject* PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size) @@ -24,38 +37,107 @@ Allocating Objects on the Heap This does everything :c:func:`PyObject_Init` does, and also initializes the length information for a variable-size object. + .. note:: + + This function only initializes some of the object's memory. It does not + zero the rest. + .. c:macro:: PyObject_New(TYPE, typeobj) - Allocate a new Python object using the C structure type *TYPE* - and the Python type object *typeobj* (``PyTypeObject*``). - Fields not defined by the Python object header are not initialized. - The caller will own the only reference to the object - (i.e. its reference count will be one). - The size of the memory allocation is determined from the - :c:member:`~PyTypeObject.tp_basicsize` field of the type object. + Allocates a new Python object using the C structure type *TYPE* and the + Python type object *typeobj* (``PyTypeObject*``) by calling + :c:func:`PyObject_Malloc` to allocate memory and initializing it like + :c:func:`PyObject_Init`. The caller will own the only reference to the + object (i.e. its reference count will be one). + + Avoid calling this directly to allocate memory for an object; call the type's + :c:member:`~PyTypeObject.tp_alloc` slot instead. + + When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot, + :c:func:`PyType_GenericAlloc` is preferred over a custom function that + simply calls this macro. + + This macro does not call :c:member:`~PyTypeObject.tp_alloc`, + :c:member:`~PyTypeObject.tp_new` (:meth:`~object.__new__`), or + :c:member:`~PyTypeObject.tp_init` (:meth:`~object.__init__`). + + This cannot be used for objects with :c:macro:`Py_TPFLAGS_HAVE_GC` set in + :c:member:`~PyTypeObject.tp_flags`; use :c:macro:`PyObject_GC_New` instead. + + Memory allocated by this macro must be freed with :c:func:`PyObject_Free` + (usually called via the object's :c:member:`~PyTypeObject.tp_free` slot). + + .. note:: + + The returned memory is not guaranteed to have been completely zeroed + before it was initialized. + + .. note:: + + This macro does not construct a fully initialized object of the given + type; it merely allocates memory and prepares it for further + initialization by :c:member:`~PyTypeObject.tp_init`. To construct a + fully initialized object, call *typeobj* instead. For example:: + + PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type); - Note that this function is unsuitable if *typeobj* has - :c:macro:`Py_TPFLAGS_HAVE_GC` set. For such objects, - use :c:func:`PyObject_GC_New` instead. + .. seealso:: + + * :c:func:`PyObject_Free` + * :c:macro:`PyObject_GC_New` + * :c:func:`PyType_GenericAlloc` + * :c:member:`~PyTypeObject.tp_alloc` .. c:macro:: PyObject_NewVar(TYPE, typeobj, size) - Allocate a new Python object using the C structure type *TYPE* and the - Python type object *typeobj* (``PyTypeObject*``). - Fields not defined by the Python object header - are not initialized. The allocated memory allows for the *TYPE* structure - plus *size* (``Py_ssize_t``) fields of the size - given by the :c:member:`~PyTypeObject.tp_itemsize` field of - *typeobj*. This is useful for implementing objects like tuples, which are - able to determine their size at construction time. Embedding the array of - fields into the same allocation decreases the number of allocations, - improving the memory management efficiency. - - Note that this function is unsuitable if *typeobj* has - :c:macro:`Py_TPFLAGS_HAVE_GC` set. For such objects, - use :c:func:`PyObject_GC_NewVar` instead. + Like :c:macro:`PyObject_New` except: + + * It allocates enough memory for the *TYPE* structure plus *size* + (``Py_ssize_t``) fields of the size given by the + :c:member:`~PyTypeObject.tp_itemsize` field of *typeobj*. + * The memory is initialized like :c:func:`PyObject_InitVar`. + + This is useful for implementing objects like tuples, which are able to + determine their size at construction time. Embedding the array of fields + into the same allocation decreases the number of allocations, improving the + memory management efficiency. + + Avoid calling this directly to allocate memory for an object; call the type's + :c:member:`~PyTypeObject.tp_alloc` slot instead. + + When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot, + :c:func:`PyType_GenericAlloc` is preferred over a custom function that + simply calls this macro. + + This cannot be used for objects with :c:macro:`Py_TPFLAGS_HAVE_GC` set in + :c:member:`~PyTypeObject.tp_flags`; use :c:macro:`PyObject_GC_NewVar` + instead. + + Memory allocated by this function must be freed with :c:func:`PyObject_Free` + (usually called via the object's :c:member:`~PyTypeObject.tp_free` slot). + + .. note:: + + The returned memory is not guaranteed to have been completely zeroed + before it was initialized. + + .. note:: + + This macro does not construct a fully initialized object of the given + type; it merely allocates memory and prepares it for further + initialization by :c:member:`~PyTypeObject.tp_init`. To construct a + fully initialized object, call *typeobj* instead. For example:: + + PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type); + + .. seealso:: + + * :c:func:`PyObject_Free` + * :c:macro:`PyObject_GC_NewVar` + * :c:func:`PyType_GenericAlloc` + * :c:member:`~PyTypeObject.tp_alloc` .. c:function:: void PyObject_Del(void *op) diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index 3e23605778f05a..f6fa52b36c5ab3 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -57,11 +57,49 @@ rules: Analogous to :c:macro:`PyObject_New` but for container objects with the :c:macro:`Py_TPFLAGS_HAVE_GC` flag set. + Do not call this directly to allocate memory for an object; call the type's + :c:member:`~PyTypeObject.tp_alloc` slot instead. + + When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot, + :c:func:`PyType_GenericAlloc` is preferred over a custom function that + simply calls this macro. + + Memory allocated by this macro must be freed with + :c:func:`PyObject_GC_Del` (usually called via the object's + :c:member:`~PyTypeObject.tp_free` slot). + + .. seealso:: + + * :c:func:`PyObject_GC_Del` + * :c:macro:`PyObject_New` + * :c:func:`PyType_GenericAlloc` + * :c:member:`~PyTypeObject.tp_alloc` + + .. c:macro:: PyObject_GC_NewVar(TYPE, typeobj, size) Analogous to :c:macro:`PyObject_NewVar` but for container objects with the :c:macro:`Py_TPFLAGS_HAVE_GC` flag set. + Do not call this directly to allocate memory for an object; call the type's + :c:member:`~PyTypeObject.tp_alloc` slot instead. + + When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot, + :c:func:`PyType_GenericAlloc` is preferred over a custom function that + simply calls this macro. + + Memory allocated by this macro must be freed with + :c:func:`PyObject_GC_Del` (usually called via the object's + :c:member:`~PyTypeObject.tp_free` slot). + + .. seealso:: + + * :c:func:`PyObject_GC_Del` + * :c:macro:`PyObject_NewVar` + * :c:func:`PyType_GenericAlloc` + * :c:member:`~PyTypeObject.tp_alloc` + + .. c:function:: PyObject* PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *type, size_t extra_size) Analogous to :c:macro:`PyObject_GC_New` but allocates *extra_size* @@ -73,6 +111,10 @@ rules: The extra data will be deallocated with the object, but otherwise it is not managed by Python. + Memory allocated by this function must be freed with + :c:func:`PyObject_GC_Del` (usually called via the object's + :c:member:`~PyTypeObject.tp_free` slot). + .. warning:: The function is marked as unstable because the final mechanism for reserving extra data after an instance is not yet decided. @@ -136,6 +178,21 @@ rules: Releases memory allocated to an object using :c:macro:`PyObject_GC_New` or :c:macro:`PyObject_GC_NewVar`. + Do not call this directly to free an object's memory; call the type's + :c:member:`~PyTypeObject.tp_free` slot instead. + + Do not use this for memory allocated by :c:macro:`PyObject_New`, + :c:macro:`PyObject_NewVar`, or related allocation functions; use + :c:func:`PyObject_Free` instead. + + .. seealso:: + + * :c:func:`PyObject_Free` is the non-GC equivalent of this function. + * :c:macro:`PyObject_GC_New` + * :c:macro:`PyObject_GC_NewVar` + * :c:func:`PyType_GenericAlloc` + * :c:member:`~PyTypeObject.tp_free` + .. c:function:: void PyObject_GC_UnTrack(void *op) diff --git a/Doc/c-api/lifecycle.dot b/Doc/c-api/lifecycle.dot new file mode 100644 index 00000000000000..dca9f87e9e0aca --- /dev/null +++ b/Doc/c-api/lifecycle.dot @@ -0,0 +1,156 @@ +digraph "Life Events" { + graph [ + fontnames="svg" + fontsize=12.0 + id="life_events_graph" + layout="dot" + margin="0,0" + ranksep=0.25 + stylesheet="lifecycle.dot.css" + ] + node [ + fontname="Courier" + fontsize=12.0 + ] + edge [ + fontname="Times-Italic" + fontsize=12.0 + ] + + "start" [fontname="Times-Italic" shape=plain label=< start > style=invis] + { + rank="same" + "tp_new" [href="typeobj.html#c.PyTypeObject.tp_new" target="_top"] + "tp_alloc" [href="typeobj.html#c.PyTypeObject.tp_alloc" target="_top"] + } + "tp_init" [href="typeobj.html#c.PyTypeObject.tp_init" target="_top"] + "reachable" [fontname="Times-Italic" shape=box] + "tp_traverse" [ + href="typeobj.html#c.PyTypeObject.tp_traverse" + ordering="in" + target="_top" + ] + "finalized?" [ + fontname="Times-Italic" + label=finalized?> + ordering="in" + shape=diamond + tooltip="marked as finalized?" + ] + "tp_finalize" [ + href="typeobj.html#c.PyTypeObject.tp_finalize" + ordering="in" + target="_top" + ] + "tp_clear" [href="typeobj.html#c.PyTypeObject.tp_clear" target="_top"] + "uncollectable" [ + fontname="Times-Italic" + label=(leaked)> + shape=box + tooltip="uncollectable (leaked)" + ] + "tp_dealloc" [ + href="typeobj.html#c.PyTypeObject.tp_dealloc" + ordering="in" + target="_top" + ] + "tp_free" [href="typeobj.html#c.PyTypeObject.tp_free" target="_top"] + + "start" -> "tp_new" [ + label=< type call > + ] + "tp_new" -> "tp_alloc" [ + label=< direct call > arrowhead=empty + labeltooltip="tp_new to tp_alloc: direct call" + tooltip="tp_new to tp_alloc: direct call" + ] + "tp_new" -> "tp_init" [tooltip="tp_new to tp_init"] + "tp_init" -> "reachable" [tooltip="tp_init to reachable"] + "reachable" -> "tp_traverse" [ + dir="back" + label=< not in a
cyclic
isolate > + labeltooltip="tp_traverse to reachable: not in a cyclic isolate" + tooltip="tp_traverse to reachable: not in a cyclic isolate" + ] + "reachable" -> "tp_traverse" [ + label=< periodic
cyclic isolate
detection > + labeltooltip="reachable to tp_traverse: periodic cyclic isolate detection" + tooltip="reachable to tp_traverse: periodic cyclic isolate detection" + ] + "reachable" -> "tp_init" [tooltip="reachable to tp_init"] + "reachable" -> "tp_finalize" [ + dir="back" + label=< resurrected
(maybe remove
finalized mark) > + labeltooltip="tp_finalize to reachable: resurrected (maybe remove finalized mark)" + tooltip="tp_finalize to reachable: resurrected (maybe remove finalized mark)" + ] + "tp_traverse" -> "finalized?" [ + label=< cyclic
isolate > + labeltooltip="tp_traverse to finalized?: cyclic isolate" + tooltip="tp_traverse to finalized?: cyclic isolate" + ] + "reachable" -> "finalized?" [ + label=< no refs > + labeltooltip="reachable to finalized?: no refs" + tooltip="reachable to finalized?: no refs" + ] + "finalized?" -> "tp_finalize" [ + label=< no (mark
as finalized) > + labeltooltip="finalized? to tp_finalize: no (mark as finalized)" + tooltip="finalized? to tp_finalize: no (mark as finalized)" + ] + "finalized?" -> "tp_clear" [ + label=< yes > + labeltooltip="finalized? to tp_clear: yes" + tooltip="finalized? to tp_clear: yes" + ] + "tp_finalize" -> "tp_clear" [ + label=< no refs or
cyclic isolate > + labeltooltip="tp_finalize to tp_clear: no refs or cyclic isolate" + tooltip="tp_finalize to tp_clear: no refs or cyclic isolate" + ] + "tp_finalize" -> "tp_dealloc" [ + arrowtail=empty + dir="back" + href="lifecycle.html#c.PyObject_CallFinalizerFromDealloc" + style=dashed + label=< recommended
call (see
explanation)> + labeltooltip="tp_dealloc to tp_finalize: recommended call (see explanation)" + target="_top" + tooltip="tp_dealloc to tp_finalize: recommended call (see explanation)" + ] + "tp_finalize" -> "tp_dealloc" [ + label=< no refs > + labeltooltip="tp_finalize to tp_dealloc: no refs" + tooltip="tp_finalize to tp_dealloc: no refs" + ] + "tp_clear" -> "tp_dealloc" [ + label=< no refs > + labeltooltip="tp_clear to tp_dealloc: no refs" + tooltip="tp_clear to tp_dealloc: no refs" + ] + "tp_clear" -> "uncollectable" [ + label=< cyclic
isolate > + labeltooltip="tp_clear to uncollectable: cyclic isolate" + tooltip="tp_clear to uncollectable: cyclic isolate" + ] + "uncollectable" -> "tp_dealloc" [ + style=invis + tooltip="uncollectable to tp_dealloc" + ] + "reachable" -> "uncollectable" [ + label=< cyclic
isolate
(no GC
support) > + labeltooltip="reachable to uncollectable: cyclic isolate (no GC support)" + tooltip="reachable to uncollectable: cyclic isolate (no GC support)" + ] + "reachable" -> "tp_dealloc" [ + label=< no refs> + labeltooltip="reachable to tp_dealloc: no refs" + ] + "tp_dealloc" -> "tp_free" [ + arrowhead=empty + label=< direct call > + labeltooltip="tp_dealloc to tp_free: direct call" + tooltip="tp_dealloc to tp_free: direct call" + ] +} diff --git a/Doc/c-api/lifecycle.dot.css b/Doc/c-api/lifecycle.dot.css new file mode 100644 index 00000000000000..3abf95b74da6ba --- /dev/null +++ b/Doc/c-api/lifecycle.dot.css @@ -0,0 +1,21 @@ +#life_events_graph { + --svg-fgcolor: currentcolor; + --svg-bgcolor: transparent; +} +#life_events_graph a { + color: inherit; +} +#life_events_graph [stroke="black"] { + stroke: var(--svg-fgcolor); +} +#life_events_graph text, +#life_events_graph [fill="black"] { + fill: var(--svg-fgcolor); +} +#life_events_graph [fill="white"] { + fill: var(--svg-bgcolor); +} +#life_events_graph [fill="none"] { + /* On links, setting fill will make the entire shape clickable */ + fill: var(--svg-bgcolor); +} diff --git a/Doc/c-api/lifecycle.dot.pdf b/Doc/c-api/lifecycle.dot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed5b5039c83e2c4a36d77e713c430c8f14901bed GIT binary patch literal 19328 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 p$M!7V4%?s5Zqr0H|LRLeC$NK)o5PcrfFN#e5F! + + + + + + +Life Events + + + + +tp_new + + +tp_new + + + + + +start->tp_new + + + + + + +    type call   + + + + + +tp_alloc + + +tp_alloc + + + + + +tp_new->tp_alloc + + + + + + +  direct call   + + + + + +tp_init + + +tp_init + + + + + +tp_new->tp_init + + + + + + + + +reachable + +reachable + + + +tp_init->reachable + + + + + + + + +reachable->tp_init + + + + + + + + +tp_traverse + + +tp_traverse + + + + + +reachable->tp_traverse + + + + + + +  not in a   +  cyclic   +  isolate   + + + + + +reachable->tp_traverse + + + + + + +  periodic   +  cyclic isolate    +  detection   + + + + + +finalized? + + +marked as +finalized? + + + + + +reachable->finalized? + + + + + + +  no refs   + + + + + +tp_finalize + + +tp_finalize + + + + + +reachable->tp_finalize + + + + + + +  resurrected   +  (maybe remove   +  finalized mark)   + + + + + +uncollectable + + +uncollectable +(leaked) + + + + + +reachable->uncollectable + + + + + + +  cyclic   +  isolate   +  (no GC   +  support)   + + + + + +tp_dealloc + + +tp_dealloc + + + + + +reachable->tp_dealloc + + + +  no refs + + + + + +tp_traverse->finalized? + + + + + + +  cyclic   +  isolate   + + + + + +finalized?->tp_finalize + + + + + + +  no (mark   +  as finalized)   + + + + + +tp_clear + + +tp_clear + + + + + +finalized?->tp_clear + + + + + + +  yes   + + + + + +tp_finalize->tp_clear + + + + + + +  no refs or    +  cyclic isolate   + + + + + +tp_finalize->tp_dealloc + + + + + + +  recommended +  call (see +  explanation) + + + + + +tp_finalize->tp_dealloc + + + + + + +   no refs   + + + + + +tp_clear->uncollectable + + + + + + +  cyclic   +  isolate   + + + + + +tp_clear->tp_dealloc + + + + + + +  no refs   + + + + + + +tp_free + + +tp_free + + + + + +tp_dealloc->tp_free + + + + + + +    direct call   + + + + + diff --git a/Doc/c-api/lifecycle.rst b/Doc/c-api/lifecycle.rst new file mode 100644 index 00000000000000..0e2ffc096caba7 --- /dev/null +++ b/Doc/c-api/lifecycle.rst @@ -0,0 +1,273 @@ +.. highlight:: c + +.. _life-cycle: + +Object Life Cycle +================= + +This section explains how a type's slots relate to each other throughout the +life of an object. It is not intended to be a complete canonical reference for +the slots; instead, refer to the slot-specific documentation in +:ref:`type-structs` for details about a particular slot. + + +Life Events +----------- + +The figure below illustrates the order of events that can occur throughout an +object's life. An arrow from *A* to *B* indicates that event *B* can occur +after event *A* has occurred, with the arrow's label indicating the condition +that must be true for *B* to occur after *A*. + +.. only:: html and not epub + + .. raw:: html + + + + .. raw:: html + :file: lifecycle.dot.svg + + .. raw:: html + + + +.. only:: epub or not (html or latex) + + .. image:: lifecycle.dot.svg + :align: center + :class: invert-in-dark-mode + :alt: Diagram showing events in an object's life. Explained in detail + below. + +.. only:: latex + + .. image:: lifecycle.dot.pdf + :align: center + :class: invert-in-dark-mode + :alt: Diagram showing events in an object's life. Explained in detail + below. + +.. container:: + :name: life-events-graph-description + + Explanation: + + * When a new object is constructed by calling its type: + + #. :c:member:`~PyTypeObject.tp_new` is called to create a new object. + #. :c:member:`~PyTypeObject.tp_alloc` is directly called by + :c:member:`~PyTypeObject.tp_new` to allocate the memory for the new + object. + #. :c:member:`~PyTypeObject.tp_init` initializes the newly created object. + :c:member:`!tp_init` can be called again to re-initialize an object, if + desired. The :c:member:`!tp_init` call can also be skipped entirely, + for example by Python code calling :py:meth:`~object.__new__`. + + * After :c:member:`!tp_init` completes, the object is ready to use. + * Some time after the last reference to an object is removed: + + #. If an object is not marked as *finalized*, it might be finalized by + marking it as *finalized* and calling its + :c:member:`~PyTypeObject.tp_finalize` function. Python does + *not* finalize an object when the last reference to it is deleted; use + :c:func:`PyObject_CallFinalizerFromDealloc` to ensure that + :c:member:`~PyTypeObject.tp_finalize` is always called. + #. If the object is marked as finalized, + :c:member:`~PyTypeObject.tp_clear` might be called by the garbage collector + to clear references held by the object. It is *not* called when the + object's reference count reaches zero. + #. :c:member:`~PyTypeObject.tp_dealloc` is called to destroy the object. + To avoid code duplication, :c:member:`~PyTypeObject.tp_dealloc` typically + calls into :c:member:`~PyTypeObject.tp_clear` to free up the object's + references. + #. When :c:member:`~PyTypeObject.tp_dealloc` finishes object destruction, + it directly calls :c:member:`~PyTypeObject.tp_free` (usually set to + :c:func:`PyObject_Free` or :c:func:`PyObject_GC_Del` automatically as + appropriate for the type) to deallocate the memory. + + * The :c:member:`~PyTypeObject.tp_finalize` function is permitted to add a + reference to the object if desired. If it does, the object is + *resurrected*, preventing its pending destruction. (Only + :c:member:`!tp_finalize` is allowed to resurrect an object; + :c:member:`~PyTypeObject.tp_clear` and + :c:member:`~PyTypeObject.tp_dealloc` cannot without calling into + :c:member:`!tp_finalize`.) Resurrecting an object may + or may not cause the object's *finalized* mark to be removed. Currently, + Python does not remove the *finalized* mark from a resurrected object if + it supports garbage collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` + flag is set) but does remove the mark if the object does not support + garbage collection; either or both of these behaviors may change in the + future. + * :c:member:`~PyTypeObject.tp_dealloc` can optionally call + :c:member:`~PyTypeObject.tp_finalize` via + :c:func:`PyObject_CallFinalizerFromDealloc` if it wishes to reuse that + code to help with object destruction. This is recommended because it + guarantees that :c:member:`!tp_finalize` is always called before + destruction. See the :c:member:`~PyTypeObject.tp_dealloc` documentation + for example code. + * If the object is a member of a :term:`cyclic isolate` and either + :c:member:`~PyTypeObject.tp_clear` fails to break the reference cycle or + the cyclic isolate is not detected (perhaps :func:`gc.disable` was called, + or the :c:macro:`Py_TPFLAGS_HAVE_GC` flag was erroneously omitted in one + of the involved types), the objects remain indefinitely uncollectable + (they "leak"). See :data:`gc.garbage`. + + If the object is marked as supporting garbage collection (the + :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in + :c:member:`~PyTypeObject.tp_flags`), the following events are also possible: + + * The garbage collector occasionally calls + :c:member:`~PyTypeObject.tp_traverse` to identify :term:`cyclic isolates + `. + * When the garbage collector discovers a :term:`cyclic isolate`, it + finalizes one of the objects in the group by marking it as *finalized* and + calling its :c:member:`~PyTypeObject.tp_finalize` function, if it has one. + This repeats until the cyclic isolate doesn't exist or all of the objects + have been finalized. + * :c:member:`~PyTypeObject.tp_finalize` is permitted to resurrect the object + by adding a reference from outside the :term:`cyclic isolate`. The new + reference causes the group of objects to no longer form a cyclic isolate + (the reference cycle may still exist, but if it does the objects are no + longer isolated). + * When the garbage collector discovers a :term:`cyclic isolate` and all of + the objects in the group have already been marked as *finalized*, the + garbage collector clears one or more of the uncleared objects in the group + (possibly concurrently) by calling each's + :c:member:`~PyTypeObject.tp_clear` function. This repeats as long as the + cyclic isolate still exists and not all of the objects have been cleared. + + +Cyclic Isolate Destruction +-------------------------- + +Listed below are the stages of life of a hypothetical :term:`cyclic isolate` +that continues to exist after each member object is finalized or cleared. It +is a memory leak if a cyclic isolate progresses through all of these stages; it should +vanish once all objects are cleared, if not sooner. A cyclic isolate can +vanish either because the reference cycle is broken or because the objects are +no longer isolated due to finalizer resurrection (see +:c:member:`~PyTypeObject.tp_finalize`). + +0. **Reachable** (not yet a cyclic isolate): All objects are in their normal, + reachable state. A reference cycle could exist, but an external reference + means the objects are not yet isolated. +#. **Unreachable but consistent:** The final reference from outside the cyclic + group of objects has been removed, causing the objects to become isolated + (thus a cyclic isolate is born). None of the group's objects have been + finalized or cleared yet. The cyclic isolate remains at this stage until + some future run of the garbage collector (not necessarily the next run + because the next run might not scan every object). +#. **Mix of finalized and not finalized:** Objects in a cyclic isolate are + finalized one at a time, which means that there is a period of time when the + cyclic isolate is composed of a mix of finalized and non-finalized objects. + Finalization order is unspecified, so it can appear random. A finalized + object must behave in a sane manner when non-finalized objects interact with + it, and a non-finalized object must be able to tolerate the finalization of + an arbitrary subset of its referents. +#. **All finalized:** All objects in a cyclic isolate are finalized before any + of them are cleared. +#. **Mix of finalized and cleared:** The objects can be cleared serially or + concurrently (but with the :term:`GIL` held); either way, some will finish + before others. A finalized object must be able to tolerate the clearing of + a subset of its referents. :pep:`442` calls this stage "cyclic trash". +#. **Leaked:** If a cyclic isolate still exists after all objects in the group + have been finalized and cleared, then the objects remain indefinitely + uncollectable (see :data:`gc.garbage`). It is a bug if a cyclic isolate + reaches this stage---it means the :c:member:`~PyTypeObject.tp_clear` methods + of the participating objects have failed to break the reference cycle as + required. + +If :c:member:`~PyTypeObject.tp_clear` did not exist, then Python would have no +way to safely break a reference cycle. Simply destroying an object in a cyclic +isolate would result in a dangling pointer, triggering undefined behavior when +an object referencing the destroyed object is itself destroyed. The clearing +step makes object destruction a two-phase process: first +:c:member:`~PyTypeObject.tp_clear` is called to partially destroy the objects +enough to detangle them from each other, then +:c:member:`~PyTypeObject.tp_dealloc` is called to complete the destruction. + +Unlike clearing, finalization is not a phase of destruction. A finalized +object must still behave properly by continuing to fulfill its design +contracts. An object's finalizer is allowed to execute arbitrary Python code, +and is even allowed to prevent the impending destruction by adding a reference. +The finalizer is only related to destruction by call order---if it runs, it runs +before destruction, which starts with :c:member:`~PyTypeObject.tp_clear` (if +called) and concludes with :c:member:`~PyTypeObject.tp_dealloc`. + +The finalization step is not necessary to safely reclaim the objects in a +cyclic isolate, but its existence makes it easier to design types that behave +in a sane manner when objects are cleared. Clearing an object might +necessarily leave it in a broken, partially destroyed state---it might be +unsafe to call any of the cleared object's methods or access any of its +attributes. With finalization, only finalized objects can possibly interact +with cleared objects; non-finalized objects are guaranteed to interact with +only non-cleared (but potentially finalized) objects. + +To summarize the possible interactions: + +* A non-finalized object might have references to or from non-finalized and + finalized objects, but not to or from cleared objects. +* A finalized object might have references to or from non-finalized, finalized, + and cleared objects. +* A cleared object might have references to or from finalized and cleared + objects, but not to or from non-finalized objects. + +Without any reference cycles, an object can be simply destroyed once its last +reference is deleted; the finalization and clearing steps are not necessary to +safely reclaim unused objects. However, it can be useful to automatically call +:c:member:`~PyTypeObject.tp_finalize` and :c:member:`~PyTypeObject.tp_clear` +before destruction anyway because type design is simplified when all objects +always experience the same series of events regardless of whether they +participated in a cyclic isolate. Python currently only calls +:c:member:`~PyTypeObject.tp_finalize` and :c:member:`~PyTypeObject.tp_clear` as +needed to destroy a cyclic isolate; this may change in a future version. + + +Functions +--------- + +To allocate and free memory, see :ref:`allocating-objects`. + + +.. c:function:: void PyObject_CallFinalizer(PyObject *op) + + Finalizes the object as described in :c:member:`~PyTypeObject.tp_finalize`. + Call this function (or :c:func:`PyObject_CallFinalizerFromDealloc`) instead + of calling :c:member:`~PyTypeObject.tp_finalize` directly because this + function may deduplicate multiple calls to :c:member:`!tp_finalize`. + Currently, calls are only deduplicated if the type supports garbage + collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set); this may + change in the future. + + +.. c:function:: int PyObject_CallFinalizerFromDealloc(PyObject *op) + + Same as :c:func:`PyObject_CallFinalizer` but meant to be called at the + beginning of the object's destructor (:c:member:`~PyTypeObject.tp_dealloc`). + There must not be any references to the object. If the object's finalizer + resurrects the object, this function returns -1; no further destruction + should happen. Otherwise, this function returns 0 and destruction can + continue normally. + + .. seealso:: + + :c:member:`~PyTypeObject.tp_dealloc` for example code. diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 64ae35daa703b8..61fa49f8681cce 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -376,6 +376,24 @@ The :ref:`default object allocator ` uses the If *p* is ``NULL``, no operation is performed. + Do not call this directly to free an object's memory; call the type's + :c:member:`~PyTypeObject.tp_free` slot instead. + + Do not use this for memory allocated by :c:macro:`PyObject_GC_New` or + :c:macro:`PyObject_GC_NewVar`; use :c:func:`PyObject_GC_Del` instead. + + .. seealso:: + + * :c:func:`PyObject_GC_Del` is the equivalent of this function for memory + allocated by types that support garbage collection. + * :c:func:`PyObject_Malloc` + * :c:func:`PyObject_Realloc` + * :c:func:`PyObject_Calloc` + * :c:macro:`PyObject_New` + * :c:macro:`PyObject_NewVar` + * :c:func:`PyType_GenericAlloc` + * :c:member:`~PyTypeObject.tp_free` + .. _default-memory-allocators: diff --git a/Doc/c-api/objimpl.rst b/Doc/c-api/objimpl.rst index 8bd8c107c98bdf..83de4248039949 100644 --- a/Doc/c-api/objimpl.rst +++ b/Doc/c-api/objimpl.rst @@ -12,6 +12,7 @@ object types. .. toctree:: allocation.rst + lifecycle.rst structures.rst typeobj.rst gcsupport.rst diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index ec2867b0ce09ba..2176b8e492f306 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -151,14 +151,29 @@ Type Objects .. c:function:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) - Generic handler for the :c:member:`~PyTypeObject.tp_alloc` slot of a type object. Use - Python's default memory allocation mechanism to allocate a new instance and - initialize all its contents to ``NULL``. + Generic handler for the :c:member:`~PyTypeObject.tp_alloc` slot of a type + object. Uses Python's default memory allocation mechanism to allocate memory + for a new instance, zeros the memory, then initializes the memory as if by + calling :c:func:`PyObject_Init` or :c:func:`PyObject_InitVar`. + + Do not call this directly to allocate memory for an object; call the type's + :c:member:`~PyTypeObject.tp_alloc` slot instead. + + For types that support garbage collection (i.e., the + :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set), this function behaves like + :c:macro:`PyObject_GC_New` or :c:macro:`PyObject_GC_NewVar` (except the + memory is guaranteed to be zeroed before initialization), and should be + paired with :c:func:`PyObject_GC_Del` in :c:member:`~PyTypeObject.tp_free`. + Otherwise, it behaves like :c:macro:`PyObject_New` or + :c:macro:`PyObject_NewVar` (except the memory is guaranteed to be zeroed + before initialization) and should be paired with :c:func:`PyObject_Free` in + :c:member:`~PyTypeObject.tp_free`. .. c:function:: PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) - Generic handler for the :c:member:`~PyTypeObject.tp_new` slot of a type object. Create a - new instance using the type's :c:member:`~PyTypeObject.tp_alloc` slot. + Generic handler for the :c:member:`~PyTypeObject.tp_new` slot of a type + object. Creates a new instance using the type's + :c:member:`~PyTypeObject.tp_alloc` slot and returns the resulting object. .. c:function:: int PyType_Ready(PyTypeObject *type) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 3b9f07778d5ace..64353a8daca5f6 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -676,77 +676,122 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: destructor PyTypeObject.tp_dealloc - A pointer to the instance destructor function. This function must be defined - unless the type guarantees that its instances will never be deallocated (as is - the case for the singletons ``None`` and ``Ellipsis``). The function signature is:: + A pointer to the instance destructor function. The function signature is:: void tp_dealloc(PyObject *self); - The destructor function is called by the :c:func:`Py_DECREF` and - :c:func:`Py_XDECREF` macros when the new reference count is zero. At this point, - the instance is still in existence, but there are no references to it. The - destructor function should free all references which the instance owns, free all - memory buffers owned by the instance (using the freeing function corresponding - to the allocation function used to allocate the buffer), and call the type's - :c:member:`~PyTypeObject.tp_free` function. If the type is not subtypable - (doesn't have the :c:macro:`Py_TPFLAGS_BASETYPE` flag bit set), it is - permissible to call the object deallocator directly instead of via - :c:member:`~PyTypeObject.tp_free`. The object deallocator should be the one used to allocate the - instance; this is normally :c:func:`PyObject_Free` if the instance was allocated - using :c:macro:`PyObject_New` or :c:macro:`PyObject_NewVar`, or - :c:func:`PyObject_GC_Del` if the instance was allocated using - :c:macro:`PyObject_GC_New` or :c:macro:`PyObject_GC_NewVar`. - - If the type supports garbage collection (has the :c:macro:`Py_TPFLAGS_HAVE_GC` - flag bit set), the destructor should call :c:func:`PyObject_GC_UnTrack` + The destructor function should remove all references which the instance owns + (e.g., call :c:func:`Py_CLEAR`), free all memory buffers owned by the + instance, and call the type's :c:member:`~PyTypeObject.tp_free` function to + free the object itself. + + No guarantees are made about when an object is destroyed, except: + + * Python will destroy an object immediately or some time after the final + reference to the object is deleted, unless its finalizer + (:c:member:`~PyTypeObject.tp_finalize`) subsequently resurrects the + object. + * An object will not be destroyed while it is being automatically finalized + (:c:member:`~PyTypeObject.tp_finalize`) or automatically cleared + (:c:member:`~PyTypeObject.tp_clear`). + + CPython currently destroys an object immediately from :c:func:`Py_DECREF` + when the new reference count is zero, but this may change in a future + version. + + It is recommended to call :c:func:`PyObject_CallFinalizerFromDealloc` at the + beginning of :c:member:`!tp_dealloc` to guarantee that the object is always + finalized before destruction. + + If the type supports garbage collection (the :c:macro:`Py_TPFLAGS_HAVE_GC` + flag is set), the destructor should call :c:func:`PyObject_GC_UnTrack` before clearing any member fields. - .. code-block:: c + It is permissible to call :c:member:`~PyTypeObject.tp_clear` from + :c:member:`!tp_dealloc` to reduce code duplication and to guarantee that the + object is always cleared before destruction. Beware that + :c:member:`!tp_clear` might have already been called. - static void - foo_dealloc(PyObject *op) - { + If the type is heap allocated (:c:macro:`Py_TPFLAGS_HEAPTYPE`), the + deallocator should release the owned reference to its type object (via + :c:func:`Py_DECREF`) after calling the type deallocator. See the example + code below.:: + + static void + foo_dealloc(PyObject *op) + { foo_object *self = (foo_object *) op; PyObject_GC_UnTrack(self); Py_CLEAR(self->ref); Py_TYPE(self)->tp_free(self); - } + } + + :c:member:`!tp_dealloc` must leave the exception status unchanged. If it + needs to call something that might raise an exception, the exception state + must be backed up first and restored later (after logging any exceptions + with :c:func:`PyErr_WriteUnraisable`). + + Example:: - Finally, if the type is heap allocated (:c:macro:`Py_TPFLAGS_HEAPTYPE`), the - deallocator should release the owned reference to its type object - (via :c:func:`Py_DECREF`) after - calling the type deallocator. In order to avoid dangling pointers, the - recommended way to achieve this is: + static void + foo_dealloc(PyObject *self) + { + PyObject *exc = PyErr_GetRaisedException(); - .. code-block:: c + if (PyObject_CallFinalizerFromDealloc(self) < 0) { + // self was resurrected. + goto done; + } - static void - foo_dealloc(PyObject *op) - { - PyTypeObject *tp = Py_TYPE(op); - // free references and buffers here - tp->tp_free(op); - Py_DECREF(tp); - } + PyTypeObject *tp = Py_TYPE(self); - .. warning:: + if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) { + PyObject_GC_UnTrack(self); + } - 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 - with an :term:`attached thread state`. 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. + // Optional, but convenient to avoid code duplication. + if (tp->tp_clear && tp->tp_clear(self) < 0) { + PyErr_WriteUnraisable(self); + } + + // Any additional destruction goes here. + + tp->tp_free(self); + self = NULL; // In case PyErr_WriteUnraisable() is called below. + + if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) { + Py_CLEAR(tp); + } + + done: + // Optional, if something was called that might have raised an + // exception. + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(self); + } + PyErr_SetRaisedException(exc); + } + + :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 + with an :term:`attached thread state`. However, if the object being + destroyed in turn destroys objects from some other 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:** This field is inherited by subtypes. + .. seealso:: + + :ref:`life-cycle` for details about how this slot relates to other slots. + .. c:member:: Py_ssize_t PyTypeObject.tp_vectorcall_offset @@ -1137,11 +1182,11 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:macro:: Py_TPFLAGS_HAVE_GC This bit is set when the object supports garbage collection. If this bit - is set, instances must be created using :c:macro:`PyObject_GC_New` and - destroyed using :c:func:`PyObject_GC_Del`. More information in section - :ref:`supporting-cycle-detection`. This bit also implies that the - GC-related fields :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` are present in - the type object. + is set, memory for new instances (see :c:member:`~PyTypeObject.tp_alloc`) + must be allocated using :c:macro:`PyObject_GC_New` or + :c:func:`PyType_GenericAlloc` and deallocated (see + :c:member:`~PyTypeObject.tp_free`) using :c:func:`PyObject_GC_Del`. More + information in section :ref:`supporting-cycle-detection`. **Inheritance:** @@ -1478,6 +1523,11 @@ and :c:data:`PyType_Type` effectively act as defaults.) heap-allocated superclass). If they do not, the type object may not be garbage-collected. + .. note:: + + The :c:member:`~PyTypeObject.tp_traverse` function can be called from any + thread. + .. versionchanged:: 3.9 Heap-allocated types are expected to visit ``Py_TYPE(self)`` in @@ -1497,20 +1547,101 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: inquiry PyTypeObject.tp_clear - An optional pointer to a clear function for the garbage collector. This is only - used if the :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is set. The signature is:: + An optional pointer to a clear function. The signature is:: int tp_clear(PyObject *); - The :c:member:`~PyTypeObject.tp_clear` member function is used to break reference cycles in cyclic - garbage detected by the garbage collector. Taken together, all :c:member:`~PyTypeObject.tp_clear` - functions in the system must combine to break all reference cycles. This is - subtle, and if in any doubt supply a :c:member:`~PyTypeObject.tp_clear` function. For example, - the tuple type does not implement a :c:member:`~PyTypeObject.tp_clear` function, because it's - possible to prove that no reference cycle can be composed entirely of tuples. - Therefore the :c:member:`~PyTypeObject.tp_clear` functions of other types must be sufficient to - break any cycle containing a tuple. This isn't immediately obvious, and there's - rarely a good reason to avoid implementing :c:member:`~PyTypeObject.tp_clear`. + The purpose of this function is to break reference cycles that are causing a + :term:`cyclic isolate` so that the objects can be safely destroyed. A + cleared object is a partially destroyed object; the object is not obligated + to satisfy design invariants held during normal use. + + :c:member:`!tp_clear` does not need to delete references to objects that + can't participate in reference cycles, such as Python strings or Python + integers. However, it may be convenient to clear all references, and write + the type's :c:member:`~PyTypeObject.tp_dealloc` function to invoke + :c:member:`!tp_clear` to avoid code duplication. (Beware that + :c:member:`!tp_clear` might have already been called. Prefer calling + idempotent functions like :c:func:`Py_CLEAR`.) + + Any non-trivial cleanup should be performed in + :c:member:`~PyTypeObject.tp_finalize` instead of :c:member:`!tp_clear`. + + .. note:: + + If :c:member:`!tp_clear` fails to break a reference cycle then the + objects in the :term:`cyclic isolate` may remain indefinitely + uncollectable ("leak"). See :data:`gc.garbage`. + + .. note:: + + Referents (direct and indirect) might have already been cleared; they are + not guaranteed to be in a consistent state. + + .. note:: + + The :c:member:`~PyTypeObject.tp_clear` function can be called from any + thread. + + .. note:: + + An object is not guaranteed to be automatically cleared before its + destructor (:c:member:`~PyTypeObject.tp_dealloc`) is called. + + This function differs from the destructor + (:c:member:`~PyTypeObject.tp_dealloc`) in the following ways: + + * The purpose of clearing an object is to remove references to other objects + that might participate in a reference cycle. The purpose of the + destructor, on the other hand, is a superset: it must release *all* + resources it owns, including references to objects that cannot participate + in a reference cycle (e.g., integers) as well as the object's own memory + (by calling :c:member:`~PyTypeObject.tp_free`). + * When :c:member:`!tp_clear` is called, other objects might still hold + references to the object being cleared. Because of this, + :c:member:`!tp_clear` must not deallocate the object's own memory + (:c:member:`~PyTypeObject.tp_free`). The destructor, on the other hand, + is only called when no (strong) references exist, and as such, must + safely destroy the object itself by deallocating it. + * :c:member:`!tp_clear` might never be automatically called. An object's + destructor, on the other hand, will be automatically called some time + after the object becomes unreachable (i.e., either there are no references + to the object or the object is a member of a :term:`cyclic isolate`). + + No guarantees are made about when, if, or how often Python automatically + clears an object, except: + + * Python will not automatically clear an object if it is reachable, i.e., + there is a reference to it and it is not a member of a :term:`cyclic + isolate`. + * Python will not automatically clear an object if it has not been + automatically finalized (see :c:member:`~PyTypeObject.tp_finalize`). (If + the finalizer resurrected the object, the object may or may not be + automatically finalized again before it is cleared.) + * If an object is a member of a :term:`cyclic isolate`, Python will not + automatically clear it if any member of the cyclic isolate has not yet + been automatically finalized (:c:member:`~PyTypeObject.tp_finalize`). + * Python will not destroy an object until after any automatic calls to its + :c:member:`!tp_clear` function have returned. This ensures that the act + of breaking a reference cycle does not invalidate the ``self`` pointer + while :c:member:`!tp_clear` is still executing. + * Python will not automatically call :c:member:`!tp_clear` multiple times + concurrently. + + CPython currently only automatically clears objects as needed to break + reference cycles in a :term:`cyclic isolate`, but future versions might + clear objects regularly before their destruction. + + Taken together, all :c:member:`~PyTypeObject.tp_clear` functions in the + system must combine to break all reference cycles. This is subtle, and if + in any doubt supply a :c:member:`~PyTypeObject.tp_clear` function. For + example, the tuple type does not implement a + :c:member:`~PyTypeObject.tp_clear` function, because it's possible to prove + that no reference cycle can be composed entirely of tuples. Therefore the + :c:member:`~PyTypeObject.tp_clear` functions of other types are responsible + for breaking any cycle containing a tuple. This isn't immediately obvious, + and there's rarely a good reason to avoid implementing + :c:member:`~PyTypeObject.tp_clear`. Implementations of :c:member:`~PyTypeObject.tp_clear` should drop the instance's references to those of its members that may be Python objects, and set its pointers to those @@ -1545,18 +1676,6 @@ and :c:data:`PyType_Type` effectively act as defaults.) 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 - collector is not involved and :c:member:`~PyTypeObject.tp_dealloc` is - called directly. - - Because the goal of :c:member:`~PyTypeObject.tp_clear` functions is to break reference cycles, - it's not necessary to clear contained objects like Python strings or Python - integers, which can't participate in reference cycles. On the other hand, it may - be convenient to clear all contained Python objects, and write the type's - :c:member:`~PyTypeObject.tp_dealloc` function to invoke :c:member:`~PyTypeObject.tp_clear`. - More information about Python's garbage collection scheme can be found in section :ref:`supporting-cycle-detection`. @@ -1569,6 +1688,10 @@ and :c:data:`PyType_Type` effectively act as defaults.) :c:member:`~PyTypeObject.tp_clear` are all inherited from the base type if they are all zero in the subtype. + .. seealso:: + + :ref:`life-cycle` for details about how this slot relates to other slots. + .. c:member:: richcmpfunc PyTypeObject.tp_richcompare @@ -1945,18 +2068,17 @@ and :c:data:`PyType_Type` effectively act as defaults.) **Inheritance:** - This field is inherited by static subtypes, but not by dynamic - subtypes (subtypes created by a class statement). + Static subtypes inherit this slot, which will be + :c:func:`PyType_GenericAlloc` if inherited from :class:`object`. + + :ref:`Heap subtypes ` do not inherit this slot. **Default:** - For dynamic subtypes, this field is always set to - :c:func:`PyType_GenericAlloc`, to force a standard heap - allocation strategy. + For heap subtypes, this field is always set to + :c:func:`PyType_GenericAlloc`. - For static subtypes, :c:data:`PyBaseObject_Type` uses - :c:func:`PyType_GenericAlloc`. That is the recommended value - for all statically defined types. + For static subtypes, this slot is inherited (see above). .. c:member:: newfunc PyTypeObject.tp_new @@ -2004,20 +2126,27 @@ and :c:data:`PyType_Type` effectively act as defaults.) void tp_free(void *self); - An initializer that is compatible with this signature is :c:func:`PyObject_Free`. + This function must free the memory allocated by + :c:member:`~PyTypeObject.tp_alloc`. **Inheritance:** - This field is inherited by static subtypes, but not by dynamic - subtypes (subtypes created by a class statement) + Static subtypes inherit this slot, which will be :c:func:`PyObject_Free` if + inherited from :class:`object`. Exception: If the type supports garbage + collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in + :c:member:`~PyTypeObject.tp_flags`) and it would inherit + :c:func:`PyObject_Free`, then this slot is not inherited but instead defaults + to :c:func:`PyObject_GC_Del`. + + :ref:`Heap subtypes ` do not inherit this slot. **Default:** - In dynamic subtypes, this field is set to a deallocator suitable to - match :c:func:`PyType_GenericAlloc` and the value of the - :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit. + For :ref:`heap subtypes `, this slot defaults to a deallocator suitable to match + :c:func:`PyType_GenericAlloc` and the value of the + :c:macro:`Py_TPFLAGS_HAVE_GC` flag. - For static subtypes, :c:data:`PyBaseObject_Type` uses :c:func:`PyObject_Free`. + For static subtypes, this slot is inherited (see above). .. c:member:: inquiry PyTypeObject.tp_is_gc @@ -2144,29 +2273,138 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: destructor PyTypeObject.tp_finalize - An optional pointer to an instance finalization function. Its signature is:: + An optional pointer to an instance finalization function. This is the C + implementation of the :meth:`~object.__del__` special method. Its signature + is:: void tp_finalize(PyObject *self); - If :c:member:`~PyTypeObject.tp_finalize` is set, the interpreter calls it once when - finalizing an instance. It is called either from the garbage - collector (if the instance is part of an isolated reference cycle) or - just before the object is deallocated. Either way, it is guaranteed - to be called before attempting to break reference cycles, ensuring - that it finds the object in a sane state. + The primary purpose of finalization is to perform any non-trivial cleanup + that must be performed before the object is destroyed, while the object and + any other objects it directly or indirectly references are still in a + consistent state. The finalizer is allowed to execute + arbitrary Python code. + + Before Python automatically finalizes an object, some of the object's direct + or indirect referents might have themselves been automatically finalized. + However, none of the referents will have been automatically cleared + (:c:member:`~PyTypeObject.tp_clear`) yet. + + Other non-finalized objects might still be using a finalized object, so the + finalizer must leave the object in a sane state (e.g., invariants are still + met). + + .. note:: + + After Python automatically finalizes an object, Python might start + automatically clearing (:c:member:`~PyTypeObject.tp_clear`) the object + and its referents (direct and indirect). Cleared objects are not + guaranteed to be in a consistent state; a finalized object must be able + to tolerate cleared referents. + + .. note:: + + An object is not guaranteed to be automatically finalized before its + destructor (:c:member:`~PyTypeObject.tp_dealloc`) is called. It is + recommended to call :c:func:`PyObject_CallFinalizerFromDealloc` at the + beginning of :c:member:`!tp_dealloc` to guarantee that the object is + always finalized before destruction. + + .. note:: + + The :c:member:`~PyTypeObject.tp_finalize` function can be called from any + thread, although the :term:`GIL` will be held. - :c:member:`~PyTypeObject.tp_finalize` should not mutate the current exception status; - therefore, a recommended way to write a non-trivial finalizer is:: + .. note:: + + The :c:member:`!tp_finalize` function can be called during shutdown, + after some global variables have been deleted. See the documentation of + the :meth:`~object.__del__` method for details. + + When Python finalizes an object, it behaves like the following algorithm: + + #. Python might mark the object as *finalized*. Currently, Python always + marks objects whose type supports garbage collection (i.e., the + :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in + :c:member:`~PyTypeObject.tp_flags`) and never marks other types of + objects; this might change in a future version. + #. If the object is not marked as *finalized* and its + :c:member:`!tp_finalize` finalizer function is non-``NULL``, the + finalizer function is called. + #. If the finalizer function was called and the finalizer made the object + reachable (i.e., there is a reference to the object and it is not a + member of a :term:`cyclic isolate`), then the finalizer is said to have + *resurrected* the object. It is unspecified whether the finalizer can + also resurrect the object by adding a new reference to the object that + does not make it reachable, i.e., the object is (still) a member of a + cyclic isolate. + #. If the finalizer resurrected the object, the object's pending destruction + is canceled and the object's *finalized* mark might be removed if + present. Currently, Python never removes the *finalized* mark; this + might change in a future version. + + *Automatic finalization* refers to any finalization performed by Python + except via calls to :c:func:`PyObject_CallFinalizer` or + :c:func:`PyObject_CallFinalizerFromDealloc`. No guarantees are made about + when, if, or how often an object is automatically finalized, except: + + * Python will not automatically finalize an object if it is reachable, i.e., + there is a reference to it and it is not a member of a :term:`cyclic + isolate`. + * Python will not automatically finalize an object if finalizing it would + not mark the object as *finalized*. Currently, this applies to objects + whose type does not support garbage collection, i.e., the + :c:macro:`Py_TPFLAGS_HAVE_GC` flag is not set. Such objects can still be + manually finalized by calling :c:func:`PyObject_CallFinalizer` or + :c:func:`PyObject_CallFinalizerFromDealloc`. + * Python will not automatically finalize any two members of a :term:`cyclic + isolate` concurrently. + * Python will not automatically finalize an object after it has + automatically cleared (:c:member:`~PyTypeObject.tp_clear`) the object. + * If an object is a member of a :term:`cyclic isolate`, Python will not + automatically finalize it after automatically clearing (see + :c:member:`~PyTypeObject.tp_clear`) any other member. + * Python will automatically finalize every member of a :term:`cyclic + isolate` before it automatically clears (see + :c:member:`~PyTypeObject.tp_clear`) any of them. + * If Python is going to automatically clear an object + (:c:member:`~PyTypeObject.tp_clear`), it will automatically finalize the + object first. + + Python currently only automatically finalizes objects that are members of a + :term:`cyclic isolate`, but future versions might finalize objects regularly + before their destruction. + + To manually finalize an object, do not call this function directly; call + :c:func:`PyObject_CallFinalizer` or + :c:func:`PyObject_CallFinalizerFromDealloc` instead. + + :c:member:`~PyTypeObject.tp_finalize` should leave the current exception + status unchanged. The recommended way to write a non-trivial finalizer is + to back up the exception at the beginning by calling + :c:func:`PyErr_GetRaisedException` and restore the exception at the end by + calling :c:func:`PyErr_SetRaisedException`. If an exception is encountered + in the middle of the finalizer, log and clear it with + :c:func:`PyErr_WriteUnraisable` or :c:func:`PyErr_FormatUnraisable`. For + example:: static void - local_finalize(PyObject *self) + foo_finalize(PyObject *self) { - /* Save the current exception, if any. */ + // Save the current exception, if any. PyObject *exc = PyErr_GetRaisedException(); - /* ... */ + // ... - /* Restore the saved exception. */ + if (do_something_that_might_raise() != success_indicator) { + PyErr_WriteUnraisable(self); + goto done; + } + + done: + // Restore the saved exception. This silently discards any exception + // raised above, so be sure to call PyErr_WriteUnraisable first if + // necessary. PyErr_SetRaisedException(exc); } @@ -2182,7 +2420,13 @@ and :c:data:`PyType_Type` effectively act as defaults.) :c:macro:`Py_TPFLAGS_HAVE_FINALIZE` flags bit in order for this field to be used. This is no longer required. - .. seealso:: "Safe object finalization" (:pep:`442`) + .. seealso:: + + * :pep:`442`: "Safe object finalization" + * :ref:`life-cycle` for details about how this slot relates to other + slots. + * :c:func:`PyObject_CallFinalizer` + * :c:func:`PyObject_CallFinalizerFromDealloc` .. c:member:: vectorcallfunc PyTypeObject.tp_vectorcall diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 0b26e18efd7f1b..c5c7994f1262a9 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -355,6 +355,12 @@ Glossary tasks (see :mod:`asyncio`) associate each task with a context which becomes the current context whenever the task starts or resumes execution. + cyclic isolate + A subgroup of one or more objects that reference each other in a reference + cycle, but are not referenced by objects outside the group. The goal of + the :term:`cyclic garbage collector ` is to identify these groups and break the reference + cycles so that the memory can be reclaimed. + decorator A function returning another function, usually applied as a function transformation using the ``@wrapper`` syntax. Common examples for From 6ce2045139e461d45e721745383245f484a7f167 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 19:22:24 +0200 Subject: [PATCH 0159/1674] [3.14] GH-133779: Fix finding pyconfig.h on Windows JIT builds (GH-134359) (cherry picked from commit 7ad90463df16e1938a3b6725b0f02af34cea372e) --- PCbuild/regen.targets | 3 +-- Tools/jit/_targets.py | 16 ++++++++-------- Tools/jit/build.py | 21 +++++++++++++++++---- configure | 2 +- configure.ac | 2 +- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets index 21de614e71ddce..742597f5cb5ebd 100644 --- a/PCbuild/regen.targets +++ b/PCbuild/regen.targets @@ -125,8 +125,7 @@ x86_64-pc-windows-msvc $(JITArgs) --debug
- +
diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index 6ceb4404e74ce7..d0a1c081ffecc2 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -47,6 +47,7 @@ class _Target(typing.Generic[_S, _R]): debug: bool = False verbose: bool = False known_symbols: dict[str, int] = dataclasses.field(default_factory=dict) + pyconfig_dir: pathlib.Path = pathlib.Path.cwd().resolve() def _get_nop(self) -> bytes: if re.fullmatch(r"aarch64-.*", self.triple): @@ -57,13 +58,13 @@ def _get_nop(self) -> bytes: raise ValueError(f"NOP not defined for {self.triple}") return nop - def _compute_digest(self, out: pathlib.Path) -> str: + def _compute_digest(self) -> str: hasher = hashlib.sha256() hasher.update(self.triple.encode()) hasher.update(self.debug.to_bytes()) # These dependencies are also reflected in _JITSources in regen.targets: hasher.update(PYTHON_EXECUTOR_CASES_C_H.read_bytes()) - hasher.update((out / "pyconfig.h").read_bytes()) + hasher.update((self.pyconfig_dir / "pyconfig.h").read_bytes()) for dirpath, _, filenames in sorted(os.walk(TOOLS_JIT)): for filename in filenames: hasher.update(pathlib.Path(dirpath, filename).read_bytes()) @@ -125,7 +126,7 @@ async def _compile( f"-D_JIT_OPCODE={opname}", "-D_PyJIT_ACTIVE", "-D_Py_JIT", - "-I.", + f"-I{self.pyconfig_dir}", f"-I{CPYTHON / 'Include'}", f"-I{CPYTHON / 'Include' / 'internal'}", f"-I{CPYTHON / 'Include' / 'internal' / 'mimalloc'}", @@ -193,20 +194,19 @@ async def _build_stencils(self) -> dict[str, _stencils.StencilGroup]: def build( self, - out: pathlib.Path, *, comment: str = "", force: bool = False, - stencils_h: str = "jit_stencils.h", + jit_stencils: pathlib.Path, ) -> None: """Build jit_stencils.h in the given directory.""" + jit_stencils.parent.mkdir(parents=True, exist_ok=True) if not self.stable: warning = f"JIT support for {self.triple} is still experimental!" request = "Please report any issues you encounter.".center(len(warning)) outline = "=" * len(warning) print("\n".join(["", outline, warning, request, outline, ""])) - digest = f"// {self._compute_digest(out)}\n" - jit_stencils = out / stencils_h + digest = f"// {self._compute_digest()}\n" if ( not force and jit_stencils.exists() @@ -214,7 +214,7 @@ def build( ): return stencil_groups = ASYNCIO_RUNNER.run(self._build_stencils()) - jit_stencils_new = out / "jit_stencils.h.new" + jit_stencils_new = jit_stencils.parent / "jit_stencils.h.new" try: with jit_stencils_new.open("w") as file: file.write(digest) diff --git a/Tools/jit/build.py b/Tools/jit/build.py index 49b08f477dbed7..1afd0c76bad1d2 100644 --- a/Tools/jit/build.py +++ b/Tools/jit/build.py @@ -8,7 +8,6 @@ import _targets if __name__ == "__main__": - out = pathlib.Path.cwd().resolve() comment = f"$ {shlex.join([pathlib.Path(sys.executable).name] + sys.argv)}" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( @@ -23,6 +22,20 @@ parser.add_argument( "-f", "--force", action="store_true", help="force the entire JIT to be rebuilt" ) + parser.add_argument( + "-o", + "--output-dir", + help="where to output generated files", + required=True, + type=lambda p: pathlib.Path(p).resolve(), + ) + parser.add_argument( + "-p", + "--pyconfig-dir", + help="where to find pyconfig.h", + required=True, + type=lambda p: pathlib.Path(p).resolve(), + ) parser.add_argument( "-v", "--verbose", action="store_true", help="echo commands as they are run" ) @@ -31,13 +44,13 @@ target.debug = args.debug target.force = args.force target.verbose = args.verbose + target.pyconfig_dir = args.pyconfig_dir target.build( - out, comment=comment, - stencils_h=f"jit_stencils-{target.triple}.h", force=args.force, + jit_stencils=args.output_dir / f"jit_stencils-{target.triple}.h", ) - jit_stencils_h = out / "jit_stencils.h" + jit_stencils_h = args.output_dir / "jit_stencils.h" lines = [f"// {comment}\n"] guard = "#if" for target in args.target: diff --git a/configure b/configure index a43f1f84d046b8..5d21d06014a238 100755 --- a/configure +++ b/configure @@ -10863,7 +10863,7 @@ then : else case e in #( e) as_fn_append CFLAGS_NODIST " $jit_flags" - REGEN_JIT_COMMAND="\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host}" + REGEN_JIT_COMMAND="\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir ." JIT_STENCILS_H="jit_stencils.h" if test "x$Py_DEBUG" = xtrue then : diff --git a/configure.ac b/configure.ac index e3f39f19fc23e1..8613aa58257f5b 100644 --- a/configure.ac +++ b/configure.ac @@ -2776,7 +2776,7 @@ AS_VAR_IF([jit_flags], [], [AS_VAR_APPEND([CFLAGS_NODIST], [" $jit_flags"]) AS_VAR_SET([REGEN_JIT_COMMAND], - ["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host}"]) + ["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir ."]) AS_VAR_SET([JIT_STENCILS_H], ["jit_stencils.h"]) AS_VAR_IF([Py_DEBUG], [true], From efdaae5b356a158cf6028844d08b0efd1c5313cb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 19:43:09 +0200 Subject: [PATCH 0160/1674] [3.14] gh-86802: Fix asyncio memory leak; shielded task exceptions log once through the exception handler (gh-134331) (gh-134343) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit f695eca60cfc53cf3322323082652037d6d0cfef) Co-authored-by: Christian Harries <68507104+ChristianHrs@users.noreply.github.com> Co-authored-by: Łukasz Langa --- Lib/asyncio/tasks.py | 36 +++++++++++++---- Lib/test/test_asyncio/test_tasks.py | 40 +++++++++++++++++++ ...5-05-20-15-13-43.gh-issue-86802.trF7TM.rst | 3 ++ 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-20-15-13-43.gh-issue-86802.trF7TM.rst diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 888615f8e5e1b3..fbd5c39a7c56ac 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -908,6 +908,25 @@ def _done_callback(fut, cur_task=cur_task): return outer +def _log_on_exception(fut): + if fut.cancelled(): + return + + exc = fut.exception() + if exc is None: + return + + context = { + 'message': + f'{exc.__class__.__name__} exception in shielded future', + 'exception': exc, + 'future': fut, + } + if fut._source_traceback: + context['source_traceback'] = fut._source_traceback + fut._loop.call_exception_handler(context) + + def shield(arg): """Wait for a future, shielding it from cancellation. @@ -953,14 +972,11 @@ def shield(arg): else: cur_task = None - def _inner_done_callback(inner, cur_task=cur_task): - if cur_task is not None: - futures.future_discard_from_awaited_by(inner, cur_task) + def _clear_awaited_by_callback(inner): + futures.future_discard_from_awaited_by(inner, cur_task) + def _inner_done_callback(inner): if outer.cancelled(): - if not inner.cancelled(): - # Mark inner's result as retrieved. - inner.exception() return if inner.cancelled(): @@ -972,10 +988,16 @@ def _inner_done_callback(inner, cur_task=cur_task): else: outer.set_result(inner.result()) - def _outer_done_callback(outer): if not inner.done(): inner.remove_done_callback(_inner_done_callback) + # Keep only one callback to log on cancel + inner.remove_done_callback(_log_on_exception) + inner.add_done_callback(_log_on_exception) + + if cur_task is not None: + inner.add_done_callback(_clear_awaited_by_callback) + inner.add_done_callback(_inner_done_callback) outer.add_done_callback(_outer_done_callback) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 44498ef790e450..f6f976f213ac02 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -2116,6 +2116,46 @@ def test_shield_cancel_outer(self): self.assertTrue(outer.cancelled()) self.assertEqual(0, 0 if outer._callbacks is None else len(outer._callbacks)) + def test_shield_cancel_outer_result(self): + mock_handler = mock.Mock() + self.loop.set_exception_handler(mock_handler) + inner = self.new_future(self.loop) + outer = asyncio.shield(inner) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + inner.set_result(1) + test_utils.run_briefly(self.loop) + mock_handler.assert_not_called() + + def test_shield_cancel_outer_exception(self): + mock_handler = mock.Mock() + self.loop.set_exception_handler(mock_handler) + inner = self.new_future(self.loop) + outer = asyncio.shield(inner) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + inner.set_exception(Exception('foo')) + test_utils.run_briefly(self.loop) + mock_handler.assert_called_once() + + def test_shield_duplicate_log_once(self): + mock_handler = mock.Mock() + self.loop.set_exception_handler(mock_handler) + inner = self.new_future(self.loop) + outer = asyncio.shield(inner) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + outer = asyncio.shield(inner) + test_utils.run_briefly(self.loop) + outer.cancel() + test_utils.run_briefly(self.loop) + inner.set_exception(Exception('foo')) + test_utils.run_briefly(self.loop) + mock_handler.assert_called_once() + def test_shield_shortcut(self): fut = self.new_future(self.loop) fut.set_result(42) diff --git a/Misc/NEWS.d/next/Library/2025-05-20-15-13-43.gh-issue-86802.trF7TM.rst b/Misc/NEWS.d/next/Library/2025-05-20-15-13-43.gh-issue-86802.trF7TM.rst new file mode 100644 index 00000000000000..d3117b16f04436 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-20-15-13-43.gh-issue-86802.trF7TM.rst @@ -0,0 +1,3 @@ +Fixed asyncio memory leak in cancelled shield tasks. For shielded tasks +where the shield was cancelled, log potential exceptions through the +exception handler. Contributed by Christian Harries. From 2d90cc8b35d195f5330120ee3d606c5961228cdf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 20:49:29 +0200 Subject: [PATCH 0161/1674] [3.14] gh-106213: Shorten Emscripten wasm-gc trampoline by a little (GH-133984) (#134376) Using the if instruction results in slightly shorter trampoline code. (cherry picked from commit 3b7888bf3d43b903f0a7ebd16f39d8bb61dfbb9e) Co-authored-by: Hood Chatham --- Python/emscripten_trampoline.c | 58 ++++++++++++---------------------- 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/Python/emscripten_trampoline.c b/Python/emscripten_trampoline.c index a7bb685bf3dc6d..cc5047d6bda224 100644 --- a/Python/emscripten_trampoline.c +++ b/Python/emscripten_trampoline.c @@ -35,7 +35,7 @@ EM_JS(CountArgsFunc, _PyEM_GetCountArgsPtr, (), { // (type $type1 (func (param i32) (result i32))) // (type $type2 (func (param i32 i32) (result i32))) // (type $type3 (func (param i32 i32 i32) (result i32))) -// (type $blocktype (func (param i32) (result))) +// (type $blocktype (func (param) (result))) // (table $funcs (import "e" "t") 0 funcref) // (export "f" (func $f)) // (func $f (param $fptr i32) (result i32) @@ -44,36 +44,28 @@ EM_JS(CountArgsFunc, _PyEM_GetCountArgsPtr, (), { // table.get $funcs // local.tee $fref // ref.test $type3 -// (block $b (type $blocktype) -// i32.eqz -// br_if $b +// if $blocktype // i32.const 3 // return -// ) +// end // local.get $fref // ref.test $type2 -// (block $b (type $blocktype) -// i32.eqz -// br_if $b +// if $blocktype // i32.const 2 // return -// ) +// end // local.get $fref // ref.test $type1 -// (block $b (type $blocktype) -// i32.eqz -// br_if $b +// if $blocktype // i32.const 1 // return -// ) +// end // local.get $fref // ref.test $type0 -// (block $b (type $blocktype) -// i32.eqz -// br_if $b +// if $blocktype // i32.const 0 // return -// ) +// end // i32.const -1 // ) // ) @@ -88,13 +80,13 @@ function getPyEMCountArgsPtr() { const code = new Uint8Array([ 0x00, 0x61, 0x73, 0x6d, // \0asm magic number 0x01, 0x00, 0x00, 0x00, // version 1 - 0x01, 0x1b, // Type section, body is 0x1b bytes + 0x01, 0x1a, // Type section, body is 0x1a bytes 0x05, // 6 entries - 0x60, 0x00, 0x01, 0x7f, // (type $type0 (func (param) (result i32))) - 0x60, 0x01, 0x7f, 0x01, 0x7f, // (type $type1 (func (param i32) (result i32))) - 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, // (type $type2 (func (param i32 i32) (result i32))) - 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, // (type $type3 (func (param i32 i32 i32) (result i32))) - 0x60, 0x01, 0x7f, 0x00, // (type $blocktype (func (param i32) (result))) + 0x60, 0x00, 0x01, 0x7f, // (type $type0 (func (param) (result i32))) + 0x60, 0x01, 0x7f, 0x01, 0x7f, // (type $type1 (func (param i32) (result i32))) + 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, // (type $type2 (func (param i32 i32) (result i32))) + 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, // (type $type3 (func (param i32 i32 i32) (result i32))) + 0x60, 0x00, 0x00, // (type $blocktype (func (param) (result))) 0x02, 0x09, // Import section, 0x9 byte body 0x01, // 1 import (table $funcs (import "e" "t") 0 funcref) 0x01, 0x65, // "e" @@ -110,44 +102,36 @@ function getPyEMCountArgsPtr() { 0x00, // a function 0x00, // at index 0 - 0x0a, 0x44, // Code section, - 0x01, 0x42, // one entry of length 50 + 0x0a, 56, // Code section, + 0x01, 54, // one entry of length 54 0x01, 0x01, 0x70, // one local of type funcref // Body of the function 0x20, 0x00, // local.get $fptr 0x25, 0x00, // table.get $funcs 0x22, 0x01, // local.tee $fref 0xfb, 0x14, 0x03, // ref.test $type3 - 0x02, 0x04, // block $b (type $blocktype) - 0x45, // i32.eqz - 0x0d, 0x00, // br_if $b + 0x04, 0x04, // if (type $blocktype) 0x41, 0x03, // i32.const 3 0x0f, // return 0x0b, // end block 0x20, 0x01, // local.get $fref 0xfb, 0x14, 0x02, // ref.test $type2 - 0x02, 0x04, // block $b (type $blocktype) - 0x45, // i32.eqz - 0x0d, 0x00, // br_if $b + 0x04, 0x04, // if (type $blocktype) 0x41, 0x02, // i32.const 2 0x0f, // return 0x0b, // end block 0x20, 0x01, // local.get $fref 0xfb, 0x14, 0x01, // ref.test $type1 - 0x02, 0x04, // block $b (type $blocktype) - 0x45, // i32.eqz - 0x0d, 0x00, // br_if $b + 0x04, 0x04, // if (type $blocktype) 0x41, 0x01, // i32.const 1 0x0f, // return 0x0b, // end block 0x20, 0x01, // local.get $fref 0xfb, 0x14, 0x00, // ref.test $type0 - 0x02, 0x04, // block $b (type $blocktype) - 0x45, // i32.eqz - 0x0d, 0x00, // br_if $b + 0x04, 0x04, // if (type $blocktype) 0x41, 0x00, // i32.const 0 0x0f, // return 0x0b, // end block From a2950d50ccd1e12f4e26f888ef66392dad886606 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 20:59:00 +0200 Subject: [PATCH 0162/1674] [3.14] gh-131357: Add tests for zero-sized bytes objects in test_bytes.py (GH-134234) (#134378) gh-131357: Add tests for zero-sized bytes objects in test_bytes.py (GH-134234) (cherry picked from commit 306f9e04e50c80f7be2a38fc3b64accf59f5164c) Co-authored-by: abstractedfox Co-authored-by: Victor Stinner --- Lib/test/test_capi/test_bytes.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_capi/test_bytes.py b/Lib/test/test_capi/test_bytes.py index 5b61c73381542d..86d5692893fc98 100644 --- a/Lib/test/test_capi/test_bytes.py +++ b/Lib/test/test_capi/test_bytes.py @@ -22,6 +22,7 @@ def test_check(self): # Test PyBytes_Check() check = _testlimitedcapi.bytes_check self.assertTrue(check(b'abc')) + self.assertTrue(check(b'')) self.assertFalse(check('abc')) self.assertFalse(check(bytearray(b'abc'))) self.assertTrue(check(BytesSubclass(b'abc'))) @@ -36,6 +37,7 @@ def test_checkexact(self): # Test PyBytes_CheckExact() check = _testlimitedcapi.bytes_checkexact self.assertTrue(check(b'abc')) + self.assertTrue(check(b'')) self.assertFalse(check('abc')) self.assertFalse(check(bytearray(b'abc'))) self.assertFalse(check(BytesSubclass(b'abc'))) @@ -108,6 +110,7 @@ def test_asstring(self): self.assertEqual(asstring(b'abc', 4), b'abc\0') self.assertEqual(asstring(b'abc\0def', 8), b'abc\0def\0') + self.assertEqual(asstring(b'', 1), b'\0') self.assertRaises(TypeError, asstring, 'abc', 0) self.assertRaises(TypeError, asstring, object(), 0) @@ -120,6 +123,7 @@ def test_asstringandsize(self): self.assertEqual(asstringandsize(b'abc', 4), (b'abc\0', 3)) self.assertEqual(asstringandsize(b'abc\0def', 8), (b'abc\0def\0', 7)) + self.assertEqual(asstringandsize(b'', 1), (b'\0', 0)) self.assertEqual(asstringandsize_null(b'abc', 4), b'abc\0') self.assertRaises(ValueError, asstringandsize_null, b'abc\0def', 8) self.assertRaises(TypeError, asstringandsize, 'abc', 0) @@ -163,6 +167,7 @@ def test_concat(self, concat=None): self.assertEqual(concat(b'', bytearray(b'def')), b'def') self.assertEqual(concat(memoryview(b'xabcy')[1:4], b'def'), b'abcdef') self.assertEqual(concat(b'abc', memoryview(b'xdefy')[1:4]), b'abcdef') + self.assertEqual(concat(b'', b''), b'') self.assertEqual(concat(b'abc', b'def', True), b'abcdef') self.assertEqual(concat(b'abc', bytearray(b'def'), True), b'abcdef') From 6f1f8714839aaeadfbe646373e9f1bbf15875155 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 21:07:08 +0200 Subject: [PATCH 0163/1674] [3.14] gh-127146: xfail more Emscripten stack overflows (GH-134358) (#134382) Adds some additional test xfails for Emscripten stack overflows. Also corrects a test skip for test_io. (cherry picked from commit 91e6a58e2d6fd23e886135457e28dfa980ec49ed) Co-authored-by: Hood Chatham --- Lib/test/test_builtin.py | 1 + Lib/test/test_capi/test_misc.py | 2 ++ Lib/test/test_descr.py | 1 + Lib/test/test_exceptions.py | 1 + Lib/test/test_io.py | 2 +- 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 31597a320d418a..f1f877c47a1e7a 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1120,6 +1120,7 @@ def test_filter_pickle(self): self.check_iter_pickle(f1, list(f2), proto) @support.skip_wasi_stack_overflow() + @support.skip_emscripten_stack_overflow() @support.requires_resource('cpu') def test_filter_dealloc(self): # Tests recursive deallocation of nested filter objects using the diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index a597f23a992e7b..f74694a7a745a4 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -412,10 +412,12 @@ def test_trashcan_subclass(self): L = MyList((L,)) @support.requires_resource('cpu') + @support.skip_emscripten_stack_overflow() def test_trashcan_python_class1(self): self.do_test_trashcan_python_class(list) @support.requires_resource('cpu') + @support.skip_emscripten_stack_overflow() def test_trashcan_python_class2(self): from _testcapi import MyList self.do_test_trashcan_python_class(MyList) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 76937432a43037..14026531e22333 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4523,6 +4523,7 @@ class Oops(object): del o @support.skip_wasi_stack_overflow() + @support.skip_emscripten_stack_overflow() @support.requires_resource('cpu') def test_wrapper_segfault(self): # SF 927248: deeply nested wrappers could cause stack overflow diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index d177e3dc0f5007..cfd4a3e87695f5 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1429,6 +1429,7 @@ def g(): self.assertIn("maximum recursion depth exceeded", str(exc)) @support.skip_wasi_stack_overflow() + @support.skip_emscripten_stack_overflow() @cpython_only @support.requires_resource('cpu') def test_trashcan_recursion(self): diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 5a8f1949baaa98..90680c6d47ab41 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -572,7 +572,7 @@ def do_test(test, obj, abilities): for [test, abilities] in tests: with self.subTest(test): if test == pipe_writer and not threading_helper.can_start_thread: - skipTest() + self.skipTest("Need threads") with test() as obj: do_test(test, obj, abilities) From 899ce7d390d5e37088a841cdcefd142013355e4c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 21:28:03 +0200 Subject: [PATCH 0164/1674] [3.14] gh-85045: clarified that the underlying buffer of a TextIOBase can be a RawIOBase (GH-134372) (#134374) gh-85045: clarified that the underlying buffer of a TextIOBase can be a RawIOBase (GH-134372) Added a clarification that the underlying binary buffer of a TextIOBase can be a BufferedIOBase OR a RawIOBase (cherry picked from commit 36eb711d2f26849214774a017fe8c8a5be3eec30) Co-authored-by: Alex Kautz --- Doc/library/io.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 3aa2f35f05eba0..08c76da3d8c00a 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -894,9 +894,10 @@ Text I/O .. attribute:: buffer - The underlying binary buffer (a :class:`BufferedIOBase` instance) that - :class:`TextIOBase` deals with. This is not part of the - :class:`TextIOBase` API and may not exist in some implementations. + The underlying binary buffer (a :class:`BufferedIOBase` + or :class:`RawIOBase` instance) that :class:`TextIOBase` deals with. + This is not part of the :class:`TextIOBase` API and may not exist + in some implementations. .. method:: detach() From 379805d03c7e2b3a19484c8247fad8da86b5a157 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 22:15:23 +0200 Subject: [PATCH 0165/1674] [3.14] gh-128066: Properly handle history file writes for RO fs on PyREPL (gh-134380) (gh-134385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c91ad5da9d92eac4718e4da8d53689c3cc24535e) Co-authored-by: Chris Patti Co-authored-by: Łukasz Langa --- Lib/_pyrepl/simple_interact.py | 2 ++ Lib/site.py | 8 +++++++- .../2025-05-20-14-41-50.gh-issue-128066.qzzGfv.rst | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-20-14-41-50.gh-issue-128066.qzzGfv.rst diff --git a/Lib/_pyrepl/simple_interact.py b/Lib/_pyrepl/simple_interact.py index c23894a34b8b53..965b853c34b392 100644 --- a/Lib/_pyrepl/simple_interact.py +++ b/Lib/_pyrepl/simple_interact.py @@ -31,6 +31,7 @@ import sys import code import warnings +import errno from .readline import _get_reader, multiline_input, append_history_file @@ -153,6 +154,7 @@ def maybe_run_command(statement: str) -> bool: append_history_file() except (FileNotFoundError, PermissionError, OSError) as e: warnings.warn(f"failed to open the history file for writing: {e}") + input_n += 1 except KeyboardInterrupt: r = _get_reader() diff --git a/Lib/site.py b/Lib/site.py index 5c38b1b17d5abd..f93271971594d8 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -75,6 +75,7 @@ import _sitebuiltins import _io as io import stat +import errno # Prefixes for site-packages; add additional prefixes like /usr/local here PREFIXES = [sys.prefix, sys.exec_prefix] @@ -578,10 +579,15 @@ def register_readline(): def write_history(): try: readline_module.write_history_file(history) - except (FileNotFoundError, PermissionError): + except FileNotFoundError, PermissionError: # home directory does not exist or is not writable # https://bugs.python.org/issue19891 pass + except OSError: + if errno.EROFS: + pass # gh-128066: read-only file system + else: + raise atexit.register(write_history) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-20-14-41-50.gh-issue-128066.qzzGfv.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-20-14-41-50.gh-issue-128066.qzzGfv.rst new file mode 100644 index 00000000000000..f78190276851b4 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-20-14-41-50.gh-issue-128066.qzzGfv.rst @@ -0,0 +1,3 @@ +Fixes an edge case where PyREPL improperly threw an error when Python is +invoked on a read only filesystem while trying to write history file +entries. From 04829d4d87659da7f2239cbe15000824bfb9c2d3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 23:01:45 +0200 Subject: [PATCH 0166/1674] [3.14] gh-134209: use heap-allocated memory in `_curses.window.{instr,getstr}` (GH-134283) (#134391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-134209: use heap-allocated memory in `_curses.window.{instr,getstr}` (GH-134283) * made curses buffer heap allocated instead of stack * change docs to explicitly mention the max buffer size * changing GetStr() function to behave similarly too * Update Doc/library/curses.rst * Update instr with proper return error handling * Update Modules/_cursesmodule.c * change to strlen and better memory safety * change from const int to Py_ssize_t * add mem allocation guard * update versionchanged to mention it was an increase. * explicitly use versionchanged 3.14 as that is its own branch now. TESTED: `python -m test -u curses test_curses` --------- (cherry picked from commit aadda87b3d3d99cb9e8c8791bb9715a3f0209195) Co-authored-by: tigerding <43339228+zydtiger@users.noreply.github.com> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Gregory P. Smith Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/curses.rst | 8 ++ ...-05-19-20-59-06.gh-issue-134209.anhTcF.rst | 3 + Modules/_cursesmodule.c | 102 ++++++++++++------ 3 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-19-20-59-06.gh-issue-134209.anhTcF.rst diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index 137504c51b4358..5ec23b61396773 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -988,6 +988,10 @@ the following methods and attributes: window.getstr(y, x, n) Read a bytes object from the user, with primitive line editing capacity. + The maximum value for *n* is 2047. + + .. versionchanged:: 3.14 + The maximum value for *n* was increased from 1023 to 2047. .. method:: window.getyx() @@ -1079,6 +1083,10 @@ the following methods and attributes: current cursor position, or at *y*, *x* if specified. Attributes are stripped from the characters. If *n* is specified, :meth:`instr` returns a string at most *n* characters long (exclusive of the trailing NUL). + The maximum value for *n* is 2047. + + .. versionchanged:: 3.14 + The maximum value for *n* was increased from 1023 to 2047. .. method:: window.is_linetouched(line) diff --git a/Misc/NEWS.d/next/Library/2025-05-19-20-59-06.gh-issue-134209.anhTcF.rst b/Misc/NEWS.d/next/Library/2025-05-19-20-59-06.gh-issue-134209.anhTcF.rst new file mode 100644 index 00000000000000..f985872f3c975e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-19-20-59-06.gh-issue-134209.anhTcF.rst @@ -0,0 +1,3 @@ +:mod:`curses`: The :meth:`curses.window.instr` and :meth:`curses.window.getstr` +methods now allocate their internal buffer on the heap instead of the stack; +in addition, the max buffer size is increased from 1023 to 2047. diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index cd185bc2b02ea5..f6e366ef7dec8b 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1687,7 +1687,7 @@ _curses.window.getstr x: int X-coordinate. ] - n: int = 1023 + n: int = 2047 Maximal number of characters. / @@ -1700,62 +1700,80 @@ PyCursesWindow_GetStr(PyObject *op, PyObject *args) PyCursesWindowObject *self = _PyCursesWindowObject_CAST(op); int x, y, n; - char rtn[1024]; /* This should be big enough.. I hope */ - int rtn2; + int rtn; + + /* could make the buffer size larger/dynamic */ + Py_ssize_t max_buf_size = 2048; + PyObject *result = PyBytes_FromStringAndSize(NULL, max_buf_size); + if (result == NULL) + return NULL; + char *buf = PyBytes_AS_STRING(result); switch (PyTuple_Size(args)) { case 0: Py_BEGIN_ALLOW_THREADS - rtn2 = wgetnstr(self->win,rtn, 1023); + rtn = wgetnstr(self->win, buf, max_buf_size - 1); Py_END_ALLOW_THREADS break; case 1: if (!PyArg_ParseTuple(args,"i;n", &n)) - return NULL; + goto error; if (n < 0) { PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - return NULL; + goto error; } Py_BEGIN_ALLOW_THREADS - rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023)); + rtn = wgetnstr(self->win, buf, Py_MIN(n, max_buf_size - 1)); Py_END_ALLOW_THREADS break; case 2: if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x)) - return NULL; + goto error; Py_BEGIN_ALLOW_THREADS #ifdef STRICT_SYSV_CURSES - rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023); + rtn = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, max_buf_size - 1); #else - rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023); + rtn = mvwgetnstr(self->win,y,x,buf, max_buf_size - 1); #endif Py_END_ALLOW_THREADS break; case 3: if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n)) - return NULL; + goto error; if (n < 0) { PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - return NULL; + goto error; } #ifdef STRICT_SYSV_CURSES Py_BEGIN_ALLOW_THREADS - rtn2 = wmove(self->win,y,x)==ERR ? ERR : - wgetnstr(self->win, rtn, Py_MIN(n, 1023)); + rtn = wmove(self->win,y,x)==ERR ? ERR : + wgetnstr(self->win, rtn, Py_MIN(n, max_buf_size - 1)); Py_END_ALLOW_THREADS #else Py_BEGIN_ALLOW_THREADS - rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023)); + rtn = mvwgetnstr(self->win, y, x, buf, Py_MIN(n, max_buf_size - 1)); Py_END_ALLOW_THREADS #endif break; default: PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments"); + goto error; + } + + if (rtn == ERR) { + Py_DECREF(result); + return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES); + } + + if (_PyBytes_Resize(&result, strlen(buf)) < 0) { return NULL; } - if (rtn2 == ERR) - rtn[0] = 0; - return PyBytes_FromString(rtn); + + return result; + +error: + Py_DECREF(result); + return NULL; } /*[clinic input] @@ -1889,7 +1907,7 @@ _curses.window.instr x: int X-coordinate. ] - n: int = 1023 + n: int = 2047 Maximal number of characters. / @@ -1906,43 +1924,61 @@ PyCursesWindow_InStr(PyObject *op, PyObject *args) PyCursesWindowObject *self = _PyCursesWindowObject_CAST(op); int x, y, n; - char rtn[1024]; /* This should be big enough.. I hope */ - int rtn2; + int rtn; + + /* could make the buffer size larger/dynamic */ + Py_ssize_t max_buf_size = 2048; + PyObject *result = PyBytes_FromStringAndSize(NULL, max_buf_size); + if (result == NULL) + return NULL; + char *buf = PyBytes_AS_STRING(result); switch (PyTuple_Size(args)) { case 0: - rtn2 = winnstr(self->win,rtn, 1023); + rtn = winnstr(self->win, buf, max_buf_size - 1); break; case 1: if (!PyArg_ParseTuple(args,"i;n", &n)) - return NULL; + goto error; if (n < 0) { PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - return NULL; + goto error; } - rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023)); + rtn = winnstr(self->win, buf, Py_MIN(n, max_buf_size - 1)); break; case 2: if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x)) - return NULL; - rtn2 = mvwinnstr(self->win,y,x,rtn,1023); + goto error; + rtn = mvwinnstr(self->win, y, x, buf, max_buf_size - 1); break; case 3: if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n)) - return NULL; + goto error; if (n < 0) { PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - return NULL; + goto error; } - rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023)); + rtn = mvwinnstr(self->win, y, x, buf, Py_MIN(n, max_buf_size - 1)); break; default: PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments"); + goto error; + } + + if (rtn == ERR) { + Py_DECREF(result); + return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES); + } + + if (_PyBytes_Resize(&result, strlen(buf)) < 0) { return NULL; } - if (rtn2 == ERR) - rtn[0] = 0; - return PyBytes_FromString(rtn); + + return result; + +error: + Py_DECREF(result); + return NULL; } /*[clinic input] From 69710b708705f9b774a5955f0ff9ad6c1e74d32e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 23:12:02 +0200 Subject: [PATCH 0167/1674] [3.14] gh-134215: PyREPL: Do not show underscored modules by default during autocompletion (gh-134267) (gh-134388) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit a3a3cf6d157948ed64ae837d6310b933a39a2493) Co-authored-by: Kevin Hernández Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Tomas R. Co-authored-by: Łukasz Langa --- Lib/_pyrepl/_module_completer.py | 15 +++++-- Lib/test/test_pyrepl/test_pyrepl.py | 45 ++++++++++++++++++- Misc/ACKS | 1 + ...-05-19-14-57-46.gh-issue-134215.sbdDK6.rst | 1 + 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-05-19-14-57-46.gh-issue-134215.sbdDK6.rst diff --git a/Lib/_pyrepl/_module_completer.py b/Lib/_pyrepl/_module_completer.py index 0606797226d1e0..9aafb55090e2ce 100644 --- a/Lib/_pyrepl/_module_completer.py +++ b/Lib/_pyrepl/_module_completer.py @@ -81,8 +81,10 @@ def find_modules(self, path: str, prefix: str) -> list[str]: def _find_modules(self, path: str, prefix: str) -> list[str]: if not path: # Top-level import (e.g. `import foo`` or `from foo`)` - builtin_modules = [name for name in sys.builtin_module_names if name.startswith(prefix)] - third_party_modules = [name for _, name, _ in self.global_cache if name.startswith(prefix)] + builtin_modules = [name for name in sys.builtin_module_names + if self.is_suggestion_match(name, prefix)] + third_party_modules = [module.name for module in self.global_cache + if self.is_suggestion_match(module.name, prefix)] return sorted(builtin_modules + third_party_modules) if path.startswith('.'): @@ -98,7 +100,14 @@ def _find_modules(self, path: str, prefix: str) -> list[str]: if mod_info.ispkg and mod_info.name == segment] modules = self.iter_submodules(modules) return [module.name for module in modules - if module.name.startswith(prefix)] + if self.is_suggestion_match(module.name, prefix)] + + def is_suggestion_match(self, module_name: str, prefix: str) -> bool: + if prefix: + return module_name.startswith(prefix) + # For consistency with attribute completion, which + # does not suggest private attributes unless requested. + return not module_name.startswith("_") def iter_submodules(self, parent_modules: list[pkgutil.ModuleInfo]) -> Iterator[pkgutil.ModuleInfo]: """Iterate over all submodules of the given parent modules.""" diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 59f5d1f893f9fd..29762232d43b89 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -8,6 +8,7 @@ import subprocess import sys import tempfile +from pkgutil import ModuleInfo from unittest import TestCase, skipUnless, skipIf from unittest.mock import patch from test.support import force_not_colorized, make_clean_env, Py_DEBUG @@ -959,6 +960,46 @@ def test_import_completions(self): output = reader.readline() self.assertEqual(output, expected) + @patch("pkgutil.iter_modules", lambda: [ModuleInfo(None, "public", True), + ModuleInfo(None, "_private", True)]) + @patch("sys.builtin_module_names", ()) + def test_private_completions(self): + cases = ( + # Return public methods by default + ("import \t\n", "import public"), + ("from \t\n", "from public"), + # Return private methods if explicitly specified + ("import _\t\n", "import _private"), + ("from _\t\n", "from _private"), + ) + for code, expected in cases: + with self.subTest(code=code): + events = code_to_events(code) + reader = self.prepare_reader(events, namespace={}) + output = reader.readline() + self.assertEqual(output, expected) + + @patch( + "_pyrepl._module_completer.ModuleCompleter.iter_submodules", + lambda *_: [ + ModuleInfo(None, "public", True), + ModuleInfo(None, "_private", True), + ], + ) + def test_sub_module_private_completions(self): + cases = ( + # Return public methods by default + ("from foo import \t\n", "from foo import public"), + # Return private methods if explicitly specified + ("from foo import _\t\n", "from foo import _private"), + ) + for code, expected in cases: + with self.subTest(code=code): + events = code_to_events(code) + reader = self.prepare_reader(events, namespace={}) + output = reader.readline() + self.assertEqual(output, expected) + def test_builtin_completion_top_level(self): import importlib # Make iter_modules() search only the standard library. @@ -991,8 +1032,8 @@ def test_relative_import_completions(self): output = reader.readline() self.assertEqual(output, expected) - @patch("pkgutil.iter_modules", lambda: [(None, 'valid_name', None), - (None, 'invalid-name', None)]) + @patch("pkgutil.iter_modules", lambda: [ModuleInfo(None, "valid_name", True), + ModuleInfo(None, "invalid-name", True)]) def test_invalid_identifiers(self): # Make sure modules which are not valid identifiers # are not suggested as those cannot be imported via 'import'. diff --git a/Misc/ACKS b/Misc/ACKS index 610dcf9f4238de..2b5748ceb6ad26 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -763,6 +763,7 @@ Chris Herborth Ivan Herman Jürgen Hermann Joshua Jay Herman +Kevin Hernandez Gary Herron Ernie Hershey Thomas Herve diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-05-19-14-57-46.gh-issue-134215.sbdDK6.rst b/Misc/NEWS.d/next/Tools-Demos/2025-05-19-14-57-46.gh-issue-134215.sbdDK6.rst new file mode 100644 index 00000000000000..546ed2a56b6695 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-05-19-14-57-46.gh-issue-134215.sbdDK6.rst @@ -0,0 +1 @@ +:term:`REPL` import autocomplete only suggests private modules when explicitly specified. From 81c348b6dadc6b4f035b80e508dd0ec583e54d2f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 May 2025 23:47:12 +0200 Subject: [PATCH 0168/1674] GH-130727: Avoid race condition in _wmimodule by copying shared data (GH-134313) (cherry picked from commit e4fbfb12889013fd52565cd2598a366754cb677b) Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> --- ...-05-20-21-43-20.gh-issue-130727.-69t4D.rst | 2 ++ PC/_wmimodule.cpp | 22 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2025-05-20-21-43-20.gh-issue-130727.-69t4D.rst diff --git a/Misc/NEWS.d/next/Windows/2025-05-20-21-43-20.gh-issue-130727.-69t4D.rst b/Misc/NEWS.d/next/Windows/2025-05-20-21-43-20.gh-issue-130727.-69t4D.rst new file mode 100644 index 00000000000000..dc10b3e62c8d4a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2025-05-20-21-43-20.gh-issue-130727.-69t4D.rst @@ -0,0 +1,2 @@ +Fix a race in internal calls into WMI that can result in an "invalid handle" +exception under high load. Patch by Chris Eibl. diff --git a/PC/_wmimodule.cpp b/PC/_wmimodule.cpp index b6efb3e4a207b4..30d61c86587fbe 100644 --- a/PC/_wmimodule.cpp +++ b/PC/_wmimodule.cpp @@ -57,11 +57,11 @@ _query_thread(LPVOID param) IEnumWbemClassObject* enumerator = NULL; HRESULT hr = S_OK; BSTR bstrQuery = NULL; - struct _query_data *data = (struct _query_data*)param; + _query_data data = *(struct _query_data*)param; // gh-125315: Copy the query string first, so that if the main thread gives // up on waiting we aren't left with a dangling pointer (and a likely crash) - bstrQuery = SysAllocString(data->query); + bstrQuery = SysAllocString(data.query); if (!bstrQuery) { hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); } @@ -71,7 +71,7 @@ _query_thread(LPVOID param) } if (FAILED(hr)) { - CloseHandle(data->writePipe); + CloseHandle(data.writePipe); if (bstrQuery) { SysFreeString(bstrQuery); } @@ -96,7 +96,7 @@ _query_thread(LPVOID param) IID_IWbemLocator, (LPVOID *)&locator ); } - if (SUCCEEDED(hr) && !SetEvent(data->initEvent)) { + if (SUCCEEDED(hr) && !SetEvent(data.initEvent)) { hr = HRESULT_FROM_WIN32(GetLastError()); } if (SUCCEEDED(hr)) { @@ -105,7 +105,7 @@ _query_thread(LPVOID param) NULL, NULL, 0, NULL, 0, 0, &services ); } - if (SUCCEEDED(hr) && !SetEvent(data->connectEvent)) { + if (SUCCEEDED(hr) && !SetEvent(data.connectEvent)) { hr = HRESULT_FROM_WIN32(GetLastError()); } if (SUCCEEDED(hr)) { @@ -143,7 +143,7 @@ _query_thread(LPVOID param) if (FAILED(hr) || got != 1 || !value) { continue; } - if (!startOfEnum && !WriteFile(data->writePipe, (LPVOID)L"\0", 2, &written, NULL)) { + if (!startOfEnum && !WriteFile(data.writePipe, (LPVOID)L"\0", 2, &written, NULL)) { hr = HRESULT_FROM_WIN32(GetLastError()); break; } @@ -171,10 +171,10 @@ _query_thread(LPVOID param) DWORD cbStr1, cbStr2; cbStr1 = (DWORD)(wcslen(propName) * sizeof(propName[0])); cbStr2 = (DWORD)(wcslen(propStr) * sizeof(propStr[0])); - if (!WriteFile(data->writePipe, propName, cbStr1, &written, NULL) || - !WriteFile(data->writePipe, (LPVOID)L"=", 2, &written, NULL) || - !WriteFile(data->writePipe, propStr, cbStr2, &written, NULL) || - !WriteFile(data->writePipe, (LPVOID)L"\0", 2, &written, NULL) + if (!WriteFile(data.writePipe, propName, cbStr1, &written, NULL) || + !WriteFile(data.writePipe, (LPVOID)L"=", 2, &written, NULL) || + !WriteFile(data.writePipe, propStr, cbStr2, &written, NULL) || + !WriteFile(data.writePipe, (LPVOID)L"\0", 2, &written, NULL) ) { hr = HRESULT_FROM_WIN32(GetLastError()); } @@ -200,7 +200,7 @@ _query_thread(LPVOID param) locator->Release(); } CoUninitialize(); - CloseHandle(data->writePipe); + CloseHandle(data.writePipe); return (DWORD)hr; } From e379a71811d370731f4dc814e5628d14952713d5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 02:20:53 +0200 Subject: [PATCH 0169/1674] [3.14] gh-91048: Fix error path result in _remote_debugging_module (GH-134347) (#134399) --- Modules/_remote_debugging_module.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index 9314ddd9bed5d7..f9f77a0814b4ce 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -1556,7 +1556,7 @@ get_stack_trace(PyObject* self, PyObject* args) &address_of_current_frame) < 0) { - Py_DECREF(result); + Py_CLEAR(result); goto result_err; } @@ -1565,7 +1565,7 @@ get_stack_trace(PyObject* self, PyObject* args) } if (PyList_Append(result, frame_info) == -1) { - Py_DECREF(result); + Py_CLEAR(result); goto result_err; } From af428a3894745652d48ad0d62c74ba8d2f5b451a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 03:58:48 +0200 Subject: [PATCH 0170/1674] [3.14] gh-72680: Fix false positives when using zipfile.is_zipfile() (GH-134250) (#134401) gh-72680: Fix false positives when using zipfile.is_zipfile() (GH-134250) bpo-28494: Improve zipfile.is_zipfile reliability The zipfile.is_zipfile function would only search for the EndOfZipfile section header. This failed to correctly identify non-zipfiles that contained this header. Now the zipfile.is_zipfile function verifies the first central directory entry. Changes: * Extended zipfile.is_zipfile to verify zipfile catalog * Added tests to validate failure of binary non-zipfiles * Reuse 'concat' handling for is_zipfile (cherry picked from commit 1298511b41ec0f9be925c12f3830e94fe8f7e7dc) Co-authored-by: Tim Hatch Co-authored-by: John Jolly --- Lib/test/test_zipfile/test_core.py | 19 ++++++++ Lib/zipfile/__init__.py | 48 +++++++++++++------ .../2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst | 1 + 3 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index 43056978848c03..e93603998f979e 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -1991,6 +1991,25 @@ def test_is_zip_erroneous_file(self): self.assertFalse(zipfile.is_zipfile(fp)) fp.seek(0, 0) self.assertFalse(zipfile.is_zipfile(fp)) + # - passing non-zipfile with ZIP header elements + # data created using pyPNG like so: + # d = [(ord('P'), ord('K'), 5, 6), (ord('P'), ord('K'), 6, 6)] + # w = png.Writer(1,2,alpha=True,compression=0) + # f = open('onepix.png', 'wb') + # w.write(f, d) + # w.close() + data = (b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00" + b"\x00\x02\x08\x06\x00\x00\x00\x99\x81\xb6'\x00\x00\x00\x15I" + b"DATx\x01\x01\n\x00\xf5\xff\x00PK\x05\x06\x00PK\x06\x06\x07" + b"\xac\x01N\xc6|a\r\x00\x00\x00\x00IEND\xaeB`\x82") + # - passing a filename + with open(TESTFN, "wb") as fp: + fp.write(data) + self.assertFalse(zipfile.is_zipfile(TESTFN)) + # - passing a file-like object + fp = io.BytesIO() + fp.write(data) + self.assertFalse(zipfile.is_zipfile(fp)) def test_damaged_zipfile(self): """Check that zipfiles with missing bytes at the end raise BadZipFile.""" diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py index 894b4d37233923..18caeb3e04a2b5 100644 --- a/Lib/zipfile/__init__.py +++ b/Lib/zipfile/__init__.py @@ -234,8 +234,19 @@ def strip(cls, data, xids): def _check_zipfile(fp): try: - if _EndRecData(fp): - return True # file has correct magic number + endrec = _EndRecData(fp) + if endrec: + if endrec[_ECD_ENTRIES_TOTAL] == 0 and endrec[_ECD_SIZE] == 0 and endrec[_ECD_OFFSET] == 0: + return True # Empty zipfiles are still zipfiles + elif endrec[_ECD_DISK_NUMBER] == endrec[_ECD_DISK_START]: + # Central directory is on the same disk + fp.seek(sum(_handle_prepended_data(endrec))) + if endrec[_ECD_SIZE] >= sizeCentralDir: + data = fp.read(sizeCentralDir) # CD is where we expect it to be + if len(data) == sizeCentralDir: + centdir = struct.unpack(structCentralDir, data) # CD is the right size + if centdir[_CD_SIGNATURE] == stringCentralDir: + return True # First central directory entry has correct magic number except OSError: pass return False @@ -258,6 +269,22 @@ def is_zipfile(filename): pass return result +def _handle_prepended_data(endrec, debug=0): + size_cd = endrec[_ECD_SIZE] # bytes in central directory + offset_cd = endrec[_ECD_OFFSET] # offset of central directory + + # "concat" is zero, unless zip was concatenated to another file + concat = endrec[_ECD_LOCATION] - size_cd - offset_cd + if endrec[_ECD_SIGNATURE] == stringEndArchive64: + # If Zip64 extension structures are present, account for them + concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator) + + if debug > 2: + inferred = concat + offset_cd + print("given, inferred, offset", offset_cd, inferred, concat) + + return offset_cd, concat + def _EndRecData64(fpin, offset, endrec): """ Read the ZIP64 end-of-archive records and use that to update endrec @@ -1501,28 +1528,21 @@ def _RealGetContents(self): raise BadZipFile("File is not a zip file") if self.debug > 1: print(endrec) - size_cd = endrec[_ECD_SIZE] # bytes in central directory - offset_cd = endrec[_ECD_OFFSET] # offset of central directory self._comment = endrec[_ECD_COMMENT] # archive comment - # "concat" is zero, unless zip was concatenated to another file - concat = endrec[_ECD_LOCATION] - size_cd - offset_cd - if endrec[_ECD_SIGNATURE] == stringEndArchive64: - # If Zip64 extension structures are present, account for them - concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator) + offset_cd, concat = _handle_prepended_data(endrec, self.debug) + + # self.start_dir: Position of start of central directory + self.start_dir = offset_cd + concat # store the offset to the beginning of data for the # .data_offset property self._data_offset = concat - if self.debug > 2: - inferred = concat + offset_cd - print("given, inferred, offset", offset_cd, inferred, concat) - # self.start_dir: Position of start of central directory - self.start_dir = offset_cd + concat if self.start_dir < 0: raise BadZipFile("Bad offset for central directory") fp.seek(self.start_dir, 0) + size_cd = endrec[_ECD_SIZE] data = fp.read(size_cd) fp = io.BytesIO(data) total = 0 diff --git a/Misc/NEWS.d/next/Library/2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst b/Misc/NEWS.d/next/Library/2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst new file mode 100644 index 00000000000000..0c518983770d5d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst @@ -0,0 +1 @@ +Improve Zip file validation false positive rate in :func:`zipfile.is_zipfile`. From 64047f7e926b8be8f75cf0b980808ad5bec5e931 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 07:16:56 +0200 Subject: [PATCH 0171/1674] [3.14] gh-134360 Add processName attribute to `logging.Formatter` docstring (GH-134371) (GH-134405) Co-authored-by: Sofia Toro --- Lib/logging/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 283a1055182b63..357d127c090482 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -591,6 +591,7 @@ class Formatter(object): %(threadName)s Thread name (if available) %(taskName)s Task name (if available) %(process)d Process ID (if available) + %(processName)s Process name (if available) %(message)s The result of record.getMessage(), computed just as the record is emitted """ From b0bf48a13482e121c955f341fc011e30e3e1afe4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 11:29:42 +0200 Subject: [PATCH 0172/1674] [3.14] Add documentation for remote debugging with pdb (GH-134260) (#134398) --- Doc/library/pdb.rst | 20 +++++++++++++++++++- Lib/pdb.py | 3 ++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index a0304edddf6478..f4b51664545be5 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -80,7 +80,7 @@ The debugger's prompt is ``(Pdb)``, which is the indicator that you are in debug You can also invoke :mod:`pdb` from the command line to debug other scripts. For example:: - python -m pdb [-c command] (-m module | pyfile) [args ...] + python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...] When invoked as a module, pdb will automatically enter post-mortem debugging if the program being debugged exits abnormally. After post-mortem debugging (or @@ -104,6 +104,24 @@ useful than quitting the debugger upon program's exit. .. versionchanged:: 3.7 Added the ``-m`` option. +.. option:: -p, --pid + + Attach to the process with the specified PID. + + .. versionadded:: 3.14 + + +To attach to a running Python process for remote debugging, use the ``-p`` or +``--pid`` option with the target process's PID:: + + python -m pdb -p 1234 + +.. note:: + + Attaching to a process that is blocked in a system call or waiting for I/O + will only work once the next bytecode instruction is executed or when the + process receives a signal. + Typical usage to execute a statement under control of the debugger is:: >>> import pdb diff --git a/Lib/pdb.py b/Lib/pdb.py index f89d104fcddb9a..d9e9bc011dbcca 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -3490,7 +3490,8 @@ def help(): _usage = """\ Debug the Python program given by pyfile. Alternatively, an executable module or package to debug can be specified using -the -m switch. +the -m switch. You can also attach to a running Python process +using the -p option with its PID. Initial commands are read from .pdbrc files in your home directory and in the current directory, if they exist. Commands supplied with From 87d7a19ef0a751925be1f703858831c5e0c4fb57 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 11:36:39 +0200 Subject: [PATCH 0173/1674] [3.14] gh-133980: use atomic store in `PyObject_GenericSetDict` (GH-133988) (#134354) gh-133980: use atomic store in `PyObject_GenericSetDict` (GH-133988) (cherry picked from commit ec39fd2c20323ee9814a1137b1a0819e92efae4e) Co-authored-by: Kumar Aditya --- Lib/test/test_free_threading/test_dict.py | 16 ++++++++++++++++ Objects/object.c | 8 +++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_free_threading/test_dict.py b/Lib/test/test_free_threading/test_dict.py index 476cc3178d843f..5d5d4e226caa40 100644 --- a/Lib/test/test_free_threading/test_dict.py +++ b/Lib/test/test_free_threading/test_dict.py @@ -228,6 +228,22 @@ def reader_func(): self.assertEqual(count, 0) + def test_racing_object_get_set_dict(self): + e = Exception() + + def writer(): + for i in range(10000): + e.__dict__ = {1:2} + + def reader(): + for i in range(10000): + e.__dict__ + + t1 = Thread(target=writer) + t2 = Thread(target=reader) + + with threading_helper.start_threads([t1, t2]): + pass if __name__ == "__main__": unittest.main() diff --git a/Objects/object.c b/Objects/object.c index 723b0427e69251..af1aa217f75462 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1931,7 +1931,13 @@ PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context) return -1; } Py_BEGIN_CRITICAL_SECTION(obj); - Py_XSETREF(*dictptr, Py_NewRef(value)); + PyObject *olddict = *dictptr; + FT_ATOMIC_STORE_PTR_RELEASE(*dictptr, Py_NewRef(value)); +#ifdef Py_GIL_DISABLED + _PyObject_XDecRefDelayed(olddict); +#else + Py_XDECREF(olddict); +#endif Py_END_CRITICAL_SECTION(); return 0; } From 7c3e21540b6f33840e5a756c71dbb8487b66e2d4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 13:38:37 +0200 Subject: [PATCH 0174/1674] [3.14] gh-132542: Only run test_native_id_after_fork if native_id is supported (GH-134408) (GH-134413) (cherry picked from commit e6dde10a69ce62c3b02b3b4e07559d06a9451fc2) Co-authored-by: Noam Cohen --- Lib/test/test_threading.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index dc7172db04c5b7..a9a354647f56ca 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1353,6 +1353,7 @@ def do_flush(*args, **kwargs): assert_python_ok("-c", script) @skip_unless_reliable_fork + @unittest.skipUnless(hasattr(threading, 'get_native_id'), "test needs threading.get_native_id()") def test_native_id_after_fork(self): script = """if True: import threading From ac27008ccdaed0ca587bacb9dd51bfb7503a0ae0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 15:08:20 +0200 Subject: [PATCH 0175/1674] [3.14] Fix signature of `_curses.assume_default_colors` in the docs (GH-134409) (#134417) Fix signature of `_curses.assume_default_colors` in the docs (GH-134409) (cherry picked from commit dcfc91e4e552e74a43f5fdf049af7a8fe7a784ee) Co-authored-by: sobolevn --- Doc/library/curses.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index 5ec23b61396773..0b13c559295f3c 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -68,7 +68,7 @@ The module :mod:`curses` defines the following exception: The module :mod:`curses` defines the following functions: -.. function:: assume_default_colors(fg, bg) +.. function:: assume_default_colors(fg, bg, /) Allow use of default values for colors on terminals supporting this feature. Use this to support transparency in your application. From f7cdee93f48f871b3200c2704bcd96e1b6f49597 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 15:58:09 +0200 Subject: [PATCH 0176/1674] [3.14] gh-110631: Fix some incorrect indents in the documentation (GH-129312) (#134419) Co-authored-by: Yuki Kobayashi --- Doc/library/functions.rst | 76 ++++++++++++------------- Doc/library/importlib.resources.abc.rst | 48 ++++++++-------- Doc/library/signal.rst | 4 +- Doc/library/socket.rst | 10 ++-- 4 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 7e367a0f2b6b25..2ecce3dba5a0b9 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1154,44 +1154,44 @@ are always available. They are listed here in alphabetical order. .. function:: locals() - 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. + 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 diff --git a/Doc/library/importlib.resources.abc.rst b/Doc/library/importlib.resources.abc.rst index 7a77466bcbaf27..8253a33f591a0b 100644 --- a/Doc/library/importlib.resources.abc.rst +++ b/Doc/library/importlib.resources.abc.rst @@ -49,44 +49,44 @@ .. method:: open_resource(resource) :abstractmethod: - Returns an opened, :term:`file-like object` for binary reading - of the *resource*. + Returns an opened, :term:`file-like object` for binary reading + of the *resource*. - If the resource cannot be found, :exc:`FileNotFoundError` is - raised. + If the resource cannot be found, :exc:`FileNotFoundError` is + raised. .. method:: resource_path(resource) :abstractmethod: - Returns the file system path to the *resource*. + Returns the file system path to the *resource*. - If the resource does not concretely exist on the file system, - raise :exc:`FileNotFoundError`. + If the resource does not concretely exist on the file system, + raise :exc:`FileNotFoundError`. .. method:: is_resource(name) :abstractmethod: - Returns ``True`` if the named *name* is considered a resource. - :exc:`FileNotFoundError` is raised if *name* does not exist. + Returns ``True`` if the named *name* is considered a resource. + :exc:`FileNotFoundError` is raised if *name* does not exist. .. method:: contents() :abstractmethod: - Returns an :term:`iterable` of strings over the contents of - the package. Do note that it is not required that all names - returned by the iterator be actual resources, e.g. it is - acceptable to return names for which :meth:`is_resource` would - be false. - - Allowing non-resource names to be returned is to allow for - situations where how a package and its resources are stored - are known a priori and the non-resource names would be useful. - For instance, returning subdirectory names is allowed so that - when it is known that the package and resources are stored on - the file system then those subdirectory names can be used - directly. - - The abstract method returns an iterable of no items. + Returns an :term:`iterable` of strings over the contents of + the package. Do note that it is not required that all names + returned by the iterator be actual resources, e.g. it is + acceptable to return names for which :meth:`is_resource` would + be false. + + Allowing non-resource names to be returned is to allow for + situations where how a package and its resources are stored + are known a priori and the non-resource names would be useful. + For instance, returning subdirectory names is allowed so that + when it is known that the package and resources are stored on + the file system then those subdirectory names can be used + directly. + + The abstract method returns an iterable of no items. .. class:: Traversable diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index c28841dbb8cfc8..b0307d3dea1170 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -211,8 +211,8 @@ The variables defined in the :mod:`signal` module are: .. data:: SIGSTKFLT - Stack fault on coprocessor. The Linux kernel does not raise this signal: it - can only be raised in user space. + Stack fault on coprocessor. The Linux kernel does not raise this signal: it + can only be raised in user space. .. availability:: Linux. diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 8fd5187e3a4a36..75fd637045d7d8 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -362,10 +362,10 @@ Exceptions Constants ^^^^^^^^^ - The AF_* and SOCK_* constants are now :class:`AddressFamily` and - :class:`SocketKind` :class:`.IntEnum` collections. +The AF_* and SOCK_* constants are now :class:`AddressFamily` and +:class:`SocketKind` :class:`.IntEnum` collections. - .. versionadded:: 3.4 +.. versionadded:: 3.4 .. data:: AF_UNIX AF_INET @@ -773,9 +773,9 @@ Constants Constant to optimize CPU locality, to be used in conjunction with :data:`SO_REUSEPORT`. - .. versionadded:: 3.11 + .. versionadded:: 3.11 - .. availability:: Linux >= 3.9 + .. availability:: Linux >= 3.9 .. data:: SO_REUSEPORT_LB From 9be568eda44a0888cd03b248e5d18f5a88fec04b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 16:24:23 +0200 Subject: [PATCH 0177/1674] [3.14] gh-132983: Add documentation for compression.zstd (GH-133911) (#134425) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-132983: Add documentation for compression.zstd (GH-133911) Add documentation for compression & compression.zstd. 🎉 --------- (cherry picked from commit d862b6de1bcff01229318d7138ddaab755723a43) Co-authored-by: Emma Smith Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Sumana Harihareswara Co-authored-by: Martin Panter --- Doc/library/archiving.rst | 4 +- Doc/library/compression.rst | 18 + Doc/library/compression.zstd.rst | 840 +++++++++++++++++++++++++++++++ 3 files changed, 861 insertions(+), 1 deletion(-) create mode 100644 Doc/library/compression.rst create mode 100644 Doc/library/compression.zstd.rst diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst index c9284949af4972..da0b3f8c3e7693 100644 --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -5,13 +5,15 @@ Data Compression and Archiving ****************************** The modules described in this chapter support data compression with the zlib, -gzip, bzip2 and lzma algorithms, and the creation of ZIP- and tar-format +gzip, bzip2, lzma, and zstd algorithms, and the creation of ZIP- and tar-format archives. See also :ref:`archiving-operations` provided by the :mod:`shutil` module. .. toctree:: + compression.rst + compression.zstd.rst zlib.rst gzip.rst bz2.rst diff --git a/Doc/library/compression.rst b/Doc/library/compression.rst new file mode 100644 index 00000000000000..618b4a3c2bd170 --- /dev/null +++ b/Doc/library/compression.rst @@ -0,0 +1,18 @@ +The :mod:`!compression` package +=============================== + +.. versionadded:: 3.14 + +The :mod:`!compression` package contains the canonical compression modules +containing interfaces to several different compression algorithms. Some of +these modules have historically been available as separate modules; those will +continue to be available under their original names for compatibility reasons, +and will not be removed without a deprecation cycle. The use of modules in +:mod:`!compression` is encouraged where practical. + +* :mod:`!compression.bz2` -- Re-exports :mod:`bz2` +* :mod:`!compression.gzip` -- Re-exports :mod:`gzip` +* :mod:`!compression.lzma` -- Re-exports :mod:`lzma` +* :mod:`!compression.zlib` -- Re-exports :mod:`zlib` +* :mod:`compression.zstd` -- Wrapper for the Zstandard compression library + diff --git a/Doc/library/compression.zstd.rst b/Doc/library/compression.zstd.rst new file mode 100644 index 00000000000000..1e1802155a19ec --- /dev/null +++ b/Doc/library/compression.zstd.rst @@ -0,0 +1,840 @@ +:mod:`!compression.zstd` --- Compression compatible with the Zstandard format +============================================================================= + +.. module:: compression.zstd + :synopsis: Low-level interface to compression and decompression routines in + the zstd library. + +.. versionadded:: 3.14 + +**Source code:** :source:`Lib/compression/zstd/__init__.py` + +-------------- + +This module provides classes and functions for compressing and decompressing +data using the Zstandard (or *zstd*) compression algorithm. The +`zstd manual `__ +describes Zstandard as "a fast lossless compression algorithm, targeting +real-time compression scenarios at zlib-level and better compression ratios." +Also included is a file interface that supports reading and writing the +contents of ``.zst`` files created by the :program:`zstd` utility, as well as +raw zstd compressed streams. + +The :mod:`!compression.zstd` module contains: + +* The :func:`.open` function and :class:`ZstdFile` class for reading and + writing compressed files. +* The :class:`ZstdCompressor` and :class:`ZstdDecompressor` classes for + incremental (de)compression. +* The :func:`compress` and :func:`decompress` functions for one-shot + (de)compression. +* The :func:`train_dict` and :func:`finalize_dict` functions and the + :class:`ZstdDict` class to train and manage Zstandard dictionaries. +* The :class:`CompressionParameter`, :class:`DecompressionParameter`, and + :class:`Strategy` classes for setting advanced (de)compression parameters. + + +Exceptions +---------- + +.. exception:: ZstdError + + This exception is raised when an error occurs during compression or + decompression, or while initializing the (de)compressor state. + + +Reading and writing compressed files +------------------------------------ + +.. function:: open(file, /, mode='rb', *, level=None, options=None, \ + zstd_dict=None, encoding=None, errors=None, newline=None) + + Open a Zstandard-compressed file in binary or text mode, returning a + :term:`file object`. + + The *file* argument can be either a file name (given as a + :class:`str`, :class:`bytes` or :term:`path-like ` + object), in which case the named file is opened, or it can be an existing + file object to read from or write to. + + The mode argument can be either ``'rb'`` for reading (default), ``'wb'`` for + overwriting, ``'ab'`` for appending, or ``'xb'`` for exclusive creation. + These can equivalently be given as ``'r'``, ``'w'``, ``'a'``, and ``'x'`` + respectively. You may also open in text mode with ``'rt'``, ``'wt'``, + ``'at'``, and ``'xt'`` respectively. + + When reading, the *options* argument can be a dictionary providing advanced + decompression parameters; see :class:`DecompressionParameter` for detailed + information about supported + parameters. The *zstd_dict* argument is a :class:`ZstdDict` instance to be + used during decompression. When reading, if the *level* + argument is not None, a :exc:`!TypeError` will be raised. + + When writing, the *options* argument can be a dictionary + providing advanced decompression parameters; see + :class:`CompressionParameter` for detailed information about supported + parameters. The *level* argument is the compression level to use when + writing compressed data. Only one of *level* or *options* may be non-None. + The *zstd_dict* argument is a :class:`ZstdDict` instance to be used during + compression. + + In binary mode, this function is equivalent to the :class:`ZstdFile` + constructor: ``ZstdFile(file, mode, ...)``. In this case, the + *encoding*, *errors*, and *newline* parameters must not be provided. + + In text mode, a :class:`ZstdFile` object is created, and wrapped in an + :class:`io.TextIOWrapper` instance with the specified encoding, error + handling behavior, and line endings. + + +.. class:: ZstdFile(file, /, mode='rb', *, level=None, options=None, \ + zstd_dict=None) + + Open a Zstandard-compressed file in binary mode. + + A :class:`ZstdFile` can wrap an already-open :term:`file object`, or operate + directly on a named file. The *file* argument specifies either the file + object to wrap, or the name of the file to open (as a :class:`str`, + :class:`bytes` or :term:`path-like ` object). If + wrapping an existing file object, the wrapped file will not be closed when + the :class:`ZstdFile` is closed. + + The *mode* argument can be either ``'rb'`` for reading (default), ``'wb'`` + for overwriting, ``'xb'`` for exclusive creation, or ``'ab'`` for appending. + These can equivalently be given as ``'r'``, ``'w'``, ``'x'`` and ``'a'`` + respectively. + + If *file* is a file object (rather than an actual file name), a mode of + ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``. + + When reading, the *options* argument can be a dictionary + providing advanced decompression parameters; see + :class:`DecompressionParameter` for detailed information about supported + parameters. The *zstd_dict* argument is a :class:`ZstdDict` instance to be + used during decompression. When reading, if the *level* + argument is not None, a :exc:`!TypeError` will be raised. + + When writing, the *options* argument can be a dictionary + providing advanced decompression parameters; see + :class:`CompressionParameter` for detailed information about supported + parameters. The *level* argument is the compression level to use when + writing compressed data. Only one of *level* or *options* may be passed. The + *zstd_dict* argument is a :class:`ZstdDict` instance to be used during + compression. + + :class:`!ZstdFile` supports all the members specified by + :class:`io.BufferedIOBase`, except for :meth:`~io.BufferedIOBase.detach` + and :meth:`~io.IOBase.truncate`. + Iteration and the :keyword:`with` statement are supported. + + The following method and attributes are also provided: + + .. method:: peek(size=-1) + + Return buffered data without advancing the file position. At least one + byte of data will be returned, unless EOF has been reached. The exact + number of bytes returned is unspecified (the *size* argument is ignored). + + .. note:: While calling :meth:`peek` does not change the file position of + the :class:`ZstdFile`, it may change the position of the underlying + file object (for example, if the :class:`ZstdFile` was constructed by + passing a file object for *file*). + + .. attribute:: mode + + ``'rb'`` for reading and ``'wb'`` for writing. + + .. attribute:: name + + The name of the Zstandard file. Equivalent to the :attr:`~io.FileIO.name` + attribute of the underlying :term:`file object`. + + +Compressing and decompressing data in memory +-------------------------------------------- + +.. function:: compress(data, level=None, options=None, zstd_dict=None) + + Compress *data* (a :term:`bytes-like object`), returning the compressed + data as a :class:`bytes` object. + + The *level* argument is an integer controlling the level of + compression. *level* is an alternative to setting + :attr:`CompressionParameter.compression_level` in *options*. Use + :meth:`~CompressionParameter.bounds` on + :attr:`~CompressionParameter.compression_level` to get the values that can + be passed for *level*. If advanced compression options are needed, the + *level* argument must be omitted and in the *options* dictionary the + :attr:`!CompressionParameter.compression_level` parameter should be set. + + The *options* argument is a Python dictionary containing advanced + compression parameters. The valid keys and values for compression parameters + are documented as part of the :class:`CompressionParameter` documentation. + + The *zstd_dict* argument is an instance of :class:`ZstdDict` + containing trained data to improve compression efficiency. The + function :func:`train_dict` can be used to generate a Zstandard dictionary. + + +.. function:: decompress(data, zstd_dict=None, options=None) + + Decompress *data* (a :term:`bytes-like object`), returning the uncompressed + data as a :class:`bytes` object. + + The *options* argument is a Python dictionary containing advanced + decompression parameters. The valid keys and values for compression + parameters are documented as part of the :class:`DecompressionParameter` + documentation. + + The *zstd_dict* argument is an instance of :class:`ZstdDict` + containing trained data used during compression. This must be + the same Zstandard dictionary used during compression. + + If *data* is the concatenation of multiple distinct compressed frames, + decompress all of these frames, and return the concatenation of the results. + + +.. class:: ZstdCompressor(level=None, options=None, zstd_dict=None) + + Create a compressor object, which can be used to compress data + incrementally. + + For a more convenient way of compressing a single chunk of data, see the + module-level function :func:`compress`. + + The *level* argument is an integer controlling the level of + compression. *level* is an alternative to setting + :attr:`CompressionParameter.compression_level` in *options*. Use + :meth:`~CompressionParameter.bounds` on + :attr:`~CompressionParameter.compression_level` to get the values that can + be passed for *level*. If advanced compression options are needed, the + *level* argument must be omitted and in the *options* dictionary the + :attr:`!CompressionParameter.compression_level` parameter should be set. + + The *options* argument is a Python dictionary containing advanced + compression parameters. The valid keys and values for compression parameters + are documented as part of the :class:`CompressionParameter` documentation. + + The *zstd_dict* argument is an optional instance of :class:`ZstdDict` + containing trained data to improve compression efficiency. The + function :func:`train_dict` can be used to generate a Zstandard dictionary. + + + .. method:: compress(data, mode=ZstdCompressor.CONTINUE) + + Compress *data* (a :term:`bytes-like object`), returning a :class:`bytes` + object with compressed data if possible, or otherwise an empty + :class:`!bytes` object. Some of *data* may be buffered internally, for + use in later calls to :meth:`!compress` and :meth:`~.flush`. The returned + data should be concatenated with the output of any previous calls to + :meth:`~.compress`. + + The *mode* argument is a :class:`ZstdCompressor` attribute, either + :attr:`~.CONTINUE`, :attr:`~.FLUSH_BLOCK`, + or :attr:`~.FLUSH_FRAME`. + + When all data has been provided to the compressor, call the + :meth:`~.flush` method to finish the compression process. If + :meth:`~.compress` is called with *mode* set to :attr:`~.FLUSH_FRAME`, + :meth:`~.flush` should not be called, as it would write out a new empty + frame. + + .. method:: flush(mode=ZstdCompressor.FLUSH_FRAME) + + Finish the compression process, returning a :class:`bytes` object + containing any data stored in the compressor's internal buffers. + + The *mode* argument is a :class:`ZstdCompressor` attribute, either + :attr:`~.FLUSH_BLOCK`, or :attr:`~.FLUSH_FRAME`. + + .. attribute:: CONTINUE + + Collect more data for compression, which may or may not generate output + immediately. This mode optimizes the compression ratio by maximizing the + amount of data per block and frame. + + .. attribute:: FLUSH_BLOCK + + Complete and write a block to the data stream. The data returned so far + can be immediately decompressed. Past data can still be referenced in + future blocks generated by calls to :meth:`~.compress`, + improving compression. + + .. attribute:: FLUSH_FRAME + + Complete and write out a frame. Future data provided to + :meth:`~.compress` will be written into a new frame and + *cannot* reference past data. + + +.. class:: ZstdDecompressor(zstd_dict=None, options=None) + + Create a decompressor object, which can be used to decompress data + incrementally. + + For a more convenient way of decompressing an entire compressed stream at + once, see the module-level function :func:`decompress`. + + The *options* argument is a Python dictionary containing advanced + decompression parameters. The valid keys and values for compression + parameters are documented as part of the :class:`DecompressionParameter` + documentation. + + The *zstd_dict* argument is an instance of :class:`ZstdDict` + containing trained data used during compression. This must be + the same Zstandard dictionary used during compression. + + .. note:: + This class does not transparently handle inputs containing multiple + compressed frames, unlike the :func:`decompress` function and + :class:`ZstdFile` class. To decompress a multi-frame input, you should + use :func:`decompress`, :class:`ZstdFile` if working with a + :term:`file object`, or multiple :class:`!ZstdDecompressor` instances. + + .. method:: decompress(data, max_length=-1) + + Decompress *data* (a :term:`bytes-like object`), returning + uncompressed data as bytes. Some of *data* may be buffered + internally, for use in later calls to :meth:`!decompress`. + The returned data should be concatenated with the output of any previous + calls to :meth:`!decompress`. + + If *max_length* is non-negative, the method returns at most *max_length* + bytes of decompressed data. If this limit is reached and further + output can be produced, the :attr:`~.needs_input` attribute will + be set to ``False``. In this case, the next call to + :meth:`~.decompress` may provide *data* as ``b''`` to obtain + more of the output. + + If all of the input data was decompressed and returned (either + because this was less than *max_length* bytes, or because + *max_length* was negative), the :attr:`~.needs_input` attribute + will be set to ``True``. + + Attempting to decompress data after the end of a frame will raise a + :exc:`ZstdError`. Any data found after the end of the frame is ignored + and saved in the :attr:`~.unused_data` attribute. + + .. attribute:: eof + + ``True`` if the end-of-stream marker has been reached. + + .. attribute:: unused_data + + Data found after the end of the compressed stream. + + Before the end of the stream is reached, this will be ``b''``. + + .. attribute:: needs_input + + ``False`` if the :meth:`.decompress` method can provide more + decompressed data before requiring new compressed input. + + +Zstandard dictionaries +---------------------- + + +.. function:: train_dict(samples, dict_size) + + Train a Zstandard dictionary, returning a :class:`ZstdDict` instance. + Zstandard dictionaries enable more efficient compression of smaller sizes + of data, which is traditionally difficult to compress due to less + repetition. If you are compressing multiple similar groups of data (such as + similar files), Zstandard dictionaries can improve compression ratios and + speed significantly. + + The *samples* argument (an iterable of :class:`bytes` objects), is the + population of samples used to train the Zstandard dictionary. + + The *dict_size* argument, an integer, is the maximum size (in bytes) the + Zstandard dictionary should be. The Zstandard documentation suggests an + absolute maximum of no more than 100 KB, but the maximum can often be smaller + depending on the data. Larger dictionaries generally slow down compression, + but improve compression ratios. Smaller dictionaries lead to faster + compression, but reduce the compression ratio. + + +.. function:: finalize_dict(zstd_dict, /, samples, dict_size, level) + + An advanced function for converting a "raw content" Zstandard dictionary into + a regular Zstandard dictionary. "Raw content" dictionaries are a sequence of + bytes that do not need to follow the structure of a normal Zstandard + dictionary. + + The *zstd_dict* argument is a :class:`ZstdDict` instance with + the :attr:`~ZstdDict.dict_content` containing the raw dictionary contents. + + The *samples* argument (an iterable of :class:`bytes` objects), contains + sample data for generating the Zstandard dictionary. + + The *dict_size* argument, an integer, is the maximum size (in bytes) the + Zstandard dictionary should be. See :func:`train_dict` for + suggestions on the maximum dictionary size. + + The *level* argument (an integer) is the compression level expected to be + passed to the compressors using this dictionary. The dictionary information + varies for each compression level, so tuning for the proper compression + level can make compression more efficient. + + +.. class:: ZstdDict(dict_content, /, *, is_raw=False) + + A wrapper around Zstandard dictionaries. Dictionaries can be used to improve + the compression of many small chunks of data. Use :func:`train_dict` if you + need to train a new dictionary from sample data. + + The *dict_content* argument (a :term:`bytes-like object`), is the already + trained dictionary information. + + The *is_raw* argument, a boolean, is an advanced parameter controlling the + meaning of *dict_content*. ``True`` means *dict_content* is a "raw content" + dictionary, without any format restrictions. ``False`` means *dict_content* + is an ordinary Zstandard dictionary, created from Zstandard functions, + for example, :func:`train_dict` or the external :program:`zstd` CLI. + + When passing a :class:`!ZstdDict` to a function, the + :attr:`!as_digested_dict` and :attr:`!as_undigested_dict` attributes can + control how the dictionary is loaded by passing them as the ``zstd_dict`` + argument, for example, ``compress(data, zstd_dict=zd.as_digested_dict)``. + Digesting a dictionary is a costly operation that occurs when loading a + Zstandard dictionary. When making multiple calls to compression or + decompression, passing a digested dictionary will reduce the overhead of + loading the dictionary. + + .. list-table:: Difference for compression + :widths: 10 14 10 + :header-rows: 1 + + * - + - Digested dictionary + - Undigested dictionary + * - Advanced parameters of the compressor which may be overridden by + the dictionary's parameters + - ``window_log``, ``hash_log``, ``chain_log``, ``search_log``, + ``min_match``, ``target_length``, ``strategy``, + ``enable_long_distance_matching``, ``ldm_hash_log``, + ``ldm_min_match``, ``ldm_bucket_size_log``, ``ldm_hash_rate_log``, + and some non-public parameters. + - None + * - :class:`!ZstdDict` internally caches the dictionary + - Yes. It's faster when loading a digested dictionary again with the + same compression level. + - No. If you wish to load an undigested dictionary multiple times, + consider reusing a compressor object. + + If passing a :class:`!ZstdDict` without any attribute, an undigested + dictionary is passed by default when compressing and a digested dictionary + is generated if necessary and passed by default when decompressing. + + .. attribute:: dict_content + + The content of the Zstandard dictionary, a ``bytes`` object. It's the + same as the *dict_content* argument in the ``__init__`` method. It can + be used with other programs, such as the ``zstd`` CLI program. + + .. attribute:: dict_id + + Identifier of the Zstandard dictionary, a non-negative int value. + + Non-zero means the dictionary is ordinary, created by Zstandard + functions and following the Zstandard format. + + ``0`` means a "raw content" dictionary, free of any format restriction, + used for advanced users. + + .. note:: + + The meaning of ``0`` for :attr:`!ZstdDict.dict_id` is different + from the ``dictionary_id`` attribute to the :func:`get_frame_info` + function. + + .. attribute:: as_digested_dict + + Load as a digested dictionary. + + .. attribute:: as_undigested_dict + + Load as an undigested dictionary. + + +Advanced parameter control +-------------------------- + +.. class:: CompressionParameter() + + An :class:`~enum.IntEnum` containing the advanced compression parameter + keys that can be used when compressing data. + + The :meth:`~.bounds` method can be used on any attribute to get the valid + values for that parameter. + + Parameters are optional; any omitted parameter will have it's value selected + automatically. + + Example getting the lower and upper bound of :attr:`~.compression_level`:: + + lower, upper = CompressionParameter.compression_level.bounds() + + Example setting the :attr:`~.window_log` to the maximum size:: + + _lower, upper = CompressionParameter.window_log.bounds() + options = {CompressionParameter.window_log: upper} + compress(b'venezuelan beaver cheese', options=options) + + .. method:: bounds() + + Return the tuple of int bounds, ``(lower, upper)``, of a compression + parameter. This method should be called on the attribute you wish to + retrieve the bounds of. For example, to get the valid values for + :attr:`~.compression_level`, one may check the result of + ``CompressionParameter.compression_level.bounds()``. + + Both the lower and upper bounds are inclusive. + + .. attribute:: compression_level + + A high-level means of setting other compression parameters that affect + the speed and ratio of compressing data. Setting the level to zero uses + :attr:`COMPRESSION_LEVEL_DEFAULT`. + + .. attribute:: window_log + + Maximum allowed back-reference distance the compressor can use when + compressing data, expressed as power of two, ``1 << window_log`` bytes. + This parameter greatly influences the memory usage of compression. Higher + values require more memory but gain better compression values. + + A value of zero causes the value to be selected automatically. + + .. attribute:: hash_log + + Size of the initial probe table, as a power of two. The resulting memory + usage is ``1 << (hash_log+2)`` bytes. Larger tables improve compression + ratio of strategies <= :attr:`~Strategy.dfast`, and improve compression + speed of strategies > :attr:`~Strategy.dfast`. + + A value of zero causes the value to be selected automatically. + + .. attribute:: chain_log + + Size of the multi-probe search table, as a power of two. The resulting + memory usage is ``1 << (chain_log+2)`` bytes. Larger tables result in + better and slower compression. This parameter has no effect for the + :attr:`~Strategy.fast` strategy. It's still useful when using + :attr:`~Strategy.dfast` strategy, in which case it defines a secondary + probe table. + + A value of zero causes the value to be selected automatically. + + .. attribute:: search_log + + Number of search attempts, as a power of two. More attempts result in + better and slower compression. This parameter is useless for + :attr:`~Strategy.fast` and :attr:`~Strategy.dfast` strategies. + + A value of zero causes the value to be selected automatically. + + .. attribute:: min_match + + Minimum size of searched matches. Larger values increase compression and + decompression speed, but decrease ratio. Note that Zstandard can still + find matches of smaller size, it just tweaks its search algorithm to look + for this size and larger. For all strategies < :attr:`~Strategy.btopt`, + the effective minimum is ``4``; for all strategies + > :attr:`~Strategy.fast`, the effective maximum is ``6``. + + A value of zero causes the value to be selected automatically. + + .. attribute:: target_length + + The impact of this field depends on the selected :class:`Strategy`. + + For strategies :attr:`~Strategy.btopt`, :attr:`~Strategy.btultra` and + :attr:`~Strategy.btultra2`, the value is the length of a match + considered "good enough" to stop searching. Larger values make + compression ratios better, but compresses slower. + + For strategy :attr:`~Strategy.fast`, it is the distance between match + sampling. Larger values make compression faster, but with a worse + compression ratio. + + A value of zero causes the value to be selected automatically. + + .. attribute:: strategy + + The higher the value of selected strategy, the more complex the + compression technique used by zstd, resulting in higher compression + ratios but slower compression. + + .. seealso:: :class:`Strategy` + + .. attribute:: enable_long_distance_matching + + Long distance matching can be used to improve compression for large + inputs by finding large matches at greater distances. It increases memory + usage and window size. + + ``True`` or ``1`` enable long distance matching while ``False`` or ``0`` + disable it. + + Enabling this parameter increases default + :attr:`~CompressionParameter.window_log` to 128 MiB except when expressly + set to a different value. This setting is enabled by default if + :attr:`!window_log` >= 128 MiB and the compression + strategy >= :attr:`~Strategy.btopt` (compression level 16+). + + .. attribute:: ldm_hash_log + + Size of the table for long distance matching, as a power of two. Larger + values increase memory usage and compression ratio, but decrease + compression speed. + + A value of zero causes the value to be selected automatically. + + .. attribute:: ldm_min_match + + Minimum match size for long distance matcher. Larger or too small values + can often decrease the compression ratio. + + A value of zero causes the value to be selected automatically. + + .. attribute:: ldm_bucket_size_log + + Log size of each bucket in the long distance matcher hash table for + collision resolution. Larger values improve collision resolution but + decrease compression speed. + + A value of zero causes the value to be selected automatically. + + .. attribute:: ldm_hash_rate_log + + Frequency of inserting/looking up entries into the long distance matcher + hash table. Larger values improve compression speed. Deviating far from + the default value will likely result in a compression ratio decrease. + + A value of zero causes the value to be selected automatically. + + .. attribute:: checksum_flag + + A four-byte checksum using XXHash64 of the uncompressed content is + written at the end of each frame. Zstandard's decompression code verifies + the checksum. If there is a mismatch a :class:`ZstdError` exception is + raised. + + ``True`` or ``1`` enable checksum generation while ``False`` or ``0`` + disable it. + + .. attribute:: dict_id_flag + + When compressing with a :class:`ZstdDict`, the dictionary's ID is written + into the frame header. + + ``True`` or ``1`` enable storing the dictionary ID while ``False`` or + ``0`` disable it. + + .. attribute:: nb_workers + + Select how many threads will be spawned to compress in parallel. When + :attr:`!nb_workers` > 0, enables multi-threaded compression, a value of + ``1`` means "one-thread multi-threaded mode". More workers improve speed, + but also increase memory usage and slightly reduce compression ratio. + + A value of zero disables multi-threading. + + .. attribute:: job_size + + Size of a compression job, in bytes. This value is enforced only when + :attr:`~CompressionParameter.nb_workers` >= 1. Each compression job is + completed in parallel, so this value can indirectly impact the number of + active threads. + + A value of zero causes the value to be selected automatically. + + .. attribute:: overlap_log + + Sets how much data is reloaded from previous jobs (threads) for new jobs + to be used by the look behind window during compression. This value is + only used when :attr:`~CompressionParameter.nb_workers` >= 1. Acceptable + values vary from 0 to 9. + + * 0 means dynamically set the overlap amount + * 1 means no overlap + * 9 means use a full window size from the previous job + + Each increment halves/doubles the overlap size. "8" means an overlap of + ``window_size/2``, "7" means an overlap of ``window_size/4``, etc. + +.. class:: DecompressionParameter() + + An :class:`~enum.IntEnum` containing the advanced decompression parameter + keys that can be used when decompressing data. Parameters are optional; any + omitted parameter will have it's value selected automatically. + + The :meth:`~.bounds` method can be used on any attribute to get the valid + values for that parameter. + + Example setting the :attr:`~.window_log_max` to the maximum size:: + + data = compress(b'Some very long buffer of bytes...') + + _lower, upper = DecompressionParameter.window_log_max.bounds() + + options = {DecompressionParameter.window_log_max: upper} + decompress(data, options=options) + + .. method:: bounds() + + Return the tuple of int bounds, ``(lower, upper)``, of a decompression + parameter. This method should be called on the attribute you wish to + retrieve the bounds of. + + Both the lower and upper bounds are inclusive. + + .. attribute:: window_log_max + + The base-two logarithm of the maximum size of the window used during + decompression. This can be useful to limit the amount of memory used when + decompressing data. A larger maximum window size leads to faster + decompression. + + A value of zero causes the value to be selected automatically. + + +.. class:: Strategy() + + An :class:`~enum.IntEnum` containing strategies for compression. + Higher-numbered strategies correspond to more complex and slower + compression. + + .. note:: + + The values of attributes of :class:`!Strategy` are not necessarily stable + across zstd versions. Only the ordering of the attributes may be relied + upon. The attributes are listed below in order. + + The following strategies are available: + + .. attribute:: fast + + .. attribute:: dfast + + .. attribute:: greedy + + .. attribute:: lazy + + .. attribute:: lazy2 + + .. attribute:: btlazy2 + + .. attribute:: btopt + + .. attribute:: btultra + + .. attribute:: btultra2 + + +Miscellaneous +------------- + +.. function:: get_frame_info(frame_buffer) + + Retrieve a :class:`FrameInfo` object containing metadata about a Zstandard + frame. Frames contain metadata related to the compressed data they hold. + + +.. class:: FrameInfo + + Metadata related to a Zstandard frame. + + .. attribute:: decompressed_size + + The size of the decompressed contents of the frame. + + .. attribute:: dictionary_id + + An integer representing the Zstandard dictionary ID needed for + decompressing the frame. ``0`` means the dictionary ID was not + recorded in the frame header. This may mean that a Zstandard dictionary + is not needed, or that the ID of a required dictionary was not recorded. + + +.. attribute:: COMPRESSION_LEVEL_DEFAULT + + The default compression level for Zstandard: ``3``. + + +.. attribute:: zstd_version_info + + Version number of the runtime zstd library as a tuple of integers + (major, minor, release). + + +Examples +-------- + +Reading in a compressed file: + +.. code-block:: python + + from compression import zstd + + with zstd.open("file.zst") as f: + file_content = f.read() + +Creating a compressed file: + +.. code-block:: python + + from compression import zstd + + data = b"Insert Data Here" + with zstd.open("file.zst", "w") as f: + f.write(data) + +Compressing data in memory: + +.. code-block:: python + + from compression import zstd + + data_in = b"Insert Data Here" + data_out = zstd.compress(data_in) + +Incremental compression: + +.. code-block:: python + + from compression import zstd + + comp = zstd.ZstdCompressor() + out1 = comp.compress(b"Some data\n") + out2 = comp.compress(b"Another piece of data\n") + out3 = comp.compress(b"Even more data\n") + out4 = comp.flush() + # Concatenate all the partial results: + result = b"".join([out1, out2, out3, out4]) + +Writing compressed data to an already-open file: + +.. code-block:: python + + from compression import zstd + + with open("myfile", "wb") as f: + f.write(b"This data will not be compressed\n") + with zstd.open(f, "w") as zstf: + zstf.write(b"This *will* be compressed\n") + f.write(b"Not compressed\n") + +Creating a compressed file using compression parameters: + +.. code-block:: python + + from compression import zstd + + options = { + zstd.CompressionParameter.checksum_flag: 1 + } + with zstd.open("file.zst", "w", options=options) as f: + f.write(b"Mind if I squeeze in?") From f1a9d891071bd264237211ec5251dfc82bc29fb3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 16:27:13 +0200 Subject: [PATCH 0178/1674] [3.14] gh-90871: fix connection backlog offset in asyncio (gh-134392) (gh-134421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 109f7597d29f0b504e9b42cb398b44177157abaa) Co-authored-by: Christian Harries <68507104+ChristianHrs@users.noreply.github.com> Co-authored-by: Łukasz Langa Co-authored-by: Kumar Aditya --- Lib/asyncio/selector_events.py | 2 +- Lib/test/test_asyncio/test_selector_events.py | 16 ++++++++++++++-- ...2025-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 22147451fa7ebd..6ad84044adf146 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -173,7 +173,7 @@ def _accept_connection( # listening socket has triggered an EVENT_READ. There may be multiple # connections waiting for an .accept() so it is called in a loop. # See https://bugs.python.org/issue27906 for more details. - for _ in range(backlog): + for _ in range(backlog + 1): try: conn, addr = sock.accept() if self._debug: diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index de81936b7456f2..aab6a779170eb9 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -347,6 +347,18 @@ def test_process_events_write_cancelled(self): selectors.EVENT_WRITE)]) self.loop._remove_writer.assert_called_with(1) + def test_accept_connection_zero_one(self): + for backlog in [0, 1]: + sock = mock.Mock() + sock.accept.return_value = (mock.Mock(), mock.Mock()) + with self.subTest(backlog): + mock_obj = mock.patch.object + with mock_obj(self.loop, '_accept_connection2') as accept2_mock: + self.loop._accept_connection( + mock.Mock(), sock, backlog=backlog) + self.loop.run_until_complete(asyncio.sleep(0)) + self.assertEqual(sock.accept.call_count, backlog + 1) + def test_accept_connection_multiple(self): sock = mock.Mock() sock.accept.return_value = (mock.Mock(), mock.Mock()) @@ -362,7 +374,7 @@ def test_accept_connection_multiple(self): self.loop._accept_connection( mock.Mock(), sock, backlog=backlog) self.loop.run_until_complete(asyncio.sleep(0)) - self.assertEqual(sock.accept.call_count, backlog) + self.assertEqual(sock.accept.call_count, backlog + 1) def test_accept_connection_skip_connectionabortederror(self): sock = mock.Mock() @@ -388,7 +400,7 @@ def mock_sock_accept(): # as in test_accept_connection_multiple avoid task pending # warnings by using asyncio.sleep(0) self.loop.run_until_complete(asyncio.sleep(0)) - self.assertEqual(sock.accept.call_count, backlog) + self.assertEqual(sock.accept.call_count, backlog + 1) class SelectorTransportTests(test_utils.TestCase): diff --git a/Misc/NEWS.d/next/Library/2025-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst b/Misc/NEWS.d/next/Library/2025-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst new file mode 100644 index 00000000000000..49397c9705ecfe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst @@ -0,0 +1,2 @@ +Fixed an off by one error concerning the backlog parameter in +:meth:`~asyncio.loop.create_unix_server`. Contributed by Christian Harries. From cd3395a8b10f6bab912670e1d47d432aa2a21e71 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 16:33:35 +0200 Subject: [PATCH 0179/1674] [3.14] gh-132246: Add special buffer methods to C API Type Object docs (gh-132247) (gh-134426) Two special methods, __buffer__ and __release_buffer__ were added to Python 3.12 by PEP 688. The C API Type Object documentation for slots includes `tp_as_buffer`, and sub-slots `bf_getbuffer`, `bf_releasebuffer` but does not refer to the Python Data Model version of those. Add the missing references. (cherry picked from commit b529b60fc239d19245e5fafd0514d90097c2eb40) Co-authored-by: Cody Maloney --- Doc/c-api/typeobj.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 64353a8daca5f6..5df0c0fe608e53 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -79,7 +79,7 @@ Quick Reference | :c:member:`~PyTypeObject.tp_setattro` | :c:type:`setattrofunc` | __setattr__, | X | X | | G | | | | __delattr__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | | | | | % | + | :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | :ref:`sub-slots` | | | | % | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_flags` | unsigned long | | X | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -325,9 +325,10 @@ sub-slots +---------------------------------------------------------+-----------------------------------+---------------+ | | +---------------------------------------------------------+-----------------------------------+---------------+ - | :c:member:`~PyBufferProcs.bf_getbuffer` | :c:func:`getbufferproc` | | + | :c:member:`~PyBufferProcs.bf_getbuffer` | :c:func:`getbufferproc` | __buffer__ | +---------------------------------------------------------+-----------------------------------+---------------+ - | :c:member:`~PyBufferProcs.bf_releasebuffer` | :c:func:`releasebufferproc` | | + | :c:member:`~PyBufferProcs.bf_releasebuffer` | :c:func:`releasebufferproc` | __release_\ | + | | | buffer\__ | +---------------------------------------------------------+-----------------------------------+---------------+ .. _slot-typedefs-table: From 2ffc10bd3988c244b658f7e5c97807a938264664 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 16:47:56 +0200 Subject: [PATCH 0180/1674] [3.14] gh-132775: Support Fallbacks in _PyObject_GetXIData() (gh-134418) It now supports a "full" fallback to _PyFunction_GetXIData() and then `_PyPickle_GetXIData()`. There's also room for other fallback modes if that later makes sense. (cherry picked from commit 88f8102a8f, AKA gh-133482) Co-authored-by: Eric Snow --- Doc/data/python3.14.abi | 62861 ++++++++-------- Include/internal/pycore_crossinterp.h | 25 +- .../pycore_crossinterp_data_registry.h | 4 +- Lib/test/support/import_helper.py | 2 +- Lib/test/test_crossinterp.py | 511 +- Modules/_interpchannelsmodule.c | 8 +- Modules/_interpqueuesmodule.c | 4 +- Modules/_interpreters_common.h | 4 +- Modules/_interpretersmodule.c | 2 +- Modules/_testinternalcapi.c | 9 +- Python/crossinterp.c | 89 +- Python/crossinterp_data_lookup.h | 62 +- 12 files changed, 32041 insertions(+), 31540 deletions(-) diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index c9959bef98fd07..decb2ce3c6f39e 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -1,31401 +1,31460 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Include/internal/pycore_crossinterp.h b/Include/internal/pycore_crossinterp.h index 19c55dd65983d7..45fa47d62c78a3 100644 --- a/Include/internal/pycore_crossinterp.h +++ b/Include/internal/pycore_crossinterp.h @@ -131,7 +131,23 @@ PyAPI_FUNC(void) _PyXIData_Clear(PyInterpreterState *, _PyXIData_t *); /* getting cross-interpreter data */ -typedef int (*xidatafunc)(PyThreadState *tstate, PyObject *, _PyXIData_t *); +typedef int xidata_fallback_t; +#define _PyXIDATA_XIDATA_ONLY (0) +#define _PyXIDATA_FULL_FALLBACK (1) + +// Technically, we don't need two different function types; +// we could go with just the fallback one. However, only container +// types like tuple need it, so always having the extra arg would be +// a bit unfortunate. It's also nice to be able to clearly distinguish +// between types that might call _PyObject_GetXIData() and those that won't. +// +typedef int (*xidatafunc)(PyThreadState *, PyObject *, _PyXIData_t *); +typedef int (*xidatafbfunc)( + PyThreadState *, PyObject *, xidata_fallback_t, _PyXIData_t *); +typedef struct { + xidatafunc basic; + xidatafbfunc fallback; +} _PyXIData_getdata_t; PyAPI_FUNC(PyObject *) _PyXIData_GetNotShareableErrorType(PyThreadState *); PyAPI_FUNC(void) _PyXIData_SetNotShareableError(PyThreadState *, const char *); @@ -140,16 +156,21 @@ PyAPI_FUNC(void) _PyXIData_FormatNotShareableError( const char *, ...); -PyAPI_FUNC(xidatafunc) _PyXIData_Lookup( +PyAPI_FUNC(_PyXIData_getdata_t) _PyXIData_Lookup( PyThreadState *, PyObject *); PyAPI_FUNC(int) _PyObject_CheckXIData( PyThreadState *, PyObject *); +PyAPI_FUNC(int) _PyObject_GetXIDataNoFallback( + PyThreadState *, + PyObject *, + _PyXIData_t *); PyAPI_FUNC(int) _PyObject_GetXIData( PyThreadState *, PyObject *, + xidata_fallback_t, _PyXIData_t *); // _PyObject_GetXIData() for bytes diff --git a/Include/internal/pycore_crossinterp_data_registry.h b/Include/internal/pycore_crossinterp_data_registry.h index 8f4bcb948e5a45..fbb4cad5cac32e 100644 --- a/Include/internal/pycore_crossinterp_data_registry.h +++ b/Include/internal/pycore_crossinterp_data_registry.h @@ -17,7 +17,7 @@ typedef struct _xid_regitem { /* This is NULL for builtin types. */ PyObject *weakref; size_t refcount; - xidatafunc getdata; + _PyXIData_getdata_t getdata; } _PyXIData_regitem_t; typedef struct { @@ -30,7 +30,7 @@ typedef struct { PyAPI_FUNC(int) _PyXIData_RegisterClass( PyThreadState *, PyTypeObject *, - xidatafunc); + _PyXIData_getdata_t); PyAPI_FUNC(int) _PyXIData_UnregisterClass( PyThreadState *, PyTypeObject *); diff --git a/Lib/test/support/import_helper.py b/Lib/test/support/import_helper.py index edb734d294f287..0af63501f93bc8 100644 --- a/Lib/test/support/import_helper.py +++ b/Lib/test/support/import_helper.py @@ -438,5 +438,5 @@ def ensure_module_imported(name, *, clearnone=True): if sys.modules.get(name) is not None: mod = sys.modules[name] else: - mod, _, _ = _force_import(name, False, True, clearnone) + mod, _, _ = _ensure_module(name, False, True, clearnone) return mod diff --git a/Lib/test/test_crossinterp.py b/Lib/test/test_crossinterp.py index cddacbc9970052..c54635eaeab3f9 100644 --- a/Lib/test/test_crossinterp.py +++ b/Lib/test/test_crossinterp.py @@ -5,6 +5,7 @@ import sys import types import unittest +import warnings from test.support import import_helper @@ -16,13 +17,281 @@ from test import _crossinterp_definitions as defs -BUILTIN_TYPES = [o for _, o in __builtins__.items() - if isinstance(o, type)] -EXCEPTION_TYPES = [cls for cls in BUILTIN_TYPES +@contextlib.contextmanager +def ignore_byteswarning(): + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=BytesWarning) + yield + + +# builtin types + +BUILTINS_TYPES = [o for _, o in __builtins__.items() if isinstance(o, type)] +EXCEPTION_TYPES = [cls for cls in BUILTINS_TYPES if issubclass(cls, BaseException)] OTHER_TYPES = [o for n, o in vars(types).items() if (isinstance(o, type) and - n not in ('DynamicClassAttribute', '_GeneratorWrapper'))] + n not in ('DynamicClassAttribute', '_GeneratorWrapper'))] +BUILTIN_TYPES = [ + *BUILTINS_TYPES, + *OTHER_TYPES, +] + +# builtin exceptions + +try: + raise Exception +except Exception as exc: + CAUGHT = exc +EXCEPTIONS_WITH_SPECIAL_SIG = { + BaseExceptionGroup: (lambda msg: (msg, [CAUGHT])), + ExceptionGroup: (lambda msg: (msg, [CAUGHT])), + UnicodeError: (lambda msg: (None, msg, None, None, None)), + UnicodeEncodeError: (lambda msg: ('utf-8', '', 1, 3, msg)), + UnicodeDecodeError: (lambda msg: ('utf-8', b'', 1, 3, msg)), + UnicodeTranslateError: (lambda msg: ('', 1, 3, msg)), +} +BUILTIN_EXCEPTIONS = [ + *(cls(*sig('error!')) for cls, sig in EXCEPTIONS_WITH_SPECIAL_SIG.items()), + *(cls('error!') for cls in EXCEPTION_TYPES + if cls not in EXCEPTIONS_WITH_SPECIAL_SIG), +] + +# other builtin objects + +METHOD = defs.SpamOkay().okay +BUILTIN_METHOD = [].append +METHOD_DESCRIPTOR_WRAPPER = str.join +METHOD_WRAPPER = object().__str__ +WRAPPER_DESCRIPTOR = object.__init__ +BUILTIN_WRAPPERS = { + METHOD: types.MethodType, + BUILTIN_METHOD: types.BuiltinMethodType, + dict.__dict__['fromkeys']: types.ClassMethodDescriptorType, + types.FunctionType.__code__: types.GetSetDescriptorType, + types.FunctionType.__globals__: types.MemberDescriptorType, + METHOD_DESCRIPTOR_WRAPPER: types.MethodDescriptorType, + METHOD_WRAPPER: types.MethodWrapperType, + WRAPPER_DESCRIPTOR: types.WrapperDescriptorType, + staticmethod(defs.SpamOkay.okay): None, + classmethod(defs.SpamOkay.okay): None, + property(defs.SpamOkay.okay): None, +} +BUILTIN_FUNCTIONS = [ + # types.BuiltinFunctionType + len, + sys.is_finalizing, + sys.exit, + _testinternalcapi.get_crossinterp_data, +] +assert 'emptymod' not in sys.modules +with import_helper.ready_to_import('emptymod', ''): + import emptymod as EMPTYMOD +MODULES = [ + sys, + defs, + unittest, + EMPTYMOD, +] +OBJECT = object() +EXCEPTION = Exception() +LAMBDA = (lambda: None) +BUILTIN_SIMPLE = [ + OBJECT, + # singletons + None, + True, + False, + Ellipsis, + NotImplemented, + # bytes + *(i.to_bytes(2, 'little', signed=True) + for i in range(-1, 258)), + # str + 'hello world', + '你好世界', + '', + # int + sys.maxsize + 1, + sys.maxsize, + -sys.maxsize - 1, + -sys.maxsize - 2, + *range(-1, 258), + 2**1000, + # float + 0.0, + 1.1, + -1.0, + 0.12345678, + -0.12345678, +] +TUPLE_EXCEPTION = (0, 1.0, EXCEPTION) +TUPLE_OBJECT = (0, 1.0, OBJECT) +TUPLE_NESTED_EXCEPTION = (0, 1.0, (EXCEPTION,)) +TUPLE_NESTED_OBJECT = (0, 1.0, (OBJECT,)) +MEMORYVIEW_EMPTY = memoryview(b'') +MEMORYVIEW_NOT_EMPTY = memoryview(b'spam'*42) +MAPPING_PROXY_EMPTY = types.MappingProxyType({}) +BUILTIN_CONTAINERS = [ + # tuple (flat) + (), + (1,), + ("hello", "world", ), + (1, True, "hello"), + TUPLE_EXCEPTION, + TUPLE_OBJECT, + # tuple (nested) + ((1,),), + ((1, 2), (3, 4)), + ((1, 2), (3, 4), (5, 6)), + TUPLE_NESTED_EXCEPTION, + TUPLE_NESTED_OBJECT, + # buffer + MEMORYVIEW_EMPTY, + MEMORYVIEW_NOT_EMPTY, + # list + [], + [1, 2, 3], + [[1], (2,), {3: 4}], + # dict + {}, + {1: 7, 2: 8, 3: 9}, + {1: [1], 2: (2,), 3: {3: 4}}, + # set + set(), + {1, 2, 3}, + {frozenset({1}), (2,)}, + # frozenset + frozenset([]), + frozenset({frozenset({1}), (2,)}), + # bytearray + bytearray(b''), + # other + MAPPING_PROXY_EMPTY, + types.SimpleNamespace(), +] +ns = {} +exec(""" +try: + raise Exception +except Exception as exc: + TRACEBACK = exc.__traceback__ + FRAME = TRACEBACK.tb_frame +""", ns, ns) +BUILTIN_OTHER = [ + # types.CellType + types.CellType(), + # types.FrameType + ns['FRAME'], + # types.TracebackType + ns['TRACEBACK'], +] +del ns + +# user-defined objects + +USER_TOP_INSTANCES = [c(*a) for c, a in defs.TOP_CLASSES.items()] +USER_NESTED_INSTANCES = [c(*a) for c, a in defs.NESTED_CLASSES.items()] +USER_INSTANCES = [ + *USER_TOP_INSTANCES, + *USER_NESTED_INSTANCES, +] +USER_EXCEPTIONS = [ + defs.MimimalError('error!'), +] + +# shareable objects + +TUPLES_WITHOUT_EQUALITY = [ + TUPLE_EXCEPTION, + TUPLE_OBJECT, + TUPLE_NESTED_EXCEPTION, + TUPLE_NESTED_OBJECT, +] +_UNSHAREABLE_SIMPLE = [ + Ellipsis, + NotImplemented, + OBJECT, + sys.maxsize + 1, + -sys.maxsize - 2, + 2**1000, +] +with ignore_byteswarning(): + _SHAREABLE_SIMPLE = [o for o in BUILTIN_SIMPLE + if o not in _UNSHAREABLE_SIMPLE] + _SHAREABLE_CONTAINERS = [ + *(o for o in BUILTIN_CONTAINERS if type(o) is memoryview), + *(o for o in BUILTIN_CONTAINERS + if type(o) is tuple and o not in TUPLES_WITHOUT_EQUALITY), + ] + _UNSHAREABLE_CONTAINERS = [o for o in BUILTIN_CONTAINERS + if o not in _SHAREABLE_CONTAINERS] +SHAREABLE = [ + *_SHAREABLE_SIMPLE, + *_SHAREABLE_CONTAINERS, +] +NOT_SHAREABLE = [ + *_UNSHAREABLE_SIMPLE, + *_UNSHAREABLE_CONTAINERS, + *BUILTIN_TYPES, + *BUILTIN_WRAPPERS, + *BUILTIN_EXCEPTIONS, + *BUILTIN_FUNCTIONS, + *MODULES, + *BUILTIN_OTHER, + # types.CodeType + *(f.__code__ for f in defs.FUNCTIONS), + *(f.__code__ for f in defs.FUNCTION_LIKE), + # types.FunctionType + *defs.FUNCTIONS, + defs.SpamOkay.okay, + LAMBDA, + *defs.FUNCTION_LIKE, + # coroutines and generators + *defs.FUNCTION_LIKE_APPLIED, + # user classes + *defs.CLASSES, + *USER_INSTANCES, + # user exceptions + *USER_EXCEPTIONS, +] + +# pickleable objects + +PICKLEABLE = [ + *BUILTIN_SIMPLE, + *(o for o in BUILTIN_CONTAINERS if o not in [ + MEMORYVIEW_EMPTY, + MEMORYVIEW_NOT_EMPTY, + MAPPING_PROXY_EMPTY, + ] or type(o) is dict), + *BUILTINS_TYPES, + *BUILTIN_EXCEPTIONS, + *BUILTIN_FUNCTIONS, + *defs.TOP_FUNCTIONS, + defs.SpamOkay.okay, + *defs.FUNCTION_LIKE, + *defs.TOP_CLASSES, + *USER_TOP_INSTANCES, + *USER_EXCEPTIONS, + # from OTHER_TYPES + types.NoneType, + types.EllipsisType, + types.NotImplementedType, + types.GenericAlias, + types.UnionType, + types.SimpleNamespace, + # from BUILTIN_WRAPPERS + METHOD, + BUILTIN_METHOD, + METHOD_DESCRIPTOR_WRAPPER, + METHOD_WRAPPER, + WRAPPER_DESCRIPTOR, +] +assert not any(isinstance(o, types.MappingProxyType) for o in PICKLEABLE) + + +# helpers DEFS = defs with open(code_defs.__file__) as infile: @@ -111,6 +380,77 @@ class _GetXIDataTests(unittest.TestCase): MODE = None + def assert_functions_equal(self, func1, func2): + assert type(func1) is types.FunctionType, repr(func1) + assert type(func2) is types.FunctionType, repr(func2) + self.assertEqual(func1.__name__, func2.__name__) + self.assertEqual(func1.__code__, func2.__code__) + self.assertEqual(func1.__defaults__, func2.__defaults__) + self.assertEqual(func1.__kwdefaults__, func2.__kwdefaults__) + # We don't worry about __globals__ for now. + + def assert_exc_args_equal(self, exc1, exc2): + args1 = exc1.args + args2 = exc2.args + if isinstance(exc1, ExceptionGroup): + self.assertIs(type(args1), type(args2)) + self.assertEqual(len(args1), 2) + self.assertEqual(len(args1), len(args2)) + self.assertEqual(args1[0], args2[0]) + group1 = args1[1] + group2 = args2[1] + self.assertEqual(len(group1), len(group2)) + for grouped1, grouped2 in zip(group1, group2): + # Currently the "extra" attrs are not preserved + # (via __reduce__). + self.assertIs(type(exc1), type(exc2)) + self.assert_exc_equal(grouped1, grouped2) + else: + self.assertEqual(args1, args2) + + def assert_exc_equal(self, exc1, exc2): + self.assertIs(type(exc1), type(exc2)) + + if type(exc1).__eq__ is not object.__eq__: + self.assertEqual(exc1, exc2) + + self.assert_exc_args_equal(exc1, exc2) + # XXX For now we do not preserve tracebacks. + if exc1.__traceback__ is not None: + self.assertEqual(exc1.__traceback__, exc2.__traceback__) + self.assertEqual( + getattr(exc1, '__notes__', None), + getattr(exc2, '__notes__', None), + ) + # We assume there are no cycles. + if exc1.__cause__ is None: + self.assertIs(exc1.__cause__, exc2.__cause__) + else: + self.assert_exc_equal(exc1.__cause__, exc2.__cause__) + if exc1.__context__ is None: + self.assertIs(exc1.__context__, exc2.__context__) + else: + self.assert_exc_equal(exc1.__context__, exc2.__context__) + + def assert_equal_or_equalish(self, obj, expected): + cls = type(expected) + if cls.__eq__ is not object.__eq__: + self.assertEqual(obj, expected) + elif cls is types.FunctionType: + self.assert_functions_equal(obj, expected) + elif isinstance(expected, BaseException): + self.assert_exc_equal(obj, expected) + elif cls is types.MethodType: + raise NotImplementedError(cls) + elif cls is types.BuiltinMethodType: + raise NotImplementedError(cls) + elif cls is types.MethodWrapperType: + raise NotImplementedError(cls) + elif cls.__bases__ == (object,): + self.assertEqual(obj.__dict__, expected.__dict__) + else: + raise NotImplementedError(cls) + def get_xidata(self, obj, *, mode=None): mode = self._resolve_mode(mode) return _testinternalcapi.get_crossinterp_data(obj, mode) @@ -126,35 +466,37 @@ def _get_roundtrip(self, obj, mode): def assert_roundtrip_identical(self, values, *, mode=None): mode = self._resolve_mode(mode) for obj in values: - with self.subTest(obj): + with self.subTest(repr(obj)): got = self._get_roundtrip(obj, mode) self.assertIs(got, obj) def assert_roundtrip_equal(self, values, *, mode=None, expecttype=None): mode = self._resolve_mode(mode) for obj in values: - with self.subTest(obj): + with self.subTest(repr(obj)): got = self._get_roundtrip(obj, mode) - self.assertEqual(got, obj) + if got is obj: + continue self.assertIs(type(got), type(obj) if expecttype is None else expecttype) + self.assert_equal_or_equalish(got, obj) def assert_roundtrip_equal_not_identical(self, values, *, mode=None, expecttype=None): mode = self._resolve_mode(mode) for obj in values: - with self.subTest(obj): + with self.subTest(repr(obj)): got = self._get_roundtrip(obj, mode) self.assertIsNot(got, obj) self.assertIs(type(got), type(obj) if expecttype is None else expecttype) - self.assertEqual(got, obj) + self.assert_equal_or_equalish(got, obj) def assert_roundtrip_not_equal(self, values, *, mode=None, expecttype=None): mode = self._resolve_mode(mode) for obj in values: - with self.subTest(obj): + with self.subTest(repr(obj)): got = self._get_roundtrip(obj, mode) self.assertIsNot(got, obj) self.assertIs(type(got), @@ -164,7 +506,7 @@ def assert_roundtrip_not_equal(self, values, *, def assert_not_shareable(self, values, exctype=None, *, mode=None): mode = self._resolve_mode(mode) for obj in values: - with self.subTest(obj): + with self.subTest(repr(obj)): with self.assertRaises(NotShareableError) as cm: _testinternalcapi.get_crossinterp_data(obj, mode) if exctype is not None: @@ -182,49 +524,26 @@ class PickleTests(_GetXIDataTests): MODE = 'pickle' def test_shareable(self): - self.assert_roundtrip_equal([ - # singletons - None, - True, - False, - # bytes - *(i.to_bytes(2, 'little', signed=True) - for i in range(-1, 258)), - # str - 'hello world', - '你好世界', - '', - # int - sys.maxsize, - -sys.maxsize - 1, - *range(-1, 258), - # float - 0.0, - 1.1, - -1.0, - 0.12345678, - -0.12345678, - # tuple - (), - (1,), - ("hello", "world", ), - (1, True, "hello"), - ((1,),), - ((1, 2), (3, 4)), - ((1, 2), (3, 4), (5, 6)), - ]) - # not shareable using xidata - self.assert_roundtrip_equal([ - # int - sys.maxsize + 1, - -sys.maxsize - 2, - 2**1000, - # tuple - (0, 1.0, []), - (0, 1.0, {}), - (0, 1.0, ([],)), - (0, 1.0, ({},)), - ]) + with ignore_byteswarning(): + for obj in SHAREABLE: + if obj in PICKLEABLE: + self.assert_roundtrip_equal([obj]) + else: + self.assert_not_shareable([obj]) + + def test_not_shareable(self): + with ignore_byteswarning(): + for obj in NOT_SHAREABLE: + if type(obj) is types.MappingProxyType: + self.assert_not_shareable([obj]) + elif obj in PICKLEABLE: + with self.subTest(repr(obj)): + # We don't worry about checking the actual value. + # The other tests should cover that well enough. + got = self.get_roundtrip(obj) + self.assertIs(type(got), type(obj)) + else: + self.assert_not_shareable([obj]) def test_list(self): self.assert_roundtrip_equal_not_identical([ @@ -266,7 +585,7 @@ def assert_class_defs_same(self, defs): if cls not in defs.CLASSES_WITHOUT_EQUALITY: continue instances.append(cls(*args)) - self.assert_roundtrip_not_equal(instances) + self.assert_roundtrip_equal(instances) def assert_class_defs_other_pickle(self, defs, mod): # Pickle relative to a different module than the original. @@ -286,7 +605,7 @@ def assert_class_defs_other_unpickle(self, defs, mod, *, fail=False): instances = [] for cls, args in defs.TOP_CLASSES.items(): - with self.subTest(cls): + with self.subTest(repr(cls)): setattr(mod, cls.__name__, cls) xid = self.get_xidata(cls) inst = cls(*args) @@ -295,7 +614,7 @@ def assert_class_defs_other_unpickle(self, defs, mod, *, fail=False): (cls, xid, inst, instxid)) for cls, xid, inst, instxid in instances: - with self.subTest(cls): + with self.subTest(repr(cls)): delattr(mod, cls.__name__) if fail: with self.assertRaises(NotShareableError): @@ -403,13 +722,13 @@ def assert_func_defs_same(self, defs): def assert_func_defs_other_pickle(self, defs, mod): # Pickle relative to a different module than the original. for func in defs.TOP_FUNCTIONS: - assert not hasattr(mod, func.__name__), (cls, getattr(mod, func.__name__)) + assert not hasattr(mod, func.__name__), (getattr(mod, func.__name__),) self.assert_not_shareable(defs.TOP_FUNCTIONS) def assert_func_defs_other_unpickle(self, defs, mod, *, fail=False): # Unpickle relative to a different module than the original. for func in defs.TOP_FUNCTIONS: - assert not hasattr(mod, func.__name__), (cls, getattr(mod, func.__name__)) + assert not hasattr(mod, func.__name__), (getattr(mod, func.__name__),) captured = [] for func in defs.TOP_FUNCTIONS: @@ -434,7 +753,7 @@ def assert_func_defs_not_shareable(self, defs): self.assert_not_shareable(defs.TOP_FUNCTIONS) def test_user_function_normal(self): -# self.assert_roundtrip_equal(defs.TOP_FUNCTIONS) + self.assert_roundtrip_equal(defs.TOP_FUNCTIONS) self.assert_func_defs_same(defs) def test_user_func_in___main__(self): @@ -505,7 +824,7 @@ def test_nested_function(self): # exceptions def test_user_exception_normal(self): - self.assert_roundtrip_not_equal([ + self.assert_roundtrip_equal([ defs.MimimalError('error!'), ]) self.assert_roundtrip_equal_not_identical([ @@ -521,7 +840,7 @@ def test_builtin_exception(self): special = { BaseExceptionGroup: (msg, [caught]), ExceptionGroup: (msg, [caught]), -# UnicodeError: (None, msg, None, None, None), + UnicodeError: (None, msg, None, None, None), UnicodeEncodeError: ('utf-8', '', 1, 3, msg), UnicodeDecodeError: ('utf-8', b'', 1, 3, msg), UnicodeTranslateError: ('', 1, 3, msg), @@ -531,7 +850,7 @@ def test_builtin_exception(self): args = special.get(cls) or (msg,) exceptions.append(cls(*args)) - self.assert_roundtrip_not_equal(exceptions) + self.assert_roundtrip_equal(exceptions) class MarshalTests(_GetXIDataTests): @@ -576,7 +895,7 @@ def test_simple_builtin_objects(self): '', ]) self.assert_not_shareable([ - object(), + OBJECT, types.SimpleNamespace(), ]) @@ -647,10 +966,7 @@ def test_builtin_type(self): shareable = [ StopIteration, ] - types = [ - *BUILTIN_TYPES, - *OTHER_TYPES, - ] + types = BUILTIN_TYPES self.assert_not_shareable(cls for cls in types if cls not in shareable) self.assert_roundtrip_identical(cls for cls in types @@ -763,7 +1079,7 @@ class ShareableFuncTests(_GetXIDataTests): MODE = 'func' def test_stateless(self): - self.assert_roundtrip_not_equal([ + self.assert_roundtrip_equal([ *defs.STATELESS_FUNCTIONS, # Generators can be stateless too. *defs.FUNCTION_LIKE, @@ -912,10 +1228,49 @@ def test_impure_script_function(self): ], expecttype=types.CodeType) +class ShareableFallbackTests(_GetXIDataTests): + + MODE = 'fallback' + + def test_shareable(self): + self.assert_roundtrip_equal(SHAREABLE) + + def test_not_shareable(self): + okay = [ + *PICKLEABLE, + *defs.STATELESS_FUNCTIONS, + LAMBDA, + ] + ignored = [ + *TUPLES_WITHOUT_EQUALITY, + OBJECT, + METHOD, + BUILTIN_METHOD, + METHOD_WRAPPER, + ] + with ignore_byteswarning(): + self.assert_roundtrip_equal([ + *(o for o in NOT_SHAREABLE + if o in okay and o not in ignored + and o is not MAPPING_PROXY_EMPTY), + ]) + self.assert_roundtrip_not_equal([ + *(o for o in NOT_SHAREABLE + if o in ignored and o is not MAPPING_PROXY_EMPTY), + ]) + self.assert_not_shareable([ + *(o for o in NOT_SHAREABLE if o not in okay), + MAPPING_PROXY_EMPTY, + ]) + + class ShareableTypeTests(_GetXIDataTests): MODE = 'xidata' + def test_shareable(self): + self.assert_roundtrip_equal(SHAREABLE) + def test_singletons(self): self.assert_roundtrip_identical([ None, @@ -983,8 +1338,8 @@ def test_tuple(self): def test_tuples_containing_non_shareable_types(self): non_shareables = [ - Exception(), - object(), + EXCEPTION, + OBJECT, ] for s in non_shareables: value = tuple([0, 1.0, s]) @@ -999,6 +1354,9 @@ def test_tuples_containing_non_shareable_types(self): # The rest are not shareable. + def test_not_shareable(self): + self.assert_not_shareable(NOT_SHAREABLE) + def test_object(self): self.assert_not_shareable([ object(), @@ -1015,12 +1373,12 @@ def test_function_object(self): for func in defs.FUNCTIONS: assert type(func) is types.FunctionType, func assert type(defs.SpamOkay.okay) is types.FunctionType, func - assert type(lambda: None) is types.LambdaType + assert type(LAMBDA) is types.LambdaType self.assert_not_shareable([ *defs.FUNCTIONS, defs.SpamOkay.okay, - (lambda: None), + LAMBDA, ]) def test_builtin_function(self): @@ -1085,10 +1443,7 @@ def test_class(self): self.assert_not_shareable(instances) def test_builtin_type(self): - self.assert_not_shareable([ - *BUILTIN_TYPES, - *OTHER_TYPES, - ]) + self.assert_not_shareable(BUILTIN_TYPES) def test_exception(self): self.assert_not_shareable([ @@ -1127,7 +1482,7 @@ def test_builtin_objects(self): """, ns, ns) self.assert_not_shareable([ - types.MappingProxyType({}), + MAPPING_PROXY_EMPTY, types.SimpleNamespace(), # types.CellType types.CellType(), diff --git a/Modules/_interpchannelsmodule.c b/Modules/_interpchannelsmodule.c index 172cebcaa4884f..f9fa1dab291056 100644 --- a/Modules/_interpchannelsmodule.c +++ b/Modules/_interpchannelsmodule.c @@ -1779,7 +1779,7 @@ channel_send(_channels *channels, int64_t cid, PyObject *obj, PyThread_release_lock(mutex); return -1; } - if (_PyObject_GetXIData(tstate, obj, data) != 0) { + if (_PyObject_GetXIDataNoFallback(tstate, obj, data) != 0) { PyThread_release_lock(mutex); GLOBAL_FREE(data); return -1; @@ -2694,7 +2694,7 @@ add_channelid_type(PyObject *mod) Py_DECREF(cls); return NULL; } - if (ensure_xid_class(cls, _channelid_shared) < 0) { + if (ensure_xid_class(cls, GETDATA(_channelid_shared)) < 0) { Py_DECREF(cls); return NULL; } @@ -2797,12 +2797,12 @@ set_channelend_types(PyObject *mod, PyTypeObject *send, PyTypeObject *recv) // Add and register the types. state->send_channel_type = (PyTypeObject *)Py_NewRef(send); state->recv_channel_type = (PyTypeObject *)Py_NewRef(recv); - if (ensure_xid_class(send, _channelend_shared) < 0) { + if (ensure_xid_class(send, GETDATA(_channelend_shared)) < 0) { Py_CLEAR(state->send_channel_type); Py_CLEAR(state->recv_channel_type); return -1; } - if (ensure_xid_class(recv, _channelend_shared) < 0) { + if (ensure_xid_class(recv, GETDATA(_channelend_shared)) < 0) { (void)clear_xid_class(state->send_channel_type); Py_CLEAR(state->send_channel_type); Py_CLEAR(state->recv_channel_type); diff --git a/Modules/_interpqueuesmodule.c b/Modules/_interpqueuesmodule.c index 526249a0e1aec3..209fcdfd0cd01e 100644 --- a/Modules/_interpqueuesmodule.c +++ b/Modules/_interpqueuesmodule.c @@ -1143,7 +1143,7 @@ queue_put(_queues *queues, int64_t qid, PyObject *obj, int fmt, int unboundop) _queue_unmark_waiter(queue, queues->mutex); return -1; } - if (_PyObject_GetXIData(tstate, obj, data) != 0) { + if (_PyObject_GetXIDataNoFallback(tstate, obj, data) != 0) { _queue_unmark_waiter(queue, queues->mutex); GLOBAL_FREE(data); return -1; @@ -1270,7 +1270,7 @@ set_external_queue_type(module_state *state, PyTypeObject *queue_type) } // Add and register the new type. - if (ensure_xid_class(queue_type, _queueobj_shared) < 0) { + if (ensure_xid_class(queue_type, GETDATA(_queueobj_shared)) < 0) { return -1; } state->queue_type = (PyTypeObject *)Py_NewRef(queue_type); diff --git a/Modules/_interpreters_common.h b/Modules/_interpreters_common.h index edd65577284a20..d73cbca36359c7 100644 --- a/Modules/_interpreters_common.h +++ b/Modules/_interpreters_common.h @@ -5,8 +5,10 @@ _RESOLVE_MODINIT_FUNC_NAME(NAME) +#define GETDATA(FUNC) ((_PyXIData_getdata_t){.basic=FUNC}) + static int -ensure_xid_class(PyTypeObject *cls, xidatafunc getdata) +ensure_xid_class(PyTypeObject *cls, _PyXIData_getdata_t getdata) { PyThreadState *tstate = PyThreadState_Get(); return _PyXIData_RegisterClass(tstate, cls, getdata); diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index 77678f7c126005..f3c571e717fd0e 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -286,7 +286,7 @@ register_memoryview_xid(PyObject *mod, PyTypeObject **p_state) *p_state = cls; // Register XID for the builtin memoryview type. - if (ensure_xid_class(&PyMemoryView_Type, _pybuffer_shared) < 0) { + if (ensure_xid_class(&PyMemoryView_Type, GETDATA(_pybuffer_shared)) < 0) { return -1; } // We don't ever bother un-registering memoryview. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 76bd76cc6b2490..136e6a7a015049 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1991,7 +1991,14 @@ get_crossinterp_data(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } if (strcmp(mode, "xidata") == 0) { - if (_PyObject_GetXIData(tstate, obj, xidata) != 0) { + if (_PyObject_GetXIDataNoFallback(tstate, obj, xidata) != 0) { + goto error; + } + } + else if (strcmp(mode, "fallback") == 0) { + xidata_fallback_t fallback = _PyXIDATA_FULL_FALLBACK; + if (_PyObject_GetXIData(tstate, obj, fallback, xidata) != 0) + { goto error; } } diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 725d6009f84014..dc67de4a40849d 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -210,16 +210,16 @@ _Py_CallInInterpreterAndRawFree(PyInterpreterState *interp, /* cross-interpreter data */ /**************************/ -/* registry of {type -> xidatafunc} */ +/* registry of {type -> _PyXIData_getdata_t} */ -/* For now we use a global registry of shareable classes. An - alternative would be to add a tp_* slot for a class's - xidatafunc. It would be simpler and more efficient. */ +/* For now we use a global registry of shareable classes. + An alternative would be to add a tp_* slot for a class's + _PyXIData_getdata_t. It would be simpler and more efficient. */ static void xid_lookup_init(_PyXIData_lookup_t *); static void xid_lookup_fini(_PyXIData_lookup_t *); struct _dlcontext; -static xidatafunc lookup_getdata(struct _dlcontext *, PyObject *); +static _PyXIData_getdata_t lookup_getdata(struct _dlcontext *, PyObject *); #include "crossinterp_data_lookup.h" @@ -343,7 +343,7 @@ _set_xid_lookup_failure(PyThreadState *tstate, PyObject *obj, const char *msg, set_notshareableerror(tstate, cause, 0, msg); } else { - msg = "%S does not support cross-interpreter data"; + msg = "%R does not support cross-interpreter data"; format_notshareableerror(tstate, cause, 0, msg, obj); } } @@ -356,8 +356,8 @@ _PyObject_CheckXIData(PyThreadState *tstate, PyObject *obj) if (get_lookup_context(tstate, &ctx) < 0) { return -1; } - xidatafunc getdata = lookup_getdata(&ctx, obj); - if (getdata == NULL) { + _PyXIData_getdata_t getdata = lookup_getdata(&ctx, obj); + if (getdata.basic == NULL && getdata.fallback == NULL) { if (!_PyErr_Occurred(tstate)) { _set_xid_lookup_failure(tstate, obj, NULL, NULL); } @@ -388,9 +388,9 @@ _check_xidata(PyThreadState *tstate, _PyXIData_t *xidata) return 0; } -int -_PyObject_GetXIData(PyThreadState *tstate, - PyObject *obj, _PyXIData_t *xidata) +static int +_get_xidata(PyThreadState *tstate, + PyObject *obj, xidata_fallback_t fallback, _PyXIData_t *xidata) { PyInterpreterState *interp = tstate->interp; @@ -398,6 +398,7 @@ _PyObject_GetXIData(PyThreadState *tstate, assert(xidata->obj == NULL); if (xidata->data != NULL || xidata->obj != NULL) { _PyErr_SetString(tstate, PyExc_ValueError, "xidata not cleared"); + return -1; } // Call the "getdata" func for the object. @@ -406,8 +407,8 @@ _PyObject_GetXIData(PyThreadState *tstate, return -1; } Py_INCREF(obj); - xidatafunc getdata = lookup_getdata(&ctx, obj); - if (getdata == NULL) { + _PyXIData_getdata_t getdata = lookup_getdata(&ctx, obj); + if (getdata.basic == NULL && getdata.fallback == NULL) { if (PyErr_Occurred()) { Py_DECREF(obj); return -1; @@ -419,7 +420,9 @@ _PyObject_GetXIData(PyThreadState *tstate, } return -1; } - int res = getdata(tstate, obj, xidata); + int res = getdata.basic != NULL + ? getdata.basic(tstate, obj, xidata) + : getdata.fallback(tstate, obj, fallback, xidata); Py_DECREF(obj); if (res != 0) { PyObject *cause = _PyErr_GetRaisedException(tstate); @@ -439,6 +442,51 @@ _PyObject_GetXIData(PyThreadState *tstate, return 0; } +int +_PyObject_GetXIDataNoFallback(PyThreadState *tstate, + PyObject *obj, _PyXIData_t *xidata) +{ + return _get_xidata(tstate, obj, _PyXIDATA_XIDATA_ONLY, xidata); +} + +int +_PyObject_GetXIData(PyThreadState *tstate, + PyObject *obj, xidata_fallback_t fallback, + _PyXIData_t *xidata) +{ + switch (fallback) { + case _PyXIDATA_XIDATA_ONLY: + return _get_xidata(tstate, obj, fallback, xidata); + case _PyXIDATA_FULL_FALLBACK: + if (_get_xidata(tstate, obj, fallback, xidata) == 0) { + return 0; + } + PyObject *exc = _PyErr_GetRaisedException(tstate); + if (PyFunction_Check(obj)) { + if (_PyFunction_GetXIData(tstate, obj, xidata) == 0) { + Py_DECREF(exc); + return 0; + } + _PyErr_Clear(tstate); + } + // We could try _PyMarshal_GetXIData() but we won't for now. + if (_PyPickle_GetXIData(tstate, obj, xidata) == 0) { + Py_DECREF(exc); + return 0; + } + // Raise the original exception. + _PyErr_SetRaisedException(tstate, exc); + return -1; + default: +#ifdef Py_DEBUG + Py_FatalError("unsupported xidata fallback option"); +#endif + _PyErr_SetString(tstate, PyExc_SystemError, + "unsupported xidata fallback option"); + return -1; + } +} + /* pickle C-API */ @@ -1617,14 +1665,9 @@ _PyXI_ApplyErrorCode(_PyXI_errcode code, PyInterpreterState *interp) PyThreadState *tstate = _PyThreadState_GET(); assert(!PyErr_Occurred()); + assert(code != _PyXI_ERR_NO_ERROR); + assert(code != _PyXI_ERR_UNCAUGHT_EXCEPTION); switch (code) { - case _PyXI_ERR_NO_ERROR: _Py_FALLTHROUGH; - case _PyXI_ERR_UNCAUGHT_EXCEPTION: - // There is nothing to apply. -#ifdef Py_DEBUG - Py_UNREACHABLE(); -#endif - return 0; case _PyXI_ERR_OTHER: // XXX msg? PyErr_SetNone(PyExc_InterpreterError); @@ -1649,7 +1692,7 @@ _PyXI_ApplyErrorCode(_PyXI_errcode code, PyInterpreterState *interp) break; default: #ifdef Py_DEBUG - Py_UNREACHABLE(); + Py_FatalError("unsupported error code"); #else PyErr_Format(PyExc_RuntimeError, "unsupported error code %d", code); #endif @@ -1796,7 +1839,7 @@ _sharednsitem_set_value(_PyXI_namespace_item *item, PyObject *value) return -1; } PyThreadState *tstate = PyThreadState_Get(); - if (_PyObject_GetXIData(tstate, value, item->xidata) != 0) { + if (_PyObject_GetXIDataNoFallback(tstate, value, item->xidata) != 0) { PyMem_RawFree(item->xidata); item->xidata = NULL; // The caller may want to propagate PyExc_NotShareableError diff --git a/Python/crossinterp_data_lookup.h b/Python/crossinterp_data_lookup.h index d69927dbcd387f..88eb41da89ee40 100644 --- a/Python/crossinterp_data_lookup.h +++ b/Python/crossinterp_data_lookup.h @@ -12,7 +12,8 @@ typedef _PyXIData_regitem_t dlregitem_t; // forward static void _xidregistry_init(dlregistry_t *); static void _xidregistry_fini(dlregistry_t *); -static xidatafunc _lookup_getdata_from_registry(dlcontext_t *, PyObject *); +static _PyXIData_getdata_t _lookup_getdata_from_registry( + dlcontext_t *, PyObject *); /* used in crossinterp.c */ @@ -49,7 +50,7 @@ get_lookup_context(PyThreadState *tstate, dlcontext_t *res) return 0; } -static xidatafunc +static _PyXIData_getdata_t lookup_getdata(dlcontext_t *ctx, PyObject *obj) { /* Cross-interpreter objects are looked up by exact match on the class. @@ -88,24 +89,24 @@ _PyXIData_FormatNotShareableError(PyThreadState *tstate, } -xidatafunc +_PyXIData_getdata_t _PyXIData_Lookup(PyThreadState *tstate, PyObject *obj) { dlcontext_t ctx; if (get_lookup_context(tstate, &ctx) < 0) { - return NULL; + return (_PyXIData_getdata_t){0}; } return lookup_getdata(&ctx, obj); } /***********************************************/ -/* a registry of {type -> xidatafunc} */ +/* a registry of {type -> _PyXIData_getdata_t} */ /***********************************************/ -/* For now we use a global registry of shareable classes. An - alternative would be to add a tp_* slot for a class's - xidatafunc. It would be simpler and more efficient. */ +/* For now we use a global registry of shareable classes. + An alternative would be to add a tp_* slot for a class's + _PyXIData_getdata_t. It would be simpler and more efficient. */ /* registry lifecycle */ @@ -200,7 +201,7 @@ _xidregistry_find_type(dlregistry_t *xidregistry, PyTypeObject *cls) return NULL; } -static xidatafunc +static _PyXIData_getdata_t _lookup_getdata_from_registry(dlcontext_t *ctx, PyObject *obj) { PyTypeObject *cls = Py_TYPE(obj); @@ -209,10 +210,12 @@ _lookup_getdata_from_registry(dlcontext_t *ctx, PyObject *obj) _xidregistry_lock(xidregistry); dlregitem_t *matched = _xidregistry_find_type(xidregistry, cls); - xidatafunc func = matched != NULL ? matched->getdata : NULL; + _PyXIData_getdata_t getdata = matched != NULL + ? matched->getdata + : (_PyXIData_getdata_t){0}; _xidregistry_unlock(xidregistry); - return func; + return getdata; } @@ -220,12 +223,13 @@ _lookup_getdata_from_registry(dlcontext_t *ctx, PyObject *obj) static int _xidregistry_add_type(dlregistry_t *xidregistry, - PyTypeObject *cls, xidatafunc getdata) + PyTypeObject *cls, _PyXIData_getdata_t getdata) { dlregitem_t *newhead = PyMem_RawMalloc(sizeof(dlregitem_t)); if (newhead == NULL) { return -1; } + assert((getdata.basic == NULL) != (getdata.fallback == NULL)); *newhead = (dlregitem_t){ // We do not keep a reference, to avoid keeping the class alive. .cls = cls, @@ -283,13 +287,13 @@ _xidregistry_clear(dlregistry_t *xidregistry) int _PyXIData_RegisterClass(PyThreadState *tstate, - PyTypeObject *cls, xidatafunc getdata) + PyTypeObject *cls, _PyXIData_getdata_t getdata) { if (!PyType_Check(cls)) { PyErr_Format(PyExc_ValueError, "only classes may be registered"); return -1; } - if (getdata == NULL) { + if (getdata.basic == NULL && getdata.fallback == NULL) { PyErr_Format(PyExc_ValueError, "missing 'getdata' func"); return -1; } @@ -304,7 +308,8 @@ _PyXIData_RegisterClass(PyThreadState *tstate, dlregitem_t *matched = _xidregistry_find_type(xidregistry, cls); if (matched != NULL) { - assert(matched->getdata == getdata); + assert(matched->getdata.basic == getdata.basic); + assert(matched->getdata.fallback == getdata.fallback); matched->refcount += 1; goto finally; } @@ -608,7 +613,8 @@ _tuple_shared_free(void* data) } static int -_tuple_shared(PyThreadState *tstate, PyObject *obj, _PyXIData_t *xidata) +_tuple_shared(PyThreadState *tstate, PyObject *obj, xidata_fallback_t fallback, + _PyXIData_t *xidata) { Py_ssize_t len = PyTuple_GET_SIZE(obj); if (len < 0) { @@ -636,7 +642,7 @@ _tuple_shared(PyThreadState *tstate, PyObject *obj, _PyXIData_t *xidata) int res = -1; if (!_Py_EnterRecursiveCallTstate(tstate, " while sharing a tuple")) { - res = _PyObject_GetXIData(tstate, item, xidata_i); + res = _PyObject_GetXIData(tstate, item, fallback, xidata_i); _Py_LeaveRecursiveCallTstate(tstate); } if (res < 0) { @@ -737,40 +743,48 @@ _PyFunction_GetXIData(PyThreadState *tstate, PyObject *func, static void _register_builtins_for_crossinterpreter_data(dlregistry_t *xidregistry) { +#define REGISTER(TYPE, GETDATA) \ + _xidregistry_add_type(xidregistry, (PyTypeObject *)TYPE, \ + ((_PyXIData_getdata_t){.basic=(GETDATA)})) +#define REGISTER_FALLBACK(TYPE, GETDATA) \ + _xidregistry_add_type(xidregistry, (PyTypeObject *)TYPE, \ + ((_PyXIData_getdata_t){.fallback=(GETDATA)})) // None - if (_xidregistry_add_type(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) { + if (REGISTER(Py_TYPE(Py_None), _none_shared) != 0) { Py_FatalError("could not register None for cross-interpreter sharing"); } // int - if (_xidregistry_add_type(xidregistry, &PyLong_Type, _long_shared) != 0) { + if (REGISTER(&PyLong_Type, _long_shared) != 0) { Py_FatalError("could not register int for cross-interpreter sharing"); } // bytes - if (_xidregistry_add_type(xidregistry, &PyBytes_Type, _PyBytes_GetXIData) != 0) { + if (REGISTER(&PyBytes_Type, _PyBytes_GetXIData) != 0) { Py_FatalError("could not register bytes for cross-interpreter sharing"); } // str - if (_xidregistry_add_type(xidregistry, &PyUnicode_Type, _str_shared) != 0) { + if (REGISTER(&PyUnicode_Type, _str_shared) != 0) { Py_FatalError("could not register str for cross-interpreter sharing"); } // bool - if (_xidregistry_add_type(xidregistry, &PyBool_Type, _bool_shared) != 0) { + if (REGISTER(&PyBool_Type, _bool_shared) != 0) { Py_FatalError("could not register bool for cross-interpreter sharing"); } // float - if (_xidregistry_add_type(xidregistry, &PyFloat_Type, _float_shared) != 0) { + if (REGISTER(&PyFloat_Type, _float_shared) != 0) { Py_FatalError("could not register float for cross-interpreter sharing"); } // tuple - if (_xidregistry_add_type(xidregistry, &PyTuple_Type, _tuple_shared) != 0) { + if (REGISTER_FALLBACK(&PyTuple_Type, _tuple_shared) != 0) { Py_FatalError("could not register tuple for cross-interpreter sharing"); } // For now, we do not register PyCode_Type or PyFunction_Type. +#undef REGISTER +#undef REGISTER_FALLBACK } From c612a4d2c067aedc6b8bc3fc694758cd16ec4944 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 17:13:13 +0200 Subject: [PATCH 0181/1674] [3.14] gh-133982: Update test_bufio to use self.open (gh-133983) (gh-134428) (cherry picked from commit 84d5f8d799dbbf86248375b6edbbcf4a022788c4) Co-authored-by: Cody Maloney --- Lib/test/test_bufio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_bufio.py b/Lib/test/test_bufio.py index dc9a82dc635318..cb9cb4d0bc7e9c 100644 --- a/Lib/test/test_bufio.py +++ b/Lib/test/test_bufio.py @@ -28,7 +28,7 @@ def try_one(self, s): f.write(b"\n") f.write(s) f.close() - f = open(os_helper.TESTFN, "rb") + f = self.open(os_helper.TESTFN, "rb") line = f.readline() self.assertEqual(line, s + b"\n") line = f.readline() From 74dde92903769b77843152a3603f0e50845ccc81 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 17:13:43 +0200 Subject: [PATCH 0182/1674] [3.14] gh-71253: Match _io exception in _pyio (gh-133985) (gh-134430) Test was only testing _io, expanded to cover _pyio. (cherry picked from commit 06eaf4055c1d7359e129efb65b94f34d2ec51a57) Co-authored-by: Cody Maloney Co-authored-by: Peter Bierma --- Lib/_pyio.py | 3 ++- Lib/test/test_io.py | 4 ++-- .../Library/2025-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index a870de5b532542..f79674fb7a9f5e 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1563,7 +1563,8 @@ def __init__(self, file, mode='r', closefd=True, opener=None): if not isinstance(fd, int): raise TypeError('expected integer from opener') if fd < 0: - raise OSError('Negative file descriptor') + # bpo-27066: Raise a ValueError for bad value. + raise ValueError(f'opener returned {fd}') owned_fd = fd if not noinherit_flag: os.set_inheritable(fd, False) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 90680c6d47ab41..4625e3a01faa7b 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -918,7 +918,7 @@ def test_bad_opener_negative_1(self): def badopener(fname, flags): return -1 with self.assertRaises(ValueError) as cm: - open('non-existent', 'r', opener=badopener) + self.open('non-existent', 'r', opener=badopener) self.assertEqual(str(cm.exception), 'opener returned -1') def test_bad_opener_other_negative(self): @@ -926,7 +926,7 @@ def test_bad_opener_other_negative(self): def badopener(fname, flags): return -2 with self.assertRaises(ValueError) as cm: - open('non-existent', 'r', opener=badopener) + self.open('non-existent', 'r', opener=badopener) self.assertEqual(str(cm.exception), 'opener returned -2') def test_opener_invalid_fd(self): diff --git a/Misc/NEWS.d/next/Library/2025-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst b/Misc/NEWS.d/next/Library/2025-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst new file mode 100644 index 00000000000000..714d707f488709 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst @@ -0,0 +1,3 @@ +Raise :exc:`ValueError` in :func:`open` if *opener* returns a negative +file-descriptor in the Python implementation of :mod:`io` to match the +C implementation. From fade04e0f441be0ea3ec0ef99dd0af8113df9ed8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 17:22:44 +0200 Subject: [PATCH 0183/1674] [3.14] gh-133982: Run unclosed file test on all io implementations (gh-134165) (gh-134433) Update `test_io` `_check_warn_on_dealloc` to use `self.` to dispatch to different I/O implementations. Update the `_pyio` implementation to match expected behavior, using the same `_dealloc_warn` design as the C implementation uses to report the topmost `__del__` object. The FileIO one now matches all the others, so can use IOBase. There was a missing check on closing (self._fd must be valid), add that check (cherry picked from commit 5b0e82752120a5dc66ce6ee778751d71ba2c33b2) Co-authored-by: Cody Maloney --- Lib/_pyio.py | 18 ++++++++++++++---- Lib/test/test_io.py | 4 ++-- ...5-05-17-20-23-57.gh-issue-133982.smS7au.rst | 3 +++ 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-17-20-23-57.gh-issue-133982.smS7au.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index f79674fb7a9f5e..300d5b3cbce32b 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -407,6 +407,9 @@ def __del__(self): if closed: return + if dealloc_warn := getattr(self, "_dealloc_warn", None): + dealloc_warn(self) + # If close() fails, the caller logs the exception with # sys.unraisablehook. close() must be called at the end at __del__(). self.close() @@ -853,6 +856,10 @@ def __repr__(self): else: return "<{}.{} name={!r}>".format(modname, clsname, name) + def _dealloc_warn(self, source): + if dealloc_warn := getattr(self.raw, "_dealloc_warn", None): + dealloc_warn(source) + ### Lower-level APIs ### def fileno(self): @@ -1601,12 +1608,11 @@ def __init__(self, file, mode='r', closefd=True, opener=None): raise self._fd = fd - def __del__(self): + def _dealloc_warn(self, source): if self._fd >= 0 and self._closefd and not self.closed: import warnings - warnings.warn('unclosed file %r' % (self,), ResourceWarning, + warnings.warn(f'unclosed file {source!r}', ResourceWarning, stacklevel=2, source=self) - self.close() def __getstate__(self): raise TypeError(f"cannot pickle {self.__class__.__name__!r} object") @@ -1781,7 +1787,7 @@ def close(self): if not self.closed: self._stat_atopen = None try: - if self._closefd: + if self._closefd and self._fd >= 0: os.close(self._fd) finally: super().close() @@ -2690,6 +2696,10 @@ def readline(self, size=None): def newlines(self): return self._decoder.newlines if self._decoder else None + def _dealloc_warn(self, source): + if dealloc_warn := getattr(self.buffer, "_dealloc_warn", None): + dealloc_warn(source) + class StringIO(TextIOWrapper): """Text I/O implementation using an in-memory buffer. diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 4625e3a01faa7b..aa619a96ab7535 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -4417,7 +4417,7 @@ def test_abc_inheritance_official(self): self._check_abc_inheritance(io) def _check_warn_on_dealloc(self, *args, **kwargs): - f = open(*args, **kwargs) + f = self.open(*args, **kwargs) r = repr(f) with self.assertWarns(ResourceWarning) as cm: f = None @@ -4446,7 +4446,7 @@ def cleanup_fds(): r, w = os.pipe() fds += r, w with warnings_helper.check_no_resource_warning(self): - open(r, *args, closefd=False, **kwargs) + self.open(r, *args, closefd=False, **kwargs) @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_warn_on_dealloc_fd(self): diff --git a/Misc/NEWS.d/next/Library/2025-05-17-20-23-57.gh-issue-133982.smS7au.rst b/Misc/NEWS.d/next/Library/2025-05-17-20-23-57.gh-issue-133982.smS7au.rst new file mode 100644 index 00000000000000..a6753145981181 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-17-20-23-57.gh-issue-133982.smS7au.rst @@ -0,0 +1,3 @@ +Emit :exc:`RuntimeWarning` in the Python implementation of :mod:`io` when +the :term:`file-like object ` is not closed explicitly in the +presence of multiple I/O layers. From 17bf6ab0c1b4189dd5a201d952a00609800fbc19 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 17:57:58 +0200 Subject: [PATCH 0184/1674] [3.14] gh-62184: Remove _pyio import of _io.FileIO (gh-134192) (gh-134437) This was added in the add of `_io`, isn't used since bpo-21859 when a `_pyio` implementation was added which defines `FileIO` lower down in the file. (cherry picked from commit 0a68068bd2a5bff98998067a141b17af5be9b750) Co-authored-by: Cody Maloney --- Lib/_pyio.py | 2 -- .../next/Library/2025-05-18-12-48-39.gh-issue-62184.y11l10.rst | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-18-12-48-39.gh-issue-62184.y11l10.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 300d5b3cbce32b..fb2a6d049caab6 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -648,8 +648,6 @@ def write(self, b): self._unsupported("write") io.RawIOBase.register(RawIOBase) -from _io import FileIO -RawIOBase.register(FileIO) class BufferedIOBase(IOBase): diff --git a/Misc/NEWS.d/next/Library/2025-05-18-12-48-39.gh-issue-62184.y11l10.rst b/Misc/NEWS.d/next/Library/2025-05-18-12-48-39.gh-issue-62184.y11l10.rst new file mode 100644 index 00000000000000..7bc994e57fb58f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-18-12-48-39.gh-issue-62184.y11l10.rst @@ -0,0 +1,2 @@ +Remove import of C implementation of :class:`io.FileIO` from Python +implementation which has its own implementation From cdc92cd9fc17f6e06c51584cde2ab6cf21f188d4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 18:19:25 +0200 Subject: [PATCH 0185/1674] [3.14] gh-132983: Refactor shared code in train_dict and finalize_dict (GH-134432) (#134442) gh-132983: Refactor shared code in train_dict and finalize_dict (GH-134432) Refactor shared code in train_dict and finalize_dict (cherry picked from commit c64a21454b3c139af9e88941a286885fc4828a7e) Co-authored-by: Emma Smith --- Modules/_zstd/_zstdmodule.c | 123 ++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 68 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 0294828aa106ea..b2e4f95b906356 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -172,6 +172,49 @@ get_zstd_state(PyObject *module) return (_zstd_state *)state; } +static Py_ssize_t +calculate_samples_stats(PyBytesObject *samples_bytes, PyObject *samples_sizes, + size_t **chunk_sizes) +{ + Py_ssize_t chunks_number; + Py_ssize_t sizes_sum; + Py_ssize_t i; + + chunks_number = Py_SIZE(samples_sizes); + if ((size_t) chunks_number > UINT32_MAX) { + PyErr_Format(PyExc_ValueError, + "The number of samples should be <= %u.", UINT32_MAX); + return -1; + } + + /* Prepare chunk_sizes */ + *chunk_sizes = PyMem_New(size_t, chunks_number); + if (*chunk_sizes == NULL) { + PyErr_NoMemory(); + return -1; + } + + sizes_sum = 0; + for (i = 0; i < chunks_number; i++) { + PyObject *size = PyTuple_GetItem(samples_sizes, i); + (*chunk_sizes)[i] = PyLong_AsSize_t(size); + if ((*chunk_sizes)[i] == (size_t)-1 && PyErr_Occurred()) { + PyErr_Format(PyExc_ValueError, + "Items in samples_sizes should be an int " + "object, with a value between 0 and %u.", SIZE_MAX); + return -1; + } + sizes_sum += (*chunk_sizes)[i]; + } + + if (sizes_sum != Py_SIZE(samples_bytes)) { + PyErr_SetString(PyExc_ValueError, + "The samples size tuple doesn't match the concatenation's size."); + return -1; + } + return chunks_number; +} + /*[clinic input] _zstd.train_dict @@ -192,14 +235,10 @@ _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, PyObject *samples_sizes, Py_ssize_t dict_size) /*[clinic end generated code: output=8e87fe43935e8f77 input=d20dedb21c72cb62]*/ { - // TODO(emmatyping): The preamble and suffix to this function and _finalize_dict - // are pretty similar. We should see if we can refactor them to share that code. - Py_ssize_t chunks_number; - size_t *chunk_sizes = NULL; PyObject *dst_dict_bytes = NULL; + size_t *chunk_sizes = NULL; + Py_ssize_t chunks_number; size_t zstd_ret; - Py_ssize_t sizes_sum; - Py_ssize_t i; /* Check arguments */ if (dict_size <= 0) { @@ -207,39 +246,14 @@ _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, return NULL; } - chunks_number = Py_SIZE(samples_sizes); - if ((size_t) chunks_number > UINT32_MAX) { - PyErr_Format(PyExc_ValueError, - "The number of samples should be <= %u.", UINT32_MAX); + /* Check that the samples are valid and get their sizes */ + chunks_number = calculate_samples_stats(samples_bytes, samples_sizes, + &chunk_sizes); + if (chunks_number < 0) + { return NULL; } - /* Prepare chunk_sizes */ - chunk_sizes = PyMem_New(size_t, chunks_number); - if (chunk_sizes == NULL) { - PyErr_NoMemory(); - goto error; - } - - sizes_sum = 0; - for (i = 0; i < chunks_number; i++) { - PyObject *size = PyTuple_GetItem(samples_sizes, i); - chunk_sizes[i] = PyLong_AsSize_t(size); - if (chunk_sizes[i] == (size_t)-1 && PyErr_Occurred()) { - PyErr_Format(PyExc_ValueError, - "Items in samples_sizes should be an int " - "object, with a value between 0 and %u.", SIZE_MAX); - goto error; - } - sizes_sum += chunk_sizes[i]; - } - - if (sizes_sum != Py_SIZE(samples_bytes)) { - PyErr_SetString(PyExc_ValueError, - "The samples size tuple doesn't match the concatenation's size."); - goto error; - } - /* Allocate dict buffer */ dst_dict_bytes = PyBytes_FromStringAndSize(NULL, dict_size); if (dst_dict_bytes == NULL) { @@ -307,8 +321,6 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, PyObject *dst_dict_bytes = NULL; size_t zstd_ret; ZDICT_params_t params; - Py_ssize_t sizes_sum; - Py_ssize_t i; /* Check arguments */ if (dict_size <= 0) { @@ -316,39 +328,14 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, return NULL; } - chunks_number = Py_SIZE(samples_sizes); - if ((size_t) chunks_number > UINT32_MAX) { - PyErr_Format(PyExc_ValueError, - "The number of samples should be <= %u.", UINT32_MAX); + /* Check that the samples are valid and get their sizes */ + chunks_number = calculate_samples_stats(samples_bytes, samples_sizes, + &chunk_sizes); + if (chunks_number < 0) + { return NULL; } - /* Prepare chunk_sizes */ - chunk_sizes = PyMem_New(size_t, chunks_number); - if (chunk_sizes == NULL) { - PyErr_NoMemory(); - goto error; - } - - sizes_sum = 0; - for (i = 0; i < chunks_number; i++) { - PyObject *size = PyTuple_GetItem(samples_sizes, i); - chunk_sizes[i] = PyLong_AsSize_t(size); - if (chunk_sizes[i] == (size_t)-1 && PyErr_Occurred()) { - PyErr_Format(PyExc_ValueError, - "Items in samples_sizes should be an int " - "object, with a value between 0 and %u.", SIZE_MAX); - goto error; - } - sizes_sum += chunk_sizes[i]; - } - - if (sizes_sum != Py_SIZE(samples_bytes)) { - PyErr_SetString(PyExc_ValueError, - "The samples size tuple doesn't match the concatenation's size."); - goto error; - } - /* Allocate dict buffer */ dst_dict_bytes = PyBytes_FromStringAndSize(NULL, dict_size); if (dst_dict_bytes == NULL) { From 6ea83e077e0a06261d9e72634ed76d6fafe72297 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 18:43:07 +0200 Subject: [PATCH 0186/1674] [3.14] gh-134026: Fix grammar description of for statement (GH-134034) (GH-134424) gh-134026: Fix grammar description of for statement (GH-134034) (cherry picked from commit 4eacf3883dd041c31133ea407204b797a17559b1) Co-authored-by: Yash Vijay --- Doc/reference/compound_stmts.rst | 14 +++++++------- Doc/reference/expressions.rst | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 5d4298f70e0e14..e95fa3a6424e23 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -154,15 +154,15 @@ The :keyword:`for` statement is used to iterate over the elements of a sequence (such as a string, tuple or list) or other iterable object: .. productionlist:: python-grammar - for_stmt: "for" `target_list` "in" `starred_list` ":" `suite` + for_stmt: "for" `target_list` "in" `starred_expression_list` ":" `suite` : ["else" ":" `suite`] -The ``starred_list`` expression is evaluated once; it should yield an -:term:`iterable` object. An :term:`iterator` is created for that iterable. -The first item provided -by the iterator is then assigned to the target list using the standard -rules for assignments (see :ref:`assignment`), and the suite is executed. This -repeats for each item provided by the iterator. When the iterator is exhausted, +The :token:`~python-grammar:starred_expression_list` expression is evaluated +once; it should yield an :term:`iterable` object. An :term:`iterator` is +created for that iterable. The first item provided by the iterator is then +assigned to the target list using the standard rules for assignments +(see :ref:`assignment`), and the suite is executed. This repeats for each +item provided by the iterator. When the iterator is exhausted, the suite in the :keyword:`!else` clause, if present, is executed, and the loop terminates. diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 8837344e5ddca1..2a550b504ca765 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1928,7 +1928,7 @@ Expression lists single: , (comma); expression list .. productionlist:: python-grammar - starred_expression: ["*"] `or_expr` + starred_expression: "*" `or_expr` | `expression` flexible_expression: `assignment_expression` | `starred_expression` flexible_expression_list: `flexible_expression` ("," `flexible_expression`)* [","] starred_expression_list: `starred_expression` ("," `starred_expression`)* [","] From df6d9e7fbdbb583c12a627f202f810f4772e7930 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 18:50:02 +0200 Subject: [PATCH 0187/1674] [3.14] gh-80050: Update BufferedReader.read docs around non-blocking (GH-130653) (#134444) gh-80050: Update BufferedReader.read docs around non-blocking (GH-130653) (cherry picked from commit e1f891414b2329414a6160ed246f5f869a218bfd) Co-authored-by: Cody Maloney --- Doc/library/io.rst | 85 ++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 08c76da3d8c00a..de5cab5aee649f 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -528,14 +528,13 @@ I/O Base Classes 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 - input as requested or to consume all given output, at the expense of - making perhaps more than one system call. + :meth:`readinto` and :meth:`write` will try (respectively) to read + as much input as requested or to emit all provided data. - In addition, those methods can raise :exc:`BlockingIOError` if the - underlying raw stream is in non-blocking mode and cannot take or give - enough data; unlike their :class:`RawIOBase` counterparts, they will - never return ``None``. + In addition, if the underlying raw stream is in non-blocking mode, when the + system returns would block :meth:`write` will raise :exc:`BlockingIOError` + with :attr:`BlockingIOError.characters_written` and :meth:`read` will return + data read so far or ``None`` if no data is available. Besides, the :meth:`read` method does not have a default implementation that defers to :meth:`readinto`. @@ -568,29 +567,40 @@ I/O Base Classes .. method:: read(size=-1, /) - Read and return up to *size* bytes. If the argument is omitted, ``None``, - or negative, data is read and returned until EOF is reached. An empty - :class:`bytes` object is returned if the stream is already at EOF. + Read and return up to *size* bytes. If the argument is omitted, ``None``, + or negative read as much as possible. - If the argument is positive, and the underlying raw stream is not - interactive, multiple raw reads may be issued to satisfy the byte count - (unless EOF is reached first). But for interactive raw streams, at most - one raw read will be issued, and a short result does not imply that EOF is - imminent. + Fewer bytes may be returned than requested. An empty :class:`bytes` object + is returned if the stream is already at EOF. More than one read may be + made and calls may be retried if specific errors are encountered, see + :meth:`os.read` and :pep:`475` for more details. Less than size bytes + being returned does not imply that EOF is imminent. - A :exc:`BlockingIOError` is raised if the underlying raw stream is in - non blocking-mode, and has no data available at the moment. + When reading as much as possible the default implementation will use + ``raw.readall`` if available (which should implement + :meth:`RawIOBase.readall`), otherwise will read in a loop until read + returns ``None``, an empty :class:`bytes`, or a non-retryable error. For + most streams this is to EOF, but for non-blocking streams more data may + become available. + + .. note:: + + When the underlying raw stream is non-blocking, implementations may + either raise :exc:`BlockingIOError` or return ``None`` if no data is + available. :mod:`io` implementations return ``None``. .. method:: read1(size=-1, /) - Read and return up to *size* bytes, with at most one call to the - underlying raw stream's :meth:`~RawIOBase.read` (or - :meth:`~RawIOBase.readinto`) method. This can be useful if you are - implementing your own buffering on top of a :class:`BufferedIOBase` - object. + Read and return up to *size* bytes, calling :meth:`~RawIOBase.readinto` + which may retry if :py:const:`~errno.EINTR` is encountered per + :pep:`475`. If *size* is ``-1`` or not provided, the implementation will + choose an arbitrary value for *size*. - If *size* is ``-1`` (the default), an arbitrary number of bytes are - returned (more than zero unless EOF is reached). + .. note:: + + When the underlying raw stream is non-blocking, implementations may + either raise :exc:`BlockingIOError` or return ``None`` if no data is + available. :mod:`io` implementations return ``None``. .. method:: readinto(b, /) @@ -767,34 +777,21 @@ than raw I/O does. .. method:: peek(size=0, /) - Return bytes from the stream without advancing the position. At most one - single read on the raw stream is done to satisfy the call. The number of - bytes returned may be less or more than requested. + Return bytes from the stream without advancing the position. The number of + bytes returned may be less or more than requested. If the underlying raw + stream is non-blocking and the operation would block, returns empty bytes. .. method:: read(size=-1, /) - Read and return *size* bytes, or if *size* is not given or negative, until - EOF or if the read call would block in non-blocking mode. - - .. note:: - - When the underlying raw stream is non-blocking, a :exc:`BlockingIOError` - may be raised if a read operation cannot be completed immediately. + In :class:`BufferedReader` this is the same as :meth:`io.BufferedIOBase.read` .. method:: read1(size=-1, /) - Read and return up to *size* bytes with only one call on the raw stream. - If at least one byte is buffered, only buffered bytes are returned. - Otherwise, one raw stream read call is made. + In :class:`BufferedReader` this is the same as :meth:`io.BufferedIOBase.read1` .. versionchanged:: 3.7 The *size* argument is now optional. - .. note:: - - When the underlying raw stream is non-blocking, a :exc:`BlockingIOError` - may be raised if a read operation cannot be completed immediately. - .. class:: BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE) A buffered binary stream providing higher-level access to a writeable, non @@ -826,8 +823,8 @@ than raw I/O does. Write the :term:`bytes-like object`, *b*, and return the number of bytes written. When in non-blocking mode, a - :exc:`BlockingIOError` is raised if the buffer needs to be written out but - the raw stream blocks. + :exc:`BlockingIOError` with :attr:`BlockingIOError.characters_written` set + is raised if the buffer needs to be written out but the raw stream blocks. .. class:: BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) From f8ced87fa3d2d91be9a445dbfac9def3df527cb3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 19:36:32 +0200 Subject: [PATCH 0188/1674] [3.14] gh-132124: improve safety nets for creating AF_UNIX socket files (GH-134085) (#134447) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-132124: improve safety nets for creating AF_UNIX socket files (GH-134085) * ensure that we can create AF_UNIX socket files * emit a warning if system-wide temporary directory is used (cherry picked from commit 1a07a01014bde23acd2684916ef38dc0cd73c2de) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/multiprocessing/connection.py | 2 +- Lib/multiprocessing/util.py | 79 ++++++++++++++++++- Lib/tempfile.py | 5 +- ...-05-16-12-40-37.gh-issue-132124.T_5Odx.rst | 6 ++ 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-16-12-40-37.gh-issue-132124.T_5Odx.rst diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 5f288a8d393240..fc00d2861260a8 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -76,7 +76,7 @@ def arbitrary_address(family): if family == 'AF_INET': return ('localhost', 0) elif family == 'AF_UNIX': - return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir()) + return tempfile.mktemp(prefix='sock-', dir=util.get_temp_dir()) elif family == 'AF_PIPE': return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % (os.getpid(), next(_mmap_counter)), dir="") diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index b7192042b9cf47..a1a537dd48dea7 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -19,7 +19,7 @@ from . import process __all__ = [ - 'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger', + 'sub_debug', 'debug', 'info', 'sub_warning', 'warn', 'get_logger', 'log_to_stderr', 'get_temp_dir', 'register_after_fork', 'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal', 'close_all_fds_except', 'SUBDEBUG', 'SUBWARNING', @@ -34,6 +34,7 @@ DEBUG = 10 INFO = 20 SUBWARNING = 25 +WARNING = 30 LOGGER_NAME = 'multiprocessing' DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s' @@ -53,6 +54,10 @@ def info(msg, *args): if _logger: _logger.log(INFO, msg, *args, stacklevel=2) +def warn(msg, *args): + if _logger: + _logger.log(WARNING, msg, *args, stacklevel=2) + def sub_warning(msg, *args): if _logger: _logger.log(SUBWARNING, msg, *args, stacklevel=2) @@ -121,6 +126,21 @@ def is_abstract_socket_namespace(address): # Function returning a temp directory which will be removed on exit # +# Maximum length of a socket file path is usually between 92 and 108 [1], +# but Linux is known to use a size of 108 [2]. BSD-based systems usually +# use a size of 104 or 108 and Windows does not create AF_UNIX sockets. +# +# [1]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_un.h.html +# [2]: https://man7.org/linux/man-pages/man7/unix.7.html. + +if sys.platform == 'linux': + _SUN_PATH_MAX = 108 +elif sys.platform.startswith(('openbsd', 'freebsd')): + _SUN_PATH_MAX = 104 +else: + # On Windows platforms, we do not create AF_UNIX sockets. + _SUN_PATH_MAX = None if os.name == 'nt' else 92 + def _remove_temp_dir(rmtree, tempdir): rmtree(tempdir) @@ -130,12 +150,67 @@ def _remove_temp_dir(rmtree, tempdir): if current_process is not None: current_process._config['tempdir'] = None +def _get_base_temp_dir(tempfile): + """Get a temporary directory where socket files will be created. + + To prevent additional imports, pass a pre-imported 'tempfile' module. + """ + if os.name == 'nt': + return None + # Most of the time, the default temporary directory is /tmp. Thus, + # listener sockets files "$TMPDIR/pymp-XXXXXXXX/sock-XXXXXXXX" do + # not have a path length exceeding SUN_PATH_MAX. + # + # If users specify their own temporary directory, we may be unable + # to create those files. Therefore, we fall back to the system-wide + # temporary directory /tmp, assumed to exist on POSIX systems. + # + # See https://github.com/python/cpython/issues/132124. + base_tempdir = tempfile.gettempdir() + # Files created in a temporary directory are suffixed by a string + # generated by tempfile._RandomNameSequence, which, by design, + # is 8 characters long. + # + # Thus, the length of socket filename will be: + # + # len(base_tempdir + '/pymp-XXXXXXXX' + '/sock-XXXXXXXX') + sun_path_len = len(base_tempdir) + 14 + 14 + if sun_path_len <= _SUN_PATH_MAX: + return base_tempdir + # Fallback to the default system-wide temporary directory. + # This ignores user-defined environment variables. + # + # On POSIX systems, /tmp MUST be writable by any application [1]. + # We however emit a warning if this is not the case to prevent + # obscure errors later in the execution. + # + # On some legacy systems, /var/tmp and /usr/tmp can be present + # and will be used instead. + # + # [1]: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html + dirlist = ['/tmp', '/var/tmp', '/usr/tmp'] + try: + base_system_tempdir = tempfile._get_default_tempdir(dirlist) + except FileNotFoundError: + warn("Process-wide temporary directory %s will not be usable for " + "creating socket files and no usable system-wide temporary " + "directory was found in %s", base_tempdir, dirlist) + # At this point, the system-wide temporary directory is not usable + # but we may assume that the user-defined one is, even if we will + # not be able to write socket files out there. + return base_tempdir + warn("Ignoring user-defined temporary directory: %s", base_tempdir) + # at most max(map(len, dirlist)) + 14 + 14 = 36 characters + assert len(base_system_tempdir) + 14 + 14 <= _SUN_PATH_MAX + return base_system_tempdir + def get_temp_dir(): # get name of a temp directory which will be automatically cleaned up tempdir = process.current_process()._config.get('tempdir') if tempdir is None: import shutil, tempfile - tempdir = tempfile.mkdtemp(prefix='pymp-') + base_tempdir = _get_base_temp_dir(tempfile) + tempdir = tempfile.mkdtemp(prefix='pymp-', dir=base_tempdir) info('created temp directory %s', tempdir) # keep a strong reference to shutil.rmtree(), since the finalizer # can be called late during Python shutdown diff --git a/Lib/tempfile.py b/Lib/tempfile.py index cadb0bed3cce3b..5e3ccab5f48502 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -180,7 +180,7 @@ def _candidate_tempdir_list(): return dirlist -def _get_default_tempdir(): +def _get_default_tempdir(dirlist=None): """Calculate the default directory to use for temporary files. This routine should be called exactly once. @@ -190,7 +190,8 @@ def _get_default_tempdir(): service, the name of the test file must be randomized.""" namer = _RandomNameSequence() - dirlist = _candidate_tempdir_list() + if dirlist is None: + dirlist = _candidate_tempdir_list() for dir in dirlist: if dir != _os.curdir: diff --git a/Misc/NEWS.d/next/Library/2025-05-16-12-40-37.gh-issue-132124.T_5Odx.rst b/Misc/NEWS.d/next/Library/2025-05-16-12-40-37.gh-issue-132124.T_5Odx.rst new file mode 100644 index 00000000000000..acf3577ece4e9c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-16-12-40-37.gh-issue-132124.T_5Odx.rst @@ -0,0 +1,6 @@ +On POSIX-compliant systems, :func:`!multiprocessing.util.get_temp_dir` now +ignores :envvar:`TMPDIR` (and similar environment variables) if the path +length of ``AF_UNIX`` socket files exceeds the platform-specific maximum +length when using the :ref:`forkserver +` start method. Patch by Bénédikt +Tran. From 11d77d21120b77ddfd97f471c0d7a31745141131 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 21:35:31 +0200 Subject: [PATCH 0189/1674] [3.14] gh-132983: Fix refleak in zstd dictionary functions (gh-134463) (cherry picked from commit fb68776591485, AKA gh-134459) Co-authored-by: Emma Smith --- Modules/_zstd/_zstdmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index b2e4f95b906356..17d3bff1e98769 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -251,7 +251,7 @@ _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, &chunk_sizes); if (chunks_number < 0) { - return NULL; + goto error; } /* Allocate dict buffer */ @@ -333,7 +333,7 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, &chunk_sizes); if (chunks_number < 0) { - return NULL; + goto error; } /* Allocate dict buffer */ From 93ab55bd703f1238cc93327a1a285921b47fa8a3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 May 2025 22:43:29 +0200 Subject: [PATCH 0190/1674] [3.14] gh-132775: Use _PyFunction_VerifyStateless() and _PyCode_VerifyStateless() (gh-134465) (cherry picked from commit a66bae8bb, AKA gh-134439) Co-authored-by: Eric Snow --- Include/internal/pycore_pyerrors.h | 4 +- Lib/test/test__interpreters.py | 3 +- Modules/_interpretersmodule.c | 139 ++++++++++++++--------------- 3 files changed, 70 insertions(+), 76 deletions(-) diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index f357b88e220e6e..2c2048f7e1272a 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -94,13 +94,13 @@ extern void _PyErr_Fetch( PyObject **value, PyObject **traceback); -extern PyObject* _PyErr_GetRaisedException(PyThreadState *tstate); +PyAPI_FUNC(PyObject*) _PyErr_GetRaisedException(PyThreadState *tstate); PyAPI_FUNC(int) _PyErr_ExceptionMatches( PyThreadState *tstate, PyObject *exc); -extern void _PyErr_SetRaisedException(PyThreadState *tstate, PyObject *exc); +PyAPI_FUNC(void) _PyErr_SetRaisedException(PyThreadState *tstate, PyObject *exc); extern void _PyErr_Restore( PyThreadState *tstate, diff --git a/Lib/test/test__interpreters.py b/Lib/test/test__interpreters.py index 0c43f46300f67d..63fdaad8de7ef5 100644 --- a/Lib/test/test__interpreters.py +++ b/Lib/test/test__interpreters.py @@ -1054,7 +1054,7 @@ def test_closure(self): def script(): assert spam - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): _interpreters.run_func(self.id, script) # XXX This hasn't been fixed yet. @@ -1065,6 +1065,7 @@ def script(): with self.assertRaises(ValueError): _interpreters.run_func(self.id, script) + @unittest.skip("we're not quite there yet") def test_args(self): with self.subTest('args'): def script(a, b=0): diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index f3c571e717fd0e..91cd92806206be 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -8,6 +8,8 @@ #include "Python.h" #include "pycore_code.h" // _PyCode_HAS_EXECUTORS() #include "pycore_crossinterp.h" // _PyXIData_t +#include "pycore_pyerrors.h" // _PyErr_GetRaisedException() +#include "pycore_function.h" // _PyFunction_VerifyStateless() #include "pycore_interp.h" // _PyInterpreterState_IDIncref() #include "pycore_modsupport.h" // _PyArg_BadArgument() #include "pycore_namespace.h" // _PyNamespace_New() @@ -374,34 +376,17 @@ check_code_str(PyUnicodeObject *text) return NULL; } -static const char * -check_code_object(PyCodeObject *code) +#ifndef NDEBUG +static int +code_has_args(PyCodeObject *code) { assert(code != NULL); - if (code->co_argcount > 0 + return (code->co_argcount > 0 || code->co_posonlyargcount > 0 || code->co_kwonlyargcount > 0 - || code->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) - { - return "arguments not supported"; - } - if (code->co_ncellvars > 0) { - return "closures not supported"; - } - // We trust that no code objects under co_consts have unbound cell vars. - - if (_PyCode_HAS_EXECUTORS(code) || _PyCode_HAS_INSTRUMENTATION(code)) { - return "only basic functions are supported"; - } - if (code->_co_monitoring != NULL) { - return "only basic functions are supported"; - } - if (code->co_extra != NULL) { - return "only basic functions are supported"; - } - - return NULL; + || code->co_flags & (CO_VARARGS | CO_VARKEYWORDS)); } +#endif #define RUN_TEXT 1 #define RUN_CODE 2 @@ -429,8 +414,10 @@ get_code_str(PyObject *arg, Py_ssize_t *len_p, PyObject **bytes_p, int *flags_p) flags = RUN_TEXT; } else { - assert(PyCode_Check(arg) - && (check_code_object((PyCodeObject *)arg) == NULL)); + assert(PyCode_Check(arg)); + assert(_PyCode_VerifyStateless( + PyThreadState_Get(), (PyCodeObject *)arg, NULL, NULL, NULL) == 0); + assert(!code_has_args((PyCodeObject *)arg)); flags = RUN_CODE; // Serialize the code object. @@ -949,7 +936,8 @@ Bind the given attributes in the interpreter's __main__ module."); static PyUnicodeObject * -convert_script_arg(PyObject *arg, const char *fname, const char *displayname, +convert_script_arg(PyThreadState *tstate, + PyObject *arg, const char *fname, const char *displayname, const char *expected) { PyUnicodeObject *str = NULL; @@ -968,8 +956,8 @@ convert_script_arg(PyObject *arg, const char *fname, const char *displayname, const char *err = check_code_str(str); if (err != NULL) { Py_DECREF(str); - PyErr_Format(PyExc_ValueError, - "%.200s(): bad script text (%s)", fname, err); + _PyErr_Format(tstate, PyExc_ValueError, + "%.200s(): bad script text (%s)", fname, err); return NULL; } @@ -977,51 +965,44 @@ convert_script_arg(PyObject *arg, const char *fname, const char *displayname, } static PyCodeObject * -convert_code_arg(PyObject *arg, const char *fname, const char *displayname, +convert_code_arg(PyThreadState *tstate, + PyObject *arg, const char *fname, const char *displayname, const char *expected) { - const char *kind = NULL; + PyObject *cause; PyCodeObject *code = NULL; if (PyFunction_Check(arg)) { - if (PyFunction_GetClosure(arg) != NULL) { - PyErr_Format(PyExc_ValueError, - "%.200s(): closures not supported", fname); - return NULL; - } - code = (PyCodeObject *)PyFunction_GetCode(arg); - if (code == NULL) { - if (PyErr_Occurred()) { - // This chains. - PyErr_Format(PyExc_ValueError, - "%.200s(): bad func", fname); - } - else { - PyErr_Format(PyExc_ValueError, - "%.200s(): func.__code__ missing", fname); - } - return NULL; + // For now we allow globals, so we can't use + // _PyFunction_VerifyStateless(). + PyObject *codeobj = PyFunction_GetCode(arg); + if (_PyCode_VerifyStateless( + tstate, (PyCodeObject *)codeobj, NULL, NULL, NULL) < 0) { + goto chained; } - Py_INCREF(code); - kind = "func"; + code = (PyCodeObject *)Py_NewRef(codeobj); } else if (PyCode_Check(arg)) { + if (_PyCode_VerifyStateless( + tstate, (PyCodeObject *)arg, NULL, NULL, NULL) < 0) { + goto chained; + } code = (PyCodeObject *)Py_NewRef(arg); - kind = "code object"; } else { _PyArg_BadArgument(fname, displayname, expected, arg); return NULL; } - const char *err = check_code_object(code); - if (err != NULL) { - Py_DECREF(code); - PyErr_Format(PyExc_ValueError, - "%.200s(): bad %s (%s)", fname, kind, err); - return NULL; - } - return code; + +chained: + cause = _PyErr_GetRaisedException(tstate); + assert(cause != NULL); + _PyArg_BadArgument(fname, displayname, expected, arg); + PyObject *exc = _PyErr_GetRaisedException(tstate); + PyException_SetCause(exc, cause); + _PyErr_SetRaisedException(tstate, exc); + return NULL; } static int @@ -1057,12 +1038,14 @@ _interp_exec(PyObject *self, PyInterpreterState *interp, static PyObject * interp_exec(PyObject *self, PyObject *args, PyObject *kwds) { +#define FUNCNAME MODULE_NAME_STR ".exec" + PyThreadState *tstate = _PyThreadState_GET(); static char *kwlist[] = {"id", "code", "shared", "restrict", NULL}; PyObject *id, *code; PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|O$p:" MODULE_NAME_STR ".exec", kwlist, + "OO|O$p:" FUNCNAME, kwlist, &id, &code, &shared, &restricted)) { return NULL; @@ -1077,12 +1060,12 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds) const char *expected = "a string, a function, or a code object"; if (PyUnicode_Check(code)) { - code = (PyObject *)convert_script_arg(code, MODULE_NAME_STR ".exec", - "argument 2", expected); + code = (PyObject *)convert_script_arg(tstate, code, FUNCNAME, + "argument 2", expected); } else { - code = (PyObject *)convert_code_arg(code, MODULE_NAME_STR ".exec", - "argument 2", expected); + code = (PyObject *)convert_code_arg(tstate, code, FUNCNAME, + "argument 2", expected); } if (code == NULL) { return NULL; @@ -1096,6 +1079,7 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds) return excinfo; } Py_RETURN_NONE; +#undef FUNCNAME } PyDoc_STRVAR(exec_doc, @@ -1118,13 +1102,15 @@ is ignored, including its __globals__ dict."); static PyObject * interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) { +#define FUNCNAME MODULE_NAME_STR ".run_string" + PyThreadState *tstate = _PyThreadState_GET(); static char *kwlist[] = {"id", "script", "shared", "restrict", NULL}; PyObject *id, *script; PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OU|O$p:" MODULE_NAME_STR ".run_string", - kwlist, &id, &script, &shared, &restricted)) + "OU|O$p:" FUNCNAME, kwlist, + &id, &script, &shared, &restricted)) { return NULL; } @@ -1136,7 +1122,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - script = (PyObject *)convert_script_arg(script, MODULE_NAME_STR ".run_string", + script = (PyObject *)convert_script_arg(tstate, script, FUNCNAME, "argument 2", "a string"); if (script == NULL) { return NULL; @@ -1150,6 +1136,7 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) return excinfo; } Py_RETURN_NONE; +#undef FUNCNAME } PyDoc_STRVAR(run_string_doc, @@ -1162,13 +1149,15 @@ Execute the provided string in the identified interpreter.\n\ static PyObject * interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) { +#define FUNCNAME MODULE_NAME_STR ".run_func" + PyThreadState *tstate = _PyThreadState_GET(); static char *kwlist[] = {"id", "func", "shared", "restrict", NULL}; PyObject *id, *func; PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|O$p:" MODULE_NAME_STR ".run_func", - kwlist, &id, &func, &shared, &restricted)) + "OO|O$p:" FUNCNAME, kwlist, + &id, &func, &shared, &restricted)) { return NULL; } @@ -1180,7 +1169,7 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - PyCodeObject *code = convert_code_arg(func, MODULE_NAME_STR ".exec", + PyCodeObject *code = convert_code_arg(tstate, func, FUNCNAME, "argument 2", "a function or a code object"); if (code == NULL) { @@ -1195,6 +1184,7 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) return excinfo; } Py_RETURN_NONE; +#undef FUNCNAME } PyDoc_STRVAR(run_func_doc, @@ -1209,6 +1199,8 @@ are not supported. Methods and other callables are not supported either.\n\ static PyObject * interp_call(PyObject *self, PyObject *args, PyObject *kwds) { +#define FUNCNAME MODULE_NAME_STR ".call" + PyThreadState *tstate = _PyThreadState_GET(); static char *kwlist[] = {"id", "callable", "args", "kwargs", "restrict", NULL}; PyObject *id, *callable; @@ -1216,7 +1208,7 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds) PyObject *kwargs_obj = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|OO$p:" MODULE_NAME_STR ".call", kwlist, + "OO|OO$p:" FUNCNAME, kwlist, &id, &callable, &args_obj, &kwargs_obj, &restricted)) { @@ -1231,15 +1223,15 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds) } if (args_obj != NULL) { - PyErr_SetString(PyExc_ValueError, "got unexpected args"); + _PyErr_SetString(tstate, PyExc_ValueError, "got unexpected args"); return NULL; } if (kwargs_obj != NULL) { - PyErr_SetString(PyExc_ValueError, "got unexpected kwargs"); + _PyErr_SetString(tstate, PyExc_ValueError, "got unexpected kwargs"); return NULL; } - PyObject *code = (PyObject *)convert_code_arg(callable, MODULE_NAME_STR ".call", + PyObject *code = (PyObject *)convert_code_arg(tstate, callable, FUNCNAME, "argument 2", "a function"); if (code == NULL) { return NULL; @@ -1253,6 +1245,7 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds) return excinfo; } Py_RETURN_NONE; +#undef FUNCNAME } PyDoc_STRVAR(call_doc, From 998991513b3300c3c6627857df92db81a40355c9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 03:33:35 +0200 Subject: [PATCH 0191/1674] [3.14] gh-127960 Fix the REPL to set the correct namespace by setting the correct `__main__` module (gh-134275) (gh-134473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `__main__` module imported in the `_pyrepl` module points to the `_pyrepl` module itself when the interpreter was launched without `-m` option and didn't execute a module, while it's an unexpected behavior that `__main__` can be `_pyrepl` and relative imports such as `from . import *` works based on the `_pyrepl` module. (cherry picked from commit b1b8962443e7d418601658a4b05347a5a9161910) Co-authored-by: Yuichiro Tachibana (Tsuchiya) Co-authored-by: Łukasz Langa --- Lib/_pyrepl/_module_completer.py | 4 +- Lib/_pyrepl/main.py | 11 ++- Lib/_pyrepl/readline.py | 1 + Lib/test/support/__init__.py | 6 -- Lib/test/test_pyrepl/test_pyrepl.py | 78 +++++++++++++++---- ...-05-21-18-02-56.gh-issue-127960.W3J_2X.rst | 3 + Modules/main.c | 16 +++- 7 files changed, 85 insertions(+), 34 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-18-02-56.gh-issue-127960.W3J_2X.rst diff --git a/Lib/_pyrepl/_module_completer.py b/Lib/_pyrepl/_module_completer.py index 9aafb55090e2ce..494a501101a9b2 100644 --- a/Lib/_pyrepl/_module_completer.py +++ b/Lib/_pyrepl/_module_completer.py @@ -17,8 +17,8 @@ def make_default_module_completer() -> ModuleCompleter: - # Inside pyrepl, __package__ is set to '_pyrepl' - return ModuleCompleter(namespace={'__package__': '_pyrepl'}) + # Inside pyrepl, __package__ is set to None by default + return ModuleCompleter(namespace={'__package__': None}) class ModuleCompleter: diff --git a/Lib/_pyrepl/main.py b/Lib/_pyrepl/main.py index a6f824dcc4ad14..447eb1e551e774 100644 --- a/Lib/_pyrepl/main.py +++ b/Lib/_pyrepl/main.py @@ -1,6 +1,7 @@ import errno import os import sys +import types CAN_USE_PYREPL: bool @@ -29,12 +30,10 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): 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) + if not mainmodule: + mainmodule = types.ModuleType("__main__") + + namespace = mainmodule.__dict__ # sys._baserepl() above does this internally, we do it here startup_path = os.getenv("PYTHONSTARTUP") diff --git a/Lib/_pyrepl/readline.py b/Lib/_pyrepl/readline.py index 560a9db192169e..572eee520e53f3 100644 --- a/Lib/_pyrepl/readline.py +++ b/Lib/_pyrepl/readline.py @@ -606,6 +606,7 @@ def _setup(namespace: Mapping[str, Any]) -> None: # set up namespace in rlcompleter, which requires it to be a bona fide dict if not isinstance(namespace, dict): namespace = dict(namespace) + _wrapper.config.module_completer = ModuleCompleter(namespace) _wrapper.config.readline_completer = RLCompleter(namespace).complete # this is not really what readline.c does. Better than nothing I guess diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 9b6e80fdad9747..b7cd7940eb15b3 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2929,12 +2929,6 @@ def make_clean_env() -> dict[str, str]: return clean_env -def initialized_with_pyrepl(): - """Detect whether PyREPL was used during Python initialization.""" - # If the main module has a __file__ attribute it's a Python module, which means PyREPL. - return hasattr(sys.modules["__main__"], "__file__") - - WINDOWS_STATUS = { 0xC0000005: "STATUS_ACCESS_VIOLATION", 0xC00000FD: "STATUS_STACK_OVERFLOW", diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 29762232d43b89..abb4bd1bc25fb1 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -926,6 +926,7 @@ def tearDown(self): def prepare_reader(self, events, namespace): console = FakeConsole(events) config = ReadlineConfig() + config.module_completer = ModuleCompleter(namespace) config.readline_completer = rlcompleter.Completer(namespace).complete reader = ReadlineAlikeReader(console=console, config=config) return reader @@ -1022,13 +1023,15 @@ def test_builtin_completion_top_level(self): def test_relative_import_completions(self): cases = ( - ("from .readl\t\n", "from .readline"), - ("from . import readl\t\n", "from . import readline"), + (None, "from .readl\t\n", "from .readl"), + (None, "from . import readl\t\n", "from . import readl"), + ("_pyrepl", "from .readl\t\n", "from .readline"), + ("_pyrepl", "from . import readl\t\n", "from . import readline"), ) - for code, expected in cases: + for package, code, expected in cases: with self.subTest(code=code): events = code_to_events(code) - reader = self.prepare_reader(events, namespace={}) + reader = self.prepare_reader(events, namespace={"__package__": package}) output = reader.readline() self.assertEqual(output, expected) @@ -1397,7 +1400,7 @@ def _assertMatchOK( ) @force_not_colorized - def _run_repl_globals_test(self, expectations, *, as_file=False, as_module=False): + def _run_repl_globals_test(self, expectations, *, as_file=False, as_module=False, pythonstartup=False): clean_env = make_clean_env() clean_env["NO_COLOR"] = "1" # force_not_colorized doesn't touch subprocesses @@ -1406,9 +1409,13 @@ def _run_repl_globals_test(self, expectations, *, as_file=False, as_module=False blue.mkdir() mod = blue / "calx.py" mod.write_text("FOO = 42", encoding="utf-8") + startup = blue / "startup.py" + startup.write_text("BAR = 64", encoding="utf-8") commands = [ "print(f'^{" + var + "=}')" for var in expectations ] + ["exit()"] + if pythonstartup: + clean_env["PYTHONSTARTUP"] = str(startup) if as_file and as_module: self.fail("as_file and as_module are mutually exclusive") elif as_file: @@ -1427,7 +1434,13 @@ def _run_repl_globals_test(self, expectations, *, as_file=False, as_module=False skip=True, ) else: - self.fail("Choose one of as_file or as_module") + output, exit_code = self.run_repl( + commands, + cmdline_args=[], + env=clean_env, + cwd=td, + skip=True, + ) self.assertEqual(exit_code, 0) for var, expected in expectations.items(): @@ -1440,6 +1453,23 @@ def _run_repl_globals_test(self, expectations, *, as_file=False, as_module=False self.assertNotIn("Exception", output) self.assertNotIn("Traceback", output) + def test_globals_initialized_as_default(self): + expectations = { + "__name__": "'__main__'", + "__package__": "None", + # "__file__" is missing in -i, like in the basic REPL + } + self._run_repl_globals_test(expectations) + + def test_globals_initialized_from_pythonstartup(self): + expectations = { + "BAR": "64", + "__name__": "'__main__'", + "__package__": "None", + # "__file__" is missing in -i, like in the basic REPL + } + self._run_repl_globals_test(expectations, pythonstartup=True) + def test_inspect_keeps_globals_from_inspected_file(self): expectations = { "FOO": "42", @@ -1449,6 +1479,16 @@ def test_inspect_keeps_globals_from_inspected_file(self): } self._run_repl_globals_test(expectations, as_file=True) + def test_inspect_keeps_globals_from_inspected_file_with_pythonstartup(self): + expectations = { + "FOO": "42", + "BAR": "64", + "__name__": "'__main__'", + "__package__": "None", + # "__file__" is missing in -i, like in the basic REPL + } + self._run_repl_globals_test(expectations, as_file=True, pythonstartup=True) + def test_inspect_keeps_globals_from_inspected_module(self): expectations = { "FOO": "42", @@ -1458,26 +1498,32 @@ def test_inspect_keeps_globals_from_inspected_module(self): } self._run_repl_globals_test(expectations, as_module=True) + def test_inspect_keeps_globals_from_inspected_module_with_pythonstartup(self): + expectations = { + "FOO": "42", + "BAR": "64", + "__name__": "'__main__'", + "__package__": "'blue'", + "__file__": re.compile(r"^'.*calx.py'$"), + } + self._run_repl_globals_test(expectations, as_module=True, pythonstartup=True) + @force_not_colorized def test_python_basic_repl(self): env = os.environ.copy() - commands = ("from test.support import initialized_with_pyrepl\n" - "initialized_with_pyrepl()\n" - "exit()\n") - + pyrepl_commands = "clear\nexit()\n" env.pop("PYTHON_BASIC_REPL", None) - output, exit_code = self.run_repl(commands, env=env, skip=True) + output, exit_code = self.run_repl(pyrepl_commands, env=env, skip=True) self.assertEqual(exit_code, 0) - self.assertIn("True", output) - self.assertNotIn("False", output) self.assertNotIn("Exception", output) + self.assertNotIn("NameError", output) self.assertNotIn("Traceback", output) + basic_commands = "help\nexit()\n" env["PYTHON_BASIC_REPL"] = "1" - output, exit_code = self.run_repl(commands, env=env) + output, exit_code = self.run_repl(basic_commands, env=env) self.assertEqual(exit_code, 0) - self.assertIn("False", output) - self.assertNotIn("True", output) + self.assertIn("Type help() for interactive help", output) self.assertNotIn("Exception", output) self.assertNotIn("Traceback", output) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-18-02-56.gh-issue-127960.W3J_2X.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-18-02-56.gh-issue-127960.W3J_2X.rst new file mode 100644 index 00000000000000..730d8a5af51f54 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-18-02-56.gh-issue-127960.W3J_2X.rst @@ -0,0 +1,3 @@ +PyREPL interactive shell no longer starts with ``__package__`` and +``__file__`` global names set to ``_pyrepl`` package internals. Contributed +by Yuichiro Tachibana. diff --git a/Modules/main.c b/Modules/main.c index ea1239ecc57f00..9b2ee103d52662 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -269,13 +269,14 @@ pymain_run_command(wchar_t *command) static int -pymain_start_pyrepl_no_main(void) +pymain_start_pyrepl(int pythonstartup) { int res = 0; PyObject *console = NULL; PyObject *empty_tuple = NULL; PyObject *kwargs = NULL; PyObject *console_result = NULL; + PyObject *main_module = NULL; PyObject *pyrepl = PyImport_ImportModule("_pyrepl.main"); if (pyrepl == NULL) { @@ -299,7 +300,13 @@ pymain_start_pyrepl_no_main(void) res = pymain_exit_err_print(); goto done; } - if (!PyDict_SetItemString(kwargs, "pythonstartup", _PyLong_GetOne())) { + main_module = PyImport_AddModuleRef("__main__"); + if (main_module == NULL) { + res = pymain_exit_err_print(); + goto done; + } + if (!PyDict_SetItemString(kwargs, "mainmodule", main_module) + && !PyDict_SetItemString(kwargs, "pythonstartup", pythonstartup ? Py_True : Py_False)) { console_result = PyObject_Call(console, empty_tuple, kwargs); if (console_result == NULL) { res = pymain_exit_err_print(); @@ -311,6 +318,7 @@ pymain_start_pyrepl_no_main(void) Py_XDECREF(empty_tuple); Py_XDECREF(console); Py_XDECREF(pyrepl); + Py_XDECREF(main_module); return res; } @@ -562,7 +570,7 @@ pymain_run_stdin(PyConfig *config) int run = PyRun_AnyFileExFlags(stdin, "", 0, &cf); return (run != 0); } - return pymain_run_module(L"_pyrepl", 0); + return pymain_start_pyrepl(0); } @@ -595,7 +603,7 @@ pymain_repl(PyConfig *config, int *exitcode) *exitcode = (run != 0); return; } - int run = pymain_start_pyrepl_no_main(); + int run = pymain_start_pyrepl(1); *exitcode = (run != 0); return; } From 4e9248f685225b517d528d4bd3c5682067f6b505 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 05:14:10 +0200 Subject: [PATCH 0192/1674] [3.14] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) (#134476) gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) (cherry picked from commit f3fc0c16e08b317cb201cf1073e934e6909f1251) gh-134062: Fix hash collisions in IPv4Network and IPv6Network gh-134062: Add hash collision regression test Co-authored-by: Mike Salvatore --- Lib/ipaddress.py | 2 +- Lib/test/test_ipaddress.py | 28 +++++++++++++++++++ ...-05-15-14-27-01.gh-issue-134062.fRbJet.rst | 3 ++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-15-14-27-01.gh-issue-134062.fRbJet.rst diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 703fa289dda1fb..d8a84f33264dc5 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -729,7 +729,7 @@ def __eq__(self, other): return NotImplemented def __hash__(self): - return hash(int(self.network_address) ^ int(self.netmask)) + return hash((int(self.network_address), int(self.netmask))) def __contains__(self, other): # always false if one is v4 and the other is v6. diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index d04012d1afd540..a06608d0016253 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -2762,6 +2762,34 @@ def testV6HashIsNotConstant(self): ipv6_address2 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:2") self.assertNotEqual(ipv6_address1.__hash__(), ipv6_address2.__hash__()) + # issue 134062 Hash collisions in IPv4Network and IPv6Network + def testNetworkV4HashCollisions(self): + self.assertNotEqual( + ipaddress.IPv4Network("192.168.1.255/32").__hash__(), + ipaddress.IPv4Network("192.168.1.0/24").__hash__() + ) + self.assertNotEqual( + ipaddress.IPv4Network("172.24.255.0/24").__hash__(), + ipaddress.IPv4Network("172.24.0.0/16").__hash__() + ) + self.assertNotEqual( + ipaddress.IPv4Network("192.168.1.87/32").__hash__(), + ipaddress.IPv4Network("192.168.1.86/31").__hash__() + ) + + # issue 134062 Hash collisions in IPv4Network and IPv6Network + def testNetworkV6HashCollisions(self): + self.assertNotEqual( + ipaddress.IPv6Network("fe80::/64").__hash__(), + ipaddress.IPv6Network("fe80::ffff:ffff:ffff:0/112").__hash__() + ) + self.assertNotEqual( + ipaddress.IPv4Network("10.0.0.0/8").__hash__(), + ipaddress.IPv6Network( + "ffff:ffff:ffff:ffff:ffff:ffff:aff:0/112" + ).__hash__() + ) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-05-15-14-27-01.gh-issue-134062.fRbJet.rst b/Misc/NEWS.d/next/Library/2025-05-15-14-27-01.gh-issue-134062.fRbJet.rst new file mode 100644 index 00000000000000..f62a3ec480193d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-15-14-27-01.gh-issue-134062.fRbJet.rst @@ -0,0 +1,3 @@ +:mod:`ipaddress`: fix collisions in :meth:`~object.__hash__` for +:class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network` +objects. From 03a211290e86cd276c71e28097aa868984e28b51 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 06:15:06 +0200 Subject: [PATCH 0193/1674] [3.14] gh-134309: Add ``github.actor`` to the GitHub Actions concurrency key (GH-134310) (#134484) gh-134309: Add ``github.actor`` to the GitHub Actions concurrency key (GH-134310) When inexperienced users create a PR from their default branch, all of the concurrency keys collide as there is no namespacing. This becomes an issue at events with many new contributors, where workflow runs are cancelled on other pull requests. Disambiguate by adding the username of the relevant 'actor' to the concurrency key. (cherry picked from commit 979d81a17905e922d32fb1671f9ed394e0ffbda6) Authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Kira Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Sviatoslav Sydorenko Co-authored-by: C.A.M. Gerlach --- .github/workflows/build.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3478af18f0e9cb..e26433786f74e4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,13 @@ permissions: contents: read concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}-reusable + # https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#concurrency + # 'group' must be a key uniquely representing a PR or push event. + # github.workflow is the workflow name + # github.actor is the user invoking the workflow + # github.head_ref is the source branch of the PR or otherwise blank + # github.run_id is a unique number for the current run + group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: From 9cef5c1f65d884f73f5ed1d7191a5621232e17b0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 10:20:11 +0200 Subject: [PATCH 0194/1674] [3.14] Add notes on nogil & reinitialization to the Opt-Out section in Module Isolation HOWTO (GH-134141) (GH-134492) Add notes on nogil & reinitialization to the Opt-Out section in Module Isolation HOWTO (GH-134141) (cherry picked from commit 1f0a294e8c2ff009c6b74ca5aa71da6269aec0dd) Co-authored-by: Petr Viktorin Co-authored-by: Sam Gross --- Doc/howto/isolating-extensions.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Doc/howto/isolating-extensions.rst b/Doc/howto/isolating-extensions.rst index a636e06bda8344..5513cd7367519f 100644 --- a/Doc/howto/isolating-extensions.rst +++ b/Doc/howto/isolating-extensions.rst @@ -215,21 +215,36 @@ multiple interpreters correctly. If this is not yet the case for your module, you can explicitly make your module loadable only once per process. For example:: + // A process-wide flag static int loaded = 0; + // Mutex to provide thread safety (only needed for free-threaded Python) + static PyMutex modinit_mutex = {0}; + static int exec_module(PyObject* module) { + PyMutex_Lock(&modinit_mutex); if (loaded) { + PyMutex_Unlock(&modinit_mutex); PyErr_SetString(PyExc_ImportError, "cannot load module more than once per process"); return -1; } loaded = 1; + PyMutex_Unlock(&modinit_mutex); // ... rest of initialization } +If your module's :c:member:`PyModuleDef.m_clear` function is able to prepare +for future re-initialization, it should clear the ``loaded`` flag. +In this case, your module won't support multiple instances existing +*concurrently*, but it will, for example, support being loaded after +Python runtime shutdown (:c:func:`Py_FinalizeEx`) and re-initialization +(:c:func:`Py_Initialize`). + + Module State Access from Functions ---------------------------------- From 64c265a63805fdc9eac62ac853891c8a58033201 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 10:34:46 +0200 Subject: [PATCH 0195/1674] [3.14] gh-131357: Add some extra tests for empty bytes and bytearray (GH-134458) (#134489) gh-131357: Add some extra tests for empty bytes and bytearray (GH-134458) (cherry picked from commit 7309eb60c077836b4b05a86ed23c710dbff737ec) Co-authored-by: Sergey Miryanov --- Lib/test/test_capi/test_bytearray.py | 6 ++++++ Lib/test/test_capi/test_bytes.py | 3 +++ 2 files changed, 9 insertions(+) diff --git a/Lib/test/test_capi/test_bytearray.py b/Lib/test/test_capi/test_bytearray.py index dfa98de9f007d8..52565ea34c61b8 100644 --- a/Lib/test/test_capi/test_bytearray.py +++ b/Lib/test/test_capi/test_bytearray.py @@ -66,6 +66,7 @@ def test_fromobject(self): # Test PyByteArray_FromObject() fromobject = _testlimitedcapi.bytearray_fromobject + self.assertEqual(fromobject(b''), bytearray(b'')) self.assertEqual(fromobject(b'abc'), bytearray(b'abc')) self.assertEqual(fromobject(bytearray(b'abc')), bytearray(b'abc')) self.assertEqual(fromobject(ByteArraySubclass(b'abc')), bytearray(b'abc')) @@ -115,6 +116,7 @@ def test_concat(self): self.assertEqual(concat(b'abc', bytearray(b'def')), bytearray(b'abcdef')) self.assertEqual(concat(bytearray(b'abc'), b''), bytearray(b'abc')) self.assertEqual(concat(b'', bytearray(b'def')), bytearray(b'def')) + self.assertEqual(concat(bytearray(b''), bytearray(b'')), bytearray(b'')) self.assertEqual(concat(memoryview(b'xabcy')[1:4], b'def'), bytearray(b'abcdef')) self.assertEqual(concat(b'abc', memoryview(b'xdefy')[1:4]), @@ -150,6 +152,10 @@ def test_resize(self): self.assertEqual(resize(ba, 0), 0) self.assertEqual(ba, bytearray()) + ba = bytearray(b'') + self.assertEqual(resize(ba, 0), 0) + self.assertEqual(ba, bytearray()) + ba = ByteArraySubclass(b'abcdef') self.assertEqual(resize(ba, 3), 0) self.assertEqual(ba, bytearray(b'abc')) diff --git a/Lib/test/test_capi/test_bytes.py b/Lib/test/test_capi/test_bytes.py index 86d5692893fc98..bc820bd68d9e21 100644 --- a/Lib/test/test_capi/test_bytes.py +++ b/Lib/test/test_capi/test_bytes.py @@ -81,6 +81,7 @@ def test_fromobject(self): # Test PyBytes_FromObject() fromobject = _testlimitedcapi.bytes_fromobject + self.assertEqual(fromobject(b''), b'') self.assertEqual(fromobject(b'abc'), b'abc') self.assertEqual(fromobject(bytearray(b'abc')), b'abc') self.assertEqual(fromobject(BytesSubclass(b'abc')), b'abc') @@ -138,6 +139,7 @@ def test_repr(self): # Test PyBytes_Repr() bytes_repr = _testlimitedcapi.bytes_repr + self.assertEqual(bytes_repr(b'', 0), r"""b''""") self.assertEqual(bytes_repr(b'''abc''', 0), r"""b'abc'""") self.assertEqual(bytes_repr(b'''abc''', 1), r"""b'abc'""") self.assertEqual(bytes_repr(b'''a'b"c"d''', 0), r"""b'a\'b"c"d'""") @@ -197,6 +199,7 @@ def test_decodeescape(self): """Test PyBytes_DecodeEscape()""" decodeescape = _testlimitedcapi.bytes_decodeescape + self.assertEqual(decodeescape(b''), b'') self.assertEqual(decodeescape(b'abc'), b'abc') self.assertEqual(decodeescape(br'\t\n\r\x0b\x0c\x00\\\'\"'), b'''\t\n\r\v\f\0\\'"''') From d5f7e80d4407655919b32bbd5746b23af174bc5b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 11:57:42 +0200 Subject: [PATCH 0196/1674] [3.14] Consistent sentence case in docs template files (GH-134412) (#134495) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/tools/templates/customsourcelink.html | 6 +++--- Doc/tools/templates/download.html | 2 +- Doc/tools/templates/indexcontent.html | 2 +- Doc/tools/templates/indexsidebar.html | 10 +++++----- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index eb9db9e341bd75..43d3a7a892a880 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -1,11 +1,11 @@ {%- if show_source and has_source and sourcename %}
-

{{ _('This Page') }}

+

{{ _('This page') }}

diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index 4645f7d394e29e..47a57eb111ba50 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -27,7 +27,7 @@ {%- endblock -%} {% block body %} -

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

+

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

{% if last_updated %}

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

{% endif %} diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index 06a4223643a05a..544cc4234f441e 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -72,7 +72,7 @@

{{ docstitle|e }}

- - - - - @@ -69,6 +64,13 @@

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

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

+

{% trans %} +We no longer provide pre-built PDFs of the documentation. +To build a PDF archive, follow the instructions in the +Developer's Guide +and run make dist-pdf in the Doc/ directory of a copy of the CPython repository. +{% endtrans %}

+

{% trans %}Unpacking{% endtrans %}

From 1ae1db8056770a5979c7b359dc80f0fb8c06a383 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 1 Oct 2025 07:39:54 +0200 Subject: [PATCH 0948/1674] [3.14] Document that `PyInterpreterState_GetDict` returns a borrowed reference (GH-139451) (#139463) Document that `PyInterpreterState_GetDict` returns a borrowed reference (GH-139451) (cherry picked from commit 80cdf3ef74f6622899c1c82af1e08492e4ab7a00) Co-authored-by: Petr Viktorin --- Doc/c-api/init.rst | 3 +++ Doc/data/refcounts.dat | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 6a272a4f5fcb87..416bece23bcbb4 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1547,6 +1547,9 @@ All of the following functions must be called after :c:func:`Py_Initialize`. This is not a replacement for :c:func:`PyModule_GetState()`, which extensions should use to store interpreter-specific state information. + The returned dictionary is borrowed from the interpreter and is valid until + interpreter shutdown. + .. versionadded:: 3.8 diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index a6f1fc4e937c94..1cc1b44a5b8e3a 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -1144,6 +1144,9 @@ PyInterpreterState_Clear:PyInterpreterState*:interp:: PyInterpreterState_Delete:void::: PyInterpreterState_Delete:PyInterpreterState*:interp:: +PyInterpreterState_GetDict:PyObject*::0: +PyInterpreterState_GetDict:PyInterpreterState*:interp:: + PyInterpreterState_GetID:int64_t::: PyInterpreterState_GetID:PyInterpreterState*:interp:: From 20f472b629492b08f4661dd623ab1d6b97e6c26b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:29:07 +0200 Subject: [PATCH 0949/1674] [3.14] GH-123299: Copyedit 3.14 What's New: Deprecated (GH-139433) (#139457) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 104 +++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 46 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 9f88271161a869..c3cfcdfca7c8b1 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -2660,25 +2660,34 @@ urllib Deprecated ========== +New deprecations +---------------- + +* Passing a complex number as the *real* or *imag* argument in the + :func:`complex` constructor is now deprecated; + complex numbers should only be passed as a single positional argument. + (Contributed by Serhiy Storchaka in :gh:`109218`.) + * :mod:`argparse`: - * Passing the undocumented keyword argument *prefix_chars* to - :meth:`~argparse.ArgumentParser.add_argument_group` is now - deprecated. + * Passing the undocumented keyword argument *prefix_chars* to the + :meth:`~argparse.ArgumentParser.add_argument_group` method is now deprecated. (Contributed by Savannah Ostrowski in :gh:`125563`.) + * Deprecated the :class:`argparse.FileType` type converter. - Anything with resource management should be done downstream after the - arguments are parsed. + Anything relating to resource management should be handled + downstream, after the arguments have been parsed. (Contributed by Serhiy Storchaka in :gh:`58032`.) * :mod:`asyncio`: - * :func:`!asyncio.iscoroutinefunction` is deprecated + * The :func:`!asyncio.iscoroutinefunction` is now 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:`asyncio` policy system is deprecated and will be removed in Python 3.16. + * The :mod:`asyncio` policy system is deprecated + and will be removed in Python 3.16. In particular, the following classes and functions are deprecated: * :class:`asyncio.AbstractEventLoopPolicy` @@ -2689,99 +2698,102 @@ Deprecated * :func:`asyncio.set_event_loop_policy` Users should use :func:`asyncio.run` or :class:`asyncio.Runner` with - *loop_factory* to use the desired event loop implementation. + the *loop_factory* argument to use the desired event loop implementation. - For example, to use :class:`asyncio.SelectorEventLoop` on Windows:: + For example, to use :class:`asyncio.SelectorEventLoop` on Windows: - import asyncio + .. code-block:: python - async def main(): - ... + import asyncio - asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop) + async def main(): + ... - (Contributed by Kumar Aditya in :gh:`127949`.) + asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop) -* :mod:`builtins`: - 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`.) + (Contributed by Kumar Aditya in :gh:`127949`.) * :mod:`codecs`: - :func:`codecs.open` is now deprecated. Use :func:`open` instead. + The :func:`codecs.open` function is now deprecated, + and will be removed in a future version of Python. + Use :func:`open` instead. (Contributed by Inada Naoki in :gh:`133036`.) * :mod:`ctypes`: * On non-Windows platforms, setting :attr:`.Structure._pack_` to use a - MSVC-compatible default memory layout is deprecated in favor of setting - :attr:`.Structure._layout_` to ``'ms'``. + MSVC-compatible default memory layout is now deprecated in favor of setting + :attr:`.Structure._layout_` to ``'ms'``, and will be removed in Python 3.19. (Contributed by Petr Viktorin in :gh:`131747`.) - * Calling :func:`ctypes.POINTER` on a string is deprecated. - Use :ref:`ctypes-incomplete-types` for self-referential structures. + * Calling :func:`ctypes.POINTER` on a string is now deprecated. + Use :ref:`incomplete types ` + for self-referential structures. Also, the internal ``ctypes._pointer_type_cache`` is deprecated. See :func:`ctypes.POINTER` for updated implementation details. (Contributed by Sergey Myrianov in :gh:`100926`.) * :mod:`functools`: Calling the Python implementation of :func:`functools.reduce` with *function* - or *sequence* as keyword arguments is now deprecated. + or *sequence* as keyword arguments is now deprecated; + the parameters will be made positional-only in Python 3.16. (Contributed by Kirill Podoprigora in :gh:`121676`.) * :mod:`logging`: - Support for custom logging handlers with the *strm* argument is deprecated - and scheduled for removal in Python 3.16. Define handlers with the *stream* - argument instead. (Contributed by Mariusz Felisiak in :gh:`115032`.) + Support for custom logging handlers with the *strm* argument + is now deprecated and scheduled for removal in Python 3.16. + Define handlers with the *stream* argument instead. + (Contributed by Mariusz Felisiak in :gh:`115032`.) * :mod:`mimetypes`: - Valid extensions start with a '.' or are empty for + Valid extensions are either empty or must start with '.' for :meth:`mimetypes.MimeTypes.add_type`. Undotted extensions are deprecated and will raise a :exc:`ValueError` in Python 3.16. (Contributed by Hugo van Kemenade in :gh:`75223`.) -* :mod:`!nturl2path`: This module is now deprecated. Call - :func:`urllib.request.url2pathname` and :func:`~urllib.request.pathname2url` - instead. +* :mod:`!nturl2path`: + This module is now deprecated. Call :func:`urllib.request.url2pathname` + and :func:`~urllib.request.pathname2url` instead. (Contributed by Barney Gale in :gh:`125866`.) * :mod:`os`: - :term:`Soft deprecate ` :func:`os.popen` and - :func:`os.spawn* ` functions. They should no longer be used to - write new code. The :mod:`subprocess` module is recommended instead. + The :func:`os.popen` and :func:`os.spawn* ` functions + are now :term:`soft deprecated`. + They should no longer be used to write new code. + The :mod:`subprocess` module is recommended instead. (Contributed by Victor Stinner in :gh:`120743`.) * :mod:`pathlib`: - :meth:`!pathlib.PurePath.as_uri` is deprecated and will be removed in Python - 3.19. Use :meth:`pathlib.Path.as_uri` instead. + :meth:`!pathlib.PurePath.as_uri` is now deprecated + and scheduled for removal in Python 3.19. + Use :meth:`pathlib.Path.as_uri` instead. (Contributed by Barney Gale in :gh:`123599`.) * :mod:`pdb`: The undocumented ``pdb.Pdb.curframe_locals`` attribute is now a deprecated - read-only property. The low overhead dynamic frame locals access added in - Python 3.13 by PEP 667 means the frame locals cache reference previously - stored in this attribute is no longer needed. Derived debuggers should access + read-only property, which will be removed in a future version of Python. + The low overhead dynamic frame locals access added in Python 3.13 by :pep:`667` + means the frame locals cache reference previously stored in this attribute + is no longer needed. Derived debuggers should access ``pdb.Pdb.curframe.f_locals`` directly in Python 3.13 and later versions. (Contributed by Tian Gao in :gh:`124369` and :gh:`125951`.) * :mod:`symtable`: - Deprecate :meth:`symtable.Class.get_methods` due to the lack of interest. + Deprecate :meth:`symtable.Class.get_methods` due to the lack of interest, + scheduled for removal in Python 3.16. (Contributed by Bénédikt Tran in :gh:`119698`.) * :mod:`tkinter`: The :class:`!tkinter.Variable` methods :meth:`!trace_variable`, :meth:`!trace_vdelete` and :meth:`!trace_vinfo` are now deprecated. - Use :meth:`!trace_add`, :meth:`!trace_remove` and :meth:`!trace_info` - instead. + Use :meth:`!trace_add`, :meth:`!trace_remove` and :meth:`!trace_info` instead. (Contributed by Serhiy Storchaka in :gh:`120220`.) * :mod:`urllib.parse`: Accepting objects with false values (like ``0`` and ``[]``) except empty - strings, byte-like objects and ``None`` in :mod:`urllib.parse` functions - :func:`~urllib.parse.parse_qsl` and :func:`~urllib.parse.parse_qs` is now - deprecated. + strings, bytes-like objects and ``None`` in :func:`~urllib.parse.parse_qsl` + and :func:`~urllib.parse.parse_qs` is now deprecated. (Contributed by Serhiy Storchaka in :gh:`116897`.) .. Add deprecations above alphabetically, not here at the end. From 86bc87b30d9548c4bef9a276f4d5250064009f2e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 1 Oct 2025 15:50:33 +0200 Subject: [PATCH 0950/1674] [3.14] gh-132006: Add support for handling XCPrivacy manifests (GH-139163) (#139410) Co-authored-by: Russell Keith-Magee --- Apple/__main__.py | 20 ++++++++++++++++- .../testbed/Python.xcframework/build/utils.sh | 13 +++++++++++ Doc/using/ios.rst | 22 ++++++++++++++++++- ...-08-28-06-22-26.gh-issue-132006.eZQmc6.rst | 2 ++ 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst diff --git a/Apple/__main__.py b/Apple/__main__.py index fc19b31be97bb2..88b54e91ac84d6 100644 --- a/Apple/__main__.py +++ b/Apple/__main__.py @@ -316,7 +316,7 @@ def unpack_deps( for name_ver in [ "BZip2-1.0.8-2", "libFFI-3.4.7-2", - "OpenSSL-3.0.16-2", + "OpenSSL-3.0.17-1", "XZ-5.6.4-2", "mpdecimal-4.0.0-2", "zstd-1.5.7-1", @@ -577,6 +577,7 @@ def create_xcframework(platform: str) -> str: # Extract the package version from the merged framework version = package_version(package_path / "Python.xcframework") + version_tag = ".".join(version.split(".")[:2]) # On non-macOS platforms, each framework in XCframework only contains the # headers, libPython, plus an Info.plist. Other resources like the standard @@ -647,6 +648,23 @@ def create_xcframework(platform: str) -> str: slice_framework / f"Headers/pyconfig-{arch}.h", ) + # Apple identifies certain libraries as "security risks"; if you + # statically link those libraries into a Framework, you become + # responsible for providing a privacy manifest for that framework. + xcprivacy_file = { + "OpenSSL": subdir(host_triple) / "prefix/share/OpenSSL.xcprivacy" + } + print(f" - {multiarch} xcprivacy files") + for module, lib in [ + ("_hashlib", "OpenSSL"), + ("_ssl", "OpenSSL"), + ]: + shutil.copy( + xcprivacy_file[lib], + slice_path + / f"lib-{arch}/python{version_tag}/lib-dynload/{module}.xcprivacy", + ) + print(" - build tools") shutil.copytree( PYTHON_DIR / "Apple/testbed/Python.xcframework/build", diff --git a/Apple/testbed/Python.xcframework/build/utils.sh b/Apple/testbed/Python.xcframework/build/utils.sh index 9cfe74720f26d4..961c46d014b5f5 100755 --- a/Apple/testbed/Python.xcframework/build/utils.sh +++ b/Apple/testbed/Python.xcframework/build/utils.sh @@ -67,6 +67,9 @@ install_dylib () { # The name of the extension file EXT=$(basename "$FULL_EXT") + # The name and location of the module + MODULE_PATH=$(dirname "$FULL_EXT") + MODULE_NAME=$(echo $EXT | cut -d "." -f 1) # 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 @@ -94,6 +97,16 @@ install_dylib () { # 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" + # If the framework provides an xcprivacy file, install it. + if [ -e "$MODULE_PATH/$MODULE_NAME.xcprivacy" ]; then + echo "Installing XCPrivacy file for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME" + XCPRIVACY_FILE="$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/PrivacyInfo.xcprivacy" + if [ -e "$XCPRIVACY_FILE" ]; then + rm -rf "$XCPRIVACY_FILE" + fi + mv "$MODULE_PATH/$MODULE_NAME.xcprivacy" "$XCPRIVACY_FILE" + fi + echo "Signing framework as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)..." /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 "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER" } diff --git a/Doc/using/ios.rst b/Doc/using/ios.rst index c02dac444dd7cc..5e4033fb6cec7a 100644 --- a/Doc/using/ios.rst +++ b/Doc/using/ios.rst @@ -328,7 +328,12 @@ 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. +rules that inspect the submitted application bundle for problematic code. There +are some steps that must be taken to ensure that your app will be able to pass +these validation steps. + +Incompatible code in the standard library +----------------------------------------- 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 @@ -339,3 +344,18 @@ 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. + +Privacy manifests +----------------- + +In April 2025, Apple introduced a requirement for `certain third-party +libraries to provide a Privacy Manifest +`__. +As a result, if you have a binary module that uses one of the affected +libraries, you must provide an ``.xcprivacy`` file for that library. +OpenSSL is one library affected by this requirement, but there are others. + +If you produce a binary module named ``mymodule.so``, and use you the Xcode +build script described in step 7 above, you can place a ``mymodule.xcprivacy`` +file next to ``mymodule.so``, and the privacy manifest will be installed into +the required location when the binary module is converted into a framework. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst b/Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst new file mode 100644 index 00000000000000..8e7910768648a0 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst @@ -0,0 +1,2 @@ +XCframeworks now include privacy manifests to satisfy Apple App Store +submission requirements. From a312dd0f1e06af64380d1851f66def956afe7383 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 2 Oct 2025 16:37:19 +0200 Subject: [PATCH 0951/1674] [3.14] gh-139487: add missing imports for standalone doctest `Enum` examples (GH-139488) (#139493) gh-139487: add missing imports for standalone doctest `Enum` examples (GH-139488) (cherry picked from commit f3d7faeafa9618b38980813f22d0a64f7b2bd441) Co-authored-by: Peter <35064951+ttw225@users.noreply.github.com> --- Doc/library/enum.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 8875669ffccc37..a8a7e671aadca2 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -315,6 +315,7 @@ Data Types Returns ``['__class__', '__doc__', '__module__', 'name', 'value']`` and any public methods defined on *self.__class__*:: + >>> from enum import Enum >>> from datetime import date >>> class Weekday(Enum): ... MONDAY = 1 @@ -341,7 +342,7 @@ Data Types A *staticmethod* that is used to determine the next value returned by :class:`auto`:: - >>> from enum import auto + >>> from enum import auto, Enum >>> class PowersOfThree(Enum): ... @staticmethod ... def _generate_next_value_(name, start, count, last_values): @@ -373,7 +374,7 @@ Data Types A *classmethod* for looking up values not found in *cls*. By default it does nothing, but can be overridden to implement custom search behavior:: - >>> from enum import StrEnum + >>> from enum import auto, StrEnum >>> class Build(StrEnum): ... DEBUG = auto() ... OPTIMIZED = auto() @@ -412,6 +413,7 @@ Data Types Returns the string used for *repr()* calls. By default, returns the *Enum* name, member name, and value, but can be overridden:: + >>> from enum import auto, Enum >>> class OtherStyle(Enum): ... ALTERNATE = auto() ... OTHER = auto() @@ -428,6 +430,7 @@ Data Types Returns the string used for *str()* calls. By default, returns the *Enum* name and member name, but can be overridden:: + >>> from enum import auto, Enum >>> class OtherStyle(Enum): ... ALTERNATE = auto() ... OTHER = auto() @@ -443,6 +446,7 @@ Data Types Returns the string used for *format()* and *f-string* calls. By default, returns :meth:`__str__` return value, but can be overridden:: + >>> from enum import auto, Enum >>> class OtherStyle(Enum): ... ALTERNATE = auto() ... OTHER = auto() From 22c63945c194ead0dc587572ab7e8395a2cb3a03 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 2 Oct 2025 23:11:58 +0200 Subject: [PATCH 0952/1674] [3.14] gh-139495: Fix `hashlib.file_digest()` versionchanged description of `BlockingIOError` (GH-139496) (#139522) Co-authored-by: Alex Willmer --- Doc/library/hashlib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index 4818a4944a512a..855a6efc9f781c 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -303,7 +303,7 @@ a file or file-like object. .. versionadded:: 3.11 .. versionchanged:: 3.14 - Now raises a :exc:`BlockingIOError` if the file is opened in blocking + Now raises a :exc:`BlockingIOError` if the file is opened in non-blocking mode. Previously, spurious null bytes were added to the digest. From a81eeaf5829766fa51c099490c61b369db2903f3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:16:01 +0200 Subject: [PATCH 0953/1674] [3.14] gh-137638: Use macos-15-intel in GitHub Actions (GH-139154) (#139545) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jacob Coffee Co-authored-by: 🇺🇦 Sviatoslav Sydorenko (Святослав Сидоренко) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/actionlint.yaml | 3 ++- .github/workflows/build.yml | 6 +++--- .github/workflows/jit.yml | 7 +------ .github/workflows/reusable-macos.yml | 6 +++--- .github/workflows/tail-call.yml | 9 +-------- 5 files changed, 10 insertions(+), 21 deletions(-) diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index 68aae196357414..267ff6b42a8655 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -1,6 +1,7 @@ self-hosted-runner: # Pending https://github.com/rhysd/actionlint/issues/533 - labels: ["windows-11-arm"] + # and https://github.com/rhysd/actionlint/issues/571 + labels: ["windows-11-arm", "macos-15-intel"] config-variables: null diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf0d67162ad4aa..83abaf89d126e6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -249,13 +249,13 @@ jobs: strategy: fail-fast: false matrix: - # Cirrus and macos-14 are M1, macos-13 is default GHA Intel. + # Cirrus and macos-14 are M1, macos-15-intel 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 + - macos-15-intel is-fork: # only used for the exclusion trick - ${{ github.repository_owner != 'python' }} free-threading: @@ -266,7 +266,7 @@ jobs: is-fork: true - os: macos-14 is-fork: false - - os: macos-13 + - os: macos-15-intel free-threading: true uses: ./.github/workflows/reusable-macos.yml with: diff --git a/.github/workflows/jit.yml b/.github/workflows/jit.yml index 9bea10f803e043..c7baad7d68138e 100644 --- a/.github/workflows/jit.yml +++ b/.github/workflows/jit.yml @@ -77,7 +77,7 @@ jobs: runner: windows-11-arm - target: x86_64-apple-darwin/clang architecture: x86_64 - runner: macos-13 + runner: macos-15-intel - target: aarch64-apple-darwin/clang architecture: aarch64 runner: macos-14 @@ -102,15 +102,10 @@ jobs: ./PCbuild/build.bat --experimental-jit ${{ matrix.debug && '-d' || '' }} -p ${{ matrix.architecture }} ./PCbuild/rt.bat ${{ matrix.debug && '-d' || '' }} -p ${{ matrix.architecture }} -q --multiprocess 0 --timeout 4500 --verbose2 --verbose3 - # The `find` line is required as a result of https://github.com/actions/runner-images/issues/9966. - # This is a bug in the macOS runner image where the pre-installed Python is installed in the same - # directory as the Homebrew Python, which causes the build to fail for macos-13. This line removes - # the symlink to the pre-installed Python so that the Homebrew Python is used instead. - name: macOS if: runner.os == 'macOS' run: | brew update - find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete brew install llvm@${{ matrix.llvm }} export SDKROOT="$(xcrun --show-sdk-path)" # Set MACOSX_DEPLOYMENT_TARGET and -Werror=unguarded-availability to diff --git a/.github/workflows/reusable-macos.yml b/.github/workflows/reusable-macos.yml index de0c40221364ad..87bcd5786e7a88 100644 --- a/.github/workflows/reusable-macos.yml +++ b/.github/workflows/reusable-macos.yml @@ -60,15 +60,15 @@ jobs: --prefix=/opt/python-dev \ --with-openssl="$(brew --prefix openssl@3.0)" - name: Build CPython - if : ${{ inputs.free-threading || inputs.os != 'macos-13' }} + if : ${{ inputs.free-threading || inputs.os != 'macos-15-intel' }} run: gmake -j8 - name: Build CPython for compiler warning check - if : ${{ !inputs.free-threading && inputs.os == 'macos-13' }} + if : ${{ !inputs.free-threading && inputs.os == 'macos-15-intel' }} run: set -o pipefail; gmake -j8 --output-sync 2>&1 | tee compiler_output_macos.txt - name: Display build info run: make pythoninfo - name: Check compiler warnings - if : ${{ !inputs.free-threading && inputs.os == 'macos-13' }} + if : ${{ !inputs.free-threading && inputs.os == 'macos-15-intel' }} run: >- python3 Tools/build/check_warnings.py --compiler-output-file-path=compiler_output_macos.txt diff --git a/.github/workflows/tail-call.yml b/.github/workflows/tail-call.yml index d4a84223b7b8a5..e99e317182eaa6 100644 --- a/.github/workflows/tail-call.yml +++ b/.github/workflows/tail-call.yml @@ -58,7 +58,7 @@ jobs: # runner: windows-2022 - target: x86_64-apple-darwin/clang architecture: x86_64 - runner: macos-13 + runner: macos-15-intel - target: aarch64-apple-darwin/clang architecture: aarch64 runner: macos-14 @@ -101,17 +101,10 @@ jobs: set LLVMInstallDir=C:\Program Files\LLVM ./PCbuild/build.bat --tail-call-interp -p ${{ matrix.architecture }} - # The `find` line is required as a result of https://github.com/actions/runner-images/issues/9966. - # This is a bug in the macOS runner image where the pre-installed Python is installed in the same - # directory as the Homebrew Python, which causes the build to fail for macos-13. This line removes - # the symlink to the pre-installed Python so that the Homebrew Python is used instead. - # Note: when a new LLVM is released, the homebrew installation directory changes, so the builds will fail. - # We either need to upgrade LLVM or change the directory being pointed to. - name: Native macOS (release) if: runner.os == 'macOS' run: | brew update - find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete brew install llvm@${{ matrix.llvm }} export SDKROOT="$(xcrun --show-sdk-path)" export PATH="/usr/local/opt/llvm@${{ matrix.llvm }}/bin:$PATH" From 292b6cf3e67d1d127ebaf5e7b57c706ba8f9610a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:20:35 +0200 Subject: [PATCH 0954/1674] [3.14] Document `Py_AddPendingCall()` change with subinterpreters in 3.12 (GH-139117) (#139118) Co-authored-by: Peter Bierma --- Doc/c-api/init.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 416bece23bcbb4..c36e0b4c000155 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -2002,6 +2002,10 @@ pointer and a void pointer argument. called from the main interpreter. Each subinterpreter now has its own list of scheduled calls. + .. versionchanged:: 3.12 + This function now always schedules *func* to be run in the main + interpreter. + .. _profiling: Profiling and Tracing From a73fc979cd422c7689ea77dd02801d71ac36061e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:21:28 +0200 Subject: [PATCH 0955/1674] [3.14] gh-105987: unskip `test_issue105987` from `test_asyncio.test_eager_task_factory` (GH-139538) (#139539) Co-authored-by: Kumar Aditya --- Lib/test/test_asyncio/test_eager_task_factory.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_asyncio/test_eager_task_factory.py b/Lib/test/test_asyncio/test_eager_task_factory.py index da79ee9260a0e3..0561b54a3f19c6 100644 --- a/Lib/test/test_asyncio/test_eager_task_factory.py +++ b/Lib/test/test_asyncio/test_eager_task_factory.py @@ -316,11 +316,9 @@ def tearDown(self): asyncio.all_tasks = asyncio.tasks.all_tasks = self._all_tasks return super().tearDown() - - @unittest.skip("skip") def test_issue105987(self): code = """if 1: - from _asyncio import _swap_current_task + from _asyncio import _swap_current_task, _set_running_loop class DummyTask: pass @@ -329,6 +327,7 @@ class DummyLoop: pass l = DummyLoop() + _set_running_loop(l) _swap_current_task(l, DummyTask()) t = _swap_current_task(l, None) """ From e7ee62b5c872dace02abbb45107033030cb0dbf0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:46:29 +0200 Subject: [PATCH 0956/1674] [3.14] GH-123299: Copyedit 3.14 What's New: Other Language Changes (GH-139425) (#139508) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 338 ++++++++++++++++++++++-------------------- 1 file changed, 180 insertions(+), 158 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index c3cfcdfca7c8b1..b460c046337078 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -89,12 +89,12 @@ and improvements in user-friendliness and correctness. * :ref:`PEP 750: Template strings ` * :ref:`PEP 758: Allow except and except* expressions without parentheses ` * :ref:`PEP 761: Discontinuation of PGP signatures ` -* :ref:`PEP 765: Disallow return/break/continue that exit a finally block ` +* :ref:`PEP 765: Disallow return/break/continue that exit a finally block ` * :ref:`Free-threaded mode improvements ` * :ref:`PEP 768: Safe external debugger interface for CPython ` * :ref:`PEP 784: Adding Zstandard to the standard library ` * :ref:`A new type of interpreter ` -* :ref:`Syntax highlighting in PyREPL `, +* :ref:`Syntax highlighting in the default interactive shell `, and color output in :ref:`unittest `, :ref:`argparse `, :ref:`json ` and @@ -102,25 +102,6 @@ and improvements in user-friendliness and correctness. * :ref:`Binary releases for the experimental just-in-time compiler ` -Incompatible changes -==================== - -On platforms other than macOS and Windows, the default :ref:`start -method ` for :mod:`multiprocessing` -and :class:`~concurrent.futures.ProcessPoolExecutor` switches from -*fork* to *forkserver*. - -See :ref:`(1) ` and -:ref:`(2) ` for details. - -If you encounter :exc:`NameError`\s or pickling errors coming out of -:mod:`multiprocessing` or :mod:`concurrent.futures`, see the -:ref:`forkserver restrictions `. - -The interpreter avoids some reference count modifications internally when -it's safe to do so. This can lead to different values returned from -:func:`sys.getrefcount` and :c:func:`Py_REFCNT` compared to previous versions -of Python. See :ref:`below ` for details. New features ============ @@ -751,6 +732,12 @@ Improved error messages ~^^^ TypeError: cannot use 'list' as a dict key (unhashable type: 'list') +* Improved error message when an object supporting the synchronous + context manager protocol is entered using :keyword:`async with` + instead of :keyword:`with`, + and vice versa for the asynchronous context manager protocol. + (Contributed by Bénédikt Tran in :gh:`128398`.) + .. _whatsnew314-pep741: @@ -996,26 +983,6 @@ affects other modules that use context variables, such as the :mod:`decimal` context manager. -.. _whatsnew314-pyrepl-highlighting: - -Syntax highlighting in PyREPL ------------------------------ - -The default :term:`interactive` shell now highlights Python syntax as you -type. The feature is enabled by default unless the -:envvar:`PYTHON_BASIC_REPL` environment is set or any color-disabling -environment variables are used. See :ref:`using-on-controlling-color` for -details. - -The default color theme for syntax highlighting strives for good contrast -and uses exclusively the 4-bit VGA standard ANSI color codes for maximum -compatibility. The theme can be customized using an experimental API -``_colorize.set_theme()``. This can be called interactively, as well as -in the :envvar:`PYTHONSTARTUP` script. - -(Contributed by Łukasz Langa in :gh:`131507`.) - - .. _whatsnew314-jit-compiler: Binary releases for the experimental just-in-time compiler @@ -1058,28 +1025,6 @@ free-threaded build and false for the GIL-enabled build. (Contributed by Neil Schemenauer and Kumar Aditya in :gh:`130010`.) -.. _whatsnew314-incremental-gc: - -Incremental garbage collection ------------------------------- - -The cycle garbage collector is now incremental. -This means that maximum pause times are reduced -by an order of magnitude or more for larger heaps. - -There are now only two generations: young and old. -When :func:`gc.collect` is not called directly, the -GC is invoked a little less frequently. When invoked, it -collects the young generation and an increment of the -old generation, instead of collecting one or more generations. - -The behavior of :func:`!gc.collect` changes slightly: - -* ``gc.collect(1)``: Performs an increment of garbage collection, - rather than collecting generation 1. -* Other calls to :func:`!gc.collect` are unchanged. - -(Contributed by Mark Shannon in :gh:`108362`.) Platform support ================ @@ -1088,141 +1033,180 @@ Platform support :pep:`tier 3 <11#tier-3>`. As a part of this effort, more than 25 bugs in `Emscripten libc`__ were fixed. Emscripten now includes support for :mod:`ctypes`, :mod:`termios`, and :mod:`fcntl`, as well as - experimental support for :ref:`PyREPL `. + experimental support for the new :ref:`default interactive shell + `. (Contributed by R. Hood Chatham in :gh:`127146`, :gh:`127683`, and :gh:`136931`.) __ https://emscripten.org/docs/porting/emscripten-runtime-environment.html +* iOS and macOS apps can now be configured to redirect ``stdout`` and + ``stderr`` content to the system log. + (Contributed by Russell Keith-Magee in :gh:`127592`.) + +* The iOS testbed is now able to stream test output while the test is running. + The testbed can also be used to run the test suite of projects other than + CPython itself. + (Contributed by Russell Keith-Magee in :gh:`127592`.) + + Other language changes ====================== -* The default :term:`interactive` shell now supports import autocompletion. - This means that typing ``import foo`` and pressing ```` will suggest - modules starting with ``foo``. Similarly, typing ``from foo import b`` will - suggest submodules of ``foo`` starting with ``b``. Note that autocompletion - of module attributes is not currently supported. - (Contributed by Tomas Roun in :gh:`69605`.) - -* The :func:`map` built-in now has an optional keyword-only *strict* flag - like :func:`zip` to check that all the iterables are of equal length. - (Contributed by Wannes Boeykens in :gh:`119793`.) +* All Windows code pages are now supported as 'cpXXX' codecs on Windows. + (Contributed by Serhiy Storchaka in :gh:`123803`.) -* Incorrect usage of :keyword:`await` and asynchronous comprehensions - is now detected even if the code is optimized away by the :option:`-O` - command-line option. For example, ``python -O -c 'assert await 1'`` - now produces a :exc:`SyntaxError`. (Contributed by Jelle Zijlstra in :gh:`121637`.) +* Implement mixed-mode arithmetic rules combining real and complex numbers + as specified by the C standard since C99. + (Contributed by Sergey B Kirpichev in :gh:`69639`.) -* Writes to ``__debug__`` are now detected even if the code is optimized - away by the :option:`-O` command-line option. For example, - ``python -O -c 'assert (__debug__ := 1)'`` now produces a - :exc:`SyntaxError`. (Contributed by Irit Katriel in :gh:`122245`.) +* More syntax errors are now detected regardless of optimisation and + the :option:`-O` command-line option. + This includes writes to ``__debug__``, incorrect use of :keyword:`await`, + and asynchronous comprehensions outside asynchronous functions. + For example, ``python -O -c 'assert (__debug__ := 1)'`` + or ``python -O -c 'assert await 1'`` now produce :exc:`SyntaxError`\ s. + (Contributed by Irit Katriel and Jelle Zijlstra in :gh:`122245` & :gh:`121637`.) -* Add class methods :meth:`float.from_number` and :meth:`complex.from_number` - to convert a number to :class:`float` or :class:`complex` type correspondingly. - They raise an error if the argument is a string. - (Contributed by Serhiy Storchaka in :gh:`84978`.) +* When subclassing a pure C type, the C slots for the new type + are no longer replaced with a wrapped version on class creation + if they are not explicitly overridden in the subclass. + (Contributed by Tomasz Pytel in :gh:`132284`.) -* Implement mixed-mode arithmetic rules combining real and complex numbers as - specified by C standards since C99. - (Contributed by Sergey B Kirpichev in :gh:`69639`.) -* All Windows code pages are now supported as "cpXXX" codecs on Windows. - (Contributed by Serhiy Storchaka in :gh:`123803`.) +Built-ins +--------- -* :class:`super` objects are now :mod:`pickleable ` and - :mod:`copyable `. - (Contributed by Serhiy Storchaka in :gh:`125767`.) +* The :meth:`bytes.fromhex` and :meth:`bytearray.fromhex` methods now accept + ASCII :class:`bytes` and :term:`bytes-like objects `. + (Contributed by Daniel Pope in :gh:`129349`.) -* The :class:`memoryview` type now supports subscription, - making it a :term:`generic type`. - (Contributed by Brian Schubert in :gh:`126012`.) +* Add class methods :meth:`float.from_number` and :meth:`complex.from_number` + to convert a number to :class:`float` or :class:`complex` type correspondingly. + They raise a :exc:`TypeError` if the argument is not a real number. + (Contributed by Serhiy Storchaka in :gh:`84978`.) * Support underscore and comma as thousands separators in the fractional part for floating-point presentation types of the new-style string formatting (with :func:`format` or :ref:`f-strings`). (Contributed by Sergey B Kirpichev in :gh:`87790`.) -* The :func:`bytes.fromhex` and :func:`bytearray.fromhex` methods now accept - ASCII :class:`bytes` and :term:`bytes-like objects `. - (Contributed by Daniel Pope in :gh:`129349`.) - -* Support ``\z`` as a synonym for ``\Z`` in :mod:`regular expressions `. - It is interpreted unambiguously in many other regular expression engines, - unlike ``\Z``, which has subtly different behavior. - (Contributed by Serhiy Storchaka in :gh:`133306`.) +* The :func:`int` function no longer delegates to :meth:`~object.__trunc__`. + Classes that want to support conversion to :func:`!int` must implement + either :meth:`~object.__int__` or :meth:`~object.__index__`. + (Contributed by Mark Dickinson in :gh:`119743`.) -* ``\B`` in :mod:`regular expression ` now matches the empty input string. - Now it is always the opposite of ``\b``. - (Contributed by Serhiy Storchaka in :gh:`124130`.) +* The :func:`map` function now has an optional keyword-only *strict* flag + like :func:`zip` to check that all the iterables are of equal length. + (Contributed by Wannes Boeykens in :gh:`119793`.) -* iOS and macOS apps can now be configured to redirect ``stdout`` and - ``stderr`` content to the system log. (Contributed by Russell Keith-Magee in - :gh:`127592`.) +* The :class:`memoryview` type now supports subscription, + making it a :term:`generic type`. + (Contributed by Brian Schubert in :gh:`126012`.) -* The iOS testbed is now able to stream test output while the test is running. - The testbed can also be used to run the test suite of projects other than - CPython itself. (Contributed by Russell Keith-Magee in :gh:`127592`.) +* Using :data:`NotImplemented` in a boolean context + will now raise a :exc:`TypeError`. + This has raised a :exc:`DeprecationWarning` since Python 3.9. + (Contributed by Jelle Zijlstra in :gh:`118767`.) -* Three-argument :func:`pow` now tries calling :meth:`~object.__rpow__` if - necessary. Previously it was only called in two-argument :func:`!pow` and the - binary power operator. +* Three-argument :func:`pow` now tries calling :meth:`~object.__rpow__` + if necessary. + Previously it was only called in two-argument :func:`!pow` + and the binary power operator. (Contributed by Serhiy Storchaka in :gh:`130104`.) -* Add a built-in implementation for HMAC (:rfc:`2104`) using formally verified - code from the `HACL* `__ project. - This implementation is used as a fallback when the OpenSSL implementation - of HMAC is not available. - (Contributed by Bénédikt Tran in :gh:`99108`.) +* :class:`super` objects are now :mod:`copyable ` and :mod:`pickleable + `. + (Contributed by Serhiy Storchaka in :gh:`125767`.) + + +Command line and environment +---------------------------- * The import time flag can now track modules that are already loaded ('cached'), via the new :option:`-X importtime=2 <-X>`. When such a module is imported, the ``self`` and ``cumulative`` times are replaced by the string ``cached``. + Values above ``2`` for ``-X importtime`` are now reserved for future use. - (Contributed by Noah Kim and Adam Turner in :gh:`118655`.) -* When subclassing from a pure C type, the C slots for the new type are no - longer replaced with a wrapped version on class creation if they are not - explicitly overridden in the subclass. - (Contributed by Tomasz Pytel in :gh:`132329`.) + (Contributed by Noah Kim and Adam Turner in :gh:`118655`.) * The command-line option :option:`-c` now automatically dedents its code argument before execution. The auto-dedentation behavior mirrors :func:`textwrap.dedent`. (Contributed by Jon Crall and Steven Sun in :gh:`103998`.) -* Improve error message when an object supporting the synchronous - context manager protocol is entered using :keyword:`async - with` instead of :keyword:`with`. - And vice versa with the asynchronous context manager protocol. - (Contributed by Bénédikt Tran in :gh:`128398`.) - * :option:`!-J` is no longer a reserved flag for Jython_, and now has no special meaning. (Contributed by Adam Turner in :gh:`133336`.) .. _Jython: https://www.jython.org/ -* The :func:`int` built-in no longer delegates to :meth:`~object.__trunc__`. - Classes that want to support conversion to :func:`!int` must implement - either :meth:`~object.__int__` or :meth:`~object.__index__`. - (Contributed by Mark Dickinson in :gh:`119743`.) -* Using :data:`NotImplemented` in a boolean context - will now raise a :exc:`TypeError`. - This has raised a :exc:`DeprecationWarning` since Python 3.9. - (Contributed by Jelle Zijlstra in :gh:`118767`.) +.. _whatsnew314-finally-syntaxwarning: +PEP 765: Control flow in :keyword:`finally` blocks +-------------------------------------------------- -.. _whatsnew314-pep765: +The compiler now emits a :exc:`SyntaxWarning` when a :keyword:`return`, +:keyword:`break`, or :keyword:`continue` statement have the effect of +leaving a :keyword:`finally` block. +This change is specified in :pep:`765`. -PEP 765: Disallow ``return``/``break``/``continue`` that exit a ``finally`` block ---------------------------------------------------------------------------------- +(Contributed by Irit Katriel in :gh:`130080`.) -The compiler emits a :exc:`SyntaxWarning` when a :keyword:`return`, :keyword:`break` or -:keyword:`continue` statement appears where it exits a :keyword:`finally` block. -This change is specified in :pep:`765`. + +.. _whatsnew314-incremental-gc: + +Incremental garbage collection +------------------------------ + +The cycle garbage collector is now incremental. +This means that maximum pause times are reduced +by an order of magnitude or more for larger heaps. + +There are now only two generations: young and old. +When :func:`gc.collect` is not called directly, the +GC is invoked a little less frequently. When invoked, it +collects the young generation and an increment of the +old generation, instead of collecting one or more generations. + +The behavior of :func:`!gc.collect` changes slightly: + +* ``gc.collect(1)``: Performs an increment of garbage collection, + rather than collecting generation 1. +* Other calls to :func:`!gc.collect` are unchanged. + +(Contributed by Mark Shannon in :gh:`108362`.) + + +Default interactive shell +------------------------- + +.. _whatsnew314-pyrepl-highlighting: + +* The default :term:`interactive` shell now highlights Python syntax. + The feature is enabled by default, save if :envvar:`PYTHON_BASIC_REPL` + or any other environment variable that disables colour is set. + See :ref:`using-on-controlling-color` for details. + + The default color theme for syntax highlighting strives for good contrast + and exclusively uses the 4-bit VGA standard ANSI color codes for maximum + compatibility. The theme can be customized using an experimental API + :func:`!_colorize.set_theme`. + This can be called interactively or in the :envvar:`PYTHONSTARTUP` script. + Note that this function has no stability guarantees, + and may change or be removed. + + (Contributed by Łukasz Langa in :gh:`131507`.) + +* The default :term:`interactive` shell now supports import auto-completion. + This means that typing ``import co`` and pressing :kbd:`` will suggest + modules starting with ``co``. Similarly, typing ``from concurrent import i`` + will suggest submodules of ``concurrent`` starting with ``i``. + Note that autocompletion of module attributes is not currently supported. + (Contributed by Tomas Roun in :gh:`69605`.) New modules @@ -1331,11 +1315,13 @@ concurrent.futures .. _whatsnew314-concurrent-futures-start-method: -* The default :class:`~concurrent.futures.ProcessPoolExecutor` - :ref:`start method ` changed - from :ref:`fork ` to :ref:`forkserver - ` on platforms other than macOS and - Windows where it was already :ref:`spawn `. +* On Unix platforms other than macOS, :ref:`'forkserver' + ` is now the the default :ref:`start + method ` for + :class:`~concurrent.futures.ProcessPoolExecutor` + (replacing :ref:`'fork' `). + This change does not affect Windows or macOS, where :ref:`'spawn' + ` remains the default start method. If the threading incompatible *fork* method is required, you must explicitly request it by supplying a multiprocessing context *mp_context* to @@ -1575,6 +1561,8 @@ hmac * Add a built-in implementation for HMAC (:rfc:`2104`) using formally verified code from the `HACL* `__ project. + This implementation is used as a fallback when the OpenSSL implementation + of HMAC is not available. (Contributed by Bénédikt Tran in :gh:`99108`.) @@ -1762,10 +1750,12 @@ multiprocessing .. _whatsnew314-multiprocessing-start-method: -* The default :ref:`start method ` changed - from :ref:`fork ` to :ref:`forkserver - ` on platforms other than macOS and - Windows where it was already :ref:`spawn `. +* On Unix platforms other than macOS, :ref:`'forkserver' + ` is now the the default :ref:`start + method ` + (replacing :ref:`'fork' `). + This change does not affect Windows or macOS, where :ref:`'spawn' + ` remains the default start method. If the threading incompatible *fork* method is required, you must explicitly request it via a context from :func:`multiprocessing.get_context` (preferred) @@ -1905,8 +1895,8 @@ pdb (Contributed by Tian Gao in :gh:`132576`.) * Source code displayed in :mod:`pdb` will be syntax-highlighted. This feature - can be controlled using the same methods as PyREPL, in addition to the newly - added ``colorize`` argument of :class:`pdb.Pdb`. + can be controlled using the same methods as the default :term:`interactive` + shell, in addition to the newly added ``colorize`` argument of :class:`pdb.Pdb`. (Contributed by Tian Gao and Łukasz Langa in :gh:`133355`.) @@ -1936,6 +1926,19 @@ pydoc (Contributed by Jelle Zijlstra in :gh:`101552`.) +re +-- + +* Support ``\z`` as a synonym for ``\Z`` in :mod:`regular expressions `. + It is interpreted unambiguously in many other regular expression engines, + unlike ``\Z``, which has subtly different behavior. + (Contributed by Serhiy Storchaka in :gh:`133306`.) + +* ``\B`` in :mod:`regular expression ` now matches the empty input string. + Now it is always the opposite of ``\b``. + (Contributed by Serhiy Storchaka in :gh:`124130`.) + + socket ------ @@ -2253,6 +2256,11 @@ Optimizations (Contributed by Adam Turner, Bénédikt Tran, Chris Markiewicz, Eli Schwartz, Hugo van Kemenade, Jelle Zijlstra, and others in :gh:`118761`.) +* The interpreter avoids some reference count modifications internally when + it's safe to do so. This can lead to different values returned from + :func:`sys.getrefcount` and :c:func:`Py_REFCNT` compared to previous versions + of Python. See :ref:`below ` for details. + asyncio ------- @@ -3217,6 +3225,20 @@ that may require changes to your code. Changes in the Python API ------------------------- +* On Unix platforms other than macOS, *forkserver* is now the default + :ref:`start method ` for :mod:`multiprocessing` + and :class:`~concurrent.futures.ProcessPoolExecutor`, instead of *fork*. + + See :ref:`(1) ` and + :ref:`(2) ` for details. + + If you encounter :exc:`NameError`\s or pickling errors coming out of + :mod:`multiprocessing` or :mod:`concurrent.futures`, see the + :ref:`forkserver restrictions `. + + This change does not affect Windows or macOS, where :ref:`'spawn' + ` remains the default start method. + * :class:`functools.partial` is now a method descriptor. Wrap it in :func:`staticmethod` if you want to preserve the old behavior. (Contributed by Serhiy Storchaka and Dominykas Grigonis in :gh:`121027`.) From ec97866567a96291008e2c64b38f3d890942da3e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 4 Oct 2025 15:45:35 +0200 Subject: [PATCH 0957/1674] [3.14] GH-123299: Copyedit 3.14 What's New: New and Improved Modules (GH-139530) (#139555) GH-123299: Copyedit 3.14 What's New: New and Improved Modules (GH-139530) (cherry picked from commit c33dc154b4d219a696f3fbe8965a38907c371780) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/compression.rst | 2 + Doc/whatsnew/3.14.rst | 450 ++++++++++++++++++++++-------------- 2 files changed, 274 insertions(+), 178 deletions(-) diff --git a/Doc/library/compression.rst b/Doc/library/compression.rst index 618b4a3c2bd170..98719be9992acc 100644 --- a/Doc/library/compression.rst +++ b/Doc/library/compression.rst @@ -1,6 +1,8 @@ The :mod:`!compression` package =============================== +.. module:: compression + .. versionadded:: 3.14 The :mod:`!compression` package contains the canonical compression modules diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index b460c046337078..f14d727f4aabaf 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1212,10 +1212,30 @@ Default interactive shell New modules =========== -* :mod:`annotationlib`: For introspecting :term:`annotations `. - See :pep:`749` for more details. +* :mod:`annotationlib`: + For introspecting :term:`annotations `. + See :ref:`PEP 749 ` for more details. (Contributed by Jelle Zijlstra in :gh:`119180`.) +* :mod:`compression` (including :mod:`compression.zstd`): + A package for compression-related modules, + including a new module to support the Zstandard compression format. + See :ref:`PEP 784 ` for more details. + (Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, + Victor Stinner, and Rogdham in :gh:`132983`.) + +* :mod:`concurrent.interpreters`: + Support for multiple interpreters in the standard library. + See :ref:`PEP 734 ` for more details. + (Contributed by Eric Snow in :gh:`134939`.) + +* :mod:`string.templatelib`: + Support for template string literals (t-strings). + See :ref:`PEP 750 ` for more details. + (Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, + Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, + and Pablo Galindo Salgado in :gh:`132661`.) + Improved modules ================ @@ -1233,7 +1253,7 @@ argparse and subparser names if mistyped by the user. (Contributed by Savannah Ostrowski in :gh:`124456`.) - .. _whatsnew314-color-argparse: +.. _whatsnew314-color-argparse: * Enable color for help text, which can be disabled with the optional *color* parameter to :class:`argparse.ArgumentParser`. @@ -1245,7 +1265,7 @@ argparse ast --- -* Add :func:`ast.compare` for comparing two ASTs. +* Add :func:`~ast.compare`, a function for comparing two ASTs. (Contributed by Batuhan Taskaya and Jeremy Hylton in :gh:`60191`.) * Add support for :func:`copy.replace` for AST nodes. @@ -1254,15 +1274,17 @@ ast * Docstrings are now removed from an optimized AST in optimization level 2. (Contributed by Irit Katriel in :gh:`123958`.) -* The ``repr()`` output for AST nodes now includes more information. +* The :func:`repr` output for AST nodes now includes more information. (Contributed by Tomas Roun in :gh:`116022`.) -* :func:`ast.parse`, when called with an AST as input, now always verifies - that the root node type is appropriate. +* When called with an AST as input, the :func:`~ast.parse` function + now always verifies that the root node type is appropriate. (Contributed by Irit Katriel in :gh:`130139`.) -* Add new ``--feature-version``, ``--optimize``, ``--show-empty`` options to - the command-line interface. +* Add new options to the command-line interface: + :option:`--feature-version `, + :option:`--optimize `, and + :option:`--show-empty `. (Contributed by Semyon Moroz in :gh:`133367`.) @@ -1281,20 +1303,23 @@ asyncio :meth:`asyncio.create_task`, :meth:`asyncio.loop.create_task`, :meth:`asyncio.TaskGroup.create_task`. + (Contributed by Thomas Grainger in :gh:`128307`.) * There are two new utility functions for introspecting and printing a program's call graph: :func:`~asyncio.capture_call_graph` and :func:`~asyncio.print_call_graph`. + See :ref:`Asyncio introspection capabilities + ` for more details. (Contributed by Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa in :gh:`91048`.) - .. _whatsnew314-color-calendar: - calendar -------- +.. _whatsnew314-color-calendar: + * By default, today's date is highlighted in color in :mod:`calendar`'s :ref:`command-line ` text output. This can be controlled by :ref:`environment variables @@ -1307,10 +1332,14 @@ concurrent.futures .. _whatsnew314-concurrent-futures-interp-pool: -* Add :class:`~concurrent.futures.InterpreterPoolExecutor`, - which exposes "subinterpreters" (multiple Python interpreters in the - same process) to Python code. This is separate from the proposed API - in :pep:`734`. +* Add a new executor class, :class:`~concurrent.futures.InterpreterPoolExecutor`, + which exposes multiple Python interpreters in the same process + ('subinterpreters') to Python code. + This uses a pool of independent Python interpreters to execute calls + asynchronously. + + This is separate from the new :mod:`~concurrent.interpreters` module + introduced by :ref:`PEP 734 `. (Contributed by Eric Snow in :gh:`124548`.) .. _whatsnew314-concurrent-futures-start-method: @@ -1334,31 +1363,36 @@ concurrent.futures (Contributed by Gregory P. Smith in :gh:`84559`.) -* Add :meth:`concurrent.futures.ProcessPoolExecutor.terminate_workers` and - :meth:`concurrent.futures.ProcessPoolExecutor.kill_workers` as - ways to terminate or kill all living worker processes in the given pool. +* Add two new methods to :class:`~concurrent.futures.ProcessPoolExecutor`, + :meth:`~concurrent.futures.ProcessPoolExecutor.terminate_workers` + and :meth:`~concurrent.futures.ProcessPoolExecutor.kill_workers`, + as ways to terminate or kill all living worker processes in the given pool. (Contributed by Charles Machalow in :gh:`130849`.) -* Add the optional ``buffersize`` parameter to - :meth:`concurrent.futures.Executor.map` to limit the number of submitted +* Add the optional *buffersize* parameter to :meth:`Executor.map + ` to limit the number of submitted tasks whose results have not yet been yielded. If the buffer is full, iteration over the *iterables* pauses until a result is yielded from the buffer. (Contributed by Enzo Bonnal and Josh Rosenberg in :gh:`74028`.) + configparser ------------ -* Security fix: will no longer write config files it cannot read. Attempting - to :meth:`configparser.ConfigParser.write` keys containing delimiters or - beginning with the section header pattern will raise a - :class:`configparser.InvalidWriteError`. +* :mod:`!configparser` will no longer write config files it cannot read, + to improve security. + Attempting to :meth:`~configparser.ConfigParser.write` keys containing + delimiters or beginning with the section header pattern will raise an + :class:`~configparser.InvalidWriteError`. (Contributed by Jacob Lincoln in :gh:`129270`.) + contextvars ----------- -* Support context manager protocol by :class:`contextvars.Token`. +* Support the :term:`context manager` protocol + for :class:`~contextvars.Token` objects. (Contributed by Andrew Svetlov in :gh:`129889`.) @@ -1366,8 +1400,8 @@ ctypes ------ * The layout of :ref:`bit fields ` - in :class:`~ctypes.Structure` and :class:`~ctypes.Union` - now matches platform defaults (GCC/Clang or MSVC) more closely. + in :class:`~ctypes.Structure` and :class:`~ctypes.Union` objects + is now a closer match to platform defaults (GCC/Clang or MSVC). In particular, fields no longer overlap. (Contributed by Matthias Görgens in :gh:`97702`.) @@ -1386,7 +1420,7 @@ ctypes * On Windows, the :func:`~ctypes.CopyComPointer` function is now public. (Contributed by Jun Komoda in :gh:`127275`.) -* :func:`ctypes.memoryview_at` now exists to create a +* Add :func:`~ctypes.memoryview_at`, a function to create a :class:`memoryview` object that refers to the supplied pointer and length. This works like :func:`ctypes.string_at` except it avoids a buffer copy, and is typically useful when implementing pure Python @@ -1394,7 +1428,7 @@ ctypes (Contributed by Rian Hunter in :gh:`112018`.) * Complex types, :class:`~ctypes.c_float_complex`, - :class:`~ctypes.c_double_complex` and :class:`~ctypes.c_longdouble_complex`, + :class:`~ctypes.c_double_complex`, and :class:`~ctypes.c_longdouble_complex`, are now available if both the compiler and the ``libffi`` library support complex C types. (Contributed by Sergey B Kirpichev in :gh:`61103`.) @@ -1404,50 +1438,57 @@ ctypes (Contributed by Brian Ward in :gh:`119349`.) * Move :func:`ctypes.POINTER` types cache from a global internal cache - (``_pointer_type_cache``) to the :attr:`ctypes._CData.__pointer_type__` - attribute of the corresponding :mod:`ctypes` types. + (``_pointer_type_cache``) to the :attr:`_CData.__pointer_type__ + ` attribute of the corresponding + :mod:`!ctypes` types. This will stop the cache from growing without limits in some situations. (Contributed by Sergey Miryanov in :gh:`100926`.) -* The :class:`ctypes.py_object` type now supports subscription, +* The :class:`~ctypes.py_object` type now supports subscription, making it a :term:`generic type`. (Contributed by Brian Schubert in :gh:`132168`.) -* :mod:`ctypes` now supports :term:`free-threading builds `. +* :mod:`!ctypes` now supports :term:`free-threading builds `. (Contributed by Kumar Aditya and Peter Bierma in :gh:`127945`.) + curses ------ * Add the :func:`~curses.assume_default_colors` function, a refinement of the :func:`~curses.use_default_colors` function which - allows to change the color pair ``0``. + allows changing the color pair ``0``. (Contributed by Serhiy Storchaka in :gh:`133139`.) + datetime -------- -* Add :meth:`datetime.time.strptime` and :meth:`datetime.date.strptime`. +* Add the :meth:`~datetime.date.strptime` method to the + :class:`datetime.date` and :class:`datetime.time` classes. (Contributed by Wannes Boeykens in :gh:`41431`.) + decimal ------- -* Add alternative :class:`~decimal.Decimal` constructor - :meth:`Decimal.from_number() `. +* Add :meth:`.Decimal.from_number` as an alternative constructor for + :class:`~decimal.Decimal`. (Contributed by Serhiy Storchaka in :gh:`121798`.) -* Expose :func:`decimal.IEEEContext` to support creation of contexts +* Expose :func:`~decimal.IEEEContext` to support creation of contexts corresponding to the IEEE 754 (2008) decimal interchange formats. (Contributed by Sergey B Kirpichev in :gh:`53032`.) + difflib ------- * Comparison pages with highlighted changes generated by the - :class:`difflib.HtmlDiff` class now support dark mode. + :class:`~difflib.HtmlDiff` class now support 'dark mode'. (Contributed by Jiahao Li in :gh:`129939`.) + dis --- @@ -1472,7 +1513,7 @@ dis errno ----- -* Add :data:`errno.EHWPOISON` error code. +* Add the :data:`~errno.EHWPOISON` error code constant. (Contributed by James Roy in :gh:`126585`.) @@ -1480,39 +1521,43 @@ faulthandler ------------ * Add support for printing the C stack trace on systems that - :ref:`support it ` via :func:`faulthandler.dump_c_stack` - or via the *c_stack* argument in :func:`faulthandler.enable`. + :ref:`support it ` via the new + :func:`~faulthandler.dump_c_stack` function or via the *c_stack* argument + in :func:`faulthandler.enable`. (Contributed by Peter Bierma in :gh:`127604`.) fnmatch ------- -* Added :func:`fnmatch.filterfalse` for excluding names matching a pattern. +* Add :func:`~fnmatch.filterfalse`, a function to reject names + matching a given pattern. (Contributed by Bénédikt Tran in :gh:`74598`.) fractions --------- -* Add support for converting any objects that have the - :meth:`!as_integer_ratio` method to a :class:`~fractions.Fraction`. +* A :class:`~fractions.Fraction` object may now be constructed from any + object with the :meth:`!as_integer_ratio` method. (Contributed by Serhiy Storchaka in :gh:`82017`.) -* Add alternative :class:`~fractions.Fraction` constructor - :meth:`Fraction.from_number() `. +* Add :meth:`.Fraction.from_number` as an alternative constructor for + :class:`~fractions.Fraction`. (Contributed by Serhiy Storchaka in :gh:`121797`.) functools --------- -* Add support to :func:`functools.partial` and - :func:`functools.partialmethod` for :data:`functools.Placeholder` sentinels - to reserve a place for positional arguments. +* Add the :data:`~functools.Placeholder` sentinel. + This may be used with the :func:`~functools.partial` + or :func:`~functools.partialmethod` functions to reserve a place + for positional arguments in the returned :ref:`partial object + `. (Contributed by Dominykas Grigonis in :gh:`119127`.) -* Allow the *initial* parameter of :func:`functools.reduce` to be passed +* Allow the *initial* parameter of :func:`~functools.reduce` to be passed as a keyword argument. (Contributed by Sayandip Dutta in :gh:`125916`.) @@ -1530,16 +1575,17 @@ getopt getpass ------- -* Support keyboard feedback by :func:`getpass.getpass` via the keyword-only - optional argument ``echo_char``. Placeholder characters are rendered whenever - a character is entered, and removed when a character is deleted. +* Support keyboard feedback in the :func:`~getpass.getpass` function via + the keyword-only optional argument *echo_char*. + Placeholder characters are rendered whenever a character is entered, + and removed when a character is deleted. (Contributed by Semyon Moroz in :gh:`77065`.) graphlib -------- -* Allow :meth:`graphlib.TopologicalSorter.prepare` to be called more than once +* Allow :meth:`.TopologicalSorter.prepare` to be called more than once as long as sorting has not started. (Contributed by Daniel Pope in :gh:`130914`.) @@ -1547,13 +1593,14 @@ graphlib heapq ----- -* Add functions for working with max-heaps: +* The :mod:`!heapq` module has improved support for working with max-heaps, + via the following new functions: - * :func:`heapq.heapify_max`, - * :func:`heapq.heappush_max`, - * :func:`heapq.heappop_max`, - * :func:`heapq.heapreplace_max` - * :func:`heapq.heappushpop_max` + * :func:`~heapq.heapify_max` + * :func:`~heapq.heappush_max` + * :func:`~heapq.heappop_max` + * :func:`~heapq.heapreplace_max` + * :func:`~heapq.heappushpop_max` hmac @@ -1578,9 +1625,12 @@ http the command-line interface (``python -m http.server``) through the following options: - * ``--tls-cert ``: Path to the TLS certificate file. - * ``--tls-key ``: Optional path to the private key file. - * ``--tls-password-file ``: Optional path to the password file for the private key. + * :option:`--tls-cert \ `: + Path to the TLS certificate file. + * :option:`--tls-key \ `: + Optional path to the private key file. + * :option:`--tls-password-file \ `: + Optional path to the password file for the private key. (Contributed by Semyon Moroz in :gh:`85162`.) @@ -1588,7 +1638,7 @@ http imaplib ------- -* Add :meth:`IMAP4.idle() `, implementing the IMAP4 +* Add :meth:`.IMAP4.idle`, implementing the IMAP4 ``IDLE`` command as defined in :rfc:`2177`. (Contributed by Forest in :gh:`55454`.) @@ -1596,15 +1646,16 @@ imaplib inspect ------- -* :func:`inspect.signature` takes a new argument *annotation_format* to control +* :func:`~inspect.signature` takes a new argument *annotation_format* to control the :class:`annotationlib.Format` used for representing annotations. (Contributed by Jelle Zijlstra in :gh:`101552`.) -* :meth:`inspect.Signature.format` takes a new argument *unquote_annotations*. - If true, string :term:`annotations ` are displayed without surrounding quotes. +* :meth:`.Signature.format` takes a new argument *unquote_annotations*. + If true, string :term:`annotations ` are displayed without + surrounding quotes. (Contributed by Jelle Zijlstra in :gh:`101552`.) -* Add function :func:`inspect.ispackage` to determine whether an object is a +* Add function :func:`~inspect.ispackage` to determine whether an object is a :term:`package` or not. (Contributed by Zhikang Yan in :gh:`125634`.) @@ -1616,7 +1667,7 @@ io :exc:`BlockingIOError` if the operation cannot immediately return bytes. (Contributed by Giovanni Siragusa in :gh:`109523`.) -* Add protocols :class:`io.Reader` and :class:`io.Writer` as simpler +* Add the :class:`~io.Reader` and :class:`~io.Writer` protocols as simpler alternatives to the pseudo-protocols :class:`typing.IO`, :class:`typing.TextIO`, and :class:`typing.BinaryIO`. (Contributed by Sebastian Rittau in :gh:`127648`.) @@ -1625,16 +1676,18 @@ io json ---- -* Add notes for JSON serialization errors that allow to identify the source - of the error. +* Add exception notes for JSON serialization errors that allow + identifying the source of the error. (Contributed by Serhiy Storchaka in :gh:`122163`.) -* Enable the :mod:`json` module to work as a script using the :option:`-m` - switch: :program:`python -m json`. +* Allow using the :mod:`json` module as a script using the :option:`-m` switch: + :program:`python -m json`. + This is now preferred to :program:`python -m json.tool`, + which is :term:`soft deprecated`. See the :ref:`JSON command-line interface ` documentation. (Contributed by Trey Hunner in :gh:`122873`.) - .. _whatsnew314-color-json: +.. _whatsnew314-color-json: * By default, the output of the :ref:`JSON command-line interface ` is highlighted in color. @@ -1642,18 +1695,19 @@ json `. (Contributed by Tomas Roun in :gh:`131952`.) + linecache --------- -* :func:`linecache.getline` can retrieve source code for frozen modules. +* :func:`~linecache.getline` can now retrieve source code for frozen modules. (Contributed by Tian Gao in :gh:`131638`.) logging.handlers ---------------- -* :class:`logging.handlers.QueueListener` now implements the context - manager protocol, allowing it to be used in a :keyword:`with` statement. +* :class:`~logging.handlers.QueueListener` objects now support the + :term:`context manager` protocol. (Contributed by Charles Machalow in :gh:`132106`.) * :meth:`QueueListener.start ` now @@ -1671,14 +1725,13 @@ math mimetypes --------- -* Document the command-line for :mod:`mimetypes`. - It now exits with ``1`` on failure instead of ``0`` - and ``2`` on incorrect command-line parameters instead of ``1``. - Also, errors are printed to stderr instead of stdout and their text is made - tighter. +* Add a public :ref:`command-line ` for the module, + invoked via :program:`python -m mimetypes`. (Contributed by Oleg Iarygin and Hugo van Kemenade in :gh:`93096`.) -* Add MS and :rfc:`8081` MIME types for fonts: +* Add several new MIME types based on RFCs and common usage: + + .. rubric:: Microsoft and :rfc:`8081` MIME types for fonts * Embedded OpenType: ``application/vnd.ms-fontobject`` * OpenType Layout (OTF) ``font/otf`` @@ -1686,18 +1739,14 @@ mimetypes * WOFF 1.0 ``font/woff`` * WOFF 2.0 ``font/woff2`` - (Contributed by Sahil Prajapati and Hugo van Kemenade in :gh:`84852`.) - -* Add :rfc:`9559` MIME types for Matroska audiovisual data container - structures, containing: + .. rubric:: :rfc:`9559` MIME types for Matroska audiovisual + data container structures * audio with no video: ``audio/matroska`` (``.mka``) * video: ``video/matroska`` (``.mkv``) * stereoscopic video: ``video/matroska-3d`` (``.mk3d``) - (Contributed by Hugo van Kemenade in :gh:`89416`.) - -* Add MIME types for images with RFCs: + .. rubric:: Images with RFCs * :rfc:`1494`: CCITT Group 3 (``.g3``) * :rfc:`3362`: Real-time Facsimile, T.38 (``.t38``) @@ -1706,9 +1755,7 @@ mimetypes * :rfc:`4047`: Flexible Image Transport System (``.fits``) * :rfc:`7903`: Enhanced Metafile (``.emf``) and Windows Metafile (``.wmf``) - (Contributed by Hugo van Kemenade in :gh:`85957`.) - -* More MIME type changes: + .. rubric:: Other MIME type additions and changes * :rfc:`2361`: Change type for ``.avi`` to ``video/vnd.avi`` and for ``.wav`` to ``audio/vnd.wave`` @@ -1716,6 +1763,8 @@ mimetypes * :rfc:`5334`: Add Ogg media (``.oga``, ``.ogg`` and ``.ogx``) * :rfc:`6713`: Add gzip ``application/gzip`` (``.gz``) * :rfc:`9639`: Add FLAC ``audio/flac`` (``.flac``) + * :rfc:`9512` ``application/yaml`` MIME type for YAML files (``.yaml`` + and ``.yml``) * Add 7z ``application/x-7z-compressed`` (``.7z``) * Add Android Package ``application/vnd.android.package-archive`` (``.apk``) when not strict @@ -1738,11 +1787,9 @@ mimetypes * `W3C `__: Add EPUB ``application/epub+zip`` (``.epub``) - (Contributed by Hugo van Kemenade in :gh:`129965`.) - -* Add :rfc:`9512` ``application/yaml`` MIME type for YAML files (``.yaml`` - and ``.yml``). (Contributed by Sasha "Nelie" Chernykh and Hugo van Kemenade - in :gh:`132056`.) + (Contributed by Sahil Prajapati and Hugo van Kemenade in :gh:`84852`, + by Sasha "Nelie" Chernykh and Hugo van Kemenade in :gh:`132056`, + and by Hugo van Kemenade in :gh:`89416`, :gh:`85957`, and :gh:`129965`.) multiprocessing @@ -1758,8 +1805,8 @@ multiprocessing ` remains the default start method. If the threading incompatible *fork* method is required, you must explicitly - request it via a context from :func:`multiprocessing.get_context` (preferred) - or change the default via :func:`multiprocessing.set_start_method`. + request it via a context from :func:`~multiprocessing.get_context` (preferred) + or change the default via :func:`~multiprocessing.set_start_method`. See :ref:`forkserver restrictions ` for information and differences with the *fork* method and how this change @@ -1768,7 +1815,7 @@ multiprocessing (Contributed by Gregory P. Smith in :gh:`84559`.) -* :mod:`multiprocessing`'s ``"forkserver"`` start method now authenticates +* :mod:`multiprocessing`'s ``'forkserver'`` start method now authenticates its control socket to avoid solely relying on filesystem permissions to restrict what other processes could cause the forkserver to spawn workers and run code. @@ -1784,20 +1831,22 @@ multiprocessing (Contributed by Roy Hyunjin Han for :gh:`103134`.) * Add support for shared :class:`set` objects via - :meth:`SyncManager.set() `. - The :func:`set` in :func:`multiprocessing.Manager` method is now available. + :meth:`.SyncManager.set`. + The :func:`set` in :func:`~multiprocessing.Manager` method is now available. (Contributed by Mingyu Park in :gh:`129949`.) -* Add :func:`multiprocessing.Process.interrupt` which terminates the child +* Add the :meth:`~multiprocessing.Process.interrupt` + to :class:`multiprocessing.Process` objects, which terminates the child process by sending :py:const:`~signal.SIGINT`. This enables :keyword:`finally` clauses to print a stack trace for the terminated process. (Contributed by Artem Pulkin in :gh:`131913`.) + operator -------- -* Two new functions :func:`operator.is_none` and :func:`operator.is_not_none` - have been added, such that ``operator.is_none(obj)`` is equivalent +* Add :func:`~operator.is_none` and :func:`~operator.is_not_none` as a pair + of functions, such that ``operator.is_none(obj)`` is equivalent to ``obj is None`` and ``operator.is_not_none(obj)`` is equivalent to ``obj is not None``. (Contributed by Raymond Hettinger and Nico Mexis in :gh:`115808`.) @@ -1806,17 +1855,17 @@ operator os -- -* Add the :func:`os.reload_environ` function to update :data:`os.environ` and +* Add the :func:`~os.reload_environ` function to update :data:`os.environ` and :data:`os.environb` with changes to the environment made by :func:`os.putenv`, by :func:`os.unsetenv`, or made outside Python in the same process. (Contributed by Victor Stinner in :gh:`120057`.) * Add the :data:`~os.SCHED_DEADLINE` and :data:`~os.SCHED_NORMAL` constants - to the :mod:`os` module. + to the :mod:`!os` module. (Contributed by James Roy in :gh:`127688`.) -* Add the :func:`os.readinto` function to read into a +* Add the :func:`~os.readinto` function to read into a :ref:`buffer object ` from a file descriptor. (Contributed by Cody Maloney in :gh:`129205`.) @@ -1824,8 +1873,8 @@ os os.path ------- -* The *strict* parameter to :func:`os.path.realpath` accepts a new value, - :data:`os.path.ALLOW_MISSING`. +* The *strict* parameter to :func:`~os.path.realpath` accepts a new value, + :data:`~os.path.ALLOW_MISSING`. If used, errors other than :exc:`FileNotFoundError` will be re-raised; the resulting path can be missing but it will be free of symlinks. (Contributed by Petr Viktorin for :cve:`2025-4517`.) @@ -1844,8 +1893,8 @@ pathlib (Contributed by Barney Gale in :gh:`73991`.) -* Add :attr:`pathlib.Path.info` attribute, which stores an object - implementing the :class:`pathlib.types.PathInfo` protocol (also new). The +* Add the :attr:`~pathlib.Path.info` attribute, which stores an object + implementing the new :class:`pathlib.types.PathInfo` protocol. The object supports querying the file type and internally caching :func:`~os.stat` results. Path objects generated by :meth:`~pathlib.Path.iterdir` are initialized with file type information @@ -1856,7 +1905,7 @@ pathlib pdb --- -* Hardcoded breakpoints (:func:`breakpoint` and :func:`pdb.set_trace`) now +* Hardcoded breakpoints (:func:`breakpoint` and :func:`~pdb.set_trace`) now reuse the most recent :class:`~pdb.Pdb` instance that calls :meth:`~pdb.Pdb.set_trace`, instead of creating a new one each time. As a result, all the instance specific data like :pdbcmd:`display` and @@ -1906,15 +1955,16 @@ pickle * Set the default protocol version on the :mod:`pickle` module to 5. For more details, see :ref:`pickle protocols `. -* Add notes for pickle serialization errors that allow to identify the source - of the error. +* Add exception notes for pickle serialization errors that allow + identifying the source of the error. (Contributed by Serhiy Storchaka in :gh:`122213`.) platform -------- -* Add :func:`platform.invalidate_caches` to invalidate the cached results. +* Add :func:`~platform.invalidate_caches`, a function to invalidate + cached results in the :mod:`!platform` module. (Contributed by Bénédikt Tran in :gh:`122549`.) @@ -1934,8 +1984,8 @@ re unlike ``\Z``, which has subtly different behavior. (Contributed by Serhiy Storchaka in :gh:`133306`.) -* ``\B`` in :mod:`regular expression ` now matches the empty input string. - Now it is always the opposite of ``\b``. +* ``\B`` in :mod:`regular expression ` now matches the empty input string, + meaning that it is now always the opposite of ``\b``. (Contributed by Serhiy Storchaka in :gh:`124130`.) @@ -1965,11 +2015,12 @@ socket * Add many new constants. (Contributed by Serhiy Storchaka in :gh:`132734`.) + ssl --- -* Indicate through :data:`ssl.HAS_PHA` whether the :mod:`ssl` module supports - TLSv1.3 post-handshake client authentication (PHA). +* Indicate through the :data:`~ssl.HAS_PHA` Boolean whether the :mod:`!ssl` + module supports TLSv1.3 post-handshake client authentication (PHA). (Contributed by Will Childs-Klein in :gh:`128036`.) @@ -1985,7 +2036,7 @@ struct symtable -------- -* Expose the following :class:`symtable.Symbol` methods: +* Expose the following :class:`~symtable.Symbol` methods: * :meth:`~symtable.Symbol.is_comp_cell` * :meth:`~symtable.Symbol.is_comp_iter` @@ -2000,28 +2051,41 @@ 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. + (Contributed by Eric Snow in :gh:`125286`.) * Add :func:`sys._is_immortal` for determining if an object is :term:`immortal`. (Contributed by Peter Bierma in :gh:`128509`.) -* On FreeBSD, :data:`sys.platform` doesn't contain the major version anymore. +* On FreeBSD, :data:`sys.platform` no longer contains the major version number. It is always ``'freebsd'``, instead of ``'freebsd13'`` or ``'freebsd14'``. + (Contributed by Michael Osipov in :gh:`129393`.) * Raise :exc:`DeprecationWarning` for :func:`sys._clear_type_cache`. This function was deprecated in Python 3.13 but it didn't raise a runtime warning. +* Add :func:`sys.remote_exec` to implement the new external debugger interface. + See :ref:`PEP 768 ` for details. + (Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic + in :gh:`131591`.) + +* Add the :data:`sys._jit` namespace, containing utilities for introspecting + just-in-time compilation. + (Contributed by Brandt Bucher in :gh:`133231`.) + sys.monitoring -------------- -* Two new events are added: :monitoring-event:`BRANCH_LEFT` and - :monitoring-event:`BRANCH_RIGHT`. The ``BRANCH`` event is deprecated. +* Add two new monitoring events, :monitoring-event:`BRANCH_LEFT` and + :monitoring-event:`BRANCH_RIGHT`. + These replace and deprecate the :monitoring-event:`!BRANCH` event. + (Contributed by Mark Shannon in :gh:`122548`.) sysconfig --------- -* Add ``ABIFLAGS`` key to :func:`sysconfig.get_config_vars` on Windows. +* Add ``ABIFLAGS`` key to :func:`~sysconfig.get_config_vars` on Windows. (Contributed by Xuehai Pan in :gh:`131799`.) @@ -2031,15 +2095,18 @@ tarfile * :func:`~tarfile.data_filter` now normalizes symbolic link targets in order to avoid path traversal attacks. (Contributed by Petr Viktorin in :gh:`127987` and :cve:`2025-4138`.) + * :func:`~tarfile.TarFile.extractall` now skips fixing up directory attributes when a directory was removed or replaced by another kind of file. (Contributed by Petr Viktorin in :gh:`127987` and :cve:`2024-12718`.) + * :func:`~tarfile.TarFile.extract` and :func:`~tarfile.TarFile.extractall` now (re-)apply the extraction filter when substituting a link (hard or symbolic) with a copy of another archive member, and when fixing up directory attributes. The former raises a new exception, :exc:`~tarfile.LinkFallbackError`. (Contributed by Petr Viktorin for :cve:`2025-4330` and :cve:`2024-12718`.) + * :func:`~tarfile.TarFile.extract` and :func:`~tarfile.TarFile.extractall` no longer extract rejected members when :func:`~tarfile.TarFile.errorlevel` is zero. @@ -2059,17 +2126,18 @@ tkinter ------- * Make :mod:`tkinter` widget methods :meth:`!after` and :meth:`!after_idle` - accept arguments passed by keyword. + accept keyword arguments. (Contributed by Zhikang Yan in :gh:`126899`.) -* Add ability to specify name for :class:`!tkinter.OptionMenu` and +* Add ability to specify a name for :class:`!tkinter.OptionMenu` and :class:`!tkinter.ttk.OptionMenu`. (Contributed by Zhikang Yan in :gh:`130482`.) + turtle ------ -* Add context managers for :func:`turtle.fill`, :func:`turtle.poly` +* Add context managers for :func:`turtle.fill`, :func:`turtle.poly`, and :func:`turtle.no_animation`. (Contributed by Marie Roald and Yngve Mardal Moe in :gh:`126350`.) @@ -2087,44 +2155,59 @@ typing .. _whatsnew314-typing-union: -* :class:`types.UnionType` and :class:`typing.Union` are now aliases for each other, - meaning that both old-style unions (created with ``Union[int, str]``) and new-style - unions (``int | str``) now create instances of the same runtime type. This unifies - the behavior between the two syntaxes, but leads to some differences in behavior that +* The :class:`types.UnionType` and :class:`typing.Union` types are now + aliases for each other, meaning that both old-style unions + (created with ``Union[int, str]``) and new-style unions (``int | str``) + now create instances of the same runtime type. This unifies the behavior + between the two syntaxes, but leads to some differences in behavior that may affect users who introspect types at runtime: - - Both syntaxes for creating a union now produce the same string representation in - ``repr()``. For example, ``repr(Union[int, str])`` - is now ``"int | str"`` instead of ``"typing.Union[int, str]"``. - - Unions created using the old syntax are no longer cached. Previously, running - ``Union[int, str]`` multiple times would return the same object - (``Union[int, str] is Union[int, str]`` would be ``True``), but now it will - return two different objects. Users should use ``==`` to compare unions for equality, not - ``is``. New-style unions have never been cached this way. - This change could increase memory usage for some programs that use a large number of - unions created by subscripting ``typing.Union``. However, several factors offset this cost: - unions used in annotations are no longer evaluated by default in Python 3.14 - because of :pep:`649`; an instance of :class:`types.UnionType` is - itself much smaller than the object returned by ``Union[]`` was on prior Python - versions; and removing the cache also saves some space. It is therefore - unlikely that this change will cause a significant increase in memory usage for most - users. + - Both syntaxes for creating a union now produce the same string + representation in :func:`repr`. + For example, ``repr(Union[int, str])`` is now ``"int | str"`` instead of + ``"typing.Union[int, str]"``. + + - Unions created using the old syntax are no longer cached. + Previously, running ``Union[int, str]`` multiple times would return + the same object (``Union[int, str] is Union[int, str]`` would be ``True``), + but now it will return two different objects. + Use ``==`` to compare unions for equality, not ``is``. + New-style unions have never been cached this way. + This change could increase memory usage for some programs that use + a large number of unions created by subscripting ``typing.Union``. + However, several factors offset this cost: + unions used in annotations are no longer evaluated by default in Python + 3.14 because of :pep:`649`; an instance of :class:`types.UnionType` is + itself much smaller than the object returned by ``Union[]`` was on prior + Python versions; and removing the cache also saves some space. + It is therefore unlikely that this change will cause a significant increase + in memory usage for most users. + - Previously, old-style unions were implemented using the private class - ``typing._UnionGenericAlias``. This class is no longer needed for the implementation, - but it has been retained for backward compatibility, with removal scheduled for Python - 3.17. Users should use documented introspection helpers like :func:`typing.get_origin` - and :func:`typing.get_args` instead of relying on private implementation details. - - It is now possible to use :class:`typing.Union` itself in :func:`isinstance` checks. - For example, ``isinstance(int | str, typing.Union)`` will return ``True``; previously - this raised :exc:`TypeError`. - - The ``__args__`` attribute of :class:`typing.Union` objects is no longer writable. - - It is no longer possible to set any attributes on :class:`typing.Union` objects. + ``typing._UnionGenericAlias``. + This class is no longer needed for the implementation, + but it has been retained for backward compatibility, + with removal scheduled for Python 3.17. + Users should use documented introspection helpers like + :func:`~typing.get_origin` and :func:`typing.get_args` instead of + relying on private implementation details. + + - It is now possible to use :class:`typing.Union` itself in + :func:`isinstance` checks. + For example, ``isinstance(int | str, typing.Union)`` will return ``True``; + previously this raised :exc:`TypeError`. + + - The :attr:`!__args__` attribute of :class:`typing.Union` objects is + no longer writable. + + - It is no longer possible to set any attributes on :class:`~typing.Union` + objects. This only ever worked for dunder attributes on previous versions, was never documented to work, and was subtly broken in many cases. (Contributed by Jelle Zijlstra in :gh:`105499`.) -* :class:`typing.TypeAliasType` now supports star unpacking. +* :class:`~typing.TypeAliasType` now supports star unpacking. unicodedata @@ -2133,11 +2216,11 @@ unicodedata * The Unicode database has been updated to Unicode 16.0.0. -.. _whatsnew314-color-unittest: - unittest -------- +.. _whatsnew314-color-unittest: + * :mod:`unittest` output is now colored by default. This can be controlled by :ref:`environment variables `. @@ -2175,7 +2258,7 @@ urllib * Improve ergonomics and standards compliance when parsing and emitting ``file:`` URLs. - In :func:`urllib.request.url2pathname`: + In :func:`~urllib.request.url2pathname`: - Accept a complete URL when the new *require_scheme* argument is set to true. @@ -2186,7 +2269,7 @@ urllib - Raise :exc:`~urllib.error.URLError` if a URL authority isn't local, except on Windows where we return a UNC path as before. - In :func:`urllib.request.pathname2url`: + In :func:`~urllib.request.pathname2url`: - Return a complete URL when the new *add_scheme* argument is set to true. - Include an empty URL authority when a path begins with a slash. For @@ -2202,16 +2285,17 @@ urllib uuid ---- -* Add support for UUID versions 6, 7, and 8 via :func:`uuid.uuid6`, - :func:`uuid.uuid7`, and :func:`uuid.uuid8` respectively, as specified +* Add support for UUID versions 6, 7, and 8 via :func:`~uuid.uuid6`, + :func:`~uuid.uuid7`, and :func:`~uuid.uuid8` respectively, as specified in :rfc:`9562`. (Contributed by Bénédikt Tran in :gh:`89083`.) -* :const:`uuid.NIL` and :const:`uuid.MAX` are now available to represent the +* :const:`~uuid.NIL` and :const:`~uuid.MAX` are now available to represent the Nil and Max UUID formats as defined by :rfc:`9562`. (Contributed by Nick Pope in :gh:`128427`.) -* Allow to generate multiple UUIDs at once via :option:`python -m uuid --count `. +* Allow generating multiple UUIDs simultaneously on the command-line via + :option:`python -m uuid --count `. (Contributed by Simon Legner in :gh:`131236`.) @@ -2229,14 +2313,13 @@ webbrowser zipfile ------- -* Added :func:`ZipInfo._for_archive ` +* Added :meth:`ZipInfo._for_archive `, a method to resolve suitable defaults for a :class:`~zipfile.ZipInfo` object as used by :func:`ZipFile.writestr `. (Contributed by Bénédikt Tran in :gh:`123424`.) -* :meth:`zipfile.ZipFile.writestr` now respects ``SOURCE_DATE_EPOCH`` that - distributions can set centrally and have build tools consume this in order - to produce reproducible output. +* :meth:`.ZipFile.writestr` now respects the :envvar:`SOURCE_DATE_EPOCH` + environment variable in order to better support reproducible builds. (Contributed by Jiahao Li in :gh:`91279`.) @@ -2256,17 +2339,18 @@ Optimizations (Contributed by Adam Turner, Bénédikt Tran, Chris Markiewicz, Eli Schwartz, Hugo van Kemenade, Jelle Zijlstra, and others in :gh:`118761`.) -* The interpreter avoids some reference count modifications internally when - it's safe to do so. This can lead to different values returned from - :func:`sys.getrefcount` and :c:func:`Py_REFCNT` compared to previous versions - of Python. See :ref:`below ` for details. +* The interpreter now avoids some reference count modifications internally + when it's safe to do so. + This can lead to different values being returned from :func:`sys.getrefcount` + and :c:func:`Py_REFCNT` compared to previous versions of Python. + See :ref:`below ` for details. asyncio ------- -* Standard benchmark results have improved by 10-20%, following the - implementation of a new per-thread double linked list +* Standard benchmark results have improved by 10-20% following the + implementation of a new per-thread doubly linked list for :class:`native tasks `, also reducing memory usage. This enables external introspection tools such as @@ -3265,6 +3349,16 @@ Changes in the Python API with annotations should continue to work, some undocumented details may behave differently. +* As part of making the :mod:`mimetypes` CLI public, + it now exits with ``1`` on failure instead of ``0`` + and ``2`` on incorrect command-line parameters instead of ``1``. + Error messages are now printed to stderr. + +* The ``\B`` pattern in regular expression now matches the empty string + when given as the entire pattern, which may cause behavioural changes. + +* On FreeBSD, :data:`sys.platform` no longer contains the major version number. + Changes in the C API -------------------- From 6f2635787bd3ad931afad6b4d6d160bffd16381c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 4 Oct 2025 16:55:25 +0200 Subject: [PATCH 0958/1674] [3.14] Synced docs and docstring for `sysconfig.get_platform` (GH-135530) (#138976) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Synced docs and docstring for `sysconfig.get_platform` (GH-135530) (cherry picked from commit 01cc53295cca6834de77be79368c25b890bab8fc) Co-authored-by: ivan Co-authored-by: Mikhail Efimov Co-authored-by: Ned Deily Co-authored-by: Filipe Laíns 🇵🇸 --- Doc/library/sysconfig.rst | 15 ++++++--------- Lib/sysconfig/__init__.py | 22 +++++++++++++--------- Lib/test/test_sysconfig.py | 7 +++++++ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 684d14a74c48ab..532facb45f83a0 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -382,22 +382,19 @@ Other functions Examples of returned values: - - linux-i586 - - linux-alpha (?) - - solaris-2.6-sun4u - Windows will return one of: + Windows: - win-amd64 (64-bit Windows on AMD64, aka x86_64, Intel64, and EM64T) - win-arm64 (64-bit Windows on ARM64, aka AArch64) - win32 (all others - specifically, sys.platform is returned) - macOS can return: + POSIX based OS: - - macosx-10.6-ppc - - macosx-10.4-ppc64 - - macosx-10.3-i386 - - macosx-10.4-fat + - linux-x86_64 + - macosx-15.5-arm64 + - macosx-26.0-universal2 (macOS on Apple Silicon or Intel) + - android-24-arm64_v8a For other non-POSIX platforms, currently just returns :data:`sys.platform`. diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py index f93b98dd681536..2ecbff222fe3a5 100644 --- a/Lib/sysconfig/__init__.py +++ b/Lib/sysconfig/__init__.py @@ -650,18 +650,22 @@ def get_platform(): isn't particularly important. Examples of returned values: - linux-i586 - linux-alpha (?) - solaris-2.6-sun4u - Windows will return one of: - win-amd64 (64-bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) - win-arm64 (64-bit Windows on ARM64 (aka AArch64) - win32 (all others - specifically, sys.platform is returned) - For other non-POSIX platforms, currently just returns 'sys.platform'. + Windows: - """ + - win-amd64 (64-bit Windows on AMD64, aka x86_64, Intel64, and EM64T) + - win-arm64 (64-bit Windows on ARM64, aka AArch64) + - win32 (all others - specifically, sys.platform is returned) + + POSIX based OS: + + - linux-x86_64 + - macosx-15.5-arm64 + - macosx-26.0-universal2 (macOS on Apple Silicon or Intel) + - android-24-arm64_v8a + + For other non-POSIX platforms, currently just returns :data:`sys.platform`.""" if os.name == 'nt': if 'amd64' in sys.version.lower(): return 'win-amd64' diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index 9faabc2e25447f..09eff11179ea58 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -353,6 +353,13 @@ def test_get_platform(self): self.assertEqual(get_platform(), 'macosx-10.4-%s' % arch) + for macver in range(11, 16): + _osx_support._remove_original_values(get_config_vars()) + get_config_vars()['CFLAGS'] = ('-fno-strict-overflow -Wsign-compare -Wunreachable-code' + '-arch arm64 -fno-common -dynamic -DNDEBUG -g -O3 -Wall') + get_config_vars()['MACOSX_DEPLOYMENT_TARGET'] = f"{macver}.0" + self.assertEqual(get_platform(), 'macosx-%d.0-arm64' % macver) + # linux debian sarge os.name = 'posix' sys.version = ('2.3.5 (#1, Jul 4 2007, 17:28:59) ' From 8566ee25073b237bfaed0f886c83d9933ffc6fe7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 4 Oct 2025 18:40:21 +0200 Subject: [PATCH 0959/1674] [3.14] gh-138703: clarify data buffer requirement of `asyncio.StreamWriter.write` (GH-139564) (#139570) Co-authored-by: Kumar Aditya --- Doc/library/asyncio-stream.rst | 5 +++-- Lib/asyncio/selector_events.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index e1568ae330b70f..05445219510ca5 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -316,13 +316,14 @@ StreamWriter If that fails, the data is queued in an internal write buffer until it can be sent. + The *data* buffer should be a bytes, bytearray, or C-contiguous one-dimensional + memoryview object. + The method should be used along with the ``drain()`` method:: stream.write(data) await stream.drain() - .. note:: - The *data* buffer should be a C contiguous one-dimensional :term:`bytes-like object `. .. method:: writelines(data) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 6ad84044adf146..f8744cbb223003 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -1050,8 +1050,8 @@ def _read_ready__on_eof(self): def write(self, data): if not isinstance(data, (bytes, bytearray, memoryview)): - raise TypeError(f'data argument must be a bytes-like object, ' - f'not {type(data).__name__!r}') + raise TypeError(f'data argument must be a bytes, bytearray, or memoryview ' + f'object, not {type(data).__name__!r}') if self._eof: raise RuntimeError('Cannot call write() after write_eof()') if self._empty_waiter is not None: From 2f96a40ec0dba912f3778d7a52b514d6711521f3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 06:41:43 +0200 Subject: [PATCH 0960/1674] [3.14] gh-138558: Improve description of ``Interpolation.expression`` (GH-139187) (#139579) gh-138558: Improve description of ``Interpolation.expression`` (GH-139187) (cherry picked from commit 880c9526f91960b9cba557a18b54e2c32d2f254e) Co-authored-by: Dave Peck Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/string.templatelib.rst | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Doc/library/string.templatelib.rst b/Doc/library/string.templatelib.rst index 85d65fa9de1e22..a5b2d796aaf4b8 100644 --- a/Doc/library/string.templatelib.rst +++ b/Doc/library/string.templatelib.rst @@ -24,7 +24,7 @@ Template strings Template strings are a mechanism for custom string processing. They have the full flexibility of Python's :ref:`f-strings`, but return a :class:`Template` instance that gives access -to the static and interpolated (in curly braces) parts of a string +to the static and interpolated (in curly brackets) parts of a string *before* they are combined. To write a t-string, use a ``'t'`` prefix instead of an ``'f'``, like so: @@ -258,13 +258,16 @@ Types .. attribute:: expression :type: str - The text of a valid Python expression, or an empty string. + For interpolations created by t-string literals, :attr:`!expression` + is the expression text found inside the curly brackets (``{`` & ``}``), + including any whitespace, excluding the curly brackets themselves, + and ending before the first ``!``, ``:``, or ``=`` if any is present. + For manually created interpolations, :attr:`!expression` is the arbitrary + string provided when constructing the interpolation instance. - The :attr:`.expression` is the original text of the - interpolation's Python expression, if the interpolation was created - from a t-string literal. Developers creating interpolations manually - should either set this to an empty string or choose a suitable valid - Python expression. + We recommend using valid Python expressions or the empty string for the + ``expression`` field of manually created :class:`!Interpolation` + instances, although this is not enforced at runtime. >>> t'{1 + 2}'.interpolations[0].expression '1 + 2' From bc85a34f8ae451f86521d09f91b92a4876e914a0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 06:49:36 +0200 Subject: [PATCH 0961/1674] [3.14] gh-139573: Update Android to OpenSSL 3.0.18 (GH-139562) (#139581) gh-139573: Update Android to OpenSSL 3.0.18 (GH-139562) Update Android to OpenSSL 3.0.18. (cherry picked from commit 0f0fc5a16368ea45541137cff6b90d63bad5eb26) Co-authored-by: Malcolm Smith --- Android/android.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Android/android.py b/Android/android.py index 15046b6fe1e1c0..b810a6bfb3cc42 100755 --- a/Android/android.py +++ b/Android/android.py @@ -184,10 +184,16 @@ def make_build_python(context): run(["make", "-j", str(os.cpu_count())]) +# To create new builds of these dependencies, usually all that's necessary is to +# push a tag to the cpython-android-source-deps repository, and GitHub Actions +# will do the rest. +# +# If you're a member of the Python core team, and you'd like to be able to push +# these tags yourself, please contact Malcolm Smith or Russell Keith-Magee. def unpack_deps(host, prefix_dir): os.chdir(prefix_dir) deps_url = "https://github.com/beeware/cpython-android-source-deps/releases/download" - for name_ver in ["bzip2-1.0.8-3", "libffi-3.4.4-3", "openssl-3.0.15-4", + for name_ver in ["bzip2-1.0.8-3", "libffi-3.4.4-3", "openssl-3.0.18-0", "sqlite-3.50.4-0", "xz-5.4.6-1", "zstd-1.5.7-1"]: filename = f"{name_ver}-{host}.tar.gz" download(f"{deps_url}/{name_ver}/{filename}") From 8cb73119c67bd49c94a10084ca5e966556ce7049 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 06:50:26 +0200 Subject: [PATCH 0962/1674] [3.14] gh-139573: Update OpenSSL in CI (GH-139577) (#139583) gh-139573: Update OpenSSL in CI (GH-139577) (cherry picked from commit 98e748b3a0d97bd2c785efc63693f971113b3b63) Co-authored-by: Zachary Ware --- .github/workflows/build.yml | 6 +++--- .github/workflows/reusable-ubuntu.yml | 2 +- Doc/using/configure.rst | 2 +- Modules/_ssl_data_35.h | 9 +++++++-- Tools/ssl/multissltests.py | 10 +++++----- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 83abaf89d126e6..cc79c9175b8caf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -320,7 +320,7 @@ jobs: # Keep 1.1.1w in our list despite it being upstream EOL and otherwise # unsupported as it most resembles other 1.1.1-work-a-like ssl APIs # supported by important vendors such as AWS-LC. - openssl_ver: [1.1.1w, 3.0.17, 3.2.5, 3.3.4, 3.4.2, 3.5.2] + openssl_ver: [1.1.1w, 3.0.18, 3.2.6, 3.3.5, 3.4.3, 3.5.4] # See Tools/ssl/make_ssl_data.py for notes on adding a new version env: OPENSSL_VER: ${{ matrix.openssl_ver }} @@ -410,7 +410,7 @@ jobs: needs: build-context if: needs.build-context.outputs.run-tests == 'true' env: - OPENSSL_VER: 3.0.16 + OPENSSL_VER: 3.0.18 PYTHONSTRICTEXTENSIONBUILD: 1 steps: - uses: actions/checkout@v4 @@ -530,7 +530,7 @@ jobs: matrix: os: [ubuntu-24.04] env: - OPENSSL_VER: 3.0.16 + OPENSSL_VER: 3.0.18 PYTHONSTRICTEXTENSIONBUILD: 1 ASAN_OPTIONS: detect_leaks=0:allocator_may_return_null=1:handle_segv=0 steps: diff --git a/.github/workflows/reusable-ubuntu.yml b/.github/workflows/reusable-ubuntu.yml index 76b19fd5d1a72e..7f8b9fdf5d6639 100644 --- a/.github/workflows/reusable-ubuntu.yml +++ b/.github/workflows/reusable-ubuntu.yml @@ -30,7 +30,7 @@ jobs: runs-on: ${{ inputs.os }} timeout-minutes: 60 env: - OPENSSL_VER: 3.0.15 + OPENSSL_VER: 3.0.18 PYTHONSTRICTEXTENSIONBUILD: 1 TERM: linux steps: diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 2cda9587975ddc..d5a329578ad833 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -22,7 +22,7 @@ Features and minimum versions required to build CPython: * Support for threads. -* OpenSSL 1.1.1 is the minimum version and OpenSSL 3.0.16 is the recommended +* OpenSSL 1.1.1 is the minimum version and OpenSSL 3.0.18 is the recommended minimum version for the :mod:`ssl` and :mod:`hashlib` extension modules. * SQLite 3.15.2 for the :mod:`sqlite3` extension module. diff --git a/Modules/_ssl_data_35.h b/Modules/_ssl_data_35.h index 9e69eaa910f003..e4919b550e3a89 100644 --- a/Modules/_ssl_data_35.h +++ b/Modules/_ssl_data_35.h @@ -1,6 +1,6 @@ /* File generated by Tools/ssl/make_ssl_data.py */ -/* Generated on 2025-08-13T16:42:33.155822+00:00 */ -/* Generated from Git commit openssl-3.5.2-0-g0893a6235 */ +/* Generated on 2025-10-04T17:49:19.148321+00:00 */ +/* Generated from Git commit openssl-3.5.4-0-gc1eeb9406 */ /* generated from args.lib2errnum */ static struct py_ssl_library_code library_codes[] = { @@ -5338,6 +5338,11 @@ static struct py_ssl_error_code error_codes[] = { #else {"FIPS_MODULE_ENTERING_ERROR_STATE", 57, 224}, #endif + #ifdef PROV_R_FIPS_MODULE_IMPORT_PCT_ERROR + {"FIPS_MODULE_IMPORT_PCT_ERROR", ERR_LIB_PROV, PROV_R_FIPS_MODULE_IMPORT_PCT_ERROR}, + #else + {"FIPS_MODULE_IMPORT_PCT_ERROR", 57, 253}, + #endif #ifdef PROV_R_FIPS_MODULE_IN_ERROR_STATE {"FIPS_MODULE_IN_ERROR_STATE", ERR_LIB_PROV, PROV_R_FIPS_MODULE_IN_ERROR_STATE}, #else diff --git a/Tools/ssl/multissltests.py b/Tools/ssl/multissltests.py index da21e7d97965d1..ab9840c1c5252d 100755 --- a/Tools/ssl/multissltests.py +++ b/Tools/ssl/multissltests.py @@ -48,11 +48,11 @@ ] OPENSSL_RECENT_VERSIONS = [ - "3.0.16", - "3.2.5", - "3.3.4", - "3.4.2", - "3.5.2", + "3.0.18", + "3.2.6", + "3.3.5", + "3.4.3", + "3.5.4", # See make_ssl_data.py for notes on adding a new version. ] From a45015164213f6c10dceb984f29f39cb86914606 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 07:00:29 +0200 Subject: [PATCH 0963/1674] [3.14] gh-139573: Update Windows builds to use OpenSSL 3.0.18 (GH-139574) (#139586) gh-139573: Update Windows builds to use OpenSSL 3.0.18 (GH-139574) (cherry picked from commit 063cef9999d7490e62cb2ad2711634a992c090fb) Co-authored-by: Zachary Ware --- .../2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst | 1 + Misc/externals.spdx.json | 8 ++++---- PCbuild/get_externals.bat | 4 ++-- PCbuild/python.props | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst diff --git a/Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst b/Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst new file mode 100644 index 00000000000000..02a3bfb41ce5ed --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst @@ -0,0 +1 @@ +Updated bundled version of OpenSSL to 3.0.18. diff --git a/Misc/externals.spdx.json b/Misc/externals.spdx.json index a87af7f9173780..59aceedb94d4c7 100644 --- a/Misc/externals.spdx.json +++ b/Misc/externals.spdx.json @@ -70,21 +70,21 @@ "checksums": [ { "algorithm": "SHA256", - "checksumValue": "6bb739ecddbd2cfb6d255eb5898437a9b5739277dee931338d3275bac5d96ba2" + "checksumValue": "9b07560b6c1afa666bd78b8d3aa5c83fdda02149afdf048596d5b0e0dac1ee55" } ], - "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/openssl-3.0.16.tar.gz", + "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/openssl-3.0.18.tar.gz", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:openssl:openssl:3.0.16:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:openssl:openssl:3.0.18:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], "licenseConcluded": "NOASSERTION", "name": "openssl", "primaryPackagePurpose": "SOURCE", - "versionInfo": "3.0.16" + "versionInfo": "3.0.18" }, { "SPDXID": "SPDXRef-PACKAGE-sqlite", diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index eff8d1ccd7f146..50a227b563a7c0 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.8 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.4.4 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-3.0.16 +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-3.0.18 set libraries=%libraries% mpdecimal-4.0.0 set libraries=%libraries% sqlite-3.50.4.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.15.0 @@ -79,7 +79,7 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi-3.4.4 -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-3.0.16.2 +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-3.0.18 if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.15.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 if NOT "%IncludeLLVM%"=="false" set binaries=%binaries% llvm-19.1.7.0 diff --git a/PCbuild/python.props b/PCbuild/python.props index e1c2ff3fe3cc11..d4d9a54248d648 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -81,8 +81,8 @@ $(libffiDir)$(ArchName)\ $(libffiOutDir)include $(ExternalsDir)\mpdecimal-4.0.0\ - $(ExternalsDir)openssl-3.0.16\ - $(ExternalsDir)openssl-bin-3.0.16.2\$(ArchName)\ + $(ExternalsDir)openssl-3.0.18\ + $(ExternalsDir)openssl-bin-3.0.18\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.3.1\ From 51f8f44bd0c1747df3e9336914c1866a0513b709 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 08:09:09 +0200 Subject: [PATCH 0964/1674] [3.14] gh-139573: Update OpenSSL version used in iOS builds (GH-139582) (#139589) gh-139573: Update OpenSSL version used in iOS builds (GH-139582) Update OpenSSL version used in iOS builds. (cherry picked from commit 20758f9bb1c3baa35c6cb44d0074ae488ca9f4d9) Co-authored-by: Russell Keith-Magee --- Apple/__main__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Apple/__main__.py b/Apple/__main__.py index 88b54e91ac84d6..96c2d34fbe0959 100644 --- a/Apple/__main__.py +++ b/Apple/__main__.py @@ -312,11 +312,18 @@ def unpack_deps( On iOS, as a safety mechanism, any dynamic libraries will be purged from the unpacked dependencies. """ + # To create new builds of these dependencies, usually all that's necessary + # is to push a tag to the cpython-apple-source-deps repository, and GitHub + # Actions will do the rest. + # + # If you're a member of the Python core team, and you'd like to be able to + # push these tags yourself, please contact Malcolm Smith or Russell + # Keith-Magee. deps_url = "https://github.com/beeware/cpython-apple-source-deps/releases/download" for name_ver in [ "BZip2-1.0.8-2", "libFFI-3.4.7-2", - "OpenSSL-3.0.17-1", + "OpenSSL-3.0.18-1", "XZ-5.6.4-2", "mpdecimal-4.0.0-2", "zstd-1.5.7-1", From 1ffd62baca5b60a85f5de49dd4265ea73f9f165b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 10:53:23 +0200 Subject: [PATCH 0965/1674] [3.14] gh-139310: skip `test_aead_aes_gcm` for Linux kernel between 6.16.0 and 6.17.x (GH-139552) (#139594) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-139310: skip `test_aead_aes_gcm` for Linux kernel between 6.16.0 and 6.17.x (GH-139552) Currently, Fedora 42 uses a custom Linux Kernel 6.16.9 that backported an upstream change from 6.17-rc7 [1,3] but not its subsequent fix [2]. Until the issue is resolved upstream, we skip the failing test `test_socket.test_aead_aes_gcm` for kernel versions between 6.16 and 6.17.x. [1] https://github.com/torvalds/linux/commit/1b34cbbf4f011a121ef7b2d7d6e6920a036d5285 [2] https://github.com/torvalds/linux/commit/d0ca0df179c4b21e2a6c4a4fb637aa8fa14575cb. [3] https://gitlab.com/cki-project/kernel-ark/-/commit/45bcf60fe49b37daab1acee57b27211ad1574042 (cherry picked from commit 41712c4e095b2cc988febfe3887616c2779c6210) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/support/__init__.py | 10 ++++++++++ Lib/test/test_socket.py | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index a719e49ef377ff..88f61103512459 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -310,6 +310,16 @@ def requires(resource, msg=None): if resource == 'gui' and not _is_gui_available(): raise ResourceDenied(_is_gui_available.reason) +def _get_kernel_version(sysname="Linux"): + import platform + if platform.system() != sysname: + return None + version_txt = platform.release().split('-', 1)[0] + try: + return tuple(map(int, version_txt.split('.'))) + except ValueError: + return None + def _requires_unix_version(sysname, min_version): """Decorator raising SkipTest if the OS is `sysname` and the version is less than `min_version`. diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 3dd67b2a2aba97..cd07e94b3b160d 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -7045,8 +7045,14 @@ def test_aes_cbc(self): self.assertEqual(len(dec), msglen * multiplier) self.assertEqual(dec, msg * multiplier) - @support.requires_linux_version(4, 9) # see issue29324 + @support.requires_linux_version(4, 9) # see gh-73510 def test_aead_aes_gcm(self): + kernel_version = support._get_kernel_version("Linux") + if kernel_version is not None: + if kernel_version >= (6, 16) and kernel_version < (6, 18): + # See https://github.com/python/cpython/issues/139310. + self.skipTest("upstream Linux kernel issue") + key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c') iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2') plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069') From 07e0eb2093fe1c0dd5ed6f02f0155cd2e0582d02 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:01:35 +0200 Subject: [PATCH 0966/1674] [3.14] gh-118767: Remove ``bool(NotImplemented)`` from pending-removal document (GH-139526) (#139599) Co-authored-by: Jost Migenda --- Doc/deprecations/pending-removal-in-future.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/Doc/deprecations/pending-removal-in-future.rst b/Doc/deprecations/pending-removal-in-future.rst index 4c4a368baca955..43e06da6c282fe 100644 --- a/Doc/deprecations/pending-removal-in-future.rst +++ b/Doc/deprecations/pending-removal-in-future.rst @@ -15,7 +15,6 @@ although there is currently no date scheduled for their removal. * :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. From 08d289208b626b7ba9b26fe690e3fcec439b2092 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:03:49 +0200 Subject: [PATCH 0967/1674] [3.14] gh-138130: Fix return value of libc_ver() on Emscripten (GH-138132) (#138312) Co-authored-by: Hood Chatham --- Lib/platform.py | 5 +++++ Lib/test/test_platform.py | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/platform.py b/Lib/platform.py index 86141f072d20e4..784b6b749b7524 100644 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -173,6 +173,11 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384): """ if not executable: + if sys.platform == "emscripten": + # Emscripten's os.confstr reports that it is glibc, so special case + # it. + ver = ".".join(str(x) for x in sys._emscripten_info.emscripten_version) + return ("emscripten", ver) try: ver = os.confstr('CS_GNU_LIBC_VERSION') # parse 'glibc 2.28' as ('glibc', '2.28') diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 6224c989e6552b..187a3d54809105 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -525,8 +525,10 @@ def test_ios_ver(self): self.assertEqual(override.model, "Whiz") self.assertTrue(override.is_simulator) - @unittest.skipIf(support.is_emscripten, "Does not apply to Emscripten") def test_libc_ver(self): + if support.is_emscripten: + assert platform.libc_ver() == ("emscripten", "4.0.12") + return # check that libc_ver(executable) doesn't raise an exception if os.path.isdir(sys.executable) and \ os.path.exists(sys.executable+'.exe'): From 66ca0d9ae6c31e052026252c65e6ed6c4f859755 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 18:02:11 +0200 Subject: [PATCH 0968/1674] [3.14] gh-139400: Make sure that parent parsers outlive their subparsers in `pyexpat` (GH-139403) (#139606) Co-authored-by: Sebastian Pipping --- Lib/test/test_pyexpat.py | 36 +++++++++++++++++++ ...-09-29-00-01-28.gh-issue-139400.X2T-jO.rst | 4 +++ Modules/pyexpat.c | 25 +++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 1d56ccd71cf962..a0914304638a96 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -755,6 +755,42 @@ def resolve_entity(context, base, system_id, public_id): self.assertEqual(handler_call_args, [("bar", "baz")]) +class ParentParserLifetimeTest(unittest.TestCase): + """ + Subparsers make use of their parent XML_Parser inside of Expat. + As a result, parent parsers need to outlive subparsers. + + See https://github.com/python/cpython/issues/139400. + """ + + def test_parent_parser_outlives_its_subparsers__single(self): + parser = expat.ParserCreate() + subparser = parser.ExternalEntityParserCreate(None) + + # Now try to cause garbage collection of the parent parser + # while it's still being referenced by a related subparser. + del parser + + def test_parent_parser_outlives_its_subparsers__multiple(self): + parser = expat.ParserCreate() + subparser_one = parser.ExternalEntityParserCreate(None) + subparser_two = parser.ExternalEntityParserCreate(None) + + # Now try to cause garbage collection of the parent parser + # while it's still being referenced by a related subparser. + del parser + + def test_parent_parser_outlives_its_subparsers__chain(self): + parser = expat.ParserCreate() + subparser = parser.ExternalEntityParserCreate(None) + subsubparser = subparser.ExternalEntityParserCreate(None) + + # Now try to cause garbage collection of the parent parsers + # while they are still being referenced by a related subparser. + del parser + del subparser + + class ReparseDeferralTest(unittest.TestCase): def test_getter_setter_round_trip(self): parser = expat.ParserCreate() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst new file mode 100644 index 00000000000000..a5dea3b5f8147a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst @@ -0,0 +1,4 @@ +:mod:`xml.parsers.expat`: Make sure that parent Expat parsers are only +garbage-collected once they are no longer referenced by subparsers created +by :meth:`~xml.parsers.expat.xmlparser.ExternalEntityParserCreate`. +Patch by Sebastian Pipping. diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index fa153d86543e99..502ebcdc56eb37 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -74,6 +74,15 @@ typedef struct { PyObject_HEAD XML_Parser itself; + /* + * Strong reference to a parent `xmlparseobject` if this parser + * is a child parser. Set to NULL if this parser is a root parser. + * This is needed to keep the parent parser alive as long as it has + * at least one child parser. + * + * See https://github.com/python/cpython/issues/139400 for details. + */ + PyObject *parent; int ordered_attributes; /* Return attributes as a list. */ int specified_attributes; /* Report only specified attributes. */ int in_callback; /* Is a callback active? */ @@ -1019,6 +1028,11 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, return NULL; } + // The new subparser will make use of the parent XML_Parser inside of Expat. + // So we need to take subparsers into account with the reference counting + // of their parent parser. + Py_INCREF(self); + new_parser->buffer_size = self->buffer_size; new_parser->buffer_used = 0; new_parser->buffer = NULL; @@ -1028,6 +1042,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->ns_prefixes = self->ns_prefixes; new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context, encoding); + new_parser->parent = (PyObject *)self; new_parser->handlers = 0; new_parser->intern = Py_XNewRef(self->intern); @@ -1035,11 +1050,13 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->buffer = PyMem_Malloc(new_parser->buffer_size); if (new_parser->buffer == NULL) { Py_DECREF(new_parser); + Py_DECREF(self); return PyErr_NoMemory(); } } if (!new_parser->itself) { Py_DECREF(new_parser); + Py_DECREF(self); return PyErr_NoMemory(); } @@ -1053,6 +1070,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->handlers = PyMem_New(PyObject *, i); if (!new_parser->handlers) { Py_DECREF(new_parser); + Py_DECREF(self); return PyErr_NoMemory(); } clear_handlers(new_parser, 1); @@ -1242,6 +1260,7 @@ newxmlparseobject(pyexpat_state *state, const char *encoding, /* namespace_separator is either NULL or contains one char + \0 */ self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler, namespace_separator); + self->parent = NULL; if (self->itself == NULL) { PyErr_SetString(PyExc_RuntimeError, "XML_ParserCreate failed"); @@ -1278,6 +1297,7 @@ xmlparse_traverse(PyObject *op, visitproc visit, void *arg) for (size_t i = 0; handler_info[i].name != NULL; i++) { Py_VISIT(self->handlers[i]); } + Py_VISIT(self->parent); Py_VISIT(Py_TYPE(op)); return 0; } @@ -1288,6 +1308,10 @@ xmlparse_clear(PyObject *op) xmlparseobject *self = xmlparseobject_CAST(op); clear_handlers(self, 0); Py_CLEAR(self->intern); + // NOTE: We cannot call Py_CLEAR(self->parent) prior to calling + // XML_ParserFree(self->itself), or a subparser could lose its parent + // XML_Parser while still making use of it internally. + // https://github.com/python/cpython/issues/139400 return 0; } @@ -1301,6 +1325,7 @@ xmlparse_dealloc(PyObject *op) XML_ParserFree(self->itself); } self->itself = NULL; + Py_CLEAR(self->parent); if (self->handlers != NULL) { PyMem_Free(self->handlers); From 3aeee0863aa75234be224ed47a2765b04318cc31 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 20:38:28 +0200 Subject: [PATCH 0969/1674] [3.14] GH-123299: Copyedit 3.14 What's New: New Features (GH-139543) (#139615) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 1242 ++++++++++++++++++++--------------------- 1 file changed, 618 insertions(+), 624 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index f14d727f4aabaf..6e1f115d4f0764 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -80,92 +80,149 @@ plus syntax highlighting in the REPL, as well as the usual deprecations and removals, and improvements in user-friendliness and correctness. +-------------- + .. PEP-sized items next. -* :ref:`PEP 779: Free-threaded Python is officially supported ` -* :ref:`PEP 649 and 749: deferred evaluation of annotations ` -* :ref:`PEP 734: Multiple interpreters in the stdlib ` -* :ref:`PEP 741: Python configuration C API ` -* :ref:`PEP 750: Template strings ` -* :ref:`PEP 758: Allow except and except* expressions without parentheses ` -* :ref:`PEP 761: Discontinuation of PGP signatures ` -* :ref:`PEP 765: Disallow return/break/continue that exit a finally block ` +Interpreter improvements: + +* :pep:`649` and :pep:`749`: :ref:`Deferred evaluation of annotations + ` +* :pep:`734`: :ref:`Multiple interpreters in the standard library + ` +* :pep:`750`: :ref:`Template strings ` +* :pep:`758`: :ref:`Allow except and except* expressions without brackets + ` +* :pep:`765`: :ref:`Control flow in finally blocks + ` +* :pep:`768`: :ref:`Safe external debugger interface for CPython + ` +* :ref:`A new type of interpreter ` * :ref:`Free-threaded mode improvements ` -* :ref:`PEP 768: Safe external debugger interface for CPython ` -* :ref:`PEP 784: Adding Zstandard to the standard library ` -* :ref:`A new type of interpreter ` -* :ref:`Syntax highlighting in the default interactive shell `, - and color output in :ref:`unittest `, - :ref:`argparse `, - :ref:`json ` and - :ref:`calendar ` CLIs -* :ref:`Binary releases for the experimental just-in-time compiler ` +* :ref:`Improved error messages ` + +Significant improvements in the standard library: + +* :pep:`784`: :ref:`Zstandard support in the standard library + ` +* :ref:`whatsnew314-asyncio-introspection` +* :ref:`whatsnew314-concurrent-warnings-control` +* :ref:`Syntax highlighting in the default interactive shell + `, and color output in several + standard library CLIs + +C API improvements: + +* :pep:`741`: :ref:`Python configuration C API ` + +Platform support: + +* :pep:`776`: Emscripten is now an :ref:`officially supported platform + `, at :pep:`tier 3 <11#tier-3>`. + +Release changes: +* :pep:`779`: :ref:`Free-threaded Python is officially supported + ` +* :pep:`761`: :ref:`Discontinuation of PGP signatures ` +* :ref:`Windows and macOS binary releases now support the experimental + just-in-time compiler ` +* :ref:`Binary releases for Android are now provided ` New features ============ -.. _whatsnew314-pep779: +.. _whatsnew314-deferred-annotations: -PEP 779: Free-threaded Python is officially supported ------------------------------------------------------ +:pep:`649` & :pep:`749`: Deferred evaluation of annotations +------------------------------------------------------------ -The free-threaded build of Python is now supported and no longer experimental. -This is the start of phase II where free-threaded Python is officially supported -but still optional. +The :term:`annotations ` on functions, classes, and modules are no +longer evaluated eagerly. Instead, annotations are stored in special-purpose +:term:`annotate functions ` and evaluated only when +necessary (except if ``from __future__ import annotations`` is used). -We are confident that the project is on the right path, and we appreciate the -continued dedication from everyone working to make free-threading ready for -broader adoption across the Python community. +This change is designed to improve performance and usability of annotations +in Python in most circumstances. The runtime cost for defining annotations is +minimized, but it remains possible to introspect annotations at runtime. +It is no longer necessary to enclose annotations in strings if they +contain forward references. -With these recommendations and the acceptance of this PEP, we as the Python -developer community should broadly advertise that free-threading is a supported -Python build option now and into the future, and that it will not be removed -without a proper deprecation schedule. +The new :mod:`annotationlib` module provides tools for inspecting deferred +annotations. Annotations may be evaluated in the :attr:`~annotationlib.Format.VALUE` +format (which evaluates annotations to runtime values, similar to the behavior in +earlier Python versions), the :attr:`~annotationlib.Format.FORWARDREF` format +(which replaces undefined names with special markers), and the +:attr:`~annotationlib.Format.STRING` format (which returns annotations as strings). + +This example shows how these formats behave: + +.. doctest:: + + >>> from annotationlib import get_annotations, Format + >>> def func(arg: Undefined): + ... pass + >>> get_annotations(func, format=Format.VALUE) + Traceback (most recent call last): + ... + NameError: name 'Undefined' is not defined + >>> get_annotations(func, format=Format.FORWARDREF) + {'arg': ForwardRef('Undefined', owner=)} + >>> get_annotations(func, format=Format.STRING) + {'arg': 'Undefined'} -Any decision to transition to phase III, with free-threading as the default or -sole build of Python is still undecided, and dependent on many factors both -within CPython itself and the community. This decision is for the future. +The :ref:`porting ` section contains guidance +on changes that may be needed due to these changes, though in the majority of +cases, code will continue working as-is. + +(Contributed by Jelle Zijlstra in :pep:`749` and :gh:`119180`; +:pep:`649` was written by Larry Hastings.) .. seealso:: - :pep:`779` and its `acceptance - `__. -.. _whatsnew314-pep734: + :pep:`649` + Deferred Evaluation Of Annotations Using Descriptors + :pep:`749` + Implementing PEP 649 -PEP 734: Multiple interpreters in the stdlib --------------------------------------------- + +.. _whatsnew314-multiple-interpreters: + +:pep:`734`: Multiple interpreters in the standard library +--------------------------------------------------------- The CPython runtime supports running multiple copies of Python in the same process simultaneously and has done so for over 20 years. -Each of these separate copies is called an "interpreter". -However, the feature had been available only through the C-API. +Each of these separate copies is called an 'interpreter'. +However, the feature had been available only through +the :ref:`C-API `. -That limitation is removed in the 3.14 release, +That limitation is removed in Python 3.14, with the new :mod:`concurrent.interpreters` module. There are at least two notable reasons why using multiple interpreters -is worth considering: +has significant benefits: * they support a new (to Python), human-friendly concurrency model * true multi-core parallelism For some use cases, concurrency in software enables efficiency and -can simplify software, at a high level. At the same time, implementing -and maintaining all but the simplest concurrency is often a struggle -for the human brain. That especially applies to plain threads -(for example, :mod:`threading`), where all memory is shared between all threads. +can simplify design, at a high level. +At the same time, implementing and maintaining all but the simplest concurrency +is often a struggle for the human brain. +That especially applies to plain threads (for example, :mod:`threading`), +where all memory is shared between all threads. With multiple isolated interpreters, you can take advantage of a class of concurrency models, like CSP or the actor model, that have found success in other programming languages, like Smalltalk, Erlang, -Haskell, and Go. Think of multiple interpreters like threads +Haskell, and Go. Think of multiple interpreters like threads but with opt-in sharing. -Regarding multi-core parallelism: as of the 3.12 release, interpreters -are now sufficiently isolated from one another to be used in parallel. -(See :pep:`684`.) This unlocks a variety of CPU-intensive use cases +Regarding multi-core parallelism: as of Python 3.12, interpreters +are now sufficiently isolated from one another to be used in parallel +(see :pep:`684`). This unlocks a variety of CPU-intensive use cases for Python that were limited by the :term:`GIL`. Using multiple interpreters is similar in many ways to @@ -173,402 +230,285 @@ Using multiple interpreters is similar in many ways to "processes" that can run in parallel, with no sharing by default. However, when using multiple interpreters, an application will use fewer system resources and will operate more efficiently (since it -stays within the same process). Think of multiple interpreters as +stays within the same process). Think of multiple interpreters as having the isolation of processes with the efficiency of threads. .. XXX Add an example or two. .. XXX Link to the not-yet-added HOWTO doc. While the feature has been around for decades, multiple interpreters -have not been used widely, due to low awareness and the lack of a stdlib -module. Consequently, they currently have several notable limitations, -which will improve significantly now that the feature is finally -going mainstream. +have not been used widely, due to low awareness and the lack of a +standard library module. Consequently, they currently have several +notable limitations, which will improve significantly now that the +feature is finally going mainstream. Current limitations: * starting each interpreter has not been optimized yet * each interpreter uses more memory than necessary - (we will be working next on extensive internal sharing between - interpreters) + (work continues on extensive internal sharing between interpreters) * there aren't many options *yet* for truly sharing objects or other data between interpreters (other than :type:`memoryview`) -* many extension modules on PyPI are not compatible with multiple - interpreters yet (stdlib extension modules *are* compatible) +* many third-party extension modules on PyPI are not yet compatible + with multiple interpreters + (all standard library extension modules *are* compatible) * the approach to writing applications that use multiple isolated interpreters is mostly unfamiliar to Python users, for now The impact of these limitations will depend on future CPython improvements, how interpreters are used, and what the community solves -through PyPI packages. Depending on the use case, the limitations may +through PyPI packages. Depending on the use case, the limitations may not have much impact, so try it out! Furthermore, future CPython releases will reduce or eliminate overhead -and provide utilities that are less appropriate on PyPI. In the +and provide utilities that are less appropriate on PyPI. In the meantime, most of the limitations can also be addressed through extension modules, meaning PyPI packages can fill any gap for 3.14, and even back to 3.12 where interpreters were finally properly isolated and -stopped sharing the :term:`GIL`. Likewise, we expect to slowly see -libraries on PyPI for high-level abstractions on top of interpreters. +stopped sharing the :term:`GIL`. Likewise, libraries on PyPI are expected +to emerge for high-level abstractions on top of interpreters. Regarding extension modules, work is in progress to update some PyPI projects, as well as tools like Cython, pybind11, nanobind, and PyO3. The steps for isolating an extension module are found at -:ref:`isolating-extensions-howto`. Isolating a module has a lot of -overlap with what is required to support -:ref:`free-threading `, -so the ongoing work in the community in that area will help accelerate -support for multiple interpreters. +:ref:`isolating-extensions-howto`. +Isolating a module has a lot of overlap with what is required to support +:ref:`free-threading `, so the ongoing +work in the community in that area will help accelerate support +for multiple interpreters. Also added in 3.14: :ref:`concurrent.futures.InterpreterPoolExecutor `. -.. seealso:: - :pep:`734`. +(Contributed by Eric Snow in :gh:`134939`.) +.. seealso:: :pep:`734` -.. _whatsnew314-pep750: -PEP 750: Template strings -------------------------- +.. _whatsnew314-template-string-literals: -Template string literals (t-strings) are a generalization of f-strings, -using a ``t`` in place of the ``f`` prefix. Instead of evaluating -to :class:`str`, t-strings evaluate to a new :class:`!string.templatelib.Template` type: +:pep:`750`: Template string literals +------------------------------------ -.. code-block:: python +Template strings are a new mechanism for custom string processing. +They share the familiar syntax of f-strings but, unlike f-strings, +return an object representing the static and interpolated parts of +the string, instead of a simple :class:`str`. - from string.templatelib import Template +To write a t-string, use a ``'t'`` prefix instead of an ``'f'``: - name = "World" - template: Template = t"Hello {name}" - -The template can then be combined with functions that operate on the template's -structure to produce a :class:`str` or a string-like result. -For example, sanitizing input: +.. doctest:: -.. code-block:: python + >>> variety = 'Stilton' + >>> template = t'Try some {variety} cheese!' + >>> type(template) + - evil = "" - template = t"

{evil}

" - assert html(template) == "

<script>alert('evil')</script>

" +:class:`~string.templatelib.Template` objects provide access to the static +and interpolated (in curly braces) parts of a string *before* they are combined. +Iterate over :class:`!Template` instances to access their parts in order: -As another example, generating HTML attributes from data: +.. testsetup:: -.. code-block:: python + variety = 'Stilton' + template = t'Try some {variety} cheese!' - attributes = {"src": "shrubbery.jpg", "alt": "looks nice"} - template = t"" - assert html(template) == 'looks nice' +.. doctest:: -Compared to using an f-string, the ``html`` function has access to template attributes -containing the original information: static strings, interpolations, and values -from the original scope. Unlike existing templating approaches, t-strings build -from the well-known f-string syntax and rules. Template systems thus benefit -from Python tooling as they are much closer to the Python language, syntax, -scoping, and more. + >>> list(template) + ['Try some ', Interpolation('Stilton', 'variety', None, ''), ' cheese!'] -Writing template handlers is straightforward: +It's easy to write (or call) code to process :class:`!Template` instances. +For example, here's a function that renders static parts lowercase and +:class:`~string.templatelib.Interpolation` instances uppercase: .. code-block:: python - from string.templatelib import Template, Interpolation + from string.templatelib import Interpolation - def lower_upper(template: Template) -> str: - """Render static parts lowercased and interpolations uppercased.""" - parts: list[str] = [] - for item in template: - if isinstance(item, Interpolation): - parts.append(str(item.value).upper()) + def lower_upper(template): + """Render static parts lowercase and interpolations uppercase.""" + parts = [] + for part in template: + if isinstance(part, Interpolation): + parts.append(str(part.value).upper()) else: - parts.append(item.lower()) - return "".join(parts) - - name = "world" - assert lower_upper(t"HELLO {name}") == "hello WORLD" - -With this in place, developers can write template systems to sanitize SQL, make -safe shell operations, improve logging, tackle modern ideas in web development -(HTML, CSS, and so on), and implement lightweight, custom business DSLs. - -(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, -Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, -and Pablo Galindo Salgado in :gh:`132661`.) - -.. seealso:: - :pep:`750`. - - -.. _whatsnew314-pep768: - -PEP 768: Safe external debugger interface for CPython ------------------------------------------------------ - -:pep:`768` introduces a zero-overhead debugging interface that allows debuggers and profilers -to safely attach to running Python processes. This is a significant enhancement to Python's -debugging capabilities allowing debuggers to forego unsafe alternatives. See -:ref:`below ` for how this feature is leveraged to -implement the new :mod:`pdb` module's remote attaching capabilities. - -The new interface provides safe execution points for attaching debugger code without modifying -the interpreter's normal execution path or adding runtime overhead. This enables tools to -inspect and interact with Python applications in real-time without stopping or restarting -them — a crucial capability for high-availability systems and production environments. - -For convenience, CPython implements this interface through the :mod:`sys` module with a -:func:`sys.remote_exec` function:: - - sys.remote_exec(pid, script_path) + parts.append(part.lower()) + return ''.join(parts) -This function allows sending Python code to be executed in a target process at the next safe -execution point. However, tool authors can also implement the protocol directly as described -in the PEP, which details the underlying mechanisms used to safely attach to running processes. + name = 'Wenslydale' + template = t'Mister {name}' + assert lower_upper(template) == 'mister WENSLYDALE' -Here's a simple example that inspects object types in a running Python process: - - .. code-block:: python - - import os - import sys - import tempfile - - # Create a temporary script - with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f: - script_path = f.name - f.write(f"import my_debugger; my_debugger.connect({os.getpid()})") - try: - # Execute in process with PID 1234 - print("Behold! An offering:") - sys.remote_exec(1234, script_path) - finally: - os.unlink(script_path) - -The debugging interface has been carefully designed with security in mind and includes several -mechanisms to control access: - -* A :envvar:`PYTHON_DISABLE_REMOTE_DEBUG` environment variable. -* A :option:`-X disable-remote-debug` command-line option. -* A :option:`--without-remote-debug` configure flag to completely disable the feature at build time. - -A key implementation detail is that the interface piggybacks on the interpreter's existing evaluation -loop and safe points, ensuring zero overhead during normal execution while providing a reliable way -for external processes to coordinate debugging operations. - -(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic in :gh:`131591`.) - -.. seealso:: - :pep:`768`. - - -.. _whatsnew314-pep784: - -PEP 784: Adding Zstandard to the standard library -------------------------------------------------- - -The new ``compression`` package contains modules :mod:`!compression.lzma`, -:mod:`!compression.bz2`, :mod:`!compression.gzip` and :mod:`!compression.zlib` -which re-export the :mod:`lzma`, :mod:`bz2`, :mod:`gzip` and :mod:`zlib` -modules respectively. The new import names under ``compression`` are the -canonical names for importing these compression modules going forward. However, -the existing modules names have not been deprecated. Any deprecation or removal -of the existing compression modules will occur no sooner than five years after -the release of 3.14. - -The new :mod:`!compression.zstd` module provides compression and decompression -APIs for the Zstandard format via bindings to `Meta's zstd library -`__. Zstandard is a widely adopted, highly -efficient, and fast compression format. In addition to the APIs introduced in -:mod:`!compression.zstd`, support for reading and writing Zstandard compressed -archives has been added to the :mod:`tarfile`, :mod:`zipfile`, and -:mod:`shutil` modules. - -Here's an example of using the new module to compress some data: +Because :class:`!Template` instances distinguish between static strings and +interpolations at runtime, they can be useful for sanitising user input. +Writing a :func:`!html` function that escapes user input in HTML is an exercise +left to the reader! +Template processing code can provide improved flexibility. +For instance, a more advanced :func:`!html` function could accept +a :class:`!dict` of HTML attributes directly in the template: .. code-block:: python - from compression import zstd - import math + attributes = {'src': 'limburger.jpg', 'alt': 'lovely cheese'} + template = t'' + assert html(template) == 'lovely cheese' - data = str(math.pi).encode() * 20 +Of course, template processing code does not need to return a string-like result. +An even *more* advanced :func:`!html` could return a custom type representing +a DOM-like structure. - compressed = zstd.compress(data) - - ratio = len(compressed) / len(data) - print(f"Achieved compression ratio of {ratio}") - -As can be seen, the API is similar to the APIs of the :mod:`!lzma` and -:mod:`!bz2` modules. - -(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, -Victor Stinner, and Rogdham in :gh:`132983`.) - -.. seealso:: - :pep:`784`. - - -.. _whatsnew314-remote-pdb: - -Remote attaching to a running Python process with PDB ------------------------------------------------------ - -The :mod:`pdb` module now supports remote attaching to a running Python process -using a new ``-p PID`` command-line option: +With t-strings in place, developers can write systems that sanitise SQL, +make safe shell operations, improve logging, tackle modern ideas in web +development (HTML, CSS, and so on), and implement lightweight custom business DSLs. -.. code-block:: sh - - python -m pdb -p 1234 - -This will connect to the Python process with the given PID and allow you to -debug it interactively. Notice that due to how the Python interpreter works -attaching to a remote process that is blocked in a system call or waiting for -I/O will only work once the next bytecode instruction is executed or when the -process receives a signal. - -This feature uses :pep:`768` and the :func:`sys.remote_exec` function -to attach to the remote process and send the PDB commands to it. +(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, +Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, +and Pablo Galindo Salgado in :gh:`132661`.) +.. seealso:: :pep:`750`. -(Contributed by Matt Wozniski and Pablo Galindo in :gh:`131591`.) -.. seealso:: - :pep:`768`. +.. _whatsnew314-remote-debugging: +:pep:`768`: Safe external debugger interface +-------------------------------------------- -.. _whatsnew314-pep758: +Python 3.14 introduces a zero-overhead debugging interface that allows +debuggers and profilers to safely attach to running Python processes +without stopping or restarting them. +This is a significant enhancement to Python's debugging capabilities, +meaning that unsafe alternatives are no longer required. -PEP 758 – Allow except and except* expressions without parentheses ------------------------------------------------------------------- +The new interface provides safe execution points for attaching debugger code +without modifying the interpreter's normal execution path +or adding any overhead at runtime. +Due to this, tools can now inspect and interact with Python applications +in real-time, which is a crucial capability for high-availability systems +and production environments. -The :keyword:`except` and :keyword:`except* ` expressions now allow -parentheses to be omitted when there are multiple exception types and the ``as`` clause is not used. -For example the following expressions are now valid: +For convenience, this interface is implemented in the :func:`sys.remote_exec` +function. For example: .. code-block:: python - try: - connect_to_server() - except TimeoutError, ConnectionRefusedError: - print("Network issue encountered.") - - # The same applies to except* (for exception groups): - - try: - connect_to_server() - except* TimeoutError, ConnectionRefusedError: - print("Network issue encountered.") + import sys + from tempfile import NamedTemporaryFile -Check :pep:`758` for more details. + with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f: + script_path = f.name + f.write(f'import my_debugger; my_debugger.connect({os.getpid()})') -(Contributed by Pablo Galindo and Brett Cannon in :gh:`131831`.) + # Execute in process with PID 1234 + print('Behold! An offering:') + sys.remote_exec(1234, script_path) -.. seealso:: - :pep:`758`. +This function allows sending Python code to be executed in a target process +at the next safe execution point. +However, tool authors can also implement the protocol directly as described +in the PEP, which details the underlying mechanisms used to safely attach to +running processes. -.. _whatsnew314-pep649: +The debugging interface has been carefully designed with security in mind +and includes several mechanisms to control access: -PEP 649 and 749: deferred evaluation of annotations ---------------------------------------------------- +* A :envvar:`PYTHON_DISABLE_REMOTE_DEBUG` environment variable. +* A :option:`-X disable-remote-debug` command-line option. +* A :option:`--without-remote-debug` configure flag to completely disable + the feature at build time. -The :term:`annotations ` on functions, classes, and modules are no -longer evaluated eagerly. Instead, annotations are stored in special-purpose -:term:`annotate functions ` and evaluated only when -necessary (except if ``from __future__ import annotations`` is used). -This is specified in :pep:`649` and :pep:`749`. +(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic +in :gh:`131591`.) -This change is designed to make annotations in Python more performant and more -usable in most circumstances. The runtime cost for defining annotations is -minimized, but it remains possible to introspect annotations at runtime. -It is no longer necessary to enclose annotations in strings if they -contain forward references. +.. seealso:: :pep:`768`. -The new :mod:`annotationlib` module provides tools for inspecting deferred -annotations. Annotations may be evaluated in the :attr:`~annotationlib.Format.VALUE` -format (which evaluates annotations to runtime values, similar to the behavior in -earlier Python versions), the :attr:`~annotationlib.Format.FORWARDREF` format -(which replaces undefined names with special markers), and the -:attr:`~annotationlib.Format.STRING` format (which returns annotations as strings). -This example shows how these formats behave: +.. _whatsnew314-tail-call-interpreter: -.. doctest:: +A new type of interpreter +------------------------- - >>> from annotationlib import get_annotations, Format - >>> def func(arg: Undefined): - ... pass - >>> get_annotations(func, format=Format.VALUE) - Traceback (most recent call last): - ... - NameError: name 'Undefined' is not defined - >>> get_annotations(func, format=Format.FORWARDREF) - {'arg': ForwardRef('Undefined', owner=)} - >>> get_annotations(func, format=Format.STRING) - {'arg': 'Undefined'} +A new type of interpreter has been added to CPython. +It uses tail calls between small C functions that implement individual +Python opcodes, rather than one large C ``case`` statement. +For certain newer compilers, this interpreter provides +significantly better performance. Preliminary benchmarks suggest a geometric +mean of 3-5% faster on the standard ``pyperformance`` benchmark suite, +depending on platform and architecture. +The baseline is Python 3.14 built with Clang 19, without this new interpreter. -Implications for annotated code -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This interpreter currently only works with Clang 19 and newer +on x86-64 and AArch64 architectures. However, a future release +of GCC is expected will support this as well. -If you define annotations in your code (for example, for use with a static type -checker), then this change probably does not affect you: you can keep -writing annotations the same way you did with previous versions of Python. +This feature is opt-in for now. Enabling profile-guided optimization is highly +recommendeded when using the new interpreter as it is the only configuration +that has been tested and validated for improved performance. +For further information, see :option:`--with-tail-call-interp`. -You will likely be able to remove quoted strings in annotations, which are frequently -used for forward references. Similarly, if you use ``from __future__ import annotations`` -to avoid having to write strings in annotations, you may well be able to -remove that import once you support only Python 3.14 and newer. -However, if you rely on third-party libraries that read annotations, -those libraries may need changes to support unquoted annotations before they -work as expected. +.. note:: -Implications for readers of ``__annotations__`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + This is not to be confused with `tail call optimization`__ of Python + functions, which is currently not implemented in CPython. -If your code reads the ``__annotations__`` attribute on objects, you may want -to make changes in order to support code that relies on deferred evaluation of -annotations. For example, you may want to use :func:`annotationlib.get_annotations` -with the :attr:`~annotationlib.Format.FORWARDREF` format, as the :mod:`dataclasses` -module now does. + This new interpreter type is an internal implementation detail of the CPython + interpreter. It doesn't change the visible behavior of Python programs at + all. It can improve their performance, but doesn't change anything else. -The external :pypi:`typing_extensions` package provides partial backports of some of the -functionality of the :mod:`annotationlib` module, such as the :class:`~annotationlib.Format` -enum and the :func:`~annotationlib.get_annotations` function. These can be used to -write cross-version code that takes advantage of the new behavior in Python 3.14. + __ https://en.wikipedia.org/wiki/Tail_call -Related changes -^^^^^^^^^^^^^^^ +(Contributed by Ken Jin in :gh:`128563`, with ideas on how to implement this +in CPython by Mark Shannon, Garrett Gu, Haoran Xu, and Josh Haberman.) -The changes in Python 3.14 are designed to rework how ``__annotations__`` -works at runtime while minimizing breakage to code that contains -annotations in source code and to code that reads ``__annotations__``. However, -if you rely on undocumented details of the annotation behavior or on private -functions in the standard library, there are many ways in which your code may -not work in Python 3.14. To safeguard your code against future changes, -use only the documented functionality of the :mod:`annotationlib` module. -In particular, do not read annotations directly from the namespace dictionary -attribute of type objects. Use :func:`annotationlib.get_annotate_from_class_namespace` -during class construction and :func:`annotationlib.get_annotations` afterwards. +.. _whatsnew314-free-threaded-cpython: -In previous releases, it was sometimes possible to access class annotations from -an instance of an annotated class. This behavior was undocumented and accidental, -and will no longer work in Python 3.14. +Free-threaded mode improvements +------------------------------- + +CPython's free-threaded mode (:pep:`703`), initially added in 3.13, +has been significantly improved in Python 3.14. +The implementation described in PEP 703 has been finished, including C API +changes, and temporary workarounds in the interpreter were replaced with +more permanent solutions. +The specializing adaptive interpreter (:pep:`659`) is now enabled +in free-threaded mode, which along with many other optimizations +greatly improves its performance. +The performance penalty on single-threaded code in free-threaded mode +is now roughly 5-10%, depending on the platform and C compiler used. + +From Python 3.14, when compiling extension modules for the free-threaded build of +CPython on Windows, the preprocessor variable ``Py_GIL_DISABLED`` now needs to +be specified by the build backend, as it will no longer be determined +automatically by the C compiler. For a running interpreter, the setting that +was used at compile time can be found using :func:`sysconfig.get_config_var`. -``from __future__ import annotations`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The new :option:`-X context_aware_warnings <-X>` flag controls if +:ref:`concurrent safe warnings control ` +is enabled. The flag defaults to true for the free-threaded build +and false for the GIL-enabled build. -In Python 3.7, :pep:`563` introduced the ``from __future__ import annotations`` -directive, which turns all annotations into strings. This directive is now -considered deprecated and it is expected to be removed in a future version of Python. -However, this removal will not happen until after Python 3.13, the last version of -Python without deferred evaluation of annotations, reaches its end of life in 2029. -In Python 3.14, the behavior of code using ``from __future__ import annotations`` -is unchanged. +A new :data:`~sys.flags.thread_inherit_context` flag has been added, +which if enabled means that threads created with :class:`threading.Thread` +start with a copy of the :class:`~contextvars.Context()` of the caller of +:meth:`~threading.Thread.start`. Most significantly, this makes the warning +filtering context established by :class:`~warnings.catch_warnings` be +"inherited" by threads (or asyncio tasks) started within that context. It also +affects other modules that use context variables, such as the :mod:`decimal` +context manager. +This flag defaults to true for the free-threaded build and false for +the GIL-enabled build. -(Contributed by Jelle Zijlstra in :gh:`119180`; :pep:`649` was written by Larry Hastings.) +(Contributed by Sam Gross, Matt Page, Neil Schemenauer, Thomas Wouters, +Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, Brett Simmers, +Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, Kumar Aditya, +Edgar Margffoy, and many others. +Some of these contributors are employed by Meta, which has continued to provide +significant engineering resources to support this project.) -.. seealso:: - :pep:`649` and :pep:`749`. +.. _whatsnew314-improved-error-messages: Improved error messages ----------------------- @@ -589,47 +529,12 @@ Improved error messages ^^^^^^ SyntaxError: invalid syntax. Did you mean 'while'? - >>> asynch def fetch_data(): - ... pass - Traceback (most recent call last): - File "", line 1 - asynch def fetch_data(): - ^^^^^^ - SyntaxError: invalid syntax. Did you mean 'async'? - - >>> async def foo(): - ... awaid fetch_data() - Traceback (most recent call last): - File "", line 2 - awaid fetch_data() - ^^^^^ - SyntaxError: invalid syntax. Did you mean 'await'? - - >>> raisee ValueError("Error") - Traceback (most recent call last): - File "", line 1 - raisee ValueError("Error") - ^^^^^^ - SyntaxError: invalid syntax. Did you mean 'raise'? - While the feature focuses on the most common cases, some variations of misspellings may still result in regular syntax errors. (Contributed by Pablo Galindo in :gh:`132449`.) -* When an unpacking assignment fails due to an incorrect number of variables, the - error message prints the received number of values in more cases than before. - (Contributed by Tushar Sadhwani in :gh:`122239`.) - - .. code-block:: pycon - - >>> x, y, z = 1, 2, 3, 4 - Traceback (most recent call last): - File "", line 1, in - x, y, z = 1, 2, 3, 4 - ^^^^^^^ - ValueError: too many values to unpack (expected 3, got 4) - -* :keyword:`elif` statements that follow an :keyword:`else` block now have a specific error message. +* :keyword:`elif` statements that follow an :keyword:`else` block now have + a specific error message. (Contributed by Steele Farnsworth in :gh:`129902`.) .. code-block:: pycon @@ -645,11 +550,9 @@ Improved error messages ^^^^ SyntaxError: 'elif' block follows an 'else' block -* If a statement (:keyword:`pass`, :keyword:`del`, :keyword:`return`, - :keyword:`yield`, :keyword:`raise`, :keyword:`break`, :keyword:`continue`, - :keyword:`assert`, :keyword:`import`, :keyword:`from`) is passed to the - :ref:`if_expr` after :keyword:`else`, or one of :keyword:`pass`, - :keyword:`break`, or :keyword:`continue` is passed before :keyword:`if`, then the +* If a statement is passed to the :ref:`if_expr` after :keyword:`else`, + or one of :keyword:`pass`, :keyword:`break`, or :keyword:`continue` + is passed before :keyword:`if`, then the error message highlights where the :token:`~python-grammar:expression` is required. (Contributed by Sergey Miryanov in :gh:`129515`.) @@ -669,10 +572,9 @@ Improved error messages ^^^^^^^^ SyntaxError: expected expression before 'if', but statement is given - * When incorrectly closed strings are detected, the error message suggests - that the string may be intended to be part of the string. (Contributed by - Pablo Galindo in :gh:`88535`.) + that the string may be intended to be part of the string. + (Contributed by Pablo Galindo in :gh:`88535`.) .. code-block:: pycon @@ -681,8 +583,8 @@ Improved error messages SyntaxError: invalid syntax. Is this intended to be part of the string? * When strings have incompatible prefixes, the error now shows - which prefixes are incompatible. (Contributed by - Nikita Sobolev in :gh:`133197`.) + which prefixes are incompatible. + (Contributed by Nikita Sobolev in :gh:`133197`.) .. code-block:: pycon @@ -699,20 +601,11 @@ Improved error messages - Except handlers: ``except ... as ...`` - Pattern-match cases: ``case ... as ...`` - (Contributed by Nikita Sobolev in :gh:`123539`, - :gh:`123562`, and :gh:`123440`.) - - .. code-block:: pycon - - >>> import ast as arr[0] - File "", line 1 - import ast as arr[0] - ^^^^^^ - SyntaxError: cannot use subscript as import target + (Contributed by Nikita Sobolev in :gh:`123539`, :gh:`123562`, and :gh:`123440`.) * Improved error message when trying to add an instance of an unhashable type to - a :class:`dict` or :class:`set`. (Contributed by CF Bolz-Tereick and Victor Stinner - in :gh:`132828`.) + a :class:`dict` or :class:`set`. + (Contributed by CF Bolz-Tereick and Victor Stinner in :gh:`132828`.) .. code-block:: pycon @@ -739,65 +632,70 @@ Improved error messages (Contributed by Bénédikt Tran in :gh:`128398`.) -.. _whatsnew314-pep741: +.. _whatsnew314-zstandard: -PEP 741: Python configuration C API ------------------------------------ +:pep:`784`: Zstandard support in the standard library +----------------------------------------------------- -Add a :ref:`PyInitConfig C API ` to configure the Python -initialization without relying on C structures and the ability to make -ABI-compatible changes in the future. +The new :mod:`!compression` package contains modules :mod:`!compression.lzma`, +:mod:`!compression.bz2`, :mod:`!compression.gzip` and :mod:`!compression.zlib` +which re-export the :mod:`lzma`, :mod:`bz2`, :mod:`gzip` and :mod:`zlib` +modules respectively. The new import names under :mod:`!compression` are the +preferred names for importing these compression modules from Python 3.14. However, +the existing modules names have not been deprecated. Any deprecation or removal +of the existing compression modules will occur no sooner than five years after +the release of 3.14. -Complete the :pep:`587` :ref:`PyConfig C API ` by adding -:c:func:`PyInitConfig_AddModule` which can be used to add a built-in extension -module; a feature previously referred to as the “inittab”. +The new :mod:`!compression.zstd` module provides compression and decompression +APIs for the Zstandard format via bindings to `Meta's zstd library +`__. Zstandard is a widely adopted, highly +efficient, and fast compression format. In addition to the APIs introduced in +:mod:`!compression.zstd`, support for reading and writing Zstandard compressed +archives has been added to the :mod:`tarfile`, :mod:`zipfile`, and +:mod:`shutil` modules. -Add :c:func:`PyConfig_Get` and :c:func:`PyConfig_Set` functions to get and set -the current runtime configuration. +Here's an example of using the new module to compress some data: -PEP 587 “Python Initialization Configuration” unified all the ways to configure -the Python initialization. This PEP unifies also the configuration of the -Python preinitialization and the Python initialization in a single API. -Moreover, this PEP only provides a single choice to embed Python, instead of -having two “Python” and “Isolated” choices (PEP 587), to simplify the API -further. +.. code-block:: python -The lower level PEP 587 PyConfig API remains available for use cases with an -intentionally higher level of coupling to CPython implementation details (such -as emulating the full functionality of CPython’s CLI, including its -configuration mechanisms). + from compression import zstd + import math -(Contributed by Victor Stinner in :gh:`107954`.) + data = str(math.pi).encode() * 20 + compressed = zstd.compress(data) + ratio = len(compressed) / len(data) + print(f"Achieved compression ratio of {ratio}") -.. seealso:: - :pep:`741`. +As can be seen, the API is similar to the APIs of the :mod:`!lzma` and +:mod:`!bz2` modules. -.. _whatsnew314-asyncio-introspection: +(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, +Victor Stinner, and Rogdham in :gh:`132983`.) -Asyncio introspection capabilities ----------------------------------- +.. seealso:: :pep:`784`. -Added a new command-line interface to inspect running Python processes using -asynchronous tasks, available via: -.. code-block:: bash +.. _whatsnew314-asyncio-introspection: - python -m asyncio ps PID +Asyncio introspection capabilities +---------------------------------- -This tool inspects the given process ID (PID) and displays information about -currently running asyncio tasks. It outputs a task table: a flat -listing of all tasks, their names, their coroutine stacks, and which tasks are -awaiting them. +Added a new command-line interface to inspect running Python processes +using asynchronous tasks, available via ``python -m asyncio ps PID`` +or ``python -m asyncio pstree PID``. -.. code-block:: bash +The ``ps`` subcommand inspects the given process ID (PID) and displays +information about currently running asyncio tasks. +It outputs a task table: a flat listing of all tasks, their names, +their coroutine stacks, and which tasks are awaiting them. - python -m asyncio pstree PID -This tool fetches the same information, but renders a visual async call tree, -showing coroutine relationships in a hierarchical format. This command is -particularly useful for debugging long-running or stuck asynchronous programs. -It can help developers quickly identify where a program is blocked, what tasks -are pending, and how coroutines are chained together. +The ``pstree`` subcommand fetches the same information, but instead renders a +visual async call tree, showing coroutine relationships in a hierarchical format. +This command is particularly useful for debugging long-running or stuck +asynchronous programs. +It can help developers quickly identify where a program is blocked, +what tasks are pending, and how coroutines are chained together. For example given this code: @@ -805,23 +703,25 @@ For example given this code: import asyncio - async def play(track): + async def play_track(track): await asyncio.sleep(5) - print(f"🎵 Finished: {track}") + print(f'🎵 Finished: {track}') - async def album(name, tracks): + async def play_album(name, tracks): async with asyncio.TaskGroup() as tg: for track in tracks: - tg.create_task(play(track), name=track) + tg.create_task(play_track(track), name=track) async def main(): async with asyncio.TaskGroup() as tg: tg.create_task( - album("Sundowning", ["TNDNBTG", "Levitate"]), name="Sundowning") + play_album('Sundowning', ['TNDNBTG', 'Levitate']), + name='Sundowning') tg.create_task( - album("TMBTE", ["DYWTYLM", "Aqua Regia"]), name="TMBTE") + play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']), + name='TMBTE') - if __name__ == "__main__": + if __name__ == '__main__': asyncio.run(main()) Executing the new tool on the running process will yield a table like this: @@ -886,139 +786,16 @@ prevent tree construction: (Contributed by Pablo Galindo, Łukasz Langa, Yury Selivanov, and Marta Gomez Macias in :gh:`91048`.) -.. _whatsnew314-tail-call: - -A new type of interpreter -------------------------- - -A new type of interpreter has been added to CPython. -It uses tail calls between small C functions that implement individual -Python opcodes, rather than one large C case statement. -For certain newer compilers, this interpreter provides -significantly better performance. Preliminary numbers on our machines suggest -anywhere up to 30% faster Python code, and a geometric mean of 3-5% -faster on ``pyperformance`` depending on platform and architecture. The -baseline is Python 3.14 built with Clang 19 without this new interpreter. - -This interpreter currently only works with Clang 19 and newer -on x86-64 and AArch64 architectures. However, we expect -that a future release of GCC will support this as well. - -This feature is opt-in for now. We highly recommend enabling profile-guided -optimization with the new interpreter as it is the only configuration we have -tested and can validate its improved performance. -For further information on how to build Python, see -:option:`--with-tail-call-interp`. - -.. note:: - - This is not to be confused with `tail call optimization`__ of Python - functions, which is currently not implemented in CPython. - - This new interpreter type is an internal implementation detail of the CPython - interpreter. It doesn't change the visible behavior of Python programs at - all. It can improve their performance, but doesn't change anything else. - - __ https://en.wikipedia.org/wiki/Tail_call - -.. attention:: - - This section previously reported a 9-15% geometric mean speedup. This number has since been - cautiously revised down to 3-5%. While we expect performance results to be better - than what we report, our estimates are more conservative due to a - `compiler bug `_ found in - Clang/LLVM 19, which causes the normal interpreter to be slower. We were unaware of this bug, - resulting in inaccurate results. We sincerely apologize for - communicating results that were only accurate for LLVM v19.1.x and v20.1.0. In the meantime, - the bug has been fixed in LLVM v20.1.1 and for the upcoming v21.1, but it will remain - unfixed for LLVM v19.1.x and v20.1.0. Thus - any benchmarks with those versions of LLVM may produce inaccurate numbers. - (Thanks to Nelson Elhage for bringing this to light.) - -(Contributed by Ken Jin in :gh:`128563`, with ideas on how to implement this -in CPython by Mark Shannon, Garrett Gu, Haoran Xu, and Josh Haberman.) - -.. _whatsnew314-free-threaded-cpython: - -Free-threaded mode ------------------- - -Free-threaded mode (:pep:`703`), initially added in 3.13, has been significantly improved. -The implementation described in PEP 703 was finished, including C API changes, -and temporary workarounds in the interpreter were replaced with more permanent solutions. -The specializing adaptive interpreter (:pep:`659`) is now enabled in free-threaded mode, -which along with many other optimizations greatly improves its performance. -The performance penalty on single-threaded code in free-threaded mode is now roughly 5-10%, -depending on platform and C compiler used. - -This work was done by many contributors: Sam Gross, Matt Page, Neil Schemenauer, -Thomas Wouters, Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, -Brett Simmers, Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, -Kumar Aditya, Edgar Margffoy, and many others. - -Some of these contributors are employed by Meta, which has continued to provide -significant engineering resources to support this project. - -From 3.14, when compiling extension modules for the free-threaded build of -CPython on Windows, the preprocessor variable ``Py_GIL_DISABLED`` now needs to -be specified by the build backend, as it will no longer be determined -automatically by the C compiler. For a running interpreter, the setting that -was used at compile time can be found using :func:`sysconfig.get_config_var`. - -A new flag has been added, :data:`~sys.flags.context_aware_warnings`. This -flag defaults to true for the free-threaded build and false for the GIL-enabled -build. If the flag is true then the :class:`warnings.catch_warnings` context -manager uses a context variable for warning filters. This makes the context -manager behave predictably when used with multiple threads or asynchronous -tasks. - -A new flag has been added, :data:`~sys.flags.thread_inherit_context`. This flag -defaults to true for the free-threaded build and false for the GIL-enabled -build. If the flag is true then threads created with :class:`threading.Thread` -start with a copy of the :class:`~contextvars.Context()` of the caller of -:meth:`~threading.Thread.start`. Most significantly, this makes the warning -filtering context established by :class:`~warnings.catch_warnings` be -"inherited" by threads (or asyncio tasks) started within that context. It also -affects other modules that use context variables, such as the :mod:`decimal` -context manager. - - -.. _whatsnew314-jit-compiler: - -Binary releases for the experimental just-in-time compiler ----------------------------------------------------------- - -The official macOS and Windows release binaries now include an *experimental* -just-in-time (JIT) compiler. Although it is **not** recommended for production -use, it can be tested by setting :envvar:`PYTHON_JIT=1 ` as an -environment variable. Downstream source builds and redistributors can use the -:option:`--enable-experimental-jit=yes-off` configuration option for similar -behavior. - -The JIT is at an early stage and still in active development. As such, the -typical performance impact of enabling it can range from 10% slower to 20% -faster, depending on workload. To aid in testing and evaluation, a set of -introspection functions has been provided in the :data:`sys._jit` namespace. -:func:`sys._jit.is_available` can be used to determine if the current executable -supports JIT compilation, while :func:`sys._jit.is_enabled` can be used to tell -if JIT compilation has been enabled for the current process. - -Currently, the most significant missing functionality is that native debuggers -and profilers like ``gdb`` and ``perf`` are unable to unwind through JIT frames -(Python debuggers and profilers, like :mod:`pdb` or :mod:`profile`, continue to -work without modification). Free-threaded builds do not support JIT compilation. - -Please report any bugs or major performance regressions that you encounter! -.. seealso:: :pep:`744` +.. _whatsnew314-concurrent-warnings-control: Concurrent safe warnings control -------------------------------- The :class:`warnings.catch_warnings` context manager will now optionally -use a context variable for warning filters. This is enabled by setting +use a context variable for warning filters. This is enabled by setting the :data:`~sys.flags.context_aware_warnings` flag, either with the ``-X`` -command-line option or an environment variable. This gives predictable +command-line option or an environment variable. This gives predictable warnings control when using :class:`~warnings.catch_warnings` combined with multiple threads or asynchronous tasks. The flag defaults to true for the free-threaded build and false for the GIL-enabled build. @@ -1026,30 +803,6 @@ free-threaded build and false for the GIL-enabled build. (Contributed by Neil Schemenauer and Kumar Aditya in :gh:`130010`.) -Platform support -================ - -* :pep:`776`: Emscripten is now an officially supported platform at - :pep:`tier 3 <11#tier-3>`. As a part of this effort, more than 25 bugs in - `Emscripten libc`__ were fixed. Emscripten now includes support - for :mod:`ctypes`, :mod:`termios`, and :mod:`fcntl`, as well as - experimental support for the new :ref:`default interactive shell - `. - - (Contributed by R. Hood Chatham in :gh:`127146`, :gh:`127683`, and :gh:`136931`.) - - __ https://emscripten.org/docs/porting/emscripten-runtime-environment.html - -* iOS and macOS apps can now be configured to redirect ``stdout`` and - ``stderr`` content to the system log. - (Contributed by Russell Keith-Magee in :gh:`127592`.) - -* The iOS testbed is now able to stream test output while the test is running. - The testbed can also be used to run the test suite of projects other than - CPython itself. - (Contributed by Russell Keith-Magee in :gh:`127592`.) - - Other language changes ====================== @@ -1144,6 +897,26 @@ Command line and environment .. _Jython: https://www.jython.org/ +.. _whatsnew314-bracketless-except: + +PEP 758: Allow ``except`` and ``except*`` expressions without brackets +---------------------------------------------------------------------- + +The :keyword:`except` and :keyword:`except* ` expressions +now allow brackets to be omitted when there are multiple exception types +and the ``as`` clause is not used. +For example: + +.. code-block:: python + + try: + connect_to_server() + except TimeoutError, ConnectionRefusedError: + print('The network has ceased to be!') + +(Contributed by Pablo Galindo and Brett Cannon in :pep:`758` and :gh:`131831`.) + + .. _whatsnew314-finally-syntaxwarning: PEP 765: Control flow in :keyword:`finally` blocks @@ -1214,24 +987,24 @@ New modules * :mod:`annotationlib`: For introspecting :term:`annotations `. - See :ref:`PEP 749 ` for more details. + See :ref:`PEP 749 ` for more details. (Contributed by Jelle Zijlstra in :gh:`119180`.) * :mod:`compression` (including :mod:`compression.zstd`): A package for compression-related modules, including a new module to support the Zstandard compression format. - See :ref:`PEP 784 ` for more details. + See :ref:`PEP 784 ` for more details. (Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, Victor Stinner, and Rogdham in :gh:`132983`.) * :mod:`concurrent.interpreters`: Support for multiple interpreters in the standard library. - See :ref:`PEP 734 ` for more details. + See :ref:`PEP 734 ` for more details. (Contributed by Eric Snow in :gh:`134939`.) * :mod:`string.templatelib`: Support for template string literals (t-strings). - See :ref:`PEP 750 ` for more details. + See :ref:`PEP 750 ` for more details. (Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, and Pablo Galindo Salgado in :gh:`132661`.) @@ -1253,8 +1026,6 @@ argparse and subparser names if mistyped by the user. (Contributed by Savannah Ostrowski in :gh:`124456`.) -.. _whatsnew314-color-argparse: - * Enable color for help text, which can be disabled with the optional *color* parameter to :class:`argparse.ArgumentParser`. This can also be controlled by :ref:`environment variables @@ -1339,7 +1110,7 @@ concurrent.futures asynchronously. This is separate from the new :mod:`~concurrent.interpreters` module - introduced by :ref:`PEP 734 `. + introduced by :ref:`PEP 734 `. (Contributed by Eric Snow in :gh:`124548`.) .. _whatsnew314-concurrent-futures-start-method: @@ -1687,8 +1458,6 @@ json See the :ref:`JSON command-line interface ` documentation. (Contributed by Trey Hunner in :gh:`122873`.) -.. _whatsnew314-color-json: - * By default, the output of the :ref:`JSON command-line interface ` is highlighted in color. This can be controlled by :ref:`environment variables @@ -1905,6 +1674,25 @@ pathlib pdb --- +* The :mod:`pdb` module now supports remote attaching to a running Python process + using a new :option:`-p PID ` command-line option: + + .. code-block:: sh + + python -m pdb -p 1234 + + This will connect to the Python process with the given PID and allow you to + debug it interactively. Notice that due to how the Python interpreter works + attaching to a remote process that is blocked in a system call or waiting for + I/O will only work once the next bytecode instruction is executed or when the + process receives a signal. + + This feature uses :ref:`PEP 768 ` + and the new :func:`sys.remote_exec` function to attach to the remote process + and send the PDB commands to it. + + (Contributed by Matt Wozniski and Pablo Galindo in :gh:`131591`.) + * Hardcoded breakpoints (:func:`breakpoint` and :func:`~pdb.set_trace`) now reuse the most recent :class:`~pdb.Pdb` instance that calls :meth:`~pdb.Pdb.set_trace`, instead of creating a new one each time. @@ -2064,7 +1852,7 @@ sys function was deprecated in Python 3.13 but it didn't raise a runtime warning. * Add :func:`sys.remote_exec` to implement the new external debugger interface. - See :ref:`PEP 768 ` for details. + See :ref:`PEP 768 ` for details. (Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic in :gh:`131591`.) @@ -2912,7 +2700,7 @@ CPython bytecode changes opcodes to construct new :class:`~string.templatelib.Interpolation` and :class:`~string.templatelib.Template` instances, respectively. (Contributed by Lysandros Nikolaou and others in :gh:`132661`; - see also :ref:`PEP 750: Template strings `). + see also :ref:`PEP 750: Template strings `). * Remove the :opcode:`!BUILD_CONST_KEY_MAP` opcode. Use :opcode:`BUILD_MAP` instead. @@ -2946,7 +2734,7 @@ Pseudo-instructions * Add the :opcode:`!ANNOTATIONS_PLACEHOLDER` pseudo instruction to support partially executed module-level annotations with - :ref:`deferred evaluation of annotations `. + :ref:`deferred evaluation of annotations `. (Contributed by Jelle Zijlstra in :gh:`130907`.) * Add the :opcode:`!BINARY_OP_EXTEND` pseudo instruction, @@ -2981,6 +2769,39 @@ Pseudo-instructions C API changes ============= +.. _whatsnew314-capi-config: + +Python configuration C API +-------------------------- + +Add a :ref:`PyInitConfig C API ` to configure the Python +initialization without relying on C structures and the ability to make +ABI-compatible changes in the future. + +Complete the :pep:`587` :ref:`PyConfig C API ` by adding +:c:func:`PyInitConfig_AddModule` which can be used to add a built-in extension +module; a feature previously referred to as the "inittab". + +Add :c:func:`PyConfig_Get` and :c:func:`PyConfig_Set` functions to get and set +the current runtime configuration. + +:pep:`587` 'Python Initialization Configuration' unified all the ways +to configure Python's initialization. This PEP also unifies the configuration +of Python's preinitialization and initialization in a single API. +Moreover, this PEP only provides a single choice to embed Python, +instead of having two 'Python' and 'Isolated' choices (PEP 587), +to further simplify the API. + +The lower level PEP 587 PyConfig API remains available for use cases +with an intentionally higher level of coupling to CPython implementation details +(such as emulating the full functionality of CPython's CLI, including its +configuration mechanisms). + +(Contributed by Victor Stinner in :gh:`107954`.) + +.. seealso:: :pep:`741` and :pep:`587` + + New features in the C API ------------------------- @@ -2996,7 +2817,7 @@ New features in the C API * Add functions to manipulate the configuration of the current runtime Python interpreter - (:ref:`PEP 741: Python configuration C API `): + (:ref:`PEP 741: Python configuration C API `): * :c:func:`PyConfig_Get` * :c:func:`PyConfig_GetInt` @@ -3006,7 +2827,7 @@ New features in the C API (Contributed by Victor Stinner in :gh:`107954`.) * Add functions to configure Python initialization - (:ref:`PEP 741: Python configuration C API `): + (:ref:`PEP 741: Python configuration C API `): * :c:func:`Py_InitializeFromInitConfig` * :c:func:`PyInitConfig_AddModule` @@ -3233,9 +3054,25 @@ Deprecated C APIs .. include:: ../deprecations/c-api-pending-removal-in-future.rst +.. _whatsnew314-build-changes: + Build Changes ============= +* :pep:`776`: Emscripten is now an officially supported platform at + :pep:`tier 3 <11#tier-3>`. As a part of this effort, more than 25 bugs in + `Emscripten libc`__ were fixed. Emscripten now includes support + for :mod:`ctypes`, :mod:`termios`, and :mod:`fcntl`, as well as + experimental support for the new :ref:`default interactive shell + `. + (Contributed by R. Hood Chatham in :gh:`127146`, :gh:`127683`, and :gh:`136931`.) + + __ https://emscripten.org/docs/porting/emscripten-runtime-environment.html + +* Official Android binary releases are now provided on python.org__. + + __ https://www.python.org/downloads/android/ + * GNU Autoconf 2.72 is now required to generate :file:`configure`. (Contributed by Erlend Aasland in :gh:`115765`.) @@ -3257,12 +3094,22 @@ Build Changes * The new :file:`configure` option :option:`--with-tail-call-interp` may be used to enable the experimental tail call interpreter. - See :ref:`whatsnew314-tail-call` for further details. + See :ref:`whatsnew314-tail-call-interpreter` for further details. * To disable the new remote debugging support, use the :option:`--without-remote-debug` :file:`configure` option. This may be useful for security reasons. +* iOS and macOS apps can now be configured to redirect ``stdout`` and + ``stderr`` content to the system log. + (Contributed by Russell Keith-Magee in :gh:`127592`.) + +* The iOS testbed is now able to stream test output while the test is running. + The testbed can also be used to run the test suite of projects other than + CPython itself. + (Contributed by Russell Keith-Magee in :gh:`127592`.) + + .. _whatsnew314-build_details: :file:`build-details.json` @@ -3283,6 +3130,7 @@ which can be found by running ``sysconfig.get_path('stdlib')``. :pep:`739` -- ``build-details.json`` 1.0 -- a static description file for Python build details + .. _whatsnew314-no-more-pgp: Discontinuation of PGP signatures @@ -3299,6 +3147,66 @@ This change in release process was specified in :pep:`761`. .. _Sigstore: https://www.sigstore.dev/ +.. _whatsnew314-free-threaded-now-supported: + +Free-threaded Python is officially supported +-------------------------------------------- + +The free-threaded build of Python is now supported and no longer experimental. +This is the start of `phase II `__ where +free-threaded Python is officially supported but still optional. + +The free-threading team are confident that the project is on the right path, +and appreciate the continued dedication from everyone working to make +free-threading ready for broader adoption across the Python community. + +With these recommendations and the acceptance of this PEP, the Python developer +community should broadly advertise that free-threading is a supported +Python build option now and into the future, and that it will not be removed +without a proper deprecation schedule. + +Any decision to transition to `phase III `__, +with free-threading as the default or sole build of Python is still undecided, +and dependent on many factors both within CPython itself and the community. +This decision is for the future. + +.. seealso:: + + :pep:`779` + + `PEP 779's acceptance `__ + + +.. _whatsnew314-jit-compiler: + +Binary releases for the experimental just-in-time compiler +---------------------------------------------------------- + +The official macOS and Windows release binaries now include an *experimental* +just-in-time (JIT) compiler. Although it is **not** recommended for production +use, it can be tested by setting :envvar:`PYTHON_JIT=1 ` as an +environment variable. Downstream source builds and redistributors can use the +:option:`--enable-experimental-jit=yes-off` configuration option for similar +behavior. + +The JIT is at an early stage and still in active development. As such, the +typical performance impact of enabling it can range from 10% slower to 20% +faster, depending on workload. To aid in testing and evaluation, a set of +introspection functions has been provided in the :data:`sys._jit` namespace. +:func:`sys._jit.is_available` can be used to determine if the current executable +supports JIT compilation, while :func:`sys._jit.is_enabled` can be used to tell +if JIT compilation has been enabled for the current process. + +Currently, the most significant missing functionality is that native debuggers +and profilers like ``gdb`` and ``perf`` are unable to unwind through JIT frames +(Python debuggers and profilers, like :mod:`pdb` or :mod:`profile`, continue to +work without modification). Free-threaded builds do not support JIT compilation. + +Please report any bugs or major performance regressions that you encounter! + +.. seealso:: :pep:`744` + + Porting to Python 3.14 ====================== @@ -3345,7 +3253,7 @@ Changes in the Python API (Contributed by Jelle Zijlstra in :gh:`105499`.) * The runtime behavior of annotations has changed in various ways; see - :ref:`above ` for details. While most code that interacts + :ref:`above ` for details. While most code that interacts with annotations should continue to work, some undocumented details may behave differently. @@ -3360,6 +3268,92 @@ Changes in the Python API * On FreeBSD, :data:`sys.platform` no longer contains the major version number. +.. _whatsnew314-porting-annotations: + +Changes in annotations (:pep:`649` and :pep:`749`) +-------------------------------------------------- + +This section contains guidance on changes that may be needed to annotations +or Python code that interacts with or introspects annotations, +due to the changes related to :ref:`deferred evaluation of annotations +`. + +In the majority of cases, working code from older versions of Python +will not require any changes. + + +Implications for annotated code +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you define annotations in your code (for example, for use with a static type +checker), then this change probably does not affect you: you can keep +writing annotations the same way you did with previous versions of Python. + +You will likely be able to remove quoted strings in annotations, which are frequently +used for forward references. Similarly, if you use ``from __future__ import annotations`` +to avoid having to write strings in annotations, you may well be able to +remove that import once you support only Python 3.14 and newer. +However, if you rely on third-party libraries that read annotations, +those libraries may need changes to support unquoted annotations before they +work as expected. + + +Implications for readers of ``__annotations__`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If your code reads the :attr:`~object.__annotations__` attribute on objects, +you may want to make changes in order to support code that relies on +deferred evaluation of annotations. +For example, you may want to use :func:`annotationlib.get_annotations` with +the :attr:`~annotationlib.Format.FORWARDREF` format, +as the :mod:`dataclasses` module now does. + +The external :pypi:`typing_extensions` package provides partial backports +of some of the functionality of the :mod:`annotationlib` module, +such as the :class:`~annotationlib.Format` enum and +the :func:`~annotationlib.get_annotations` function. +These can be used to write cross-version code that takes advantage of +the new behavior in Python 3.14. + + +Related changes +^^^^^^^^^^^^^^^ + +The changes in Python 3.14 are designed to rework how :attr:`!__annotations__` +works at runtime while minimizing breakage to code that contains +annotations in source code and to code that reads :attr:`!__annotations__`. +However, if you rely on undocumented details of the annotation behavior +or on private functions in the standard library, there are many ways in which +your code may not work in Python 3.14. +To safeguard your code against future changes, only use the documented +functionality of the :mod:`annotationlib` module. + +In particular, do not read annotations directly from the namespace dictionary +attribute of type objects. +Use :func:`annotationlib.get_annotate_from_class_namespace` during class +construction and :func:`annotationlib.get_annotations` afterwards. + +In previous releases, it was sometimes possible to access class annotations +from an instance of an annotated class. This behavior was undocumented +and accidental, and will no longer work in Python 3.14. + + +``from __future__ import annotations`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In Python 3.7, :pep:`563` introduced the ``from __future__ import annotations`` +:ref:`future statement `, which turns all annotations into strings. + +However, this statement is now deprecated and it is expected to be removed +in a future version of Python. +This removal will not happen until after Python 3.13 reaches its end of life +in 2029, being the last version of Python without support for deferred +evaluation of annotations. + +In Python 3.14, the behavior of code using ``from __future__ import annotations`` +is unchanged. + + Changes in the C API -------------------- From bb212a1a8bafd9411b2d3d648cf84bcf2d2b1bda Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 5 Oct 2025 22:34:05 +0200 Subject: [PATCH 0970/1674] [3.14] GH-123299: Copyedit 3.14 What's New: Trivia (GH-139618) (#139626) GH-123299: Copyedit 3.14 What's New: Trivia (GH-139618) (cherry picked from commit 46de475af7225e6ef4c3fd08ee9202115a22de10) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 56 ++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 6e1f115d4f0764..9b7be2847ab6dd 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1,8 +1,9 @@ + **************************** What's new in Python 3.14 **************************** -:Editor: Hugo van Kemenade +:Editors: Adam Turner and Hugo van Kemenade .. Rules for maintenance: @@ -45,41 +46,48 @@ when researching a change. This article explains the new features in Python 3.14, compared to 3.13. - +Python 3.14 will be released on 7 October 2025. For full details, see the :ref:`changelog `. .. seealso:: :pep:`745` -- Python 3.14 release schedule -.. note:: - - Prerelease users should be aware that this document is currently in draft - form. It will be updated substantially as Python 3.14 moves towards release, - so it's worth checking back even after reading earlier versions. - -Summary -- release highlights +Summary -- Release highlights ============================= .. This section singles out the most important changes in Python 3.14. Brevity is key. -Python 3.14 will be 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 to the implementation include template strings (:pep:`750`), -deferred evaluation of annotations (:pep:`649`), -and a new type of interpreter that uses tail calls. - -The library changes include the addition of a new :mod:`!annotationlib` module -for introspecting and wrapping annotations (:pep:`749`), -a new :mod:`!compression.zstd` module for Zstandard support (:pep:`784`), -plus syntax highlighting in the REPL, +Python 3.14 will be 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 :ref:`template string literals +`, +:ref:`deferred evaluation of annotations `, +and support for :ref:`subinterpreters ` in +the standard library. + +The library changes include significantly improved capabilities for +:ref:`introspection in asyncio `, +:ref:`support for Zstandard ` via a new +:mod:`compression.zstd` module, syntax highlighting in the REPL, as well as the usual deprecations and removals, and improvements in user-friendliness and correctness. +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.14`_ for guidance on upgrading from +earlier versions of Python. + -------------- .. PEP-sized items next. @@ -100,6 +108,7 @@ Interpreter improvements: * :ref:`A new type of interpreter ` * :ref:`Free-threaded mode improvements ` * :ref:`Improved error messages ` +* :ref:`Incremental garbage collection ` Significant improvements in the standard library: @@ -124,7 +133,8 @@ Release changes: * :pep:`779`: :ref:`Free-threaded Python is officially supported ` -* :pep:`761`: :ref:`Discontinuation of PGP signatures ` +* :pep:`761`: :ref:`PGP signatures have been discontinued for official releases + ` * :ref:`Windows and macOS binary releases now support the experimental just-in-time compiler ` * :ref:`Binary releases for Android are now provided ` @@ -2440,6 +2450,7 @@ asyncio blocking_code() runner.run(operation_two()) + email ----- @@ -2729,6 +2740,7 @@ CPython bytecode changes * Add the :opcode:`POP_ITER` opcode to support 'virtual' iterators. (Contributed by Mark Shannon in :gh:`132554`.) + Pseudo-instructions ------------------- From f77625408023a6356d731bda65dea3384c570fa5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 6 Oct 2025 14:15:06 +0200 Subject: [PATCH 0971/1674] [3.14] gh-137242: Allow Android testbed to take all Python command-line options (GH-138805) (#139637) Co-authored-by: Malcolm Smith --- .github/workflows/build.yml | 2 +- Android/android.py | 75 +++++++++------- .../java/org/python/testbed/PythonSuite.kt | 2 +- .../testbed/app/src/main/c/main_activity.c | 88 +++++++++++++++---- .../java/org/python/testbed/MainActivity.kt | 40 ++++----- .../src/main/python/android_testbed_main.py | 48 ---------- Lib/test/libregrtest/main.py | 28 ++++-- 7 files changed, 153 insertions(+), 130 deletions(-) delete mode 100644 Android/testbed/app/src/main/python/android_testbed_main.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cc79c9175b8caf..b245c3b6d2776a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -393,7 +393,7 @@ jobs: with: persist-credentials: false - name: Build and test - run: ./Android/android.py ci ${{ matrix.arch }}-linux-android + run: ./Android/android.py ci --fast-ci ${{ matrix.arch }}-linux-android build-wasi: name: 'WASI' diff --git a/Android/android.py b/Android/android.py index b810a6bfb3cc42..25bb4ca70b581f 100755 --- a/Android/android.py +++ b/Android/android.py @@ -2,6 +2,7 @@ import asyncio import argparse +import json import os import platform import re @@ -552,27 +553,33 @@ async def gradle_task(context): task_prefix = "connected" env["ANDROID_SERIAL"] = context.connected - if context.command: - mode = "-c" - module = context.command - else: - mode = "-m" - module = context.module or "test" + if context.ci_mode: + context.args[0:0] = [ + # See _add_ci_python_opts in libregrtest/main.py. + "-W", "error", "-bb", "-E", + + # Randomization is disabled because order-dependent failures are + # much less likely to pass on a rerun in single-process mode. + "-m", "test", + f"--{context.ci_mode}-ci", "--single-process", "--no-randomize" + ] + + if not any(arg in context.args for arg in ["-c", "-m"]): + context.args[0:0] = ["-m", "test"] args = [ gradlew, "--console", "plain", f"{task_prefix}DebugAndroidTest", ] + [ - # Build-time properties - f"-Ppython.{name}={value}" - for name, value in [ - ("sitePackages", context.site_packages), ("cwd", context.cwd) - ] if value - ] + [ - # Runtime properties - f"-Pandroid.testInstrumentationRunnerArguments.python{name}={value}" + f"-P{name}={value}" for name, value in [ - ("Mode", mode), ("Module", module), ("Args", join_command(context.args)) - ] if value + ("python.sitePackages", context.site_packages), + ("python.cwd", context.cwd), + ( + "android.testInstrumentationRunnerArguments.pythonArgs", + json.dumps(context.args), + ), + ] + if value ] if context.verbose >= 2: args.append("--info") @@ -740,15 +747,14 @@ def ci(context): else: with TemporaryDirectory(prefix=SCRIPT_NAME) as temp_dir: print("::group::Tests") + # Prove the package is self-contained by using it to run the tests. shutil.unpack_archive(package_path, temp_dir) - - # Randomization is disabled because order-dependent failures are - # much less likely to pass on a rerun in single-process mode. - launcher_args = ["--managed", "maxVersion", "-v"] - test_args = ["--fast-ci", "--single-process", "--no-randomize"] + launcher_args = [ + "--managed", "maxVersion", "-v", f"--{context.ci_mode}-ci" + ] run( - ["./android.py", "test", *launcher_args, "--", *test_args], + ["./android.py", "test", *launcher_args], cwd=temp_dir ) print("::endgroup::") @@ -831,18 +837,11 @@ def add_parser(*args, **kwargs): test.add_argument( "--cwd", metavar="DIR", type=abspath, help="Directory to copy as the app's working directory.") - - mode_group = test.add_mutually_exclusive_group() - mode_group.add_argument( - "-c", dest="command", help="Execute the given Python code.") - mode_group.add_argument( - "-m", dest="module", help="Execute the module with the given name.") - test.epilog = ( - "If neither -c nor -m are passed, the default is '-m test', which will " - "run Python's own test suite.") test.add_argument( - "args", nargs="*", help=f"Arguments to add to sys.argv. " - f"Separate them from {SCRIPT_NAME}'s own arguments with `--`.") + "args", nargs="*", help=f"Python command-line arguments. " + f"Separate them from {SCRIPT_NAME}'s own arguments with `--`. " + f"If neither -c nor -m are included, `-m test` will be prepended, " + f"which will run Python's own test suite.") # Package arguments. for subcommand in [package, ci]: @@ -850,6 +849,16 @@ def add_parser(*args, **kwargs): "-g", action="store_true", default=False, dest="debug", help="Include debug information in package") + # CI arguments + for subcommand in [test, ci]: + group = subcommand.add_mutually_exclusive_group(required=subcommand is ci) + group.add_argument( + "--fast-ci", action="store_const", dest="ci_mode", const="fast", + help="Add test arguments for GitHub Actions") + group.add_argument( + "--slow-ci", action="store_const", dest="ci_mode", const="slow", + help="Add test arguments for buildbots") + return parser.parse_args() 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 index 94be52dd2dc870..e57243566f91dc 100644 --- a/Android/testbed/app/src/androidTest/java/org/python/testbed/PythonSuite.kt +++ b/Android/testbed/app/src/androidTest/java/org/python/testbed/PythonSuite.kt @@ -20,7 +20,7 @@ class PythonSuite { val status = PythonTestRunner( InstrumentationRegistry.getInstrumentation().targetContext ).run( - InstrumentationRegistry.getArguments() + InstrumentationRegistry.getArguments().getString("pythonArgs")!!, ) assertEquals(0, status) } finally { diff --git a/Android/testbed/app/src/main/c/main_activity.c b/Android/testbed/app/src/main/c/main_activity.c index ec7f93a3e5ee13..7f024f0a348b61 100644 --- a/Android/testbed/app/src/main/c/main_activity.c +++ b/Android/testbed/app/src/main/c/main_activity.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -15,6 +16,13 @@ static void throw_runtime_exception(JNIEnv *env, const char *message) { message); } +static void throw_errno(JNIEnv *env, const char *error_prefix) { + char error_message[1024]; + snprintf(error_message, sizeof(error_message), + "%s: %s", error_prefix, strerror(errno)); + throw_runtime_exception(env, error_message); +} + // --- Stdio redirection ------------------------------------------------------ @@ -95,10 +103,7 @@ JNIEXPORT void JNICALL Java_org_python_testbed_PythonTestRunner_redirectStdioToL 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); + throw_errno(env, error_prefix); return; } } @@ -107,13 +112,38 @@ JNIEXPORT void JNICALL Java_org_python_testbed_PythonTestRunner_redirectStdioToL // --- 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 char *init_signals() { + // 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. + sigset_t set; + if (sigemptyset(&set)) { + return "sigemptyset"; + } + if (sigaddset(&set, SIGUSR1)) { + return "sigaddset"; + } + if ((errno = pthread_sigmask(SIG_UNBLOCK, &set, NULL))) { + return "pthread_sigmask"; + } + return NULL; } static void throw_status(JNIEnv *env, PyStatus status) { @@ -121,27 +151,47 @@ static void throw_status(JNIEnv *env, PyStatus status) { } JNIEXPORT int JNICALL Java_org_python_testbed_PythonTestRunner_runPython( - JNIEnv *env, jobject obj, jstring home, jstring runModule + JNIEnv *env, jobject obj, jstring home, jarray args ) { + const char *home_utf8 = (*env)->GetStringUTFChars(env, home, NULL); + char cwd[PATH_MAX]; + snprintf(cwd, sizeof(cwd), "%s/%s", home_utf8, "cwd"); + if (chdir(cwd)) { + throw_errno(env, "chdir"); + return 1; + } + + char *error_prefix; + if ((error_prefix = init_signals())) { + throw_errno(env, error_prefix); + return 1; + } + PyConfig config; PyStatus status; - PyConfig_InitIsolatedConfig(&config); + PyConfig_InitPythonConfig(&config); - status = set_config_string(env, &config, &config.home, home); - if (PyStatus_Exception(status)) { + jsize argc = (*env)->GetArrayLength(env, args); + const char *argv[argc + 1]; + for (int i = 0; i < argc; i++) { + jobject arg = (*env)->GetObjectArrayElement(env, args, i); + argv[i] = (*env)->GetStringUTFChars(env, arg, NULL); + } + argv[argc] = NULL; + + // PyConfig_SetBytesArgv "must be called before other methods, since the + // preinitialization configuration depends on command line arguments" + if (PyStatus_Exception(status = PyConfig_SetBytesArgv(&config, argc, (char**)argv))) { throw_status(env, status); return 1; } - status = set_config_string(env, &config, &config.run_module, runModule); + status = PyConfig_SetBytesString(&config, &config.home, home_utf8); 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); 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 index ef28948486fb52..5727b0fe6c30c0 100644 --- a/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt +++ b/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt @@ -5,6 +5,7 @@ import android.os.* import android.system.Os import android.widget.TextView import androidx.appcompat.app.* +import org.json.JSONArray import java.io.* @@ -15,30 +16,25 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val status = PythonTestRunner(this).run("-m", "test", "-W -uall") + val status = PythonTestRunner(this).run("""["-m", "test", "-W", "-uall"]""") findViewById(R.id.tvHello).text = "Exit status $status" } } class PythonTestRunner(val context: Context) { - fun run(instrumentationArgs: Bundle) = run( - instrumentationArgs.getString("pythonMode")!!, - instrumentationArgs.getString("pythonModule")!!, - instrumentationArgs.getString("pythonArgs") ?: "", - ) - /** Run Python. * - * @param mode Either "-c" or "-m". - * @param module Python statements for "-c" mode, or a module name for - * "-m" mode. - * @param args Arguments to add to sys.argv. Will be parsed by `shlex.split`. + * @param args Python command-line, encoded as JSON. * @return The Python exit status: zero on success, nonzero on failure. */ - fun run(mode: String, module: String, args: String) : Int { - Os.setenv("PYTHON_MODE", mode, true) - Os.setenv("PYTHON_MODULE", module, true) - Os.setenv("PYTHON_ARGS", args, true) + fun run(args: String) : Int { + // We leave argument 0 as an empty string, which is a placeholder for the + // executable name in embedded mode. + val argsJsonArray = JSONArray(args) + val argsStringArray = Array(argsJsonArray.length() + 1) { it -> ""} + for (i in 0..) : Int } diff --git a/Android/testbed/app/src/main/python/android_testbed_main.py b/Android/testbed/app/src/main/python/android_testbed_main.py deleted file mode 100644 index 31b8e5343a8449..00000000000000 --- a/Android/testbed/app/src/main/python/android_testbed_main.py +++ /dev/null @@ -1,48 +0,0 @@ -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]) - -mode = os.environ["PYTHON_MODE"] -module = os.environ["PYTHON_MODULE"] -sys.argv[1:] = shlex.split(os.environ["PYTHON_ARGS"]) - -cwd = f"{sys.prefix}/cwd" -if not os.path.exists(cwd): - # Empty directories are lost in the asset packing/unpacking process. - os.mkdir(cwd) -os.chdir(cwd) - -if mode == "-c": - # In -c mode, sys.path starts with an empty string, which means whatever the current - # working directory is at the moment of each import. - sys.path.insert(0, "") - exec(module, {}) -elif mode == "-m": - sys.path.insert(0, os.getcwd()) - runpy.run_module(module, run_name="__main__", alter_sys=True) -else: - raise ValueError(f"unknown mode: {mode}") diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index a2d01b157ac89b..0fc2548789e2e1 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -646,15 +646,23 @@ def _add_cross_compile_opts(self, regrtest_opts): return (environ, keep_environ) def _add_ci_python_opts(self, python_opts, keep_environ): - # --fast-ci and --slow-ci add options to Python: - # "-u -W default -bb -E" - - # Unbuffered stdout and stderr - if not sys.stdout.write_through: + # --fast-ci and --slow-ci add options to Python. + # + # Some platforms run tests in embedded mode and cannot change options + # after startup, so if this function changes, consider also updating: + # * gradle_task in Android/android.py + + # Unbuffered stdout and stderr. This isn't helpful on Android, because + # it would cause lines to be split into multiple log messages. + if not sys.stdout.write_through and sys.platform != "android": python_opts.append('-u') - # Add warnings filter 'error' - if 'default' not in sys.warnoptions: + # Add warnings filter 'error', unless the user specified a different + # filter. Ignore BytesWarning since it's controlled by '-b' below. + if not [ + opt for opt in sys.warnoptions + if not opt.endswith("::BytesWarning") + ]: python_opts.extend(('-W', 'error')) # Error on bytes/str comparison @@ -673,8 +681,12 @@ def _execute_python(self, cmd, environ): cmd_text = shlex.join(cmd) try: - print(f"+ {cmd_text}", flush=True) + # Android and iOS run tests in embedded mode. To update their + # Python options, see the comment in _add_ci_python_opts. + if not cmd[0]: + raise ValueError("No Python executable is present") + print(f"+ {cmd_text}", flush=True) if hasattr(os, 'execv') and not MS_WINDOWS: os.execv(cmd[0], cmd) # On success, execv() do no return. From ab89ca06faa57f94be7783f00b984b3b73b78721 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Mon, 6 Oct 2025 17:12:43 +0200 Subject: [PATCH 0972/1674] [3.14] gh-139400: Move NEWS item from section "Core and Builtins" to section "Security" (GH-139606) (#139663) --- .../2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Misc/NEWS.d/next/{Core_and_Builtins => Security}/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst (100%) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst b/Misc/NEWS.d/next/Security/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst similarity index 100% rename from Misc/NEWS.d/next/Core_and_Builtins/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst rename to Misc/NEWS.d/next/Security/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst From 57c37a4623237046e28e165cab4de017aa271b9f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 6 Oct 2025 18:04:44 +0200 Subject: [PATCH 0973/1674] [3.14] gh-116488: Mention `dict.get` in the data structures tutorial (GH-139643) (#139655) Co-authored-by: Cycloctane --- Doc/tutorial/datastructures.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index db8a066b369a83..1332c53f39687e 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -512,8 +512,12 @@ dictionary; this is also the way dictionaries are written on output. The main operations on a dictionary are storing a value with some key and extracting the value given the key. It is also possible to delete a key:value pair with ``del``. If you store using a key that is already in use, the old -value associated with that key is forgotten. It is an error to extract a value -using a non-existent key. +value associated with that key is forgotten. + +Extracting a value for a non-existent key by subscripting (``d[key]``) raises a +:exc:`KeyError`. To avoid getting this error when trying to access a possibly +non-existent key, use the :meth:`~dict.get` method instead, which returns +``None`` (or a specified default value) if the key is not in the dictionary. Performing ``list(d)`` on a dictionary returns a list of all the keys used in the dictionary, in insertion order (if you want it sorted, just use @@ -528,6 +532,12 @@ Here is a small example using a dictionary:: {'jack': 4098, 'sape': 4139, 'guido': 4127} >>> tel['jack'] 4098 + >>> tel['irv'] + Traceback (most recent call last): + File "", line 1, in + KeyError: 'irv' + >>> print(tel.get('irv')) + None >>> del tel['sape'] >>> tel['irv'] = 4127 >>> tel From 847474ce5d7087bb5678085893af41c7da386f1c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 6 Oct 2025 23:30:00 +0200 Subject: [PATCH 0974/1674] [3.14] Add warnings filter suggestions to PEP 765 entry in What's New (GH-139658) (#139676) Co-authored-by: Alyssa Coghlan Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 9b7be2847ab6dd..00314cd49a668c 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -937,6 +937,19 @@ The compiler now emits a :exc:`SyntaxWarning` when a :keyword:`return`, leaving a :keyword:`finally` block. This change is specified in :pep:`765`. +In situations where this change is inconvenient (such as those where the +warnings are redundant due to code linting), the :ref:`warning filter +` can be used to turn off all syntax warnings by adding +``ignore::SyntaxWarning`` as a filter. This can be specified in combination +with a filter that converts other warnings to errors (for example, passing +``-Werror -Wignore::SyntaxWarning`` as CLI options, or setting +``PYTHONWARNINGS=error,ignore::SyntaxWarning``). + +Note that applying such a filter at runtime using the :mod:`warnings` module +will only suppress the warning in code that is compiled *after* the filter is +adjusted. Code that is compiled prior to the filter adjustment (for example, +when a module is imported) will still emit the syntax warning. + (Contributed by Irit Katriel in :gh:`130080`.) From 0944953ceea08edfc05ae66187a4552ae3d587f4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 07:01:57 +0200 Subject: [PATCH 0975/1674] [3.14] gh-139573: Update macOS installer to use OpenSSL 3.0.18 (GH-139575) (#139680) gh-139573: Update macOS installer to use OpenSSL 3.0.18 (GH-139575) (cherry picked from commit 23410f0a9e2f691c8cd342cfd05cc3ca5f09c242) Co-authored-by: Zachary Ware --- Mac/BuildScript/build-installer.py | 6 +++--- .../macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 4da6d924848889..29c552f5aa621e 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -246,9 +246,9 @@ def library_recipes(): result.extend([ dict( - name="OpenSSL 3.0.16", - url="https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz", - checksum='57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86', + name="OpenSSL 3.0.18", + url="https://github.com/openssl/openssl/releases/download/openssl-3.0.18/openssl-3.0.18.tar.gz", + checksum='d80c34f5cf902dccf1f1b5df5ebb86d0392e37049e5d73df1b3abae72e4ffe8b', buildrecipe=build_universal_openssl, configure=None, install=None, diff --git a/Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst b/Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst new file mode 100644 index 00000000000000..02a3bfb41ce5ed --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst @@ -0,0 +1 @@ +Updated bundled version of OpenSSL to 3.0.18. From 433b638af6761a934b912d3f4a89939b21cec431 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 07:19:28 +0200 Subject: [PATCH 0976/1674] [3.14] gh-124111: Update macOS installer to use Tcl/Tk 8.6.17. (GH-139682) (#139683) gh-124111: Update macOS installer to use Tcl/Tk 8.6.17. (GH-139682) (cherry picked from commit 6d804e4efb8ed2ebeb9cef9577945c46c0038178) Co-authored-by: Ned Deily --- Mac/BuildScript/build-installer.py | 6 +++--- .../macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 29c552f5aa621e..4fd8d55f35ad57 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -264,10 +264,10 @@ def library_recipes(): tk_patches = ['backport_gh71383_fix.patch', 'tk868_on_10_8_10_9.patch', 'backport_gh110950_fix.patch'] else: - tcl_tk_ver='8.6.16' - tcl_checksum='91cb8fa61771c63c262efb553059b7c7ad6757afa5857af6265e4b0bdc2a14a5' + tcl_tk_ver='8.6.17' + tcl_checksum='a3903371efcce8a405c5c245d029e9f6850258a60fa3761c4d58995610949b31' - tk_checksum='be9f94d3575d4b3099d84bc3c10de8994df2d7aa405208173c709cc404a7e5fe' + tk_checksum='e4982df6f969c08bf9dd858a6891059b4a3f50dc6c87c10abadbbe2fc4838946' tk_patches = [] diff --git a/Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst b/Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst new file mode 100644 index 00000000000000..2787e5d37fa83b --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst @@ -0,0 +1 @@ +Update macOS installer to use Tcl/Tk 8.6.17. From 33f1330bd5a18019336b65bb9ee9c8e7c57c79e1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:56:02 +0200 Subject: [PATCH 0977/1674] [3.14] GH-123299: Announce final release in What's New in Python 3.14 (GH-139631) (#139685) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/whatsnew/3.13.rst | 2 +- Doc/whatsnew/3.14.rst | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index b460b14accc921..4d1187846de6dd 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -60,7 +60,7 @@ 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 +Python 3.13 is a 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 diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 00314cd49a668c..2fd9486798829f 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -46,7 +46,7 @@ when researching a change. This article explains the new features in Python 3.14, compared to 3.13. -Python 3.14 will be released on 7 October 2025. +Python 3.14 was released on 7 October 2025. For full details, see the :ref:`changelog `. .. seealso:: @@ -60,7 +60,7 @@ Summary -- Release highlights .. This section singles out the most important changes in Python 3.14. Brevity is key. -Python 3.14 will be the latest stable release of the Python programming +Python 3.14 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 :ref:`template string literals @@ -3081,7 +3081,7 @@ Deprecated C APIs .. _whatsnew314-build-changes: -Build Changes +Build changes ============= * :pep:`776`: Emscripten is now an officially supported platform at From ebf955df7a89ed0c7968f79faec1de49f61ed7cb Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 7 Oct 2025 12:34:30 +0300 Subject: [PATCH 0978/1674] Python 3.14.0 --- Include/patchlevel.h | 6 +- Lib/pydoc_data/topics.py | 2 +- Misc/NEWS.d/3.14.0.rst | 78 +++++++++++++++++++ ...-09-25-07-33-43.gh-issue-139312.ygE8AC.rst | 1 - ...-09-29-00-01-28.gh-issue-139400.X2T-jO.rst | 4 - ...-08-27-11-14-53.gh-issue-138171.Suz8ob.rst | 3 - ...-08-28-06-22-26.gh-issue-132006.eZQmc6.rst | 2 - ...-09-25-10-31-02.gh-issue-139330.5WWkY0.rst | 3 - ...-10-04-12-18-45.gh-issue-139573.EO9kVB.rst | 1 - ...-10-04-12-29-31.gh-issue-139573.vVpHaP.rst | 1 - ...-10-06-23-56-36.gh-issue-124111.KOlBvs.rst | 1 - README.rst | 4 +- 12 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/3.14.0.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-25-07-33-43.gh-issue-139312.ygE8AC.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-08-27-11-14-53.gh-issue-138171.Suz8ob.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-09-25-10-31-02.gh-issue-139330.5WWkY0.rst delete mode 100644 Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst delete mode 100644 Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst delete mode 100644 Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index d4593663cd29d9..5a90a69b8c2a41 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,11 +20,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 14 #define PY_MICRO_VERSION 0 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.14.0rc3+" +#define PY_VERSION "3.14.0" /*--end constants--*/ diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 9418ca2fe166b8..64f354b4e5c0ff 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Thu Sep 18 09:45:33 2025 +# Autogenerated by Sphinx on Tue Oct 7 12:34:44 2025 # as part of the release process. topics = { diff --git a/Misc/NEWS.d/3.14.0.rst b/Misc/NEWS.d/3.14.0.rst new file mode 100644 index 00000000000000..438905c8fe9a82 --- /dev/null +++ b/Misc/NEWS.d/3.14.0.rst @@ -0,0 +1,78 @@ +.. date: 2025-10-06-23-56-36 +.. gh-issue: 124111 +.. nonce: KOlBvs +.. release date: 2025-10-07 +.. section: macOS + +Update macOS installer to use Tcl/Tk 8.6.17. + +.. + +.. date: 2025-10-04-12-29-31 +.. gh-issue: 139573 +.. nonce: vVpHaP +.. section: macOS + +Updated bundled version of OpenSSL to 3.0.18. + +.. + +.. date: 2025-10-04-12-18-45 +.. gh-issue: 139573 +.. nonce: EO9kVB +.. section: Windows + +Updated bundled version of OpenSSL to 3.0.18. + +.. + +.. date: 2025-09-25-10-31-02 +.. gh-issue: 139330 +.. nonce: 5WWkY0 +.. section: Tools/Demos + +SBOM generation tool didn't cross-check the version and checksum values +against the ``Modules/expat/refresh.sh`` script, leading to the values +becoming out-of-date during routine updates. + +.. + +.. date: 2025-08-28-06-22-26 +.. gh-issue: 132006 +.. nonce: eZQmc6 +.. section: Tools/Demos + +XCframeworks now include privacy manifests to satisfy Apple App Store +submission requirements. + +.. + +.. date: 2025-08-27-11-14-53 +.. gh-issue: 138171 +.. nonce: Suz8ob +.. section: Tools/Demos + +A script for building an iOS XCframework was added. As part of this change, +the top level ``iOS`` folder has been moved to be a subdirectory of the +``Apple`` folder. + +.. + +.. date: 2025-09-29-00-01-28 +.. gh-issue: 139400 +.. nonce: X2T-jO +.. section: Security + +:mod:`xml.parsers.expat`: Make sure that parent Expat parsers are only +garbage-collected once they are no longer referenced by subparsers created +by :meth:`~xml.parsers.expat.xmlparser.ExternalEntityParserCreate`. Patch by +Sebastian Pipping. + +.. + +.. date: 2025-09-25-07-33-43 +.. gh-issue: 139312 +.. nonce: ygE8AC +.. section: Library + +Upgrade bundled libexpat to 2.7.3 diff --git a/Misc/NEWS.d/next/Library/2025-09-25-07-33-43.gh-issue-139312.ygE8AC.rst b/Misc/NEWS.d/next/Library/2025-09-25-07-33-43.gh-issue-139312.ygE8AC.rst deleted file mode 100644 index 5178bda379b3e0..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-25-07-33-43.gh-issue-139312.ygE8AC.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade bundled libexpat to 2.7.3 diff --git a/Misc/NEWS.d/next/Security/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst b/Misc/NEWS.d/next/Security/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst deleted file mode 100644 index a5dea3b5f8147a..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-09-29-00-01-28.gh-issue-139400.X2T-jO.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`xml.parsers.expat`: Make sure that parent Expat parsers are only -garbage-collected once they are no longer referenced by subparsers created -by :meth:`~xml.parsers.expat.xmlparser.ExternalEntityParserCreate`. -Patch by Sebastian Pipping. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-08-27-11-14-53.gh-issue-138171.Suz8ob.rst b/Misc/NEWS.d/next/Tools-Demos/2025-08-27-11-14-53.gh-issue-138171.Suz8ob.rst deleted file mode 100644 index 0a933ec754cdac..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-08-27-11-14-53.gh-issue-138171.Suz8ob.rst +++ /dev/null @@ -1,3 +0,0 @@ -A script for building an iOS XCframework was added. As part of this change, -the top level ``iOS`` folder has been moved to be a subdirectory of the -``Apple`` folder. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst b/Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst deleted file mode 100644 index 8e7910768648a0..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-08-28-06-22-26.gh-issue-132006.eZQmc6.rst +++ /dev/null @@ -1,2 +0,0 @@ -XCframeworks now include privacy manifests to satisfy Apple App Store -submission requirements. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-09-25-10-31-02.gh-issue-139330.5WWkY0.rst b/Misc/NEWS.d/next/Tools-Demos/2025-09-25-10-31-02.gh-issue-139330.5WWkY0.rst deleted file mode 100644 index 77e74bafaecfa9..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-09-25-10-31-02.gh-issue-139330.5WWkY0.rst +++ /dev/null @@ -1,3 +0,0 @@ -SBOM generation tool didn't cross-check the version and checksum values -against the ``Modules/expat/refresh.sh`` script, leading to the values -becoming out-of-date during routine updates. diff --git a/Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst b/Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst deleted file mode 100644 index 02a3bfb41ce5ed..00000000000000 --- a/Misc/NEWS.d/next/Windows/2025-10-04-12-18-45.gh-issue-139573.EO9kVB.rst +++ /dev/null @@ -1 +0,0 @@ -Updated bundled version of OpenSSL to 3.0.18. diff --git a/Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst b/Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst deleted file mode 100644 index 02a3bfb41ce5ed..00000000000000 --- a/Misc/NEWS.d/next/macOS/2025-10-04-12-29-31.gh-issue-139573.vVpHaP.rst +++ /dev/null @@ -1 +0,0 @@ -Updated bundled version of OpenSSL to 3.0.18. diff --git a/Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst b/Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst deleted file mode 100644 index 2787e5d37fa83b..00000000000000 --- a/Misc/NEWS.d/next/macOS/2025-10-06-23-56-36.gh-issue-124111.KOlBvs.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use Tcl/Tk 8.6.17. diff --git a/README.rst b/README.rst index f60fb1bc041a74..a0266f08ae72c2 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.14.0 release candidate 3 -================================================= +This is Python version 3.14.0 +============================= .. image:: https://github.com/python/cpython/actions/workflows/build.yml/badge.svg?branch=main&event=push :alt: CPython build status on GitHub Actions From 43198842562e6755ebbec5d3ee3e33aa0e90e9ab Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:15:20 +0300 Subject: [PATCH 0979/1674] Post 3.14.0 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 5a90a69b8c2a41..35838175df0fce 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -24,7 +24,7 @@ #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.14.0" +#define PY_VERSION "3.14.0+" /*--end constants--*/ From 6ed9be1a553e1b6d63410348549fb033f6220d88 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 7 Oct 2025 18:41:45 +0200 Subject: [PATCH 0980/1674] [3.14] gh-137058: Sync _Py_NULL macro with the main branch (#137409) gh-137058: Sync _Py_NULL macro with the main branch * use __STDC_VERSION__ >= 202311L instead of __STDC_VERSION__ > 201710L. * Check for _MSC_VER. --- Include/pyport.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index 3eac119bf8e8d8..44894419f6231d 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -49,8 +49,9 @@ // Static inline functions should use _Py_NULL rather than using directly NULL // 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) +#if !defined(_MSC_VER) && \ + ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) \ + || (defined(__cplusplus) && __cplusplus >= 201103)) # define _Py_NULL nullptr #else # define _Py_NULL NULL From 0accda746823e4baa30b1cf10d25317a70e556c0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:42:50 +0200 Subject: [PATCH 0981/1674] [3.14] gh-138756: Fix memory leak in PyInitConfig_Free() (GH-138759) (#138785) gh-138756: Fix memory leak in PyInitConfig_Free() (GH-138759) Clear also memory of PyConfig members. (cherry picked from commit 96dee64c73531325daa9e048b3c18212f5eadd98) Co-authored-by: Victor Stinner --- Python/initconfig.c | 60 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/Python/initconfig.c b/Python/initconfig.c index 62bcb727d1b9bf..a7e0fcb42f6b33 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -239,9 +239,11 @@ static const PyConfigSpec PYPRECONFIG_SPEC[] = { // Forward declarations -static PyObject* -config_get(const PyConfig *config, const PyConfigSpec *spec, - int use_sys); +static PyObject* config_get(const PyConfig *config, const PyConfigSpec *spec, + int use_sys); +static void initconfig_free_wstr(wchar_t *member); +static void initconfig_free_wstr_list(PyWideStringList *list); +static void initconfig_free_config(const PyConfig *config); /* --- Command line options --------------------------------------- */ @@ -3725,6 +3727,8 @@ PyInitConfig_Free(PyInitConfig *config) if (config == NULL) { return; } + + initconfig_free_config(&config->config); free(config->err_msg); free(config); } @@ -4093,13 +4097,51 @@ PyInitConfig_SetStr(PyInitConfig *config, const char *name, const char* value) } +static void +initconfig_free_wstr(wchar_t *member) +{ + if (member) { + free(member); + } +} + + +static void +initconfig_free_wstr_list(PyWideStringList *list) +{ + for (Py_ssize_t i = 0; i < list->length; i++) { + free(list->items[i]); + } + free(list->items); +} + + +static void +initconfig_free_config(const PyConfig *config) +{ + const PyConfigSpec *spec = PYCONFIG_SPEC; + for (; spec->name != NULL; spec++) { + void *member = config_get_spec_member(config, spec); + if (spec->type == PyConfig_MEMBER_WSTR + || spec->type == PyConfig_MEMBER_WSTR_OPT) + { + wchar_t *wstr = *(wchar_t **)member; + initconfig_free_wstr(wstr); + } + else if (spec->type == PyConfig_MEMBER_WSTR_LIST) { + initconfig_free_wstr_list(member); + } + } +} + + static int -_PyWideStringList_FromUTF8(PyInitConfig *config, PyWideStringList *list, - Py_ssize_t length, char * const *items) +initconfig_set_str_list(PyInitConfig *config, PyWideStringList *list, + Py_ssize_t length, char * const *items) { PyWideStringList wlist = _PyWideStringList_INIT; size_t size = sizeof(wchar_t*) * length; - wlist.items = (wchar_t **)PyMem_RawMalloc(size); + wlist.items = (wchar_t **)malloc(size); if (wlist.items == NULL) { config->status = _PyStatus_NO_MEMORY(); return -1; @@ -4108,14 +4150,14 @@ _PyWideStringList_FromUTF8(PyInitConfig *config, PyWideStringList *list, for (Py_ssize_t i = 0; i < length; i++) { wchar_t *arg = utf8_to_wstr(config, items[i]); if (arg == NULL) { - _PyWideStringList_Clear(&wlist); + initconfig_free_wstr_list(&wlist); return -1; } wlist.items[i] = arg; wlist.length++; } - _PyWideStringList_Clear(list); + initconfig_free_wstr_list(list); *list = wlist; return 0; } @@ -4136,7 +4178,7 @@ PyInitConfig_SetStrList(PyInitConfig *config, const char *name, return -1; } PyWideStringList *list = raw_member; - if (_PyWideStringList_FromUTF8(config, list, length, items) < 0) { + if (initconfig_set_str_list(config, list, length, items) < 0) { return -1; } From ddd12644698794ed9cdb9c15d3684cf1811f3409 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:55:33 +0200 Subject: [PATCH 0982/1674] [3.14] gh-82916: Don't fail when importing from / with sys.pycache_prefix set (GH-30456) (GH-137906) (cherry picked from commit d8a9466e29f59f81aacf1959b835862bcd47b731) Co-authored-by: Petr Viktorin Co-authored-by: Serhiy Storchaka --- Lib/importlib/_bootstrap_external.py | 3 ++- Lib/test/test_importlib/test_util.py | 12 ++++++++++++ .../Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 8bcd741c446bd2..8a1437a2cc5d1e 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -297,7 +297,8 @@ def cache_from_source(path, debug_override=None, *, optimization=None): # Strip initial drive from a Windows path. We know we have an absolute # path here, so the second part of the check rules out a POSIX path that # happens to contain a colon at the second character. - if head[1] == ':' and head[0] not in path_separators: + # Slicing avoids issues with an empty (or short) `head`. + if head[1:2] == ':' and head[0:1] not in path_separators: head = head[2:] # Strip initial path separator from `head` to complete the conversion diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index 55dae82d0e4a43..f280433f91e868 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -580,6 +580,18 @@ def test_cache_from_source_respects_pycache_prefix_relative(self): self.util.cache_from_source(path, optimization=''), os.path.normpath(expect)) + @unittest.skipIf(sys.implementation.cache_tag is None, + 'requires sys.implementation.cache_tag to not be None') + def test_cache_from_source_in_root_with_pycache_prefix(self): + # Regression test for gh-82916 + pycache_prefix = os.path.join(os.path.sep, 'tmp', 'bytecode') + path = 'qux.py' + expect = os.path.join(os.path.sep, 'tmp', 'bytecode', + f'qux.{self.tag}.pyc') + with util.temporary_pycache_prefix(pycache_prefix): + with os_helper.change_cwd('/'): + self.assertEqual(self.util.cache_from_source(path), expect) + @unittest.skipIf(sys.implementation.cache_tag is None, 'requires sys.implementation.cache_tag to not be None') def test_source_from_cache_inside_pycache_prefix(self): diff --git a/Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst b/Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst new file mode 100644 index 00000000000000..7f4ea04284e10b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst @@ -0,0 +1,2 @@ +Fix failure when importing a module from the root directory on unix-like +platforms with sys.pycache_prefix set. From 9e091dbf0224852872a9c546c1f829350aafa418 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:11:20 +0200 Subject: [PATCH 0983/1674] [3.14] gh-138756: Fix leak of inittab memory in PyInitConfig_Free() (GH-138792) (#139703) gh-138756: Fix leak of inittab memory in PyInitConfig_Free() (GH-138792) (cherry picked from commit 3d521a62e7c377ac518c9f0326a88be204f0e3aa) Co-authored-by: Victor Stinner --- Python/initconfig.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/initconfig.c b/Python/initconfig.c index a7e0fcb42f6b33..bdd223213f5dd6 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -3729,6 +3729,7 @@ PyInitConfig_Free(PyInitConfig *config) } initconfig_free_config(&config->config); + PyMem_RawFree(config->inittab); free(config->err_msg); free(config); } From a69bdab5410b27c9983adbdae69645897c2fa550 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:29:37 +0200 Subject: [PATCH 0984/1674] [3.14] gh-123828: Fix data race in `_interpchannels._waiting_release` (GH-124107) (GH-139517) gh-123828: Fix data race in `_interpchannels._waiting_release` (GH-124107) (cherry picked from commit f39dea3baeb9f9b7a0199d06508d722494db0145) Co-authored-by: Nadeshiko Manju --- Lib/test/test__interpchannels.py | 3 +-- Modules/_interpchannelsmodule.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/test/test__interpchannels.py b/Lib/test/test__interpchannels.py index 858d31a73cf4f4..d7cf77368ef9f2 100644 --- a/Lib/test/test__interpchannels.py +++ b/Lib/test/test__interpchannels.py @@ -6,7 +6,7 @@ import time import unittest -from test.support import import_helper, skip_if_sanitizer +from test.support import import_helper _channels = import_helper.import_module('_interpchannels') from concurrent.interpreters import _crossinterp @@ -365,7 +365,6 @@ def test_shareable(self): #self.assertIsNot(got, obj) -@skip_if_sanitizer('gh-129824: race on _waiting_release', thread=True) class ChannelTests(TestBase): def test_create_cid(self): diff --git a/Modules/_interpchannelsmodule.c b/Modules/_interpchannelsmodule.c index 9c1f8615161275..274bfacfed874b 100644 --- a/Modules/_interpchannelsmodule.c +++ b/Modules/_interpchannelsmodule.c @@ -511,12 +511,12 @@ _waiting_release(_waiting_t *waiting, int received) assert(!waiting->received); waiting->status = WAITING_RELEASING; - PyThread_release_lock(waiting->mutex); if (waiting->received != received) { assert(received == 1); waiting->received = received; } waiting->status = WAITING_RELEASED; + PyThread_release_lock(waiting->mutex); } static void From 08bea299bfd4377611df42e4e42414ffacea4f7f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:30:23 +0200 Subject: [PATCH 0985/1674] [3.14] gh-112729: Correctly fail when the process is out of memory during interpreter creation (GH-139164) (GH-139168) gh-112729: Correctly fail when the process is out of memory during interpreter creation (GH-139164) (cherry picked from commit d06113c7a7cac76a28847702685e601b79f71bf8) Co-authored-by: Peter Bierma --- Lib/test/test_interpreters/test_stress.py | 9 +++++++++ ...2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst | 2 ++ Python/pylifecycle.c | 15 +++++++-------- 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst diff --git a/Lib/test/test_interpreters/test_stress.py b/Lib/test/test_interpreters/test_stress.py index e25e67a0d4f445..6b40a536bd3c31 100644 --- a/Lib/test/test_interpreters/test_stress.py +++ b/Lib/test/test_interpreters/test_stress.py @@ -7,6 +7,7 @@ # Raise SkipTest if subinterpreters not supported. import_helper.import_module('_interpreters') from concurrent import interpreters +from concurrent.interpreters import InterpreterError from .utils import TestBase @@ -74,6 +75,14 @@ def run(): start.set() support.gc_collect() + def test_create_interpreter_no_memory(self): + import _interpreters + _testcapi = import_helper.import_module("_testcapi") + + with self.assertRaises(InterpreterError): + _testcapi.set_nomemory(0, 1) + _interpreters.create() + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. diff --git a/Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst b/Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst new file mode 100644 index 00000000000000..950853a696f315 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst @@ -0,0 +1,2 @@ +Fix crash when calling :func:`concurrent.interpreters.create` when the +process is out of memory. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 352787c64958b2..bf2f243914b840 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2298,18 +2298,17 @@ new_interpreter(PyThreadState **tstate_p, interpreters: disable PyGILState_Check(). */ runtime->gilstate.check_enabled = 0; - PyInterpreterState *interp = PyInterpreterState_New(); + // XXX Might new_interpreter() have been called without the GIL held? + PyThreadState *save_tstate = _PyThreadState_GET(); + PyThreadState *tstate = NULL; + PyInterpreterState *interp; + status = _PyInterpreterState_New(save_tstate, &interp); if (interp == NULL) { - *tstate_p = NULL; - return _PyStatus_OK(); + goto error; } _PyInterpreterState_SetWhence(interp, whence); interp->_ready = 1; - // XXX Might new_interpreter() have been called without the GIL held? - PyThreadState *save_tstate = _PyThreadState_GET(); - PyThreadState *tstate = NULL; - /* From this point until the init_interp_create_gil() call, we must not do anything that requires that the GIL be held (or otherwise exist). That applies whether or not the new @@ -2385,7 +2384,7 @@ new_interpreter(PyThreadState **tstate_p, *tstate_p = NULL; if (tstate != NULL) { Py_EndInterpreter(tstate); - } else { + } else if (interp != NULL) { PyInterpreterState_Delete(interp); } if (save_tstate != NULL) { From cec4ddf23e5020df726164fa7b5cb335fcaa1a06 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:30:38 +0200 Subject: [PATCH 0986/1674] [3.14] gh-128639: Don't assume one thread in subinterpreter finalization with fixed daemon thread support (GH-134606) (GH-139050) gh-128639: Don't assume one thread in subinterpreter finalization with fixed daemon thread support (GH-134606) This reapplies GH-128640. (cherry picked from commit a64881363b836b95fb4512a5689d69c1aa07ecb8) Co-authored-by: Peter Bierma --- Lib/test/test_interpreters/test_api.py | 70 ++++++++++++++++++- Lib/test/test_interpreters/test_lifecycle.py | 6 +- Lib/test/test_threading.py | 5 +- ...-01-08-12-52-47.gh-issue-128640.9nbh9z.rst | 1 + Programs/_testembed.c | 9 ++- Python/pylifecycle.c | 62 ++++++++-------- 6 files changed, 114 insertions(+), 39 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index 289e607ad3fad3..3fee98ea93e637 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -11,6 +11,7 @@ from test.support import os_helper from test.support import script_helper from test.support import import_helper +from test.support.script_helper import assert_python_ok # Raise SkipTest if subinterpreters not supported. _interpreters = import_helper.import_module('_interpreters') from concurrent import interpreters @@ -707,6 +708,68 @@ def test_created_with_capi(self): self.interp_exists(interpid)) + def test_remaining_threads(self): + r_interp, w_interp = self.pipe() + + FINISHED = b'F' + + # It's unlikely, but technically speaking, it's possible + # that the thread could've finished before interp.close() is + # reached, so this test might not properly exercise the case. + # However, it's quite unlikely and probably not worth bothering about. + interp = interpreters.create() + interp.exec(f"""if True: + import os + import threading + import time + + def task(): + time.sleep(1) + os.write({w_interp}, {FINISHED!r}) + + threads = (threading.Thread(target=task) for _ in range(3)) + for t in threads: + t.start() + """) + interp.close() + + self.assertEqual(os.read(r_interp, 1), FINISHED) + + def test_remaining_daemon_threads(self): + # Daemon threads leak reference by nature, because they hang threads + # without allowing them to do cleanup (i.e., release refs). + # To prevent that from messing up the refleak hunter and whatnot, we + # run this in a subprocess. + code = '''if True: + import _interpreters + import types + interp = _interpreters.create( + types.SimpleNamespace( + use_main_obmalloc=False, + allow_fork=False, + allow_exec=False, + allow_threads=True, + allow_daemon_threads=True, + check_multi_interp_extensions=True, + gil='own', + ) + ) + _interpreters.exec(interp, f"""if True: + import threading + import time + + def task(): + time.sleep(3) + + threads = (threading.Thread(target=task, daemon=True) for _ in range(3)) + for t in threads: + t.start() + """) + _interpreters.destroy(interp) + ''' + assert_python_ok('-c', code) + + class TestInterpreterPrepareMain(TestBase): def test_empty(self): @@ -815,7 +878,10 @@ def script(): spam.eggs() interp = interpreters.create() - interp.exec(script) + try: + interp.exec(script) + finally: + interp.close() """) stdout, stderr = self.assert_python_failure(scriptfile) @@ -824,7 +890,7 @@ def script(): # File "{interpreters.__file__}", line 179, in exec self.assertEqual(stderr, dedent(f"""\ Traceback (most recent call last): - File "{scriptfile}", line 9, in + File "{scriptfile}", line 10, in interp.exec(script) ~~~~~~~~~~~^^^^^^^^ {interpmod_line.strip()} diff --git a/Lib/test/test_interpreters/test_lifecycle.py b/Lib/test/test_interpreters/test_lifecycle.py index 15537ac6cc8f82..39c1441b67c133 100644 --- a/Lib/test/test_interpreters/test_lifecycle.py +++ b/Lib/test/test_interpreters/test_lifecycle.py @@ -132,6 +132,7 @@ def test_sys_path_0(self): 'sub': sys.path[0], }}, indent=4), flush=True) """) + interp.close() ''' # / # pkg/ @@ -172,7 +173,10 @@ def test_gh_109793(self): argv = [sys.executable, '-c', '''if True: from concurrent import interpreters interp = interpreters.create() - raise Exception + try: + raise Exception + finally: + interp.close() '''] proc = subprocess.run(argv, capture_output=True, text=True) self.assertIn('Traceback', proc.stderr) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index e468fcd7601c15..b8d310e4c99ff8 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1718,10 +1718,7 @@ def f(): _testcapi.run_in_subinterp(%r) """ % (subinterp_code,) - with test.support.SuppressCrashReport(): - rc, out, err = assert_python_failure("-c", script) - self.assertIn("Fatal Python error: Py_EndInterpreter: " - "not the last thread", err.decode()) + assert_python_ok("-c", script) def _check_allowed(self, before_start='', *, allowed=True, diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst new file mode 100644 index 00000000000000..040c6d56c47244 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst @@ -0,0 +1 @@ +Fix a crash when using threads inside of a subinterpreter. diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 93625713b33064..41cc5b145344ae 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1434,9 +1434,12 @@ static int test_audit_subinterpreter(void) PySys_AddAuditHook(_audit_subinterpreter_hook, NULL); _testembed_Py_InitializeFromConfig(); - Py_NewInterpreter(); - Py_NewInterpreter(); - Py_NewInterpreter(); + PyThreadState *tstate = PyThreadState_Get(); + for (int i = 0; i < 3; ++i) + { + Py_EndInterpreter(Py_NewInterpreter()); + PyThreadState_Swap(tstate); + } Py_Finalize(); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index bf2f243914b840..8d1e48aa8ad8ad 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1999,6 +1999,7 @@ resolve_final_tstate(_PyRuntimeState *runtime) } else { /* Fall back to the current tstate. It's better than nothing. */ + // XXX No it's not main_tstate = tstate; } } @@ -2044,6 +2045,16 @@ _Py_Finalize(_PyRuntimeState *runtime) _PyAtExit_Call(tstate->interp); + /* Clean up any lingering subinterpreters. + + Two preconditions need to be met here: + + - This has to happen before _PyRuntimeState_SetFinalizing is + called, or else threads might get prematurely blocked. + - The world must not be stopped, as finalizers can run. + */ + finalize_subinterpreters(); + assert(_PyThreadState_GET() == tstate); /* Copy the core config, PyInterpreterState_Delete() free @@ -2131,9 +2142,6 @@ _Py_Finalize(_PyRuntimeState *runtime) _PyImport_FiniExternal(tstate->interp); finalize_modules(tstate); - /* Clean up any lingering subinterpreters. */ - finalize_subinterpreters(); - /* Print debug stats if any */ _PyEval_Fini(); @@ -2414,9 +2422,8 @@ Py_NewInterpreter(void) return tstate; } -/* Delete an interpreter and its last thread. This requires that the - given thread state is current, that the thread has no remaining - frames, and that it is its interpreter's only remaining thread. +/* Delete an interpreter. This requires that the given thread state + is current, and that the thread has no remaining frames. It is a fatal error to violate these constraints. (Py_FinalizeEx() doesn't have these constraints -- it zaps @@ -2446,15 +2453,20 @@ Py_EndInterpreter(PyThreadState *tstate) _Py_FinishPendingCalls(tstate); _PyAtExit_Call(tstate->interp); - - if (tstate != interp->threads.head || tstate->next != NULL) { - Py_FatalError("not the last thread"); - } - + _PyRuntimeState *runtime = interp->runtime; + _PyEval_StopTheWorldAll(runtime); /* Remaining daemon threads will automatically exit when they attempt to take the GIL (ex: PyEval_RestoreThread()). */ _PyInterpreterState_SetFinalizing(interp, tstate); + PyThreadState *list = _PyThreadState_RemoveExcept(tstate); + for (PyThreadState *p = list; p != NULL; p = p->next) { + _PyThreadState_SetShuttingDown(p); + } + + _PyEval_StartTheWorldAll(runtime); + _PyThreadState_DeleteList(list, /*is_after_fork=*/0); + // XXX Call something like _PyImport_Disable() here? _PyImport_FiniExternal(tstate->interp); @@ -2484,6 +2496,8 @@ finalize_subinterpreters(void) PyInterpreterState *main_interp = _PyInterpreterState_Main(); assert(final_tstate->interp == main_interp); _PyRuntimeState *runtime = main_interp->runtime; + assert(!runtime->stoptheworld.world_stopped); + assert(_PyRuntimeState_GetFinalizing(runtime) == NULL); struct pyinterpreters *interpreters = &runtime->interpreters; /* Get the first interpreter in the list. */ @@ -2512,27 +2526,17 @@ finalize_subinterpreters(void) /* Clean up all remaining subinterpreters. */ while (interp != NULL) { - assert(!_PyInterpreterState_IsRunningMain(interp)); - - /* Find the tstate to use for fini. We assume the interpreter - will have at most one tstate at this point. */ - PyThreadState *tstate = interp->threads.head; - if (tstate != NULL) { - /* Ideally we would be able to use tstate as-is, and rely - on it being in a ready state: no exception set, not - running anything (tstate->current_frame), matching the - current thread ID (tstate->thread_id). To play it safe, - we always delete it and use a fresh tstate instead. */ - assert(tstate != final_tstate); - _PyThreadState_Attach(tstate); - PyThreadState_Clear(tstate); - _PyThreadState_Detach(tstate); - PyThreadState_Delete(tstate); + /* Make a tstate for finalization. */ + PyThreadState *tstate = _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_FINI); + if (tstate == NULL) { + // XXX Some graceful way to always get a thread state? + Py_FatalError("thread state allocation failed"); } - tstate = _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_FINI); - /* Destroy the subinterpreter. */ + /* Enter the subinterpreter. */ _PyThreadState_Attach(tstate); + + /* Destroy the subinterpreter. */ Py_EndInterpreter(tstate); assert(_PyThreadState_GET() == NULL); From de84d0905033636c70bfd79b741cc26abce6a422 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:35:17 +0200 Subject: [PATCH 0987/1674] [3.14] gh-139516: Fix lambda colon start format spec in f-string in tokenizer (GH-139657) (#139701) gh-139516: Fix lambda colon start format spec in f-string in tokenizer (GH-139657) (cherry picked from commit 539461d9ec8e5322ead638f7be733fd196aa6c79) Co-authored-by: Tomasz Pytel --- Lib/test/test_fstring.py | 7 +++++++ Lib/test/test_tokenize.py | 17 +++++++++++++++++ ...25-10-06-13-15-26.gh-issue-139516.d9Pkur.rst | 1 + Parser/lexer/lexer.c | 2 +- Parser/lexer/state.h | 2 ++ 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 41cefe0e286d50..05d0cbd2445c4c 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1859,6 +1859,13 @@ def __format__(self, format): # Test multiple format specs in same raw f-string self.assertEqual(rf"{UnchangedFormat():\xFF} {UnchangedFormat():\n}", '\\xFF \\n') + def test_gh139516(self): + with temp_cwd(): + script = 'script.py' + with open(script, 'wb') as f: + f.write('''def f(a): pass\nf"{f(a=lambda: 'à'\n)}"'''.encode()) + assert_python_ok(script) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 865e0c5b40ddd3..1e485dfb1e2585 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1216,6 +1216,23 @@ def test_multiline_non_ascii_fstring_with_expr(self): FSTRING_END "\'\'\'" (3, 1) (3, 4) """) + # gh-139516, the '\n' is explicit to ensure no trailing whitespace which would invalidate the test + self.check_tokenize('''f"{f(a=lambda: 'à'\n)}"''', """\ + FSTRING_START \'f"\' (1, 0) (1, 2) + OP '{' (1, 2) (1, 3) + NAME 'f' (1, 3) (1, 4) + OP '(' (1, 4) (1, 5) + NAME 'a' (1, 5) (1, 6) + OP '=' (1, 6) (1, 7) + NAME 'lambda' (1, 7) (1, 13) + OP ':' (1, 13) (1, 14) + STRING "\'à\'" (1, 15) (1, 18) + NL '\\n' (1, 18) (1, 19) + OP ')' (2, 0) (2, 1) + OP '}' (2, 1) (2, 2) + FSTRING_END \'"\' (2, 2) (2, 3) + """) + class GenerateTokensTest(TokenizeTest): def check_tokenize(self, s, expected): # Format the tokens in s in a table format. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst new file mode 100644 index 00000000000000..a709112306025f --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst @@ -0,0 +1 @@ +Fix lambda colon erroneously start format spec in f-string in tokenizer. diff --git a/Parser/lexer/lexer.c b/Parser/lexer/lexer.c index 81363cf8e810fe..a69994e9b3d005 100644 --- a/Parser/lexer/lexer.c +++ b/Parser/lexer/lexer.c @@ -1376,7 +1376,7 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "invalid non-printable character U+%04X", c)); } - if( c == '=' && INSIDE_FSTRING_EXPR(current_tok)) { + if( c == '=' && INSIDE_FSTRING_EXPR_AT_TOP(current_tok)) { current_tok->in_debug = 1; } diff --git a/Parser/lexer/state.h b/Parser/lexer/state.h index 5e8cac7249b21c..877127125a7652 100644 --- a/Parser/lexer/state.h +++ b/Parser/lexer/state.h @@ -9,6 +9,8 @@ #define INSIDE_FSTRING(tok) (tok->tok_mode_stack_index > 0) #define INSIDE_FSTRING_EXPR(tok) (tok->curly_bracket_expr_start_depth >= 0) +#define INSIDE_FSTRING_EXPR_AT_TOP(tok) \ + (tok->curly_bracket_depth - tok->curly_bracket_expr_start_depth == 1) enum decoding_state { STATE_INIT, From 5cd6cfe4cf6770b9424bb23f8c7c661f7a3db7b0 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Tue, 7 Oct 2025 23:06:04 +0530 Subject: [PATCH 0988/1674] [3.14] gh-136234: Fix `SelectorSocketTransport.writelines` to be robust to connection loss (GH-136743) (#138702) --- Lib/asyncio/selector_events.py | 7 +++++++ Lib/test/test_asyncio/test_selector_events.py | 16 ++++++++++++++++ ...025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst | 2 ++ 3 files changed, 25 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index f8744cbb223003..6a949f35a16a67 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -1174,6 +1174,13 @@ def writelines(self, list_of_data): raise RuntimeError('unable to writelines; sendfile is in progress') if not list_of_data: return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + self._buffer.extend([memoryview(data) for data in list_of_data]) self._write_ready() # If the entire buffer couldn't be written, register a write handler diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index 7b6d1bce5e460f..5a7df774e60858 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -854,6 +854,22 @@ def test_writelines_pauses_protocol(self): self.assertTrue(self.sock.send.called) self.assertTrue(self.loop.writers) + def test_writelines_after_connection_lost(self): + # GH-136234 + transport = self.socket_transport() + self.sock.send = mock.Mock() + self.sock.send.side_effect = ConnectionResetError + transport.write(b'data1') # Will fail immediately, causing connection lost + + transport.writelines([b'data2']) + self.assertFalse(transport._buffer) + self.assertFalse(self.loop.writers) + + test_utils.run_briefly(self.loop) # Allow _call_connection_lost to run + transport.writelines([b'data2']) + self.assertFalse(transport._buffer) + self.assertFalse(self.loop.writers) + @unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') def test_write_sendmsg_full(self): data = memoryview(b'data') diff --git a/Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst b/Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst new file mode 100644 index 00000000000000..044a601c9170a1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst @@ -0,0 +1,2 @@ +Fix :meth:`asyncio.WriteTransport.writelines` to be robust to connection +failure, by using the same behavior as :meth:`~asyncio.WriteTransport.write`. From 85dabb9c1592e6b1990d7a8d29c9ec872aaf750e Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Tue, 7 Oct 2025 13:36:56 -0400 Subject: [PATCH 0989/1674] [3.14] gh-137238: Fix data race in `_Py_slot_tp_getattr_hook` (gh-137240) (#137416) Replacing the slot isn't thread-safe if the GIL is disabled. Don't require that the slot has been replaced when specializing. (cherry picked from commit 485b16b4f7b28cefdfb524c2869d473078e349bf) --- Objects/typeobject.c | 3 +++ Python/specialize.c | 9 +-------- Tools/tsan/suppressions_free_threading.txt | 1 - 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ab6ad1fe8b5f91..06b4998507ce9f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -10278,7 +10278,10 @@ _Py_slot_tp_getattr_hook(PyObject *self, PyObject *name) getattr = _PyType_LookupRef(tp, &_Py_ID(__getattr__)); if (getattr == NULL) { /* No __getattr__ hook: use a simpler dispatcher */ +#ifndef Py_GIL_DISABLED + // Replacing the slot is only thread-safe if there is a GIL. tp->tp_getattro = _Py_slot_tp_getattro; +#endif return _Py_slot_tp_getattro(self, name); } /* speed hack: we could use lookup_maybe, but that would resolve the diff --git a/Python/specialize.c b/Python/specialize.c index 545098eb51d422..dd00f1cb6b0024 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -935,8 +935,7 @@ analyze_descriptor_load(PyTypeObject *type, PyObject *name, PyObject **descr, un PyObject *getattr = _PyType_Lookup(type, &_Py_ID(__getattr__)); has_getattr = getattr != NULL; if (has_custom_getattribute) { - if (getattro_slot == _Py_slot_tp_getattro && - !has_getattr && + if (!has_getattr && Py_IS_TYPE(getattribute, &PyFunction_Type)) { *descr = getattribute; *tp_version = ga_version; @@ -1259,12 +1258,6 @@ do_specialize_instance_load_attr(PyObject* owner, _Py_CODEUNIT* instr, PyObject* return -1; case GETATTRIBUTE_IS_PYTHON_FUNCTION: { - #ifndef Py_GIL_DISABLED - // In free-threaded builds it's possible for tp_getattro to change - // after the call to analyze_descriptor. That is fine: the version - // guard will fail. - assert(type->tp_getattro == _Py_slot_tp_getattro); - #endif assert(Py_IS_TYPE(descr, &PyFunction_Type)); _PyLoadMethodCache *lm_cache = (_PyLoadMethodCache *)(instr + 1); if (!function_check_args(descr, 2, LOAD_ATTR)) { diff --git a/Tools/tsan/suppressions_free_threading.txt b/Tools/tsan/suppressions_free_threading.txt index 3230f969436c82..580757ddd75033 100644 --- a/Tools/tsan/suppressions_free_threading.txt +++ b/Tools/tsan/suppressions_free_threading.txt @@ -50,7 +50,6 @@ race:PyObject_Realloc # gh-133467. Some of these could be hard to trigger. race_top:update_one_slot -race_top:_Py_slot_tp_getattr_hook race_top:slot_tp_descr_get race_top:type_set_name race_top:set_tp_bases From 9e13cc28962ce92ea080cb7988d95fff70955d96 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:37:31 +0200 Subject: [PATCH 0990/1674] [3.14] gh-137017: Ensure `Thread.is_alive()` only returns False after the underlying OS thread exits (gh-137315) (gh-138916) (cherry picked from commit aa9ceb17215af21ed6618d6f7ccb5bf57ca57101) Co-authored-by: Abdul Co-authored-by: Sam Gross --- .../Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst | 3 +++ Modules/_threadmodule.c | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst diff --git a/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst b/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst new file mode 100644 index 00000000000000..7c2c013016d72e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst @@ -0,0 +1,3 @@ +Fix :obj:`threading.Thread.is_alive` to remain ``True`` until the underlying OS +thread is fully cleaned up. This avoids false negatives in edge cases +involving thread monitoring or premature :obj:`threading.Thread.is_alive` calls. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 775cd704cda4ed..26d3c0a2266b71 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -690,6 +690,9 @@ PyThreadHandleObject_is_done(PyObject *op, PyObject *Py_UNUSED(dummy)) { PyThreadHandleObject *self = PyThreadHandleObject_CAST(op); if (_PyEvent_IsSet(&self->handle->thread_is_exiting)) { + if (_PyOnceFlag_CallOnce(&self->handle->once, join_thread, self->handle) == -1) { + return NULL; + } Py_RETURN_TRUE; } else { From 6e9845455e0c49792b26732dfadb1e1c5aab8bea Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:38:12 +0200 Subject: [PATCH 0991/1674] [3.14] gh-135329: Use longer timeout in pyrepl test_repl_eio() (GH-139503) (#139506) gh-135329: Use longer timeout in pyrepl test_repl_eio() (GH-139503) Replace hardcoded 5 seconds with support.SHORT_TIMEOUT. Fix the following error on slow CI such as GitHub Action UBSan: test test_pyrepl failed -- Traceback (most recent call last): File "Lib/test/test_pyrepl/test_unix_console.py", line 362, in test_repl_eio _, err = proc.communicate(timeout=5) # sleep for pty to settle ~~~~~~~~~~~~~~~~^^^^^^^^^^^ File "Lib/subprocess.py", line 1219, in communicate stdout, stderr = self._communicate(input, endtime, timeout) ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ File "Lib/subprocess.py", line 2126, in _communicate self._check_timeout(endtime, orig_timeout, stdout, stderr) ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "Lib/subprocess.py", line 1266, in _check_timeout raise TimeoutExpired( ...<2 lines>... stderr=b''.join(stderr_seq) if stderr_seq else None) subprocess.TimeoutExpired: Command '[...]' timed out after 5 seconds (cherry picked from commit c985822d86892cd0a978e6e63945be3c0e59217c) Co-authored-by: Victor Stinner --- Lib/test/test_pyrepl/test_unix_console.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_pyrepl/test_unix_console.py b/Lib/test/test_pyrepl/test_unix_console.py index 3b0d2637dab9cb..6e422806cec47e 100644 --- a/Lib/test/test_pyrepl/test_unix_console.py +++ b/Lib/test/test_pyrepl/test_unix_console.py @@ -6,6 +6,7 @@ import sys import unittest from functools import partial +from test import support from test.support import os_helper, force_not_colorized_test_class from test.support import script_helper @@ -359,7 +360,8 @@ def test_repl_eio(self): self.fail("Child process failed to start properly") os.kill(proc.pid, signal.SIGUSR1) - _, err = proc.communicate(timeout=5) # sleep for pty to settle + # sleep for pty to settle + _, err = proc.communicate(timeout=support.SHORT_TIMEOUT) self.assertEqual( proc.returncode, 1, From 52e88585b0e667b4ba4a8cd4a06228ea969587fe Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:38:30 +0200 Subject: [PATCH 0992/1674] [3.14] gh-137179: Fix flaky test_history_survive_crash test (gh-137180) (gh-137216) Kill the REPL subprocess once it prints the output from the command immediately before the `time.sleep()`. (cherry picked from commit 98d462cf4de82d4ef40b20bd346db1ba7edfa35c) Co-authored-by: Sam Gross --- Lib/test/test_pyrepl/test_pyrepl.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index de10a8a07c8f3f..8c2325b2b669ce 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -51,6 +51,7 @@ def run_repl( cwd: str | None = None, skip: bool = False, timeout: float = SHORT_TIMEOUT, + exit_on_output: str | None = None, ) -> tuple[str, int]: temp_dir = None if cwd is None: @@ -64,6 +65,7 @@ def run_repl( cwd=cwd, skip=skip, timeout=timeout, + exit_on_output=exit_on_output, ) finally: if temp_dir is not None: @@ -78,6 +80,7 @@ def _run_repl( cwd: str, skip: bool, timeout: float, + exit_on_output: str | None, ) -> tuple[str, int]: assert pty master_fd, slave_fd = pty.openpty() @@ -123,6 +126,11 @@ def _run_repl( except OSError: break output.append(data) + if exit_on_output is not None: + output = ["".join(output)] + if exit_on_output in output[0]: + process.kill() + break else: os.close(master_fd) process.kill() @@ -1718,18 +1726,24 @@ def test_history_survive_crash(self): commands = "1\n2\n3\nexit()\n" output, exit_code = self.run_repl(commands, env=env, skip=True) + self.assertEqual(exit_code, 0) - commands = "spam\nimport time\ntime.sleep(1000)\nquit\n" - try: - self.run_repl(commands, env=env, timeout=3) - except AssertionError: - pass + # Run until "0xcafe" is printed (as "51966") and then kill the + # process to simulate a crash. Note that the output also includes + # the echoed input commands. + commands = "spam\nimport time\n0xcafe\ntime.sleep(1000)\nquit\n" + output, exit_code = self.run_repl(commands, env=env, + exit_on_output="51966") + self.assertNotEqual(exit_code, 0) history = pathlib.Path(hfile.name).read_text() self.assertIn("2", history) self.assertIn("exit()", history) self.assertIn("spam", history) self.assertIn("import time", history) + # History is written after each command's output is printed to the + # console, so depending on how quickly the process is killed, + # the last command may or may not be written to the history file. self.assertNotIn("sleep", history) self.assertNotIn("quit", history) From b343009377b632cd07863475e33238b592d984f5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:38:40 +0200 Subject: [PATCH 0993/1674] [3.14] gh-71810: Fix _PyLong_AsByteArray() undefined behavior (GH-138873) (#138883) gh-71810: Fix _PyLong_AsByteArray() undefined behavior (GH-138873) Don't read p[-1] when p is an empty string: when n==0. (cherry picked from commit 8b5ce31c2b44d9bf82e6119e90a52dd530bfd1db) Co-authored-by: Victor Stinner --- Objects/longobject.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c index cc061ffbe6b24e..ec2b8fc4182643 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1143,8 +1143,14 @@ _PyLong_AsByteArray(PyLongObject* v, just above didn't get to ensure there's a sign bit, and the loop below wouldn't add one either. Make sure a sign bit exists. */ - unsigned char msb = *(p - pincr); - int sign_bit_set = msb >= 0x80; + int sign_bit_set; + if (n > 0) { + unsigned char msb = *(p - pincr); + sign_bit_set = msb >= 0x80; + } + else { + sign_bit_set = 0; + } assert(accumbits == 0); if (sign_bit_set == do_twos_comp) return 0; From e4e8c5a3b0f51fd403ee7deaa9187010a52f44e8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:39:06 +0200 Subject: [PATCH 0994/1674] [3.14] gh-139208: Fix regrtest --fast-ci --verbose (GH-139240) (#139260) gh-139208: Fix regrtest --fast-ci --verbose (GH-139240) Don't ignore the --verbose option anymore. (cherry picked from commit dd683f8f341dd0c95ac4f1363d92d141ea5b3842) Co-authored-by: Victor Stinner --- Lib/test/libregrtest/cmdline.py | 6 +++++- Lib/test/test_regrtest.py | 13 +++++++++++-- .../2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst | 2 ++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index b2daeadc7e7278..e7a12e4d0b6d57 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -464,7 +464,11 @@ def _parse_args(args, **kwargs): if ns.python is None: ns.rerun = True ns.print_slow = True - ns.verbose3 = True + if not ns.verbose: + ns.verbose3 = True + else: + # --verbose has the priority over --verbose3 + pass else: ns._add_python_opts = False diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 083516808be30b..220b1ebcd7bc1f 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -448,7 +448,8 @@ def create_regrtest(self, args): return regrtest - def check_ci_mode(self, args, use_resources, *, rerun=True, randomize=True): + def check_ci_mode(self, args, use_resources, + *, rerun=True, randomize=True, output_on_failure=True): regrtest = self.create_regrtest(args) self.assertEqual(regrtest.num_workers, -1) self.assertEqual(regrtest.want_rerun, rerun) @@ -457,7 +458,7 @@ def check_ci_mode(self, args, use_resources, *, rerun=True, randomize=True): self.assertIsInstance(regrtest.random_seed, int) self.assertTrue(regrtest.fail_env_changed) self.assertTrue(regrtest.print_slowest) - self.assertTrue(regrtest.output_on_failure) + self.assertEqual(regrtest.output_on_failure, output_on_failure) self.assertEqual(sorted(regrtest.use_resources), sorted(use_resources)) return regrtest @@ -484,6 +485,14 @@ def test_fast_ci_resource(self): use_resources.remove('network') self.check_ci_mode(args, use_resources) + def test_fast_ci_verbose(self): + args = ['--fast-ci', '--verbose'] + use_resources = sorted(cmdline.ALL_RESOURCES) + use_resources.remove('cpu') + regrtest = self.check_ci_mode(args, use_resources, + output_on_failure=False) + self.assertEqual(regrtest.verbose, True) + def test_slow_ci(self): args = ['--slow-ci'] use_resources = sorted(cmdline.ALL_RESOURCES) diff --git a/Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst b/Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst new file mode 100644 index 00000000000000..b8672ac83e1ead --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst @@ -0,0 +1,2 @@ +Fix regrtest ``--fast-ci --verbose``: don't ignore the ``--verbose`` option +anymore. Patch by Victor Stinner. From 57c8e3eb8ef399415a55d218a892efb36c275b43 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:39:31 +0200 Subject: [PATCH 0995/1674] [3.14] gh-58124: Avoid CP_UTF8 in UnicodeDecodeError (GH-137415) (#137460) gh-58124: Avoid CP_UTF8 in UnicodeDecodeError (GH-137415) Fix name of the Python encoding in Unicode errors of the code page codec: use "cp65000" and "cp65001" instead of "CP_UTF7" and "CP_UTF8" which are not valid Python code names. (cherry picked from commit ce1b747ff68754635b7b12870dfc527184ee3b39) Co-authored-by: Victor Stinner --- Lib/test/test_codecs.py | 2 +- .../2025-08-05-17-22-24.gh-issue-58124.q1__53.rst | 3 +++ Objects/unicodeobject.c | 4 ---- Python/codecs.c | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index d8666f7290e72e..fd7769e8c275d3 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3293,7 +3293,7 @@ def test_code_page_name(self): codecs.code_page_encode, 932, '\xff') self.assertRaisesRegex(UnicodeDecodeError, 'cp932', codecs.code_page_decode, 932, b'\x81\x00', 'strict', True) - self.assertRaisesRegex(UnicodeDecodeError, 'CP_UTF8', + self.assertRaisesRegex(UnicodeDecodeError, 'cp65001', codecs.code_page_decode, self.CP_UTF8, b'\xff', 'strict', True) def check_decode(self, cp, tests): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst new file mode 100644 index 00000000000000..f875d4c5e785c6 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst @@ -0,0 +1,3 @@ +Fix name of the Python encoding in Unicode errors of the code page codec: +use "cp65000" and "cp65001" instead of "CP_UTF7" and "CP_UTF8" which are not +valid Python code names. Patch by Victor Stinner. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index c7f560adb99356..0ff2d71924ff9c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7713,10 +7713,6 @@ code_page_name(UINT code_page, PyObject **obj) *obj = NULL; if (code_page == CP_ACP) return "mbcs"; - if (code_page == CP_UTF7) - return "CP_UTF7"; - if (code_page == CP_UTF8) - return "CP_UTF8"; *obj = PyBytes_FromFormat("cp%u", code_page); if (*obj == NULL) diff --git a/Python/codecs.c b/Python/codecs.c index caf8d9d5f3c188..4e9aecfe75c2c9 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -1204,7 +1204,7 @@ get_standard_encoding_impl(const char *encoding, int *bytelength) } } } - else if (strcmp(encoding, "CP_UTF8") == 0) { + else if (strcmp(encoding, "cp65001") == 0) { *bytelength = 3; return ENC_UTF8; } From 08d8dadfc2ce4e4302d46ee4ff1cefec317c953c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:40:30 +0200 Subject: [PATCH 0996/1674] [3.14] gh-136278: Document codecs.escape_encode() and codecs.escape_decode() (GH-136314) (#137149) gh-136278: Document codecs.escape_encode() and codecs.escape_decode() (GH-136314) Closes GH-136278 (cherry picked from commit 6784ef7da7cbf1a944fd0685630ced54e4a0066c) Co-authored-by: Toshaksha <147024929+Toshaksha@users.noreply.github.com> --- Doc/library/codecs.rst | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 1cb0e225bca043..f96f2f8281f450 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1483,6 +1483,36 @@ to :class:`bytes` mappings. They are not supported by :meth:`bytes.decode` Restoration of the aliases for the binary transforms. +.. _standalone-codec-functions: + +Standalone Codec Functions +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following functions provide encoding and decoding functionality similar to codecs, +but are not available as named codecs through :func:`codecs.encode` or :func:`codecs.decode`. +They are used internally (for example, by :mod:`pickle`) and behave similarly to the +``string_escape`` codec that was removed in Python 3. + +.. function:: codecs.escape_encode(input, errors=None) + + Encode *input* using escape sequences. Similar to how :func:`repr` on bytes + produces escaped byte values. + + *input* must be a :class:`bytes` object. + + Returns a tuple ``(output, length)`` where *output* is a :class:`bytes` + object and *length* is the number of bytes consumed. + +.. function:: codecs.escape_decode(input, errors=None) + + Decode *input* from escape sequences back to the original bytes. + + *input* must be a :term:`bytes-like object`. + + Returns a tuple ``(output, length)`` where *output* is a :class:`bytes` + object and *length* is the number of bytes consumed. + + .. _text-transforms: Text Transforms From 98ca0b3e2b31ae7f5bd7727ce1b7a1d2707eb091 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:41:03 +0200 Subject: [PATCH 0997/1674] [3.14] Fix docs for Queue.shutdown (gh-137028) (#137080) Fix docs for Queue.shutdown (gh-137028) (cherry picked from commit 245671555b7e33112ae1efd0c26071d7a0e27b3a) Co-authored-by: Raymond Hettinger Co-authored-by: Zachary Ware Co-authored-by: Serhiy Storchaka --- Doc/library/asyncio-queue.rst | 35 +++++++++++++++++++--------- Doc/library/queue.rst | 44 ++++++++++++++++++++++++----------- Lib/asyncio/queues.py | 7 ++---- Lib/queue.py | 7 ++---- 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index d99213aa81d53e..963bc1fb82c12f 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -102,17 +102,33 @@ Queue .. method:: shutdown(immediate=False) - Shut down the queue, making :meth:`~Queue.get` and :meth:`~Queue.put` + Put a :class:`Queue` instance into a shutdown mode. + + The queue can no longer grow. + Future calls to :meth:`~Queue.put` raise :exc:`QueueShutDown`. + Currently blocked callers of :meth:`~Queue.put` will be unblocked + and will raise :exc:`QueueShutDown` in the formerly blocked thread. + + If *immediate* is false (the default), the queue can be wound + down normally with :meth:`~Queue.get` calls to extract tasks + that have already been loaded. + + And if :meth:`~Queue.task_done` is called for each remaining task, a + pending :meth:`~Queue.join` will be unblocked normally. + + Once the queue is empty, future calls to :meth:`~Queue.get` will 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. + If *immediate* is true, the queue is terminated immediately. + The queue is drained to be completely empty. All callers of + :meth:`~Queue.join` are unblocked regardless of the number + of unfinished tasks. Blocked callers of :meth:`~Queue.get` + are unblocked and will raise :exc:`QueueShutDown` because the + queue is empty. - 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`. + Use caution when using :meth:`~Queue.join` with *immediate* set + to true. This unblocks the join even when no work has been done + on the tasks, violating the usual invariant for joining a queue. .. versionadded:: 3.13 @@ -129,9 +145,6 @@ 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. diff --git a/Doc/library/queue.rst b/Doc/library/queue.rst index fbbebcf4ed8f92..6dcf06aab00295 100644 --- a/Doc/library/queue.rst +++ b/Doc/library/queue.rst @@ -187,9 +187,6 @@ 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. @@ -204,6 +201,9 @@ fully processed by daemon consumer threads. count of unfinished tasks drops to zero, :meth:`join` unblocks. +Waiting for task completion +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Example of how to wait for enqueued tasks to be completed:: import threading @@ -233,22 +233,38 @@ Example of how to wait for enqueued tasks to be completed:: Terminating queues ^^^^^^^^^^^^^^^^^^ -:class:`Queue` objects can be made to prevent further interaction by shutting -them down. +When no longer needed, :class:`Queue` objects can be wound down +until empty or terminated immediately with a hard shutdown. .. method:: Queue.shutdown(immediate=False) - Shut down the queue, making :meth:`~Queue.get` and :meth:`~Queue.put` raise - :exc:`ShutDown`. + Put a :class:`Queue` instance into a shutdown mode. + + The queue can no longer grow. + Future calls to :meth:`~Queue.put` raise :exc:`ShutDown`. + Currently blocked callers of :meth:`~Queue.put` will be unblocked + and will raise :exc:`ShutDown` in the formerly blocked thread. + + If *immediate* is false (the default), the queue can be wound + down normally with :meth:`~Queue.get` calls to extract tasks + that have already been loaded. + + And if :meth:`~Queue.task_done` is called for each remaining task, a + pending :meth:`~Queue.join` will be unblocked normally. + + Once the queue is empty, future calls to :meth:`~Queue.get` will + 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. + If *immediate* is true, the queue is terminated immediately. + The queue is drained to be completely empty. All callers of + :meth:`~Queue.join` are unblocked regardless of the number + of unfinished tasks. Blocked callers of :meth:`~Queue.get` + are unblocked and will raise :exc:`ShutDown` because the + queue is empty. - 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`. + Use caution when using :meth:`~Queue.join` with *immediate* set + to true. This unblocks the join even when no work has been done + on the tasks, violating the usual invariant for joining a queue. .. versionadded:: 3.13 diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 2f3865114a84f9..e5d6f2e4b61e17 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -227,9 +227,6 @@ def task_done(self): 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. """ @@ -257,8 +254,8 @@ def shutdown(self, immediate=False): '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(). + 'immediate', unblock callers of join() regardless of the + number of unfinished tasks. """ self._is_shutdown = True if immediate: diff --git a/Lib/queue.py b/Lib/queue.py index 25beb46e30d6bd..c90de8edc76c34 100644 --- a/Lib/queue.py +++ b/Lib/queue.py @@ -80,9 +80,6 @@ def task_done(self): have 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 a ValueError if called more times than there were items placed in the queue. ''' @@ -240,8 +237,8 @@ def shutdown(self, immediate=False): '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(). + 'immediate', callers of join() are unblocked regardless of + the number of unfinished tasks. ''' with self.mutex: self.is_shutdown = True From c1cb785ebd0859a3c560091c5bb4f7f559656b44 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:42:46 +0200 Subject: [PATCH 0998/1674] [3.14] gh-126662: naming consistency for `signal.ItimerError` (GH-126712) (#137122) gh-126662: naming consistency for `signal.ItimerError` (GH-126712) (cherry picked from commit d5fa437dfb50e2e47632cdc994e3257608688f30) Co-authored-by: Stephen Morton --- Modules/signalmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 54bcd3270ef31a..c1c3d7c9c05534 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1623,7 +1623,7 @@ signal_module_exec(PyObject *m) modstate->ignore_handler = state->ignore_handler; // borrowed ref #ifdef PYHAVE_ITIMER_ERROR - modstate->itimer_error = PyErr_NewException("signal.itimer_error", + modstate->itimer_error = PyErr_NewException("signal.ItimerError", PyExc_OSError, NULL); if (modstate->itimer_error == NULL) { return -1; From fb699effbfd9b34a1b2f3ee10338f1f4279509bb Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Tue, 7 Oct 2025 13:45:23 -0400 Subject: [PATCH 0999/1674] [3.14] gh-137400: Fix thread-safety issues when profiling all threads (gh-137518) (gh-137730) There were a few thread-safety issues when profiling or tracing all threads via PyEval_SetProfileAllThreads or PyEval_SetTraceAllThreads: * The loop over thread states could crash if a thread exits concurrently (in both the free threading and default build) * The modification of `c_profilefunc` and `c_tracefunc` wasn't thread-safe on the free threading build. (cherry picked from commit a10152f8fd0f4b291e53d646cffe22fbeec73e1e) Co-authored-by: Sam Gross Co-authored-by: Petr Viktorin --- Include/internal/pycore_ceval.h | 2 + Include/internal/pycore_interp_structs.h | 6 +- .../test_free_threading/test_monitoring.py | 57 +++ ...-08-07-09-52-19.gh-issue-137400.AK1dy-.rst | 5 + Python/bytecodes.c | 10 +- Python/ceval.c | 38 +- Python/generated_cases.c.h | 16 +- Python/instrumentation.c | 69 ++- Python/legacy_tracing.c | 440 ++++++++++++------ Python/pystate.c | 17 +- Python/sysmodule.c | 13 +- 11 files changed, 430 insertions(+), 243 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 528154c93348d2..a3d9e7bf87a7ba 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -22,8 +22,10 @@ struct _ceval_runtime_state; // Export for '_lsprof' shared extension PyAPI_FUNC(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); +extern int _PyEval_SetProfileAllThreads(PyInterpreterState *interp, Py_tracefunc func, PyObject *arg); extern int _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); +extern int _PyEval_SetTraceAllThreads(PyInterpreterState *interp, Py_tracefunc func, PyObject *arg); extern int _PyEval_SetOpcodeTrace(PyFrameObject *f, bool enable); diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index 8a29c533b99058..d1f916fa7f727c 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -97,7 +97,7 @@ struct _ceval_runtime_state { // For example, we use a preallocated array // for the list of pending calls. struct _pending_calls pending_mainthread; - PyMutex sys_trace_profile_mutex; + PyMutex unused_sys_trace_profile_mutex; // kept for ABI compatibility }; @@ -946,8 +946,8 @@ struct _is { PyDict_WatchCallback builtins_dict_watcher; _Py_GlobalMonitors monitors; - bool sys_profile_initialized; - bool sys_trace_initialized; + _PyOnceFlag sys_profile_once_flag; + _PyOnceFlag sys_trace_once_flag; Py_ssize_t sys_profiling_threads; /* Count of threads with c_profilefunc set */ Py_ssize_t sys_tracing_threads; /* Count of threads with c_tracefunc set */ PyObject *monitoring_callables[PY_MONITORING_TOOL_IDS][_PY_MONITORING_EVENTS]; diff --git a/Lib/test/test_free_threading/test_monitoring.py b/Lib/test/test_free_threading/test_monitoring.py index 9b9fc19364391f..407bf7cbdee917 100644 --- a/Lib/test/test_free_threading/test_monitoring.py +++ b/Lib/test/test_free_threading/test_monitoring.py @@ -195,6 +195,31 @@ def during_threads(self): @threading_helper.requires_working_threading() +class SetProfileAllThreadsMultiThreaded(InstrumentationMultiThreadedMixin, TestCase): + """Uses threading.setprofile_all_threads and repeatedly toggles instrumentation on and off""" + + def setUp(self): + self.set = False + self.called = False + + def after_test(self): + self.assertTrue(self.called) + + def tearDown(self): + threading.setprofile_all_threads(None) + + def trace_func(self, frame, event, arg): + self.called = True + return self.trace_func + + def during_threads(self): + if self.set: + threading.setprofile_all_threads(self.trace_func) + else: + threading.setprofile_all_threads(None) + self.set = not self.set + + class SetProfileAllMultiThreaded(TestCase): def test_profile_all_threads(self): done = threading.Event() @@ -421,6 +446,38 @@ def noop(): self.observe_threads(noop, buf) + def test_trace_concurrent(self): + # Test calling a function concurrently from a tracing and a non-tracing + # thread + b = threading.Barrier(2) + + def func(): + for _ in range(100): + pass + + def noop(): + pass + + def bg_thread(): + b.wait() + func() # this may instrument `func` + + def tracefunc(frame, event, arg): + # These calls run under tracing can race with the background thread + for _ in range(10): + func() + return tracefunc + + t = Thread(target=bg_thread) + t.start() + try: + sys.settrace(tracefunc) + b.wait() + noop() + finally: + sys.settrace(None) + t.join() + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst new file mode 100644 index 00000000000000..406d6528840ba5 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst @@ -0,0 +1,5 @@ +Fix a crash in the :term:`free threading` build when disabling profiling or +tracing across all threads with :c:func:`PyEval_SetProfileAllThreads` or +:c:func:`PyEval_SetTraceAllThreads` or their Python equivalents +:func:`threading.settrace_all_threads` and +:func:`threading.setprofile_all_threads`. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index b159df156c2632..70f8ac3cff84f9 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -181,7 +181,15 @@ dummy_func( } tier1 op(_MAYBE_INSTRUMENT, (--)) { - if (tstate->tracing == 0) { + #ifdef Py_GIL_DISABLED + // For thread-safety, we need to check instrumentation version + // even when tracing. Otherwise, another thread may concurrently + // re-write the bytecode while we are executing this function. + int check_instrumentation = 1; + #else + int check_instrumentation = (tstate->tracing == 0); + #endif + if (check_instrumentation) { uintptr_t global_version = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & ~_PY_EVAL_EVENTS_MASK; uintptr_t code_version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); if (code_version != global_version) { diff --git a/Python/ceval.c b/Python/ceval.c index e5b1b82e45e14c..a181d1861d0131 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2493,21 +2493,10 @@ PyEval_SetProfile(Py_tracefunc func, PyObject *arg) void PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *arg) { - PyThreadState *this_tstate = _PyThreadState_GET(); - PyInterpreterState* interp = this_tstate->interp; - - _PyRuntimeState *runtime = &_PyRuntime; - HEAD_LOCK(runtime); - PyThreadState* ts = PyInterpreterState_ThreadHead(interp); - HEAD_UNLOCK(runtime); - - while (ts) { - if (_PyEval_SetProfile(ts, func, arg) < 0) { - PyErr_FormatUnraisable("Exception ignored in PyEval_SetProfileAllThreads"); - } - HEAD_LOCK(runtime); - ts = PyThreadState_Next(ts); - HEAD_UNLOCK(runtime); + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (_PyEval_SetProfileAllThreads(interp, func, arg) < 0) { + /* Log _PySys_Audit() error */ + PyErr_FormatUnraisable("Exception ignored in PyEval_SetProfileAllThreads"); } } @@ -2524,21 +2513,10 @@ PyEval_SetTrace(Py_tracefunc func, PyObject *arg) void PyEval_SetTraceAllThreads(Py_tracefunc func, PyObject *arg) { - PyThreadState *this_tstate = _PyThreadState_GET(); - PyInterpreterState* interp = this_tstate->interp; - - _PyRuntimeState *runtime = &_PyRuntime; - HEAD_LOCK(runtime); - PyThreadState* ts = PyInterpreterState_ThreadHead(interp); - HEAD_UNLOCK(runtime); - - while (ts) { - if (_PyEval_SetTrace(ts, func, arg) < 0) { - PyErr_FormatUnraisable("Exception ignored in PyEval_SetTraceAllThreads"); - } - HEAD_LOCK(runtime); - ts = PyThreadState_Next(ts); - HEAD_UNLOCK(runtime); + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (_PyEval_SetTraceAllThreads(interp, func, arg) < 0) { + /* Log _PySys_Audit() error */ + PyErr_FormatUnraisable("Exception ignored in PyEval_SetTraceAllThreads"); } } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 19352a3f00b87b..5d464b06bc1804 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7504,7 +7504,13 @@ } // _MAYBE_INSTRUMENT { - if (tstate->tracing == 0) { + #ifdef Py_GIL_DISABLED + + int check_instrumentation = 1; + #else + int check_instrumentation = (tstate->tracing == 0); + #endif + if (check_instrumentation) { uintptr_t global_version = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & ~_PY_EVAL_EVENTS_MASK; uintptr_t code_version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); if (code_version != global_version) { @@ -10480,7 +10486,13 @@ } // _MAYBE_INSTRUMENT { - if (tstate->tracing == 0) { + #ifdef Py_GIL_DISABLED + + int check_instrumentation = 1; + #else + int check_instrumentation = (tstate->tracing == 0); + #endif + if (check_instrumentation) { uintptr_t global_version = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & ~_PY_EVAL_EVENTS_MASK; uintptr_t code_version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); if (code_version != global_version) { diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 0a816a9c3af154..c0cccadde0c094 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1040,6 +1040,8 @@ set_version_raw(uintptr_t *ptr, uint32_t version) static void set_global_version(PyThreadState *tstate, uint32_t version) { + ASSERT_WORLD_STOPPED(); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); PyInterpreterState *interp = tstate->interp; set_version_raw(&interp->ceval.instrumentation_version, version); @@ -1939,28 +1941,26 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp) static int -instrument_all_executing_code_objects(PyInterpreterState *interp) { +instrument_all_executing_code_objects(PyInterpreterState *interp) +{ ASSERT_WORLD_STOPPED(); - _PyRuntimeState *runtime = &_PyRuntime; - HEAD_LOCK(runtime); - PyThreadState* ts = PyInterpreterState_ThreadHead(interp); - HEAD_UNLOCK(runtime); - while (ts) { + int err = 0; + _Py_FOR_EACH_TSTATE_BEGIN(interp, ts) { _PyInterpreterFrame *frame = ts->current_frame; while (frame) { if (frame->owner < FRAME_OWNED_BY_INTERPRETER) { - if (instrument_lock_held(_PyFrame_GetCode(frame), interp)) { - return -1; + err = instrument_lock_held(_PyFrame_GetCode(frame), interp); + if (err) { + goto done; } } frame = frame->previous; } - HEAD_LOCK(runtime); - ts = PyThreadState_Next(ts); - HEAD_UNLOCK(runtime); } - return 0; +done: + _Py_FOR_EACH_TSTATE_END(interp); + return err; } static void @@ -2006,6 +2006,7 @@ check_tool(PyInterpreterState *interp, int tool_id) int _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events) { + ASSERT_WORLD_STOPPED(); assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); PyThreadState *tstate = _PyThreadState_GET(); PyInterpreterState *interp = tstate->interp; @@ -2014,33 +2015,28 @@ _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events) return -1; } - int res; - _PyEval_StopTheWorld(interp); uint32_t existing_events = get_events(&interp->monitors, tool_id); if (existing_events == events) { - res = 0; - goto done; + return 0; } set_events(&interp->monitors, tool_id, events); uint32_t new_version = global_version(interp) + MONITORING_VERSION_INCREMENT; if (new_version == 0) { PyErr_Format(PyExc_OverflowError, "events set too many times"); - res = -1; - goto done; + return -1; } set_global_version(tstate, new_version); #ifdef _Py_TIER2 _Py_Executors_InvalidateAll(interp, 1); #endif - res = instrument_all_executing_code_objects(interp); -done: - _PyEval_StartTheWorld(interp); - return res; + return instrument_all_executing_code_objects(interp); } int _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet events) { + ASSERT_WORLD_STOPPED(); + assert(0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS); PyInterpreterState *interp = _PyInterpreterState_GET(); assert(events < (1 << _PY_MONITORING_LOCAL_EVENTS)); @@ -2052,11 +2048,8 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent return -1; } - int res; - _PyEval_StopTheWorld(interp); if (allocate_instrumentation_data(code)) { - res = -1; - goto done; + return -1; } code->_co_monitoring->tool_versions[tool_id] = interp->monitoring_tool_versions[tool_id]; @@ -2064,16 +2057,11 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent _Py_LocalMonitors *local = &code->_co_monitoring->local_monitors; uint32_t existing_events = get_local_events(local, tool_id); if (existing_events == events) { - res = 0; - goto done; + return 0; } set_local_events(local, tool_id, events); - res = force_instrument_lock_held(code, interp); - -done: - _PyEval_StartTheWorld(interp); - return res; + return force_instrument_lock_held(code, interp); } int @@ -2105,11 +2093,12 @@ int _PyMonitoring_ClearToolId(int tool_id) } } + _PyEval_StopTheWorld(interp); if (_PyMonitoring_SetEvents(tool_id, 0) < 0) { + _PyEval_StartTheWorld(interp); return -1; } - _PyEval_StopTheWorld(interp); uint32_t version = global_version(interp) + MONITORING_VERSION_INCREMENT; if (version == 0) { PyErr_Format(PyExc_OverflowError, "events set too many times"); @@ -2346,7 +2335,11 @@ monitoring_set_events_impl(PyObject *module, int tool_id, int event_set) event_set &= ~(1 << PY_MONITORING_EVENT_BRANCH); event_set |= (1 << PY_MONITORING_EVENT_BRANCH_RIGHT) | (1 << PY_MONITORING_EVENT_BRANCH_LEFT); } - if (_PyMonitoring_SetEvents(tool_id, event_set)) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyEval_StopTheWorld(interp); + int err = _PyMonitoring_SetEvents(tool_id, event_set); + _PyEval_StartTheWorld(interp); + if (err) { return NULL; } Py_RETURN_NONE; @@ -2427,7 +2420,11 @@ monitoring_set_local_events_impl(PyObject *module, int tool_id, return NULL; } - if (_PyMonitoring_SetLocalEvents((PyCodeObject*)code, tool_id, event_set)) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyEval_StopTheWorld(interp); + int err = _PyMonitoring_SetLocalEvents((PyCodeObject*)code, tool_id, event_set); + _PyEval_StartTheWorld(interp); + if (err) { return NULL; } Py_RETURN_NONE; diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c index af225865c4e2e8..9c72fab298201e 100644 --- a/Python/legacy_tracing.c +++ b/Python/legacy_tracing.c @@ -133,16 +133,10 @@ sys_profile_call_or_return( Py_RETURN_NONE; } -int -_PyEval_SetOpcodeTrace( - PyFrameObject *frame, - bool enable -) { - assert(frame != NULL); - - PyCodeObject *code = _PyFrame_GetCode(frame->f_frame); +static int +set_opcode_trace_world_stopped(PyCodeObject *code, bool enable) +{ _PyMonitoringEventSet events = 0; - if (_PyMonitoring_GetLocalEvents(code, PY_MONITORING_SYS_TRACE_ID, &events) < 0) { return -1; } @@ -161,6 +155,32 @@ _PyEval_SetOpcodeTrace( return _PyMonitoring_SetLocalEvents(code, PY_MONITORING_SYS_TRACE_ID, events); } +int +_PyEval_SetOpcodeTrace(PyFrameObject *frame, bool enable) +{ + assert(frame != NULL); + + PyCodeObject *code = _PyFrame_GetCode(frame->f_frame); + +#ifdef Py_GIL_DISABLED + // First check if a change is necessary outside of the stop-the-world pause + _PyMonitoringEventSet events = 0; + if (_PyMonitoring_GetLocalEvents(code, PY_MONITORING_SYS_TRACE_ID, &events) < 0) { + return -1; + } + int is_enabled = (events & (1 << PY_MONITORING_EVENT_INSTRUCTION)) != 0; + if (is_enabled == enable) { + return 0; // No change needed + } +#endif + + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyEval_StopTheWorld(interp); + int res = set_opcode_trace_world_stopped(code, enable); + _PyEval_StartTheWorld(interp); + return res; +} + static PyObject * call_trace_func(_PyLegacyEventHandler *self, PyObject *arg) { @@ -438,62 +458,74 @@ is_tstate_valid(PyThreadState *tstate) } #endif -static Py_ssize_t -setup_profile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg, PyObject **old_profileobj) +static int +setup_profile_callbacks(void *Py_UNUSED(arg)) { - *old_profileobj = NULL; /* Setup PEP 669 monitoring callbacks and events. */ - if (!tstate->interp->sys_profile_initialized) { - tstate->interp->sys_profile_initialized = true; - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_start, PyTrace_CALL, - PY_MONITORING_EVENT_PY_START, - PY_MONITORING_EVENT_PY_RESUME)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_throw, PyTrace_CALL, - PY_MONITORING_EVENT_PY_THROW, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_return, PyTrace_RETURN, - PY_MONITORING_EVENT_PY_RETURN, - PY_MONITORING_EVENT_PY_YIELD)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_unwind, PyTrace_RETURN, - PY_MONITORING_EVENT_PY_UNWIND, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_call_or_return, PyTrace_C_CALL, - PY_MONITORING_EVENT_CALL, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_call_or_return, PyTrace_C_RETURN, - PY_MONITORING_EVENT_C_RETURN, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, - sys_profile_call_or_return, PyTrace_C_EXCEPTION, - PY_MONITORING_EVENT_C_RAISE, -1)) { - return -1; - } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_start, PyTrace_CALL, + PY_MONITORING_EVENT_PY_START, + PY_MONITORING_EVENT_PY_RESUME)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_throw, PyTrace_CALL, + PY_MONITORING_EVENT_PY_THROW, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_return, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_RETURN, + PY_MONITORING_EVENT_PY_YIELD)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_unwind, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_UNWIND, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_call_or_return, PyTrace_C_CALL, + PY_MONITORING_EVENT_CALL, -1)) { + return -1; } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_call_or_return, PyTrace_C_RETURN, + PY_MONITORING_EVENT_C_RETURN, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_PROFILE_ID, + sys_profile_call_or_return, PyTrace_C_EXCEPTION, + PY_MONITORING_EVENT_C_RAISE, -1)) { + return -1; + } + return 0; +} - _PyEval_StopTheWorld(tstate->interp); +static PyObject * +swap_profile_func_arg(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) +{ int delta = (func != NULL) - (tstate->c_profilefunc != NULL); tstate->c_profilefunc = func; - *old_profileobj = tstate->c_profileobj; + PyObject *old_profileobj = tstate->c_profileobj; tstate->c_profileobj = Py_XNewRef(arg); tstate->interp->sys_profiling_threads += delta; assert(tstate->interp->sys_profiling_threads >= 0); - Py_ssize_t profiling_threads = tstate->interp->sys_profiling_threads; - _PyEval_StartTheWorld(tstate->interp); - return profiling_threads; + return old_profileobj; +} + +static int +set_monitoring_profile_events(PyInterpreterState *interp) +{ + uint32_t events = 0; + if (interp->sys_profiling_threads) { + events = + (1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) | + (1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) | + (1 << PY_MONITORING_EVENT_CALL) | (1 << PY_MONITORING_EVENT_PY_UNWIND) | + (1 << PY_MONITORING_EVENT_PY_THROW); + } + return _PyMonitoring_SetEvents(PY_MONITORING_SYS_PROFILE_ID, events); } int @@ -510,90 +542,155 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) return -1; } - // needs to be decref'd outside of the lock - PyObject *old_profileobj; - LOCK_SETUP(); - Py_ssize_t profiling_threads = setup_profile(tstate, func, arg, &old_profileobj); - UNLOCK_SETUP(); - Py_XDECREF(old_profileobj); + PyInterpreterState *interp = tstate->interp; + if (_PyOnceFlag_CallOnce(&interp->sys_profile_once_flag, + setup_profile_callbacks, NULL) < 0) { + return -1; + } + + _PyEval_StopTheWorld(interp); + PyObject *old_profileobj = swap_profile_func_arg(tstate, func, arg); + int ret = set_monitoring_profile_events(interp); + _PyEval_StartTheWorld(interp); + Py_XDECREF(old_profileobj); // needs to be decref'd outside of stop-the-world + return ret; +} + +int +_PyEval_SetProfileAllThreads(PyInterpreterState *interp, Py_tracefunc func, PyObject *arg) +{ + PyThreadState *current_tstate = _PyThreadState_GET(); + assert(is_tstate_valid(current_tstate)); + assert(current_tstate->interp == interp); + + if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) { + return -1; + } + + if (_PyOnceFlag_CallOnce(&interp->sys_profile_once_flag, + setup_profile_callbacks, NULL) < 0) { + return -1; + } - uint32_t events = 0; - if (profiling_threads) { - events = - (1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) | - (1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) | - (1 << PY_MONITORING_EVENT_CALL) | (1 << PY_MONITORING_EVENT_PY_UNWIND) | - (1 << PY_MONITORING_EVENT_PY_THROW); + PyObject *old_profileobjs = NULL; + _PyEval_StopTheWorld(interp); + HEAD_LOCK(&_PyRuntime); + Py_ssize_t num_thread_states = 0; + _Py_FOR_EACH_TSTATE_UNLOCKED(interp, p) { + num_thread_states++; } - return _PyMonitoring_SetEvents(PY_MONITORING_SYS_PROFILE_ID, events); + old_profileobjs = PyTuple_New(num_thread_states); + if (old_profileobjs == NULL) { + HEAD_UNLOCK(&_PyRuntime); + _PyEval_StartTheWorld(interp); + return -1; + } + _Py_FOR_EACH_TSTATE_UNLOCKED(interp, tstate) { + PyObject *old = swap_profile_func_arg(tstate, func, arg); + PyTuple_SET_ITEM(old_profileobjs, --num_thread_states, old); + } + HEAD_UNLOCK(&_PyRuntime); + int ret = set_monitoring_profile_events(interp); + _PyEval_StartTheWorld(interp); + Py_XDECREF(old_profileobjs); // needs to be decref'd outside of stop-the-world + return ret; } -static Py_ssize_t -setup_tracing(PyThreadState *tstate, Py_tracefunc func, PyObject *arg, PyObject **old_traceobj) +static int +setup_trace_callbacks(void *Py_UNUSED(arg)) { - *old_traceobj = NULL; /* Setup PEP 669 monitoring callbacks and events. */ - if (!tstate->interp->sys_trace_initialized) { - tstate->interp->sys_trace_initialized = true; - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_start, PyTrace_CALL, - PY_MONITORING_EVENT_PY_START, - PY_MONITORING_EVENT_PY_RESUME)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_throw, PyTrace_CALL, - PY_MONITORING_EVENT_PY_THROW, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_return, PyTrace_RETURN, - PY_MONITORING_EVENT_PY_RETURN, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_yield, PyTrace_RETURN, - PY_MONITORING_EVENT_PY_YIELD, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_exception_func, PyTrace_EXCEPTION, - PY_MONITORING_EVENT_RAISE, - PY_MONITORING_EVENT_STOP_ITERATION)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_line_func, PyTrace_LINE, - PY_MONITORING_EVENT_LINE, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_unwind, PyTrace_RETURN, - PY_MONITORING_EVENT_PY_UNWIND, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_jump_func, PyTrace_LINE, - PY_MONITORING_EVENT_JUMP, -1)) { - return -1; - } - if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, - sys_trace_instruction_func, PyTrace_OPCODE, - PY_MONITORING_EVENT_INSTRUCTION, -1)) { - return -1; - } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_start, PyTrace_CALL, + PY_MONITORING_EVENT_PY_START, + PY_MONITORING_EVENT_PY_RESUME)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_throw, PyTrace_CALL, + PY_MONITORING_EVENT_PY_THROW, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_return, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_RETURN, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_yield, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_YIELD, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_exception_func, PyTrace_EXCEPTION, + PY_MONITORING_EVENT_RAISE, + PY_MONITORING_EVENT_STOP_ITERATION)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_line_func, PyTrace_LINE, + PY_MONITORING_EVENT_LINE, -1)) { + return -1; } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_unwind, PyTrace_RETURN, + PY_MONITORING_EVENT_PY_UNWIND, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_jump_func, PyTrace_LINE, + PY_MONITORING_EVENT_JUMP, -1)) { + return -1; + } + if (set_callbacks(PY_MONITORING_SYS_TRACE_ID, + sys_trace_instruction_func, PyTrace_OPCODE, + PY_MONITORING_EVENT_INSTRUCTION, -1)) { + return -1; + } + return 0; +} - _PyEval_StopTheWorld(tstate->interp); +static PyObject * +swap_trace_func_arg(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) +{ int delta = (func != NULL) - (tstate->c_tracefunc != NULL); tstate->c_tracefunc = func; - *old_traceobj = tstate->c_traceobj; + PyObject *old_traceobj = tstate->c_traceobj; tstate->c_traceobj = Py_XNewRef(arg); tstate->interp->sys_tracing_threads += delta; assert(tstate->interp->sys_tracing_threads >= 0); - Py_ssize_t tracing_threads = tstate->interp->sys_tracing_threads; - _PyEval_StartTheWorld(tstate->interp); - return tracing_threads; + return old_traceobj; +} + +static int +set_monitoring_trace_events(PyInterpreterState *interp) +{ + uint32_t events = 0; + if (interp->sys_tracing_threads) { + events = + (1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) | + (1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) | + (1 << PY_MONITORING_EVENT_RAISE) | (1 << PY_MONITORING_EVENT_LINE) | + (1 << PY_MONITORING_EVENT_JUMP) | + (1 << PY_MONITORING_EVENT_PY_UNWIND) | (1 << PY_MONITORING_EVENT_PY_THROW) | + (1 << PY_MONITORING_EVENT_STOP_ITERATION); + } + return _PyMonitoring_SetEvents(PY_MONITORING_SYS_TRACE_ID, events); +} + +// Enable opcode tracing for the thread's current frame if needed. +static int +maybe_set_opcode_trace(PyThreadState *tstate) +{ + _PyInterpreterFrame *iframe = tstate->current_frame; + if (iframe == NULL) { + return 0; + } + PyFrameObject *frame = iframe->frame_obj; + if (frame == NULL || !frame->f_trace_opcodes) { + return 0; + } + return set_opcode_trace_world_stopped(_PyFrame_GetCode(iframe), true); } int @@ -609,35 +706,76 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) { return -1; } - // needs to be decref'd outside of the lock - PyObject *old_traceobj; - LOCK_SETUP(); - assert(tstate->interp->sys_tracing_threads >= 0); - Py_ssize_t tracing_threads = setup_tracing(tstate, func, arg, &old_traceobj); - UNLOCK_SETUP(); - Py_XDECREF(old_traceobj); - if (tracing_threads < 0) { + + PyInterpreterState *interp = tstate->interp; + if (_PyOnceFlag_CallOnce(&interp->sys_trace_once_flag, + setup_trace_callbacks, NULL) < 0) { return -1; } - uint32_t events = 0; - if (tracing_threads) { - events = - (1 << PY_MONITORING_EVENT_PY_START) | (1 << PY_MONITORING_EVENT_PY_RESUME) | - (1 << PY_MONITORING_EVENT_PY_RETURN) | (1 << PY_MONITORING_EVENT_PY_YIELD) | - (1 << PY_MONITORING_EVENT_RAISE) | (1 << PY_MONITORING_EVENT_LINE) | - (1 << PY_MONITORING_EVENT_JUMP) | - (1 << PY_MONITORING_EVENT_PY_UNWIND) | (1 << PY_MONITORING_EVENT_PY_THROW) | - (1 << PY_MONITORING_EVENT_STOP_ITERATION); + int err = 0; + _PyEval_StopTheWorld(interp); + PyObject *old_traceobj = swap_trace_func_arg(tstate, func, arg); + err = set_monitoring_trace_events(interp); + if (err != 0) { + goto done; + } + if (interp->sys_tracing_threads) { + err = maybe_set_opcode_trace(tstate); + } +done: + _PyEval_StartTheWorld(interp); + Py_XDECREF(old_traceobj); // needs to be decref'd outside stop-the-world + return err; +} + +int +_PyEval_SetTraceAllThreads(PyInterpreterState *interp, Py_tracefunc func, PyObject *arg) +{ + PyThreadState *current_tstate = _PyThreadState_GET(); + assert(is_tstate_valid(current_tstate)); + assert(current_tstate->interp == interp); + + if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) { + return -1; + } + + if (_PyOnceFlag_CallOnce(&interp->sys_trace_once_flag, + setup_trace_callbacks, NULL) < 0) { + return -1; + } - PyFrameObject* frame = PyEval_GetFrame(); - if (frame && frame->f_trace_opcodes) { - int ret = _PyEval_SetOpcodeTrace(frame, true); - if (ret != 0) { - return ret; + PyObject *old_trace_objs = NULL; + _PyEval_StopTheWorld(interp); + HEAD_LOCK(&_PyRuntime); + Py_ssize_t num_thread_states = 0; + _Py_FOR_EACH_TSTATE_UNLOCKED(interp, p) { + num_thread_states++; + } + old_trace_objs = PyTuple_New(num_thread_states); + if (old_trace_objs == NULL) { + HEAD_UNLOCK(&_PyRuntime); + _PyEval_StartTheWorld(interp); + return -1; + } + _Py_FOR_EACH_TSTATE_UNLOCKED(interp, tstate) { + PyObject *old = swap_trace_func_arg(tstate, func, arg); + PyTuple_SET_ITEM(old_trace_objs, --num_thread_states, old); + } + if (interp->sys_tracing_threads) { + _Py_FOR_EACH_TSTATE_UNLOCKED(interp, tstate) { + int err = maybe_set_opcode_trace(tstate); + if (err != 0) { + HEAD_UNLOCK(&_PyRuntime); + _PyEval_StartTheWorld(interp); + Py_XDECREF(old_trace_objs); + return -1; } } } - - return _PyMonitoring_SetEvents(PY_MONITORING_SYS_TRACE_ID, events); + HEAD_UNLOCK(&_PyRuntime); + int err = set_monitoring_trace_events(interp); + _PyEval_StartTheWorld(interp); + Py_XDECREF(old_trace_objs); // needs to be decref'd outside of stop-the-world + return err; } diff --git a/Python/pystate.c b/Python/pystate.c index ed4d50850468b9..b7da4e981ac1eb 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -403,7 +403,6 @@ _Py_COMP_DIAG_POP &(runtime)->unicode_state.ids.mutex, \ &(runtime)->imports.extensions.mutex, \ &(runtime)->ceval.pending_mainthread.mutex, \ - &(runtime)->ceval.sys_trace_profile_mutex, \ &(runtime)->atexit.mutex, \ &(runtime)->audit_hooks.mutex, \ &(runtime)->allocators.mutex, \ @@ -668,8 +667,6 @@ init_interpreter(PyInterpreterState *interp, } interp->monitoring_tool_versions[t] = 0; } - interp->sys_profile_initialized = false; - interp->sys_trace_initialized = false; interp->_code_object_generation = 0; interp->jit = false; interp->executor_list_head = NULL; @@ -876,8 +873,6 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) Py_CLEAR(interp->monitoring_callables[t][e]); } } - interp->sys_profile_initialized = false; - interp->sys_trace_initialized = false; for (int t = 0; t < PY_MONITORING_TOOL_IDS; t++) { Py_CLEAR(interp->monitoring_tool_names[t]); } @@ -1789,23 +1784,15 @@ PyThreadState_Clear(PyThreadState *tstate) "PyThreadState_Clear: warning: thread still has a generator\n"); } -#ifdef Py_GIL_DISABLED - PyMutex_Lock(&_PyRuntime.ceval.sys_trace_profile_mutex); -#endif - if (tstate->c_profilefunc != NULL) { - tstate->interp->sys_profiling_threads--; + FT_ATOMIC_ADD_SSIZE(tstate->interp->sys_profiling_threads, -1); tstate->c_profilefunc = NULL; } if (tstate->c_tracefunc != NULL) { - tstate->interp->sys_tracing_threads--; + FT_ATOMIC_ADD_SSIZE(tstate->interp->sys_tracing_threads, -1); tstate->c_tracefunc = NULL; } -#ifdef Py_GIL_DISABLED - PyMutex_Unlock(&_PyRuntime.ceval.sys_trace_profile_mutex); -#endif - Py_CLEAR(tstate->c_profileobj); Py_CLEAR(tstate->c_traceobj); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 5eeb3e9910b02d..1bb3dcaea9e634 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1183,9 +1183,10 @@ sys__settraceallthreads(PyObject *module, PyObject *arg) argument = arg; } - - PyEval_SetTraceAllThreads(func, argument); - + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (_PyEval_SetTraceAllThreads(interp, func, argument) < 0) { + return NULL; + } Py_RETURN_NONE; } @@ -1263,8 +1264,10 @@ sys__setprofileallthreads(PyObject *module, PyObject *arg) argument = arg; } - PyEval_SetProfileAllThreads(func, argument); - + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (_PyEval_SetProfileAllThreads(interp, func, argument) < 0) { + return NULL; + } Py_RETURN_NONE; } From 33340233d0c4b746b57b4a83edbe267c3ddba165 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:46:00 +0200 Subject: [PATCH 1000/1674] [3.14] gh-139698: Fix typo in What's New 3.14 (GH-139699) (#139711) gh-139698: Fix typo in What's New 3.14 (GH-139699) (cherry picked from commit d396a32b3d1a4b3a35bdfc8b44521d3021a108c7) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 2fd9486798829f..655243fee9803c 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -449,8 +449,8 @@ depending on platform and architecture. The baseline is Python 3.14 built with Clang 19, without this new interpreter. This interpreter currently only works with Clang 19 and newer -on x86-64 and AArch64 architectures. However, a future release -of GCC is expected will support this as well. +on x86-64 and AArch64 architectures. +However, a future release of GCC is expected to support this as well. This feature is opt-in for now. Enabling profile-guided optimization is highly recommendeded when using the new interpreter as it is the only configuration From 7b203aa2ff08252b4270622d0ee76e972c09e4ac Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:50:13 +0200 Subject: [PATCH 1001/1674] [3.14] gh-136516: Mention installation artifacts as de-facto resources (GH-136419) (#137038) gh-136516: Mention installation artifacts as de-facto resources (GH-136419) Files like NUL on windows are, from `importlib.resources` point of view, an artifact caused by installing to a filesystem directory. Mention these. (cherry picked from commit fac4964fdb2ae12969b485de496dd6d064fdbe99) Co-authored-by: Petr Viktorin --- Doc/library/importlib.resources.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Doc/library/importlib.resources.rst b/Doc/library/importlib.resources.rst index e002198899c8b8..7a11f4fe069004 100644 --- a/Doc/library/importlib.resources.rst +++ b/Doc/library/importlib.resources.rst @@ -16,11 +16,12 @@ within *packages*. "Resources" are file-like resources associated with a module or package in Python. The resources may be contained directly in a package, within a subdirectory contained in that package, or adjacent to modules outside a -package. Resources may be text or binary. As a result, Python module sources -(.py) of a package and compilation artifacts (pycache) are technically -de-facto resources of that package. In practice, however, resources are -primarily those non-Python artifacts exposed specifically by the package -author. +package. Resources may be text or binary. As a result, a package's Python +module sources (.py), compilation artifacts (pycache), and installation +artifacts (like :func:`reserved filenames ` +in directories) are technically de-facto resources of that package. +In practice, however, resources are primarily those non-Python artifacts +exposed specifically by the package author. Resources can be opened or read in either binary or text mode. From a03dd74c9444930928c5e817f156223affb741f8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:52:07 +0200 Subject: [PATCH 1002/1674] [3.14] gh-137239: Add *_max functions to heapq.__all__ (gh-137241) (#137256) gh-137239: Add *_max functions to heapq.__all__ (gh-137241) (cherry picked from commit 5f35f9b8fad50670604552062c1df8fbdff835ab) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/heapq.py | 5 +++-- .../Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst diff --git a/Lib/heapq.py b/Lib/heapq.py index 6ceb211f1ca2ae..17f62dd2d5839b 100644 --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -126,8 +126,9 @@ From all times, sorting has always been a Great Art! :-) """ -__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge', - 'nlargest', 'nsmallest', 'heappushpop'] +__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'heappushpop', + 'heappush_max', 'heappop_max', 'heapify_max', 'heapreplace_max', + 'heappushpop_max', 'nlargest', 'nsmallest', 'merge'] def heappush(heap, item): """Push item onto heap, maintaining the heap invariant.""" diff --git a/Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst b/Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst new file mode 100644 index 00000000000000..3be583ee937f8c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst @@ -0,0 +1 @@ +:mod:`heapq`: Update :data:`!heapq.__all__` with ``*_max`` functions. From e3d102ecdc6da767b5dc871aee343b04a101d888 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:53:33 +0200 Subject: [PATCH 1003/1674] [3.14] gh-136823: Update documentation on excluded headers in Python.h (GH-136824) (#137437) gh-136823: Update documentation on excluded headers in Python.h (GH-136824) (cherry picked from commit c2428ca9ea0c4eac9c7f2b41aff5f77660f21298) Co-authored-by: Sina Zel taat <111974143+SZeltaat@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com> --- Doc/extending/extending.rst | 37 +++++++++++++++++++++++++++++++------ Include/Python.h | 1 + 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst index d9eacc4e2f63cc..dee92312169a27 100644 --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -75,12 +75,37 @@ the module and a copyright notice if you like). 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 -since they are used extensively by the Python interpreter, ``"Python.h"`` -includes a few standard header files: ````, ````, -````, and ````. If the latter header file does not exist on -your system, it declares the functions :c:func:`malloc`, :c:func:`free` and -:c:func:`realloc` directly. +``PY``, except those defined in standard header files. + +.. tip:: + + For backward compatibility, :file:`Python.h` includes several standard header files. + C extensions should include the standard headers that they use, + and should not rely on these implicit includes. + If using the limited C API version 3.13 or newer, the implicit includes are: + + * ```` + * ```` (on Windows) + * ```` + * ```` + * ```` + * ```` + * ```` + * ```` (if present) + + If :c:macro:`Py_LIMITED_API` is not defined, or is set to version 3.12 or older, + the headers below are also included: + + * ```` + * ```` (on POSIX) + + If :c:macro:`Py_LIMITED_API` is not defined, or is set to version 3.10 or older, + the headers below are also included: + + * ```` + * ```` + * ```` + * ```` The next thing we add to our module file is the C function that will be called when the Python expression ``spam.system(string)`` is evaluated (we'll see diff --git a/Include/Python.h b/Include/Python.h index f34d581f0b4c91..db8165e4b2e858 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -16,6 +16,7 @@ // Include standard header files +// When changing these files, remember to update Doc/extending/extending.rst. #include // assert() #include // uintptr_t #include // INT_MAX From fad7bfc2829d262e68af40491880000351b12ad2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:57:05 +0200 Subject: [PATCH 1004/1674] [3.14] gh-138902: Fix generator send arg name (GH-138905) (#138914) gh-138902: Fix generator send arg name (GH-138905) (cherry picked from commit cb07bd24eed43a0ac182e664398398164089f294) Co-authored-by: Marat Khagazheev Co-authored-by: marat --- Objects/genobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/genobject.c b/Objects/genobject.c index 88814c3578af6e..f1fd995a246ed9 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -315,7 +315,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) } PyDoc_STRVAR(send_doc, -"send(arg) -> send 'arg' into generator,\n\ +"send(value) -> send 'value' into generator,\n\ return next yielded value or raise StopIteration."); static PyObject * From 7d9b2671c6fcdb09cf49a235e3ef3bd5230b4156 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:59:06 +0200 Subject: [PATCH 1005/1674] [3.14] gh-123681: Check NORMALIZE_CENTURY behavior at runtime; require C99 (GH-136022) (GH-137947) A runtime check is needed to support cross-compiling. Remove the _Py_NORMALIZE_CENTURY macro. Remove _pydatetime.py's _can_support_c99. (cherry picked from commit 719e5c3f7111bcda5eee72fe648786c427c4d4c2) Co-authored-by: Petr Viktorin Co-authored-by: Serhiy Storchaka --- Lib/_pydatetime.py | 13 +-- Lib/test/datetimetester.py | 38 ++++--- ...-01-03-13-02-06.gh-issue-123681.gQ67nK.rst | 3 + Modules/_datetimemodule.c | 26 ++++- Tools/c-analyzer/cpython/ignored.tsv | 1 + configure | 104 ------------------ configure.ac | 51 --------- pyconfig.h.in | 3 - 8 files changed, 48 insertions(+), 191 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index cfcd35827a275a..70251dbb6535d2 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -213,17 +213,6 @@ def _need_normalize_century(): _normalize_century = True return _normalize_century -_supports_c99 = None -def _can_support_c99(): - global _supports_c99 - if _supports_c99 is None: - try: - _supports_c99 = ( - _time.strftime("%F", (1900, 1, 1, 0, 0, 0, 0, 1, 0)) == "1900-01-01") - except ValueError: - _supports_c99 = False - return _supports_c99 - # Correctly substitute for %z and %Z escapes in strftime formats. def _wrap_strftime(object, format, timetuple): # Don't call utcoffset() or tzname() unless actually needed. @@ -283,7 +272,7 @@ def _wrap_strftime(object, format, timetuple): newformat.append(Zreplace) # Note that datetime(1000, 1, 1).strftime('%G') == '1000' so # year 1000 for %G can go on the fast path. - elif ((ch in 'YG' or ch in 'FC' and _can_support_c99()) and + elif ((ch in 'YG' or ch in 'FC') and object.year < 1000 and _need_normalize_century()): if ch == 'G': year = int(_time.strftime("%G", timetuple)) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 1c1cbd03d02ccc..aca5fbc04b18cb 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -1807,7 +1807,7 @@ def test_bool(self): self.assertTrue(self.theclass.min) self.assertTrue(self.theclass.max) - def test_strftime_y2k(self): + def check_strftime_y2k(self, specifier): # Test that years less than 1000 are 0-padded; note that the beginning # of an ISO 8601 year may fall in an ISO week of the year before, and # therefore needs an offset of -1 when formatting with '%G'. @@ -1821,22 +1821,28 @@ def test_strftime_y2k(self): (1000, 0), (1970, 0), ) - specifiers = 'YG' - if _time.strftime('%F', (1900, 1, 1, 0, 0, 0, 0, 1, 0)) == '1900-01-01': - specifiers += 'FC' for year, g_offset in dataset: - for specifier in specifiers: - with self.subTest(year=year, specifier=specifier): - d = self.theclass(year, 1, 1) - if specifier == 'G': - year += g_offset - if specifier == 'C': - expected = f"{year // 100:02d}" - else: - expected = f"{year:04d}" - if specifier == 'F': - expected += f"-01-01" - self.assertEqual(d.strftime(f"%{specifier}"), expected) + with self.subTest(year=year, specifier=specifier): + d = self.theclass(year, 1, 1) + if specifier == 'G': + year += g_offset + if specifier == 'C': + expected = f"{year // 100:02d}" + else: + expected = f"{year:04d}" + if specifier == 'F': + expected += f"-01-01" + self.assertEqual(d.strftime(f"%{specifier}"), expected) + + def test_strftime_y2k(self): + self.check_strftime_y2k('Y') + self.check_strftime_y2k('G') + + def test_strftime_y2k_c99(self): + # CPython requires C11; specifiers new in C99 must work. + # (Other implementations may want to disable this test.) + self.check_strftime_y2k('F') + self.check_strftime_y2k('C') def test_replace(self): cls = self.theclass diff --git a/Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst b/Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst new file mode 100644 index 00000000000000..a60b4607456096 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst @@ -0,0 +1,3 @@ +Check the ``strftime()`` behavior at runtime instead of at the compile time +to support cross-compiling. +Remove the internal macro ``_Py_NORMALIZE_CENTURY``. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index c4bb44f1234990..ddb9e9fd2e57c0 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1753,6 +1753,24 @@ format_utcoffset(char *buf, size_t buflen, const char *sep, return 0; } +/* Check whether year with century should be normalized for strftime. */ +inline static int +normalize_century(void) +{ + static int cache = -1; + if (cache < 0) { + char year[5]; + struct tm date = { + .tm_year = -1801, + .tm_mon = 0, + .tm_mday = 1 + }; + cache = (strftime(year, sizeof(year), "%Y", &date) && + strcmp(year, "0099") != 0); + } + return cache; +} + static PyObject * make_somezreplacement(PyObject *object, char *sep, PyObject *tzinfoarg) { @@ -1924,10 +1942,9 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, } replacement = freplacement; } -#ifdef _Py_NORMALIZE_CENTURY - else if (ch == 'Y' || ch == 'G' - || ch == 'F' || ch == 'C' - ) { + else if (normalize_century() + && (ch == 'Y' || ch == 'G' || ch == 'F' || ch == 'C')) + { /* 0-pad year with century as necessary */ PyObject *item = PySequence_GetItem(timetuple, 0); if (item == NULL) { @@ -1978,7 +1995,6 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, } continue; } -#endif else { /* percent followed by something else */ continue; diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index d5d806be42f39d..687871068e8bae 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -226,6 +226,7 @@ Modules/_datetimemodule.c datetime_isoformat specs - Modules/_datetimemodule.c parse_hh_mm_ss_ff correction - Modules/_datetimemodule.c time_isoformat specs - Modules/_datetimemodule.c - capi_types - +Modules/_datetimemodule.c normalize_century cache - Modules/_decimal/_decimal.c - cond_map_template - Modules/_decimal/_decimal.c - dec_signal_string - Modules/_decimal/_decimal.c - dflt_ctx - diff --git a/configure b/configure index d31c24dffa2e9d..dc66ea068ebc1f 100755 --- a/configure +++ b/configure @@ -28186,110 +28186,6 @@ printf "%s\n" "#define HAVE_STAT_TV_NSEC2 1" >>confdefs.h fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether year with century should be normalized for strftime" >&5 -printf %s "checking whether year with century should be normalized for strftime... " >&6; } -if test ${ac_cv_normalize_century+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) -if test "$cross_compiling" = yes -then : - ac_cv_normalize_century=yes -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#include - -int main(void) -{ - char year[5]; - struct tm date = { - .tm_year = -1801, - .tm_mon = 0, - .tm_mday = 1 - }; - if (strftime(year, sizeof(year), "%Y", &date) && !strcmp(year, "0099")) { - return 1; - } - return 0; -} - -_ACEOF -if ac_fn_c_try_run "$LINENO" -then : - ac_cv_normalize_century=yes -else case e in #( - e) ac_cv_normalize_century=no ;; -esac -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac -fi - ;; -esac -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_normalize_century" >&5 -printf "%s\n" "$ac_cv_normalize_century" >&6; } -if test "$ac_cv_normalize_century" = yes -then - -printf "%s\n" "#define _Py_NORMALIZE_CENTURY 1" >>confdefs.h - -fi - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C99-compatible strftime specifiers are supported" >&5 -printf %s "checking whether C99-compatible strftime specifiers are supported... " >&6; } -if test ${ac_cv_strftime_c99_support+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) -if test "$cross_compiling" = yes -then : - ac_cv_strftime_c99_support= -else case e in #( - e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#include - -int main(void) -{ - char full_date[11]; - struct tm date = { - .tm_year = 0, - .tm_mon = 0, - .tm_mday = 1 - }; - if (strftime(full_date, sizeof(full_date), "%F", &date) && !strcmp(full_date, "1900-01-01")) { - return 0; - } - return 1; -} - -_ACEOF -if ac_fn_c_try_run "$LINENO" -then : - ac_cv_strftime_c99_support=yes -else case e in #( - e) as_fn_error $? "Python requires C99-compatible strftime specifiers" "$LINENO" 5 ;; -esac -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext ;; -esac -fi - ;; -esac -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_strftime_c99_support" >&5 -printf "%s\n" "$ac_cv_strftime_c99_support" >&6; } - have_curses=no have_panel=no diff --git a/configure.ac b/configure.ac index af7a9623d7bd79..8340319c7e63f2 100644 --- a/configure.ac +++ b/configure.ac @@ -6792,57 +6792,6 @@ then [Define if you have struct stat.st_mtimensec]) fi -AC_CACHE_CHECK([whether year with century should be normalized for strftime], [ac_cv_normalize_century], [ -AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#include -#include - -int main(void) -{ - char year[5]; - struct tm date = { - .tm_year = -1801, - .tm_mon = 0, - .tm_mday = 1 - }; - if (strftime(year, sizeof(year), "%Y", &date) && !strcmp(year, "0099")) { - return 1; - } - return 0; -} -]])], -[ac_cv_normalize_century=yes], -[ac_cv_normalize_century=no], -[ac_cv_normalize_century=yes])]) -if test "$ac_cv_normalize_century" = yes -then - AC_DEFINE([_Py_NORMALIZE_CENTURY], [1], - [Define if year with century should be normalized for strftime.]) -fi - -AC_CACHE_CHECK([whether C99-compatible strftime specifiers are supported], [ac_cv_strftime_c99_support], [ -AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#include -#include - -int main(void) -{ - char full_date[11]; - struct tm date = { - .tm_year = 0, - .tm_mon = 0, - .tm_mday = 1 - }; - if (strftime(full_date, sizeof(full_date), "%F", &date) && !strcmp(full_date, "1900-01-01")) { - return 0; - } - return 1; -} -]])], -[ac_cv_strftime_c99_support=yes], -[AC_MSG_ERROR([Python requires C99-compatible strftime specifiers])], -[ac_cv_strftime_c99_support=])]) - dnl check for ncursesw/ncurses and panelw/panel dnl NOTE: old curses is not detected. dnl have_curses=[no, yes] diff --git a/pyconfig.h.in b/pyconfig.h.in index 1c533b2bfb7fb4..0d6ad4465c0e93 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -2023,9 +2023,6 @@ /* HACL* library can compile SIMD256 implementations */ #undef _Py_HACL_CAN_COMPILE_VEC256 -/* Define if year with century should be normalized for strftime. */ -#undef _Py_NORMALIZE_CENTURY - /* Define to force use of thread-safe errno, h_errno, and other functions */ #undef _REENTRANT From 93f5e26d9719d3526f1c81b5882ca4378a5e2e06 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:59:29 +0200 Subject: [PATCH 1006/1674] [3.14] gh-137376: Add note on top-level `global` declarations (GH-137707) (GH-138023) (cherry picked from commit 9f05f98730bbc36f4ad173845458827c4df879f6) Co-authored-by: Petr Viktorin Co-authored-by: Brian Schubert --- Doc/reference/simple_stmts.rst | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index d674804df8f82e..9c022570e7e847 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -974,10 +974,17 @@ 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. -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 +The :keyword:`!global` statement applies to the entire current scope +(module, function body or class definition). +A :exc:`SyntaxError` is raised if a variable is used or assigned to prior to its global declaration in the scope. +At the module level, all variables are global, so a :keyword:`!global` +statement has no effect. +However, variables must still not be used or +assigned to prior to their :keyword:`!global` declaration. +This requirement is relaxed in the interactive prompt (:term:`REPL`). + .. index:: pair: built-in function; exec pair: built-in function; eval From 7aab50cd7ab2dee967e71892ada6356b7492a049 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:59:52 +0200 Subject: [PATCH 1007/1674] [3.14] gh-136507: Fix mimetypes CLI to handle multiple file parameters (GH-136508) (GH-138140) (cherry picked from commit 81268a3e2a6aa936a9941dde31965c7b90a963f5) Co-authored-by: Wulian233 <1055917385@qq.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Petr Viktorin --- Lib/mimetypes.py | 22 ++++++++++------- Lib/test/test_mimetypes.py | 24 ++++++++++++++++--- ...-07-10-21-02-43.gh-issue-136507.pnEuGS.rst | 1 + 3 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 33e86d51a0fe50..7d0f4c1fd400d5 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -718,24 +718,30 @@ def _parse_args(args): def _main(args=None): """Run the mimetypes command-line interface and return a text to print.""" - import sys - args, help_text = _parse_args(args) + results = [] if args.extension: for gtype in args.type: guess = guess_extension(gtype, not args.lenient) if guess: - return str(guess) - sys.exit(f"error: unknown type {gtype}") + results.append(str(guess)) + else: + results.append(f"error: unknown type {gtype}") + return results else: for gtype in args.type: guess, encoding = guess_type(gtype, not args.lenient) if guess: - return f"type: {guess} encoding: {encoding}" - sys.exit(f"error: media type unknown for {gtype}") - return help_text + results.append(f"type: {guess} encoding: {encoding}") + else: + results.append(f"error: media type unknown for {gtype}") + return results if __name__ == '__main__': - print(_main()) + import sys + + results = _main() + print("\n".join(results)) + sys.exit(any(result.startswith("error: ") for result in results)) diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index fb57d5e5544c12..c1806b1c133778 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -470,13 +470,31 @@ def test_parse_args(self): self.assertFalse(args.lenient) self.assertEqual(args.type, ["foo.pic"]) + def test_multiple_inputs(self): + result = "\n".join(mimetypes._main(shlex.split("foo.pdf foo.png"))) + self.assertEqual( + result, + "type: application/pdf encoding: None\n" + "type: image/png encoding: None" + ) + + def test_multiple_inputs_error(self): + result = "\n".join(mimetypes._main(shlex.split("foo.pdf foo.bar_ext"))) + self.assertEqual( + result, + "type: application/pdf encoding: None\n" + "error: media type unknown for foo.bar_ext" + ) + + def test_invocation(self): for command, expected in [ ("-l -e image/jpg", ".jpg"), ("-e image/jpeg", ".jpg"), ("-l foo.webp", "type: image/webp encoding: None"), ]: - self.assertEqual(mimetypes._main(shlex.split(command)), expected) + result = "\n".join(mimetypes._main(shlex.split(command))) + self.assertEqual(result, expected) def test_invocation_error(self): for command, expected in [ @@ -484,8 +502,8 @@ def test_invocation_error(self): ("foo.bar_ext", "error: media type unknown for foo.bar_ext"), ]: with self.subTest(command=command): - with self.assertRaisesRegex(SystemExit, expected): - mimetypes._main(shlex.split(command)) + result = "\n".join(mimetypes._main(shlex.split(command))) + self.assertEqual(result, expected) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst b/Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst new file mode 100644 index 00000000000000..b72fd26b38a83b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst @@ -0,0 +1 @@ +Fix mimetypes CLI to handle multiple file parameters. From d7500f6078657286ebac4f4a96e78afa0c911518 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:00:28 +0200 Subject: [PATCH 1008/1674] [3.14] gh-138008: Fix segfaults in _ctypes due to invalid argtypes (GH-138285) (GH-138742) (cherry picked from commit 1ce05537a3ebaf1e5c54505b2272d61bb6cf5de0) Signed-off-by: Nguyen Viet Dung <29406816+magnified103@users.noreply.github.com> Co-authored-by: Yongzi Li <204532581+Yzi-Li@users.noreply.github.com> Co-authored-by: Petr Viktorin --- Lib/test/test_ctypes/test_prototypes.py | 26 +++++++++++++++ ...-08-31-09-06-49.gh-issue-138008.heOvsU.rst | 1 + Modules/_ctypes/_ctypes.c | 33 ++++++++++++------- 3 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst diff --git a/Lib/test/test_ctypes/test_prototypes.py b/Lib/test/test_ctypes/test_prototypes.py index 63ae799ea86ab2..d976e8da0e2d30 100644 --- a/Lib/test/test_ctypes/test_prototypes.py +++ b/Lib/test/test_ctypes/test_prototypes.py @@ -72,6 +72,32 @@ def test_paramflags(self): self.assertEqual(func(None), None) self.assertEqual(func(input=None), None) + def test_invalid_paramflags(self): + proto = CFUNCTYPE(c_int, c_char_p) + with self.assertRaises(ValueError): + func = proto(("myprintf", testdll), ((1, "fmt"), (1, "arg1"))) + + def test_invalid_setattr_argtypes(self): + proto = CFUNCTYPE(c_int, c_char_p) + func = proto(("myprintf", testdll), ((1, "fmt"),)) + + with self.assertRaisesRegex(TypeError, "_argtypes_ must be a sequence of types"): + func.argtypes = 123 + self.assertEqual(func.argtypes, (c_char_p,)) + + with self.assertRaisesRegex(ValueError, "paramflags must have the same length as argtypes"): + func.argtypes = (c_char_p, c_int) + self.assertEqual(func.argtypes, (c_char_p,)) + + def test_paramflags_outarg(self): + proto = CFUNCTYPE(c_int, c_char_p, c_int) + with self.assertRaisesRegex(TypeError, "must be a pointer type"): + func = proto(("myprintf", testdll), ((1, "fmt"), (2, "out"))) + + proto = CFUNCTYPE(c_int, c_char_p, c_void_p) + func = proto(("myprintf", testdll), ((1, "fmt"), (2, "out"))) + with self.assertRaisesRegex(TypeError, "must be a pointer type"): + func.argtypes = (c_char_p, c_int) def test_int_pointer_arg(self): func = testdll._testfunc_p_p diff --git a/Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst b/Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst new file mode 100644 index 00000000000000..40930b8ccbd9ca --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst @@ -0,0 +1 @@ +Fix segmentation faults in the :mod:`ctypes` module due to invalid :attr:`~ctypes._CFuncPtr.argtypes`. Patch by Dung Nguyen. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 08e00adfd0c3e6..bac119f2ae7a36 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3628,6 +3628,9 @@ atomic_xgetref(PyObject *obj, PyObject **field) #endif } +static int +_validate_paramflags(ctypes_state *st, PyTypeObject *type, PyObject *paramflags, PyObject *argtypes); + /*[clinic input] @@ -3741,16 +3744,22 @@ static int _ctypes_CFuncPtr_argtypes_set_impl(PyCFuncPtrObject *self, PyObject *value) /*[clinic end generated code: output=596a36e2ae89d7d1 input=c4627573e980aa8b]*/ { - PyObject *converters; - if (value == NULL || value == Py_None) { atomic_xsetref(&self->argtypes, NULL); atomic_xsetref(&self->converters, NULL); } else { - ctypes_state *st = get_module_state_by_def(Py_TYPE(Py_TYPE(self))); - converters = converters_from_argtypes(st, value); + PyTypeObject *type = Py_TYPE(self); + ctypes_state *st = get_module_state_by_def(Py_TYPE(type)); + + PyObject *converters = converters_from_argtypes(st, value); if (!converters) return -1; + + /* Verify paramflags again due to constraints with argtypes */ + if (!_validate_paramflags(st, type, self->paramflags, value)) { + Py_DECREF(converters); + return -1; + } atomic_xsetref(&self->converters, converters); Py_INCREF(value); atomic_xsetref(&self->argtypes, value); @@ -3880,10 +3889,9 @@ _check_outarg_type(ctypes_state *st, PyObject *arg, Py_ssize_t index) /* Returns 1 on success, 0 on error */ static int -_validate_paramflags(ctypes_state *st, PyTypeObject *type, PyObject *paramflags) +_validate_paramflags(ctypes_state *st, PyTypeObject *type, PyObject *paramflags, PyObject *argtypes) { Py_ssize_t i, len; - PyObject *argtypes; StgInfo *info; if (PyStgInfo_FromType(st, (PyObject *)type, &info) < 0) { @@ -3894,10 +3902,13 @@ _validate_paramflags(ctypes_state *st, PyTypeObject *type, PyObject *paramflags) "abstract class"); return 0; } - argtypes = info->argtypes; + if (argtypes == NULL) { + argtypes = info->argtypes; + } - if (paramflags == NULL || info->argtypes == NULL) + if (paramflags == NULL || argtypes == NULL) { return 1; + } if (!PyTuple_Check(paramflags)) { PyErr_SetString(PyExc_TypeError, @@ -3906,7 +3917,7 @@ _validate_paramflags(ctypes_state *st, PyTypeObject *type, PyObject *paramflags) } len = PyTuple_GET_SIZE(paramflags); - if (len != PyTuple_GET_SIZE(info->argtypes)) { + if (len != PyTuple_GET_SIZE(argtypes)) { PyErr_SetString(PyExc_ValueError, "paramflags must have the same length as argtypes"); return 0; @@ -4082,7 +4093,7 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) #endif #undef USE_DLERROR ctypes_state *st = get_module_state_by_def(Py_TYPE(type)); - if (!_validate_paramflags(st, type, paramflags)) { + if (!_validate_paramflags(st, type, paramflags, NULL)) { Py_DECREF(ftuple); return NULL; } @@ -4126,7 +4137,7 @@ PyCFuncPtr_FromVtblIndex(PyTypeObject *type, PyObject *args, PyObject *kwds) paramflags = NULL; ctypes_state *st = get_module_state_by_def(Py_TYPE(type)); - if (!_validate_paramflags(st, type, paramflags)) { + if (!_validate_paramflags(st, type, paramflags, NULL)) { return NULL; } self = (PyCFuncPtrObject *)generic_pycdata_new(st, type, args, kwds); From 7a1a79d731cea2e6384f64387be9e472b65b4e96 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:01:51 +0200 Subject: [PATCH 1009/1674] [3.14] gh-138163: skip failures if tests are run with `SCHED_BATCH` on glibc (GH-138576) (GH-138820) (cherry picked from commit 492941459acb5b5a104d96414288601d2e2b7e6f) Co-authored-by: jxes993409 <68891412+jxes993409@users.noreply.github.com> Co-authored-by: Petr Viktorin --- Lib/test/test_posix.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 2af11888b17c1d..0bb65fe717d359 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -2036,6 +2036,12 @@ def test_setscheduler_only_param(self): @requires_sched @unittest.skipIf(sys.platform.startswith(('freebsd', 'netbsd')), "bpo-34685: test can fail on BSD") + @unittest.skipIf(platform.libc_ver()[0] == 'glibc' and + os.sched_getscheduler(0) in [ + os.SCHED_BATCH, + os.SCHED_IDLE, + os.SCHED_DEADLINE], + "Skip test due to glibc posix_spawn policy") def test_setscheduler_with_policy(self): policy = os.sched_getscheduler(0) priority = os.sched_get_priority_min(policy) From 98d33bf19c6b0829410e632f7477602b6859726e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:02:42 +0200 Subject: [PATCH 1010/1674] [3.14] gh-139624: Skip problematic locales on AIX in test_date_locale2 (GH-139625) (GH-139644) (cherry picked from commit 6f3dae0dc5ccd47b2b8a6e052244353d8c37e59b) Co-authored-by: Furkan Onder Co-authored-by: Petr Viktorin --- Lib/test/test_strptime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 0241e543cd7dde..e277e7f4ef7b1a 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -557,7 +557,7 @@ def test_date_locale(self): def test_date_locale2(self): # Test %x directive loc = locale.getlocale(locale.LC_TIME)[0] - if sys.platform.startswith('sunos'): + if sys.platform.startswith(('sunos', 'aix')): if loc in ('en_US', 'de_DE', 'ar_AE'): self.skipTest(f'locale {loc!r} may not work on this platform') self.roundtrip('%x', slice(0, 3), (1900, 1, 1, 0, 0, 0, 0, 1, 0)) From bfcd5f25a55443103a64dd8af5624c84df02c5e4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:06:45 +0200 Subject: [PATCH 1011/1674] [3.14] gh-138661: fix data race in `PyCode_Addr2Line` (GH-138664) (#138834) gh-138661: fix data race in `PyCode_Addr2Line` (GH-138664) (cherry picked from commit ea26f6da39294b7d3c28873d070a2218bd528b5f) Co-authored-by: Kumar Aditya --- Include/internal/pycore_code.h | 2 ++ Objects/codeobject.c | 12 +++++++++++- Python/traceback.c | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 37a747aa4e3e46..43286774eb2c71 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -274,6 +274,8 @@ extern void _PyLineTable_InitAddressRange( /** API for traversing the line number table. */ extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range); extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); +// This is used in dump_frame() in traceback.c without an attached tstate. +extern int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addr); /** API for executors */ extern void _PyCode_Clear_Executors(PyCodeObject *code); diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 42e021679b583f..1dbbb053e3fc48 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1014,7 +1014,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) ******************/ int -PyCode_Addr2Line(PyCodeObject *co, int addrq) +_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq) { if (addrq < 0) { return co->co_firstlineno; @@ -1028,6 +1028,16 @@ PyCode_Addr2Line(PyCodeObject *co, int addrq) return _PyCode_CheckLineNumber(addrq, &bounds); } +int +PyCode_Addr2Line(PyCodeObject *co, int addrq) +{ + int lineno; + Py_BEGIN_CRITICAL_SECTION(co); + lineno = _PyCode_Addr2LineNoTstate(co, addrq); + Py_END_CRITICAL_SECTION(); + return lineno; +} + void _PyLineTable_InitAddressRange(const char *linetable, Py_ssize_t length, int firstlineno, PyCodeAddressRange *range) { diff --git a/Python/traceback.c b/Python/traceback.c index c06cb1a59089e2..f3c5644aeb1799 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -994,8 +994,8 @@ dump_frame(int fd, _PyInterpreterFrame *frame) } else { PUTS(fd, "???"); } - - int lineno = PyUnstable_InterpreterFrame_GetLine(frame); + int lasti = PyUnstable_InterpreterFrame_GetLasti(frame); + int lineno = _PyCode_Addr2LineNoTstate(code, lasti); PUTS(fd, ", line "); if (lineno >= 0) { _Py_DumpDecimal(fd, (size_t)lineno); From 93ac6f3472d4cdf5dc8e0023f276f25c7a509f31 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:10:03 +0200 Subject: [PATCH 1012/1674] [3.14] gh-135444: fix `asyncio.DatagramTransport.sendto` to account for datagram header size when data cannot be sent (GH-135445) (#137245) gh-135444: fix `asyncio.DatagramTransport.sendto` to account for datagram header size when data cannot be sent (GH-135445) (cherry picked from commit e3ea8613519bd08aa6ce7d142403e644ae32d843) Co-authored-by: Justin Bronder Co-authored-by: Kumar Aditya --- Lib/asyncio/proactor_events.py | 6 ++- Lib/asyncio/selector_events.py | 7 ++-- Lib/test/test_asyncio/test_proactor_events.py | 2 + Lib/test/test_asyncio/test_selector_events.py | 41 +++++++++++++++++++ ...-06-16-12-37-02.gh-issue-135444.An2eeA.rst | 2 + 5 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 7eb55bd63ddb73..f404273c3ae5c1 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -460,6 +460,8 @@ def _pipe_closed(self, fut): class _ProactorDatagramTransport(_ProactorBasePipeTransport, transports.DatagramTransport): max_size = 256 * 1024 + _header_size = 8 + def __init__(self, loop, sock, protocol, address=None, waiter=None, extra=None): self._address = address @@ -499,7 +501,7 @@ def sendto(self, data, addr=None): # Ensure that what we buffer is immutable. self._buffer.append((bytes(data), addr)) - self._buffer_size += len(data) + 8 # include header bytes + self._buffer_size += len(data) + self._header_size if self._write_fut is None: # No current write operations are active, kick one off @@ -526,7 +528,7 @@ def _loop_writing(self, fut=None): return data, addr = self._buffer.popleft() - self._buffer_size -= len(data) + self._buffer_size -= len(data) + self._header_size if self._address is not None: self._write_fut = self._loop._proactor.send(self._sock, data) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 6a949f35a16a67..ff7e16df3c6273 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -1219,6 +1219,7 @@ def close(self): class _SelectorDatagramTransport(_SelectorTransport, transports.DatagramTransport): _buffer_factory = collections.deque + _header_size = 8 def __init__(self, loop, sock, protocol, address=None, waiter=None, extra=None): @@ -1292,13 +1293,13 @@ def sendto(self, data, addr=None): # Ensure that what we buffer is immutable. self._buffer.append((bytes(data), addr)) - self._buffer_size += len(data) + 8 # include header bytes + self._buffer_size += len(data) + self._header_size self._maybe_pause_protocol() def _sendto_ready(self): while self._buffer: data, addr = self._buffer.popleft() - self._buffer_size -= len(data) + self._buffer_size -= len(data) + self._header_size try: if self._extra['peername']: self._sock.send(data) @@ -1306,7 +1307,7 @@ def _sendto_ready(self): self._sock.sendto(data, addr) except (BlockingIOError, InterruptedError): self._buffer.appendleft((data, addr)) # Try again later. - self._buffer_size += len(data) + self._buffer_size += len(data) + self._header_size break except OSError as exc: self._protocol.error_received(exc) diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index b25daaface0807..edfad5e11db35e 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -566,6 +566,8 @@ def test_sendto(self): self.assertTrue(self.proactor.sendto.called) self.proactor.sendto.assert_called_with( self.sock, data, addr=('0.0.0.0', 1234)) + self.assertFalse(transport._buffer) + self.assertEqual(0, transport._buffer_size) def test_sendto_bytearray(self): data = bytearray(b'data') diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index 5a7df774e60858..4bb5d4fb816a9a 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1513,6 +1513,47 @@ def test_sendto_closing(self): transport.sendto(b'data', (1,)) self.assertEqual(transport._conn_lost, 2) + def test_sendto_sendto_ready(self): + data = b'data' + + # First queue up the buffer by having the socket blocked + self.sock.sendto.side_effect = BlockingIOError + transport = self.datagram_transport() + transport.sendto(data, ('0.0.0.0', 12345)) + self.loop.assert_writer(7, transport._sendto_ready) + self.assertEqual(1, len(transport._buffer)) + self.assertEqual(transport._buffer_size, len(data) + transport._header_size) + + # Now let the socket send the buffer + self.sock.sendto.side_effect = None + transport._sendto_ready() + self.assertTrue(self.sock.sendto.called) + self.assertEqual( + self.sock.sendto.call_args[0], (data, ('0.0.0.0', 12345))) + self.assertFalse(self.loop.writers) + self.assertFalse(transport._buffer) + self.assertEqual(transport._buffer_size, 0) + + def test_sendto_sendto_ready_blocked(self): + data = b'data' + + # First queue up the buffer by having the socket blocked + self.sock.sendto.side_effect = BlockingIOError + transport = self.datagram_transport() + transport.sendto(data, ('0.0.0.0', 12345)) + self.loop.assert_writer(7, transport._sendto_ready) + self.assertEqual(1, len(transport._buffer)) + self.assertEqual(transport._buffer_size, len(data) + transport._header_size) + + # Now try to send the buffer, it will be added to buffer again if it fails + transport._sendto_ready() + self.assertTrue(self.sock.sendto.called) + self.assertEqual( + self.sock.sendto.call_args[0], (data, ('0.0.0.0', 12345))) + self.assertTrue(self.loop.writers) + self.assertEqual(1, len(transport._buffer)) + self.assertEqual(transport._buffer_size, len(data) + transport._header_size) + def test_sendto_ready(self): data = b'data' self.sock.sendto.return_value = len(data) diff --git a/Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst b/Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst new file mode 100644 index 00000000000000..e1182f56eb33ab --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst @@ -0,0 +1,2 @@ +Fix :meth:`asyncio.DatagramTransport.sendto` to account for datagram header size when +data cannot be sent. From 75de39ba1b61636e4a49a457de23de78e7f0a5a1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:11:46 +0200 Subject: [PATCH 1013/1674] [3.14] gh-137185: Fix `_Py_DumpStack()` async signal safety (gh-137187) (gh-137206) Call backtrace() once when installing the signal handler to ensure that libgcc is dynamically loaded outside the signal handler. This fixes a "signal-unsafe call inside of a signal" TSan error from test_faulthandler.test_enable_fd. (cherry picked from commit 11a8652e25341e696b06d8dc7a18e8c3ee8059e4) Co-authored-by: Sam Gross --- Include/internal/pycore_traceback.h | 1 + .../2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst | 2 ++ Modules/faulthandler.c | 5 +++++ Python/traceback.c | 10 ++++++++++ 4 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index d71dd2886999a6..a4f125e073d3d1 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -100,6 +100,7 @@ extern int _Py_WriteIndentedMargin(int, const char*, PyObject *); extern int _Py_WriteIndent(int, PyObject *); // Export for the faulthandler module +PyAPI_FUNC(void) _Py_InitDumpStack(void); PyAPI_FUNC(void) _Py_DumpStack(int fd); #ifdef __cplusplus diff --git a/Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst b/Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst new file mode 100644 index 00000000000000..89398dff147394 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst @@ -0,0 +1,2 @@ +Fix a potential async-signal-safety issue in :mod:`faulthandler` when +printing C stack traces. diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index d49ce794d88674..2495faa38170b7 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -525,6 +525,11 @@ faulthandler_enable(void) } #endif + // gh-137185: Initialize C stack trace dumping outside of the signal + // handler. Specifically, we call backtrace() to ensure that libgcc is + // dynamically loaded outside of the signal handler. + _Py_InitDumpStack(); + for (size_t i=0; i < faulthandler_nsignals; i++) { fault_handler_t *handler; int err; diff --git a/Python/traceback.c b/Python/traceback.c index f3c5644aeb1799..11e52936f309ca 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -1327,3 +1327,13 @@ _Py_DumpStack(int fd) PUTS(fd, " \n"); } #endif + +void +_Py_InitDumpStack(void) +{ +#ifdef CAN_C_BACKTRACE + // gh-137185: Call backtrace() once to force libgcc to be loaded early. + void *callstack[1]; + (void)backtrace(callstack, 1); +#endif +} From 04d75658ac7b6e042384e980a684d43b1a6da686 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:12:05 +0200 Subject: [PATCH 1014/1674] [3.14] gh-139436: Remove ``dist-pdf`` from the docs archives rebuild target (GH-139437) (#139692) gh-139436: Remove ``dist-pdf`` from the docs archives rebuild target (GH-139437) (cherry picked from commit 0e2cdd313ba5c67c5e2e21d993399b890e687c63) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/Makefile b/Doc/Makefile index 84578c5c57f478..f6f4c721080c42 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -184,7 +184,7 @@ venv: fi .PHONY: dist-no-html -dist-no-html: dist-text dist-pdf dist-epub dist-texinfo +dist-no-html: dist-text dist-epub dist-texinfo .PHONY: dist dist: From b1fa3414b337768167fc25a77338130c0483825e Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:13:35 +0100 Subject: [PATCH 1015/1674] [3.14] gh-105812: Use the ``:deco:`` role in place of manual decorator markup (GH-139619) (#139627) (cherry picked from commit 3195da0b1a5dc8a03faa5142d4ab4a1549797e53) --- Doc/library/collections.abc.rst | 4 ++-- Doc/library/dataclasses.rst | 22 +++++++++++----------- Doc/library/functools.rst | 5 ++--- Doc/library/typing.rst | 16 ++++++++-------- Doc/library/warnings.rst | 2 +- Doc/reference/datamodel.rst | 4 ++-- Doc/whatsnew/2.7.rst | 4 ++-- Doc/whatsnew/3.10.rst | 4 ++-- Misc/NEWS.d/3.10.0b1.rst | 6 +++--- Misc/NEWS.d/3.11.0a1.rst | 2 +- Misc/NEWS.d/3.11.0b1.rst | 2 +- Misc/NEWS.d/3.14.0a1.rst | 2 +- 12 files changed, 36 insertions(+), 37 deletions(-) diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index 3d126bc83f5842..e6daccb91f2b4e 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -336,7 +336,7 @@ Collections Abstract Base Classes -- Detailed Descriptions .. note:: In CPython, generator-based coroutines (:term:`generators ` - decorated with :func:`@types.coroutine `) are + decorated with :deco:`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. @@ -354,7 +354,7 @@ Collections Abstract Base Classes -- Detailed Descriptions .. note:: In CPython, generator-based coroutines (:term:`generators ` - decorated with :func:`@types.coroutine `) are + decorated with :deco:`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. diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index ca432f2768a127..cff36e258224d3 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -317,7 +317,7 @@ Module contents :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 :deco:`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:: @@ -427,7 +427,7 @@ Module contents :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 `. + the same meaning as they do in :deco:`dataclass`. If *module* is defined, the :attr:`!__module__` attribute of the dataclass is set to that value. @@ -435,12 +435,12 @@ Module contents The *decorator* parameter is a callable that will be used to create the dataclass. It should take the class object as a first argument and the same keyword arguments - as :func:`@dataclass `. By default, the :func:`@dataclass ` + as :deco:`dataclass`. By default, the :deco:`dataclass` function is used. This function is not strictly required, because any Python mechanism for creating a new class with :attr:`~object.__annotations__` can - then apply the :func:`@dataclass ` function to convert that class to + then apply the :deco:`dataclass` function to convert that class to a dataclass. This function is provided as a convenience. For example:: @@ -569,7 +569,7 @@ 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 +The :meth:`~object.__init__` method generated by :deco:`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:: @@ -599,7 +599,7 @@ parameters to :meth:`!__post_init__`. Also see the warning about how Class variables --------------- -One of the few places where :func:`@dataclass ` actually inspects the type +One of the few places where :deco:`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 :data:`typing.ClassVar`. If a field is a ``ClassVar``, it is excluded @@ -612,7 +612,7 @@ module-level :func:`fields` function. Init-only variables ------------------- -Another place where :func:`@dataclass ` inspects a type annotation is to +Another place where :deco:`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 :class:`InitVar`. If a field is an :class:`InitVar`, it is considered a pseudo-field called an init-only @@ -646,7 +646,7 @@ Frozen instances ---------------- It is not possible to create truly immutable Python objects. However, -by passing ``frozen=True`` to the :func:`@dataclass ` decorator you can +by passing ``frozen=True`` to the :deco:`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. @@ -662,7 +662,7 @@ must use :meth:`!object.__setattr__`. Inheritance ----------- -When the dataclass is being created by the :func:`@dataclass ` decorator, +When the dataclass is being created by the :deco:`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. @@ -786,7 +786,7 @@ 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 +:deco:`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. @@ -820,7 +820,7 @@ default value have the following special behaviors: :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, :func:`@dataclass ` +* To determine whether a field contains a default value, :deco:`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 diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index beec9b942afc0f..f8ffb3f41d1210 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -690,7 +690,7 @@ The :mod:`functools` module defines the following functions: return not arg ``@singledispatchmethod`` supports nesting with other decorators such as - :func:`@classmethod`. Note that to allow for + :deco:`classmethod`. Note that to allow for ``dispatcher.register``, ``singledispatchmethod`` must be the *outer most* decorator. Here is the ``Negator`` class with the ``neg`` methods bound to the class, rather than an instance of the class:: @@ -712,8 +712,7 @@ The :mod:`functools` module defines the following functions: return not arg The same pattern can be used for other similar decorators: - :func:`@staticmethod`, - :func:`@abstractmethod`, and others. + :deco:`staticmethod`, :deco:`~abc.abstractmethod`, and others. .. versionadded:: 3.8 diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index cf979205ff2cee..313cb6b5bcf1c4 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1390,7 +1390,7 @@ These can be used as types in annotations. They all support subscription using Using ``Annotated[T, x]`` as an annotation still allows for static typechecking of ``T``, as type checkers will simply ignore the metadata ``x``. In this way, ``Annotated`` differs from the - :func:`@no_type_check ` decorator, which can also be used for + :deco:`no_type_check` decorator, which can also be used for adding annotations outside the scope of the typing system, but completely disables typechecking for a function or class. @@ -2835,7 +2835,7 @@ Protocols --------- The following protocols are provided by the :mod:`!typing` module. All are decorated -with :func:`@runtime_checkable `. +with :deco:`runtime_checkable`. .. class:: SupportsAbs @@ -3016,7 +3016,7 @@ Functions and decorators The presence of ``@dataclass_transform()`` tells a static type checker that the decorated object performs runtime "magic" that transforms a class in a similar way to - :func:`@dataclasses.dataclass `. + :deco:`dataclasses.dataclass`. Example usage with a decorator function: @@ -3054,14 +3054,14 @@ Functions and decorators The ``CustomerModel`` classes defined above will be treated by type checkers similarly to classes created with - :func:`@dataclasses.dataclass `. + :deco:`dataclasses.dataclass`. For example, type checkers will assume these classes have ``__init__`` methods that accept ``id`` and ``name``. The decorated class, metaclass, or function may accept the following bool arguments which type checkers will assume have the same effect as they would have on the - :func:`@dataclasses.dataclass` decorator: ``init``, + :deco:`dataclasses.dataclass` decorator: ``init``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``, ``match_args``, ``kw_only``, and ``slots``. It must be possible for the value of these arguments (``True`` or ``False``) to be statically evaluated. @@ -3189,12 +3189,12 @@ Functions and decorators .. function:: get_overloads(func) - Return a sequence of :func:`@overload `-decorated definitions for + Return a sequence of :deco:`overload`-decorated definitions for *func*. *func* is the function object for the implementation of the overloaded function. For example, given the definition of ``process`` in - the documentation for :func:`@overload `, + the documentation for :deco:`overload`, ``get_overloads(process)`` will return a sequence of three function objects for the three defined overloads. If called on a function with no overloads, ``get_overloads()`` returns an empty sequence. @@ -3351,7 +3351,7 @@ Introspection helpers 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 + * If :deco:`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 diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index b6392450a1722f..006d45b1bc72a4 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -586,7 +586,7 @@ Available Functions 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 + must be after the :deco:`~typing.overload` decorator for the attribute to exist on the overload as returned by :func:`typing.get_overloads`. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index b1e4c2474b6bc9..c37ed4695d0aba 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2558,7 +2558,7 @@ instance dictionary. In contrast, non-data descriptors can be overridden by instances. Python methods (including those decorated with -:func:`@staticmethod ` and :func:`@classmethod `) are +:deco:`staticmethod` and :deco:`classmethod`) are implemented as non-data descriptors. Accordingly, instances can redefine and override methods. This allows individual instances to acquire behaviors that differ from other instances of the same class. @@ -2991,7 +2991,7 @@ class method ``__class_getitem__()``. When defined on a class, ``__class_getitem__()`` is automatically a class method. As such, there is no need for it to be decorated with - :func:`@classmethod` when it is defined. + :deco:`classmethod` when it is defined. The purpose of *__class_getitem__* diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index bcc5a3d56903d2..09feb185b82ea7 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -858,8 +858,8 @@ Some smaller changes made to the core Python language are: .. XXX bytearray doesn't seem to be documented -* When using :class:`@classmethod ` and - :class:`@staticmethod ` to wrap +* When using :deco:`classmethod` and + :deco:`staticmethod` to wrap methods as class or static methods, the wrapper object now exposes the wrapped function as their :attr:`~method.__func__` attribute. diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ab75833b439e6f..d90a18076e5488 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -847,8 +847,8 @@ Other Language Changes respectively. (Contributed by Joshua Bronson, Daniel Pope, and Justin Wang in :issue:`31861`.) -* Static methods (:func:`@staticmethod `) and class methods - (:func:`@classmethod `) now inherit the method attributes +* Static methods (:deco:`staticmethod`) and class methods + (:deco:`classmethod`) now inherit the method attributes (``__module__``, ``__name__``, ``__qualname__``, ``__doc__``, ``__annotations__``) and have a new ``__wrapped__`` attribute. Moreover, static methods are now callable as regular functions. diff --git a/Misc/NEWS.d/3.10.0b1.rst b/Misc/NEWS.d/3.10.0b1.rst index 406a5d7853edc0..5bc78b9007afa8 100644 --- a/Misc/NEWS.d/3.10.0b1.rst +++ b/Misc/NEWS.d/3.10.0b1.rst @@ -402,8 +402,8 @@ the heap. Should speed up dispatch in the interpreter. .. nonce: eUn4p5 .. section: Core and Builtins -Static methods (:func:`@staticmethod `) and class methods -(:func:`@classmethod `) now inherit the method attributes +Static methods (:deco:`staticmethod`) and class methods +(:deco:`classmethod`) now inherit the method attributes (``__module__``, ``__name__``, ``__qualname__``, ``__doc__``, ``__annotations__``) and have a new ``__wrapped__`` attribute. Patch by Victor Stinner. @@ -454,7 +454,7 @@ file locations. .. nonce: VSF3vg .. section: Core and Builtins -Static methods (:func:`@staticmethod `) are now callable as +Static methods (:deco:`staticmethod`) are now callable as regular functions. Patch by Victor Stinner. .. diff --git a/Misc/NEWS.d/3.11.0a1.rst b/Misc/NEWS.d/3.11.0a1.rst index ef6547b38a2895..f58d6b657e9b95 100644 --- a/Misc/NEWS.d/3.11.0a1.rst +++ b/Misc/NEWS.d/3.11.0a1.rst @@ -2953,7 +2953,7 @@ support for Metadata 2.2. .. nonce: xTUyyX .. section: Library -Remove the :func:`@asyncio.coroutine ` :term:`decorator` +Remove the :deco:`asyncio.coroutine` :term:`decorator` enabling legacy generator-based coroutines to be compatible with async/await code; remove :class:`asyncio.coroutines.CoroWrapper` used for wrapping legacy coroutine objects in the debug mode. The decorator has been diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst index c3a1942b881ad4..7b8b983ebf951e 100644 --- a/Misc/NEWS.d/3.11.0b1.rst +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -664,7 +664,7 @@ for :func:`os.fcopyfile` available in macOs. .. nonce: l1p7CJ .. section: Library -For :func:`@dataclass `, add *weakref_slot*. +For :deco:`~dataclasses.dataclass`, add *weakref_slot*. The new parameter defaults to ``False``. If true, and if ``slots=True``, add a slot named ``"__weakref__"``, which will allow instances to be weakref'd. Contributed by Eric V. Smith diff --git a/Misc/NEWS.d/3.14.0a1.rst b/Misc/NEWS.d/3.14.0a1.rst index 07f2f521ece5b9..305a0b65b98e6a 100644 --- a/Misc/NEWS.d/3.14.0a1.rst +++ b/Misc/NEWS.d/3.14.0a1.rst @@ -1999,7 +1999,7 @@ with an escape character. .. nonce: vi2bP- .. section: Library -:func:`@warnings.deprecated ` now copies the coroutine +:deco:`warnings.deprecated` now copies the coroutine status of functions and methods so that :func:`inspect.iscoroutinefunction` returns the correct result. From 572e4332cf8f2fec45762118911ad66c19cff6b4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:14:16 +0200 Subject: [PATCH 1016/1674] [3.14] gh-135629: rewrite language reference section on except* to improve clarity (GH-136150) (#139059) gh-135629: rewrite language reference section on except* to improve clarity (GH-136150) (cherry picked from commit a651ec95241c25161d525499a739f01bfe527895) Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> --- Doc/reference/compound_stmts.rst | 60 +++++++++++++++++--------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 6f79c829deade5..b55ced574e4d38 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -335,15 +335,29 @@ stored in the :mod:`sys` module is reset to its previous value:: :keyword:`!except*` clause -------------------------- -The :keyword:`!except*` clause(s) are used for handling -:exc:`ExceptionGroup`\s. The exception type for matching is interpreted as in -the case of :keyword:`except`, but in the case of exception groups we can have -partial matches when the type matches some of the exceptions in the group. -This means that multiple :keyword:`!except*` clauses can execute, -each handling part of the exception group. -Each clause executes at most once and handles an exception group -of all matching exceptions. Each exception in the group is handled by at most -one :keyword:`!except*` clause, the first that matches it. :: +The :keyword:`!except*` clause(s) specify one or more handlers for groups of +exceptions (:exc:`BaseExceptionGroup` instances). A :keyword:`try` statement +can have either :keyword:`except` or :keyword:`!except*` clauses, but not both. +The exception type for matching is mandatory in the case of :keyword:`!except*`, +so ``except*:`` is a syntax error. The type is interpreted as in the case of +:keyword:`!except`, but matching is performed on the exceptions contained in the +group that is being handled. An :exc:`TypeError` is raised if a matching +type is a subclass of :exc:`!BaseExceptionGroup`, because that would have +ambiguous semantics. + +When an exception group is raised in the try block, each :keyword:`!except*` +clause splits (see :meth:`~BaseExceptionGroup.split`) it into the subgroups +of matching and non-matching exceptions. If the matching subgroup is not empty, +it becomes the handled exception (the value returned from :func:`sys.exception`) +and assigned to the target of the :keyword:`!except*` clause (if there is one). +Then, the body of the :keyword:`!except*` clause executes. If the non-matching +subgroup is not empty, it is processed by the next :keyword:`!except*` in the +same manner. This continues until all exceptions in the group have been matched, +or the last :keyword:`!except*` clause has run. + +After all :keyword:`!except*` clauses execute, the group of unhandled exceptions +is merged with any exceptions that were raised or re-raised from within +:keyword:`!except*` clauses. This merged exception group propagates on.:: >>> try: ... raise ExceptionGroup("eg", @@ -356,22 +370,18 @@ one :keyword:`!except*` clause, the first that matches it. :: caught with nested (TypeError(2),) caught with nested (OSError(3), OSError(4)) + Exception Group Traceback (most recent call last): - | File "", line 2, in - | ExceptionGroup: eg + | File "", line 2, in + | raise ExceptionGroup("eg", + | [ValueError(1), TypeError(2), OSError(3), OSError(4)]) + | ExceptionGroup: eg (1 sub-exception) +-+---------------- 1 ---------------- | ValueError: 1 +------------------------------------ - -Any remaining exceptions that were not handled by any :keyword:`!except*` -clause are re-raised at the end, along with all exceptions that were -raised from within the :keyword:`!except*` clauses. If this list contains -more than one exception to reraise, they are combined into an exception -group. - -If the raised exception is not an exception group and its type matches -one of the :keyword:`!except*` clauses, it is caught and wrapped by an -exception group with an empty message string. :: +If the exception raised from the :keyword:`try` block is not an exception group +and its type matches one of the :keyword:`!except*` clauses, it is caught and +wrapped by an exception group with an empty message string. This ensures that the +type of the target ``e`` is consistently :exc:`BaseExceptionGroup`:: >>> try: ... raise BlockingIOError @@ -380,13 +390,7 @@ exception group with an empty message string. :: ... ExceptionGroup('', (BlockingIOError())) -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`. -The :keyword:`break`, :keyword:`continue`, and :keyword:`return` statements +:keyword:`break`, :keyword:`continue` and :keyword:`return` cannot appear in an :keyword:`!except*` clause. From 94f57ac2062c2a8130171cbf563e06db5815047f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:14:40 +0200 Subject: [PATCH 1017/1674] [3.14] gh-131885: Use positional-only markers for ``max()`` and ``min()`` (GH-131868) (#137656) gh-131885: Use positional-only markers for ``max()`` and ``min()`` (GH-131868) (cherry picked from commit dd079db4b96fa474b8e6d71ae9db662c4ce28caf) Co-authored-by: Evan Kohilas --- Doc/library/functions.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 4fb0414c89683f..f28c1a5ad4a326 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1217,9 +1217,9 @@ are always available. They are listed here in alphabetical order. Added the *strict* parameter. -.. function:: max(iterable, *, key=None) - max(iterable, *, default, key=None) - max(arg1, arg2, *args, key=None) +.. function:: max(iterable, /, *, key=None) + max(iterable, /, *, default, key=None) + max(arg1, arg2, /, *args, key=None) Return the largest item in an iterable or the largest of two or more arguments. @@ -1255,9 +1255,9 @@ are always available. They are listed here in alphabetical order. :ref:`typememoryview` for more information. -.. function:: min(iterable, *, key=None) - min(iterable, *, default, key=None) - min(arg1, arg2, *args, key=None) +.. function:: min(iterable, /, *, key=None) + min(iterable, /, *, default, key=None) + min(arg1, arg2, /, *args, key=None) Return the smallest item in an iterable or the smallest of two or more arguments. From 134586aaf30d649c5d47857a70cb91135557a355 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:15:05 +0200 Subject: [PATCH 1018/1674] [3.14] gh-137390: Add missing line continuation character in configure.ac (GH-137391) (#137394) gh-137390: Add missing line continuation character in configure.ac (GH-137391) (cherry picked from commit 001461a29235216eb9c8295c66c323fdd34a7d59) Co-authored-by: markmcclain Co-authored-by: Erlend E. Aasland --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8340319c7e63f2..9412e3614c4206 100644 --- a/configure.ac +++ b/configure.ac @@ -5228,7 +5228,7 @@ AC_CHECK_FUNCS([ \ posix_spawn_file_actions_addclosefrom_np \ pread preadv preadv2 process_vm_readv \ pthread_cond_timedwait_relative_np pthread_condattr_setclock pthread_init \ - pthread_kill pthread_get_name_np pthread_getname_np pthread_set_name_np + pthread_kill pthread_get_name_np pthread_getname_np pthread_set_name_np \ pthread_setname_np pthread_getattr_np \ ptsname ptsname_r pwrite pwritev pwritev2 readlink readlinkat readv realpath renameat \ rtpSpawn sched_get_priority_max sched_rr_get_interval sched_setaffinity \ From 058c2770a231f9adc5da01e7fc47786db638f0f4 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Tue, 7 Oct 2025 21:15:22 +0300 Subject: [PATCH 1019/1674] [3.14] gh-122450: Expand documentation for ``Rational`` and ``Fraction`` (GH-136800) (#137363) (cherry picked from commit b266fbc9ecd25d08ab572ecb91913e86b6ddc75e) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Serhiy Storchaka --- Doc/library/fractions.rst | 11 ++++++----- Doc/library/numbers.rst | 4 ++-- Lib/numbers.py | 11 ++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 392b6d40e861fb..d6d1c7a461c51c 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -14,8 +14,8 @@ The :mod:`fractions` module provides support for rational number arithmetic. -A Fraction instance can be constructed from a pair of integers, from -another rational number, or from a string. +A Fraction instance can be constructed from a pair of rational numbers, from +a single number, or from a string. .. index:: single: as_integer_ratio() @@ -25,8 +25,8 @@ another rational number, or from a string. The first version requires that *numerator* and *denominator* are instances of :class:`numbers.Rational` and returns a new :class:`Fraction` instance - with value ``numerator/denominator``. If *denominator* is ``0``, it - raises a :exc:`ZeroDivisionError`. + with a value equal to ``numerator/denominator``. + If *denominator* is zero, it raises a :exc:`ZeroDivisionError`. The second version requires that *number* is an instance of :class:`numbers.Rational` or has the :meth:`!as_integer_ratio` method @@ -125,7 +125,8 @@ another rational number, or from a string. .. attribute:: denominator - Denominator of the Fraction in lowest term. + Denominator of the Fraction in lowest terms. + Guaranteed to be positive. .. method:: as_integer_ratio() diff --git a/Doc/library/numbers.rst b/Doc/library/numbers.rst index 681d0b76f2a14b..57b35017072c97 100644 --- a/Doc/library/numbers.rst +++ b/Doc/library/numbers.rst @@ -69,11 +69,11 @@ The numeric tower .. attribute:: numerator - Abstract. + Abstract. The numerator of this rational number. .. attribute:: denominator - Abstract. + Abstract. The denominator of this rational number. .. class:: Integral diff --git a/Lib/numbers.py b/Lib/numbers.py index a2913e32cfada7..37fddb8917727b 100644 --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -290,18 +290,27 @@ def conjugate(self): class Rational(Real): - """.numerator and .denominator should be in lowest terms.""" + """To Real, Rational adds numerator and denominator properties. + + The numerator and denominator values should be in lowest terms, + with a positive denominator. + """ __slots__ = () @property @abstractmethod def numerator(self): + """The numerator of a rational number in lowest terms.""" raise NotImplementedError @property @abstractmethod def denominator(self): + """The denominator of a rational number in lowest terms. + + This denominator should be positive. + """ raise NotImplementedError # Concrete implementation of Real's conversion to float. From d76a0ce4d0e7918cfb6add99e242a3be5f09b35d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:15:33 +0200 Subject: [PATCH 1020/1674] [3.14] gh-137025: Include ``python.worker.mjs`` in the Emscripten Web Example (GH-137236) (#137272) gh-137025: Include ``python.worker.mjs`` in the Emscripten Web Example (GH-137236) (cherry picked from commit d5191ba99b8f7723cbdb9b7a07ef8a3eef6524c1) Co-authored-by: adam j hartz --- Makefile.pre.in | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index ba039794c88b01..ca536d32a61167 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1109,6 +1109,10 @@ web_example/index.html: $(WEBEX_DIR)/index.html @mkdir -p web_example @cp $< $@ +web_example/python.worker.mjs: $(WEBEX_DIR)/python.worker.mjs + @mkdir -p web_example + @cp $< $@ + web_example/server.py: $(WEBEX_DIR)/server.py @mkdir -p web_example @cp $< $@ @@ -1126,7 +1130,7 @@ web_example/python.mjs web_example/python.wasm: $(BUILDPYTHON) cp python.wasm web_example/python.wasm .PHONY: web_example -web_example: web_example/python.mjs web_example/index.html web_example/server.py web_example/$(ZIP_STDLIB) +web_example: web_example/python.mjs web_example/python.worker.mjs web_example/index.html web_example/server.py web_example/$(ZIP_STDLIB) WEBEX2=web_example_pyrepl_jspi WEBEX2_DIR=$(EMSCRIPTEN_DIR)/$(WEBEX2)/ From f38a0155523c0c72a8bc9ca57117300ca44e591a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:16:20 +0200 Subject: [PATCH 1021/1674] [3.14] gh-75989: TarFile.extractall and TarFile.extract now overwrite symlinks when extracting hardlinks (GH-137316) (GH-139705) (cherry picked from commit 481d5b54556e97fed4cf1f48a2ccbc7b4f7aaa42) Co-authored-by: Alexander Urieles --- Lib/tarfile.py | 3 ++ Lib/test/test_tarfile.py | 51 +++++++++++++++++++ ...5-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst | 3 ++ 3 files changed, 57 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 7f5cffc81c2aef..7dff0122da7775 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2723,6 +2723,9 @@ def makelink_with_filter(self, tarinfo, targetpath, return else: if os.path.exists(tarinfo._link_target): + if os.path.lexists(targetpath): + # Avoid FileExistsError on following os.link. + os.unlink(targetpath) os.link(tarinfo._link_target, targetpath) return except symlink_exception: diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 28914df6b010d0..b23ff34bc327c6 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -841,6 +841,57 @@ def test_next_on_empty_tarfile(self): with tarfile.open(fileobj=fd, mode="r") as tf: self.assertEqual(tf.next(), None) + def _setup_symlink_to_target(self, temp_dirpath): + target_filepath = os.path.join(temp_dirpath, "target") + ustar_dirpath = os.path.join(temp_dirpath, "ustar") + hardlink_filepath = os.path.join(ustar_dirpath, "lnktype") + with open(target_filepath, "wb") as f: + f.write(b"target") + os.makedirs(ustar_dirpath) + os.symlink(target_filepath, hardlink_filepath) + return target_filepath, hardlink_filepath + + def _assert_on_file_content(self, filepath, digest): + with open(filepath, "rb") as f: + data = f.read() + self.assertEqual(sha256sum(data), digest) + + @unittest.skipUnless( + hasattr(os, "link"), "Missing hardlink implementation" + ) + @os_helper.skip_unless_symlink + def test_extract_hardlink_on_symlink(self): + """ + This test verifies that extracting a hardlink will not follow an + existing symlink after a FileExistsError on os.link. + """ + with os_helper.temp_dir() as DIR: + target_filepath, hardlink_filepath = self._setup_symlink_to_target(DIR) + with tarfile.open(tarname, encoding="iso8859-1") as tar: + tar.extract("ustar/regtype", DIR, filter="data") + tar.extract("ustar/lnktype", DIR, filter="data") + self._assert_on_file_content(target_filepath, sha256sum(b"target")) + self._assert_on_file_content(hardlink_filepath, sha256_regtype) + + @unittest.skipUnless( + hasattr(os, "link"), "Missing hardlink implementation" + ) + @os_helper.skip_unless_symlink + def test_extractall_hardlink_on_symlink(self): + """ + This test verifies that extracting a hardlink will not follow an + existing symlink after a FileExistsError on os.link. + """ + with os_helper.temp_dir() as DIR: + target_filepath, hardlink_filepath = self._setup_symlink_to_target(DIR) + with tarfile.open(tarname, encoding="iso8859-1") as tar: + tar.extractall( + DIR, members=["ustar/regtype", "ustar/lnktype"], filter="data", + ) + self._assert_on_file_content(target_filepath, sha256sum(b"target")) + self._assert_on_file_content(hardlink_filepath, sha256_regtype) + + class MiscReadTest(MiscReadTestBase, unittest.TestCase): test_fail_comp = None diff --git a/Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst b/Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst new file mode 100644 index 00000000000000..00b15503b50ba3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst @@ -0,0 +1,3 @@ +:func:`tarfile.TarFile.extractall` and :func:`tarfile.TarFile.extract` now +overwrite symlinks when extracting hardlinks. +(Contributed by Alexander Enrique Urieles Nieto in :gh:`75989`.) From 5b64b596186806bb68c6c9f62e34ea1c2b599442 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:16:55 +0200 Subject: [PATCH 1022/1674] [3.14] gh-138854: Skip test_script_shadowing_stdlib_cwd_failure on AIX (GH-138855) (GH-139674) (cherry picked from commit 171f787a297ec4b02cfe8b3ebab8374018391f20) Co-authored-by: Furkan Onder --- Lib/test/test_import/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index abbd5f1ed5f12f..b71a36ec2f7aab 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -1187,6 +1187,7 @@ class substr(str): @unittest.skipIf(sys.platform == 'win32', 'Cannot delete cwd on Windows') @unittest.skipIf(sys.platform == 'sunos5', 'Cannot delete cwd on Solaris/Illumos') + @unittest.skipIf(sys.platform.startswith('aix'), 'Cannot delete cwd on AIX') def test_script_shadowing_stdlib_cwd_failure(self): with os_helper.temp_dir() as tmp: subtmp = os.path.join(tmp, "subtmp") From 070993b8ad26e6dd0f97d07db19d1400aa613a47 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:18:15 +0200 Subject: [PATCH 1023/1674] [3.14] gh-135729: Store reference to globals in `Interpreter._decref` (GH-139104) (GH-139112) * gh-135729: Store reference to globals in `Interpreter._decref` (GH-139104) (cherry picked from commit 571210b8f34a54922e5eb11d65060d7a77b8bdf0) Co-authored-by: Peter Bierma --- Lib/concurrent/interpreters/__init__.py | 9 +++++++-- Lib/test/test_interpreters/test_api.py | 15 +++++++++++++++ ...2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst diff --git a/Lib/concurrent/interpreters/__init__.py b/Lib/concurrent/interpreters/__init__.py index aa46a2b37a48d5..ea4147ee9a25da 100644 --- a/Lib/concurrent/interpreters/__init__.py +++ b/Lib/concurrent/interpreters/__init__.py @@ -149,12 +149,17 @@ def __del__(self): def __reduce__(self): return (type(self), (self._id,)) - def _decref(self): + # gh-135729: Globals might be destroyed by the time this is called, so we + # need to keep references ourself + def _decref(self, *, + InterpreterNotFoundError=InterpreterNotFoundError, + _interp_decref=_interpreters.decref, + ): if not self._ownsref: return self._ownsref = False try: - _interpreters.decref(self._id) + _interp_decref(self._id) except InterpreterNotFoundError: pass diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index 3fee98ea93e637..c5a1743e7fdedf 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -419,6 +419,21 @@ def test_pickle(self): unpickled = pickle.loads(data) self.assertEqual(unpickled, interp) + @support.requires_subprocess() + @force_not_colorized + def test_cleanup_in_repl(self): + # GH-135729: Using a subinterpreter in the REPL would lead to an unraisable + # exception during finalization + repl = script_helper.spawn_python("-i") + script = b"""if True: + from concurrent import interpreters + interpreters.create() + exit()""" + stdout, stderr = repl.communicate(script) + self.assertIsNone(stderr) + self.assertNotIn(b"Traceback", stdout) + + class TestInterpreterIsRunning(TestBase): diff --git a/Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst b/Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst new file mode 100644 index 00000000000000..1777839a1bf633 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst @@ -0,0 +1,2 @@ +Fix unraisable exception during finalization when using +:mod:`concurrent.interpreters` in the REPL. From bf397e272c2bee639c3ba0208c221f7dd9447bb6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:18:23 +0200 Subject: [PATCH 1024/1674] [3.14] gh-133467: fix data race in `type_set_name` (GH-137302) (#137303) gh-133467: fix data race in `type_set_name` (GH-137302) Fix data race in `type_set_name` by assigning name under stop the world pause making it thread safe in free-threading. (cherry picked from commit e99bc7fd44bbbf2464c37d5a57777ac0e1264c37) Co-authored-by: Kumar Aditya --- Lib/test/test_free_threading/test_type.py | 14 ++++++++++++++ Objects/typeobject.c | 10 ++++++++-- Tools/tsan/suppressions_free_threading.txt | 2 -- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_free_threading/test_type.py b/Lib/test/test_free_threading/test_type.py index ae996e7db3c7fd..2d995751005d71 100644 --- a/Lib/test/test_free_threading/test_type.py +++ b/Lib/test/test_free_threading/test_type.py @@ -127,6 +127,20 @@ class ClassB(Base): obj.__class__ = ClassB + def test_name_change(self): + class Foo: + pass + + def writer(): + for _ in range(1000): + Foo.__name__ = 'Bar' + + def reader(): + for _ in range(1000): + Foo.__name__ + + self.run_one(writer, reader) + def run_one(self, writer_func, reader_func): barrier = threading.Barrier(NTHREADS) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 06b4998507ce9f..28451fee7ec10f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1434,9 +1434,13 @@ type_set_name(PyObject *tp, PyObject *value, void *Py_UNUSED(closure)) return -1; } + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyEval_StopTheWorld(interp); type->tp_name = tp_name; - Py_SETREF(((PyHeapTypeObject*)type)->ht_name, Py_NewRef(value)); - + PyObject *old_name = ((PyHeapTypeObject*)type)->ht_name; + ((PyHeapTypeObject*)type)->ht_name = Py_NewRef(value); + _PyEval_StartTheWorld(interp); + Py_DECREF(old_name); return 0; } @@ -10406,9 +10410,11 @@ slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type) get = _PyType_LookupRef(tp, &_Py_ID(__get__)); if (get == NULL) { +#ifndef Py_GIL_DISABLED /* Avoid further slowdowns */ if (tp->tp_descr_get == slot_tp_descr_get) tp->tp_descr_get = NULL; +#endif return Py_NewRef(self); } if (obj == NULL) diff --git a/Tools/tsan/suppressions_free_threading.txt b/Tools/tsan/suppressions_free_threading.txt index 580757ddd75033..c10af91faae17c 100644 --- a/Tools/tsan/suppressions_free_threading.txt +++ b/Tools/tsan/suppressions_free_threading.txt @@ -50,7 +50,5 @@ race:PyObject_Realloc # gh-133467. Some of these could be hard to trigger. race_top:update_one_slot -race_top:slot_tp_descr_get -race_top:type_set_name race_top:set_tp_bases race_top:type_set_bases_unlocked From 23cc8f789d8366573cf12c4495b5a4c9afa64005 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Tue, 7 Oct 2025 23:48:28 +0530 Subject: [PATCH 1025/1674] [3.14] gh-132551: make `io.BytesIO` thread safe (GH-132616) (#138551) * [3.14] gh-132551: make `io.BytesIO` thread safe (GH-132616) (cherry picked from commit 5dd3a3a58cca4798ebfc2edd673211067453e81e) Co-authored-by: Tomasz Pytel Co-authored-by: Kumar Aditya --- Lib/test/test_free_threading/test_io.py | 109 +++++++ ...-04-16-21-02-57.gh-issue-132551.Psa7pL.rst | 1 + Modules/_io/bytesio.c | 291 ++++++++++++------ Modules/_io/clinic/bytesio.c.h | 106 ++++++- 4 files changed, 399 insertions(+), 108 deletions(-) create mode 100644 Lib/test/test_free_threading/test_io.py create mode 100644 Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst diff --git a/Lib/test/test_free_threading/test_io.py b/Lib/test/test_free_threading/test_io.py new file mode 100644 index 00000000000000..4e903928b49a97 --- /dev/null +++ b/Lib/test/test_free_threading/test_io.py @@ -0,0 +1,109 @@ +import threading +from unittest import TestCase +from test.support import threading_helper +from random import randint +from io import BytesIO +from sys import getsizeof + + +class TestBytesIO(TestCase): + # Test pretty much everything that can break under free-threading. + # Non-deterministic, but at least one of these things will fail if + # BytesIO object is not free-thread safe. + + def check(self, funcs, *args): + barrier = threading.Barrier(len(funcs)) + threads = [] + + for func in funcs: + thread = threading.Thread(target=func, args=(barrier, *args)) + + threads.append(thread) + + with threading_helper.start_threads(threads): + pass + + @threading_helper.requires_working_threading() + @threading_helper.reap_threads + def test_free_threading(self): + """Test for segfaults and aborts.""" + + def write(barrier, b, *ignore): + barrier.wait() + try: b.write(b'0' * randint(100, 1000)) + except ValueError: pass # ignore write fail to closed file + + def writelines(barrier, b, *ignore): + barrier.wait() + b.write(b'0\n' * randint(100, 1000)) + + def truncate(barrier, b, *ignore): + barrier.wait() + try: b.truncate(0) + except BufferError: pass # ignore exported buffer + + def read(barrier, b, *ignore): + barrier.wait() + b.read() + + def read1(barrier, b, *ignore): + barrier.wait() + b.read1() + + def readline(barrier, b, *ignore): + barrier.wait() + b.readline() + + def readlines(barrier, b, *ignore): + barrier.wait() + b.readlines() + + def readinto(barrier, b, into, *ignore): + barrier.wait() + b.readinto(into) + + def close(barrier, b, *ignore): + barrier.wait() + b.close() + + def getvalue(barrier, b, *ignore): + barrier.wait() + b.getvalue() + + def getbuffer(barrier, b, *ignore): + barrier.wait() + b.getbuffer() + + def iter(barrier, b, *ignore): + barrier.wait() + list(b) + + def getstate(barrier, b, *ignore): + barrier.wait() + b.__getstate__() + + def setstate(barrier, b, st, *ignore): + barrier.wait() + b.__setstate__(st) + + def sizeof(barrier, b, *ignore): + barrier.wait() + getsizeof(b) + + self.check([write] * 10, BytesIO()) + self.check([writelines] * 10, BytesIO()) + self.check([write] * 10 + [truncate] * 10, BytesIO()) + self.check([truncate] + [read] * 10, BytesIO(b'0\n'*204800)) + self.check([truncate] + [read1] * 10, BytesIO(b'0\n'*204800)) + self.check([truncate] + [readline] * 10, BytesIO(b'0\n'*20480)) + self.check([truncate] + [readlines] * 10, BytesIO(b'0\n'*20480)) + self.check([truncate] + [readinto] * 10, BytesIO(b'0\n'*204800), bytearray(b'0\n'*204800)) + self.check([close] + [write] * 10, BytesIO()) + self.check([truncate] + [getvalue] * 10, BytesIO(b'0\n'*204800)) + self.check([truncate] + [getbuffer] * 10, BytesIO(b'0\n'*204800)) + self.check([truncate] + [iter] * 10, BytesIO(b'0\n'*20480)) + self.check([truncate] + [getstate] * 10, BytesIO(b'0\n'*204800)) + self.check([truncate] + [setstate] * 10, BytesIO(b'0\n'*204800), (b'123', 0, None)) + self.check([truncate] + [sizeof] * 10, BytesIO(b'0\n'*204800)) + + # no tests for seek or tell because they don't break anything diff --git a/Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst b/Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst new file mode 100644 index 00000000000000..c8743d49ca01d2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst @@ -0,0 +1 @@ +Make :class:`io.BytesIO` safe in :term:`free-threaded ` build. diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 400edbce55c4c8..72f305d8a61f77 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -1,9 +1,11 @@ #include "Python.h" +#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION() #include "pycore_object.h" #include "pycore_sysmodule.h" // _PySys_GetSizeOf() #include "pycore_weakref.h" // FT_CLEAR_WEAKREFS() +#include "pycore_pyatomic_ft_wrappers.h" -#include // offsetof() +#include // offsetof() #include "_iomodule.h" /*[clinic input] @@ -51,7 +53,7 @@ check_closed(bytesio *self) static int check_exports(bytesio *self) { - if (self->exports > 0) { + if (FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) > 0) { PyErr_SetString(PyExc_BufferError, "Existing exports of data: object cannot be re-sized"); return 1; @@ -69,15 +71,17 @@ check_exports(bytesio *self) return NULL; \ } -#define SHARED_BUF(self) (Py_REFCNT((self)->buf) > 1) +#define SHARED_BUF(self) (!_PyObject_IsUniquelyReferenced((self)->buf)) /* Internal routine to get a line from the buffer of a BytesIO object. Returns the length between the current position to the next newline character. */ static Py_ssize_t -scan_eol(bytesio *self, Py_ssize_t len) +scan_eol_lock_held(bytesio *self, Py_ssize_t len) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self); + const char *start, *n; Py_ssize_t maxlen; @@ -110,11 +114,13 @@ scan_eol(bytesio *self, Py_ssize_t len) The caller should ensure that the 'size' argument is non-negative and not lesser than self->string_size. Returns 0 on success, -1 otherwise. */ static int -unshare_buffer(bytesio *self, size_t size) +unshare_buffer_lock_held(bytesio *self, size_t size) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self); + PyObject *new_buf; assert(SHARED_BUF(self)); - assert(self->exports == 0); + assert(FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) == 0); assert(size >= (size_t)self->string_size); new_buf = PyBytes_FromStringAndSize(NULL, size); if (new_buf == NULL) @@ -129,10 +135,12 @@ unshare_buffer(bytesio *self, size_t size) The caller should ensure that the 'size' argument is non-negative. Returns 0 on success, -1 otherwise. */ static int -resize_buffer(bytesio *self, size_t size) +resize_buffer_lock_held(bytesio *self, size_t size) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self); + assert(self->buf != NULL); - assert(self->exports == 0); + assert(FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) == 0); /* Here, unsigned types are used to avoid dealing with signed integer overflow, which is undefined in C. */ @@ -161,7 +169,7 @@ resize_buffer(bytesio *self, size_t size) } if (SHARED_BUF(self)) { - if (unshare_buffer(self, alloc) < 0) + if (unshare_buffer_lock_held(self, alloc) < 0) return -1; } else { @@ -182,8 +190,10 @@ resize_buffer(bytesio *self, size_t size) Inlining is disabled because it's significantly decreases performance of writelines() in PGO build. */ Py_NO_INLINE static Py_ssize_t -write_bytes(bytesio *self, PyObject *b) +write_bytes_lock_held(bytesio *self, PyObject *b) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self); + if (check_closed(self)) { return -1; } @@ -203,13 +213,13 @@ write_bytes(bytesio *self, PyObject *b) assert(self->pos >= 0); size_t endpos = (size_t)self->pos + len; if (endpos > (size_t)PyBytes_GET_SIZE(self->buf)) { - if (resize_buffer(self, endpos) < 0) { + if (resize_buffer_lock_held(self, endpos) < 0) { len = -1; goto done; } } else if (SHARED_BUF(self)) { - if (unshare_buffer(self, Py_MAX(endpos, (size_t)self->string_size)) < 0) { + if (unshare_buffer_lock_held(self, Py_MAX(endpos, (size_t)self->string_size)) < 0) { len = -1; goto done; } @@ -246,16 +256,21 @@ write_bytes(bytesio *self, PyObject *b) static PyObject * bytesio_get_closed(PyObject *op, void *Py_UNUSED(closure)) { + PyObject *ret; bytesio *self = bytesio_CAST(op); + Py_BEGIN_CRITICAL_SECTION(self); if (self->buf == NULL) { - Py_RETURN_TRUE; + ret = Py_True; } else { - Py_RETURN_FALSE; + ret = Py_False; } + Py_END_CRITICAL_SECTION(); + return ret; } /*[clinic input] +@critical_section _io.BytesIO.readable Returns True if the IO object can be read. @@ -263,13 +278,14 @@ Returns True if the IO object can be read. static PyObject * _io_BytesIO_readable_impl(bytesio *self) -/*[clinic end generated code: output=4e93822ad5b62263 input=96c5d0cccfb29f5c]*/ +/*[clinic end generated code: output=4e93822ad5b62263 input=ab7816facef48bfd]*/ { CHECK_CLOSED(self); Py_RETURN_TRUE; } /*[clinic input] +@critical_section _io.BytesIO.writable Returns True if the IO object can be written. @@ -277,13 +293,14 @@ Returns True if the IO object can be written. static PyObject * _io_BytesIO_writable_impl(bytesio *self) -/*[clinic end generated code: output=64ff6a254b1150b8 input=700eed808277560a]*/ +/*[clinic end generated code: output=64ff6a254b1150b8 input=4f35d49d26dab024]*/ { CHECK_CLOSED(self); Py_RETURN_TRUE; } /*[clinic input] +@critical_section _io.BytesIO.seekable Returns True if the IO object can be seeked. @@ -291,13 +308,14 @@ Returns True if the IO object can be seeked. static PyObject * _io_BytesIO_seekable_impl(bytesio *self) -/*[clinic end generated code: output=6b417f46dcc09b56 input=9421f65627a344dd]*/ +/*[clinic end generated code: output=6b417f46dcc09b56 input=9cc78d15aa1deaa3]*/ { CHECK_CLOSED(self); Py_RETURN_TRUE; } /*[clinic input] +@critical_section _io.BytesIO.flush Does nothing. @@ -305,13 +323,14 @@ Does nothing. static PyObject * _io_BytesIO_flush_impl(bytesio *self) -/*[clinic end generated code: output=187e3d781ca134a0 input=561ea490be4581a7]*/ +/*[clinic end generated code: output=187e3d781ca134a0 input=c60842743910b381]*/ { CHECK_CLOSED(self); Py_RETURN_NONE; } /*[clinic input] +@critical_section _io.BytesIO.getbuffer cls: defining_class @@ -322,7 +341,7 @@ Get a read-write view over the contents of the BytesIO object. static PyObject * _io_BytesIO_getbuffer_impl(bytesio *self, PyTypeObject *cls) -/*[clinic end generated code: output=045091d7ce87fe4e input=0668fbb48f95dffa]*/ +/*[clinic end generated code: output=045091d7ce87fe4e input=8295764061be77fd]*/ { _PyIO_State *state = get_io_state_by_cls(cls); PyTypeObject *type = state->PyBytesIOBuffer_Type; @@ -341,6 +360,7 @@ _io_BytesIO_getbuffer_impl(bytesio *self, PyTypeObject *cls) } /*[clinic input] +@critical_section _io.BytesIO.getvalue Retrieve the entire contents of the BytesIO object. @@ -348,16 +368,16 @@ Retrieve the entire contents of the BytesIO object. static PyObject * _io_BytesIO_getvalue_impl(bytesio *self) -/*[clinic end generated code: output=b3f6a3233c8fd628 input=4b403ac0af3973ed]*/ +/*[clinic end generated code: output=b3f6a3233c8fd628 input=c91bff398df0c352]*/ { CHECK_CLOSED(self); - if (self->string_size <= 1 || self->exports > 0) + if (self->string_size <= 1 || FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) > 0) return PyBytes_FromStringAndSize(PyBytes_AS_STRING(self->buf), self->string_size); if (self->string_size != PyBytes_GET_SIZE(self->buf)) { if (SHARED_BUF(self)) { - if (unshare_buffer(self, self->string_size) < 0) + if (unshare_buffer_lock_held(self, self->string_size) < 0) return NULL; } else { @@ -369,6 +389,7 @@ _io_BytesIO_getvalue_impl(bytesio *self) } /*[clinic input] +@critical_section _io.BytesIO.isatty Always returns False. @@ -378,13 +399,14 @@ BytesIO objects are not connected to a TTY-like device. static PyObject * _io_BytesIO_isatty_impl(bytesio *self) -/*[clinic end generated code: output=df67712e669f6c8f input=6f97f0985d13f827]*/ +/*[clinic end generated code: output=df67712e669f6c8f input=50487b74dc5ae8a9]*/ { CHECK_CLOSED(self); Py_RETURN_FALSE; } /*[clinic input] +@critical_section _io.BytesIO.tell Current file position, an integer. @@ -392,22 +414,24 @@ Current file position, an integer. static PyObject * _io_BytesIO_tell_impl(bytesio *self) -/*[clinic end generated code: output=b54b0f93cd0e5e1d input=b106adf099cb3657]*/ +/*[clinic end generated code: output=b54b0f93cd0e5e1d input=2c7b0e8f82e05c4d]*/ { CHECK_CLOSED(self); return PyLong_FromSsize_t(self->pos); } static PyObject * -read_bytes(bytesio *self, Py_ssize_t size) +read_bytes_lock_held(bytesio *self, Py_ssize_t size) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self); + const char *output; assert(self->buf != NULL); assert(size <= self->string_size); if (size > 1 && self->pos == 0 && size == PyBytes_GET_SIZE(self->buf) && - self->exports == 0) { + FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) == 0) { self->pos += size; return Py_NewRef(self->buf); } @@ -418,6 +442,7 @@ read_bytes(bytesio *self, Py_ssize_t size) } /*[clinic input] +@critical_section _io.BytesIO.read size: Py_ssize_t(accept={int, NoneType}) = -1 / @@ -430,7 +455,7 @@ Return an empty bytes object at EOF. static PyObject * _io_BytesIO_read_impl(bytesio *self, Py_ssize_t size) -/*[clinic end generated code: output=9cc025f21c75bdd2 input=74344a39f431c3d7]*/ +/*[clinic end generated code: output=9cc025f21c75bdd2 input=9e2f7ff3075fdd39]*/ { Py_ssize_t n; @@ -444,11 +469,12 @@ _io_BytesIO_read_impl(bytesio *self, Py_ssize_t size) size = 0; } - return read_bytes(self, size); + return read_bytes_lock_held(self, size); } /*[clinic input] +@critical_section _io.BytesIO.read1 size: Py_ssize_t(accept={int, NoneType}) = -1 / @@ -461,12 +487,13 @@ Return an empty bytes object at EOF. static PyObject * _io_BytesIO_read1_impl(bytesio *self, Py_ssize_t size) -/*[clinic end generated code: output=d0f843285aa95f1c input=440a395bf9129ef5]*/ +/*[clinic end generated code: output=d0f843285aa95f1c input=a08fc9e507ab380c]*/ { return _io_BytesIO_read_impl(self, size); } /*[clinic input] +@critical_section _io.BytesIO.readline size: Py_ssize_t(accept={int, NoneType}) = -1 / @@ -480,18 +507,19 @@ Return an empty bytes object at EOF. static PyObject * _io_BytesIO_readline_impl(bytesio *self, Py_ssize_t size) -/*[clinic end generated code: output=4bff3c251df8ffcd input=e7c3fbd1744e2783]*/ +/*[clinic end generated code: output=4bff3c251df8ffcd input=db09d47e23cf2c9e]*/ { Py_ssize_t n; CHECK_CLOSED(self); - n = scan_eol(self, size); + n = scan_eol_lock_held(self, size); - return read_bytes(self, n); + return read_bytes_lock_held(self, n); } /*[clinic input] +@critical_section _io.BytesIO.readlines size as arg: object = None / @@ -505,7 +533,7 @@ total number of bytes in the lines returned. static PyObject * _io_BytesIO_readlines_impl(bytesio *self, PyObject *arg) -/*[clinic end generated code: output=09b8e34c880808ff input=691aa1314f2c2a87]*/ +/*[clinic end generated code: output=09b8e34c880808ff input=5c57d7d78e409985]*/ { Py_ssize_t maxsize, size, n; PyObject *result, *line; @@ -534,7 +562,7 @@ _io_BytesIO_readlines_impl(bytesio *self, PyObject *arg) return NULL; output = PyBytes_AS_STRING(self->buf) + self->pos; - while ((n = scan_eol(self, -1)) != 0) { + while ((n = scan_eol_lock_held(self, -1)) != 0) { self->pos += n; line = PyBytes_FromStringAndSize(output, n); if (!line) @@ -557,6 +585,7 @@ _io_BytesIO_readlines_impl(bytesio *self, PyObject *arg) } /*[clinic input] +@critical_section _io.BytesIO.readinto buffer: Py_buffer(accept={rwbuffer}) / @@ -569,7 +598,7 @@ is set not to block and has no data to read. static PyObject * _io_BytesIO_readinto_impl(bytesio *self, Py_buffer *buffer) -/*[clinic end generated code: output=a5d407217dcf0639 input=1424d0fdce857919]*/ +/*[clinic end generated code: output=a5d407217dcf0639 input=093a8d330de3fcd1]*/ { Py_ssize_t len, n; @@ -593,8 +622,9 @@ _io_BytesIO_readinto_impl(bytesio *self, Py_buffer *buffer) } /*[clinic input] +@critical_section _io.BytesIO.truncate - size: Py_ssize_t(accept={int, NoneType}, c_default="((bytesio *)self)->pos") = None + size: object = None / Truncate the file to at most size bytes. @@ -604,44 +634,68 @@ The current file position is unchanged. Returns the new size. [clinic start generated code]*/ static PyObject * -_io_BytesIO_truncate_impl(bytesio *self, Py_ssize_t size) -/*[clinic end generated code: output=9ad17650c15fa09b input=dae4295e11c1bbb4]*/ +_io_BytesIO_truncate_impl(bytesio *self, PyObject *size) +/*[clinic end generated code: output=ab42491b4824f384 input=b4acb5f80481c053]*/ { CHECK_CLOSED(self); CHECK_EXPORTS(self); - if (size < 0) { - PyErr_Format(PyExc_ValueError, - "negative size value %zd", size); - return NULL; + Py_ssize_t new_size; + + if (size == Py_None) { + new_size = self->pos; + } + else { + new_size = PyLong_AsLong(size); + if (new_size == -1 && PyErr_Occurred()) { + return NULL; + } + if (new_size < 0) { + PyErr_Format(PyExc_ValueError, + "negative size value %zd", new_size); + return NULL; + } } - if (size < self->string_size) { - self->string_size = size; - if (resize_buffer(self, size) < 0) + if (new_size < self->string_size) { + self->string_size = new_size; + if (resize_buffer_lock_held(self, new_size) < 0) return NULL; } - return PyLong_FromSsize_t(size); + return PyLong_FromSsize_t(new_size); } static PyObject * -bytesio_iternext(PyObject *op) +bytesio_iternext_lock_held(PyObject *op) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op); + Py_ssize_t n; bytesio *self = bytesio_CAST(op); CHECK_CLOSED(self); - n = scan_eol(self, -1); + n = scan_eol_lock_held(self, -1); if (n == 0) return NULL; - return read_bytes(self, n); + return read_bytes_lock_held(self, n); +} + +static PyObject * +bytesio_iternext(PyObject *op) +{ + PyObject *ret; + Py_BEGIN_CRITICAL_SECTION(op); + ret = bytesio_iternext_lock_held(op); + Py_END_CRITICAL_SECTION(); + return ret; } /*[clinic input] +@critical_section _io.BytesIO.seek pos: Py_ssize_t whence: int = 0 @@ -658,7 +712,7 @@ Returns the new absolute position. static PyObject * _io_BytesIO_seek_impl(bytesio *self, Py_ssize_t pos, int whence) -/*[clinic end generated code: output=c26204a68e9190e4 input=1e875e6ebc652948]*/ +/*[clinic end generated code: output=c26204a68e9190e4 input=20f05ddf659255df]*/ { CHECK_CLOSED(self); @@ -701,6 +755,7 @@ _io_BytesIO_seek_impl(bytesio *self, Py_ssize_t pos, int whence) } /*[clinic input] +@critical_section _io.BytesIO.write b: object / @@ -712,13 +767,14 @@ Return the number of bytes written. static PyObject * _io_BytesIO_write_impl(bytesio *self, PyObject *b) -/*[clinic end generated code: output=d3e46bcec8d9e21c input=f5ec7c8c64ed720a]*/ +/*[clinic end generated code: output=d3e46bcec8d9e21c input=46c0c17eac7474a4]*/ { - Py_ssize_t n = write_bytes(self, b); + Py_ssize_t n = write_bytes_lock_held(self, b); return n >= 0 ? PyLong_FromSsize_t(n) : NULL; } /*[clinic input] +@critical_section _io.BytesIO.writelines lines: object / @@ -732,7 +788,7 @@ each element. static PyObject * _io_BytesIO_writelines_impl(bytesio *self, PyObject *lines) -/*[clinic end generated code: output=03a43a75773bc397 input=e972539176fc8fc1]*/ +/*[clinic end generated code: output=03a43a75773bc397 input=5d6a616ae39dc9ca]*/ { PyObject *it, *item; @@ -743,7 +799,7 @@ _io_BytesIO_writelines_impl(bytesio *self, PyObject *lines) return NULL; while ((item = PyIter_Next(it)) != NULL) { - Py_ssize_t ret = write_bytes(self, item); + Py_ssize_t ret = write_bytes_lock_held(self, item); Py_DECREF(item); if (ret < 0) { Py_DECREF(it); @@ -760,6 +816,7 @@ _io_BytesIO_writelines_impl(bytesio *self, PyObject *lines) } /*[clinic input] +@critical_section _io.BytesIO.close Disable all I/O operations. @@ -767,7 +824,7 @@ Disable all I/O operations. static PyObject * _io_BytesIO_close_impl(bytesio *self) -/*[clinic end generated code: output=1471bb9411af84a0 input=37e1f55556e61f60]*/ +/*[clinic end generated code: output=1471bb9411af84a0 input=34ce76d8bd17a23b]*/ { CHECK_EXPORTS(self); Py_CLEAR(self->buf); @@ -789,35 +846,49 @@ _io_BytesIO_close_impl(bytesio *self) function to use the efficient instance representation of PEP 307. */ + static PyObject * + bytesio_getstate_lock_held(PyObject *op) + { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op); + + bytesio *self = bytesio_CAST(op); + PyObject *initvalue = _io_BytesIO_getvalue_impl(self); + PyObject *dict; + PyObject *state; + + if (initvalue == NULL) + return NULL; + if (self->dict == NULL) { + dict = Py_NewRef(Py_None); + } + else { + dict = PyDict_Copy(self->dict); + if (dict == NULL) { + Py_DECREF(initvalue); + return NULL; + } + } + + state = Py_BuildValue("(OnN)", initvalue, self->pos, dict); + Py_DECREF(initvalue); + return state; +} + static PyObject * bytesio_getstate(PyObject *op, PyObject *Py_UNUSED(dummy)) { - bytesio *self = bytesio_CAST(op); - PyObject *initvalue = _io_BytesIO_getvalue_impl(self); - PyObject *dict; - PyObject *state; - - if (initvalue == NULL) - return NULL; - if (self->dict == NULL) { - dict = Py_NewRef(Py_None); - } - else { - dict = PyDict_Copy(self->dict); - if (dict == NULL) { - Py_DECREF(initvalue); - return NULL; - } - } - - state = Py_BuildValue("(OnN)", initvalue, self->pos, dict); - Py_DECREF(initvalue); - return state; + PyObject *ret; + Py_BEGIN_CRITICAL_SECTION(op); + ret = bytesio_getstate_lock_held(op); + Py_END_CRITICAL_SECTION(); + return ret; } static PyObject * -bytesio_setstate(PyObject *op, PyObject *state) +bytesio_setstate_lock_held(PyObject *op, PyObject *state) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op); + PyObject *result; PyObject *position_obj; PyObject *dict; @@ -891,13 +962,23 @@ bytesio_setstate(PyObject *op, PyObject *state) Py_RETURN_NONE; } +static PyObject * +bytesio_setstate(PyObject *op, PyObject *state) +{ + PyObject *ret; + Py_BEGIN_CRITICAL_SECTION(op); + ret = bytesio_setstate_lock_held(op, state); + Py_END_CRITICAL_SECTION(); + return ret; +} + static void bytesio_dealloc(PyObject *op) { bytesio *self = bytesio_CAST(op); PyTypeObject *tp = Py_TYPE(self); _PyObject_GC_UNTRACK(self); - if (self->exports > 0) { + if (FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) > 0) { PyErr_SetString(PyExc_SystemError, "deallocated BytesIO object has exported buffers"); PyErr_Print(); @@ -932,6 +1013,7 @@ bytesio_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } /*[clinic input] +@critical_section _io.BytesIO.__init__ initial_bytes as initvalue: object(c_default="NULL") = b'' @@ -940,13 +1022,13 @@ Buffered I/O implementation using an in-memory bytes buffer. static int _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue) -/*[clinic end generated code: output=65c0c51e24c5b621 input=aac7f31b67bf0fb6]*/ +/*[clinic end generated code: output=65c0c51e24c5b621 input=3da5a74ee4c4f1ac]*/ { /* In case, __init__ is called multiple times. */ self->string_size = 0; self->pos = 0; - if (self->exports > 0) { + if (FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) > 0) { PyErr_SetString(PyExc_BufferError, "Existing exports of data: object cannot be re-sized"); return -1; @@ -970,8 +1052,10 @@ _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue) } static PyObject * -bytesio_sizeof(PyObject *op, PyObject *Py_UNUSED(dummy)) +bytesio_sizeof_lock_held(PyObject *op) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op); + bytesio *self = bytesio_CAST(op); size_t res = _PyObject_SIZE(Py_TYPE(self)); if (self->buf && !SHARED_BUF(self)) { @@ -984,6 +1068,16 @@ bytesio_sizeof(PyObject *op, PyObject *Py_UNUSED(dummy)) return PyLong_FromSize_t(res); } +static PyObject * +bytesio_sizeof(PyObject *op, PyObject *Py_UNUSED(dummy)) +{ + PyObject *ret; + Py_BEGIN_CRITICAL_SECTION(op); + ret = bytesio_sizeof_lock_held(op); + Py_END_CRITICAL_SECTION(); + return ret; +} + static int bytesio_traverse(PyObject *op, visitproc visit, void *arg) { @@ -999,7 +1093,7 @@ bytesio_clear(PyObject *op) { bytesio *self = bytesio_CAST(op); Py_CLEAR(self->dict); - if (self->exports == 0) { + if (FT_ATOMIC_LOAD_SSIZE_RELAXED(self->exports) == 0) { Py_CLEAR(self->buf); } return 0; @@ -1077,18 +1171,15 @@ PyType_Spec bytesio_spec = { */ static int -bytesiobuf_getbuffer(PyObject *op, Py_buffer *view, int flags) +bytesiobuf_getbuffer_lock_held(PyObject *op, Py_buffer *view, int flags) { bytesiobuf *obj = bytesiobuf_CAST(op); bytesio *b = bytesio_CAST(obj->source); - if (view == NULL) { - PyErr_SetString(PyExc_BufferError, - "bytesiobuf_getbuffer: view==NULL argument is obsolete"); - return -1; - } - if (b->exports == 0 && SHARED_BUF(b)) { - if (unshare_buffer(b, b->string_size) < 0) + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(b); + + if (FT_ATOMIC_LOAD_SSIZE_RELAXED(b->exports) == 0 && SHARED_BUF(b)) { + if (unshare_buffer_lock_held(b, b->string_size) < 0) return -1; } @@ -1096,16 +1187,32 @@ bytesiobuf_getbuffer(PyObject *op, Py_buffer *view, int flags) (void)PyBuffer_FillInfo(view, op, PyBytes_AS_STRING(b->buf), b->string_size, 0, flags); - b->exports++; + FT_ATOMIC_ADD_SSIZE(b->exports, 1); return 0; } +static int +bytesiobuf_getbuffer(PyObject *op, Py_buffer *view, int flags) +{ + if (view == NULL) { + PyErr_SetString(PyExc_BufferError, + "bytesiobuf_getbuffer: view==NULL argument is obsolete"); + return -1; + } + + int ret; + Py_BEGIN_CRITICAL_SECTION(bytesiobuf_CAST(op)->source); + ret = bytesiobuf_getbuffer_lock_held(op, view, flags); + Py_END_CRITICAL_SECTION(); + return ret; +} + static void bytesiobuf_releasebuffer(PyObject *op, Py_buffer *Py_UNUSED(view)) { bytesiobuf *obj = bytesiobuf_CAST(op); bytesio *b = bytesio_CAST(obj->source); - b->exports--; + FT_ATOMIC_ADD_SSIZE(b->exports, -1); } static int diff --git a/Modules/_io/clinic/bytesio.c.h b/Modules/_io/clinic/bytesio.c.h index aaf4884d1732a9..6595dc937bbcf0 100644 --- a/Modules/_io/clinic/bytesio.c.h +++ b/Modules/_io/clinic/bytesio.c.h @@ -7,6 +7,7 @@ preserve # include "pycore_runtime.h" // _Py_ID() #endif #include "pycore_abstract.h" // _Py_convert_optional_to_ssize_t() +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_CheckPositional() PyDoc_STRVAR(_io_BytesIO_readable__doc__, @@ -24,7 +25,13 @@ _io_BytesIO_readable_impl(bytesio *self); static PyObject * _io_BytesIO_readable(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_readable_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_readable_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_writable__doc__, @@ -42,7 +49,13 @@ _io_BytesIO_writable_impl(bytesio *self); static PyObject * _io_BytesIO_writable(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_writable_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_writable_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_seekable__doc__, @@ -60,7 +73,13 @@ _io_BytesIO_seekable_impl(bytesio *self); static PyObject * _io_BytesIO_seekable(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_seekable_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_seekable_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_flush__doc__, @@ -78,7 +97,13 @@ _io_BytesIO_flush_impl(bytesio *self); static PyObject * _io_BytesIO_flush(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_flush_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_flush_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_getbuffer__doc__, @@ -96,11 +121,18 @@ _io_BytesIO_getbuffer_impl(bytesio *self, PyTypeObject *cls); static PyObject * _io_BytesIO_getbuffer(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "getbuffer() takes no arguments"); - return NULL; + goto exit; } - return _io_BytesIO_getbuffer_impl((bytesio *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_getbuffer_impl((bytesio *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_io_BytesIO_getvalue__doc__, @@ -118,7 +150,13 @@ _io_BytesIO_getvalue_impl(bytesio *self); static PyObject * _io_BytesIO_getvalue(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_getvalue_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_getvalue_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_isatty__doc__, @@ -138,7 +176,13 @@ _io_BytesIO_isatty_impl(bytesio *self); static PyObject * _io_BytesIO_isatty(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_isatty_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_isatty_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_tell__doc__, @@ -156,7 +200,13 @@ _io_BytesIO_tell_impl(bytesio *self); static PyObject * _io_BytesIO_tell(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_tell_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_tell_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO_read__doc__, @@ -190,7 +240,9 @@ _io_BytesIO_read(PyObject *self, PyObject *const *args, Py_ssize_t nargs) goto exit; } skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_read_impl((bytesio *)self, size); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -227,7 +279,9 @@ _io_BytesIO_read1(PyObject *self, PyObject *const *args, Py_ssize_t nargs) goto exit; } skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_read1_impl((bytesio *)self, size); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -265,7 +319,9 @@ _io_BytesIO_readline(PyObject *self, PyObject *const *args, Py_ssize_t nargs) goto exit; } skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_readline_impl((bytesio *)self, size); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -301,7 +357,9 @@ _io_BytesIO_readlines(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } arg = args[0]; skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_readlines_impl((bytesio *)self, arg); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -332,7 +390,9 @@ _io_BytesIO_readinto(PyObject *self, PyObject *arg) _PyArg_BadArgument("readinto", "argument", "read-write bytes-like object", arg); goto exit; } + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_readinto_impl((bytesio *)self, &buffer); + Py_END_CRITICAL_SECTION(); exit: /* Cleanup for buffer */ @@ -356,13 +416,13 @@ PyDoc_STRVAR(_io_BytesIO_truncate__doc__, {"truncate", _PyCFunction_CAST(_io_BytesIO_truncate), METH_FASTCALL, _io_BytesIO_truncate__doc__}, static PyObject * -_io_BytesIO_truncate_impl(bytesio *self, Py_ssize_t size); +_io_BytesIO_truncate_impl(bytesio *self, PyObject *size); static PyObject * _io_BytesIO_truncate(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - Py_ssize_t size = ((bytesio *)self)->pos; + PyObject *size = Py_None; if (!_PyArg_CheckPositional("truncate", nargs, 0, 1)) { goto exit; @@ -370,11 +430,11 @@ _io_BytesIO_truncate(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (nargs < 1) { goto skip_optional; } - if (!_Py_convert_optional_to_ssize_t(args[0], &size)) { - goto exit; - } + size = args[0]; skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_truncate_impl((bytesio *)self, size); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -428,7 +488,9 @@ _io_BytesIO_seek(PyObject *self, PyObject *const *args, Py_ssize_t nargs) goto exit; } skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_seek_impl((bytesio *)self, pos, whence); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -453,7 +515,9 @@ _io_BytesIO_write(PyObject *self, PyObject *b) { PyObject *return_value = NULL; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_write_impl((bytesio *)self, b); + Py_END_CRITICAL_SECTION(); return return_value; } @@ -479,7 +543,9 @@ _io_BytesIO_writelines(PyObject *self, PyObject *lines) { PyObject *return_value = NULL; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO_writelines_impl((bytesio *)self, lines); + Py_END_CRITICAL_SECTION(); return return_value; } @@ -499,7 +565,13 @@ _io_BytesIO_close_impl(bytesio *self); static PyObject * _io_BytesIO_close(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _io_BytesIO_close_impl((bytesio *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _io_BytesIO_close_impl((bytesio *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_io_BytesIO___init____doc__, @@ -558,9 +630,11 @@ _io_BytesIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) } initvalue = fastargs[0]; skip_optional_pos: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _io_BytesIO___init___impl((bytesio *)self, initvalue); + Py_END_CRITICAL_SECTION(); exit: return return_value; } -/*[clinic end generated code: output=6dbfd82f4e9d4ef3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=daa81dfdae5ccc57 input=a9049054013a1b77]*/ From 85c45571aef2daf24f154867456aabf97518d015 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:19:01 +0200 Subject: [PATCH 1026/1674] [3.14] gh-139646: fix typo in `pickletools` error message (GH-139647) (GH-139649) (cherry picked from commit 36a6c2cdfaddc4a82d14f2c84b04e05089802876) Signed-off-by: yihong0618 Co-authored-by: yihong --- Lib/pickletools.py | 2 +- Lib/test/test_pickletools.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/pickletools.py b/Lib/pickletools.py index bcddfb722bd26d..254b6c7fcc9dd2 100644 --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -348,7 +348,7 @@ def read_stringnl(f, decode=True, stripquotes=True, *, encoding='latin-1'): for q in (b'"', b"'"): if data.startswith(q): if not data.endswith(q): - raise ValueError("strinq quote %r not found at both " + raise ValueError("string quote %r not found at both " "ends of %r" % (q, data)) data = data[1:-1] break diff --git a/Lib/test/test_pickletools.py b/Lib/test/test_pickletools.py index a178d3353eecdf..cf990874621eae 100644 --- a/Lib/test/test_pickletools.py +++ b/Lib/test/test_pickletools.py @@ -384,13 +384,13 @@ def test_string_without_quotes(self): self.check_dis_error(b'Sabc"\n.', '', "no string quotes around b'abc\"'") self.check_dis_error(b"S'abc\n.", '', - '''strinq quote b"'" not found at both ends of b"'abc"''') + '''string quote b"'" not found at both ends of b"'abc"''') self.check_dis_error(b'S"abc\n.', '', - r"""strinq quote b'"' not found at both ends of b'"abc'""") + r"""string quote b'"' not found at both ends of b'"abc'""") self.check_dis_error(b"S'abc\"\n.", '', - r"""strinq quote b"'" not found at both ends of b'\\'abc"'""") + r"""string quote b"'" not found at both ends of b'\\'abc"'""") self.check_dis_error(b"S\"abc'\n.", '', - r"""strinq quote b'"' not found at both ends of b'"abc\\''""") + r"""string quote b'"' not found at both ends of b'"abc\\''""") def test_binstring(self): self.check_dis(b"T\x03\x00\x00\x00abc.", '''\ From 9eee7fe717128e5618ed90468c14643f7ac6f7da Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:19:42 +0200 Subject: [PATCH 1027/1674] [3.14] gh-135944: Add a "Runtime Components" Section to the Execution Model Docs (gh-135945) (#139509) gh-135944: Add a "Runtime Components" Section to the Execution Model Docs (gh-135945) The section provides a brief overview of the Python runtime's execution environment. It is meant to be implementation agnostic, (cherry picked from commit 46a1f0a9ff6e7cbea111dcb35e7aced1a7a3f3dc) Co-authored-by: Eric Snow --- Doc/reference/executionmodel.rst | 186 +++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index cb6c524dd97a30..639c232571edf3 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -398,6 +398,192 @@ See also the description of the :keyword:`try` statement in section :ref:`try` and :keyword:`raise` statement in section :ref:`raise`. +.. _execcomponents: + +Runtime Components +================== + +General Computing Model +----------------------- + +Python's execution model does not operate in a vacuum. It runs on +a host machine and through that host's runtime environment, including +its operating system (OS), if there is one. When a program runs, +the conceptual layers of how it runs on the host look something +like this: + + | **host machine** + | **process** (global resources) + | **thread** (runs machine code) + +Each process represents a program running on the host. Think of each +process itself as the data part of its program. Think of the process' +threads as the execution part of the program. This distinction will +be important to understand the conceptual Python runtime. + +The process, as the data part, is the execution context in which the +program runs. It mostly consists of the set of resources assigned to +the program by the host, including memory, signals, file handles, +sockets, and environment variables. + +Processes are isolated and independent from one another. (The same +is true for hosts.) The host manages the process' access to its +assigned resources, in addition to coordinating between processes. + +Each thread represents the actual execution of the program's machine +code, running relative to the resources assigned to the program's +process. It's strictly up to the host how and when that execution +takes place. + +From the point of view of Python, a program always starts with exactly +one thread. However, the program may grow to run in multiple +simultaneous threads. Not all hosts support multiple threads per +process, but most do. Unlike processes, threads in a process are not +isolated and independent from one another. Specifically, all threads +in a process share all of the process' resources. + +The fundamental point of threads is that each one does *run* +independently, at the same time as the others. That may be only +conceptually at the same time ("concurrently") or physically +("in parallel"). Either way, the threads effectively run +at a non-synchronized rate. + +.. note:: + + That non-synchronized rate means none of the process' memory is + guaranteed to stay consistent for the code running in any given + thread. Thus multi-threaded programs must take care to coordinate + access to intentionally shared resources. Likewise, they must take + care to be absolutely diligent about not accessing any *other* + resources in multiple threads; otherwise two threads running at the + same time might accidentally interfere with each other's use of some + shared data. All this is true for both Python programs and the + Python runtime. + + The cost of this broad, unstructured requirement is the tradeoff for + the kind of raw concurrency that threads provide. The alternative + to the required discipline generally means dealing with + non-deterministic bugs and data corruption. + +Python Runtime Model +-------------------- + +The same conceptual layers apply to each Python program, with some +extra data layers specific to Python: + + | **host machine** + | **process** (global resources) + | Python global runtime (*state*) + | Python interpreter (*state*) + | **thread** (runs Python bytecode and "C-API") + | Python thread *state* + +At the conceptual level: when a Python program starts, it looks exactly +like that diagram, with one of each. The runtime may grow to include +multiple interpreters, and each interpreter may grow to include +multiple thread states. + +.. note:: + + A Python implementation won't necessarily implement the runtime + layers distinctly or even concretely. The only exception is places + where distinct layers are directly specified or exposed to users, + like through the :mod:`threading` module. + +.. note:: + + The initial interpreter is typically called the "main" interpreter. + Some Python implementations, like CPython, assign special roles + to the main interpreter. + + Likewise, the host thread where the runtime was initialized is known + as the "main" thread. It may be different from the process' initial + thread, though they are often the same. In some cases "main thread" + may be even more specific and refer to the initial thread state. + A Python runtime might assign specific responsibilities + to the main thread, such as handling signals. + +As a whole, the Python runtime consists of the global runtime state, +interpreters, and thread states. The runtime ensures all that state +stays consistent over its lifetime, particularly when used with +multiple host threads. + +The global runtime, at the conceptual level, is just a set of +interpreters. While those interpreters are otherwise isolated and +independent from one another, they may share some data or other +resources. The runtime is responsible for managing these global +resources safely. The actual nature and management of these resources +is implementation-specific. Ultimately, the external utility of the +global runtime is limited to managing interpreters. + +In contrast, an "interpreter" is conceptually what we would normally +think of as the (full-featured) "Python runtime". When machine code +executing in a host thread interacts with the Python runtime, it calls +into Python in the context of a specific interpreter. + +.. note:: + + The term "interpreter" here is not the same as the "bytecode + interpreter", which is what regularly runs in threads, executing + compiled Python code. + + In an ideal world, "Python runtime" would refer to what we currently + call "interpreter". However, it's been called "interpreter" at least + since introduced in 1997 (`CPython:a027efa5b`_). + + .. _CPython:a027efa5b: https://github.com/python/cpython/commit/a027efa5b + +Each interpreter completely encapsulates all of the non-process-global, +non-thread-specific state needed for the Python runtime to work. +Notably, the interpreter's state persists between uses. It includes +fundamental data like :data:`sys.modules`. The runtime ensures +multiple threads using the same interpreter will safely +share it between them. + +A Python implementation may support using multiple interpreters at the +same time in the same process. They are independent and isolated from +one another. For example, each interpreter has its own +:data:`sys.modules`. + +For thread-specific runtime state, each interpreter has a set of thread +states, which it manages, in the same way the global runtime contains +a set of interpreters. It can have thread states for as many host +threads as it needs. It may even have multiple thread states for +the same host thread, though that isn't as common. + +Each thread state, conceptually, has all the thread-specific runtime +data an interpreter needs to operate in one host thread. The thread +state includes the current raised exception and the thread's Python +call stack. It may include other thread-specific resources. + +.. note:: + + The term "Python thread" can sometimes refer to a thread state, but + normally it means a thread created using the :mod:`threading` module. + +Each thread state, over its lifetime, is always tied to exactly one +interpreter and exactly one host thread. It will only ever be used in +that thread and with that interpreter. + +Multiple thread states may be tied to the same host thread, whether for +different interpreters or even the same interpreter. However, for any +given host thread, only one of the thread states tied to it can be used +by the thread at a time. + +Thread states are isolated and independent from one another and don't +share any data, except for possibly sharing an interpreter and objects +or other resources belonging to that interpreter. + +Once a program is running, new Python threads can be created using the +:mod:`threading` module (on platforms and Python implementations that +support threads). Additional processes can be created using the +:mod:`os`, :mod:`subprocess`, and :mod:`multiprocessing` modules. +Interpreters can be created and used with the +:mod:`~concurrent.interpreters` module. Coroutines (async) can +be run using :mod:`asyncio` in each interpreter, typically only +in a single thread (often the main thread). + + .. rubric:: Footnotes .. [#] This limitation occurs because the code that is executed by these operations From 3a880241c6b863f887cbc0a7ad820398fb006b08 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:19:50 +0200 Subject: [PATCH 1028/1674] [3.14] Replace ambiguous word "pound" by "hash" in `difflib` docs (GH-139601) (GH-139616) (cherry picked from commit dadbb2662a405a34763db0298025f6af06342849) Co-authored-by: George Ogden <38294960+George-Ogden@users.noreply.github.com> --- Doc/library/difflib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index ec8b575a1ba999..fcd240e7e8283d 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -231,7 +231,7 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. *linejunk*: A function that accepts a single string argument, and returns true if the string is junk, or false if not. The default is ``None``. There is also a module-level function :func:`IS_LINE_JUNK`, which filters out lines - without visible characters, except for at most one pound character (``'#'``) + without visible characters, except for at most one hash character (``'#'``) -- however the underlying :class:`SequenceMatcher` class does a dynamic analysis of which lines are so frequent as to constitute noise, and this usually works better than using this function. From b4c3c0f4bfbe375ea29659863130281b1fedba74 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:20:57 +0200 Subject: [PATCH 1029/1674] [3.14] gh-139308: Skip test_special_chars_csh on NetBSD due to csh variable expansion issue (GH-139341) (GH-139559) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ae6e7f572c18d9183cb23e6e53c3324dd9bf0c64) Co-authored-by: Furkan Onder Co-authored-by: Filipe Laíns 🇵🇸 --- Lib/test/test_venv.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 26f069dce2b807..d108165be51e84 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -522,6 +522,8 @@ def test_special_chars_bash(self): # gh-124651: test quoted strings @unittest.skipIf(os.name == 'nt', 'contains invalid characters on Windows') + @unittest.skipIf(sys.platform.startswith('netbsd'), + "NetBSD csh fails with quoted special chars; see gh-139308") def test_special_chars_csh(self): """ Test that the template strings are quoted properly (csh) From 6d94af4b98a856214c8d8dd259b6c2d4da3bc7ca Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:22:20 +0200 Subject: [PATCH 1030/1674] [3.14] gh-139327: fix some reference leaks in `sqlite3` error branches (GH-139328) (GH-139471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit d0a3eff9d6e72e209da0236fb1ea1f8c18938eaa) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Modules/_sqlite/connection.c | 23 ++++++++++------ Modules/_sqlite/cursor.c | 51 +++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 2a184f787542ec..be4ad89c6b98aa 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -144,7 +144,7 @@ class _sqlite3.Connection "pysqlite_Connection *" "clinic_state()->ConnectionTyp [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=67369db2faf80891]*/ -static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); +static int _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); static void free_callback_context(callback_context *ctx); static void set_callback_context(callback_context **ctx_pp, callback_context *ctx); @@ -562,7 +562,10 @@ pysqlite_connection_cursor_impl(pysqlite_Connection *self, PyObject *factory) return NULL; } - _pysqlite_drop_unused_cursor_references(self); + if (_pysqlite_drop_unused_cursor_references(self) < 0) { + Py_DECREF(cursor); + return NULL; + } if (cursor && self->row_factory != Py_None) { Py_INCREF(self->row_factory); @@ -1061,32 +1064,36 @@ final_callback(sqlite3_context *context) PyGILState_Release(threadstate); } -static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) +static int +_pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) { /* we only need to do this once in a while */ if (self->created_cursors++ < 200) { - return; + return 0; } self->created_cursors = 0; PyObject* new_list = PyList_New(0); if (!new_list) { - return; + return -1; } - for (Py_ssize_t i = 0; i < PyList_Size(self->cursors); i++) { - PyObject* weakref = PyList_GetItem(self->cursors, i); + assert(PyList_CheckExact(self->cursors)); + Py_ssize_t imax = PyList_GET_SIZE(self->cursors); + for (Py_ssize_t i = 0; i < imax; i++) { + PyObject* weakref = PyList_GET_ITEM(self->cursors, i); if (_PyWeakref_IsDead(weakref)) { continue; } if (PyList_Append(new_list, weakref) != 0) { Py_DECREF(new_list); - return; + return -1; } } Py_SETREF(self->cursors, new_list); + return 0; } /* Allocate a UDF/callback context structure. In order to ensure that the state diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 0c3f43d0e50b43..a38bf534d1b334 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -471,6 +471,9 @@ static int check_cursor(pysqlite_Cursor* cur) return 0; } + assert(cur->connection != NULL); + assert(cur->connection->state != NULL); + if (cur->closed) { PyErr_SetString(cur->connection->state->ProgrammingError, "Cannot operate on a closed cursor."); @@ -567,43 +570,40 @@ bind_param(pysqlite_state *state, pysqlite_Statement *self, int pos, switch (paramtype) { case TYPE_LONG: { sqlite_int64 value = _pysqlite_long_as_int64(parameter); - if (value == -1 && PyErr_Occurred()) - rc = -1; - else - rc = sqlite3_bind_int64(self->st, pos, value); + rc = (value == -1 && PyErr_Occurred()) + ? SQLITE_ERROR + : sqlite3_bind_int64(self->st, pos, value); break; } case TYPE_FLOAT: { double value = PyFloat_AsDouble(parameter); - if (value == -1 && PyErr_Occurred()) { - rc = -1; - } - else { - rc = sqlite3_bind_double(self->st, pos, value); - } + rc = (value == -1 && PyErr_Occurred()) + ? SQLITE_ERROR + : sqlite3_bind_double(self->st, pos, value); break; } case TYPE_UNICODE: string = PyUnicode_AsUTF8AndSize(parameter, &buflen); - if (string == NULL) - return -1; + if (string == NULL) { + return SQLITE_ERROR; + } if (buflen > INT_MAX) { PyErr_SetString(PyExc_OverflowError, "string longer than INT_MAX bytes"); - return -1; + return SQLITE_ERROR; } rc = sqlite3_bind_text(self->st, pos, string, (int)buflen, SQLITE_TRANSIENT); break; case TYPE_BUFFER: { Py_buffer view; if (PyObject_GetBuffer(parameter, &view, PyBUF_SIMPLE) != 0) { - return -1; + return SQLITE_ERROR; } if (view.len > INT_MAX) { PyErr_SetString(PyExc_OverflowError, "BLOB longer than INT_MAX bytes"); PyBuffer_Release(&view); - return -1; + return SQLITE_ERROR; } rc = sqlite3_bind_blob(self->st, pos, view.buf, (int)view.len, SQLITE_TRANSIENT); PyBuffer_Release(&view); @@ -613,7 +613,7 @@ bind_param(pysqlite_state *state, pysqlite_Statement *self, int pos, PyErr_Format(state->ProgrammingError, "Error binding parameter %d: type '%s' is not supported", pos, Py_TYPE(parameter)->tp_name); - rc = -1; + rc = SQLITE_ERROR; } final: @@ -733,14 +733,17 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self, } binding_name++; /* skip first char (the colon) */ - PyObject *current_param; - (void)PyMapping_GetOptionalItemString(parameters, binding_name, ¤t_param); - if (!current_param) { - if (!PyErr_Occurred() || PyErr_ExceptionMatches(PyExc_LookupError)) { - PyErr_Format(state->ProgrammingError, - "You did not supply a value for binding " - "parameter :%s.", binding_name); - } + PyObject *current_param = NULL; + int found = PyMapping_GetOptionalItemString(parameters, + binding_name, + ¤t_param); + if (found == -1) { + return; + } + else if (found == 0) { + PyErr_Format(state->ProgrammingError, + "You did not supply a value for binding " + "parameter :%s.", binding_name); return; } From 7c26f0fe4ef1e4df324781e4b8ebbfbc75767ee7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:23:18 +0200 Subject: [PATCH 1031/1674] [3.14] gh-115119: Defer `--with-system-libmpdec` removal to 3.16 (GH-139318) (#139347) gh-115119: Defer `--with-system-libmpdec` removal to 3.16 (GH-139318) (cherry picked from commit 0aab07ccf79f335e3afa8021ddcbcfb8afa4d70c) Co-authored-by: sobolevn --- Doc/using/configure.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index d5a329578ad833..e27b0141a6bf30 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -866,9 +866,9 @@ Libraries options .. versionchanged:: 3.13 Default to using the installed ``mpdecimal`` library. - .. deprecated-removed:: 3.13 3.15 + .. deprecated-removed:: 3.13 3.16 A copy of the ``mpdecimal`` library sources will no longer be distributed - with Python 3.15. + with Python 3.16. .. seealso:: :option:`LIBMPDEC_CFLAGS` and :option:`LIBMPDEC_LIBS`. From 898be571a25bd2d781884608e09869202a2bf015 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:23:39 +0200 Subject: [PATCH 1032/1674] [3.14] `Doc/library/zoneinfo.rst`: Fix typo (GH-139190) (#139229) (cherry picked from commit 4fb338d844a1e992857a17b5bd1269837e847fb2) --- Doc/library/zoneinfo.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/zoneinfo.rst b/Doc/library/zoneinfo.rst index 53d8e2598ec1c7..d95260896f75e1 100644 --- a/Doc/library/zoneinfo.rst +++ b/Doc/library/zoneinfo.rst @@ -299,7 +299,7 @@ The behavior of a ``ZoneInfo`` file depends on how it was constructed: 1. ``ZoneInfo(key)``: When constructed with the primary constructor, a ``ZoneInfo`` object is serialized by key, and when deserialized, the deserializing process uses the primary and thus it is expected that these - are expected to be the same object as other references to the same time + are the same object as other references to the same time zone. For example, if ``europe_berlin_pkl`` is a string containing a pickle constructed from ``ZoneInfo("Europe/Berlin")``, one would expect the following behavior: From 08673d8a51cabc1f8a628a0c8e3be375523f76ff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:23:58 +0200 Subject: [PATCH 1033/1674] [3.14] gh-116738: add multi-threaded tests for `resource` module on free-threading builds (GH-138504) (#138793) gh-116738: add multi-threaded tests for `resource` module on free-threading builds (GH-138504) (cherry picked from commit 32e1e0699ffda8ec1dd5a0eb178b052352ab7d31) Co-authored-by: Alper Co-authored-by: Kumar Aditya --- Lib/test/test_free_threading/test_resource.py | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Lib/test/test_free_threading/test_resource.py diff --git a/Lib/test/test_free_threading/test_resource.py b/Lib/test/test_free_threading/test_resource.py new file mode 100644 index 00000000000000..ecd0e535c442b4 --- /dev/null +++ b/Lib/test/test_free_threading/test_resource.py @@ -0,0 +1,41 @@ +import unittest +from test.support import import_helper, threading_helper + +resource = import_helper.import_module("resource") + + +NTHREADS = 10 +LOOP_PER_THREAD = 1000 + + +@threading_helper.requires_working_threading() +class ResourceTest(unittest.TestCase): + @unittest.skipUnless(hasattr(resource, "getrusage"), "needs getrusage") + @unittest.skipUnless( + hasattr(resource, "RUSAGE_THREAD"), "needs RUSAGE_THREAD" + ) + def test_getrusage(self): + ru_utime_lst = [] + + def dummy_work(ru_utime_lst): + for _ in range(LOOP_PER_THREAD): + pass + + usage_process = resource.getrusage(resource.RUSAGE_SELF) + usage_thread = resource.getrusage(resource.RUSAGE_THREAD) + # Process user time should be greater than thread user time + self.assertGreater(usage_process.ru_utime, usage_thread.ru_utime) + ru_utime_lst.append(usage_thread.ru_utime) + + threading_helper.run_concurrently( + worker_func=dummy_work, args=(ru_utime_lst,), nthreads=NTHREADS + ) + + usage_process = resource.getrusage(resource.RUSAGE_SELF) + self.assertEqual(len(ru_utime_lst), NTHREADS) + # Process user time should be greater than sum of all thread user times + self.assertGreater(usage_process.ru_utime, sum(ru_utime_lst)) + + +if __name__ == "__main__": + unittest.main() From f899c849d4957445adbb0b44d24deeb898a2f49d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:24:17 +0200 Subject: [PATCH 1034/1674] [3.14] Remove unmatched closing parenthesis (GH-139082) (#139099) Remove unmatched closing parenthesis (GH-139082) (cherry picked from commit d22b25081bc406808cc5967951b42abedb634de3) Co-authored-by: Rafael Fontenelle --- Doc/c-api/unicode.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index e8bdd8c6dee0a0..aeb86e06d99351 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -731,7 +731,7 @@ APIs: Return ``0`` on success, ``-1`` on error with an exception set. This function checks that *unicode* is a Unicode object, that the index is - not out of bounds, and that the object's reference count is one). + not out of bounds, and that the object's reference count is one. See :c:func:`PyUnicode_WRITE` for a version that skips these checks, making them your responsibility. From 2de18f251aede02278f1c097203a88c55d4058d8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:24:59 +0200 Subject: [PATCH 1035/1674] [3.14] gh-138772: Add tests for Turtle.dot() signature (GH-138773) (GH-139326) (cherry picked from commit 2462807b702d9a71f0bd73a6618d4948491852a0) Co-authored-by: Jan-Eric Nitschke <47750513+JanEricNitschke@users.noreply.github.com> --- Lib/test/test_turtle.py | 43 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index d02cac284a909a..12d2eed874148c 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -60,12 +60,25 @@ def patch_screen(): We must patch the _Screen class itself instead of the _Screen instance because instantiating it requires a display. """ + # Create a mock screen that delegates color validation to the real TurtleScreen methods + mock_screen = unittest.mock.MagicMock() + mock_screen.__class__ = turtle._Screen + mock_screen.mode.return_value = "standard" + mock_screen._colormode = 1.0 + + def mock_iscolorstring(color): + valid_colors = {'red', 'green', 'blue', 'black', 'white', 'yellow', + 'orange', 'purple', 'pink', 'brown', 'gray', 'grey', + 'cyan', 'magenta'} + + return color in valid_colors or (isinstance(color, str) and color.startswith('#')) + + mock_screen._iscolorstring = mock_iscolorstring + mock_screen._colorstr = turtle._Screen._colorstr.__get__(mock_screen) + return unittest.mock.patch( "turtle._Screen.__new__", - **{ - "return_value.__class__": turtle._Screen, - "return_value.mode.return_value": "standard", - }, + return_value=mock_screen ) @@ -635,6 +648,28 @@ def test_poly_context_when_creating_poly(self): self.assertTrue(self.turtle._creatingPoly) self.assertFalse(self.turtle._creatingPoly) + def test_dot_signature(self): + self.turtle.dot() + self.turtle.dot(10) + self.turtle.dot(size=10) + self.turtle.dot((0, 0, 0)) + self.turtle.dot(size=(0, 0, 0)) + self.turtle.dot("blue") + self.turtle.dot("") + self.turtle.dot(size="blue") + self.turtle.dot(20, "blue") + self.turtle.dot(20, "blue") + self.turtle.dot(20, (0, 0, 0)) + self.turtle.dot(20, 0, 0, 0) + with self.assertRaises(TypeError): + self.turtle.dot(color="blue") + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, "_not_a_color_") + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, (0, 0, 0, 0)) + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, 0, 0, 0, 0) + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, (-1, 0, 0)) + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, -1, 0, 0) + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, (0, 257, 0)) + self.assertRaises(turtle.TurtleGraphicsError, self.turtle.dot, 0, 0, 257, 0) class TestModuleLevel(unittest.TestCase): def test_all_signatures(self): From 99c1d09016ad11b56133c1f4a7c99589cd3d6f72 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:25:25 +0200 Subject: [PATCH 1036/1674] [3.14] gh-130102: drop "require numeric arguments" from pow() docs (GH-137456) (#137536) gh-130102: drop "require numeric arguments" from pow() docs (GH-137456) (cherry picked from commit 37b5a0d671685645db8f1d5ecfa1260587f1fc28) Co-authored-by: Sergey B Kirpichev Co-authored-by: Senthil Kumaran --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index f28c1a5ad4a326..d25a6efd003c8e 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1580,7 +1580,7 @@ are always available. They are listed here in alphabetical order. ``pow(base, exp) % mod``). The two-argument form ``pow(base, exp)`` is equivalent to using the power operator: ``base**exp``. - The arguments must have numeric types. With mixed operand types, the + When arguments are builtin numeric types with mixed operand types, the coercion rules for binary arithmetic operators apply. For :class:`int` operands, the result has the same type as the operands (after coercion) unless the second argument is negative; in that case, all arguments are From b4d8faa22142cde789388068d0230b9ffdd95eac Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 7 Oct 2025 21:25:34 +0300 Subject: [PATCH 1037/1674] [3.14] Update the availability info in the resource docs (#137939) Update the availability info in the resource docs --- Doc/library/resource.rst | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index 0515d205bbca0b..140de234fb7dc8 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -63,12 +63,12 @@ this module for those platforms. Sets new limits of consumption of *resource*. The *limits* argument must be a tuple ``(soft, hard)`` of two integers describing the new limits. A value of - :data:`~resource.RLIM_INFINITY` can be used to request a limit that is + :const:`~resource.RLIM_INFINITY` can be used to request a limit that is unlimited. Raises :exc:`ValueError` if an invalid resource is specified, if the new soft limit exceeds the hard limit, or if a process tries to raise its hard limit. - Specifying a limit of :data:`~resource.RLIM_INFINITY` when the hard or + Specifying a limit of :const:`~resource.RLIM_INFINITY` when the hard or system limit for that resource is not unlimited will result in a :exc:`ValueError`. A process with the effective UID of super-user can request any valid limit value, including unlimited, but :exc:`ValueError` @@ -78,7 +78,7 @@ this module for those platforms. ``setrlimit`` may also raise :exc:`error` if the underlying system call fails. - VxWorks only supports setting :data:`RLIMIT_NOFILE`. + VxWorks only supports setting :const:`RLIMIT_NOFILE`. .. audit-event:: resource.setrlimit resource,limits resource.setrlimit @@ -176,8 +176,9 @@ platform. .. data:: RLIMIT_VMEM The largest area of mapped memory which the process may occupy. + Usually an alias of :const:`RLIMIT_AS`. - .. availability:: FreeBSD >= 11. + .. availability:: Solaris, FreeBSD, NetBSD. .. data:: RLIMIT_AS @@ -230,16 +231,18 @@ platform. .. versionadded:: 3.4 + .. data:: RLIMIT_SBSIZE The maximum size (in bytes) of socket buffer usage for this user. This limits the amount of network memory, and hence the amount of mbufs, that this user may hold at any time. - .. availability:: FreeBSD. + .. availability:: FreeBSD, NetBSD. .. versionadded:: 3.4 + .. data:: RLIMIT_SWAP The maximum size (in bytes) of the swap space that may be reserved or @@ -249,18 +252,20 @@ platform. `tuning(7) `__ for a complete description of this sysctl. - .. availability:: FreeBSD. + .. availability:: FreeBSD >= 8. .. versionadded:: 3.4 + .. data:: RLIMIT_NPTS The maximum number of pseudo-terminals created by this user id. - .. availability:: FreeBSD. + .. availability:: FreeBSD >= 8. .. versionadded:: 3.4 + .. data:: RLIMIT_KQUEUES The maximum number of kqueues this user id is allowed to create. @@ -269,6 +274,7 @@ platform. .. versionadded:: 3.10 + Resource Usage -------------- From 700d425564016886c24b9cc6cf2365b4cdcd7901 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 7 Oct 2025 21:26:00 +0300 Subject: [PATCH 1038/1674] [3.14] Update the dbm documentation (GH-137919) (#137962) Unify documentation for all backends, enumerate all not implemented mapping methods, document particularities of implemented mapping methods. (cherry picked from commit 8700404f8688d6a56279dce47a5a5802ec53ed06) --- Doc/library/dbm.rst | 106 ++++++++++++++++++++++++++---------------- Doc/whatsnew/3.13.rst | 2 +- 2 files changed, 67 insertions(+), 41 deletions(-) diff --git a/Doc/library/dbm.rst b/Doc/library/dbm.rst index 36221c026d6d4b..628232cb631bd4 100644 --- a/Doc/library/dbm.rst +++ b/Doc/library/dbm.rst @@ -84,10 +84,13 @@ the Oracle Berkeley DB. .. 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. +The object returned by :func:`~dbm.open` supports the basic +functionality of mutable :term:`mappings `; +keys and their corresponding values can be stored, retrieved, and +deleted, and iteration, the :keyword:`in` operator and methods :meth:`!keys`, +:meth:`!get`, :meth:`!setdefault` and :meth:`!clear` are available. +The :meth:`!keys` method returns a list instead of a view object. +The :meth:`!setdefault` method requires two arguments. 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 @@ -108,6 +111,10 @@ will automatically close them when done. Deleting a key from a read-only database raises a database module specific exception instead of :exc:`KeyError`. +.. versionchanged:: 3.13 + :meth:`!clear` methods are now available for all :mod:`dbm` backends. + + The following example records some hostnames and a corresponding title, and then prints out the contents of the database:: @@ -167,9 +174,6 @@ or any other SQLite browser, including the SQLite CLI. .. 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. @@ -186,6 +190,17 @@ or any other SQLite browser, including the SQLite CLI. The Unix file access mode of the file (default: octal ``0o666``), used only when the database has to be created. + The returned database object behaves similar to a mutable :term:`mapping`, + but the :meth:`!keys` method returns a list, and + the :meth:`!setdefault` method requires two arguments. + It also supports a "closing" context manager via the :keyword:`with` keyword. + + The following method is also provided: + + .. method:: sqlite3.close() + + Close the SQLite database. + :mod:`dbm.gnu` --- GNU database manager --------------------------------------- @@ -215,6 +230,11 @@ functionality like crash tolerance. raised for general mapping errors like specifying an incorrect key. +.. data:: open_flags + + A string of characters the *flag* parameter of :meth:`~dbm.gnu.open` supports. + + .. function:: open(filename, flag="r", mode=0o666, /) Open a GDBM database and return a :class:`!gdbm` object. @@ -250,14 +270,25 @@ functionality like crash tolerance. .. versionchanged:: 3.11 *filename* accepts a :term:`path-like object`. - .. data:: open_flags + :class:`!gdbm` objects behave similar to mutable :term:`mappings `, + but methods :meth:`!items`, :meth:`!values`, :meth:`!pop`, :meth:`!popitem`, + and :meth:`!update` are not supported, + the :meth:`!keys` method returns a list, and + the :meth:`!setdefault` method requires two arguments. + It also supports a "closing" context manager via the :keyword:`with` keyword. + + .. versionchanged:: 3.2 + Added the :meth:`!get` and :meth:`!setdefault` methods. - A string of characters the *flag* parameter of :meth:`~dbm.gnu.open` supports. + .. versionchanged:: 3.13 + Added the :meth:`!clear` method. - :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.close() + + Close the GDBM database. + .. method:: gdbm.firstkey() It's possible to loop over every key in the database using this method and the @@ -289,16 +320,6 @@ functionality like crash tolerance. When the database has been opened in fast mode, this method forces any unwritten data to be written to the disk. - .. method:: gdbm.close() - - Close the GDBM database. - - .. method:: gdbm.clear() - - Remove all items from the GDBM database. - - .. versionadded:: 3.13 - :mod:`dbm.ndbm` --- New Database Manager ---------------------------------------- @@ -359,22 +380,27 @@ This module can be used with the "classic" NDBM interface or the :param int mode: |mode_param_doc| - :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() + :class:`!ndbm` objects behave similar to mutable :term:`mappings `, + but methods :meth:`!items`, :meth:`!values`, :meth:`!pop`, :meth:`!popitem`, + and :meth:`!update` are not supported, + the :meth:`!keys` method returns a list, and + the :meth:`!setdefault` method requires two arguments. + It also supports a "closing" context manager via the :keyword:`with` keyword. - Close the NDBM database. + .. versionchanged:: 3.2 + Added the :meth:`!get` and :meth:`!setdefault` methods. - .. method:: ndbm.clear() + .. versionchanged:: 3.13 + Added the :meth:`!clear` method. - Remove all items from the NDBM database. + The following method is also provided: - .. versionadded:: 3.13 + .. method:: ndbm.close() + + Close the NDBM database. :mod:`dbm.dumb` --- Portable DBM implementation @@ -412,9 +438,6 @@ The :mod:`!dbm.dumb` module defines the following: .. 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. :param filename: The basename of the database file (without extensions). @@ -448,15 +471,18 @@ The :mod:`!dbm.dumb` module defines the following: .. versionchanged:: 3.11 *filename* accepts a :term:`path-like object`. - In addition to the methods provided by the - :class:`collections.abc.MutableMapping` class, - the following methods are provided: + The returned database object behaves similar to a mutable :term:`mapping`, + but the :meth:`!keys` and :meth:`!items` methods return lists, and + the :meth:`!setdefault` method requires two arguments. + It also supports a "closing" context manager via the :keyword:`with` keyword. - .. method:: dumbdbm.sync() - - Synchronize the on-disk directory and data files. This method is called - by the :meth:`shelve.Shelf.sync` method. + The following methods are also provided: .. method:: dumbdbm.close() Close the database. + + .. method:: dumbdbm.sync() + + Synchronize the on-disk directory and data files. This method is called + by the :meth:`shelve.Shelf.sync` method. diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 4d1187846de6dd..20aeee764f189d 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -834,7 +834,7 @@ dbm (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. + the new :meth:`!clear` methods of the GDBM and NDBM database objects. (Contributed by Donghee Na in :gh:`107122`.) From 8db6615886081deb8f1de8fe9822de7320a91cbd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:30:05 +0200 Subject: [PATCH 1039/1674] [3.14] gh-129368: In PyRun C API docs, clarify what a "start token" is (GH-129935) (#139042) gh-129368: In PyRun C API docs, clarify what a "start token" is (GH-129935) (cherry picked from commit e1eca8b308a585af45e9ebf4f605c9f67b7115d8) Co-authored-by: Rajhans Jadhao --- Doc/c-api/veryhigh.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index fb07fec7effce8..ee0595a9e089c9 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -183,7 +183,8 @@ the same library that the Python runtime is using. objects *globals* and *locals* with the compiler flags specified by *flags*. *globals* must be a dictionary; *locals* can be any object that implements the mapping protocol. The parameter *start* specifies - the start token that should be used to parse the source code. + the start symbol and must one of the following: + :c:data:`Py_eval_input`, :c:data:`Py_file_input`, or :c:data:`Py_single_input`. Returns the result of executing the code as a Python object, or ``NULL`` if an exception was raised. @@ -231,7 +232,7 @@ the same library that the Python runtime is using. .. c:function:: PyObject* Py_CompileStringObject(const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize) Parse and compile the Python source code in *str*, returning the resulting code - object. The start token is given by *start*; this can be used to constrain the + object. The start symbol is given by *start*; this can be used to constrain the code which can be compiled and should be :c:data:`Py_eval_input`, :c:data:`Py_file_input`, or :c:data:`Py_single_input`. The filename specified by *filename* is used to construct the code object and may appear in tracebacks or From e2c901782dfdfd7d9310b86631f1e1075b7a1385 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:30:21 +0200 Subject: [PATCH 1040/1674] [3.14] gh-138952: Document platform.machine() output casing inconsistency across platforms (GH-138962) (#139045) gh-138952: Document platform.machine() output casing inconsistency across platforms (GH-138962) (cherry picked from commit dd15a2e11ea5d16ad42050a2723dec0e400ea394) Co-authored-by: Aniket <148300120+Aniketsy@users.noreply.github.com> Co-authored-by: AN Long --- Doc/library/platform.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 7bba8dd412c3aa..256baa53ed59c7 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -56,6 +56,8 @@ Cross platform Returns the machine type, e.g. ``'AMD64'``. An empty string is returned if the value cannot be determined. + The output is platform-dependent and may differ in casing and naming conventions. + .. function:: node() From 0a517786afc6fd7a56c90688fe0fe41d5913f7bb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:32:55 +0200 Subject: [PATCH 1041/1674] [3.14] Bump mypy to 1.17.1 (GH-137542) (#137543) Bump mypy to 1.17.1 (GH-137542) (cherry picked from commit fb1cb00030c706366dfd1a457dd5de324d5619ea) Co-authored-by: sobolevn --- Tools/requirements-dev.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tools/requirements-dev.txt b/Tools/requirements-dev.txt index 0beaab2d3e7157..73236767374378 100644 --- a/Tools/requirements-dev.txt +++ b/Tools/requirements-dev.txt @@ -1,7 +1,7 @@ # Requirements file for external linters and checks we run on # Tools/clinic, Tools/cases_generator/, and Tools/peg_generator/ in CI -mypy==1.16.1 +mypy==1.17.1 # needed for peg_generator: -types-psutil==7.0.0.20250601 -types-setuptools==80.9.0.20250529 +types-psutil==7.0.0.20250801 +types-setuptools==80.9.0.20250801 From 29cffb1c02759348c66f3deba4934e2c2b0b467c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:34:15 +0200 Subject: [PATCH 1042/1674] [3.14] fix comment reference from man 7 signal to man 7 signal-safety (GH-138554) (#138594) fix comment reference from man 7 signal to man 7 signal-safety (GH-138554) (cherry picked from commit 2f5ace780ba3880ce07c4aacbda08ebba36e3b4d) docs: fix comment reference from man 7 signal to man 7 signal-safety Co-authored-by: mqudah --- Modules/_posixsubprocess.c | 2 +- Modules/signalmodule.c | 2 +- Python/pylifecycle.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index b542f86b6fe8da..6ce3494e778df3 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -630,7 +630,7 @@ reset_signal_handlers(const sigset_t *child_sigmask) * (v)fork to set things up and call exec(). * * All of the code in this function must only use async-signal-safe functions, - * listed at `man 7 signal` or + * listed at `man 7 signal-safety` or * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. * * This restriction is documented at diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index c1c3d7c9c05534..c25e695e7ff5fa 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1940,7 +1940,7 @@ signal_install_handlers(void) /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. * * All of the code in this function must only use async-signal-safe functions, - * listed at `man 7 signal` or + * listed at `man 7 signal-safety` or * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. * * If this function is updated, update also _posix_spawn() of subprocess.py. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8d1e48aa8ad8ad..5b9ce617a48676 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -3597,7 +3597,7 @@ PyOS_getsig(int sig) /* * All of the code in this function must only use async-signal-safe functions, - * listed at `man 7 signal` or + * listed at `man 7 signal-safety` or * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. */ PyOS_sighandler_t From 77b4ed2a37f460af435df07fe25a888d8d61710e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:35:38 +0200 Subject: [PATCH 1043/1674] [3.14] gh-138489: Add missing `build-details.json` step for building wasm (GH-139302) (GH-139557) (cherry picked from commit db53ca30d761abba525bc8e47b16920b1fc43a83) Signed-off-by: Ho Kim Co-authored-by: Ho Kim Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Makefile.pre.in | 2 +- .../Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index ca536d32a61167..34a270ab31167a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -801,7 +801,7 @@ build_all: check-clean-src check-app-store-compliance $(BUILDPYTHON) platform sh .PHONY: build_wasm build_wasm: check-clean-src $(BUILDPYTHON) platform sharedmods \ - python-config checksharedmods + python-config checksharedmods build-details.json .PHONY: build_emscripten build_emscripten: build_wasm web_example web_example_pyrepl_jspi diff --git a/Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst b/Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst new file mode 100644 index 00000000000000..b11098a3f87953 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst @@ -0,0 +1,6 @@ +When cross-compiling for WASI by ``build_wasm`` or ``build_emscripten``, the +``build-details.json`` step is now included in the build process, just like +with native builds. + +This fixes the ``libinstall`` task which requires the ``build-details.json`` +file during the process. From 4bb33ff1c19ae2fd506a0cd7a07a6c192f20da5b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:36:55 +0200 Subject: [PATCH 1044/1674] [3.14] gh-138779: Use the dev_t converter for st_rdev (GH-138780) (#138926) gh-138779: Use the dev_t converter for st_rdev (GH-138780) This allows to support device numbers larger than 2**63-1. (cherry picked from commit 43013f72f0aadc5ee428aa5bdf6d949b4e79779a) Co-authored-by: Serhiy Storchaka --- .../Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst | 3 +++ Modules/posixmodule.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst diff --git a/Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst b/Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst new file mode 100644 index 00000000000000..d54f21ffb89669 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst @@ -0,0 +1,3 @@ +Support device numbers larger than ``2**63-1`` for the +:attr:`~os.stat_result.st_rdev` field of the :class:`os.stat_result` +structure. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e1576f809fa766..c6bc9c9c50488f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2744,7 +2744,7 @@ _pystat_fromstructstat(PyObject *module, STRUCT_STAT *st) SET_ITEM(ST_BLOCKS_IDX, PyLong_FromLong((long)st->st_blocks)); #endif #ifdef HAVE_STRUCT_STAT_ST_RDEV - SET_ITEM(ST_RDEV_IDX, PyLong_FromLong((long)st->st_rdev)); + SET_ITEM(ST_RDEV_IDX, _PyLong_FromDev(st->st_rdev)); #endif #ifdef HAVE_STRUCT_STAT_ST_GEN SET_ITEM(ST_GEN_IDX, PyLong_FromLong((long)st->st_gen)); From ebbfd8f51af471ce4857cafe11cf77d7a1ef2034 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 7 Oct 2025 20:38:26 +0200 Subject: [PATCH 1045/1674] [3.14] gh-138736: Fix sqlite3.Connection.blobopen 'row' parameter type and naming (#138738) (GH-139062) (cherry picked from commit 8eb106240f5d70baeabd4ad137de6213dd8cfb30) Co-authored-by: chiri --- Doc/library/sqlite3.rst | 6 +++--- Modules/_sqlite/clinic/connection.c.h | 8 ++++---- Modules/_sqlite/connection.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index e939e61a9676ee..0f00f7e93c1810 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -614,7 +614,7 @@ Connection objects supplied, this must be a :term:`callable` returning an instance of :class:`Cursor` or its subclasses. - .. method:: blobopen(table, column, row, /, *, readonly=False, name="main") + .. method:: blobopen(table, column, rowid, /, *, readonly=False, name="main") Open a :class:`Blob` handle to an existing :abbr:`BLOB (Binary Large OBject)`. @@ -625,8 +625,8 @@ Connection objects :param str column: The name of the column where the blob is located. - :param str row: - The name of the row where the blob is located. + :param int rowid: + The row id where the blob is located. :param bool readonly: Set to ``True`` if the blob should be opened without write diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index c8e1d0b7a738d3..b4415a9bc8fa55 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -235,7 +235,7 @@ pysqlite_connection_cursor(PyObject *self, PyObject *const *args, Py_ssize_t nar } PyDoc_STRVAR(blobopen__doc__, -"blobopen($self, table, column, row, /, *, readonly=False, name=\'main\')\n" +"blobopen($self, table, column, rowid, /, *, readonly=False, name=\'main\')\n" "--\n" "\n" "Open and return a BLOB object.\n" @@ -244,8 +244,8 @@ PyDoc_STRVAR(blobopen__doc__, " Table name.\n" " column\n" " Column name.\n" -" row\n" -" Row index.\n" +" rowid\n" +" Row id.\n" " readonly\n" " Open the BLOB without write permissions.\n" " name\n" @@ -1921,4 +1921,4 @@ getconfig(PyObject *self, PyObject *arg) #ifndef DESERIALIZE_METHODDEF #define DESERIALIZE_METHODDEF #endif /* !defined(DESERIALIZE_METHODDEF) */ -/*[clinic end generated code: output=2f325c2444b4bb47 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7b502667df24ee41 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index be4ad89c6b98aa..679e987aa75dbf 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -582,8 +582,8 @@ _sqlite3.Connection.blobopen as blobopen Table name. column as col: str Column name. - row: sqlite3_int64 - Row index. + rowid as row: sqlite3_int64 + Row id. / * readonly: bool = False @@ -597,7 +597,7 @@ Open and return a BLOB object. static PyObject * blobopen_impl(pysqlite_Connection *self, const char *table, const char *col, sqlite3_int64 row, int readonly, const char *name) -/*[clinic end generated code: output=6a02d43efb885d1c input=23576bd1108d8774]*/ +/*[clinic end generated code: output=6a02d43efb885d1c input=cc3d4b47dac08401]*/ { if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { return NULL; From 14e8decde76d1ae5055dd41e4cb899e4941f020b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:39:13 +0200 Subject: [PATCH 1046/1674] [3.14] gh-137273: Fix debug assertion failure in locale.setlocale() on Windows (GH-137300) (#137305) gh-137273: Fix debug assertion failure in locale.setlocale() on Windows (GH-137300) It happened when there were at least 16 characters after dot in the locale name. (cherry picked from commit 718e0c89ba0610bba048245028ac133bbf2d44c2) Co-authored-by: Serhiy Storchaka --- Lib/test/test_locale.py | 70 +++++++++++++------ ...-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst | 1 + Modules/_localemodule.c | 47 +++++++++++++ 3 files changed, 97 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 55b502e52ca454..698e137e3e8abd 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -5,6 +5,7 @@ from unittest import mock import unittest import locale +import os import sys import codecs @@ -486,6 +487,54 @@ def test_japanese(self): self.check('jp_jp', 'ja_JP.eucJP') +class TestRealLocales(unittest.TestCase): + def setUp(self): + oldlocale = locale.setlocale(locale.LC_CTYPE) + self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) + + def test_getsetlocale_issue1813(self): + # Issue #1813: setting and getting the locale under a Turkish locale + try: + locale.setlocale(locale.LC_CTYPE, 'tr_TR') + except locale.Error: + # Unsupported locale on this system + self.skipTest('test needs Turkish locale') + loc = locale.getlocale(locale.LC_CTYPE) + if verbose: + print('testing with %a' % (loc,), end=' ', flush=True) + try: + locale.setlocale(locale.LC_CTYPE, loc) + except locale.Error as exc: + # bpo-37945: setlocale(LC_CTYPE) fails with getlocale(LC_CTYPE) + # and the tr_TR locale on Windows. getlocale() builds a locale + # which is not recognize by setlocale(). + self.skipTest(f"setlocale(LC_CTYPE, {loc!r}) failed: {exc!r}") + self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE)) + + @unittest.skipUnless(os.name == 'nt', 'requires Windows') + def test_setlocale_long_encoding(self): + with self.assertRaises(locale.Error): + locale.setlocale(locale.LC_CTYPE, 'English.%016d' % 1252) + locale.setlocale(locale.LC_CTYPE, 'English.%015d' % 1252) + loc = locale.setlocale(locale.LC_ALL) + self.assertIn('.1252', loc) + loc2 = loc.replace('.1252', '.%016d' % 1252, 1) + with self.assertRaises(locale.Error): + locale.setlocale(locale.LC_ALL, loc2) + loc2 = loc.replace('.1252', '.%015d' % 1252, 1) + locale.setlocale(locale.LC_ALL, loc2) + + # gh-137273: Debug assertion failure on Windows for long encoding. + with self.assertRaises(locale.Error): + locale.setlocale(locale.LC_CTYPE, 'en_US.' + 'x'*16) + locale.setlocale(locale.LC_CTYPE, 'en_US.UTF-8') + loc = locale.setlocale(locale.LC_ALL) + self.assertIn('.UTF-8', loc) + loc2 = loc.replace('.UTF-8', '.' + 'x'*16, 1) + with self.assertRaises(locale.Error): + locale.setlocale(locale.LC_ALL, loc2) + + class TestMiscellaneous(unittest.TestCase): def test_defaults_UTF8(self): # Issue #18378: on (at least) macOS setting LC_CTYPE to "UTF-8" is @@ -552,27 +601,6 @@ def test_setlocale_category(self): # crasher from bug #7419 self.assertRaises(locale.Error, locale.setlocale, 12345) - def test_getsetlocale_issue1813(self): - # Issue #1813: setting and getting the locale under a Turkish locale - oldlocale = locale.setlocale(locale.LC_CTYPE) - self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) - try: - locale.setlocale(locale.LC_CTYPE, 'tr_TR') - except locale.Error: - # Unsupported locale on this system - self.skipTest('test needs Turkish locale') - loc = locale.getlocale(locale.LC_CTYPE) - if verbose: - print('testing with %a' % (loc,), end=' ', flush=True) - try: - locale.setlocale(locale.LC_CTYPE, loc) - except locale.Error as exc: - # bpo-37945: setlocale(LC_CTYPE) fails with getlocale(LC_CTYPE) - # and the tr_TR locale on Windows. getlocale() builds a locale - # which is not recognize by setlocale(). - self.skipTest(f"setlocale(LC_CTYPE, {loc!r}) failed: {exc!r}") - self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE)) - def test_invalid_locale_format_in_localetuple(self): with self.assertRaises(TypeError): locale.setlocale(locale.LC_ALL, b'fi_FI') diff --git a/Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst b/Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst new file mode 100644 index 00000000000000..f344877955fea0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst @@ -0,0 +1 @@ +Fix debug assertion failure in :func:`locale.setlocale` on Windows. diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 41e6d48b1dbd9b..17b5220fd6f9e1 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -87,6 +87,41 @@ copy_grouping(const char* s) return result; } +#if defined(MS_WINDOWS) + +// 16 is the number of elements in the szCodePage field +// of the __crt_locale_strings structure. +#define MAX_CP_LEN 15 + +static int +check_locale_name(const char *locale, const char *end) +{ + size_t len = end ? (size_t)(end - locale) : strlen(locale); + const char *dot = memchr(locale, '.', len); + if (dot && locale + len - dot - 1 > MAX_CP_LEN) { + return -1; + } + return 0; +} + +static int +check_locale_name_all(const char *locale) +{ + const char *start = locale; + while (1) { + const char *end = strchr(start, ';'); + if (check_locale_name(start, end) < 0) { + return -1; + } + if (end == NULL) { + break; + } + start = end + 1; + } + return 0; +} +#endif + /*[clinic input] _locale.setlocale @@ -111,6 +146,18 @@ _locale_setlocale_impl(PyObject *module, int category, const char *locale) "invalid locale category"); return NULL; } + if (locale) { + if ((category == LC_ALL + ? check_locale_name_all(locale) + : check_locale_name(locale, NULL)) < 0) + { + /* Debug assertion failure on Windows. + * _Py_BEGIN_SUPPRESS_IPH/_Py_END_SUPPRESS_IPH do not help. */ + PyErr_SetString(get_locale_state(module)->Error, + "unsupported locale setting"); + return NULL; + } + } #endif if (locale) { From a868c6a70d87e7529bba78610b7d0f380bbfbb94 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:39:57 +0200 Subject: [PATCH 1047/1674] [3.14] gh-136520: Clarify docs for _pack_ & _align_ (GH-137036) (#137381) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-136520: Clarify docs for _pack_ & _align_ (GH-137036) Move docs to the reference section & reduce the “tutorial” part to a quick intro & link. Clarify what values are accepted. Add macro/attribute equivalents. Discourage _align_ values that aren't powers of two. (cherry picked from commit 8943bb722f2f88a95ea6c5ee36bb5d540740d792) Co-authored-by: Petr Viktorin --- Doc/library/ctypes.rst | 44 ++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 09f596101b4d1e..d8dac24c8ab532 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -700,14 +700,10 @@ compiler does it. It is possible to override this behavior entirely by specifyi :attr:`~Structure._layout_` class attribute in the subclass definition; see the attribute documentation for details. -It is possible to specify the maximum alignment for the fields by setting -the :attr:`~Structure._pack_` class attribute to a positive integer. -This matches what ``#pragma pack(n)`` 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. +It is possible to specify the maximum alignment for the fields and/or for the +structure itself by setting the class attributes :attr:`~Structure._pack_` +and/or :attr:`~Structure._align_`, respectively. +See the attribute documentation for details. :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 @@ -2792,11 +2788,18 @@ fields, or any other data types containing pointer type fields. .. attribute:: _pack_ An optional small integer that allows overriding the alignment of - structure fields in the instance. :attr:`_pack_` must already be defined - when :attr:`_fields_` is assigned, otherwise it will have no effect. - Setting this attribute to 0 is the same as not setting it at all. + structure fields in the instance. + + This is only implemented for the MSVC-compatible memory layout + (see :attr:`_layout_`). - This is only implemented for the MSVC-compatible memory layout. + Setting :attr:`!_pack_` to 0 is the same as not setting it at all. + Otherwise, the value must be a positive power of two. + The effect is equivalent to ``#pragma pack(N)`` in C, except + :mod:`ctypes` may allow larger *n* than what the compiler accepts. + + :attr:`!_pack_` must already be defined + when :attr:`_fields_` is assigned, otherwise it will have no effect. .. deprecated-removed:: 3.14 3.19 @@ -2809,9 +2812,22 @@ fields, or any other data types containing pointer type fields. .. attribute:: _align_ - An optional small integer that allows overriding the alignment of + An optional small integer that allows increasing 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. + + The value must not be negative. + The effect is equivalent to ``__attribute__((aligned(N)))`` on GCC + or ``#pragma align(N)`` on MSVC, except :mod:`ctypes` may allow + values that the compiler would reject. + + :attr:`!_align_` can only *increase* a structure's alignment + requirements. Setting it to 0 or 1 has no effect. + + Using values that are not powers of two is discouraged and may lead to + surprising behavior. + + :attr:`!_align_` must already be defined + when :attr:`_fields_` is assigned, otherwise it will have no effect. .. versionadded:: 3.13 From b414ad10434de87c8b04dc3d819fa01e712f550f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:40:42 +0200 Subject: [PATCH 1048/1674] [3.14] gh-81325: Support path-like objects with streaming TarFile (GH-137188) (#137365) gh-81325: Support path-like objects with streaming TarFile (GH-137188) (cherry picked from commit 3ec3d053452af8a769c18826ea61ba66fc73c8da) Co-authored-by: Alexander Urieles Co-authored-by: Emma Smith --- Lib/tarfile.py | 2 +- Lib/test/test_tarfile.py | 10 ++++++++++ .../2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 7dff0122da7775..c7e9f7d681a8b1 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -353,7 +353,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize, fileobj = _StreamProxy(fileobj) comptype = fileobj.getcomptype() - self.name = name or "" + self.name = os.fspath(name) if name is not None else "" self.mode = mode self.comptype = comptype self.fileobj = fileobj diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index b23ff34bc327c6..860413b88eb6b5 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1788,6 +1788,16 @@ def test_file_mode(self): finally: os.umask(original_umask) + def test_pathlike_name(self): + expected_name = os.path.abspath(tmpname) + tarpath = os_helper.FakePath(tmpname) + + for func in (tarfile.open, tarfile.TarFile.open): + with self.subTest(): + with func(tarpath, self.mode) as tar: + self.assertEqual(tar.name, expected_name) + os_helper.unlink(tmpname) + class GzipStreamWriteTest(GzipTest, StreamWriteTest): def test_source_directory_not_leaked(self): diff --git a/Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst b/Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst new file mode 100644 index 00000000000000..3d89b6eb92a0d6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst @@ -0,0 +1,2 @@ +:class:`tarfile.TarFile` now accepts a :term:`path-like ` when working on a tar archive. +(Contributed by Alexander Enrique Urieles Nieto in :gh:`81325`.) From c4be405fe98e2e6176475c87d12ddf9668e8dda2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:43:12 +0200 Subject: [PATCH 1049/1674] [3.14] gh-137044: Support large limit values in getrlimit() and setrlimit() (GH-137338) (#137506) gh-137044: Support large limit values in getrlimit() and setrlimit() (GH-137338) * Return large limit values as positive integers instead of negative integers in resource.getrlimit(). * Accept large values and reject negative values (except RLIM_INFINITY) for limits in resource.setrlimit(). (cherry picked from commit baefaa6cba1d69efd2f930cdc56bca682c54b139) Co-authored-by: Serhiy Storchaka --- Lib/test/test_resource.py | 215 +++++++++++------- ...-08-03-13-16-39.gh-issue-137044.0hPVL_.rst | 4 + Modules/clinic/resource.c.h | 18 +- Modules/resource.c | 84 ++++--- 4 files changed, 200 insertions(+), 121 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py index d23d3623235f38..fe05224828bd27 100644 --- a/Lib/test/test_resource.py +++ b/Lib/test/test_resource.py @@ -14,89 +14,154 @@ class ResourceTest(unittest.TestCase): def test_args(self): self.assertRaises(TypeError, resource.getrlimit) - self.assertRaises(TypeError, resource.getrlimit, 42, 42) + self.assertRaises(TypeError, resource.getrlimit, 0, 42) + self.assertRaises(OverflowError, resource.getrlimit, 2**1000) + self.assertRaises(OverflowError, resource.getrlimit, -2**1000) + self.assertRaises(TypeError, resource.getrlimit, '0') self.assertRaises(TypeError, resource.setrlimit) - self.assertRaises(TypeError, resource.setrlimit, 42, 42, 42) + self.assertRaises(TypeError, resource.setrlimit, 0) + self.assertRaises(TypeError, resource.setrlimit, 0, 42) + self.assertRaises(TypeError, resource.setrlimit, 0, 42, 42) + self.assertRaises(OverflowError, resource.setrlimit, 2**1000, (42, 42)) + self.assertRaises(OverflowError, resource.setrlimit, -2**1000, (42, 42)) + self.assertRaises(ValueError, resource.setrlimit, 0, (42,)) + self.assertRaises(ValueError, resource.setrlimit, 0, (42, 42, 42)) + self.assertRaises(TypeError, resource.setrlimit, '0', (42, 42)) + self.assertRaises(TypeError, resource.setrlimit, 0, ('42', 42)) + self.assertRaises(TypeError, resource.setrlimit, 0, (42, '42')) @unittest.skipIf(sys.platform == "vxworks", "setting RLIMIT_FSIZE is not supported on VxWorks") + @unittest.skipUnless(hasattr(resource, 'RLIMIT_FSIZE'), 'requires resource.RLIMIT_FSIZE') def test_fsize_ismax(self): - try: - (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) - except AttributeError: - pass - else: - # RLIMIT_FSIZE should be RLIM_INFINITY, which will be a really big - # number on a platform with large file support. On these platforms, - # we need to test that the get/setrlimit functions properly convert - # the number to a C long long and that the conversion doesn't raise - # an error. - self.assertEqual(resource.RLIM_INFINITY, max) - resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) + (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) + # RLIMIT_FSIZE should be RLIM_INFINITY, which will be a really big + # number on a platform with large file support. On these platforms, + # we need to test that the get/setrlimit functions properly convert + # the number to a C long long and that the conversion doesn't raise + # an error. + self.assertEqual(resource.RLIM_INFINITY, max) + resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) + @unittest.skipIf(sys.platform == "vxworks", + "setting RLIMIT_FSIZE is not supported on VxWorks") + @unittest.skipUnless(hasattr(resource, 'RLIMIT_FSIZE'), 'requires resource.RLIMIT_FSIZE') def test_fsize_enforced(self): + (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) + # Check to see what happens when the RLIMIT_FSIZE is small. Some + # versions of Python were terminated by an uncaught SIGXFSZ, but + # pythonrun.c has been fixed to ignore that exception. If so, the + # write() should return EFBIG when the limit is exceeded. + + # At least one platform has an unlimited RLIMIT_FSIZE and attempts + # to change it raise ValueError instead. try: - (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) - except AttributeError: - pass - else: - # Check to see what happens when the RLIMIT_FSIZE is small. Some - # versions of Python were terminated by an uncaught SIGXFSZ, but - # pythonrun.c has been fixed to ignore that exception. If so, the - # write() should return EFBIG when the limit is exceeded. - - # At least one platform has an unlimited RLIMIT_FSIZE and attempts - # to change it raise ValueError instead. try: + resource.setrlimit(resource.RLIMIT_FSIZE, (1024, max)) + limit_set = True + except ValueError: + limit_set = False + f = open(os_helper.TESTFN, "wb") + try: + f.write(b"X" * 1024) try: - resource.setrlimit(resource.RLIMIT_FSIZE, (1024, max)) - limit_set = True - except ValueError: - limit_set = False - f = open(os_helper.TESTFN, "wb") - try: - f.write(b"X" * 1024) - try: - f.write(b"Y") + f.write(b"Y") + f.flush() + # On some systems (e.g., Ubuntu on hppa) the flush() + # doesn't always cause the exception, but the close() + # does eventually. Try flushing several times in + # an attempt to ensure the file is really synced and + # the exception raised. + for i in range(5): + time.sleep(.1) f.flush() - # On some systems (e.g., Ubuntu on hppa) the flush() - # doesn't always cause the exception, but the close() - # does eventually. Try flushing several times in - # an attempt to ensure the file is really synced and - # the exception raised. - for i in range(5): - time.sleep(.1) - f.flush() - except OSError: - if not limit_set: - raise - if limit_set: - # Close will attempt to flush the byte we wrote - # Restore limit first to avoid getting a spurious error - resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) - finally: - f.close() - finally: + except OSError: + if not limit_set: + raise if limit_set: + # Close will attempt to flush the byte we wrote + # Restore limit first to avoid getting a spurious error resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) - os_helper.unlink(os_helper.TESTFN) + finally: + f.close() + finally: + if limit_set: + resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) + os_helper.unlink(os_helper.TESTFN) - def test_fsize_toobig(self): + @unittest.skipIf(sys.platform == "vxworks", + "setting RLIMIT_FSIZE is not supported on VxWorks") + @unittest.skipUnless(hasattr(resource, 'RLIMIT_FSIZE'), 'requires resource.RLIMIT_FSIZE') + def test_fsize_too_big(self): # Be sure that setrlimit is checking for really large values too_big = 10**50 + (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) + try: + resource.setrlimit(resource.RLIMIT_FSIZE, (too_big, max)) + except (OverflowError, ValueError): + pass try: - (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) - except AttributeError: + resource.setrlimit(resource.RLIMIT_FSIZE, (max, too_big)) + except (OverflowError, ValueError): pass + + @unittest.skipIf(sys.platform == "vxworks", + "setting RLIMIT_FSIZE is not supported on VxWorks") + @unittest.skipUnless(hasattr(resource, 'RLIMIT_FSIZE'), 'requires resource.RLIMIT_FSIZE') + def test_fsize_not_too_big(self): + (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) + self.addCleanup(resource.setrlimit, resource.RLIMIT_FSIZE, (cur, max)) + + def expected(cur): + if resource.RLIM_INFINITY < 0: + return [(cur, max), (resource.RLIM_INFINITY, max)] + elif resource.RLIM_INFINITY < cur: + return [(resource.RLIM_INFINITY, max)] + else: + return [(cur, max)] + + resource.setrlimit(resource.RLIMIT_FSIZE, (2**31-5, max)) + self.assertEqual(resource.getrlimit(resource.RLIMIT_FSIZE), (2**31-5, max)) + + try: + resource.setrlimit(resource.RLIMIT_FSIZE, (2**32, max)) + except OverflowError: + resource.setrlimit(resource.RLIMIT_FSIZE, (2**31, max)) + self.assertIn(resource.getrlimit(resource.RLIMIT_FSIZE), expected(2**31)) + resource.setrlimit(resource.RLIMIT_FSIZE, (2**32-5, max)) + self.assertIn(resource.getrlimit(resource.RLIMIT_FSIZE), expected(2**32-5)) else: + self.assertIn(resource.getrlimit(resource.RLIMIT_FSIZE), expected(2**32)) + resource.setrlimit(resource.RLIMIT_FSIZE, (2**31, max)) + self.assertEqual(resource.getrlimit(resource.RLIMIT_FSIZE), (2**31, max)) + resource.setrlimit(resource.RLIMIT_FSIZE, (2**32-5, max)) + self.assertEqual(resource.getrlimit(resource.RLIMIT_FSIZE), (2**32-5, max)) + + resource.setrlimit(resource.RLIMIT_FSIZE, (2**63-5, max)) + self.assertIn(resource.getrlimit(resource.RLIMIT_FSIZE), expected(2**63-5)) try: - resource.setrlimit(resource.RLIMIT_FSIZE, (too_big, max)) - except (OverflowError, ValueError): - pass - try: - resource.setrlimit(resource.RLIMIT_FSIZE, (max, too_big)) - except (OverflowError, ValueError): + resource.setrlimit(resource.RLIMIT_FSIZE, (2**63, max)) + except ValueError: + # There is a hard limit on macOS. pass + else: + self.assertIn(resource.getrlimit(resource.RLIMIT_FSIZE), expected(2**63)) + resource.setrlimit(resource.RLIMIT_FSIZE, (2**64-5, max)) + self.assertIn(resource.getrlimit(resource.RLIMIT_FSIZE), expected(2**64-5)) + + @unittest.skipIf(sys.platform == "vxworks", + "setting RLIMIT_FSIZE is not supported on VxWorks") + @unittest.skipUnless(hasattr(resource, 'RLIMIT_FSIZE'), 'requires resource.RLIMIT_FSIZE') + def test_fsize_negative(self): + (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) + for value in -5, -2**31, -2**32-5, -2**63, -2**64-5, -2**1000: + with self.subTest(value=value): + # This test assumes that the values don't map to RLIM_INFINITY, + # though Posix doesn't guarantee it. + self.assertNotEqual(value, resource.RLIM_INFINITY) + + self.assertRaises(ValueError, resource.setrlimit, resource.RLIMIT_FSIZE, (value, max)) + self.assertRaises(ValueError, resource.setrlimit, resource.RLIMIT_FSIZE, (cur, value)) @unittest.skipUnless(hasattr(resource, "getrusage"), "needs getrusage") def test_getrusage(self): @@ -117,21 +182,18 @@ def test_getrusage(self): # Issue 6083: Reference counting bug @unittest.skipIf(sys.platform == "vxworks", "setting RLIMIT_CPU is not supported on VxWorks") + @unittest.skipUnless(hasattr(resource, 'RLIMIT_CPU'), 'requires resource.RLIMIT_CPU') def test_setrusage_refcount(self): - try: - limits = resource.getrlimit(resource.RLIMIT_CPU) - except AttributeError: - pass - else: - class BadSequence: - def __len__(self): - return 2 - def __getitem__(self, key): - if key in (0, 1): - return len(tuple(range(1000000))) - raise IndexError + limits = resource.getrlimit(resource.RLIMIT_CPU) + class BadSequence: + def __len__(self): + return 2 + def __getitem__(self, key): + if key in (0, 1): + return len(tuple(range(1000000))) + raise IndexError - resource.setrlimit(resource.RLIMIT_CPU, BadSequence()) + resource.setrlimit(resource.RLIMIT_CPU, BadSequence()) def test_pagesize(self): pagesize = resource.getpagesize() @@ -168,7 +230,8 @@ class BadSeq: def __len__(self): return 2 def __getitem__(self, key): - return limits[key] - 1 # new reference + lim = limits[key] + return lim - 1 if lim > 0 else lim + sys.maxsize*2 # new reference limits = resource.getrlimit(resource.RLIMIT_AS) self.assertEqual(resource.prlimit(0, resource.RLIMIT_AS, BadSeq()), diff --git a/Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst b/Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst new file mode 100644 index 00000000000000..f5f96263823e86 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst @@ -0,0 +1,4 @@ +Return large limit values as positive integers instead of negative integers +in :func:`resource.getrlimit`. Accept large values and reject negative +values (except :data:`~resource.RLIM_INFINITY`) for limits in +:func:`resource.setrlimit`. diff --git a/Modules/clinic/resource.c.h b/Modules/clinic/resource.c.h index 9eda7de27532a1..e4ef93900d1797 100644 --- a/Modules/clinic/resource.c.h +++ b/Modules/clinic/resource.c.h @@ -2,6 +2,8 @@ preserve [clinic start generated code]*/ +#include "pycore_modsupport.h" // _PyArg_CheckPositional() + #if defined(HAVE_GETRUSAGE) PyDoc_STRVAR(resource_getrusage__doc__, @@ -66,7 +68,7 @@ PyDoc_STRVAR(resource_setrlimit__doc__, "\n"); #define RESOURCE_SETRLIMIT_METHODDEF \ - {"setrlimit", (PyCFunction)(void(*)(void))resource_setrlimit, METH_FASTCALL, resource_setrlimit__doc__}, + {"setrlimit", _PyCFunction_CAST(resource_setrlimit), METH_FASTCALL, resource_setrlimit__doc__}, static PyObject * resource_setrlimit_impl(PyObject *module, int resource, PyObject *limits); @@ -78,8 +80,7 @@ resource_setrlimit(PyObject *module, PyObject *const *args, Py_ssize_t nargs) int resource; PyObject *limits; - if (nargs != 2) { - PyErr_Format(PyExc_TypeError, "setrlimit expected 2 arguments, got %zd", nargs); + if (!_PyArg_CheckPositional("setrlimit", nargs, 2, 2)) { goto exit; } resource = PyLong_AsInt(args[0]); @@ -101,7 +102,7 @@ PyDoc_STRVAR(resource_prlimit__doc__, "\n"); #define RESOURCE_PRLIMIT_METHODDEF \ - {"prlimit", (PyCFunction)(void(*)(void))resource_prlimit, METH_FASTCALL, resource_prlimit__doc__}, + {"prlimit", _PyCFunction_CAST(resource_prlimit), METH_FASTCALL, resource_prlimit__doc__}, static PyObject * resource_prlimit_impl(PyObject *module, pid_t pid, int resource, @@ -115,12 +116,7 @@ resource_prlimit(PyObject *module, PyObject *const *args, Py_ssize_t nargs) int resource; PyObject *limits = Py_None; - if (nargs < 2) { - PyErr_Format(PyExc_TypeError, "prlimit expected at least 2 arguments, got %zd", nargs); - goto exit; - } - if (nargs > 3) { - PyErr_Format(PyExc_TypeError, "prlimit expected at most 3 arguments, got %zd", nargs); + if (!_PyArg_CheckPositional("prlimit", nargs, 2, 3)) { goto exit; } pid = PyLong_AsPid(args[0]); @@ -178,4 +174,4 @@ resource_getpagesize(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef RESOURCE_PRLIMIT_METHODDEF #define RESOURCE_PRLIMIT_METHODDEF #endif /* !defined(RESOURCE_PRLIMIT_METHODDEF) */ -/*[clinic end generated code: output=e45883ace510414a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8e905b2f5c35170e input=a9049054013a1b77]*/ diff --git a/Modules/resource.c b/Modules/resource.c index 3fe18e7c98e3d8..2353bc6653abd8 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -1,7 +1,5 @@ -// Need limited C API version 3.13 for PySys_Audit() -#include "pyconfig.h" // Py_GIL_DISABLED -#ifndef Py_GIL_DISABLED -# define Py_LIMITED_API 0x030d0000 +#ifndef Py_BUILD_CORE_BUILTIN +# define Py_BUILD_CORE_MODULE 1 #endif #include "Python.h" @@ -150,6 +148,35 @@ resource_getrusage_impl(PyObject *module, int who) } #endif +static int +py2rlim(PyObject *obj, rlim_t *out) +{ + obj = PyNumber_Index(obj); + if (obj == NULL) { + return -1; + } + int neg = PyLong_IsNegative(obj); + assert(neg >= 0); + Py_ssize_t bytes = PyLong_AsNativeBytes(obj, out, sizeof(*out), + Py_ASNATIVEBYTES_NATIVE_ENDIAN | + Py_ASNATIVEBYTES_UNSIGNED_BUFFER); + Py_DECREF(obj); + if (bytes < 0) { + return -1; + } + else if (neg && (*out != RLIM_INFINITY || bytes > (Py_ssize_t)sizeof(*out))) { + PyErr_SetString(PyExc_ValueError, + "Cannot convert negative int"); + return -1; + } + else if (bytes > (Py_ssize_t)sizeof(*out)) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C rlim_t"); + return -1; + } + return 0; +} + static int py2rlimit(PyObject *limits, struct rlimit *rl_out) { @@ -166,26 +193,13 @@ py2rlimit(PyObject *limits, struct rlimit *rl_out) } curobj = PyTuple_GetItem(limits, 0); // borrowed maxobj = PyTuple_GetItem(limits, 1); // borrowed -#if !defined(HAVE_LARGEFILE_SUPPORT) - rl_out->rlim_cur = PyLong_AsLong(curobj); - if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred()) - goto error; - rl_out->rlim_max = PyLong_AsLong(maxobj); - if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred()) - goto error; -#else - /* The limits are probably bigger than a long */ - rl_out->rlim_cur = PyLong_AsLongLong(curobj); - if (rl_out->rlim_cur == (rlim_t)-1 && PyErr_Occurred()) - goto error; - rl_out->rlim_max = PyLong_AsLongLong(maxobj); - if (rl_out->rlim_max == (rlim_t)-1 && PyErr_Occurred()) + if (py2rlim(curobj, &rl_out->rlim_cur) < 0 || + py2rlim(maxobj, &rl_out->rlim_max) < 0) + { goto error; -#endif + } Py_DECREF(limits); - rl_out->rlim_cur = rl_out->rlim_cur & RLIM_INFINITY; - rl_out->rlim_max = rl_out->rlim_max & RLIM_INFINITY; return 0; error: @@ -193,15 +207,24 @@ py2rlimit(PyObject *limits, struct rlimit *rl_out) return -1; } +static PyObject* +rlim2py(rlim_t value) +{ + if (value == RLIM_INFINITY) { + return PyLong_FromNativeBytes(&value, sizeof(value), -1); + } + return PyLong_FromUnsignedNativeBytes(&value, sizeof(value), -1); +} + static PyObject* rlimit2py(struct rlimit rl) { - if (sizeof(rl.rlim_cur) > sizeof(long)) { - return Py_BuildValue("LL", - (long long) rl.rlim_cur, - (long long) rl.rlim_max); + PyObject *cur = rlim2py(rl.rlim_cur); + if (cur == NULL) { + return NULL; } - return Py_BuildValue("ll", (long) rl.rlim_cur, (long) rl.rlim_max); + PyObject *max = rlim2py(rl.rlim_max); + return Py_BuildValue("NN", cur, max); } /*[clinic input] @@ -495,14 +518,7 @@ resource_exec(PyObject *module) ADD_INT(module, RLIMIT_KQUEUES); #endif - PyObject *v; - if (sizeof(RLIM_INFINITY) > sizeof(long)) { - v = PyLong_FromLongLong((long long) RLIM_INFINITY); - } else - { - v = PyLong_FromLong((long) RLIM_INFINITY); - } - if (PyModule_Add(module, "RLIM_INFINITY", v) < 0) { + if (PyModule_Add(module, "RLIM_INFINITY", rlim2py(RLIM_INFINITY)) < 0) { return -1; } return 0; From db8b943259a43ee36840f9906f5e9bc8172d779d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:45:49 +0200 Subject: [PATCH 1050/1674] [3.14] GH-92266: Remove embedded tabs from ``c-analyzer/cpython/_parser.py`` (GH-137622) (#139718) GH-92266: Remove embedded tabs from ``c-analyzer/cpython/_parser.py`` (GH-137622) (cherry picked from commit 2212ae5557d4ad9dfc792f728d2bf2697b063b92) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Tools/c-analyzer/cpython/_parser.py | 502 ++++++++++++++-------------- 1 file changed, 243 insertions(+), 259 deletions(-) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 7201e76c43a1d4..2d6726faf7757a 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -1,5 +1,4 @@ import os.path -import re from c_parser.preprocessor import ( get_preprocessor as _get_preprocessor, @@ -18,16 +17,16 @@ def _abs(relfile): return os.path.join(REPO_ROOT, relfile) -def clean_lines(text): - """Clear out comments, blank lines, and leading/trailing whitespace.""" - lines = (line.strip() for line in text.splitlines()) - lines = (line.partition('#')[0].rstrip() - for line in lines - if line and not line.startswith('#')) - glob_all = f'{GLOB_ALL} ' - lines = (re.sub(r'^[*] ', glob_all, line) for line in lines) - lines = (_abs(line) for line in lines) - return list(lines) +def format_conf_lines(lines): + """Format conf entries for use in a TSV table.""" + return [_abs(entry) for entry in lines] + + +def format_tsv_lines(lines): + """Format entries for use in a TSV table.""" + lines = ((_abs(first), *rest) for first, *rest in lines) + lines = map('\t'.join, lines) + return list(map(str.rstrip, lines)) ''' @@ -47,256 +46,241 @@ def clean_lines(text): ''' # XXX Handle these. -# Tab separated: -EXCLUDED = clean_lines(''' -# @begin=conf@ - -# OSX -Modules/_scproxy.c # SystemConfiguration/SystemConfiguration.h - -# Windows -Modules/_winapi.c # windows.h -Modules/expat/winconfig.h -Modules/overlapped.c # winsock.h -Python/dynload_win.c # windows.h -Python/thread_nt.h - -# other OS-dependent -Python/dynload_aix.c # sys/ldr.h -Python/dynload_dl.c # dl.h -Python/dynload_hpux.c # dl.h -Python/emscripten_signal.c -Python/emscripten_syscalls.c -Python/emscripten_trampoline_inner.c -Python/thread_pthread.h -Python/thread_pthread_stubs.h - -# only huge constants (safe but parsing is slow) -Modules/_ssl_data_*.h -Modules/cjkcodecs/mappings_*.h -Modules/unicodedata_db.h -Modules/unicodename_db.h -Objects/unicodetype_db.h - -# generated -Python/deepfreeze/*.c -Python/frozen_modules/*.h -Python/generated_cases.c.h -Python/executor_cases.c.h -Python/optimizer_cases.c.h -# XXX: Throws errors if PY_VERSION_HEX is not mocked out -Modules/clinic/_testclinic_depr.c.h - -# not actually source -Python/bytecodes.c -Python/optimizer_bytecodes.c - -# mimalloc -Objects/mimalloc/*.c -Include/internal/mimalloc/*.h -Include/internal/mimalloc/mimalloc/*.h - -# @end=conf@ -''') +EXCLUDED = format_conf_lines([ + # macOS + 'Modules/_scproxy.c', # SystemConfiguration/SystemConfiguration.h + + # Windows + 'Modules/_winapi.c', # windows.h + 'Modules/expat/winconfig.h', + 'Modules/overlapped.c', # winsock.h + 'Python/dynload_win.c', # windows.h + 'Python/thread_nt.h', + + # other OS-dependent + 'Python/dynload_aix.c', # sys/ldr.h + 'Python/dynload_dl.c', # dl.h + 'Python/dynload_hpux.c', # dl.h + 'Python/emscripten_signal.c', + 'Python/emscripten_syscalls.c', + 'Python/emscripten_trampoline_inner.c', + 'Python/thread_pthread.h', + 'Python/thread_pthread_stubs.h', + + # only huge constants (safe but parsing is slow) + 'Modules/_ssl_data_*.h', + 'Modules/cjkcodecs/mappings_*.h', + 'Modules/unicodedata_db.h', + 'Modules/unicodename_db.h', + 'Objects/unicodetype_db.h', + + # generated + 'Python/deepfreeze/*.c', + 'Python/frozen_modules/*.h', + 'Python/generated_cases.c.h', + 'Python/executor_cases.c.h', + 'Python/optimizer_cases.c.h', + # XXX: Throws errors if PY_VERSION_HEX is not mocked out + 'Modules/clinic/_testclinic_depr.c.h', + + # not actually source + 'Python/bytecodes.c', + 'Python/optimizer_bytecodes.c', + + # mimalloc + 'Objects/mimalloc/*.c', + 'Include/internal/mimalloc/*.h', + 'Include/internal/mimalloc/mimalloc/*.h', +]) # XXX Fix the parser. -EXCLUDED += clean_lines(''' -# The tool should be able to parse these... - -# The problem with xmlparse.c is that something -# has gone wrong where # we handle "maybe inline actual" -# in Tools/c-analyzer/c_parser/parser/_global.py. -Modules/expat/internal.h -Modules/expat/xmlparse.c -''') - -INCL_DIRS = clean_lines(''' -# @begin=tsv@ - -glob dirname -* . -* ./Include -* ./Include/internal -* ./Include/internal/mimalloc - -Modules/_decimal/**/*.c Modules/_decimal/libmpdec -Modules/_elementtree.c Modules/expat -Modules/_hacl/*.c Modules/_hacl/include -Modules/_hacl/*.c Modules/_hacl/ -Modules/_hacl/*.h Modules/_hacl/include -Modules/_hacl/*.h Modules/_hacl/ -Modules/md5module.c Modules/_hacl/include -Modules/sha1module.c Modules/_hacl/include -Modules/sha2module.c Modules/_hacl/include -Modules/sha3module.c Modules/_hacl/include -Modules/blake2module.c Modules/_hacl/include -Modules/hmacmodule.c Modules/_hacl/include -Objects/stringlib/*.h Objects - -# possible system-installed headers, just in case -Modules/_tkinter.c /usr/include/tcl8.6 -Modules/_uuidmodule.c /usr/include/uuid -Modules/tkappinit.c /usr/include/tcl - -# @end=tsv@ -''')[1:] - -INCLUDES = clean_lines(''' -# @begin=tsv@ - -glob include - -**/*.h Python.h -Include/**/*.h object.h - -# for Py_HAVE_CONDVAR -Include/internal/pycore_gil.h pycore_condvar.h -Python/thread_pthread.h pycore_condvar.h - -# other - -Objects/stringlib/join.h stringlib/stringdefs.h -Objects/stringlib/ctype.h stringlib/stringdefs.h -Objects/stringlib/transmogrify.h stringlib/stringdefs.h -#Objects/stringlib/fastsearch.h stringlib/stringdefs.h -#Objects/stringlib/count.h stringlib/stringdefs.h -#Objects/stringlib/find.h stringlib/stringdefs.h -#Objects/stringlib/partition.h stringlib/stringdefs.h -#Objects/stringlib/split.h stringlib/stringdefs.h -Objects/stringlib/fastsearch.h stringlib/ucs1lib.h -Objects/stringlib/count.h stringlib/ucs1lib.h -Objects/stringlib/find.h stringlib/ucs1lib.h -Objects/stringlib/partition.h stringlib/ucs1lib.h -Objects/stringlib/split.h stringlib/ucs1lib.h -Objects/stringlib/find_max_char.h Objects/stringlib/ucs1lib.h -Objects/stringlib/count.h Objects/stringlib/fastsearch.h -Objects/stringlib/find.h Objects/stringlib/fastsearch.h -Objects/stringlib/partition.h Objects/stringlib/fastsearch.h -Objects/stringlib/replace.h Objects/stringlib/fastsearch.h -Objects/stringlib/repr.h Objects/stringlib/fastsearch.h -Objects/stringlib/split.h Objects/stringlib/fastsearch.h - -# @end=tsv@ -''')[1:] - -MACROS = clean_lines(''' -# @begin=tsv@ - -glob name value - -Include/internal/*.h Py_BUILD_CORE 1 -Python/**/*.c Py_BUILD_CORE 1 -Python/**/*.h Py_BUILD_CORE 1 -Parser/**/*.c Py_BUILD_CORE 1 -Parser/**/*.h Py_BUILD_CORE 1 -Objects/**/*.c Py_BUILD_CORE 1 -Objects/**/*.h Py_BUILD_CORE 1 - -Modules/_asynciomodule.c Py_BUILD_CORE 1 -Modules/_codecsmodule.c Py_BUILD_CORE 1 -Modules/_collectionsmodule.c Py_BUILD_CORE 1 -Modules/_ctypes/_ctypes.c Py_BUILD_CORE 1 -Modules/_ctypes/cfield.c Py_BUILD_CORE 1 -Modules/_cursesmodule.c Py_BUILD_CORE 1 -Modules/_datetimemodule.c Py_BUILD_CORE 1 -Modules/_functoolsmodule.c Py_BUILD_CORE 1 -Modules/_heapqmodule.c Py_BUILD_CORE 1 -Modules/_io/*.c Py_BUILD_CORE 1 -Modules/_io/*.h Py_BUILD_CORE 1 -Modules/_localemodule.c Py_BUILD_CORE 1 -Modules/_operator.c Py_BUILD_CORE 1 -Modules/_posixsubprocess.c Py_BUILD_CORE 1 -Modules/_sre/sre.c Py_BUILD_CORE 1 -Modules/_threadmodule.c Py_BUILD_CORE 1 -Modules/_tracemalloc.c Py_BUILD_CORE 1 -Modules/_weakref.c Py_BUILD_CORE 1 -Modules/_zoneinfo.c Py_BUILD_CORE 1 -Modules/atexitmodule.c Py_BUILD_CORE 1 -Modules/cmathmodule.c Py_BUILD_CORE 1 -Modules/faulthandler.c Py_BUILD_CORE 1 -Modules/gcmodule.c Py_BUILD_CORE 1 -Modules/getpath.c Py_BUILD_CORE 1 -Modules/getpath_noop.c Py_BUILD_CORE 1 -Modules/itertoolsmodule.c Py_BUILD_CORE 1 -Modules/main.c Py_BUILD_CORE 1 -Modules/mathmodule.c Py_BUILD_CORE 1 -Modules/posixmodule.c Py_BUILD_CORE 1 -Modules/sha256module.c Py_BUILD_CORE 1 -Modules/sha512module.c Py_BUILD_CORE 1 -Modules/signalmodule.c Py_BUILD_CORE 1 -Modules/symtablemodule.c Py_BUILD_CORE 1 -Modules/timemodule.c Py_BUILD_CORE 1 -Modules/unicodedata.c Py_BUILD_CORE 1 - -Modules/_json.c Py_BUILD_CORE_BUILTIN 1 -Modules/_pickle.c Py_BUILD_CORE_BUILTIN 1 -Modules/_testinternalcapi.c Py_BUILD_CORE_BUILTIN 1 - -Include/cpython/abstract.h Py_CPYTHON_ABSTRACTOBJECT_H 1 -Include/cpython/bytearrayobject.h Py_CPYTHON_BYTEARRAYOBJECT_H 1 -Include/cpython/bytesobject.h Py_CPYTHON_BYTESOBJECT_H 1 -Include/cpython/ceval.h Py_CPYTHON_CEVAL_H 1 -Include/cpython/code.h Py_CPYTHON_CODE_H 1 -Include/cpython/dictobject.h Py_CPYTHON_DICTOBJECT_H 1 -Include/cpython/fileobject.h Py_CPYTHON_FILEOBJECT_H 1 -Include/cpython/fileutils.h Py_CPYTHON_FILEUTILS_H 1 -Include/cpython/frameobject.h Py_CPYTHON_FRAMEOBJECT_H 1 -Include/cpython/import.h Py_CPYTHON_IMPORT_H 1 -Include/cpython/interpreteridobject.h Py_CPYTHON_INTERPRETERIDOBJECT_H 1 -Include/cpython/listobject.h Py_CPYTHON_LISTOBJECT_H 1 -Include/cpython/methodobject.h Py_CPYTHON_METHODOBJECT_H 1 -Include/cpython/object.h Py_CPYTHON_OBJECT_H 1 -Include/cpython/objimpl.h Py_CPYTHON_OBJIMPL_H 1 -Include/cpython/pyerrors.h Py_CPYTHON_ERRORS_H 1 -Include/cpython/pylifecycle.h Py_CPYTHON_PYLIFECYCLE_H 1 -Include/cpython/pymem.h Py_CPYTHON_PYMEM_H 1 -Include/cpython/pystate.h Py_CPYTHON_PYSTATE_H 1 -Include/cpython/sysmodule.h Py_CPYTHON_SYSMODULE_H 1 -Include/cpython/traceback.h Py_CPYTHON_TRACEBACK_H 1 -Include/cpython/tupleobject.h Py_CPYTHON_TUPLEOBJECT_H 1 -Include/cpython/unicodeobject.h Py_CPYTHON_UNICODEOBJECT_H 1 - -# implied include of -Include/**/*.h _POSIX_THREADS 1 -Include/**/*.h HAVE_PTHREAD_H 1 - -# from pyconfig.h -Include/cpython/pthread_stubs.h HAVE_PTHREAD_STUBS 1 -Python/thread_pthread_stubs.h HAVE_PTHREAD_STUBS 1 - -# from Objects/bytesobject.c -Objects/stringlib/partition.h STRINGLIB_GET_EMPTY() bytes_get_empty() -Objects/stringlib/join.h STRINGLIB_MUTABLE 0 -Objects/stringlib/partition.h STRINGLIB_MUTABLE 0 -Objects/stringlib/split.h STRINGLIB_MUTABLE 0 -Objects/stringlib/transmogrify.h STRINGLIB_MUTABLE 0 - -# from Makefile -Modules/getpath.c PYTHONPATH 1 -Modules/getpath.c PREFIX ... -Modules/getpath.c EXEC_PREFIX ... -Modules/getpath.c VERSION ... -Modules/getpath.c VPATH ... -Modules/getpath.c PLATLIBDIR ... -#Modules/_dbmmodule.c USE_GDBM_COMPAT 1 -Modules/_dbmmodule.c USE_NDBM 1 -#Modules/_dbmmodule.c USE_BERKDB 1 - -# See: setup.py -Modules/_decimal/**/*.c CONFIG_64 1 -Modules/_decimal/**/*.c ASM 1 -Modules/expat/xmlparse.c HAVE_EXPAT_CONFIG_H 1 -Modules/expat/xmlparse.c XML_POOR_ENTROPY 1 -Modules/_dbmmodule.c HAVE_GDBM_DASH_NDBM_H 1 - -# others -Modules/_sre/sre_lib.h LOCAL(type) static inline type -Modules/_sre/sre_lib.h SRE(F) sre_ucs2_##F -Objects/stringlib/codecs.h STRINGLIB_IS_UNICODE 1 -Include/internal/pycore_crossinterp_data_registry.h Py_CORE_CROSSINTERP_DATA_REGISTRY_H 1 - -# @end=tsv@ -''')[1:] +EXCLUDED += format_conf_lines([ + # The tool should be able to parse these... + + # The problem with xmlparse.c is that something + # has gone wrong where # we handle "maybe inline actual" + # in Tools/c-analyzer/c_parser/parser/_global.py. + 'Modules/expat/internal.h', + 'Modules/expat/xmlparse.c', +]) + +INCL_DIRS = format_tsv_lines([ + # (glob, dirname) + + ('*', '.'), + ('*', './Include'), + ('*', './Include/internal'), + ('*', './Include/internal/mimalloc'), + + ('Modules/_decimal/**/*.c', 'Modules/_decimal/libmpdec'), + ('Modules/_elementtree.c', 'Modules/expat'), + ('Modules/_hacl/*.c', 'Modules/_hacl/include'), + ('Modules/_hacl/*.c', 'Modules/_hacl/'), + ('Modules/_hacl/*.h', 'Modules/_hacl/include'), + ('Modules/_hacl/*.h', 'Modules/_hacl/'), + ('Modules/md5module.c', 'Modules/_hacl/include'), + ('Modules/sha1module.c', 'Modules/_hacl/include'), + ('Modules/sha2module.c', 'Modules/_hacl/include'), + ('Modules/sha3module.c', 'Modules/_hacl/include'), + ('Modules/blake2module.c', 'Modules/_hacl/include'), + ('Modules/hmacmodule.c', 'Modules/_hacl/include'), + ('Objects/stringlib/*.h', 'Objects'), + + # possible system-installed headers, just in case + ('Modules/_tkinter.c', '/usr/include/tcl8.6'), + ('Modules/_uuidmodule.c', '/usr/include/uuid'), + ('Modules/tkappinit.c', '/usr/include/tcl'), + +]) + +INCLUDES = format_tsv_lines([ + # (glob, include) + + ('**/*.h', 'Python.h'), + ('Include/**/*.h', 'object.h'), + + # for Py_HAVE_CONDVAR + ('Include/internal/pycore_gil.h', 'pycore_condvar.h'), + ('Python/thread_pthread.h', 'pycore_condvar.h'), + + # other + + ('Objects/stringlib/join.h', 'stringlib/stringdefs.h'), + ('Objects/stringlib/ctype.h', 'stringlib/stringdefs.h'), + ('Objects/stringlib/transmogrify.h', 'stringlib/stringdefs.h'), + # ('Objects/stringlib/fastsearch.h', 'stringlib/stringdefs.h'), + # ('Objects/stringlib/count.h', 'stringlib/stringdefs.h'), + # ('Objects/stringlib/find.h', 'stringlib/stringdefs.h'), + # ('Objects/stringlib/partition.h', 'stringlib/stringdefs.h'), + # ('Objects/stringlib/split.h', 'stringlib/stringdefs.h'), + ('Objects/stringlib/fastsearch.h', 'stringlib/ucs1lib.h'), + ('Objects/stringlib/count.h', 'stringlib/ucs1lib.h'), + ('Objects/stringlib/find.h', 'stringlib/ucs1lib.h'), + ('Objects/stringlib/partition.h', 'stringlib/ucs1lib.h'), + ('Objects/stringlib/split.h', 'stringlib/ucs1lib.h'), + ('Objects/stringlib/find_max_char.h', 'Objects/stringlib/ucs1lib.h'), + ('Objects/stringlib/count.h', 'Objects/stringlib/fastsearch.h'), + ('Objects/stringlib/find.h', 'Objects/stringlib/fastsearch.h'), + ('Objects/stringlib/partition.h', 'Objects/stringlib/fastsearch.h'), + ('Objects/stringlib/replace.h', 'Objects/stringlib/fastsearch.h'), + ('Objects/stringlib/repr.h', 'Objects/stringlib/fastsearch.h'), + ('Objects/stringlib/split.h', 'Objects/stringlib/fastsearch.h'), +]) + +MACROS = format_tsv_lines([ + # (glob, name, value) + + ('Include/internal/*.h', 'Py_BUILD_CORE', '1'), + ('Python/**/*.c', 'Py_BUILD_CORE', '1'), + ('Python/**/*.h', 'Py_BUILD_CORE', '1'), + ('Parser/**/*.c', 'Py_BUILD_CORE', '1'), + ('Parser/**/*.h', 'Py_BUILD_CORE', '1'), + ('Objects/**/*.c', 'Py_BUILD_CORE', '1'), + ('Objects/**/*.h', 'Py_BUILD_CORE', '1'), + + ('Modules/_asynciomodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_codecsmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_collectionsmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_ctypes/_ctypes.c', 'Py_BUILD_CORE', '1'), + ('Modules/_ctypes/cfield.c', 'Py_BUILD_CORE', '1'), + ('Modules/_cursesmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_datetimemodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_functoolsmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_heapqmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_io/*.c', 'Py_BUILD_CORE', '1'), + ('Modules/_io/*.h', 'Py_BUILD_CORE', '1'), + ('Modules/_localemodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_operator.c', 'Py_BUILD_CORE', '1'), + ('Modules/_posixsubprocess.c', 'Py_BUILD_CORE', '1'), + ('Modules/_sre/sre.c', 'Py_BUILD_CORE', '1'), + ('Modules/_threadmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/_tracemalloc.c', 'Py_BUILD_CORE', '1'), + ('Modules/_weakref.c', 'Py_BUILD_CORE', '1'), + ('Modules/_zoneinfo.c', 'Py_BUILD_CORE', '1'), + ('Modules/atexitmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/cmathmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/faulthandler.c', 'Py_BUILD_CORE', '1'), + ('Modules/gcmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/getpath.c', 'Py_BUILD_CORE', '1'), + ('Modules/getpath_noop.c', 'Py_BUILD_CORE', '1'), + ('Modules/itertoolsmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/main.c', 'Py_BUILD_CORE', '1'), + ('Modules/mathmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/posixmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/sha256module.c', 'Py_BUILD_CORE', '1'), + ('Modules/sha512module.c', 'Py_BUILD_CORE', '1'), + ('Modules/signalmodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/symtablemodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/timemodule.c', 'Py_BUILD_CORE', '1'), + ('Modules/unicodedata.c', 'Py_BUILD_CORE', '1'), + + ('Modules/_json.c', 'Py_BUILD_CORE_BUILTIN', '1'), + ('Modules/_pickle.c', 'Py_BUILD_CORE_BUILTIN', '1'), + ('Modules/_testinternalcapi.c', 'Py_BUILD_CORE_BUILTIN', '1'), + + ('Include/cpython/abstract.h', 'Py_CPYTHON_ABSTRACTOBJECT_H', '1'), + ('Include/cpython/bytearrayobject.h', 'Py_CPYTHON_BYTEARRAYOBJECT_H', '1'), + ('Include/cpython/bytesobject.h', 'Py_CPYTHON_BYTESOBJECT_H', '1'), + ('Include/cpython/ceval.h', 'Py_CPYTHON_CEVAL_H', '1'), + ('Include/cpython/code.h', 'Py_CPYTHON_CODE_H', '1'), + ('Include/cpython/dictobject.h', 'Py_CPYTHON_DICTOBJECT_H', '1'), + ('Include/cpython/fileobject.h', 'Py_CPYTHON_FILEOBJECT_H', '1'), + ('Include/cpython/fileutils.h', 'Py_CPYTHON_FILEUTILS_H', '1'), + ('Include/cpython/frameobject.h', 'Py_CPYTHON_FRAMEOBJECT_H', '1'), + ('Include/cpython/import.h', 'Py_CPYTHON_IMPORT_H', '1'), + ('Include/cpython/interpreteridobject.h', 'Py_CPYTHON_INTERPRETERIDOBJECT_H', '1'), + ('Include/cpython/listobject.h', 'Py_CPYTHON_LISTOBJECT_H', '1'), + ('Include/cpython/methodobject.h', 'Py_CPYTHON_METHODOBJECT_H', '1'), + ('Include/cpython/object.h', 'Py_CPYTHON_OBJECT_H', '1'), + ('Include/cpython/objimpl.h', 'Py_CPYTHON_OBJIMPL_H', '1'), + ('Include/cpython/pyerrors.h', 'Py_CPYTHON_ERRORS_H', '1'), + ('Include/cpython/pylifecycle.h', 'Py_CPYTHON_PYLIFECYCLE_H', '1'), + ('Include/cpython/pymem.h', 'Py_CPYTHON_PYMEM_H', '1'), + ('Include/cpython/pystate.h', 'Py_CPYTHON_PYSTATE_H', '1'), + ('Include/cpython/sysmodule.h', 'Py_CPYTHON_SYSMODULE_H', '1'), + ('Include/cpython/traceback.h', 'Py_CPYTHON_TRACEBACK_H', '1'), + ('Include/cpython/tupleobject.h', 'Py_CPYTHON_TUPLEOBJECT_H', '1'), + ('Include/cpython/unicodeobject.h', 'Py_CPYTHON_UNICODEOBJECT_H', '1'), + + # implied include of + ('Include/**/*.h', '_POSIX_THREADS', '1'), + ('Include/**/*.h', 'HAVE_PTHREAD_H', '1'), + + # from pyconfig.h + ('Include/cpython/pthread_stubs.h', 'HAVE_PTHREAD_STUBS', '1'), + ('Python/thread_pthread_stubs.h', 'HAVE_PTHREAD_STUBS', '1'), + + # from Objects/bytesobject.c + ('Objects/stringlib/partition.h', 'STRINGLIB_GET_EMPTY()', 'bytes_get_empty()'), + ('Objects/stringlib/join.h', 'STRINGLIB_MUTABLE', '0'), + ('Objects/stringlib/partition.h', 'STRINGLIB_MUTABLE', '0'), + ('Objects/stringlib/split.h', 'STRINGLIB_MUTABLE', '0'), + ('Objects/stringlib/transmogrify.h', 'STRINGLIB_MUTABLE', '0'), + + # from Makefile + ('Modules/getpath.c', 'PYTHONPATH', '1'), + ('Modules/getpath.c', 'PREFIX', '...'), + ('Modules/getpath.c', 'EXEC_PREFIX', '...'), + ('Modules/getpath.c', 'VERSION', '...'), + ('Modules/getpath.c', 'VPATH', '...'), + ('Modules/getpath.c', 'PLATLIBDIR', '...'), + # ('Modules/_dbmmodule.c', 'USE_GDBM_COMPAT', '1'), + ('Modules/_dbmmodule.c', 'USE_NDBM', '1'), + # ('Modules/_dbmmodule.c', 'USE_BERKDB', '1'), + + # See: setup.py + ('Modules/_decimal/**/*.c', 'CONFIG_64', '1'), + ('Modules/_decimal/**/*.c', 'ASM', '1'), + ('Modules/expat/xmlparse.c', 'HAVE_EXPAT_CONFIG_H', '1'), + ('Modules/expat/xmlparse.c', 'XML_POOR_ENTROPY', '1'), + ('Modules/_dbmmodule.c', 'HAVE_GDBM_DASH_NDBM_H', '1'), + + # others + ('Modules/_sre/sre_lib.h', 'LOCAL(type)', 'static inline type'), + ('Modules/_sre/sre_lib.h', 'SRE(F)', 'sre_ucs2_##F'), + ('Objects/stringlib/codecs.h', 'STRINGLIB_IS_UNICODE', '1'), + ('Include/internal/pycore_crossinterp_data_registry.h', 'Py_CORE_CROSSINTERP_DATA_REGISTRY_H', '1'), +]) # -pthread # -Wno-unused-result From e09f33e5bf21c68fd4b214a21240381cc2df0a7b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:46:52 +0200 Subject: [PATCH 1051/1674] [3.14] gh-137433: Fix deadlock with stop-the-world and daemon threads (gh-137735) (GH-138965) There was a deadlock originally seen by Memray when a daemon thread enabled or disabled profiling while the interpreter was shutting down. I think this could also happen with garbage collection, but I haven't seen that in practice. The daemon thread could be hung while trying acquire the global rwmutex that prevents overlapping global and per-interpreter stop-the-world events. Since it already held the main interpreter's stop-the-world lock, it also deadlocked the main thread, which is trying to perform interpreter finalization. Swap the order of lock acquisition to prevent this deadlock. Additionally, refactor `_PyParkingLot_Park` so that the global buckets hashtable is left in a clean state if the thread is hung in `PyEval_AcquireThread`. (cherry picked from commit 90fe3250f82712b61630d636246c92df7c40c816) Co-authored-by: Sam Gross --- Lib/test/test_threading.py | 27 +++++++++++++++++++ ...-08-13-13-39-02.gh-issue-137433.g6Atfz.rst | 3 +++ Python/parking_lot.c | 19 +++++++++++-- Python/pystate.c | 6 +++-- 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index b8d310e4c99ff8..731e1046c000af 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1381,6 +1381,33 @@ def test_native_id_after_fork(self): self.assertEqual(len(native_ids), 2) self.assertNotEqual(native_ids[0], native_ids[1]) + def test_stop_the_world_during_finalization(self): + # gh-137433: Test functions that trigger a stop-the-world in the free + # threading build concurrent with interpreter finalization. + script = """if True: + import gc + import sys + import threading + NUM_THREADS = 5 + b = threading.Barrier(NUM_THREADS + 1) + def run_in_bg(): + b.wait() + while True: + sys.setprofile(None) + gc.collect() + + for _ in range(NUM_THREADS): + t = threading.Thread(target=run_in_bg, daemon=True) + t.start() + + b.wait() + print("Exiting...") + """ + rc, out, err = assert_python_ok('-c', script) + self.assertEqual(rc, 0) + self.assertEqual(err, b"") + self.assertEqual(out.strip(), b"Exiting...") + class ThreadJoinOnShutdown(BaseTestCase): def _run_and_join(self, script): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst new file mode 100644 index 00000000000000..0389cb0c735128 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst @@ -0,0 +1,3 @@ +Fix a potential deadlock in the :term:`free threading` build when daemon +threads enable or disable profiling or tracing while the main thread is +shutting down the interpreter. diff --git a/Python/parking_lot.c b/Python/parking_lot.c index e896dea02712f2..0ffea97b079943 100644 --- a/Python/parking_lot.c +++ b/Python/parking_lot.c @@ -342,7 +342,19 @@ _PyParkingLot_Park(const void *addr, const void *expected, size_t size, enqueue(bucket, addr, &wait); _PyRawMutex_Unlock(&bucket->mutex); - int res = _PySemaphore_Wait(&wait.sema, timeout_ns, detach); + PyThreadState *tstate = NULL; + if (detach) { + tstate = _PyThreadState_GET(); + if (tstate && _PyThreadState_IsAttached(tstate)) { + // Only detach if we are attached + PyEval_ReleaseThread(tstate); + } + else { + tstate = NULL; + } + } + + int res = _PySemaphore_Wait(&wait.sema, timeout_ns, 0); if (res == Py_PARK_OK) { goto done; } @@ -354,7 +366,7 @@ _PyParkingLot_Park(const void *addr, const void *expected, size_t size, // Another thread has started to unpark us. Wait until we process the // wakeup signal. do { - res = _PySemaphore_Wait(&wait.sema, -1, detach); + res = _PySemaphore_Wait(&wait.sema, -1, 0); } while (res != Py_PARK_OK); goto done; } @@ -366,6 +378,9 @@ _PyParkingLot_Park(const void *addr, const void *expected, size_t size, done: _PySemaphore_Destroy(&wait.sema); + if (tstate) { + PyEval_AcquireThread(tstate); + } return res; } diff --git a/Python/pystate.c b/Python/pystate.c index b7da4e981ac1eb..6859dbc9a7f469 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -2345,13 +2345,15 @@ stop_the_world(struct _stoptheworld_state *stw) { _PyRuntimeState *runtime = &_PyRuntime; - PyMutex_Lock(&stw->mutex); + // gh-137433: Acquire the rwmutex first to avoid deadlocks with daemon + // threads that may hang when blocked on lock acquisition. if (stw->is_global) { _PyRWMutex_Lock(&runtime->stoptheworld_mutex); } else { _PyRWMutex_RLock(&runtime->stoptheworld_mutex); } + PyMutex_Lock(&stw->mutex); HEAD_LOCK(runtime); stw->requested = 1; @@ -2417,13 +2419,13 @@ start_the_world(struct _stoptheworld_state *stw) } stw->requester = NULL; HEAD_UNLOCK(runtime); + PyMutex_Unlock(&stw->mutex); if (stw->is_global) { _PyRWMutex_Unlock(&runtime->stoptheworld_mutex); } else { _PyRWMutex_RUnlock(&runtime->stoptheworld_mutex); } - PyMutex_Unlock(&stw->mutex); } #endif // Py_GIL_DISABLED From ac147be05f127a304b04285570b945b45af5070a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:47:26 +0200 Subject: [PATCH 1052/1674] [3.14] gh-137440: Update comment in Python/hamt.c on importing for testing (GH-137441) (#137519) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-137440: Update comment in Python/hamt.c on importing for testing (GH-137441) Switch from `_testcapi` to `_testinternalcapi`. (cherry picked from commit 7ab68cd50658f76abc9e0f12e6212736e2440720) Co-authored-by: Bartosz Sławecki --- Python/hamt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/hamt.c b/Python/hamt.c index 906149cc6cdbdc..e372b1a1b4c18b 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -256,9 +256,9 @@ Debug ===== The HAMT datatype is accessible for testing purposes under the -`_testcapi` module: +`_testinternalcapi` module: - >>> from _testcapi import hamt + >>> from _testinternalcapi import hamt >>> h = hamt() >>> h2 = h.set('a', 2) >>> h3 = h2.set('b', 3) From 137c784fbfdd7efe4b8a9269c97c44f696a10757 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:48:10 +0200 Subject: [PATCH 1053/1674] [3.14] gh-136914: Fix support of cached functions and properties in DocTest's lineno computation (GH-136930) (#137616) gh-136914: Fix support of cached functions and properties in DocTest's lineno computation (GH-136930) Previously, DocTest's lineno of functions and methods decorated with functools.cache(), functools.lru_cache() and functools.cached_property() was not properly returned (None was returned) because the computation relied on inspect.isfunction() which does not consider the decorated result as a function. We now use the more generic inspect.isroutine(), as elsewhere in doctest's logic. Also, added a special case for functools.cached_property(). (cherry picked from commit fece15d29f28e89f1231afa80508c80ed28dc37d) Co-authored-by: Denis Laxalde --- Lib/doctest.py | 5 +++- Lib/test/test_doctest/doctest_lineno.py | 29 +++++++++++++++++++ Lib/test/test_doctest/test_doctest.py | 4 +++ ...-07-21-15-40-00.gh-issue-136914.-GNG-d.rst | 2 ++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst diff --git a/Lib/doctest.py b/Lib/doctest.py index 8860bed2a9f710..a66888d8fc9673 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -94,6 +94,7 @@ def _test(): import __future__ import difflib +import functools import inspect import linecache import os @@ -1142,7 +1143,9 @@ def _find_lineno(self, obj, source_lines): if inspect.ismethod(obj): obj = obj.__func__ if isinstance(obj, property): obj = obj.fget - if inspect.isfunction(obj) and getattr(obj, '__doc__', None): + if isinstance(obj, functools.cached_property): + obj = obj.func + if inspect.isroutine(obj) and getattr(obj, '__doc__', None): # We don't use `docstring` var here, because `obj` can be changed. obj = inspect.unwrap(obj) try: diff --git a/Lib/test/test_doctest/doctest_lineno.py b/Lib/test/test_doctest/doctest_lineno.py index 0dbcd9a11eaba2..0bd402e98288d0 100644 --- a/Lib/test/test_doctest/doctest_lineno.py +++ b/Lib/test/test_doctest/doctest_lineno.py @@ -76,3 +76,32 @@ def property_with_doctest(self): @decorator def func_with_docstring_wrapped(): """Some unrelated info.""" + + +# https://github.com/python/cpython/issues/136914 +import functools + + +@functools.cache +def cached_func_with_doctest(value): + """ + >>> cached_func_with_doctest(1) + -1 + """ + return -value + + +@functools.cache +def cached_func_without_docstring(value): + return value + 1 + + +class ClassWithACachedProperty: + + @functools.cached_property + def cached(self): + """ + >>> X().cached + -1 + """ + return 0 diff --git a/Lib/test/test_doctest/test_doctest.py b/Lib/test/test_doctest/test_doctest.py index 2bfaa6c599cd47..00e6126b61b86f 100644 --- a/Lib/test/test_doctest/test_doctest.py +++ b/Lib/test/test_doctest/test_doctest.py @@ -678,6 +678,8 @@ def basics(): r""" >>> for t in tests: ... print('%5s %s' % (t.lineno, t.name)) None test.test_doctest.doctest_lineno + None test.test_doctest.doctest_lineno.ClassWithACachedProperty + 102 test.test_doctest.doctest_lineno.ClassWithACachedProperty.cached 22 test.test_doctest.doctest_lineno.ClassWithDocstring 30 test.test_doctest.doctest_lineno.ClassWithDoctest None test.test_doctest.doctest_lineno.ClassWithoutDocstring @@ -687,6 +689,8 @@ def basics(): r""" 45 test.test_doctest.doctest_lineno.MethodWrapper.method_with_doctest None test.test_doctest.doctest_lineno.MethodWrapper.method_without_docstring 61 test.test_doctest.doctest_lineno.MethodWrapper.property_with_doctest + 86 test.test_doctest.doctest_lineno.cached_func_with_doctest + None test.test_doctest.doctest_lineno.cached_func_without_docstring 4 test.test_doctest.doctest_lineno.func_with_docstring 77 test.test_doctest.doctest_lineno.func_with_docstring_wrapped 12 test.test_doctest.doctest_lineno.func_with_doctest diff --git a/Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst b/Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst new file mode 100644 index 00000000000000..78ec8025fbc0fd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst @@ -0,0 +1,2 @@ +Fix retrieval of :attr:`doctest.DocTest.lineno` for objects decorated with +:func:`functools.cache` or :class:`functools.cached_property`. From ed9c0c3cbe9505eca07f2cb6fb38bed63a56b359 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:48:40 +0200 Subject: [PATCH 1054/1674] [3.14] gh-137477: Fix inspect.getblock() for generator expressions (GH-137488) (#137993) gh-137477: Fix inspect.getblock() for generator expressions (GH-137488) This fixes also inspect.getsourcelines() and inspect.getsource(). (cherry picked from commit eae9d7de1c45a64076a926d53672823e6ae1777d) Co-authored-by: Serhiy Storchaka --- Lib/inspect.py | 17 +++++++++------- Lib/test/test_inspect/inspect_fodder2.py | 20 +++++++++++++++++++ Lib/test/test_inspect/test_inspect.py | 6 ++++++ ...-08-06-23-16-42.gh-issue-137477.bk6BDV.rst | 2 ++ 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 183e67fabf966e..faaddadbb87d64 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1056,7 +1056,7 @@ class BlockFinder: """Provide a tokeneater() method to detect the end of a code block.""" def __init__(self): self.indent = 0 - self.islambda = False + self.singleline = False self.started = False self.passline = False self.indecorator = False @@ -1065,19 +1065,22 @@ def __init__(self): def tokeneater(self, type, token, srowcol, erowcol, line): if not self.started and not self.indecorator: + if type == tokenize.INDENT or token == "async": + pass # skip any decorators - if token == "@": + elif token == "@": self.indecorator = True - # look for the first "def", "class" or "lambda" - elif token in ("def", "class", "lambda"): - if token == "lambda": - self.islambda = True + else: + # For "def" and "class" scan to the end of the block. + # For "lambda" and generator expression scan to + # the end of the logical line. + self.singleline = token not in ("def", "class") self.started = True self.passline = True # skip to the end of the line elif type == tokenize.NEWLINE: self.passline = False # stop skipping when a NEWLINE is seen self.last = srowcol[0] - if self.islambda: # lambdas always end at the first NEWLINE + if self.singleline: raise EndOfBlock # hitting a NEWLINE when in a decorator without args # ends the decorator diff --git a/Lib/test/test_inspect/inspect_fodder2.py b/Lib/test/test_inspect/inspect_fodder2.py index 43fda6622537fc..1de283f672d362 100644 --- a/Lib/test/test_inspect/inspect_fodder2.py +++ b/Lib/test/test_inspect/inspect_fodder2.py @@ -369,3 +369,23 @@ class dc364: # line 369 dc370 = dataclasses.make_dataclass('dc370', (('x', int), ('y', int))) dc371 = dataclasses.make_dataclass('dc370', (('x', int), ('y', int)), module=__name__) + +import inspect +import itertools + +# line 376 +ge377 = ( + inspect.currentframe() + for i in itertools.count() +) + +# line 382 +def func383(): + # line 384 + ge385 = ( + inspect.currentframe() + for i in itertools.count() + ) + return ge385 + +pass # end of file diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 0a8926e00cf8b9..50eb1703125c91 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -1189,12 +1189,18 @@ def test_nested_class_definition_inside_async_function(self): self.assertSourceEqual(run(mod2.func225), 226, 227) self.assertSourceEqual(mod2.cls226, 231, 235) + self.assertSourceEqual(mod2.cls226.func232, 232, 235) self.assertSourceEqual(run(mod2.cls226().func232), 233, 234) def test_class_definition_same_name_diff_methods(self): self.assertSourceEqual(mod2.cls296, 296, 298) self.assertSourceEqual(mod2.cls310, 310, 312) + def test_generator_expression(self): + self.assertSourceEqual(next(mod2.ge377), 377, 380) + self.assertSourceEqual(next(mod2.func383()), 385, 388) + + class TestNoEOL(GetSourceBase): def setUp(self): self.tempdir = TESTFN + '_dir' diff --git a/Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst b/Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst new file mode 100644 index 00000000000000..a6e097ea026293 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst @@ -0,0 +1,2 @@ +Fix :func:`!inspect.getblock`, :func:`inspect.getsourcelines` and +:func:`inspect.getsource` for generator expressions. From e51acb3fa6d752dcbdf659f3279cb3026216c9b8 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" <68491+gpshead@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:49:22 -0700 Subject: [PATCH 1055/1674] [3.14] gh-134698: Hold a lock when the thread state is detached in `ssl` (GH-134724) (GH-137107) * [3.14] gh-134698: Hold a lock when the thread state is detached in `ssl` (GH-134724) Lock when the thread state is detached. (cherry picked from commit e047a35b23c1aa69ab8d5da56f36319cec4d36b8) Co-authored-by: Peter Bierma Co-authored-by: Gregory P. Smith * Only lock the SSL context, not the SSL socket. This solves a deadlock when a socket is blocked while waiting on data, which ended up causing a major regression in 3.13.6 (see gh-137583). --------- Co-authored-by: Peter Bierma --- Lib/test/test_ssl.py | 55 ++++++++++ ...-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst | 2 + Modules/_ssl.c | 100 ++++++++++-------- Modules/_ssl/debughelpers.c | 14 +-- 4 files changed, 123 insertions(+), 48 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 3dbe8fc8cdbf5c..effa1da55d36b6 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1239,6 +1239,25 @@ def getpass(self): # Make sure the password function isn't called if it isn't needed ctx.load_cert_chain(CERTFILE, password=getpass_exception) + @threading_helper.requires_working_threading() + def test_load_cert_chain_thread_safety(self): + # gh-134698: _ssl detaches the thread state (and as such, + # releases the GIL and critical sections) around expensive + # OpenSSL calls. Unfortunately, OpenSSL structures aren't + # thread-safe, so executing these calls concurrently led + # to crashes. + ctx = ssl.create_default_context() + + def race(): + ctx.load_cert_chain(CERTFILE) + + threads = [threading.Thread(target=race) for _ in range(8)] + with threading_helper.catch_threading_exception() as cm: + with threading_helper.start_threads(threads): + pass + + self.assertIsNone(cm.exc_value) + def test_load_verify_locations(self): ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_verify_locations(CERTFILE) @@ -4538,6 +4557,42 @@ def server_callback(identity): with client_context.wrap_socket(socket.socket()) as s: s.connect((HOST, server.port)) + def test_thread_recv_while_main_thread_sends(self): + # GH-137583: Locking was added to calls to send() and recv() on SSL + # socket objects. This seemed fine at the surface level because those + # calls weren't re-entrant, but recv() calls would implicitly mimick + # holding a lock by blocking until it received data. This means that + # if a thread started to infinitely block until data was received, calls + # to send() would deadlock, because it would wait forever on the lock + # that the recv() call held. + data = b"1" * 1024 + event = threading.Event() + def background(sock): + event.set() + received = sock.recv(len(data)) + self.assertEqual(received, data) + + client_context, server_context, hostname = testing_context() + server = ThreadedEchoServer(context=server_context) + with server: + with client_context.wrap_socket(socket.socket(), + server_hostname=hostname) as sock: + sock.connect((HOST, server.port)) + sock.settimeout(1) + sock.setblocking(1) + # Ensure that the server is ready to accept requests + sock.sendall(b"123") + self.assertEqual(sock.recv(3), b"123") + with threading_helper.catch_threading_exception() as cm: + thread = threading.Thread(target=background, + args=(sock,), daemon=True) + thread.start() + event.wait() + sock.sendall(data) + thread.join() + if cm.exc_value is not None: + raise cm.exc_value + @unittest.skipUnless(has_tls_version('TLSv1_3') and ssl.HAS_PHA, "Test needs TLS 1.3 PHA") diff --git a/Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst b/Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst new file mode 100644 index 00000000000000..cf3901aba34ebc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst @@ -0,0 +1,2 @@ +Fix a crash when calling methods of :class:`ssl.SSLContext` or +:class:`ssl.SSLSocket` across multiple threads. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 21c399123aa6a1..5af0c3f8668fbb 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -43,14 +43,14 @@ /* Redefined below for Windows debug builds after important #includes */ #define _PySSL_FIX_ERRNO -#define PySSL_BEGIN_ALLOW_THREADS_S(save) \ - do { (save) = PyEval_SaveThread(); } while(0) -#define PySSL_END_ALLOW_THREADS_S(save) \ - do { PyEval_RestoreThread(save); _PySSL_FIX_ERRNO; } while(0) -#define PySSL_BEGIN_ALLOW_THREADS { \ +#define PySSL_BEGIN_ALLOW_THREADS_S(save, mutex) \ + do { (save) = PyEval_SaveThread(); PyMutex_Lock(mutex); } while(0) +#define PySSL_END_ALLOW_THREADS_S(save, mutex) \ + do { PyMutex_Unlock(mutex); PyEval_RestoreThread(save); _PySSL_FIX_ERRNO; } while(0) +#define PySSL_BEGIN_ALLOW_THREADS(self) { \ PyThreadState *_save = NULL; \ - PySSL_BEGIN_ALLOW_THREADS_S(_save); -#define PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS_S(_save); } + PySSL_BEGIN_ALLOW_THREADS_S(_save, &self->tstate_mutex); +#define PySSL_END_ALLOW_THREADS(self) PySSL_END_ALLOW_THREADS_S(_save, &self->tstate_mutex); } #if defined(HAVE_POLL_H) #include @@ -309,6 +309,9 @@ typedef struct { PyObject *psk_client_callback; PyObject *psk_server_callback; #endif + /* Lock to synchronize calls when the thread state is detached. + See also gh-134698. */ + PyMutex tstate_mutex; } PySSLContext; #define PySSLContext_CAST(op) ((PySSLContext *)(op)) @@ -889,9 +892,9 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, /* Make sure the SSL error state is initialized */ ERR_clear_error(); - PySSL_BEGIN_ALLOW_THREADS + PySSL_BEGIN_ALLOW_THREADS(sslctx) self->ssl = SSL_new(ctx); - PySSL_END_ALLOW_THREADS + PySSL_END_ALLOW_THREADS(sslctx) if (self->ssl == NULL) { Py_DECREF(self); _setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__); @@ -960,12 +963,12 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, BIO_set_nbio(SSL_get_wbio(self->ssl), 1); } - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; if (socket_type == PY_SSL_CLIENT) SSL_set_connect_state(self->ssl); else SSL_set_accept_state(self->ssl); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS; self->socket_type = socket_type; if (sock != NULL) { @@ -1034,10 +1037,11 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self) /* Actually negotiate SSL connection */ /* XXX If SSL_do_handshake() returns 0, it's also a failure. */ do { - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS ret = SSL_do_handshake(self->ssl); err = _PySSL_errno(ret < 1, self->ssl, ret); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS; + _PySSL_FIX_ERRNO; self->err = err; if (PyErr_CheckSignals()) @@ -2414,9 +2418,10 @@ PySSL_select(PySocketSockObject *s, int writing, PyTime_t timeout) ms = (int)_PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING); assert(ms <= INT_MAX); - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS rc = poll(&pollfd, 1, (int)ms); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; #else /* Guard against socket too large for select*/ if (!_PyIsSelectable_fd(s->sock_fd)) @@ -2428,13 +2433,14 @@ PySSL_select(PySocketSockObject *s, int writing, PyTime_t timeout) FD_SET(s->sock_fd, &fds); /* Wait until the socket becomes ready */ - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS nfds = Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int); if (writing) rc = select(nfds, NULL, &fds, NULL, &tv); else rc = select(nfds, &fds, NULL, NULL, &tv); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; #endif /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise @@ -2505,10 +2511,11 @@ _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b) } do { - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; retval = SSL_write_ex(self->ssl, b->buf, (size_t)b->len, &count); err = _PySSL_errno(retval == 0, self->ssl, retval); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS; + _PySSL_FIX_ERRNO; self->err = err; if (PyErr_CheckSignals()) @@ -2566,10 +2573,11 @@ _ssl__SSLSocket_pending_impl(PySSLSocket *self) int count = 0; _PySSLError err; - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; count = SSL_pending(self->ssl); err = _PySSL_errno(count < 0, self->ssl, count); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS; + _PySSL_FIX_ERRNO; self->err = err; if (count < 0) @@ -2660,10 +2668,11 @@ _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len, deadline = _PyDeadline_Init(timeout); do { - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; retval = SSL_read_ex(self->ssl, mem, (size_t)len, &count); err = _PySSL_errno(retval == 0, self->ssl, retval); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS; + _PySSL_FIX_ERRNO; self->err = err; if (PyErr_CheckSignals()) @@ -2762,7 +2771,7 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) } while (1) { - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; /* Disable read-ahead so that unwrap can work correctly. * Otherwise OpenSSL might read in too much data, * eating clear text data that happens to be @@ -2775,7 +2784,8 @@ _ssl__SSLSocket_shutdown_impl(PySSLSocket *self) SSL_set_read_ahead(self->ssl, 0); ret = SSL_shutdown(self->ssl); err = _PySSL_errno(ret < 0, self->ssl, ret); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS; + _PySSL_FIX_ERRNO; self->err = err; /* If err == 1, a secure shutdown with SSL_shutdown() is complete */ @@ -3167,9 +3177,10 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version) // no other thread can be touching this object yet. // (Technically, we can't even lock if we wanted to, as the // lock hasn't been initialized yet.) - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS ctx = SSL_CTX_new(method); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; if (ctx == NULL) { _setSSLError(get_ssl_state(module), NULL, 0, __FILE__, __LINE__); @@ -3194,6 +3205,7 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version) self->psk_client_callback = NULL; self->psk_server_callback = NULL; #endif + self->tstate_mutex = (PyMutex){0}; /* Don't check host name by default */ if (proto_version == PY_SSL_VERSION_TLS_CLIENT) { @@ -3312,9 +3324,10 @@ context_clear(PyObject *op) Py_CLEAR(self->psk_server_callback); #endif if (self->keylog_bio != NULL) { - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS BIO_free_all(self->keylog_bio); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; self->keylog_bio = NULL; } return 0; @@ -4037,7 +4050,8 @@ _password_callback(char *buf, int size, int rwflag, void *userdata) _PySSLPasswordInfo *pw_info = (_PySSLPasswordInfo*) userdata; PyObject *fn_ret = NULL; - PySSL_END_ALLOW_THREADS_S(pw_info->thread_state); + pw_info->thread_state = PyThreadState_Swap(pw_info->thread_state); + _PySSL_FIX_ERRNO; if (pw_info->error) { /* already failed previously. OpenSSL 3.0.0-alpha14 invokes the @@ -4067,13 +4081,13 @@ _password_callback(char *buf, int size, int rwflag, void *userdata) goto error; } - PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state); + pw_info->thread_state = PyThreadState_Swap(pw_info->thread_state); memcpy(buf, pw_info->password, pw_info->size); return pw_info->size; error: Py_XDECREF(fn_ret); - PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state); + pw_info->thread_state = PyThreadState_Swap(pw_info->thread_state); pw_info->error = 1; return -1; } @@ -4126,10 +4140,10 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, SSL_CTX_set_default_passwd_cb(self->ctx, _password_callback); SSL_CTX_set_default_passwd_cb_userdata(self->ctx, &pw_info); } - PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); + PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state, &self->tstate_mutex); r = SSL_CTX_use_certificate_chain_file(self->ctx, PyBytes_AS_STRING(certfile_bytes)); - PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); + PySSL_END_ALLOW_THREADS_S(pw_info.thread_state, &self->tstate_mutex); if (r != 1) { if (pw_info.error) { ERR_clear_error(); @@ -4144,11 +4158,11 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, } goto error; } - PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); + PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state, &self->tstate_mutex); r = SSL_CTX_use_PrivateKey_file(self->ctx, PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes), SSL_FILETYPE_PEM); - PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); + PySSL_END_ALLOW_THREADS_S(pw_info.thread_state, &self->tstate_mutex); Py_CLEAR(keyfile_bytes); Py_CLEAR(certfile_bytes); if (r != 1) { @@ -4165,9 +4179,9 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, } goto error; } - PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); + PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state, &self->tstate_mutex); r = SSL_CTX_check_private_key(self->ctx); - PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); + PySSL_END_ALLOW_THREADS_S(pw_info.thread_state, &self->tstate_mutex); if (r != 1) { _setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__); goto error; @@ -4384,9 +4398,9 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, cafile_buf = PyBytes_AS_STRING(cafile_bytes); if (capath) capath_buf = PyBytes_AS_STRING(capath_bytes); - PySSL_BEGIN_ALLOW_THREADS + PySSL_BEGIN_ALLOW_THREADS(self) r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf); - PySSL_END_ALLOW_THREADS + PySSL_END_ALLOW_THREADS(self) if (r != 1) { if (errno != 0) { PyErr_SetFromErrno(PyExc_OSError); @@ -4438,10 +4452,11 @@ _ssl__SSLContext_load_dh_params_impl(PySSLContext *self, PyObject *filepath) return NULL; errno = 0; - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS dh = PEM_read_DHparams(f, NULL, NULL, NULL); fclose(f); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; if (dh == NULL) { if (errno != 0) { PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath); @@ -4593,6 +4608,7 @@ _ssl__SSLContext_set_default_verify_paths_impl(PySSLContext *self) Py_BEGIN_ALLOW_THREADS rc = SSL_CTX_set_default_verify_paths(self->ctx); Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; if (!rc) { _setSSLError(get_state_ctx(self), NULL, 0, __FILE__, __LINE__); return NULL; diff --git a/Modules/_ssl/debughelpers.c b/Modules/_ssl/debughelpers.c index 7c0b4876f4353a..608ef07b5c5e43 100644 --- a/Modules/_ssl/debughelpers.c +++ b/Modules/_ssl/debughelpers.c @@ -140,13 +140,14 @@ _PySSL_keylog_callback(const SSL *ssl, const char *line) * critical debug helper. */ - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(lock, 1); res = BIO_printf(ssl_obj->ctx->keylog_bio, "%s\n", line); e = errno; (void)BIO_flush(ssl_obj->ctx->keylog_bio); PyThread_release_lock(lock); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; if (res == -1) { errno = e; @@ -187,9 +188,10 @@ _PySSLContext_set_keylog_filename(PyObject *op, PyObject *arg, if (self->keylog_bio != NULL) { BIO *bio = self->keylog_bio; self->keylog_bio = NULL; - PySSL_BEGIN_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS BIO_free_all(bio); - PySSL_END_ALLOW_THREADS + Py_END_ALLOW_THREADS + _PySSL_FIX_ERRNO; } if (arg == Py_None) { @@ -211,13 +213,13 @@ _PySSLContext_set_keylog_filename(PyObject *op, PyObject *arg, self->keylog_filename = Py_NewRef(arg); /* Write a header for seekable, empty files (this excludes pipes). */ - PySSL_BEGIN_ALLOW_THREADS + PySSL_BEGIN_ALLOW_THREADS(self) if (BIO_tell(self->keylog_bio) == 0) { BIO_puts(self->keylog_bio, "# TLS secrets log file, generated by OpenSSL / Python\n"); (void)BIO_flush(self->keylog_bio); } - PySSL_END_ALLOW_THREADS + PySSL_END_ALLOW_THREADS(self) SSL_CTX_set_keylog_callback(self->ctx, _PySSL_keylog_callback); return 0; } From 4429554223fb6aff93992b550f83f9ca3cd8cd22 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:51:22 +0200 Subject: [PATCH 1056/1674] [3.14] gh-116738: make `cProfile` module thread-safe (GH-138229) (#138575) gh-116738: make `cProfile` module thread-safe (GH-138229) (cherry picked from commit 8554c0917e25a7abe12b3000f1589b6566c91a25) Co-authored-by: Alper Co-authored-by: Kumar Aditya --- Lib/test/test_free_threading/test_cprofile.py | 43 +++++++++++++++++++ ...-08-28-09-29-46.gh-issue-116738.yLZJpV.rst | 2 + Modules/_lsprof.c | 27 ++++++++---- Modules/clinic/_lsprof.c.h | 42 +++++++++++++++--- 4 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 Lib/test/test_free_threading/test_cprofile.py create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst diff --git a/Lib/test/test_free_threading/test_cprofile.py b/Lib/test/test_free_threading/test_cprofile.py new file mode 100644 index 00000000000000..361b800d6b9029 --- /dev/null +++ b/Lib/test/test_free_threading/test_cprofile.py @@ -0,0 +1,43 @@ +import unittest + +from test.support import threading_helper + +import cProfile +import pstats + + +NTHREADS = 10 +INSERT_PER_THREAD = 1000 + + +@threading_helper.requires_working_threading() +class TestCProfile(unittest.TestCase): + def test_cprofile_racing_list_insert(self): + def list_insert(lst): + for i in range(INSERT_PER_THREAD): + lst.insert(0, i) + + lst = [] + + with cProfile.Profile() as pr: + threading_helper.run_concurrently( + worker_func=list_insert, nthreads=NTHREADS, args=(lst,) + ) + pr.create_stats() + ps = pstats.Stats(pr) + stats_profile = ps.get_stats_profile() + list_insert_profile = stats_profile.func_profiles[ + "" + ] + # Even though there is no explicit recursive call to insert, + # cProfile may record some calls as recursive due to limitations + # in its handling of multithreaded programs. This issue is not + # directly related to FT Python itself; however, it tends to be + # more noticeable when using FT Python. Therefore, consider only + # the calls section and disregard the recursive part. + list_insert_ncalls = list_insert_profile.ncalls.split("/")[0] + self.assertEqual( + int(list_insert_ncalls), NTHREADS * INSERT_PER_THREAD + ) + + self.assertEqual(len(lst), NTHREADS * INSERT_PER_THREAD) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst new file mode 100644 index 00000000000000..2bb68035b56509 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst @@ -0,0 +1,2 @@ +Make :mod:`cProfile` thread-safe on the :term:`free threaded ` build. diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index f82b446aff2e87..73602723d19bcf 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -534,6 +534,7 @@ static int statsForEntry(rotating_node_t *node, void *arg) } /*[clinic input] +@critical_section _lsprof.Profiler.getstats cls: defining_class @@ -565,7 +566,7 @@ profiler_subentry objects: static PyObject * _lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls) -/*[clinic end generated code: output=1806ef720019ee03 input=445e193ef4522902]*/ +/*[clinic end generated code: output=1806ef720019ee03 input=3dc69eb85ed73d91]*/ { statscollector_t collect; collect.state = _PyType_GetModuleState(cls); @@ -613,6 +614,7 @@ setBuiltins(ProfilerObject *pObj, int nvalue) } /*[clinic input] +@critical_section _lsprof.Profiler._pystart_callback code: object @@ -624,7 +626,7 @@ _lsprof.Profiler._pystart_callback static PyObject * _lsprof_Profiler__pystart_callback_impl(ProfilerObject *self, PyObject *code, PyObject *instruction_offset) -/*[clinic end generated code: output=5fec8b7ad5ed25e8 input=b166e6953c579cda]*/ +/*[clinic end generated code: output=5fec8b7ad5ed25e8 input=b61a0e79cf1f8499]*/ { ptrace_enter_call((PyObject*)self, (void *)code, code); @@ -632,6 +634,7 @@ _lsprof_Profiler__pystart_callback_impl(ProfilerObject *self, PyObject *code, } /*[clinic input] +@critical_section _lsprof.Profiler._pythrow_callback code: object @@ -645,7 +648,7 @@ static PyObject * _lsprof_Profiler__pythrow_callback_impl(ProfilerObject *self, PyObject *code, PyObject *instruction_offset, PyObject *exception) -/*[clinic end generated code: output=0a32988919dfb94c input=fd728fc2c074f5e6]*/ +/*[clinic end generated code: output=0a32988919dfb94c input=60c7f272206d3758]*/ { ptrace_enter_call((PyObject*)self, (void *)code, code); @@ -653,6 +656,7 @@ _lsprof_Profiler__pythrow_callback_impl(ProfilerObject *self, PyObject *code, } /*[clinic input] +@critical_section _lsprof.Profiler._pyreturn_callback code: object @@ -667,7 +671,7 @@ _lsprof_Profiler__pyreturn_callback_impl(ProfilerObject *self, PyObject *code, PyObject *instruction_offset, PyObject *retval) -/*[clinic end generated code: output=9e2f6fc1b882c51e input=667ffaeb2fa6fd1f]*/ +/*[clinic end generated code: output=9e2f6fc1b882c51e input=0ddcc1ec53faa928]*/ { ptrace_leave_call((PyObject*)self, (void *)code); @@ -703,6 +707,7 @@ PyObject* get_cfunc_from_callable(PyObject* callable, PyObject* self_arg, PyObje } /*[clinic input] +@critical_section _lsprof.Profiler._ccall_callback code: object @@ -717,7 +722,7 @@ static PyObject * _lsprof_Profiler__ccall_callback_impl(ProfilerObject *self, PyObject *code, PyObject *instruction_offset, PyObject *callable, PyObject *self_arg) -/*[clinic end generated code: output=152db83cabd18cad input=0e66687cfb95c001]*/ +/*[clinic end generated code: output=152db83cabd18cad input=2fc1e0630ee5e32b]*/ { if (self->flags & POF_BUILTINS) { PyObject* cfunc = get_cfunc_from_callable(callable, self_arg, self->missing); @@ -733,6 +738,7 @@ _lsprof_Profiler__ccall_callback_impl(ProfilerObject *self, PyObject *code, } /*[clinic input] +@critical_section _lsprof.Profiler._creturn_callback code: object @@ -748,7 +754,7 @@ _lsprof_Profiler__creturn_callback_impl(ProfilerObject *self, PyObject *code, PyObject *instruction_offset, PyObject *callable, PyObject *self_arg) -/*[clinic end generated code: output=1e886dde8fed8fb0 input=b18afe023746923a]*/ +/*[clinic end generated code: output=1e886dde8fed8fb0 input=bdc246d6b5b8714a]*/ { if (self->flags & POF_BUILTINS) { PyObject* cfunc = get_cfunc_from_callable(callable, self_arg, self->missing); @@ -780,6 +786,7 @@ static const struct { /*[clinic input] +@critical_section _lsprof.Profiler.enable subcalls: bool = True @@ -796,7 +803,7 @@ Start collecting profiling information. static PyObject * _lsprof_Profiler_enable_impl(ProfilerObject *self, int subcalls, int builtins) -/*[clinic end generated code: output=1e747f9dc1edd571 input=9ab81405107ab7f1]*/ +/*[clinic end generated code: output=1e747f9dc1edd571 input=0b88115b1c796173]*/ { int all_events = 0; if (setSubcalls(self, subcalls) < 0 || setBuiltins(self, builtins) < 0) { @@ -869,6 +876,7 @@ flush_unmatched(ProfilerObject *pObj) /*[clinic input] +@critical_section _lsprof.Profiler.disable Stop collecting profiling information. @@ -876,7 +884,7 @@ Stop collecting profiling information. static PyObject * _lsprof_Profiler_disable_impl(ProfilerObject *self) -/*[clinic end generated code: output=838cffef7f651870 input=05700b3fc68d1f50]*/ +/*[clinic end generated code: output=838cffef7f651870 input=f7e4787cae20f7f6]*/ { if (self->flags & POF_EXT_TIMER) { PyErr_SetString(PyExc_RuntimeError, @@ -928,6 +936,7 @@ _lsprof_Profiler_disable_impl(ProfilerObject *self) } /*[clinic input] +@critical_section _lsprof.Profiler.clear Clear all profiling information collected so far. @@ -935,7 +944,7 @@ Clear all profiling information collected so far. static PyObject * _lsprof_Profiler_clear_impl(ProfilerObject *self) -/*[clinic end generated code: output=dd1c668fb84b1335 input=fbe1f88c28be4f98]*/ +/*[clinic end generated code: output=dd1c668fb84b1335 input=4aab219d5d7a9bec]*/ { if (self->flags & POF_EXT_TIMER) { PyErr_SetString(PyExc_RuntimeError, diff --git a/Modules/clinic/_lsprof.c.h b/Modules/clinic/_lsprof.c.h index c426cd6fe02f39..acb4aaf27e377f 100644 --- a/Modules/clinic/_lsprof.c.h +++ b/Modules/clinic/_lsprof.c.h @@ -6,6 +6,7 @@ preserve # include "pycore_gc.h" // PyGC_Head # include "pycore_runtime.h" // _Py_ID() #endif +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_CheckPositional() PyDoc_STRVAR(_lsprof_Profiler_getstats__doc__, @@ -45,11 +46,18 @@ _lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls); static PyObject * _lsprof_Profiler_getstats(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "getstats() takes no arguments"); - return NULL; + goto exit; } - return _lsprof_Profiler_getstats_impl((ProfilerObject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _lsprof_Profiler_getstats_impl((ProfilerObject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_lsprof_Profiler__pystart_callback__doc__, @@ -76,7 +84,9 @@ _lsprof_Profiler__pystart_callback(PyObject *self, PyObject *const *args, Py_ssi } code = args[0]; instruction_offset = args[1]; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _lsprof_Profiler__pystart_callback_impl((ProfilerObject *)self, code, instruction_offset); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -109,7 +119,9 @@ _lsprof_Profiler__pythrow_callback(PyObject *self, PyObject *const *args, Py_ssi code = args[0]; instruction_offset = args[1]; exception = args[2]; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _lsprof_Profiler__pythrow_callback_impl((ProfilerObject *)self, code, instruction_offset, exception); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -143,7 +155,9 @@ _lsprof_Profiler__pyreturn_callback(PyObject *self, PyObject *const *args, Py_ss code = args[0]; instruction_offset = args[1]; retval = args[2]; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _lsprof_Profiler__pyreturn_callback_impl((ProfilerObject *)self, code, instruction_offset, retval); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -178,7 +192,9 @@ _lsprof_Profiler__ccall_callback(PyObject *self, PyObject *const *args, Py_ssize instruction_offset = args[1]; callable = args[2]; self_arg = args[3]; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _lsprof_Profiler__ccall_callback_impl((ProfilerObject *)self, code, instruction_offset, callable, self_arg); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -215,7 +231,9 @@ _lsprof_Profiler__creturn_callback(PyObject *self, PyObject *const *args, Py_ssi instruction_offset = args[1]; callable = args[2]; self_arg = args[3]; + Py_BEGIN_CRITICAL_SECTION(self); return_value = _lsprof_Profiler__creturn_callback_impl((ProfilerObject *)self, code, instruction_offset, callable, self_arg); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -299,7 +317,9 @@ _lsprof_Profiler_enable(PyObject *self, PyObject *const *args, Py_ssize_t nargs, goto exit; } skip_optional_pos: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _lsprof_Profiler_enable_impl((ProfilerObject *)self, subcalls, builtins); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -320,7 +340,13 @@ _lsprof_Profiler_disable_impl(ProfilerObject *self); static PyObject * _lsprof_Profiler_disable(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _lsprof_Profiler_disable_impl((ProfilerObject *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _lsprof_Profiler_disable_impl((ProfilerObject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_lsprof_Profiler_clear__doc__, @@ -338,7 +364,13 @@ _lsprof_Profiler_clear_impl(ProfilerObject *self); static PyObject * _lsprof_Profiler_clear(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _lsprof_Profiler_clear_impl((ProfilerObject *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _lsprof_Profiler_clear_impl((ProfilerObject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(profiler_init__doc__, @@ -444,4 +476,4 @@ profiler_init(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=9e46985561166c37 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=af26a0b0ddcc3351 input=a9049054013a1b77]*/ From a893270c6d96262a34bf54b6b9c96d28bfc9c30d Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:52:12 +0100 Subject: [PATCH 1057/1674] [3.14] gh-71648: Optimize PNG files (GH-138842) (GH-138851) * Only keep > 1 kb savings (cherry picked from commit 2e8f64c9317a327a2be1ab8031844ef3967c1040) --- Doc/using/mac_installer_07_applications.png | Bin 148826 -> 104859 bytes Doc/using/win_install_freethreaded.png | Bin 236250 -> 210647 bytes Doc/using/win_installer.png | Bin 84383 -> 79713 bytes Lib/idlelib/Icons/idle_256.png | Bin 39205 -> 31216 bytes Objects/object_layout_312.png | Bin 33040 -> 24969 bytes Objects/object_layout_313.png | Bin 35055 -> 25347 bytes Objects/object_layout_full_312.png | Bin 17092 -> 6333 bytes Objects/object_layout_full_313.png | Bin 16983 -> 5167 bytes PC/icons/idlex150.png | Bin 20537 -> 15502 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Doc/using/mac_installer_07_applications.png b/Doc/using/mac_installer_07_applications.png index 940219cad6f61c02b5ee19617a24acd092d38fe4..c8b3aa1099adfc95fc2cc12c336942ee6b9ebd9f 100644 GIT binary patch delta 102397 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
)go}u0g)*`u>Y%6GzW7X4Z5c&+pkww9~UG3P?f= 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 literal 148826 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%0A{@Gt5p7h`7lxqz- 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 - - + + - - + + - - + + - +
- + diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index eea29e2449a9cf..086f15662cf87b 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -9,9 +9,9 @@

{% trans %}Docs by version{% endtrans %}

{% trans %}Other resources{% endtrans %}

From db98e0bb127c469842dc119d23e5daacd23862cc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 12:42:50 +0200 Subject: [PATCH 0197/1674] [3.14] gh-71339: Use new assertion methods in tests (GH-129046) (GH-134498) (cherry picked from commit 2602d8ae981c4bae1cada2c174b367d97f712efb) Co-authored-by: Serhiy Storchaka --- Lib/test/_test_embed_structseq.py | 2 +- Lib/test/datetimetester.py | 12 ++++---- Lib/test/mapping_tests.py | 4 +-- Lib/test/pickletester.py | 4 +-- Lib/test/support/warnings_helper.py | 3 +- Lib/test/test__osx_support.py | 4 +-- Lib/test/test_abstract_numbers.py | 30 ++++++++++---------- Lib/test/test_argparse.py | 2 +- Lib/test/test_ast/test_ast.py | 18 ++++++------ Lib/test/test_audit.py | 2 +- Lib/test/test_base64.py | 2 +- Lib/test/test_baseexception.py | 8 ++---- Lib/test/test_binascii.py | 6 ++-- Lib/test/test_binop.py | 2 +- Lib/test/test_buffer.py | 4 +-- Lib/test/test_builtin.py | 4 +-- Lib/test/test_bytes.py | 10 +++---- Lib/test/test_bz2.py | 4 +-- Lib/test/test_calendar.py | 2 +- Lib/test/test_call.py | 4 +-- Lib/test/test_clinic.py | 23 ++++++--------- Lib/test/test_cmd_line.py | 11 +++---- Lib/test/test_cmd_line_script.py | 11 ++++--- Lib/test/test_code_module.py | 2 +- Lib/test/test_codecs.py | 2 +- Lib/test/test_compileall.py | 2 +- Lib/test/test_compiler_assemble.py | 2 +- Lib/test/test_contextlib.py | 8 +++--- Lib/test/test_contextlib_async.py | 8 +++--- Lib/test/test_copy.py | 2 +- Lib/test/test_coroutines.py | 2 +- Lib/test/test_curses.py | 2 +- Lib/test/test_dataclasses/__init__.py | 24 ++++++++-------- Lib/test/test_dbm.py | 2 +- Lib/test/test_dbm_sqlite3.py | 4 +-- Lib/test/test_deque.py | 2 +- Lib/test/test_descr.py | 18 ++++++------ Lib/test/test_dict.py | 4 +-- Lib/test/test_dynamicclassattribute.py | 4 +-- Lib/test/test_enum.py | 18 ++++++------ Lib/test/test_errno.py | 6 ++-- Lib/test/test_exception_group.py | 10 +++---- Lib/test/test_exceptions.py | 20 ++++++------- Lib/test/test_fileinput.py | 2 +- Lib/test/test_gc.py | 2 +- Lib/test/test_genericalias.py | 10 +++---- Lib/test/test_genericpath.py | 4 +-- Lib/test/test_gzip.py | 8 +++--- Lib/test/test_hashlib.py | 4 +-- Lib/test/test_inspect/test_inspect.py | 10 +++---- Lib/test/test_int.py | 2 +- Lib/test/test_io.py | 18 ++++++------ Lib/test/test_json/test_fail.py | 2 +- Lib/test/test_json/test_tool.py | 2 +- Lib/test/test_launcher.py | 8 +++--- Lib/test/test_lzma.py | 4 +-- Lib/test/test_memoryio.py | 4 +-- Lib/test/test_ordered_dict.py | 8 +++--- Lib/test/test_os.py | 14 ++++----- Lib/test/test_pathlib/test_pathlib.py | 8 +++--- Lib/test/test_peepholer.py | 2 +- Lib/test/test_peg_generator/test_c_parser.py | 4 +-- Lib/test/test_peg_generator/test_pegen.py | 6 ++-- Lib/test/test_perf_profiler.py | 4 +-- Lib/test/test_pickle.py | 4 +-- Lib/test/test_platform.py | 2 +- Lib/test/test_posix.py | 12 ++++---- Lib/test/test_property.py | 4 +-- Lib/test/test_pulldom.py | 4 +-- Lib/test/test_pyclbr.py | 2 +- Lib/test/test_pydoc/test_pydoc.py | 2 +- Lib/test/test_random.py | 12 ++++---- Lib/test/test_re.py | 8 +++--- Lib/test/test_reprlib.py | 20 ++++++------- Lib/test/test_rlcompleter.py | 2 +- Lib/test/test_runpy.py | 2 +- Lib/test/test_scope.py | 2 +- Lib/test/test_script_helper.py | 3 +- Lib/test/test_set.py | 6 ++-- Lib/test/test_shutil.py | 6 ++-- Lib/test/test_site.py | 22 +++++++------- Lib/test/test_socket.py | 22 +++++++------- Lib/test/test_source_encoding.py | 3 +- Lib/test/test_ssl.py | 10 +++---- Lib/test/test_stat.py | 6 ++-- Lib/test/test_statistics.py | 21 ++++---------- Lib/test/test_structseq.py | 4 +-- Lib/test/test_subprocess.py | 8 +++--- Lib/test/test_super.py | 10 +++---- Lib/test/test_support.py | 4 +-- Lib/test/test_sys.py | 26 ++++++++--------- Lib/test/test_sysconfig.py | 10 +++---- Lib/test/test_tarfile.py | 2 +- Lib/test/test_tempfile.py | 16 +++++------ Lib/test/test_termios.py | 4 +-- Lib/test/test_time.py | 12 ++++---- Lib/test/test_timeit.py | 4 +-- Lib/test/test_tkinter/support.py | 2 +- Lib/test/test_tkinter/test_misc.py | 24 ++++++++-------- Lib/test/test_type_comments.py | 2 +- Lib/test/test_types.py | 22 +++++++------- Lib/test/test_unittest/test_case.py | 8 +++--- Lib/test/test_userdict.py | 2 +- Lib/test/test_venv.py | 4 +-- Lib/test/test_warnings/__init__.py | 10 +++---- Lib/test/test_weakref.py | 6 ++-- Lib/test/test_weakset.py | 4 +-- Lib/test/test_winconsoleio.py | 6 ++-- Lib/test/test_with.py | 2 +- Lib/test/test_wmi.py | 4 +-- Lib/test/test_wsgiref.py | 14 ++++----- Lib/test/test_xml_etree.py | 5 ++-- Lib/test/test_xxlimited.py | 2 +- Lib/test/test_zipapp.py | 6 ++-- Lib/test/test_zipfile/test_core.py | 6 ++-- Lib/test/test_zipimport.py | 4 +-- Lib/test/test_zoneinfo/test_zoneinfo.py | 4 +-- 117 files changed, 407 insertions(+), 445 deletions(-) diff --git a/Lib/test/_test_embed_structseq.py b/Lib/test/_test_embed_structseq.py index 154662efce9412..4cac84d7a469ac 100644 --- a/Lib/test/_test_embed_structseq.py +++ b/Lib/test/_test_embed_structseq.py @@ -11,7 +11,7 @@ def check_structseq(self, obj_type): # ob_refcnt self.assertGreaterEqual(sys.getrefcount(obj_type), 1) # tp_base - self.assertTrue(issubclass(obj_type, tuple)) + self.assertIsSubclass(obj_type, tuple) # tp_bases self.assertEqual(obj_type.__bases__, (tuple,)) # tp_dict diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index d1882a310bbbb0..1b551254f86c32 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -183,7 +183,7 @@ class NotEnough(tzinfo): def __init__(self, offset, name): self.__offset = offset self.__name = name - self.assertTrue(issubclass(NotEnough, tzinfo)) + self.assertIsSubclass(NotEnough, tzinfo) ne = NotEnough(3, "NotByALongShot") self.assertIsInstance(ne, tzinfo) @@ -232,7 +232,7 @@ def test_pickling_subclass(self): self.assertIs(type(derived), otype) self.assertEqual(derived.utcoffset(None), offset) self.assertEqual(derived.tzname(None), oname) - self.assertFalse(hasattr(derived, 'spam')) + self.assertNotHasAttr(derived, 'spam') def test_issue23600(self): DSTDIFF = DSTOFFSET = timedelta(hours=1) @@ -813,7 +813,7 @@ def test_roundtrip(self): # Verify td -> string -> td identity. s = repr(td) - self.assertTrue(s.startswith('datetime.')) + self.assertStartsWith(s, 'datetime.') s = s[9:] td2 = eval(s) self.assertEqual(td, td2) @@ -1231,7 +1231,7 @@ def test_roundtrip(self): self.theclass.today()): # Verify dt -> string -> date identity. s = repr(dt) - self.assertTrue(s.startswith('datetime.')) + self.assertStartsWith(s, 'datetime.') s = s[9:] dt2 = eval(s) self.assertEqual(dt, dt2) @@ -2218,7 +2218,7 @@ def test_roundtrip(self): self.theclass.now()): # Verify dt -> string -> datetime identity. s = repr(dt) - self.assertTrue(s.startswith('datetime.')) + self.assertStartsWith(s, 'datetime.') s = s[9:] dt2 = eval(s) self.assertEqual(dt, dt2) @@ -3672,7 +3672,7 @@ def test_roundtrip(self): # Verify t -> string -> time identity. s = repr(t) - self.assertTrue(s.startswith('datetime.')) + self.assertStartsWith(s, 'datetime.') s = s[9:] t2 = eval(s) self.assertEqual(t, t2) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index 9d38da5a86ee5a..20306e1526d7b8 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -70,8 +70,8 @@ def test_read(self): if not d: self.fail("Full mapping must compare to True") # keys(), items(), iterkeys() ... def check_iterandlist(iter, lst, ref): - self.assertTrue(hasattr(iter, '__next__')) - self.assertTrue(hasattr(iter, '__iter__')) + self.assertHasAttr(iter, '__next__') + self.assertHasAttr(iter, '__iter__') x = list(iter) self.assertTrue(set(x)==set(lst)==set(ref)) check_iterandlist(iter(d.keys()), list(d.keys()), diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index dcba6369541049..9d6ae3e4d00ece 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -3068,7 +3068,7 @@ def test_proto(self): pickled = self.dumps(None, proto) if proto >= 2: proto_header = pickle.PROTO + bytes([proto]) - self.assertTrue(pickled.startswith(proto_header)) + self.assertStartsWith(pickled, proto_header) else: self.assertEqual(count_opcode(pickle.PROTO, pickled), 0) @@ -5007,7 +5007,7 @@ def test_default_dispatch_table(self): p = self.pickler_class(f, 0) with self.assertRaises(AttributeError): p.dispatch_table - self.assertFalse(hasattr(p, 'dispatch_table')) + self.assertNotHasAttr(p, 'dispatch_table') def test_class_dispatch_table(self): # A dispatch_table attribute can be specified class-wide diff --git a/Lib/test/support/warnings_helper.py b/Lib/test/support/warnings_helper.py index a6e43dff2003b7..5f6f14afd74a6e 100644 --- a/Lib/test/support/warnings_helper.py +++ b/Lib/test/support/warnings_helper.py @@ -23,8 +23,7 @@ def check_syntax_warning(testcase, statement, errtext='', testcase.assertEqual(len(warns), 1, warns) warn, = warns - testcase.assertTrue(issubclass(warn.category, SyntaxWarning), - warn.category) + testcase.assertIsSubclass(warn.category, SyntaxWarning) if errtext: testcase.assertRegex(str(warn.message), errtext) testcase.assertEqual(warn.filename, '') diff --git a/Lib/test/test__osx_support.py b/Lib/test/test__osx_support.py index 53aa26620a6475..0813c4804c1cdc 100644 --- a/Lib/test/test__osx_support.py +++ b/Lib/test/test__osx_support.py @@ -66,8 +66,8 @@ def test__find_build_tool(self): 'cc not found - check xcode-select') def test__get_system_version(self): - self.assertTrue(platform.mac_ver()[0].startswith( - _osx_support._get_system_version())) + self.assertStartsWith(platform.mac_ver()[0], + _osx_support._get_system_version()) def test__remove_original_values(self): config_vars = { diff --git a/Lib/test/test_abstract_numbers.py b/Lib/test/test_abstract_numbers.py index 72232b670cdb89..cf071d2c933dd2 100644 --- a/Lib/test/test_abstract_numbers.py +++ b/Lib/test/test_abstract_numbers.py @@ -24,11 +24,11 @@ def not_implemented(*args, **kwargs): class TestNumbers(unittest.TestCase): def test_int(self): - self.assertTrue(issubclass(int, Integral)) - self.assertTrue(issubclass(int, Rational)) - self.assertTrue(issubclass(int, Real)) - self.assertTrue(issubclass(int, Complex)) - self.assertTrue(issubclass(int, Number)) + self.assertIsSubclass(int, Integral) + self.assertIsSubclass(int, Rational) + self.assertIsSubclass(int, Real) + self.assertIsSubclass(int, Complex) + self.assertIsSubclass(int, Number) self.assertEqual(7, int(7).real) self.assertEqual(0, int(7).imag) @@ -38,11 +38,11 @@ def test_int(self): self.assertEqual(1, int(7).denominator) def test_float(self): - self.assertFalse(issubclass(float, Integral)) - self.assertFalse(issubclass(float, Rational)) - self.assertTrue(issubclass(float, Real)) - self.assertTrue(issubclass(float, Complex)) - self.assertTrue(issubclass(float, Number)) + self.assertNotIsSubclass(float, Integral) + self.assertNotIsSubclass(float, Rational) + self.assertIsSubclass(float, Real) + self.assertIsSubclass(float, Complex) + self.assertIsSubclass(float, Number) self.assertEqual(7.3, float(7.3).real) self.assertEqual(0, float(7.3).imag) @@ -50,11 +50,11 @@ def test_float(self): self.assertEqual(-7.3, float(-7.3).conjugate()) def test_complex(self): - self.assertFalse(issubclass(complex, Integral)) - self.assertFalse(issubclass(complex, Rational)) - self.assertFalse(issubclass(complex, Real)) - self.assertTrue(issubclass(complex, Complex)) - self.assertTrue(issubclass(complex, Number)) + self.assertNotIsSubclass(complex, Integral) + self.assertNotIsSubclass(complex, Rational) + self.assertNotIsSubclass(complex, Real) + self.assertIsSubclass(complex, Complex) + self.assertIsSubclass(complex, Number) c1, c2 = complex(3, 2), complex(4,1) # XXX: This is not ideal, but see the comment in math_trunc(). diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 58853ba4eb3674..08ff41368d9bb0 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -6805,7 +6805,7 @@ class TestImportStar(TestCase): def test(self): for name in argparse.__all__: - self.assertTrue(hasattr(argparse, name)) + self.assertHasAttr(argparse, name) def test_all_exports_everything_but_modules(self): items = [ diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 0776559b9003db..1479a8eafd62ec 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -275,12 +275,12 @@ def test_alias(self): self.assertEqual(alias.end_col_offset, 17) def test_base_classes(self): - self.assertTrue(issubclass(ast.For, ast.stmt)) - self.assertTrue(issubclass(ast.Name, ast.expr)) - self.assertTrue(issubclass(ast.stmt, ast.AST)) - self.assertTrue(issubclass(ast.expr, ast.AST)) - self.assertTrue(issubclass(ast.comprehension, ast.AST)) - self.assertTrue(issubclass(ast.Gt, ast.AST)) + self.assertIsSubclass(ast.For, ast.stmt) + self.assertIsSubclass(ast.Name, ast.expr) + self.assertIsSubclass(ast.stmt, ast.AST) + self.assertIsSubclass(ast.expr, ast.AST) + self.assertIsSubclass(ast.comprehension, ast.AST) + self.assertIsSubclass(ast.Gt, ast.AST) def test_field_attr_existence(self): for name, item in ast.__dict__.items(): @@ -1101,7 +1101,7 @@ def test_copy_with_parents(self): def test_replace_interface(self): for klass in self.iter_ast_classes(): with self.subTest(klass=klass): - self.assertTrue(hasattr(klass, '__replace__')) + self.assertHasAttr(klass, '__replace__') fields = set(klass._fields) with self.subTest(klass=klass, fields=fields): @@ -1330,7 +1330,7 @@ def test_replace_reject_known_custom_instance_fields_commits(self): context = node.ctx # explicit rejection of known instance fields - self.assertTrue(hasattr(node, 'extra')) + self.assertHasAttr(node, 'extra') msg = "Name.__replace__ got an unexpected keyword argument 'extra'." with self.assertRaisesRegex(TypeError, re.escape(msg)): copy.replace(node, extra=1) @@ -3071,7 +3071,7 @@ def test_FunctionDef(self): with self.assertWarnsRegex(DeprecationWarning, r"FunctionDef\.__init__ missing 1 required positional argument: 'name'"): node = ast.FunctionDef(args=args) - self.assertFalse(hasattr(node, "name")) + self.assertNotHasAttr(node, "name") self.assertEqual(node.decorator_list, []) node = ast.FunctionDef(name='foo', args=args) self.assertEqual(node.name, 'foo') diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 2b24b5d79275fa..5f9eb381f605d9 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -134,7 +134,7 @@ def test_socket(self): self.assertEqual(events[0][0], "socket.gethostname") self.assertEqual(events[1][0], "socket.__new__") self.assertEqual(events[2][0], "socket.bind") - self.assertTrue(events[2][2].endswith("('127.0.0.1', 8080)")) + self.assertEndsWith(events[2][2], "('127.0.0.1', 8080)") def test_gc(self): returncode, events, stderr = self.run_python("test_gc") diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 9efebc43d911c4..ce2e3e3726fcd0 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -812,7 +812,7 @@ def test_decode_nonascii_str(self): self.assertRaises(ValueError, f, 'with non-ascii \xcb') def test_ErrorHeritage(self): - self.assertTrue(issubclass(binascii.Error, ValueError)) + self.assertIsSubclass(binascii.Error, ValueError) def test_RFC4648_test_cases(self): # test cases from RFC 4648 section 10 diff --git a/Lib/test/test_baseexception.py b/Lib/test/test_baseexception.py index e599b02c17d9c0..12d4088842b119 100644 --- a/Lib/test/test_baseexception.py +++ b/Lib/test/test_baseexception.py @@ -10,13 +10,11 @@ class ExceptionClassTests(unittest.TestCase): inheritance hierarchy)""" def test_builtins_new_style(self): - self.assertTrue(issubclass(Exception, object)) + self.assertIsSubclass(Exception, object) def verify_instance_interface(self, ins): for attr in ("args", "__str__", "__repr__"): - self.assertTrue(hasattr(ins, attr), - "%s missing %s attribute" % - (ins.__class__.__name__, attr)) + self.assertHasAttr(ins, attr) def test_inheritance(self): # Make sure the inheritance hierarchy matches the documentation @@ -65,7 +63,7 @@ def test_inheritance(self): elif last_depth > depth: while superclasses[-1][0] >= depth: superclasses.pop() - self.assertTrue(issubclass(exc, superclasses[-1][1]), + self.assertIsSubclass(exc, superclasses[-1][1], "%s is not a subclass of %s" % (exc.__name__, superclasses[-1][1].__name__)) try: # Some exceptions require arguments; just skip them diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 1f3b6746ce4a62..7ed7d7c47b6de1 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -38,13 +38,13 @@ def assertConversion(self, original, converted, restored, **kwargs): def test_exceptions(self): # Check module exceptions - self.assertTrue(issubclass(binascii.Error, Exception)) - self.assertTrue(issubclass(binascii.Incomplete, Exception)) + self.assertIsSubclass(binascii.Error, Exception) + self.assertIsSubclass(binascii.Incomplete, Exception) def test_functions(self): # Check presence of all functions for name in all_functions: - self.assertTrue(hasattr(getattr(binascii, name), '__call__')) + self.assertHasAttr(getattr(binascii, name), '__call__') self.assertRaises(TypeError, getattr(binascii, name)) def test_returned_value(self): diff --git a/Lib/test/test_binop.py b/Lib/test/test_binop.py index 299af09c4983df..b224c3d4e6078e 100644 --- a/Lib/test/test_binop.py +++ b/Lib/test/test_binop.py @@ -383,7 +383,7 @@ def test_comparison_orders(self): self.assertEqual(op_sequence(le, B, C), ['C.__ge__', 'B.__le__']) self.assertEqual(op_sequence(le, C, B), ['C.__le__', 'B.__ge__']) - self.assertTrue(issubclass(V, B)) + self.assertIsSubclass(V, B) self.assertEqual(op_sequence(eq, B, V), ['B.__eq__', 'V.__eq__']) self.assertEqual(op_sequence(le, B, V), ['B.__le__', 'V.__ge__']) diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index 61921e93e85e63..19582e757161fc 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -2879,11 +2879,11 @@ def test_memoryview_tolist(self): def test_memoryview_repr(self): m = memoryview(bytearray(9)) r = m.__repr__() - self.assertTrue(r.startswith("Calendar for 2004', output) def test_html_output_current_year(self): diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 185ae84dc4d19f..1c73aaafb71fd5 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -695,8 +695,8 @@ class DerivedType(SuperType): UnaffectedType2 = _testcapi.make_vectorcall_class(SuperType) # Aside: Quickly check that the C helper actually made derived types - self.assertTrue(issubclass(UnaffectedType1, DerivedType)) - self.assertTrue(issubclass(UnaffectedType2, SuperType)) + self.assertIsSubclass(UnaffectedType1, DerivedType) + self.assertIsSubclass(UnaffectedType2, SuperType) # Initial state: tp_call self.assertEqual(instance(), "tp_call") diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 90b7d343cea583..05e46a18b0a92a 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -238,11 +238,11 @@ def test_directive_output_print(self): # The generated output will differ for every run, but we can check that # it starts with the clinic block, we check that it contains all the # expected fields, and we check that it contains the checksum line. - self.assertTrue(out.startswith(dedent(""" + self.assertStartsWith(out, dedent(""" /*[clinic input] output print 'I told you once.' [clinic start generated code]*/ - """))) + """)) fields = { "cpp_endif", "cpp_if", @@ -259,9 +259,7 @@ def test_directive_output_print(self): with self.subTest(field=field): self.assertIn(field, out) last_line = out.rstrip().split("\n")[-1] - self.assertTrue( - last_line.startswith("/*[clinic end generated code: output=") - ) + self.assertStartsWith(last_line, "/*[clinic end generated code: output=") def test_directive_wrong_arg_number(self): raw = dedent(""" @@ -2705,8 +2703,7 @@ def test_cli_force(self): # Note, we cannot check the entire fail msg, because the path to # the tmp file will change for every run. _, err = self.expect_failure(fn) - self.assertTrue(err.endswith(fail_msg), - f"{err!r} does not end with {fail_msg!r}") + self.assertEndsWith(err, fail_msg) # Then, force regeneration; success expected. out = self.expect_success("-f", fn) self.assertEqual(out, "") @@ -2717,8 +2714,7 @@ def test_cli_force(self): ) with open(fn, encoding='utf-8') as f: generated = f.read() - self.assertTrue(generated.endswith(checksum), - (generated, checksum)) + self.assertEndsWith(generated, checksum) def test_cli_make(self): c_code = dedent(""" @@ -2867,8 +2863,8 @@ def test_cli_converters(self): # param may change (it's a set, thus unordered). So, let's compare the # start and end of the expected output, and then assert that the # converters appear lined up in alphabetical order. - self.assertTrue(out.startswith(prelude), out) - self.assertTrue(out.endswith(finale), out) + self.assertStartsWith(out, prelude) + self.assertEndsWith(out, finale) out = out.removeprefix(prelude) out = out.removesuffix(finale) @@ -2876,10 +2872,7 @@ def test_cli_converters(self): for converter, line in zip(expected_converters, lines): line = line.lstrip() with self.subTest(converter=converter): - self.assertTrue( - line.startswith(converter), - f"expected converter {converter!r}, got {line!r}" - ) + self.assertStartsWith(line, converter) def test_cli_fail_converters_and_filename(self): _, err = self.expect_failure("--converters", "test.c") diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index f540973c11e01c..c17d749d4a17ed 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -39,7 +39,8 @@ def test_directories(self): def verify_valid_flag(self, cmd_line): rc, out, err = assert_python_ok(cmd_line) - self.assertTrue(out == b'' or out.endswith(b'\n')) + if out != b'': + self.assertEndsWith(out, b'\n') self.assertNotIn(b'Traceback', out) self.assertNotIn(b'Traceback', err) return out @@ -89,8 +90,8 @@ def test_version(self): version = ('Python %d.%d' % sys.version_info[:2]).encode("ascii") for switch in '-V', '--version', '-VV': rc, out, err = assert_python_ok(switch) - self.assertFalse(err.startswith(version)) - self.assertTrue(out.startswith(version)) + self.assertNotStartsWith(err, version) + self.assertStartsWith(out, version) def test_verbose(self): # -v causes imports to write to stderr. If the write to @@ -380,7 +381,7 @@ def test_unbuffered_input(self): p.stdin.flush() data, rc = _kill_python_and_exit_code(p) self.assertEqual(rc, 0) - self.assertTrue(data.startswith(b'x'), data) + self.assertStartsWith(data, b'x') def test_large_PYTHONPATH(self): path1 = "ABCDE" * 100 @@ -1039,7 +1040,7 @@ def test_parsing_error(self): stderr=subprocess.PIPE, text=True) err_msg = "Unknown option: --unknown-option\nusage: " - self.assertTrue(proc.stderr.startswith(err_msg), proc.stderr) + self.assertStartsWith(proc.stderr, err_msg) self.assertNotEqual(proc.returncode, 0) def test_int_max_str_digits(self): diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 53dc9b1a7effb5..784c45aa96f8a7 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -553,9 +553,9 @@ def test_pep_409_verbiage(self): exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii').split('\n') self.assertEqual(len(text), 5) - self.assertTrue(text[0].startswith('Traceback')) - self.assertTrue(text[1].startswith(' File ')) - self.assertTrue(text[3].startswith('NameError')) + self.assertStartsWith(text[0], 'Traceback') + self.assertStartsWith(text[1], ' File ') + self.assertStartsWith(text[3], 'NameError') def test_non_ascii(self): # Apple platforms deny the creation of a file with an invalid UTF-8 name. @@ -708,9 +708,8 @@ def test_syntaxerror_does_not_crash(self): exitcode, stdout, stderr = assert_python_failure(script_name) text = io.TextIOWrapper(io.BytesIO(stderr), 'ascii').read() # It used to crash in https://github.com/python/cpython/issues/111132 - self.assertTrue(text.endswith( - 'SyntaxError: nonlocal declaration not allowed at module level\n', - ), text) + self.assertEndsWith(text, + 'SyntaxError: nonlocal declaration not allowed at module level\n') def test_consistent_sys_path_for_direct_execution(self): # This test case ensures that the following all give the same diff --git a/Lib/test/test_code_module.py b/Lib/test/test_code_module.py index 57fb130070b34e..3642b47c2c1f03 100644 --- a/Lib/test/test_code_module.py +++ b/Lib/test/test_code_module.py @@ -133,7 +133,7 @@ def test_unicode_error(self): output = ''.join(''.join(call[1]) for call in self.stderr.method_calls) output = output[output.index('(InteractiveConsole)'):] output = output[output.index('\n') + 1:] - self.assertTrue(output.startswith('UnicodeEncodeError: '), output) + self.assertStartsWith(output, 'UnicodeEncodeError: ') self.assertIs(self.sysmod.last_type, UnicodeEncodeError) self.assertIs(type(self.sysmod.last_value), UnicodeEncodeError) self.assertIsNone(self.sysmod.last_traceback) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 1d6136405f428c..8c9a0972492294 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3802,7 +3802,7 @@ def check_decode_strings(self, errors): with self.assertRaises(RuntimeError) as cm: self.decode(encoded, errors) errmsg = str(cm.exception) - self.assertTrue(errmsg.startswith("decode error: "), errmsg) + self.assertStartsWith(errmsg, "decode error: ") else: decoded = self.decode(encoded, errors) self.assertEqual(decoded, expected) diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index a580a240d9f474..8384c183dd92dd 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -316,7 +316,7 @@ def _test_ddir_only(self, *, ddir, parallel=True): self.assertTrue(mods) for mod in mods: - self.assertTrue(mod.startswith(self.directory), mod) + self.assertStartsWith(mod, self.directory) modcode = importlib.util.cache_from_source(mod) modpath = mod[len(self.directory+os.sep):] _, _, err = script_helper.assert_python_failure(modcode) diff --git a/Lib/test/test_compiler_assemble.py b/Lib/test/test_compiler_assemble.py index c4962e3599986e..99a11e99d56485 100644 --- a/Lib/test/test_compiler_assemble.py +++ b/Lib/test/test_compiler_assemble.py @@ -146,4 +146,4 @@ def test_exception_table(self): L1 to L2 -> L2 [0] L2 to L3 -> L3 [1] lasti """) - self.assertTrue(output.getvalue().endswith(exc_table)) + self.assertEndsWith(output.getvalue(), exc_table) diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index cf6519598037e9..6a3329fa5aaace 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -48,23 +48,23 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): return None - self.assertTrue(issubclass(ManagerFromScratch, AbstractContextManager)) + self.assertIsSubclass(ManagerFromScratch, AbstractContextManager) class DefaultEnter(AbstractContextManager): def __exit__(self, *args): super().__exit__(*args) - self.assertTrue(issubclass(DefaultEnter, AbstractContextManager)) + self.assertIsSubclass(DefaultEnter, AbstractContextManager) class NoEnter(ManagerFromScratch): __enter__ = None - self.assertFalse(issubclass(NoEnter, AbstractContextManager)) + self.assertNotIsSubclass(NoEnter, AbstractContextManager) class NoExit(ManagerFromScratch): __exit__ = None - self.assertFalse(issubclass(NoExit, AbstractContextManager)) + self.assertNotIsSubclass(NoExit, AbstractContextManager) class ContextManagerTestCase(unittest.TestCase): diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 7750186e56a5cc..dcd0072037950e 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -77,23 +77,23 @@ async def __aenter__(self): async def __aexit__(self, exc_type, exc_value, traceback): return None - self.assertTrue(issubclass(ManagerFromScratch, AbstractAsyncContextManager)) + self.assertIsSubclass(ManagerFromScratch, AbstractAsyncContextManager) class DefaultEnter(AbstractAsyncContextManager): async def __aexit__(self, *args): await super().__aexit__(*args) - self.assertTrue(issubclass(DefaultEnter, AbstractAsyncContextManager)) + self.assertIsSubclass(DefaultEnter, AbstractAsyncContextManager) class NoneAenter(ManagerFromScratch): __aenter__ = None - self.assertFalse(issubclass(NoneAenter, AbstractAsyncContextManager)) + self.assertNotIsSubclass(NoneAenter, AbstractAsyncContextManager) class NoneAexit(ManagerFromScratch): __aexit__ = None - self.assertFalse(issubclass(NoneAexit, AbstractAsyncContextManager)) + self.assertNotIsSubclass(NoneAexit, AbstractAsyncContextManager) class AsyncContextManagerTestCase(unittest.TestCase): diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index d76341417e9bef..3cb8072abefe98 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -19,7 +19,7 @@ class TestCopy(unittest.TestCase): def test_exceptions(self): self.assertIs(copy.Error, copy.error) - self.assertTrue(issubclass(copy.Error, Exception)) + self.assertIsSubclass(copy.Error, Exception) # The copy() method diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 761cb230277bd9..4755046fe1904d 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -527,7 +527,7 @@ class CoroutineTest(unittest.TestCase): def test_gen_1(self): def gen(): yield - self.assertFalse(hasattr(gen, '__await__')) + self.assertNotHasAttr(gen, '__await__') def test_func_1(self): async def foo(): diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index c307258e5657e2..181ead710f3d68 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -1257,7 +1257,7 @@ class TestAscii(unittest.TestCase): def test_controlnames(self): for name in curses.ascii.controlnames: - self.assertTrue(hasattr(curses.ascii, name), name) + self.assertHasAttr(curses.ascii, name) def test_ctypes(self): def check(func, expected): diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index ac78f8327b808e..e98a8f284cec9f 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -120,7 +120,7 @@ class Some: pass for param in inspect.signature(dataclass).parameters: if param == 'cls': continue - self.assertTrue(hasattr(Some.__dataclass_params__, param), msg=param) + self.assertHasAttr(Some.__dataclass_params__, param) def test_named_init_params(self): @dataclass @@ -671,7 +671,7 @@ class C: self.assertEqual(the_fields[0].name, 'x') self.assertEqual(the_fields[0].type, int) - self.assertFalse(hasattr(C, 'x')) + self.assertNotHasAttr(C, 'x') self.assertTrue (the_fields[0].init) self.assertTrue (the_fields[0].repr) self.assertEqual(the_fields[1].name, 'y') @@ -681,7 +681,7 @@ class C: self.assertTrue (the_fields[1].repr) self.assertEqual(the_fields[2].name, 'z') self.assertEqual(the_fields[2].type, str) - self.assertFalse(hasattr(C, 'z')) + self.assertNotHasAttr(C, 'z') self.assertTrue (the_fields[2].init) self.assertFalse(the_fields[2].repr) @@ -732,8 +732,8 @@ class C: z: object = default t: int = field(default=100) - self.assertFalse(hasattr(C, 'x')) - self.assertFalse(hasattr(C, 'y')) + self.assertNotHasAttr(C, 'x') + self.assertNotHasAttr(C, 'y') self.assertIs (C.z, default) self.assertEqual(C.t, 100) @@ -2912,10 +2912,10 @@ class C: pass c = C() - self.assertFalse(hasattr(c, 'i')) + self.assertNotHasAttr(c, 'i') with self.assertRaises(FrozenInstanceError): c.i = 5 - self.assertFalse(hasattr(c, 'i')) + self.assertNotHasAttr(c, 'i') with self.assertRaises(FrozenInstanceError): del c.i @@ -3144,7 +3144,7 @@ class S(D): del s.y self.assertEqual(s.y, 10) del s.cached - self.assertFalse(hasattr(s, 'cached')) + self.assertNotHasAttr(s, 'cached') with self.assertRaises(AttributeError) as cm: del s.cached self.assertNotIsInstance(cm.exception, FrozenInstanceError) @@ -3158,12 +3158,12 @@ class S(D): pass s = S() - self.assertFalse(hasattr(s, 'x')) + self.assertNotHasAttr(s, 'x') s.x = 5 self.assertEqual(s.x, 5) del s.x - self.assertFalse(hasattr(s, 'x')) + self.assertNotHasAttr(s, 'x') with self.assertRaises(AttributeError) as cm: del s.x self.assertNotIsInstance(cm.exception, FrozenInstanceError) @@ -3393,8 +3393,8 @@ class A: B = dataclass(A, slots=True) self.assertIsNot(A, B) - self.assertFalse(hasattr(A, "__slots__")) - self.assertTrue(hasattr(B, "__slots__")) + self.assertNotHasAttr(A, "__slots__") + self.assertHasAttr(B, "__slots__") # Can't be local to test_frozen_pickle. @dataclass(frozen=True, slots=True) diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py index 4be7c5649da68a..a10922a403ec38 100644 --- a/Lib/test/test_dbm.py +++ b/Lib/test/test_dbm.py @@ -66,7 +66,7 @@ def keys_helper(self, f): return keys def test_error(self): - self.assertTrue(issubclass(self.module.error, OSError)) + self.assertIsSubclass(self.module.error, OSError) def test_anydbm_not_existing(self): self.assertRaises(dbm.error, dbm.open, _fname) diff --git a/Lib/test/test_dbm_sqlite3.py b/Lib/test/test_dbm_sqlite3.py index 2e1f2d32924bad..9216da8a63f957 100644 --- a/Lib/test/test_dbm_sqlite3.py +++ b/Lib/test/test_dbm_sqlite3.py @@ -36,7 +36,7 @@ def test_uri_substitutions(self): ) for path, normalized in dataset: with self.subTest(path=path, normalized=normalized): - self.assertTrue(_normalize_uri(path).endswith(normalized)) + self.assertEndsWith(_normalize_uri(path), normalized) @unittest.skipUnless(sys.platform == "win32", "requires Windows") def test_uri_windows(self): @@ -55,7 +55,7 @@ def test_uri_windows(self): with self.subTest(path=path, normalized=normalized): if not Path(path).is_absolute(): self.skipTest(f"skipping relative path: {path!r}") - self.assertTrue(_normalize_uri(path).endswith(normalized)) + self.assertEndsWith(_normalize_uri(path), normalized) class ReadOnly(_SQLiteDbmTests): diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 4679f297fd7f4a..4e1a489205a685 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -838,7 +838,7 @@ def test_copy_pickle(self): self.assertEqual(list(d), list(e)) self.assertEqual(e.x, d.x) self.assertEqual(e.z, d.z) - self.assertFalse(hasattr(e, 'y')) + self.assertNotHasAttr(e, 'y') def test_pickle_recursive(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 14026531e22333..d635855f537af0 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -409,7 +409,7 @@ class ClassPropertiesAndMethods(unittest.TestCase): def test_python_dicts(self): # Testing Python subclass of dict... - self.assertTrue(issubclass(dict, dict)) + self.assertIsSubclass(dict, dict) self.assertIsInstance({}, dict) d = dict() self.assertEqual(d, {}) @@ -433,7 +433,7 @@ def setstate(self, state): self.state = state def getstate(self): return self.state - self.assertTrue(issubclass(C, dict)) + self.assertIsSubclass(C, dict) a1 = C(12) self.assertEqual(a1.state, 12) a2 = C(foo=1, bar=2) @@ -1048,15 +1048,15 @@ class SubType(types.ModuleType): m = types.ModuleType("m") self.assertTrue(m.__class__ is types.ModuleType) - self.assertFalse(hasattr(m, "a")) + self.assertNotHasAttr(m, "a") m.__class__ = SubType self.assertTrue(m.__class__ is SubType) - self.assertTrue(hasattr(m, "a")) + self.assertHasAttr(m, "a") m.__class__ = types.ModuleType self.assertTrue(m.__class__ is types.ModuleType) - self.assertFalse(hasattr(m, "a")) + self.assertNotHasAttr(m, "a") # Make sure that builtin immutable objects don't support __class__ # assignment, because the object instances may be interned. @@ -1780,7 +1780,7 @@ class D(C): class E: # *not* subclassing from C foo = C.foo self.assertEqual(E().foo.__func__, C.foo) # i.e., unbound - self.assertTrue(repr(C.foo.__get__(C())).startswith("", report) else: self.assertIn("test message", report) - self.assertTrue(report.endswith("\n")) + self.assertEndsWith(report, "\n") @cpython_only # Python built with Py_TRACE_REFS fail with a fatal error in diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py index b340ef7ed1621c..6524baabe7f96f 100644 --- a/Lib/test/test_fileinput.py +++ b/Lib/test/test_fileinput.py @@ -245,7 +245,7 @@ def test_detached_stdin_binary_mode(self): orig_stdin = sys.stdin try: sys.stdin = BytesIO(b'spam, bacon, sausage, and spam') - self.assertFalse(hasattr(sys.stdin, 'buffer')) + self.assertNotHasAttr(sys.stdin, 'buffer') fi = FileInput(files=['-'], mode='rb') lines = list(fi) self.assertEqual(lines, [b'spam, bacon, sausage, and spam']) diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 95c98c6ac63f71..b4cbfb6d774080 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -914,7 +914,7 @@ def __del__(self): gc.collect() self.assertEqual(len(Lazarus.resurrected_instances), 1) instance = Lazarus.resurrected_instances.pop() - self.assertTrue(hasattr(instance, "cargo")) + self.assertHasAttr(instance, "cargo") self.assertEqual(id(instance.cargo), cargo_id) gc.collect() diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index ea0dc241e39475..7601cb00ff6685 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -236,13 +236,13 @@ class MyGeneric: self.assertEqual(repr(x2), 'tuple[*tuple[int, str]]') x3 = tuple[*tuple[int, ...]] self.assertEqual(repr(x3), 'tuple[*tuple[int, ...]]') - self.assertTrue(repr(MyList[int]).endswith('.BaseTest.test_repr..MyList[int]')) + self.assertEndsWith(repr(MyList[int]), '.BaseTest.test_repr..MyList[int]') self.assertEqual(repr(list[str]()), '[]') # instances should keep their normal repr # gh-105488 - self.assertTrue(repr(MyGeneric[int]).endswith('MyGeneric[int]')) - self.assertTrue(repr(MyGeneric[[]]).endswith('MyGeneric[[]]')) - self.assertTrue(repr(MyGeneric[[int, str]]).endswith('MyGeneric[[int, str]]')) + self.assertEndsWith(repr(MyGeneric[int]), 'MyGeneric[int]') + self.assertEndsWith(repr(MyGeneric[[]]), 'MyGeneric[[]]') + self.assertEndsWith(repr(MyGeneric[[int, str]]), 'MyGeneric[[int, str]]') def test_exposed_type(self): import types @@ -362,7 +362,7 @@ def test_isinstance(self): def test_issubclass(self): class L(list): ... - self.assertTrue(issubclass(L, list)) + self.assertIsSubclass(L, list) with self.assertRaises(TypeError): issubclass(L, list[str]) diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index 6c3abe602f557c..df07af01fc7540 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -92,8 +92,8 @@ def test_commonprefix(self): for s1 in testlist: for s2 in testlist: p = commonprefix([s1, s2]) - self.assertTrue(s1.startswith(p)) - self.assertTrue(s2.startswith(p)) + self.assertStartsWith(s1, p) + self.assertStartsWith(s2, p) if s1 != s2: n = len(p) self.assertNotEqual(s1[n:n+1], s2[n:n+1]) diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index fa5de7c190e6a3..ccbacc7c19b6e6 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -331,13 +331,13 @@ def test_mode(self): def test_1647484(self): for mode in ('wb', 'rb'): with gzip.GzipFile(self.filename, mode) as f: - self.assertTrue(hasattr(f, "name")) + self.assertHasAttr(f, "name") self.assertEqual(f.name, self.filename) def test_paddedfile_getattr(self): self.test_write() with gzip.GzipFile(self.filename, 'rb') as f: - self.assertTrue(hasattr(f.fileobj, "name")) + self.assertHasAttr(f.fileobj, "name") self.assertEqual(f.fileobj.name, self.filename) def test_mtime(self): @@ -345,7 +345,7 @@ def test_mtime(self): with gzip.GzipFile(self.filename, 'w', mtime = mtime) as fWrite: fWrite.write(data1) with gzip.GzipFile(self.filename) as fRead: - self.assertTrue(hasattr(fRead, 'mtime')) + self.assertHasAttr(fRead, 'mtime') self.assertIsNone(fRead.mtime) dataRead = fRead.read() self.assertEqual(dataRead, data1) @@ -460,7 +460,7 @@ def test_zero_padded_file(self): self.assertEqual(d, data1 * 50, "Incorrect data in file") def test_gzip_BadGzipFile_exception(self): - self.assertTrue(issubclass(gzip.BadGzipFile, OSError)) + self.assertIsSubclass(gzip.BadGzipFile, OSError) def test_bad_gzip_file(self): with open(self.filename, 'wb') as file: diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py index 5e3356a02f31b6..de4c8a1670f591 100644 --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -152,8 +152,8 @@ def _test_algorithm_via_hashlib_new(data=None, _alg=algorithm, **kwargs): if _hashlib: # These algorithms should always be present when this module # is compiled. If not, something was compiled wrong. - self.assertTrue(hasattr(_hashlib, 'openssl_md5')) - self.assertTrue(hasattr(_hashlib, 'openssl_sha1')) + self.assertHasAttr(_hashlib, 'openssl_md5') + self.assertHasAttr(_hashlib, 'openssl_sha1') for algorithm, constructors in self.constructors_to_test.items(): constructor = getattr(_hashlib, 'openssl_'+algorithm, None) if constructor: diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index c9b37fcd8f6327..57dc7a24af94b8 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -786,12 +786,12 @@ def test_getfile(self): def test_getfile_builtin_module(self): with self.assertRaises(TypeError) as e: inspect.getfile(sys) - self.assertTrue(str(e.exception).startswith(':5: EncodingWarning: ")) - self.assertTrue( - warnings[1].startswith(b":8: EncodingWarning: ")) + self.assertStartsWith(warnings[0], b":5: EncodingWarning: ") + self.assertStartsWith(warnings[1], b":8: EncodingWarning: ") def test_text_encoding(self): # PEP 597, bpo-47000. io.text_encoding() returns "locale" or "utf-8" @@ -4834,7 +4832,7 @@ def on_alarm(*args): os.read(r, len(data) * 100) exc = cm.exception if isinstance(exc, RuntimeError): - self.assertTrue(str(exc).startswith("reentrant call"), str(exc)) + self.assertStartsWith(str(exc), "reentrant call") finally: signal.alarm(0) wio.close() diff --git a/Lib/test/test_json/test_fail.py b/Lib/test/test_json/test_fail.py index 7c1696cc66d12b..79c44af2fbf0e1 100644 --- a/Lib/test/test_json/test_fail.py +++ b/Lib/test/test_json/test_fail.py @@ -102,7 +102,7 @@ def test_not_serializable(self): with self.assertRaisesRegex(TypeError, 'Object of type module is not JSON serializable') as cm: self.dumps(sys) - self.assertFalse(hasattr(cm.exception, '__notes__')) + self.assertNotHasAttr(cm.exception, '__notes__') with self.assertRaises(TypeError) as cm: self.dumps([1, [2, 3, sys]]) diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 72cde3f0d6c1bd..9ea2679c77ec17 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -160,7 +160,7 @@ def test_help_flag(self): rc, out, err = assert_python_ok('-m', self.module, '-h', PYTHON_COLORS='0') self.assertEqual(rc, 0) - self.assertTrue(out.startswith(b'usage: ')) + self.assertStartsWith(out, b'usage: ') self.assertEqual(err, b'') def test_sort_keys_flag(self): diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 173fc743cf68ae..caa1603c78eb01 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -443,7 +443,7 @@ def test_search_major_3(self): except subprocess.CalledProcessError: raise unittest.SkipTest("requires at least one Python 3.x install") self.assertEqual("PythonCore", data["env.company"]) - self.assertTrue(data["env.tag"].startswith("3."), data["env.tag"]) + self.assertStartsWith(data["env.tag"], "3.") def test_search_major_3_32(self): try: @@ -453,8 +453,8 @@ def test_search_major_3_32(self): raise unittest.SkipTest("requires at least one 32-bit Python 3.x install") raise self.assertEqual("PythonCore", data["env.company"]) - self.assertTrue(data["env.tag"].startswith("3."), data["env.tag"]) - self.assertTrue(data["env.tag"].endswith("-32"), data["env.tag"]) + self.assertStartsWith(data["env.tag"], "3.") + self.assertEndsWith(data["env.tag"], "-32") def test_search_major_2(self): try: @@ -463,7 +463,7 @@ def test_search_major_2(self): if not is_installed("2.7"): raise unittest.SkipTest("requires at least one Python 2.x install") self.assertEqual("PythonCore", data["env.company"]) - self.assertTrue(data["env.tag"].startswith("2."), data["env.tag"]) + self.assertStartsWith(data["env.tag"], "2.") def test_py_default(self): with self.py_ini(TEST_PY_DEFAULTS): diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py index 9ffb93e797dd80..e93c3c37354e27 100644 --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -1025,12 +1025,12 @@ def test_peek(self): with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: result = f.peek() self.assertGreater(len(result), 0) - self.assertTrue(INPUT.startswith(result)) + self.assertStartsWith(INPUT, result) self.assertEqual(f.read(), INPUT) with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: result = f.peek(10) self.assertGreater(len(result), 0) - self.assertTrue(INPUT.startswith(result)) + self.assertStartsWith(INPUT, result) self.assertEqual(f.read(), INPUT) def test_peek_bad_args(self): diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py index 95629ed862d6eb..63998a86c45b53 100644 --- a/Lib/test/test_memoryio.py +++ b/Lib/test/test_memoryio.py @@ -265,8 +265,8 @@ def test_iterator(self): memio = self.ioclass(buf * 10) self.assertEqual(iter(memio), memio) - self.assertTrue(hasattr(memio, '__iter__')) - self.assertTrue(hasattr(memio, '__next__')) + self.assertHasAttr(memio, '__iter__') + self.assertHasAttr(memio, '__next__') i = 0 for line in memio: self.assertEqual(line, buf) diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index 9f131a9110dccb..4204a6a47d2a81 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -147,7 +147,7 @@ def test_fromkeys(self): def test_abc(self): OrderedDict = self.OrderedDict self.assertIsInstance(OrderedDict(), MutableMapping) - self.assertTrue(issubclass(OrderedDict, MutableMapping)) + self.assertIsSubclass(OrderedDict, MutableMapping) def test_clear(self): OrderedDict = self.OrderedDict @@ -314,14 +314,14 @@ def check(dup): check(dup) self.assertIs(dup.x, od.x) self.assertIs(dup.z, od.z) - self.assertFalse(hasattr(dup, 'y')) + self.assertNotHasAttr(dup, 'y') dup = copy.deepcopy(od) check(dup) self.assertEqual(dup.x, od.x) self.assertIsNot(dup.x, od.x) self.assertEqual(dup.z, od.z) self.assertIsNot(dup.z, od.z) - self.assertFalse(hasattr(dup, 'y')) + self.assertNotHasAttr(dup, 'y') # pickle directly pulls the module, so we have to fake it with replaced_module('collections', self.module): for proto in range(pickle.HIGHEST_PROTOCOL + 1): @@ -330,7 +330,7 @@ def check(dup): check(dup) self.assertEqual(dup.x, od.x) self.assertEqual(dup.z, od.z) - self.assertFalse(hasattr(dup, 'y')) + self.assertNotHasAttr(dup, 'y') check(eval(repr(od))) update_test = OrderedDict() update_test.update(od) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 333179a71e3cdc..88b5b0e6e358bb 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -818,7 +818,7 @@ def test_15261(self): self.assertEqual(ctx.exception.errno, errno.EBADF) def check_file_attributes(self, result): - self.assertTrue(hasattr(result, 'st_file_attributes')) + self.assertHasAttr(result, 'st_file_attributes') self.assertTrue(isinstance(result.st_file_attributes, int)) self.assertTrue(0 <= result.st_file_attributes <= 0xFFFFFFFF) @@ -2181,7 +2181,7 @@ def test_getrandom0(self): self.assertEqual(empty, b'') def test_getrandom_random(self): - self.assertTrue(hasattr(os, 'GRND_RANDOM')) + self.assertHasAttr(os, 'GRND_RANDOM') # Don't test os.getrandom(1, os.GRND_RANDOM) to not consume the rare # resource /dev/random @@ -5431,8 +5431,8 @@ def test_fsencode_fsdecode(self): def test_pathlike(self): self.assertEqual('#feelthegil', self.fspath(FakePath('#feelthegil'))) - self.assertTrue(issubclass(FakePath, os.PathLike)) - self.assertTrue(isinstance(FakePath('x'), os.PathLike)) + self.assertIsSubclass(FakePath, os.PathLike) + self.assertIsInstance(FakePath('x'), os.PathLike) def test_garbage_in_exception_out(self): vapor = type('blah', (), {}) @@ -5458,8 +5458,8 @@ def test_pathlike_subclasshook(self): # true on abstract implementation. class A(os.PathLike): pass - self.assertFalse(issubclass(FakePath, A)) - self.assertTrue(issubclass(FakePath, os.PathLike)) + self.assertNotIsSubclass(FakePath, A) + self.assertIsSubclass(FakePath, os.PathLike) def test_pathlike_class_getitem(self): self.assertIsInstance(os.PathLike[bytes], types.GenericAlias) @@ -5469,7 +5469,7 @@ class A(os.PathLike): __slots__ = () def __fspath__(self): return '' - self.assertFalse(hasattr(A(), '__dict__')) + self.assertNotHasAttr(A(), '__dict__') def test_fspath_set_to_None(self): class Foo: diff --git a/Lib/test/test_pathlib/test_pathlib.py b/Lib/test/test_pathlib/test_pathlib.py index 37ef9fa1946376..13356b4cfe082b 100644 --- a/Lib/test/test_pathlib/test_pathlib.py +++ b/Lib/test/test_pathlib/test_pathlib.py @@ -77,8 +77,8 @@ def needs_symlinks(fn): class UnsupportedOperationTest(unittest.TestCase): def test_is_notimplemented(self): - self.assertTrue(issubclass(pathlib.UnsupportedOperation, NotImplementedError)) - self.assertTrue(isinstance(pathlib.UnsupportedOperation(), NotImplementedError)) + self.assertIsSubclass(pathlib.UnsupportedOperation, NotImplementedError) + self.assertIsInstance(pathlib.UnsupportedOperation(), NotImplementedError) class LazyImportTest(unittest.TestCase): @@ -300,8 +300,8 @@ def test_repr_common(self): clsname = p.__class__.__name__ r = repr(p) # The repr() is in the form ClassName("forward-slashes path"). - self.assertTrue(r.startswith(clsname + '('), r) - self.assertTrue(r.endswith(')'), r) + self.assertStartsWith(r, clsname + '(') + self.assertEndsWith(r, ')') inner = r[len(clsname) + 1 : -1] self.assertEqual(eval(inner), p.as_posix()) diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 47f51f1979faab..0a9ba578673b39 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -316,7 +316,7 @@ def negzero(): return -(1.0-1.0) for instr in dis.get_instructions(negzero): - self.assertFalse(instr.opname.startswith('UNARY_')) + self.assertNotStartsWith(instr.opname, 'UNARY_') self.check_lnotab(negzero) def test_constant_folding_binop(self): diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index 1095e7303c188f..aa01a9b8f7ed87 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -387,10 +387,10 @@ def test_with_stmt_with_paren(self) -> None: test_source = """ stmt = "with (\\n a as b,\\n c as d\\n): pass" the_ast = parse.parse_string(stmt, mode=1) - self.assertTrue(ast_dump(the_ast).startswith( + self.assertStartsWith(ast_dump(the_ast), "Module(body=[With(items=[withitem(context_expr=Name(id='a', ctx=Load()), optional_vars=Name(id='b', ctx=Store())), " "withitem(context_expr=Name(id='c', ctx=Load()), optional_vars=Name(id='d', ctx=Store()))]" - )) + ) """ self.run_test(grammar_source, test_source) diff --git a/Lib/test/test_peg_generator/test_pegen.py b/Lib/test/test_peg_generator/test_pegen.py index d8606521345390..d912c55812397d 100644 --- a/Lib/test/test_peg_generator/test_pegen.py +++ b/Lib/test/test_peg_generator/test_pegen.py @@ -91,10 +91,8 @@ def test_gather(self) -> None: """ rules = parse_string(grammar, GrammarParser).rules self.assertEqual(str(rules["start"]), "start: ','.thing+ NEWLINE") - self.assertTrue( - repr(rules["start"]).startswith( - "Rule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf(\"','\"), NameLeaf('thing'" - ) + self.assertStartsWith(repr(rules["start"]), + "Rule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf(\"','\"), NameLeaf('thing'" ) self.assertEqual(str(rules["thing"]), "thing: NUMBER") parser_class = make_parser(grammar) diff --git a/Lib/test/test_perf_profiler.py b/Lib/test/test_perf_profiler.py index c176e505155b90..21d097dbb559ec 100644 --- a/Lib/test/test_perf_profiler.py +++ b/Lib/test/test_perf_profiler.py @@ -93,9 +93,7 @@ def baz(): perf_line, f"Could not find {expected_symbol} in perf file" ) perf_addr = perf_line.split(" ")[0] - self.assertFalse( - perf_addr.startswith("0x"), "Address should not be prefixed with 0x" - ) + self.assertNotStartsWith(perf_addr, "0x") self.assertTrue( set(perf_addr).issubset(string.hexdigits), "Address should contain only hex characters", diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index 742ca8de1bea8c..e2384b33345a45 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -611,10 +611,10 @@ def test_name_mapping(self): with self.subTest(((module3, name3), (module2, name2))): if (module2, name2) == ('exceptions', 'OSError'): attr = getattribute(module3, name3) - self.assertTrue(issubclass(attr, OSError)) + self.assertIsSubclass(attr, OSError) elif (module2, name2) == ('exceptions', 'ImportError'): attr = getattribute(module3, name3) - self.assertTrue(issubclass(attr, ImportError)) + self.assertIsSubclass(attr, ImportError) else: module, name = mapping(module2, name2) if module3[:1] != '_': diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 818e807dd3a6fb..719c4feace6544 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -410,7 +410,7 @@ def test_win32_ver(self): for v in version.split('.'): int(v) # should not fail if csd: - self.assertTrue(csd.startswith('SP'), msg=csd) + self.assertStartsWith(csd, 'SP') if ptype: if os.cpu_count() > 1: self.assertIn('Multiprocessor', ptype) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 0817d0a87a38b1..628920e34b586f 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1107,7 +1107,7 @@ def test_lchmod_dir_symlink(self): def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs): st = os.stat(target_file) - self.assertTrue(hasattr(st, 'st_flags')) + self.assertHasAttr(st, 'st_flags') # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE. flags = st.st_flags | stat.UF_IMMUTABLE @@ -1143,7 +1143,7 @@ def test_lchflags_regular_file(self): def test_lchflags_symlink(self): testfn_st = os.stat(os_helper.TESTFN) - self.assertTrue(hasattr(testfn_st, 'st_flags')) + self.assertHasAttr(testfn_st, 'st_flags') self.addCleanup(os_helper.unlink, _DUMMY_SYMLINK) os.symlink(os_helper.TESTFN, _DUMMY_SYMLINK) @@ -2218,12 +2218,12 @@ def _verify_available(self, name): def test_pwritev(self): self._verify_available("HAVE_PWRITEV") if self.mac_ver >= (10, 16): - self.assertTrue(hasattr(os, "pwritev"), "os.pwritev is not available") - self.assertTrue(hasattr(os, "preadv"), "os.readv is not available") + self.assertHasAttr(os, "pwritev") + self.assertHasAttr(os, "preadv") else: - self.assertFalse(hasattr(os, "pwritev"), "os.pwritev is available") - self.assertFalse(hasattr(os, "preadv"), "os.readv is available") + self.assertNotHasAttr(os, "pwritev") + self.assertNotHasAttr(os, "preadv") def test_stat(self): self._verify_available("HAVE_FSTATAT") diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py index cea241b0f200d0..26aefdbf0421dd 100644 --- a/Lib/test/test_property.py +++ b/Lib/test/test_property.py @@ -87,8 +87,8 @@ def test_property_decorator_baseclass(self): self.assertEqual(base.spam, 10) self.assertEqual(base._spam, 10) delattr(base, "spam") - self.assertTrue(not hasattr(base, "spam")) - self.assertTrue(not hasattr(base, "_spam")) + self.assertNotHasAttr(base, "spam") + self.assertNotHasAttr(base, "_spam") base.spam = 20 self.assertEqual(base.spam, 20) self.assertEqual(base._spam, 20) diff --git a/Lib/test/test_pulldom.py b/Lib/test/test_pulldom.py index 6dc51e4371d0f6..3c8ed251acaa4d 100644 --- a/Lib/test/test_pulldom.py +++ b/Lib/test/test_pulldom.py @@ -46,7 +46,7 @@ def test_parse_semantics(self): items = pulldom.parseString(SMALL_SAMPLE) evt, node = next(items) # Just check the node is a Document: - self.assertTrue(hasattr(node, "createElement")) + self.assertHasAttr(node, "createElement") self.assertEqual(pulldom.START_DOCUMENT, evt) evt, node = next(items) self.assertEqual(pulldom.START_ELEMENT, evt) @@ -192,7 +192,7 @@ def _test_thorough(self, pd, before_root=True): evt, node = next(pd) self.assertEqual(pulldom.START_DOCUMENT, evt) # Just check the node is a Document: - self.assertTrue(hasattr(node, "createElement")) + self.assertHasAttr(node, "createElement") if before_root: evt, node = next(pd) diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index df05cd07d7e249..3e7b2cd0dc9912 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -103,7 +103,7 @@ def ismethod(oclass, obj, name): for name, value in dict.items(): if name in ignore: continue - self.assertHasAttr(module, name, ignore) + self.assertHasAttr(module, name) py_item = getattr(module, name) if isinstance(value, pyclbr.Function): self.assertIsInstance(py_item, (FunctionType, BuiltinFunctionType)) diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index ac88b3c6f13d5e..281b24eaa36b80 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -1380,7 +1380,7 @@ def test_modules_search_builtin(self): helper('modules garbage') result = help_io.getvalue() - self.assertTrue(result.startswith(expected)) + self.assertStartsWith(result, expected) def test_importfile(self): try: diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 43957f525f10c0..bd76d636e4f0fc 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -1415,27 +1415,27 @@ class CommandLineTest(unittest.TestCase): def test_parse_args(self): args, help_text = random._parse_args(shlex.split("--choice a b c")) self.assertEqual(args.choice, ["a", "b", "c"]) - self.assertTrue(help_text.startswith("usage: ")) + self.assertStartsWith(help_text, "usage: ") args, help_text = random._parse_args(shlex.split("--integer 5")) self.assertEqual(args.integer, 5) - self.assertTrue(help_text.startswith("usage: ")) + self.assertStartsWith(help_text, "usage: ") args, help_text = random._parse_args(shlex.split("--float 2.5")) self.assertEqual(args.float, 2.5) - self.assertTrue(help_text.startswith("usage: ")) + self.assertStartsWith(help_text, "usage: ") args, help_text = random._parse_args(shlex.split("a b c")) self.assertEqual(args.input, ["a", "b", "c"]) - self.assertTrue(help_text.startswith("usage: ")) + self.assertStartsWith(help_text, "usage: ") args, help_text = random._parse_args(shlex.split("5")) self.assertEqual(args.input, ["5"]) - self.assertTrue(help_text.startswith("usage: ")) + self.assertStartsWith(help_text, "usage: ") args, help_text = random._parse_args(shlex.split("2.5")) self.assertEqual(args.input, ["2.5"]) - self.assertTrue(help_text.startswith("usage: ")) + self.assertStartsWith(help_text, "usage: ") def test_main(self): for command, expected in [ diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index f79a6149078996..e9128ac1d9762d 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2868,11 +2868,11 @@ def test_long_pattern(self): pattern = 'Very %spattern' % ('long ' * 1000) r = repr(re.compile(pattern)) self.assertLess(len(r), 300) - self.assertEqual(r[:30], "re.compile('Very long long lon") + self.assertStartsWith(r, "re.compile('Very long long lon") r = repr(re.compile(pattern, re.I)) self.assertLess(len(r), 300) - self.assertEqual(r[:30], "re.compile('Very long long lon") - self.assertEqual(r[-16:], ", re.IGNORECASE)") + self.assertStartsWith(r, "re.compile('Very long long lon") + self.assertEndsWith(r, ", re.IGNORECASE)") def test_flags_repr(self): self.assertEqual(repr(re.I), "re.IGNORECASE") @@ -2951,7 +2951,7 @@ def test_deprecated_modules(self): self.assertEqual(mod.__name__, name) self.assertEqual(mod.__package__, '') for attr in deprecated[name]: - self.assertTrue(hasattr(mod, attr)) + self.assertHasAttr(mod, attr) del sys.modules[name] @cpython_only diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py index ffad35092f9916..16623654c29b28 100644 --- a/Lib/test/test_reprlib.py +++ b/Lib/test/test_reprlib.py @@ -173,13 +173,13 @@ def test_instance(self): eq(r(i3), (""%id(i3))) s = r(ClassWithFailingRepr) - self.assertTrue(s.startswith("")) + self.assertStartsWith(s, "") self.assertIn(s.find("..."), [12, 13]) def test_lambda(self): r = repr(lambda x: x) - self.assertTrue(r.startswith("..') # Methods - self.assertTrue(repr(''.split).startswith( - '", "exec") expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \ "ordinal not in range(128)" - self.assertTrue(c.exception.args[0].startswith(expected), - msg=c.exception.args[0]) + self.assertStartsWith(c.exception.args[0], expected) def test_file_parse_error_multiline(self): # gh96611: diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 395b2ef88ab622..6a2e1c61f55240 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -539,9 +539,9 @@ def test_openssl_version(self): openssl_ver = f"OpenSSL {major:d}.{minor:d}.{patch:d}" else: openssl_ver = f"OpenSSL {major:d}.{minor:d}.{fix:d}" - self.assertTrue( - s.startswith((openssl_ver, libressl_ver, "AWS-LC")), - (s, t, hex(n)) + self.assertStartsWith( + s, (openssl_ver, libressl_ver, "AWS-LC"), + (t, hex(n)) ) @support.cpython_only @@ -1668,7 +1668,7 @@ def test_lib_reason(self): regex = "(NO_START_LINE|UNSUPPORTED_PUBLIC_KEY_TYPE)" self.assertRegex(cm.exception.reason, regex) s = str(cm.exception) - self.assertTrue("NO_START_LINE" in s, s) + self.assertIn("NO_START_LINE", s) def test_subclass(self): # Check that the appropriate SSLError subclass is raised @@ -1683,7 +1683,7 @@ def test_subclass(self): with self.assertRaises(ssl.SSLWantReadError) as cm: c.do_handshake() s = str(cm.exception) - self.assertTrue(s.startswith("The operation did not complete (read)"), s) + self.assertStartsWith(s, "The operation did not complete (read)") # For compatibility self.assertEqual(cm.exception.errno, ssl.SSL_ERROR_WANT_READ) diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py index 49013a4bcd8af6..5fd25d5012c425 100644 --- a/Lib/test/test_stat.py +++ b/Lib/test/test_stat.py @@ -157,7 +157,7 @@ def test_mode(self): os.chmod(TESTFN, 0o700) st_mode, modestr = self.get_mode() - self.assertEqual(modestr[:3], '-rw') + self.assertStartsWith(modestr, '-rw') self.assertS_IS("REG", st_mode) self.assertEqual(self.statmod.S_IFMT(st_mode), self.statmod.S_IFREG) @@ -256,7 +256,7 @@ def test_flags_consistent(self): "FILE_ATTRIBUTE_* constants are Win32 specific") def test_file_attribute_constants(self): for key, value in sorted(self.file_attributes.items()): - self.assertTrue(hasattr(self.statmod, key), key) + self.assertHasAttr(self.statmod, key) modvalue = getattr(self.statmod, key) self.assertEqual(value, modvalue, key) @@ -314,7 +314,7 @@ def test_macosx_attribute_values(self): self.assertEqual(self.statmod.S_ISGID, 0o002000) self.assertEqual(self.statmod.S_ISVTX, 0o001000) - self.assertFalse(hasattr(self.statmod, "S_ISTXT")) + self.assertNotHasAttr(self.statmod, "S_ISTXT") self.assertEqual(self.statmod.S_IREAD, self.statmod.S_IRUSR) self.assertEqual(self.statmod.S_IWRITE, self.statmod.S_IWUSR) self.assertEqual(self.statmod.S_IEXEC, self.statmod.S_IXUSR) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index c69baa4bf4d1b1..5980f939185965 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -645,7 +645,7 @@ def do_test(self, args): def test_numerictestcase_is_testcase(self): # Ensure that NumericTestCase actually is a TestCase. - self.assertTrue(issubclass(NumericTestCase, unittest.TestCase)) + self.assertIsSubclass(NumericTestCase, unittest.TestCase) def test_error_msg_numeric(self): # Test the error message generated for numeric comparisons. @@ -683,32 +683,23 @@ class GlobalsTest(unittest.TestCase): def test_meta(self): # Test for the existence of metadata. for meta in self.expected_metadata: - self.assertTrue(hasattr(self.module, meta), - "%s not present" % meta) + self.assertHasAttr(self.module, meta) def test_check_all(self): # Check everything in __all__ exists and is public. module = self.module for name in module.__all__: # No private names in __all__: - self.assertFalse(name.startswith("_"), + self.assertNotStartsWith(name, "_", 'private name "%s" in __all__' % name) # And anything in __all__ must exist: - self.assertTrue(hasattr(module, name), - 'missing name "%s" in __all__' % name) + self.assertHasAttr(module, name) class StatisticsErrorTest(unittest.TestCase): def test_has_exception(self): - errmsg = ( - "Expected StatisticsError to be a ValueError, but got a" - " subclass of %r instead." - ) - self.assertTrue(hasattr(statistics, 'StatisticsError')) - self.assertTrue( - issubclass(statistics.StatisticsError, ValueError), - errmsg % statistics.StatisticsError.__base__ - ) + self.assertHasAttr(statistics, 'StatisticsError') + self.assertIsSubclass(statistics.StatisticsError, ValueError) # === Tests for private utility functions === diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py index d0bc0bd7b61520..9622151143cd78 100644 --- a/Lib/test/test_structseq.py +++ b/Lib/test/test_structseq.py @@ -42,7 +42,7 @@ def test_repr(self): # os.stat() gives a complicated struct sequence. st = os.stat(__file__) rep = repr(st) - self.assertTrue(rep.startswith("os.stat_result")) + self.assertStartsWith(rep, "os.stat_result") self.assertIn("st_mode=", rep) self.assertIn("st_ino=", rep) self.assertIn("st_dev=", rep) @@ -307,7 +307,7 @@ def test_copy_replace_with_invisible_fields(self): self.assertEqual(t5.tm_mon, 2) # named invisible fields - self.assertTrue(hasattr(t, 'tm_zone'), f"{t} has no attribute 'tm_zone'") + self.assertHasAttr(t, 'tm_zone') with self.assertRaisesRegex(AttributeError, 'readonly attribute'): t.tm_zone = 'some other zone' self.assertEqual(t2.tm_zone, t.tm_zone) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index ca35804fb36076..f0e350c71f60ea 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1178,7 +1178,7 @@ def test_universal_newlines_communicate_stdin_stdout_stderr(self): self.assertEqual("line1\nline2\nline3\nline4\nline5\n", stdout) # Python debug build push something like "[42442 refs]\n" # to stderr at exit of subprocess. - self.assertTrue(stderr.startswith("eline2\neline6\neline7\n")) + self.assertStartsWith(stderr, "eline2\neline6\neline7\n") def test_universal_newlines_communicate_encodings(self): # Check that universal newlines mode works for various encodings, @@ -1510,7 +1510,7 @@ def test_issue8780(self): "[sys.executable, '-c', 'print(\"Hello World!\")'])", 'assert retcode == 0')) output = subprocess.check_output([sys.executable, '-c', code]) - self.assertTrue(output.startswith(b'Hello World!'), ascii(output)) + self.assertStartsWith(output, b'Hello World!') def test_handles_closed_on_exception(self): # If CreateProcess exits with an error, ensure the @@ -1835,8 +1835,8 @@ def test_encoding_warning(self): capture_output=True) lines = cp.stderr.splitlines() self.assertEqual(len(lines), 2, lines) - self.assertTrue(lines[0].startswith(b":2: EncodingWarning: ")) - self.assertTrue(lines[1].startswith(b":3: EncodingWarning: ")) + self.assertStartsWith(lines[0], b":2: EncodingWarning: ") + self.assertStartsWith(lines[1], b":3: EncodingWarning: ") def _get_test_grp_name(): diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py index 5cef612a340be9..193c8b7d7f3e13 100644 --- a/Lib/test/test_super.py +++ b/Lib/test/test_super.py @@ -547,11 +547,11 @@ def test_special_methods(self): self.assertEqual(s.__reduce__, e.__reduce__) self.assertEqual(s.__reduce_ex__, e.__reduce_ex__) self.assertEqual(s.__getstate__, e.__getstate__) - self.assertFalse(hasattr(s, '__getnewargs__')) - self.assertFalse(hasattr(s, '__getnewargs_ex__')) - self.assertFalse(hasattr(s, '__setstate__')) - self.assertFalse(hasattr(s, '__copy__')) - self.assertFalse(hasattr(s, '__deepcopy__')) + self.assertNotHasAttr(s, '__getnewargs__') + self.assertNotHasAttr(s, '__getnewargs_ex__') + self.assertNotHasAttr(s, '__setstate__') + self.assertNotHasAttr(s, '__copy__') + self.assertNotHasAttr(s, '__deepcopy__') def test_pickling(self): e = E() diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 8446da03e3645b..e48a2464ee5977 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -407,10 +407,10 @@ class Obj: with support.swap_attr(obj, "y", 5) as y: self.assertEqual(obj.y, 5) self.assertIsNone(y) - self.assertFalse(hasattr(obj, 'y')) + self.assertNotHasAttr(obj, 'y') with support.swap_attr(obj, "y", 5): del obj.y - self.assertFalse(hasattr(obj, 'y')) + self.assertNotHasAttr(obj, 'y') def test_swap_item(self): D = {"x":1} diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index fb1c8492a64d38..795d1ecbb59f8f 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -57,7 +57,7 @@ def test_original_displayhook(self): dh(None) self.assertEqual(out.getvalue(), "") - self.assertTrue(not hasattr(builtins, "_")) + self.assertNotHasAttr(builtins, "_") # sys.displayhook() requires arguments self.assertRaises(TypeError, dh) @@ -172,7 +172,7 @@ def test_original_excepthook(self): with support.captured_stderr() as err: sys.__excepthook__(*sys.exc_info()) - self.assertTrue(err.getvalue().endswith("ValueError: 42\n")) + self.assertEndsWith(err.getvalue(), "ValueError: 42\n") self.assertRaises(TypeError, sys.__excepthook__) @@ -192,7 +192,7 @@ def test_excepthook_bytes_filename(self): err = err.getvalue() self.assertIn(""" File "b'bytes_filename'", line 123\n""", err) self.assertIn(""" text\n""", err) - self.assertTrue(err.endswith("SyntaxError: msg\n")) + self.assertEndsWith(err, "SyntaxError: msg\n") def test_excepthook(self): with test.support.captured_output("stderr") as stderr: @@ -269,8 +269,7 @@ def check_exit_message(code, expected, **env_vars): rc, out, err = assert_python_failure('-c', code, **env_vars) self.assertEqual(rc, 1) self.assertEqual(out, b'') - self.assertTrue(err.startswith(expected), - "%s doesn't start with %s" % (ascii(err), ascii(expected))) + self.assertStartsWith(err, expected) # test that stderr buffer is flushed before the exit message is written # into stderr @@ -437,7 +436,7 @@ def test_call_tracing(self): @unittest.skipUnless(hasattr(sys, "setdlopenflags"), 'test needs sys.setdlopenflags()') def test_dlopenflags(self): - self.assertTrue(hasattr(sys, "getdlopenflags")) + self.assertHasAttr(sys, "getdlopenflags") self.assertRaises(TypeError, sys.getdlopenflags, 42) oldflags = sys.getdlopenflags() self.assertRaises(TypeError, sys.setdlopenflags) @@ -623,8 +622,7 @@ def g456(): # And the next record must be for g456(). filename, lineno, funcname, sourceline = stack[i+1] self.assertEqual(funcname, "g456") - self.assertTrue((sourceline.startswith("if leave_g.wait(") or - sourceline.startswith("g_raised.set()"))) + self.assertStartsWith(sourceline, ("if leave_g.wait(", "g_raised.set()")) finally: # Reap the spawned thread. leave_g.set() @@ -860,7 +858,7 @@ def test_sys_flags(self): "hash_randomization", "isolated", "dev_mode", "utf8_mode", "warn_default_encoding", "safe_path", "int_max_str_digits") for attr in attrs: - self.assertTrue(hasattr(sys.flags, attr), attr) + self.assertHasAttr(sys.flags, attr) attr_type = bool if attr in ("dev_mode", "safe_path") else int self.assertEqual(type(getattr(sys.flags, attr)), attr_type, attr) self.assertTrue(repr(sys.flags)) @@ -1072,10 +1070,10 @@ def test_implementation(self): levels = {'alpha': 0xA, 'beta': 0xB, 'candidate': 0xC, 'final': 0xF} - self.assertTrue(hasattr(sys.implementation, 'name')) - self.assertTrue(hasattr(sys.implementation, 'version')) - self.assertTrue(hasattr(sys.implementation, 'hexversion')) - self.assertTrue(hasattr(sys.implementation, 'cache_tag')) + self.assertHasAttr(sys.implementation, 'name') + self.assertHasAttr(sys.implementation, 'version') + self.assertHasAttr(sys.implementation, 'hexversion') + self.assertHasAttr(sys.implementation, 'cache_tag') version = sys.implementation.version self.assertEqual(version[:2], (version.major, version.minor)) @@ -1419,7 +1417,7 @@ def __del__(self): else: self.assertIn("ValueError", report) self.assertIn("del is broken", report) - self.assertTrue(report.endswith("\n")) + self.assertEndsWith(report, "\n") def test_original_unraisablehook_exception_qualname(self): # See bpo-41031, bpo-45083. diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index 963cf753ce6178..d30f69ded6643a 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -186,7 +186,7 @@ def test_posix_venv_scheme(self): # The include directory on POSIX isn't exactly the same as before, # but it is "within" sysconfig_includedir = sysconfig.get_path('include', scheme='posix_venv', vars=vars) - self.assertTrue(sysconfig_includedir.startswith(incpath + os.sep)) + self.assertStartsWith(sysconfig_includedir, incpath + os.sep) def test_nt_venv_scheme(self): # The following directories were hardcoded in the venv module @@ -569,8 +569,7 @@ def test_linux_ext_suffix(self): expected_suffixes = 'i386-linux-gnu.so', 'x86_64-linux-gnux32.so', 'i386-linux-musl.so' else: # 8 byte pointer size expected_suffixes = 'x86_64-linux-gnu.so', 'x86_64-linux-musl.so' - self.assertTrue(suffix.endswith(expected_suffixes), - f'unexpected suffix {suffix!r}') + self.assertEndsWith(suffix, expected_suffixes) @unittest.skipUnless(sys.platform == 'android', 'Android-specific test') def test_android_ext_suffix(self): @@ -582,13 +581,12 @@ def test_android_ext_suffix(self): "aarch64": "aarch64-linux-android", "armv7l": "arm-linux-androideabi", }[machine] - self.assertTrue(suffix.endswith(f"-{expected_triplet}.so"), - f"{machine=}, {suffix=}") + self.assertEndsWith(suffix, f"-{expected_triplet}.so") @unittest.skipUnless(sys.platform == 'darwin', 'OS X-specific test') def test_osx_ext_suffix(self): suffix = sysconfig.get_config_var('EXT_SUFFIX') - self.assertTrue(suffix.endswith('-darwin.so'), suffix) + self.assertEndsWith(suffix, '-darwin.so') def test_always_set_py_debug(self): self.assertIn('Py_DEBUG', sysconfig.get_config_vars()) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 2018a20afd1b18..cf218a2bf14369 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1650,7 +1650,7 @@ def test_cwd(self): try: for t in tar: if t.name != ".": - self.assertTrue(t.name.startswith("./"), t.name) + self.assertStartsWith(t.name, "./") finally: tar.close() diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index d46d3c0f040601..52b13b98cbcce5 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -516,11 +516,11 @@ def test_collision_with_existing_file(self): _mock_candidate_names('aaa', 'aaa', 'bbb'): (fd1, name1) = self.make_temp() os.close(fd1) - self.assertTrue(name1.endswith('aaa')) + self.assertEndsWith(name1, 'aaa') (fd2, name2) = self.make_temp() os.close(fd2) - self.assertTrue(name2.endswith('bbb')) + self.assertEndsWith(name2, 'bbb') def test_collision_with_existing_directory(self): # _mkstemp_inner tries another name when a directory with @@ -528,11 +528,11 @@ def test_collision_with_existing_directory(self): with _inside_empty_temp_dir(), \ _mock_candidate_names('aaa', 'aaa', 'bbb'): dir = tempfile.mkdtemp() - self.assertTrue(dir.endswith('aaa')) + self.assertEndsWith(dir, 'aaa') (fd, name) = self.make_temp() os.close(fd) - self.assertTrue(name.endswith('bbb')) + self.assertEndsWith(name, 'bbb') class TestGetTempPrefix(BaseTestCase): @@ -828,9 +828,9 @@ def test_collision_with_existing_file(self): _mock_candidate_names('aaa', 'aaa', 'bbb'): file = tempfile.NamedTemporaryFile(delete=False) file.close() - self.assertTrue(file.name.endswith('aaa')) + self.assertEndsWith(file.name, 'aaa') dir = tempfile.mkdtemp() - self.assertTrue(dir.endswith('bbb')) + self.assertEndsWith(dir, 'bbb') def test_collision_with_existing_directory(self): # mkdtemp tries another name when a directory with @@ -838,9 +838,9 @@ def test_collision_with_existing_directory(self): with _inside_empty_temp_dir(), \ _mock_candidate_names('aaa', 'aaa', 'bbb'): dir1 = tempfile.mkdtemp() - self.assertTrue(dir1.endswith('aaa')) + self.assertEndsWith(dir1, 'aaa') dir2 = tempfile.mkdtemp() - self.assertTrue(dir2.endswith('bbb')) + self.assertEndsWith(dir2, 'bbb') def test_for_tempdir_is_bytes_issue40701_api_warts(self): orig_tempdir = tempfile.tempdir diff --git a/Lib/test/test_termios.py b/Lib/test/test_termios.py index e5d11cf84d2a66..ce8392a6ccdbd6 100644 --- a/Lib/test/test_termios.py +++ b/Lib/test/test_termios.py @@ -290,8 +290,8 @@ def test_ioctl_constants(self): self.assertGreaterEqual(value, 0) def test_exception(self): - self.assertTrue(issubclass(termios.error, Exception)) - self.assertFalse(issubclass(termios.error, OSError)) + self.assertIsSubclass(termios.error, Exception) + self.assertNotIsSubclass(termios.error, OSError) if __name__ == '__main__': diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index d06f65270efe79..5312faa50774ec 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -761,17 +761,17 @@ def test_localtime_timezone(self): # Get the localtime and examine it for the offset and zone. lt = time.localtime() - self.assertTrue(hasattr(lt, "tm_gmtoff")) - self.assertTrue(hasattr(lt, "tm_zone")) + self.assertHasAttr(lt, "tm_gmtoff") + self.assertHasAttr(lt, "tm_zone") # See if the offset and zone are similar to the module # attributes. if lt.tm_gmtoff is None: - self.assertTrue(not hasattr(time, "timezone")) + self.assertNotHasAttr(time, "timezone") else: self.assertEqual(lt.tm_gmtoff, -[time.timezone, time.altzone][lt.tm_isdst]) if lt.tm_zone is None: - self.assertTrue(not hasattr(time, "tzname")) + self.assertNotHasAttr(time, "tzname") else: self.assertEqual(lt.tm_zone, time.tzname[lt.tm_isdst]) @@ -1184,11 +1184,11 @@ def test_clock_functions(self): if mac_ver >= (10, 12): for name in clock_names: - self.assertTrue(hasattr(time, name), f"time.{name} is not available") + self.assertHasAttr(time, name) else: for name in clock_names: - self.assertFalse(hasattr(time, name), f"time.{name} is available") + self.assertNotHasAttr(time, name) if __name__ == "__main__": diff --git a/Lib/test/test_timeit.py b/Lib/test/test_timeit.py index f5ae0a84eb3506..2aeebea9f93d43 100644 --- a/Lib/test/test_timeit.py +++ b/Lib/test/test_timeit.py @@ -222,8 +222,8 @@ def test_repeat_function_zero_iters(self): def assert_exc_string(self, exc_string, expected_exc_name): exc_lines = exc_string.splitlines() self.assertGreater(len(exc_lines), 2) - self.assertTrue(exc_lines[0].startswith('Traceback')) - self.assertTrue(exc_lines[-1].startswith(expected_exc_name)) + self.assertStartsWith(exc_lines[0], 'Traceback') + self.assertStartsWith(exc_lines[-1], expected_exc_name) def test_print_exc(self): s = io.StringIO() diff --git a/Lib/test/test_tkinter/support.py b/Lib/test/test_tkinter/support.py index ebb9e00ff91bf0..46b01e6f131290 100644 --- a/Lib/test/test_tkinter/support.py +++ b/Lib/test/test_tkinter/support.py @@ -58,7 +58,7 @@ def _test_widget(self, constructor): destroy_default_root() tkinter.NoDefaultRoot() self.assertRaises(RuntimeError, constructor) - self.assertFalse(hasattr(tkinter, '_default_root')) + self.assertNotHasAttr(tkinter, '_default_root') def destroy_default_root(): diff --git a/Lib/test/test_tkinter/test_misc.py b/Lib/test/test_tkinter/test_misc.py index 96ea3f0117ca03..0c76e07066f8a8 100644 --- a/Lib/test/test_tkinter/test_misc.py +++ b/Lib/test/test_tkinter/test_misc.py @@ -497,7 +497,7 @@ def test_info_patchlevel(self): self.assertEqual(vi.serial, 0) else: self.assertEqual(vi.micro, 0) - self.assertTrue(str(vi).startswith(f'{vi.major}.{vi.minor}')) + self.assertStartsWith(str(vi), f'{vi.major}.{vi.minor}') def test_embedded_null(self): widget = tkinter.Entry(self.root) @@ -609,7 +609,7 @@ def test_focus(self): self.assertIsInstance(e.serial, int) self.assertEqual(e.time, '??') self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.num, '??') self.assertEqual(e.state, '??') self.assertEqual(e.char, '??') @@ -642,7 +642,7 @@ def test_configure(self): self.assertIsInstance(e.serial, int) self.assertEqual(e.time, '??') self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.num, '??') self.assertEqual(e.state, '??') self.assertEqual(e.char, '??') @@ -676,7 +676,7 @@ def test_event_generate_key_press(self): self.assertIsInstance(e.serial, int) self.assertEqual(e.time, 0) self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.num, '??') self.assertIsInstance(e.state, int) self.assertNotEqual(e.state, 0) @@ -747,7 +747,7 @@ def test_event_generate_button_press(self): self.assertIsInstance(e.serial, int) self.assertEqual(e.time, 0) self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.num, 1) self.assertEqual(e.state, 0) self.assertEqual(e.char, '??') @@ -781,7 +781,7 @@ def test_event_generate_motion(self): self.assertIsInstance(e.serial, int) self.assertEqual(e.time, 0) self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.num, '??') self.assertEqual(e.state, 0x100) self.assertEqual(e.char, '??') @@ -814,7 +814,7 @@ def test_event_generate_mouse_wheel(self): self.assertIs(e.widget, f) self.assertIsInstance(e.serial, int) self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.time, 0) self.assertEqual(e.num, '??') self.assertEqual(e.state, 0) @@ -849,7 +849,7 @@ def test_generate_event_virtual_event(self): self.assertIsInstance(e.serial, int) self.assertEqual(e.time, 0) self.assertIs(e.send_event, False) - self.assertFalse(hasattr(e, 'focus')) + self.assertNotHasAttr(e, 'focus') self.assertEqual(e.num, '??') self.assertEqual(e.state, 0) self.assertEqual(e.char, '??') @@ -1308,17 +1308,17 @@ def test_no_default_root(self): self.assertIs(tkinter._default_root, root) tkinter.NoDefaultRoot() self.assertIs(tkinter._support_default_root, False) - self.assertFalse(hasattr(tkinter, '_default_root')) + self.assertNotHasAttr(tkinter, '_default_root') # repeated call is no-op tkinter.NoDefaultRoot() self.assertIs(tkinter._support_default_root, False) - self.assertFalse(hasattr(tkinter, '_default_root')) + self.assertNotHasAttr(tkinter, '_default_root') root.destroy() self.assertIs(tkinter._support_default_root, False) - self.assertFalse(hasattr(tkinter, '_default_root')) + self.assertNotHasAttr(tkinter, '_default_root') root = tkinter.Tk() self.assertIs(tkinter._support_default_root, False) - self.assertFalse(hasattr(tkinter, '_default_root')) + self.assertNotHasAttr(tkinter, '_default_root') root.destroy() def test_getboolean(self): diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index ee8939f62d082c..c40c45594f4d80 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -344,7 +344,7 @@ def test_longargs(self): todo = set(t.name[1:]) self.assertEqual(len(t.args.args) + len(t.args.posonlyargs), len(todo) - bool(t.args.vararg) - bool(t.args.kwarg)) - self.assertTrue(t.name.startswith('f'), t.name) + self.assertStartsWith(t.name, 'f') for index, c in enumerate(t.name[1:]): todo.remove(c) if c == 'v': diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 3552b6b4ef846c..3097c7ddf05901 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -827,15 +827,15 @@ def test_instancecheck_and_subclasscheck(self): self.assertIsInstance(True, x) self.assertIsInstance('a', x) self.assertNotIsInstance(None, x) - self.assertTrue(issubclass(int, x)) - self.assertTrue(issubclass(bool, x)) - self.assertTrue(issubclass(str, x)) - self.assertFalse(issubclass(type(None), x)) + self.assertIsSubclass(int, x) + self.assertIsSubclass(bool, x) + self.assertIsSubclass(str, x) + self.assertNotIsSubclass(type(None), x) for x in (int | None, typing.Union[int, None]): with self.subTest(x=x): self.assertIsInstance(None, x) - self.assertTrue(issubclass(type(None), x)) + self.assertIsSubclass(type(None), x) for x in ( int | collections.abc.Mapping, @@ -844,8 +844,8 @@ def test_instancecheck_and_subclasscheck(self): with self.subTest(x=x): self.assertIsInstance({}, x) self.assertNotIsInstance((), x) - self.assertTrue(issubclass(dict, x)) - self.assertFalse(issubclass(list, x)) + self.assertIsSubclass(dict, x) + self.assertNotIsSubclass(list, x) def test_instancecheck_and_subclasscheck_order(self): T = typing.TypeVar('T') @@ -857,7 +857,7 @@ def test_instancecheck_and_subclasscheck_order(self): for x in will_resolve: with self.subTest(x=x): self.assertIsInstance(1, x) - self.assertTrue(issubclass(int, x)) + self.assertIsSubclass(int, x) wont_resolve = ( T | int, @@ -890,7 +890,7 @@ class BadMeta(type): def __subclasscheck__(cls, sub): 1/0 x = int | BadMeta('A', (), {}) - self.assertTrue(issubclass(int, x)) + self.assertIsSubclass(int, x) self.assertRaises(ZeroDivisionError, issubclass, list, x) def test_or_type_operator_with_TypeVar(self): @@ -1399,7 +1399,7 @@ def test_new_class_basics(self): def test_new_class_subclass(self): C = types.new_class("C", (int,)) - self.assertTrue(issubclass(C, int)) + self.assertIsSubclass(C, int) def test_new_class_meta(self): Meta = self.Meta @@ -1444,7 +1444,7 @@ def func(ns): bases=(int,), kwds=dict(metaclass=Meta, z=2), exec_body=func) - self.assertTrue(issubclass(C, int)) + self.assertIsSubclass(C, int) self.assertIsInstance(C, Meta) self.assertEqual(C.x, 0) self.assertEqual(C.y, 1) diff --git a/Lib/test/test_unittest/test_case.py b/Lib/test/test_unittest/test_case.py index a04af55f3fc0ae..d66cab146af246 100644 --- a/Lib/test/test_unittest/test_case.py +++ b/Lib/test/test_unittest/test_case.py @@ -1989,7 +1989,7 @@ def testAssertNoLogsYieldsNone(self): pass self.assertIsNone(value) - def testAssertStartswith(self): + def testAssertStartsWith(self): self.assertStartsWith('ababahalamaha', 'ababa') self.assertStartsWith('ababahalamaha', ('x', 'ababa', 'y')) self.assertStartsWith(UserString('ababahalamaha'), 'ababa') @@ -2034,7 +2034,7 @@ def testAssertStartswith(self): self.assertStartsWith('ababahalamaha', 'amaha', msg='abracadabra') self.assertIn('ababahalamaha', str(cm.exception)) - def testAssertNotStartswith(self): + def testAssertNotStartsWith(self): self.assertNotStartsWith('ababahalamaha', 'amaha') self.assertNotStartsWith('ababahalamaha', ('x', 'amaha', 'y')) self.assertNotStartsWith(UserString('ababahalamaha'), 'amaha') @@ -2079,7 +2079,7 @@ def testAssertNotStartswith(self): self.assertNotStartsWith('ababahalamaha', 'ababa', msg='abracadabra') self.assertIn('ababahalamaha', str(cm.exception)) - def testAssertEndswith(self): + def testAssertEndsWith(self): self.assertEndsWith('ababahalamaha', 'amaha') self.assertEndsWith('ababahalamaha', ('x', 'amaha', 'y')) self.assertEndsWith(UserString('ababahalamaha'), 'amaha') @@ -2124,7 +2124,7 @@ def testAssertEndswith(self): self.assertEndsWith('ababahalamaha', 'ababa', msg='abracadabra') self.assertIn('ababahalamaha', str(cm.exception)) - def testAssertNotEndswith(self): + def testAssertNotEndsWith(self): self.assertNotEndsWith('ababahalamaha', 'ababa') self.assertNotEndsWith('ababahalamaha', ('x', 'ababa', 'y')) self.assertNotEndsWith(UserString('ababahalamaha'), 'ababa') diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py index ace84ef564df72..75de9ea252de98 100644 --- a/Lib/test/test_userdict.py +++ b/Lib/test/test_userdict.py @@ -166,7 +166,7 @@ def test_update(self): def test_missing(self): # Make sure UserDict doesn't have a __missing__ method - self.assertEqual(hasattr(collections.UserDict, "__missing__"), False) + self.assertNotHasAttr(collections.UserDict, "__missing__") # Test several cases: # (D) subclass defines __missing__ method returning a value # (E) subclass defines __missing__ method raising RuntimeError diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index adc86a49b0668d..12c30e178aeb51 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -774,7 +774,7 @@ def test_activate_shell_script_has_no_dos_newlines(self): with open(script_path, 'rb') as script: for i, line in enumerate(script, 1): error_message = f"CR LF found in line {i}" - self.assertFalse(line.endswith(b'\r\n'), error_message) + self.assertNotEndsWith(line, b'\r\n', error_message) @requireVenvCreate def test_scm_ignore_files_git(self): @@ -978,7 +978,7 @@ def do_test_with_pip(self, system_site_packages): self.assertEqual(err, "") out = out.decode("latin-1") # Force to text, prevent decoding errors expected_version = "pip {}".format(ensurepip.version()) - self.assertEqual(out[:len(expected_version)], expected_version) + self.assertStartsWith(out, expected_version) env_dir = os.fsencode(self.env_dir).decode("latin-1") self.assertIn(env_dir, out) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 05710c469348c4..5c3b1250ceb045 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -102,7 +102,7 @@ class PublicAPITests(BaseTest): """ def test_module_all_attribute(self): - self.assertTrue(hasattr(self.module, '__all__')) + self.assertHasAttr(self.module, '__all__') target_api = ["warn", "warn_explicit", "showwarning", "formatwarning", "filterwarnings", "simplefilter", "resetwarnings", "catch_warnings", "deprecated"] @@ -735,7 +735,7 @@ class CWarnTests(WarnTests, unittest.TestCase): # test.import_helper.import_fresh_module utility function def test_accelerated(self): self.assertIsNot(original_warnings, self.module) - self.assertFalse(hasattr(self.module.warn, '__code__')) + self.assertNotHasAttr(self.module.warn, '__code__') class PyWarnTests(WarnTests, unittest.TestCase): module = py_warnings @@ -744,7 +744,7 @@ class PyWarnTests(WarnTests, unittest.TestCase): # test.import_helper.import_fresh_module utility function def test_pure_python(self): self.assertIsNot(original_warnings, self.module) - self.assertTrue(hasattr(self.module.warn, '__code__')) + self.assertHasAttr(self.module.warn, '__code__') class WCmdLineTests(BaseTest): @@ -1528,12 +1528,12 @@ def test_late_resource_warning(self): # (_warnings will try to import it) code = "f = open(%a)" % __file__ rc, out, err = assert_python_ok("-Wd", "-c", code) - self.assertTrue(err.startswith(expected), ascii(err)) + self.assertStartsWith(err, expected) # import the warnings module code = "import warnings; f = open(%a)" % __file__ rc, out, err = assert_python_ok("-Wd", "-c", code) - self.assertTrue(err.startswith(expected), ascii(err)) + self.assertStartsWith(err, expected) class AsyncTests(BaseTest): diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 4faad6629fe23c..4c7c900eb56ae1 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -432,7 +432,7 @@ def check_proxy(self, o, proxy): self.assertEqual(proxy.foo, 2, "proxy does not reflect attribute modification") del o.foo - self.assertFalse(hasattr(proxy, 'foo'), + self.assertNotHasAttr(proxy, 'foo', "proxy does not reflect attribute removal") proxy.foo = 1 @@ -442,7 +442,7 @@ def check_proxy(self, o, proxy): self.assertEqual(o.foo, 2, "object does not reflect attribute modification via proxy") del proxy.foo - self.assertFalse(hasattr(o, 'foo'), + self.assertNotHasAttr(o, 'foo', "object does not reflect attribute removal via proxy") def test_proxy_deletion(self): @@ -1108,7 +1108,7 @@ def meth(self): self.assertEqual(r.slot1, "abc") self.assertEqual(r.slot2, "def") self.assertEqual(r.meth(), "abcdef") - self.assertFalse(hasattr(r, "__dict__")) + self.assertNotHasAttr(r, "__dict__") def test_subclass_refs_with_cycle(self): """Confirm https://bugs.python.org/issue3100 is fixed.""" diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 76e8e5c8ab7d3c..c1e4f9c8366e58 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -466,7 +466,7 @@ def test_copying(self): self.assertIsNot(dup, s) self.assertIs(dup.x, s.x) self.assertIs(dup.z, s.z) - self.assertFalse(hasattr(dup, 'y')) + self.assertNotHasAttr(dup, 'y') dup = copy.deepcopy(s) self.assertIsInstance(dup, cls) @@ -476,7 +476,7 @@ def test_copying(self): self.assertIsNot(dup.x, s.x) self.assertEqual(dup.z, s.z) self.assertIsNot(dup.z, s.z) - self.assertFalse(hasattr(dup, 'y')) + self.assertNotHasAttr(dup, 'y') if __name__ == "__main__": diff --git a/Lib/test/test_winconsoleio.py b/Lib/test/test_winconsoleio.py index d9076e77c158a2..1bae884ed9ae3e 100644 --- a/Lib/test/test_winconsoleio.py +++ b/Lib/test/test_winconsoleio.py @@ -17,9 +17,9 @@ class WindowsConsoleIOTests(unittest.TestCase): def test_abc(self): - self.assertTrue(issubclass(ConIO, io.RawIOBase)) - self.assertFalse(issubclass(ConIO, io.BufferedIOBase)) - self.assertFalse(issubclass(ConIO, io.TextIOBase)) + self.assertIsSubclass(ConIO, io.RawIOBase) + self.assertNotIsSubclass(ConIO, io.BufferedIOBase) + self.assertNotIsSubclass(ConIO, io.TextIOBase) def test_open_fd(self): self.assertRaisesRegex(ValueError, diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index fd7abd1782ec4d..f16611b29a2658 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -679,7 +679,7 @@ def testSingleComplexTarget(self): class C: pass blah = C() with mock_contextmanager_generator() as blah.foo: - self.assertEqual(hasattr(blah, "foo"), True) + self.assertHasAttr(blah, "foo") def testMultipleComplexTargets(self): class C: diff --git a/Lib/test/test_wmi.py b/Lib/test/test_wmi.py index ac7c9cb3a5a493..90eb40439d4b4a 100644 --- a/Lib/test/test_wmi.py +++ b/Lib/test/test_wmi.py @@ -70,8 +70,8 @@ def test_wmi_query_overflow(self): def test_wmi_query_multiple_rows(self): # Multiple instances should have an extra null separator r = wmi_exec_query("SELECT ProcessId FROM Win32_Process WHERE ProcessId < 1000") - self.assertFalse(r.startswith("\0"), r) - self.assertFalse(r.endswith("\0"), r) + self.assertNotStartsWith(r, "\0") + self.assertNotEndsWith(r, "\0") it = iter(r.split("\0")) try: while True: diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index b047f7b06f85d3..e04a4d2c2218a3 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -149,9 +149,9 @@ def bad_app(environ,start_response): start_response("200 OK", ('Content-Type','text/plain')) return ["Hello, world!"] out, err = run_amock(validator(bad_app)) - self.assertTrue(out.endswith( + self.assertEndsWith(out, b"A server error occurred. Please contact the administrator." - )) + ) self.assertEqual( err.splitlines()[-2], "AssertionError: Headers (('Content-Type', 'text/plain')) must" @@ -174,9 +174,9 @@ def bad_app(environ, start_response): for status, exc_message in tests: with self.subTest(status=status): out, err = run_amock(create_bad_app(status)) - self.assertTrue(out.endswith( + self.assertEndsWith(out, b"A server error occurred. Please contact the administrator." - )) + ) self.assertEqual(err.splitlines()[-2], exc_message) def test_wsgi_input(self): @@ -185,9 +185,9 @@ def bad_app(e,s): s("200 OK", [("Content-Type", "text/plain; charset=utf-8")]) return [b"data"] out, err = run_amock(validator(bad_app)) - self.assertTrue(out.endswith( + self.assertEndsWith(out, b"A server error occurred. Please contact the administrator." - )) + ) self.assertEqual( err.splitlines()[-2], "AssertionError" ) @@ -200,7 +200,7 @@ def app(e, s): ]) return [b"data"] out, err = run_amock(validator(app)) - self.assertTrue(err.endswith('"GET / HTTP/1.0" 200 4\n')) + self.assertEndsWith(err, '"GET / HTTP/1.0" 200 4\n') ver = sys.version.split()[0].encode('ascii') py = python_implementation().encode('ascii') pyver = py + b"/" + ver diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 8f2779520070d2..38be2cd437f200 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -225,8 +225,7 @@ def check_element(element): self.assertTrue(ET.iselement(element), msg="not an element") direlem = dir(element) for attr in 'tag', 'attrib', 'text', 'tail': - self.assertTrue(hasattr(element, attr), - msg='no %s member' % attr) + self.assertHasAttr(element, attr) self.assertIn(attr, direlem, msg='no %s visible by dir' % attr) @@ -251,7 +250,7 @@ def check_element(element): # Make sure all standard element methods exist. def check_method(method): - self.assertTrue(hasattr(method, '__call__'), + self.assertHasAttr(method, '__call__', msg="%s not callable" % method) check_method(element.append) diff --git a/Lib/test/test_xxlimited.py b/Lib/test/test_xxlimited.py index 6dbfb3f439393c..b52e78bc4fb7e0 100644 --- a/Lib/test/test_xxlimited.py +++ b/Lib/test/test_xxlimited.py @@ -31,7 +31,7 @@ def test_foo(self): self.assertEqual(self.module.foo(1, 2), 3) def test_str(self): - self.assertTrue(issubclass(self.module.Str, str)) + self.assertIsSubclass(self.module.Str, str) self.assertIsNot(self.module.Str, str) custom_string = self.module.Str("abcd") diff --git a/Lib/test/test_zipapp.py b/Lib/test/test_zipapp.py index d4766c59a102db..8fb0a68deba535 100644 --- a/Lib/test/test_zipapp.py +++ b/Lib/test/test_zipapp.py @@ -259,7 +259,7 @@ def test_pack_to_fileobj(self): (source / '__main__.py').touch() target = io.BytesIO() zipapp.create_archive(str(source), target, interpreter='python') - self.assertTrue(target.getvalue().startswith(b'#!python\n')) + self.assertStartsWith(target.getvalue(), b'#!python\n') def test_read_shebang(self): # Test that we can read the shebang line correctly. @@ -300,7 +300,7 @@ def test_write_shebang_to_fileobj(self): zipapp.create_archive(str(source), str(target), interpreter='python') new_target = io.BytesIO() zipapp.create_archive(str(target), new_target, interpreter='python2.7') - self.assertTrue(new_target.getvalue().startswith(b'#!python2.7\n')) + self.assertStartsWith(new_target.getvalue(), b'#!python2.7\n') def test_read_from_pathlike_obj(self): # Test that we can copy an archive using a path-like object @@ -326,7 +326,7 @@ def test_read_from_fileobj(self): new_target = io.BytesIO() temp_archive.seek(0) zipapp.create_archive(temp_archive, new_target, interpreter='python2.7') - self.assertTrue(new_target.getvalue().startswith(b'#!python2.7\n')) + self.assertStartsWith(new_target.getvalue(), b'#!python2.7\n') def test_remove_shebang(self): # Test that we can remove the shebang from a file. diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index e93603998f979e..ada96813709aea 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -3198,7 +3198,7 @@ def test_write_dir(self): with zipfile.ZipFile(TESTFN, "w") as zipf: zipf.write(dirpath) zinfo = zipf.filelist[0] - self.assertTrue(zinfo.filename.endswith("/x/")) + self.assertEndsWith(zinfo.filename, "/x/") self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10) zipf.write(dirpath, "y") zinfo = zipf.filelist[1] @@ -3206,7 +3206,7 @@ def test_write_dir(self): self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10) with zipfile.ZipFile(TESTFN, "r") as zipf: zinfo = zipf.filelist[0] - self.assertTrue(zinfo.filename.endswith("/x/")) + self.assertEndsWith(zinfo.filename, "/x/") self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10) zinfo = zipf.filelist[1] self.assertTrue(zinfo.filename, "y/") @@ -3226,7 +3226,7 @@ def test_writestr_dir(self): self.assertEqual(zinfo.external_attr, (0o40775 << 16) | 0x10) with zipfile.ZipFile(TESTFN, "r") as zipf: zinfo = zipf.filelist[0] - self.assertTrue(zinfo.filename.endswith("x/")) + self.assertEndsWith(zinfo.filename, "x/") self.assertEqual(zinfo.external_attr, (0o40775 << 16) | 0x10) target = os.path.join(TESTFN2, "target") os.mkdir(target) diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 1f288c8b45d589..b5b4acf5f850be 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -835,11 +835,11 @@ def doTraceback(self, module): s = io.StringIO() print_tb(tb, 1, s) - self.assertTrue(s.getvalue().endswith( + self.assertEndsWith(s.getvalue(), ' def do_raise(): raise TypeError\n' '' if support.has_no_debug_ranges() else ' ^^^^^^^^^^^^^^^\n' - )) + ) else: raise AssertionError("This ought to be impossible") diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py index d2845495c7f8b6..f313e394f49e9b 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -1915,8 +1915,8 @@ class ExtensionBuiltTest(unittest.TestCase): def test_cache_location(self): # The pure Python version stores caches on attributes, but the C # extension stores them in C globals (at least for now) - self.assertFalse(hasattr(c_zoneinfo.ZoneInfo, "_weak_cache")) - self.assertTrue(hasattr(py_zoneinfo.ZoneInfo, "_weak_cache")) + self.assertNotHasAttr(c_zoneinfo.ZoneInfo, "_weak_cache") + self.assertHasAttr(py_zoneinfo.ZoneInfo, "_weak_cache") def test_gc_tracked(self): import gc From 59cb829eb9b9f7bb301cc795c9ee8f5e0c7269f2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 14:26:26 +0200 Subject: [PATCH 0198/1674] [3.14] gh-134455: Fix `build-details.json` to use the ``c_api.headers`` key (GH-134456) (#134504) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Górny Co-authored-by: Filipe Laíns 🇵🇸 --- .../next/Build/2025-05-21-19-46-28.gh-issue-134455.vdwlrq.rst | 2 ++ Tools/build/generate-build-details.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Build/2025-05-21-19-46-28.gh-issue-134455.vdwlrq.rst diff --git a/Misc/NEWS.d/next/Build/2025-05-21-19-46-28.gh-issue-134455.vdwlrq.rst b/Misc/NEWS.d/next/Build/2025-05-21-19-46-28.gh-issue-134455.vdwlrq.rst new file mode 100644 index 00000000000000..08833b3344f20b --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-05-21-19-46-28.gh-issue-134455.vdwlrq.rst @@ -0,0 +1,2 @@ +Fixed ``build-details.json`` generation to use the correct ``c_api.headers`` +as defined in :pep:`739`, instead of ``c_api.include``. diff --git a/Tools/build/generate-build-details.py b/Tools/build/generate-build-details.py index 5dc100b8b05e5e..87e262065ec87b 100644 --- a/Tools/build/generate-build-details.py +++ b/Tools/build/generate-build-details.py @@ -123,7 +123,7 @@ def generate_data(schema_version: str) -> collections.defaultdict[str, Any]: if has_static_library: data['libpython']['static'] = os.path.join(LIBDIR, LIBRARY) - data['c_api']['include'] = INCLUDEDIR + data['c_api']['headers'] = INCLUDEDIR if LIBPC: data['c_api']['pkgconfig_path'] = LIBPC From 85c8c0a003dca9ac48b4e5c71f798085822f8760 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 15:21:05 +0200 Subject: [PATCH 0199/1674] [3.14] gh-132775: Use _PyObject_GetXIData (With Fallback) (gh-134507) This change includes some semi-related refactoring of queues and channels. (cherry picked from commit d0eedfa10e, gh-134440) Co-authored-by: Eric Snow --- Lib/concurrent/futures/interpreter.py | 55 ++---- Lib/test/support/interpreters/channels.py | 85 +++++---- Lib/test/support/interpreters/queues.py | 144 +++++++-------- Lib/test/test__interpchannels.py | 6 +- Lib/test/test_interpreters/test_channels.py | 40 ++--- Lib/test/test_interpreters/test_queues.py | 188 +++++++------------- Modules/_interpchannelsmodule.c | 176 +++++++++++------- Modules/_interpqueuesmodule.c | 175 ++++++++++-------- Modules/_interpreters_common.h | 54 ++++++ Python/crossinterp.c | 1 + 10 files changed, 486 insertions(+), 438 deletions(-) diff --git a/Lib/concurrent/futures/interpreter.py b/Lib/concurrent/futures/interpreter.py index d17688dc9d7346..a2c4fbfd3fb831 100644 --- a/Lib/concurrent/futures/interpreter.py +++ b/Lib/concurrent/futures/interpreter.py @@ -36,9 +36,6 @@ def __str__(self): """.strip()) -UNBOUND = 2 # error; this should not happen. - - class WorkerContext(_thread.WorkerContext): @classmethod @@ -47,23 +44,13 @@ def resolve_task(fn, args, kwargs): if isinstance(fn, str): # XXX Circle back to this later. raise TypeError('scripts not supported') - if args or kwargs: - raise ValueError(f'a script does not take args or kwargs, got {args!r} and {kwargs!r}') - data = textwrap.dedent(fn) - kind = 'script' - # Make sure the script compiles. - # Ideally we wouldn't throw away the resulting code - # object. However, there isn't much to be done until - # code objects are shareable and/or we do a better job - # of supporting code objects in _interpreters.exec(). - compile(data, '', 'exec') else: # Functions defined in the __main__ module can't be pickled, # so they can't be used here. In the future, we could possibly # borrow from multiprocessing to work around this. - data = pickle.dumps((fn, args, kwargs)) - kind = 'function' - return (data, kind) + task = (fn, args, kwargs) + data = pickle.dumps(task) + return data if initializer is not None: try: @@ -86,24 +73,20 @@ def _capture_exc(cls, resultsid): except BaseException as exc: # Send the captured exception out on the results queue, # but still leave it unhandled for the interpreter to handle. - err = pickle.dumps(exc) - _interpqueues.put(resultsid, (None, err), 1, UNBOUND) + _interpqueues.put(resultsid, (None, exc)) raise # re-raise @classmethod def _send_script_result(cls, resultsid): - _interpqueues.put(resultsid, (None, None), 0, UNBOUND) + _interpqueues.put(resultsid, (None, None)) @classmethod def _call(cls, func, args, kwargs, resultsid): with cls._capture_exc(resultsid): res = func(*args or (), **kwargs or {}) # Send the result back. - try: - _interpqueues.put(resultsid, (res, None), 0, UNBOUND) - except _interpreters.NotShareableError: - res = pickle.dumps(res) - _interpqueues.put(resultsid, (res, None), 1, UNBOUND) + with cls._capture_exc(resultsid): + _interpqueues.put(resultsid, (res, None)) @classmethod def _call_pickled(cls, pickled, resultsid): @@ -134,8 +117,7 @@ def initialize(self): _interpreters.incref(self.interpid) maxsize = 0 - fmt = 0 - self.resultsid = _interpqueues.create(maxsize, fmt, UNBOUND) + self.resultsid = _interpqueues.create(maxsize) self._exec(f'from {__name__} import WorkerContext') @@ -166,17 +148,8 @@ def finalize(self): pass def run(self, task): - data, kind = task - if kind == 'script': - raise NotImplementedError('script kind disabled') - script = f""" -with WorkerContext._capture_exc({self.resultsid}): -{textwrap.indent(data, ' ')} -WorkerContext._send_script_result({self.resultsid})""" - elif kind == 'function': - script = f'WorkerContext._call_pickled({data!r}, {self.resultsid})' - else: - raise NotImplementedError(kind) + data = task + script = f'WorkerContext._call_pickled({data!r}, {self.resultsid})' try: self._exec(script) @@ -199,15 +172,13 @@ def run(self, task): continue else: break - (res, excdata), pickled, unboundop = obj + (res, exc), unboundop = obj assert unboundop is None, unboundop - if excdata is not None: + if exc is not None: assert res is None, res - assert pickled assert exc_wrapper is not None - exc = pickle.loads(excdata) raise exc from exc_wrapper - return pickle.loads(res) if pickled else res + return res class BrokenInterpreterPool(_thread.BrokenThreadPool): diff --git a/Lib/test/support/interpreters/channels.py b/Lib/test/support/interpreters/channels.py index d2bd93d77f7169..7a2bd7d63f808f 100644 --- a/Lib/test/support/interpreters/channels.py +++ b/Lib/test/support/interpreters/channels.py @@ -55,15 +55,23 @@ def create(*, unbounditems=UNBOUND): """ unbound = _serialize_unbound(unbounditems) unboundop, = unbound - cid = _channels.create(unboundop) - recv, send = RecvChannel(cid), SendChannel(cid, _unbound=unbound) + cid = _channels.create(unboundop, -1) + recv, send = RecvChannel(cid), SendChannel(cid) + send._set_unbound(unboundop, unbounditems) return recv, send def list_all(): """Return a list of (recv, send) for all open channels.""" - return [(RecvChannel(cid), SendChannel(cid, _unbound=unbound)) - for cid, unbound in _channels.list_all()] + channels = [] + for cid, unboundop, _ in _channels.list_all(): + chan = _, send = RecvChannel(cid), SendChannel(cid) + if not hasattr(send, '_unboundop'): + send._set_unbound(unboundop) + else: + assert send._unbound[0] == op + channels.append(chan) + return channels class _ChannelEnd: @@ -175,16 +183,33 @@ class SendChannel(_ChannelEnd): _end = 'send' - def __new__(cls, cid, *, _unbound=None): - if _unbound is None: - try: - op = _channels.get_channel_defaults(cid) - _unbound = (op,) - except ChannelNotFoundError: - _unbound = _serialize_unbound(UNBOUND) - self = super().__new__(cls, cid) - self._unbound = _unbound - return self +# def __new__(cls, cid, *, _unbound=None): +# if _unbound is None: +# try: +# op = _channels.get_channel_defaults(cid) +# _unbound = (op,) +# except ChannelNotFoundError: +# _unbound = _serialize_unbound(UNBOUND) +# self = super().__new__(cls, cid) +# self._unbound = _unbound +# return self + + def _set_unbound(self, op, items=None): + assert not hasattr(self, '_unbound') + if items is None: + items = _resolve_unbound(op) + unbound = (op, items) + self._unbound = unbound + return unbound + + @property + def unbounditems(self): + try: + _, items = self._unbound + except AttributeError: + op, _ = _channels.get_queue_defaults(self._id) + _, items = self._set_unbound(op) + return items @property def is_closed(self): @@ -192,61 +217,61 @@ def is_closed(self): return info.closed or info.closing def send(self, obj, timeout=None, *, - unbound=None, + unbounditems=None, ): """Send the object (i.e. its data) to the channel's receiving end. This blocks until the object is received. """ - if unbound is None: - unboundop, = self._unbound + if unbounditems is None: + unboundop = -1 else: - unboundop, = _serialize_unbound(unbound) + unboundop, = _serialize_unbound(unbounditems) _channels.send(self._id, obj, unboundop, timeout=timeout, blocking=True) def send_nowait(self, obj, *, - unbound=None, + unbounditems=None, ): """Send the object to the channel's receiving end. If the object is immediately received then return True (else False). Otherwise this is the same as send(). """ - if unbound is None: - unboundop, = self._unbound + if unbounditems is None: + unboundop = -1 else: - unboundop, = _serialize_unbound(unbound) + unboundop, = _serialize_unbound(unbounditems) # XXX Note that at the moment channel_send() only ever returns # None. This should be fixed when channel_send_wait() is added. # See bpo-32604 and gh-19829. return _channels.send(self._id, obj, unboundop, blocking=False) def send_buffer(self, obj, timeout=None, *, - unbound=None, + unbounditems=None, ): """Send the object's buffer to the channel's receiving end. This blocks until the object is received. """ - if unbound is None: - unboundop, = self._unbound + if unbounditems is None: + unboundop = -1 else: - unboundop, = _serialize_unbound(unbound) + unboundop, = _serialize_unbound(unbounditems) _channels.send_buffer(self._id, obj, unboundop, timeout=timeout, blocking=True) def send_buffer_nowait(self, obj, *, - unbound=None, + unbounditems=None, ): """Send the object's buffer to the channel's receiving end. If the object is immediately received then return True (else False). Otherwise this is the same as send(). """ - if unbound is None: - unboundop, = self._unbound + if unbounditems is None: + unboundop = -1 else: - unboundop, = _serialize_unbound(unbound) + unboundop, = _serialize_unbound(unbounditems) return _channels.send_buffer(self._id, obj, unboundop, blocking=False) def close(self): diff --git a/Lib/test/support/interpreters/queues.py b/Lib/test/support/interpreters/queues.py index deb8e8613af731..d6a3197d9e0e26 100644 --- a/Lib/test/support/interpreters/queues.py +++ b/Lib/test/support/interpreters/queues.py @@ -63,29 +63,34 @@ def _resolve_unbound(flag): return resolved -def create(maxsize=0, *, syncobj=False, unbounditems=UNBOUND): +def create(maxsize=0, *, unbounditems=UNBOUND): """Return a new cross-interpreter queue. The queue may be used to pass data safely between interpreters. - "syncobj" sets the default for Queue.put() - and Queue.put_nowait(). - - "unbounditems" likewise sets the default. See Queue.put() for + "unbounditems" sets the default for Queue.put(); see that method for supported values. The default value is UNBOUND, which replaces the unbound item. """ - fmt = _SHARED_ONLY if syncobj else _PICKLED unbound = _serialize_unbound(unbounditems) unboundop, = unbound - qid = _queues.create(maxsize, fmt, unboundop) - return Queue(qid, _fmt=fmt, _unbound=unbound) + qid = _queues.create(maxsize, unboundop, -1) + self = Queue(qid) + self._set_unbound(unboundop, unbounditems) + return self def list_all(): """Return a list of all open queues.""" - return [Queue(qid, _fmt=fmt, _unbound=(unboundop,)) - for qid, fmt, unboundop in _queues.list_all()] + queues = [] + for qid, unboundop, _ in _queues.list_all(): + self = Queue(qid) + if not hasattr(self, '_unbound'): + self._set_unbound(unboundop) + else: + assert self._unbound[0] == unboundop + queues.append(self) + return queues _known_queues = weakref.WeakValueDictionary() @@ -93,28 +98,17 @@ def list_all(): class Queue: """A cross-interpreter queue.""" - def __new__(cls, id, /, *, _fmt=None, _unbound=None): + def __new__(cls, id, /): # There is only one instance for any given ID. if isinstance(id, int): id = int(id) else: raise TypeError(f'id must be an int, got {id!r}') - if _fmt is None: - if _unbound is None: - _fmt, op = _queues.get_queue_defaults(id) - _unbound = (op,) - else: - _fmt, _ = _queues.get_queue_defaults(id) - elif _unbound is None: - _, op = _queues.get_queue_defaults(id) - _unbound = (op,) try: self = _known_queues[id] except KeyError: self = super().__new__(cls) self._id = id - self._fmt = _fmt - self._unbound = _unbound _known_queues[id] = self _queues.bind(id) return self @@ -143,10 +137,27 @@ def __getnewargs__(self): def __getstate__(self): return None + def _set_unbound(self, op, items=None): + assert not hasattr(self, '_unbound') + if items is None: + items = _resolve_unbound(op) + unbound = (op, items) + self._unbound = unbound + return unbound + @property def id(self): return self._id + @property + def unbounditems(self): + try: + _, items = self._unbound + except AttributeError: + op, _ = _queues.get_queue_defaults(self._id) + _, items = self._set_unbound(op) + return items + @property def maxsize(self): try: @@ -165,77 +176,56 @@ def qsize(self): return _queues.get_count(self._id) def put(self, obj, timeout=None, *, - syncobj=None, - unbound=None, + unbounditems=None, _delay=10 / 1000, # 10 milliseconds ): """Add the object to the queue. This blocks while the queue is full. - If "syncobj" is None (the default) then it uses the - queue's default, set with create_queue(). - - If "syncobj" is false then all objects are supported, - at the expense of worse performance. - - If "syncobj" is true then the object must be "shareable". - Examples of "shareable" objects include the builtin singletons, - str, and memoryview. One benefit is that such objects are - passed through the queue efficiently. - - The key difference, though, is conceptual: the corresponding - object returned from Queue.get() will be strictly equivalent - to the given obj. In other words, the two objects will be - effectively indistinguishable from each other, even if the - object is mutable. The received object may actually be the - same object, or a copy (immutable values only), or a proxy. - Regardless, the received object should be treated as though - the original has been shared directly, whether or not it - actually is. That's a slightly different and stronger promise - than just (initial) equality, which is all "syncobj=False" - can promise. - - "unbound" controls the behavior of Queue.get() for the given + For most objects, the object received through Queue.get() will + be a new one, equivalent to the original and not sharing any + actual underlying data. The notable exceptions include + cross-interpreter types (like Queue) and memoryview, where the + underlying data is actually shared. Furthermore, some types + can be sent through a queue more efficiently than others. This + group includes various immutable types like int, str, bytes, and + tuple (if the items are likewise efficiently shareable). See interpreters.is_shareable(). + + "unbounditems" controls the behavior of Queue.get() for the given object if the current interpreter (calling put()) is later destroyed. - If "unbound" is None (the default) then it uses the + If "unbounditems" is None (the default) then it uses the queue's default, set with create_queue(), which is usually UNBOUND. - If "unbound" is UNBOUND_ERROR then get() will raise an + If "unbounditems" is UNBOUND_ERROR then get() will raise an ItemInterpreterDestroyed exception if the original interpreter has been destroyed. This does not otherwise affect the queue; the next call to put() will work like normal, returning the next item in the queue. - If "unbound" is UNBOUND_REMOVE then the item will be removed + If "unbounditems" is UNBOUND_REMOVE then the item will be removed from the queue as soon as the original interpreter is destroyed. Be aware that this will introduce an imbalance between put() and get() calls. - If "unbound" is UNBOUND then it is returned by get() in place + If "unbounditems" is UNBOUND then it is returned by get() in place of the unbound item. """ - if syncobj is None: - fmt = self._fmt - else: - fmt = _SHARED_ONLY if syncobj else _PICKLED - if unbound is None: - unboundop, = self._unbound + if unbounditems is None: + unboundop = -1 else: - unboundop, = _serialize_unbound(unbound) + unboundop, = _serialize_unbound(unbounditems) if timeout is not None: timeout = int(timeout) if timeout < 0: raise ValueError(f'timeout value must be non-negative') end = time.time() + timeout - if fmt is _PICKLED: - obj = pickle.dumps(obj) while True: try: - _queues.put(self._id, obj, fmt, unboundop) + _queues.put(self._id, obj, unboundop) except QueueFull as exc: if timeout is not None and time.time() >= end: raise # re-raise @@ -243,18 +233,12 @@ def put(self, obj, timeout=None, *, else: break - def put_nowait(self, obj, *, syncobj=None, unbound=None): - if syncobj is None: - fmt = self._fmt + def put_nowait(self, obj, *, unbounditems=None): + if unbounditems is None: + unboundop = -1 else: - fmt = _SHARED_ONLY if syncobj else _PICKLED - if unbound is None: - unboundop, = self._unbound - else: - unboundop, = _serialize_unbound(unbound) - if fmt is _PICKLED: - obj = pickle.dumps(obj) - _queues.put(self._id, obj, fmt, unboundop) + unboundop, = _serialize_unbound(unbounditems) + _queues.put(self._id, obj, unboundop) def get(self, timeout=None, *, _delay=10 / 1000, # 10 milliseconds @@ -265,7 +249,7 @@ def get(self, timeout=None, *, If the next item's original interpreter has been destroyed then the "next object" is determined by the value of the - "unbound" argument to put(). + "unbounditems" argument to put(). """ if timeout is not None: timeout = int(timeout) @@ -274,7 +258,7 @@ def get(self, timeout=None, *, end = time.time() + timeout while True: try: - obj, fmt, unboundop = _queues.get(self._id) + obj, unboundop = _queues.get(self._id) except QueueEmpty as exc: if timeout is not None and time.time() >= end: raise # re-raise @@ -284,10 +268,6 @@ def get(self, timeout=None, *, if unboundop is not None: assert obj is None, repr(obj) return _resolve_unbound(unboundop) - if fmt == _PICKLED: - obj = pickle.loads(obj) - else: - assert fmt == _SHARED_ONLY return obj def get_nowait(self): @@ -297,16 +277,12 @@ def get_nowait(self): is the same as get(). """ try: - obj, fmt, unboundop = _queues.get(self._id) + obj, unboundop = _queues.get(self._id) except QueueEmpty as exc: raise # re-raise if unboundop is not None: assert obj is None, repr(obj) return _resolve_unbound(unboundop) - if fmt == _PICKLED: - obj = pickle.loads(obj) - else: - assert fmt == _SHARED_ONLY return obj diff --git a/Lib/test/test__interpchannels.py b/Lib/test/test__interpchannels.py index e4c1ad854514ed..88eee03a3de93a 100644 --- a/Lib/test/test__interpchannels.py +++ b/Lib/test/test__interpchannels.py @@ -247,7 +247,7 @@ def _run_action(cid, action, end, state): def clean_up_channels(): - for cid, _ in _channels.list_all(): + for cid, _, _ in _channels.list_all(): try: _channels.destroy(cid) except _channels.ChannelNotFoundError: @@ -373,11 +373,11 @@ def test_create_cid(self): self.assertIsInstance(cid, _channels.ChannelID) def test_sequential_ids(self): - before = [cid for cid, _ in _channels.list_all()] + before = [cid for cid, _, _ in _channels.list_all()] id1 = _channels.create(REPLACE) id2 = _channels.create(REPLACE) id3 = _channels.create(REPLACE) - after = [cid for cid, _ in _channels.list_all()] + after = [cid for cid, _, _ in _channels.list_all()] self.assertEqual(id2, int(id1) + 1) self.assertEqual(id3, int(id2) + 1) diff --git a/Lib/test/test_interpreters/test_channels.py b/Lib/test/test_interpreters/test_channels.py index eada18f99d04db..0c027b17cea68c 100644 --- a/Lib/test/test_interpreters/test_channels.py +++ b/Lib/test/test_interpreters/test_channels.py @@ -377,11 +377,11 @@ def common(rch, sch, unbound=None, presize=0): if not unbound: extraargs = '' elif unbound is channels.UNBOUND: - extraargs = ', unbound=channels.UNBOUND' + extraargs = ', unbounditems=channels.UNBOUND' elif unbound is channels.UNBOUND_ERROR: - extraargs = ', unbound=channels.UNBOUND_ERROR' + extraargs = ', unbounditems=channels.UNBOUND_ERROR' elif unbound is channels.UNBOUND_REMOVE: - extraargs = ', unbound=channels.UNBOUND_REMOVE' + extraargs = ', unbounditems=channels.UNBOUND_REMOVE' else: raise NotImplementedError(repr(unbound)) interp = interpreters.create() @@ -454,11 +454,11 @@ def common(rch, sch, unbound=None, presize=0): with self.assertRaises(channels.ChannelEmptyError): rch.recv_nowait() - sch.send_nowait(b'ham', unbound=channels.UNBOUND_REMOVE) + sch.send_nowait(b'ham', unbounditems=channels.UNBOUND_REMOVE) self.assertEqual(_channels.get_count(rch.id), 1) interp = common(rch, sch, channels.UNBOUND_REMOVE, 1) self.assertEqual(_channels.get_count(rch.id), 3) - sch.send_nowait(42, unbound=channels.UNBOUND_REMOVE) + sch.send_nowait(42, unbounditems=channels.UNBOUND_REMOVE) self.assertEqual(_channels.get_count(rch.id), 4) del interp self.assertEqual(_channels.get_count(rch.id), 2) @@ -484,11 +484,11 @@ def test_send_cleared_with_subinterpreter_mixed(self): _run_output(interp, dedent(f""" from test.support.interpreters import channels sch = channels.SendChannel({sch.id}) - sch.send_nowait(1, unbound=channels.UNBOUND) - sch.send_nowait(2, unbound=channels.UNBOUND_ERROR) + sch.send_nowait(1, unbounditems=channels.UNBOUND) + sch.send_nowait(2, unbounditems=channels.UNBOUND_ERROR) sch.send_nowait(3) - sch.send_nowait(4, unbound=channels.UNBOUND_REMOVE) - sch.send_nowait(5, unbound=channels.UNBOUND) + sch.send_nowait(4, unbounditems=channels.UNBOUND_REMOVE) + sch.send_nowait(5, unbounditems=channels.UNBOUND) """)) self.assertEqual(_channels.get_count(rch.id), 5) @@ -522,8 +522,8 @@ def test_send_cleared_with_subinterpreter_multiple(self): rch = channels.RecvChannel({rch.id}) sch = channels.SendChannel({sch.id}) obj1 = rch.recv() - sch.send_nowait(2, unbound=channels.UNBOUND) - sch.send_nowait(obj1, unbound=channels.UNBOUND_REMOVE) + sch.send_nowait(2, unbounditems=channels.UNBOUND) + sch.send_nowait(obj1, unbounditems=channels.UNBOUND_REMOVE) """)) _run_output(interp2, dedent(f""" from test.support.interpreters import channels @@ -535,21 +535,21 @@ def test_send_cleared_with_subinterpreter_multiple(self): self.assertEqual(_channels.get_count(rch.id), 0) sch.send_nowait(3) _run_output(interp1, dedent(""" - sch.send_nowait(4, unbound=channels.UNBOUND) + sch.send_nowait(4, unbounditems=channels.UNBOUND) # interp closed here - sch.send_nowait(5, unbound=channels.UNBOUND_REMOVE) - sch.send_nowait(6, unbound=channels.UNBOUND) + sch.send_nowait(5, unbounditems=channels.UNBOUND_REMOVE) + sch.send_nowait(6, unbounditems=channels.UNBOUND) """)) _run_output(interp2, dedent(""" - sch.send_nowait(7, unbound=channels.UNBOUND_ERROR) + sch.send_nowait(7, unbounditems=channels.UNBOUND_ERROR) # interp closed here - sch.send_nowait(obj1, unbound=channels.UNBOUND_ERROR) - sch.send_nowait(obj2, unbound=channels.UNBOUND_REMOVE) - sch.send_nowait(8, unbound=channels.UNBOUND) + sch.send_nowait(obj1, unbounditems=channels.UNBOUND_ERROR) + sch.send_nowait(obj2, unbounditems=channels.UNBOUND_REMOVE) + sch.send_nowait(8, unbounditems=channels.UNBOUND) """)) _run_output(interp1, dedent(""" - sch.send_nowait(9, unbound=channels.UNBOUND_REMOVE) - sch.send_nowait(10, unbound=channels.UNBOUND) + sch.send_nowait(9, unbounditems=channels.UNBOUND_REMOVE) + sch.send_nowait(10, unbounditems=channels.UNBOUND) """)) self.assertEqual(_channels.get_count(rch.id), 10) diff --git a/Lib/test/test_interpreters/test_queues.py b/Lib/test/test_interpreters/test_queues.py index 18f83d097eb360..64a2db1230d023 100644 --- a/Lib/test/test_interpreters/test_queues.py +++ b/Lib/test/test_interpreters/test_queues.py @@ -9,6 +9,7 @@ _queues = import_helper.import_module('_interpqueues') from test.support import interpreters from test.support.interpreters import queues, _crossinterp +import test._crossinterp_definitions as defs from .utils import _run_output, TestBase as _TestBase @@ -42,7 +43,7 @@ def test_highlevel_reloaded(self): importlib.reload(queues) def test_create_destroy(self): - qid = _queues.create(2, 0, REPLACE) + qid = _queues.create(2, REPLACE, -1) _queues.destroy(qid) self.assertEqual(get_num_queues(), 0) with self.assertRaises(queues.QueueNotFoundError): @@ -56,7 +57,7 @@ def test_not_destroyed(self): '-c', dedent(f""" import {_queues.__name__} as _queues - _queues.create(2, 0, {REPLACE}) + _queues.create(2, {REPLACE}, -1) """), ) self.assertEqual(stdout, '') @@ -67,13 +68,13 @@ def test_not_destroyed(self): def test_bind_release(self): with self.subTest('typical'): - qid = _queues.create(2, 0, REPLACE) + qid = _queues.create(2, REPLACE, -1) _queues.bind(qid) _queues.release(qid) self.assertEqual(get_num_queues(), 0) with self.subTest('bind too much'): - qid = _queues.create(2, 0, REPLACE) + qid = _queues.create(2, REPLACE, -1) _queues.bind(qid) _queues.bind(qid) _queues.release(qid) @@ -81,7 +82,7 @@ def test_bind_release(self): self.assertEqual(get_num_queues(), 0) with self.subTest('nested'): - qid = _queues.create(2, 0, REPLACE) + qid = _queues.create(2, REPLACE, -1) _queues.bind(qid) _queues.bind(qid) _queues.release(qid) @@ -89,7 +90,7 @@ def test_bind_release(self): self.assertEqual(get_num_queues(), 0) with self.subTest('release without binding'): - qid = _queues.create(2, 0, REPLACE) + qid = _queues.create(2, REPLACE, -1) with self.assertRaises(queues.QueueError): _queues.release(qid) @@ -132,13 +133,13 @@ def test_shareable(self): with self.subTest('same interpreter'): queue2 = queues.create() - queue1.put(queue2, syncobj=True) + queue1.put(queue2) queue3 = queue1.get() self.assertIs(queue3, queue2) with self.subTest('from current interpreter'): queue4 = queues.create() - queue1.put(queue4, syncobj=True) + queue1.put(queue4) out = _run_output(interp, dedent(""" queue4 = queue1.get() print(queue4.id) @@ -149,7 +150,7 @@ def test_shareable(self): with self.subTest('from subinterpreter'): out = _run_output(interp, dedent(""" queue5 = queues.create() - queue1.put(queue5, syncobj=True) + queue1.put(queue5) print(queue5.id) """)) qid = int(out) @@ -198,7 +199,7 @@ class TestQueueOps(TestBase): def test_empty(self): queue = queues.create() before = queue.empty() - queue.put(None, syncobj=True) + queue.put(None) during = queue.empty() queue.get() after = queue.empty() @@ -213,7 +214,7 @@ def test_full(self): queue = queues.create(3) for _ in range(3): actual.append(queue.full()) - queue.put(None, syncobj=True) + queue.put(None) actual.append(queue.full()) for _ in range(3): queue.get() @@ -227,16 +228,16 @@ def test_qsize(self): queue = queues.create() for _ in range(3): actual.append(queue.qsize()) - queue.put(None, syncobj=True) + queue.put(None) actual.append(queue.qsize()) queue.get() actual.append(queue.qsize()) - queue.put(None, syncobj=True) + queue.put(None) actual.append(queue.qsize()) for _ in range(3): queue.get() actual.append(queue.qsize()) - queue.put(None, syncobj=True) + queue.put(None) actual.append(queue.qsize()) queue.get() actual.append(queue.qsize()) @@ -245,70 +246,32 @@ def test_qsize(self): def test_put_get_main(self): expected = list(range(20)) - for syncobj in (True, False): - kwds = dict(syncobj=syncobj) - with self.subTest(f'syncobj={syncobj}'): - queue = queues.create() - for i in range(20): - queue.put(i, **kwds) - actual = [queue.get() for _ in range(20)] + queue = queues.create() + for i in range(20): + queue.put(i) + actual = [queue.get() for _ in range(20)] - self.assertEqual(actual, expected) + self.assertEqual(actual, expected) def test_put_timeout(self): - for syncobj in (True, False): - kwds = dict(syncobj=syncobj) - with self.subTest(f'syncobj={syncobj}'): - queue = queues.create(2) - queue.put(None, **kwds) - queue.put(None, **kwds) - with self.assertRaises(queues.QueueFull): - queue.put(None, timeout=0.1, **kwds) - queue.get() - queue.put(None, **kwds) + queue = queues.create(2) + queue.put(None) + queue.put(None) + with self.assertRaises(queues.QueueFull): + queue.put(None, timeout=0.1) + queue.get() + queue.put(None) def test_put_nowait(self): - for syncobj in (True, False): - kwds = dict(syncobj=syncobj) - with self.subTest(f'syncobj={syncobj}'): - queue = queues.create(2) - queue.put_nowait(None, **kwds) - queue.put_nowait(None, **kwds) - with self.assertRaises(queues.QueueFull): - queue.put_nowait(None, **kwds) - queue.get() - queue.put_nowait(None, **kwds) - - def test_put_syncobj(self): - for obj in [ - None, - True, - 10, - 'spam', - b'spam', - (0, 'a'), - ]: - with self.subTest(repr(obj)): - queue = queues.create() - - queue.put(obj, syncobj=True) - obj2 = queue.get() - self.assertEqual(obj2, obj) - - queue.put(obj, syncobj=True) - obj2 = queue.get_nowait() - self.assertEqual(obj2, obj) - - for obj in [ - [1, 2, 3], - {'a': 13, 'b': 17}, - ]: - with self.subTest(repr(obj)): - queue = queues.create() - with self.assertRaises(interpreters.NotShareableError): - queue.put(obj, syncobj=True) + queue = queues.create(2) + queue.put_nowait(None) + queue.put_nowait(None) + with self.assertRaises(queues.QueueFull): + queue.put_nowait(None) + queue.get() + queue.put_nowait(None) - def test_put_not_syncobj(self): + def test_put_full_fallback(self): for obj in [ None, True, @@ -323,11 +286,11 @@ def test_put_not_syncobj(self): with self.subTest(repr(obj)): queue = queues.create() - queue.put(obj, syncobj=False) + queue.put(obj) obj2 = queue.get() self.assertEqual(obj2, obj) - queue.put(obj, syncobj=False) + queue.put(obj) obj2 = queue.get_nowait() self.assertEqual(obj2, obj) @@ -341,24 +304,9 @@ def test_get_nowait(self): with self.assertRaises(queues.QueueEmpty): queue.get_nowait() - def test_put_get_default_syncobj(self): + def test_put_get_full_fallback(self): expected = list(range(20)) - queue = queues.create(syncobj=True) - for methname in ('get', 'get_nowait'): - with self.subTest(f'{methname}()'): - get = getattr(queue, methname) - for i in range(20): - queue.put(i) - actual = [get() for _ in range(20)] - self.assertEqual(actual, expected) - - obj = [1, 2, 3] # lists are not shareable - with self.assertRaises(interpreters.NotShareableError): - queue.put(obj) - - def test_put_get_default_not_syncobj(self): - expected = list(range(20)) - queue = queues.create(syncobj=False) + queue = queues.create() for methname in ('get', 'get_nowait'): with self.subTest(f'{methname}()'): get = getattr(queue, methname) @@ -384,7 +332,7 @@ def test_put_get_same_interpreter(self): with self.subTest(f'{methname}()'): interp.exec(dedent(f""" orig = b'spam' - queue.put(orig, syncobj=True) + queue.put(orig) obj = queue.{methname}() assert obj == orig, 'expected: obj == orig' assert obj is not orig, 'expected: obj is not orig' @@ -399,7 +347,7 @@ def test_put_get_different_interpreters(self): for methname in ('get', 'get_nowait'): with self.subTest(f'{methname}()'): obj1 = b'spam' - queue1.put(obj1, syncobj=True) + queue1.put(obj1) out = _run_output( interp, @@ -416,7 +364,7 @@ def test_put_get_different_interpreters(self): obj2 = b'eggs' print(id(obj2)) assert queue2.qsize() == 0, 'expected: queue2.qsize() == 0' - queue2.put(obj2, syncobj=True) + queue2.put(obj2) assert queue2.qsize() == 1, 'expected: queue2.qsize() == 1' """)) self.assertEqual(len(queues.list_all()), 2) @@ -433,11 +381,11 @@ def common(queue, unbound=None, presize=0): if not unbound: extraargs = '' elif unbound is queues.UNBOUND: - extraargs = ', unbound=queues.UNBOUND' + extraargs = ', unbounditems=queues.UNBOUND' elif unbound is queues.UNBOUND_ERROR: - extraargs = ', unbound=queues.UNBOUND_ERROR' + extraargs = ', unbounditems=queues.UNBOUND_ERROR' elif unbound is queues.UNBOUND_REMOVE: - extraargs = ', unbound=queues.UNBOUND_REMOVE' + extraargs = ', unbounditems=queues.UNBOUND_REMOVE' else: raise NotImplementedError(repr(unbound)) interp = interpreters.create() @@ -447,8 +395,8 @@ def common(queue, unbound=None, presize=0): queue = queues.Queue({queue.id}) obj1 = b'spam' obj2 = b'eggs' - queue.put(obj1, syncobj=True{extraargs}) - queue.put(obj2, syncobj=True{extraargs}) + queue.put(obj1{extraargs}) + queue.put(obj2{extraargs}) """)) self.assertEqual(queue.qsize(), presize + 2) @@ -501,11 +449,11 @@ def common(queue, unbound=None, presize=0): with self.assertRaises(queues.QueueEmpty): queue.get_nowait() - queue.put(b'ham', unbound=queues.UNBOUND_REMOVE) + queue.put(b'ham', unbounditems=queues.UNBOUND_REMOVE) self.assertEqual(queue.qsize(), 1) interp = common(queue, queues.UNBOUND_REMOVE, 1) self.assertEqual(queue.qsize(), 3) - queue.put(42, unbound=queues.UNBOUND_REMOVE) + queue.put(42, unbounditems=queues.UNBOUND_REMOVE) self.assertEqual(queue.qsize(), 4) del interp self.assertEqual(queue.qsize(), 2) @@ -523,11 +471,11 @@ def test_put_cleared_with_subinterpreter_mixed(self): _run_output(interp, dedent(f""" from test.support.interpreters import queues queue = queues.Queue({queue.id}) - queue.put(1, syncobj=True, unbound=queues.UNBOUND) - queue.put(2, syncobj=True, unbound=queues.UNBOUND_ERROR) - queue.put(3, syncobj=True) - queue.put(4, syncobj=True, unbound=queues.UNBOUND_REMOVE) - queue.put(5, syncobj=True, unbound=queues.UNBOUND) + queue.put(1, unbounditems=queues.UNBOUND) + queue.put(2, unbounditems=queues.UNBOUND_ERROR) + queue.put(3) + queue.put(4, unbounditems=queues.UNBOUND_REMOVE) + queue.put(5, unbounditems=queues.UNBOUND) """)) self.assertEqual(queue.qsize(), 5) @@ -555,13 +503,13 @@ def test_put_cleared_with_subinterpreter_multiple(self): interp1 = interpreters.create() interp2 = interpreters.create() - queue.put(1, syncobj=True) + queue.put(1) _run_output(interp1, dedent(f""" from test.support.interpreters import queues queue = queues.Queue({queue.id}) obj1 = queue.get() - queue.put(2, syncobj=True, unbound=queues.UNBOUND) - queue.put(obj1, syncobj=True, unbound=queues.UNBOUND_REMOVE) + queue.put(2, unbounditems=queues.UNBOUND) + queue.put(obj1, unbounditems=queues.UNBOUND_REMOVE) """)) _run_output(interp2, dedent(f""" from test.support.interpreters import queues @@ -572,21 +520,21 @@ def test_put_cleared_with_subinterpreter_multiple(self): self.assertEqual(queue.qsize(), 0) queue.put(3) _run_output(interp1, dedent(""" - queue.put(4, syncobj=True, unbound=queues.UNBOUND) + queue.put(4, unbounditems=queues.UNBOUND) # interp closed here - queue.put(5, syncobj=True, unbound=queues.UNBOUND_REMOVE) - queue.put(6, syncobj=True, unbound=queues.UNBOUND) + queue.put(5, unbounditems=queues.UNBOUND_REMOVE) + queue.put(6, unbounditems=queues.UNBOUND) """)) _run_output(interp2, dedent(""" - queue.put(7, syncobj=True, unbound=queues.UNBOUND_ERROR) + queue.put(7, unbounditems=queues.UNBOUND_ERROR) # interp closed here - queue.put(obj1, syncobj=True, unbound=queues.UNBOUND_ERROR) - queue.put(obj2, syncobj=True, unbound=queues.UNBOUND_REMOVE) - queue.put(8, syncobj=True, unbound=queues.UNBOUND) + queue.put(obj1, unbounditems=queues.UNBOUND_ERROR) + queue.put(obj2, unbounditems=queues.UNBOUND_REMOVE) + queue.put(8, unbounditems=queues.UNBOUND) """)) _run_output(interp1, dedent(""" - queue.put(9, syncobj=True, unbound=queues.UNBOUND_REMOVE) - queue.put(10, syncobj=True, unbound=queues.UNBOUND) + queue.put(9, unbounditems=queues.UNBOUND_REMOVE) + queue.put(10, unbounditems=queues.UNBOUND) """)) self.assertEqual(queue.qsize(), 10) @@ -642,12 +590,12 @@ def f(): break except queues.QueueEmpty: continue - queue2.put(obj, syncobj=True) + queue2.put(obj) t = threading.Thread(target=f) t.start() orig = b'spam' - queue1.put(orig, syncobj=True) + queue1.put(orig) obj = queue2.get() t.join() diff --git a/Modules/_interpchannelsmodule.c b/Modules/_interpchannelsmodule.c index f9fa1dab291056..0ab553190001bd 100644 --- a/Modules/_interpchannelsmodule.c +++ b/Modules/_interpchannelsmodule.c @@ -20,9 +20,11 @@ #endif #define REGISTERS_HEAP_TYPES +#define HAS_FALLBACK #define HAS_UNBOUND_ITEMS #include "_interpreters_common.h" #undef HAS_UNBOUND_ITEMS +#undef HAS_FALLBACK #undef REGISTERS_HEAP_TYPES @@ -523,7 +525,7 @@ typedef struct _channelitem { int64_t interpid; _PyXIData_t *data; _waiting_t *waiting; - int unboundop; + unboundop_t unboundop; struct _channelitem *next; } _channelitem; @@ -536,7 +538,7 @@ _channelitem_ID(_channelitem *item) static void _channelitem_init(_channelitem *item, int64_t interpid, _PyXIData_t *data, - _waiting_t *waiting, int unboundop) + _waiting_t *waiting, unboundop_t unboundop) { if (interpid < 0) { interpid = _get_interpid(data); @@ -583,7 +585,7 @@ _channelitem_clear(_channelitem *item) static _channelitem * _channelitem_new(int64_t interpid, _PyXIData_t *data, - _waiting_t *waiting, int unboundop) + _waiting_t *waiting, unboundop_t unboundop) { _channelitem *item = GLOBAL_MALLOC(_channelitem); if (item == NULL) { @@ -694,7 +696,7 @@ _channelqueue_free(_channelqueue *queue) static int _channelqueue_put(_channelqueue *queue, int64_t interpid, _PyXIData_t *data, - _waiting_t *waiting, int unboundop) + _waiting_t *waiting, unboundop_t unboundop) { _channelitem *item = _channelitem_new(interpid, data, waiting, unboundop); if (item == NULL) { @@ -798,7 +800,7 @@ _channelqueue_remove(_channelqueue *queue, _channelitem_id_t itemid, } queue->count -= 1; - int unboundop; + unboundop_t unboundop; _channelitem_popped(item, p_data, p_waiting, &unboundop); } @@ -1083,16 +1085,18 @@ typedef struct _channel { PyThread_type_lock mutex; _channelqueue *queue; _channelends *ends; - struct { - int unboundop; + struct _channeldefaults { + unboundop_t unboundop; + xidata_fallback_t fallback; } defaults; int open; struct _channel_closing *closing; } _channel_state; static _channel_state * -_channel_new(PyThread_type_lock mutex, int unboundop) +_channel_new(PyThread_type_lock mutex, struct _channeldefaults defaults) { + assert(check_unbound(defaults.unboundop)); _channel_state *chan = GLOBAL_MALLOC(_channel_state); if (chan == NULL) { return NULL; @@ -1109,7 +1113,7 @@ _channel_new(PyThread_type_lock mutex, int unboundop) GLOBAL_FREE(chan); return NULL; } - chan->defaults.unboundop = unboundop; + chan->defaults = defaults; chan->open = 1; chan->closing = NULL; return chan; @@ -1130,7 +1134,7 @@ _channel_free(_channel_state *chan) static int _channel_add(_channel_state *chan, int64_t interpid, - _PyXIData_t *data, _waiting_t *waiting, int unboundop) + _PyXIData_t *data, _waiting_t *waiting, unboundop_t unboundop) { int res = -1; PyThread_acquire_lock(chan->mutex, WAIT_LOCK); @@ -1611,7 +1615,7 @@ _channels_release_cid_object(_channels *channels, int64_t cid) struct channel_id_and_info { int64_t id; - int unboundop; + struct _channeldefaults defaults; }; static struct channel_id_and_info * @@ -1628,7 +1632,7 @@ _channels_list_all(_channels *channels, int64_t *count) for (int64_t i=0; ref != NULL; ref = ref->next, i++) { ids[i] = (struct channel_id_and_info){ .id = ref->cid, - .unboundop = ref->chan->defaults.unboundop, + .defaults = ref->chan->defaults, }; } *count = channels->numopen; @@ -1714,13 +1718,13 @@ _channel_finish_closing(_channel_state *chan) { // Create a new channel. static int64_t -channel_create(_channels *channels, int unboundop) +channel_create(_channels *channels, struct _channeldefaults defaults) { PyThread_type_lock mutex = PyThread_allocate_lock(); if (mutex == NULL) { return ERR_CHANNEL_MUTEX_INIT; } - _channel_state *chan = _channel_new(mutex, unboundop); + _channel_state *chan = _channel_new(mutex, defaults); if (chan == NULL) { PyThread_free_lock(mutex); return -1; @@ -1752,7 +1756,7 @@ channel_destroy(_channels *channels, int64_t cid) // Optionally request to be notified when it is received. static int channel_send(_channels *channels, int64_t cid, PyObject *obj, - _waiting_t *waiting, int unboundop) + _waiting_t *waiting, unboundop_t unboundop, xidata_fallback_t fallback) { PyThreadState *tstate = _PyThreadState_GET(); PyInterpreterState *interp = tstate->interp; @@ -1779,7 +1783,7 @@ channel_send(_channels *channels, int64_t cid, PyObject *obj, PyThread_release_lock(mutex); return -1; } - if (_PyObject_GetXIDataNoFallback(tstate, obj, data) != 0) { + if (_PyObject_GetXIData(tstate, obj, fallback, data) != 0) { PyThread_release_lock(mutex); GLOBAL_FREE(data); return -1; @@ -1823,7 +1827,8 @@ channel_clear_sent(_channels *channels, int64_t cid, _waiting_t *waiting) // Like channel_send(), but strictly wait for the object to be received. static int channel_send_wait(_channels *channels, int64_t cid, PyObject *obj, - int unboundop, PY_TIMEOUT_T timeout) + unboundop_t unboundop, PY_TIMEOUT_T timeout, + xidata_fallback_t fallback) { // We use a stack variable here, so we must ensure that &waiting // is not held by any channel item at the point this function exits. @@ -1834,7 +1839,7 @@ channel_send_wait(_channels *channels, int64_t cid, PyObject *obj, } /* Queue up the object. */ - int res = channel_send(channels, cid, obj, &waiting, unboundop); + int res = channel_send(channels, cid, obj, &waiting, unboundop, fallback); if (res < 0) { assert(waiting.status == WAITING_NO_STATUS); goto finally; @@ -2005,6 +2010,20 @@ channel_is_associated(_channels *channels, int64_t cid, int64_t interpid, return (end != NULL && end->open); } +static int +channel_get_defaults(_channels *channels, int64_t cid, struct _channeldefaults *defaults) +{ + PyThread_type_lock mutex = NULL; + _channel_state *channel = NULL; + int err = _channels_lookup(channels, cid, &mutex, &channel); + if (err != 0) { + return err; + } + *defaults = channel->defaults; + PyThread_release_lock(mutex); + return 0; +} + static int _channel_get_count(_channels *channels, int64_t cid, Py_ssize_t *p_count) { @@ -2881,20 +2900,27 @@ clear_interpreter(void *data) static PyObject * channelsmod_create(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"unboundop", NULL}; - int unboundop; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "i:create", kwlist, - &unboundop)) + static char *kwlist[] = {"unboundop", "fallback", NULL}; + int unboundarg = -1; + int fallbackarg = -1; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:create", kwlist, + &unboundarg, &fallbackarg)) { return NULL; } - if (!check_unbound(unboundop)) { - PyErr_Format(PyExc_ValueError, - "unsupported unboundop %d", unboundop); + struct _channeldefaults defaults = {0}; + if (resolve_unboundop(unboundarg, UNBOUND_REPLACE, + &defaults.unboundop) < 0) + { + return NULL; + } + if (resolve_fallback(fallbackarg, _PyXIDATA_FULL_FALLBACK, + &defaults.fallback) < 0) + { return NULL; } - int64_t cid = channel_create(&_globals.channels, unboundop); + int64_t cid = channel_create(&_globals.channels, defaults); if (cid < 0) { (void)handle_channel_error(-1, self, cid); return NULL; @@ -2987,7 +3013,9 @@ channelsmod_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) } assert(cidobj != NULL); - PyObject *item = Py_BuildValue("Oi", cidobj, cur->unboundop); + PyObject *item = Py_BuildValue("Oii", cidobj, + cur->defaults.unboundop, + cur->defaults.fallback); Py_DECREF(cidobj); if (item == NULL) { Py_SETREF(ids, NULL); @@ -3075,40 +3103,54 @@ receive end."); static PyObject * channelsmod_send(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"cid", "obj", "unboundop", "blocking", "timeout", - NULL}; + static char *kwlist[] = {"cid", "obj", "unboundop", "fallback", + "blocking", "timeout", NULL}; struct channel_id_converter_data cid_data = { .module = self, }; PyObject *obj; - int unboundop = UNBOUND_REPLACE; + int unboundarg = -1; + int fallbackarg = -1; int blocking = 1; PyObject *timeout_obj = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O|i$pO:channel_send", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, + "O&O|ii$pO:channel_send", kwlist, channel_id_converter, &cid_data, &obj, - &unboundop, &blocking, &timeout_obj)) + &unboundarg, &fallbackarg, + &blocking, &timeout_obj)) { return NULL; } - if (!check_unbound(unboundop)) { - PyErr_Format(PyExc_ValueError, - "unsupported unboundop %d", unboundop); - return NULL; - } - int64_t cid = cid_data.cid; PY_TIMEOUT_T timeout; if (PyThread_ParseTimeoutArg(timeout_obj, blocking, &timeout) < 0) { return NULL; } + struct _channeldefaults defaults = {-1, -1}; + if (unboundarg < 0 || fallbackarg < 0) { + int err = channel_get_defaults(&_globals.channels, cid, &defaults); + if (handle_channel_error(err, self, cid)) { + return NULL; + } + } + unboundop_t unboundop; + if (resolve_unboundop(unboundarg, defaults.unboundop, &unboundop) < 0) { + return NULL; + } + xidata_fallback_t fallback; + if (resolve_fallback(fallbackarg, defaults.fallback, &fallback) < 0) { + return NULL; + } /* Queue up the object. */ int err = 0; if (blocking) { - err = channel_send_wait(&_globals.channels, cid, obj, unboundop, timeout); + err = channel_send_wait( + &_globals.channels, cid, obj, unboundop, timeout, fallback); } else { - err = channel_send(&_globals.channels, cid, obj, NULL, unboundop); + err = channel_send( + &_globals.channels, cid, obj, NULL, unboundop, fallback); } if (handle_channel_error(err, self, cid)) { return NULL; @@ -3126,32 +3168,44 @@ By default this waits for the object to be received."); static PyObject * channelsmod_send_buffer(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"cid", "obj", "unboundop", "blocking", "timeout", - NULL}; + static char *kwlist[] = {"cid", "obj", "unboundop", "fallback", + "blocking", "timeout", NULL}; struct channel_id_converter_data cid_data = { .module = self, }; PyObject *obj; - int unboundop = UNBOUND_REPLACE; - int blocking = 1; + int unboundarg = -1; + int fallbackarg = -1; + int blocking = -1; PyObject *timeout_obj = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "O&O|i$pO:channel_send_buffer", kwlist, + "O&O|ii$pO:channel_send_buffer", kwlist, channel_id_converter, &cid_data, &obj, - &unboundop, &blocking, &timeout_obj)) { - return NULL; - } - if (!check_unbound(unboundop)) { - PyErr_Format(PyExc_ValueError, - "unsupported unboundop %d", unboundop); + &unboundarg, &fallbackarg, + &blocking, &timeout_obj)) + { return NULL; } - int64_t cid = cid_data.cid; PY_TIMEOUT_T timeout; if (PyThread_ParseTimeoutArg(timeout_obj, blocking, &timeout) < 0) { return NULL; } + struct _channeldefaults defaults = {-1, -1}; + if (unboundarg < 0 || fallbackarg < 0) { + int err = channel_get_defaults(&_globals.channels, cid, &defaults); + if (handle_channel_error(err, self, cid)) { + return NULL; + } + } + unboundop_t unboundop; + if (resolve_unboundop(unboundarg, defaults.unboundop, &unboundop) < 0) { + return NULL; + } + xidata_fallback_t fallback; + if (resolve_fallback(fallbackarg, defaults.fallback, &fallback) < 0) { + return NULL; + } PyObject *tempobj = PyMemoryView_FromObject(obj); if (tempobj == NULL) { @@ -3162,10 +3216,11 @@ channelsmod_send_buffer(PyObject *self, PyObject *args, PyObject *kwds) int err = 0; if (blocking) { err = channel_send_wait( - &_globals.channels, cid, tempobj, unboundop, timeout); + &_globals.channels, cid, tempobj, unboundop, timeout, fallback); } else { - err = channel_send(&_globals.channels, cid, tempobj, NULL, unboundop); + err = channel_send( + &_globals.channels, cid, tempobj, NULL, unboundop, fallback); } Py_DECREF(tempobj); if (handle_channel_error(err, self, cid)) { @@ -3197,7 +3252,7 @@ channelsmod_recv(PyObject *self, PyObject *args, PyObject *kwds) cid = cid_data.cid; PyObject *obj = NULL; - int unboundop = 0; + unboundop_t unboundop = 0; int err = channel_recv(&_globals.channels, cid, &obj, &unboundop); if (err == ERR_CHANNEL_EMPTY && dflt != NULL) { // Use the default. @@ -3388,17 +3443,14 @@ channelsmod_get_channel_defaults(PyObject *self, PyObject *args, PyObject *kwds) } int64_t cid = cid_data.cid; - PyThread_type_lock mutex = NULL; - _channel_state *channel = NULL; - int err = _channels_lookup(&_globals.channels, cid, &mutex, &channel); + struct _channeldefaults defaults; + int err = channel_get_defaults(&_globals.channels, cid, &defaults); if (handle_channel_error(err, self, cid)) { return NULL; } - int unboundop = channel->defaults.unboundop; - PyThread_release_lock(mutex); - PyObject *defaults = Py_BuildValue("i", unboundop); - return defaults; + PyObject *res = Py_BuildValue("ii", defaults.unboundop, defaults.fallback); + return res; } PyDoc_STRVAR(channelsmod_get_channel_defaults_doc, diff --git a/Modules/_interpqueuesmodule.c b/Modules/_interpqueuesmodule.c index 209fcdfd0cd01e..816285c9eff44a 100644 --- a/Modules/_interpqueuesmodule.c +++ b/Modules/_interpqueuesmodule.c @@ -9,9 +9,11 @@ #include "pycore_crossinterp.h" // _PyXIData_t #define REGISTERS_HEAP_TYPES +#define HAS_FALLBACK #define HAS_UNBOUND_ITEMS #include "_interpreters_common.h" #undef HAS_UNBOUND_ITEMS +#undef HAS_FALLBACK #undef REGISTERS_HEAP_TYPES @@ -401,14 +403,13 @@ typedef struct _queueitem { meaning the interpreter has been destroyed. */ int64_t interpid; _PyXIData_t *data; - int fmt; - int unboundop; + unboundop_t unboundop; struct _queueitem *next; } _queueitem; static void _queueitem_init(_queueitem *item, - int64_t interpid, _PyXIData_t *data, int fmt, int unboundop) + int64_t interpid, _PyXIData_t *data, unboundop_t unboundop) { if (interpid < 0) { interpid = _get_interpid(data); @@ -422,7 +423,6 @@ _queueitem_init(_queueitem *item, *item = (_queueitem){ .interpid = interpid, .data = data, - .fmt = fmt, .unboundop = unboundop, }; } @@ -446,14 +446,14 @@ _queueitem_clear(_queueitem *item) } static _queueitem * -_queueitem_new(int64_t interpid, _PyXIData_t *data, int fmt, int unboundop) +_queueitem_new(int64_t interpid, _PyXIData_t *data, int unboundop) { _queueitem *item = GLOBAL_MALLOC(_queueitem); if (item == NULL) { PyErr_NoMemory(); return NULL; } - _queueitem_init(item, interpid, data, fmt, unboundop); + _queueitem_init(item, interpid, data, unboundop); return item; } @@ -476,10 +476,9 @@ _queueitem_free_all(_queueitem *item) static void _queueitem_popped(_queueitem *item, - _PyXIData_t **p_data, int *p_fmt, int *p_unboundop) + _PyXIData_t **p_data, unboundop_t *p_unboundop) { *p_data = item->data; - *p_fmt = item->fmt; *p_unboundop = item->unboundop; // We clear them here, so they won't be released in _queueitem_clear(). item->data = NULL; @@ -527,16 +526,16 @@ typedef struct _queue { _queueitem *first; _queueitem *last; } items; - struct { - int fmt; + struct _queuedefaults { + xidata_fallback_t fallback; int unboundop; } defaults; } _queue; static int -_queue_init(_queue *queue, Py_ssize_t maxsize, int fmt, int unboundop) +_queue_init(_queue *queue, Py_ssize_t maxsize, struct _queuedefaults defaults) { - assert(check_unbound(unboundop)); + assert(check_unbound(defaults.unboundop)); PyThread_type_lock mutex = PyThread_allocate_lock(); if (mutex == NULL) { return ERR_QUEUE_ALLOC; @@ -547,10 +546,7 @@ _queue_init(_queue *queue, Py_ssize_t maxsize, int fmt, int unboundop) .items = { .maxsize = maxsize, }, - .defaults = { - .fmt = fmt, - .unboundop = unboundop, - }, + .defaults = defaults, }; return 0; } @@ -631,8 +627,7 @@ _queue_unlock(_queue *queue) } static int -_queue_add(_queue *queue, int64_t interpid, _PyXIData_t *data, - int fmt, int unboundop) +_queue_add(_queue *queue, int64_t interpid, _PyXIData_t *data, int unboundop) { int err = _queue_lock(queue); if (err < 0) { @@ -648,7 +643,7 @@ _queue_add(_queue *queue, int64_t interpid, _PyXIData_t *data, return ERR_QUEUE_FULL; } - _queueitem *item = _queueitem_new(interpid, data, fmt, unboundop); + _queueitem *item = _queueitem_new(interpid, data, unboundop); if (item == NULL) { _queue_unlock(queue); return -1; @@ -668,8 +663,7 @@ _queue_add(_queue *queue, int64_t interpid, _PyXIData_t *data, } static int -_queue_next(_queue *queue, - _PyXIData_t **p_data, int *p_fmt, int *p_unboundop) +_queue_next(_queue *queue, _PyXIData_t **p_data, int *p_unboundop) { int err = _queue_lock(queue); if (err < 0) { @@ -688,7 +682,7 @@ _queue_next(_queue *queue, } queue->items.count -= 1; - _queueitem_popped(item, p_data, p_fmt, p_unboundop); + _queueitem_popped(item, p_data, p_unboundop); _queue_unlock(queue); return 0; @@ -1035,8 +1029,7 @@ _queues_decref(_queues *queues, int64_t qid) struct queue_id_and_info { int64_t id; - int fmt; - int unboundop; + struct _queuedefaults defaults; }; static struct queue_id_and_info * @@ -1053,8 +1046,7 @@ _queues_list_all(_queues *queues, int64_t *p_count) for (int64_t i=0; ref != NULL; ref = ref->next, i++) { ids[i].id = ref->qid; assert(ref->queue != NULL); - ids[i].fmt = ref->queue->defaults.fmt; - ids[i].unboundop = ref->queue->defaults.unboundop; + ids[i].defaults = ref->queue->defaults; } *p_count = queues->count; @@ -1090,13 +1082,14 @@ _queue_free(_queue *queue) // Create a new queue. static int64_t -queue_create(_queues *queues, Py_ssize_t maxsize, int fmt, int unboundop) +queue_create(_queues *queues, Py_ssize_t maxsize, + struct _queuedefaults defaults) { _queue *queue = GLOBAL_MALLOC(_queue); if (queue == NULL) { return ERR_QUEUE_ALLOC; } - int err = _queue_init(queue, maxsize, fmt, unboundop); + int err = _queue_init(queue, maxsize, defaults); if (err < 0) { GLOBAL_FREE(queue); return (int64_t)err; @@ -1125,7 +1118,8 @@ queue_destroy(_queues *queues, int64_t qid) // Push an object onto the queue. static int -queue_put(_queues *queues, int64_t qid, PyObject *obj, int fmt, int unboundop) +queue_put(_queues *queues, int64_t qid, PyObject *obj, unboundop_t unboundop, + xidata_fallback_t fallback) { PyThreadState *tstate = PyThreadState_Get(); @@ -1138,27 +1132,27 @@ queue_put(_queues *queues, int64_t qid, PyObject *obj, int fmt, int unboundop) assert(queue != NULL); // Convert the object to cross-interpreter data. - _PyXIData_t *data = _PyXIData_New(); - if (data == NULL) { + _PyXIData_t *xidata = _PyXIData_New(); + if (xidata == NULL) { _queue_unmark_waiter(queue, queues->mutex); return -1; } - if (_PyObject_GetXIDataNoFallback(tstate, obj, data) != 0) { + if (_PyObject_GetXIData(tstate, obj, fallback, xidata) != 0) { _queue_unmark_waiter(queue, queues->mutex); - GLOBAL_FREE(data); + GLOBAL_FREE(xidata); return -1; } - assert(_PyXIData_INTERPID(data) == + assert(_PyXIData_INTERPID(xidata) == PyInterpreterState_GetID(tstate->interp)); // Add the data to the queue. int64_t interpid = -1; // _queueitem_init() will set it. - int res = _queue_add(queue, interpid, data, fmt, unboundop); + int res = _queue_add(queue, interpid, xidata, unboundop); _queue_unmark_waiter(queue, queues->mutex); if (res != 0) { // We may chain an exception here: - (void)_release_xid_data(data, 0); - GLOBAL_FREE(data); + (void)_release_xid_data(xidata, 0); + GLOBAL_FREE(xidata); return res; } @@ -1169,7 +1163,7 @@ queue_put(_queues *queues, int64_t qid, PyObject *obj, int fmt, int unboundop) // XXX Support a "wait" mutex? static int queue_get(_queues *queues, int64_t qid, - PyObject **res, int *p_fmt, int *p_unboundop) + PyObject **res, int *p_unboundop) { int err; *res = NULL; @@ -1185,7 +1179,7 @@ queue_get(_queues *queues, int64_t qid, // Pop off the next item from the queue. _PyXIData_t *data = NULL; - err = _queue_next(queue, &data, p_fmt, p_unboundop); + err = _queue_next(queue, &data, p_unboundop); _queue_unmark_waiter(queue, queues->mutex); if (err != 0) { return err; @@ -1216,6 +1210,20 @@ queue_get(_queues *queues, int64_t qid, return 0; } +static int +queue_get_defaults(_queues *queues, int64_t qid, + struct _queuedefaults *p_defaults) +{ + _queue *queue = NULL; + int err = _queues_lookup(queues, qid, &queue); + if (err != 0) { + return err; + } + *p_defaults = queue->defaults; + _queue_unmark_waiter(queue, queues->mutex); + return 0; +} + static int queue_get_maxsize(_queues *queues, int64_t qid, Py_ssize_t *p_maxsize) { @@ -1474,22 +1482,28 @@ qidarg_converter(PyObject *arg, void *ptr) static PyObject * queuesmod_create(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"maxsize", "fmt", "unboundop", NULL}; + static char *kwlist[] = {"maxsize", "unboundop", "fallback", NULL}; Py_ssize_t maxsize; - int fmt; - int unboundop; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "nii:create", kwlist, - &maxsize, &fmt, &unboundop)) + int unboundarg = -1; + int fallbackarg = -1; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "n|ii:create", kwlist, + &maxsize, &unboundarg, &fallbackarg)) { return NULL; } - if (!check_unbound(unboundop)) { - PyErr_Format(PyExc_ValueError, - "unsupported unboundop %d", unboundop); + struct _queuedefaults defaults = {0}; + if (resolve_unboundop(unboundarg, UNBOUND_REPLACE, + &defaults.unboundop) < 0) + { + return NULL; + } + if (resolve_fallback(fallbackarg, _PyXIDATA_FULL_FALLBACK, + &defaults.fallback) < 0) + { return NULL; } - int64_t qid = queue_create(&_globals.queues, maxsize, fmt, unboundop); + int64_t qid = queue_create(&_globals.queues, maxsize, defaults); if (qid < 0) { (void)handle_queue_error((int)qid, self, qid); return NULL; @@ -1511,7 +1525,7 @@ queuesmod_create(PyObject *self, PyObject *args, PyObject *kwds) } PyDoc_STRVAR(queuesmod_create_doc, -"create(maxsize, fmt, unboundop) -> qid\n\ +"create(maxsize, unboundop, fallback) -> qid\n\ \n\ Create a new cross-interpreter queue and return its unique generated ID.\n\ It is a new reference as though bind() had been called on the queue.\n\ @@ -1560,8 +1574,9 @@ queuesmod_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) } struct queue_id_and_info *cur = qids; for (int64_t i=0; i < count; cur++, i++) { - PyObject *item = Py_BuildValue("Lii", cur->id, cur->fmt, - cur->unboundop); + PyObject *item = Py_BuildValue("Lii", cur->id, + cur->defaults.unboundop, + cur->defaults.fallback); if (item == NULL) { Py_SETREF(ids, NULL); break; @@ -1575,34 +1590,44 @@ queuesmod_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) } PyDoc_STRVAR(queuesmod_list_all_doc, -"list_all() -> [(qid, fmt)]\n\ +"list_all() -> [(qid, unboundop, fallback)]\n\ \n\ Return the list of IDs for all queues.\n\ -Each corresponding default format is also included."); +Each corresponding default unbound op and fallback is also included."); static PyObject * queuesmod_put(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"qid", "obj", "fmt", "unboundop", NULL}; + static char *kwlist[] = {"qid", "obj", "unboundop", "fallback", NULL}; qidarg_converter_data qidarg = {0}; PyObject *obj; - int fmt; - int unboundop; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&Oii:put", kwlist, - qidarg_converter, &qidarg, &obj, &fmt, - &unboundop)) + int unboundarg = -1; + int fallbackarg = -1; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O|ii$p:put", kwlist, + qidarg_converter, &qidarg, &obj, + &unboundarg, &fallbackarg)) { return NULL; } int64_t qid = qidarg.id; - if (!check_unbound(unboundop)) { - PyErr_Format(PyExc_ValueError, - "unsupported unboundop %d", unboundop); + struct _queuedefaults defaults = {-1, -1}; + if (unboundarg < 0 || fallbackarg < 0) { + int err = queue_get_defaults(&_globals.queues, qid, &defaults); + if (handle_queue_error(err, self, qid)) { + return NULL; + } + } + unboundop_t unboundop; + if (resolve_unboundop(unboundarg, defaults.unboundop, &unboundop) < 0) { + return NULL; + } + xidata_fallback_t fallback; + if (resolve_fallback(fallbackarg, defaults.fallback, &fallback) < 0) { return NULL; } /* Queue up the object. */ - int err = queue_put(&_globals.queues, qid, obj, fmt, unboundop); + int err = queue_put(&_globals.queues, qid, obj, unboundop, fallback); // This is the only place that raises QueueFull. if (handle_queue_error(err, self, qid)) { return NULL; @@ -1612,7 +1637,7 @@ queuesmod_put(PyObject *self, PyObject *args, PyObject *kwds) } PyDoc_STRVAR(queuesmod_put_doc, -"put(qid, obj, fmt)\n\ +"put(qid, obj)\n\ \n\ Add the object's data to the queue."); @@ -1628,27 +1653,26 @@ queuesmod_get(PyObject *self, PyObject *args, PyObject *kwds) int64_t qid = qidarg.id; PyObject *obj = NULL; - int fmt = 0; int unboundop = 0; - int err = queue_get(&_globals.queues, qid, &obj, &fmt, &unboundop); + int err = queue_get(&_globals.queues, qid, &obj, &unboundop); // This is the only place that raises QueueEmpty. if (handle_queue_error(err, self, qid)) { return NULL; } if (obj == NULL) { - return Py_BuildValue("Oii", Py_None, fmt, unboundop); + return Py_BuildValue("Oi", Py_None, unboundop); } - PyObject *res = Py_BuildValue("OiO", obj, fmt, Py_None); + PyObject *res = Py_BuildValue("OO", obj, Py_None); Py_DECREF(obj); return res; } PyDoc_STRVAR(queuesmod_get_doc, -"get(qid) -> (obj, fmt)\n\ +"get(qid) -> (obj, unboundop)\n\ \n\ Return a new object from the data at the front of the queue.\n\ -The object's format is also returned.\n\ +The unbound op is also returned.\n\ \n\ If there is nothing to receive then raise QueueEmpty."); @@ -1748,17 +1772,14 @@ queuesmod_get_queue_defaults(PyObject *self, PyObject *args, PyObject *kwds) } int64_t qid = qidarg.id; - _queue *queue = NULL; - int err = _queues_lookup(&_globals.queues, qid, &queue); + struct _queuedefaults defaults; + int err = queue_get_defaults(&_globals.queues, qid, &defaults); if (handle_queue_error(err, self, qid)) { return NULL; } - int fmt = queue->defaults.fmt; - int unboundop = queue->defaults.unboundop; - _queue_unmark_waiter(queue, _globals.queues.mutex); - PyObject *defaults = Py_BuildValue("ii", fmt, unboundop); - return defaults; + PyObject *res = Py_BuildValue("ii", defaults.unboundop, defaults.fallback); + return res; } PyDoc_STRVAR(queuesmod_get_queue_defaults_doc, diff --git a/Modules/_interpreters_common.h b/Modules/_interpreters_common.h index d73cbca36359c7..40fd51d752e324 100644 --- a/Modules/_interpreters_common.h +++ b/Modules/_interpreters_common.h @@ -39,10 +39,37 @@ _get_interpid(_PyXIData_t *data) } +#ifdef HAS_FALLBACK +static int +resolve_fallback(int arg, xidata_fallback_t dflt, + xidata_fallback_t *p_fallback) +{ + if (arg < 0) { + *p_fallback = dflt; + return 0; + } + xidata_fallback_t fallback; + if (arg == _PyXIDATA_XIDATA_ONLY) { + fallback =_PyXIDATA_XIDATA_ONLY; + } + else if (arg == _PyXIDATA_FULL_FALLBACK) { + fallback = _PyXIDATA_FULL_FALLBACK; + } + else { + PyErr_Format(PyExc_ValueError, "unsupported fallback %d", arg); + return -1; + } + *p_fallback = fallback; + return 0; +} +#endif + + /* unbound items ************************************************************/ #ifdef HAS_UNBOUND_ITEMS +typedef int unboundop_t; #define UNBOUND_REMOVE 1 #define UNBOUND_ERROR 2 #define UNBOUND_REPLACE 3 @@ -53,6 +80,7 @@ _get_interpid(_PyXIData_t *data) // object is released but the underlying data is copied (with the "raw" // allocator) and used when the item is popped off the queue. +#ifndef NDEBUG static int check_unbound(int unboundop) { @@ -65,5 +93,31 @@ check_unbound(int unboundop) return 0; } } +#endif + +static int +resolve_unboundop(int arg, unboundop_t dflt, unboundop_t *p_unboundop) +{ + if (arg < 0) { + *p_unboundop = dflt; + return 0; + } + unboundop_t op; + if (arg == UNBOUND_REMOVE) { + op = UNBOUND_REMOVE; + } + else if (arg == UNBOUND_ERROR) { + op = UNBOUND_ERROR; + } + else if (arg == UNBOUND_REPLACE) { + op = UNBOUND_REPLACE; + } + else { + PyErr_Format(PyExc_ValueError, "unsupported unboundop %d", arg); + return -1; + } + *p_unboundop = op; + return 0; +} #endif diff --git a/Python/crossinterp.c b/Python/crossinterp.c index dc67de4a40849d..6681b969183925 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -1839,6 +1839,7 @@ _sharednsitem_set_value(_PyXI_namespace_item *item, PyObject *value) return -1; } PyThreadState *tstate = PyThreadState_Get(); + // XXX Use _PyObject_GetXIDataWithFallback()? if (_PyObject_GetXIDataNoFallback(tstate, value, item->xidata) != 0) { PyMem_RawFree(item->xidata); item->xidata = NULL; From 7e7391810fa1e8e378d6073c57914bc79d4e9295 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 15:52:37 +0200 Subject: [PATCH 0200/1674] [3.14] gh-134370: Added clarification on instance annotations (GH-134387) (#134509) gh-134370: Added clarification on instance annotations (GH-134387) Instances of classes cannot have annotations, however sometimes they will erroneously have the __annotations__ attribute (cherry picked from commit bd4046f4f869039a1a2ebe2d1d18bfbc2a2951b6) Co-authored-by: Alex Kautz --- Doc/howto/annotations.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Doc/howto/annotations.rst b/Doc/howto/annotations.rst index 78f3704ba5d000..d7deb6c6bc1768 100644 --- a/Doc/howto/annotations.rst +++ b/Doc/howto/annotations.rst @@ -248,4 +248,9 @@ quirks by using :func:`annotationlib.get_annotations` on Python 3.14+ or :func:`inspect.get_annotations` on Python 3.10+. On earlier versions of Python, you can avoid these bugs by accessing the annotations from the class's :attr:`~type.__dict__` -(e.g., ``cls.__dict__.get('__annotations__', None)``). +(for example, ``cls.__dict__.get('__annotations__', None)``). + +In some versions of Python, instances of classes may have an ``__annotations__`` +attribute. However, this is not supported functionality. If you need the +annotations of an instance, you can use :func:`type` to access its class +(for example, ``annotationlib.get_annotations(type(myinstance))`` on Python 3.14+). From ced49a196f0e1ea06ba892b875f18e7b11ed26b7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 16:14:53 +0200 Subject: [PATCH 0201/1674] [3.14] gh-134323: Fix the new `threading.RLock.locked` method (GH-134368) (#134510) gh-134323: Fix the new `threading.RLock.locked` method (GH-134368) (cherry picked from commit 3effede97cc13fc0c5ab5dcde26cc319f388e84c) Co-authored-by: Duprat Co-authored-by: Kumar Aditya --- Lib/test/lock_tests.py | 18 ++++++++++++++++++ Lib/threading.py | 4 ++-- ...5-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst | 1 + Modules/_threadmodule.c | 10 ++++++++-- 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 009e04e9c0b522..0e8c75ff5c4994 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -365,6 +365,24 @@ def test_locked(self): lock.release() self.assertFalse(lock.locked()) + def test_locked_with_2threads(self): + # see gh-134323: check that a rlock which + # is acquired in a different thread, + # is still locked in the main thread. + result = [] + rlock = self.locktype() + self.assertFalse(rlock.locked()) + def acquire(): + result.append(rlock.locked()) + rlock.acquire() + result.append(rlock.locked()) + + with Bunch(acquire, 1): + pass + self.assertTrue(rlock.locked()) + self.assertFalse(result[0]) + self.assertTrue(result[1]) + def test_release_save_unacquired(self): # Cannot _release_save an unacquired lock lock = self.locktype() diff --git a/Lib/threading.py b/Lib/threading.py index fa290d17c635ab..2a65f9a7aa3028 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -165,7 +165,7 @@ def __repr__(self): except KeyError: pass return "<%s %s.%s object owner=%r count=%d at %s>" % ( - "locked" if self._block.locked() else "unlocked", + "locked" if self.locked() else "unlocked", self.__class__.__module__, self.__class__.__qualname__, owner, @@ -244,7 +244,7 @@ def __exit__(self, t, v, tb): def locked(self): """Return whether this object is locked.""" - return self._count > 0 + return self._block.locked() # Internal methods used by condition variables diff --git a/Misc/NEWS.d/next/Library/2025-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst b/Misc/NEWS.d/next/Library/2025-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst new file mode 100644 index 00000000000000..7982b52f77a172 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst @@ -0,0 +1 @@ +Fix the :meth:`threading.RLock.locked` method. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 9776a32755db68..8bd59fffa66f88 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1011,6 +1011,11 @@ rlock_traverse(PyObject *self, visitproc visit, void *arg) return 0; } +static int +rlock_locked_impl(rlockobject *self) +{ + return PyMutex_IsLocked(&self->lock.mutex); +} static void rlock_dealloc(PyObject *self) @@ -1100,7 +1105,7 @@ static PyObject * rlock_locked(PyObject *op, PyObject *Py_UNUSED(ignored)) { rlockobject *self = rlockobject_CAST(op); - int is_locked = _PyRecursiveMutex_IsLockedByCurrentThread(&self->lock); + int is_locked = rlock_locked_impl(self); return PyBool_FromLong(is_locked); } @@ -1202,10 +1207,11 @@ rlock_repr(PyObject *op) { rlockobject *self = rlockobject_CAST(op); PyThread_ident_t owner = self->lock.thread; + int locked = rlock_locked_impl(self); size_t count = self->lock.level + 1; return PyUnicode_FromFormat( "<%s %s object owner=%" PY_FORMAT_THREAD_IDENT_T " count=%zu at %p>", - owner ? "locked" : "unlocked", + locked ? "locked" : "unlocked", Py_TYPE(self)->tp_name, owner, count, self); } From c31b25c705fffc42f955def6b8f4f7d2bc96916c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 16:31:26 +0200 Subject: [PATCH 0202/1674] [3.14] gh-133740: Fix locale.nl_langinfo(ALT_DIGITS) (GH-134468) (#134512) gh-133740: Fix locale.nl_langinfo(ALT_DIGITS) (GH-134468) Set the LC_CTYPE locale to the LC_TIME locale even if nl_langinfo(ALT_DIGITS) result is ASCII. The result is a list separated by NUL characters and the code only checks the first list item which can be ASCII whereas following items are non-ASCII. Fix test__locale for the uk_UA locale on RHEL 7. (cherry picked from commit 899c7dc283cb899fdfd79fb479b38352f48e454a) Co-authored-by: Victor Stinner Co-authored-by: Serhiy Storchaka --- Modules/_localemodule.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index ad618398d5b824..c1f56008b7c49e 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -692,7 +692,17 @@ _locale_nl_langinfo_impl(PyObject *module, int item) result = result != NULL ? result : ""; char *oldloc = NULL; if (langinfo_constants[i].category != LC_CTYPE - && !is_all_ascii(result) + && ( +#ifdef __GLIBC__ + // gh-133740: Always change the locale for ALT_DIGITS and ERA +# ifdef ALT_DIGITS + item == ALT_DIGITS || +# endif +# ifdef ERA + item == ERA || +# endif +#endif + !is_all_ascii(result)) && change_locale(langinfo_constants[i].category, &oldloc) < 0) { return NULL; From bbf8048c0f9c12b606da2e3e7b70e47e9f93f506 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 17:07:11 +0200 Subject: [PATCH 0203/1674] [3.14] gh-132775: Use _PyCode GetScriptXIData() (gh-134515) (cherry picked from commit 09e72cf091d, AKA gh-134511) Co-authored-by: Eric Snow --- Lib/test/support/interpreters/channels.py | 2 +- Lib/test/test__interpreters.py | 25 +- Lib/test/test_interpreters/test_api.py | 23 +- Modules/_interpretersmodule.c | 294 ++++++---------------- 4 files changed, 104 insertions(+), 240 deletions(-) diff --git a/Lib/test/support/interpreters/channels.py b/Lib/test/support/interpreters/channels.py index 7a2bd7d63f808f..3b6e0f0effd969 100644 --- a/Lib/test/support/interpreters/channels.py +++ b/Lib/test/support/interpreters/channels.py @@ -69,7 +69,7 @@ def list_all(): if not hasattr(send, '_unboundop'): send._set_unbound(unboundop) else: - assert send._unbound[0] == op + assert send._unbound[0] == unboundop channels.append(chan) return channels diff --git a/Lib/test/test__interpreters.py b/Lib/test/test__interpreters.py index 63fdaad8de7ef5..ad3ebbfdff64a7 100644 --- a/Lib/test/test__interpreters.py +++ b/Lib/test/test__interpreters.py @@ -474,13 +474,15 @@ def setUp(self): def test_signatures(self): # See https://github.com/python/cpython/issues/126654 - msg = "expected 'shared' to be a dict" + msg = r'_interpreters.exec\(\) argument 3 must be dict, not int' with self.assertRaisesRegex(TypeError, msg): _interpreters.exec(self.id, 'a', 1) with self.assertRaisesRegex(TypeError, msg): _interpreters.exec(self.id, 'a', shared=1) + msg = r'_interpreters.run_string\(\) argument 3 must be dict, not int' with self.assertRaisesRegex(TypeError, msg): _interpreters.run_string(self.id, 'a', shared=1) + msg = r'_interpreters.run_func\(\) argument 3 must be dict, not int' with self.assertRaisesRegex(TypeError, msg): _interpreters.run_func(self.id, lambda: None, shared=1) @@ -952,7 +954,8 @@ def test_invalid_syntax(self): """) with self.subTest('script'): - self.assert_run_failed(SyntaxError, script) + with self.assertRaises(SyntaxError): + _interpreters.run_string(self.id, script) with self.subTest('module'): modname = 'spam_spam_spam' @@ -1019,12 +1022,19 @@ def script(): with open(w, 'w', encoding="utf-8") as spipe: with contextlib.redirect_stdout(spipe): print('it worked!', end='') + failed = None def f(): - _interpreters.set___main___attrs(self.id, dict(w=w)) - _interpreters.run_func(self.id, script) + nonlocal failed + try: + _interpreters.set___main___attrs(self.id, dict(w=w)) + _interpreters.run_func(self.id, script) + except Exception as exc: + failed = exc t = threading.Thread(target=f) t.start() t.join() + if failed: + raise Exception from failed with open(r, encoding="utf-8") as outfile: out = outfile.read() @@ -1053,19 +1063,16 @@ def test_closure(self): spam = True def script(): assert spam - - with self.assertRaises(TypeError): + with self.assertRaises(ValueError): _interpreters.run_func(self.id, script) - # XXX This hasn't been fixed yet. - @unittest.expectedFailure def test_return_value(self): def script(): return 'spam' with self.assertRaises(ValueError): _interpreters.run_func(self.id, script) - @unittest.skip("we're not quite there yet") +# @unittest.skip("we're not quite there yet") def test_args(self): with self.subTest('args'): def script(a, b=0): diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index 1e2d572b1cbb81..165949167ceba8 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -839,9 +839,16 @@ def test_bad_script(self): interp.exec(10) def test_bytes_for_script(self): + r, w = self.pipe() + RAN = b'R' + DONE = b'D' interp = interpreters.create() - with self.assertRaises(TypeError): - interp.exec(b'print("spam")') + interp.exec(f"""if True: + import os + os.write({w}, {RAN!r}) + """) + os.write(w, DONE) + self.assertEqual(os.read(r, 1), RAN) def test_with_background_threads_still_running(self): r_interp, w_interp = self.pipe() @@ -1010,8 +1017,6 @@ def test_call(self): for i, (callable, args, kwargs) in enumerate([ (call_func_noop, (), {}), - (call_func_return_shareable, (), {}), - (call_func_return_not_shareable, (), {}), (Spam.noop, (), {}), ]): with self.subTest(f'success case #{i+1}'): @@ -1036,6 +1041,8 @@ def test_call(self): (call_func_complex, ('custom', 'spam!'), {}), (call_func_complex, ('custom-inner', 'eggs!'), {}), (call_func_complex, ('???',), {'exc': ValueError('spam')}), + (call_func_return_shareable, (), {}), + (call_func_return_not_shareable, (), {}), ]): with self.subTest(f'invalid case #{i+1}'): with self.assertRaises(Exception): @@ -1051,8 +1058,6 @@ def test_call_in_thread(self): for i, (callable, args, kwargs) in enumerate([ (call_func_noop, (), {}), - (call_func_return_shareable, (), {}), - (call_func_return_not_shareable, (), {}), (Spam.noop, (), {}), ]): with self.subTest(f'success case #{i+1}'): @@ -1079,6 +1084,8 @@ def test_call_in_thread(self): (call_func_complex, ('custom', 'spam!'), {}), (call_func_complex, ('custom-inner', 'eggs!'), {}), (call_func_complex, ('???',), {'exc': ValueError('spam')}), + (call_func_return_shareable, (), {}), + (call_func_return_not_shareable, (), {}), ]): with self.subTest(f'invalid case #{i+1}'): if args or kwargs: @@ -1618,8 +1625,8 @@ def test_exec(self): def test_call(self): with self.subTest('no args'): interpid = _interpreters.create() - exc = _interpreters.call(interpid, call_func_return_shareable) - self.assertIs(exc, None) + with self.assertRaises(ValueError): + _interpreters.call(interpid, call_func_return_shareable) with self.subTest('uncaught exception'): interpid = _interpreters.create() diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index 91cd92806206be..7f84b38a70e127 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -9,7 +9,6 @@ #include "pycore_code.h" // _PyCode_HAS_EXECUTORS() #include "pycore_crossinterp.h" // _PyXIData_t #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() -#include "pycore_function.h" // _PyFunction_VerifyStateless() #include "pycore_interp.h" // _PyInterpreterState_IDIncref() #include "pycore_modsupport.h" // _PyArg_BadArgument() #include "pycore_namespace.h" // _PyNamespace_New() @@ -361,81 +360,6 @@ _get_current_xibufferview_type(void) } -/* Python code **************************************************************/ - -static const char * -check_code_str(PyUnicodeObject *text) -{ - assert(text != NULL); - if (PyUnicode_GET_LENGTH(text) == 0) { - return "too short"; - } - - // XXX Verify that it parses? - - return NULL; -} - -#ifndef NDEBUG -static int -code_has_args(PyCodeObject *code) -{ - assert(code != NULL); - return (code->co_argcount > 0 - || code->co_posonlyargcount > 0 - || code->co_kwonlyargcount > 0 - || code->co_flags & (CO_VARARGS | CO_VARKEYWORDS)); -} -#endif - -#define RUN_TEXT 1 -#define RUN_CODE 2 - -static const char * -get_code_str(PyObject *arg, Py_ssize_t *len_p, PyObject **bytes_p, int *flags_p) -{ - const char *codestr = NULL; - Py_ssize_t len = -1; - PyObject *bytes_obj = NULL; - int flags = 0; - - if (PyUnicode_Check(arg)) { - assert(PyUnicode_Check(arg) - && (check_code_str((PyUnicodeObject *)arg) == NULL)); - codestr = PyUnicode_AsUTF8AndSize(arg, &len); - if (codestr == NULL) { - return NULL; - } - if (strlen(codestr) != (size_t)len) { - PyErr_SetString(PyExc_ValueError, - "source code string cannot contain null bytes"); - return NULL; - } - flags = RUN_TEXT; - } - else { - assert(PyCode_Check(arg)); - assert(_PyCode_VerifyStateless( - PyThreadState_Get(), (PyCodeObject *)arg, NULL, NULL, NULL) == 0); - assert(!code_has_args((PyCodeObject *)arg)); - flags = RUN_CODE; - - // Serialize the code object. - bytes_obj = PyMarshal_WriteObjectToString(arg, Py_MARSHAL_VERSION); - if (bytes_obj == NULL) { - return NULL; - } - codestr = PyBytes_AS_STRING(bytes_obj); - len = PyBytes_GET_SIZE(bytes_obj); - } - - *flags_p = flags; - *bytes_p = bytes_obj; - *len_p = len; - return codestr; -} - - /* interpreter-specific code ************************************************/ static int @@ -499,22 +423,14 @@ config_from_object(PyObject *configobj, PyInterpreterConfig *config) static int -_run_script(PyObject *ns, const char *codestr, Py_ssize_t codestrlen, int flags) +_run_script(_PyXIData_t *script, PyObject *ns) { - PyObject *result = NULL; - if (flags & RUN_TEXT) { - result = PyRun_StringFlags(codestr, Py_file_input, ns, ns, NULL); - } - else if (flags & RUN_CODE) { - PyObject *code = PyMarshal_ReadObjectFromString(codestr, codestrlen); - if (code != NULL) { - result = PyEval_EvalCode(code, ns, ns); - Py_DECREF(code); - } - } - else { - Py_UNREACHABLE(); + PyObject *code = _PyXIData_NewObject(script); + if (code == NULL) { + return -1; } + PyObject *result = PyEval_EvalCode(code, ns, ns); + Py_DECREF(code); if (result == NULL) { return -1; } @@ -523,17 +439,16 @@ _run_script(PyObject *ns, const char *codestr, Py_ssize_t codestrlen, int flags) } static int -_run_in_interpreter(PyInterpreterState *interp, - const char *codestr, Py_ssize_t codestrlen, - PyObject *shareables, int flags, +_exec_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp, + _PyXIData_t *script, PyObject *shareables, PyObject **p_excinfo) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); _PyXI_session session = {0}; // Prep and switch interpreters. if (_PyXI_Enter(&session, interp, shareables) < 0) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { // If an error occured at this step, it means that interp // was not prepared and switched. return -1; @@ -548,7 +463,7 @@ _run_in_interpreter(PyInterpreterState *interp, } // Run the script. - int res = _run_script(session.main_ns, codestr, codestrlen, flags); + int res = _run_script(script, session.main_ns); // Clean up and switch back. _PyXI_Exit(&session); @@ -935,104 +850,23 @@ PyDoc_STRVAR(set___main___attrs_doc, Bind the given attributes in the interpreter's __main__ module."); -static PyUnicodeObject * -convert_script_arg(PyThreadState *tstate, - PyObject *arg, const char *fname, const char *displayname, - const char *expected) -{ - PyUnicodeObject *str = NULL; - if (PyUnicode_CheckExact(arg)) { - str = (PyUnicodeObject *)Py_NewRef(arg); - } - else if (PyUnicode_Check(arg)) { - // XXX str = PyUnicode_FromObject(arg); - str = (PyUnicodeObject *)Py_NewRef(arg); - } - else { - _PyArg_BadArgument(fname, displayname, expected, arg); - return NULL; - } - - const char *err = check_code_str(str); - if (err != NULL) { - Py_DECREF(str); - _PyErr_Format(tstate, PyExc_ValueError, - "%.200s(): bad script text (%s)", fname, err); - return NULL; - } - - return str; -} - -static PyCodeObject * -convert_code_arg(PyThreadState *tstate, - PyObject *arg, const char *fname, const char *displayname, - const char *expected) +static void +unwrap_not_shareable(PyThreadState *tstate) { - PyObject *cause; - PyCodeObject *code = NULL; - if (PyFunction_Check(arg)) { - // For now we allow globals, so we can't use - // _PyFunction_VerifyStateless(). - PyObject *codeobj = PyFunction_GetCode(arg); - if (_PyCode_VerifyStateless( - tstate, (PyCodeObject *)codeobj, NULL, NULL, NULL) < 0) { - goto chained; - } - code = (PyCodeObject *)Py_NewRef(codeobj); + PyObject *exctype = _PyXIData_GetNotShareableErrorType(tstate); + if (!_PyErr_ExceptionMatches(tstate, exctype)) { + return; } - else if (PyCode_Check(arg)) { - if (_PyCode_VerifyStateless( - tstate, (PyCodeObject *)arg, NULL, NULL, NULL) < 0) { - goto chained; - } - code = (PyCodeObject *)Py_NewRef(arg); + PyObject *exc = _PyErr_GetRaisedException(tstate); + PyObject *cause = PyException_GetCause(exc); + if (cause != NULL) { + Py_DECREF(exc); + exc = cause; } else { - _PyArg_BadArgument(fname, displayname, expected, arg); - return NULL; + assert(PyException_GetContext(exc) == NULL); } - - return code; - -chained: - cause = _PyErr_GetRaisedException(tstate); - assert(cause != NULL); - _PyArg_BadArgument(fname, displayname, expected, arg); - PyObject *exc = _PyErr_GetRaisedException(tstate); - PyException_SetCause(exc, cause); _PyErr_SetRaisedException(tstate, exc); - return NULL; -} - -static int -_interp_exec(PyObject *self, PyInterpreterState *interp, - PyObject *code_arg, PyObject *shared_arg, PyObject **p_excinfo) -{ - if (shared_arg != NULL && !PyDict_CheckExact(shared_arg)) { - PyErr_SetString(PyExc_TypeError, "expected 'shared' to be a dict"); - return -1; - } - - // Extract code. - Py_ssize_t codestrlen = -1; - PyObject *bytes_obj = NULL; - int flags = 0; - const char *codestr = get_code_str(code_arg, - &codestrlen, &bytes_obj, &flags); - if (codestr == NULL) { - return -1; - } - - // Run the code in the interpreter. - int res = _run_in_interpreter(interp, codestr, codestrlen, - shared_arg, flags, p_excinfo); - Py_XDECREF(bytes_obj); - if (res < 0) { - return -1; - } - - return 0; } static PyObject * @@ -1045,8 +879,9 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds) PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|O$p:" FUNCNAME, kwlist, - &id, &code, &shared, &restricted)) + "OO|O!$p:" FUNCNAME, kwlist, + &id, &code, &PyDict_Type, &shared, + &restricted)) { return NULL; } @@ -1058,22 +893,17 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - const char *expected = "a string, a function, or a code object"; - if (PyUnicode_Check(code)) { - code = (PyObject *)convert_script_arg(tstate, code, FUNCNAME, - "argument 2", expected); - } - else { - code = (PyObject *)convert_code_arg(tstate, code, FUNCNAME, - "argument 2", expected); - } - if (code == NULL) { + // We don't need the script to be "pure", which means it can use + // global variables. They will be resolved against __main__. + _PyXIData_t xidata = {0}; + if (_PyCode_GetScriptXIData(tstate, code, &xidata) < 0) { + unwrap_not_shareable(tstate); return NULL; } PyObject *excinfo = NULL; - int res = _interp_exec(self, interp, code, shared, &excinfo); - Py_DECREF(code); + int res = _exec_in_interpreter(tstate, interp, &xidata, shared, &excinfo); + _PyXIData_Release(&xidata); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; @@ -1109,8 +939,9 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OU|O$p:" FUNCNAME, kwlist, - &id, &script, &shared, &restricted)) + "OU|O!$p:" FUNCNAME, kwlist, + &id, &script, &PyDict_Type, &shared, + &restricted)) { return NULL; } @@ -1122,15 +953,20 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - script = (PyObject *)convert_script_arg(tstate, script, FUNCNAME, - "argument 2", "a string"); - if (script == NULL) { + if (PyFunction_Check(script) || PyCode_Check(script)) { + _PyArg_BadArgument(FUNCNAME, "argument 2", "a string", script); + return NULL; + } + + _PyXIData_t xidata = {0}; + if (_PyCode_GetScriptXIData(tstate, script, &xidata) < 0) { + unwrap_not_shareable(tstate); return NULL; } PyObject *excinfo = NULL; - int res = _interp_exec(self, interp, script, shared, &excinfo); - Py_DECREF(script); + int res = _exec_in_interpreter(tstate, interp, &xidata, shared, &excinfo); + _PyXIData_Release(&xidata); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; @@ -1156,8 +992,9 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|O$p:" FUNCNAME, kwlist, - &id, &func, &shared, &restricted)) + "OO|O!$p:" FUNCNAME, kwlist, + &id, &func, &PyDict_Type, &shared, + &restricted)) { return NULL; } @@ -1169,16 +1006,29 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - PyCodeObject *code = convert_code_arg(tstate, func, FUNCNAME, - "argument 2", - "a function or a code object"); - if (code == NULL) { + // We don't worry about checking globals. They will be resolved + // against __main__. + PyObject *code; + if (PyFunction_Check(func)) { + code = PyFunction_GET_CODE(func); + } + else if (PyCode_Check(func)) { + code = func; + } + else { + _PyArg_BadArgument(FUNCNAME, "argument 2", "a function", func); + return NULL; + } + + _PyXIData_t xidata = {0}; + if (_PyCode_GetScriptXIData(tstate, code, &xidata) < 0) { + unwrap_not_shareable(tstate); return NULL; } PyObject *excinfo = NULL; - int res = _interp_exec(self, interp, (PyObject *)code, shared, &excinfo); - Py_DECREF(code); + int res = _exec_in_interpreter(tstate, interp, &xidata, shared, &excinfo); + _PyXIData_Release(&xidata); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; @@ -1231,15 +1081,15 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - PyObject *code = (PyObject *)convert_code_arg(tstate, callable, FUNCNAME, - "argument 2", "a function"); - if (code == NULL) { + _PyXIData_t xidata = {0}; + if (_PyCode_GetPureScriptXIData(tstate, callable, &xidata) < 0) { + unwrap_not_shareable(tstate); return NULL; } PyObject *excinfo = NULL; - int res = _interp_exec(self, interp, code, NULL, &excinfo); - Py_DECREF(code); + int res = _exec_in_interpreter(tstate, interp, &xidata, NULL, &excinfo); + _PyXIData_Release(&xidata); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; From 068d570be84eab2ef271204e7ba9dd37391791d4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 19:12:21 +0200 Subject: [PATCH 0204/1674] [3.14] gh-134322: Fix `repr(threading.RLock)` (GH-134389) (#134528) gh-134322: Fix `repr(threading.RLock)` (GH-134389) Fix the `__repr__` value of `threading.RLock` from `_thread` module, when just created. (cherry picked from commit fade146cfb1616ad7b3b918bedb86756dedf79e6) Co-authored-by: Duprat --- Lib/test/lock_tests.py | 20 ++++++++++++++++++++ Lib/test/test_importlib/test_locks.py | 1 + Modules/_threadmodule.c | 8 +++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 0e8c75ff5c4994..fb11f4828957ff 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -332,6 +332,26 @@ class RLockTests(BaseLockTests): """ Tests for recursive locks. """ + def test_repr_count(self): + # see gh-134322: check that count values are correct: + # when a rlock is just created, + # in a second thread when rlock is acquired in the main thread. + lock = self.locktype() + self.assertIn("count=0", repr(lock)) + self.assertIn("lock.thread; int locked = rlock_locked_impl(self); - size_t count = self->lock.level + 1; + size_t count; + if (locked) { + count = self->lock.level + 1; + } + else { + count = 0; + } return PyUnicode_FromFormat( "<%s %s object owner=%" PY_FORMAT_THREAD_IDENT_T " count=%zu at %p>", locked ? "locked" : "unlocked", From 04e2dd65138b9114b705890bab5671f80c541cf8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 19:12:52 +0200 Subject: [PATCH 0205/1674] [3.14] gh-132775: Make _PyXI_session Opaque (gh-134522) This is mostly a refactor to clean things up a bit, most notably the "XI namespace" code. Making the session opaque requires adding the following internal-only functions: * _PyXI_NewSession() * _PyXI_FreeSession() * _PyXI_GetMainNamespace() (cherry picked from commit 4a4ac3ab4d, gh-134452) Co-authored-by: Eric Snow --- Doc/data/python3.14.abi | 902 +++++++++++++------------- Include/internal/pycore_crossinterp.h | 58 +- Modules/_interpretersmodule.c | 41 +- Python/crossinterp.c | 723 ++++++++++++--------- 4 files changed, 896 insertions(+), 828 deletions(-) diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index decb2ce3c6f39e..64f4d473b72def 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -1195,11 +1195,13 @@ + + @@ -1510,19 +1512,18 @@ - - - + + - + @@ -4246,17 +4247,17 @@ - + - - - + + + - - - + + + @@ -7099,7 +7100,7 @@ - + @@ -7349,7 +7350,7 @@ - + @@ -26915,73 +26916,59 @@ - - - + + - + + + + - + - - - - + - + + + + - + - + - - - - + - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + + + + + + + + + + + + + + - @@ -27194,75 +27181,66 @@ - + - + - + - + - + - - - - - - - - - - - - - + + - - - - - + + + - - + + - - + + - - - - + + + + - - + + - - - - - + + + + + + + + + - - - - + + + + @@ -27298,11 +27276,11 @@ - + - + @@ -27321,7 +27299,7 @@ - + @@ -27478,15 +27456,15 @@ - + - + - + @@ -27494,11 +27472,11 @@ - - - - - + + + + + @@ -27542,7 +27520,7 @@ - + @@ -27613,7 +27591,7 @@ - + @@ -27687,9 +27665,9 @@ - + - + @@ -27729,17 +27707,17 @@ - + - + - - - - + + + + @@ -27760,7 +27738,7 @@ - + @@ -27774,7 +27752,7 @@ - + @@ -27782,15 +27760,15 @@ - - - - - - - - - + + + + + + + + + @@ -27850,7 +27828,7 @@ - + @@ -27885,15 +27863,15 @@ - + - + - + @@ -27983,8 +27961,8 @@ - - + + @@ -27996,8 +27974,8 @@ - - + + @@ -28018,7 +27996,7 @@ - + @@ -28031,7 +28009,7 @@ - + @@ -28040,22 +28018,22 @@ - + - - + + - - + + @@ -28072,7 +28050,7 @@ - + @@ -28081,7 +28059,7 @@ - + @@ -28089,24 +28067,24 @@ - + - + - + - + - + - + @@ -28116,9 +28094,9 @@ - - - + + + @@ -28126,48 +28104,48 @@ - + - - - + + + - + - + - + - + - + - + - + - - - + + + @@ -28198,7 +28176,7 @@ - + @@ -28335,7 +28313,7 @@ - + @@ -28347,11 +28325,11 @@ - + - - + + @@ -28371,8 +28349,8 @@ - - + + @@ -28392,27 +28370,27 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - - + + - + @@ -28480,13 +28458,13 @@ - + - + @@ -28511,21 +28489,21 @@ - + - + - + - + @@ -28534,7 +28512,7 @@ - + @@ -28548,7 +28526,7 @@ - + @@ -28557,7 +28535,7 @@ - + @@ -28625,12 +28603,12 @@ - + - + @@ -28647,19 +28625,19 @@ - + - + - + @@ -28694,12 +28672,12 @@ - + - + @@ -28712,44 +28690,44 @@ - + - + - + - + - + - + - + - + - + @@ -28758,32 +28736,32 @@ - + - + - + - + - + @@ -28808,7 +28786,7 @@ - + @@ -28816,12 +28794,12 @@ - - + + - + @@ -28831,33 +28809,33 @@ - + - + - + - + - + @@ -28865,85 +28843,85 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -28952,62 +28930,62 @@ - + - + - + - + - + - + - + - + - - - + + + - + - - + + - + - - - - - + + + + + @@ -29019,8 +28997,8 @@ - - + + @@ -29066,12 +29044,12 @@ - + - + @@ -29079,8 +29057,8 @@ - - + + @@ -29089,53 +29067,53 @@ - + - + - + - + - + - - - + + + - + - - + + - + - - - - - - + + + + + + @@ -29151,7 +29129,7 @@ - + @@ -29160,21 +29138,21 @@ - + - + - + - + @@ -29190,65 +29168,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -29256,18 +29234,18 @@ - + - + - + - + @@ -29288,10 +29266,10 @@ - + - + @@ -29303,16 +29281,16 @@ - + - + - - - - + + + + @@ -29414,21 +29392,21 @@ - + - - - - + + + + - + - + @@ -29437,27 +29415,27 @@ - + - + - + - + - + @@ -29523,16 +29501,16 @@ - - + + - + - + @@ -29546,7 +29524,7 @@ - + @@ -29558,23 +29536,23 @@ - - + + - + - + - + @@ -29592,11 +29570,11 @@ - + - + @@ -29606,36 +29584,36 @@ - + - + - + - + - - - - + + + + - + - + - + - + @@ -29647,25 +29625,25 @@ - - + + - + - + - + - + - + - + @@ -29673,7 +29651,7 @@ - + @@ -29681,38 +29659,38 @@ - + - + - + - + - - - - - + + + + + - + - + - + @@ -29723,17 +29701,17 @@ - - - + + + - - - - - - - + + + + + + + @@ -29903,13 +29881,13 @@ - + - - + + @@ -29941,7 +29919,7 @@ - + @@ -30289,7 +30267,7 @@ - + @@ -30298,8 +30276,8 @@ - - + + @@ -30364,19 +30342,19 @@ - + - - + + - - - - + + + + @@ -30396,7 +30374,7 @@ - + @@ -30458,7 +30436,7 @@ - + @@ -30469,7 +30447,7 @@ - + @@ -30482,24 +30460,24 @@ - + - + - + - + - + @@ -30807,7 +30785,7 @@ - + @@ -30821,7 +30799,7 @@ - + @@ -30858,22 +30836,22 @@ - - - - + + + + - + - - + + - - + + @@ -31004,7 +30982,7 @@ - + @@ -31013,8 +30991,8 @@ - - + + @@ -31035,7 +31013,7 @@ - + @@ -31130,10 +31108,10 @@ - - - - + + + + @@ -31163,7 +31141,7 @@ - + @@ -31184,8 +31162,8 @@ - - + + @@ -31207,26 +31185,26 @@ - - - - - + + + + + + + + + + - - - - - - + - + - + @@ -31259,7 +31237,7 @@ - + @@ -31280,7 +31258,7 @@ - + @@ -31310,7 +31288,7 @@ - + @@ -31319,17 +31297,17 @@ - + - + - - + + @@ -31338,11 +31316,11 @@ - + - + @@ -31377,13 +31355,13 @@ - + - + @@ -31397,8 +31375,8 @@ - - + + diff --git a/Include/internal/pycore_crossinterp.h b/Include/internal/pycore_crossinterp.h index 45fa47d62c78a3..1272927413868b 100644 --- a/Include/internal/pycore_crossinterp.h +++ b/Include/internal/pycore_crossinterp.h @@ -335,24 +335,9 @@ typedef struct _sharedexception { 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()). +// with _PyXI_Enter(), doing some work with it, and finally exiting +// that interpreter with _PyXI_Exit(). // // At the boundaries of the session, both entering and exiting, // data may be exchanged between the previous interpreter and the @@ -360,39 +345,10 @@ PyAPI_FUNC(int) _PyXI_ApplyNamespace( // 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; -}; +typedef struct xi_session _PyXI_session; + +PyAPI_FUNC(_PyXI_session *) _PyXI_NewSession(void); +PyAPI_FUNC(void) _PyXI_FreeSession(_PyXI_session *); PyAPI_FUNC(int) _PyXI_Enter( _PyXI_session *session, @@ -400,6 +356,8 @@ PyAPI_FUNC(int) _PyXI_Enter( PyObject *nsupdates); PyAPI_FUNC(void) _PyXI_Exit(_PyXI_session *session); +PyAPI_FUNC(PyObject *) _PyXI_GetMainNamespace(_PyXI_session *); + PyAPI_FUNC(PyObject *) _PyXI_ApplyCapturedException(_PyXI_session *session); PyAPI_FUNC(int) _PyXI_HasCapturedException(_PyXI_session *session); diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index 7f84b38a70e127..376517ab92360f 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -444,42 +444,54 @@ _exec_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp, PyObject **p_excinfo) { assert(!_PyErr_Occurred(tstate)); - _PyXI_session session = {0}; + _PyXI_session *session = _PyXI_NewSession(); + if (session == NULL) { + return -1; + } // Prep and switch interpreters. - if (_PyXI_Enter(&session, interp, shareables) < 0) { + if (_PyXI_Enter(session, interp, shareables) < 0) { if (_PyErr_Occurred(tstate)) { // If an error occured at this step, it means that interp // was not prepared and switched. + _PyXI_FreeSession(session); return -1; } // Now, apply the error from another interpreter: - PyObject *excinfo = _PyXI_ApplyError(session.error); + PyObject *excinfo = _PyXI_ApplyCapturedException(session); if (excinfo != NULL) { *p_excinfo = excinfo; } assert(PyErr_Occurred()); + _PyXI_FreeSession(session); return -1; } // Run the script. - int res = _run_script(script, session.main_ns); + int res = -1; + PyObject *mainns = _PyXI_GetMainNamespace(session); + if (mainns == NULL) { + goto finally; + } + res = _run_script(script, mainns); +finally: // Clean up and switch back. - _PyXI_Exit(&session); + _PyXI_Exit(session); // Propagate any exception out to the caller. assert(!PyErr_Occurred()); if (res < 0) { - PyObject *excinfo = _PyXI_ApplyCapturedException(&session); + PyObject *excinfo = _PyXI_ApplyCapturedException(session); if (excinfo != NULL) { *p_excinfo = excinfo; } } else { - assert(!_PyXI_HasCapturedException(&session)); + assert(!_PyXI_HasCapturedException(session)); } + _PyXI_FreeSession(session); return res; } @@ -824,22 +836,27 @@ interp_set___main___attrs(PyObject *self, PyObject *args, PyObject *kwargs) } } - _PyXI_session session = {0}; + _PyXI_session *session = _PyXI_NewSession(); + if (session == NULL) { + return NULL; + } // Prep and switch interpreters, including apply the updates. - if (_PyXI_Enter(&session, interp, updates) < 0) { + if (_PyXI_Enter(session, interp, updates) < 0) { if (!PyErr_Occurred()) { - _PyXI_ApplyCapturedException(&session); + _PyXI_ApplyCapturedException(session); assert(PyErr_Occurred()); } else { - assert(!_PyXI_HasCapturedException(&session)); + assert(!_PyXI_HasCapturedException(session)); } + _PyXI_FreeSession(session); return NULL; } // Clean up and switch back. - _PyXI_Exit(&session); + _PyXI_Exit(session); + _PyXI_FreeSession(session); Py_RETURN_NONE; } diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 6681b969183925..65ccab32daf730 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -1914,156 +1914,212 @@ _sharednsitem_apply(_PyXI_namespace_item *item, PyObject *ns, PyObject *dflt) return res; } -struct _sharedns { - Py_ssize_t len; - _PyXI_namespace_item *items; -}; -static _PyXI_namespace * -_sharedns_new(void) -{ - _PyXI_namespace *ns = PyMem_RawCalloc(sizeof(_PyXI_namespace), 1); - if (ns == NULL) { - PyErr_NoMemory(); - return NULL; - } - *ns = (_PyXI_namespace){ 0 }; - return ns; -} +typedef struct { + Py_ssize_t maxitems; + Py_ssize_t numnames; + Py_ssize_t numvalues; + _PyXI_namespace_item items[1]; +} _PyXI_namespace; +#ifndef NDEBUG static int -_sharedns_is_initialized(_PyXI_namespace *ns) +_sharedns_check_counts(_PyXI_namespace *ns) { - if (ns->len == 0) { - assert(ns->items == NULL); + if (ns->maxitems <= 0) { + return 0; + } + if (ns->numnames < 0) { + return 0; + } + if (ns->numnames > ns->maxitems) { + return 0; + } + if (ns->numvalues < 0) { + return 0; + } + if (ns->numvalues > ns->numnames) { return 0; } - - assert(ns->len > 0); - assert(ns->items != NULL); - assert(_sharednsitem_is_initialized(&ns->items[0])); - assert(ns->len == 1 - || _sharednsitem_is_initialized(&ns->items[ns->len - 1])); return 1; } -#define HAS_COMPLETE_DATA 1 -#define HAS_PARTIAL_DATA 2 - static int -_sharedns_has_xidata(_PyXI_namespace *ns, int64_t *p_interpid) +_sharedns_check_consistency(_PyXI_namespace *ns) { - // We expect _PyXI_namespace to always be initialized. - assert(_sharedns_is_initialized(ns)); - int res = 0; - _PyXI_namespace_item *item0 = &ns->items[0]; - if (!_sharednsitem_is_initialized(item0)) { + if (!_sharedns_check_counts(ns)) { return 0; } - int64_t interpid0 = -1; - if (!_sharednsitem_has_value(item0, &interpid0)) { - return 0; + + Py_ssize_t i = 0; + _PyXI_namespace_item *item; + if (ns->numvalues > 0) { + item = &ns->items[0]; + if (!_sharednsitem_is_initialized(item)) { + return 0; + } + int64_t interpid0 = -1; + if (!_sharednsitem_has_value(item, &interpid0)) { + return 0; + } + i += 1; + for (; i < ns->numvalues; i++) { + item = &ns->items[i]; + if (!_sharednsitem_is_initialized(item)) { + return 0; + } + int64_t interpid = -1; + if (!_sharednsitem_has_value(item, &interpid)) { + return 0; + } + if (interpid != interpid0) { + return 0; + } + } } - if (ns->len > 1) { - // At this point we know it is has at least partial data. - _PyXI_namespace_item *itemN = &ns->items[ns->len-1]; - if (!_sharednsitem_is_initialized(itemN)) { - res = HAS_PARTIAL_DATA; - goto finally; + for (; i < ns->numnames; i++) { + item = &ns->items[i]; + if (!_sharednsitem_is_initialized(item)) { + return 0; } - int64_t interpidN = -1; - if (!_sharednsitem_has_value(itemN, &interpidN)) { - res = HAS_PARTIAL_DATA; - goto finally; + if (_sharednsitem_has_value(item, NULL)) { + return 0; } - assert(interpidN == interpid0); } - res = HAS_COMPLETE_DATA; - *p_interpid = interpid0; - -finally: - return res; + for (; i < ns->maxitems; i++) { + item = &ns->items[i]; + if (_sharednsitem_is_initialized(item)) { + return 0; + } + if (_sharednsitem_has_value(item, NULL)) { + return 0; + } + } + return 1; } +#endif -static void -_sharedns_clear(_PyXI_namespace *ns) +static _PyXI_namespace * +_sharedns_alloc(Py_ssize_t maxitems) { - if (!_sharedns_is_initialized(ns)) { - return; + if (maxitems < 0) { + if (!PyErr_Occurred()) { + PyErr_BadInternalCall(); + } + return NULL; + } + else if (maxitems == 0) { + PyErr_SetString(PyExc_ValueError, "empty namespaces not allowed"); + return NULL; } - // If the cross-interpreter data were allocated as part of - // _PyXI_namespace_item (instead of dynamically), this is where - // we would need verify that we are clearing the items in the - // correct interpreter, to avoid a race with releasing the XI data - // via a pending call. See _sharedns_has_xidata(). - for (Py_ssize_t i=0; i < ns->len; i++) { - _sharednsitem_clear(&ns->items[i]); + // Check for overflow. + size_t fixedsize = sizeof(_PyXI_namespace) - sizeof(_PyXI_namespace_item); + if ((size_t)maxitems > + ((size_t)PY_SSIZE_T_MAX - fixedsize) / sizeof(_PyXI_namespace_item)) + { + PyErr_NoMemory(); + return NULL; + } + + // Allocate the value, including items. + size_t size = fixedsize + sizeof(_PyXI_namespace_item) * maxitems; + + _PyXI_namespace *ns = PyMem_RawCalloc(size, 1); + if (ns == NULL) { + PyErr_NoMemory(); + return NULL; } - PyMem_RawFree(ns->items); - ns->items = NULL; - ns->len = 0; + ns->maxitems = maxitems; + assert(_sharedns_check_consistency(ns)); + return ns; } static void _sharedns_free(_PyXI_namespace *ns) { - _sharedns_clear(ns); + // If we weren't always dynamically allocating the cross-interpreter + // data in each item then we would need to use a pending call + // to call _sharedns_free(), to avoid the race between freeing + // the shared namespace and releasing the XI data. + assert(_sharedns_check_counts(ns)); + Py_ssize_t i = 0; + _PyXI_namespace_item *item; + if (ns->numvalues > 0) { + // One or more items may have interpreter-specific data. +#ifndef NDEBUG + int64_t interpid = PyInterpreterState_GetID(PyInterpreterState_Get()); + int64_t interpid_i; +#endif + for (; i < ns->numvalues; i++) { + item = &ns->items[i]; + assert(_sharednsitem_is_initialized(item)); + // While we do want to ensure consistency across items, + // technically they don't need to match the current + // interpreter. However, we keep the constraint for + // simplicity, by giving _PyXI_FreeNamespace() the exclusive + // responsibility of dealing with the owning interpreter. + assert(_sharednsitem_has_value(item, &interpid_i)); + assert(interpid_i == interpid); + _sharednsitem_clear(item); + } + } + for (; i < ns->numnames; i++) { + item = &ns->items[i]; + assert(_sharednsitem_is_initialized(item)); + assert(!_sharednsitem_has_value(item, NULL)); + _sharednsitem_clear(item); + } +#ifndef NDEBUG + for (; i < ns->maxitems; i++) { + item = &ns->items[i]; + assert(!_sharednsitem_is_initialized(item)); + assert(!_sharednsitem_has_value(item, NULL)); + } +#endif + PyMem_RawFree(ns); } -static int -_sharedns_init(_PyXI_namespace *ns, PyObject *names) +static _PyXI_namespace * +_create_sharedns(PyObject *names) { - assert(!_sharedns_is_initialized(ns)); assert(names != NULL); - Py_ssize_t len = PyDict_CheckExact(names) + Py_ssize_t numnames = PyDict_CheckExact(names) ? PyDict_Size(names) : PySequence_Size(names); - if (len < 0) { - return -1; - } - if (len == 0) { - PyErr_SetString(PyExc_ValueError, "empty namespaces not allowed"); - return -1; - } - assert(len > 0); - // Allocate the items. - _PyXI_namespace_item *items = - PyMem_RawCalloc(sizeof(struct _sharednsitem), len); - if (items == NULL) { - PyErr_NoMemory(); - return -1; + _PyXI_namespace *ns = _sharedns_alloc(numnames); + if (ns == NULL) { + return NULL; } + _PyXI_namespace_item *items = ns->items; // Fill in the names. - Py_ssize_t i = -1; if (PyDict_CheckExact(names)) { + Py_ssize_t i = 0; Py_ssize_t pos = 0; - for (i=0; i < len; i++) { - PyObject *key; - if (!PyDict_Next(names, &pos, &key, NULL)) { - // This should not be possible. - assert(0); - goto error; - } - if (_sharednsitem_init(&items[i], key) < 0) { + PyObject *name; + while(PyDict_Next(names, &pos, &name, NULL)) { + if (_sharednsitem_init(&items[i], name) < 0) { goto error; } + ns->numnames += 1; + i += 1; } } else if (PySequence_Check(names)) { - for (i=0; i < len; i++) { - PyObject *key = PySequence_GetItem(names, i); - if (key == NULL) { + for (Py_ssize_t i = 0; i < numnames; i++) { + PyObject *name = PySequence_GetItem(names, i); + if (name == NULL) { goto error; } - int res = _sharednsitem_init(&items[i], key); - Py_DECREF(key); + int res = _sharednsitem_init(&items[i], name); + Py_DECREF(name); if (res < 0) { goto error; } + ns->numnames += 1; } } else { @@ -2071,140 +2127,79 @@ _sharedns_init(_PyXI_namespace *ns, PyObject *names) "non-sequence namespace not supported"); goto error; } - - ns->items = items; - ns->len = len; - assert(_sharedns_is_initialized(ns)); - return 0; + assert(ns->numnames == ns->maxitems); + return ns; error: - for (Py_ssize_t j=0; j < i; j++) { - _sharednsitem_clear(&items[j]); - } - PyMem_RawFree(items); - assert(!_sharedns_is_initialized(ns)); - return -1; -} - -void -_PyXI_FreeNamespace(_PyXI_namespace *ns) -{ - if (!_sharedns_is_initialized(ns)) { - return; - } - - int64_t interpid = -1; - if (!_sharedns_has_xidata(ns, &interpid)) { - _sharedns_free(ns); - return; - } - - if (interpid == PyInterpreterState_GetID(PyInterpreterState_Get())) { - _sharedns_free(ns); - } - else { - // If we weren't always dynamically allocating the cross-interpreter - // data in each item then we would need to using a pending call - // to call _sharedns_free(), to avoid the race between freeing - // the shared namespace and releasing the XI data. - _sharedns_free(ns); - } -} - -_PyXI_namespace * -_PyXI_NamespaceFromNames(PyObject *names) -{ - if (names == NULL || names == Py_None) { - return NULL; - } - - _PyXI_namespace *ns = _sharedns_new(); - if (ns == NULL) { - return NULL; - } - - if (_sharedns_init(ns, names) < 0) { - PyMem_RawFree(ns); - if (PySequence_Size(names) == 0) { - PyErr_Clear(); - } - return NULL; - } - - return ns; + _sharedns_free(ns); + return NULL; } -#ifndef NDEBUG -static int _session_is_active(_PyXI_session *); -#endif static void _propagate_not_shareable_error(_PyXI_session *); -int -_PyXI_FillNamespaceFromDict(_PyXI_namespace *ns, PyObject *nsobj, - _PyXI_session *session) -{ - // session must be entered already, if provided. - assert(session == NULL || _session_is_active(session)); - assert(_sharedns_is_initialized(ns)); - for (Py_ssize_t i=0; i < ns->len; i++) { - _PyXI_namespace_item *item = &ns->items[i]; - if (_sharednsitem_copy_from_ns(item, nsobj) < 0) { +static int +_fill_sharedns(_PyXI_namespace *ns, PyObject *nsobj, _PyXI_session *session) +{ + // All items are expected to be shareable. + assert(_sharedns_check_counts(ns)); + assert(ns->numnames == ns->maxitems); + assert(ns->numvalues == 0); + for (Py_ssize_t i=0; i < ns->maxitems; i++) { + if (_sharednsitem_copy_from_ns(&ns->items[i], nsobj) < 0) { _propagate_not_shareable_error(session); // Clear out the ones we set so far. for (Py_ssize_t j=0; j < i; j++) { _sharednsitem_clear_value(&ns->items[j]); + ns->numvalues -= 1; } return -1; } + ns->numvalues += 1; } return 0; } -// All items are expected to be shareable. -static _PyXI_namespace * -_PyXI_NamespaceFromDict(PyObject *nsobj, _PyXI_session *session) +static int +_sharedns_free_pending(void *data) { - // session must be entered already, if provided. - assert(session == NULL || _session_is_active(session)); - if (nsobj == NULL || nsobj == Py_None) { - return NULL; - } - if (!PyDict_CheckExact(nsobj)) { - PyErr_SetString(PyExc_TypeError, "expected a dict"); - return NULL; - } + _sharedns_free((_PyXI_namespace *)data); + return 0; +} - _PyXI_namespace *ns = _sharedns_new(); - if (ns == NULL) { - return NULL; +static void +_destroy_sharedns(_PyXI_namespace *ns) +{ + assert(_sharedns_check_counts(ns)); + assert(ns->numnames == ns->maxitems); + if (ns->numvalues == 0) { + _sharedns_free(ns); + return; } - if (_sharedns_init(ns, nsobj) < 0) { - if (PyDict_Size(nsobj) == 0) { - PyMem_RawFree(ns); - PyErr_Clear(); - return NULL; - } - goto error; + int64_t interpid0; + if (!_sharednsitem_has_value(&ns->items[0], &interpid0)) { + // This shouldn't have been possible. + // We can deal with it in _sharedns_free(). + _sharedns_free(ns); + return; } - - if (_PyXI_FillNamespaceFromDict(ns, nsobj, session) < 0) { - goto error; + PyInterpreterState *interp = _PyInterpreterState_LookUpID(interpid0); + if (interp == PyInterpreterState_Get()) { + _sharedns_free(ns); + return; } - return ns; - -error: - assert(PyErr_Occurred() - || (session != NULL && session->error_override != NULL)); - _sharedns_free(ns); - return NULL; + // One or more items may have interpreter-specific data. + // Currently the xidata for each value is dynamically allocated, + // so technically we don't need to worry about that. + // However, explicitly adding a pending call here is simpler. + (void)_Py_CallInInterpreter(interp, _sharedns_free_pending, ns); } -int -_PyXI_ApplyNamespace(_PyXI_namespace *ns, PyObject *nsobj, PyObject *dflt) +static int +_apply_sharedns(_PyXI_namespace *ns, PyObject *nsobj, PyObject *dflt) { - for (Py_ssize_t i=0; i < ns->len; i++) { + for (Py_ssize_t i=0; i < ns->maxitems; i++) { if (_sharednsitem_apply(&ns->items[i], nsobj, dflt) != 0) { return -1; } @@ -2213,9 +2208,79 @@ _PyXI_ApplyNamespace(_PyXI_namespace *ns, PyObject *nsobj, PyObject *dflt) } -/**********************/ -/* high-level helpers */ -/**********************/ +/*********************************/ +/* switched-interpreter sessions */ +/*********************************/ + +struct xi_session { +#define SESSION_UNUSED 0 +#define SESSION_ACTIVE 1 + int status; + int switched; + + // 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; +}; + + +_PyXI_session * +_PyXI_NewSession(void) +{ + _PyXI_session *session = PyMem_RawCalloc(1, sizeof(_PyXI_session)); + if (session == NULL) { + PyErr_NoMemory(); + return NULL; + } + return session; +} + +void +_PyXI_FreeSession(_PyXI_session *session) +{ + assert(session->status == SESSION_UNUSED); + PyMem_RawFree(session); +} + + +static inline int +_session_is_active(_PyXI_session *session) +{ + return session->status == SESSION_ACTIVE; +} + +static int _ensure_main_ns(_PyXI_session *); +static inline void _session_set_error(_PyXI_session *, _PyXI_errcode); +static void _capture_current_exception(_PyXI_session *); + /* enter/exit a cross-interpreter session */ @@ -2223,6 +2288,7 @@ static void _enter_session(_PyXI_session *session, PyInterpreterState *interp) { // Set here and cleared in _exit_session(). + assert(session->status == SESSION_UNUSED); assert(!session->own_init_tstate); assert(session->init_tstate == NULL); assert(session->prev_tstate == NULL); @@ -2237,15 +2303,22 @@ _enter_session(_PyXI_session *session, PyInterpreterState *interp) // Switch to interpreter. PyThreadState *tstate = PyThreadState_Get(); PyThreadState *prev = tstate; - if (interp != tstate->interp) { + int same_interp = (interp == tstate->interp); + if (!same_interp) { tstate = _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_EXEC); // XXX Possible GILState issues? - session->prev_tstate = PyThreadState_Swap(tstate); - assert(session->prev_tstate == prev); - session->own_init_tstate = 1; + PyThreadState *swapped = PyThreadState_Swap(tstate); + assert(swapped == prev); + (void)swapped; } - session->init_tstate = tstate; - session->prev_tstate = prev; + + *session = (_PyXI_session){ + .status = SESSION_ACTIVE, + .switched = !same_interp, + .init_tstate = tstate, + .prev_tstate = prev, + .own_init_tstate = !same_interp, + }; } static void @@ -2256,9 +2329,7 @@ _exit_session(_PyXI_session *session) assert(PyThreadState_Get() == tstate); // Release any of the entered interpreters resources. - if (session->main_ns != NULL) { - Py_CLEAR(session->main_ns); - } + Py_CLEAR(session->main_ns); // Ensure this thread no longer owns __main__. if (session->running) { @@ -2279,17 +2350,15 @@ _exit_session(_PyXI_session *session) else { assert(!session->own_init_tstate); } - session->prev_tstate = NULL; - session->init_tstate = NULL; -} -#ifndef NDEBUG -static int -_session_is_active(_PyXI_session *session) -{ - return (session->init_tstate != NULL); + // For now the error data persists past the exit. + *session = (_PyXI_session){ + .error_override = session->error_override, + .error = session->error, + ._error = session->_error, + ._error_override = session->_error_override, + }; } -#endif static void _propagate_not_shareable_error(_PyXI_session *session) @@ -2306,11 +2375,102 @@ _propagate_not_shareable_error(_PyXI_session *session) } if (PyErr_ExceptionMatches(exctype)) { // We want to propagate the exception directly. - session->_error_override = _PyXI_ERR_NOT_SHAREABLE; - session->error_override = &session->_error_override; + _session_set_error(session, _PyXI_ERR_NOT_SHAREABLE); } } +PyObject * +_PyXI_ApplyCapturedException(_PyXI_session *session) +{ + assert(!PyErr_Occurred()); + assert(session->error != NULL); + PyObject *res = _PyXI_ApplyError(session->error); + assert((res == NULL) != (PyErr_Occurred() == NULL)); + session->error = NULL; + return res; +} + +int +_PyXI_HasCapturedException(_PyXI_session *session) +{ + return session->error != NULL; +} + +int +_PyXI_Enter(_PyXI_session *session, + PyInterpreterState *interp, PyObject *nsupdates) +{ + // Convert the attrs for cross-interpreter use. + _PyXI_namespace *sharedns = NULL; + if (nsupdates != NULL) { + Py_ssize_t len = PyDict_Size(nsupdates); + if (len < 0) { + return -1; + } + if (len > 0) { + sharedns = _create_sharedns(nsupdates); + if (sharedns == NULL) { + return -1; + } + if (_fill_sharedns(sharedns, nsupdates, NULL) < 0) { + assert(session->error == NULL); + _destroy_sharedns(sharedns); + return -1; + } + } + } + + // Switch to the requested interpreter (if necessary). + _enter_session(session, interp); + _PyXI_errcode errcode = _PyXI_ERR_UNCAUGHT_EXCEPTION; + + // Ensure this thread owns __main__. + if (_PyInterpreterState_SetRunningMain(interp) < 0) { + // In the case where we didn't switch interpreters, it would + // be more efficient to leave the exception in place and return + // immediately. However, life is simpler if we don't. + errcode = _PyXI_ERR_ALREADY_RUNNING; + goto error; + } + session->running = 1; + + // Apply the cross-interpreter data. + if (sharedns != NULL) { + if (_ensure_main_ns(session) < 0) { + errcode = _PyXI_ERR_MAIN_NS_FAILURE; + goto error; + } + if (_apply_sharedns(sharedns, session->main_ns, NULL) < 0) { + errcode = _PyXI_ERR_APPLY_NS_FAILURE; + goto error; + } + _destroy_sharedns(sharedns); + } + + errcode = _PyXI_ERR_NO_ERROR; + assert(!PyErr_Occurred()); + return 0; + +error: + // We want to propagate all exceptions here directly (best effort). + _session_set_error(session, errcode); + _exit_session(session); + if (sharedns != NULL) { + _destroy_sharedns(sharedns); + } + return -1; +} + +void +_PyXI_Exit(_PyXI_session *session) +{ + _capture_current_exception(session); + _exit_session(session); +} + + +/* in an active cross-interpreter session */ + static void _capture_current_exception(_PyXI_session *session) { @@ -2372,100 +2532,55 @@ _capture_current_exception(_PyXI_session *session) // Finished! assert(!PyErr_Occurred()); - session->error = err; -} - -PyObject * -_PyXI_ApplyCapturedException(_PyXI_session *session) -{ - assert(!PyErr_Occurred()); - assert(session->error != NULL); - PyObject *res = _PyXI_ApplyError(session->error); - assert((res == NULL) != (PyErr_Occurred() == NULL)); - session->error = NULL; - return res; + session->error = err; } -int -_PyXI_HasCapturedException(_PyXI_session *session) +static inline void +_session_set_error(_PyXI_session *session, _PyXI_errcode errcode) { - return session->error != NULL; + assert(_session_is_active(session)); + assert(PyErr_Occurred()); + if (errcode != _PyXI_ERR_UNCAUGHT_EXCEPTION) { + session->_error_override = errcode; + session->error_override = &session->_error_override; + } + _capture_current_exception(session); } -int -_PyXI_Enter(_PyXI_session *session, - PyInterpreterState *interp, PyObject *nsupdates) +static int +_ensure_main_ns(_PyXI_session *session) { - // Convert the attrs for cross-interpreter use. - _PyXI_namespace *sharedns = NULL; - if (nsupdates != NULL) { - sharedns = _PyXI_NamespaceFromDict(nsupdates, NULL); - if (sharedns == NULL && PyErr_Occurred()) { - assert(session->error == NULL); - return -1; - } - } - - // Switch to the requested interpreter (if necessary). - _enter_session(session, interp); - PyThreadState *session_tstate = session->init_tstate; - _PyXI_errcode errcode = _PyXI_ERR_UNCAUGHT_EXCEPTION; - - // Ensure this thread owns __main__. - if (_PyInterpreterState_SetRunningMain(interp) < 0) { - // In the case where we didn't switch interpreters, it would - // be more efficient to leave the exception in place and return - // immediately. However, life is simpler if we don't. - errcode = _PyXI_ERR_ALREADY_RUNNING; - goto error; + assert(_session_is_active(session)); + if (session->main_ns != NULL) { + return 0; } - session->running = 1; - // Cache __main__.__dict__. - PyObject *main_mod = _Py_GetMainModule(session_tstate); + PyObject *main_mod = _Py_GetMainModule(session->init_tstate); if (_Py_CheckMainModule(main_mod) < 0) { - errcode = _PyXI_ERR_MAIN_NS_FAILURE; - goto error; + return -1; } PyObject *ns = PyModule_GetDict(main_mod); // borrowed Py_DECREF(main_mod); if (ns == NULL) { - errcode = _PyXI_ERR_MAIN_NS_FAILURE; - goto error; + return -1; } session->main_ns = Py_NewRef(ns); - - // Apply the cross-interpreter data. - if (sharedns != NULL) { - if (_PyXI_ApplyNamespace(sharedns, ns, NULL) < 0) { - errcode = _PyXI_ERR_APPLY_NS_FAILURE; - goto error; - } - _PyXI_FreeNamespace(sharedns); - } - - errcode = _PyXI_ERR_NO_ERROR; - assert(!PyErr_Occurred()); return 0; - -error: - assert(PyErr_Occurred()); - // We want to propagate all exceptions here directly (best effort). - assert(errcode != _PyXI_ERR_UNCAUGHT_EXCEPTION); - session->error_override = &errcode; - _capture_current_exception(session); - _exit_session(session); - if (sharedns != NULL) { - _PyXI_FreeNamespace(sharedns); - } - return -1; } -void -_PyXI_Exit(_PyXI_session *session) +PyObject * +_PyXI_GetMainNamespace(_PyXI_session *session) { - _capture_current_exception(session); - _exit_session(session); + if (!_session_is_active(session)) { + PyErr_SetString(PyExc_RuntimeError, "session not active"); + return NULL; + } + if (_ensure_main_ns(session) < 0) { + _session_set_error(session, _PyXI_ERR_MAIN_NS_FAILURE); + _capture_current_exception(session); + return NULL; + } + return session->main_ns; } From 7480e50217299cf0bf69abce8f3e9d0ef1fcdef9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 19:49:05 +0200 Subject: [PATCH 0206/1674] [3.14] gh-132775: Fix Recently Introduced Warnings (gh-134532) (cherry picked from commit ac06b534eed, AKA gh-134530) Co-authored-by: Eric Snow --- Modules/_interpchannelsmodule.c | 2 +- Modules/_interpqueuesmodule.c | 2 +- Python/crossinterp.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/_interpchannelsmodule.c b/Modules/_interpchannelsmodule.c index 0ab553190001bd..bfd805bf5e4072 100644 --- a/Modules/_interpchannelsmodule.c +++ b/Modules/_interpchannelsmodule.c @@ -3443,7 +3443,7 @@ channelsmod_get_channel_defaults(PyObject *self, PyObject *args, PyObject *kwds) } int64_t cid = cid_data.cid; - struct _channeldefaults defaults; + struct _channeldefaults defaults = {0}; int err = channel_get_defaults(&_globals.channels, cid, &defaults); if (handle_channel_error(err, self, cid)) { return NULL; diff --git a/Modules/_interpqueuesmodule.c b/Modules/_interpqueuesmodule.c index 816285c9eff44a..ffc52c8ee74d85 100644 --- a/Modules/_interpqueuesmodule.c +++ b/Modules/_interpqueuesmodule.c @@ -1772,7 +1772,7 @@ queuesmod_get_queue_defaults(PyObject *self, PyObject *args, PyObject *kwds) } int64_t qid = qidarg.id; - struct _queuedefaults defaults; + struct _queuedefaults defaults = {0}; int err = queue_get_defaults(&_globals.queues, qid, &defaults); if (handle_queue_error(err, self, qid)) { return NULL; diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 65ccab32daf730..26eecdddf4bdd0 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -1795,6 +1795,7 @@ typedef struct _sharednsitem { // in a different interpreter to release the XI data. } _PyXI_namespace_item; +#ifndef NDEBUG static int _sharednsitem_is_initialized(_PyXI_namespace_item *item) { @@ -1803,6 +1804,7 @@ _sharednsitem_is_initialized(_PyXI_namespace_item *item) } return 0; } +#endif static int _sharednsitem_init(_PyXI_namespace_item *item, PyObject *key) From 37c2c8c9d8a20fdc9e9d5247d96ea6719de3134d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 20:32:49 +0200 Subject: [PATCH 0207/1674] [3.14] Docs: Add note to tutorial clarifying scope (GH-134534) (#134536) Docs: Add note to tutorial clarifying scope (GH-134534) * Add note to tutorial * Update formatting (cherry picked from commit 742d5b5c5d75eae44c66a43ebfa24a4f286ea8a1) Co-authored-by: Kattni --- Doc/tutorial/index.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Doc/tutorial/index.rst b/Doc/tutorial/index.rst index 96791f88c867ab..d0bf77dc40d0a1 100644 --- a/Doc/tutorial/index.rst +++ b/Doc/tutorial/index.rst @@ -4,6 +4,10 @@ The Python Tutorial ###################### +.. Tip:: This tutorial is designed for + *programmers* that are new to the Python language, + **not** *beginners* who are new to programming. + Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming. Python's elegant syntax and dynamic typing, @@ -21,7 +25,8 @@ implemented in C or C++ (or other languages callable from C). Python is also suitable as an extension language for customizable applications. This tutorial introduces the reader informally to the basic concepts and -features of the Python language and system. It helps to have a Python +features of the Python language and system. Be aware that it expects you to +have a basic understanding of programming in general. It helps to have a Python interpreter handy for hands-on experience, but all examples are self-contained, so the tutorial can be read off-line as well. From 06a3a85f15d482b5a6880925417bc66f481efedc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 23:37:52 +0200 Subject: [PATCH 0208/1674] [3.14] Avoid `__file__` in `hashlib` example (GH-134540) (#134549) Avoid `__file__` in `hashlib` example (GH-134540) (cherry picked from commit 9b292ff0223dab0f999d5c1e13355552fd7cd528) Co-authored-by: Josh Cannon --- Doc/library/hashlib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index bb2d2fad23bdb8..4818a4944a512a 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -284,7 +284,7 @@ a file or file-like object. Example: >>> import io, hashlib, hmac - >>> with open(hashlib.__file__, "rb") as f: + >>> with open("library/hashlib.rst", "rb") as f: ... digest = hashlib.file_digest(f, "sha256") ... >>> digest.hexdigest() # doctest: +ELLIPSIS From 15e26eebf79d2337eb20338fd9c90f7d3bcd047c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 May 2025 23:42:23 +0200 Subject: [PATCH 0209/1674] [3.14] GH-130397: remove special-casing of C stack depth for WASI (GH-134469) (GH-134547) GH-130397: remove special-casing of C stack depth for WASI (GH-134469) Removed special-casing for WASI when setting C stack depth limits. Since WASI has its own C stack checking this isn't a security risk. Also disabled some tests that stopped passing. They all happened to have already been disabled under Emscripten. (cherry picked from commit ad42dc1909bdf8ec775b63fb22ed48ff42797a17) Co-authored-by: Brett Cannon --- Include/pythonrun.h | 3 --- Lib/test/test_copy.py | 3 +++ Lib/test/test_descr.py | 2 ++ Lib/test/test_exception_group.py | 4 +++- Lib/test/test_isinstance.py | 2 ++ Lib/test/test_json/test_recursion.py | 2 ++ .../2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst | 3 +++ Python/ceval.c | 3 --- 8 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst diff --git a/Include/pythonrun.h b/Include/pythonrun.h index fad2b3c77476e4..716c4ab3c81cae 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -29,9 +29,6 @@ PyAPI_DATA(int) (*PyOS_InputHook)(void); # define PYOS_LOG2_STACK_MARGIN 12 #elif defined(Py_DEBUG) && defined(WIN32) # define PYOS_LOG2_STACK_MARGIN 12 -#elif defined(__wasi__) - /* Web assembly has two stacks, so this isn't really a size */ -# define PYOS_LOG2_STACK_MARGIN 9 #else # define PYOS_LOG2_STACK_MARGIN 11 #endif diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 3cb8072abefe98..467ec09d99e462 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -372,6 +372,7 @@ def test_deepcopy_list(self): self.assertIsNot(x[0], y[0]) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_deepcopy_reflexive_list(self): x = [] x.append(x) @@ -400,6 +401,7 @@ def test_deepcopy_tuple_of_immutables(self): self.assertIs(x, y) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_deepcopy_reflexive_tuple(self): x = ([],) x[0].append(x) @@ -418,6 +420,7 @@ def test_deepcopy_dict(self): self.assertIsNot(x["foo"], y["foo"]) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_deepcopy_reflexive_dict(self): x = {} x['foo'] = x diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index d635855f537af0..ea076ba4fef2db 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -3943,6 +3943,7 @@ def __del__(self): del C.__del__ @unittest.skipIf(support.is_emscripten, "Seems to works in Pyodide?") + @support.skip_wasi_stack_overflow() def test_slots_trash(self): # Testing slot trash... # Deallocating deeply nested slotted trash caused stack overflows @@ -4868,6 +4869,7 @@ class Thing: deque.append(thing, thing) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_repr_as_str(self): # Issue #11603: crash or infinite loop when rebinding __str__ as # __repr__. diff --git a/Lib/test/test_exception_group.py b/Lib/test/test_exception_group.py index 242d7ced007b10..5df2c41c6b56bc 100644 --- a/Lib/test/test_exception_group.py +++ b/Lib/test/test_exception_group.py @@ -1,7 +1,7 @@ import collections.abc import types import unittest -from test.support import skip_emscripten_stack_overflow, exceeds_recursion_limit +from test.support import skip_emscripten_stack_overflow, skip_wasi_stack_overflow, exceeds_recursion_limit class TestExceptionGroupTypeHierarchy(unittest.TestCase): def test_exception_group_types(self): @@ -465,12 +465,14 @@ def make_deep_eg(self): return e @skip_emscripten_stack_overflow() + @skip_wasi_stack_overflow() def test_deep_split(self): e = self.make_deep_eg() with self.assertRaises(RecursionError): e.split(TypeError) @skip_emscripten_stack_overflow() + @skip_wasi_stack_overflow() def test_deep_subgroup(self): e = self.make_deep_eg() with self.assertRaises(RecursionError): diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py index daad00e86432d0..f440fc28ee7b7d 100644 --- a/Lib/test/test_isinstance.py +++ b/Lib/test/test_isinstance.py @@ -318,6 +318,7 @@ def __bases__(self): self.assertRaises(RecursionError, isinstance, 1, X()) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_infinite_recursion_via_bases_tuple(self): """Regression test for bpo-30570.""" class Failure(object): @@ -328,6 +329,7 @@ def __getattr__(self, attr): issubclass(Failure(), int) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_infinite_cycle_in_bases(self): """Regression test for bpo-30570.""" class X: diff --git a/Lib/test/test_json/test_recursion.py b/Lib/test/test_json/test_recursion.py index d82093f3895167..8f0e5e078ed0d4 100644 --- a/Lib/test/test_json/test_recursion.py +++ b/Lib/test/test_json/test_recursion.py @@ -69,6 +69,7 @@ def default(self, o): @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_highly_nested_objects_decoding(self): very_deep = 200000 # test that loading highly-nested objects doesn't segfault when C @@ -98,6 +99,7 @@ def test_highly_nested_objects_encoding(self): self.dumps(d) @support.skip_emscripten_stack_overflow() + @support.skip_wasi_stack_overflow() def test_endless_recursion(self): # See #12051 class EndlessJSONEncoder(self.json.JSONEncoder): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst new file mode 100644 index 00000000000000..34a2f4d1278e74 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst @@ -0,0 +1,3 @@ +Remove special-casing for C stack depth limits for WASI. Due to +WebAssembly's built-in stack protection this does not pose a security +concern. diff --git a/Python/ceval.c b/Python/ceval.c index 490b653f132a6a..d1b6b9f1a1a35f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -360,9 +360,6 @@ _Py_EnterRecursiveCallUnchecked(PyThreadState *tstate) # define Py_C_STACK_SIZE 1200000 #elif defined(__sparc__) # define Py_C_STACK_SIZE 1600000 -#elif defined(__wasi__) - /* Web assembly has two stacks, so this isn't really the stack depth */ -# define Py_C_STACK_SIZE 131072 // wasi-libc DEFAULT_STACK_SIZE #elif defined(__hppa__) || defined(__powerpc64__) # define Py_C_STACK_SIZE 2000000 #else From 8f4bf1538d2d05d502417b0da6623727519ab945 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 22 May 2025 15:07:21 -0700 Subject: [PATCH 0210/1674] [3.14] GH-131769: fix detecting a pydebug build of the build Python when building for WASI (GH-133219) --- ...-04-30-10-22-08.gh-issue-131769.H0oy5x.rst | 1 + Tools/wasm/wasi.py | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-04-30-10-22-08.gh-issue-131769.H0oy5x.rst diff --git a/Misc/NEWS.d/next/Build/2025-04-30-10-22-08.gh-issue-131769.H0oy5x.rst b/Misc/NEWS.d/next/Build/2025-04-30-10-22-08.gh-issue-131769.H0oy5x.rst new file mode 100644 index 00000000000000..834b0d9f7e145d --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-04-30-10-22-08.gh-issue-131769.H0oy5x.rst @@ -0,0 +1 @@ +Fix detecting when the build Python in a cross-build is a pydebug build. diff --git a/Tools/wasm/wasi.py b/Tools/wasm/wasi.py index a742043e4be1d2..5f60f0ec469dd1 100644 --- a/Tools/wasm/wasi.py +++ b/Tools/wasm/wasi.py @@ -111,7 +111,7 @@ def call(command, *, quiet, **kwargs): def build_platform(): """The name of the build/host platform.""" - # Can also be found via `config.guess`.` + # Can also be found via `config.guess`. return sysconfig.get_config_var("BUILD_GNU_TYPE") @@ -127,6 +127,15 @@ def build_python_path(): return binary +def build_python_is_pydebug(): + """Find out if the build Python is a pydebug build.""" + test = "import sys, test.support; sys.exit(test.support.Py_DEBUG)" + result = subprocess.run([build_python_path(), "-c", test], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + return bool(result.returncode) + + @subdir(BUILD_DIR, clean_ok=True) def configure_build_python(context, working_dir): """Configure the build/host Python.""" @@ -213,18 +222,15 @@ def configure_wasi_python(context, working_dir): lib_dirs = list(python_build_dir.glob("lib.*")) assert len(lib_dirs) == 1, f"Expected a single lib.* directory in {python_build_dir}" lib_dir = os.fsdecode(lib_dirs[0]) - pydebug = lib_dir.endswith("-pydebug") - python_version = lib_dir.removesuffix("-pydebug").rpartition("-")[-1] - sysconfig_data = f"{wasi_build_dir}/build/lib.wasi-wasm32-{python_version}" - if pydebug: - sysconfig_data += "-pydebug" + python_version = lib_dir.rpartition("-")[-1] + sysconfig_data_dir = f"{wasi_build_dir}/build/lib.wasi-wasm32-{python_version}" # Use PYTHONPATH to include sysconfig data which must be anchored to the # WASI guest's `/` directory. args = {"GUEST_DIR": "/", "HOST_DIR": CHECKOUT, "ENV_VAR_NAME": "PYTHONPATH", - "ENV_VAR_VALUE": f"/{sysconfig_data}", + "ENV_VAR_VALUE": f"/{sysconfig_data_dir}", "PYTHON_WASM": working_dir / "python.wasm"} # Check dynamically for wasmtime in case it was specified manually via # `--host-runner`. @@ -244,7 +250,7 @@ def configure_wasi_python(context, working_dir): f"--host={context.host_triple}", f"--build={build_platform()}", f"--with-build-python={build_python}"] - if pydebug: + if build_python_is_pydebug(): configure.append("--with-pydebug") if context.args: configure.extend(context.args) From ee3a0efc9decfceaf00448beacdb2af688c68744 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 02:42:48 +0200 Subject: [PATCH 0211/1674] [3.14] Docs: fix link in free-threading-python.rst (GH-134548) (#134555) --- Doc/howto/free-threading-python.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/free-threading-python.rst b/Doc/howto/free-threading-python.rst index f7a894ac2cd78e..c33cef2c8e935b 100644 --- a/Doc/howto/free-threading-python.rst +++ b/Doc/howto/free-threading-python.rst @@ -32,7 +32,7 @@ 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 -`_, a +`_, a community-maintained installation guide for installing free-threaded Python. When building CPython from source, the :option:`--disable-gil` configure option From 1cdbb33771f737968f73b4e8bdce04551db1a417 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 06:06:19 +0200 Subject: [PATCH 0212/1674] [3.14] gh-128307: Update docs for asyncio.create_task, TaskGroup.create_task, asyncio.create_task (GH-134202) (#134553) gh-128307: Update docs for asyncio.create_task, TaskGroup.create_task, asyncio.create_task (GH-134202) (cherry picked from commit a3d0306ca08d09b1417d72df62e3b9d775143031) Co-authored-by: Thomas Grainger --- Doc/library/asyncio-eventloop.rst | 25 +++++++++++++++++++++++-- Doc/library/asyncio-task.rst | 21 +++++++++++++++++---- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 21f7d0547af1dd..91970c282391f7 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -361,7 +361,7 @@ Creating Futures and Tasks .. versionadded:: 3.5.2 -.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None) +.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None, **kwargs) Schedule the execution of :ref:`coroutine ` *coro*. Return a :class:`Task` object. @@ -370,6 +370,10 @@ Creating Futures and Tasks for interoperability. In this case, the result type is a subclass of :class:`Task`. + The full function signature is largely the same as that of the + :class:`Task` constructor (or factory) - all of the keyword arguments to + this function are passed through to that interface. + If the *name* argument is provided and not ``None``, it is set as the name of the task using :meth:`Task.set_name`. @@ -388,8 +392,15 @@ Creating Futures and Tasks .. versionchanged:: 3.11 Added the *context* parameter. + .. versionchanged:: 3.13.3 + Added ``kwargs`` which passes on arbitrary extra parameters, including ``name`` and ``context``. + + .. versionchanged:: 3.13.4 + Rolled back the change that passes on *name* and *context* (if it is None), + while still passing on other arbitrary keyword arguments (to avoid breaking backwards compatibility with 3.13.3). + .. versionchanged:: 3.14 - Added the *eager_start* parameter. + All *kwargs* are now passed on. The *eager_start* parameter works with eager task factories. .. method:: loop.set_task_factory(factory) @@ -402,6 +413,16 @@ Creating Futures and Tasks event loop, and *coro* is a coroutine object. The callable must pass on all *kwargs*, and return a :class:`asyncio.Task`-compatible object. + .. versionchanged:: 3.13.3 + Required that all *kwargs* are passed on to :class:`asyncio.Task`. + + .. versionchanged:: 3.13.4 + *name* is no longer passed to task factories. *context* is no longer passed + to task factories if it is ``None``. + + .. versionchanged:: 3.14 + *name* and *context* are now unconditionally passed on to task factories again. + .. method:: loop.get_task_factory() Return a task factory or ``None`` if the default one is in use. diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 59acce1990ae04..b19ffa8213a971 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -238,18 +238,24 @@ Creating Tasks ----------------------------------------------- -.. function:: create_task(coro, *, name=None, context=None) +.. function:: create_task(coro, *, name=None, context=None, eager_start=None, **kwargs) Wrap the *coro* :ref:`coroutine ` into a :class:`Task` and schedule its execution. Return the Task object. - If *name* is not ``None``, it is set as the name of the task using - :meth:`Task.set_name`. + The full function signature is largely the same as that of the + :class:`Task` constructor (or factory) - all of the keyword arguments to + this function are passed through to that interface. An optional keyword-only *context* argument allows specifying a custom :class:`contextvars.Context` for the *coro* to run in. The current context copy is created when no *context* is provided. + An optional keyword-only *eager_start* argument allows specifying + if the task should execute eagerly during the call to create_task, + or be scheduled later. If *eager_start* is not passed the mode set + by :meth:`loop.set_task_factory` will be used. + The task is executed in the loop returned by :func:`get_running_loop`, :exc:`RuntimeError` is raised if there is no running loop in current thread. @@ -290,6 +296,9 @@ Creating Tasks .. versionchanged:: 3.11 Added the *context* parameter. + .. versionchanged:: 3.14 + Added the *eager_start* parameter by passing on all *kwargs*. + Task Cancellation ================= @@ -330,7 +339,7 @@ and reliable way to wait for all tasks in the group to finish. .. versionadded:: 3.11 - .. method:: create_task(coro, *, name=None, context=None) + .. method:: create_task(coro, *, name=None, context=None, eager_start=None, **kwargs) Create a task in this task group. The signature matches that of :func:`asyncio.create_task`. @@ -342,6 +351,10 @@ and reliable way to wait for all tasks in the group to finish. Close the given coroutine if the task group is not active. + .. versionchanged:: 3.14 + + Passes on all *kwargs* to :meth:`loop.create_task` + Example:: async def main(): From c67eb41a3be8195e411da305246d7915a3ba960e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 06:58:51 +0200 Subject: [PATCH 0213/1674] [3.14] gh-114177: avoid calling connection lost callbacks when loop is already closed in asyncio subprocess (GH-134508) (#134561) gh-114177: avoid calling connection lost callbacks when loop is already closed in asyncio subprocess (GH-134508) (cherry picked from commit 5804ee7b467d86131be3ff7d569443efb0d0f9fd) Co-authored-by: Kumar Aditya --- Lib/asyncio/base_subprocess.py | 7 ++++++- .../Library/2025-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py index 9c2ba679ce2bf1..d40af422e614c1 100644 --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -104,7 +104,12 @@ def close(self): for proto in self._pipes.values(): if proto is None: continue - proto.pipe.close() + # See gh-114177 + # skip closing the pipe if loop is already closed + # this can happen e.g. when loop is closed immediately after + # process is killed + if self._loop and not self._loop.is_closed(): + proto.pipe.close() if (self._proc is not None and # has the child process finished? diff --git a/Misc/NEWS.d/next/Library/2025-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst b/Misc/NEWS.d/next/Library/2025-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst new file mode 100644 index 00000000000000..c98fde5fb04f5c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst @@ -0,0 +1 @@ +Fix :mod:`asyncio` to not close subprocess pipes which would otherwise error out when the event loop is already closed. From 73967c4c0149f04f3b5043a260f1a45ed23331b9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 07:40:56 +0200 Subject: [PATCH 0214/1674] [3.14] gh-134451: Converted `asyncio.tools.CycleFoundException` from dataclass to a regular exception type. (GH-134513) (#134564) gh-134451: Converted `asyncio.tools.CycleFoundException` from dataclass to a regular exception type. (GH-134513) (cherry picked from commit f9324cb3cb4d9bb9f0aef2e48b8afa895bde4b0d) Co-authored-by: Evgeny Demchenko --- Lib/asyncio/tools.py | 12 +++++++++--- .../2025-05-22-14-12-53.gh-issue-134451.M1rD-j.rst | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-22-14-12-53.gh-issue-134451.M1rD-j.rst diff --git a/Lib/asyncio/tools.py b/Lib/asyncio/tools.py index bf1cb5e64cbfbe..b2da7d2f6ba10c 100644 --- a/Lib/asyncio/tools.py +++ b/Lib/asyncio/tools.py @@ -13,11 +13,17 @@ class NodeType(Enum): TASK = 2 -@dataclass(frozen=True) class CycleFoundException(Exception): """Raised when there is a cycle when drawing the call tree.""" - cycles: list[list[int]] - id2name: dict[int, str] + def __init__( + self, + cycles: list[list[int]], + id2name: dict[int, str], + ) -> None: + super().__init__(cycles, id2name) + self.cycles = cycles + self.id2name = id2name + # ─── indexing helpers ─────────────────────────────────────────── diff --git a/Misc/NEWS.d/next/Library/2025-05-22-14-12-53.gh-issue-134451.M1rD-j.rst b/Misc/NEWS.d/next/Library/2025-05-22-14-12-53.gh-issue-134451.M1rD-j.rst new file mode 100644 index 00000000000000..3c8339f8842254 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-22-14-12-53.gh-issue-134451.M1rD-j.rst @@ -0,0 +1 @@ +Converted ``asyncio.tools.CycleFoundException`` from dataclass to a regular exception type. From 7efe67ae3597b654c7d0005763e148a5d0e9d9ef Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 11:51:17 +0200 Subject: [PATCH 0215/1674] [3.14] gh-106318: Add example for `str.center()` (GH-134518) (#134571) Co-authored-by: Blaise Pabon --- Doc/library/stdtypes.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 3486a18b5cb1f0..ce613476854110 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1788,8 +1788,14 @@ expression support in the :mod:`re` module). Return centered in a string of length *width*. Padding is done using the specified *fillchar* (default is an ASCII space). The original string is - returned if *width* is less than or equal to ``len(s)``. - + returned if *width* is less than or equal to ``len(s)``. For example:: + + >>> 'Python'.center(10) + ' Python ' + >>> 'Python'.center(10, '-') + '--Python--' + >>> 'Python'.center(4) + 'Python' .. method:: str.count(sub[, start[, end]]) From 896b745a7a191c144c27893933b8bf57b4fc77a9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 11:53:16 +0200 Subject: [PATCH 0216/1674] [3.14] gh-106318: Add example for `str.count()` (GH-134519) (#134574) Co-authored-by: Blaise Pabon --- Doc/library/stdtypes.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ce613476854110..31d71031bca12c 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1805,8 +1805,18 @@ expression support in the :mod:`re` module). interpreted as in slice notation. If *sub* is empty, returns the number of empty strings between characters - which is the length of the string plus one. - + which is the length of the string plus one. For example:: + + >>> 'spam, spam, spam'.count('spam') + 3 + >>> 'spam, spam, spam'.count('spam', 5) + 2 + >>> 'spam, spam, spam'.count('spam', 5, 10) + 1 + >>> 'spam, spam, spam'.count('eggs') + 0 + >>> 'spam, spam, spam'.count('') + 17 .. method:: str.encode(encoding="utf-8", errors="strict") From 81675941fb51f09b89ba46bce237222a87ea60f6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 12:00:38 +0200 Subject: [PATCH 0217/1674] [3.14] gh-133885: Use locks instead of critical sections for _zstd (gh-134289) (gh-134560) Move from using critical sections to locks for the (de)compression methods. Since the methods allow other threads to run, we should use a lock rather than a critical section. (cherry picked from commit 8dbc11971974a725dc8a11c0dc65d8f6fcb4d902) Co-authored-by: Emma Smith --- Lib/test/test_zstd.py | 56 +++++++++- Modules/_zstd/clinic/decompressor.c.h | 11 +- Modules/_zstd/clinic/zstddict.c.h | 27 +---- Modules/_zstd/compressor.c | 151 ++++++++++++++------------ Modules/_zstd/decompressor.c | 150 +++++++++++++------------ Modules/_zstd/zstddict.c | 13 ++- Modules/_zstd/zstddict.h | 3 + 7 files changed, 229 insertions(+), 182 deletions(-) diff --git a/Lib/test/test_zstd.py b/Lib/test/test_zstd.py index 53ca592ea38828..084f8f24fc009c 100644 --- a/Lib/test/test_zstd.py +++ b/Lib/test/test_zstd.py @@ -2430,10 +2430,8 @@ def test_buffer_protocol(self): self.assertEqual(f.write(arr), LENGTH) self.assertEqual(f.tell(), LENGTH) -@unittest.skip("it fails for now, see gh-133885") class FreeThreadingMethodTests(unittest.TestCase): - @unittest.skipUnless(Py_GIL_DISABLED, 'this test can only possibly fail with GIL disabled') @threading_helper.reap_threads @threading_helper.requires_working_threading() def test_compress_locking(self): @@ -2470,7 +2468,6 @@ def run_method(method, input_data, output_data): actual = b''.join(output) + rest2 self.assertEqual(expected, actual) - @unittest.skipUnless(Py_GIL_DISABLED, 'this test can only possibly fail with GIL disabled') @threading_helper.reap_threads @threading_helper.requires_working_threading() def test_decompress_locking(self): @@ -2506,6 +2503,59 @@ def run_method(method, input_data, output_data): actual = b''.join(output) self.assertEqual(expected, actual) + @threading_helper.reap_threads + @threading_helper.requires_working_threading() + def test_compress_shared_dict(self): + num_threads = 8 + + def run_method(b): + level = threading.get_ident() % 4 + # sync threads to increase chance of contention on + # capsule storing dictionary levels + b.wait() + ZstdCompressor(level=level, + zstd_dict=TRAINED_DICT.as_digested_dict) + b.wait() + ZstdCompressor(level=level, + zstd_dict=TRAINED_DICT.as_undigested_dict) + b.wait() + ZstdCompressor(level=level, + zstd_dict=TRAINED_DICT.as_prefix) + threads = [] + + b = threading.Barrier(num_threads) + for i in range(num_threads): + thread = threading.Thread(target=run_method, args=(b,)) + + threads.append(thread) + + with threading_helper.start_threads(threads): + pass + + @threading_helper.reap_threads + @threading_helper.requires_working_threading() + def test_decompress_shared_dict(self): + num_threads = 8 + + def run_method(b): + # sync threads to increase chance of contention on + # decompression dictionary + b.wait() + ZstdDecompressor(zstd_dict=TRAINED_DICT.as_digested_dict) + b.wait() + ZstdDecompressor(zstd_dict=TRAINED_DICT.as_undigested_dict) + b.wait() + ZstdDecompressor(zstd_dict=TRAINED_DICT.as_prefix) + threads = [] + + b = threading.Barrier(num_threads) + for i in range(num_threads): + thread = threading.Thread(target=run_method, args=(b,)) + + threads.append(thread) + + with threading_helper.start_threads(threads): + pass if __name__ == "__main__": diff --git a/Modules/_zstd/clinic/decompressor.c.h b/Modules/_zstd/clinic/decompressor.c.h index 4ecb19e9bde6ed..c6fdae74ab0447 100644 --- a/Modules/_zstd/clinic/decompressor.c.h +++ b/Modules/_zstd/clinic/decompressor.c.h @@ -7,7 +7,6 @@ preserve # include "pycore_runtime.h" // _Py_ID() #endif #include "pycore_abstract.h" // _PyNumber_Index() -#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() PyDoc_STRVAR(_zstd_ZstdDecompressor_new__doc__, @@ -114,13 +113,7 @@ _zstd_ZstdDecompressor_unused_data_get_impl(ZstdDecompressor *self); static PyObject * _zstd_ZstdDecompressor_unused_data_get(PyObject *self, void *Py_UNUSED(context)) { - PyObject *return_value = NULL; - - Py_BEGIN_CRITICAL_SECTION(self); - return_value = _zstd_ZstdDecompressor_unused_data_get_impl((ZstdDecompressor *)self); - Py_END_CRITICAL_SECTION(); - - return return_value; + return _zstd_ZstdDecompressor_unused_data_get_impl((ZstdDecompressor *)self); } PyDoc_STRVAR(_zstd_ZstdDecompressor_decompress__doc__, @@ -227,4 +220,4 @@ _zstd_ZstdDecompressor_decompress(PyObject *self, PyObject *const *args, Py_ssiz return return_value; } -/*[clinic end generated code: output=7a4d278f9244e684 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=30c12ef047027ede input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/clinic/zstddict.c.h b/Modules/_zstd/clinic/zstddict.c.h index 34e0e4b3ecfe72..aaa29e491bc1bb 100644 --- a/Modules/_zstd/clinic/zstddict.c.h +++ b/Modules/_zstd/clinic/zstddict.c.h @@ -6,7 +6,6 @@ preserve # include "pycore_gc.h" // PyGC_Head # include "pycore_runtime.h" // _Py_ID() #endif -#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() PyDoc_STRVAR(_zstd_ZstdDict_new__doc__, @@ -118,13 +117,7 @@ _zstd_ZstdDict_as_digested_dict_get_impl(ZstdDict *self); static PyObject * _zstd_ZstdDict_as_digested_dict_get(PyObject *self, void *Py_UNUSED(context)) { - PyObject *return_value = NULL; - - Py_BEGIN_CRITICAL_SECTION(self); - return_value = _zstd_ZstdDict_as_digested_dict_get_impl((ZstdDict *)self); - Py_END_CRITICAL_SECTION(); - - return return_value; + return _zstd_ZstdDict_as_digested_dict_get_impl((ZstdDict *)self); } PyDoc_STRVAR(_zstd_ZstdDict_as_undigested_dict__doc__, @@ -156,13 +149,7 @@ _zstd_ZstdDict_as_undigested_dict_get_impl(ZstdDict *self); static PyObject * _zstd_ZstdDict_as_undigested_dict_get(PyObject *self, void *Py_UNUSED(context)) { - PyObject *return_value = NULL; - - Py_BEGIN_CRITICAL_SECTION(self); - return_value = _zstd_ZstdDict_as_undigested_dict_get_impl((ZstdDict *)self); - Py_END_CRITICAL_SECTION(); - - return return_value; + return _zstd_ZstdDict_as_undigested_dict_get_impl((ZstdDict *)self); } PyDoc_STRVAR(_zstd_ZstdDict_as_prefix__doc__, @@ -194,12 +181,6 @@ _zstd_ZstdDict_as_prefix_get_impl(ZstdDict *self); static PyObject * _zstd_ZstdDict_as_prefix_get(PyObject *self, void *Py_UNUSED(context)) { - PyObject *return_value = NULL; - - Py_BEGIN_CRITICAL_SECTION(self); - return_value = _zstd_ZstdDict_as_prefix_get_impl((ZstdDict *)self); - Py_END_CRITICAL_SECTION(); - - return return_value; + return _zstd_ZstdDict_as_prefix_get_impl((ZstdDict *)self); } -/*[clinic end generated code: output=bfb31c1187477afd input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8692eabee4e0d1fe input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index 38baee2be1e95b..8f934858ef784f 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -17,6 +17,7 @@ class _zstd.ZstdCompressor "ZstdCompressor *" "&zstd_compressor_type_spec" #include "_zstdmodule.h" #include "buffer.h" #include "zstddict.h" +#include "internal/pycore_lock.h" // PyMutex_IsLocked #include // offsetof() #include // ZSTD_*() @@ -38,6 +39,9 @@ typedef struct { /* Compression level */ int compression_level; + + /* Lock to protect the compression context */ + PyMutex lock; } ZstdCompressor; #define ZstdCompressor_CAST(op) ((ZstdCompressor *)op) @@ -149,12 +153,12 @@ capsule_free_cdict(PyObject *capsule) ZSTD_CDict * _get_CDict(ZstdDict *self, int compressionLevel) { + assert(PyMutex_IsLocked(&self->lock)); PyObject *level = NULL; - PyObject *capsule; + PyObject *capsule = NULL; ZSTD_CDict *cdict; + int ret; - // TODO(emmatyping): refactor critical section code into a lock_held function - Py_BEGIN_CRITICAL_SECTION(self); /* int level object */ level = PyLong_FromLong(compressionLevel); @@ -163,12 +167,11 @@ _get_CDict(ZstdDict *self, int compressionLevel) } /* Get PyCapsule object from self->c_dicts */ - capsule = PyDict_GetItemWithError(self->c_dicts, level); + ret = PyDict_GetItemRef(self->c_dicts, level, &capsule); + if (ret < 0) { + goto error; + } if (capsule == NULL) { - if (PyErr_Occurred()) { - goto error; - } - /* Create ZSTD_CDict instance */ char *dict_buffer = PyBytes_AS_STRING(self->dict_content); Py_ssize_t dict_len = Py_SIZE(self->dict_content); @@ -196,11 +199,10 @@ _get_CDict(ZstdDict *self, int compressionLevel) } /* Add PyCapsule object to self->c_dicts */ - if (PyDict_SetItem(self->c_dicts, level, capsule) < 0) { - Py_DECREF(capsule); + ret = PyDict_SetItem(self->c_dicts, level, capsule); + if (ret < 0) { goto error; } - Py_DECREF(capsule); } else { /* ZSTD_CDict instance already exists */ @@ -212,15 +214,55 @@ _get_CDict(ZstdDict *self, int compressionLevel) cdict = NULL; success: Py_XDECREF(level); - Py_END_CRITICAL_SECTION(); + Py_XDECREF(capsule); return cdict; } static int -_zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) +_zstd_load_impl(ZstdCompressor *self, ZstdDict *zd, + _zstd_state *mod_state, int type) { - size_t zstd_ret; + if (type == DICT_TYPE_DIGESTED) { + /* Get ZSTD_CDict */ + ZSTD_CDict *c_dict = _get_CDict(zd, self->compression_level); + if (c_dict == NULL) { + return -1; + } + /* Reference a prepared dictionary. + It overrides some compression context's parameters. */ + zstd_ret = ZSTD_CCtx_refCDict(self->cctx, c_dict); + } + else if (type == DICT_TYPE_UNDIGESTED) { + /* Load a dictionary. + It doesn't override compression context's parameters. */ + zstd_ret = ZSTD_CCtx_loadDictionary( + self->cctx, + PyBytes_AS_STRING(zd->dict_content), + Py_SIZE(zd->dict_content)); + } + else if (type == DICT_TYPE_PREFIX) { + /* Load a prefix */ + zstd_ret = ZSTD_CCtx_refPrefix( + self->cctx, + PyBytes_AS_STRING(zd->dict_content), + Py_SIZE(zd->dict_content)); + } + else { + Py_UNREACHABLE(); + } + + /* Check error */ + if (ZSTD_isError(zstd_ret)) { + set_zstd_error(mod_state, ERR_LOAD_C_DICT, zstd_ret); + return -1; + } + return 0; +} + +static int +_zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) +{ _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state == NULL) { return -1; @@ -237,7 +279,10 @@ _zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) /* When compressing, use undigested dictionary by default. */ zd = (ZstdDict*)dict; type = DICT_TYPE_UNDIGESTED; - goto load; + PyMutex_Lock(&zd->lock); + ret = _zstd_load_impl(self, zd, mod_state, type); + PyMutex_Unlock(&zd->lock); + return ret; } /* Check (ZstdDict, type) */ @@ -257,7 +302,10 @@ _zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) { assert(type >= 0); zd = (ZstdDict*)PyTuple_GET_ITEM(dict, 0); - goto load; + PyMutex_Lock(&zd->lock); + ret = _zstd_load_impl(self, zd, mod_state, type); + PyMutex_Unlock(&zd->lock); + return ret; } } } @@ -266,49 +314,6 @@ _zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) PyErr_SetString(PyExc_TypeError, "zstd_dict argument should be ZstdDict object."); return -1; - -load: - if (type == DICT_TYPE_DIGESTED) { - /* Get ZSTD_CDict */ - ZSTD_CDict *c_dict = _get_CDict(zd, self->compression_level); - if (c_dict == NULL) { - return -1; - } - /* Reference a prepared dictionary. - It overrides some compression context's parameters. */ - Py_BEGIN_CRITICAL_SECTION(self); - zstd_ret = ZSTD_CCtx_refCDict(self->cctx, c_dict); - Py_END_CRITICAL_SECTION(); - } - else if (type == DICT_TYPE_UNDIGESTED) { - /* Load a dictionary. - It doesn't override compression context's parameters. */ - Py_BEGIN_CRITICAL_SECTION2(self, zd); - zstd_ret = ZSTD_CCtx_loadDictionary( - self->cctx, - PyBytes_AS_STRING(zd->dict_content), - Py_SIZE(zd->dict_content)); - Py_END_CRITICAL_SECTION2(); - } - else if (type == DICT_TYPE_PREFIX) { - /* Load a prefix */ - Py_BEGIN_CRITICAL_SECTION2(self, zd); - zstd_ret = ZSTD_CCtx_refPrefix( - self->cctx, - PyBytes_AS_STRING(zd->dict_content), - Py_SIZE(zd->dict_content)); - Py_END_CRITICAL_SECTION2(); - } - else { - Py_UNREACHABLE(); - } - - /* Check error */ - if (ZSTD_isError(zstd_ret)) { - set_zstd_error(mod_state, ERR_LOAD_C_DICT, zstd_ret); - return -1; - } - return 0; } /*[clinic input] @@ -339,6 +344,7 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, self->use_multithread = 0; self->dict = NULL; + self->lock = (PyMutex){0}; /* Compression context */ self->cctx = ZSTD_createCCtx(); @@ -403,6 +409,8 @@ ZstdCompressor_dealloc(PyObject *ob) ZSTD_freeCCtx(self->cctx); } + assert(!PyMutex_IsLocked(&self->lock)); + /* Py_XDECREF the dict after free the compression context */ Py_CLEAR(self->dict); @@ -412,9 +420,10 @@ ZstdCompressor_dealloc(PyObject *ob) } static PyObject * -compress_impl(ZstdCompressor *self, Py_buffer *data, - ZSTD_EndDirective end_directive) +compress_lock_held(ZstdCompressor *self, Py_buffer *data, + ZSTD_EndDirective end_directive) { + assert(PyMutex_IsLocked(&self->lock)); ZSTD_inBuffer in; ZSTD_outBuffer out; _BlocksOutputBuffer buffer = {.list = NULL}; @@ -495,8 +504,9 @@ mt_continue_should_break(ZSTD_inBuffer *in, ZSTD_outBuffer *out) #endif static PyObject * -compress_mt_continue_impl(ZstdCompressor *self, Py_buffer *data) +compress_mt_continue_lock_held(ZstdCompressor *self, Py_buffer *data) { + assert(PyMutex_IsLocked(&self->lock)); ZSTD_inBuffer in; ZSTD_outBuffer out; _BlocksOutputBuffer buffer = {.list = NULL}; @@ -529,7 +539,7 @@ compress_mt_continue_impl(ZstdCompressor *self, Py_buffer *data) goto error; } - /* Like compress_impl(), output as much as possible. */ + /* Like compress_lock_held(), output as much as possible. */ if (out.pos == out.size) { if (_OutputBuffer_Grow(&buffer, &out) < 0) { goto error; @@ -588,14 +598,14 @@ _zstd_ZstdCompressor_compress_impl(ZstdCompressor *self, Py_buffer *data, } /* Thread-safe code */ - Py_BEGIN_CRITICAL_SECTION(self); + PyMutex_Lock(&self->lock); /* Compress */ if (self->use_multithread && mode == ZSTD_e_continue) { - ret = compress_mt_continue_impl(self, data); + ret = compress_mt_continue_lock_held(self, data); } else { - ret = compress_impl(self, data, mode); + ret = compress_lock_held(self, data, mode); } if (ret) { @@ -607,7 +617,7 @@ _zstd_ZstdCompressor_compress_impl(ZstdCompressor *self, Py_buffer *data, /* Resetting cctx's session never fail */ ZSTD_CCtx_reset(self->cctx, ZSTD_reset_session_only); } - Py_END_CRITICAL_SECTION(); + PyMutex_Unlock(&self->lock); return ret; } @@ -642,8 +652,9 @@ _zstd_ZstdCompressor_flush_impl(ZstdCompressor *self, int mode) } /* Thread-safe code */ - Py_BEGIN_CRITICAL_SECTION(self); - ret = compress_impl(self, NULL, mode); + PyMutex_Lock(&self->lock); + + ret = compress_lock_held(self, NULL, mode); if (ret) { self->last_mode = mode; @@ -654,7 +665,7 @@ _zstd_ZstdCompressor_flush_impl(ZstdCompressor *self, int mode) /* Resetting cctx's session never fail */ ZSTD_CCtx_reset(self->cctx, ZSTD_reset_session_only); } - Py_END_CRITICAL_SECTION(); + PyMutex_Unlock(&self->lock); return ret; } diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index 58f9c9f804e549..e299f73b071353 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -17,6 +17,7 @@ class _zstd.ZstdDecompressor "ZstdDecompressor *" "&zstd_decompressor_type_spec" #include "_zstdmodule.h" #include "buffer.h" #include "zstddict.h" +#include "internal/pycore_lock.h" // PyMutex_IsLocked #include // bool #include // offsetof() @@ -45,6 +46,9 @@ typedef struct { /* For ZstdDecompressor, 0 or 1. 1 means the end of the first frame has been reached. */ bool eof; + + /* Lock to protect the decompression context */ + PyMutex lock; } ZstdDecompressor; #define ZstdDecompressor_CAST(op) ((ZstdDecompressor *)op) @@ -54,6 +58,7 @@ typedef struct { static inline ZSTD_DDict * _get_DDict(ZstdDict *self) { + assert(PyMutex_IsLocked(&self->lock)); ZSTD_DDict *ret; /* Already created */ @@ -61,15 +66,14 @@ _get_DDict(ZstdDict *self) return self->d_dict; } - Py_BEGIN_CRITICAL_SECTION(self); if (self->d_dict == NULL) { /* Create ZSTD_DDict instance from dictionary content */ char *dict_buffer = PyBytes_AS_STRING(self->dict_content); Py_ssize_t dict_len = Py_SIZE(self->dict_content); Py_BEGIN_ALLOW_THREADS - self->d_dict = ZSTD_createDDict(dict_buffer, - dict_len); + ret = ZSTD_createDDict(dict_buffer, dict_len); Py_END_ALLOW_THREADS + self->d_dict = ret; if (self->d_dict == NULL) { _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); @@ -81,11 +85,7 @@ _get_DDict(ZstdDict *self) } } - /* Don't lose any exception */ - ret = self->d_dict; - Py_END_CRITICAL_SECTION(); - - return ret; + return self->d_dict; } /* Set decompression parameters to decompression context */ @@ -134,9 +134,7 @@ _zstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) } /* Set parameter to compression context */ - Py_BEGIN_CRITICAL_SECTION(self); zstd_ret = ZSTD_DCtx_setParameter(self->dctx, key_v, value_v); - Py_END_CRITICAL_SECTION(); /* Check error */ if (ZSTD_isError(zstd_ret)) { @@ -147,11 +145,53 @@ _zstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) return 0; } +static int +_zstd_load_impl(ZstdDecompressor *self, ZstdDict *zd, + _zstd_state *mod_state, int type) +{ + size_t zstd_ret; + if (type == DICT_TYPE_DIGESTED) { + /* Get ZSTD_DDict */ + ZSTD_DDict *d_dict = _get_DDict(zd); + if (d_dict == NULL) { + return -1; + } + /* Reference a prepared dictionary */ + zstd_ret = ZSTD_DCtx_refDDict(self->dctx, d_dict); + } + else if (type == DICT_TYPE_UNDIGESTED) { + /* Load a dictionary */ + zstd_ret = ZSTD_DCtx_loadDictionary( + self->dctx, + PyBytes_AS_STRING(zd->dict_content), + Py_SIZE(zd->dict_content)); + } + else if (type == DICT_TYPE_PREFIX) { + /* Load a prefix */ + zstd_ret = ZSTD_DCtx_refPrefix( + self->dctx, + PyBytes_AS_STRING(zd->dict_content), + Py_SIZE(zd->dict_content)); + } + else { + /* Impossible code path */ + PyErr_SetString(PyExc_SystemError, + "load_d_dict() impossible code path"); + return -1; + } + + /* Check error */ + if (ZSTD_isError(zstd_ret)) { + set_zstd_error(mod_state, ERR_LOAD_D_DICT, zstd_ret); + return -1; + } + return 0; +} + /* Load dictionary or prefix to decompression context */ static int _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) { - size_t zstd_ret; _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state == NULL) { return -1; @@ -168,7 +208,10 @@ _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) /* When decompressing, use digested dictionary by default. */ zd = (ZstdDict*)dict; type = DICT_TYPE_DIGESTED; - goto load; + PyMutex_Lock(&zd->lock); + ret = _zstd_load_impl(self, zd, mod_state, type); + PyMutex_Unlock(&zd->lock); + return ret; } /* Check (ZstdDict, type) */ @@ -188,7 +231,10 @@ _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) { assert(type >= 0); zd = (ZstdDict*)PyTuple_GET_ITEM(dict, 0); - goto load; + PyMutex_Lock(&zd->lock); + ret = _zstd_load_impl(self, zd, mod_state, type); + PyMutex_Unlock(&zd->lock); + return ret; } } } @@ -197,50 +243,6 @@ _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) PyErr_SetString(PyExc_TypeError, "zstd_dict argument should be ZstdDict object."); return -1; - -load: - if (type == DICT_TYPE_DIGESTED) { - /* Get ZSTD_DDict */ - ZSTD_DDict *d_dict = _get_DDict(zd); - if (d_dict == NULL) { - return -1; - } - /* Reference a prepared dictionary */ - Py_BEGIN_CRITICAL_SECTION(self); - zstd_ret = ZSTD_DCtx_refDDict(self->dctx, d_dict); - Py_END_CRITICAL_SECTION(); - } - else if (type == DICT_TYPE_UNDIGESTED) { - /* Load a dictionary */ - Py_BEGIN_CRITICAL_SECTION2(self, zd); - zstd_ret = ZSTD_DCtx_loadDictionary( - self->dctx, - PyBytes_AS_STRING(zd->dict_content), - Py_SIZE(zd->dict_content)); - Py_END_CRITICAL_SECTION2(); - } - else if (type == DICT_TYPE_PREFIX) { - /* Load a prefix */ - Py_BEGIN_CRITICAL_SECTION2(self, zd); - zstd_ret = ZSTD_DCtx_refPrefix( - self->dctx, - PyBytes_AS_STRING(zd->dict_content), - Py_SIZE(zd->dict_content)); - Py_END_CRITICAL_SECTION2(); - } - else { - /* Impossible code path */ - PyErr_SetString(PyExc_SystemError, - "load_d_dict() impossible code path"); - return -1; - } - - /* Check error */ - if (ZSTD_isError(zstd_ret)) { - set_zstd_error(mod_state, ERR_LOAD_D_DICT, zstd_ret); - return -1; - } - return 0; } /* @@ -268,8 +270,8 @@ _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) Note, decompressing "an empty input" in any case will make it > 0. */ static PyObject * -decompress_impl(ZstdDecompressor *self, ZSTD_inBuffer *in, - Py_ssize_t max_length) +decompress_lock_held(ZstdDecompressor *self, ZSTD_inBuffer *in, + Py_ssize_t max_length) { size_t zstd_ret; ZSTD_outBuffer out; @@ -339,10 +341,9 @@ decompress_impl(ZstdDecompressor *self, ZSTD_inBuffer *in, } static void -decompressor_reset_session(ZstdDecompressor *self) +decompressor_reset_session_lock_held(ZstdDecompressor *self) { - // TODO(emmatyping): use _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED here - // and ensure lock is always held + assert(PyMutex_IsLocked(&self->lock)); /* Reset variables */ self->in_begin = 0; @@ -359,8 +360,10 @@ decompressor_reset_session(ZstdDecompressor *self) } static PyObject * -stream_decompress(ZstdDecompressor *self, Py_buffer *data, Py_ssize_t max_length) +stream_decompress_lock_held(ZstdDecompressor *self, Py_buffer *data, + Py_ssize_t max_length) { + assert(PyMutex_IsLocked(&self->lock)); ZSTD_inBuffer in; PyObject *ret = NULL; int use_input_buffer; @@ -456,7 +459,7 @@ stream_decompress(ZstdDecompressor *self, Py_buffer *data, Py_ssize_t max_length assert(in.pos == 0); /* Decompress */ - ret = decompress_impl(self, &in, max_length); + ret = decompress_lock_held(self, &in, max_length); if (ret == NULL) { goto error; } @@ -517,7 +520,7 @@ stream_decompress(ZstdDecompressor *self, Py_buffer *data, Py_ssize_t max_length error: /* Reset decompressor's states/session */ - decompressor_reset_session(self); + decompressor_reset_session_lock_held(self); Py_CLEAR(ret); return NULL; @@ -555,6 +558,7 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, self->unused_data = NULL; self->eof = 0; self->dict = NULL; + self->lock = (PyMutex){0}; /* needs_input flag */ self->needs_input = 1; @@ -608,6 +612,8 @@ ZstdDecompressor_dealloc(PyObject *ob) ZSTD_freeDCtx(self->dctx); } + assert(!PyMutex_IsLocked(&self->lock)); + /* Py_CLEAR the dict after free decompression context */ Py_CLEAR(self->dict); @@ -623,7 +629,6 @@ ZstdDecompressor_dealloc(PyObject *ob) } /*[clinic input] -@critical_section @getter _zstd.ZstdDecompressor.unused_data @@ -635,11 +640,14 @@ decompressed, unused input data after the frame. Otherwise this will be b''. static PyObject * _zstd_ZstdDecompressor_unused_data_get_impl(ZstdDecompressor *self) -/*[clinic end generated code: output=f3a20940f11b6b09 input=5233800bef00df04]*/ +/*[clinic end generated code: output=f3a20940f11b6b09 input=54d41ecd681a3444]*/ { PyObject *ret; + PyMutex_Lock(&self->lock); + if (!self->eof) { + PyMutex_Unlock(&self->lock); return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES); } else { @@ -656,6 +664,7 @@ _zstd_ZstdDecompressor_unused_data_get_impl(ZstdDecompressor *self) } } + PyMutex_Unlock(&self->lock); return ret; } @@ -693,10 +702,9 @@ _zstd_ZstdDecompressor_decompress_impl(ZstdDecompressor *self, { PyObject *ret; /* Thread-safe code */ - Py_BEGIN_CRITICAL_SECTION(self); - - ret = stream_decompress(self, data, max_length); - Py_END_CRITICAL_SECTION(); + PyMutex_Lock(&self->lock); + ret = stream_decompress_lock_held(self, data, max_length); + PyMutex_Unlock(&self->lock); return ret; } diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c index 7df187a6fa69d7..39828c9b36b5c2 100644 --- a/Modules/_zstd/zstddict.c +++ b/Modules/_zstd/zstddict.c @@ -17,6 +17,7 @@ class _zstd.ZstdDict "ZstdDict *" "&zstd_dict_type_spec" #include "_zstdmodule.h" #include "zstddict.h" #include "clinic/zstddict.c.h" +#include "internal/pycore_lock.h" // PyMutex_IsLocked #include // ZSTD_freeDDict(), ZSTD_getDictID_fromDict() @@ -53,6 +54,7 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject *dict_content, self->dict_content = NULL; self->d_dict = NULL; self->dict_id = 0; + self->lock = (PyMutex){0}; /* ZSTD_CDict dict */ self->c_dicts = PyDict_New(); @@ -109,6 +111,8 @@ ZstdDict_dealloc(PyObject *ob) ZSTD_freeDDict(self->d_dict); } + assert(!PyMutex_IsLocked(&self->lock)); + /* Release dict_content after Free ZSTD_CDict/ZSTD_DDict instances */ Py_CLEAR(self->dict_content); Py_CLEAR(self->c_dicts); @@ -143,7 +147,6 @@ static PyMemberDef ZstdDict_members[] = { }; /*[clinic input] -@critical_section @getter _zstd.ZstdDict.as_digested_dict @@ -160,13 +163,12 @@ Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_digeste static PyObject * _zstd_ZstdDict_as_digested_dict_get_impl(ZstdDict *self) -/*[clinic end generated code: output=09b086e7a7320dbb input=585448c79f31f74a]*/ +/*[clinic end generated code: output=09b086e7a7320dbb input=10cd2b6165931b77]*/ { return Py_BuildValue("Oi", self, DICT_TYPE_DIGESTED); } /*[clinic input] -@critical_section @getter _zstd.ZstdDict.as_undigested_dict @@ -181,13 +183,12 @@ Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_undiges static PyObject * _zstd_ZstdDict_as_undigested_dict_get_impl(ZstdDict *self) -/*[clinic end generated code: output=43c7a989e6d4253a input=022b0829ffb1c220]*/ +/*[clinic end generated code: output=43c7a989e6d4253a input=11e5f5df690a85b4]*/ { return Py_BuildValue("Oi", self, DICT_TYPE_UNDIGESTED); } /*[clinic input] -@critical_section @getter _zstd.ZstdDict.as_prefix @@ -202,7 +203,7 @@ Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_prefix) static PyObject * _zstd_ZstdDict_as_prefix_get_impl(ZstdDict *self) -/*[clinic end generated code: output=6f7130c356595a16 input=09fb82a6a5407e87]*/ +/*[clinic end generated code: output=6f7130c356595a16 input=b028e0ae6ec4292b]*/ { return Py_BuildValue("Oi", self, DICT_TYPE_PREFIX); } diff --git a/Modules/_zstd/zstddict.h b/Modules/_zstd/zstddict.h index e8a55a3670b869..dcba0f21852087 100644 --- a/Modules/_zstd/zstddict.h +++ b/Modules/_zstd/zstddict.h @@ -19,6 +19,9 @@ typedef struct { PyObject *dict_content; /* Dictionary id */ uint32_t dict_id; + + /* Lock to protect the digested dictionaries */ + PyMutex lock; } ZstdDict; #endif // !ZSTD_DICT_H From adb0794692f3c4b711da09bd541fb8ce4faeb101 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 12:23:06 +0200 Subject: [PATCH 0218/1674] [3.14] Further improves Advanced installation docs for PyManager (GH-134541) (GH-134576) Further improves Advanced installation docs for PyManager (GH-134541) (cherry picked from commit 99a9ab1c64dce26c0f2dce7621b4d7f75da69856) Co-authored-by: Steve Dower --- Doc/using/windows.rst | 47 +++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index cd22148b531b84..9628da3d2f6b12 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -504,6 +504,14 @@ configuration option. installing and uninstalling. +.. _Add-AppxPackage: https://learn.microsoft.com/powershell/module/appx/add-appxpackage + +.. _Remove-AppxPackage: https://learn.microsoft.com/powershell/module/appx/remove-appxpackage + +.. _Add-AppxProvisionedPackage: https://learn.microsoft.com/powershell/module/dism/add-appxprovisionedpackage + +.. _PackageManager: https://learn.microsoft.com/uwp/api/windows.management.deployment.packagemanager + .. _pymanager-advancedinstall: Advanced Installation @@ -559,12 +567,10 @@ downloaded MSIX can be installed by launching or using the commands below. .. code-block:: powershell - $> winget download 9NQ7512CXL7T -e --skip-license --accept-package-agreements --disable-interactivity + $> winget download 9NQ7512CXL7T -e --skip-license --accept-package-agreements --accept-source-agreements To programmatically install or uninstall an MSIX using only PowerShell, the -`Add-AppxPackage `_ -and `Remove-AppxPackage `_ -PowerShell cmdlets are recommended: +`Add-AppxPackage`_ and `Remove-AppxPackage`_ PowerShell cmdlets are recommended: .. code-block:: powershell @@ -572,18 +578,33 @@ PowerShell cmdlets are recommended: ... $> Get-AppxPackage PythonSoftwareFoundation.PythonManager | Remove-AppxPackage -The native APIs for package management may be found on the Windows -`PackageManager `_ -class. The :func:`!AddPackageAsync` method installs for the current user, or use -:func:`!StagePackageAsync` followed by :func:`!ProvisionPackageForAllUsersAsync` -to install the Python install manager for all users from the MSIX package. Users -will still need to install their own copies of Python itself, as there is no way -to trigger those installs without being a logged in user. +The latest release can be downloaded and installed by Windows by passing the +AppInstaller file to the Add-AppxPackage command. This installs using the MSIX +on python.org, and is only recommended for cases where installing via the Store +(interactively or using WinGet) is not possible. + +.. code-block:: powershell + + $> Add-AppxPackage -AppInstallerFile https://www.python.org/ftp/python/pymanager/pymanager.appinstaller + +Other tools and APIs may also be used to provision an MSIX package for all users +on a machine, but Python does not consider this a supported scenario. We suggest +looking into the PowerShell `Add-AppxProvisionedPackage`_ cmdlet, the native +Windows `PackageManager`_ class, or the documentation and support for your +deployment tool. + +Regardless of the install method, users will still need to install their own +copies of Python itself, as there is no way to trigger those installs without +being a logged in user. When using the MSIX, the latest version of Python will +be available for all users to install without network access. Note that the MSIX downloadable from the Store and from the Python website are subtly different and cannot be installed at the same time. Wherever possible, -we suggest using the above commands to download the package from the Store to -reduce the risk of setting up conflicting installs. +we suggest using the above WinGet commands to download the package from the +Store to reduce the risk of setting up conflicting installs. There are no +licensing restrictions on the Python install manager that would prevent using +the Store package in this way. + .. _pymanager-admin-config: From 6e605861751eb0f8cca3836e2eadd34faf6a7ad2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 19:23:47 +0200 Subject: [PATCH 0219/1674] [3.14] gh-133454: Reduce the number of threads in test_racing_getbuf_and_releasebuf (GH-133458) (GH-134589) The original reproducer only used 10 threads. (cherry picked from commit fc0c9c24121c1a62b25b79062286f976699b59e9) Co-authored-by: Serhiy Storchaka --- Lib/test/test_memoryview.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_memoryview.py b/Lib/test/test_memoryview.py index 61b068c630c7ce..64f440f180bbf0 100644 --- a/Lib/test/test_memoryview.py +++ b/Lib/test/test_memoryview.py @@ -743,19 +743,21 @@ def test_racing_getbuf_and_releasebuf(self): from multiprocessing.managers import SharedMemoryManager except ImportError: self.skipTest("Test requires multiprocessing") - from threading import Thread + from threading import Thread, Event - n = 100 + start = Event() with SharedMemoryManager() as smm: obj = smm.ShareableList(range(100)) - threads = [] - for _ in range(n): - # Issue gh-127085, the `ShareableList.count` is just a convenient way to mess the `exports` - # counter of `memoryview`, this issue has no direct relation with `ShareableList`. - threads.append(Thread(target=obj.count, args=(1,))) - + def test(): + # Issue gh-127085, the `ShareableList.count` is just a + # convenient way to mess the `exports` counter of `memoryview`, + # this issue has no direct relation with `ShareableList`. + start.wait(support.SHORT_TIMEOUT) + for i in range(10): + obj.count(1) + threads = [Thread(target=test) for _ in range(10)] with threading_helper.start_threads(threads): - pass + start.set() del obj From 09a34f1f659cd66c380353cf9b8b0247789128cc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 May 2025 21:49:13 +0200 Subject: [PATCH 0220/1674] [3.14] gh-134381: Fix RuntimeError when starting not-yet started Thread after fork (gh-134514) (gh-134596) (cherry picked from commit 9a2346df861f26d5f8d054ad2f9c37134dee3822) Co-authored-by: Jiucheng(Oliver) --- Lib/test/_test_multiprocessing.py | 22 +++++++++++++++++++ ...-05-22-14-48-19.gh-issue-134381.2BXhth.rst | 1 + Modules/_threadmodule.c | 6 +++++ 3 files changed, 29 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-22-14-48-19.gh-issue-134381.2BXhth.rst diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 8cc4e46fa12a68..63f522f6ecce21 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -6832,6 +6832,28 @@ def f(x): return x*x self.assertEqual("332833500", out.decode('utf-8').strip()) self.assertFalse(err, msg=err.decode('utf-8')) + def test_forked_thread_not_started(self): + # gh-134381: Ensure that a thread that has not been started yet in + # the parent process can be started within a forked child process. + + if multiprocessing.get_start_method() != "fork": + self.skipTest("fork specific test") + + q = multiprocessing.Queue() + t = threading.Thread(target=lambda: q.put("done"), daemon=True) + + def child(): + t.start() + t.join() + + p = multiprocessing.Process(target=child) + p.start() + p.join(support.SHORT_TIMEOUT) + + self.assertEqual(p.exitcode, 0) + self.assertEqual(q.get_nowait(), "done") + close_queue(q) + # # Mixins diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-22-14-48-19.gh-issue-134381.2BXhth.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-22-14-48-19.gh-issue-134381.2BXhth.rst new file mode 100644 index 00000000000000..aa8900296ae2fc --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-22-14-48-19.gh-issue-134381.2BXhth.rst @@ -0,0 +1 @@ +Fix :exc:`RuntimeError` when using a not-started :class:`threading.Thread` after calling :func:`os.fork` diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index f676659af369f6..73739d24f33c05 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -281,6 +281,12 @@ _PyThread_AfterFork(struct _pythread_runtime_state *state) continue; } + // Keep handles for threads that have not been started yet. They are + // safe to start in the child process. + if (handle->state == THREAD_HANDLE_NOT_STARTED) { + continue; + } + // Mark all threads as done. Any attempts to join or detach the // underlying OS thread (if any) could crash. We are the only thread; // it's safe to set this non-atomically. From 7476f90af2cf9207c792c0dc3ee9a5ca7b4fabfa Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Fri, 23 May 2025 14:11:38 -0600 Subject: [PATCH 0221/1674] [3.14] gh-134557: Revert "[3.14] gh-132775: Use _PyCode GetScriptXIData()" (gh-134600) This reverts commit bbf8048c0f9c, AKA gh-134515. We are reverting due to refleaks on free-threaded builds. --- Lib/test/support/interpreters/channels.py | 2 +- Lib/test/test__interpreters.py | 25 +- Lib/test/test_interpreters/test_api.py | 23 +- Modules/_interpretersmodule.c | 294 ++++++++++++++++------ 4 files changed, 240 insertions(+), 104 deletions(-) diff --git a/Lib/test/support/interpreters/channels.py b/Lib/test/support/interpreters/channels.py index 3b6e0f0effd969..7a2bd7d63f808f 100644 --- a/Lib/test/support/interpreters/channels.py +++ b/Lib/test/support/interpreters/channels.py @@ -69,7 +69,7 @@ def list_all(): if not hasattr(send, '_unboundop'): send._set_unbound(unboundop) else: - assert send._unbound[0] == unboundop + assert send._unbound[0] == op channels.append(chan) return channels diff --git a/Lib/test/test__interpreters.py b/Lib/test/test__interpreters.py index ad3ebbfdff64a7..63fdaad8de7ef5 100644 --- a/Lib/test/test__interpreters.py +++ b/Lib/test/test__interpreters.py @@ -474,15 +474,13 @@ def setUp(self): def test_signatures(self): # See https://github.com/python/cpython/issues/126654 - msg = r'_interpreters.exec\(\) argument 3 must be dict, not int' + msg = "expected 'shared' to be a dict" with self.assertRaisesRegex(TypeError, msg): _interpreters.exec(self.id, 'a', 1) with self.assertRaisesRegex(TypeError, msg): _interpreters.exec(self.id, 'a', shared=1) - msg = r'_interpreters.run_string\(\) argument 3 must be dict, not int' with self.assertRaisesRegex(TypeError, msg): _interpreters.run_string(self.id, 'a', shared=1) - msg = r'_interpreters.run_func\(\) argument 3 must be dict, not int' with self.assertRaisesRegex(TypeError, msg): _interpreters.run_func(self.id, lambda: None, shared=1) @@ -954,8 +952,7 @@ def test_invalid_syntax(self): """) with self.subTest('script'): - with self.assertRaises(SyntaxError): - _interpreters.run_string(self.id, script) + self.assert_run_failed(SyntaxError, script) with self.subTest('module'): modname = 'spam_spam_spam' @@ -1022,19 +1019,12 @@ def script(): with open(w, 'w', encoding="utf-8") as spipe: with contextlib.redirect_stdout(spipe): print('it worked!', end='') - failed = None def f(): - nonlocal failed - try: - _interpreters.set___main___attrs(self.id, dict(w=w)) - _interpreters.run_func(self.id, script) - except Exception as exc: - failed = exc + _interpreters.set___main___attrs(self.id, dict(w=w)) + _interpreters.run_func(self.id, script) t = threading.Thread(target=f) t.start() t.join() - if failed: - raise Exception from failed with open(r, encoding="utf-8") as outfile: out = outfile.read() @@ -1063,16 +1053,19 @@ def test_closure(self): spam = True def script(): assert spam - with self.assertRaises(ValueError): + + with self.assertRaises(TypeError): _interpreters.run_func(self.id, script) + # XXX This hasn't been fixed yet. + @unittest.expectedFailure def test_return_value(self): def script(): return 'spam' with self.assertRaises(ValueError): _interpreters.run_func(self.id, script) -# @unittest.skip("we're not quite there yet") + @unittest.skip("we're not quite there yet") def test_args(self): with self.subTest('args'): def script(a, b=0): diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index 165949167ceba8..1e2d572b1cbb81 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -839,16 +839,9 @@ def test_bad_script(self): interp.exec(10) def test_bytes_for_script(self): - r, w = self.pipe() - RAN = b'R' - DONE = b'D' interp = interpreters.create() - interp.exec(f"""if True: - import os - os.write({w}, {RAN!r}) - """) - os.write(w, DONE) - self.assertEqual(os.read(r, 1), RAN) + with self.assertRaises(TypeError): + interp.exec(b'print("spam")') def test_with_background_threads_still_running(self): r_interp, w_interp = self.pipe() @@ -1017,6 +1010,8 @@ def test_call(self): for i, (callable, args, kwargs) in enumerate([ (call_func_noop, (), {}), + (call_func_return_shareable, (), {}), + (call_func_return_not_shareable, (), {}), (Spam.noop, (), {}), ]): with self.subTest(f'success case #{i+1}'): @@ -1041,8 +1036,6 @@ def test_call(self): (call_func_complex, ('custom', 'spam!'), {}), (call_func_complex, ('custom-inner', 'eggs!'), {}), (call_func_complex, ('???',), {'exc': ValueError('spam')}), - (call_func_return_shareable, (), {}), - (call_func_return_not_shareable, (), {}), ]): with self.subTest(f'invalid case #{i+1}'): with self.assertRaises(Exception): @@ -1058,6 +1051,8 @@ def test_call_in_thread(self): for i, (callable, args, kwargs) in enumerate([ (call_func_noop, (), {}), + (call_func_return_shareable, (), {}), + (call_func_return_not_shareable, (), {}), (Spam.noop, (), {}), ]): with self.subTest(f'success case #{i+1}'): @@ -1084,8 +1079,6 @@ def test_call_in_thread(self): (call_func_complex, ('custom', 'spam!'), {}), (call_func_complex, ('custom-inner', 'eggs!'), {}), (call_func_complex, ('???',), {'exc': ValueError('spam')}), - (call_func_return_shareable, (), {}), - (call_func_return_not_shareable, (), {}), ]): with self.subTest(f'invalid case #{i+1}'): if args or kwargs: @@ -1625,8 +1618,8 @@ def test_exec(self): def test_call(self): with self.subTest('no args'): interpid = _interpreters.create() - with self.assertRaises(ValueError): - _interpreters.call(interpid, call_func_return_shareable) + exc = _interpreters.call(interpid, call_func_return_shareable) + self.assertIs(exc, None) with self.subTest('uncaught exception'): interpid = _interpreters.create() diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index 376517ab92360f..f4807fd214b19e 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -9,6 +9,7 @@ #include "pycore_code.h" // _PyCode_HAS_EXECUTORS() #include "pycore_crossinterp.h" // _PyXIData_t #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() +#include "pycore_function.h" // _PyFunction_VerifyStateless() #include "pycore_interp.h" // _PyInterpreterState_IDIncref() #include "pycore_modsupport.h" // _PyArg_BadArgument() #include "pycore_namespace.h" // _PyNamespace_New() @@ -360,6 +361,81 @@ _get_current_xibufferview_type(void) } +/* Python code **************************************************************/ + +static const char * +check_code_str(PyUnicodeObject *text) +{ + assert(text != NULL); + if (PyUnicode_GET_LENGTH(text) == 0) { + return "too short"; + } + + // XXX Verify that it parses? + + return NULL; +} + +#ifndef NDEBUG +static int +code_has_args(PyCodeObject *code) +{ + assert(code != NULL); + return (code->co_argcount > 0 + || code->co_posonlyargcount > 0 + || code->co_kwonlyargcount > 0 + || code->co_flags & (CO_VARARGS | CO_VARKEYWORDS)); +} +#endif + +#define RUN_TEXT 1 +#define RUN_CODE 2 + +static const char * +get_code_str(PyObject *arg, Py_ssize_t *len_p, PyObject **bytes_p, int *flags_p) +{ + const char *codestr = NULL; + Py_ssize_t len = -1; + PyObject *bytes_obj = NULL; + int flags = 0; + + if (PyUnicode_Check(arg)) { + assert(PyUnicode_Check(arg) + && (check_code_str((PyUnicodeObject *)arg) == NULL)); + codestr = PyUnicode_AsUTF8AndSize(arg, &len); + if (codestr == NULL) { + return NULL; + } + if (strlen(codestr) != (size_t)len) { + PyErr_SetString(PyExc_ValueError, + "source code string cannot contain null bytes"); + return NULL; + } + flags = RUN_TEXT; + } + else { + assert(PyCode_Check(arg)); + assert(_PyCode_VerifyStateless( + PyThreadState_Get(), (PyCodeObject *)arg, NULL, NULL, NULL) == 0); + assert(!code_has_args((PyCodeObject *)arg)); + flags = RUN_CODE; + + // Serialize the code object. + bytes_obj = PyMarshal_WriteObjectToString(arg, Py_MARSHAL_VERSION); + if (bytes_obj == NULL) { + return NULL; + } + codestr = PyBytes_AS_STRING(bytes_obj); + len = PyBytes_GET_SIZE(bytes_obj); + } + + *flags_p = flags; + *bytes_p = bytes_obj; + *len_p = len; + return codestr; +} + + /* interpreter-specific code ************************************************/ static int @@ -423,14 +499,22 @@ config_from_object(PyObject *configobj, PyInterpreterConfig *config) static int -_run_script(_PyXIData_t *script, PyObject *ns) +_run_script(PyObject *ns, const char *codestr, Py_ssize_t codestrlen, int flags) { - PyObject *code = _PyXIData_NewObject(script); - if (code == NULL) { - return -1; + PyObject *result = NULL; + if (flags & RUN_TEXT) { + result = PyRun_StringFlags(codestr, Py_file_input, ns, ns, NULL); + } + else if (flags & RUN_CODE) { + PyObject *code = PyMarshal_ReadObjectFromString(codestr, codestrlen); + if (code != NULL) { + result = PyEval_EvalCode(code, ns, ns); + Py_DECREF(code); + } + } + else { + Py_UNREACHABLE(); } - PyObject *result = PyEval_EvalCode(code, ns, ns); - Py_DECREF(code); if (result == NULL) { return -1; } @@ -439,11 +523,12 @@ _run_script(_PyXIData_t *script, PyObject *ns) } static int -_exec_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp, - _PyXIData_t *script, PyObject *shareables, +_run_in_interpreter(PyInterpreterState *interp, + const char *codestr, Py_ssize_t codestrlen, + PyObject *shareables, int flags, PyObject **p_excinfo) { - assert(!_PyErr_Occurred(tstate)); + assert(!PyErr_Occurred()); _PyXI_session *session = _PyXI_NewSession(); if (session == NULL) { return -1; @@ -451,7 +536,7 @@ _exec_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp, // Prep and switch interpreters. if (_PyXI_Enter(session, interp, shareables) < 0) { - if (_PyErr_Occurred(tstate)) { + if (PyErr_Occurred()) { // If an error occured at this step, it means that interp // was not prepared and switched. _PyXI_FreeSession(session); @@ -473,7 +558,7 @@ _exec_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp, if (mainns == NULL) { goto finally; } - res = _run_script(script, mainns); + res = _run_script(mainns, codestr, codestrlen, flags); finally: // Clean up and switch back. @@ -867,23 +952,104 @@ PyDoc_STRVAR(set___main___attrs_doc, Bind the given attributes in the interpreter's __main__ module."); -static void -unwrap_not_shareable(PyThreadState *tstate) +static PyUnicodeObject * +convert_script_arg(PyThreadState *tstate, + PyObject *arg, const char *fname, const char *displayname, + const char *expected) { - PyObject *exctype = _PyXIData_GetNotShareableErrorType(tstate); - if (!_PyErr_ExceptionMatches(tstate, exctype)) { - return; + PyUnicodeObject *str = NULL; + if (PyUnicode_CheckExact(arg)) { + str = (PyUnicodeObject *)Py_NewRef(arg); } - PyObject *exc = _PyErr_GetRaisedException(tstate); - PyObject *cause = PyException_GetCause(exc); - if (cause != NULL) { - Py_DECREF(exc); - exc = cause; + else if (PyUnicode_Check(arg)) { + // XXX str = PyUnicode_FromObject(arg); + str = (PyUnicodeObject *)Py_NewRef(arg); } else { - assert(PyException_GetContext(exc) == NULL); + _PyArg_BadArgument(fname, displayname, expected, arg); + return NULL; } + + const char *err = check_code_str(str); + if (err != NULL) { + Py_DECREF(str); + _PyErr_Format(tstate, PyExc_ValueError, + "%.200s(): bad script text (%s)", fname, err); + return NULL; + } + + return str; +} + +static PyCodeObject * +convert_code_arg(PyThreadState *tstate, + PyObject *arg, const char *fname, const char *displayname, + const char *expected) +{ + PyObject *cause; + PyCodeObject *code = NULL; + if (PyFunction_Check(arg)) { + // For now we allow globals, so we can't use + // _PyFunction_VerifyStateless(). + PyObject *codeobj = PyFunction_GetCode(arg); + if (_PyCode_VerifyStateless( + tstate, (PyCodeObject *)codeobj, NULL, NULL, NULL) < 0) { + goto chained; + } + code = (PyCodeObject *)Py_NewRef(codeobj); + } + else if (PyCode_Check(arg)) { + if (_PyCode_VerifyStateless( + tstate, (PyCodeObject *)arg, NULL, NULL, NULL) < 0) { + goto chained; + } + code = (PyCodeObject *)Py_NewRef(arg); + } + else { + _PyArg_BadArgument(fname, displayname, expected, arg); + return NULL; + } + + return code; + +chained: + cause = _PyErr_GetRaisedException(tstate); + assert(cause != NULL); + _PyArg_BadArgument(fname, displayname, expected, arg); + PyObject *exc = _PyErr_GetRaisedException(tstate); + PyException_SetCause(exc, cause); _PyErr_SetRaisedException(tstate, exc); + return NULL; +} + +static int +_interp_exec(PyObject *self, PyInterpreterState *interp, + PyObject *code_arg, PyObject *shared_arg, PyObject **p_excinfo) +{ + if (shared_arg != NULL && !PyDict_CheckExact(shared_arg)) { + PyErr_SetString(PyExc_TypeError, "expected 'shared' to be a dict"); + return -1; + } + + // Extract code. + Py_ssize_t codestrlen = -1; + PyObject *bytes_obj = NULL; + int flags = 0; + const char *codestr = get_code_str(code_arg, + &codestrlen, &bytes_obj, &flags); + if (codestr == NULL) { + return -1; + } + + // Run the code in the interpreter. + int res = _run_in_interpreter(interp, codestr, codestrlen, + shared_arg, flags, p_excinfo); + Py_XDECREF(bytes_obj); + if (res < 0) { + return -1; + } + + return 0; } static PyObject * @@ -896,9 +1062,8 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds) PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|O!$p:" FUNCNAME, kwlist, - &id, &code, &PyDict_Type, &shared, - &restricted)) + "OO|O$p:" FUNCNAME, kwlist, + &id, &code, &shared, &restricted)) { return NULL; } @@ -910,17 +1075,22 @@ interp_exec(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - // We don't need the script to be "pure", which means it can use - // global variables. They will be resolved against __main__. - _PyXIData_t xidata = {0}; - if (_PyCode_GetScriptXIData(tstate, code, &xidata) < 0) { - unwrap_not_shareable(tstate); + const char *expected = "a string, a function, or a code object"; + if (PyUnicode_Check(code)) { + code = (PyObject *)convert_script_arg(tstate, code, FUNCNAME, + "argument 2", expected); + } + else { + code = (PyObject *)convert_code_arg(tstate, code, FUNCNAME, + "argument 2", expected); + } + if (code == NULL) { return NULL; } PyObject *excinfo = NULL; - int res = _exec_in_interpreter(tstate, interp, &xidata, shared, &excinfo); - _PyXIData_Release(&xidata); + int res = _interp_exec(self, interp, code, shared, &excinfo); + Py_DECREF(code); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; @@ -956,9 +1126,8 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OU|O!$p:" FUNCNAME, kwlist, - &id, &script, &PyDict_Type, &shared, - &restricted)) + "OU|O$p:" FUNCNAME, kwlist, + &id, &script, &shared, &restricted)) { return NULL; } @@ -970,20 +1139,15 @@ interp_run_string(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - if (PyFunction_Check(script) || PyCode_Check(script)) { - _PyArg_BadArgument(FUNCNAME, "argument 2", "a string", script); - return NULL; - } - - _PyXIData_t xidata = {0}; - if (_PyCode_GetScriptXIData(tstate, script, &xidata) < 0) { - unwrap_not_shareable(tstate); + script = (PyObject *)convert_script_arg(tstate, script, FUNCNAME, + "argument 2", "a string"); + if (script == NULL) { return NULL; } PyObject *excinfo = NULL; - int res = _exec_in_interpreter(tstate, interp, &xidata, shared, &excinfo); - _PyXIData_Release(&xidata); + int res = _interp_exec(self, interp, script, shared, &excinfo); + Py_DECREF(script); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; @@ -1009,9 +1173,8 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) PyObject *shared = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO|O!$p:" FUNCNAME, kwlist, - &id, &func, &PyDict_Type, &shared, - &restricted)) + "OO|O$p:" FUNCNAME, kwlist, + &id, &func, &shared, &restricted)) { return NULL; } @@ -1023,29 +1186,16 @@ interp_run_func(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - // We don't worry about checking globals. They will be resolved - // against __main__. - PyObject *code; - if (PyFunction_Check(func)) { - code = PyFunction_GET_CODE(func); - } - else if (PyCode_Check(func)) { - code = func; - } - else { - _PyArg_BadArgument(FUNCNAME, "argument 2", "a function", func); - return NULL; - } - - _PyXIData_t xidata = {0}; - if (_PyCode_GetScriptXIData(tstate, code, &xidata) < 0) { - unwrap_not_shareable(tstate); + PyCodeObject *code = convert_code_arg(tstate, func, FUNCNAME, + "argument 2", + "a function or a code object"); + if (code == NULL) { return NULL; } PyObject *excinfo = NULL; - int res = _exec_in_interpreter(tstate, interp, &xidata, shared, &excinfo); - _PyXIData_Release(&xidata); + int res = _interp_exec(self, interp, (PyObject *)code, shared, &excinfo); + Py_DECREF(code); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; @@ -1098,15 +1248,15 @@ interp_call(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } - _PyXIData_t xidata = {0}; - if (_PyCode_GetPureScriptXIData(tstate, callable, &xidata) < 0) { - unwrap_not_shareable(tstate); + PyObject *code = (PyObject *)convert_code_arg(tstate, callable, FUNCNAME, + "argument 2", "a function"); + if (code == NULL) { return NULL; } PyObject *excinfo = NULL; - int res = _exec_in_interpreter(tstate, interp, &xidata, NULL, &excinfo); - _PyXIData_Release(&xidata); + int res = _interp_exec(self, interp, code, NULL, &excinfo); + Py_DECREF(code); if (res < 0) { assert((excinfo == NULL) != (PyErr_Occurred() == NULL)); return excinfo; From f301af627ea5138726a85b5d34ea92bf6198bcad Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 00:18:08 +0200 Subject: [PATCH 0222/1674] [3.14] gh-132983: Slightly tweak error messages for _zstd compressor/decompressor options dict (GH-134601) (#134602) gh-132983: Slightly tweak error messages for _zstd compressor/decompressor options dict (GH-134601) Slightly tweak error messages for options dict (cherry picked from commit f478331f98930d94f7efc741f3bed4b693d5cec1) Co-authored-by: Emma Smith --- Lib/test/test_zstd.py | 5 +++-- Modules/_zstd/compressor.c | 11 +++++------ Modules/_zstd/decompressor.c | 7 +++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_zstd.py b/Lib/test/test_zstd.py index 084f8f24fc009c..34c7c721b1ad32 100644 --- a/Lib/test/test_zstd.py +++ b/Lib/test/test_zstd.py @@ -1424,11 +1424,12 @@ def test_init_bad_mode(self): with self.assertRaises(ValueError): ZstdFile(io.BytesIO(COMPRESSED_100_PLUS_32KB), "rw") - with self.assertRaisesRegex(TypeError, r"NOT be CompressionParameter"): + with self.assertRaisesRegex(TypeError, + r"NOT be a CompressionParameter"): ZstdFile(io.BytesIO(), 'rb', options={CompressionParameter.compression_level:5}) with self.assertRaisesRegex(TypeError, - r"NOT be DecompressionParameter"): + r"NOT be a DecompressionParameter"): ZstdFile(io.BytesIO(), 'wb', options={DecompressionParameter.window_log_max:21}) diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index 8f934858ef784f..0f2967b60555a5 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -93,24 +93,23 @@ _zstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, /* Check key type */ if (Py_TYPE(key) == mod_state->DParameter_type) { PyErr_SetString(PyExc_TypeError, - "Key of compression option dict should " - "NOT be DecompressionParameter."); + "Key of compression options dict should " + "NOT be a DecompressionParameter attribute."); return -1; } int key_v = PyLong_AsInt(key); if (key_v == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_ValueError, - "Key of options dict should be a CompressionParameter attribute."); + "Key of options dict should be either a " + "CompressionParameter attribute or an int."); return -1; } - // TODO(emmatyping): check bounds when there is a value error here for better - // error message? int value_v = PyLong_AsInt(value); if (value_v == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_ValueError, - "Value of option dict should be an int."); + "Value of options dict should be an int."); return -1; } diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index e299f73b071353..70848d98534fa5 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -112,7 +112,7 @@ _zstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) if (Py_TYPE(key) == mod_state->CParameter_type) { PyErr_SetString(PyExc_TypeError, "Key of decompression options dict should " - "NOT be CompressionParameter."); + "NOT be a CompressionParameter attribute."); return -1; } @@ -120,12 +120,11 @@ _zstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) int key_v = PyLong_AsInt(key); if (key_v == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_ValueError, - "Key of options dict should be a DecompressionParameter attribute."); + "Key of options dict should be either a " + "DecompressionParameter attribute or an int."); return -1; } - // TODO(emmatyping): check bounds when there is a value error here for better - // error message? int value_v = PyLong_AsInt(value); if (value_v == -1 && PyErr_Occurred()) { PyErr_SetString(PyExc_ValueError, From 38a38243b7102e611c4dc3719975ff27dc7368b8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 04:28:40 +0200 Subject: [PATCH 0223/1674] [3.14] gh-132983: Make _zstd C code PEP 7 compliant (GH-134605) (#134609) gh-132983: Make _zstd C code PEP 7 compliant (GH-134605) Make _zstd C code PEP 7 compliant (cherry picked from commit 973b8f69d31b4d86c37e0b7194a209f4f2efff06) Co-authored-by: Emma Smith --- Modules/_zstd/_zstdmodule.c | 118 +++++++++++++++--------------- Modules/_zstd/buffer.h | 9 ++- Modules/_zstd/clinic/zstddict.c.h | 14 +++- Modules/_zstd/compressor.c | 43 ++++++----- Modules/_zstd/decompressor.c | 30 ++++---- Modules/_zstd/zstddict.c | 32 +++++--- 6 files changed, 137 insertions(+), 109 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index 17d3bff1e98769..56ad999e5cd4e4 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -28,41 +28,42 @@ set_zstd_error(const _zstd_state* const state, char *msg; assert(ZSTD_isError(zstd_ret)); - switch (type) - { - case ERR_DECOMPRESS: - msg = "Unable to decompress Zstandard data: %s"; - break; - case ERR_COMPRESS: - msg = "Unable to compress Zstandard data: %s"; - break; - - case ERR_LOAD_D_DICT: - msg = "Unable to load Zstandard dictionary or prefix for decompression: %s"; - break; - case ERR_LOAD_C_DICT: - msg = "Unable to load Zstandard dictionary or prefix for compression: %s"; - break; - - case ERR_GET_C_BOUNDS: - msg = "Unable to get zstd compression parameter bounds: %s"; - break; - case ERR_GET_D_BOUNDS: - msg = "Unable to get zstd decompression parameter bounds: %s"; - break; - case ERR_SET_C_LEVEL: - msg = "Unable to set zstd compression level: %s"; - break; - - case ERR_TRAIN_DICT: - msg = "Unable to train the Zstandard dictionary: %s"; - break; - case ERR_FINALIZE_DICT: - msg = "Unable to finalize the Zstandard dictionary: %s"; - break; - - default: - Py_UNREACHABLE(); + switch (type) { + case ERR_DECOMPRESS: + msg = "Unable to decompress Zstandard data: %s"; + break; + case ERR_COMPRESS: + msg = "Unable to compress Zstandard data: %s"; + break; + + case ERR_LOAD_D_DICT: + msg = "Unable to load Zstandard dictionary or prefix for " + "decompression: %s"; + break; + case ERR_LOAD_C_DICT: + msg = "Unable to load Zstandard dictionary or prefix for " + "compression: %s"; + break; + + case ERR_GET_C_BOUNDS: + msg = "Unable to get zstd compression parameter bounds: %s"; + break; + case ERR_GET_D_BOUNDS: + msg = "Unable to get zstd decompression parameter bounds: %s"; + break; + case ERR_SET_C_LEVEL: + msg = "Unable to set zstd compression level: %s"; + break; + + case ERR_TRAIN_DICT: + msg = "Unable to train the Zstandard dictionary: %s"; + break; + case ERR_FINALIZE_DICT: + msg = "Unable to finalize the Zstandard dictionary: %s"; + break; + + default: + Py_UNREACHABLE(); } PyErr_Format(state->ZstdError, msg, ZSTD_getErrorName(zstd_ret)); } @@ -183,7 +184,7 @@ calculate_samples_stats(PyBytesObject *samples_bytes, PyObject *samples_sizes, chunks_number = Py_SIZE(samples_sizes); if ((size_t) chunks_number > UINT32_MAX) { PyErr_Format(PyExc_ValueError, - "The number of samples should be <= %u.", UINT32_MAX); + "The number of samples should be <= %u.", UINT32_MAX); return -1; } @@ -200,8 +201,8 @@ calculate_samples_stats(PyBytesObject *samples_bytes, PyObject *samples_sizes, (*chunk_sizes)[i] = PyLong_AsSize_t(size); if ((*chunk_sizes)[i] == (size_t)-1 && PyErr_Occurred()) { PyErr_Format(PyExc_ValueError, - "Items in samples_sizes should be an int " - "object, with a value between 0 and %u.", SIZE_MAX); + "Items in samples_sizes should be an int " + "object, with a value between 0 and %u.", SIZE_MAX); return -1; } sizes_sum += (*chunk_sizes)[i]; @@ -209,7 +210,8 @@ calculate_samples_stats(PyBytesObject *samples_bytes, PyObject *samples_sizes, if (sizes_sum != Py_SIZE(samples_bytes)) { PyErr_SetString(PyExc_ValueError, - "The samples size tuple doesn't match the concatenation's size."); + "The samples size tuple doesn't match the " + "concatenation's size."); return -1; } return chunks_number; @@ -242,15 +244,15 @@ _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, /* Check arguments */ if (dict_size <= 0) { - PyErr_SetString(PyExc_ValueError, "dict_size argument should be positive number."); + PyErr_SetString(PyExc_ValueError, + "dict_size argument should be positive number."); return NULL; } /* Check that the samples are valid and get their sizes */ chunks_number = calculate_samples_stats(samples_bytes, samples_sizes, &chunk_sizes); - if (chunks_number < 0) - { + if (chunks_number < 0) { goto error; } @@ -271,7 +273,7 @@ _zstd_train_dict_impl(PyObject *module, PyBytesObject *samples_bytes, /* Check Zstandard dict error */ if (ZDICT_isError(zstd_ret)) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); set_zstd_error(mod_state, ERR_TRAIN_DICT, zstd_ret); goto error; } @@ -324,15 +326,15 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, /* Check arguments */ if (dict_size <= 0) { - PyErr_SetString(PyExc_ValueError, "dict_size argument should be positive number."); + PyErr_SetString(PyExc_ValueError, + "dict_size argument should be positive number."); return NULL; } /* Check that the samples are valid and get their sizes */ chunks_number = calculate_samples_stats(samples_bytes, samples_sizes, &chunk_sizes); - if (chunks_number < 0) - { + if (chunks_number < 0) { goto error; } @@ -355,14 +357,15 @@ _zstd_finalize_dict_impl(PyObject *module, PyBytesObject *custom_dict_bytes, Py_BEGIN_ALLOW_THREADS zstd_ret = ZDICT_finalizeDictionary( PyBytes_AS_STRING(dst_dict_bytes), dict_size, - PyBytes_AS_STRING(custom_dict_bytes), Py_SIZE(custom_dict_bytes), + PyBytes_AS_STRING(custom_dict_bytes), + Py_SIZE(custom_dict_bytes), PyBytes_AS_STRING(samples_bytes), chunk_sizes, (uint32_t)chunks_number, params); Py_END_ALLOW_THREADS /* Check Zstandard dict error */ if (ZDICT_isError(zstd_ret)) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); set_zstd_error(mod_state, ERR_FINALIZE_DICT, zstd_ret); goto error; } @@ -402,7 +405,7 @@ _zstd_get_param_bounds_impl(PyObject *module, int parameter, int is_compress) if (is_compress) { bound = ZSTD_cParam_getBounds(parameter); if (ZSTD_isError(bound.error)) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); set_zstd_error(mod_state, ERR_GET_C_BOUNDS, bound.error); return NULL; } @@ -410,7 +413,7 @@ _zstd_get_param_bounds_impl(PyObject *module, int parameter, int is_compress) else { bound = ZSTD_dParam_getBounds(parameter); if (ZSTD_isError(bound.error)) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); set_zstd_error(mod_state, ERR_GET_D_BOUNDS, bound.error); return NULL; } @@ -435,9 +438,10 @@ _zstd_get_frame_size_impl(PyObject *module, Py_buffer *frame_buffer) { size_t frame_size; - frame_size = ZSTD_findFrameCompressedSize(frame_buffer->buf, frame_buffer->len); + frame_size = ZSTD_findFrameCompressedSize(frame_buffer->buf, + frame_buffer->len); if (ZSTD_isError(frame_size)) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); PyErr_Format(mod_state->ZstdError, "Error when finding the compressed size of a Zstandard frame. " "Ensure the frame_buffer argument starts from the " @@ -473,7 +477,7 @@ _zstd_get_frame_info_impl(PyObject *module, Py_buffer *frame_buffer) /* #define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1) #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2) */ if (decompressed_size == ZSTD_CONTENTSIZE_ERROR) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); PyErr_SetString(mod_state->ZstdError, "Error when getting information from the header of " "a Zstandard frame. Ensure the frame_buffer argument " @@ -508,7 +512,7 @@ _zstd_set_parameter_types_impl(PyObject *module, PyObject *c_parameter_type, PyObject *d_parameter_type) /*[clinic end generated code: output=f3313b1294f19502 input=75d7a953580fae5f]*/ { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); if (!PyType_Check(c_parameter_type) || !PyType_Check(d_parameter_type)) { PyErr_SetString(PyExc_ValueError, @@ -568,7 +572,7 @@ do { \ Py_DECREF(v); \ } while (0) - _zstd_state* const mod_state = get_zstd_state(m); + _zstd_state* mod_state = get_zstd_state(m); /* Reusable objects & variables */ mod_state->CParameter_type = NULL; @@ -674,7 +678,7 @@ do { \ static int _zstd_traverse(PyObject *module, visitproc visit, void *arg) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); Py_VISIT(mod_state->ZstdDict_type); Py_VISIT(mod_state->ZstdCompressor_type); @@ -691,7 +695,7 @@ _zstd_traverse(PyObject *module, visitproc visit, void *arg) static int _zstd_clear(PyObject *module) { - _zstd_state* const mod_state = get_zstd_state(module); + _zstd_state* mod_state = get_zstd_state(module); Py_CLEAR(mod_state->ZstdDict_type); Py_CLEAR(mod_state->ZstdCompressor_type); diff --git a/Modules/_zstd/buffer.h b/Modules/_zstd/buffer.h index bff3a81d8aa11c..4c885fa0d720fd 100644 --- a/Modules/_zstd/buffer.h +++ b/Modules/_zstd/buffer.h @@ -19,7 +19,8 @@ _OutputBuffer_InitAndGrow(_BlocksOutputBuffer *buffer, ZSTD_outBuffer *ob, /* Ensure .list was set to NULL */ assert(buffer->list == NULL); - Py_ssize_t res = _BlocksOutputBuffer_InitAndGrow(buffer, max_length, &ob->dst); + Py_ssize_t res = _BlocksOutputBuffer_InitAndGrow(buffer, max_length, + &ob->dst); if (res < 0) { return -1; } @@ -34,8 +35,7 @@ _OutputBuffer_InitAndGrow(_BlocksOutputBuffer *buffer, ZSTD_outBuffer *ob, Return -1 on failure */ static inline int _OutputBuffer_InitWithSize(_BlocksOutputBuffer *buffer, ZSTD_outBuffer *ob, - Py_ssize_t max_length, - Py_ssize_t init_size) + Py_ssize_t max_length, Py_ssize_t init_size) { Py_ssize_t block_size; @@ -50,7 +50,8 @@ _OutputBuffer_InitWithSize(_BlocksOutputBuffer *buffer, ZSTD_outBuffer *ob, block_size = init_size; } - Py_ssize_t res = _BlocksOutputBuffer_InitWithSize(buffer, block_size, &ob->dst); + Py_ssize_t res = _BlocksOutputBuffer_InitWithSize(buffer, block_size, + &ob->dst); if (res < 0) { return -1; } diff --git a/Modules/_zstd/clinic/zstddict.c.h b/Modules/_zstd/clinic/zstddict.c.h index aaa29e491bc1bb..810befdaf71f44 100644 --- a/Modules/_zstd/clinic/zstddict.c.h +++ b/Modules/_zstd/clinic/zstddict.c.h @@ -89,7 +89,9 @@ _zstd_ZstdDict_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyDoc_STRVAR(_zstd_ZstdDict_as_digested_dict__doc__, "Load as a digested dictionary to compressor.\n" "\n" -"Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_digested_dict)\n" +"Pass this attribute as zstd_dict argument:\n" +"compress(dat, zstd_dict=zd.as_digested_dict)\n" +"\n" "1. Some advanced compression parameters of compressor may be overridden\n" " by parameters of digested dictionary.\n" "2. ZstdDict has a digested dictionaries cache for each compression level.\n" @@ -123,7 +125,9 @@ _zstd_ZstdDict_as_digested_dict_get(PyObject *self, void *Py_UNUSED(context)) PyDoc_STRVAR(_zstd_ZstdDict_as_undigested_dict__doc__, "Load as an undigested dictionary to compressor.\n" "\n" -"Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_undigested_dict)\n" +"Pass this attribute as zstd_dict argument:\n" +"compress(dat, zstd_dict=zd.as_undigested_dict)\n" +"\n" "1. The advanced compression parameters of compressor will not be overridden.\n" "2. Loading an undigested dictionary is costly. If load an undigested dictionary\n" " multiple times, consider reusing a compressor object.\n" @@ -155,7 +159,9 @@ _zstd_ZstdDict_as_undigested_dict_get(PyObject *self, void *Py_UNUSED(context)) PyDoc_STRVAR(_zstd_ZstdDict_as_prefix__doc__, "Load as a prefix to compressor/decompressor.\n" "\n" -"Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_prefix)\n" +"Pass this attribute as zstd_dict argument:\n" +"compress(dat, zstd_dict=zd.as_prefix)\n" +"\n" "1. Prefix is compatible with long distance matching, while dictionary is not.\n" "2. It only works for the first frame, then the compressor/decompressor will\n" " return to no prefix state.\n" @@ -183,4 +189,4 @@ _zstd_ZstdDict_as_prefix_get(PyObject *self, void *Py_UNUSED(context)) { return _zstd_ZstdDict_as_prefix_get_impl((ZstdDict *)self); } -/*[clinic end generated code: output=8692eabee4e0d1fe input=a9049054013a1b77]*/ +/*[clinic end generated code: output=47b12b5848b53ed8 input=a9049054013a1b77]*/ diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index 0f2967b60555a5..31cb8c535c05a6 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -53,7 +53,7 @@ _zstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, const char *arg_name, const char* arg_type) { size_t zstd_ret; - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state == NULL) { return -1; } @@ -63,8 +63,8 @@ _zstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, int level = PyLong_AsInt(level_or_options); if (level == -1 && PyErr_Occurred()) { PyErr_Format(PyExc_ValueError, - "Compression level should be an int value between %d and %d.", - ZSTD_minCLevel(), ZSTD_maxCLevel()); + "Compression level should be an int value between " + "%d and %d.", ZSTD_minCLevel(), ZSTD_maxCLevel()); return -1; } @@ -138,7 +138,8 @@ _zstd_set_c_parameters(ZstdCompressor *self, PyObject *level_or_options, } return 0; } - PyErr_Format(PyExc_TypeError, "Invalid type for %s. Expected %s", arg_name, arg_type); + PyErr_Format(PyExc_TypeError, + "Invalid type for %s. Expected %s", arg_name, arg_type); return -1; } @@ -181,7 +182,7 @@ _get_CDict(ZstdDict *self, int compressionLevel) Py_END_ALLOW_THREADS if (cdict == NULL) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { PyErr_SetString(mod_state->ZstdError, "Failed to create a ZSTD_CDict instance from " @@ -262,7 +263,7 @@ _zstd_load_impl(ZstdCompressor *self, ZstdDict *zd, static int _zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state == NULL) { return -1; } @@ -295,9 +296,9 @@ _zstd_load_c_dict(ZstdCompressor *self, PyObject *dict) else if (ret > 0) { /* type == -1 may indicate an error. */ type = PyLong_AsInt(PyTuple_GET_ITEM(dict, 1)); - if (type == DICT_TYPE_DIGESTED || - type == DICT_TYPE_UNDIGESTED || - type == DICT_TYPE_PREFIX) + if (type == DICT_TYPE_DIGESTED + || type == DICT_TYPE_UNDIGESTED + || type == DICT_TYPE_PREFIX) { assert(type >= 0); zd = (ZstdDict*)PyTuple_GET_ITEM(dict, 0); @@ -348,7 +349,7 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, /* Compression context */ self->cctx = ZSTD_createCCtx(); if (self->cctx == NULL) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { PyErr_SetString(mod_state->ZstdError, "Unable to create ZSTD_CCtx instance."); @@ -360,7 +361,8 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject *level, self->last_mode = ZSTD_e_end; if (level != Py_None && options != Py_None) { - PyErr_SetString(PyExc_RuntimeError, "Only one of level or options should be used."); + PyErr_SetString(PyExc_RuntimeError, + "Only one of level or options should be used."); goto error; } @@ -449,7 +451,7 @@ compress_lock_held(ZstdCompressor *self, Py_buffer *data, } if (_OutputBuffer_InitWithSize(&buffer, &out, -1, - (Py_ssize_t) output_buffer_size) < 0) { + (Py_ssize_t) output_buffer_size) < 0) { goto error; } @@ -462,7 +464,7 @@ compress_lock_held(ZstdCompressor *self, Py_buffer *data, /* Check error */ if (ZSTD_isError(zstd_ret)) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { set_zstd_error(mod_state, ERR_COMPRESS, zstd_ret); } @@ -525,13 +527,16 @@ compress_mt_continue_lock_held(ZstdCompressor *self, Py_buffer *data) while (1) { Py_BEGIN_ALLOW_THREADS do { - zstd_ret = ZSTD_compressStream2(self->cctx, &out, &in, ZSTD_e_continue); - } while (out.pos != out.size && in.pos != in.size && !ZSTD_isError(zstd_ret)); + zstd_ret = ZSTD_compressStream2(self->cctx, &out, &in, + ZSTD_e_continue); + } while (out.pos != out.size + && in.pos != in.size + && !ZSTD_isError(zstd_ret)); Py_END_ALLOW_THREADS /* Check error */ if (ZSTD_isError(zstd_ret)) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { set_zstd_error(mod_state, ERR_COMPRESS, zstd_ret); } @@ -678,12 +683,12 @@ static PyMethodDef ZstdCompressor_methods[] = { PyDoc_STRVAR(ZstdCompressor_last_mode_doc, "The last mode used to this compressor object, its value can be .CONTINUE,\n" ".FLUSH_BLOCK, .FLUSH_FRAME. Initialized to .FLUSH_FRAME.\n\n" -"It can be used to get the current state of a compressor, such as, data flushed,\n" -"a frame ended."); +"It can be used to get the current state of a compressor, such as, data\n" +"flushed, or a frame ended."); static PyMemberDef ZstdCompressor_members[] = { {"last_mode", Py_T_INT, offsetof(ZstdCompressor, last_mode), - Py_READONLY, ZstdCompressor_last_mode_doc}, + Py_READONLY, ZstdCompressor_last_mode_doc}, {NULL} }; diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index 70848d98534fa5..d084f0847c72dd 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -76,7 +76,7 @@ _get_DDict(ZstdDict *self) self->d_dict = ret; if (self->d_dict == NULL) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { PyErr_SetString(mod_state->ZstdError, "Failed to create a ZSTD_DDict instance from " @@ -95,7 +95,7 @@ _zstd_set_d_parameters(ZstdDecompressor *self, PyObject *options) size_t zstd_ret; PyObject *key, *value; Py_ssize_t pos; - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state == NULL) { return -1; } @@ -191,7 +191,7 @@ _zstd_load_impl(ZstdDecompressor *self, ZstdDict *zd, static int _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state == NULL) { return -1; } @@ -224,9 +224,9 @@ _zstd_load_d_dict(ZstdDecompressor *self, PyObject *dict) else if (ret > 0) { /* type == -1 may indicate an error. */ type = PyLong_AsInt(PyTuple_GET_ITEM(dict, 1)); - if (type == DICT_TYPE_DIGESTED || - type == DICT_TYPE_UNDIGESTED || - type == DICT_TYPE_PREFIX) + if (type == DICT_TYPE_DIGESTED + || type == DICT_TYPE_UNDIGESTED + || type == DICT_TYPE_PREFIX) { assert(type >= 0); zd = (ZstdDict*)PyTuple_GET_ITEM(dict, 0); @@ -291,7 +291,7 @@ decompress_lock_held(ZstdDecompressor *self, ZSTD_inBuffer *in, /* Check error */ if (ZSTD_isError(zstd_ret)) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { set_zstd_error(mod_state, ERR_DECOMPRESS, zstd_ret); } @@ -369,7 +369,8 @@ stream_decompress_lock_held(ZstdDecompressor *self, Py_buffer *data, /* Check .eof flag */ if (self->eof) { - PyErr_SetString(PyExc_EOFError, "Already at the end of a Zstandard frame."); + PyErr_SetString(PyExc_EOFError, + "Already at the end of a Zstandard frame."); assert(ret == NULL); return NULL; } @@ -486,8 +487,8 @@ stream_decompress_lock_held(ZstdDecompressor *self, Py_buffer *data, if (!use_input_buffer) { /* Discard buffer if it's too small (resizing it may needlessly copy the current contents) */ - if (self->input_buffer != NULL && - self->input_buffer_size < data_size) + if (self->input_buffer != NULL + && self->input_buffer_size < data_size) { PyMem_Free(self->input_buffer); self->input_buffer = NULL; @@ -565,7 +566,7 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type, PyObject *zstd_dict, /* Decompression context */ self->dctx = ZSTD_createDCtx(); if (self->dctx == NULL) { - _zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self)); + _zstd_state* mod_state = PyType_GetModuleState(Py_TYPE(self)); if (mod_state != NULL) { PyErr_SetString(mod_state->ZstdError, "Unable to create ZSTD_DCtx instance."); @@ -717,9 +718,10 @@ PyDoc_STRVAR(ZstdDecompressor_eof_doc, "after that, an EOFError exception will be raised."); PyDoc_STRVAR(ZstdDecompressor_needs_input_doc, -"If the max_length output limit in .decompress() method has been reached, and\n" -"the decompressor has (or may has) unconsumed input data, it will be set to\n" -"False. In this case, pass b'' to .decompress() method may output further data."); +"If the max_length output limit in .decompress() method has been reached,\n" +"and the decompressor has (or may has) unconsumed input data, it will be set\n" +"to False. In this case, passing b'' to the .decompress() method may output\n" +"further data."); static PyMemberDef ZstdDecompressor_members[] = { {"eof", Py_T_BOOL, offsetof(ZstdDecompressor, eof), diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c index 39828c9b36b5c2..e3e9e5d064515f 100644 --- a/Modules/_zstd/zstddict.c +++ b/Modules/_zstd/zstddict.c @@ -74,13 +74,15 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject *dict_content, at least 8 bytes */ if (Py_SIZE(self->dict_content) < 8) { PyErr_SetString(PyExc_ValueError, - "Zstandard dictionary content should at least 8 bytes."); + "Zstandard dictionary content should at least " + "8 bytes."); goto error; } /* Get dict_id, 0 means "raw content" dictionary. */ - self->dict_id = ZSTD_getDictID_fromDict(PyBytes_AS_STRING(self->dict_content), - Py_SIZE(self->dict_content)); + self->dict_id = ZSTD_getDictID_fromDict( + PyBytes_AS_STRING(self->dict_content), + Py_SIZE(self->dict_content)); /* Check validity for ordinary dictionary */ if (!is_raw && self->dict_id == 0) { @@ -141,8 +143,10 @@ ZstdDict_str(PyObject *ob) } static PyMemberDef ZstdDict_members[] = { - {"dict_id", Py_T_UINT, offsetof(ZstdDict, dict_id), Py_READONLY, ZstdDict_dictid_doc}, - {"dict_content", Py_T_OBJECT_EX, offsetof(ZstdDict, dict_content), Py_READONLY, ZstdDict_dictcontent_doc}, + {"dict_id", Py_T_UINT, offsetof(ZstdDict, dict_id), Py_READONLY, + ZstdDict_dictid_doc}, + {"dict_content", Py_T_OBJECT_EX, offsetof(ZstdDict, dict_content), + Py_READONLY, ZstdDict_dictcontent_doc}, {NULL} }; @@ -152,7 +156,9 @@ _zstd.ZstdDict.as_digested_dict Load as a digested dictionary to compressor. -Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_digested_dict) +Pass this attribute as zstd_dict argument: +compress(dat, zstd_dict=zd.as_digested_dict) + 1. Some advanced compression parameters of compressor may be overridden by parameters of digested dictionary. 2. ZstdDict has a digested dictionaries cache for each compression level. @@ -163,7 +169,7 @@ Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_digeste static PyObject * _zstd_ZstdDict_as_digested_dict_get_impl(ZstdDict *self) -/*[clinic end generated code: output=09b086e7a7320dbb input=10cd2b6165931b77]*/ +/*[clinic end generated code: output=09b086e7a7320dbb input=ee45e1b4a48f6f2c]*/ { return Py_BuildValue("Oi", self, DICT_TYPE_DIGESTED); } @@ -174,7 +180,9 @@ _zstd.ZstdDict.as_undigested_dict Load as an undigested dictionary to compressor. -Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_undigested_dict) +Pass this attribute as zstd_dict argument: +compress(dat, zstd_dict=zd.as_undigested_dict) + 1. The advanced compression parameters of compressor will not be overridden. 2. Loading an undigested dictionary is costly. If load an undigested dictionary multiple times, consider reusing a compressor object. @@ -183,7 +191,7 @@ Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_undiges static PyObject * _zstd_ZstdDict_as_undigested_dict_get_impl(ZstdDict *self) -/*[clinic end generated code: output=43c7a989e6d4253a input=11e5f5df690a85b4]*/ +/*[clinic end generated code: output=43c7a989e6d4253a input=d39210eedec76fed]*/ { return Py_BuildValue("Oi", self, DICT_TYPE_UNDIGESTED); } @@ -194,7 +202,9 @@ _zstd.ZstdDict.as_prefix Load as a prefix to compressor/decompressor. -Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_prefix) +Pass this attribute as zstd_dict argument: +compress(dat, zstd_dict=zd.as_prefix) + 1. Prefix is compatible with long distance matching, while dictionary is not. 2. It only works for the first frame, then the compressor/decompressor will return to no prefix state. @@ -203,7 +213,7 @@ Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_prefix) static PyObject * _zstd_ZstdDict_as_prefix_get_impl(ZstdDict *self) -/*[clinic end generated code: output=6f7130c356595a16 input=b028e0ae6ec4292b]*/ +/*[clinic end generated code: output=6f7130c356595a16 input=d59757b0b5a9551a]*/ { return Py_BuildValue("Oi", self, DICT_TYPE_PREFIX); } From 576177d4b3c9385a943c202d9ed0af7988f67341 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 05:33:35 +0200 Subject: [PATCH 0224/1674] [3.14] gh-128840: Limit the number of parts in IPv6 address parsing (GH-128841) (#134610) gh-128840: Limit the number of parts in IPv6 address parsing (GH-128841) GH-128840: Limit the number of parts in IPv6 address parsing Limit length of IP address string to 39 --------- (cherry picked from commit 47f1161d3a2bec52b5b5e952150141709c247da2) Co-authored-by: Seth Michael Larson Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Serhiy Storchaka Co-authored-by: Gregory P. Smith --- Lib/ipaddress.py | 11 +++++++++-- Lib/test/test_ipaddress.py | 11 +++++++++++ .../2025-01-14-11-19-07.gh-issue-128840.M1doZW.rst | 2 ++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-01-14-11-19-07.gh-issue-128840.M1doZW.rst diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index d8a84f33264dc5..69e933a6541f78 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1660,8 +1660,16 @@ def _ip_int_from_string(cls, ip_str): """ if not ip_str: raise AddressValueError('Address cannot be empty') + if len(ip_str) > 39: + msg = ("At most 39 characters expected in " + f"{ip_str[:14]!r}({len(ip_str)-28} chars elided){ip_str[-14:]!r}") + raise AddressValueError(msg) - parts = ip_str.split(':') + # We want to allow more parts than the max to be 'split' + # to preserve the correct error message when there are + # too many parts combined with '::' + _max_parts = cls._HEXTET_COUNT + 1 + parts = ip_str.split(':', maxsplit=_max_parts) # An IPv6 address needs at least 2 colons (3 parts). _min_parts = 3 @@ -1681,7 +1689,6 @@ def _ip_int_from_string(cls, ip_str): # An IPv6 address can't have more than 8 colons (9 parts). # The extra colon comes from using the "::" notation for a single # leading or trailing zero part. - _max_parts = cls._HEXTET_COUNT + 1 if len(parts) > _max_parts: msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str) raise AddressValueError(msg) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index a06608d0016253..ee95454e64bb0d 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -397,6 +397,17 @@ def assertBadSplit(addr): # A trailing IPv4 address is two parts assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope") + def test_bad_address_split_v6_too_long(self): + def assertBadSplit(addr): + msg = r"At most 39 characters expected in %s" + with self.assertAddressError(msg, repr(re.escape(addr[:14]))): + ipaddress.IPv6Address(addr) + + # Long IPv6 address + long_addr = ("0:" * 10000) + "0" + assertBadSplit(long_addr) + assertBadSplit(long_addr + "%zoneid") + def test_bad_address_split_v6_too_many_parts(self): def assertBadSplit(addr): msg = "Exactly 8 parts expected without '::' in %r" diff --git a/Misc/NEWS.d/next/Security/2025-01-14-11-19-07.gh-issue-128840.M1doZW.rst b/Misc/NEWS.d/next/Security/2025-01-14-11-19-07.gh-issue-128840.M1doZW.rst new file mode 100644 index 00000000000000..b57ec3e70dcc5f --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-01-14-11-19-07.gh-issue-128840.M1doZW.rst @@ -0,0 +1,2 @@ +Short-circuit the processing of long IPv6 addresses early in :mod:`ipaddress` to prevent excessive +memory consumption and a minor denial-of-service. From de9444ef94abe0cc8f72c26cd3900f4c66883646 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 05:34:17 +0200 Subject: [PATCH 0225/1674] [3.14] gh-134546: ensure remote pdb script is readable (GH-134552) (#134616) gh-134546: ensure remote pdb script is readable (GH-134552) (cherry picked from commit 74a9c60f3ee2195e506144c3811090f1334c996b) Co-authored-by: Anthony Sottile --- Lib/pdb.py | 3 +++ .../Library/2025-05-22-18-14-13.gh-issue-134546.fjLVzK.rst | 1 + 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-05-22-18-14-13.gh-issue-134546.fjLVzK.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index d9e9bc011dbcca..c8c3134d3eb721 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -75,6 +75,7 @@ import code import glob import json +import stat import token import types import atexit @@ -3419,6 +3420,8 @@ def attach(pid, commands=()): ) ) connect_script.close() + orig_mode = os.stat(connect_script.name).st_mode + os.chmod(connect_script.name, orig_mode | stat.S_IROTH | stat.S_IRGRP) sys.remote_exec(pid, connect_script.name) # TODO Add a timeout? Or don't bother since the user can ^C? diff --git a/Misc/NEWS.d/next/Library/2025-05-22-18-14-13.gh-issue-134546.fjLVzK.rst b/Misc/NEWS.d/next/Library/2025-05-22-18-14-13.gh-issue-134546.fjLVzK.rst new file mode 100644 index 00000000000000..eea897f59181c9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-22-18-14-13.gh-issue-134546.fjLVzK.rst @@ -0,0 +1 @@ +Ensure :mod:`pdb` remote debugging script is readable by remote Python process. From 00fd5440f03e55718bad76dbc45725f24744596c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 06:16:02 +0200 Subject: [PATCH 0226/1674] [3.14] gh-80334: fix multiprocessing.freeze_support for other spawn platforms (GH-134462) (#134619) gh-80334: fix multiprocessing.freeze_support for other spawn platforms (GH-134462) Doc/library/multiprocessing.rst: freeze_support: Change to specify spawn method instead of platform Have multiprocessing.freeze_support() enable on spawn, not just win32. --------- (cherry picked from commit 80284b5c5eebd0e603c38322f94a97a2853ceeba) Co-authored-by: Eddy Mulyono Co-authored-by: Gregory P. Smith --- Doc/library/multiprocessing.rst | 10 +++++----- Lib/multiprocessing/context.py | 2 +- .../2025-05-24-03-10-36.gh-issue-80334.z21cMa.rst | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-24-03-10-36.gh-issue-80334.z21cMa.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 6c43d5fe166e2f..6f37930ea80391 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1081,7 +1081,7 @@ Miscellaneous .. function:: freeze_support() Add support for when a program which uses :mod:`multiprocessing` has been - frozen to produce a Windows executable. (Has been tested with **py2exe**, + frozen to produce an executable. (Has been tested with **py2exe**, **PyInstaller** and **cx_Freeze**.) One needs to call this function straight after the ``if __name__ == @@ -1099,10 +1099,10 @@ Miscellaneous If the ``freeze_support()`` line is omitted then trying to run the frozen executable will raise :exc:`RuntimeError`. - Calling ``freeze_support()`` has no effect when invoked on any operating - system other than Windows. In addition, if the module is being run - normally by the Python interpreter on Windows (the program has not been - frozen), then ``freeze_support()`` has no effect. + Calling ``freeze_support()`` has no effect when the start method is not + *spawn*. In addition, if the module is being run normally by the Python + interpreter (the program has not been frozen), then ``freeze_support()`` + has no effect. .. function:: get_all_start_methods() diff --git a/Lib/multiprocessing/context.py b/Lib/multiprocessing/context.py index d0a3ad00e53ad8..051d567d457928 100644 --- a/Lib/multiprocessing/context.py +++ b/Lib/multiprocessing/context.py @@ -145,7 +145,7 @@ def freeze_support(self): '''Check whether this is a fake forked process in a frozen executable. If so then run code specified by commandline and exit. ''' - if sys.platform == 'win32' and getattr(sys, 'frozen', False): + if self.get_start_method() == 'spawn' and getattr(sys, 'frozen', False): from .spawn import freeze_support freeze_support() diff --git a/Misc/NEWS.d/next/Library/2025-05-24-03-10-36.gh-issue-80334.z21cMa.rst b/Misc/NEWS.d/next/Library/2025-05-24-03-10-36.gh-issue-80334.z21cMa.rst new file mode 100644 index 00000000000000..228429516db416 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-24-03-10-36.gh-issue-80334.z21cMa.rst @@ -0,0 +1,2 @@ +:func:`multiprocessing.freeze_support` now checks for work on any "spawn" +start method platform rather than only on Windows. From 162e3f35110a49084e8e9c0d1267864df8da43df Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 09:21:34 +0200 Subject: [PATCH 0227/1674] [3.14] gh-134595: Update HOWTO to reflect change in CIBW option (GH-134598) (#134622) Co-authored-by: Jasper Wong <111284156+3willows@users.noreply.github.com> --- Doc/howto/free-threading-extensions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/free-threading-extensions.rst b/Doc/howto/free-threading-extensions.rst index 5a3970f15d52d6..175bb5dc831848 100644 --- a/Doc/howto/free-threading-extensions.rst +++ b/Doc/howto/free-threading-extensions.rst @@ -396,7 +396,7 @@ The wheels, shared libraries, and binaries are indicated by a ``t`` suffix. free-threaded build, with the ``t`` suffix, such as ``python3.13t``. * `pypa/cibuildwheel `_ supports the free-threaded build if you set - `CIBW_FREE_THREADED_SUPPORT `_. + `CIBW_ENABLE to cpython-freethreading `_. Limited C API and Stable ABI ............................ From 81f099375e3007709e3668e603edd188c05d662d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 24 May 2025 15:34:31 +0200 Subject: [PATCH 0228/1674] [3.14] gh-134168: fix `http.server` CLI support for IPv6 and `--directory` when serving over HTTPS (GH-134169) (#134630) [3.14] gh-134168: fix `http.server` CLI support for IPv6 and `--directory` when serving over HTTPS (GH-134169) (cherry picked from commit 2fd09b011031f3c00c342b44e02e2817010e507c) Co-authored-by: ggqlq <124190229+ggqlq@users.noreply.github.com> --- Lib/http/server.py | 15 +++++++++++---- ...2025-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst | 2 ++ 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 31fe9cae781f0a..dda32644a28f90 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1320,8 +1320,8 @@ def test(HandlerClass=BaseHTTPRequestHandler, HandlerClass.protocol_version = protocol if tls_cert: - server = ThreadingHTTPSServer(addr, HandlerClass, certfile=tls_cert, - keyfile=tls_key, password=tls_password) + server = ServerClass(addr, HandlerClass, certfile=tls_cert, + keyfile=tls_key, password=tls_password) else: server = ServerClass(addr, HandlerClass) @@ -1387,7 +1387,7 @@ def test(HandlerClass=BaseHTTPRequestHandler, handler_class = SimpleHTTPRequestHandler # ensure dual-stack is not disabled; ref #38907 - class DualStackServer(ThreadingHTTPServer): + class DualStackServerMixin: def server_bind(self): # suppress exception when protocol is IPv4 @@ -1400,9 +1400,16 @@ def finish_request(self, request, client_address): self.RequestHandlerClass(request, client_address, self, directory=args.directory) + class HTTPDualStackServer(DualStackServerMixin, ThreadingHTTPServer): + pass + class HTTPSDualStackServer(DualStackServerMixin, ThreadingHTTPSServer): + pass + + ServerClass = HTTPSDualStackServer if args.tls_cert else HTTPDualStackServer + test( HandlerClass=handler_class, - ServerClass=DualStackServer, + ServerClass=ServerClass, port=args.port, bind=args.bind, protocol=args.protocol, diff --git a/Misc/NEWS.d/next/Library/2025-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst b/Misc/NEWS.d/next/Library/2025-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst new file mode 100644 index 00000000000000..5a0e20005db11e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst @@ -0,0 +1,2 @@ +:mod:`http.server`: Fix IPv6 address binding and +:option:`--directory ` handling when using HTTPS. From 80d70defc22ba15d45bb2dc199a12af7a114561f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 24 May 2025 17:06:54 +0200 Subject: [PATCH 0229/1674] [3.14] gh-134578: Mark more slow tests (GH-134579) (GH-134590) (cherry picked from commit 77eade39f972a4f3d8e9fec00288779f35ceee21) Co-authored-by: Serhiy Storchaka --- Lib/test/test_ast/test_ast.py | 1 + Lib/test/test_capi/test_object.py | 1 + Lib/test/test_collections.py | 2 ++ Lib/test/test_json/test_recursion.py | 1 + Lib/test/test_statistics.py | 1 + 5 files changed, 6 insertions(+) diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 1479a8eafd62ec..46745cfa8f8325 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -3292,6 +3292,7 @@ def check_output(self, source, expect, *flags): expect = self.text_normalize(expect) self.assertEqual(res, expect) + @support.requires_resource('cpu') def test_invocation(self): # test various combinations of parameters base_flags = ( diff --git a/Lib/test/test_capi/test_object.py b/Lib/test/test_capi/test_object.py index 127862546b1bce..98a9a096cfee4d 100644 --- a/Lib/test/test_capi/test_object.py +++ b/Lib/test/test_capi/test_object.py @@ -221,6 +221,7 @@ def test_decref_freed_object(self): """ self.check_negative_refcount(code) + @support.requires_resource('cpu') def test_decref_delayed(self): # gh-130519: Test that _PyObject_XDecRefDelayed() and QSBR code path # handles destructors that are possibly re-entrant or trigger a GC. diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 1e93530398be79..d9d61e5c2053e3 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -542,6 +542,8 @@ def test_odd_sizes(self): self.assertEqual(Dot(1)._replace(d=999), (999,)) self.assertEqual(Dot(1)._fields, ('d',)) + @support.requires_resource('cpu') + def test_large_size(self): n = support.exceeds_recursion_limit() names = list(set(''.join([choice(string.ascii_letters) for j in range(10)]) for i in range(n))) diff --git a/Lib/test/test_json/test_recursion.py b/Lib/test/test_json/test_recursion.py index 8f0e5e078ed0d4..5d7b56ff9ad285 100644 --- a/Lib/test/test_json/test_recursion.py +++ b/Lib/test/test_json/test_recursion.py @@ -86,6 +86,7 @@ def test_highly_nested_objects_decoding(self): @support.skip_wasi_stack_overflow() @support.skip_emscripten_stack_overflow() + @support.requires_resource('cpu') def test_highly_nested_objects_encoding(self): # See #12051 l, d = [], {} diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 5980f939185965..0dd619dd7c8ceb 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2346,6 +2346,7 @@ def test_mixed_int_and_float(self): class TestKDE(unittest.TestCase): + @support.requires_resource('cpu') def test_kde(self): kde = statistics.kde StatisticsError = statistics.StatisticsError From 93aee568c06b956aa32d5418a12090764c67d4d1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 15:54:28 +0200 Subject: [PATCH 0230/1674] [3.14] GH-130328: Speedup pasting in legacy console on Windows (gh-133728) (#134653) (cherry picked from commit 91b48868a82821c1cbfd2245212699b57d3a24c7) Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> --- Lib/_pyrepl/commands.py | 8 +++++- Lib/_pyrepl/windows_console.py | 26 +++++++++++-------- Lib/test/test_pyrepl/test_unix_console.py | 1 + Lib/test/test_pyrepl/test_windows_console.py | 1 + ...-05-09-09-10-34.gh-issue-130328.s9h4By.rst | 2 ++ 5 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-09-09-10-34.gh-issue-130328.s9h4By.rst diff --git a/Lib/_pyrepl/commands.py b/Lib/_pyrepl/commands.py index 2354fbb2ec2c1e..50c824995d85b8 100644 --- a/Lib/_pyrepl/commands.py +++ b/Lib/_pyrepl/commands.py @@ -370,6 +370,13 @@ def do(self) -> None: r = self.reader text = self.event * r.get_arg() r.insert(text) + if r.paste_mode: + data = "" + ev = r.console.getpending() + data += ev.data + if data: + r.insert(data) + r.last_refresh_cache.invalidated = True class insert_nl(EditCommand): @@ -484,7 +491,6 @@ def do(self) -> None: data = "" start = time.time() while done not in data: - self.reader.console.wait(100) ev = self.reader.console.getpending() data += ev.data trace( diff --git a/Lib/_pyrepl/windows_console.py b/Lib/_pyrepl/windows_console.py index 95749198b3b2f9..c56dcd6d7dd434 100644 --- a/Lib/_pyrepl/windows_console.py +++ b/Lib/_pyrepl/windows_console.py @@ -419,10 +419,7 @@ def _getscrollbacksize(self) -> int: return info.srWindow.Bottom # type: ignore[no-any-return] - def _read_input(self, block: bool = True) -> INPUT_RECORD | None: - if not block and not self.wait(timeout=0): - return None - + def _read_input(self) -> INPUT_RECORD | None: rec = INPUT_RECORD() read = DWORD() if not ReadConsoleInput(InHandle, rec, 1, read): @@ -431,14 +428,10 @@ def _read_input(self, block: bool = True) -> INPUT_RECORD | None: return rec def _read_input_bulk( - self, block: bool, n: int + self, n: int ) -> tuple[ctypes.Array[INPUT_RECORD], int]: rec = (n * INPUT_RECORD)() read = DWORD() - - if not block and not self.wait(timeout=0): - return rec, 0 - if not ReadConsoleInput(InHandle, rec, n, read): raise WinError(GetLastError()) @@ -449,8 +442,11 @@ def get_event(self, block: bool = True) -> Event | None: and there is no event pending, otherwise waits for the completion of an event.""" + if not block and not self.wait(timeout=0): + return None + while self.event_queue.empty(): - rec = self._read_input(block) + rec = self._read_input() if rec is None: return None @@ -551,12 +547,20 @@ def getpending(self) -> Event: if e2: e.data += e2.data - recs, rec_count = self._read_input_bulk(False, 1024) + recs, rec_count = self._read_input_bulk(1024) for i in range(rec_count): rec = recs[i] + # In case of a legacy console, we do not only receive a keydown + # event, but also a keyup event - and for uppercase letters + # an additional SHIFT_PRESSED event. if rec and rec.EventType == KEY_EVENT: key_event = rec.Event.KeyEvent + if not key_event.bKeyDown: + continue ch = key_event.uChar.UnicodeChar + if ch == "\x00": + # ignore SHIFT_PRESSED and special keys + continue if ch == "\r": ch += "\n" e.data += ch diff --git a/Lib/test/test_pyrepl/test_unix_console.py b/Lib/test/test_pyrepl/test_unix_console.py index c447b310c49a06..b3f7dc028fe210 100644 --- a/Lib/test/test_pyrepl/test_unix_console.py +++ b/Lib/test/test_pyrepl/test_unix_console.py @@ -20,6 +20,7 @@ def unix_console(events, **kwargs): console = UnixConsole() console.get_event = MagicMock(side_effect=events) + console.getpending = MagicMock(return_value=Event("key", "")) height = kwargs.get("height", 25) width = kwargs.get("width", 80) diff --git a/Lib/test/test_pyrepl/test_windows_console.py b/Lib/test/test_pyrepl/test_windows_console.py index e7bab226b31ddf..a52ae96a83ddde 100644 --- a/Lib/test/test_pyrepl/test_windows_console.py +++ b/Lib/test/test_pyrepl/test_windows_console.py @@ -35,6 +35,7 @@ class WindowsConsoleTests(TestCase): def console(self, events, **kwargs) -> Console: console = WindowsConsole() console.get_event = MagicMock(side_effect=events) + console.getpending = MagicMock(return_value=Event("key", "")) console.wait = MagicMock() console._scroll = MagicMock() console._hide_cursor = MagicMock() diff --git a/Misc/NEWS.d/next/Library/2025-05-09-09-10-34.gh-issue-130328.s9h4By.rst b/Misc/NEWS.d/next/Library/2025-05-09-09-10-34.gh-issue-130328.s9h4By.rst new file mode 100644 index 00000000000000..00b556c6a336ee --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-09-09-10-34.gh-issue-130328.s9h4By.rst @@ -0,0 +1,2 @@ +Speedup pasting in ``PyREPL`` on Windows in a legacy console. Patch by Chris +Eibl. From d82d445b18c24ca6b6afdb957a72636eab88efad Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 18:04:22 +0200 Subject: [PATCH 0231/1674] [3.14] gh-133778: Fix setting `__annotations__` under PEP 563 (GH-133794) (#134655) gh-133778: Fix setting `__annotations__` under PEP 563 (GH-133794) (cherry picked from commit 4443110c3409ecba9f0fd49495d039030cb7ed58) Co-authored-by: Jelle Zijlstra --- Lib/test/test_type_annotations.py | 22 +++++++++ ...-05-09-18-11-21.gh-issue-133778.pWEV3t.rst | 2 + Objects/typeobject.c | 45 +++++++++++++++---- 3 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-09-18-11-21.gh-issue-133778.pWEV3t.rst diff --git a/Lib/test/test_type_annotations.py b/Lib/test/test_type_annotations.py index 2c886bb6d362fa..c66cb058552643 100644 --- a/Lib/test/test_type_annotations.py +++ b/Lib/test/test_type_annotations.py @@ -498,6 +498,28 @@ def f(x: int) -> int: pass self.assertEqual(f.__annotate__(annotationlib.Format.VALUE), annos) self.assertEqual(f.__annotations__, annos) + def test_set_annotations(self): + function_code = textwrap.dedent(""" + def f(x: int): + pass + """) + class_code = textwrap.dedent(""" + class f: + x: int + """) + for future in (False, True): + for label, code in (("function", function_code), ("class", class_code)): + with self.subTest(future=future, label=label): + if future: + code = "from __future__ import annotations\n" + code + ns = run_code(code) + f = ns["f"] + anno = "int" if future else int + self.assertEqual(f.__annotations__, {"x": anno}) + + f.__annotations__ = {"x": str} + self.assertEqual(f.__annotations__, {"x": str}) + def test_name_clash_with_format(self): # this test would fail if __annotate__'s parameter was called "format" # during symbol table construction diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-09-18-11-21.gh-issue-133778.pWEV3t.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-09-18-11-21.gh-issue-133778.pWEV3t.rst new file mode 100644 index 00000000000000..6eb6881213c434 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-09-18-11-21.gh-issue-133778.pWEV3t.rst @@ -0,0 +1,2 @@ +Fix bug where assigning to the :attr:`~type.__annotations__` attributes of +classes defined under ``from __future__ import annotations`` had no effect. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index a7ab69fef4c721..ee09289425b91a 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2065,19 +2065,46 @@ type_set_annotations(PyObject *tp, PyObject *value, void *Py_UNUSED(closure)) return -1; } - int result; PyObject *dict = PyType_GetDict(type); - if (value != NULL) { - /* set */ - result = PyDict_SetItem(dict, &_Py_ID(__annotations_cache__), value); - } else { - /* delete */ - result = PyDict_Pop(dict, &_Py_ID(__annotations_cache__), NULL); - if (result == 0) { - PyErr_SetString(PyExc_AttributeError, "__annotations__"); + int result = PyDict_ContainsString(dict, "__annotations__"); + if (result < 0) { + Py_DECREF(dict); + return -1; + } + if (result) { + // If __annotations__ is currently in the dict, we update it, + if (value != NULL) { + result = PyDict_SetItem(dict, &_Py_ID(__annotations__), value); + } else { + result = PyDict_Pop(dict, &_Py_ID(__annotations__), NULL); + if (result == 0) { + // Somebody else just deleted it? + PyErr_SetString(PyExc_AttributeError, "__annotations__"); + Py_DECREF(dict); + return -1; + } + } + if (result < 0) { Py_DECREF(dict); return -1; } + // Also clear __annotations_cache__ just in case. + result = PyDict_Pop(dict, &_Py_ID(__annotations_cache__), NULL); + } + else { + // Else we update only __annotations_cache__. + if (value != NULL) { + /* set */ + result = PyDict_SetItem(dict, &_Py_ID(__annotations_cache__), value); + } else { + /* delete */ + result = PyDict_Pop(dict, &_Py_ID(__annotations_cache__), NULL); + if (result == 0) { + PyErr_SetString(PyExc_AttributeError, "__annotations__"); + Py_DECREF(dict); + return -1; + } + } } if (result < 0) { Py_DECREF(dict); From cbf4ccf1d02b39f8c2626d5af42a5e85b7d1f055 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 18:05:19 +0200 Subject: [PATCH 0232/1674] [3.14] gh-133684: Fix get_annotations() where PEP 563 is involved (GH-133795) (#134656) gh-133684: Fix get_annotations() where PEP 563 is involved (GH-133795) (cherry picked from commit 3e562b394252ff75d9809b7940020a775e4df68b) Co-authored-by: Jelle Zijlstra --- Lib/annotationlib.py | 19 +++++- Lib/test/test_annotationlib.py | 66 ++++++++++++++++++- ...-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst | 3 + 3 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 32b8553458930c..a7dfb91515a1c4 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -1042,14 +1042,27 @@ def _get_and_call_annotate(obj, format): return None +_BASE_GET_ANNOTATIONS = type.__dict__["__annotations__"].__get__ + + def _get_dunder_annotations(obj): """Return the annotations for an object, checking that it is a dictionary. Does not return a fresh dictionary. """ - ann = getattr(obj, "__annotations__", None) - if ann is None: - return None + # This special case is needed to support types defined under + # from __future__ import annotations, where accessing the __annotations__ + # attribute directly might return annotations for the wrong class. + if isinstance(obj, type): + try: + ann = _BASE_GET_ANNOTATIONS(obj) + except AttributeError: + # For static types, the descriptor raises AttributeError. + return None + else: + ann = getattr(obj, "__annotations__", None) + if ann is None: + return None if not isinstance(ann, dict): raise ValueError(f"{obj!r}.__annotations__ is neither a dict nor None") diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 73a821d15e3481..fe091e52a86dc4 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -7,7 +7,7 @@ import functools import itertools import pickle -from string.templatelib import Interpolation, Template +from string.templatelib import Template import typing import unittest from annotationlib import ( @@ -815,6 +815,70 @@ def test_stringized_annotations_on_class(self): {"x": int}, ) + def test_stringized_annotation_permutations(self): + def define_class(name, has_future, has_annos, base_text, extra_names=None): + lines = [] + if has_future: + lines.append("from __future__ import annotations") + lines.append(f"class {name}({base_text}):") + if has_annos: + lines.append(f" {name}_attr: int") + else: + lines.append(" pass") + code = "\n".join(lines) + ns = support.run_code(code, extra_names=extra_names) + return ns[name] + + def check_annotations(cls, has_future, has_annos): + if has_annos: + if has_future: + anno = "int" + else: + anno = int + self.assertEqual(get_annotations(cls), {f"{cls.__name__}_attr": anno}) + else: + self.assertEqual(get_annotations(cls), {}) + + for meta_future, base_future, child_future, meta_has_annos, base_has_annos, child_has_annos in itertools.product( + (False, True), + (False, True), + (False, True), + (False, True), + (False, True), + (False, True), + ): + with self.subTest( + meta_future=meta_future, + base_future=base_future, + child_future=child_future, + meta_has_annos=meta_has_annos, + base_has_annos=base_has_annos, + child_has_annos=child_has_annos, + ): + meta = define_class( + "Meta", + has_future=meta_future, + has_annos=meta_has_annos, + base_text="type", + ) + base = define_class( + "Base", + has_future=base_future, + has_annos=base_has_annos, + base_text="metaclass=Meta", + extra_names={"Meta": meta}, + ) + child = define_class( + "Child", + has_future=child_future, + has_annos=child_has_annos, + base_text="Base", + extra_names={"Base": base}, + ) + check_annotations(meta, meta_future, meta_has_annos) + check_annotations(base, base_future, base_has_annos) + check_annotations(child, child_future, child_has_annos) + def test_modify_annotations(self): def f(x: int): pass diff --git a/Misc/NEWS.d/next/Library/2025-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst b/Misc/NEWS.d/next/Library/2025-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst new file mode 100644 index 00000000000000..0cb1bc237a12c9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst @@ -0,0 +1,3 @@ +Fix bug where :func:`annotationlib.get_annotations` would return the wrong +result for certain classes that are part of a class hierarchy where ``from +__future__ import annotations`` is used. From c61fd7c0f2df757fb485f60a8e6a5f8164477566 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 18:48:19 +0200 Subject: [PATCH 0233/1674] [3.14] gh-134582: Fix t-strings untokenize() roundtrip removing space between braces (GH-134603) (#134659) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-134582: Fix t-strings untokenize() roundtrip removing space between braces (GH-134603) (cherry picked from commit 52509cc94b1a18cb325dbfa7e5f830b32759a903) Co-authored-by: Loïc Simon --- Lib/test/test_tokenize.py | 4 ++++ Lib/tokenize.py | 14 +++++++------- .../2025-05-23-23-43-39.gh-issue-134582.9POq3l.rst | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-23-23-43-39.gh-issue-134582.9POq3l.rst diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 2d41a5e5ac0697..e6b19fe1812d44 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1975,6 +1975,10 @@ def test_roundtrip(self): for case in cases: self.check_roundtrip(case) + self.check_roundtrip(r"t'{ {}}'") + self.check_roundtrip(r"t'{f'{ {}}'}{ {}}'") + self.check_roundtrip(r"f'{t'{ {}}'}{ {}}'") + def test_continuation(self): # Balancing continuation diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 8d01fd7bce41b0..559a7aecbde2d1 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -274,7 +274,7 @@ def compat(self, token, iterable): toks_append = self.tokens.append startline = token[0] in (NEWLINE, NL) prevstring = False - in_fstring = 0 + in_fstring_or_tstring = 0 for tok in _itertools.chain([token], iterable): toknum, tokval = tok[:2] @@ -293,10 +293,10 @@ def compat(self, token, iterable): else: prevstring = False - if toknum == FSTRING_START: - in_fstring += 1 - elif toknum == FSTRING_END: - in_fstring -= 1 + if toknum in {FSTRING_START, TSTRING_START}: + in_fstring_or_tstring += 1 + elif toknum in {FSTRING_END, TSTRING_END}: + in_fstring_or_tstring -= 1 if toknum == INDENT: indents.append(tokval) continue @@ -311,8 +311,8 @@ def compat(self, token, iterable): elif toknum in {FSTRING_MIDDLE, TSTRING_MIDDLE}: tokval = self.escape_brackets(tokval) - # Insert a space between two consecutive brackets if we are in an f-string - if tokval in {"{", "}"} and self.tokens and self.tokens[-1] == tokval and in_fstring: + # Insert a space between two consecutive brackets if we are in an f-string or t-string + if tokval in {"{", "}"} and self.tokens and self.tokens[-1] == tokval and in_fstring_or_tstring: tokval = ' ' + tokval # Insert a space between two consecutive f-strings diff --git a/Misc/NEWS.d/next/Library/2025-05-23-23-43-39.gh-issue-134582.9POq3l.rst b/Misc/NEWS.d/next/Library/2025-05-23-23-43-39.gh-issue-134582.9POq3l.rst new file mode 100644 index 00000000000000..23e1d5891b685f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-23-23-43-39.gh-issue-134582.9POq3l.rst @@ -0,0 +1 @@ +Fix tokenize.untokenize() round-trip errors related to t-strings braces escaping From 8c6653428f32189e4779a5ed444cf42e811368e0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 19:39:44 +0200 Subject: [PATCH 0234/1674] [3.14] annotationlib docs: note that ForwardRef.evaluate eventually defaults to empty globals (GH-134661) (#134662) annotationlib docs: note that ForwardRef.evaluate eventually defaults to empty globals (GH-134661) (cherry picked from commit b51b08a0a5fedde4f74e4cc338b8b5ad9656ad50) Co-authored-by: Jelle Zijlstra --- Doc/library/annotationlib.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/annotationlib.rst b/Doc/library/annotationlib.rst index 41c9ce479ff0f8..7dfc11449a6cbc 100644 --- a/Doc/library/annotationlib.rst +++ b/Doc/library/annotationlib.rst @@ -211,6 +211,10 @@ Classes means may not have any information about their scope, so passing arguments to this method may be necessary to evaluate them successfully. + If no *owner*, *globals*, *locals*, or *type_params* are provided and the + :class:`~ForwardRef` does not contain information about its origin, + empty globals and locals dictionaries are used. + .. versionadded:: 3.14 From 9c6d2dbe26e30114773bf55147d36960cb89e519 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 19:52:04 +0200 Subject: [PATCH 0235/1674] [3.14] gh-133960: Improve typing.evaluate_forward_ref (GH-133961) (#134663) gh-133960: Improve typing.evaluate_forward_ref (GH-133961) As explained in GH-133960, this removes most of the behavior differences with ForwardRef.evaluate. The remaining difference is about recursive evaluation of forwardrefs; this is practically useful in cases where an annotation refers to a type alias that itself is string-valued. This also improves several edge cases that were previously not handled optimally. For example, the function now takes advantage of the partial evaluation behavior of ForwardRef.evaluate() to evaluate more ForwardRefs in the FORWARDREF format. This also fixes GH-133959 as a side effect, because the buggy behavior in GH-133959 derives from evaluate_forward_ref(). (cherry picked from commit 57fef27cfc2bdfc1e3a65ef8c8a760198d15b14d) Co-authored-by: Jelle Zijlstra --- Doc/library/typing.rst | 15 +-- Lib/test/test_typing.py | 116 +++++++++++++++--- Lib/typing.py | 52 ++++---- ...-05-12-20-38-57.gh-issue-133960.Aee79f.rst | 3 + 4 files changed, 131 insertions(+), 55 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-12-20-38-57.gh-issue-133960.Aee79f.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 54cc3ea3311adf..dd8ea3c364f49a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -3500,20 +3500,11 @@ Introspection helpers Evaluate an :class:`annotationlib.ForwardRef` as a :term:`type hint`. This is similar to calling :meth:`annotationlib.ForwardRef.evaluate`, - but unlike that method, :func:`!evaluate_forward_ref` also: - - * Recursively evaluates forward references nested within the type hint. - * Raises :exc:`TypeError` when it encounters certain objects that are - not valid type hints. - * Replaces type hints that evaluate to :const:`!None` with - :class:`types.NoneType`. - * Supports the :attr:`~annotationlib.Format.FORWARDREF` and - :attr:`~annotationlib.Format.STRING` formats. + but unlike that method, :func:`!evaluate_forward_ref` also + recursively evaluates forward references nested within the type hint. See the documentation for :meth:`annotationlib.ForwardRef.evaluate` for - the meaning of the *owner*, *globals*, *locals*, and *type_params* parameters. - *format* specifies the format of the annotation and is a member of - the :class:`annotationlib.Format` enum. + the meaning of the *owner*, *globals*, *locals*, *type_params*, and *format* parameters. .. versionadded:: 3.14 diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b34bfcc90b1577..983fb39f4dbdcd 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -6859,12 +6859,10 @@ def test_forward_ref_and_final(self): self.assertEqual(hints, {'value': Final}) def test_top_level_class_var(self): - # https://bugs.python.org/issue45166 - with self.assertRaisesRegex( - TypeError, - r'typing.ClassVar\[int\] is not valid as type argument', - ): - get_type_hints(ann_module6) + # This is not meaningful but we don't raise for it. + # https://github.com/python/cpython/issues/133959 + hints = get_type_hints(ann_module6) + self.assertEqual(hints, {'wrong': ClassVar[int]}) def test_get_type_hints_typeddict(self): self.assertEqual(get_type_hints(TotalMovie), {'title': str, 'year': int}) @@ -6967,6 +6965,11 @@ def foo(a: 'Callable[..., T]'): self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Callable[..., T]}) + def test_special_forms_no_forward(self): + def f(x: ClassVar[int]): + pass + self.assertEqual(get_type_hints(f), {'x': ClassVar[int]}) + def test_special_forms_forward(self): class C: @@ -6982,8 +6985,9 @@ class CF: self.assertEqual(get_type_hints(C, globals())['b'], Final[int]) self.assertEqual(get_type_hints(C, globals())['x'], ClassVar) self.assertEqual(get_type_hints(C, globals())['y'], Final) - with self.assertRaises(TypeError): - get_type_hints(CF, globals()), + lfi = get_type_hints(CF, globals())['b'] + self.assertIs(get_origin(lfi), list) + self.assertEqual(get_args(lfi), (Final[int],)) def test_union_forward_recursion(self): ValueList = List['Value'] @@ -7216,33 +7220,113 @@ class C(Generic[T]): pass class EvaluateForwardRefTests(BaseTestCase): def test_evaluate_forward_ref(self): int_ref = ForwardRef('int') - missing = ForwardRef('missing') + self.assertIs(typing.evaluate_forward_ref(int_ref), int) self.assertIs( typing.evaluate_forward_ref(int_ref, type_params=()), int, ) + self.assertIs( + typing.evaluate_forward_ref(int_ref, format=annotationlib.Format.VALUE), + int, + ) self.assertIs( typing.evaluate_forward_ref( - int_ref, type_params=(), format=annotationlib.Format.FORWARDREF, + int_ref, format=annotationlib.Format.FORWARDREF, ), int, ) + self.assertEqual( + typing.evaluate_forward_ref( + int_ref, format=annotationlib.Format.STRING, + ), + 'int', + ) + + def test_evaluate_forward_ref_undefined(self): + missing = ForwardRef('missing') + with self.assertRaises(NameError): + typing.evaluate_forward_ref(missing) self.assertIs( typing.evaluate_forward_ref( - missing, type_params=(), format=annotationlib.Format.FORWARDREF, + missing, format=annotationlib.Format.FORWARDREF, ), missing, ) self.assertEqual( typing.evaluate_forward_ref( - int_ref, type_params=(), format=annotationlib.Format.STRING, + missing, format=annotationlib.Format.STRING, ), - 'int', + "missing", ) - def test_evaluate_forward_ref_no_type_params(self): - ref = ForwardRef('int') - self.assertIs(typing.evaluate_forward_ref(ref), int) + def test_evaluate_forward_ref_nested(self): + ref = ForwardRef("int | list['str']") + self.assertEqual( + typing.evaluate_forward_ref(ref), + int | list[str], + ) + self.assertEqual( + typing.evaluate_forward_ref(ref, format=annotationlib.Format.FORWARDREF), + int | list[str], + ) + self.assertEqual( + typing.evaluate_forward_ref(ref, format=annotationlib.Format.STRING), + "int | list['str']", + ) + + why = ForwardRef('"\'str\'"') + self.assertIs(typing.evaluate_forward_ref(why), str) + + def test_evaluate_forward_ref_none(self): + none_ref = ForwardRef('None') + self.assertIs(typing.evaluate_forward_ref(none_ref), None) + + def test_globals(self): + A = "str" + ref = ForwardRef('list[A]') + with self.assertRaises(NameError): + typing.evaluate_forward_ref(ref) + self.assertEqual( + typing.evaluate_forward_ref(ref, globals={'A': A}), + list[str], + ) + + def test_owner(self): + ref = ForwardRef("A") + + with self.assertRaises(NameError): + typing.evaluate_forward_ref(ref) + + # We default to the globals of `owner`, + # so it no longer raises `NameError` + self.assertIs( + typing.evaluate_forward_ref(ref, owner=Loop), A + ) + + def test_inherited_owner(self): + # owner passed to evaluate_forward_ref + ref = ForwardRef("list['A']") + self.assertEqual( + typing.evaluate_forward_ref(ref, owner=Loop), + list[A], + ) + + # owner set on the ForwardRef + ref = ForwardRef("list['A']", owner=Loop) + self.assertEqual( + typing.evaluate_forward_ref(ref), + list[A], + ) + + def test_partial_evaluation(self): + ref = ForwardRef("list[A]") + with self.assertRaises(NameError): + typing.evaluate_forward_ref(ref) + + self.assertEqual( + typing.evaluate_forward_ref(ref, format=annotationlib.Format.FORWARDREF), + list[EqualToForwardRef('A')], + ) class CollectionsAbcTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 30d53cb46f8a18..87fd53802ca36d 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -956,12 +956,8 @@ def evaluate_forward_ref( """Evaluate a forward reference as a type hint. This is similar to calling the ForwardRef.evaluate() method, - but unlike that method, evaluate_forward_ref() also: - - * Recursively evaluates forward references nested within the type hint. - * Rejects certain objects that are not valid type hints. - * Replaces type hints that evaluate to None with types.NoneType. - * Supports the *FORWARDREF* and *STRING* formats. + but unlike that method, evaluate_forward_ref() also + recursively evaluates forward references nested within the type hint. *forward_ref* must be an instance of ForwardRef. *owner*, if given, should be the object that holds the annotations that the forward reference @@ -981,23 +977,24 @@ def evaluate_forward_ref( if forward_ref.__forward_arg__ in _recursive_guard: return forward_ref - try: - value = forward_ref.evaluate(globals=globals, locals=locals, - type_params=type_params, owner=owner) - except NameError: - if format == _lazy_annotationlib.Format.FORWARDREF: - return forward_ref - else: - raise - - type_ = _type_check( - value, - "Forward references must evaluate to types.", - is_argument=forward_ref.__forward_is_argument__, - allow_special_forms=forward_ref.__forward_is_class__, - ) + if format is None: + format = _lazy_annotationlib.Format.VALUE + value = forward_ref.evaluate(globals=globals, locals=locals, + type_params=type_params, owner=owner, format=format) + + if (isinstance(value, _lazy_annotationlib.ForwardRef) + and format == _lazy_annotationlib.Format.FORWARDREF): + return value + + if isinstance(value, str): + value = _make_forward_ref(value, module=forward_ref.__forward_module__, + owner=owner or forward_ref.__owner__, + is_argument=forward_ref.__forward_is_argument__, + is_class=forward_ref.__forward_is_class__) + if owner is None: + owner = forward_ref.__owner__ return _eval_type( - type_, + value, globals, locals, type_params, @@ -2338,12 +2335,12 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False, # This only affects ForwardRefs. base_globals, base_locals = base_locals, base_globals for name, value in ann.items(): - if value is None: - value = type(None) if isinstance(value, str): value = _make_forward_ref(value, is_argument=False, is_class=True) value = _eval_type(value, base_globals, base_locals, base.__type_params__, format=format, owner=obj) + if value is None: + value = type(None) hints[name] = value if include_extras or format == Format.STRING: return hints @@ -2377,8 +2374,6 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False, localns = globalns type_params = getattr(obj, "__type_params__", ()) for name, value in hints.items(): - if value is None: - value = type(None) if isinstance(value, str): # class-level forward refs were handled above, this must be either # a module-level annotation or a function argument annotation @@ -2387,7 +2382,10 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False, is_argument=not isinstance(obj, types.ModuleType), is_class=False, ) - hints[name] = _eval_type(value, globalns, localns, type_params, format=format, owner=obj) + value = _eval_type(value, globalns, localns, type_params, format=format, owner=obj) + if value is None: + value = type(None) + hints[name] = value return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} diff --git a/Misc/NEWS.d/next/Library/2025-05-12-20-38-57.gh-issue-133960.Aee79f.rst b/Misc/NEWS.d/next/Library/2025-05-12-20-38-57.gh-issue-133960.Aee79f.rst new file mode 100644 index 00000000000000..66e8483b25bc37 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-12-20-38-57.gh-issue-133960.Aee79f.rst @@ -0,0 +1,3 @@ +Simplify and improve :func:`typing.evaluate_forward_ref`. It now no longer +raises errors on certain invalid types. In several situations, it is now +able to evaluate forward references that were previously unsupported. From 6917fbf98f6fd7946ed92e7d6daa5a7ecb50167c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 20:43:07 +0200 Subject: [PATCH 0236/1674] [3.14] GH-130328: Fix WindowsConsoleGetEventTests after gh-133728 (gh-134660) (gh-134666) (cherry picked from commit 1000283694136ee0538baa6c6b2eee662ee618d4) Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> --- Lib/test/test_pyrepl/test_windows_console.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_pyrepl/test_windows_console.py b/Lib/test/test_pyrepl/test_windows_console.py index a52ae96a83ddde..f9607e02c604ff 100644 --- a/Lib/test/test_pyrepl/test_windows_console.py +++ b/Lib/test/test_pyrepl/test_windows_console.py @@ -386,6 +386,7 @@ def get_event(self, input_records, **kwargs) -> Console: self.console._read_input = self.mock self.console._WindowsConsole__vt_support = kwargs.get("vt_support", False) + self.console.wait = MagicMock(return_value=True) event = self.console.get_event(block=False) return event From f5a8bfa335e48b8329d7ecf9dfa62fa06fdefa22 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 21:29:04 +0200 Subject: [PATCH 0237/1674] [3.14] Fix sphinx-lint warnings (default-role used). (GH-134647) (#134670) Fix sphinx-lint warnings (default-role used). (GH-134647) (cherry picked from commit 24a47155d2172966fab7d56f2bf9181056fba8d0) Co-authored-by: Julien Palard --- Doc/c-api/code.rst | 2 +- Doc/c-api/function.rst | 2 +- Doc/c-api/typeobj.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 6eae24b38fae48..42594f063b0709 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -182,7 +182,7 @@ bound into a function. Type of a code object watcher callback function. If *event* is ``PY_CODE_EVENT_CREATE``, then the callback is invoked - after `co` has been fully initialized. Otherwise, the callback is invoked + after *co* has been fully initialized. Otherwise, the callback is invoked before the destruction of *co* takes place, so the prior state of *co* can be inspected. diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 58792edeed25e3..63b78f677674e9 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -169,7 +169,7 @@ There are a few functions specific to Python functions. unpredictable effects, including infinite recursion. If *event* is ``PyFunction_EVENT_CREATE``, then the callback is invoked - after `func` has been fully initialized. Otherwise, the callback is invoked + after *func* has been fully initialized. Otherwise, the callback is invoked before the modification to *func* takes place, so the prior state of *func* can be inspected. The runtime is permitted to optimize away the creation of function objects when possible. In such cases no event will be emitted. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 5df0c0fe608e53..91046c0e6f18ae 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1238,7 +1238,7 @@ 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 `~object.__dict__` + This bit indicates that instances of the class have a :attr:`~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. From f68f05cbe3bdac0c668303ae55c6943b824d0c3f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 May 2025 23:16:10 +0200 Subject: [PATCH 0238/1674] [3.14] gh-115999: Add PyCodeObject.co_tlbc to the debug offsets (GH-134286) (#134348) gh-115999: Add PyCodeObject.co_tlbc to the debug offsets (GH-134286) (cherry picked from commit dd7f1130570d50461b2a0f81ab01c55b9ce93700) Signed-off-by: Pablo Galindo Co-authored-by: Pablo Galindo Salgado --- Doc/data/python3.14.abi | 62882 +++++++++++----------- Include/internal/pycore_debug_offsets.h | 8 + 2 files changed, 31452 insertions(+), 31438 deletions(-) diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index 64f4d473b72def..62e728532390be 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -1,31438 +1,31444 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Include/internal/pycore_debug_offsets.h b/Include/internal/pycore_debug_offsets.h index 59d2c9d5377953..1a265c59ff8c08 100644 --- a/Include/internal/pycore_debug_offsets.h +++ b/Include/internal/pycore_debug_offsets.h @@ -52,9 +52,13 @@ extern "C" { #ifdef Py_GIL_DISABLED # define _Py_Debug_gilruntimestate_enabled offsetof(struct _gil_runtime_state, enabled) # define _Py_Debug_Free_Threaded 1 +# define _Py_Debug_code_object_co_tlbc offsetof(PyCodeObject, co_tlbc) +# define _Py_Debug_interpreter_frame_tlbc_index offsetof(_PyInterpreterFrame, tlbc_index) #else # define _Py_Debug_gilruntimestate_enabled 0 # define _Py_Debug_Free_Threaded 0 +# define _Py_Debug_code_object_co_tlbc 0 +# define _Py_Debug_interpreter_frame_tlbc_index 0 #endif @@ -109,6 +113,7 @@ typedef struct _Py_DebugOffsets { uint64_t localsplus; uint64_t owner; uint64_t stackpointer; + uint64_t tlbc_index; } interpreter_frame; // Code object offset; @@ -123,6 +128,7 @@ typedef struct _Py_DebugOffsets { uint64_t localsplusnames; uint64_t localspluskinds; uint64_t co_code_adaptive; + uint64_t co_tlbc; } code_object; // PyObject offset; @@ -265,6 +271,7 @@ typedef struct _Py_DebugOffsets { .localsplus = offsetof(_PyInterpreterFrame, localsplus), \ .owner = offsetof(_PyInterpreterFrame, owner), \ .stackpointer = offsetof(_PyInterpreterFrame, stackpointer), \ + .tlbc_index = _Py_Debug_interpreter_frame_tlbc_index, \ }, \ .code_object = { \ .size = sizeof(PyCodeObject), \ @@ -277,6 +284,7 @@ typedef struct _Py_DebugOffsets { .localsplusnames = offsetof(PyCodeObject, co_localsplusnames), \ .localspluskinds = offsetof(PyCodeObject, co_localspluskinds), \ .co_code_adaptive = offsetof(PyCodeObject, co_code_adaptive), \ + .co_tlbc = _Py_Debug_code_object_co_tlbc, \ }, \ .pyobject = { \ .size = sizeof(PyObject), \ From 1822f33b1af989ebb9e7a5b58bd40721fca9a218 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Sun, 25 May 2025 23:10:20 +0100 Subject: [PATCH 0239/1674] [3.14] gh-91048: Refactor and optimize remote debugging module (#134652) (#134673) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-91048: Refactor and optimize remote debugging module (#134652) Completely refactor Modules/_remote_debugging_module.c with improved code organization, replacing scattered reference counting and error handling with centralized goto error paths. This cleanup improves maintainability and reduces code duplication throughout the module while preserving the same external API. Implement memory page caching optimization in Python/remote_debug.h to avoid repeated reads of the same memory regions during debugging operations. The cache stores previously read memory pages and reuses them for subsequent reads, significantly reducing system calls and improving performance. Add code object caching mechanism with a new code_object_generation field in the interpreter state that tracks when code object caches need invalidation. This allows efficient reuse of parsed code object metadata and eliminates redundant processing of the same code objects across debugging sessions. Optimize memory operations by replacing multiple individual structure copies with single bulk reads for the same data structures. This reduces the number of memory operations and system calls required to gather debugging information from the target process. Update Makefile.pre.in to include Python/remote_debug.h in the headers list, ensuring that changes to the remote debugging header force proper recompilation of dependent modules and maintain build consistency across the codebase. Also, make the module compatible with the free threading build as an extra :) Co-authored-by: Łukasz Langa (cherry picked from commit 42b25ad4d3d6bcdc28ddfe07d2bf8831378bb0d1) --- Doc/data/python3.14.abi | 5882 +++++++++-------- Include/cpython/pystate.h | 2 + Include/internal/pycore_debug_offsets.h | 15 + .../pycore_global_objects_fini_generated.h | 1 + Include/internal/pycore_global_strings.h | 1 + Include/internal/pycore_interp_structs.h | 6 + .../internal/pycore_runtime_init_generated.h | 1 + .../internal/pycore_unicodeobject_generated.h | 4 + Lib/asyncio/tools.py | 8 +- Lib/test/test_external_inspection.py | 82 +- Makefile.pre.in | 1 + Modules/_remote_debugging_module.c | 2951 ++++++--- Modules/clinic/_remote_debugging_module.c.h | 243 + Objects/codeobject.c | 2 + Python/index_pool.c | 4 + Python/pystate.c | 10 +- Python/remote_debug.h | 117 +- 17 files changed, 5344 insertions(+), 3986 deletions(-) create mode 100644 Modules/clinic/_remote_debugging_module.c.h diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index 62e728532390be..375a1ee03e032d 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -1800,7 +1800,7 @@ - + @@ -6530,8 +6530,8 @@ - - + + @@ -10222,10 +10222,10 @@ - + - + @@ -15791,161 +15791,161 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -17434,373 +17434,390 @@ - + - + - + - + - + - + - - - - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - + - - + + @@ -17808,12 +17825,12 @@ - + - + @@ -17822,8 +17839,8 @@ - - + + @@ -17840,21 +17857,21 @@ - + - + - + - + - + @@ -17863,7 +17880,7 @@ - + @@ -17883,7 +17900,7 @@ - + @@ -17923,7 +17940,7 @@ - + @@ -17985,7 +18002,7 @@ - + @@ -17999,104 +18016,104 @@ - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -18104,7 +18121,7 @@ - + @@ -18112,7 +18129,7 @@ - + @@ -18120,7 +18137,7 @@ - + @@ -18128,7 +18145,7 @@ - + @@ -18136,7 +18153,7 @@ - + @@ -18144,7 +18161,7 @@ - + @@ -18152,7 +18169,7 @@ - + @@ -18160,7 +18177,7 @@ - + @@ -18168,7 +18185,7 @@ - + @@ -18176,7 +18193,7 @@ - + @@ -18184,7 +18201,7 @@ - + @@ -18192,2265 +18209,2268 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - + - + - + - - + + - + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - - + + - + - + - + - + - - + + - + - - + + - + - + - - + + - + - + - + - - + + - + - - + + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - - + + - - + + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - + - + - - + + - + - - + + - + - + - - + + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - + - + - + - - + + - + - + - - + + - + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - + - + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - - + + - + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - + + + + - - + + - - + + - + @@ -20458,7 +20478,7 @@ - + @@ -20466,7 +20486,7 @@ - + @@ -20474,7 +20494,7 @@ - + @@ -20482,7 +20502,7 @@ - + @@ -20490,7 +20510,7 @@ - + @@ -20498,7 +20518,7 @@ - + @@ -20506,7 +20526,7 @@ - + @@ -20514,7 +20534,7 @@ - + @@ -20522,7 +20542,7 @@ - + @@ -20530,7 +20550,7 @@ - + @@ -20538,7 +20558,7 @@ - + @@ -20546,7 +20566,7 @@ - + @@ -20554,7 +20574,7 @@ - + @@ -20562,7 +20582,7 @@ - + @@ -20570,48 +20590,48 @@ - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + @@ -20620,22 +20640,22 @@ - - - - + + + + - - + + - + - - + + @@ -20643,10 +20663,10 @@ - + - + @@ -20664,19 +20684,19 @@ - + - - + + - - + + @@ -20684,37 +20704,37 @@ - - + + - + - + - + - + - + - + - + - + - + @@ -20723,7 +20743,7 @@ - + @@ -20749,19 +20769,19 @@ - + - - + + - + - + @@ -20773,20 +20793,20 @@ - + - + - + - + - + @@ -20795,10 +20815,10 @@ - + - + @@ -20807,7 +20827,7 @@ - + @@ -20815,17 +20835,17 @@ - + - + - + @@ -20836,7 +20856,7 @@ - + @@ -20844,19 +20864,19 @@ - + - - + + - + - + @@ -20864,10 +20884,10 @@ - + - + @@ -20887,7 +20907,7 @@ - + @@ -20934,21 +20954,21 @@ - + - + - + - + @@ -20956,7 +20976,7 @@ - + @@ -20979,13 +20999,13 @@ - + - + - + @@ -20996,12 +21016,12 @@ - + - + @@ -21015,7 +21035,7 @@ - + @@ -21029,7 +21049,7 @@ - + @@ -21038,7 +21058,7 @@ - + @@ -21055,8 +21075,8 @@ - - + + @@ -21076,7 +21096,7 @@ - + @@ -21090,7 +21110,7 @@ - + @@ -21106,7 +21126,7 @@ - + @@ -21114,15 +21134,15 @@ - + - + - + @@ -21146,12 +21166,12 @@ - + - + @@ -21174,19 +21194,19 @@ - - + + - + - + - + @@ -21195,7 +21215,7 @@ - + @@ -21203,7 +21223,7 @@ - + @@ -21214,7 +21234,7 @@ - + @@ -21225,7 +21245,7 @@ - + @@ -21234,7 +21254,7 @@ - + @@ -21242,10 +21262,10 @@ - + - + @@ -21257,8 +21277,8 @@ - - + + @@ -21266,12 +21286,12 @@ - + - + - + @@ -21285,7 +21305,7 @@ - + @@ -21293,18 +21313,18 @@ - + - + - + - + - + @@ -21318,8 +21338,8 @@ - - + + @@ -21354,285 +21374,288 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - - + + - + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - - - - - + + - - + + - + + + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - - - - + - - + + - + + + + - + - + - - + + - - + + - - + + - - + + - - + + - + + + + - + - + - + - + - + - + - + @@ -21676,21 +21699,21 @@ - + - + - + - + - - + + @@ -21701,14 +21724,14 @@ - - + + - - + + @@ -21716,71 +21739,71 @@ - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -21789,17 +21812,17 @@ - + - + - + @@ -21823,7 +21846,7 @@ - + @@ -21831,26 +21854,26 @@ - - + + - + - + - - + + - + @@ -21859,7 +21882,7 @@ - + @@ -21867,43 +21890,43 @@ - + - + - + - + - - + + - + - + - + - + - + - + - + @@ -21918,15 +21941,15 @@ - + - + - + @@ -21934,7 +21957,7 @@ - + @@ -21946,7 +21969,7 @@ - + @@ -21954,16 +21977,16 @@ - - + + - + - + @@ -21972,7 +21995,7 @@ - + @@ -21983,53 +22006,53 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -22037,22 +22060,22 @@ - + - + - + - + - + @@ -22063,21 +22086,21 @@ - - - - - - - + - + - + + + + + + + @@ -22089,141 +22112,141 @@ - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + @@ -22237,7 +22260,7 @@ - + @@ -22245,25 +22268,25 @@ - + - + - + - + - + @@ -22286,32 +22309,32 @@ - + - + - + - - + + - + - + @@ -22319,19 +22342,19 @@ - - + + - - + + - + @@ -22340,8 +22363,8 @@ - - + + @@ -22352,14 +22375,14 @@ - + - + @@ -22384,9 +22407,9 @@ - + - + @@ -22398,12 +22421,12 @@ - + - + - + @@ -22418,7 +22441,7 @@ - + @@ -22430,13 +22453,13 @@ - + - + - + @@ -22447,9 +22470,9 @@ - + - + @@ -22470,28 +22493,28 @@ - + - + - - - + + + - + - + - - - + + + @@ -22505,23 +22528,23 @@ - + - + - + - + - + @@ -22532,7 +22555,7 @@ - + @@ -22540,43 +22563,43 @@ - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + @@ -22611,36 +22634,36 @@ - - - + + + - + - - - - - + + + + + - - + + - + - + - + - + @@ -22648,8 +22671,8 @@ - - + + @@ -22657,11 +22680,11 @@ - + - + - + @@ -22670,10 +22693,10 @@ - - + + - + @@ -22682,10 +22705,10 @@ - - + + - + @@ -22697,21 +22720,21 @@ - + - + - + - - - - - - - + + + + + + + @@ -22734,24 +22757,24 @@ - + - + - + - + - - + + - + - + @@ -22769,29 +22792,29 @@ - - - - - - + + + + + + - + - - - + + + - - + + @@ -22799,9 +22822,9 @@ - - - + + + @@ -22815,36 +22838,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -22852,7 +22875,7 @@ - + @@ -22860,10 +22883,10 @@ - + - + @@ -22871,10 +22894,10 @@ - + - + @@ -22891,7 +22914,7 @@ - + @@ -22899,18 +22922,18 @@ - + - + - + - + - + @@ -22918,7 +22941,7 @@ - + @@ -22926,7 +22949,7 @@ - + @@ -22937,8 +22960,8 @@ - - + + @@ -22949,9 +22972,9 @@ - - - + + + @@ -22989,10 +23012,10 @@ - + - + @@ -23001,7 +23024,7 @@ - + @@ -23013,19 +23036,19 @@ - + - + - + - + @@ -23040,22 +23063,22 @@ - - + + - + - + - + @@ -23081,19 +23104,19 @@ - + - + - + - + @@ -23141,11 +23164,11 @@ - + - - + + @@ -23228,7 +23251,7 @@ - + @@ -23267,10 +23290,10 @@ - + - + @@ -23291,7 +23314,7 @@ - + @@ -23302,11 +23325,11 @@ - + - - + + @@ -23329,14 +23352,14 @@ - + - - + + @@ -23344,10 +23367,10 @@ - - + + - + @@ -23356,7 +23379,7 @@ - + @@ -23364,8 +23387,8 @@ - - + + @@ -23379,13 +23402,13 @@ - - + + - + @@ -23400,7 +23423,7 @@ - + @@ -23436,7 +23459,7 @@ - + @@ -23451,171 +23474,171 @@ - + - - - - - - - - + + + + + + + + - + - - - + + + - - + + - - - - - - - - - - - + + + + + + + + + + - - - + + + + - + - - - - - - - + + + + + + + - - + + - + - - + + - - + + - - + + - - - - - + + + + + - - + + - - - - - + + + + + - - - + + + - + - + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - + - + + + - - - - - - - - - - - - + + + + + + + + + + - - - + + + - - - + + + - - - - - + + + + + - + @@ -23924,272 +23947,272 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -24304,14 +24327,14 @@ - - + + - + - + @@ -24329,9 +24352,9 @@ - + - + @@ -24476,9 +24499,9 @@ - - - + + + @@ -24486,7 +24509,7 @@ - + @@ -24494,12 +24517,12 @@ - + - + @@ -24513,9 +24536,9 @@ - - - + + + @@ -24524,8 +24547,8 @@ - + @@ -24582,7 +24605,7 @@ - + @@ -24670,7 +24693,7 @@ - + @@ -24720,7 +24743,7 @@ - + @@ -24731,8 +24754,8 @@ - - + + @@ -24740,10 +24763,10 @@ - + - + @@ -24752,13 +24775,13 @@ - - + + - + @@ -24779,11 +24802,11 @@ - + - - + + @@ -24797,17 +24820,17 @@ - - - - - + + + + + - + - + @@ -24816,7 +24839,7 @@ - + @@ -24829,7 +24852,7 @@ - + @@ -24843,24 +24866,24 @@ - - + + - + - + - + @@ -24884,7 +24907,7 @@ - + @@ -24959,7 +24982,7 @@ - + @@ -24967,7 +24990,7 @@ - + @@ -25060,35 +25083,35 @@ - - + + - + - + - - + + - + - + - + - + - + - - + + @@ -25099,32 +25122,32 @@ - + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - + @@ -25174,10 +25197,10 @@ - - - - + + + + @@ -25411,23 +25434,23 @@ - + - + - + + - - + @@ -25651,7 +25674,7 @@ - + @@ -25659,16 +25682,16 @@ - - - - - + + + + + - - - - + + + + @@ -25713,38 +25736,38 @@ - - + + - + - + - + - + - + - - + + - - + + @@ -25769,7 +25792,7 @@ - + @@ -25781,7 +25804,7 @@ - + @@ -25813,7 +25836,7 @@ - + @@ -25890,10 +25913,10 @@ - + - + @@ -25901,7 +25924,7 @@ - + @@ -25916,7 +25939,7 @@ - + @@ -25925,22 +25948,22 @@ - - + + - + - - + + - + - + - + @@ -25978,16 +26001,16 @@ - - + + - - + + @@ -26003,25 +26026,25 @@ - + - + - + - + - + - - + + @@ -26032,17 +26055,17 @@ - + - - + + - - + + @@ -26053,17 +26076,17 @@ - + - + - + - + @@ -26072,7 +26095,7 @@ - + @@ -26080,7 +26103,7 @@ - + @@ -26090,8 +26113,8 @@ - - + + @@ -26099,25 +26122,25 @@ - - + + - + - - + + - + - + @@ -26135,10 +26158,10 @@ - + - + @@ -26164,7 +26187,7 @@ - + @@ -26182,7 +26205,7 @@ - + @@ -26227,199 +26250,199 @@ - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - - - - + + + + - - - + + + - + - + - + - + @@ -26429,15 +26452,15 @@ - - + + - - + + @@ -26447,71 +26470,71 @@ - + - + - + - - + + - + - + - - - - - - + + + + + + - + - + - + - + - + - + - - - - + + + + - + @@ -26532,10 +26555,10 @@ - + - + @@ -26547,24 +26570,24 @@ - + - + - - - - - + + + + + - + @@ -26572,33 +26595,33 @@ - + - + - + - - + + - + - + @@ -26607,24 +26630,24 @@ - - + + - - + + - + - + - + @@ -26634,17 +26657,17 @@ - - + + - - + + - + @@ -26659,7 +26682,7 @@ - + @@ -26668,14 +26691,14 @@ - + - + @@ -26687,11 +26710,11 @@ - + - + @@ -26705,50 +26728,50 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -26789,21 +26812,21 @@ - - - - - + + + + - - + + + - + - + @@ -26818,27 +26841,27 @@ - + - + - + - + - + @@ -26861,9 +26884,9 @@ - - - + + + @@ -26871,10 +26894,10 @@ - - + + - + @@ -26883,7 +26906,7 @@ - + @@ -26897,8 +26920,8 @@ - - + + @@ -26909,21 +26932,21 @@ - - + + - + - + - - - + + + @@ -26946,35 +26969,35 @@ - + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - - + + @@ -26987,10 +27010,10 @@ - + - + @@ -27097,14 +27120,14 @@ - + - + - + @@ -27112,16 +27135,16 @@ - + - + - + @@ -27132,121 +27155,121 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + @@ -27282,21 +27305,21 @@ - + - + - + - + @@ -27304,27 +27327,27 @@ - - + + - + - + - + - + @@ -27462,15 +27485,15 @@ - + - + - + @@ -27478,11 +27501,11 @@ - - - - - + + + + + @@ -27526,7 +27549,7 @@ - + @@ -27597,7 +27620,7 @@ - + @@ -27671,9 +27694,9 @@ - + - + @@ -27713,17 +27736,17 @@ - + - + - - - - + + + + @@ -27744,7 +27767,7 @@ - + @@ -27758,7 +27781,7 @@ - + @@ -27766,15 +27789,15 @@ - - - - - - - - - + + + + + + + + + @@ -27834,7 +27857,7 @@ - + @@ -27869,15 +27892,15 @@ - + - + - + @@ -27967,8 +27990,8 @@ - - + + @@ -27980,11 +28003,11 @@ - - + + - + @@ -28002,7 +28025,7 @@ - + @@ -28015,7 +28038,7 @@ - + @@ -28024,22 +28047,22 @@ - + - - + + - - + + @@ -28056,7 +28079,7 @@ - + @@ -28065,7 +28088,7 @@ - + @@ -28073,24 +28096,24 @@ - + - + - + - + - + - + @@ -28100,9 +28123,9 @@ - - - + + + @@ -28110,48 +28133,48 @@ - + - - - + + + - + - + - + - + - + - + - + - - + + @@ -28182,7 +28205,7 @@ - + @@ -28246,7 +28269,7 @@ - + @@ -28319,7 +28342,7 @@ - + @@ -28331,11 +28354,11 @@ - + - - + + @@ -28355,8 +28378,8 @@ - - + + @@ -28364,7 +28387,7 @@ - + @@ -28376,27 +28399,27 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - - + + - + @@ -28464,13 +28487,13 @@ - + - - + + @@ -28495,21 +28518,21 @@ - + - + - + - + @@ -28518,7 +28541,7 @@ - + @@ -28532,7 +28555,7 @@ - + @@ -28541,7 +28564,7 @@ - + @@ -28609,12 +28632,12 @@ - + - + @@ -28631,19 +28654,19 @@ - + - + - + @@ -28678,12 +28701,12 @@ - + - + @@ -28696,44 +28719,44 @@ - + - + - + - + - + - + - + - + - + @@ -28742,32 +28765,32 @@ - + - + - + - + - + @@ -28792,7 +28815,7 @@ - + @@ -28800,12 +28823,12 @@ - - + + - + @@ -28815,33 +28838,33 @@ - + - + - + - + - + @@ -28849,85 +28872,85 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -28936,62 +28959,62 @@ - + - + - + - + - + - + - + - + - - - + + + - + - - + + - + - - - - - + + + + + @@ -29003,8 +29026,8 @@ - - + + @@ -29050,12 +29073,12 @@ - + - + @@ -29063,8 +29086,8 @@ - - + + @@ -29073,53 +29096,53 @@ - + - + - + - + - + - - - + + + - + - - + + - + - - - - - - + + + + + + @@ -29135,7 +29158,7 @@ - + @@ -29144,21 +29167,21 @@ - + - + - + - + @@ -29174,65 +29197,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -29240,18 +29263,18 @@ - + - + - + - + @@ -29269,13 +29292,13 @@ - + - + - + @@ -29287,16 +29310,16 @@ - + - + - - - - + + + + @@ -29398,21 +29421,21 @@ - + - - - - + + + + - + - + @@ -29421,27 +29444,27 @@ - + - + - + - + - + @@ -29507,16 +29530,16 @@ - - + + - + - + @@ -29530,7 +29553,7 @@ - + @@ -29542,23 +29565,23 @@ - - + + - + - + - + @@ -29576,11 +29599,11 @@ - + - + @@ -29590,36 +29613,36 @@ - + - + - + - + - - - - + + + + - + - + - + - + @@ -29631,25 +29654,25 @@ - - + + - + - + - + - + - + - + @@ -29657,7 +29680,7 @@ - + @@ -29665,59 +29688,59 @@ - + - + - + - + - - - - - + + + + + - + - + - + - + - + - - - + + + - - - - - - - + + + + + + + @@ -29887,13 +29910,13 @@ - + - - + + @@ -29925,7 +29948,7 @@ - + @@ -30165,7 +30188,7 @@ - + @@ -30273,7 +30296,7 @@ - + @@ -30282,8 +30305,8 @@ - - + + @@ -30348,19 +30371,19 @@ - + - - + + - - - - + + + + @@ -30380,7 +30403,7 @@ - + @@ -30442,7 +30465,7 @@ - + @@ -30453,7 +30476,7 @@ - + @@ -30466,117 +30489,117 @@ - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - + - - + + - - + + - - - + + + - + - + - + - + - - + + - - - + + + @@ -30791,7 +30814,7 @@ - + @@ -30805,7 +30828,7 @@ - + @@ -30842,22 +30865,22 @@ - - - - + + + + - + - + - + @@ -30988,7 +31011,7 @@ - + @@ -30997,8 +31020,11 @@ - - + + + + + @@ -31019,7 +31045,7 @@ - + @@ -31114,10 +31140,10 @@ - - - - + + + + @@ -31147,7 +31173,7 @@ - + @@ -31168,8 +31194,8 @@ - - + + @@ -31191,26 +31217,26 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + @@ -31228,30 +31254,30 @@ - + - + - + - - + + - + - + @@ -31264,7 +31290,7 @@ - + @@ -31294,7 +31320,7 @@ - + @@ -31303,17 +31329,17 @@ - + - + - - + + @@ -31322,11 +31348,11 @@ - + - + @@ -31361,13 +31387,13 @@ - + - + @@ -31381,8 +31407,8 @@ - - + + diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 7f1bc363861ddf..54d7e62292966e 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -61,6 +61,8 @@ typedef struct _stack_chunk { PyObject * data[1]; /* Variable sized */ } _PyStackChunk; +/* Minimum size of data stack chunk */ +#define _PY_DATA_STACK_CHUNK_SIZE (16*1024) struct _ts { /* See Python/ceval.c for comments explaining most fields */ diff --git a/Include/internal/pycore_debug_offsets.h b/Include/internal/pycore_debug_offsets.h index 1a265c59ff8c08..ce3fcb109f49f7 100644 --- a/Include/internal/pycore_debug_offsets.h +++ b/Include/internal/pycore_debug_offsets.h @@ -54,11 +54,13 @@ extern "C" { # define _Py_Debug_Free_Threaded 1 # define _Py_Debug_code_object_co_tlbc offsetof(PyCodeObject, co_tlbc) # define _Py_Debug_interpreter_frame_tlbc_index offsetof(_PyInterpreterFrame, tlbc_index) +# define _Py_Debug_interpreter_state_tlbc_generation offsetof(PyInterpreterState, tlbc_indices.tlbc_generation) #else # define _Py_Debug_gilruntimestate_enabled 0 # define _Py_Debug_Free_Threaded 0 # define _Py_Debug_code_object_co_tlbc 0 # define _Py_Debug_interpreter_frame_tlbc_index 0 +# define _Py_Debug_interpreter_state_tlbc_generation 0 #endif @@ -89,6 +91,8 @@ typedef struct _Py_DebugOffsets { uint64_t gil_runtime_state_enabled; uint64_t gil_runtime_state_locked; uint64_t gil_runtime_state_holder; + uint64_t code_object_generation; + uint64_t tlbc_generation; } interpreter_state; // Thread state offset; @@ -216,6 +220,11 @@ typedef struct _Py_DebugOffsets { uint64_t gi_frame_state; } gen_object; + struct _llist_node { + uint64_t next; + uint64_t prev; + } llist_node; + struct _debugger_support { uint64_t eval_breaker; uint64_t remote_debugger_support; @@ -251,6 +260,8 @@ typedef struct _Py_DebugOffsets { .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), \ + .code_object_generation = offsetof(PyInterpreterState, _code_object_generation), \ + .tlbc_generation = _Py_Debug_interpreter_state_tlbc_generation, \ }, \ .thread_state = { \ .size = sizeof(PyThreadState), \ @@ -347,6 +358,10 @@ typedef struct _Py_DebugOffsets { .gi_iframe = offsetof(PyGenObject, gi_iframe), \ .gi_frame_state = offsetof(PyGenObject, gi_frame_state), \ }, \ + .llist_node = { \ + .next = offsetof(struct llist_node, next), \ + .prev = offsetof(struct llist_node, prev), \ + }, \ .debugger_support = { \ .eval_breaker = offsetof(PyThreadState, eval_breaker), \ .remote_debugger_support = offsetof(PyThreadState, remote_debugger_support), \ diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 14fe9cdf0c77a0..6381bac38aa8d2 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -796,6 +796,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(alias)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(align)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(all)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(all_threads)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(allow_code)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(any)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(append)); diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 197362a3e98be0..97547f771a6953 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -287,6 +287,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(alias) STRUCT_FOR_ID(align) STRUCT_FOR_ID(all) + STRUCT_FOR_ID(all_threads) STRUCT_FOR_ID(allow_code) STRUCT_FOR_ID(any) STRUCT_FOR_ID(append) diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index c3e6c77405bfe7..8a29c533b99058 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -726,6 +726,10 @@ typedef struct _PyIndexPool { // Next index to allocate if no free indices are available int32_t next_index; + + // Generation counter incremented on thread creation/destruction + // Used for TLBC cache invalidation in remote debugging + uint32_t tlbc_generation; } _PyIndexPool; typedef union _Py_unique_id_entry { @@ -843,6 +847,8 @@ struct _is { /* The per-interpreter GIL, which might not be used. */ struct _gil_runtime_state _gil; + uint64_t _code_object_generation; + /* ---------- IMPORTANT --------------------------- The fields above this line are declared as early as possible to facilitate out-of-process observability diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h index cb6e9c0b02ce2c..7143ad0a018eb5 100644 --- a/Include/internal/pycore_runtime_init_generated.h +++ b/Include/internal/pycore_runtime_init_generated.h @@ -794,6 +794,7 @@ extern "C" { INIT_ID(alias), \ INIT_ID(align), \ INIT_ID(all), \ + INIT_ID(all_threads), \ INIT_ID(allow_code), \ INIT_ID(any), \ INIT_ID(append), \ diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h index dbb0f4e921149c..bdf0a0a2e33695 100644 --- a/Include/internal/pycore_unicodeobject_generated.h +++ b/Include/internal/pycore_unicodeobject_generated.h @@ -936,6 +936,10 @@ _PyUnicode_InitStaticStrings(PyInterpreterState *interp) { _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(all_threads); + _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)); diff --git a/Lib/asyncio/tools.py b/Lib/asyncio/tools.py index b2da7d2f6ba10c..3fc4524c008db6 100644 --- a/Lib/asyncio/tools.py +++ b/Lib/asyncio/tools.py @@ -1,11 +1,10 @@ """Tools to analyze tasks running in asyncio programs.""" -from dataclasses import dataclass from collections import defaultdict from itertools import count from enum import Enum import sys -from _remote_debugging import get_all_awaited_by +from _remote_debugging import RemoteUnwinder class NodeType(Enum): @@ -118,6 +117,11 @@ def dfs(v): # ─── PRINT TREE FUNCTION ─────────────────────────────────────── +def get_all_awaited_by(pid): + unwinder = RemoteUnwinder(pid) + return unwinder.get_all_awaited_by() + + def build_async_tree(result, task_emoji="(T)", cor_emoji=""): """ Build a list of strings for pretty-print an async call tree. diff --git a/Lib/test/test_external_inspection.py b/Lib/test/test_external_inspection.py index ad3f669a03043e..291c419066ac5b 100644 --- a/Lib/test/test_external_inspection.py +++ b/Lib/test/test_external_inspection.py @@ -4,6 +4,7 @@ import importlib import sys import socket +import threading from asyncio import staggered, taskgroups from unittest.mock import ANY from test.support import os_helper, SHORT_TIMEOUT, busy_retry @@ -16,9 +17,7 @@ try: from _remote_debugging import PROCESS_VM_READV_SUPPORTED - from _remote_debugging import get_stack_trace - from _remote_debugging import get_async_stack_trace - from _remote_debugging import get_all_awaited_by + from _remote_debugging import RemoteUnwinder except ImportError: raise unittest.SkipTest("Test only runs when _remote_debugging is available") @@ -34,7 +33,23 @@ def _make_test_script(script_dir, script_basename, source): ) +def get_stack_trace(pid): + unwinder = RemoteUnwinder(pid, all_threads=True) + return unwinder.get_stack_trace() + + +def get_async_stack_trace(pid): + unwinder = RemoteUnwinder(pid) + return unwinder.get_async_stack_trace() + + +def get_all_awaited_by(pid): + unwinder = RemoteUnwinder(pid) + return unwinder.get_all_awaited_by() + + class TestGetStackTrace(unittest.TestCase): + maxDiff = None @skip_if_not_supported @unittest.skipIf( @@ -46,7 +61,7 @@ def test_remote_stack_trace(self): port = find_unused_port() script = textwrap.dedent( f"""\ - import time, sys, socket + import time, sys, socket, threading # Connect to the test process sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', {port})) @@ -55,13 +70,16 @@ def bar(): for x in range(100): if x == 50: baz() + def baz(): foo() def foo(): - sock.sendall(b"ready"); time.sleep(10_000) # same line number + sock.sendall(b"ready:thread\\n"); time.sleep(10_000) # same line number - bar() + t = threading.Thread(target=bar) + t.start() + sock.sendall(b"ready:main\\n"); t.join() # same line number """ ) stack_trace = None @@ -82,8 +100,9 @@ def foo(): p = subprocess.Popen([sys.executable, script_name]) client_socket, _ = server_socket.accept() server_socket.close() - response = client_socket.recv(1024) - self.assertEqual(response, b"ready") + response = b"" + while b"ready:main" not in response or b"ready:thread" not in response: + response += client_socket.recv(1024) stack_trace = get_stack_trace(p.pid) except PermissionError: self.skipTest("Insufficient permissions to read the stack trace") @@ -94,13 +113,23 @@ def foo(): p.terminate() p.wait(timeout=SHORT_TIMEOUT) - expected_stack_trace = [ - ("foo", script_name, 14), - ("baz", script_name, 11), + thread_expected_stack_trace = [ + ("foo", script_name, 15), + ("baz", script_name, 12), ("bar", script_name, 9), - ("", script_name, 16), + ('Thread.run', threading.__file__, ANY) ] - self.assertEqual(stack_trace, expected_stack_trace) + # Is possible that there are more threads, so we check that the + # expected stack traces are in the result (looking at you Windows!) + self.assertIn((ANY, thread_expected_stack_trace), stack_trace) + + # Check that the main thread stack trace is in the result + frame = ("", script_name, 19) + for _, stack in stack_trace: + if frame in stack: + break + else: + self.fail("Main thread stack trace not found in result") @skip_if_not_supported @unittest.skipIf( @@ -700,13 +729,28 @@ async def main(): ) def test_self_trace(self): stack_trace = get_stack_trace(os.getpid()) + # Is possible that there are more threads, so we check that the + # expected stack traces are in the result (looking at you Windows!) + this_tread_stack = None + for thread_id, stack in stack_trace: + if thread_id == threading.get_native_id(): + this_tread_stack = stack + break + self.assertIsNotNone(this_tread_stack) self.assertEqual( - stack_trace[0], - ( - "TestGetStackTrace.test_self_trace", - __file__, - self.test_self_trace.__code__.co_firstlineno + 6, - ), + stack[:2], + [ + ( + "get_stack_trace", + __file__, + get_stack_trace.__code__.co_firstlineno + 2, + ), + ( + "TestGetStackTrace.test_self_trace", + __file__, + self.test_self_trace.__code__.co_firstlineno + 6, + ), + ] ) diff --git a/Makefile.pre.in b/Makefile.pre.in index 3ab7c3d6c48ad9..b5703fbe6ae974 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1206,6 +1206,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/unicodeobject.h \ $(srcdir)/Include/warnings.h \ $(srcdir)/Include/weakrefobject.h \ + $(srcdir)/Python/remote_debug.h \ \ pyconfig.h \ $(PARSER_HEADERS) \ diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index f9f77a0814b4ce..004169e7a9c6a5 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -1,5 +1,16 @@ + /****************************************************************************** + * Python Remote Debugging Module + * + * This module provides functionality to debug Python processes remotely by + * reading their memory and reconstructing stack traces and asyncio task states. + ******************************************************************************/ + #define _GNU_SOURCE +/* ============================================================================ + * HEADERS AND INCLUDES + * ============================================================================ */ + #include #include #include @@ -23,6 +34,47 @@ # define HAVE_PROCESS_VM_READV 0 #endif +/* ============================================================================ + * TYPE DEFINITIONS AND STRUCTURES + * ============================================================================ */ + +#define GET_MEMBER(type, obj, offset) (*(type*)((char*)(obj) + (offset))) + +/* Size macros for opaque buffers */ +#define SIZEOF_BYTES_OBJ sizeof(PyBytesObject) +#define SIZEOF_CODE_OBJ sizeof(PyCodeObject) +#define SIZEOF_GEN_OBJ sizeof(PyGenObject) +#define SIZEOF_INTERP_FRAME sizeof(_PyInterpreterFrame) +#define SIZEOF_LLIST_NODE sizeof(struct llist_node) +#define SIZEOF_PAGE_CACHE_ENTRY sizeof(page_cache_entry_t) +#define SIZEOF_PYOBJECT sizeof(PyObject) +#define SIZEOF_SET_OBJ sizeof(PySetObject) +#define SIZEOF_TASK_OBJ 4096 +#define SIZEOF_THREAD_STATE sizeof(PyThreadState) +#define SIZEOF_TYPE_OBJ sizeof(PyTypeObject) +#define SIZEOF_UNICODE_OBJ sizeof(PyUnicodeObject) +#define SIZEOF_LONG_OBJ sizeof(PyLongObject) + +// Calculate the minimum buffer size needed to read interpreter state fields +// We need to read code_object_generation and potentially tlbc_generation +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#ifdef Py_GIL_DISABLED +#define INTERP_STATE_MIN_SIZE MAX(MAX(offsetof(PyInterpreterState, _code_object_generation) + sizeof(uint64_t), \ + offsetof(PyInterpreterState, tlbc_indices.tlbc_generation) + sizeof(uint32_t)), \ + offsetof(PyInterpreterState, threads.head) + sizeof(void*)) +#else +#define INTERP_STATE_MIN_SIZE MAX(offsetof(PyInterpreterState, _code_object_generation) + sizeof(uint64_t), \ + offsetof(PyInterpreterState, threads.head) + sizeof(void*)) +#endif +#define INTERP_STATE_BUFFER_SIZE MAX(INTERP_STATE_MIN_SIZE, 256) + + + +// Copied from Modules/_asynciomodule.c because it's not exported + struct _Py_AsyncioModuleDebugOffsets { struct _asyncio_task_object { uint64_t size; @@ -45,6 +97,127 @@ struct _Py_AsyncioModuleDebugOffsets { } asyncio_thread_state; }; +typedef struct { + PyObject_HEAD + proc_handle_t handle; + uintptr_t runtime_start_address; + struct _Py_DebugOffsets debug_offsets; + int async_debug_offsets_available; + struct _Py_AsyncioModuleDebugOffsets async_debug_offsets; + uintptr_t interpreter_addr; + uintptr_t tstate_addr; + uint64_t code_object_generation; + _Py_hashtable_t *code_object_cache; +#ifdef Py_GIL_DISABLED + // TLBC cache invalidation tracking + uint32_t tlbc_generation; // Track TLBC index pool changes + _Py_hashtable_t *tlbc_cache; // Cache of TLBC arrays by code object address +#endif +} RemoteUnwinderObject; + +typedef struct { + PyObject *func_name; + PyObject *file_name; + int first_lineno; + PyObject *linetable; // bytes + uintptr_t addr_code_adaptive; +} CachedCodeMetadata; + +typedef struct { + /* Types */ + PyTypeObject *RemoteDebugging_Type; +} RemoteDebuggingState; + +typedef struct +{ + int lineno; + int end_lineno; + int column; + int end_column; +} LocationInfo; + +typedef struct { + uintptr_t remote_addr; + size_t size; + void *local_copy; +} StackChunkInfo; + +typedef struct { + StackChunkInfo *chunks; + size_t count; +} StackChunkList; + +#include "clinic/_remote_debugging_module.c.h" + +/*[clinic input] +module _remote_debugging +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5f507d5b2e76a7f7]*/ + + +/* ============================================================================ + * FORWARD DECLARATIONS + * ============================================================================ */ + +static int +parse_tasks_in_set( + RemoteUnwinderObject *unwinder, + uintptr_t set_addr, + PyObject *awaited_by, + int recurse_task +); + +static int +parse_task( + RemoteUnwinderObject *unwinder, + uintptr_t task_address, + PyObject *render_to, + int recurse_task +); + +static int +parse_coro_chain( + RemoteUnwinderObject *unwinder, + uintptr_t coro_address, + PyObject *render_to +); + +/* Forward declarations for task parsing functions */ +static int parse_frame_object( + RemoteUnwinderObject *unwinder, + PyObject** result, + uintptr_t address, + uintptr_t* previous_frame +); + +/* ============================================================================ + * UTILITY FUNCTIONS AND HELPERS + * ============================================================================ */ + +static void +cached_code_metadata_destroy(void *ptr) +{ + CachedCodeMetadata *meta = (CachedCodeMetadata *)ptr; + Py_DECREF(meta->func_name); + Py_DECREF(meta->file_name); + Py_DECREF(meta->linetable); + PyMem_RawFree(meta); +} + +static inline RemoteDebuggingState * +RemoteDebugging_GetState(PyObject *module) +{ + void *state = _PyModule_GetState(module); + assert(state != NULL); + return (RemoteDebuggingState *)state; +} + +static inline int +RemoteDebugging_InitState(RemoteDebuggingState *st) +{ + return 0; +} + // Helper to chain exceptions and avoid repetitions static void chain_exceptions(PyObject *exception, const char *string) @@ -54,36 +227,14 @@ chain_exceptions(PyObject *exception, const char *string) _PyErr_ChainExceptions1(exc); } -// Get the PyAsyncioDebug section address for any platform -static uintptr_t -_Py_RemoteDebug_GetAsyncioDebugAddress(proc_handle_t* handle) -{ - uintptr_t address; - -#ifdef MS_WINDOWS - // On Windows, search for asyncio debug in executable or DLL - address = search_windows_map_for_section(handle, "AsyncioD", L"_asyncio"); -#elif defined(__linux__) - // On Linux, search for asyncio debug in executable or DLL - address = search_linux_map_for_section(handle, "AsyncioDebug", "_asyncio.cpython"); -#elif defined(__APPLE__) && TARGET_OS_OSX - // On macOS, try libpython first, then fall back to python - address = search_map_for_section(handle, "AsyncioDebug", "_asyncio.cpython"); - if (address == 0) { - PyErr_Clear(); - address = search_map_for_section(handle, "AsyncioDebug", "_asyncio.cpython"); - } -#else - Py_UNREACHABLE(); -#endif - - return address; -} +/* ============================================================================ + * MEMORY READING FUNCTIONS + * ============================================================================ */ static inline int read_ptr(proc_handle_t *handle, uintptr_t address, uintptr_t *ptr_addr) { - int result = _Py_RemoteDebug_ReadRemoteMemory(handle, address, sizeof(void*), ptr_addr); + int result = _Py_RemoteDebug_PagedReadRemoteMemory(handle, address, sizeof(void*), ptr_addr); if (result < 0) { return -1; } @@ -93,7 +244,7 @@ read_ptr(proc_handle_t *handle, uintptr_t address, uintptr_t *ptr_addr) static inline int read_Py_ssize_t(proc_handle_t *handle, uintptr_t address, Py_ssize_t *size) { - int result = _Py_RemoteDebug_ReadRemoteMemory(handle, address, sizeof(Py_ssize_t), size); + int result = _Py_RemoteDebug_PagedReadRemoteMemory(handle, address, sizeof(Py_ssize_t), size); if (result < 0) { return -1; } @@ -113,72 +264,53 @@ read_py_ptr(proc_handle_t *handle, uintptr_t address, uintptr_t *ptr_addr) static int read_char(proc_handle_t *handle, uintptr_t address, char *result) { - int res = _Py_RemoteDebug_ReadRemoteMemory(handle, address, sizeof(char), result); - if (res < 0) { - return -1; - } - return 0; -} - -static int -read_sized_int(proc_handle_t *handle, uintptr_t address, void *result, size_t size) -{ - int res = _Py_RemoteDebug_ReadRemoteMemory(handle, address, size, result); - if (res < 0) { - return -1; - } - return 0; -} - -static int -read_unsigned_long(proc_handle_t *handle, uintptr_t address, unsigned long *result) -{ - int res = _Py_RemoteDebug_ReadRemoteMemory(handle, address, sizeof(unsigned long), result); + int res = _Py_RemoteDebug_PagedReadRemoteMemory(handle, address, sizeof(char), result); if (res < 0) { return -1; } return 0; } -static int -read_pyobj(proc_handle_t *handle, uintptr_t address, PyObject *ptr_addr) -{ - int res = _Py_RemoteDebug_ReadRemoteMemory(handle, address, sizeof(PyObject), ptr_addr); - if (res < 0) { - return -1; - } - return 0; -} +/* ============================================================================ + * PYTHON OBJECT READING FUNCTIONS + * ============================================================================ */ static PyObject * read_py_str( - proc_handle_t *handle, - _Py_DebugOffsets* debug_offsets, + RemoteUnwinderObject *unwinder, uintptr_t address, Py_ssize_t max_len ) { PyObject *result = NULL; char *buf = NULL; - Py_ssize_t len; - int res = _Py_RemoteDebug_ReadRemoteMemory( - handle, - address + debug_offsets->unicode_object.length, - sizeof(Py_ssize_t), - &len + // Read the entire PyUnicodeObject at once + char unicode_obj[SIZEOF_UNICODE_OBJ]; + int res = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address, + SIZEOF_UNICODE_OBJ, + unicode_obj ); if (res < 0) { goto err; } + Py_ssize_t len = GET_MEMBER(Py_ssize_t, unicode_obj, unwinder->debug_offsets.unicode_object.length); + if (len < 0 || len > max_len) { + PyErr_Format(PyExc_RuntimeError, + "Invalid string length (%zd) at 0x%lx", len, address); + return NULL; + } + buf = (char *)PyMem_RawMalloc(len+1); if (buf == NULL) { PyErr_NoMemory(); return NULL; } - size_t offset = debug_offsets->unicode_object.asciiobject_size; - res = _Py_RemoteDebug_ReadRemoteMemory(handle, address + offset, len, buf); + size_t offset = unwinder->debug_offsets.unicode_object.asciiobject_size; + res = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address + offset, len, buf); if (res < 0) { goto err; } @@ -202,32 +334,40 @@ read_py_str( static PyObject * read_py_bytes( - proc_handle_t *handle, - _Py_DebugOffsets* debug_offsets, - uintptr_t address + RemoteUnwinderObject *unwinder, + uintptr_t address, + Py_ssize_t max_len ) { PyObject *result = NULL; char *buf = NULL; - Py_ssize_t len; - int res = _Py_RemoteDebug_ReadRemoteMemory( - handle, - address + debug_offsets->bytes_object.ob_size, - sizeof(Py_ssize_t), - &len + // Read the entire PyBytesObject at once + char bytes_obj[SIZEOF_BYTES_OBJ]; + int res = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address, + SIZEOF_BYTES_OBJ, + bytes_obj ); if (res < 0) { goto err; } + Py_ssize_t len = GET_MEMBER(Py_ssize_t, bytes_obj, unwinder->debug_offsets.bytes_object.ob_size); + if (len < 0 || len > max_len) { + PyErr_Format(PyExc_RuntimeError, + "Invalid string length (%zd) at 0x%lx", len, address); + return NULL; + } + buf = (char *)PyMem_RawMalloc(len+1); if (buf == NULL) { PyErr_NoMemory(); return NULL; } - size_t offset = debug_offsets->bytes_object.ob_sval; - res = _Py_RemoteDebug_ReadRemoteMemory(handle, address + offset, len, buf); + size_t offset = unwinder->debug_offsets.bytes_object.ob_sval; + res = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address + offset, len, buf); if (res < 0) { goto err; } @@ -249,45 +389,60 @@ read_py_bytes( return NULL; } - - static long -read_py_long(proc_handle_t *handle, _Py_DebugOffsets* offsets, uintptr_t address) +read_py_long( + RemoteUnwinderObject *unwinder, + uintptr_t address +) { unsigned int shift = PYLONG_BITS_IN_DIGIT; - Py_ssize_t size; - uintptr_t lv_tag; - - int bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, address + offsets->long_object.lv_tag, - sizeof(uintptr_t), - &lv_tag); + // Read the entire PyLongObject at once + char long_obj[SIZEOF_LONG_OBJ]; + int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address, + unwinder->debug_offsets.long_object.size, + long_obj); if (bytes_read < 0) { return -1; } + uintptr_t lv_tag = GET_MEMBER(uintptr_t, long_obj, unwinder->debug_offsets.long_object.lv_tag); int negative = (lv_tag & 3) == 2; - size = lv_tag >> 3; + Py_ssize_t size = lv_tag >> 3; if (size == 0) { return 0; } - digit *digits = (digit *)PyMem_RawMalloc(size * sizeof(digit)); - if (!digits) { - PyErr_NoMemory(); - return -1; - } + // If the long object has inline digits, use them directly + digit *digits; + if (size <= _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS) { + // For small integers, digits are inline in the long_value.ob_digit array + digits = (digit *)PyMem_RawMalloc(size * sizeof(digit)); + if (!digits) { + PyErr_NoMemory(); + return -1; + } + memcpy(digits, long_obj + unwinder->debug_offsets.long_object.ob_digit, size * sizeof(digit)); + } else { + // For larger integers, we need to read the digits separately + digits = (digit *)PyMem_RawMalloc(size * sizeof(digit)); + if (!digits) { + PyErr_NoMemory(); + return -1; + } - bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, - address + offsets->long_object.ob_digit, - sizeof(digit) * size, - digits - ); - if (bytes_read < 0) { - goto error; + bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address + unwinder->debug_offsets.long_object.ob_digit, + sizeof(digit) * size, + digits + ); + if (bytes_read < 0) { + goto error; + } } long long value = 0; @@ -310,44 +465,115 @@ read_py_long(proc_handle_t *handle, _Py_DebugOffsets* offsets, uintptr_t address return -1; } +/* ============================================================================ + * ASYNCIO DEBUG FUNCTIONS + * ============================================================================ */ + +// Get the PyAsyncioDebug section address for any platform +static uintptr_t +_Py_RemoteDebug_GetAsyncioDebugAddress(proc_handle_t* handle) +{ + uintptr_t address; + +#ifdef MS_WINDOWS + // On Windows, search for asyncio debug in executable or DLL + address = search_windows_map_for_section(handle, "AsyncioD", L"_asyncio"); + if (address == 0) { + // Error out: 'python' substring covers both executable and DLL + PyObject *exc = PyErr_GetRaisedException(); + PyErr_SetString(PyExc_RuntimeError, "Failed to find the AsyncioDebug section in the process."); + _PyErr_ChainExceptions1(exc); + } +#elif defined(__linux__) + // On Linux, search for asyncio debug in executable or DLL + address = search_linux_map_for_section(handle, "AsyncioDebug", "_asyncio.cpython"); + if (address == 0) { + // Error out: 'python' substring covers both executable and DLL + PyObject *exc = PyErr_GetRaisedException(); + PyErr_SetString(PyExc_RuntimeError, "Failed to find the AsyncioDebug section in the process."); + _PyErr_ChainExceptions1(exc); + } +#elif defined(__APPLE__) && TARGET_OS_OSX + // On macOS, try libpython first, then fall back to python + address = search_map_for_section(handle, "AsyncioDebug", "_asyncio.cpython"); + if (address == 0) { + PyErr_Clear(); + address = search_map_for_section(handle, "AsyncioDebug", "_asyncio.cpython"); + } + if (address == 0) { + // Error out: 'python' substring covers both executable and DLL + PyObject *exc = PyErr_GetRaisedException(); + PyErr_SetString(PyExc_RuntimeError, "Failed to find the AsyncioDebug section in the process."); + _PyErr_ChainExceptions1(exc); + } +#else + Py_UNREACHABLE(); +#endif + + return address; +} + +static int +read_async_debug( + RemoteUnwinderObject *unwinder +) { + uintptr_t async_debug_addr = _Py_RemoteDebug_GetAsyncioDebugAddress(&unwinder->handle); + if (!async_debug_addr) { + return -1; + } + + size_t size = sizeof(struct _Py_AsyncioModuleDebugOffsets); + int result = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, async_debug_addr, size, &unwinder->async_debug_offsets); + return result; +} + +/* ============================================================================ + * ASYNCIO TASK PARSING FUNCTIONS + * ============================================================================ */ + static PyObject * parse_task_name( - proc_handle_t *handle, - _Py_DebugOffsets* offsets, - struct _Py_AsyncioModuleDebugOffsets* async_offsets, + RemoteUnwinderObject *unwinder, uintptr_t task_address ) { - uintptr_t task_name_addr; - int err = read_py_ptr( - handle, - task_address + async_offsets->asyncio_task_object.task_name, - &task_name_addr); - if (err) { + // Read the entire TaskObj at once + char task_obj[SIZEOF_TASK_OBJ]; + int err = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + task_address, + unwinder->async_debug_offsets.asyncio_task_object.size, + task_obj); + if (err < 0) { return NULL; } - // The task name can be a long or a string so we need to check the type + uintptr_t task_name_addr = GET_MEMBER(uintptr_t, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_name); + task_name_addr &= ~Py_TAG_BITS; - PyObject task_name_obj; - err = read_pyobj( - handle, + // The task name can be a long or a string so we need to check the type + char task_name_obj[SIZEOF_PYOBJECT]; + err = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, task_name_addr, - &task_name_obj); - if (err) { + SIZEOF_PYOBJECT, + task_name_obj); + if (err < 0) { return NULL; } - unsigned long flags; - err = read_unsigned_long( - handle, - (uintptr_t)task_name_obj.ob_type + offsets->type_object.tp_flags, - &flags); - if (err) { + // Now read the type object to get the flags + char type_obj[SIZEOF_TYPE_OBJ]; + err = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + GET_MEMBER(uintptr_t, task_name_obj, unwinder->debug_offsets.pyobject.ob_type), + SIZEOF_TYPE_OBJ, + type_obj); + if (err < 0) { return NULL; } - if ((flags & Py_TPFLAGS_LONG_SUBCLASS)) { - long res = read_py_long(handle, offsets, task_name_addr); + if ((GET_MEMBER(unsigned long, type_obj, unwinder->debug_offsets.type_object.tp_flags) & Py_TPFLAGS_LONG_SUBCLASS)) { + long res = read_py_long(unwinder, task_name_addr); if (res == -1) { chain_exceptions(PyExc_RuntimeError, "Failed to get task name"); return NULL; @@ -355,355 +581,375 @@ parse_task_name( return PyUnicode_FromFormat("Task-%d", res); } - if(!(flags & Py_TPFLAGS_UNICODE_SUBCLASS)) { + if(!(GET_MEMBER(unsigned long, type_obj, unwinder->debug_offsets.type_object.tp_flags) & Py_TPFLAGS_UNICODE_SUBCLASS)) { PyErr_SetString(PyExc_RuntimeError, "Invalid task name object"); return NULL; } return read_py_str( - handle, - offsets, + unwinder, task_name_addr, 255 ); } -static int -parse_frame_object( - proc_handle_t *handle, - PyObject** result, - struct _Py_DebugOffsets* offsets, - uintptr_t address, - uintptr_t* previous_frame -); - -static int -parse_coro_chain( - proc_handle_t *handle, - struct _Py_DebugOffsets* offsets, - struct _Py_AsyncioModuleDebugOffsets* async_offsets, - uintptr_t coro_address, - PyObject *render_to +static int parse_task_awaited_by( + RemoteUnwinderObject *unwinder, + uintptr_t task_address, + PyObject *awaited_by, + int recurse_task ) { - assert((void*)coro_address != NULL); - - uintptr_t gen_type_addr; - int err = read_ptr( - handle, - coro_address + offsets->pyobject.ob_type, - &gen_type_addr); - if (err) { + // Read the entire TaskObj at once + char task_obj[SIZEOF_TASK_OBJ]; + if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, task_address, + unwinder->async_debug_offsets.asyncio_task_object.size, + task_obj) < 0) { return -1; } - PyObject* name = NULL; - uintptr_t prev_frame; - if (parse_frame_object( - handle, - &name, - offsets, - coro_address + offsets->gen_object.gi_iframe, - &prev_frame) - < 0) - { - return -1; - } + uintptr_t task_ab_addr = GET_MEMBER(uintptr_t, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_awaited_by); + task_ab_addr &= ~Py_TAG_BITS; - if (PyList_Append(render_to, name)) { - Py_DECREF(name); - return -1; + if ((void*)task_ab_addr == NULL) { + return 0; } - Py_DECREF(name); - int8_t gi_frame_state; - err = read_sized_int( - handle, - coro_address + offsets->gen_object.gi_frame_state, - &gi_frame_state, - sizeof(int8_t) - ); - if (err) { - return -1; - } + char awaited_by_is_a_set = GET_MEMBER(char, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_awaited_by_is_set); - if (gi_frame_state == FRAME_SUSPENDED_YIELD_FROM) { - char owner; - err = read_char( - handle, - coro_address + offsets->gen_object.gi_iframe + - offsets->interpreter_frame.owner, - &owner - ); - if (err) { + if (awaited_by_is_a_set) { + if (parse_tasks_in_set(unwinder, task_ab_addr, awaited_by, recurse_task)) { return -1; } - if (owner != FRAME_OWNED_BY_GENERATOR) { - PyErr_SetString( - PyExc_RuntimeError, - "generator doesn't own its frame \\_o_/"); + } else { + if (parse_task(unwinder, task_ab_addr, awaited_by, recurse_task)) { return -1; } + } + + return 0; +} + +static int +handle_yield_from_frame( + RemoteUnwinderObject *unwinder, + uintptr_t gi_iframe_addr, + uintptr_t gen_type_addr, + PyObject *render_to +) { + // Read the entire interpreter frame at once + char iframe[SIZEOF_INTERP_FRAME]; + int err = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + gi_iframe_addr, + SIZEOF_INTERP_FRAME, + iframe); + if (err < 0) { + return -1; + } + + if (GET_MEMBER(char, iframe, unwinder->debug_offsets.interpreter_frame.owner) != FRAME_OWNED_BY_GENERATOR) { + PyErr_SetString( + PyExc_RuntimeError, + "generator doesn't own its frame \\_o_/"); + return -1; + } + + uintptr_t stackpointer_addr = GET_MEMBER(uintptr_t, iframe, unwinder->debug_offsets.interpreter_frame.stackpointer); + stackpointer_addr &= ~Py_TAG_BITS; - uintptr_t stackpointer_addr; + if ((void*)stackpointer_addr != NULL) { + uintptr_t gi_await_addr; err = read_py_ptr( - handle, - coro_address + offsets->gen_object.gi_iframe + - offsets->interpreter_frame.stackpointer, - &stackpointer_addr); + &unwinder->handle, + stackpointer_addr - sizeof(void*), + &gi_await_addr); if (err) { return -1; } - if ((void*)stackpointer_addr != NULL) { - uintptr_t gi_await_addr; - err = read_py_ptr( - handle, - stackpointer_addr - sizeof(void*), - &gi_await_addr); + if ((void*)gi_await_addr != NULL) { + uintptr_t gi_await_addr_type_addr; + err = read_ptr( + &unwinder->handle, + gi_await_addr + unwinder->debug_offsets.pyobject.ob_type, + &gi_await_addr_type_addr); if (err) { return -1; } - if ((void*)gi_await_addr != NULL) { - uintptr_t gi_await_addr_type_addr; - int err = read_ptr( - handle, - gi_await_addr + offsets->pyobject.ob_type, - &gi_await_addr_type_addr); + if (gen_type_addr == gi_await_addr_type_addr) { + /* This needs an explanation. We always start with parsing + native coroutine / generator frames. Ultimately they + are awaiting on something. That something can be + a native coroutine frame or... an iterator. + If it's the latter -- we can't continue building + our chain. So the condition to bail out of this is + to do that when the type of the current coroutine + doesn't match the type of whatever it points to + in its cr_await. + */ + err = parse_coro_chain(unwinder, gi_await_addr, render_to); if (err) { return -1; } - - if (gen_type_addr == gi_await_addr_type_addr) { - /* This needs an explanation. We always start with parsing - native coroutine / generator frames. Ultimately they - are awaiting on something. That something can be - a native coroutine frame or... an iterator. - If it's the latter -- we can't continue building - our chain. So the condition to bail out of this is - to do that when the type of the current coroutine - doesn't match the type of whatever it points to - in its cr_await. - */ - err = parse_coro_chain( - handle, - offsets, - async_offsets, - gi_await_addr, - render_to - ); - if (err) { - return -1; - } - } } } - } return 0; } - static int -parse_task_awaited_by( - proc_handle_t *handle, - struct _Py_DebugOffsets* offsets, - struct _Py_AsyncioModuleDebugOffsets* async_offsets, - uintptr_t task_address, - PyObject *awaited_by, - int recurse_task -); +parse_coro_chain( + RemoteUnwinderObject *unwinder, + uintptr_t coro_address, + PyObject *render_to +) { + assert((void*)coro_address != NULL); + + // Read the entire generator object at once + char gen_object[SIZEOF_GEN_OBJ]; + int err = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + coro_address, + SIZEOF_GEN_OBJ, + gen_object); + if (err < 0) { + return -1; + } + uintptr_t gen_type_addr = GET_MEMBER(uintptr_t, gen_object, unwinder->debug_offsets.pyobject.ob_type); -static int -parse_task( - proc_handle_t *handle, - struct _Py_DebugOffsets* offsets, - struct _Py_AsyncioModuleDebugOffsets* async_offsets, + PyObject* name = NULL; + + // Parse the previous frame using the gi_iframe from local copy + uintptr_t prev_frame; + uintptr_t gi_iframe_addr = coro_address + unwinder->debug_offsets.gen_object.gi_iframe; + if (parse_frame_object(unwinder, &name, gi_iframe_addr, &prev_frame) < 0) { + return -1; + } + + if (PyList_Append(render_to, name)) { + Py_DECREF(name); + return -1; + } + Py_DECREF(name); + + if (GET_MEMBER(int8_t, gen_object, unwinder->debug_offsets.gen_object.gi_frame_state) == FRAME_SUSPENDED_YIELD_FROM) { + return handle_yield_from_frame(unwinder, gi_iframe_addr, gen_type_addr, render_to); + } + + return 0; +} + +static PyObject* +create_task_result( + RemoteUnwinderObject *unwinder, uintptr_t task_address, - PyObject *render_to, int recurse_task ) { - char is_task; - int err = read_char( - handle, - task_address + async_offsets->asyncio_task_object.task_is_task, - &is_task); - if (err) { - return -1; - } + PyObject* result = NULL; + PyObject *call_stack = NULL; + PyObject *tn = NULL; + char task_obj[SIZEOF_TASK_OBJ]; + uintptr_t coro_addr; - PyObject* result = PyList_New(0); + result = PyList_New(0); if (result == NULL) { - return -1; + goto error; } - PyObject *call_stack = PyList_New(0); + call_stack = PyList_New(0); if (call_stack == NULL) { - goto err; + goto error; } + if (PyList_Append(result, call_stack)) { - Py_DECREF(call_stack); - goto err; + goto error; } - /* we can operate on a borrowed one to simplify cleanup */ - Py_DECREF(call_stack); + Py_CLEAR(call_stack); - if (is_task) { - PyObject *tn = NULL; - if (recurse_task) { - tn = parse_task_name( - handle, offsets, async_offsets, task_address); - } else { - tn = PyLong_FromUnsignedLongLong(task_address); + if (recurse_task) { + tn = parse_task_name(unwinder, task_address); + } else { + tn = PyLong_FromUnsignedLongLong(task_address); + } + if (tn == NULL) { + goto error; + } + + if (PyList_Append(result, tn)) { + goto error; + } + Py_CLEAR(tn); + + // Parse coroutine chain + if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, task_address, + unwinder->async_debug_offsets.asyncio_task_object.size, + task_obj) < 0) { + goto error; + } + + coro_addr = GET_MEMBER(uintptr_t, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_coro); + coro_addr &= ~Py_TAG_BITS; + + if ((void*)coro_addr != NULL) { + call_stack = PyList_New(0); + if (call_stack == NULL) { + goto error; } - if (tn == NULL) { - goto err; + + if (parse_coro_chain(unwinder, coro_addr, call_stack) < 0) { + Py_DECREF(call_stack); + goto error; } - if (PyList_Append(result, tn)) { - Py_DECREF(tn); - goto err; + + if (PyList_Reverse(call_stack)) { + Py_DECREF(call_stack); + goto error; } - Py_DECREF(tn); - uintptr_t coro_addr; - err = read_py_ptr( - handle, - task_address + async_offsets->asyncio_task_object.task_coro, - &coro_addr); - if (err) { - goto err; + if (PyList_SetItem(result, 0, call_stack) < 0) { + Py_DECREF(call_stack); + goto error; } + } - if ((void*)coro_addr != NULL) { - err = parse_coro_chain( - handle, - offsets, - async_offsets, - coro_addr, - call_stack - ); - if (err) { - goto err; - } + return result; - if (PyList_Reverse(call_stack)) { - goto err; - } +error: + Py_XDECREF(result); + Py_XDECREF(call_stack); + Py_XDECREF(tn); + return NULL; +} + +static int +parse_task( + RemoteUnwinderObject *unwinder, + uintptr_t task_address, + PyObject *render_to, + int recurse_task +) { + char is_task; + PyObject* result = NULL; + PyObject* awaited_by = NULL; + int err; + + err = read_char( + &unwinder->handle, + task_address + unwinder->async_debug_offsets.asyncio_task_object.task_is_task, + &is_task); + if (err) { + goto error; + } + + if (is_task) { + result = create_task_result(unwinder, task_address, recurse_task); + if (!result) { + goto error; + } + } else { + result = PyList_New(0); + if (result == NULL) { + goto error; } } if (PyList_Append(render_to, result)) { - goto err; + goto error; } if (recurse_task) { - PyObject *awaited_by = PyList_New(0); + awaited_by = PyList_New(0); if (awaited_by == NULL) { - goto err; + goto error; } + if (PyList_Append(result, awaited_by)) { - Py_DECREF(awaited_by); - goto err; + goto error; } - /* we can operate on a borrowed one to simplify cleanup */ Py_DECREF(awaited_by); - if (parse_task_awaited_by(handle, offsets, async_offsets, - task_address, awaited_by, 1) - ) { - goto err; + /* awaited_by is borrowed from 'result' to simplify cleanup */ + if (parse_task_awaited_by(unwinder, task_address, awaited_by, 1) < 0) { + // Clear the pointer so the cleanup doesn't try to decref it since + // it's borrowed from 'result' and will be decrefed when result is + // deleted. + awaited_by = NULL; + goto error; } } Py_DECREF(result); return 0; -err: - Py_DECREF(result); +error: + Py_XDECREF(result); + Py_XDECREF(awaited_by); return -1; } static int -parse_tasks_in_set( - proc_handle_t *handle, - struct _Py_DebugOffsets* offsets, - struct _Py_AsyncioModuleDebugOffsets* async_offsets, - uintptr_t set_addr, +process_set_entry( + RemoteUnwinderObject *unwinder, + uintptr_t table_ptr, PyObject *awaited_by, int recurse_task ) { - uintptr_t set_obj; - if (read_py_ptr( - handle, - set_addr, - &set_obj) - ) { + uintptr_t key_addr; + if (read_py_ptr(&unwinder->handle, table_ptr, &key_addr)) { return -1; } - Py_ssize_t num_els; - if (read_Py_ssize_t( - handle, - set_obj + offsets->set_object.used, - &num_els) - ) { - return -1; - } + if ((void*)key_addr != NULL) { + Py_ssize_t ref_cnt; + if (read_Py_ssize_t(&unwinder->handle, table_ptr, &ref_cnt)) { + return -1; + } - Py_ssize_t set_len; - if (read_Py_ssize_t( - handle, - set_obj + offsets->set_object.mask, - &set_len) - ) { - return -1; + if (ref_cnt) { + // if 'ref_cnt=0' it's a set dummy marker + if (parse_task(unwinder, key_addr, awaited_by, recurse_task)) { + return -1; + } + return 1; // Successfully processed a valid entry + } } - set_len++; // The set contains the `mask+1` element slots. + return 0; // Entry was NULL or dummy marker +} - uintptr_t table_ptr; - if (read_ptr( - handle, - set_obj + offsets->set_object.table, - &table_ptr) - ) { +static int +parse_tasks_in_set( + RemoteUnwinderObject *unwinder, + uintptr_t set_addr, + PyObject *awaited_by, + int recurse_task +) { + char set_object[SIZEOF_SET_OBJ]; + int err = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + set_addr, + SIZEOF_SET_OBJ, + set_object); + if (err < 0) { return -1; } + Py_ssize_t num_els = GET_MEMBER(Py_ssize_t, set_object, unwinder->debug_offsets.set_object.used); + Py_ssize_t set_len = GET_MEMBER(Py_ssize_t, set_object, unwinder->debug_offsets.set_object.mask) + 1; // The set contains the `mask+1` element slots. + uintptr_t table_ptr = GET_MEMBER(uintptr_t, set_object, unwinder->debug_offsets.set_object.table); + Py_ssize_t i = 0; Py_ssize_t els = 0; - while (i < set_len) { - uintptr_t key_addr; - if (read_py_ptr(handle, table_ptr, &key_addr)) { + while (i < set_len && els < num_els) { + int result = process_set_entry(unwinder, table_ptr, awaited_by, recurse_task); + + if (result < 0) { return -1; } - - if ((void*)key_addr != NULL) { - Py_ssize_t ref_cnt; - if (read_Py_ssize_t(handle, table_ptr, &ref_cnt)) { - return -1; - } - - if (ref_cnt) { - // if 'ref_cnt=0' it's a set dummy marker - - if (parse_task( - handle, - offsets, - async_offsets, - key_addr, - awaited_by, - recurse_task - ) - ) { - return -1; - } - - if (++els == num_els) { - break; - } - } + if (result > 0) { + els++; } table_ptr += sizeof(void*) * 2; @@ -714,81 +960,224 @@ parse_tasks_in_set( static int -parse_task_awaited_by( - proc_handle_t *handle, - struct _Py_DebugOffsets* offsets, - struct _Py_AsyncioModuleDebugOffsets* async_offsets, - uintptr_t task_address, - PyObject *awaited_by, - int recurse_task +setup_async_result_structure(PyObject **result, PyObject **calls) +{ + *result = PyList_New(1); + if (*result == NULL) { + return -1; + } + + *calls = PyList_New(0); + if (*calls == NULL) { + Py_DECREF(*result); + *result = NULL; + return -1; + } + + if (PyList_SetItem(*result, 0, *calls)) { /* steals ref to 'calls' */ + Py_DECREF(*calls); + Py_DECREF(*result); + *result = NULL; + *calls = NULL; + return -1; + } + + return 0; +} + +static int +add_task_info_to_result( + RemoteUnwinderObject *self, + PyObject *result, + uintptr_t running_task_addr ) { - uintptr_t task_ab_addr; - int err = read_py_ptr( - handle, - task_address + async_offsets->asyncio_task_object.task_awaited_by, - &task_ab_addr); - if (err) { + PyObject *tn = parse_task_name(self, running_task_addr); + if (tn == NULL) { return -1; } - if ((void*)task_ab_addr == NULL) { - return 0; + if (PyList_Append(result, tn)) { + Py_DECREF(tn); + return -1; } + Py_DECREF(tn); - char awaited_by_is_a_set; - err = read_char( - handle, - task_address + async_offsets->asyncio_task_object.task_awaited_by_is_set, - &awaited_by_is_a_set); - if (err) { + PyObject* awaited_by = PyList_New(0); + if (awaited_by == NULL) { return -1; } - if (awaited_by_is_a_set) { - if (parse_tasks_in_set( - handle, - offsets, - async_offsets, - task_address + async_offsets->asyncio_task_object.task_awaited_by, - awaited_by, - recurse_task - ) - ) { - return -1; - } - } else { - uintptr_t sub_task; - if (read_py_ptr( - handle, - task_address + async_offsets->asyncio_task_object.task_awaited_by, - &sub_task) - ) { - return -1; - } + if (PyList_Append(result, awaited_by)) { + Py_DECREF(awaited_by); + return -1; + } + Py_DECREF(awaited_by); - if (parse_task( - handle, - offsets, - async_offsets, - sub_task, - awaited_by, - recurse_task - ) - ) { - return -1; - } + if (parse_task_awaited_by( + self, running_task_addr, awaited_by, 1) < 0) { + return -1; } return 0; } -typedef struct +static int +process_single_task_node( + RemoteUnwinderObject *unwinder, + uintptr_t task_addr, + PyObject *result +) { + PyObject *tn = NULL; + PyObject *current_awaited_by = NULL; + PyObject *task_id = NULL; + PyObject *result_item = NULL; + + tn = parse_task_name(unwinder, task_addr); + if (tn == NULL) { + goto error; + } + + current_awaited_by = PyList_New(0); + if (current_awaited_by == NULL) { + goto error; + } + + task_id = PyLong_FromUnsignedLongLong(task_addr); + if (task_id == NULL) { + goto error; + } + + result_item = PyTuple_New(3); + if (result_item == NULL) { + goto error; + } + + PyTuple_SET_ITEM(result_item, 0, task_id); // steals ref + PyTuple_SET_ITEM(result_item, 1, tn); // steals ref + PyTuple_SET_ITEM(result_item, 2, current_awaited_by); // steals ref + + // References transferred to tuple + task_id = NULL; + tn = NULL; + current_awaited_by = NULL; + + if (PyList_Append(result, result_item)) { + Py_DECREF(result_item); + return -1; + } + Py_DECREF(result_item); + + // Get back current_awaited_by reference for parse_task_awaited_by + current_awaited_by = PyTuple_GET_ITEM(result_item, 2); + if (parse_task_awaited_by(unwinder, task_addr, current_awaited_by, 0) < 0) { + return -1; + } + + return 0; + +error: + Py_XDECREF(tn); + Py_XDECREF(current_awaited_by); + Py_XDECREF(task_id); + Py_XDECREF(result_item); + return -1; +} + +/* ============================================================================ + * TLBC CACHING FUNCTIONS + * ============================================================================ */ + +#ifdef Py_GIL_DISABLED + +typedef struct { + void *tlbc_array; // Local copy of the TLBC array + Py_ssize_t tlbc_array_size; // Size of the TLBC array + uint32_t generation; // Generation when this was cached +} TLBCCacheEntry; + +static void +tlbc_cache_entry_destroy(void *ptr) { - int lineno; - int end_lineno; - int column; - int end_column; -} LocationInfo; + TLBCCacheEntry *entry = (TLBCCacheEntry *)ptr; + if (entry->tlbc_array) { + PyMem_RawFree(entry->tlbc_array); + } + PyMem_RawFree(entry); +} + +static TLBCCacheEntry * +get_tlbc_cache_entry(RemoteUnwinderObject *self, uintptr_t code_addr, uint32_t current_generation) +{ + void *key = (void *)code_addr; + TLBCCacheEntry *entry = _Py_hashtable_get(self->tlbc_cache, key); + + if (entry && entry->generation != current_generation) { + // Entry is stale, remove it by setting to NULL + _Py_hashtable_set(self->tlbc_cache, key, NULL); + entry = NULL; + } + + return entry; +} + +static int +cache_tlbc_array(RemoteUnwinderObject *self, uintptr_t code_addr, uintptr_t tlbc_array_addr, uint32_t generation) +{ + uintptr_t tlbc_array_ptr; + void *tlbc_array = NULL; + TLBCCacheEntry *entry = NULL; + + // Read the TLBC array pointer + if (read_ptr(&self->handle, tlbc_array_addr, &tlbc_array_ptr) != 0 || tlbc_array_ptr == 0) { + return 0; // No TLBC array + } + + // Read the TLBC array size + Py_ssize_t tlbc_size; + if (_Py_RemoteDebug_PagedReadRemoteMemory(&self->handle, tlbc_array_ptr, sizeof(tlbc_size), &tlbc_size) != 0 || tlbc_size <= 0) { + return 0; // Invalid size + } + + // Allocate and read the entire TLBC array + size_t array_data_size = tlbc_size * sizeof(void*); + tlbc_array = PyMem_RawMalloc(sizeof(Py_ssize_t) + array_data_size); + if (!tlbc_array) { + return -1; // Memory error + } + + if (_Py_RemoteDebug_PagedReadRemoteMemory(&self->handle, tlbc_array_ptr, sizeof(Py_ssize_t) + array_data_size, tlbc_array) != 0) { + PyMem_RawFree(tlbc_array); + return 0; // Read error + } + + // Create cache entry + entry = PyMem_RawMalloc(sizeof(TLBCCacheEntry)); + if (!entry) { + PyMem_RawFree(tlbc_array); + return -1; // Memory error + } + + entry->tlbc_array = tlbc_array; + entry->tlbc_array_size = tlbc_size; + entry->generation = generation; + + // Store in cache + void *key = (void *)code_addr; + if (_Py_hashtable_set(self->tlbc_cache, key, entry) < 0) { + tlbc_cache_entry_destroy(entry); + return -1; // Cache error + } + + return 1; // Success +} + + + +#endif + +/* ============================================================================ + * LINE TABLE PARSING FUNCTIONS + * ============================================================================ */ static int scan_varint(const uint8_t **ptr) @@ -818,7 +1207,6 @@ scan_signed_varint(const uint8_t **ptr) } } - static bool parse_linetable(const uintptr_t addrq, const char* linetable, int firstlineno, LocationInfo* info) { @@ -863,7 +1251,9 @@ parse_linetable(const uintptr_t addrq, const char* linetable, int firstlineno, L } default: { uint8_t second_byte = *(ptr++); - assert((second_byte & 128) == 0); + if ((second_byte & 128) != 0) { + return false; + } info->column = code << 3 | (second_byte >> 4); info->end_column = info->column + (second_byte & 15); break; @@ -877,240 +1267,387 @@ parse_linetable(const uintptr_t addrq, const char* linetable, int firstlineno, L return false; } +/* ============================================================================ + * CODE OBJECT AND FRAME PARSING FUNCTIONS + * ============================================================================ */ + static int -read_remote_pointer(proc_handle_t *handle, uintptr_t address, uintptr_t *out_ptr, const char *error_message) +parse_code_object(RemoteUnwinderObject *unwinder, + PyObject **result, + uintptr_t address, + uintptr_t instruction_pointer, + uintptr_t *previous_frame, + int32_t tlbc_index) { - int bytes_read = _Py_RemoteDebug_ReadRemoteMemory(handle, address, sizeof(void *), out_ptr); - if (bytes_read < 0) { - return -1; + void *key = (void *)address; + CachedCodeMetadata *meta = NULL; + PyObject *func = NULL; + PyObject *file = NULL; + PyObject *linetable = NULL; + PyObject *lineno = NULL; + PyObject *tuple = NULL; + +#ifdef Py_GIL_DISABLED + // In free threading builds, code object addresses might have the low bit set + // as a flag, so we need to mask it off to get the real address + uintptr_t real_address = address & (~1); +#else + uintptr_t real_address = address; +#endif + + if (unwinder && unwinder->code_object_cache != NULL) { + meta = _Py_hashtable_get(unwinder->code_object_cache, key); } - if ((void *)(*out_ptr) == NULL) { - PyErr_SetString(PyExc_RuntimeError, error_message); - return -1; + if (meta == NULL) { + char code_object[SIZEOF_CODE_OBJ]; + if (_Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, real_address, SIZEOF_CODE_OBJ, code_object) < 0) + { + goto error; + } + + func = read_py_str(unwinder, + GET_MEMBER(uintptr_t, code_object, unwinder->debug_offsets.code_object.qualname), 1024); + if (!func) { + goto error; + } + + file = read_py_str(unwinder, + GET_MEMBER(uintptr_t, code_object, unwinder->debug_offsets.code_object.filename), 1024); + if (!file) { + goto error; + } + + linetable = read_py_bytes(unwinder, + GET_MEMBER(uintptr_t, code_object, unwinder->debug_offsets.code_object.linetable), 4096); + if (!linetable) { + goto error; + } + + meta = PyMem_RawMalloc(sizeof(CachedCodeMetadata)); + if (!meta) { + goto error; + } + + meta->func_name = func; + meta->file_name = file; + meta->linetable = linetable; + meta->first_lineno = GET_MEMBER(int, code_object, unwinder->debug_offsets.code_object.firstlineno); + meta->addr_code_adaptive = real_address + unwinder->debug_offsets.code_object.co_code_adaptive; + + if (unwinder && unwinder->code_object_cache && _Py_hashtable_set(unwinder->code_object_cache, key, meta) < 0) { + cached_code_metadata_destroy(meta); + goto error; + } + + // Ownership transferred to meta + func = NULL; + file = NULL; + linetable = NULL; + } + + uintptr_t ip = instruction_pointer; + ptrdiff_t addrq; + +#ifdef Py_GIL_DISABLED + // Handle thread-local bytecode (TLBC) in free threading builds + if (tlbc_index == 0 || unwinder->debug_offsets.code_object.co_tlbc == 0 || unwinder == NULL) { + // No TLBC or no unwinder - use main bytecode directly + addrq = (uint16_t *)ip - (uint16_t *)meta->addr_code_adaptive; + goto done_tlbc; + } + + // Try to get TLBC data from cache (we'll get generation from the caller) + TLBCCacheEntry *tlbc_entry = get_tlbc_cache_entry(unwinder, real_address, unwinder->tlbc_generation); + + if (!tlbc_entry) { + // Cache miss - try to read and cache TLBC array + if (cache_tlbc_array(unwinder, real_address, real_address + unwinder->debug_offsets.code_object.co_tlbc, unwinder->tlbc_generation) > 0) { + tlbc_entry = get_tlbc_cache_entry(unwinder, real_address, unwinder->tlbc_generation); + } + } + + if (tlbc_entry && tlbc_index < tlbc_entry->tlbc_array_size) { + // Use cached TLBC data + uintptr_t *entries = (uintptr_t *)((char *)tlbc_entry->tlbc_array + sizeof(Py_ssize_t)); + uintptr_t tlbc_bytecode_addr = entries[tlbc_index]; + + if (tlbc_bytecode_addr != 0) { + // Calculate offset from TLBC bytecode + addrq = (uint16_t *)ip - (uint16_t *)tlbc_bytecode_addr; + goto done_tlbc; + } + } + + // Fall back to main bytecode + addrq = (uint16_t *)ip - (uint16_t *)meta->addr_code_adaptive; + +done_tlbc: +#else + // Non-free-threaded build, always use the main bytecode + (void)tlbc_index; // Suppress unused parameter warning + (void)unwinder; // Suppress unused parameter warning + addrq = (uint16_t *)ip - (uint16_t *)meta->addr_code_adaptive; +#endif + ; // Empty statement to avoid C23 extension warning + LocationInfo info = {0}; + bool ok = parse_linetable(addrq, PyBytes_AS_STRING(meta->linetable), + meta->first_lineno, &info); + if (!ok) { + info.lineno = -1; + } + + lineno = PyLong_FromLong(info.lineno); + if (!lineno) { + goto error; + } + + tuple = PyTuple_New(3); + if (!tuple) { + goto error; } + Py_INCREF(meta->func_name); + Py_INCREF(meta->file_name); + PyTuple_SET_ITEM(tuple, 0, meta->func_name); + PyTuple_SET_ITEM(tuple, 1, meta->file_name); + PyTuple_SET_ITEM(tuple, 2, lineno); + + *result = tuple; return 0; + +error: + Py_XDECREF(func); + Py_XDECREF(file); + Py_XDECREF(linetable); + Py_XDECREF(lineno); + Py_XDECREF(tuple); + return -1; } -static int -read_instruction_ptr(proc_handle_t *handle, struct _Py_DebugOffsets *offsets, - uintptr_t current_frame, uintptr_t *instruction_ptr) +/* ============================================================================ + * STACK CHUNK MANAGEMENT FUNCTIONS + * ============================================================================ */ + +static void +cleanup_stack_chunks(StackChunkList *chunks) { - return read_remote_pointer( - handle, - current_frame + offsets->interpreter_frame.instr_ptr, - instruction_ptr, - "No instruction ptr found" - ); + for (size_t i = 0; i < chunks->count; ++i) { + PyMem_RawFree(chunks->chunks[i].local_copy); + } + PyMem_RawFree(chunks->chunks); } static int -parse_code_object(proc_handle_t *handle, - PyObject **result, - struct _Py_DebugOffsets *offsets, - uintptr_t address, - uintptr_t current_frame, - uintptr_t *previous_frame) -{ - uintptr_t addr_func_name, addr_file_name, addr_linetable, instruction_ptr; +process_single_stack_chunk( + proc_handle_t *handle, + uintptr_t chunk_addr, + StackChunkInfo *chunk_info +) { + // Start with default size assumption + size_t current_size = _PY_DATA_STACK_CHUNK_SIZE; - if (read_remote_pointer(handle, address + offsets->code_object.qualname, &addr_func_name, "No function name found") < 0 || - read_remote_pointer(handle, address + offsets->code_object.filename, &addr_file_name, "No file name found") < 0 || - read_remote_pointer(handle, address + offsets->code_object.linetable, &addr_linetable, "No linetable found") < 0 || - read_instruction_ptr(handle, offsets, current_frame, &instruction_ptr) < 0) { + char *this_chunk = PyMem_RawMalloc(current_size); + if (!this_chunk) { + PyErr_NoMemory(); return -1; } - int firstlineno; - if (_Py_RemoteDebug_ReadRemoteMemory(handle, - address + offsets->code_object.firstlineno, - sizeof(int), - &firstlineno) < 0) { + if (_Py_RemoteDebug_PagedReadRemoteMemory(handle, chunk_addr, current_size, this_chunk) < 0) { + PyMem_RawFree(this_chunk); return -1; } - PyObject *py_linetable = read_py_bytes(handle, offsets, addr_linetable); - if (!py_linetable) { - return -1; + // Check actual size and reread if necessary + size_t actual_size = GET_MEMBER(size_t, this_chunk, offsetof(_PyStackChunk, size)); + if (actual_size != current_size) { + this_chunk = PyMem_RawRealloc(this_chunk, actual_size); + if (!this_chunk) { + PyErr_NoMemory(); + return -1; + } + + if (_Py_RemoteDebug_PagedReadRemoteMemory(handle, chunk_addr, actual_size, this_chunk) < 0) { + PyMem_RawFree(this_chunk); + return -1; + } + current_size = actual_size; } - uintptr_t addr_code_adaptive = address + offsets->code_object.co_code_adaptive; - ptrdiff_t addrq = (uint16_t *)instruction_ptr - (uint16_t *)addr_code_adaptive; + chunk_info->remote_addr = chunk_addr; + chunk_info->size = current_size; + chunk_info->local_copy = this_chunk; + return 0; +} - LocationInfo info; - parse_linetable(addrq, PyBytes_AS_STRING(py_linetable), firstlineno, &info); - Py_DECREF(py_linetable); // Done with linetable +static int +copy_stack_chunks(RemoteUnwinderObject *unwinder, + uintptr_t tstate_addr, + StackChunkList *out_chunks) +{ + uintptr_t chunk_addr; + StackChunkInfo *chunks = NULL; + size_t count = 0; + size_t max_chunks = 16; - PyObject *py_line = PyLong_FromLong(info.lineno); - if (!py_line) { + if (read_ptr(&unwinder->handle, tstate_addr + unwinder->debug_offsets.thread_state.datastack_chunk, &chunk_addr)) { return -1; } - PyObject *py_func_name = read_py_str(handle, offsets, addr_func_name, 256); - if (!py_func_name) { - Py_DECREF(py_line); + chunks = PyMem_RawMalloc(max_chunks * sizeof(StackChunkInfo)); + if (!chunks) { + PyErr_NoMemory(); return -1; } - PyObject *py_file_name = read_py_str(handle, offsets, addr_file_name, 256); - if (!py_file_name) { - Py_DECREF(py_line); - Py_DECREF(py_func_name); - return -1; + while (chunk_addr != 0) { + // Grow array if needed + if (count >= max_chunks) { + max_chunks *= 2; + StackChunkInfo *new_chunks = PyMem_RawRealloc(chunks, max_chunks * sizeof(StackChunkInfo)); + if (!new_chunks) { + PyErr_NoMemory(); + goto error; + } + chunks = new_chunks; + } + + // Process this chunk + if (process_single_stack_chunk(&unwinder->handle, chunk_addr, &chunks[count]) < 0) { + goto error; + } + + // Get next chunk address and increment count + chunk_addr = GET_MEMBER(uintptr_t, chunks[count].local_copy, offsetof(_PyStackChunk, previous)); + count++; } - PyObject *result_tuple = PyTuple_New(3); - if (!result_tuple) { - Py_DECREF(py_line); - Py_DECREF(py_func_name); - Py_DECREF(py_file_name); - return -1; + out_chunks->chunks = chunks; + out_chunks->count = count; + return 0; + +error: + for (size_t i = 0; i < count; ++i) { + PyMem_RawFree(chunks[i].local_copy); } + PyMem_RawFree(chunks); + return -1; +} - PyTuple_SET_ITEM(result_tuple, 0, py_func_name); // steals ref - PyTuple_SET_ITEM(result_tuple, 1, py_file_name); // steals ref - PyTuple_SET_ITEM(result_tuple, 2, py_line); // steals ref +static void * +find_frame_in_chunks(StackChunkList *chunks, uintptr_t remote_ptr) +{ + for (size_t i = 0; i < chunks->count; ++i) { + uintptr_t base = chunks->chunks[i].remote_addr + offsetof(_PyStackChunk, data); + size_t payload = chunks->chunks[i].size - offsetof(_PyStackChunk, data); - *result = result_tuple; - return 0; + if (remote_ptr >= base && remote_ptr < base + payload) { + return (char *)chunks->chunks[i].local_copy + (remote_ptr - chunks->chunks[i].remote_addr); + } + } + return NULL; } static int -parse_frame_object( - proc_handle_t *handle, - PyObject** result, - struct _Py_DebugOffsets* offsets, +parse_frame_from_chunks( + RemoteUnwinderObject *unwinder, + PyObject **result, uintptr_t address, - uintptr_t* previous_frame + uintptr_t *previous_frame, + StackChunkList *chunks ) { - int err; - - Py_ssize_t bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, - address + offsets->interpreter_frame.previous, - sizeof(void*), - previous_frame - ); - if (bytes_read < 0) { + void *frame_ptr = find_frame_in_chunks(chunks, address); + if (!frame_ptr) { return -1; } - char owner; - if (read_char(handle, address + offsets->interpreter_frame.owner, &owner)) { - return -1; - } + char *frame = (char *)frame_ptr; + *previous_frame = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.previous); - if (owner >= FRAME_OWNED_BY_INTERPRETER) { + if (GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner) >= FRAME_OWNED_BY_INTERPRETER || + !GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.executable)) { return 0; } - uintptr_t address_of_code_object; - err = read_py_ptr( - handle, - address + offsets->interpreter_frame.executable, - &address_of_code_object - ); - if (err) { - return -1; - } + uintptr_t instruction_pointer = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.instr_ptr); - if ((void*)address_of_code_object == NULL) { - return 0; + // Get tlbc_index for free threading builds + int32_t tlbc_index = 0; +#ifdef Py_GIL_DISABLED + if (unwinder->debug_offsets.interpreter_frame.tlbc_index != 0) { + tlbc_index = GET_MEMBER(int32_t, frame, unwinder->debug_offsets.interpreter_frame.tlbc_index); } +#endif return parse_code_object( - handle, result, offsets, address_of_code_object, address, previous_frame); + unwinder, result, GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.executable), + instruction_pointer, previous_frame, tlbc_index); } +/* ============================================================================ + * INTERPRETER STATE AND THREAD DISCOVERY FUNCTIONS + * ============================================================================ */ + static int -parse_async_frame_object( - proc_handle_t *handle, - PyObject** result, - struct _Py_DebugOffsets* offsets, - uintptr_t address, - uintptr_t* previous_frame, - uintptr_t* code_object +populate_initial_state_data( + int all_threads, + RemoteUnwinderObject *unwinder, + uintptr_t runtime_start_address, + uintptr_t *interpreter_state, + uintptr_t *tstate ) { - int err; - - Py_ssize_t bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, - address + offsets->interpreter_frame.previous, - sizeof(void*), - previous_frame - ); - if (bytes_read < 0) { - return -1; - } + uint64_t interpreter_state_list_head = + unwinder->debug_offsets.runtime_state.interpreters_head; - char owner; - bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, address + offsets->interpreter_frame.owner, sizeof(char), &owner); + uintptr_t address_of_interpreter_state; + int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + runtime_start_address + interpreter_state_list_head, + sizeof(void*), + &address_of_interpreter_state); if (bytes_read < 0) { return -1; } - if (owner == FRAME_OWNED_BY_CSTACK || owner == FRAME_OWNED_BY_INTERPRETER) { - return 0; // C frame - } - - if (owner != FRAME_OWNED_BY_GENERATOR - && owner != FRAME_OWNED_BY_THREAD) { - PyErr_Format(PyExc_RuntimeError, "Unhandled frame owner %d.\n", owner); + if (address_of_interpreter_state == 0) { + PyErr_SetString(PyExc_RuntimeError, "No interpreter state found"); return -1; } - err = read_py_ptr( - handle, - address + offsets->interpreter_frame.executable, - code_object - ); - if (err) { - return -1; - } + *interpreter_state = address_of_interpreter_state; - assert(code_object != NULL); - if ((void*)*code_object == NULL) { + if (all_threads) { + *tstate = 0; return 0; } - if (parse_code_object( - handle, result, offsets, *code_object, address, previous_frame)) { - return -1; - } - - return 1; -} + uintptr_t address_of_thread = address_of_interpreter_state + + unwinder->debug_offsets.interpreter_state.threads_main; -static int -read_async_debug( - proc_handle_t *handle, - struct _Py_AsyncioModuleDebugOffsets* async_debug -) { - uintptr_t async_debug_addr = _Py_RemoteDebug_GetAsyncioDebugAddress(handle); - if (!async_debug_addr) { + if (_Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address_of_thread, + sizeof(void*), + tstate) < 0) { return -1; } - size_t size = sizeof(struct _Py_AsyncioModuleDebugOffsets); - int result = _Py_RemoteDebug_ReadRemoteMemory(handle, async_debug_addr, size, async_debug); - return result; + return 0; } static int find_running_frame( - proc_handle_t *handle, + RemoteUnwinderObject *unwinder, uintptr_t runtime_start_address, - _Py_DebugOffsets* local_debug_offsets, uintptr_t *frame ) { uint64_t interpreter_state_list_head = - local_debug_offsets->runtime_state.interpreters_head; + unwinder->debug_offsets.runtime_state.interpreters_head; uintptr_t address_of_interpreter_state; - int bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, + int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, runtime_start_address + interpreter_state_list_head, sizeof(void*), &address_of_interpreter_state); @@ -1124,10 +1661,10 @@ find_running_frame( } uintptr_t address_of_thread; - bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, + bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, address_of_interpreter_state + - local_debug_offsets->interpreter_state.threads_main, + unwinder->debug_offsets.interpreter_state.threads_main, sizeof(void*), &address_of_thread); if (bytes_read < 0) { @@ -1137,8 +1674,8 @@ find_running_frame( // No Python frames are available for us (can happen at tear-down). if ((void*)address_of_thread != NULL) { int err = read_ptr( - handle, - address_of_thread + local_debug_offsets->thread_state.current_frame, + &unwinder->handle, + address_of_thread + unwinder->debug_offsets.thread_state.current_frame, frame); if (err) { return -1; @@ -1152,21 +1689,18 @@ find_running_frame( static int find_running_task( - proc_handle_t *handle, - uintptr_t runtime_start_address, - _Py_DebugOffsets *local_debug_offsets, - struct _Py_AsyncioModuleDebugOffsets *async_offsets, + RemoteUnwinderObject *unwinder, uintptr_t *running_task_addr ) { *running_task_addr = (uintptr_t)NULL; uint64_t interpreter_state_list_head = - local_debug_offsets->runtime_state.interpreters_head; + unwinder->debug_offsets.runtime_state.interpreters_head; uintptr_t address_of_interpreter_state; - int bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, - runtime_start_address + interpreter_state_list_head, + int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + unwinder->runtime_start_address + interpreter_state_list_head, sizeof(void*), &address_of_interpreter_state); if (bytes_read < 0) { @@ -1179,10 +1713,10 @@ find_running_task( } uintptr_t address_of_thread; - bytes_read = _Py_RemoteDebug_ReadRemoteMemory( - handle, + bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, address_of_interpreter_state + - local_debug_offsets->interpreter_state.threads_head, + unwinder->debug_offsets.interpreter_state.threads_head, sizeof(void*), &address_of_thread); if (bytes_read < 0) { @@ -1196,9 +1730,9 @@ find_running_task( } bytes_read = read_py_ptr( - handle, + &unwinder->handle, address_of_thread - + async_offsets->asyncio_thread_state.asyncio_running_loop, + + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_loop, &address_of_running_loop); if (bytes_read == -1) { return -1; @@ -1210,9 +1744,9 @@ find_running_task( } int err = read_ptr( - handle, + &unwinder->handle, address_of_thread - + async_offsets->asyncio_thread_state.asyncio_running_task, + + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_task, running_task_addr); if (err) { return -1; @@ -1222,579 +1756,936 @@ find_running_task( } static int -append_awaited_by_for_thread( - proc_handle_t *handle, - uintptr_t head_addr, - struct _Py_DebugOffsets *debug_offsets, - struct _Py_AsyncioModuleDebugOffsets *async_offsets, - PyObject *result +find_running_task_and_coro( + RemoteUnwinderObject *self, + uintptr_t *running_task_addr, + uintptr_t *running_coro_addr, + uintptr_t *running_task_code_obj ) { - struct llist_node task_node; - - if (0 > _Py_RemoteDebug_ReadRemoteMemory( - handle, - head_addr, - sizeof(task_node), - &task_node)) - { + *running_task_addr = (uintptr_t)NULL; + if (find_running_task( + self, running_task_addr) < 0) { + chain_exceptions(PyExc_RuntimeError, "Failed to find running task"); return -1; } - size_t iteration_count = 0; - const size_t MAX_ITERATIONS = 2 << 15; // A reasonable upper bound - while ((uintptr_t)task_node.next != head_addr) { - if (++iteration_count > MAX_ITERATIONS) { - PyErr_SetString(PyExc_RuntimeError, "Task list appears corrupted"); - return -1; - } - - if (task_node.next == NULL) { - PyErr_SetString( - PyExc_RuntimeError, - "Invalid linked list structure reading remote memory"); - return -1; - } - - uintptr_t task_addr = (uintptr_t)task_node.next - - async_offsets->asyncio_task_object.task_node; - - PyObject *tn = parse_task_name( - handle, - debug_offsets, - async_offsets, - task_addr); - if (tn == NULL) { - return -1; - } - - PyObject *current_awaited_by = PyList_New(0); - if (current_awaited_by == NULL) { - Py_DECREF(tn); - return -1; - } - - PyObject* task_id = PyLong_FromUnsignedLongLong(task_addr); - if (task_id == NULL) { - Py_DECREF(tn); - Py_DECREF(current_awaited_by); - return -1; - } - - PyObject *result_item = PyTuple_New(3); - if (result_item == NULL) { - Py_DECREF(tn); - Py_DECREF(current_awaited_by); - Py_DECREF(task_id); - return -1; - } - - PyTuple_SET_ITEM(result_item, 0, task_id); // steals ref - PyTuple_SET_ITEM(result_item, 1, tn); // steals ref - PyTuple_SET_ITEM(result_item, 2, current_awaited_by); // steals ref - if (PyList_Append(result, result_item)) { - Py_DECREF(result_item); - return -1; - } - Py_DECREF(result_item); - - if (parse_task_awaited_by(handle, debug_offsets, async_offsets, - task_addr, current_awaited_by, 0)) - { - return -1; - } - - // onto the next one... - if (0 > _Py_RemoteDebug_ReadRemoteMemory( - handle, - (uintptr_t)task_node.next, - sizeof(task_node), - &task_node)) - { - return -1; - } - } - - return 0; -} - -static int -append_awaited_by( - proc_handle_t *handle, - unsigned long tid, - uintptr_t head_addr, - struct _Py_DebugOffsets *debug_offsets, - struct _Py_AsyncioModuleDebugOffsets *async_offsets, - PyObject *result) -{ - PyObject *tid_py = PyLong_FromUnsignedLong(tid); - if (tid_py == NULL) { + if ((void*)*running_task_addr == NULL) { + PyErr_SetString(PyExc_RuntimeError, "No running task found"); return -1; } - PyObject *result_item = PyTuple_New(2); - if (result_item == NULL) { - Py_DECREF(tid_py); + if (read_py_ptr( + &self->handle, + *running_task_addr + self->async_debug_offsets.asyncio_task_object.task_coro, + running_coro_addr) < 0) { + chain_exceptions(PyExc_RuntimeError, "Failed to read running task coro"); return -1; } - PyObject* awaited_by_for_thread = PyList_New(0); - if (awaited_by_for_thread == NULL) { - Py_DECREF(tid_py); - Py_DECREF(result_item); + if ((void*)*running_coro_addr == NULL) { + PyErr_SetString(PyExc_RuntimeError, "Running task coro is NULL"); return -1; } - PyTuple_SET_ITEM(result_item, 0, tid_py); // steals ref - PyTuple_SET_ITEM(result_item, 1, awaited_by_for_thread); // steals ref - if (PyList_Append(result, result_item)) { - Py_DECREF(result_item); + // note: genobject's gi_iframe is an embedded struct so the address to + // the offset leads directly to its first field: f_executable + if (read_py_ptr( + &self->handle, + *running_coro_addr + self->debug_offsets.gen_object.gi_iframe, + running_task_code_obj) < 0) { return -1; } - Py_DECREF(result_item); - if (append_awaited_by_for_thread( - handle, - head_addr, - debug_offsets, - async_offsets, - awaited_by_for_thread)) - { + if ((void*)*running_task_code_obj == NULL) { + PyErr_SetString(PyExc_RuntimeError, "Running task code object is NULL"); return -1; } return 0; } -static PyObject* -get_all_awaited_by(PyObject* self, PyObject* args) -{ -#if (!defined(__linux__) && !defined(__APPLE__)) && !defined(MS_WINDOWS) || \ - (defined(__linux__) && !HAVE_PROCESS_VM_READV) - PyErr_SetString( - PyExc_RuntimeError, - "get_all_awaited_by is not implemented on this platform"); - return NULL; -#endif - int pid; - if (!PyArg_ParseTuple(args, "i", &pid)) { - return NULL; +/* ============================================================================ + * FRAME PARSING FUNCTIONS + * ============================================================================ */ + +static int +parse_frame_object( + RemoteUnwinderObject *unwinder, + PyObject** result, + uintptr_t address, + uintptr_t* previous_frame +) { + char frame[SIZEOF_INTERP_FRAME]; + + Py_ssize_t bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address, + SIZEOF_INTERP_FRAME, + frame + ); + if (bytes_read < 0) { + return -1; } - proc_handle_t the_handle; - proc_handle_t *handle = &the_handle; - if (_Py_RemoteDebug_InitProcHandle(handle, pid) < 0) { + *previous_frame = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.previous); + + if (GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner) >= FRAME_OWNED_BY_INTERPRETER) { return 0; } - PyObject *result = NULL; - - uintptr_t runtime_start_addr = _Py_RemoteDebug_GetPyRuntimeAddress(handle); - if (runtime_start_addr == 0) { - if (!PyErr_Occurred()) { - PyErr_SetString( - PyExc_RuntimeError, "Failed to get .PyRuntime address"); - } - goto result_err; + if ((void*)GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.executable) == NULL) { + return 0; } - struct _Py_DebugOffsets local_debug_offsets; - if (_Py_RemoteDebug_ReadDebugOffsets(handle, &runtime_start_addr, &local_debug_offsets)) { - chain_exceptions(PyExc_RuntimeError, "Failed to read debug offsets"); - goto result_err; + uintptr_t instruction_pointer = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.instr_ptr); + + // Get tlbc_index for free threading builds + int32_t tlbc_index = 0; +#ifdef Py_GIL_DISABLED + if (unwinder->debug_offsets.interpreter_frame.tlbc_index != 0) { + tlbc_index = GET_MEMBER(int32_t, frame, unwinder->debug_offsets.interpreter_frame.tlbc_index); } +#endif - struct _Py_AsyncioModuleDebugOffsets local_async_debug; - if (read_async_debug(handle, &local_async_debug)) { - chain_exceptions(PyExc_RuntimeError, "Failed to read asyncio debug offsets"); - goto result_err; + return parse_code_object( + unwinder, result, GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.executable), + instruction_pointer, previous_frame, tlbc_index); +} + +static int +parse_async_frame_object( + RemoteUnwinderObject *unwinder, + PyObject** result, + uintptr_t address, + uintptr_t* previous_frame, + uintptr_t* code_object +) { + char frame[SIZEOF_INTERP_FRAME]; + + Py_ssize_t bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + address, + SIZEOF_INTERP_FRAME, + frame + ); + if (bytes_read < 0) { + return -1; } - result = PyList_New(0); - if (result == NULL) { - goto result_err; + *previous_frame = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.previous); + + if (GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner) == FRAME_OWNED_BY_CSTACK || + GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner) == FRAME_OWNED_BY_INTERPRETER) { + return 0; // C frame } - uint64_t interpreter_state_list_head = - local_debug_offsets.runtime_state.interpreters_head; + if (GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner) != FRAME_OWNED_BY_GENERATOR + && GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner) != FRAME_OWNED_BY_THREAD) { + PyErr_Format(PyExc_RuntimeError, "Unhandled frame owner %d.\n", + GET_MEMBER(char, frame, unwinder->debug_offsets.interpreter_frame.owner)); + return -1; + } - uintptr_t interpreter_state_addr; - if (0 > _Py_RemoteDebug_ReadRemoteMemory( - handle, - runtime_start_addr + interpreter_state_list_head, - sizeof(void*), - &interpreter_state_addr)) - { - goto result_err; + *code_object = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.executable); + // Strip tag bits for consistent comparison + *code_object &= ~Py_TAG_BITS; + + assert(code_object != NULL); + if ((void*)*code_object == NULL) { + return 0; } - uintptr_t thread_state_addr; - unsigned long tid = 0; - if (0 > _Py_RemoteDebug_ReadRemoteMemory( - handle, - interpreter_state_addr - + local_debug_offsets.interpreter_state.threads_head, - sizeof(void*), - &thread_state_addr)) - { - goto result_err; + uintptr_t instruction_pointer = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.instr_ptr); + + // Get tlbc_index for free threading builds + int32_t tlbc_index = 0; +#ifdef Py_GIL_DISABLED + if (unwinder->debug_offsets.interpreter_frame.tlbc_index != 0) { + tlbc_index = GET_MEMBER(int32_t, frame, unwinder->debug_offsets.interpreter_frame.tlbc_index); } +#endif - uintptr_t head_addr; - while (thread_state_addr != 0) { - if (0 > _Py_RemoteDebug_ReadRemoteMemory( - handle, - thread_state_addr - + local_debug_offsets.thread_state.native_thread_id, - sizeof(tid), - &tid)) - { - goto result_err; + if (parse_code_object( + unwinder, result, *code_object, instruction_pointer, previous_frame, tlbc_index)) { + return -1; + } + + return 1; +} + +static int +parse_async_frame_chain( + RemoteUnwinderObject *self, + PyObject *calls, + uintptr_t running_task_code_obj +) { + uintptr_t address_of_current_frame; + if (find_running_frame(self, self->runtime_start_address, &address_of_current_frame) < 0) { + chain_exceptions(PyExc_RuntimeError, "Failed to find running frame"); + return -1; + } + + uintptr_t address_of_code_object; + while ((void*)address_of_current_frame != NULL) { + PyObject* frame_info = NULL; + int res = parse_async_frame_object( + self, + &frame_info, + address_of_current_frame, + &address_of_current_frame, + &address_of_code_object + ); + + if (res < 0) { + chain_exceptions(PyExc_RuntimeError, "Failed to parse async frame object"); + return -1; } - head_addr = thread_state_addr - + local_async_debug.asyncio_thread_state.asyncio_tasks_head; + if (!frame_info) { + continue; + } - if (append_awaited_by(handle, tid, head_addr, &local_debug_offsets, - &local_async_debug, result)) - { - goto result_err; + if (PyList_Append(calls, frame_info) == -1) { + Py_DECREF(frame_info); + return -1; } - if (0 > _Py_RemoteDebug_ReadRemoteMemory( - handle, - thread_state_addr + local_debug_offsets.thread_state.next, - sizeof(void*), - &thread_state_addr)) - { - goto result_err; + Py_DECREF(frame_info); + + if (address_of_code_object == running_task_code_obj) { + break; } } - head_addr = interpreter_state_addr - + local_async_debug.asyncio_interpreter_state.asyncio_tasks_head; + return 0; +} - // On top of a per-thread task lists used by default by asyncio to avoid - // contention, there is also a fallback per-interpreter list of tasks; - // any tasks still pending when a thread is destroyed will be moved to the - // per-interpreter task list. It's unlikely we'll find anything here, but - // interesting for debugging. - if (append_awaited_by(handle, 0, head_addr, &local_debug_offsets, - &local_async_debug, result)) - { - goto result_err; +/* ============================================================================ + * AWAITED BY PARSING FUNCTIONS + * ============================================================================ */ + +static int +append_awaited_by_for_thread( + RemoteUnwinderObject *unwinder, + uintptr_t head_addr, + PyObject *result +) { + char task_node[SIZEOF_LLIST_NODE]; + + if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, head_addr, + sizeof(task_node), task_node) < 0) { + return -1; } - _Py_RemoteDebug_CleanupProcHandle(handle); - return result; + size_t iteration_count = 0; + const size_t MAX_ITERATIONS = 2 << 15; // A reasonable upper bound -result_err: - Py_XDECREF(result); - _Py_RemoteDebug_CleanupProcHandle(handle); - return NULL; -} + while (GET_MEMBER(uintptr_t, task_node, unwinder->debug_offsets.llist_node.next) != head_addr) { + if (++iteration_count > MAX_ITERATIONS) { + PyErr_SetString(PyExc_RuntimeError, "Task list appears corrupted"); + return -1; + } -static PyObject* -get_stack_trace(PyObject* self, PyObject* args) -{ -#if (!defined(__linux__) && !defined(__APPLE__)) && !defined(MS_WINDOWS) || \ - (defined(__linux__) && !HAVE_PROCESS_VM_READV) - PyErr_SetString( - PyExc_RuntimeError, - "get_stack_trace is not supported on this platform"); - return NULL; -#endif + if (GET_MEMBER(uintptr_t, task_node, unwinder->debug_offsets.llist_node.next) == 0) { + PyErr_SetString(PyExc_RuntimeError, + "Invalid linked list structure reading remote memory"); + return -1; + } - int pid; - if (!PyArg_ParseTuple(args, "i", &pid)) { - return NULL; - } + uintptr_t task_addr = (uintptr_t)GET_MEMBER(uintptr_t, task_node, unwinder->debug_offsets.llist_node.next) + - unwinder->async_debug_offsets.asyncio_task_object.task_node; - proc_handle_t the_handle; - proc_handle_t *handle = &the_handle; - if (_Py_RemoteDebug_InitProcHandle(handle, pid) < 0) { - return 0; + if (process_single_task_node(unwinder, task_addr, result) < 0) { + return -1; + } + + // Read next node + if (_Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + (uintptr_t)GET_MEMBER(uintptr_t, task_node, unwinder->debug_offsets.llist_node.next), + sizeof(task_node), + task_node) < 0) { + return -1; + } } - PyObject* result = NULL; + return 0; +} - uintptr_t runtime_start_address = _Py_RemoteDebug_GetPyRuntimeAddress(handle); - if (runtime_start_address == 0) { - if (!PyErr_Occurred()) { - PyErr_SetString( - PyExc_RuntimeError, "Failed to get .PyRuntime address"); - } - goto result_err; +static int +append_awaited_by( + RemoteUnwinderObject *unwinder, + unsigned long tid, + uintptr_t head_addr, + PyObject *result) +{ + PyObject *tid_py = PyLong_FromUnsignedLong(tid); + if (tid_py == NULL) { + return -1; } - struct _Py_DebugOffsets local_debug_offsets; - if (_Py_RemoteDebug_ReadDebugOffsets(handle, &runtime_start_address, &local_debug_offsets)) { - chain_exceptions(PyExc_RuntimeError, "Failed to read debug offsets"); - goto result_err; + PyObject *result_item = PyTuple_New(2); + if (result_item == NULL) { + Py_DECREF(tid_py); + return -1; } - uintptr_t address_of_current_frame; - if (find_running_frame( - handle, runtime_start_address, &local_debug_offsets, - &address_of_current_frame) - ) { - goto result_err; + PyObject* awaited_by_for_thread = PyList_New(0); + if (awaited_by_for_thread == NULL) { + Py_DECREF(tid_py); + Py_DECREF(result_item); + return -1; } - result = PyList_New(0); - if (result == NULL) { - goto result_err; + PyTuple_SET_ITEM(result_item, 0, tid_py); // steals ref + PyTuple_SET_ITEM(result_item, 1, awaited_by_for_thread); // steals ref + if (PyList_Append(result, result_item)) { + Py_DECREF(result_item); + return -1; } + Py_DECREF(result_item); - while ((void*)address_of_current_frame != NULL) { - PyObject* frame_info = NULL; - if (parse_frame_object( - handle, - &frame_info, - &local_debug_offsets, - address_of_current_frame, - &address_of_current_frame) - < 0) - { - Py_CLEAR(result); - goto result_err; + if (append_awaited_by_for_thread(unwinder, head_addr, awaited_by_for_thread)) + { + return -1; + } + + return 0; +} + +/* ============================================================================ + * STACK UNWINDING FUNCTIONS + * ============================================================================ */ + +static int +process_frame_chain( + RemoteUnwinderObject *unwinder, + uintptr_t initial_frame_addr, + StackChunkList *chunks, + PyObject *frame_info +) { + uintptr_t frame_addr = initial_frame_addr; + uintptr_t prev_frame_addr = 0; + const size_t MAX_FRAMES = 1024; + size_t frame_count = 0; + + while ((void*)frame_addr != NULL) { + PyObject *frame = NULL; + uintptr_t next_frame_addr = 0; + + if (++frame_count > MAX_FRAMES) { + PyErr_SetString(PyExc_RuntimeError, "Too many stack frames (possible infinite loop)"); + return -1; } - if (!frame_info) { - continue; + // Try chunks first, fallback to direct memory read + if (parse_frame_from_chunks(unwinder, &frame, frame_addr, &next_frame_addr, chunks) < 0) { + PyErr_Clear(); + if (parse_frame_object(unwinder, &frame, frame_addr, &next_frame_addr) < 0) { + return -1; + } } - if (PyList_Append(result, frame_info) == -1) { - Py_CLEAR(result); - goto result_err; + if (!frame) { + break; } - Py_DECREF(frame_info); - frame_info = NULL; + if (prev_frame_addr && frame_addr != prev_frame_addr) { + PyErr_Format(PyExc_RuntimeError, + "Broken frame chain: expected frame at 0x%lx, got 0x%lx", + prev_frame_addr, frame_addr); + Py_DECREF(frame); + return -1; + } + if (PyList_Append(frame_info, frame) == -1) { + Py_DECREF(frame); + return -1; + } + Py_DECREF(frame); + + prev_frame_addr = next_frame_addr; + frame_addr = next_frame_addr; } -result_err: - _Py_RemoteDebug_CleanupProcHandle(handle); - return result; + return 0; } static PyObject* -get_async_stack_trace(PyObject* self, PyObject* args) -{ -#if (!defined(__linux__) && !defined(__APPLE__)) && !defined(MS_WINDOWS) || \ - (defined(__linux__) && !HAVE_PROCESS_VM_READV) - PyErr_SetString( - PyExc_RuntimeError, - "get_stack_trace is not supported on this platform"); - return NULL; -#endif - int pid; +unwind_stack_for_thread( + RemoteUnwinderObject *unwinder, + uintptr_t *current_tstate +) { + PyObject *frame_info = NULL; + PyObject *thread_id = NULL; + PyObject *result = NULL; + StackChunkList chunks = {0}; - if (!PyArg_ParseTuple(args, "i", &pid)) { - return NULL; + char ts[SIZEOF_THREAD_STATE]; + int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, *current_tstate, unwinder->debug_offsets.thread_state.size, ts); + if (bytes_read < 0) { + goto error; } - proc_handle_t the_handle; - proc_handle_t *handle = &the_handle; - if (_Py_RemoteDebug_InitProcHandle(handle, pid) < 0) { - return 0; - } + uintptr_t frame_addr = GET_MEMBER(uintptr_t, ts, unwinder->debug_offsets.thread_state.current_frame); - PyObject *result = NULL; + frame_info = PyList_New(0); + if (!frame_info) { + goto error; + } - uintptr_t runtime_start_address = _Py_RemoteDebug_GetPyRuntimeAddress(handle); - if (runtime_start_address == 0) { - if (!PyErr_Occurred()) { - PyErr_SetString( - PyExc_RuntimeError, "Failed to get .PyRuntime address"); - } - goto result_err; + if (copy_stack_chunks(unwinder, *current_tstate, &chunks) < 0) { + goto error; } - struct _Py_DebugOffsets local_debug_offsets; - if (_Py_RemoteDebug_ReadDebugOffsets(handle, &runtime_start_address, &local_debug_offsets)) { - chain_exceptions(PyExc_RuntimeError, "Failed to read debug offsets"); - goto result_err; + if (process_frame_chain(unwinder, frame_addr, &chunks, frame_info) < 0) { + goto error; } - struct _Py_AsyncioModuleDebugOffsets local_async_debug; - if (read_async_debug(handle, &local_async_debug)) { - chain_exceptions(PyExc_RuntimeError, "Failed to read asyncio debug offsets"); - goto result_err; + *current_tstate = GET_MEMBER(uintptr_t, ts, unwinder->debug_offsets.thread_state.next); + + thread_id = PyLong_FromLongLong( + GET_MEMBER(long, ts, unwinder->debug_offsets.thread_state.native_thread_id)); + if (thread_id == NULL) { + goto error; } - result = PyList_New(1); + result = PyTuple_New(2); if (result == NULL) { - goto result_err; + goto error; } - PyObject* calls = PyList_New(0); - if (calls == NULL) { - goto result_err; + + PyTuple_SET_ITEM(result, 0, thread_id); // Steals reference + PyTuple_SET_ITEM(result, 1, frame_info); // Steals reference + + cleanup_stack_chunks(&chunks); + return result; + +error: + Py_XDECREF(frame_info); + Py_XDECREF(thread_id); + Py_XDECREF(result); + cleanup_stack_chunks(&chunks); + return NULL; +} + + +/* ============================================================================ + * REMOTEUNWINDER CLASS IMPLEMENTATION + * ============================================================================ */ + +/*[clinic input] +class _remote_debugging.RemoteUnwinder "RemoteUnwinderObject *" "&RemoteUnwinder_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=55f164d8803318be]*/ + +/*[clinic input] +_remote_debugging.RemoteUnwinder.__init__ + pid: int + * + all_threads: bool = False + +Initialize a new RemoteUnwinder object for debugging a remote Python process. + +Args: + pid: Process ID of the target Python process to debug + all_threads: If True, initialize state for all threads in the process. + If False, only initialize for the main thread. + +The RemoteUnwinder provides functionality to inspect and debug a running Python +process, including examining thread states, stack frames and other runtime data. + +Raises: + PermissionError: If access to the target process is denied + OSError: If unable to attach to the target process or access its memory + RuntimeError: If unable to read debug information from the target process +[clinic start generated code]*/ + +static int +_remote_debugging_RemoteUnwinder___init___impl(RemoteUnwinderObject *self, + int pid, int all_threads) +/*[clinic end generated code: output=b8027cb247092081 input=6a2056b04e6f050e]*/ +{ + if (_Py_RemoteDebug_InitProcHandle(&self->handle, pid) < 0) { + return -1; } - if (PyList_SetItem(result, 0, calls)) { /* steals ref to 'calls' */ - Py_DECREF(calls); - goto result_err; + + self->runtime_start_address = _Py_RemoteDebug_GetPyRuntimeAddress(&self->handle); + if (self->runtime_start_address == 0) { + return -1; } - uintptr_t running_task_addr = (uintptr_t)NULL; - if (find_running_task( - handle, runtime_start_address, &local_debug_offsets, &local_async_debug, - &running_task_addr) - ) { - chain_exceptions(PyExc_RuntimeError, "Failed to find running task"); - goto result_err; + if (_Py_RemoteDebug_ReadDebugOffsets(&self->handle, + &self->runtime_start_address, + &self->debug_offsets) < 0) + { + return -1; } - if ((void*)running_task_addr == NULL) { - PyErr_SetString(PyExc_RuntimeError, "No running task found"); - goto result_err; + // Try to read async debug offsets, but don't fail if they're not available + self->async_debug_offsets_available = 1; + if (read_async_debug(self) < 0) { + PyErr_Clear(); + memset(&self->async_debug_offsets, 0, sizeof(self->async_debug_offsets)); + self->async_debug_offsets_available = 0; } - uintptr_t running_coro_addr; - if (read_py_ptr( - handle, - running_task_addr + local_async_debug.asyncio_task_object.task_coro, - &running_coro_addr - )) { - chain_exceptions(PyExc_RuntimeError, "Failed to read running task coro"); - goto result_err; + if (populate_initial_state_data(all_threads, self, self->runtime_start_address, + &self->interpreter_addr ,&self->tstate_addr) < 0) + { + return -1; } - if ((void*)running_coro_addr == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Running task coro is NULL"); - goto result_err; + self->code_object_cache = _Py_hashtable_new_full( + _Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + NULL, // keys are stable pointers, don't destroy + cached_code_metadata_destroy, + NULL + ); + if (self->code_object_cache == NULL) { + PyErr_NoMemory(); + return -1; } - // note: genobject's gi_iframe is an embedded struct so the address to - // the offset leads directly to its first field: f_executable - uintptr_t address_of_running_task_code_obj; - if (read_py_ptr( - handle, - running_coro_addr + local_debug_offsets.gen_object.gi_iframe, - &address_of_running_task_code_obj - )) { - goto result_err; +#ifdef Py_GIL_DISABLED + // Initialize TLBC cache + self->tlbc_generation = 0; + self->tlbc_cache = _Py_hashtable_new_full( + _Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + NULL, // keys are stable pointers, don't destroy + tlbc_cache_entry_destroy, + NULL + ); + if (self->tlbc_cache == NULL) { + _Py_hashtable_destroy(self->code_object_cache); + PyErr_NoMemory(); + return -1; } +#endif - if ((void*)address_of_running_task_code_obj == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Running task code object is NULL"); - goto result_err; + return 0; +} + +/*[clinic input] +@critical_section +_remote_debugging.RemoteUnwinder.get_stack_trace + +Returns a list of stack traces for all threads in the target process. + +Each element in the returned list is a tuple of (thread_id, frame_list), where: +- thread_id is the OS thread identifier +- frame_list is a list of tuples (function_name, filename, line_number) representing + the Python stack frames for that thread, ordered from most recent to oldest + +Example: + [ + (1234, [ + ('process_data', 'worker.py', 127), + ('run_worker', 'worker.py', 45), + ('main', 'app.py', 23) + ]), + (1235, [ + ('handle_request', 'server.py', 89), + ('serve_forever', 'server.py', 52) + ]) + ] + +Raises: + RuntimeError: If there is an error copying memory from the target process + OSError: If there is an error accessing the target process + PermissionError: If access to the target process is denied + UnicodeDecodeError: If there is an error decoding strings from the target process + +[clinic start generated code]*/ + +static PyObject * +_remote_debugging_RemoteUnwinder_get_stack_trace_impl(RemoteUnwinderObject *self) +/*[clinic end generated code: output=666192b90c69d567 input=331dbe370578badf]*/ +{ + PyObject* result = NULL; + // Read interpreter state into opaque buffer + char interp_state_buffer[INTERP_STATE_BUFFER_SIZE]; + if (_Py_RemoteDebug_PagedReadRemoteMemory( + &self->handle, + self->interpreter_addr, + INTERP_STATE_BUFFER_SIZE, + interp_state_buffer) < 0) { + goto exit; } - uintptr_t address_of_current_frame; - if (find_running_frame( - handle, runtime_start_address, &local_debug_offsets, - &address_of_current_frame) - ) { - chain_exceptions(PyExc_RuntimeError, "Failed to find running frame"); - goto result_err; + // Get code object generation from buffer + uint64_t code_object_generation = GET_MEMBER(uint64_t, interp_state_buffer, + self->debug_offsets.interpreter_state.code_object_generation); + + if (code_object_generation != self->code_object_generation) { + self->code_object_generation = code_object_generation; + _Py_hashtable_clear(self->code_object_cache); } - uintptr_t address_of_code_object; - while ((void*)address_of_current_frame != NULL) { - PyObject* frame_info = NULL; - int res = parse_async_frame_object( - handle, - &frame_info, - &local_debug_offsets, - address_of_current_frame, - &address_of_current_frame, - &address_of_code_object - ); +#ifdef Py_GIL_DISABLED + // Check TLBC generation and invalidate cache if needed + uint32_t current_tlbc_generation = GET_MEMBER(uint32_t, interp_state_buffer, + self->debug_offsets.interpreter_state.tlbc_generation); + if (current_tlbc_generation != self->tlbc_generation) { + self->tlbc_generation = current_tlbc_generation; + _Py_hashtable_clear(self->tlbc_cache); + } +#endif - if (res < 0) { - chain_exceptions(PyExc_RuntimeError, "Failed to parse async frame object"); - goto result_err; - } + uintptr_t current_tstate; + if (self->tstate_addr == 0) { + // Get threads head from buffer + current_tstate = GET_MEMBER(uintptr_t, interp_state_buffer, + self->debug_offsets.interpreter_state.threads_head); + } else { + current_tstate = self->tstate_addr; + } + result = PyList_New(0); + if (!result) { + goto exit; + } + + while (current_tstate != 0) { + PyObject* frame_info = unwind_stack_for_thread(self, ¤t_tstate); if (!frame_info) { - continue; + Py_CLEAR(result); + goto exit; } - if (PyList_Append(calls, frame_info) == -1) { - Py_DECREF(calls); - goto result_err; + if (PyList_Append(result, frame_info) == -1) { + Py_DECREF(frame_info); + Py_CLEAR(result); + goto exit; } - Py_DECREF(frame_info); - frame_info = NULL; - if (address_of_code_object == address_of_running_task_code_obj) { + // We are targeting a single tstate, break here + if (self->tstate_addr) { break; } } - PyObject *tn = parse_task_name( - handle, &local_debug_offsets, &local_async_debug, running_task_addr); - if (tn == NULL) { - goto result_err; +exit: + _Py_RemoteDebug_ClearCache(&self->handle); + return result; +} + +/*[clinic input] +@critical_section +_remote_debugging.RemoteUnwinder.get_all_awaited_by + +Get all tasks and their awaited_by relationships from the remote process. + +This provides a tree structure showing which tasks are waiting for other tasks. + +For each task, returns: +1. The call stack frames leading to where the task is currently executing +2. The name of the task +3. A list of tasks that this task is waiting for, with their own frames/names/etc + +Returns a list of [frames, task_name, subtasks] where: +- frames: List of (func_name, filename, lineno) showing the call stack +- task_name: String identifier for the task +- subtasks: List of tasks being awaited by this task, in same format + +Raises: + RuntimeError: If AsyncioDebug section is not available in the remote process + MemoryError: If memory allocation fails + OSError: If reading from the remote process fails + +Example output: +[ + # Task c2_root waiting for two subtasks + [ + # Call stack of c2_root + [("c5", "script.py", 10), ("c4", "script.py", 14)], + "c2_root", + [ + # First subtask (sub_main_2) and what it's waiting for + [ + [("c1", "script.py", 23)], + "sub_main_2", + [...] + ], + # Second subtask and its waiters + [...] + ] + ] +] +[clinic start generated code]*/ + +static PyObject * +_remote_debugging_RemoteUnwinder_get_all_awaited_by_impl(RemoteUnwinderObject *self) +/*[clinic end generated code: output=6a49cd345e8aec53 input=a452c652bb00701a]*/ +{ + if (!self->async_debug_offsets_available) { + PyErr_SetString(PyExc_RuntimeError, "AsyncioDebug section not available"); + return NULL; } - if (PyList_Append(result, tn)) { - Py_DECREF(tn); + + PyObject *result = PyList_New(0); + if (result == NULL) { goto result_err; } - Py_DECREF(tn); - PyObject* awaited_by = PyList_New(0); - if (awaited_by == NULL) { + uintptr_t thread_state_addr; + unsigned long tid = 0; + if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( + &self->handle, + self->interpreter_addr + + self->debug_offsets.interpreter_state.threads_main, + sizeof(void*), + &thread_state_addr)) + { goto result_err; } - if (PyList_Append(result, awaited_by)) { - Py_DECREF(awaited_by); - goto result_err; + + uintptr_t head_addr; + while (thread_state_addr != 0) { + if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( + &self->handle, + thread_state_addr + + self->debug_offsets.thread_state.native_thread_id, + sizeof(tid), + &tid)) + { + goto result_err; + } + + head_addr = thread_state_addr + + self->async_debug_offsets.asyncio_thread_state.asyncio_tasks_head; + + if (append_awaited_by(self, tid, head_addr, result)) + { + goto result_err; + } + + if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( + &self->handle, + thread_state_addr + self->debug_offsets.thread_state.next, + sizeof(void*), + &thread_state_addr)) + { + goto result_err; + } } - Py_DECREF(awaited_by); - if (parse_task_awaited_by( - handle, &local_debug_offsets, &local_async_debug, - running_task_addr, awaited_by, 1) - ) { + head_addr = self->interpreter_addr + + self->async_debug_offsets.asyncio_interpreter_state.asyncio_tasks_head; + + // On top of a per-thread task lists used by default by asyncio to avoid + // contention, there is also a fallback per-interpreter list of tasks; + // any tasks still pending when a thread is destroyed will be moved to the + // per-interpreter task list. It's unlikely we'll find anything here, but + // interesting for debugging. + if (append_awaited_by(self, 0, head_addr, result)) + { goto result_err; } - _Py_RemoteDebug_CleanupProcHandle(handle); + _Py_RemoteDebug_ClearCache(&self->handle); return result; result_err: - _Py_RemoteDebug_CleanupProcHandle(handle); + _Py_RemoteDebug_ClearCache(&self->handle); Py_XDECREF(result); return NULL; } +/*[clinic input] +@critical_section +_remote_debugging.RemoteUnwinder.get_async_stack_trace -static PyMethodDef methods[] = { - {"get_stack_trace", get_stack_trace, METH_VARARGS, - "Get the Python stack from a given pod"}, - {"get_async_stack_trace", get_async_stack_trace, METH_VARARGS, - "Get the asyncio stack from a given pid"}, - {"get_all_awaited_by", get_all_awaited_by, METH_VARARGS, - "Get all tasks and their awaited_by from a given pid"}, - {NULL, NULL, 0, NULL}, +Returns information about the currently running async task and its stack trace. + +Returns a tuple of (task_info, stack_frames) where: +- task_info is a tuple of (task_id, task_name) identifying the task +- stack_frames is a list of tuples (function_name, filename, line_number) representing + the Python stack frames for the task, ordered from most recent to oldest + +Example: + ((4345585712, 'Task-1'), [ + ('run_echo_server', 'server.py', 127), + ('serve_forever', 'server.py', 45), + ('main', 'app.py', 23) + ]) + +Raises: + RuntimeError: If AsyncioDebug section is not available in the target process + RuntimeError: If there is an error copying memory from the target process + OSError: If there is an error accessing the target process + PermissionError: If access to the target process is denied + UnicodeDecodeError: If there is an error decoding strings from the target process + +[clinic start generated code]*/ + +static PyObject * +_remote_debugging_RemoteUnwinder_get_async_stack_trace_impl(RemoteUnwinderObject *self) +/*[clinic end generated code: output=6433d52b55e87bbe input=11b7150c59d4c60f]*/ +{ + if (!self->async_debug_offsets_available) { + PyErr_SetString(PyExc_RuntimeError, "AsyncioDebug section not available"); + return NULL; + } + + PyObject *result = NULL; + PyObject *calls = NULL; + + if (setup_async_result_structure(&result, &calls) < 0) { + goto cleanup; + } + + uintptr_t running_task_addr, running_coro_addr, running_task_code_obj; + if (find_running_task_and_coro(self, &running_task_addr, + &running_coro_addr, &running_task_code_obj) < 0) { + goto cleanup; + } + + if (parse_async_frame_chain(self, calls, running_task_code_obj) < 0) { + goto cleanup; + } + + if (add_task_info_to_result(self, result, running_task_addr) < 0) { + goto cleanup; + } + + _Py_RemoteDebug_ClearCache(&self->handle); + return result; + +cleanup: + _Py_RemoteDebug_ClearCache(&self->handle); + Py_XDECREF(result); + return NULL; +} + +static PyMethodDef RemoteUnwinder_methods[] = { + _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_STACK_TRACE_METHODDEF + _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_ALL_AWAITED_BY_METHODDEF + _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_ASYNC_STACK_TRACE_METHODDEF + {NULL, NULL} }; -static struct PyModuleDef module = { - .m_base = PyModuleDef_HEAD_INIT, - .m_name = "_remote_debugging", - .m_size = -1, - .m_methods = methods, +static void +RemoteUnwinder_dealloc(RemoteUnwinderObject *self) +{ + PyTypeObject *tp = Py_TYPE(self); + if (self->code_object_cache) { + _Py_hashtable_destroy(self->code_object_cache); + } +#ifdef Py_GIL_DISABLED + if (self->tlbc_cache) { + _Py_hashtable_destroy(self->tlbc_cache); + } +#endif + if (self->handle.pid != 0) { + _Py_RemoteDebug_ClearCache(&self->handle); + _Py_RemoteDebug_CleanupProcHandle(&self->handle); + } + PyObject_Del(self); + Py_DECREF(tp); +} + +static PyType_Slot RemoteUnwinder_slots[] = { + {Py_tp_doc, (void *)"RemoteUnwinder(pid): Inspect stack of a remote Python process."}, + {Py_tp_methods, RemoteUnwinder_methods}, + {Py_tp_init, _remote_debugging_RemoteUnwinder___init__}, + {Py_tp_dealloc, RemoteUnwinder_dealloc}, + {0, NULL} }; -PyMODINIT_FUNC -PyInit__remote_debugging(void) +static PyType_Spec RemoteUnwinder_spec = { + .name = "_remote_debugging.RemoteUnwinder", + .basicsize = sizeof(RemoteUnwinderObject), + .flags = Py_TPFLAGS_DEFAULT, + .slots = RemoteUnwinder_slots, +}; + +/* ============================================================================ + * MODULE INITIALIZATION + * ============================================================================ */ + +static int +_remote_debugging_exec(PyObject *m) { - PyObject* mod = PyModule_Create(&module); - if (mod == NULL) { - return NULL; + RemoteDebuggingState *st = RemoteDebugging_GetState(m); +#define CREATE_TYPE(mod, type, spec) \ + do { \ + type = (PyTypeObject *)PyType_FromMetaclass(NULL, mod, spec, NULL); \ + if (type == NULL) { \ + return -1; \ + } \ + } while (0) + + CREATE_TYPE(m, st->RemoteDebugging_Type, &RemoteUnwinder_spec); + + if (PyModule_AddType(m, st->RemoteDebugging_Type) < 0) { + return -1; } #ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED); + PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); #endif - int rc = PyModule_AddIntConstant( - mod, "PROCESS_VM_READV_SUPPORTED", HAVE_PROCESS_VM_READV); + int rc = PyModule_AddIntConstant(m, "PROCESS_VM_READV_SUPPORTED", HAVE_PROCESS_VM_READV); if (rc < 0) { - Py_DECREF(mod); - return NULL; + return -1; } - return mod; + if (RemoteDebugging_InitState(st) < 0) { + return -1; + } + return 0; } + +static int +remote_debugging_traverse(PyObject *mod, visitproc visit, void *arg) +{ + RemoteDebuggingState *state = RemoteDebugging_GetState(mod); + Py_VISIT(state->RemoteDebugging_Type); + return 0; +} + +static int +remote_debugging_clear(PyObject *mod) +{ + RemoteDebuggingState *state = RemoteDebugging_GetState(mod); + Py_CLEAR(state->RemoteDebugging_Type); + return 0; +} + +static void +remote_debugging_free(void *mod) +{ + (void)remote_debugging_clear((PyObject *)mod); +} + +static PyModuleDef_Slot remote_debugging_slots[] = { + {Py_mod_exec, _remote_debugging_exec}, + {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, + {0, NULL}, +}; + +static PyMethodDef remote_debugging_methods[] = { + {NULL, NULL, 0, NULL}, +}; + +static struct PyModuleDef remote_debugging_module = { + PyModuleDef_HEAD_INIT, + .m_name = "_remote_debugging", + .m_size = sizeof(RemoteDebuggingState), + .m_methods = remote_debugging_methods, + .m_slots = remote_debugging_slots, + .m_traverse = remote_debugging_traverse, + .m_clear = remote_debugging_clear, + .m_free = remote_debugging_free, +}; + +PyMODINIT_FUNC +PyInit__remote_debugging(void) +{ + return PyModuleDef_Init(&remote_debugging_module); +} + diff --git a/Modules/clinic/_remote_debugging_module.c.h b/Modules/clinic/_remote_debugging_module.c.h new file mode 100644 index 00000000000000..e83e2fd7fd2b5b --- /dev/null +++ b/Modules/clinic/_remote_debugging_module.c.h @@ -0,0 +1,243 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) +# include "pycore_gc.h" // PyGC_Head +# include "pycore_runtime.h" // _Py_ID() +#endif +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() +#include "pycore_modsupport.h" // _PyArg_UnpackKeywords() + +PyDoc_STRVAR(_remote_debugging_RemoteUnwinder___init____doc__, +"RemoteUnwinder(pid, *, all_threads=False)\n" +"--\n" +"\n" +"Initialize a new RemoteUnwinder object for debugging a remote Python process.\n" +"\n" +"Args:\n" +" pid: Process ID of the target Python process to debug\n" +" all_threads: If True, initialize state for all threads in the process.\n" +" If False, only initialize for the main thread.\n" +"\n" +"The RemoteUnwinder provides functionality to inspect and debug a running Python\n" +"process, including examining thread states, stack frames and other runtime data.\n" +"\n" +"Raises:\n" +" PermissionError: If access to the target process is denied\n" +" OSError: If unable to attach to the target process or access its memory\n" +" RuntimeError: If unable to read debug information from the target process"); + +static int +_remote_debugging_RemoteUnwinder___init___impl(RemoteUnwinderObject *self, + int pid, int all_threads); + +static int +_remote_debugging_RemoteUnwinder___init__(PyObject *self, PyObject *args, PyObject *kwargs) +{ + int return_value = -1; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + + #define NUM_KEYWORDS 2 + static struct { + PyGC_Head _this_is_not_used; + PyObject_VAR_HEAD + Py_hash_t ob_hash; + PyObject *ob_item[NUM_KEYWORDS]; + } _kwtuple = { + .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) + .ob_hash = -1, + .ob_item = { &_Py_ID(pid), &_Py_ID(all_threads), }, + }; + #undef NUM_KEYWORDS + #define KWTUPLE (&_kwtuple.ob_base.ob_base) + + #else // !Py_BUILD_CORE + # define KWTUPLE NULL + #endif // !Py_BUILD_CORE + + static const char * const _keywords[] = {"pid", "all_threads", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "RemoteUnwinder", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; + int pid; + int all_threads = 0; + + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, + /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); + if (!fastargs) { + goto exit; + } + pid = PyLong_AsInt(fastargs[0]); + if (pid == -1 && PyErr_Occurred()) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + all_threads = PyObject_IsTrue(fastargs[1]); + if (all_threads < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _remote_debugging_RemoteUnwinder___init___impl((RemoteUnwinderObject *)self, pid, all_threads); + +exit: + return return_value; +} + +PyDoc_STRVAR(_remote_debugging_RemoteUnwinder_get_stack_trace__doc__, +"get_stack_trace($self, /)\n" +"--\n" +"\n" +"Returns a list of stack traces for all threads in the target process.\n" +"\n" +"Each element in the returned list is a tuple of (thread_id, frame_list), where:\n" +"- thread_id is the OS thread identifier\n" +"- frame_list is a list of tuples (function_name, filename, line_number) representing\n" +" the Python stack frames for that thread, ordered from most recent to oldest\n" +"\n" +"Example:\n" +" [\n" +" (1234, [\n" +" (\'process_data\', \'worker.py\', 127),\n" +" (\'run_worker\', \'worker.py\', 45),\n" +" (\'main\', \'app.py\', 23)\n" +" ]),\n" +" (1235, [\n" +" (\'handle_request\', \'server.py\', 89),\n" +" (\'serve_forever\', \'server.py\', 52)\n" +" ])\n" +" ]\n" +"\n" +"Raises:\n" +" RuntimeError: If there is an error copying memory from the target process\n" +" OSError: If there is an error accessing the target process\n" +" PermissionError: If access to the target process is denied\n" +" UnicodeDecodeError: If there is an error decoding strings from the target process"); + +#define _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_STACK_TRACE_METHODDEF \ + {"get_stack_trace", (PyCFunction)_remote_debugging_RemoteUnwinder_get_stack_trace, METH_NOARGS, _remote_debugging_RemoteUnwinder_get_stack_trace__doc__}, + +static PyObject * +_remote_debugging_RemoteUnwinder_get_stack_trace_impl(RemoteUnwinderObject *self); + +static PyObject * +_remote_debugging_RemoteUnwinder_get_stack_trace(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _remote_debugging_RemoteUnwinder_get_stack_trace_impl((RemoteUnwinderObject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(_remote_debugging_RemoteUnwinder_get_all_awaited_by__doc__, +"get_all_awaited_by($self, /)\n" +"--\n" +"\n" +"Get all tasks and their awaited_by relationships from the remote process.\n" +"\n" +"This provides a tree structure showing which tasks are waiting for other tasks.\n" +"\n" +"For each task, returns:\n" +"1. The call stack frames leading to where the task is currently executing\n" +"2. The name of the task\n" +"3. A list of tasks that this task is waiting for, with their own frames/names/etc\n" +"\n" +"Returns a list of [frames, task_name, subtasks] where:\n" +"- frames: List of (func_name, filename, lineno) showing the call stack\n" +"- task_name: String identifier for the task\n" +"- subtasks: List of tasks being awaited by this task, in same format\n" +"\n" +"Raises:\n" +" RuntimeError: If AsyncioDebug section is not available in the remote process\n" +" MemoryError: If memory allocation fails\n" +" OSError: If reading from the remote process fails\n" +"\n" +"Example output:\n" +"[\n" +" [\n" +" [(\"c5\", \"script.py\", 10), (\"c4\", \"script.py\", 14)],\n" +" \"c2_root\",\n" +" [\n" +" [\n" +" [(\"c1\", \"script.py\", 23)],\n" +" \"sub_main_2\",\n" +" [...]\n" +" ],\n" +" [...]\n" +" ]\n" +" ]\n" +"]"); + +#define _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_ALL_AWAITED_BY_METHODDEF \ + {"get_all_awaited_by", (PyCFunction)_remote_debugging_RemoteUnwinder_get_all_awaited_by, METH_NOARGS, _remote_debugging_RemoteUnwinder_get_all_awaited_by__doc__}, + +static PyObject * +_remote_debugging_RemoteUnwinder_get_all_awaited_by_impl(RemoteUnwinderObject *self); + +static PyObject * +_remote_debugging_RemoteUnwinder_get_all_awaited_by(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _remote_debugging_RemoteUnwinder_get_all_awaited_by_impl((RemoteUnwinderObject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(_remote_debugging_RemoteUnwinder_get_async_stack_trace__doc__, +"get_async_stack_trace($self, /)\n" +"--\n" +"\n" +"Returns information about the currently running async task and its stack trace.\n" +"\n" +"Returns a tuple of (task_info, stack_frames) where:\n" +"- task_info is a tuple of (task_id, task_name) identifying the task\n" +"- stack_frames is a list of tuples (function_name, filename, line_number) representing\n" +" the Python stack frames for the task, ordered from most recent to oldest\n" +"\n" +"Example:\n" +" ((4345585712, \'Task-1\'), [\n" +" (\'run_echo_server\', \'server.py\', 127),\n" +" (\'serve_forever\', \'server.py\', 45),\n" +" (\'main\', \'app.py\', 23)\n" +" ])\n" +"\n" +"Raises:\n" +" RuntimeError: If AsyncioDebug section is not available in the target process\n" +" RuntimeError: If there is an error copying memory from the target process\n" +" OSError: If there is an error accessing the target process\n" +" PermissionError: If access to the target process is denied\n" +" UnicodeDecodeError: If there is an error decoding strings from the target process"); + +#define _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_ASYNC_STACK_TRACE_METHODDEF \ + {"get_async_stack_trace", (PyCFunction)_remote_debugging_RemoteUnwinder_get_async_stack_trace, METH_NOARGS, _remote_debugging_RemoteUnwinder_get_async_stack_trace__doc__}, + +static PyObject * +_remote_debugging_RemoteUnwinder_get_async_stack_trace_impl(RemoteUnwinderObject *self); + +static PyObject * +_remote_debugging_RemoteUnwinder_get_async_stack_trace(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _remote_debugging_RemoteUnwinder_get_async_stack_trace_impl((RemoteUnwinderObject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} +/*[clinic end generated code: output=654772085f1f4bf6 input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 4f06a36a130207..ee869d991d93cd 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -2364,6 +2364,8 @@ free_monitoring_data(_PyCoMonitoringData *data) static void code_dealloc(PyObject *self) { + PyThreadState *tstate = PyThreadState_GET(); + _Py_atomic_add_uint64(&tstate->interp->_code_object_generation, 1); PyCodeObject *co = _PyCodeObject_CAST(self); _PyObject_ResurrectStart(self); notify_code_watchers(PY_CODE_EVENT_DESTROY, co); diff --git a/Python/index_pool.c b/Python/index_pool.c index 007c81a0fc16ec..520a65938ec6c7 100644 --- a/Python/index_pool.c +++ b/Python/index_pool.c @@ -172,6 +172,9 @@ _PyIndexPool_AllocIndex(_PyIndexPool *pool) else { index = heap_pop(free_indices); } + + pool->tlbc_generation++; + UNLOCK_POOL(pool); return index; } @@ -180,6 +183,7 @@ void _PyIndexPool_FreeIndex(_PyIndexPool *pool, int32_t index) { LOCK_POOL(pool); + pool->tlbc_generation++; heap_add(&pool->free_indices, index); UNLOCK_POOL(pool); } diff --git a/Python/pystate.c b/Python/pystate.c index 14ae2748b0bc99..5aefd03b30ede8 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -676,6 +676,7 @@ init_interpreter(PyInterpreterState *interp, } interp->sys_profile_initialized = false; interp->sys_trace_initialized = false; + interp->_code_object_generation = 0; interp->jit = false; interp->executor_list_head = NULL; interp->executor_deletion_list_head = NULL; @@ -886,6 +887,10 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) for (int t = 0; t < PY_MONITORING_TOOL_IDS; t++) { Py_CLEAR(interp->monitoring_tool_names[t]); } + interp->_code_object_generation = 0; +#ifdef Py_GIL_DISABLED + interp->tlbc_indices.tlbc_generation = 0; +#endif PyConfig_Clear(&interp->config); _PyCodec_Fini(interp); @@ -1457,9 +1462,6 @@ tstate_is_alive(PyThreadState *tstate) // lifecycle //---------- -/* Minimum size of data stack chunk */ -#define DATA_STACK_CHUNK_SIZE (16*1024) - static _PyStackChunk* allocate_chunk(int size_in_bytes, _PyStackChunk* previous) { @@ -3012,7 +3014,7 @@ _PyInterpreterState_HasFeature(PyInterpreterState *interp, unsigned long feature static PyObject ** push_chunk(PyThreadState *tstate, int size) { - int allocate_size = DATA_STACK_CHUNK_SIZE; + int allocate_size = _PY_DATA_STACK_CHUNK_SIZE; while (allocate_size < (int)sizeof(PyObject*)*(size + MINIMUM_OVERHEAD)) { allocate_size *= 2; } diff --git a/Python/remote_debug.h b/Python/remote_debug.h index edc77c302916ca..dbc6bdd09a693f 100644 --- a/Python/remote_debug.h +++ b/Python/remote_debug.h @@ -73,19 +73,71 @@ extern "C" { # define HAVE_PROCESS_VM_READV 0 #endif +static inline size_t +get_page_size(void) { + size_t page_size = 0; + if (page_size == 0) { +#ifdef MS_WINDOWS + SYSTEM_INFO si; + GetSystemInfo(&si); + page_size = si.dwPageSize; +#else + page_size = (size_t)getpagesize(); +#endif + } + return page_size; +} + +typedef struct page_cache_entry { + uintptr_t page_addr; // page-aligned base address + char *data; + int valid; + struct page_cache_entry *next; +} page_cache_entry_t; + +#define MAX_PAGES 1024 + // Define a platform-independent process handle structure typedef struct { pid_t pid; -#ifdef MS_WINDOWS +#if defined(__APPLE__) + mach_port_t task; +#elif defined(MS_WINDOWS) HANDLE hProcess; #endif + page_cache_entry_t pages[MAX_PAGES]; + Py_ssize_t page_size; } proc_handle_t; +static void +_Py_RemoteDebug_FreePageCache(proc_handle_t *handle) +{ + for (int i = 0; i < MAX_PAGES; i++) { + PyMem_RawFree(handle->pages[i].data); + handle->pages[i].data = NULL; + handle->pages[i].valid = 0; + } +} + +void +_Py_RemoteDebug_ClearCache(proc_handle_t *handle) +{ + for (int i = 0; i < MAX_PAGES; i++) { + handle->pages[i].valid = 0; + } +} + +#if defined(__APPLE__) && TARGET_OS_OSX +static mach_port_t pid_to_task(pid_t pid); +#endif + // Initialize the process handle static int _Py_RemoteDebug_InitProcHandle(proc_handle_t *handle, pid_t pid) { handle->pid = pid; -#ifdef MS_WINDOWS +#if defined(__APPLE__) + handle->task = pid_to_task(handle->pid); +#elif defined(MS_WINDOWS) handle->hProcess = OpenProcess( PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, FALSE, pid); @@ -94,6 +146,11 @@ _Py_RemoteDebug_InitProcHandle(proc_handle_t *handle, pid_t pid) { return -1; } #endif + handle->page_size = get_page_size(); + for (int i = 0; i < MAX_PAGES; i++) { + handle->pages[i].data = NULL; + handle->pages[i].valid = 0; + } return 0; } @@ -107,6 +164,7 @@ _Py_RemoteDebug_CleanupProcHandle(proc_handle_t *handle) { } #endif handle->pid = 0; + _Py_RemoteDebug_FreePageCache(handle); } #if defined(__APPLE__) && TARGET_OS_OSX @@ -755,7 +813,7 @@ _Py_RemoteDebug_ReadRemoteMemory(proc_handle_t *handle, uintptr_t remote_address #elif defined(__APPLE__) && TARGET_OS_OSX Py_ssize_t result = -1; kern_return_t kr = mach_vm_read_overwrite( - pid_to_task(handle->pid), + handle->task, (mach_vm_address_t)remote_address, len, (mach_vm_address_t)dst, @@ -780,6 +838,59 @@ _Py_RemoteDebug_ReadRemoteMemory(proc_handle_t *handle, uintptr_t remote_address #endif } +int +_Py_RemoteDebug_PagedReadRemoteMemory(proc_handle_t *handle, + uintptr_t addr, + size_t size, + void *out) +{ + size_t page_size = handle->page_size; + uintptr_t page_base = addr & ~(page_size - 1); + size_t offset_in_page = addr - page_base; + + if (offset_in_page + size > page_size) { + return _Py_RemoteDebug_ReadRemoteMemory(handle, addr, size, out); + } + + // Search for valid cached page + for (int i = 0; i < MAX_PAGES; i++) { + page_cache_entry_t *entry = &handle->pages[i]; + if (entry->valid && entry->page_addr == page_base) { + memcpy(out, entry->data + offset_in_page, size); + return 0; + } + } + + // Find reusable slot + for (int i = 0; i < MAX_PAGES; i++) { + page_cache_entry_t *entry = &handle->pages[i]; + if (!entry->valid) { + if (entry->data == NULL) { + entry->data = PyMem_RawMalloc(page_size); + if (entry->data == NULL) { + PyErr_NoMemory(); + return -1; + } + } + + if (_Py_RemoteDebug_ReadRemoteMemory(handle, page_base, page_size, entry->data) < 0) { + // Try to just copy the exact ammount as a fallback + PyErr_Clear(); + goto fallback; + } + + entry->page_addr = page_base; + entry->valid = 1; + memcpy(out, entry->data + offset_in_page, size); + return 0; + } + } + +fallback: + // Cache full — fallback to uncached read + return _Py_RemoteDebug_ReadRemoteMemory(handle, addr, size, out); +} + static int _Py_RemoteDebug_ReadDebugOffsets( proc_handle_t *handle, From 7216f7b59c30313fa27a30765fc7340df2f5ccef Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 01:33:02 +0200 Subject: [PATCH 0240/1674] [3.14] gh-69605: Disable PyREPL module autocomplete fallback on regular completion (gh-134181) (gh-134680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 0e3bc962c6462f836751e35ef35fa837fd952550) Co-authored-by: Loïc Simon --- Lib/_pyrepl/_module_completer.py | 4 +-- Lib/_pyrepl/readline.py | 5 ++-- Lib/test/test_pyrepl/test_pyrepl.py | 28 +++++++++++++------ ...5-05-18-14-33-23.gh-issue-69605.ZMO49F.rst | 2 ++ 4 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-18-14-33-23.gh-issue-69605.ZMO49F.rst diff --git a/Lib/_pyrepl/_module_completer.py b/Lib/_pyrepl/_module_completer.py index 494a501101a9b2..1e9462a42156d4 100644 --- a/Lib/_pyrepl/_module_completer.py +++ b/Lib/_pyrepl/_module_completer.py @@ -42,11 +42,11 @@ def __init__(self, namespace: Mapping[str, Any] | None = None) -> None: self._global_cache: list[pkgutil.ModuleInfo] = [] self._curr_sys_path: list[str] = sys.path[:] - def get_completions(self, line: str) -> list[str]: + def get_completions(self, line: str) -> list[str] | None: """Return the next possible import completions for 'line'.""" result = ImportParser(line).parse() if not result: - return [] + return None try: return self.complete(*result) except Exception: diff --git a/Lib/_pyrepl/readline.py b/Lib/_pyrepl/readline.py index 572eee520e53f3..9560ae779abfea 100644 --- a/Lib/_pyrepl/readline.py +++ b/Lib/_pyrepl/readline.py @@ -134,7 +134,8 @@ def get_stem(self) -> str: return "".join(b[p + 1 : self.pos]) def get_completions(self, stem: str) -> list[str]: - if module_completions := self.get_module_completions(): + module_completions = self.get_module_completions() + if module_completions is not None: return module_completions if len(stem) == 0 and self.more_lines is not None: b = self.buffer @@ -165,7 +166,7 @@ def get_completions(self, stem: str) -> list[str]: result.sort() return result - def get_module_completions(self) -> list[str]: + def get_module_completions(self) -> list[str] | None: line = self.get_line() return self.config.module_completer.get_completions(line) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index abb4bd1bc25fb1..aa3a592766d6d1 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -918,7 +918,14 @@ def test_func(self): class TestPyReplModuleCompleter(TestCase): def setUp(self): + import importlib + # Make iter_modules() search only the standard library. + # This makes the test more reliable in case there are + # other user packages/scripts on PYTHONPATH which can + # interfere with the completions. + lib_path = os.path.dirname(importlib.__path__[0]) self._saved_sys_path = sys.path + sys.path = [lib_path] def tearDown(self): sys.path = self._saved_sys_path @@ -932,14 +939,6 @@ def prepare_reader(self, events, namespace): return reader def test_import_completions(self): - import importlib - # Make iter_modules() search only the standard library. - # This makes the test more reliable in case there are - # other user packages/scripts on PYTHONPATH which can - # intefere with the completions. - lib_path = os.path.dirname(importlib.__path__[0]) - sys.path = [lib_path] - cases = ( ("import path\t\n", "import pathlib"), ("import importlib.\t\tres\t\n", "import importlib.resources"), @@ -1052,6 +1051,19 @@ def test_invalid_identifiers(self): output = reader.readline() self.assertEqual(output, expected) + def test_no_fallback_on_regular_completion(self): + cases = ( + ("import pri\t\n", "import pri"), + ("from pri\t\n", "from pri"), + ("from typing import Na\t\n", "from typing import Na"), + ) + for code, expected in cases: + with self.subTest(code=code): + events = code_to_events(code) + reader = self.prepare_reader(events, namespace={}) + output = reader.readline() + self.assertEqual(output, expected) + def test_get_path_and_prefix(self): cases = ( ('', ('', '')), diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-18-14-33-23.gh-issue-69605.ZMO49F.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-18-14-33-23.gh-issue-69605.ZMO49F.rst new file mode 100644 index 00000000000000..7b7275fee69b9b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-18-14-33-23.gh-issue-69605.ZMO49F.rst @@ -0,0 +1,2 @@ +When auto-completing an import in the :term:`REPL`, finding no candidates +now issues no suggestion, rather than suggestions from the current namespace. From 16187b58bff9ccf6f800ba908ad5dae441fcb6a1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 05:23:45 +0200 Subject: [PATCH 0241/1674] [3.14] gh-132876: workaround broken ldexp() on Windows 10 (GH-133135) (#134684) gh-132876: workaround broken ldexp() on Windows 10 (GH-133135) * gh-132876: workaround broken ldexp() on Windows 10 ldexp() fails to round subnormal results before Windows 11, so hide their bug. (cherry picked from commit cf8941c60356acdd00055e5583a2d64761c34af4) Co-authored-by: Sergey B Kirpichev Co-authored-by: Tim Peters --- Lib/test/test_math.py | 6 ++++++ ...-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst | 4 ++++ Modules/mathmodule.c | 21 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 913a60bf9e04e3..d14336f8bac498 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1214,6 +1214,12 @@ def testLdexp(self): self.assertEqual(math.ldexp(NINF, n), NINF) self.assertTrue(math.isnan(math.ldexp(NAN, n))) + @requires_IEEE_754 + def testLdexp_denormal(self): + # Denormal output incorrectly rounded (truncated) + # on some Windows. + self.assertEqual(math.ldexp(6993274598585239, -1126), 1e-323) + def testLog(self): self.assertRaises(TypeError, math.log) self.assertRaises(TypeError, math.log, 1, 2, 3) diff --git a/Misc/NEWS.d/next/Library/2025-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst b/Misc/NEWS.d/next/Library/2025-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst new file mode 100644 index 00000000000000..cb3ca3321e3d26 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst @@ -0,0 +1,4 @@ +``ldexp()`` on Windows doesn't round subnormal results before Windows 11, +but should. Python's :func:`math.ldexp` wrapper now does round them, so +results may change slightly, in rare cases of very small results, on +Windows versions before 11. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 40abd69f0a6600..71d9c1387f5780 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2161,6 +2161,27 @@ math_ldexp_impl(PyObject *module, double x, PyObject *i) } else { errno = 0; r = ldexp(x, (int)exp); +#ifdef _MSC_VER + if (DBL_MIN > r && r > -DBL_MIN) { + /* Denormal (or zero) results can be incorrectly rounded here (rather, + truncated). Fixed in newer versions of the C runtime, included + with Windows 11. */ + int original_exp; + frexp(x, &original_exp); + if (original_exp > DBL_MIN_EXP) { + /* Shift down to the smallest normal binade. No bits lost. */ + int shift = DBL_MIN_EXP - original_exp; + x = ldexp(x, shift); + exp -= shift; + } + /* Multiplying by 2**exp finishes the job, and the HW will round as + appropriate. Note: if exp < -DBL_MANT_DIG, all of x is shifted + to be < 0.5ULP of smallest denorm, so should be thrown away. If + exp is so very negative that ldexp underflows to 0, that's fine; + no need to check in advance. */ + r = x*ldexp(1.0, (int)exp); + } +#endif if (isinf(r)) errno = ERANGE; } From ebfd18b3f01d00a2246003ea4dd5ad5e4bf6d570 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 10:00:17 +0200 Subject: [PATCH 0242/1674] [3.14] gh-127833: lexical analysis: Improve section on Names (GH-131474) (#134423) Co-authored-by: Petr Viktorin Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Blaise Pabon --- Doc/reference/lexical_analysis.rst | 128 +++++++++++++++++------------ Tools/unicode/makeunicodedata.py | 2 +- 2 files changed, 77 insertions(+), 53 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 001e2547fe8031..6c4a4ea81afe29 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -288,58 +288,81 @@ forms a legal token, when read from left to right. .. _identifiers: -Identifiers and keywords -======================== +Names (identifiers and keywords) +================================ .. index:: identifier, name -Identifiers (also referred to as *names*) are described by the following lexical -definitions. +:data:`~token.NAME` tokens represent *identifiers*, *keywords*, and +*soft keywords*. -The syntax of identifiers in Python is based on the Unicode standard annex -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 -include the uppercase and lowercase letters ``A`` through -``Z``, the underscore ``_`` and, except for the first character, the digits +Within the ASCII range (U+0001..U+007F), the valid characters for names +include the uppercase and lowercase letters (``A-Z`` and ``a-z``), +the underscore ``_`` and, except for the first character, the digits ``0`` through ``9``. -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. -Identifiers are unlimited in length. Case is significant. +Names must contain at least one character, but have no upper length limit. +Case is significant. -.. productionlist:: python-grammar - identifier: `xid_start` `xid_continue`* - id_start: - id_continue: - xid_start: - xid_continue: - -The Unicode category codes mentioned above stand for: - -* *Lu* - uppercase letters -* *Ll* - lowercase letters -* *Lt* - titlecase letters -* *Lm* - modifier letters -* *Lo* - other letters -* *Nl* - letter numbers -* *Mn* - nonspacing marks -* *Mc* - spacing combining marks -* *Nd* - decimal numbers -* *Pc* - connector punctuations -* *Other_ID_Start* - explicit list of characters in `PropList.txt - `_ to support backwards - compatibility -* *Other_ID_Continue* - likewise - -All identifiers are converted into the normal form NFKC while parsing; comparison -of identifiers is based on NFKC. - -A non-normative HTML file listing all valid identifier characters for Unicode -16.0.0 can be found at -https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt +Besides ``A-Z``, ``a-z``, ``_`` and ``0-9``, names can also use "letter-like" +and "number-like" characters from outside the ASCII range, as detailed below. + +All identifiers are converted into the `normalization form`_ NFKC while +parsing; comparison of identifiers is based on NFKC. + +Formally, the first character of a normalized identifier must belong to the +set ``id_start``, which is the union of: + +* Unicode category ```` - uppercase letters (includes ``A`` to ``Z``) +* Unicode category ```` - lowercase letters (includes ``a`` to ``z``) +* Unicode category ```` - titlecase letters +* Unicode category ```` - modifier letters +* Unicode category ```` - other letters +* Unicode category ```` - letter numbers +* {``"_"``} - the underscore +* ```` - an explicit set of characters in `PropList.txt`_ + to support backwards compatibility + +The remaining characters must belong to the set ``id_continue``, which is the +union of: + +* all characters in ``id_start`` +* Unicode category ```` - decimal numbers (includes ``0`` to ``9``) +* Unicode category ```` - connector punctuations +* Unicode category ```` - nonspacing marks +* Unicode category ```` - spacing combining marks +* ```` - another explicit set of characters in + `PropList.txt`_ to support backwards compatibility + +Unicode categories use the version of the Unicode Character Database as +included in the :mod:`unicodedata` module. + +These sets are based on the Unicode standard annex `UAX-31`_. +See also :pep:`3131` for further details. + +Even more formally, names are described by the following lexical definitions: + +.. grammar-snippet:: + :group: python-grammar + + NAME: `xid_start` `xid_continue`* + id_start: | | | | | | "_" | + id_continue: `id_start` | | | | | + xid_start: + xid_continue: + identifier: <`NAME`, except keywords> + +A non-normative listing of all valid identifier characters as defined by +Unicode is available in the `DerivedCoreProperties.txt`_ file in the Unicode +Character Database. + + +.. _UAX-31: https://www.unicode.org/reports/tr31/ +.. _PropList.txt: https://www.unicode.org/Public/16.0.0/ucd/PropList.txt +.. _DerivedCoreProperties.txt: https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt +.. _normalization form: https://www.unicode.org/reports/tr15/#Norm_Forms .. _keywords: @@ -351,7 +374,7 @@ Keywords single: keyword single: reserved word -The following identifiers are used as reserved words, or *keywords* of the +The following names are used as reserved words, or *keywords* of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here: @@ -375,18 +398,19 @@ Soft Keywords .. versionadded:: 3.10 -Some identifiers are only reserved under specific contexts. These are known as -*soft keywords*. The identifiers ``match``, ``case``, ``type`` and ``_`` can -syntactically act as keywords in certain contexts, +Some names are only reserved under specific contexts. These are known as +*soft keywords*: + +- ``match``, ``case``, and ``_``, when used in the :keyword:`match` statement. +- ``type``, when used in the :keyword:`type` statement. + +These syntactically act as keywords in their specific contexts, but this distinction is done at the parser level, not when tokenizing. As soft keywords, their use in the grammar is possible while still preserving compatibility with existing code that uses these names as identifier names. -``match``, ``case``, and ``_`` are used in the :keyword:`match` statement. -``type`` is used in the :keyword:`type` statement. - .. versionchanged:: 3.12 ``type`` is now a soft keyword. diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 889ae8fc869b8a..d4cca68c3e3e71 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -43,7 +43,7 @@ # When changing UCD version please update # * Doc/library/stdtypes.rst, and # * Doc/library/unicodedata.rst -# * Doc/reference/lexical_analysis.rst (two occurrences) +# * Doc/reference/lexical_analysis.rst (three occurrences) UNIDATA_VERSION = "16.0.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" From 1ce68f6297560c3d22169f0280a516b79375e947 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 10:02:52 +0200 Subject: [PATCH 0243/1674] [3.14] gh-134152: Fix UnboundLocalError in email._header_value_parser _get_ptext_to_endchars (GH-134233) (#134678) Co-authored-by: R. David Murray --- Lib/email/_header_value_parser.py | 2 ++ .../test_email/test__header_value_parser.py | 33 +++++++++++++++++++ ...-05-19-10-32-11.gh-issue-134152.INJC2j.rst | 2 ++ 3 files changed, 37 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-05-19-10-32-11.gh-issue-134152.INJC2j.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 9a51b9437333db..f11fa83d45ed2d 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -1020,6 +1020,8 @@ def _get_ptext_to_endchars(value, endchars): a flag that is True iff there were any quoted printables decoded. """ + if not value: + return '', '', False fragment, *remainder = _wsp_splitter(value, 1) vchars = [] escape = False diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index ac12c3b2306f7d..fd4ac2c404ce47 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -463,6 +463,19 @@ def test_get_qp_ctext_non_printables(self): [errors.NonPrintableDefect], ')') self.assertEqual(ptext.defects[0].non_printables[0], '\x00') + def test_get_qp_ctext_close_paren_only(self): + self._test_get_x(parser.get_qp_ctext, + ')', '', ' ', [], ')') + + def test_get_qp_ctext_open_paren_only(self): + self._test_get_x(parser.get_qp_ctext, + '(', '', ' ', [], '(') + + def test_get_qp_ctext_no_end_char(self): + self._test_get_x(parser.get_qp_ctext, + '', '', ' ', [], '') + + # get_qcontent def test_get_qcontent_only(self): @@ -503,6 +516,14 @@ def test_get_qcontent_non_printables(self): [errors.NonPrintableDefect], '"') self.assertEqual(ptext.defects[0].non_printables[0], '\x00') + def test_get_qcontent_empty(self): + self._test_get_x(parser.get_qcontent, + '"', '', '', [], '"') + + def test_get_qcontent_no_end_char(self): + self._test_get_x(parser.get_qcontent, + '', '', '', [], '') + # get_atext def test_get_atext_only(self): @@ -1283,6 +1304,18 @@ def test_get_dtext_open_bracket_mid_word(self): self._test_get_x(parser.get_dtext, 'foo[bar', 'foo', 'foo', [], '[bar') + def test_get_dtext_open_bracket_only(self): + self._test_get_x(parser.get_dtext, + '[', '', '', [], '[') + + def test_get_dtext_close_bracket_only(self): + self._test_get_x(parser.get_dtext, + ']', '', '', [], ']') + + def test_get_dtext_empty(self): + self._test_get_x(parser.get_dtext, + '', '', '', [], '') + # get_domain_literal def test_get_domain_literal_only(self): diff --git a/Misc/NEWS.d/next/Library/2025-05-19-10-32-11.gh-issue-134152.INJC2j.rst b/Misc/NEWS.d/next/Library/2025-05-19-10-32-11.gh-issue-134152.INJC2j.rst new file mode 100644 index 00000000000000..6da3d4147dd960 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-19-10-32-11.gh-issue-134152.INJC2j.rst @@ -0,0 +1,2 @@ +Fixed :exc:`UnboundLocalError` that could occur during :mod:`email` header +parsing if an expected trailing delimiter is missing in some contexts. From dc441efbd00b8dd2f26d014fb67895d381a8f602 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 10:22:14 +0200 Subject: [PATCH 0244/1674] [3.14] gh-132493: Remove __annotations__ usage in inspect._signature_is_functionlike (GH-133415) (#133796) gh-132493: Remove __annotations__ usage in inspect._signature_is_functionlike (GH-133415) This check is potentially problematic because it could force evaluation of annotations unnecessarily. This doesn't trigger for builtin objects (functions, classes, or modules) with annotations, but it could trigger for third-party objects. The check was not particularly useful anyway, because it succeeds if ``__annotations__`` is a dict or None, so the only thing this did was guard against objects that have an ``__annotations__`` attribute that is of some other type. That doesn't seem particularly useful, so I just removed the check. (cherry picked from commit cb6596c6aa30c8c3213c8746d5590e6e2757a6c1) Co-authored-by: Jelle Zijlstra --- Lib/inspect.py | 4 +-- Lib/test/test_inspect/test_inspect.py | 31 +++++++++++++++++++ ...-05-04-17-04-55.gh-issue-132493.huirKi.rst | 2 ++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-04-17-04-55.gh-issue-132493.huirKi.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 52c9bb05b31f37..183e67fabf966e 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2074,13 +2074,11 @@ def _signature_is_functionlike(obj): code = getattr(obj, '__code__', None) defaults = getattr(obj, '__defaults__', _void) # Important to use _void ... kwdefaults = getattr(obj, '__kwdefaults__', _void) # ... and not None here - annotations = getattr(obj, '__annotations__', None) return (isinstance(code, types.CodeType) and isinstance(name, str) and (defaults is None or isinstance(defaults, tuple)) and - (kwdefaults is None or isinstance(kwdefaults, dict)) and - (isinstance(annotations, (dict)) or annotations is None) ) + (kwdefaults is None or isinstance(kwdefaults, dict))) def _signature_strip_non_python_syntax(signature): diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 57dc7a24af94b8..44f7a54bbf1c1e 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -4997,6 +4997,37 @@ def test_signature_annotation_format(self): with self.assertRaisesRegex(NameError, "undefined"): signature_func(ida.f) + def test_signature_deferred_annotations(self): + def f(x: undef): + pass + + class C: + x: undef + + def __init__(self, x: undef): + self.x = x + + sig = inspect.signature(f, annotation_format=Format.FORWARDREF) + self.assertEqual(list(sig.parameters), ['x']) + sig = inspect.signature(C, annotation_format=Format.FORWARDREF) + self.assertEqual(list(sig.parameters), ['x']) + + class CallableWrapper: + def __init__(self, func): + self.func = func + self.__annotate__ = func.__annotate__ + + def __call__(self, *args, **kwargs): + return self.func(*args, **kwargs) + + @property + def __annotations__(self): + return self.__annotate__(Format.VALUE) + + cw = CallableWrapper(f) + sig = inspect.signature(cw, annotation_format=Format.FORWARDREF) + self.assertEqual(list(sig.parameters), ['args', 'kwargs']) + def test_signature_none_annotation(self): class funclike: # Has to be callable, and have correct diff --git a/Misc/NEWS.d/next/Library/2025-05-04-17-04-55.gh-issue-132493.huirKi.rst b/Misc/NEWS.d/next/Library/2025-05-04-17-04-55.gh-issue-132493.huirKi.rst new file mode 100644 index 00000000000000..ad06ee6b7a2757 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-04-17-04-55.gh-issue-132493.huirKi.rst @@ -0,0 +1,2 @@ +Avoid accessing ``__annotations__`` unnecessarily in +:func:`inspect.signature`. From ed52549c3716f5aa5942db2a594ba594edba2e74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 26 May 2025 12:09:02 +0200 Subject: [PATCH 0245/1674] [3.14] gh-134208: remove dead AC directives for `_curses.window.{chgat,getstr,instr}` (GH-134325) (#134701) (cherry picked from commit 29e81159644cf78d958e30aaef208e22a04a8b25) --- Modules/_cursesmodule.c | 321 ++++++++++++++++++---------------------- 1 file changed, 148 insertions(+), 173 deletions(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index f6e366ef7dec8b..806153fc16ccf1 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1312,32 +1312,27 @@ int py_mvwdelch(WINDOW *w, int y, int x) /* chgat, added by Fabian Kreutz */ #ifdef HAVE_CURSES_WCHGAT -/*[-clinic input] -_curses.window.chgat - [ - y: int - Y-coordinate. - x: int - X-coordinate. - ] +PyDoc_STRVAR(_curses_window_chgat__doc__, +"chgat([y, x,] [n=-1,] attr)\n" +"Set the attributes of characters.\n" +"\n" +" y\n" +" Y-coordinate.\n" +" x\n" +" X-coordinate.\n" +" n\n" +" Number of characters.\n" +" attr\n" +" Attributes for characters.\n" +"\n" +"Set the attributes of num characters at the current cursor position, or at\n" +"position (y, x) if supplied. If no value of num is given or num = -1, the\n" +"attribute will be set on all the characters to the end of the line. This\n" +"function does not move the cursor. The changed line will be touched using\n" +"the touchline() method so that the contents will be redisplayed by the next\n" +"window refresh."); - n: int = -1 - Number of characters. - - attr: long - Attributes for characters. - / - -Set the attributes of characters. - -Set the attributes of num characters at the current cursor position, or at -position (y, x) if supplied. If no value of num is given or num = -1, the -attribute will be set on all the characters to the end of the line. This -function does not move the cursor. The changed line will be touched using -the touchline() method so that the contents will be redisplayed by the next -window refresh. -[-clinic start generated code]*/ static PyObject * PyCursesWindow_ChgAt(PyObject *op, PyObject *args) { @@ -1363,19 +1358,20 @@ PyCursesWindow_ChgAt(PyObject *op, PyObject *args) attr = lattr; break; case 3: - if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr)) + if (!PyArg_ParseTuple(args,"iil;y,x,attr", &y, &x, &lattr)) return NULL; attr = lattr; use_xy = TRUE; break; case 4: - if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr)) + if (!PyArg_ParseTuple(args,"iiil;y,x,n,attr", &y, &x, &num, &lattr)) return NULL; attr = lattr; use_xy = TRUE; break; default: - PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments"); + PyErr_SetString(PyExc_TypeError, + "_curses.window.chgat requires 1 to 4 arguments"); return NULL; } @@ -1678,102 +1674,102 @@ _curses_window_get_wch_impl(PyCursesWindowObject *self, int group_right_1, } #endif -/*[-clinic input] -_curses.window.getstr - - [ - y: int - Y-coordinate. - x: int - X-coordinate. - ] - n: int = 2047 - Maximal number of characters. - / +/* + * Helper function for parsing parameters from getstr() and instr(). + * This function is necessary because Argument Clinic does not know + * how to handle nested optional groups with default values inside. + * + * Return 1 on success and 0 on failure, similar to PyArg_ParseTuple(). + */ +static int +curses_clinic_parse_optional_xy_n(PyObject *args, + int *y, int *x, unsigned int *n, int *use_xy, + const char *qualname) +{ + switch (PyTuple_GET_SIZE(args)) { + case 0: { + *use_xy = 0; + return 1; + } + case 1: { + *use_xy = 0; + return PyArg_ParseTuple(args, "O&;n", + _PyLong_UnsignedInt_Converter, n); + } + case 2: { + *use_xy = 1; + return PyArg_ParseTuple(args, "ii;y,x", y, x); + } + case 3: { + *use_xy = 1; + return PyArg_ParseTuple(args, "iiO&;y,x,n", y, x, + _PyLong_UnsignedInt_Converter, n); + } + default: { + *use_xy = 0; + PyErr_Format(PyExc_TypeError, "%s requires 0 to 3 arguments", + qualname); + return 0; + } + } +} -Read a string from the user, with primitive line editing capacity. -[-clinic start generated code]*/ +PyDoc_STRVAR(_curses_window_getstr__doc__, +"getstr([[y, x,] n=2047])\n" +"Read a string from the user, with primitive line editing capacity.\n" +"\n" +" y\n" +" Y-coordinate.\n" +" x\n" +" X-coordinate.\n" +" n\n" +" Maximal number of characters."); static PyObject * -PyCursesWindow_GetStr(PyObject *op, PyObject *args) +PyCursesWindow_getstr(PyObject *op, PyObject *args) { PyCursesWindowObject *self = _PyCursesWindowObject_CAST(op); + int rtn, use_xy = 0, y = 0, x = 0; + unsigned int max_buf_size = 2048; + unsigned int n = max_buf_size - 1; + PyObject *res; - int x, y, n; - int rtn; + if (!curses_clinic_parse_optional_xy_n(args, &y, &x, &n, &use_xy, + "_curses.window.instr")) + { + return NULL; + } - /* could make the buffer size larger/dynamic */ - Py_ssize_t max_buf_size = 2048; - PyObject *result = PyBytes_FromStringAndSize(NULL, max_buf_size); - if (result == NULL) + n = Py_MIN(n, max_buf_size - 1); + res = PyBytes_FromStringAndSize(NULL, n + 1); + if (res == NULL) { return NULL; - char *buf = PyBytes_AS_STRING(result); + } + char *buf = PyBytes_AS_STRING(res); - switch (PyTuple_Size(args)) { - case 0: - Py_BEGIN_ALLOW_THREADS - rtn = wgetnstr(self->win, buf, max_buf_size - 1); - Py_END_ALLOW_THREADS - break; - case 1: - if (!PyArg_ParseTuple(args,"i;n", &n)) - goto error; - if (n < 0) { - PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - goto error; - } - Py_BEGIN_ALLOW_THREADS - rtn = wgetnstr(self->win, buf, Py_MIN(n, max_buf_size - 1)); - Py_END_ALLOW_THREADS - break; - case 2: - if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x)) - goto error; + if (use_xy) { Py_BEGIN_ALLOW_THREADS #ifdef STRICT_SYSV_CURSES - rtn = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, max_buf_size - 1); + rtn = wmove(self->win, y, x) == ERR + ? ERR + : wgetnstr(self->win, buf, n); #else - rtn = mvwgetnstr(self->win,y,x,buf, max_buf_size - 1); + rtn = mvwgetnstr(self->win, y, x, buf, n); #endif Py_END_ALLOW_THREADS - break; - case 3: - if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n)) - goto error; - if (n < 0) { - PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - goto error; - } -#ifdef STRICT_SYSV_CURSES - Py_BEGIN_ALLOW_THREADS - rtn = wmove(self->win,y,x)==ERR ? ERR : - wgetnstr(self->win, rtn, Py_MIN(n, max_buf_size - 1)); - Py_END_ALLOW_THREADS -#else + } + else { Py_BEGIN_ALLOW_THREADS - rtn = mvwgetnstr(self->win, y, x, buf, Py_MIN(n, max_buf_size - 1)); + rtn = wgetnstr(self->win, buf, n); Py_END_ALLOW_THREADS -#endif - break; - default: - PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments"); - goto error; } if (rtn == ERR) { - Py_DECREF(result); + Py_DECREF(res); return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES); } - - if (_PyBytes_Resize(&result, strlen(buf)) < 0) { - return NULL; - } - - return result; - -error: - Py_DECREF(result); - return NULL; + _PyBytes_Resize(&res, strlen(buf)); // 'res' is set to NULL on failure + return res; } /*[clinic input] @@ -1898,87 +1894,57 @@ _curses_window_inch_impl(PyCursesWindowObject *self, int group_right_1, return rtn; } -/*[-clinic input] -_curses.window.instr - - [ - y: int - Y-coordinate. - x: int - X-coordinate. - ] - n: int = 2047 - Maximal number of characters. - / +PyDoc_STRVAR(_curses_window_instr__doc__, +"instr([y, x,] n=2047)\n" +"Return a string of characters, extracted from the window.\n" +"\n" +" y\n" +" Y-coordinate.\n" +" x\n" +" X-coordinate.\n" +" n\n" +" Maximal number of characters.\n" +"\n" +"Return a string of characters, extracted from the window starting at the\n" +"current cursor position, or at y, x if specified. Attributes are stripped\n" +"from the characters. If n is specified, instr() returns a string at most\n" +"n characters long (exclusive of the trailing NUL)."); -Return a string of characters, extracted from the window. - -Return a string of characters, extracted from the window starting at the -current cursor position, or at y, x if specified. Attributes are stripped -from the characters. If n is specified, instr() returns a string at most -n characters long (exclusive of the trailing NUL). -[-clinic start generated code]*/ static PyObject * -PyCursesWindow_InStr(PyObject *op, PyObject *args) +PyCursesWindow_instr(PyObject *op, PyObject *args) { PyCursesWindowObject *self = _PyCursesWindowObject_CAST(op); + int rtn, use_xy = 0, y = 0, x = 0; + unsigned int max_buf_size = 2048; + unsigned int n = max_buf_size - 1; + PyObject *res; - int x, y, n; - int rtn; + if (!curses_clinic_parse_optional_xy_n(args, &y, &x, &n, &use_xy, + "_curses.window.instr")) + { + return NULL; + } - /* could make the buffer size larger/dynamic */ - Py_ssize_t max_buf_size = 2048; - PyObject *result = PyBytes_FromStringAndSize(NULL, max_buf_size); - if (result == NULL) + n = Py_MIN(n, max_buf_size - 1); + res = PyBytes_FromStringAndSize(NULL, n + 1); + if (res == NULL) { return NULL; - char *buf = PyBytes_AS_STRING(result); + } + char *buf = PyBytes_AS_STRING(res); - switch (PyTuple_Size(args)) { - case 0: - rtn = winnstr(self->win, buf, max_buf_size - 1); - break; - case 1: - if (!PyArg_ParseTuple(args,"i;n", &n)) - goto error; - if (n < 0) { - PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - goto error; - } - rtn = winnstr(self->win, buf, Py_MIN(n, max_buf_size - 1)); - break; - case 2: - if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x)) - goto error; - rtn = mvwinnstr(self->win, y, x, buf, max_buf_size - 1); - break; - case 3: - if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n)) - goto error; - if (n < 0) { - PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative"); - goto error; - } - rtn = mvwinnstr(self->win, y, x, buf, Py_MIN(n, max_buf_size - 1)); - break; - default: - PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments"); - goto error; + if (use_xy) { + rtn = mvwinnstr(self->win, y, x, buf, n); + } + else { + rtn = winnstr(self->win, buf, n); } if (rtn == ERR) { - Py_DECREF(result); + Py_DECREF(res); return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES); } - - if (_PyBytes_Resize(&result, strlen(buf)) < 0) { - return NULL; - } - - return result; - -error: - Py_DECREF(result); - return NULL; + _PyBytes_Resize(&res, strlen(buf)); // 'res' is set to NULL on failure + return res; } /*[clinic input] @@ -2689,7 +2655,10 @@ static PyMethodDef PyCursesWindow_methods[] = { _CURSES_WINDOW_ATTRSET_METHODDEF _CURSES_WINDOW_BKGD_METHODDEF #ifdef HAVE_CURSES_WCHGAT - {"chgat", PyCursesWindow_ChgAt, METH_VARARGS}, + { + "chgat", PyCursesWindow_ChgAt, METH_VARARGS, + _curses_window_chgat__doc__ + }, #endif _CURSES_WINDOW_BKGDSET_METHODDEF _CURSES_WINDOW_BORDER_METHODDEF @@ -2712,7 +2681,10 @@ static PyMethodDef PyCursesWindow_methods[] = { _CURSES_WINDOW_GET_WCH_METHODDEF {"getmaxyx", PyCursesWindow_getmaxyx, METH_NOARGS}, {"getparyx", PyCursesWindow_getparyx, METH_NOARGS}, - {"getstr", PyCursesWindow_GetStr, METH_VARARGS}, + { + "getstr", PyCursesWindow_getstr, METH_VARARGS, + _curses_window_getstr__doc__ + }, {"getyx", PyCursesWindow_getyx, METH_NOARGS}, _CURSES_WINDOW_HLINE_METHODDEF {"idcok", PyCursesWindow_idcok, METH_VARARGS}, @@ -2726,7 +2698,10 @@ static PyMethodDef PyCursesWindow_methods[] = { {"insertln", PyCursesWindow_winsertln, METH_NOARGS}, _CURSES_WINDOW_INSNSTR_METHODDEF _CURSES_WINDOW_INSSTR_METHODDEF - {"instr", PyCursesWindow_InStr, METH_VARARGS}, + { + "instr", PyCursesWindow_instr, METH_VARARGS, + _curses_window_instr__doc__ + }, _CURSES_WINDOW_IS_LINETOUCHED_METHODDEF {"is_wintouched", PyCursesWindow_is_wintouched, METH_NOARGS}, {"keypad", PyCursesWindow_keypad, METH_VARARGS}, From c8379c7edf8d2d9e8bb60c343470429809ee067b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 12:29:51 +0200 Subject: [PATCH 0246/1674] [3.14] gh-134559: Add versionadded for ``object.__replace__()`` (GH-134672) (#134699) gh-134559: Add versionadded for ``object.__replace__()`` (GH-134672) (cherry picked from commit 71290a6fbe79cef3773a3af6fcf08d8bf15c8460) Co-authored-by: tmlnv <108088921+tmlnv@users.noreply.github.com> --- Doc/library/copy.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst index 95b41f988a035b..210ad7188003e6 100644 --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -122,6 +122,8 @@ and only supports named tuples created by :func:`~collections.namedtuple`, This method should create a new object of the same type, replacing fields with values from *changes*. + .. versionadded:: 3.13 + .. seealso:: From 072f50fc12ee7e11e84f6d85d8a1b3ad2c65db9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 26 May 2025 12:45:36 +0200 Subject: [PATCH 0247/1674] [3.14] gh-132710: only use stable `_uuid.generate_time_safe()` to deduce MAC address (GH-132901) (#134697) (cherry picked from commit 3bffada46728e51f84c41ecbb0d3722595693e63) --- Lib/test/test_uuid.py | 28 ++++++ Lib/uuid.py | 6 +- Modules/_uuidmodule.c | 40 ++++++-- configure | 209 ++++++++++++++++++++++++++++++++++++++++-- configure.ac | 99 ++++++++++++++++++-- pyconfig.h.in | 3 + 6 files changed, 357 insertions(+), 28 deletions(-) diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 958be5408ce90a..7ddacf07a2c789 100755 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -14,6 +14,7 @@ from test import support from test.support import import_helper +from test.support.script_helper import assert_python_ok py_uuid = import_helper.import_fresh_module('uuid', blocked=['_uuid']) c_uuid = import_helper.import_fresh_module('uuid', fresh=['_uuid']) @@ -1217,10 +1218,37 @@ def test_cli_uuid5_ouputted_with_valid_namespace_and_name(self): class TestUUIDWithoutExtModule(BaseTestUUID, unittest.TestCase): uuid = py_uuid + @unittest.skipUnless(c_uuid, 'requires the C _uuid module') class TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase): uuid = c_uuid + def check_has_stable_libuuid_extractable_node(self): + if not self.uuid._has_stable_extractable_node: + self.skipTest("libuuid cannot deduce MAC address") + + @unittest.skipUnless(os.name == 'posix', 'POSIX only') + def test_unix_getnode_from_libuuid(self): + self.check_has_stable_libuuid_extractable_node() + script = 'import uuid; print(uuid._unix_getnode())' + _, n_a, _ = assert_python_ok('-c', script) + _, n_b, _ = assert_python_ok('-c', script) + n_a, n_b = n_a.decode().strip(), n_b.decode().strip() + self.assertTrue(n_a.isdigit()) + self.assertTrue(n_b.isdigit()) + self.assertEqual(n_a, n_b) + + @unittest.skipUnless(os.name == 'nt', 'Windows only') + def test_windows_getnode_from_libuuid(self): + self.check_has_stable_libuuid_extractable_node() + script = 'import uuid; print(uuid._windll_getnode())' + _, n_a, _ = assert_python_ok('-c', script) + _, n_b, _ = assert_python_ok('-c', script) + n_a, n_b = n_a.decode().strip(), n_b.decode().strip() + self.assertTrue(n_a.isdigit()) + self.assertTrue(n_b.isdigit()) + self.assertEqual(n_a, n_b) + class BaseTestInternals: _uuid = py_uuid diff --git a/Lib/uuid.py b/Lib/uuid.py index 036ffebf67a0be..06f81a7c338372 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -633,22 +633,24 @@ def _netstat_getnode(): try: import _uuid _generate_time_safe = getattr(_uuid, "generate_time_safe", None) + _has_stable_extractable_node = _uuid.has_stable_extractable_node _UuidCreate = getattr(_uuid, "UuidCreate", None) except ImportError: _uuid = None _generate_time_safe = None + _has_stable_extractable_node = False _UuidCreate = None def _unix_getnode(): """Get the hardware address on Unix using the _uuid extension module.""" - if _generate_time_safe: + if _generate_time_safe and _has_stable_extractable_node: uuid_time, _ = _generate_time_safe() return UUID(bytes=uuid_time).node def _windll_getnode(): """Get the hardware address on Windows using the _uuid extension module.""" - if _UuidCreate: + if _UuidCreate and _has_stable_extractable_node: uuid_bytes = _UuidCreate() return UUID(bytes_le=uuid_bytes).node diff --git a/Modules/_uuidmodule.c b/Modules/_uuidmodule.c index c5e78b1510b5e3..c31a7e8fea5608 100644 --- a/Modules/_uuidmodule.c +++ b/Modules/_uuidmodule.c @@ -78,23 +78,47 @@ py_UuidCreate(PyObject *Py_UNUSED(context), return NULL; } +static int +py_windows_has_stable_node(void) +{ + UUID uuid; + RPC_STATUS res; + Py_BEGIN_ALLOW_THREADS + res = UuidCreateSequential(&uuid); + Py_END_ALLOW_THREADS + return res == RPC_S_OK; +} #endif /* MS_WINDOWS */ static int -uuid_exec(PyObject *module) { +uuid_exec(PyObject *module) +{ +#define ADD_INT(NAME, VALUE) \ + do { \ + if (PyModule_AddIntConstant(module, (NAME), (VALUE)) < 0) { \ + return -1; \ + } \ + } while (0) + assert(sizeof(uuid_t) == 16); #if defined(MS_WINDOWS) - int has_uuid_generate_time_safe = 0; + ADD_INT("has_uuid_generate_time_safe", 0); #elif defined(HAVE_UUID_GENERATE_TIME_SAFE) - int has_uuid_generate_time_safe = 1; + ADD_INT("has_uuid_generate_time_safe", 1); #else - int has_uuid_generate_time_safe = 0; + ADD_INT("has_uuid_generate_time_safe", 0); #endif - if (PyModule_AddIntConstant(module, "has_uuid_generate_time_safe", - has_uuid_generate_time_safe) < 0) { - return -1; - } + +#if defined(MS_WINDOWS) + ADD_INT("has_stable_extractable_node", py_windows_has_stable_node()); +#elif defined(HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC) + ADD_INT("has_stable_extractable_node", 1); +#else + ADD_INT("has_stable_extractable_node", 0); +#endif + +#undef ADD_INT return 0; } diff --git a/configure b/configure index 5d21d06014a238..884f8a4b0680d9 100755 --- a/configure +++ b/configure @@ -14052,6 +14052,7 @@ fi + have_uuid=missing for ac_header in uuid.h @@ -14061,6 +14062,7 @@ if test "x$ac_cv_header_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h + for ac_func in uuid_create uuid_enc_be do : as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | sed "$as_sed_sh"` @@ -14070,7 +14072,9 @@ then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_func" | sed "$as_sed_cpp"` 1 _ACEOF - have_uuid=yes + + have_uuid=yes + ac_cv_have_uuid_h=yes LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""} LIBUUID_LIBS=${LIBUUID_LIBS-""} @@ -14160,6 +14164,7 @@ if test "x$ac_cv_header_uuid_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h + ac_cv_have_uuid_uuid_h=yes py_check_lib_save_LIBS=$LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid_generate_time in -luuid" >&5 printf %s "checking for uuid_generate_time in -luuid... " >&6; } @@ -14257,8 +14262,9 @@ fi printf "%s\n" "$ac_cv_lib_uuid_uuid_generate_time_safe" >&6; } if test "x$ac_cv_lib_uuid_uuid_generate_time_safe" = xyes then : - have_uuid=yes - printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE 1" >>confdefs.h + + have_uuid=yes + ac_cv_have_uuid_generate_time_safe=yes fi @@ -14302,6 +14308,7 @@ if test "x$ac_cv_header_uuid_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h + ac_cv_have_uuid_uuid_h=yes py_check_lib_save_LIBS=$LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid_generate_time in -luuid" >&5 printf %s "checking for uuid_generate_time in -luuid... " >&6; } @@ -14399,8 +14406,9 @@ fi printf "%s\n" "$ac_cv_lib_uuid_uuid_generate_time_safe" >&6; } if test "x$ac_cv_lib_uuid_uuid_generate_time_safe" = xyes then : - have_uuid=yes - printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE 1" >>confdefs.h + + have_uuid=yes + ac_cv_have_uuid_generate_time_safe=yes fi @@ -14431,10 +14439,16 @@ else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } have_uuid=yes - printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h - - printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE 1" >>confdefs.h - + ac_cv_have_uuid_generate_time_safe=yes + # The uuid.h file to include may be *or* . + # Since pkg-config --cflags uuid may return -I/usr/include/uuid, + # it's possible to write '#include ' in _uuidmodule.c, + # assuming that the compiler flags are properly updated. + # + # Ideally, we should have defined HAVE_UUID_H if and only if + # #include can be written, *without* assuming extra + # include path. + ac_cv_have_uuid_h=yes fi @@ -14455,6 +14469,7 @@ if test "x$ac_cv_func_uuid_generate_time" = xyes then : have_uuid=yes + ac_cv_have_uuid_uuid_h=yes LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""} LIBUUID_LIBS=${LIBUUID_LIBS-""} @@ -14465,6 +14480,24 @@ fi done +fi + +if test "x$ac_cv_have_uuid_h" = xyes +then : + printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h + +fi +if test "x$ac_cv_have_uuid_uuid_h" = xyes +then : + printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h + +fi +if test "x$ac_cv_have_uuid_generate_time_safe" = xyes +then : + + printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE 1" >>confdefs.h + + fi # gh-124228: While the libuuid library is available on NetBSD, it supports only UUID version 4. @@ -14480,6 +14513,164 @@ then : have_uuid=no fi +# gh-132710: The UUID node is fetched by using libuuid when possible +# and cached. While the node is constant within the same process, +# different interpreters may have different values as libuuid may +# randomize the node value if the latter cannot be deduced. +# +# Consumers may define HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC +# to indicate that libuuid is unstable and should not be relied +# upon to deduce the MAC address. + + +if test "$have_uuid" = "yes" -a "$HAVE_UUID_GENERATE_TIME_SAFE" = "1" +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if uuid_generate_time_safe() node value is stable" >&5 +printf %s "checking if uuid_generate_time_safe() node value is stable... " >&6; } + save_CFLAGS=$CFLAGS +save_CPPFLAGS=$CPPFLAGS +save_LDFLAGS=$LDFLAGS +save_LIBS=$LIBS + + + # Be sure to add the extra include path if we used pkg-config + # as HAVE_UUID_H may be set even though is only reachable + # by adding extra -I flags. + # + # If the following script does not compile, we simply assume that + # libuuid is missing. + CFLAGS="$CFLAGS $LIBUUID_CFLAGS" + LIBS="$LIBS $LIBUUID_LIBS" + if test "$cross_compiling" = yes +then : + + +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include // PRIu64 + #include // uint64_t + #include // fopen(), fclose() + + #ifdef HAVE_UUID_H + #include + #else + #include + #endif + + #define ERR 1 + int main(void) { + uuid_t uuid; // unsigned char[16] + (void)uuid_generate_time_safe(uuid); + uint64_t node = 0; + for (size_t i = 0; i < 6; i++) { + node |= (uint64_t)uuid[15 - i] << (8 * i); + } + FILE *fp = fopen("conftest.out", "w"); + if (fp == NULL) { + return ERR; + } + int rc = fprintf(fp, "%" PRIu64 "\n", node) >= 0; + rc |= fclose(fp); + return rc == 0 ? 0 : ERR; + } +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + py_cv_uuid_node1=`cat conftest.out` + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + +CFLAGS=$save_CFLAGS +CPPFLAGS=$save_CPPFLAGS +LDFLAGS=$save_LDFLAGS +LIBS=$save_LIBS + + + save_CFLAGS=$CFLAGS +save_CPPFLAGS=$CPPFLAGS +save_LDFLAGS=$LDFLAGS +save_LIBS=$LIBS + + + # Be sure to add the extra include path if we used pkg-config + # as HAVE_UUID_H may be set even though is only reachable + # by adding extra -I flags. + # + # If the following script does not compile, we simply assume that + # libuuid is missing. + CFLAGS="$CFLAGS $LIBUUID_CFLAGS" + LIBS="$LIBS $LIBUUID_LIBS" + if test "$cross_compiling" = yes +then : + + +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include // PRIu64 + #include // uint64_t + #include // fopen(), fclose() + + #ifdef HAVE_UUID_H + #include + #else + #include + #endif + + #define ERR 1 + int main(void) { + uuid_t uuid; // unsigned char[16] + (void)uuid_generate_time_safe(uuid); + uint64_t node = 0; + for (size_t i = 0; i < 6; i++) { + node |= (uint64_t)uuid[15 - i] << (8 * i); + } + FILE *fp = fopen("conftest.out", "w"); + if (fp == NULL) { + return ERR; + } + int rc = fprintf(fp, "%" PRIu64 "\n", node) >= 0; + rc |= fclose(fp); + return rc == 0 ? 0 : ERR; + } +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + py_cv_uuid_node2=`cat conftest.out` + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + +CFLAGS=$save_CFLAGS +CPPFLAGS=$save_CPPFLAGS +LDFLAGS=$save_LDFLAGS +LIBS=$save_LIBS + + + if test -n "$py_cv_uuid_node1" -a "$py_cv_uuid_node1" = "$py_cv_uuid_node2" + then + printf "%s\n" "#define HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: stable" >&5 +printf "%s\n" "stable" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unstable" >&5 +printf "%s\n" "unstable" >&6; } + fi +fi + # 'Real Time' functions on Solaris # posix4 on Solaris 2.6 # pthread (first!) on Linux diff --git a/configure.ac b/configure.ac index 8613aa58257f5b..cf25148bad2077 100644 --- a/configure.ac +++ b/configure.ac @@ -3740,15 +3740,17 @@ dnl check for uuid dependencies AH_TEMPLATE([HAVE_UUID_H], [Define to 1 if you have the header file.]) AH_TEMPLATE([HAVE_UUID_UUID_H], [Define to 1 if you have the header file.]) AH_TEMPLATE([HAVE_UUID_GENERATE_TIME_SAFE], [Define if uuid_generate_time_safe() exists.]) +AH_TEMPLATE([HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC], [Define if uuid_generate_time_safe() is able to deduce a MAC address.]) have_uuid=missing dnl AIX provides support for RFC4122 (uuid) in libc.a starting with AIX 6.1 dnl (anno 2007). FreeBSD and OpenBSD provides support in libc as well. dnl Little-endian FreeBSD, OpenBSD and NetBSD needs encoding into an octet dnl stream in big-endian byte-order -AC_CHECK_HEADERS([uuid.h], - [AC_CHECK_FUNCS([uuid_create uuid_enc_be], - [have_uuid=yes +AC_CHECK_HEADERS([uuid.h], [ + AC_CHECK_FUNCS([uuid_create uuid_enc_be], [ + have_uuid=yes + ac_cv_have_uuid_h=yes LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""} LIBUUID_LIBS=${LIBUUID_LIBS-""} ]) @@ -3758,19 +3760,29 @@ AS_VAR_IF([have_uuid], [missing], [ PKG_CHECK_MODULES( [LIBUUID], [uuid >= 2.20], [dnl linux-util's libuuid has uuid_generate_time_safe() since v2.20 (2011) - dnl and provides . + dnl and provides assuming specific include paths are given have_uuid=yes - AC_DEFINE([HAVE_UUID_H], [1]) - AC_DEFINE([HAVE_UUID_GENERATE_TIME_SAFE], [1]) + ac_cv_have_uuid_generate_time_safe=yes + # The uuid.h file to include may be *or* . + # Since pkg-config --cflags uuid may return -I/usr/include/uuid, + # it's possible to write '#include ' in _uuidmodule.c, + # assuming that the compiler flags are properly updated. + # + # Ideally, we should have defined HAVE_UUID_H if and only if + # #include can be written, *without* assuming extra + # include path. + ac_cv_have_uuid_h=yes ], [ WITH_SAVE_ENV([ CPPFLAGS="$CPPFLAGS $LIBUUID_CFLAGS" LIBS="$LIBS $LIBUUID_LIBS" AC_CHECK_HEADERS([uuid/uuid.h], [ + ac_cv_have_uuid_uuid_h=yes PY_CHECK_LIB([uuid], [uuid_generate_time], [have_uuid=yes]) - PY_CHECK_LIB([uuid], [uuid_generate_time_safe], - [have_uuid=yes - AC_DEFINE([HAVE_UUID_GENERATE_TIME_SAFE], [1]) ]) ]) + PY_CHECK_LIB([uuid], [uuid_generate_time_safe], [ + have_uuid=yes + ac_cv_have_uuid_generate_time_safe=yes + ])]) AS_VAR_IF([have_uuid], [yes], [ LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""} LIBUUID_LIBS=${LIBUUID_LIBS-"-luuid"} @@ -3785,12 +3797,19 @@ AS_VAR_IF([have_uuid], [missing], [ AC_CHECK_HEADERS([uuid/uuid.h], [ AC_CHECK_FUNC([uuid_generate_time], [ have_uuid=yes + ac_cv_have_uuid_uuid_h=yes LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""} LIBUUID_LIBS=${LIBUUID_LIBS-""} ]) ]) ]) +AS_VAR_IF([ac_cv_have_uuid_h], [yes], [AC_DEFINE([HAVE_UUID_H], [1])]) +AS_VAR_IF([ac_cv_have_uuid_uuid_h], [yes], [AC_DEFINE([HAVE_UUID_UUID_H], [1])]) +AS_VAR_IF([ac_cv_have_uuid_generate_time_safe], [yes], [ + AC_DEFINE([HAVE_UUID_GENERATE_TIME_SAFE], [1]) +]) + # gh-124228: While the libuuid library is available on NetBSD, it supports only UUID version 4. # This restriction inhibits the proper generation of time-based UUIDs. if test "$ac_sys_system" = "NetBSD"; then @@ -3800,6 +3819,68 @@ fi AS_VAR_IF([have_uuid], [missing], [have_uuid=no]) +# gh-132710: The UUID node is fetched by using libuuid when possible +# and cached. While the node is constant within the same process, +# different interpreters may have different values as libuuid may +# randomize the node value if the latter cannot be deduced. +# +# Consumers may define HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC +# to indicate that libuuid is unstable and should not be relied +# upon to deduce the MAC address. +AC_DEFUN([PY_EXTRACT_UUID_GENERATE_TIME_SAFE_MAC], [WITH_SAVE_ENV([ + # Be sure to add the extra include path if we used pkg-config + # as HAVE_UUID_H may be set even though is only reachable + # by adding extra -I flags. + # + # If the following script does not compile, we simply assume that + # libuuid is missing. + CFLAGS="$CFLAGS $LIBUUID_CFLAGS" + LIBS="$LIBS $LIBUUID_LIBS" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include // PRIu64 + #include // uint64_t + #include // fopen(), fclose() + + #ifdef HAVE_UUID_H + #include + #else + #include + #endif + + #define ERR 1 + int main(void) { + uuid_t uuid; // unsigned char[16] + (void)uuid_generate_time_safe(uuid); + uint64_t node = 0; + for (size_t i = 0; i < 6; i++) { + node |= (uint64_t)uuid[15 - i] << (8 * i); + } + FILE *fp = fopen("conftest.out", "w"); + if (fp == NULL) { + return ERR; + } + int rc = fprintf(fp, "%" PRIu64 "\n", node) >= 0; + rc |= fclose(fp); + return rc == 0 ? 0 : ERR; + }]])], [ + AS_VAR_SET([$1], [`cat conftest.out`]) + ], [], [] + )])]) + +if test "$have_uuid" = "yes" -a "$HAVE_UUID_GENERATE_TIME_SAFE" = "1" +then + AC_MSG_CHECKING([if uuid_generate_time_safe() node value is stable]) + PY_EXTRACT_UUID_GENERATE_TIME_SAFE_MAC([py_cv_uuid_node1]) + PY_EXTRACT_UUID_GENERATE_TIME_SAFE_MAC([py_cv_uuid_node2]) + if test -n "$py_cv_uuid_node1" -a "$py_cv_uuid_node1" = "$py_cv_uuid_node2" + then + AC_DEFINE([HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC], [1]) + AC_MSG_RESULT([stable]) + else + AC_MSG_RESULT([unstable]) + fi +fi + # 'Real Time' functions on Solaris # posix4 on Solaris 2.6 # pthread (first!) on Linux diff --git a/pyconfig.h.in b/pyconfig.h.in index c91facbedf94e5..3dbbda157df70e 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1584,6 +1584,9 @@ /* Define if uuid_generate_time_safe() exists. */ #undef HAVE_UUID_GENERATE_TIME_SAFE +/* Define if uuid_generate_time_safe() is able to deduce a MAC address. */ +#undef HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC + /* Define to 1 if you have the header file. */ #undef HAVE_UUID_H From da3d55403a99a536e5089f8dce435ad2ac8633da Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 12:46:29 +0200 Subject: [PATCH 0248/1674] [3.14] gh-132710: add missing NEWS entry for GH-134697 (GH-134705) (#134707) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-132710: add missing NEWS entry for GH-134697 (GH-134705) (cherry picked from commit 9eb84d83e00070cec3cfe78f1d0c7a7a0fbef30f) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- .../Library/2025-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst diff --git a/Misc/NEWS.d/next/Library/2025-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst b/Misc/NEWS.d/next/Library/2025-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst new file mode 100644 index 00000000000000..b7011517aa9db8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst @@ -0,0 +1,3 @@ +If possible, ensure that :func:`uuid.getnode` returns the same result even +across different processes. Previously, the result was constant only within +the same process. Patch by Bénédikt Tran. From 6c917cb11c3b38b6435c12519153f8323995edf7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 26 May 2025 15:10:37 +0200 Subject: [PATCH 0249/1674] [3.14] gh-91048: Correct Apple platform includes for iOS. (GH-134712) (#134714) Correct Apple platform includes for iOS. (cherry picked from commit 965662ee4a986605b60da470d9e7c1e9a6f922b3) Co-authored-by: Russell Keith-Magee --- Python/remote_debug.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Python/remote_debug.h b/Python/remote_debug.h index dbc6bdd09a693f..6566979bcd0e3e 100644 --- a/Python/remote_debug.h +++ b/Python/remote_debug.h @@ -35,7 +35,7 @@ extern "C" { # include #endif -#if defined(__APPLE__) && TARGET_OS_OSX +#if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX # include # include # include @@ -100,7 +100,7 @@ typedef struct page_cache_entry { // Define a platform-independent process handle structure typedef struct { pid_t pid; -#if defined(__APPLE__) +#if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX mach_port_t task; #elif defined(MS_WINDOWS) HANDLE hProcess; @@ -127,7 +127,7 @@ _Py_RemoteDebug_ClearCache(proc_handle_t *handle) } } -#if defined(__APPLE__) && TARGET_OS_OSX +#if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX static mach_port_t pid_to_task(pid_t pid); #endif @@ -135,7 +135,7 @@ static mach_port_t pid_to_task(pid_t pid); static int _Py_RemoteDebug_InitProcHandle(proc_handle_t *handle, pid_t pid) { handle->pid = pid; -#if defined(__APPLE__) +#if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX handle->task = pid_to_task(handle->pid); #elif defined(MS_WINDOWS) handle->hProcess = OpenProcess( @@ -167,7 +167,7 @@ _Py_RemoteDebug_CleanupProcHandle(proc_handle_t *handle) { _Py_RemoteDebug_FreePageCache(handle); } -#if defined(__APPLE__) && TARGET_OS_OSX +#if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX static uintptr_t return_section_address64( @@ -481,7 +481,7 @@ search_map_for_section(proc_handle_t *handle, const char* secname, const char* s return 0; } -#endif // (__APPLE__ && TARGET_OS_OSX) +#endif // (__APPLE__ && defined(TARGET_OS_OSX) && TARGET_OS_OSX) #if defined(__linux__) && HAVE_PROCESS_VM_READV static uintptr_t @@ -759,7 +759,7 @@ _Py_RemoteDebug_GetPyRuntimeAddress(proc_handle_t* handle) PyErr_SetString(PyExc_RuntimeError, "Failed to find the PyRuntime section in the process."); _PyErr_ChainExceptions1(exc); } -#elif defined(__APPLE__) && TARGET_OS_OSX +#elif defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX // On macOS, try libpython first, then fall back to python address = search_map_for_section(handle, "PyRuntime", "libpython"); if (address == 0) { @@ -810,7 +810,7 @@ _Py_RemoteDebug_ReadRemoteMemory(proc_handle_t *handle, uintptr_t remote_address result += read_bytes; } while ((size_t)read_bytes != local[0].iov_len); return 0; -#elif defined(__APPLE__) && TARGET_OS_OSX +#elif defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX Py_ssize_t result = -1; kern_return_t kr = mach_vm_read_overwrite( handle->task, From 12d3f883ae8aa6297a575511b14fa1e82248427d Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 26 May 2025 16:26:37 +0300 Subject: [PATCH 0250/1674] Python 3.14.0b2 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 301 ++++--- Misc/NEWS.d/3.14.0b2.rst | 766 ++++++++++++++++++ ...-04-16-09-38-48.gh-issue-117088.EFt_5c.rst | 1 - ...-04-30-10-22-08.gh-issue-131769.H0oy5x.rst | 1 - ...-05-21-19-46-28.gh-issue-134455.vdwlrq.rst | 2 - ...-05-17-14-41-21.gh-issue-134144.xVpZik.rst | 1 - ...-04-19-17-16-46.gh-issue-132542.7T_TY_.rst | 2 - ...-05-06-15-01-41.gh-issue-133516.RqWVf2.rst | 2 - ...-05-07-23-26-53.gh-issue-133541.bHIC55.rst | 2 - ...-05-08-13-48-02.gh-issue-132762.tKbygC.rst | 1 - ...-05-09-18-11-21.gh-issue-133778.pWEV3t.rst | 2 - ...-05-10-17-12-27.gh-issue-133703.bVM-re.rst | 1 - ...-05-11-13-40-42.gh-issue-133886.ryBAyo.rst | 2 - ...-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst | 2 - ...-05-16-17-25-52.gh-issue-134100.5-FbLK.rst | 2 - ...-05-16-20-59-12.gh-issue-134119.w8expI.rst | 2 - ...-05-17-20-44-51.gh-issue-134158.ewLNLp.rst | 1 - ...5-05-18-14-33-23.gh-issue-69605.ZMO49F.rst | 2 - ...-05-20-14-41-50.gh-issue-128066.qzzGfv.rst | 3 - ...-05-21-15-14-32.gh-issue-130397.aG6EON.rst | 3 - ...-05-21-18-02-56.gh-issue-127960.W3J_2X.rst | 3 - ...-05-22-14-48-19.gh-issue-134381.2BXhth.rst | 1 - .../2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst | 1 - ...2-07-24-20-56-32.gh-issue-69426.unccw7.rst | 3 - ...3-02-13-21-41-34.gh-issue-86155.ppIGSC.rst | 2 - ...3-02-13-21-56-38.gh-issue-62824.CBZzX3.rst | 1 - ...-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst | 1 - ...5-03-30-16-42-38.gh-issue-91555.ShVtwW.rst | 2 - ...-04-26-15-50-12.gh-issue-133009.etBuz5.rst | 3 - ...-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst | 4 - ...-05-04-17-04-55.gh-issue-132493.huirKi.rst | 2 - ...-05-05-22-11-24.gh-issue-133439.LpmyFz.rst | 2 - ...-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst | 2 - ...-05-07-19-16-41.gh-issue-133581.kERUCJ.rst | 4 - ...-05-09-08-49-03.gh-issue-133701.KI8tGz.rst | 3 - ...-05-09-09-10-34.gh-issue-130328.s9h4By.rst | 2 - ...5-05-09-15-50-00.gh-issue-77057.fV8SU-.rst | 2 - ...-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst | 3 - ...-05-09-19-05-24.gh-issue-133783.1voCnR.rst | 3 - ...-05-09-20-59-24.gh-issue-132641.3qTw44.rst | 1 - ...-05-10-12-06-55.gh-issue-133653.Gb2aG4.rst | 7 - ...-05-12-06-52-10.gh-issue-133925.elInBY.rst | 1 - ...-05-12-20-38-57.gh-issue-133960.Aee79f.rst | 3 - ...5-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst | 3 - ...-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst | 2 - ...-05-15-14-27-01.gh-issue-134062.fRbJet.rst | 3 - ...-05-16-12-40-37.gh-issue-132124.T_5Odx.rst | 6 - ...-05-16-20-10-25.gh-issue-134098.YyTkKr.rst | 2 - ...-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst | 3 - ...-05-17-13-46-20.gh-issue-134097.fgkjE1.rst | 1 - ...-05-17-18-08-35.gh-issue-133890.onn9_X.rst | 2 - ...-05-17-20-23-57.gh-issue-133982.smS7au.rst | 3 - ...5-05-18-12-48-39.gh-issue-62184.y11l10.rst | 2 - ...-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst | 2 - ...-05-19-10-32-11.gh-issue-134152.INJC2j.rst | 2 - ...-05-19-15-05-24.gh-issue-134235.pz9PwV.rst | 2 - ...-05-19-20-59-06.gh-issue-134209.anhTcF.rst | 3 - ...5-05-20-15-13-43.gh-issue-86802.trF7TM.rst | 3 - ...-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst | 1 - ...5-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst | 2 - ...-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst | 1 - ...-05-22-14-12-53.gh-issue-134451.M1rD-j.rst | 1 - ...-05-22-18-14-13.gh-issue-134546.fjLVzK.rst | 1 - ...-05-23-23-43-39.gh-issue-134582.9POq3l.rst | 1 - ...5-05-24-03-10-36.gh-issue-80334.z21cMa.rst | 2 - ...-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst | 3 - ...-01-14-11-19-07.gh-issue-128840.M1doZW.rst | 2 - ...-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst | 2 - ...-05-08-15-06-01.gh-issue-133639.50-kbV.rst | 2 - ...-05-09-04-11-06.gh-issue-133682.-_lwo3.rst | 1 - ...-05-09-14-54-48.gh-issue-133744.LCquu0.rst | 3 - ...-05-19-14-57-46.gh-issue-134215.sbdDK6.rst | 1 - ...-05-08-19-07-26.gh-issue-133626.yFTKYK.rst | 2 - ...-05-13-13-25-27.gh-issue-133779.-YcTBz.rst | 6 - ...5-05-19-03-02-04.gh-issue-76023.vHOf6M.rst | 1 - ...-05-20-21-43-20.gh-issue-130727.-69t4D.rst | 2 - README.rst | 2 +- 78 files changed, 958 insertions(+), 276 deletions(-) create mode 100644 Misc/NEWS.d/3.14.0b2.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-04-16-09-38-48.gh-issue-117088.EFt_5c.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-04-30-10-22-08.gh-issue-131769.H0oy5x.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-05-21-19-46-28.gh-issue-134455.vdwlrq.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-05-17-14-41-21.gh-issue-134144.xVpZik.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-17-16-46.gh-issue-132542.7T_TY_.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-06-15-01-41.gh-issue-133516.RqWVf2.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-07-23-26-53.gh-issue-133541.bHIC55.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-08-13-48-02.gh-issue-132762.tKbygC.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-09-18-11-21.gh-issue-133778.pWEV3t.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-10-17-12-27.gh-issue-133703.bVM-re.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-13-40-42.gh-issue-133886.ryBAyo.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-15-11-38-16.gh-issue-133999.uBZ8uS.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-17-25-52.gh-issue-134100.5-FbLK.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-16-20-59-12.gh-issue-134119.w8expI.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-44-51.gh-issue-134158.ewLNLp.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-18-14-33-23.gh-issue-69605.ZMO49F.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-20-14-41-50.gh-issue-128066.qzzGfv.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-18-02-56.gh-issue-127960.W3J_2X.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-22-14-48-19.gh-issue-134381.2BXhth.rst delete mode 100644 Misc/NEWS.d/next/Library/2017-12-30-18-21-00.bpo-28494.Dt_Wks.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-07-24-20-56-32.gh-issue-69426.unccw7.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-13-21-41-34.gh-issue-86155.ppIGSC.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-13-21-56-38.gh-issue-62824.CBZzX3.rst delete mode 100644 Misc/NEWS.d/next/Library/2024-10-28-06-54-22.gh-issue-125028.GEY8Ws.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-03-30-16-42-38.gh-issue-91555.ShVtwW.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-04-26-15-50-12.gh-issue-133009.etBuz5.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-04-29-11-48-46.gh-issue-132876.lyTQGZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-04-17-04-55.gh-issue-132493.huirKi.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-05-22-11-24.gh-issue-133439.LpmyFz.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-06-22-54-37.gh-issue-133551.rfy1tJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-07-19-16-41.gh-issue-133581.kERUCJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-09-08-49-03.gh-issue-133701.KI8tGz.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-09-09-10-34.gh-issue-130328.s9h4By.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-09-15-50-00.gh-issue-77057.fV8SU-.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-09-18-29-25.gh-issue-133684.Y1DFSt.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-09-19-05-24.gh-issue-133783.1voCnR.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-09-20-59-24.gh-issue-132641.3qTw44.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-10-12-06-55.gh-issue-133653.Gb2aG4.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-12-06-52-10.gh-issue-133925.elInBY.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-12-20-38-57.gh-issue-133960.Aee79f.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-13-18-21-59.gh-issue-71253.-3Sf_K.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-13-18-54-56.gh-issue-133970.6G-Oi6.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-15-14-27-01.gh-issue-134062.fRbJet.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-16-12-40-37.gh-issue-132124.T_5Odx.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-16-20-10-25.gh-issue-134098.YyTkKr.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-17-12-40-12.gh-issue-133889.Eh-zO4.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-17-13-46-20.gh-issue-134097.fgkjE1.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-17-18-08-35.gh-issue-133890.onn9_X.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-17-20-23-57.gh-issue-133982.smS7au.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-18-12-48-39.gh-issue-62184.y11l10.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-18-13-23-29.gh-issue-134168.hgx3Xg.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-19-10-32-11.gh-issue-134152.INJC2j.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-19-15-05-24.gh-issue-134235.pz9PwV.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-19-20-59-06.gh-issue-134209.anhTcF.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-20-15-13-43.gh-issue-86802.trF7TM.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-20-19-16-30.gh-issue-134323.ZQZGvw.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-20-21-45-58.gh-issue-90871.Gkvtp6.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-22-13-10-32.gh-issue-114177.3TYUJ3.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-22-14-12-53.gh-issue-134451.M1rD-j.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-22-18-14-13.gh-issue-134546.fjLVzK.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-23-23-43-39.gh-issue-134582.9POq3l.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-24-03-10-36.gh-issue-80334.z21cMa.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-26-12-31-08.gh-issue-132710.ApU3TZ.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-01-14-11-19-07.gh-issue-128840.M1doZW.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-05-08-15-06-01.gh-issue-133639.50-kbV.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-05-09-04-11-06.gh-issue-133682.-_lwo3.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-05-09-14-54-48.gh-issue-133744.LCquu0.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-05-19-14-57-46.gh-issue-134215.sbdDK6.rst delete mode 100644 Misc/NEWS.d/next/Windows/2025-05-08-19-07-26.gh-issue-133626.yFTKYK.rst delete mode 100644 Misc/NEWS.d/next/Windows/2025-05-13-13-25-27.gh-issue-133779.-YcTBz.rst delete mode 100644 Misc/NEWS.d/next/Windows/2025-05-19-03-02-04.gh-issue-76023.vHOf6M.rst delete mode 100644 Misc/NEWS.d/next/Windows/2025-05-20-21-43-20.gh-issue-130727.-69t4D.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 03ac5843b62066..aba26718b2e857 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -21,10 +21,10 @@ #define PY_MINOR_VERSION 14 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_SERIAL 2 /* Version as a string */ -#define PY_VERSION "3.14.0b1+" +#define PY_VERSION "3.14.0b2" /*--end constants--*/ diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 5f7e14a79d3356..804b15e9e2dcbd 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Tue May 6 18:33:44 2025 +# Autogenerated by Sphinx on Mon May 26 16:26:41 2025 # as part of the release process. topics = { @@ -435,9 +435,9 @@ async def func(param1, param2): 'atom-identifiers': r'''Identifiers (Names) ******************* -An identifier occurring as an atom is a name. See section Identifiers -and keywords for lexical definition and section Naming and binding for -documentation of naming and binding. +An identifier occurring as an atom is a name. See section Names +(identifiers and keywords) for lexical definition and section Naming +and binding for documentation of naming and binding. When the name is bound to an object, evaluation of the atom yields that object. When a name is not bound, an attempt to evaluate it @@ -1724,16 +1724,16 @@ class attributes; they are shared by instances. Instance attributes The "for" statement is used to iterate over the elements of a sequence (such as a string, tuple or list) or other iterable object: - for_stmt: "for" target_list "in" starred_list ":" suite + for_stmt: "for" target_list "in" starred_expression_list ":" suite ["else" ":" suite] -The "starred_list" expression is evaluated once; it should yield an -*iterable* object. An *iterator* is created for that iterable. The -first item provided by the iterator is then assigned to the target -list using the standard rules for assignments (see Assignment -statements), and the suite is executed. This repeats for each item -provided by the iterator. When the iterator is exhausted, the suite -in the "else" clause, if present, is executed, and the loop +The "starred_expression_list" expression is evaluated once; it should +yield an *iterable* object. An *iterator* is created for that +iterable. The first item provided by the iterator is then assigned to +the target list using the standard rules for assignments (see +Assignment statements), and the suite is executed. This repeats for +each item provided by the iterator. When the iterator is exhausted, +the suite in the "else" clause, if present, is executed, and the loop terminates. A "break" statement executed in the first suite terminates the loop @@ -3304,7 +3304,7 @@ def f() -> annotation: ... introspects and uses the annotations (such as "dataclasses" or "functools.singledispatch()"). -By default, annotations are lazily evaluated in a annotation scope. +By default, annotations are lazily evaluated in an annotation scope. This means that they are not evaluated when the code containing the annotation is evaluated. Instead, the interpreter saves information that can be used to evaluate the annotation later if requested. The @@ -3318,6 +3318,12 @@ def f() -> annotation: ... >>> f.__annotations__ {'param': 'annotation'} +This future statement will be deprecated and removed in a future +version of Python, but not before Python 3.13 reaches its end of life +(see **PEP 749**). When it is used, introspection tools like +"annotationlib.get_annotations()" and "typing.get_type_hints()" are +less likely to be able to resolve annotations at runtime. + -[ Footnotes ]- [1] The exception is propagated to the invocation stack unless there @@ -3832,7 +3838,7 @@ def double(x): You can also invoke "pdb" from the command line to debug other scripts. For example: - python -m pdb [-c command] (-m module | pyfile) [args ...] + python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...] When invoked as a module, pdb will automatically enter post-mortem debugging if the program being debugged exits abnormally. After post- @@ -3856,6 +3862,23 @@ def double(x): Changed in version 3.7: Added the "-m" option. +-p, --pid + + Attach to the process with the specified PID. + + Added in version 3.14. + +To attach to a running Python process for remote debugging, use the +"-p" or "--pid" option with the target process’s PID: + + python -m pdb -p 1234 + +Note: + + Attaching to a process that is blocked in a system call or waiting + for I/O will only work once the next bytecode instruction is + executed or when the process receives a signal. + Typical usage to execute a statement under control of the debugger is: >>> import pdb @@ -5077,7 +5100,7 @@ class of the instance or a *non-virtual base class* thereof. The 'exprlists': r'''Expression lists **************** - starred_expression: ["*"] or_expr + starred_expression: "*" or_expr | expression flexible_expression: assignment_expression | starred_expression flexible_expression_list: flexible_expression ("," flexible_expression)* [","] starred_expression_list: starred_expression ("," starred_expression)* [","] @@ -5138,16 +5161,16 @@ class of the instance or a *non-virtual base class* thereof. The The "for" statement is used to iterate over the elements of a sequence (such as a string, tuple or list) or other iterable object: - for_stmt: "for" target_list "in" starred_list ":" suite + for_stmt: "for" target_list "in" starred_expression_list ":" suite ["else" ":" suite] -The "starred_list" expression is evaluated once; it should yield an -*iterable* object. An *iterator* is created for that iterable. The -first item provided by the iterator is then assigned to the target -list using the standard rules for assignments (see Assignment -statements), and the suite is executed. This repeats for each item -provided by the iterator. When the iterator is exhausted, the suite -in the "else" clause, if present, is executed, and the loop +The "starred_expression_list" expression is evaluated once; it should +yield an *iterable* object. An *iterator* is created for that +iterable. The first item provided by the iterator is then assigned to +the target list using the standard rules for assignments (see +Assignment statements), and the suite is executed. This repeats for +each item provided by the iterator. When the iterator is exhausted, +the suite in the "else" clause, if present, is executed, and the loop terminates. A "break" statement executed in the first suite terminates the loop @@ -5942,73 +5965,92 @@ class body. A "SyntaxError" is raised if a variable is used or to help avoid name clashes between “private” attributes of base and derived classes. See section Identifiers (Names). ''', - 'identifiers': r'''Identifiers and keywords -************************ + 'identifiers': r'''Names (identifiers and keywords) +******************************** -Identifiers (also referred to as *names*) are described by the -following lexical definitions. - -The syntax of identifiers in Python is based on the Unicode standard -annex UAX-31, with elaboration and changes as defined below; see also -**PEP 3131** for further details. +"NAME" tokens represent *identifiers*, *keywords*, and *soft +keywords*. Within the ASCII range (U+0001..U+007F), the valid characters for -identifiers 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 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 "unicodedata" module. +names include the uppercase and lowercase letters ("A-Z" and "a-z"), +the underscore "_" and, except for the first character, the digits "0" +through "9". + +Names must contain at least one character, but have no upper length +limit. Case is significant. + +Besides "A-Z", "a-z", "_" and "0-9", names can also use “letter-like” +and “number-like” characters from outside the ASCII range, as detailed +below. + +All identifiers are converted into the normalization form NFKC while +parsing; comparison of identifiers is based on NFKC. + +Formally, the first character of a normalized identifier must belong +to the set "id_start", which is the union of: -Identifiers are unlimited in length. Case is significant. +* Unicode category "" - uppercase letters (includes "A" to "Z") - identifier: xid_start xid_continue* - id_start: - id_continue: - xid_start: - xid_continue: +* Unicode category "" - lowercase letters (includes "a" to "z") -The Unicode category codes mentioned above stand for: +* Unicode category "" - titlecase letters -* *Lu* - uppercase letters +* Unicode category "" - modifier letters -* *Ll* - lowercase letters +* Unicode category "" - other letters -* *Lt* - titlecase letters +* Unicode category "" - letter numbers -* *Lm* - modifier letters +* {""_""} - the underscore -* *Lo* - other letters +* "" - an explicit set of characters in PropList.txt + to support backwards compatibility -* *Nl* - letter numbers +The remaining characters must belong to the set "id_continue", which +is the union of: -* *Mn* - nonspacing marks +* all characters in "id_start" -* *Mc* - spacing combining marks +* Unicode category "" - decimal numbers (includes "0" to "9") -* *Nd* - decimal numbers +* Unicode category "" - connector punctuations -* *Pc* - connector punctuations +* Unicode category "" - nonspacing marks -* *Other_ID_Start* - explicit list of characters in PropList.txt to - support backwards compatibility +* Unicode category "" - spacing combining marks -* *Other_ID_Continue* - likewise +* "" - another explicit set of characters in + PropList.txt to support backwards compatibility + +Unicode categories use the version of the Unicode Character Database +as included in the "unicodedata" module. + +These sets are based on the Unicode standard annex UAX-31. See also +**PEP 3131** for further details. + +Even more formally, names are described by the following lexical +definitions: -All identifiers are converted into the normal form NFKC while parsing; -comparison of identifiers is based on NFKC. + NAME: xid_start xid_continue* + id_start: | | | | | | "_" | + id_continue: id_start | | | | | + xid_start: + xid_continue: + identifier: -A non-normative HTML file listing all valid identifier characters for -Unicode 16.0.0 can be found at -https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt +A non-normative listing of all valid identifier characters as defined +by Unicode is available in the DerivedCoreProperties.txt file in the +Unicode Character Database. Keywords ======== -The following identifiers are used as reserved words, or *keywords* of -the language, and cannot be used as ordinary identifiers. They must -be spelled exactly as written here: +The following names are used as reserved words, or *keywords* of the +language, and cannot be used as ordinary identifiers. They must be +spelled exactly as written here: False await else import pass None break except in raise @@ -6024,18 +6066,20 @@ class body. A "SyntaxError" is raised if a variable is used or Added in version 3.10. -Some identifiers are only reserved under specific contexts. These are -known as *soft keywords*. The identifiers "match", "case", "type" and -"_" can syntactically act as keywords in certain contexts, but this -distinction is done at the parser level, not when tokenizing. +Some names are only reserved under specific contexts. These are known +as *soft keywords*: + +* "match", "case", and "_", when used in the "match" statement. + +* "type", when used in the "type" statement. + +These syntactically act as keywords in their specific contexts, but +this distinction is done at the parser level, not when tokenizing. As soft keywords, their use in the grammar is possible while still preserving compatibility with existing code that uses these names as identifier names. -"match", "case", and "_" are used in the "match" statement. "type" is -used in the "type" statement. - Changed in version 3.12: "type" is now a soft keyword. @@ -6807,9 +6851,9 @@ class that has an "__rsub__()" method, "type(y).__rsub__(y, x)" is third argument if the three-argument version of the built-in "pow()" function is to be supported. - Changed in version 3.14.0a7 (unreleased): Three-argument "pow()" - now try calling "__rpow__()" if necessary. Previously it was only - called in two-argument "pow()" and the binary power operator. + Changed in version 3.14: Three-argument "pow()" now try calling + "__rpow__()" if necessary. Previously it was only called in two- + argument "pow()" and the binary power operator. Note: @@ -8845,9 +8889,9 @@ class that has an "__rsub__()" method, "type(y).__rsub__(y, x)" is third argument if the three-argument version of the built-in "pow()" function is to be supported. - Changed in version 3.14.0a7 (unreleased): Three-argument "pow()" - now try calling "__rpow__()" if necessary. Previously it was only - called in two-argument "pow()" and the binary power operator. + Changed in version 3.14: Three-argument "pow()" now try calling + "__rpow__()" if necessary. Previously it was only called in two- + argument "pow()" and the binary power operator. Note: @@ -9215,7 +9259,14 @@ class is used in a class pattern with positional arguments, each Return centered in a string of length *width*. Padding is done using the specified *fillchar* (default is an ASCII space). The original string is returned if *width* is less than or equal to - "len(s)". + "len(s)". For example: + + >>> 'Python'.center(10) + ' Python ' + >>> 'Python'.center(10, '-') + '--Python--' + >>> 'Python'.center(4) + 'Python' str.count(sub[, start[, end]]) @@ -9224,7 +9275,18 @@ class is used in a class pattern with positional arguments, each *end* are interpreted as in slice notation. If *sub* is empty, returns the number of empty strings between - characters which is the length of the string plus one. + characters which is the length of the string plus one. For example: + + >>> 'spam, spam, spam'.count('spam') + 3 + >>> 'spam, spam, spam'.count('spam', 5) + 2 + >>> 'spam, spam, spam'.count('spam', 5, 10) + 1 + >>> 'spam, spam, spam'.count('eggs') + 0 + >>> 'spam, spam, spam'.count('') + 17 str.encode(encoding='utf-8', errors='strict') @@ -9389,7 +9451,7 @@ class is used in a class pattern with positional arguments, each str.isidentifier() Return "True" if the string is a valid identifier according to the - language definition, section Identifiers and keywords. + language definition, section Names (identifiers and keywords). "keyword.iskeyword()" can be used to test whether string "s" is a reserved identifier, such as "def" and "class". @@ -9421,8 +9483,8 @@ class is used in a class pattern with positional arguments, each str.isprintable() - Return true if all characters in the string are printable, false if - it contains at least one non-printable character. + Return "True" if all characters in the string are printable, + "False" if it contains at least one non-printable character. Here “printable” means the character is suitable for "repr()" to use in its output; “non-printable” means that "repr()" on built-in @@ -9669,6 +9731,18 @@ class is used in a class pattern with positional arguments, each >>> ' 1 2 3 '.split() ['1', '2', '3'] + If *sep* is not specified or is "None" and *maxsplit* is "0", only + leading runs of consecutive whitespace are considered. + + For example: + + >>> "".split(None, 0) + [] + >>> " ".split(None, 0) + [] + >>> " foo ".split(maxsplit=0) + ['foo '] + str.splitlines(keepends=False) Return a list of the lines in the string, breaking at line @@ -11724,8 +11798,15 @@ class dict(iterable, **kwargs) the keyword argument replaces the value from the positional argument. - To illustrate, the following examples all return a dictionary equal - to "{"one": 1, "two": 2, "three": 3}": + Providing keyword arguments as in the first example only works for + keys that are valid Python identifiers. Otherwise, any valid keys + can be used. + + Dictionaries compare equal if and only if they have the same "(key, + value)" pairs (regardless of ordering). Order comparisons (‘<’, + ‘<=’, ‘>=’, ‘>’) raise "TypeError". To illustrate dictionary + creation and equality, the following examples all return a + dictionary equal to "{"one": 1, "two": 2, "three": 3}": >>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} @@ -11740,6 +11821,29 @@ class dict(iterable, **kwargs) keys that are valid Python identifiers. Otherwise, any valid keys can be used. + Dictionaries preserve insertion order. Note that updating a key + does not affect the order. Keys added after deletion are inserted + at the end. + + >>> d = {"one": 1, "two": 2, "three": 3, "four": 4} + >>> d + {'one': 1, 'two': 2, 'three': 3, 'four': 4} + >>> list(d) + ['one', 'two', 'three', 'four'] + >>> list(d.values()) + [1, 2, 3, 4] + >>> d["one"] = 42 + >>> d + {'one': 42, 'two': 2, 'three': 3, 'four': 4} + >>> del d["two"] + >>> d["two"] = None + >>> d + {'one': 42, 'three': 3, 'four': 4, 'two': None} + + Changed in version 3.7: Dictionary order is guaranteed to be + insertion order. This behavior was an implementation detail of + CPython from 3.6. + These are the operations that dictionaries support (and therefore, custom mapping types should support too): @@ -11910,33 +12014,6 @@ class dict(iterable, **kwargs) Added in version 3.9. - Dictionaries compare equal if and only if they have the same "(key, - value)" pairs (regardless of ordering). Order comparisons (‘<’, - ‘<=’, ‘>=’, ‘>’) raise "TypeError". - - Dictionaries preserve insertion order. Note that updating a key - does not affect the order. Keys added after deletion are inserted - at the end. - - >>> d = {"one": 1, "two": 2, "three": 3, "four": 4} - >>> d - {'one': 1, 'two': 2, 'three': 3, 'four': 4} - >>> list(d) - ['one', 'two', 'three', 'four'] - >>> list(d.values()) - [1, 2, 3, 4] - >>> d["one"] = 42 - >>> d - {'one': 42, 'two': 2, 'three': 3, 'four': 4} - >>> del d["two"] - >>> d["two"] = None - >>> d - {'one': 42, 'three': 3, 'four': 4, 'two': None} - - Changed in version 3.7: Dictionary order is guaranteed to be - insertion order. This behavior was an implementation detail of - CPython from 3.6. - Dictionaries and dictionary views are reversible. >>> d = {"one": 1, "two": 2, "three": 3, "four": 4} diff --git a/Misc/NEWS.d/3.14.0b2.rst b/Misc/NEWS.d/3.14.0b2.rst new file mode 100644 index 00000000000000..0ab8dd4d470a42 --- /dev/null +++ b/Misc/NEWS.d/3.14.0b2.rst @@ -0,0 +1,766 @@ +.. date: 2025-05-20-21-43-20 +.. gh-issue: 130727 +.. nonce: -69t4D +.. release date: 2025-05-26 +.. section: Windows + +Fix a race in internal calls into WMI that can result in an "invalid handle" +exception under high load. Patch by Chris Eibl. + +.. + +.. date: 2025-05-19-03-02-04 +.. gh-issue: 76023 +.. nonce: vHOf6M +.. section: Windows + +Make :func:`os.path.realpath` ignore Windows error 1005 when in non-strict +mode. + +.. + +.. date: 2025-05-13-13-25-27 +.. gh-issue: 133779 +.. nonce: -YcTBz +.. section: Windows + +Reverts the change to generate different :file:`pyconfig.h` files based on +compiler settings, as it was frequently causing extension builds to break. +In particular, the ``Py_GIL_DISABLED`` preprocessor variable must now always +be defined explicitly when compiling for the experimental free-threaded +runtime. The :func:`sysconfig.get_config_var` function can be used to +determine whether the current runtime was compiled with that flag or not. + +.. + +.. date: 2025-05-08-19-07-26 +.. gh-issue: 133626 +.. nonce: yFTKYK +.. section: Windows + +Ensures packages are not accidentally bundled into the traditional +installer. + +.. + +.. date: 2025-05-19-14-57-46 +.. gh-issue: 134215 +.. nonce: sbdDK6 +.. section: Tools/Demos + +:term:`REPL` import autocomplete only suggests private modules when +explicitly specified. + +.. + +.. date: 2025-05-09-14-54-48 +.. gh-issue: 133744 +.. nonce: LCquu0 +.. section: Tests + +Fix multiprocessing interrupt test. Add an event to synchronize the parent +process with the child process: wait until the child process starts +sleeping. Patch by Victor Stinner. + +.. + +.. date: 2025-05-09-04-11-06 +.. gh-issue: 133682 +.. nonce: -_lwo3 +.. section: Tests + +Fixed test case ``test.test_annotationlib.TestStringFormat.test_displays`` +which ensures proper handling of complex data structures (lists, sets, +dictionaries, and tuples) in string annotations. + +.. + +.. date: 2025-05-08-15-06-01 +.. gh-issue: 133639 +.. nonce: 50-kbV +.. section: Tests + +Fix ``TestPyReplAutoindent.test_auto_indent_default()`` doesn't run +``input_code``. + +.. + +.. date: 2025-05-09-20-22-54 +.. gh-issue: 133767 +.. nonce: kN2i3Q +.. section: Security + +Fix use-after-free in the "unicode-escape" decoder with a non-"strict" error +handler. + +.. + +.. date: 2025-01-14-11-19-07 +.. gh-issue: 128840 +.. nonce: M1doZW +.. section: Security + +Short-circuit the processing of long IPv6 addresses early in +:mod:`ipaddress` to prevent excessive memory consumption and a minor +denial-of-service. + +.. + +.. date: 2025-05-26-12-31-08 +.. gh-issue: 132710 +.. nonce: ApU3TZ +.. section: Library + +If possible, ensure that :func:`uuid.getnode` returns the same result even +across different processes. Previously, the result was constant only within +the same process. Patch by Bénédikt Tran. + +.. + +.. date: 2025-05-24-03-10-36 +.. gh-issue: 80334 +.. nonce: z21cMa +.. section: Library + +:func:`multiprocessing.freeze_support` now checks for work on any "spawn" +start method platform rather than only on Windows. + +.. + +.. date: 2025-05-23-23-43-39 +.. gh-issue: 134582 +.. nonce: 9POq3l +.. section: Library + +Fix tokenize.untokenize() round-trip errors related to t-strings braces +escaping + +.. + +.. date: 2025-05-22-18-14-13 +.. gh-issue: 134546 +.. nonce: fjLVzK +.. section: Library + +Ensure :mod:`pdb` remote debugging script is readable by remote Python +process. + +.. + +.. date: 2025-05-22-14-12-53 +.. gh-issue: 134451 +.. nonce: M1rD-j +.. section: Library + +Converted ``asyncio.tools.CycleFoundException`` from dataclass to a regular +exception type. + +.. + +.. date: 2025-05-22-13-10-32 +.. gh-issue: 114177 +.. nonce: 3TYUJ3 +.. section: Library + +Fix :mod:`asyncio` to not close subprocess pipes which would otherwise error +out when the event loop is already closed. + +.. + +.. date: 2025-05-20-21-45-58 +.. gh-issue: 90871 +.. nonce: Gkvtp6 +.. section: Library + +Fixed an off by one error concerning the backlog parameter in +:meth:`~asyncio.loop.create_unix_server`. Contributed by Christian Harries. + +.. + +.. date: 2025-05-20-19-16-30 +.. gh-issue: 134323 +.. nonce: ZQZGvw +.. section: Library + +Fix the :meth:`threading.RLock.locked` method. + +.. + +.. date: 2025-05-20-15-13-43 +.. gh-issue: 86802 +.. nonce: trF7TM +.. section: Library + +Fixed asyncio memory leak in cancelled shield tasks. For shielded tasks +where the shield was cancelled, log potential exceptions through the +exception handler. Contributed by Christian Harries. + +.. + +.. date: 2025-05-19-20-59-06 +.. gh-issue: 134209 +.. nonce: anhTcF +.. section: Library + +:mod:`curses`: The :meth:`curses.window.instr` and +:meth:`curses.window.getstr` methods now allocate their internal buffer on +the heap instead of the stack; in addition, the max buffer size is increased +from 1023 to 2047. + +.. + +.. date: 2025-05-19-15-05-24 +.. gh-issue: 134235 +.. nonce: pz9PwV +.. section: Library + +Updated tab completion on REPL to include builtin modules. Contributed by +Tom Wang, Hunter Young + +.. + +.. date: 2025-05-19-10-32-11 +.. gh-issue: 134152 +.. nonce: INJC2j +.. section: Library + +Fixed :exc:`UnboundLocalError` that could occur during :mod:`email` header +parsing if an expected trailing delimiter is missing in some contexts. + +.. + +.. date: 2025-05-18-13-23-29 +.. gh-issue: 134168 +.. nonce: hgx3Xg +.. section: Library + +:mod:`http.server`: Fix IPv6 address binding and :option:`--directory +` handling when using HTTPS. + +.. + +.. date: 2025-05-18-12-48-39 +.. gh-issue: 62184 +.. nonce: y11l10 +.. section: Library + +Remove import of C implementation of :class:`io.FileIO` from Python +implementation which has its own implementation + +.. + +.. date: 2025-05-17-20-23-57 +.. gh-issue: 133982 +.. nonce: smS7au +.. section: Library + +Emit :exc:`RuntimeWarning` in the Python implementation of :mod:`io` when +the :term:`file-like object ` is not closed explicitly in the +presence of multiple I/O layers. + +.. + +.. date: 2025-05-17-18-08-35 +.. gh-issue: 133890 +.. nonce: onn9_X +.. section: Library + +The :mod:`tarfile` module now handles :exc:`UnicodeEncodeError` in the same +way as :exc:`OSError` when cannot extract a member. + +.. + +.. date: 2025-05-17-13-46-20 +.. gh-issue: 134097 +.. nonce: fgkjE1 +.. section: Library + +Fix interaction of the new :term:`REPL` and :option:`-X showrefcount <-X>` +command line option. + +.. + +.. date: 2025-05-17-12-40-12 +.. gh-issue: 133889 +.. nonce: Eh-zO4 +.. section: Library + +The generated directory listing page in +:class:`http.server.SimpleHTTPRequestHandler` now only shows the decoded +path component of the requested URL, and not the query and fragment. + +.. + +.. date: 2025-05-16-20-10-25 +.. gh-issue: 134098 +.. nonce: YyTkKr +.. section: Library + +Fix handling paths that end with a percent-encoded slash (``%2f`` or +``%2F``) in :class:`http.server.SimpleHTTPRequestHandler`. + +.. + +.. date: 2025-05-16-12-40-37 +.. gh-issue: 132124 +.. nonce: T_5Odx +.. section: Library + +On POSIX-compliant systems, :func:`!multiprocessing.util.get_temp_dir` now +ignores :envvar:`TMPDIR` (and similar environment variables) if the path +length of ``AF_UNIX`` socket files exceeds the platform-specific maximum +length when using the :ref:`forkserver +` start method. Patch by Bénédikt +Tran. + +.. + +.. date: 2025-05-15-14-27-01 +.. gh-issue: 134062 +.. nonce: fRbJet +.. section: Library + +:mod:`ipaddress`: fix collisions in :meth:`~object.__hash__` for +:class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network` objects. + +.. + +.. date: 2025-05-13-18-54-56 +.. gh-issue: 133970 +.. nonce: 6G-Oi6 +.. section: Library + +Make :class:`!string.templatelib.Template` and +:class:`!string.templatelib.Interpolation` generic. + +.. + +.. date: 2025-05-13-18-21-59 +.. gh-issue: 71253 +.. nonce: -3Sf_K +.. section: Library + +Raise :exc:`ValueError` in :func:`open` if *opener* returns a negative +file-descriptor in the Python implementation of :mod:`io` to match the C +implementation. + +.. + +.. date: 2025-05-12-20-38-57 +.. gh-issue: 133960 +.. nonce: Aee79f +.. section: Library + +Simplify and improve :func:`typing.evaluate_forward_ref`. It now no longer +raises errors on certain invalid types. In several situations, it is now +able to evaluate forward references that were previously unsupported. + +.. + +.. date: 2025-05-12-06-52-10 +.. gh-issue: 133925 +.. nonce: elInBY +.. section: Library + +Make the private class ``typing._UnionGenericAlias`` hashable. + +.. + +.. date: 2025-05-10-12-06-55 +.. gh-issue: 133653 +.. nonce: Gb2aG4 +.. section: Library + +Fix :class:`argparse.ArgumentParser` with the *formatter_class* argument. +Fix TypeError when *formatter_class* is a custom subclass of +:class:`!HelpFormatter`. Fix TypeError when *formatter_class* is not a +subclass of :class:`!HelpFormatter` and non-standard *prefix_char* is used. +Fix support of colorizing when *formatter_class* is not a subclass of +:class:`!HelpFormatter`. + +.. + +.. date: 2025-05-09-20-59-24 +.. gh-issue: 132641 +.. nonce: 3qTw44 +.. section: Library + +Fixed a race in :func:`functools.lru_cache` under free-threading. + +.. + +.. date: 2025-05-09-19-05-24 +.. gh-issue: 133783 +.. nonce: 1voCnR +.. section: Library + +Fix bug with applying :func:`copy.replace` to :mod:`ast` objects. Attributes +that default to ``None`` were incorrectly treated as required for manually +created AST nodes. + +.. + +.. date: 2025-05-09-18-29-25 +.. gh-issue: 133684 +.. nonce: Y1DFSt +.. section: Library + +Fix bug where :func:`annotationlib.get_annotations` would return the wrong +result for certain classes that are part of a class hierarchy where ``from +__future__ import annotations`` is used. + +.. + +.. date: 2025-05-09-15-50-00 +.. gh-issue: 77057 +.. nonce: fV8SU- +.. section: Library + +Fix handling of invalid markup declarations in +:class:`html.parser.HTMLParser`. + +.. + +.. date: 2025-05-09-09-10-34 +.. gh-issue: 130328 +.. nonce: s9h4By +.. section: Library + +Speedup pasting in ``PyREPL`` on Windows in a legacy console. Patch by Chris +Eibl. + +.. + +.. date: 2025-05-09-08-49-03 +.. gh-issue: 133701 +.. nonce: KI8tGz +.. section: Library + +Fix bug where :class:`typing.TypedDict` classes defined under ``from +__future__ import annotations`` and inheriting from another ``TypedDict`` +had an incorrect ``__annotations__`` attribute. + +.. + +.. date: 2025-05-07-19-16-41 +.. gh-issue: 133581 +.. nonce: kERUCJ +.. section: Library + +Improve unparsing of t-strings in :func:`ast.unparse` and ``from __future__ +import annotations``. Empty t-strings now round-trip correctly and +formatting in interpolations is preserved. Patch by Jelle Zijlstra. + +.. + +.. date: 2025-05-06-22-54-37 +.. gh-issue: 133551 +.. nonce: rfy1tJ +.. section: Library + +Support t-strings (:pep:`750`) in :mod:`annotationlib`. Patch by Jelle +Zijlstra. + +.. + +.. date: 2025-05-05-22-11-24 +.. gh-issue: 133439 +.. nonce: LpmyFz +.. section: Library + +Fix dot commands with trailing spaces are mistaken for multi-line SQL +statements in the sqlite3 command-line interface. + +.. + +.. date: 2025-05-04-17-04-55 +.. gh-issue: 132493 +.. nonce: huirKi +.. section: Library + +Avoid accessing ``__annotations__`` unnecessarily in +:func:`inspect.signature`. + +.. + +.. date: 2025-04-29-11-48-46 +.. gh-issue: 132876 +.. nonce: lyTQGZ +.. section: Library + +``ldexp()`` on Windows doesn't round subnormal results before Windows 11, +but should. Python's :func:`math.ldexp` wrapper now does round them, so +results may change slightly, in rare cases of very small results, on Windows +versions before 11. + +.. + +.. date: 2025-04-26-15-50-12 +.. gh-issue: 133009 +.. nonce: etBuz5 +.. section: Library + +:mod:`xml.etree.ElementTree`: Fix a crash in :meth:`Element.__deepcopy__ +` when the element is concurrently mutated. Patch by +Bénédikt Tran. + +.. + +.. date: 2025-03-30-16-42-38 +.. gh-issue: 91555 +.. nonce: ShVtwW +.. section: Library + +Ignore log messages generated during handling of log messages, to avoid +deadlock or infinite recursion. + +.. + +.. date: 2024-10-28-06-54-22 +.. gh-issue: 125028 +.. nonce: GEY8Ws +.. section: Library + +:data:`functools.Placeholder` cannot be passed to :func:`functools.partial` +as a keyword argument. + +.. + +.. date: 2023-02-13-21-56-38 +.. gh-issue: 62824 +.. nonce: CBZzX3 +.. section: Library + +Fix aliases for ``iso8859_8`` encoding. Patch by Dave Goncalves. + +.. + +.. date: 2023-02-13-21-41-34 +.. gh-issue: 86155 +.. nonce: ppIGSC +.. section: Library + +:meth:`html.parser.HTMLParser.close` no longer loses data when the +```. * Multiple slashes and whitespaces between the last attribute and closing `>` are now ignored in both start and end tags. E.g. ``. * Multiple `=` between attribute name and value are no longer collapsed. E.g. `` produces attribute "foo" with value "=bar". * Whitespaces between the `=` separator and attribute name or value are no longer ignored. E.g. `` produces two attributes "foo" and "=bar", both with value None; `` produces two attributes: "foo" with value "" and "bar" with value None. --------- (cherry picked from commit 0243f97cbadec8d985e63b1daec5d1cbc850cae3) Co-authored-by: Serhiy Storchaka Co-authored-by: Ezio Melotti --- Lib/html/parser.py | 143 ++++++++-------- Lib/test/test_htmlparser.py | 155 +++++++++++------- ...-06-25-14-13-39.gh-issue-135661.idjQ0B.rst | 25 +++ 3 files changed, 194 insertions(+), 129 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst diff --git a/Lib/html/parser.py b/Lib/html/parser.py index ba416e7fa6e3fe..cc15de07b5bae6 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -31,15 +31,43 @@ piclose = re.compile('>') commentclose = re.compile(r'--\s*>') # Note: -# 1) if you change tagfind/attrfind remember to update locatestarttagend too; -# 2) if you change tagfind/attrfind and/or locatestarttagend the parser will +# 1) if you change tagfind/attrfind remember to update locatetagend too; +# 2) if you change tagfind/attrfind and/or locatetagend the parser will # explode, so don't do it. -# see http://www.w3.org/TR/html5/tokenization.html#tag-open-state -# and http://www.w3.org/TR/html5/tokenization.html#tag-name-state -tagfind_tolerant = re.compile(r'([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*') -attrfind_tolerant = re.compile( - r'((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' - r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') +# see the HTML5 specs section "13.2.5.6 Tag open state", +# "13.2.5.8 Tag name state" and "13.2.5.33 Attribute name state". +# https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state +# https://html.spec.whatwg.org/multipage/parsing.html#tag-name-state +# https://html.spec.whatwg.org/multipage/parsing.html#attribute-name-state +tagfind_tolerant = re.compile(r'([a-zA-Z][^\t\n\r\f />]*)(?:[\t\n\r\f ]|/(?!>))*') +attrfind_tolerant = re.compile(r""" + ( + (?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name + ) + (= # value indicator + ('[^']*' # LITA-enclosed value + |"[^"]*" # LIT-enclosed value + |(?!['"])[^>\t\n\r\f ]* # bare value + ) + )? + (?:[\t\n\r\f ]|/(?!>))* # possibly followed by a space +""", re.VERBOSE) +locatetagend = re.compile(r""" + [a-zA-Z][^\t\n\r\f />]* # tag name + [\t\n\r\f /]* # optional whitespace before attribute name + (?:(?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name + (?:= # value indicator + (?:'[^']*' # LITA-enclosed value + |"[^"]*" # LIT-enclosed value + |(?!['"])[^>\t\n\r\f ]* # bare value + ) + )? + [\t\n\r\f /]* # possibly followed by a space + )* + >? +""", re.VERBOSE) +# The following variables are not used, but are temporarily left for +# backward compatibility. locatestarttagend_tolerant = re.compile(r""" <[a-zA-Z][^\t\n\r\f />\x00]* # tag name (?:[\s/]* # optional whitespace before attribute name @@ -56,8 +84,6 @@ \s* # trailing whitespace """, re.VERBOSE) endendtag = re.compile('>') -# the HTML 5 spec, section 8.1.2.2, doesn't allow spaces between -# ') # Character reference processing logic specific to attribute values @@ -141,7 +167,8 @@ def get_starttag_text(self): def set_cdata_mode(self, elem): self.cdata_elem = elem.lower() - self.interesting = re.compile(r'' % self.cdata_elem, re.I) + self.interesting = re.compile(r'])' % self.cdata_elem, + re.IGNORECASE|re.ASCII) def clear_cdata_mode(self): self.interesting = interesting_normal @@ -166,7 +193,7 @@ def goahead(self, end): # & near the end and see if it's followed by a space or ;. amppos = rawdata.rfind('&', max(i, n-34)) if (amppos >= 0 and - not re.compile(r'[\s;]').search(rawdata, amppos)): + not re.compile(r'[\t\n\r\f ;]').search(rawdata, amppos)): break # wait till we get all the text j = n else: @@ -310,7 +337,7 @@ def parse_html_declaration(self, i): return self.parse_bogus_comment(i) # Internal -- parse bogus comment, return length or -1 if not terminated - # see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state + # see https://html.spec.whatwg.org/multipage/parsing.html#bogus-comment-state def parse_bogus_comment(self, i, report=1): rawdata = self.rawdata assert rawdata[i:i+2] in ('": - return j + 1 - if next == "/": - if rawdata.startswith("/>", j): - return j + 2 - if rawdata.startswith("/", j): - # buffer boundary - return -1 - # else bogus input - if j > i: - return j - else: - return i + 1 - if next == "": - # end of input - return -1 - if next in ("abcdefghijklmnopqrstuvwxyz=/" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ"): - # end of input in or before attribute value, or we have the - # '/' from a '/>' ending - return -1 - if j > i: - return j - else: - return i + 1 - raise AssertionError("we should not get here!") + match = locatetagend.match(rawdata, i+1) + assert match + j = match.end() + if rawdata[j-1] != ">": + return -1 + return j # Internal -- parse endtag, return end or -1 if incomplete def parse_endtag(self, i): + # See the HTML5 specs section "13.2.5.7 End tag open state" + # https://html.spec.whatwg.org/multipage/parsing.html#end-tag-open-state rawdata = self.rawdata assert rawdata[i:i+2] == " - if not match: + if rawdata.find('>', i+2) < 0: # fast check return -1 - gtpos = match.end() - match = endtagfind.match(rawdata, i) # - if not match: - if self.cdata_elem is not None: - self.handle_data(rawdata[i:gtpos]) - return gtpos - # find the name: w3.org/TR/html5/tokenization.html#tag-name-state - namematch = tagfind_tolerant.match(rawdata, i+2) - if not namematch: - # w3.org/TR/html5/tokenization.html#end-tag-open-state - if rawdata[i:i+3] == '': - return i+3 - else: - return self.parse_bogus_comment(i) - tagname = namematch.group(1).lower() - # consume and ignore other stuff between the name and the > - # Note: this is not 100% correct, since we might have things like - # , but looking for > after the name should cover - # most of the cases and is much simpler - gtpos = rawdata.find('>', namematch.end()) - self.handle_endtag(tagname) - return gtpos+1 + if not endtagopen.match(rawdata, i): # ': # is ignored + # "missing-end-tag-name" parser error + return i+3 + else: + return self.parse_bogus_comment(i) - elem = match.group(1).lower() # script or style - if self.cdata_elem is not None: - if elem != self.cdata_elem: - self.handle_data(rawdata[i:gtpos]) - return gtpos + match = locatetagend.match(rawdata, i+2) + assert match + j = match.end() + if rawdata[j-1] != ">": + return -1 - self.handle_endtag(elem) + # find the name: "13.2.5.8 Tag name state" + # https://html.spec.whatwg.org/multipage/parsing.html#tag-name-state + match = tagfind_tolerant.match(rawdata, i+2) + assert match + tag = match.group(1).lower() + self.handle_endtag(tag) self.clear_cdata_mode() - return gtpos + return j # Overridable -- finish processing of start+end tag: def handle_startendtag(self, tag, attrs): diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 65a4bee72b9775..d0d2c54217ccaf 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -81,6 +81,13 @@ def handle_entityref(self, data): self.fail('This should never be called with convert_charrefs=True') +# The normal event collector normalizes the events in get_events, +# so we override it to return the original list of events. +class EventCollectorNoNormalize(EventCollector): + def get_events(self): + return self.events + + class TestCaseBase(unittest.TestCase): def get_collector(self): @@ -265,8 +272,7 @@ def test_get_starttag_text(self): ("starttag", "foo:bar", [("one", "1"), ("two", "2")]), ("starttag_text", s)]) - def test_cdata_content(self): - contents = [ + @support.subTests('content', [ ' ¬-an-entity-ref;', "", '

', @@ -279,54 +285,83 @@ def test_cdata_content(self): 'src="http://www.example.org/r=\'+new ' 'Date().getTime()+\'"><\\/s\'+\'cript>\');\n//]]>'), '\n\n', - 'foo = "";', '', - # these two should be invalid according to the HTML 5 spec, - # section 8.1.2.2 - #'foo = ', - #'foo = ', - ] - elements = ['script', 'style', 'SCRIPT', 'STYLE', 'Script', 'Style'] - for content in contents: - for element in elements: - element_lower = element.lower() - s = '<{element}>{content}'.format(element=element, - content=content) - self._run_check(s, [("starttag", element_lower, []), - ("data", content), - ("endtag", element_lower)]) - - def test_cdata_with_closing_tags(self): + 'foo = ""', + 'foo = ""', + 'foo = ""', + 'foo = ""', + 'foo = ""', + 'foo = ""', + ]) + def test_script_content(self, content): + s = f'' + self._run_check(s, [("starttag", "script", []), + ("data", content), + ("endtag", "script")]) + + @support.subTests('content', [ + 'a::before { content: ""; }', + 'a::before { content: "¬-an-entity-ref;"; }', + 'a::before { content: ""; }', + 'a::before { content: "\u2603"; }', + 'a::before { content: "< /style>"; }', + 'a::before { content: ""; }', + 'a::before { content: ""; }', + 'a::before { content: ""; }', + 'a::before { content: ""; }', + 'a::before { content: ""; }', + ]) + def test_style_content(self, content): + s = f'' + self._run_check(s, [("starttag", "style", []), + ("data", content), + ("endtag", "style")]) + + @support.subTests('endtag', ['script', 'SCRIPT', 'script ', 'script\n', + 'script/', 'script foo=bar', 'script foo=">"']) + def test_script_closing_tag(self, endtag): # see issue #13358 # make sure that HTMLParser calls handle_data only once for each CDATA. - # The normal event collector normalizes the events in get_events, - # so we override it to return the original list of events. - class Collector(EventCollector): - def get_events(self): - return self.events - content = """ ¬-an-entity-ref;

''""" - for element in [' script', 'script ', ' script ', - '\nscript', 'script\n', '\nscript\n']: - element_lower = element.lower().strip() - s = '{content}{tail}' + self._run_check(s, [("starttag", "script", []), + ("data", content if end else content + tail)], + collector=EventCollectorNoNormalize(convert_charrefs=False)) def test_comments(self): html = ("" @@ -443,7 +478,7 @@ def test_starttag_junk_chars(self): self._run_check("", [('comment', '$')]) self._run_check("", [('endtag', 'a')]) + self._run_check("", [('comment', ' a')]) self._run_check("", [('starttag', 'a", [('endtag', 'a', [('endtag', 'a')]) + self._run_check('', [('endtag', 'a')]) + def test_declaration_junk_chars(self): self._run_check("", [('decl', 'DOCTYPE foo $ ')]) @@ -525,15 +564,11 @@ def test_invalid_end_tags(self): self._run_check(html, expected) def test_broken_invalid_end_tag(self): - # This is technically wrong (the "> shouldn't be included in the 'data') - # but is probably not worth fixing it (in addition to all the cases of - # the previous test, it would require a full attribute parsing). - # see #13993 html = 'This confuses the parser' expected = [('starttag', 'b', []), ('data', 'This'), ('endtag', 'b'), - ('data', '"> confuses the parser')] + ('data', ' confuses the parser')] self._run_check(html, expected) def test_correct_detection_of_start_tags(self): @@ -560,7 +595,7 @@ def test_correct_detection_of_start_tags(self): html = '

The rain' expected = [ - ('starttag', 'div', [('style', ''), (',', None), ('foo', 'bar')]), + ('starttag', 'div', [('style', ''), (',', None), ('foo', None), ('=', None), ('"bar"', None)]), ('starttag', 'b', []), ('data', 'The '), ('starttag', 'a', [('href', 'some_url')]), @@ -749,9 +784,15 @@ def test_attr_syntax(self): ("starttag", "a", [("b", "v"), ("c", "v"), ("d", "v"), ("e", None)]) ] self._run_check("""""", output) - self._run_check("""""", output) - self._run_check("""""", output) - self._run_check("""""", output) + self._run_check("", [('starttag', 'a', [('foo', '=bar')])]) + self._run_check("", [('starttag', 'a', [('foo', None), ('=bar', None)])]) + self._run_check("", [('starttag', 'a', [('foo', None), ('=bar', None)])]) + self._run_check("", [('starttag', 'a', [('foo\v', 'bar')])]) + self._run_check("", [('starttag', 'a', [('foo\xa0', 'bar')])]) + self._run_check("", [('starttag', 'a', [('foo', ''), ('bar', None)])]) + self._run_check("", [('starttag', 'a', [('foo', ''), ('bar', None)])]) + self._run_check("", [('starttag', 'a', [('foo', '\vbar')])]) + self._run_check("", [('starttag', 'a', [('foo', '\xa0bar')])]) def test_attr_values(self): self._run_check("""""", @@ -760,6 +801,10 @@ def test_attr_values(self): ("d", "\txyz\n")])]) self._run_check("""""", [("starttag", "a", [("b", ""), ("c", "")])]) + self._run_check("", + [("starttag", "a", [("b", ""), ("c", "")])]) + self._run_check("", + [("starttag", "a", [("b", "\v"), ("c", "\xa0")])]) # Regression test for SF patch #669683. self._run_check("", [("starttag", "e", [("a", "rgb(1,2,3)")])]) @@ -831,7 +876,7 @@ def test_malformed_attributes(self): ('data', 'test - bad2'), ('endtag', 'a'), ('starttag', 'a', [('href', "test'\xa0style='color:red;bad3'")]), ('data', 'test - bad3'), ('endtag', 'a'), - ('starttag', 'a', [('href', "test'\xa0style='color:red;bad4'")]), + ('starttag', 'a', [('href', None), ('=', None), ("test' style", 'color:red;bad4')]), ('data', 'test - bad4'), ('endtag', 'a') ] self._run_check(html, expected) diff --git a/Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst b/Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst new file mode 100644 index 00000000000000..b6f9e104e44047 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst @@ -0,0 +1,25 @@ +Fix parsing start and end tags in :class:`html.parser.HTMLParser` +according to the HTML5 standard. + +* Whitespaces no longer accepted between ```` does not end the script section. + +* Vertical tabulation (``\v``) and non-ASCII whitespaces no longer recognized + as whitespaces. The only whitespaces are ``\t\n\r\f`` and space. + +* Null character (U+0000) no longer ends the tag name. + +* Attributes and slashes after the tag name in end tags are now ignored, + instead of terminating after the first ``>`` in quoted attribute value. + E.g. ````. + +* Multiple slashes and whitespaces between the last attribute and closing ``>`` + are now ignored in both start and end tags. E.g. ````. + +* Multiple ``=`` between attribute name and value are no longer collapsed. + E.g. ```` produces attribute "foo" with value "=bar". + +* Whitespaces between the ``=`` separator and attribute name or value are no + longer ignored. E.g. ```` produces two attributes "foo" and + "=bar", both with value None; ```` produces two attributes: + "foo" with value "" and "bar" with value None. From 2449f7773446b45cc3bae2cc502e8fedf896df8d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 3 Jul 2025 23:10:27 +0200 Subject: [PATCH 0549/1674] [3.14] Clarify some details regarding `sys.monitoring` (GH-133981) (GH-136259) Clarify some details regarding `sys.monitoring` (GH-133981) (cherry picked from commit b4991056f4f44acb50aea3838463e749c24c7420) Co-authored-by: Brett Cannon --- Doc/library/sys.monitoring.rst | 61 ++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/Doc/library/sys.monitoring.rst b/Doc/library/sys.monitoring.rst index 0674074b8c0df6..f62a4011e4144b 100644 --- a/Doc/library/sys.monitoring.rst +++ b/Doc/library/sys.monitoring.rst @@ -137,7 +137,8 @@ The following events are supported: .. monitoring-event:: PY_UNWIND - Exit from a Python function during exception unwinding. + Exit from a Python function during exception unwinding. This includes exceptions raised directly within the + function and that are allowed to continue to propagate. .. monitoring-event:: PY_YIELD @@ -171,7 +172,7 @@ events, use the expression ``PY_RETURN | PY_START``. if get_events(DEBUGGER_ID) == NO_EVENTS: ... -Events are divided into three groups: + Setting this event deactivates all events. .. _monitoring-event-local: @@ -243,20 +244,23 @@ 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 :monitoring-event:`STOP_ITERATION` event is provided. -:monitoring-event:`STOP_ITERATION` can be locally disabled, unlike :monitoring-event:`RAISE`. +:monitoring-event:`STOP_ITERATION` can be locally disabled, unlike +:monitoring-event:`RAISE`. -Note that the :monitoring-event:`STOP_ITERATION` event and the :monitoring-event:`RAISE` -event for a :exc:`StopIteration` exception are equivalent, and are treated as interchangeable -when generating events. Implementations will favor :monitoring-event:`STOP_ITERATION` for -performance reasons, but may generate a :monitoring-event:`RAISE` event with a :exc:`StopIteration`. +Note that the :monitoring-event:`STOP_ITERATION` event and the +:monitoring-event:`RAISE` event for a :exc:`StopIteration` exception are +equivalent, and are treated as interchangeable when generating events. +Implementations will favor :monitoring-event:`STOP_ITERATION` for performance +reasons, but may generate a :monitoring-event:`RAISE` event with a +:exc:`StopIteration`. Turning events on and off ------------------------- 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. +must be registered. Events can be turned on or off by setting the events either +globally and/or for a particular code object. An event will trigger only once, +even if it is turned on both globally and locally. Setting events globally @@ -292,10 +296,6 @@ in Python (see :ref:`c-api-monitoring`). 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, -regardless of the local events. - Disabling events '''''''''''''''' @@ -325,8 +325,6 @@ except for a few breakpoints. Registering callback functions ------------------------------ -To register a callable for events call - .. 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* @@ -335,12 +333,16 @@ To register a callable for events call it is unregistered and returned. Otherwise :func:`register_callback` returns ``None``. - Functions can be unregistered by calling ``sys.monitoring.register_callback(tool_id, event, None)``. Callback functions can be registered and unregistered at any time. +Callbacks are called only once regardless if the event is turned on both +globally and locally. As such, if an event could be turned on for both global +and local events by your code then the callback needs to be written to handle +either trigger. + Registering or unregistering a callback function will generate a :func:`sys.audit` event. @@ -353,37 +355,46 @@ Callback function arguments that there are no arguments to the call. When an active event occurs, the registered callback function is called. +Callback functions returning an object other than :data:`DISABLE` will have no effect. Different events will provide the callback function with different arguments, as follows: * :monitoring-event:`PY_START` and :monitoring-event:`PY_RESUME`:: - func(code: CodeType, instruction_offset: int) -> DISABLE | Any + func(code: CodeType, instruction_offset: int) -> object * :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) -> object -* :monitoring-event:`CALL`, :monitoring-event:`C_RAISE` and :monitoring-event:`C_RETURN`:: +* :monitoring-event:`CALL`, :monitoring-event:`C_RAISE` and :monitoring-event:`C_RETURN` + (*arg0* can be :data:`MISSING` specifically):: - func(code: CodeType, instruction_offset: int, callable: object, arg0: object | MISSING) -> DISABLE | Any + func(code: CodeType, instruction_offset: int, callable: object, arg0: object) -> object + *code* represents the code object where the call is being made, while + *callable* is the object that is about to be called (and thus + triggered the event). If there are no arguments, *arg0* is set to :data:`sys.monitoring.MISSING`. + For instance methods, *callable* will be the function object as found on the + class with *arg0* set to the instance (i.e. the ``self`` argument to the + method). + * :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) -> object * :monitoring-event:`LINE`:: - func(code: CodeType, line_number: int) -> DISABLE | Any + func(code: CodeType, line_number: int) -> object * :monitoring-event:`BRANCH_LEFT`, :monitoring-event:`BRANCH_RIGHT` and :monitoring-event:`JUMP`:: - func(code: CodeType, instruction_offset: int, destination_offset: int) -> DISABLE | Any + func(code: CodeType, instruction_offset: int, destination_offset: int) -> object Note that the *destination_offset* is where the code will next execute. * :monitoring-event:`INSTRUCTION`:: - func(code: CodeType, instruction_offset: int) -> DISABLE | Any + func(code: CodeType, instruction_offset: int) -> object From fa7e76e4ddbe92da1f1d98a24cc15d8306ef4e2e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 4 Jul 2025 09:26:03 +0200 Subject: [PATCH 0550/1674] [3.14] gh-102555: Fix comment parsing in HTMLParser according to the HTML5 standard (GH-135664) (GH-136271) * "--!>" now ends the comment. * "-- >" no longer ends the comment. * Support abnormally ended empty comments "<-->" and "<--->". --------- (cherry picked from commit 8ac7613dc8b8f82253d7c0e2b6ef6ed703a0a1ee) Co-author: Kerim Kabirov Co-authored-by: Serhiy Storchaka Co-authored-by: Ezio Melotti --- Lib/html/parser.py | 18 ++++++++++- Lib/test/test_htmlparser.py | 32 +++++++++++++++++-- ...-06-18-13-28-08.gh-issue-102555.nADrzJ.rst | 3 ++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-06-18-13-28-08.gh-issue-102555.nADrzJ.rst diff --git a/Lib/html/parser.py b/Lib/html/parser.py index cc15de07b5bae6..9b4f09599134bd 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -29,7 +29,8 @@ starttagopen = re.compile('<[a-zA-Z]') endtagopen = re.compile('') -commentclose = re.compile(r'--\s*>') +commentclose = re.compile(r'--!?>') +commentabruptclose = re.compile(r'-?>') # Note: # 1) if you change tagfind/attrfind remember to update locatetagend too; # 2) if you change tagfind/attrfind and/or locatetagend the parser will @@ -336,6 +337,21 @@ def parse_html_declaration(self, i): else: return self.parse_bogus_comment(i) + # Internal -- parse comment, return length or -1 if not terminated + # see https://html.spec.whatwg.org/multipage/parsing.html#comment-start-state + def parse_comment(self, i, report=True): + rawdata = self.rawdata + assert rawdata.startswith('" '' '' + '' '' + # abrupt-closing-of-empty-comment + '' + '' '' '' - '') + '' + '' + '' + '' + '' + '' + '' + # nested-comment + ' -->' + '' + '' + ) expected = [('comment', " I'm a valid comment "), ('comment', 'me too!'), ('comment', '--'), + ('comment', '-'), + ('comment', ''), + ('comment', ''), ('comment', ''), ('comment', '--I have many hyphens--'), ('comment', ' I have a > in the middle '), - ('comment', ' and I have -- in the middle! ')] + ('comment', ' and I have -- in the middle! '), + ('comment', 'incorrectly-closed-comment'), + ('comment', ''), + ('comment', '--!'), + ('comment', '-- >'), + ('comment', '-!>'), + ('comment', '!>'), + ('comment', ' '), + ('comment', '`` now ends the comment. ``-- >`` no longer ends the +comment. Support abnormally ended empty comments ``<-->`` and ``<--->``. From f2f3edb8d7daba96a73741a269ceb61575957633 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 4 Jul 2025 16:36:12 +0200 Subject: [PATCH 0551/1674] [3.14] gh-135773: have pyvenv.cfg without home key anchor a venv and deduce home (GH-135831) (#136287) gh-135773: have pyvenv.cfg without home key anchor a venv and deduce home (GH-135831) This is still formally undefined behaviour, but we may as well keep the *same* undefined behaviour as previous versions. PEP 796 proposes a cleaner and more consistent replacement for 3.15+ (cherry picked from commit 93263d43141a81d369adfcddf325f9a54cb5766d) Co-authored-by: Richard Levasseur --- Lib/test/test_getpath.py | 21 +++++++++++++++++++++ Modules/getpath.py | 11 ++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py index f86df9d0d03485..83f09f3495547a 100644 --- a/Lib/test/test_getpath.py +++ b/Lib/test/test_getpath.py @@ -354,6 +354,27 @@ def test_venv_posix(self): actual = getpath(ns, expected) self.assertEqual(expected, actual) + def test_venv_posix_without_home_key(self): + ns = MockPosixNamespace( + argv0="/venv/bin/python3", + PREFIX="/usr", + ENV_PATH="/usr/bin", + ) + # Setup the bare minimum venv + ns.add_known_xfile("/usr/bin/python3") + ns.add_known_xfile("/venv/bin/python3") + ns.add_known_link("/venv/bin/python3", "/usr/bin/python3") + ns.add_known_file("/venv/pyvenv.cfg", [ + # home = key intentionally omitted + ]) + expected = dict( + executable="/venv/bin/python3", + prefix="/venv", + base_prefix="/usr", + ) + actual = getpath(ns, expected) + self.assertEqual(expected, actual) + def test_venv_changed_name_posix(self): "Test a venv layout on *nix." ns = MockPosixNamespace( diff --git a/Modules/getpath.py b/Modules/getpath.py index be2210345afbda..b89d7427e3febd 100644 --- a/Modules/getpath.py +++ b/Modules/getpath.py @@ -364,10 +364,9 @@ def search_up(prefix, *landmarks, test=isfile): venv_prefix = None pyvenvcfg = [] - # Search for the 'home' key in pyvenv.cfg. Currently, we don't consider the - # presence of a pyvenv.cfg file without a 'home' key to signify the - # existence of a virtual environment — we quietly ignore them. - # XXX: If we don't find a 'home' key, we don't look for another pyvenv.cfg! + # Search for the 'home' key in pyvenv.cfg. If a home key isn't found, + # then it means a venv is active and home is based on the venv's + # executable (if its a symlink, home is where the symlink points). for line in pyvenvcfg: key, had_equ, value = line.partition('=') if had_equ and key.strip().lower() == 'home': @@ -412,10 +411,8 @@ def search_up(prefix, *landmarks, test=isfile): if isfile(candidate): base_executable = candidate break + # home key found; stop iterating over lines break - else: - # We didn't find a 'home' key in pyvenv.cfg (no break), reset venv_prefix. - venv_prefix = None # ****************************************************************************** From 1a2898a383ac5b57a7e0eba34ccab2055d79f1aa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 4 Jul 2025 16:46:57 +0200 Subject: [PATCH 0552/1674] [3.14] Docs: Move "or" outside monospace syntax in `tarfile.rst` (GH-136263) (GH-136290) Docs: Move "or" outside monospace syntax in `tarfile.rst` (GH-136263) (cherry picked from commit ade19880943509945da193202ca89e0b2b6fbd75) Co-authored-by: Rafael Fontenelle --- Doc/library/tarfile.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index f1298514bd5b0e..8d10db8f2c2921 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -63,8 +63,8 @@ Some facts and figures: +------------------+---------------------------------------------+ | mode | action | +==================+=============================================+ - | ``'r' or 'r:*'`` | Open for reading with transparent | - | | compression (recommended). | + | ``'r'`` or | Open for reading with transparent | + | ``'r:*'`` | compression (recommended). | +------------------+---------------------------------------------+ | ``'r:'`` | Open for reading exclusively without | | | compression. | @@ -98,10 +98,11 @@ Some facts and figures: | | Raise a :exc:`FileExistsError` exception | | | if it already exists. | +------------------+---------------------------------------------+ - | ``'a' or 'a:'`` | Open for appending with no compression. The | - | | file is created if it does not exist. | + | ``'a'`` or | Open for appending with no compression. The | + | ``'a:'`` | file is created if it does not exist. | +------------------+---------------------------------------------+ - | ``'w' or 'w:'`` | Open for uncompressed writing. | + | ``'w'`` or | Open for uncompressed writing. | + | ``'w:'`` | | +------------------+---------------------------------------------+ | ``'w:gz'`` | Open for gzip compressed writing. | +------------------+---------------------------------------------+ From 6d21cc54fffbe56df3372f65227160bf27807158 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 4 Jul 2025 18:18:32 +0200 Subject: [PATCH 0553/1674] [3.14] gh-136288: Fix error message in `_testcapi/vectorcall.c` (GH-136258) (GH-136294) gh-136288: Fix error message in `_testcapi/vectorcall.c` (GH-136258) Use the %N format specifier instead of %s and `PyType_GetName`. (cherry picked from commit d1d5dce14f90d777608e4403d09079421ff55944) Co-authored-by: William S Fulton --- Modules/_testcapi/vectorcall.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/_testcapi/vectorcall.c b/Modules/_testcapi/vectorcall.c index 03aaacb328e0b6..f89dcb6c4cf03c 100644 --- a/Modules/_testcapi/vectorcall.c +++ b/Modules/_testcapi/vectorcall.c @@ -179,14 +179,14 @@ _testcapi_VectorCallClass_set_vectorcall_impl(PyObject *self, if (!PyObject_TypeCheck(self, type)) { return PyErr_Format( PyExc_TypeError, - "expected %s instance", - PyType_GetName(type)); + "expected %N instance", + type); } if (!type->tp_vectorcall_offset) { return PyErr_Format( PyExc_TypeError, - "type %s has no vectorcall offset", - PyType_GetName(type)); + "type %N has no vectorcall offset", + type); } *(vectorcallfunc*)((char*)self + type->tp_vectorcall_offset) = ( VectorCallClass_vectorcall); From c62c523e034ddef262e90c16c6e2fef69ff7d469 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 5 Jul 2025 08:39:48 +0200 Subject: [PATCH 0554/1674] [3.14] gh-136297: Test all `pickle` protocols in `test_zoneinfo_property.py` (GH-136298) (#136311) gh-136297: Test all `pickle` protocols in `test_zoneinfo_property.py` (GH-136298) (cherry picked from commit 5de7e3f9739b01ad180fffb242ac57cea930e74d) Co-authored-by: sobolevn --- .../test_zoneinfo/test_zoneinfo_property.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_zoneinfo/test_zoneinfo_property.py b/Lib/test/test_zoneinfo/test_zoneinfo_property.py index feaa77f3e7f0b9..294c7e9b27a857 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo_property.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo_property.py @@ -146,20 +146,24 @@ def setUp(self): @add_key_examples def test_pickle_unpickle_cache(self, key): zi = self.klass(key) - pkl_str = pickle.dumps(zi) - zi_rt = pickle.loads(pkl_str) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + pkl_str = pickle.dumps(zi, proto) + zi_rt = pickle.loads(pkl_str) - self.assertIs(zi, zi_rt) + self.assertIs(zi, zi_rt) @hypothesis.given(key=valid_keys()) @add_key_examples def test_pickle_unpickle_no_cache(self, key): zi = self.klass.no_cache(key) - pkl_str = pickle.dumps(zi) - zi_rt = pickle.loads(pkl_str) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + pkl_str = pickle.dumps(zi, proto) + zi_rt = pickle.loads(pkl_str) - self.assertIsNot(zi, zi_rt) - self.assertEqual(str(zi), str(zi_rt)) + self.assertIsNot(zi, zi_rt) + self.assertEqual(str(zi), str(zi_rt)) @hypothesis.given(key=valid_keys()) @add_key_examples From 53584d307add2c6f32e4bf9a34a3ffa310a1dcd0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 5 Jul 2025 15:35:24 +0200 Subject: [PATCH 0555/1674] [3.14] gh-101100: Fix references in `http.cookiejar` docs (GH-136238) (GH-136318) gh-101100: Fix references in `http.cookiejar` docs (GH-136238) (cherry picked from commit f0c7344a8fbfe67c05981cce67562e7facfae73d) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/http.cookiejar.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst index 23ddecf873876d..251aea891c3f98 100644 --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -570,7 +570,7 @@ Netscape protocol strictness switches: Don't allow setting cookies whose path doesn't path-match request URI. -:attr:`strict_ns_domain` is a collection of flags. Its value is constructed by +:attr:`~DefaultCookiePolicy.strict_ns_domain` is a collection of flags. Its value is constructed by or-ing together (for example, ``DomainStrictNoDots|DomainStrictNonDomain`` means both flags are set). From 2b2cf81a6c84d24b9d669716d0fdccb923801941 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 5 Jul 2025 20:24:19 +0200 Subject: [PATCH 0556/1674] [3.14] gh-136315: Fix skipped multithreading test in test_zstd (GH-136320) (#136322) gh-136315: Fix skipped multithreading test in test_zstd (GH-136320) Fix skipped test in test_zstd (cherry picked from commit 5dac137b9f75c5c1d5096101bcd33d565d0526e4) Co-authored-by: Emma Smith --- Lib/test/test_zstd.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_zstd.py b/Lib/test/test_zstd.py index 7bd0ffd9391529..e83caaf4c07b13 100644 --- a/Lib/test/test_zstd.py +++ b/Lib/test/test_zstd.py @@ -63,15 +63,18 @@ TRAINED_DICT = None -SUPPORT_MULTITHREADING = False +# Cannot be deferred to setup as it is used to check whether or not to skip +# tests +try: + SUPPORT_MULTITHREADING = CompressionParameter.nb_workers.bounds() != (0, 0) +except Exception: + SUPPORT_MULTITHREADING = False C_INT_MIN = -(2**31) C_INT_MAX = (2**31) - 1 def setUpModule(): - global SUPPORT_MULTITHREADING - SUPPORT_MULTITHREADING = CompressionParameter.nb_workers.bounds() != (0, 0) # uncompressed size 130KB, more than a zstd block. # with a frame epilogue, 4 bytes checksum. global DAT_130K_D From d86ca7b610fb8cf70796f40c51ef4f0332970a08 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 6 Jul 2025 10:13:13 +0200 Subject: [PATCH 0557/1674] [3.14] gh-136285: Improve `pickle` protocol testing in `test_interpreters` (GH-136286) (#136333) gh-136285: Improve `pickle` protocol testing in `test_interpreters` (GH-136286) (cherry picked from commit 06e347b84648f3f8e144e8f70671d610da082b77) Co-authored-by: sobolevn --- Lib/concurrent/interpreters/__init__.py | 8 ++------ Lib/concurrent/interpreters/_queues.py | 8 ++------ Lib/test/support/channels.py | 8 ++------ Lib/test/test_interpreters/test_api.py | 8 +++++--- Lib/test/test_interpreters/test_channels.py | 16 ++++++++++------ Lib/test/test_interpreters/test_queues.py | 8 +++++--- ...025-07-05-09-45-04.gh-issue-136286.N67Amr.rst | 2 ++ 7 files changed, 28 insertions(+), 30 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst diff --git a/Lib/concurrent/interpreters/__init__.py b/Lib/concurrent/interpreters/__init__.py index 0fd661249a276c..aa46a2b37a48d5 100644 --- a/Lib/concurrent/interpreters/__init__.py +++ b/Lib/concurrent/interpreters/__init__.py @@ -146,12 +146,8 @@ def __del__(self): self._decref() # for pickling: - def __getnewargs__(self): - return (self._id,) - - # for pickling: - def __getstate__(self): - return None + def __reduce__(self): + return (type(self), (self._id,)) def _decref(self): if not self._ownsref: diff --git a/Lib/concurrent/interpreters/_queues.py b/Lib/concurrent/interpreters/_queues.py index d6a3197d9e0e26..ee830973f2a36e 100644 --- a/Lib/concurrent/interpreters/_queues.py +++ b/Lib/concurrent/interpreters/_queues.py @@ -130,12 +130,8 @@ def __hash__(self): return hash(self._id) # for pickling: - def __getnewargs__(self): - return (self._id,) - - # for pickling: - def __getstate__(self): - return None + def __reduce__(self): + return (type(self), (self._id,)) def _set_unbound(self, op, items=None): assert not hasattr(self, '_unbound') diff --git a/Lib/test/support/channels.py b/Lib/test/support/channels.py index dfa86ba24dc134..5352f7d4da3af0 100644 --- a/Lib/test/support/channels.py +++ b/Lib/test/support/channels.py @@ -105,12 +105,8 @@ def __eq__(self, other): return other._id == self._id # for pickling: - def __getnewargs__(self): - return (int(self._id),) - - # for pickling: - def __getstate__(self): - return None + def __reduce__(self): + return (type(self), (int(self._id),)) @property def id(self): diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index 0ee4582b5d1568..a34b20beaca7a3 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -412,9 +412,11 @@ def test_equality(self): def test_pickle(self): interp = interpreters.create() - data = pickle.dumps(interp) - unpickled = pickle.loads(data) - self.assertEqual(unpickled, interp) + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=protocol): + data = pickle.dumps(interp, protocol) + unpickled = pickle.loads(data) + self.assertEqual(unpickled, interp) class TestInterpreterIsRunning(TestBase): diff --git a/Lib/test/test_interpreters/test_channels.py b/Lib/test/test_interpreters/test_channels.py index 109ddf344539ad..52827357078b85 100644 --- a/Lib/test/test_interpreters/test_channels.py +++ b/Lib/test/test_interpreters/test_channels.py @@ -121,9 +121,11 @@ def test_equality(self): def test_pickle(self): ch, _ = channels.create() - data = pickle.dumps(ch) - unpickled = pickle.loads(data) - self.assertEqual(unpickled, ch) + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=protocol): + data = pickle.dumps(ch, protocol) + unpickled = pickle.loads(data) + self.assertEqual(unpickled, ch) class TestSendChannelAttrs(TestBase): @@ -152,9 +154,11 @@ def test_equality(self): def test_pickle(self): _, ch = channels.create() - data = pickle.dumps(ch) - unpickled = pickle.loads(data) - self.assertEqual(unpickled, ch) + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=protocol): + data = pickle.dumps(ch, protocol) + unpickled = pickle.loads(data) + self.assertEqual(unpickled, ch) class TestSendRecv(TestBase): diff --git a/Lib/test/test_interpreters/test_queues.py b/Lib/test/test_interpreters/test_queues.py index 6b106fa21aab7d..815d38d8bd7a4a 100644 --- a/Lib/test/test_interpreters/test_queues.py +++ b/Lib/test/test_interpreters/test_queues.py @@ -189,9 +189,11 @@ def test_equality(self): def test_pickle(self): queue = queues.create() - data = pickle.dumps(queue) - unpickled = pickle.loads(data) - self.assertEqual(unpickled, queue) + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=protocol): + data = pickle.dumps(queue, protocol) + unpickled = pickle.loads(data) + self.assertEqual(unpickled, queue) class TestQueueOps(TestBase): diff --git a/Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst b/Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst new file mode 100644 index 00000000000000..0a0d66ac0b8abf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst @@ -0,0 +1,2 @@ +Fix pickling failures for protocols 0 and 1 for many objects realted to +subinterpreters. From 3ea7276a8e9edcf5cc5409448467023a34d4f083 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 6 Jul 2025 15:23:55 +0200 Subject: [PATCH 0558/1674] [3.14] gh-129824: fix data races in subinterpreters under TSAN (GH-135794) (#136266) gh-129824: fix data races in subinterpreters under TSAN (GH-135794) This fixes the data races in typeobject.c in subinterpreters under free-threading. The type flags and slots are only modified in the main interpreter as all static types are first initialised in main interpreter. (cherry picked from commit b582d751b4968d4534fdb7894e50713676789b2f) Co-authored-by: Kumar Aditya --- Objects/typeobject.c | 61 ++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 455d32434c4688..a348ea1d531c93 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -54,7 +54,6 @@ class object "PyObject *" "&PyBaseObject_Type" PyUnicode_CheckExact(name) && \ (PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE) -#define NEXT_GLOBAL_VERSION_TAG _PyRuntime.types.next_version_tag #define NEXT_VERSION_TAG(interp) \ (interp)->types.next_version_tag @@ -157,8 +156,8 @@ static_ext_type_lookup(PyInterpreterState *interp, size_t index, assert(index < _Py_MAX_MANAGED_STATIC_EXT_TYPES); size_t full_index = index + _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES; - int64_t interp_count = - _PyRuntime.types.managed_static.types[full_index].interp_count; + int64_t interp_count = _Py_atomic_load_int64( + &_PyRuntime.types.managed_static.types[full_index].interp_count); assert((interp_count == 0) == (_PyRuntime.types.managed_static.types[full_index].type == NULL)); *p_interp_count = interp_count; @@ -235,7 +234,7 @@ managed_static_type_state_init(PyInterpreterState *interp, PyTypeObject *self, : index + _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES; assert((initial == 1) == - (_PyRuntime.types.managed_static.types[full_index].interp_count == 0)); + (_Py_atomic_load_int64(&_PyRuntime.types.managed_static.types[full_index].interp_count) == 0)); (void)_Py_atomic_add_int64( &_PyRuntime.types.managed_static.types[full_index].interp_count, 1); @@ -284,7 +283,7 @@ managed_static_type_state_clear(PyInterpreterState *interp, PyTypeObject *self, : &(interp->types.for_extensions.initialized[index]); assert(state != NULL); - assert(_PyRuntime.types.managed_static.types[full_index].interp_count > 0); + assert(_Py_atomic_load_int64(&_PyRuntime.types.managed_static.types[full_index].interp_count) > 0); assert(_PyRuntime.types.managed_static.types[full_index].type == state->type); assert(state->type != NULL); @@ -294,7 +293,7 @@ managed_static_type_state_clear(PyInterpreterState *interp, PyTypeObject *self, (void)_Py_atomic_add_int64( &_PyRuntime.types.managed_static.types[full_index].interp_count, -1); if (final) { - assert(!_PyRuntime.types.managed_static.types[full_index].interp_count); + assert(!_Py_atomic_load_int64(&_PyRuntime.types.managed_static.types[full_index].interp_count)); _PyRuntime.types.managed_static.types[full_index].type = NULL; managed_static_type_index_clear(self); @@ -1258,6 +1257,19 @@ _PyType_GetVersionForCurrentState(PyTypeObject *tp) #error "_Py_ATTR_CACHE_UNUSED must be bigger than max" #endif +static inline unsigned int +next_global_version_tag(void) +{ + unsigned int old; + do { + old = _Py_atomic_load_uint_relaxed(&_PyRuntime.types.next_version_tag); + if (old >= _Py_MAX_GLOBAL_TYPE_VERSION_TAG) { + return 0; + } + } while (!_Py_atomic_compare_exchange_uint(&_PyRuntime.types.next_version_tag, &old, old + 1)); + return old + 1; +} + static int assign_version_tag(PyInterpreterState *interp, PyTypeObject *type) { @@ -1288,11 +1300,12 @@ assign_version_tag(PyInterpreterState *interp, PyTypeObject *type) } if (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) { /* static types */ - if (NEXT_GLOBAL_VERSION_TAG > _Py_MAX_GLOBAL_TYPE_VERSION_TAG) { + unsigned int next_version_tag = next_global_version_tag(); + if (next_version_tag == 0) { /* We have run out of version numbers */ return 0; } - set_version_unlocked(type, NEXT_GLOBAL_VERSION_TAG++); + set_version_unlocked(type, next_version_tag); assert (type->tp_version_tag <= _Py_MAX_GLOBAL_TYPE_VERSION_TAG); } else { @@ -8704,7 +8717,11 @@ type_ready_set_new(PyTypeObject *type, int initial) && base == &PyBaseObject_Type && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - type_add_flags(type, Py_TPFLAGS_DISALLOW_INSTANTIATION); + if (initial) { + type_add_flags(type, Py_TPFLAGS_DISALLOW_INSTANTIATION); + } else { + assert(type->tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION); + } } if (!(type->tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION)) { @@ -8718,13 +8735,17 @@ type_ready_set_new(PyTypeObject *type, int initial) } } else { - // tp_new is NULL: inherit tp_new from base - type->tp_new = base->tp_new; + if (initial) { + // tp_new is NULL: inherit tp_new from base + type->tp_new = base->tp_new; + } } } else { // Py_TPFLAGS_DISALLOW_INSTANTIATION sets tp_new to NULL - type->tp_new = NULL; + if (initial) { + type->tp_new = NULL; + } } return 0; } @@ -8857,7 +8878,12 @@ type_ready(PyTypeObject *type, int initial) } /* All done -- set the ready flag */ - type_add_flags(type, Py_TPFLAGS_READY); + if (initial) { + type_add_flags(type, Py_TPFLAGS_READY); + } else { + assert(type->tp_flags & Py_TPFLAGS_READY); + } + stop_readying(type); assert(_PyType_CheckConsistency(type)); @@ -8906,15 +8932,16 @@ init_static_type(PyInterpreterState *interp, PyTypeObject *self, assert(!(self->tp_flags & Py_TPFLAGS_MANAGED_DICT)); assert(!(self->tp_flags & Py_TPFLAGS_MANAGED_WEAKREF)); - if ((self->tp_flags & Py_TPFLAGS_READY) == 0) { - assert(initial); + if (initial) { + assert((self->tp_flags & Py_TPFLAGS_READY) == 0); type_add_flags(self, _Py_TPFLAGS_STATIC_BUILTIN); type_add_flags(self, Py_TPFLAGS_IMMUTABLETYPE); - assert(NEXT_GLOBAL_VERSION_TAG <= _Py_MAX_GLOBAL_TYPE_VERSION_TAG); if (self->tp_version_tag == 0) { - _PyType_SetVersion(self, NEXT_GLOBAL_VERSION_TAG++); + unsigned int next_version_tag = next_global_version_tag(); + assert(next_version_tag != 0); + _PyType_SetVersion(self, next_version_tag); } } else { From 5b65df7925d0d6c9c837661a5a0348dda4a88ba6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 6 Jul 2025 17:43:16 +0200 Subject: [PATCH 0559/1674] [3.14] gh-109700: fix memory error handling in `PyDict_SetDefault` (GH-136338) (#136340) gh-109700: fix memory error handling in `PyDict_SetDefault` (GH-136338) (cherry picked from commit d22e073d2b49313bbf42d40cbe74afa2b69385df) Co-authored-by: Kumar Aditya --- .../2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst | 1 + Objects/dictobject.c | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst new file mode 100644 index 00000000000000..a37f4a51050947 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst @@ -0,0 +1 @@ +Fix memory error handling in :c:func:`PyDict_SetDefault`. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 72901377cbb3da..b4940315a6c28d 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4411,6 +4411,7 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu if (result) { *result = NULL; } + return -1; } STORE_USED(mp, mp->ma_used + 1); From bd97cb822922c4577238e376d1ab0b28aa475e9d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 6 Jul 2025 20:32:03 +0200 Subject: [PATCH 0560/1674] [3.14] gh-109070: Document that get_context in multiprocessing have side effect (GH-136341) (GH-136343) gh-109070: Document that get_context in multiprocessing have side effect (GH-136341) Document that get_context in multiprocessing have side effect (cherry picked from commit 77a8bd29da99e7d4fa8e7f07c4063977c2bb14d3) Co-authored-by: AN Long --- Doc/library/multiprocessing.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 6f37930ea80391..b41953d21442c9 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1118,7 +1118,9 @@ Miscellaneous Return a context object which has the same attributes as the :mod:`multiprocessing` module. - If *method* is ``None`` then the default context is returned. + If *method* is ``None`` then the default context is returned. Note that if + the global start method has not been set, this will set it to the + default method. Otherwise *method* should be ``'fork'``, ``'spawn'``, ``'forkserver'``. :exc:`ValueError` is raised if the specified start method is not available. See :ref:`multiprocessing-start-methods`. @@ -1129,10 +1131,10 @@ Miscellaneous Return the name of start method used for starting processes. - If the start method has not been fixed and *allow_none* is false, - then the start method is fixed to the default and the name is - returned. If the start method has not been fixed and *allow_none* - is true then ``None`` is returned. + If the global start method has not been set and *allow_none* is + ``False``, then the start method is set to the default and the name + is returned. If the start method has not been set and *allow_none* is + ``True`` then ``None`` is returned. The return value can be ``'fork'``, ``'spawn'``, ``'forkserver'`` or ``None``. See :ref:`multiprocessing-start-methods`. From 3d01565da4dfca00c2db28f99e710e40e405a5d1 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sun, 6 Jul 2025 17:10:57 -0700 Subject: [PATCH 0561/1674] [3.14] gh-136316: Make typing.evaluate_forward_ref better at evaluating nested forwardrefs (GH-136319) (#136346) (cherry picked from commit 9312702d2e12c2f58f02bfa02877d0ec790d06bd) --- Lib/test/test_typing.py | 6 ++++++ Lib/test/typinganndata/fwdref_module.py | 6 ++++++ Lib/typing.py | 12 +++++++++--- .../2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst | 2 ++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 Lib/test/typinganndata/fwdref_module.py create mode 100644 Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 983fb39f4dbdcd..cd552f9887d8a0 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -7328,6 +7328,12 @@ def test_partial_evaluation(self): list[EqualToForwardRef('A')], ) + def test_with_module(self): + from test.typinganndata import fwdref_module + + typing.evaluate_forward_ref( + fwdref_module.fw,) + class CollectionsAbcTests(BaseTestCase): diff --git a/Lib/test/typinganndata/fwdref_module.py b/Lib/test/typinganndata/fwdref_module.py new file mode 100644 index 00000000000000..7347a7a42455c2 --- /dev/null +++ b/Lib/test/typinganndata/fwdref_module.py @@ -0,0 +1,6 @@ +from typing import ForwardRef + +MyList = list[int] +MyDict = dict[str, 'MyList'] + +fw = ForwardRef('MyDict', module=__name__) diff --git a/Lib/typing.py b/Lib/typing.py index 87fd53802ca36d..09a574d783c8b4 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -430,7 +430,7 @@ def __repr__(self): def _eval_type(t, globalns, localns, type_params=_sentinel, *, recursive_guard=frozenset(), - format=None, owner=None): + format=None, owner=None, parent_fwdref=None): """Evaluate all forward references in the given type t. For use of globalns and localns see the docstring for get_type_hints(). @@ -451,7 +451,7 @@ def _eval_type(t, globalns, localns, type_params=_sentinel, *, recursive_guard=f if isinstance(t, (_GenericAlias, GenericAlias, Union)): if isinstance(t, GenericAlias): args = tuple( - _make_forward_ref(arg) if isinstance(arg, str) else arg + _make_forward_ref(arg, parent_fwdref=parent_fwdref) if isinstance(arg, str) else arg for arg in t.__args__ ) is_unpacked = t.__unpacked__ @@ -936,7 +936,12 @@ def run(arg: Child | Unrelated): return _GenericAlias(self, (item,)) -def _make_forward_ref(code, **kwargs): +def _make_forward_ref(code, *, parent_fwdref=None, **kwargs): + if parent_fwdref is not None: + if parent_fwdref.__forward_module__ is not None: + kwargs['module'] = parent_fwdref.__forward_module__ + if parent_fwdref.__owner__ is not None: + kwargs['owner'] = parent_fwdref.__owner__ forward_ref = _lazy_annotationlib.ForwardRef(code, **kwargs) # For compatibility, eagerly compile the forwardref's code. forward_ref.__forward_code__ @@ -1001,6 +1006,7 @@ def evaluate_forward_ref( recursive_guard=_recursive_guard | {forward_ref.__forward_arg__}, format=format, owner=owner, + parent_fwdref=forward_ref, ) diff --git a/Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst b/Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst new file mode 100644 index 00000000000000..dd5cecdf3a1209 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst @@ -0,0 +1,2 @@ +Improve support for evaluating nested forward references in +:func:`typing.evaluate_forward_ref`. From 22fad16ebc707706d18d067ed12cbbe0c8181a03 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 09:40:13 +0200 Subject: [PATCH 0562/1674] [3.14] gh-109700: fix interpreter finalization while handling memory error (GH-136342) (#136352) gh-109700: fix interpreter finalization while handling memory error (GH-136342) (cherry picked from commit 0c3e3da19570424649c33c0c2c29dc12541935e7) Co-authored-by: Kumar Aditya --- Python/pylifecycle.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index c4c1d9fd9e1380..c07862edf97d0b 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1702,8 +1702,10 @@ finalize_modules(PyThreadState *tstate) #endif // Stop watching __builtin__ modifications - PyDict_Unwatch(0, interp->builtins); - + if (PyDict_Unwatch(0, interp->builtins) < 0) { + // might happen if interp is cleared before watching the __builtin__ + PyErr_Clear(); + } PyObject *modules = _PyImport_GetModules(interp); if (modules == NULL) { // Already done @@ -2377,15 +2379,13 @@ new_interpreter(PyThreadState **tstate_p, error: *tstate_p = NULL; if (tstate != NULL) { - PyThreadState_Clear(tstate); - _PyThreadState_Detach(tstate); - PyThreadState_Delete(tstate); + Py_EndInterpreter(tstate); + } else { + PyInterpreterState_Delete(interp); } if (save_tstate != NULL) { _PyThreadState_Attach(save_tstate); } - PyInterpreterState_Delete(interp); - return status; } From aa1800b75513a67b47ed8075970158975329e321 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:08:41 +0200 Subject: [PATCH 0563/1674] [3.14] gh-127502: Remove XML vulnerability table (GH-135294) (#136359) gh-127502: Remove XML vulnerability table (GH-135294) * Remove the table * Replace warnings with notes Latest releases of Python 3.9-3.15 include expat 2.7.1 which is not vulnerable. expat 2.6.0 was released in February 2024. (cherry picked from commit cb99d992774b67761441e122965ed056bac09241) Co-authored-by: Victor Stinner --- Doc/library/pyexpat.rst | 7 ++- Doc/library/security_warnings.rst | 2 +- Doc/library/xml.dom.minidom.rst | 7 ++- Doc/library/xml.dom.pulldom.rst | 7 ++- Doc/library/xml.etree.elementtree.rst | 7 ++- Doc/library/xml.rst | 76 +++++---------------------- Doc/library/xml.sax.rst | 7 ++- Doc/library/xmlrpc.client.rst | 4 +- Doc/library/xmlrpc.server.rst | 4 +- 9 files changed, 32 insertions(+), 89 deletions(-) diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 2d57cff10a9278..5506ac828e5abe 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -16,11 +16,10 @@ references to these attributes should be marked using the :member: role. -.. warning:: +.. note:: - The :mod:`pyexpat` module is not secure against maliciously - constructed data. If you need to parse untrusted or unauthenticated data see - :ref:`xml-vulnerabilities`. + If you need to parse untrusted or unauthenticated data, see + :ref:`xml-security`. .. index:: single: Expat diff --git a/Doc/library/security_warnings.rst b/Doc/library/security_warnings.rst index a573c98f73eb0a..70c359cc1c0fc3 100644 --- a/Doc/library/security_warnings.rst +++ b/Doc/library/security_warnings.rst @@ -28,7 +28,7 @@ The following modules have specific security considerations: ` * :mod:`tempfile`: :ref:`mktemp is deprecated due to vulnerability to race conditions ` -* :mod:`xml`: :ref:`XML vulnerabilities ` +* :mod:`xml`: :ref:`XML security ` * :mod:`zipfile`: :ref:`maliciously prepared .zip files can cause disk volume exhaustion ` diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 00a18751207e7a..9ffedf7366a7b8 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -19,11 +19,10 @@ not already proficient with the DOM should consider using the :mod:`xml.etree.ElementTree` module for their XML processing instead. -.. warning:: +.. note:: - The :mod:`xml.dom.minidom` module is not secure against - maliciously constructed data. If you need to parse untrusted or - unauthenticated data see :ref:`xml-vulnerabilities`. + If you need to parse untrusted or unauthenticated data, see + :ref:`xml-security`. DOM applications typically start by parsing some XML into a DOM. With diff --git a/Doc/library/xml.dom.pulldom.rst b/Doc/library/xml.dom.pulldom.rst index fd96765cbe3c96..8bceeecd46393e 100644 --- a/Doc/library/xml.dom.pulldom.rst +++ b/Doc/library/xml.dom.pulldom.rst @@ -19,11 +19,10 @@ responsible for explicitly pulling events from the stream, looping over those events until either processing is finished or an error condition occurs. -.. warning:: +.. note:: - The :mod:`xml.dom.pulldom` module is not secure against - maliciously constructed data. If you need to parse untrusted or - unauthenticated data see :ref:`xml-vulnerabilities`. + If you need to parse untrusted or unauthenticated data, see + :ref:`xml-security`. .. versionchanged:: 3.7.1 diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 1daf6628013bf0..00075ac2a23e6b 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -20,11 +20,10 @@ for parsing and creating XML data. The :mod:`!xml.etree.cElementTree` module is deprecated. -.. warning:: +.. note:: - The :mod:`xml.etree.ElementTree` module is not secure against - maliciously constructed data. If you need to parse untrusted or - unauthenticated data see :ref:`xml-vulnerabilities`. + If you need to parse untrusted or unauthenticated data, see + :ref:`xml-security`. Tutorial -------- diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst index d495995398959d..28465219a1ac18 100644 --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -15,12 +15,10 @@ XML Processing Modules Python's interfaces for processing XML are grouped in the ``xml`` package. -.. warning:: +.. note:: - The XML modules are not secure against erroneous or maliciously - constructed data. If you need to parse untrusted or - unauthenticated data see the :ref:`xml-vulnerabilities` and - :ref:`defusedxml-package` sections. + If you need to parse untrusted or unauthenticated data, see + :ref:`xml-security`. It is important to note that modules in the :mod:`xml` package require that there be at least one SAX-compliant XML parser available. The Expat parser is @@ -47,46 +45,22 @@ The XML handling submodules are: * :mod:`xml.parsers.expat`: the Expat parser binding +.. _xml-security: .. _xml-vulnerabilities: -XML vulnerabilities -------------------- +XML security +------------ -The XML processing modules are not secure against maliciously constructed data. An attacker can abuse XML features to carry out denial of service attacks, access local files, generate network connections to other machines, or circumvent firewalls. -The following table gives an overview of the known attacks and whether -the various modules are vulnerable to them. - -========================= ================== ================== ================== ================== ================== -kind sax etree minidom pulldom xmlrpc -========================= ================== ================== ================== ================== ================== -billion laughs **Vulnerable** (1) **Vulnerable** (1) **Vulnerable** (1) **Vulnerable** (1) **Vulnerable** (1) -quadratic blowup **Vulnerable** (1) **Vulnerable** (1) **Vulnerable** (1) **Vulnerable** (1) **Vulnerable** (1) -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`. -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 - the unexpanded entity verbatim. -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`. +Expat versions lower that 2.6.0 may be vulnerable to "billion laughs", +"quadratic blowup" and "large tokens". Python may be vulnerable if it uses such +older versions of Expat as a system-provided library. +Check :const:`!pyexpat.EXPAT_VERSION`. + +:mod:`xmlrpc` is **vulnerable** to the "decompression bomb" attack. billion laughs / exponential entity expansion @@ -103,16 +77,6 @@ quadratic blowup entity expansion efficient as the exponential case but it avoids triggering parser countermeasures that forbid deeply nested entities. -external entity expansion - Entity declarations can contain more than just text for replacement. They can - also point to external resources or local files. The XML - parser accesses the resource and embeds the content into the XML document. - -`DTD`_ retrieval - Some XML libraries like Python's :mod:`xml.dom.pulldom` retrieve document type - definitions from remote or local locations. The feature has similar - implications as the external entity expansion issue. - decompression bomb Decompression bombs (aka `ZIP bomb`_) apply to all XML libraries that can parse compressed XML streams such as gzipped HTTP streams or @@ -126,21 +90,5 @@ large tokens 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: - -The :mod:`!defusedxml` Package ------------------------------- - -: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. - - .. _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.rst b/Doc/library/xml.sax.rst index c60e9e505f7544..5fa92645a440ce 100644 --- a/Doc/library/xml.sax.rst +++ b/Doc/library/xml.sax.rst @@ -18,11 +18,10 @@ SAX exceptions and the convenience functions which will be most used by users of the SAX API. -.. warning:: +.. note:: - The :mod:`xml.sax` module is not secure against maliciously - constructed data. If you need to parse untrusted or unauthenticated data see - :ref:`xml-vulnerabilities`. + If you need to parse untrusted or unauthenticated data, see + :ref:`xml-security`. .. versionchanged:: 3.7.1 diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 654154cb43d6e5..547cb50be78a78 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -24,8 +24,8 @@ between conformable Python objects and XML on the wire. .. warning:: The :mod:`xmlrpc.client` module is not secure against maliciously - constructed data. If you need to parse untrusted or unauthenticated data see - :ref:`xml-vulnerabilities`. + constructed data. If you need to parse untrusted or unauthenticated data, + see :ref:`xml-security`. .. versionchanged:: 3.5 diff --git a/Doc/library/xmlrpc.server.rst b/Doc/library/xmlrpc.server.rst index 06169c7eca8b0c..2a8f6f8d5fc0de 100644 --- a/Doc/library/xmlrpc.server.rst +++ b/Doc/library/xmlrpc.server.rst @@ -20,8 +20,8 @@ servers written in Python. Servers can either be free standing, using .. warning:: The :mod:`xmlrpc.server` module is not secure against maliciously - constructed data. If you need to parse untrusted or unauthenticated data see - :ref:`xml-vulnerabilities`. + constructed data. If you need to parse untrusted or unauthenticated data, + see :ref:`xml-security`. .. include:: ../includes/wasm-notavail.rst From 8f06a9c9ceff5174ac091e956dee3b67dea133b9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:18:27 +0200 Subject: [PATCH 0564/1674] [3.14] gh-94503: Update logging cookbook with an example of uniformly handling newlines in output. (GH-136217) (GH-136357) (cherry picked from commit d05423a90ce0ee9ad5207dce3dd06ab2397f3d6e) --- Doc/howto/logging-cookbook.rst | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 7d64a02358adb3..ae2697fbce30ad 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -4078,6 +4078,68 @@ lines. With this approach, you get better output: WARNING:demo: 1/0 WARNING:demo:ZeroDivisionError: division by zero +How to uniformly handle newlines in logging output +-------------------------------------------------- + +Usually, messages that are logged (say to console or file) consist of a single +line of text. However, sometimes there is a need to handle messages with +multiple lines - whether because a logging format string contains newlines, or +logged data contains newlines. If you want to handle such messages uniformly, so +that each line in the logged message appears uniformly formatted as if it was +logged separately, you can do this using a handler mixin, as in the following +snippet: + +.. code-block:: python + + # Assume this is in a module mymixins.py + import copy + + class MultilineMixin: + def emit(self, record): + s = record.getMessage() + if '\n' not in s: + super().emit(record) + else: + lines = s.splitlines() + rec = copy.copy(record) + rec.args = None + for line in lines: + rec.msg = line + super().emit(rec) + +You can use the mixin as in the following script: + +.. code-block:: python + + import logging + + from mymixins import MultilineMixin + + logger = logging.getLogger(__name__) + + class StreamHandler(MultilineMixin, logging.StreamHandler): + pass + + if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-9s %(message)s', + handlers = [StreamHandler()]) + logger.debug('Single line') + logger.debug('Multiple lines:\nfool me once ...') + logger.debug('Another single line') + logger.debug('Multiple lines:\n%s', 'fool me ...\ncan\'t get fooled again') + +The script, when run, prints something like: + +.. code-block:: text + + 2025-07-02 13:54:47,234 DEBUG Single line + 2025-07-02 13:54:47,234 DEBUG Multiple lines: + 2025-07-02 13:54:47,234 DEBUG fool me once ... + 2025-07-02 13:54:47,234 DEBUG Another single line + 2025-07-02 13:54:47,234 DEBUG Multiple lines: + 2025-07-02 13:54:47,234 DEBUG fool me ... + 2025-07-02 13:54:47,234 DEBUG can't get fooled again + .. patterns-to-avoid: From 46a7981f45ee81512e5f06d3afaa0f0ecbe7f1ec Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:31:18 +0200 Subject: [PATCH 0565/1674] [3.14] GH-135106: Restrict trashcan to GC'ed objects (GH-135682) (#135876) Co-authored-by: Mark Shannon --- ...-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst | 2 + Objects/object.c | 76 ++++++------------- 2 files changed, 26 insertions(+), 52 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst new file mode 100644 index 00000000000000..b6e953a7719be1 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst @@ -0,0 +1,2 @@ +Restrict the trashcan mechanism to GC'ed objects and untrack them while in +the trashcan to prevent the GC and trashcan mechanisms conflicting. diff --git a/Objects/object.c b/Objects/object.c index 7140520a1bb3e8..8dc3ab9643cbb2 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2923,57 +2923,28 @@ Py_ReprLeave(PyObject *obj) /* Trashcan support. */ -#ifndef Py_GIL_DISABLED -/* We need to store a pointer in the refcount field of - * an object. It is important that we never store 0 (NULL). -* It is also important to not make the object appear immortal, -* or it might be untracked by the cycle GC. */ -static uintptr_t -pointer_to_safe_refcount(void *ptr) -{ - uintptr_t full = (uintptr_t)ptr; - assert((full & 3) == 0); -#if SIZEOF_VOID_P > 4 - uint32_t refcnt = (uint32_t)full; - if (refcnt >= (uint32_t)_Py_IMMORTAL_MINIMUM_REFCNT) { - full = full - ((uintptr_t)_Py_IMMORTAL_MINIMUM_REFCNT) + 1; - } - return full + 2; -#else - // Make the top two bits 0, so it appears mortal. - return (full >> 2) + 1; -#endif -} - -static void * -safe_refcount_to_pointer(uintptr_t refcnt) -{ -#if SIZEOF_VOID_P > 4 - if (refcnt & 1) { - refcnt += _Py_IMMORTAL_MINIMUM_REFCNT - 1; - } - return (void *)(refcnt - 2); -#else - return (void *)((refcnt -1) << 2); -#endif -} -#endif - /* Add op to the gcstate->trash_delete_later list. Called when the current - * call-stack depth gets large. op must be a currently untracked gc'ed - * object, with refcount 0. Py_DECREF must already have been called on it. + * call-stack depth gets large. op must be a gc'ed object, with refcount 0. + * Py_DECREF must already have been called on it. */ void _PyTrash_thread_deposit_object(PyThreadState *tstate, PyObject *op) { _PyObject_ASSERT(op, Py_REFCNT(op) == 0); + PyTypeObject *tp = Py_TYPE(op); + assert(tp->tp_flags & Py_TPFLAGS_HAVE_GC); + int tracked = 0; + if (tp->tp_is_gc == NULL || tp->tp_is_gc(op)) { + tracked = _PyObject_GC_IS_TRACKED(op); + if (tracked) { + _PyObject_GC_UNTRACK(op); + } + } + uintptr_t tagged_ptr = ((uintptr_t)tstate->delete_later) | tracked; #ifdef Py_GIL_DISABLED - op->ob_tid = (uintptr_t)tstate->delete_later; + op->ob_tid = tagged_ptr; #else - /* Store the delete_later pointer in the refcnt field. */ - uintptr_t refcnt = pointer_to_safe_refcount(tstate->delete_later); - *((uintptr_t*)op) = refcnt; - assert(!_Py_IsImmortal(op)); + _Py_AS_GC(op)->_gc_next = tagged_ptr; #endif tstate->delete_later = op; } @@ -2988,17 +2959,17 @@ _PyTrash_thread_destroy_chain(PyThreadState *tstate) destructor dealloc = Py_TYPE(op)->tp_dealloc; #ifdef Py_GIL_DISABLED - tstate->delete_later = (PyObject*) op->ob_tid; + uintptr_t tagged_ptr = op->ob_tid; op->ob_tid = 0; _Py_atomic_store_ssize_relaxed(&op->ob_ref_shared, _Py_REF_MERGED); #else - /* Get the delete_later pointer from the refcnt field. - * See _PyTrash_thread_deposit_object(). */ - uintptr_t refcnt = *((uintptr_t*)op); - tstate->delete_later = safe_refcount_to_pointer(refcnt); - op->ob_refcnt = 0; + uintptr_t tagged_ptr = _Py_AS_GC(op)->_gc_next; + _Py_AS_GC(op)->_gc_next = 0; #endif - + tstate->delete_later = (PyObject *)(tagged_ptr & ~1); + if (tagged_ptr & 1) { + _PyObject_GC_TRACK(op); + } /* Call the deallocator directly. This used to try to * fool Py_DECREF into calling it indirectly, but * Py_DECREF was already called on this object, and in @@ -3072,10 +3043,11 @@ void _Py_Dealloc(PyObject *op) { PyTypeObject *type = Py_TYPE(op); + unsigned long gc_flag = type->tp_flags & Py_TPFLAGS_HAVE_GC; destructor dealloc = type->tp_dealloc; PyThreadState *tstate = _PyThreadState_GET(); intptr_t margin = _Py_RecursionLimit_GetMargin(tstate); - if (margin < 2) { + if (margin < 2 && gc_flag) { _PyTrash_thread_deposit_object(tstate, (PyObject *)op); return; } @@ -3121,7 +3093,7 @@ _Py_Dealloc(PyObject *op) Py_XDECREF(old_exc); Py_DECREF(type); #endif - if (tstate->delete_later && margin >= 4) { + if (tstate->delete_later && margin >= 4 && gc_flag) { _PyTrash_thread_destroy_chain(tstate); } } From 41d1683e0548f14bee84b21ccf1fd837b340da04 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:33:55 +0200 Subject: [PATCH 0566/1674] [3.14] GH-133932: Tagged ints are heap safe (GH-134244) (#134494) Co-authored-by: Mark Shannon --- Include/internal/pycore_stackref.h | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h index 4b5caca5dbd126..21306b95f9c2e4 100644 --- a/Include/internal/pycore_stackref.h +++ b/Include/internal/pycore_stackref.h @@ -239,6 +239,7 @@ PyStackRef_IsNullOrInt(_PyStackRef ref); #else #define Py_INT_TAG 3 +#define Py_TAG_REFCNT 1 static inline bool PyStackRef_IsTaggedInt(_PyStackRef i) @@ -264,7 +265,7 @@ PyStackRef_UntagInt(_PyStackRef i) #ifdef Py_GIL_DISABLED -#define Py_TAG_DEFERRED (1) +#define Py_TAG_DEFERRED Py_TAG_REFCNT #define Py_TAG_PTR ((uintptr_t)0) #define Py_TAG_BITS ((uintptr_t)1) @@ -442,14 +443,13 @@ PyStackRef_AsStrongReference(_PyStackRef stackref) /* References to immortal objects always have their tag bit set to Py_TAG_REFCNT * as they can (must) have their reclamation deferred */ -#define Py_TAG_BITS 1 -#define Py_TAG_REFCNT 1 +#define Py_TAG_BITS 3 #if _Py_IMMORTAL_FLAGS != Py_TAG_REFCNT # error "_Py_IMMORTAL_FLAGS != Py_TAG_REFCNT" #endif #define BITS_TO_PTR(REF) ((PyObject *)((REF).bits)) -#define BITS_TO_PTR_MASKED(REF) ((PyObject *)(((REF).bits) & (~Py_TAG_BITS))) +#define BITS_TO_PTR_MASKED(REF) ((PyObject *)(((REF).bits) & (~Py_TAG_REFCNT))) #define PyStackRef_NULL_BITS Py_TAG_REFCNT static const _PyStackRef PyStackRef_NULL = { .bits = PyStackRef_NULL_BITS }; @@ -529,7 +529,7 @@ PyStackRef_FromPyObjectSteal(PyObject *obj) { assert(obj != NULL); #if SIZEOF_VOID_P > 4 - unsigned int tag = obj->ob_flags & Py_TAG_BITS; + unsigned int tag = obj->ob_flags & Py_TAG_REFCNT; #else unsigned int tag = _Py_IsImmortal(obj) ? Py_TAG_REFCNT : 0; #endif @@ -548,12 +548,6 @@ PyStackRef_FromPyObjectStealMortal(PyObject *obj) return ref; } -// Check if a stackref is exactly the same as another stackref, including the -// the deferred bit. This can only be used safely if you know that the deferred -// bits of `a` and `b` match. -#define PyStackRef_IsExactly(a, b) \ - (assert(((a).bits & Py_TAG_BITS) == ((b).bits & Py_TAG_BITS)), (a).bits == (b).bits) - static inline _PyStackRef _PyStackRef_FromPyObjectNew(PyObject *obj) { @@ -606,7 +600,7 @@ PyStackRef_DUP(_PyStackRef ref) static inline bool PyStackRef_IsHeapSafe(_PyStackRef ref) { - return (ref.bits & Py_TAG_BITS) == 0 || ref.bits == PyStackRef_NULL_BITS || _Py_IsImmortal(BITS_TO_PTR_MASKED(ref)); + return (ref.bits & Py_TAG_BITS) != Py_TAG_REFCNT || ref.bits == PyStackRef_NULL_BITS || _Py_IsImmortal(BITS_TO_PTR_MASKED(ref)); } static inline _PyStackRef @@ -681,7 +675,7 @@ PyStackRef_XCLOSE(_PyStackRef ref) // Note: this is a macro because MSVC (Windows) has trouble inlining it. -#define PyStackRef_Is(a, b) (((a).bits & (~Py_TAG_BITS)) == ((b).bits & (~Py_TAG_BITS))) +#define PyStackRef_Is(a, b) (((a).bits & (~Py_TAG_REFCNT)) == ((b).bits & (~Py_TAG_REFCNT))) #endif // !defined(Py_GIL_DISABLED) && defined(Py_STACKREF_DEBUG) From 57d6db529b29413f1da014a6c74b6c794f89b381 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:43:44 +0200 Subject: [PATCH 0567/1674] [3.14] gh-136289: Fix test_sqlite3 on platforms with strict UTF-8 filesystem (GH-136326) (GH-136350) (cherry picked from commit 85b817da94cf911a964d42e81a57e1de9ab71ef9) Co-authored-by: Serhiy Storchaka --- Lib/test/test_sqlite3/test_dbapi.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index c3aa3bf2d7bd9f..0ef05ff1929b24 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -31,8 +31,7 @@ import warnings from test.support import ( - SHORT_TIMEOUT, check_disallow_instantiation, requires_subprocess, - is_apple, is_emscripten, is_wasi + SHORT_TIMEOUT, check_disallow_instantiation, requires_subprocess ) from test.support import gc_collect from test.support import threading_helper, import_helper @@ -649,14 +648,21 @@ def test_open_with_path_like_object(self): self.assertTrue(os.path.exists(path)) cx.execute(self._sql) + def get_undecodable_path(self): + path = TESTFN_UNDECODABLE + if not path: + self.skipTest("only works if there are undecodable paths") + try: + open(path, 'wb').close() + except OSError: + self.skipTest(f"can't create file with undecodable path {path!r}") + unlink(path) + return path + @unittest.skipIf(sys.platform == "win32", "skipped on Windows") - @unittest.skipIf(is_apple, "skipped on Apple platforms") - @unittest.skipIf(is_emscripten or is_wasi, "not supported on Emscripten/WASI") - @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") def test_open_with_undecodable_path(self): - path = TESTFN_UNDECODABLE + path = self.get_undecodable_path() self.addCleanup(unlink, path) - self.assertFalse(os.path.exists(path)) with contextlib.closing(sqlite.connect(path)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) @@ -696,14 +702,10 @@ def test_open_uri_readonly(self): cx.execute(self._sql) @unittest.skipIf(sys.platform == "win32", "skipped on Windows") - @unittest.skipIf(is_apple, "skipped on Apple platforms") - @unittest.skipIf(is_emscripten or is_wasi, "not supported on Emscripten/WASI") - @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") def test_open_undecodable_uri(self): - path = TESTFN_UNDECODABLE + path = self.get_undecodable_path() self.addCleanup(unlink, path) uri = "file:" + urllib.parse.quote(path) - self.assertFalse(os.path.exists(path)) with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) From b2a2f032dcd82c676ab315374994227ca3a398d3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:50:02 +0200 Subject: [PATCH 0568/1674] [3.14] gh-130662: Accept leading zeros in precision/width for Fraction's formatting (GH-130663) (#136361) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sergey B Kirpichev Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/fractions.py | 4 ++-- Lib/test/test_fractions.py | 8 ++------ .../2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst | 3 +++ 3 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst diff --git a/Lib/fractions.py b/Lib/fractions.py index ef296fd6a0f632..aeae91ee4220e1 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -168,9 +168,9 @@ def _round_to_figures(n, d, figures): # A '0' that's *not* followed by another digit is parsed as a minimum width # rather than a zeropad flag. (?P0(?=[0-9]))? - (?P0|[1-9][0-9]*)? + (?P[0-9]+)? (?P[,_])? - (?:\.(?P0|[1-9][0-9]*))? + (?:\.(?P[0-9]+))? (?P[eEfFgG%]) """, re.DOTALL | re.VERBOSE).fullmatch diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 50020cd8ac5a84..1875a2f529c957 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -1515,6 +1515,8 @@ def test_format_f_presentation_type(self): (F(51, 1000), '.1f', '0.1'), (F(149, 1000), '.1f', '0.1'), (F(151, 1000), '.1f', '0.2'), + (F(22, 7), '.02f', '3.14'), # issue gh-130662 + (F(22, 7), '005.02f', '03.14'), ] for fraction, spec, expected in testcases: with self.subTest(fraction=fraction, spec=spec): @@ -1613,12 +1615,6 @@ def test_invalid_formats(self): '=010%', '>00.2f', '>00f', - # Too many zeros - minimum width should not have leading zeros - '006f', - # Leading zeros in precision - '.010f', - '.02f', - '.000f', # Missing precision '.e', '.f', diff --git a/Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst b/Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst new file mode 100644 index 00000000000000..e07200f9a3fbbd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst @@ -0,0 +1,3 @@ +Accept leading zeros in precision and width fields for +:class:`~fractions.Fraction` formatting, for example ``format(Fraction(1, +3), '.016f')``. From f87578f8317342e3795d3f2af39689388d3e6888 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:55:35 +0200 Subject: [PATCH 0569/1674] [3.14] gh-130662: Accept leading zeros in precision/width for Decimal's formatting (GH-132549) (#136362) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sergey B Kirpichev Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/_pydecimal.py | 4 ++-- Lib/test/test_decimal.py | 2 ++ .../Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 46fa9ffcb1e056..781b38ec26ba33 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -6120,9 +6120,9 @@ def _convert_for_comparison(self, other, equality_op=False): (?Pz)? (?P\#)? (?P0)? -(?P(?!0)\d+)? +(?P\d+)? (?P[,_])? -(?:\.(?P0|(?!0)\d+))? +(?:\.(?P\d+))? (?P[eEfFgGn%])? \z """, re.VERBOSE|re.DOTALL) diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 9e298401dc3dcc..ca2b0b18fb0a6d 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -982,6 +982,7 @@ def test_formatting(self): ('.0f', '0e-2', '0'), ('.0f', '3.14159265', '3'), ('.1f', '3.14159265', '3.1'), + ('.01f', '3.14159265', '3.1'), # leading zero in precision ('.4f', '3.14159265', '3.1416'), ('.6f', '3.14159265', '3.141593'), ('.7f', '3.14159265', '3.1415926'), # round-half-even! @@ -1067,6 +1068,7 @@ def test_formatting(self): ('8,', '123456', ' 123,456'), ('08,', '123456', '0,123,456'), # special case: extra 0 needed ('+08,', '123456', '+123,456'), # but not if there's a sign + ('008,', '123456', '0,123,456'), # leading zero in width (' 08,', '123456', ' 123,456'), ('08,', '-123456', '-123,456'), ('+09,', '123456', '+0,123,456'), diff --git a/Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst b/Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst new file mode 100644 index 00000000000000..d97d937376a9d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst @@ -0,0 +1,3 @@ ++Accept leading zeros in precision and width fields for ++:class:`~decimal.Decimal` formatting, for example ``format(Decimal(1.25), +'.016f')``. From f02be2dfe81c9a35eb1f03e082d5ca517a0bb790 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 12:48:04 +0200 Subject: [PATCH 0570/1674] [3.14] gh-101100: Fix sphinx warnings in `whatsnew/3.9` (GH-136163) (#136372) Co-authored-by: sobolevn --- Doc/library/random.rst | 5 +++++ Doc/tools/.nitignore | 1 - Doc/whatsnew/3.9.rst | 10 +++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index ef0cfb0e76cef6..b1120b3a4d8eb4 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -447,6 +447,11 @@ Alternative Generator Override this method in subclasses to customise the :meth:`~random.getrandbits` behaviour of :class:`!Random` instances. + .. method:: Random.randbytes(n) + + Override this method in subclasses to customise the + :meth:`~random.randbytes` behaviour of :class:`!Random` instances. + .. class:: SystemRandom([seed]) diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index e3bcb968128d96..88f22db56f9684 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -73,6 +73,5 @@ Doc/whatsnew/3.5.rst Doc/whatsnew/3.6.rst Doc/whatsnew/3.7.rst Doc/whatsnew/3.8.rst -Doc/whatsnew/3.9.rst Doc/whatsnew/3.10.rst Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 896e8f4a489649..7fd9e6ac66e6c8 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -423,8 +423,8 @@ digests. It skips MD5 on platforms that block MD5 digest. fcntl ----- -Added constants :const:`~fcntl.F_OFD_GETLK`, :const:`~fcntl.F_OFD_SETLK` -and :const:`~fcntl.F_OFD_SETLKW`. +Added constants :const:`!fcntl.F_OFD_GETLK`, :const:`!fcntl.F_OFD_SETLK` +and :const:`!fcntl.F_OFD_SETLKW`. (Contributed by Donghee Na in :issue:`38602`.) ftplib @@ -644,7 +644,7 @@ attribute. random ------ -Added a new :attr:`random.Random.randbytes` method: generate random bytes. +Added a new :meth:`random.Random.randbytes` method: generate random bytes. (Contributed by Victor Stinner in :issue:`40286`.) signal @@ -776,7 +776,7 @@ Optimizations :pep:`590` vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) -* Optimized :func:`~set.difference_update` for the case when the other set +* Optimized :meth:`!set.difference_update` for the case when the other set is much larger than the base set. (Suggested by Evgeny Kapun with code contributed by Michele Orrù in :issue:`8425`.) @@ -1139,7 +1139,7 @@ Changes in the Python API (Contributed by Christian Heimes in :issue:`36384`). * :func:`codecs.lookup` now normalizes the encoding name the same way as - :func:`encodings.normalize_encoding`, except that :func:`codecs.lookup` also + :func:`!encodings.normalize_encoding`, except that :func:`codecs.lookup` also converts the name to lower case. For example, ``"latex+latin1"`` encoding name is now normalized to ``"latex_latin1"``. (Contributed by Jordon Xu in :issue:`37751`.) From 5df4f353ad935cc65e3f056671f6d11a544ed15c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 12:55:20 +0200 Subject: [PATCH 0571/1674] [3.14] gh-135755: Document __future__.* and CO_* as proper Sphinx objects (GH-135980) (GH-136370) * Turn the __future__ table to list-table. This'll make it easier to add entries that need longer markup * Semantic markup for __future__ feature descriptions. * Document CO_* C macros. (cherry picked from commit 2468aafe984fdf923811ef0c6969e3d6c1b92a82) Co-authored-by: Petr Viktorin --- Doc/c-api/code.rst | 65 +++++++++++++++++++++++++++++++ Doc/c-api/veryhigh.rst | 8 ++-- Doc/library/__future__.rst | 78 ++++++++++++++++++++++---------------- 3 files changed, 115 insertions(+), 36 deletions(-) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 42594f063b0709..717b0da8f87c7f 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -211,6 +211,71 @@ bound into a function. .. versionadded:: 3.12 +.. _c_codeobject_flags: + +Code Object Flags +----------------- + +Code objects contain a bit-field of flags, which can be retrieved as the +:attr:`~codeobject.co_flags` Python attribute (for example using +:c:func:`PyObject_GetAttrString`), and set using a *flags* argument to +:c:func:`PyUnstable_Code_New` and similar functions. + +Flags whose names start with ``CO_FUTURE_`` correspond to features normally +selectable by :ref:`future statements `. These flags can be used in +:c:member:`PyCompilerFlags.cf_flags`. +Note that many ``CO_FUTURE_`` flags are mandatory in current versions of +Python, and setting them has no effect. + +The following flags are available. +For their meaning, see the linked documentation of their Python equivalents. + + +.. list-table:: + :widths: auto + :header-rows: 1 + + * * Flag + * Meaning + * * .. c:macro:: CO_OPTIMIZED + * :py:data:`inspect.CO_OPTIMIZED` + * * .. c:macro:: CO_NEWLOCALS + * :py:data:`inspect.CO_NEWLOCALS` + * * .. c:macro:: CO_VARARGS + * :py:data:`inspect.CO_VARARGS` + * * .. c:macro:: CO_VARKEYWORDS + * :py:data:`inspect.CO_VARKEYWORDS` + * * .. c:macro:: CO_NESTED + * :py:data:`inspect.CO_NESTED` + * * .. c:macro:: CO_GENERATOR + * :py:data:`inspect.CO_GENERATOR` + * * .. c:macro:: CO_COROUTINE + * :py:data:`inspect.CO_COROUTINE` + * * .. c:macro:: CO_ITERABLE_COROUTINE + * :py:data:`inspect.CO_ITERABLE_COROUTINE` + * * .. c:macro:: CO_ASYNC_GENERATOR + * :py:data:`inspect.CO_ASYNC_GENERATOR` + * * .. c:macro:: CO_HAS_DOCSTRING + * :py:data:`inspect.CO_HAS_DOCSTRING` + * * .. c:macro:: CO_METHOD + * :py:data:`inspect.CO_METHOD` + + * * .. c:macro:: CO_FUTURE_DIVISION + * no effect (:py:data:`__future__.division`) + * * .. c:macro:: CO_FUTURE_ABSOLUTE_IMPORT + * no effect (:py:data:`__future__.absolute_import`) + * * .. c:macro:: CO_FUTURE_WITH_STATEMENT + * no effect (:py:data:`__future__.with_statement`) + * * .. c:macro:: CO_FUTURE_PRINT_FUNCTION + * no effect (:py:data:`__future__.print_function`) + * * .. c:macro:: CO_FUTURE_UNICODE_LITERALS + * no effect (:py:data:`__future__.unicode_literals`) + * * .. c:macro:: CO_FUTURE_GENERATOR_STOP + * no effect (:py:data:`__future__.generator_stop`) + * * .. c:macro:: CO_FUTURE_ANNOTATIONS + * :py:data:`__future__.annotations` + + Extra information ----------------- diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 1ef4181d52eb10..fb07fec7effce8 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -361,7 +361,7 @@ the same library that the Python runtime is using. :py:mod:`!ast` Python module, which exports these constants under the same names. - .. c:var:: int CO_FUTURE_DIVISION - - This bit can be set in *flags* to cause division operator ``/`` to be - interpreted as "true division" according to :pep:`238`. + The "``PyCF``" flags above can be combined with "``CO_FUTURE``" flags such + as :c:macro:`CO_FUTURE_ANNOTATIONS` to enable features normally + selectable using :ref:`future statements `. + See :ref:`c_codeobject_flags` for a complete list. diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 4f3b663006fb28..5d916b30112d3c 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -37,38 +37,52 @@ 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 language using this mechanism: -+------------------+-------------+--------------+---------------------------------------------+ -| feature | optional in | mandatory in | effect | -+==================+=============+==============+=============================================+ -| nested_scopes | 2.1.0b1 | 2.2 | :pep:`227`: | -| | | | *Statically Nested Scopes* | -+------------------+-------------+--------------+---------------------------------------------+ -| generators | 2.2.0a1 | 2.3 | :pep:`255`: | -| | | | *Simple Generators* | -+------------------+-------------+--------------+---------------------------------------------+ -| division | 2.2.0a2 | 3.0 | :pep:`238`: | -| | | | *Changing the Division Operator* | -+------------------+-------------+--------------+---------------------------------------------+ -| absolute_import | 2.5.0a1 | 3.0 | :pep:`328`: | -| | | | *Imports: Multi-Line and Absolute/Relative* | -+------------------+-------------+--------------+---------------------------------------------+ -| with_statement | 2.5.0a1 | 2.6 | :pep:`343`: | -| | | | *The "with" Statement* | -+------------------+-------------+--------------+---------------------------------------------+ -| print_function | 2.6.0a2 | 3.0 | :pep:`3105`: | -| | | | *Make print a function* | -+------------------+-------------+--------------+---------------------------------------------+ -| unicode_literals | 2.6.0a2 | 3.0 | :pep:`3112`: | -| | | | *Bytes literals in Python 3000* | -+------------------+-------------+--------------+---------------------------------------------+ -| generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | -| | | | *StopIteration handling inside generators* | -+------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | Never [1]_ | :pep:`563`: | -| | | | *Postponed evaluation of annotations*, | -| | | | :pep:`649`: *Deferred evaluation of | -| | | | annotations using descriptors* | -+------------------+-------------+--------------+---------------------------------------------+ + +.. list-table:: + :widths: auto + :header-rows: 1 + + * * feature + * optional in + * mandatory in + * effect + * * .. data:: nested_scopes + * 2.1.0b1 + * 2.2 + * :pep:`227`: *Statically Nested Scopes* + * * .. data:: generators + * 2.2.0a1 + * 2.3 + * :pep:`255`: *Simple Generators* + * * .. data:: division + * 2.2.0a2 + * 3.0 + * :pep:`238`: *Changing the Division Operator* + * * .. data:: absolute_import + * 2.5.0a1 + * 3.0 + * :pep:`328`: *Imports: Multi-Line and Absolute/Relative* + * * .. data:: with_statement + * 2.5.0a1 + * 2.6 + * :pep:`343`: *The “with” Statement* + * * .. data:: print_function + * 2.6.0a2 + * 3.0 + * :pep:`3105`: *Make print a function* + * * .. data:: unicode_literals + * 2.6.0a2 + * 3.0 + * :pep:`3112`: *Bytes literals in Python 3000* + * * .. data:: generator_stop + * 3.5.0b1 + * 3.7 + * :pep:`479`: *StopIteration handling inside generators* + * * .. data:: annotations + * 3.7.0b1 + * Never [1]_ + * :pep:`563`: *Postponed evaluation of annotations*, + :pep:`649`: *Deferred evaluation of annotations using descriptors* .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. From 236498c8457c2c7f3e03ab423231ac41bc5bbd8d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 13:07:23 +0200 Subject: [PATCH 0572/1674] [3.14] gh-131591: Document Py_REMOTE_DEBUG (GH-135929) (GH-136374) gh-131591: Document Py_REMOTE_DEBUG (GH-135929) (cherry picked from commit 9aac5a3d44d7191001660aed3a383b062ee4b29b) Co-authored-by: Petr Viktorin --- Doc/using/configure.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index a26d48d7d0a345..e5fe3c72b1b26e 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -686,6 +686,13 @@ also be used to improve performance. not compiled. This includes both the functionality to schedule code to be executed and the functionality to receive code to be executed. + .. c:macro:: Py_REMOTE_DEBUG + + This macro is defined by default, unless Python is configured with + :option:`--without-remote-debug`. + + Note that even if the macro is defined, remote debugging may not be + available (for example, on an incompatible platform). .. versionadded:: 3.14 From a7dd48acbaa7eff6972fb3b96cbce6325eecb0d9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 13:27:54 +0200 Subject: [PATCH 0573/1674] [3.14] gh-86682: Add versionadded for sys._getframemodulename (GH-136325) (#136375) gh-86682: Add versionadded for sys._getframemodulename (GH-136325) add versionadded for sys._getframemodulename (cherry picked from commit 11f074b243756bca0db5a7d35dd84f00879de616) Co-authored-by: Anthony Sottile --- Doc/library/sys.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 1626a89a0731bf..05bc7cfb9dc089 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -953,6 +953,8 @@ always available. Unless explicitly noted otherwise, all variables are read-only This function should be used for internal and specialized purposes only. It is not guaranteed to exist in all implementations of Python. + .. versionadded:: 3.12 + .. function:: getobjects(limit[, type]) From d9c36a7aa6a570de8dea3a30c8eb82b13fcc80a2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 14:57:37 +0200 Subject: [PATCH 0574/1674] [3.14] gh-124486: Fix test_whichdb_ndbm in test_dbm on NetBSD (GH-136335) (GH-136378) On NetBSD, ndbm.open() does not fail for empty file. (cherry picked from commit b7aa2a4b4df697db6ea45a555eeb3fefa5ca5bd4) Co-authored-by: Serhiy Storchaka --- Lib/test/test_dbm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py index a10922a403ec38..014c190285c402 100644 --- a/Lib/test/test_dbm.py +++ b/Lib/test/test_dbm.py @@ -213,7 +213,8 @@ def test_whichdb(self): @unittest.skipUnless(ndbm, reason='Test requires ndbm') def test_whichdb_ndbm(self): # Issue 17198: check that ndbm which is referenced in whichdb is defined - with open(_fname + '.db', 'wb'): pass + with open(_fname + '.db', 'wb') as f: + f.write(b'spam') _bytes_fname = os.fsencode(_fname) fnames = [_fname, os_helper.FakePath(_fname), _bytes_fname, os_helper.FakePath(_bytes_fname)] From 442b781cfc012558106f00f4a026ca3f22587f77 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 18:24:24 +0200 Subject: [PATCH 0575/1674] [3.14] gh-87790: support thousands separators for formatting fractional part of Fraction (GH-132204) (#136364) Co-authored-by: Sergey B Kirpichev --- Lib/fractions.py | 10 +++++++++- Lib/test/test_fractions.py | 13 +++++++++++++ .../2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst diff --git a/Lib/fractions.py b/Lib/fractions.py index aeae91ee4220e1..a497ee19935345 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -170,7 +170,11 @@ def _round_to_figures(n, d, figures): (?P0(?=[0-9]))? (?P[0-9]+)? (?P[,_])? - (?:\.(?P[0-9]+))? + (?:\. + (?=[,_0-9]) # lookahead for digit or separator + (?P[0-9]+)? + (?P[,_])? + )? (?P[eEfFgG%]) """, re.DOTALL | re.VERBOSE).fullmatch @@ -499,6 +503,7 @@ def _format_float_style(self, match): minimumwidth = int(match["minimumwidth"] or "0") thousands_sep = match["thousands_sep"] precision = int(match["precision"] or "6") + frac_sep = match["frac_separators"] or "" presentation_type = match["presentation_type"] trim_zeros = presentation_type in "gG" and not alternate_form trim_point = not alternate_form @@ -555,6 +560,9 @@ def _format_float_style(self, match): if trim_zeros: frac_part = frac_part.rstrip("0") separator = "" if trim_point and not frac_part else "." + if frac_sep: + frac_part = frac_sep.join(frac_part[pos:pos + 3] + for pos in range(0, len(frac_part), 3)) trailing = separator + frac_part + suffix # Do zero padding if required. diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 1875a2f529c957..cf42b86358dbca 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -1322,6 +1322,8 @@ def test_format_e_presentation_type(self): # Thousands separators (F('1234567.123456'), ',.5e', '1.23457e+06'), (F('123.123456'), '012_.2e', '0_001.23e+02'), + # Thousands separators for fractional part (or for integral too) + (F('1234567.123456'), '.5_e', '1.234_57e+06'), # z flag is legal, but never makes a difference to the output (F(-1, 7**100), 'z.6e', '-3.091690e-85'), ] @@ -1447,6 +1449,12 @@ def test_format_f_presentation_type(self): (F('1234567'), ',.2f', '1,234,567.00'), (F('12345678'), ',.2f', '12,345,678.00'), (F('12345678'), ',f', '12,345,678.000000'), + # Thousands separators for fractional part (or for integral too) + (F('123456.789123123'), '._f', '123456.789_123'), + (F('123456.789123123'), '.7_f', '123456.789_123_1'), + (F('123456.789123123'), '.9_f', '123456.789_123_123'), + (F('123456.789123123'), '.,f', '123456.789,123'), + (F('123456.789123123'), '_.,f', '123_456.789,123'), # Underscore as thousands separator (F(2, 3), '_.2f', '0.67'), (F(2, 3), '_.7f', '0.6666667'), @@ -1620,6 +1628,11 @@ def test_invalid_formats(self): '.f', '.g', '.%', + # Thousands separators before precision + '._6e', + '._6f', + '._6g', + '._6%', # Z instead of z for negative zero suppression 'Z.2f' # z flag not supported for general formatting diff --git a/Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst b/Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst new file mode 100644 index 00000000000000..be2a30d69cab45 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst @@ -0,0 +1,2 @@ +Support underscore and comma as thousands separators in the fractional part +for :class:`~fractions.Fraction`'s formatting. Patch by Sergey B Kirpichev. From e25531331b8af9aff46986890826855e602c8201 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 18:24:30 +0200 Subject: [PATCH 0576/1674] [3.14] gh-87790: support thousands separators for formatting fractional part of Decimal (GH-132202) (#136365) Co-authored-by: Sergey B Kirpichev Co-authored-by: Serhiy Storchaka --- Lib/_pydecimal.py | 14 +++++++++++++- Lib/test/test_decimal.py | 13 +++++++++++++ .../2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 781b38ec26ba33..9b8e42a2342536 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -6122,7 +6122,11 @@ def _convert_for_comparison(self, other, equality_op=False): (?P0)? (?P\d+)? (?P[,_])? -(?:\.(?P\d+))? +(?:\. + (?=[\d,_]) # lookahead for digit or separator + (?P\d+)? + (?P[,_])? +)? (?P[eEfFgGn%])? \z """, re.VERBOSE|re.DOTALL) @@ -6215,6 +6219,9 @@ def _parse_format_specifier(format_spec, _localeconv=None): format_dict['grouping'] = [3, 0] format_dict['decimal_point'] = '.' + if format_dict['frac_separators'] is None: + format_dict['frac_separators'] = '' + return format_dict def _format_align(sign, body, spec): @@ -6334,6 +6341,11 @@ def _format_number(is_negative, intpart, fracpart, exp, spec): sign = _format_sign(is_negative, spec) + frac_sep = spec['frac_separators'] + if fracpart and frac_sep: + fracpart = frac_sep.join(fracpart[pos:pos + 3] + for pos in range(0, len(fracpart), 3)) + if fracpart or spec['alt']: fracpart = spec['decimal_point'] + fracpart diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index ca2b0b18fb0a6d..c621b7ac08c3ac 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -1090,6 +1090,15 @@ def test_formatting(self): ('07_', '1234.56', '1_234.56'), ('_', '1.23456789', '1.23456789'), ('_%', '123.456789', '12_345.6789%'), + # and now for something completely different... + ('.,', '1.23456789', '1.234,567,89'), + ('._', '1.23456789', '1.234_567_89'), + ('.6_f', '12345.23456789', '12345.234_568'), + (',._%', '123.456789', '12,345.678_9%'), + (',._e', '123456', '1.234_56e+5'), + (',.4_e', '123456', '1.234_6e+5'), + (',.3_e', '123456', '1.235e+5'), + (',._E', '123456', '1.234_56E+5'), # negative zero: default behavior ('.1f', '-0', '-0.0'), @@ -1163,6 +1172,10 @@ def test_formatting(self): # bytes format argument self.assertRaises(TypeError, Decimal(1).__format__, b'-020') + # precision or fractional part separator should follow after dot + self.assertRaises(ValueError, format, Decimal(1), '.f') + self.assertRaises(ValueError, format, Decimal(1), '._6f') + def test_negative_zero_format_directed_rounding(self): with self.decimal.localcontext() as ctx: ctx.rounding = ROUND_CEILING diff --git a/Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst b/Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst new file mode 100644 index 00000000000000..cf80c71271bbd1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst @@ -0,0 +1,2 @@ +Support underscore and comma as thousands separators in the fractional part +for :class:`~decimal.Decimal`'s formatting. Patch by Sergey B Kirpichev. From 5a7d266fcbb35f772de4f20850710f03c06b8793 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 18:50:56 +0200 Subject: [PATCH 0577/1674] [3.14] gh-101100: Fix Sphinx warnings in library/email.compat32-message.rst (GH-136323) (#136389) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/email.compat32-message.rst | 18 +++++++++--------- Doc/tools/.nitignore | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index 4285c436e8da80..5754c2b65b239f 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -181,7 +181,7 @@ Here are the methods of the :class:`Message` class: :meth:`set_payload` instead. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by :meth:`~email.message.EmailMessage.set_content` and the related ``make`` and ``add`` methods. @@ -224,7 +224,7 @@ Here are the methods of the :class:`Message` class: ASCII charset. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by :meth:`~email.message.EmailMessage.get_content` and :meth:`~email.message.EmailMessage.iter_parts`. @@ -236,7 +236,7 @@ Here are the methods of the :class:`Message` class: the message's default character set; see :meth:`set_charset` for details. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by :meth:`~email.message.EmailMessage.set_content`. @@ -265,9 +265,9 @@ Here are the methods of the :class:`Message` class: using that :mailheader:`Content-Transfer-Encoding` and is not modified. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by the *charset* parameter of the - :meth:`email.emailmessage.EmailMessage.set_content` method. + :meth:`email.message.EmailMessage.set_content` method. .. method:: get_charset() @@ -276,7 +276,7 @@ Here are the methods of the :class:`Message` class: message's payload. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class it always returns + :class:`~email.message.EmailMessage` class it always returns ``None``. @@ -486,7 +486,7 @@ Here are the methods of the :class:`Message` class: search instead of :mailheader:`Content-Type`. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by the *params* property of the individual header objects returned by the header access methods. @@ -524,7 +524,7 @@ Here are the methods of the :class:`Message` class: to ``False``. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by the *params* property of the individual header objects returned by the header access methods. @@ -579,7 +579,7 @@ Here are the methods of the :class:`Message` class: header is also added. This is a legacy method. On the - :class:`~email.emailmessage.EmailMessage` class its functionality is + :class:`~email.message.EmailMessage` class its functionality is replaced by the ``make_`` and ``add_`` methods. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 88f22db56f9684..eb760e0fac5e37 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -15,7 +15,6 @@ Doc/extending/extending.rst Doc/library/ast.rst Doc/library/asyncio-extending.rst Doc/library/email.charset.rst -Doc/library/email.compat32-message.rst Doc/library/email.parser.rst Doc/library/exceptions.rst Doc/library/functools.rst From c72699086fe49ed127c1276e96027729381ea8c7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:21:28 +0200 Subject: [PATCH 0578/1674] [3.14] gh-135906: Use `_PyObject_CAST` in internal headers (GH-135892) (GH-136392) gh-135906: Use `_PyObject_CAST` in internal headers (GH-135892) Fixes build errors encountered in python-greenlet/greenlet#450 when building greenlet on the free-threaded build. --------- (cherry picked from commit fe187fae8d8321f1b8d3c9560a35efe904de4217) Co-authored-by: Charlie Lin Co-authored-by: Peter Bierma Co-authored-by: Victor Stinner --- Include/internal/pycore_object.h | 4 ++-- Include/internal/pycore_stackref.h | 2 +- .../next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 1f9c7b1bf55b3f..12c5614834f565 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -614,7 +614,7 @@ static inline PyObject * _Py_XGetRef(PyObject **ptr) { for (;;) { - PyObject *value = _Py_atomic_load_ptr(ptr); + PyObject *value = _PyObject_CAST(_Py_atomic_load_ptr(ptr)); if (value == NULL) { return value; } @@ -629,7 +629,7 @@ _Py_XGetRef(PyObject **ptr) static inline PyObject * _Py_TryXGetRef(PyObject **ptr) { - PyObject *value = _Py_atomic_load_ptr(ptr); + PyObject *value = _PyObject_CAST(_Py_atomic_load_ptr(ptr)); if (value == NULL) { return value; } diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h index 21306b95f9c2e4..0ce759fc743d82 100644 --- a/Include/internal/pycore_stackref.h +++ b/Include/internal/pycore_stackref.h @@ -765,7 +765,7 @@ _Py_TryIncrefCompareStackRef(PyObject **src, PyObject *op, _PyStackRef *out) static inline int _Py_TryXGetStackRef(PyObject **src, _PyStackRef *out) { - PyObject *op = _Py_atomic_load_ptr_relaxed(src); + PyObject *op = _PyObject_CAST(_Py_atomic_load_ptr_relaxed(src)); if (op == NULL) { *out = PyStackRef_NULL; return 1; diff --git a/Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst b/Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst new file mode 100644 index 00000000000000..7852759a702804 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst @@ -0,0 +1 @@ +Fix compilation errors when compiling the internal headers with a C++ compiler. From e1e9d9535239537dcd4e161654fb324751a89ab4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 04:34:18 +0200 Subject: [PATCH 0579/1674] [3.14] gh-136032: Fix `argparse.BooleanOptionalAction` doc (GH-136133) (#136329) gh-136032: Fix `argparse.BooleanOptionalAction` doc (GH-136133) (cherry picked from commit 1953713d0d67a4f54ff75bf8449895a2f08cc750) Co-authored-by: W. H. Wang --- Doc/library/argparse.rst | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index a03d88092dbf1f..f189f6b8fa8953 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -839,23 +839,11 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args(['--version']) PROG 2.0 -Only actions that consume command-line arguments (e.g. ``'store'``, -``'append'`` or ``'extend'``) can be used with positional arguments. - -.. class:: BooleanOptionalAction - - 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) - - .. versionadded:: 3.9 +You may also specify an arbitrary action by passing an :class:`Action` subclass +(e.g. :class:`BooleanOptionalAction`) or other object that implements the same +interface. Only actions that consume command-line arguments (e.g. ``'store'``, +``'append'``, ``'extend'``, or custom actions with non-zero ``nargs``) can be used +with positional arguments. The recommended way to create a custom action is to extend :class:`Action`, overriding the :meth:`!__call__` method and optionally the :meth:`!__init__` and @@ -1429,6 +1417,21 @@ this API may be passed as the ``action`` parameter to 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. +.. class:: BooleanOptionalAction + + A subclass of :class:`Action` for handling boolean flags with positive + and negative options. Adding a single argument such as ``--foo`` automatically + creates both ``--foo`` and ``--no-foo`` options, storing ``True`` and ``False`` + respectively:: + + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) + >>> parser.parse_args(['--no-foo']) + Namespace(foo=False) + + .. versionadded:: 3.9 + The parse_args() method ----------------------- From 78e5d109f54351bb2360a32e1cdcdd6a09b08791 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 08:03:03 +0200 Subject: [PATCH 0580/1674] [3.14] gh-135913: Document ob_refcnt, ob_type, ob_size (GH-135914) (GH-136377) gh-135913: Document ob_refcnt, ob_type, ob_size (GH-135914) * gh-135913: Document ob_refcnt, ob_type, ob_size In `typeobj.rst`, instead of `:c:member:` it would be better to use `.. c:member::` with a `:no-index:` option, see: See ref. https://www.sphinx-doc.org/en/master/usage/domains/index.html#basic-markup However, `c:member` currently does not support `:no-index:`. (cherry picked from commit 73e1207a4ebdb3b43d597cd6c288dae6d7d1dbdb) Co-authored-by: Petr Viktorin --- Doc/c-api/structures.rst | 75 +++++++++++++++++++++++++++++++--------- Doc/c-api/typeobj.rst | 11 +++--- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 987bc167c68d6c..58dd915e04f619 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -28,18 +28,52 @@ under :ref:`reference counting `. object. In a normal "release" build, it contains only the object's reference count and a pointer to the corresponding type object. Nothing is actually declared to be a :c:type:`PyObject`, but every pointer - to a Python object can be cast to a :c:expr:`PyObject*`. Access to the - members must be done by using the macros :c:macro:`Py_REFCNT` and - :c:macro:`Py_TYPE`. + to a Python object can be cast to a :c:expr:`PyObject*`. + + The members must not be accessed directly; instead use macros such as + :c:macro:`Py_REFCNT` and :c:macro:`Py_TYPE`. + + .. c:member:: Py_ssize_t ob_refcnt + + The object's reference count, as returned by :c:macro:`Py_REFCNT`. + Do not use this field directly; instead use functions and macros such as + :c:macro:`!Py_REFCNT`, :c:func:`Py_INCREF` and :c:func:`Py_DecRef`. + + The field type may be different from ``Py_ssize_t``, depending on + build configuration and platform. + + .. c:member:: PyTypeObject* ob_type + + The object's type. + Do not use this field directly; use :c:macro:`Py_TYPE` and + :c:func:`Py_SET_TYPE` instead. .. c:type:: PyVarObject - This is an extension of :c:type:`PyObject` that adds the :c:member:`~PyVarObject.ob_size` - field. This is only used for objects that have some notion of *length*. - This type does not often appear in the Python/C API. - Access to the members must be done by using the macros - :c:macro:`Py_REFCNT`, :c:macro:`Py_TYPE`, and :c:macro:`Py_SIZE`. + An extension of :c:type:`PyObject` that adds the + :c:member:`~PyVarObject.ob_size` field. + This is intended for objects that have some notion of *length*. + + As with :c:type:`!PyObject`, the members must not be accessed directly; + instead use macros such as :c:macro:`Py_SIZE`, :c:macro:`Py_REFCNT` and + :c:macro:`Py_TYPE`. + + .. c:member:: Py_ssize_t ob_size + + A size field, whose contents should be considered an object's internal + implementation detail. + + Do not use this field directly; use :c:macro:`Py_SIZE` instead. + + Object creation functions such as :c:func:`PyObject_NewVar` will + generally set this field to the requested size (number of items). + After creation, arbitrary values can be stored in :c:member:`!ob_size` + using :c:macro:`Py_SET_SIZE`. + + To get an object's publicly exposed length, as returned by + the Python function :py:func:`len`, use :c:func:`PyObject_Length` + instead. .. c:macro:: PyObject_HEAD @@ -103,9 +137,8 @@ under :ref:`reference counting `. Get the type of the Python object *o*. - Return a :term:`borrowed reference`. - - Use the :c:func:`Py_SET_TYPE` function to set an object type. + The returned reference is :term:`borrowed ` from *o*. + Do not release it with :c:func:`Py_DECREF` or similar. .. versionchanged:: 3.11 :c:func:`Py_TYPE()` is changed to an inline static function. @@ -122,16 +155,26 @@ under :ref:`reference counting `. .. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type) - Set the object *o* type to *type*. + Set the type of object *o* to *type*, without any checking or reference + counting. + + This is a very low-level operation. + Consider instead setting the Python attribute :attr:`~object.__class__` + using :c:func:`PyObject_SetAttrString` or similar. + + Note that assigning an incompatible type can lead to undefined behavior. + + If *type* is a :ref:`heap type `, the caller must create a + new reference to it. + Similarly, if the old type of *o* is a heap type, the caller must release + a reference to that type. .. versionadded:: 3.9 .. c:function:: Py_ssize_t Py_SIZE(PyVarObject *o) - Get the size of the Python object *o*. - - Use the :c:func:`Py_SET_SIZE` function to set an object size. + Get the :c:member:`~PyVarObject.ob_size` field of *o*. .. versionchanged:: 3.11 :c:func:`Py_SIZE()` is changed to an inline static function. @@ -140,7 +183,7 @@ under :ref:`reference counting `. .. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) - Set the object *o* size to *size*. + Set the :c:member:`~PyVarObject.ob_size` field of *o* to *size*. .. versionadded:: 3.9 diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index af2bead3bb5004..060d6f60174b41 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -492,9 +492,9 @@ metatype) initializes :c:member:`~PyTypeObject.tp_itemsize`, which means that it type objects) *must* have the :c:member:`~PyVarObject.ob_size` field. -.. c:member:: Py_ssize_t PyObject.ob_refcnt +:c:member:`PyObject.ob_refcnt` - This is the type object's reference count, initialized to ``1`` by the + The type object's reference count is initialized to ``1`` by the ``PyObject_HEAD_INIT`` macro. Note that for :ref:`statically allocated type objects `, the type's instances (objects whose :c:member:`~PyObject.ob_type` points back to the type) do *not* count as references. But for @@ -506,7 +506,7 @@ type objects) *must* have the :c:member:`~PyVarObject.ob_size` field. This field is not inherited by subtypes. -.. c:member:: PyTypeObject* PyObject.ob_type +:c:member:`PyObject.ob_type` This is the type's type, in other words its metatype. It is initialized by the argument to the ``PyObject_HEAD_INIT`` macro, and its value should normally be @@ -532,14 +532,13 @@ type objects) *must* have the :c:member:`~PyVarObject.ob_size` field. PyVarObject Slots ----------------- -.. c:member:: Py_ssize_t PyVarObject.ob_size +:c:member:`PyVarObject.ob_size` For :ref:`statically allocated type objects `, this should be initialized to zero. For :ref:`dynamically allocated type objects `, this field has a special internal meaning. - This field should be accessed using the :c:func:`Py_SIZE()` and - :c:func:`Py_SET_SIZE()` macros. + This field should be accessed using the :c:func:`Py_SIZE()` macro. **Inheritance:** From cdeaa64214ab154b43ddb8d9b97b28f3e3459cec Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 08:24:08 +0200 Subject: [PATCH 0581/1674] [3.14] gh-102567: Add missing newline to `--help-all` (GH-136391) (GH-136403) gh-102567: Add missing newline to `--help-all` (GH-136391) (cherry picked from commit fbef0c1d6a6540f5063138b861f79bdb2a935b0a) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Python/initconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/initconfig.c b/Python/initconfig.c index 25e30aa648e8aa..62bcb727d1b9bf 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -312,7 +312,7 @@ The following implementation-specific options are available:\n\ "-X gil=[0|1]: enable (1) or disable (0) the GIL; also PYTHON_GIL\n" #endif "\ --X importtime[=2]: show how long each import takes; use -X importtime=2 to\ +-X importtime[=2]: show how long each import takes; use -X importtime=2 to\n\ log imports of already-loaded modules; also PYTHONPROFILEIMPORTTIME\n\ -X int_max_str_digits=N: limit the size of int<->str conversions;\n\ 0 disables the limit; also PYTHONINTMAXSTRDIGITS\n\ From 2733b290ea74e073ded5fef9b825f40185d0db44 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 08:47:17 +0200 Subject: [PATCH 0582/1674] [3.14] gh-101100: Fix sphinx warnings in `whatsnew/3.11.rst` (GH-136402) (#136405) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/tools/.nitignore | 1 - Doc/whatsnew/3.11.rst | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index eb760e0fac5e37..e29775b075a82f 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -73,4 +73,3 @@ Doc/whatsnew/3.6.rst Doc/whatsnew/3.7.rst Doc/whatsnew/3.8.rst Doc/whatsnew/3.10.rst -Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 2dd205dd2b8831..abf9677fd9cac5 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1292,7 +1292,7 @@ This section covers specific optimizations independent of the (Contributed by Stefan Behnel in :gh:`68264`.) * Resizing lists is streamlined for the common case, - speeding up :meth:`list.append` by ≈15% + speeding up :meth:`!list.append` by ≈15% and simple :term:`list comprehension`\s by up to 20-30% (Contributed by Dennis Sweeney in :gh:`91165`.) From 3296d9bcfd51d4df58d437264182ee421b8cd2ca Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 09:03:40 +0200 Subject: [PATCH 0583/1674] [3.14] gh-136155: Docs: only add custom OpenGraph protocol meta tags for HTML builds (GH-136187) (#136382) Co-authored-by: Maciej Olko Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Doc/conf.py | 19 ++++++++++--------- ...-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst diff --git a/Doc/conf.py b/Doc/conf.py index 161c2986441edd..8b2a8f20fcc558 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -635,13 +635,14 @@ 'image': '_static/og-image.png', 'line_color': '#3776ab', } -ogp_custom_meta_tags = [ - '', -] -if 'create-social-cards' not in tags: # noqa: F821 - # Define a static preview image when not creating social cards - ogp_image = '_static/og-image.png' - ogp_custom_meta_tags += [ - '', - '', +if 'builder_html' in tags: # noqa: F821 + ogp_custom_meta_tags = [ + '', ] + if 'create-social-cards' not in tags: # noqa: F821 + # Define a static preview image when not creating social cards + ogp_image = '_static/og-image.png' + ogp_custom_meta_tags += [ + '', + '', + ] diff --git a/Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst b/Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst new file mode 100644 index 00000000000000..0341b5f7f0d5e6 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst @@ -0,0 +1 @@ +EPUB builds are fixed by excluding non-XHTML-compatible tags. From 145c08629bc2df2176cd03b69215e652e3f946c4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:16:51 +0200 Subject: [PATCH 0584/1674] [3.14] gh-136297: Fix `hypothesis` and `subTest` usage in `test_zoneinfo_property.py` (GH-136384) (#136407) gh-136297: Fix `hypothesis` and `subTest` usage in `test_zoneinfo_property.py` (GH-136384) (cherry picked from commit db699db99d214dccb7c4849fa609fdd5188ee038) Co-authored-by: sobolevn --- Lib/test/test_zoneinfo/test_zoneinfo_property.py | 16 +++++++--------- Tools/requirements-hypothesis.txt | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_zoneinfo/test_zoneinfo_property.py b/Lib/test/test_zoneinfo/test_zoneinfo_property.py index 294c7e9b27a857..c00815e2fd4c36 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo_property.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo_property.py @@ -147,23 +147,21 @@ def setUp(self): def test_pickle_unpickle_cache(self, key): zi = self.klass(key) for proto in range(pickle.HIGHEST_PROTOCOL + 1): - with self.subTest(proto=proto): - pkl_str = pickle.dumps(zi, proto) - zi_rt = pickle.loads(pkl_str) + pkl_str = pickle.dumps(zi, proto) + zi_rt = pickle.loads(pkl_str) - self.assertIs(zi, zi_rt) + self.assertIs(zi, zi_rt) @hypothesis.given(key=valid_keys()) @add_key_examples def test_pickle_unpickle_no_cache(self, key): zi = self.klass.no_cache(key) for proto in range(pickle.HIGHEST_PROTOCOL + 1): - with self.subTest(proto=proto): - pkl_str = pickle.dumps(zi, proto) - zi_rt = pickle.loads(pkl_str) + pkl_str = pickle.dumps(zi, proto) + zi_rt = pickle.loads(pkl_str) - self.assertIsNot(zi, zi_rt) - self.assertEqual(str(zi), str(zi_rt)) + self.assertIsNot(zi, zi_rt) + self.assertEqual(str(zi), str(zi_rt)) @hypothesis.given(key=valid_keys()) @add_key_examples diff --git a/Tools/requirements-hypothesis.txt b/Tools/requirements-hypothesis.txt index 66898885c0a412..e5deac497fbe3f 100644 --- a/Tools/requirements-hypothesis.txt +++ b/Tools/requirements-hypothesis.txt @@ -1,4 +1,4 @@ # Requirements file for hypothesis that # we use to run our property-based tests in CI. -hypothesis==6.111.2 +hypothesis==6.135.26 From 376e037eccdb7a75c28725b470bd7f916a9bb987 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:43:57 +0200 Subject: [PATCH 0585/1674] [3.14] gh-120713: Make _Py_NORMALIZE_CENTURY private (GH-135933) (#136387) Co-authored-by: Petr Viktorin --- Modules/_datetimemodule.c | 2 +- configure | 2 +- configure.ac | 2 +- pyconfig.h.in | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 9bba0e3354b26b..f5a9712b64e4de 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1928,7 +1928,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, } replacement = freplacement; } -#ifdef Py_NORMALIZE_CENTURY +#ifdef _Py_NORMALIZE_CENTURY else if (ch == 'Y' || ch == 'G' || ch == 'F' || ch == 'C' ) { diff --git a/configure b/configure index a9257ac0b3ac30..1646efe5f061ca 100755 --- a/configure +++ b/configure @@ -28234,7 +28234,7 @@ printf "%s\n" "$ac_cv_normalize_century" >&6; } if test "$ac_cv_normalize_century" = yes then -printf "%s\n" "#define Py_NORMALIZE_CENTURY 1" >>confdefs.h +printf "%s\n" "#define _Py_NORMALIZE_CENTURY 1" >>confdefs.h fi diff --git a/configure.ac b/configure.ac index 225dfc79ab5b29..d868f7b26bad1c 100644 --- a/configure.ac +++ b/configure.ac @@ -6813,7 +6813,7 @@ int main(void) [ac_cv_normalize_century=yes])]) if test "$ac_cv_normalize_century" = yes then - AC_DEFINE([Py_NORMALIZE_CENTURY], [1], + AC_DEFINE([_Py_NORMALIZE_CENTURY], [1], [Define if year with century should be normalized for strftime.]) fi diff --git a/pyconfig.h.in b/pyconfig.h.in index d7c496fccc682c..1c533b2bfb7fb4 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1737,9 +1737,6 @@ SipHash13: 3, externally defined: 0 */ #undef Py_HASH_ALGORITHM -/* Define if year with century should be normalized for strftime. */ -#undef Py_NORMALIZE_CENTURY - /* Define if you want to enable remote debugging support. */ #undef Py_REMOTE_DEBUG @@ -2026,6 +2023,9 @@ /* HACL* library can compile SIMD256 implementations */ #undef _Py_HACL_CAN_COMPILE_VEC256 +/* Define if year with century should be normalized for strftime. */ +#undef _Py_NORMALIZE_CENTURY + /* Define to force use of thread-safe errno, h_errno, and other functions */ #undef _REENTRANT From 7ec1faba0c85d28ae490555f0922c86eb50e874b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 8 Jul 2025 11:56:46 +0300 Subject: [PATCH 0586/1674] Python 3.14.0b4 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 373 ++++++++++++-- Misc/NEWS.d/3.14.0b4.rst | 484 ++++++++++++++++++ ...-05-19-18-09-20.gh-issue-134273.ZAliyy.rst | 1 - ...-06-25-01-03-10.gh-issue-135906.UBrCWq.rst | 1 - ...-05-31-19-24-54.gh-issue-134280.NDVbzY.rst | 2 - ...-06-16-02-31-42.gh-issue-135543.6b0HOF.rst | 2 - ...-06-17-12-50-48.gh-issue-135608.PnHckD.rst | 1 - ...-06-17-22-34-58.gh-issue-135607.ucsLVu.rst | 2 - ...-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst | 2 - ...-06-23-18-08-32.gh-issue-135871.50C528.rst | 2 - ...-06-24-06-41-47.gh-issue-129958.EaJuS0.rst | 2 - ...5-06-26-15-25-51.gh-issue-78465.MbDN8X.rst | 2 - ...-07-06-14-53-19.gh-issue-109700.KVNQQi.rst | 1 - ...-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst | 1 - ...-03-11-05-24-14.gh-issue-130664.g0yNMm.rst | 4 - ...5-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst | 2 - ...5-04-07-10-20-16.gh-issue-87790.X2SjJe.rst | 2 - ...-06-02-14-28-30.gh-issue-130662.EIgIR8.rst | 3 - ...-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst | 3 - ...-06-03-12-59-17.gh-issue-135069.xop30V.rst | 3 - ...-06-10-21-42-04.gh-issue-135335.WnUqb_.rst | 2 - ...-06-14-12-06-55.gh-issue-135487.KdVFff.rst | 2 - ...-06-16-15-03-03.gh-issue-135561.mJCN8D.rst | 2 - ...-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst | 2 - ...-06-17-23-13-56.gh-issue-135557.Bfcy4v.rst | 2 - ...-06-18-11-43-17.gh-issue-135646.r7ekEn.rst | 1 - ...-06-18-13-58-13.gh-issue-135645.109nff.rst | 2 - ...-06-22-02-16-17.gh-issue-135640.FXyFL6.rst | 4 - ...-06-22-16-23-44.gh-issue-135815.0DandH.rst | 2 - ...-06-23-10-19-11.gh-issue-135855.-J0AGF.rst | 3 - ...-06-23-11-04-25.gh-issue-135836.-C-c4v.rst | 1 - ...-06-24-10-52-35.gh-issue-135836.s37351.rst | 3 - ...-06-24-14-43-24.gh-issue-135878.Db4roX.rst | 3 - ...5-06-25-17-25-53.gh-issue-91555.xUpTLD.rst | 4 - ...5-06-26-11-52-40.gh-issue-53203.TMigBr.rst | 2 - ...-06-26-17-28-49.gh-issue-135995.pPrDCt.rst | 1 - ...-06-27-13-34-28.gh-issue-136028.RY727g.rst | 3 - ...5-06-30-11-12-24.gh-issue-85702.0Lrbwu.rst | 3 - ...-07-05-06-56-16.gh-issue-136316.3zj_Do.rst | 2 - ...-07-05-09-45-04.gh-issue-136286.N67Amr.rst | 2 - ...-06-18-13-28-08.gh-issue-102555.nADrzJ.rst | 3 - ...-06-25-14-13-39.gh-issue-135661.idjQ0B.rst | 25 - ...-06-27-21-23-19.gh-issue-136053.QZxcee.rst | 1 - ...-06-19-15-29-38.gh-issue-135494.FVl9a0.rst | 2 - ...-06-26-15-15-35.gh-issue-135966.EBpF8Y.rst | 1 - ...-06-25-10-36-22.gh-issue-133600.bkdgHC.rst | 4 - ...-06-26-15-58-13.gh-issue-135968.C4v_-W.rst | 1 - README.rst | 2 +- 49 files changed, 806 insertions(+), 176 deletions(-) create mode 100644 Misc/NEWS.d/3.14.0b4.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-05-19-18-09-20.gh-issue-134273.ZAliyy.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-31-19-24-54.gh-issue-134280.NDVbzY.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-16-02-31-42.gh-issue-135543.6b0HOF.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-12-50-48.gh-issue-135608.PnHckD.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-22-34-58.gh-issue-135607.ucsLVu.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-23-18-08-32.gh-issue-135871.50C528.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-24-06-41-47.gh-issue-129958.EaJuS0.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-26-15-25-51.gh-issue-78465.MbDN8X.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-03-11-05-24-14.gh-issue-130664.g0yNMm.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-03-12-59-17.gh-issue-135069.xop30V.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-10-21-42-04.gh-issue-135335.WnUqb_.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-14-12-06-55.gh-issue-135487.KdVFff.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-16-15-03-03.gh-issue-135561.mJCN8D.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-17-23-13-56.gh-issue-135557.Bfcy4v.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-18-11-43-17.gh-issue-135646.r7ekEn.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-18-13-58-13.gh-issue-135645.109nff.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-22-02-16-17.gh-issue-135640.FXyFL6.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-22-16-23-44.gh-issue-135815.0DandH.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-23-10-19-11.gh-issue-135855.-J0AGF.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-23-11-04-25.gh-issue-135836.-C-c4v.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-24-10-52-35.gh-issue-135836.s37351.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-24-14-43-24.gh-issue-135878.Db4roX.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-25-17-25-53.gh-issue-91555.xUpTLD.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-26-11-52-40.gh-issue-53203.TMigBr.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-26-17-28-49.gh-issue-135995.pPrDCt.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-27-13-34-28.gh-issue-136028.RY727g.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-30-11-12-24.gh-issue-85702.0Lrbwu.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-06-18-13-28-08.gh-issue-102555.nADrzJ.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-06-27-21-23-19.gh-issue-136053.QZxcee.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-06-19-15-29-38.gh-issue-135494.FVl9a0.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-06-26-15-15-35.gh-issue-135966.EBpF8Y.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-06-25-10-36-22.gh-issue-133600.bkdgHC.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-06-26-15-58-13.gh-issue-135968.C4v_-W.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index ad88a909b105ef..40135791403f3c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -21,10 +21,10 @@ #define PY_MINOR_VERSION 14 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA -#define PY_RELEASE_SERIAL 3 +#define PY_RELEASE_SERIAL 4 /* Version as a string */ -#define PY_VERSION "3.14.0b3+" +#define PY_VERSION "3.14.0b4" /*--end constants--*/ diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 2376d6e70e1743..e32517960d44d1 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Tue Jun 17 18:40:47 2025 +# Autogenerated by Sphinx on Tue Jul 8 11:57:16 2025 # as part of the release process. topics = { @@ -492,8 +492,7 @@ async def func(param1, param2): Python supports string and bytes literals and various numeric literals: - literal: stringliteral | bytesliteral - | integer | floatnumber | imagnumber + literal: stringliteral | bytesliteral | NUMBER Evaluation of a literal yields an object of the given type (string, bytes, integer, floating-point number, complex number) with the given @@ -5132,25 +5131,54 @@ class of the instance or a *non-virtual base class* thereof. The 'floating': r'''Floating-point literals *********************** -Floating-point literals are described by the following lexical -definitions: +Floating-point (float) literals, such as "3.14" or "1.5", denote +approximations of real numbers. + +They consist of *integer* and *fraction* parts, each composed of +decimal digits. The parts are separated by a decimal point, ".": + + 2.71828 + 4.0 + +Unlike in integer literals, leading zeros are allowed in the numeric +parts. For example, "077.010" is legal, and denotes the same number as +"77.10". + +As in integer literals, single underscores may occur between digits to +help readability: + + 96_485.332_123 + 3.14_15_93 + +Either of these parts, but not both, can be empty. For example: - floatnumber: pointfloat | exponentfloat - pointfloat: [digitpart] fraction | digitpart "." - exponentfloat: (digitpart | pointfloat) exponent - digitpart: digit (["_"] digit)* - fraction: "." digitpart - exponent: ("e" | "E") ["+" | "-"] digitpart + 10. # (equivalent to 10.0) + .001 # (equivalent to 0.001) -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 integer literals, underscores are -supported for digit grouping. +Optionally, the integer and fraction may be followed by an *exponent*: +the letter "e" or "E", followed by an optional sign, "+" or "-", and a +number in the same format as the integer and fraction parts. The "e" +or "E" represents “times ten raised to the power of”: -Some examples of floating-point literals: + 1.0e3 # (represents 1.0×10³, or 1000.0) + 1.166e-5 # (represents 1.166×10⁻⁵, or 0.00001166) + 6.02214076e+23 # (represents 6.02214076×10²³, or 602214076000000000000000.) - 3.14 10. .001 1e100 3.14e-10 0e0 3.14_15_93 +In floats with only integer and exponent parts, the decimal point may +be omitted: + + 1e3 # (equivalent to 1.e3 and 1.0e3) + 0e0 # (equivalent to 0.) + +Formally, floating-point literals are described by the following +lexical definitions: + + floatnumber: + | digitpart "." [digitpart] [exponent] + | "." digitpart [exponent] + | digitpart exponent + digitpart: digit (["_"] digit)* + exponent: ("e" | "E") ["+" | "-"] digitpart Changed in version 3.6: Underscores are now allowed for grouping purposes in literals. @@ -6145,17 +6173,53 @@ class body. A "SyntaxError" is raised if a variable is used or 'imaginary': r'''Imaginary literals ****************** -Imaginary literals are described by the following lexical definitions: +Python has complex number objects, but no complex literals. Instead, +*imaginary literals* denote complex numbers with a zero real part. - imagnumber: (floatnumber | digitpart) ("j" | "J") +For example, in math, the complex number 3+4.2*i* is written as the +real number 3 added to the imaginary number 4.2*i*. Python uses a +similar syntax, except the imaginary unit is written as "j" rather +than *i*: + + 3+4.2j + +This is an expression composed of the integer literal "3", the +operator ‘"+"’, and the imaginary literal "4.2j". Since these are +three separate tokens, whitespace is allowed between them: + + 3 + 4.2j -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 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 imaginary literals: +No whitespace is allowed *within* each token. In particular, the "j" +suffix, may not be separated from the number before it. - 3.14j 10.j 10j .001j 1e100j 3.14e-10j 3.14_15_93j +The number before the "j" has the same syntax as a floating-point +literal. Thus, the following are valid imaginary literals: + + 4.2j + 3.14j + 10.j + .001j + 1e100j + 3.14e-10j + 3.14_15_93j + +Unlike in a floating-point literal the decimal point can be omitted if +the imaginary number only has an integer part. The number is still +evaluated as a floating-point number, not an integer: + + 10j + 0j + 1000000000000000000000000j # equivalent to 1e+24j + +The "j" suffix is case-insensitive. That means you can use "J" +instead: + + 3.14J # equivalent to 3.14j + +Formally, imaginary literals are described by the following lexical +definition: + + imagnumber: (floatnumber | digitpart) ("j" | "J") ''', 'import': r'''The "import" statement ********************** @@ -6397,37 +6461,62 @@ class body. A "SyntaxError" is raised if a variable is used or 'integers': r'''Integer literals **************** -Integer literals are described by the following lexical definitions: +Integer literals denote whole numbers. For example: + + 7 + 3 + 2147483647 + +There is no limit for the length of integer literals apart from what +can be stored in available memory: + + 7922816251426433759354395033679228162514264337593543950336 + +Underscores can be used to group digits for enhanced readability, and +are ignored for determining the numeric value of the literal. For +example, the following literals are equivalent: - integer: decinteger | bininteger | octinteger | hexinteger - decinteger: nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")* + 100_000_000_000 + 100000000000 + 1_00_00_00_00_000 + +Underscores can only occur between digits. For example, "_123", +"321_", and "123__321" are *not* valid literals. + +Integers can be specified in binary (base 2), octal (base 8), or +hexadecimal (base 16) using the prefixes "0b", "0o" and "0x", +respectively. Hexadecimal digits 10 through 15 are represented by +letters "A"-"F", case-insensitive. For example: + + 0b100110111 + 0b_1110_0101 + 0o177 + 0o377 + 0xdeadbeef + 0xDead_Beef + +An underscore can follow the base specifier. For example, "0x_1f" is a +valid literal, but "0_x1f" and "0x__1f" are not. + +Leading zeros in a non-zero decimal number are not allowed. For +example, "0123" is not a valid literal. This is for disambiguation +with C-style octal literals, which Python used before version 3.0. + +Formally, integer literals are described by the following lexical +definitions: + + integer: decinteger | bininteger | octinteger | hexinteger | zerointeger + decinteger: nonzerodigit (["_"] digit)* bininteger: "0" ("b" | "B") (["_"] bindigit)+ octinteger: "0" ("o" | "O") (["_"] octdigit)+ hexinteger: "0" ("x" | "X") (["_"] hexdigit)+ + zerointeger: "0"+ (["_"] "0")* nonzerodigit: "1"..."9" digit: "0"..."9" bindigit: "0" | "1" octdigit: "0"..."7" hexdigit: digit | "a"..."f" | "A"..."F" -There is no limit for the length of integer literals apart from what -can be stored in available memory. - -Underscores are ignored for determining the numeric value of the -literal. They can be used to group digits for enhanced readability. -One underscore can occur between digits, and after base specifiers -like "0x". - -Note that leading zeros in a non-zero decimal number are not allowed. -This is for disambiguation with C-style octal literals, which Python -used before version 3.0. - -Some examples of integer literals: - - 7 2147483647 0o177 0b100110111 - 3 79228162514264337593543950336 0o377 0xdeadbeef - 100_000_000_000 0b_1110_0101 - Changed in version 3.6: Underscores are now allowed for grouping purposes in literals. ''', @@ -6774,14 +6863,190 @@ class body. A "SyntaxError" is raised if a variable is used or 'numbers': r'''Numeric literals **************** -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). +"NUMBER" tokens represent numeric literals, of which there are three +types: integers, floating-point numbers, and imaginary numbers. + + NUMBER: integer | floatnumber | imagnumber + +The numeric value of a numeric literal is the same as if it were +passed as a string to the "int", "float" or "complex" class +constructor, respectively. Note that not all valid inputs for those +constructors are also valid literals. + +Numeric literals do not include a sign; a phrase like "-1" is actually +an expression composed of the unary operator ‘"-"’ and the literal +"1". + + +Integer literals +================ + +Integer literals denote whole numbers. For example: + + 7 + 3 + 2147483647 + +There is no limit for the length of integer literals apart from what +can be stored in available memory: + + 7922816251426433759354395033679228162514264337593543950336 + +Underscores can be used to group digits for enhanced readability, and +are ignored for determining the numeric value of the literal. For +example, the following literals are equivalent: + + 100_000_000_000 + 100000000000 + 1_00_00_00_00_000 -Note that numeric literals do not include a sign; a phrase like "-1" -is actually an expression composed of the unary operator ‘"-"’ and the -literal "1". +Underscores can only occur between digits. For example, "_123", +"321_", and "123__321" are *not* valid literals. + +Integers can be specified in binary (base 2), octal (base 8), or +hexadecimal (base 16) using the prefixes "0b", "0o" and "0x", +respectively. Hexadecimal digits 10 through 15 are represented by +letters "A"-"F", case-insensitive. For example: + + 0b100110111 + 0b_1110_0101 + 0o177 + 0o377 + 0xdeadbeef + 0xDead_Beef + +An underscore can follow the base specifier. For example, "0x_1f" is a +valid literal, but "0_x1f" and "0x__1f" are not. + +Leading zeros in a non-zero decimal number are not allowed. For +example, "0123" is not a valid literal. This is for disambiguation +with C-style octal literals, which Python used before version 3.0. + +Formally, integer literals are described by the following lexical +definitions: + + integer: decinteger | bininteger | octinteger | hexinteger | zerointeger + decinteger: nonzerodigit (["_"] digit)* + bininteger: "0" ("b" | "B") (["_"] bindigit)+ + octinteger: "0" ("o" | "O") (["_"] octdigit)+ + hexinteger: "0" ("x" | "X") (["_"] hexdigit)+ + zerointeger: "0"+ (["_"] "0")* + nonzerodigit: "1"..."9" + digit: "0"..."9" + bindigit: "0" | "1" + octdigit: "0"..."7" + hexdigit: digit | "a"..."f" | "A"..."F" + +Changed in version 3.6: Underscores are now allowed for grouping +purposes in literals. + + +Floating-point literals +======================= + +Floating-point (float) literals, such as "3.14" or "1.5", denote +approximations of real numbers. + +They consist of *integer* and *fraction* parts, each composed of +decimal digits. The parts are separated by a decimal point, ".": + + 2.71828 + 4.0 + +Unlike in integer literals, leading zeros are allowed in the numeric +parts. For example, "077.010" is legal, and denotes the same number as +"77.10". + +As in integer literals, single underscores may occur between digits to +help readability: + + 96_485.332_123 + 3.14_15_93 + +Either of these parts, but not both, can be empty. For example: + + 10. # (equivalent to 10.0) + .001 # (equivalent to 0.001) + +Optionally, the integer and fraction may be followed by an *exponent*: +the letter "e" or "E", followed by an optional sign, "+" or "-", and a +number in the same format as the integer and fraction parts. The "e" +or "E" represents “times ten raised to the power of”: + + 1.0e3 # (represents 1.0×10³, or 1000.0) + 1.166e-5 # (represents 1.166×10⁻⁵, or 0.00001166) + 6.02214076e+23 # (represents 6.02214076×10²³, or 602214076000000000000000.) + +In floats with only integer and exponent parts, the decimal point may +be omitted: + + 1e3 # (equivalent to 1.e3 and 1.0e3) + 0e0 # (equivalent to 0.) + +Formally, floating-point literals are described by the following +lexical definitions: + + floatnumber: + | digitpart "." [digitpart] [exponent] + | "." digitpart [exponent] + | digitpart exponent + digitpart: digit (["_"] digit)* + exponent: ("e" | "E") ["+" | "-"] digitpart + +Changed in version 3.6: Underscores are now allowed for grouping +purposes in literals. + + +Imaginary literals +================== + +Python has complex number objects, but no complex literals. Instead, +*imaginary literals* denote complex numbers with a zero real part. + +For example, in math, the complex number 3+4.2*i* is written as the +real number 3 added to the imaginary number 4.2*i*. Python uses a +similar syntax, except the imaginary unit is written as "j" rather +than *i*: + + 3+4.2j + +This is an expression composed of the integer literal "3", the +operator ‘"+"’, and the imaginary literal "4.2j". Since these are +three separate tokens, whitespace is allowed between them: + + 3 + 4.2j + +No whitespace is allowed *within* each token. In particular, the "j" +suffix, may not be separated from the number before it. + +The number before the "j" has the same syntax as a floating-point +literal. Thus, the following are valid imaginary literals: + + 4.2j + 3.14j + 10.j + .001j + 1e100j + 3.14e-10j + 3.14_15_93j + +Unlike in a floating-point literal the decimal point can be omitted if +the imaginary number only has an integer part. The number is still +evaluated as a floating-point number, not an integer: + + 10j + 0j + 1000000000000000000000000j # equivalent to 1e+24j + +The "j" suffix is case-insensitive. That means you can use "J" +instead: + + 3.14J # equivalent to 3.14j + +Formally, imaginary literals are described by the following lexical +definition: + + imagnumber: (floatnumber | digitpart) ("j" | "J") ''', 'numeric-types': r'''Emulating numeric types *********************** diff --git a/Misc/NEWS.d/3.14.0b4.rst b/Misc/NEWS.d/3.14.0b4.rst new file mode 100644 index 00000000000000..b96f96caa3f280 --- /dev/null +++ b/Misc/NEWS.d/3.14.0b4.rst @@ -0,0 +1,484 @@ +.. date: 2025-06-26-15-58-13 +.. gh-issue: 135968 +.. nonce: C4v_-W +.. release date: 2025-07-08 +.. section: Tools/Demos + +Stubs for ``strip`` are now provided as part of an iOS install. + +.. + +.. date: 2025-06-25-10-36-22 +.. gh-issue: 133600 +.. nonce: bkdgHC +.. section: Tools/Demos + +Backport file reorganization for Tools/wasm/wasi. + +This should make backporting future code changes easier. It also simplifies +instructions around how to do WASI builds in the devguide. + +.. + +.. date: 2025-06-26-15-15-35 +.. gh-issue: 135966 +.. nonce: EBpF8Y +.. section: Tests + +The iOS testbed now handles the ``app_packages`` folder as a site directory. + +.. + +.. date: 2025-06-19-15-29-38 +.. gh-issue: 135494 +.. nonce: FVl9a0 +.. section: Tests + +Fix regrtest to support excluding tests from ``--pgo`` tests. Patch by +Victor Stinner. + +.. + +.. date: 2025-06-27-21-23-19 +.. gh-issue: 136053 +.. nonce: QZxcee +.. section: Security + +:mod:`marshal`: fix a possible crash when deserializing :class:`slice` +objects. + +.. + +.. date: 2025-06-25-14-13-39 +.. gh-issue: 135661 +.. nonce: idjQ0B +.. section: Security + +Fix parsing start and end tags in :class:`html.parser.HTMLParser` according +to the HTML5 standard. + +* Whitespaces no longer accepted between ```` does not end the script section. + +* Vertical tabulation (``\v``) and non-ASCII whitespaces no longer recognized + as whitespaces. The only whitespaces are ``\t\n\r\f`` and space. + +* Null character (U+0000) no longer ends the tag name. + +* Attributes and slashes after the tag name in end tags are now ignored, + instead of terminating after the first ``>`` in quoted attribute value. + E.g. ````. + +* Multiple slashes and whitespaces between the last attribute and closing ``>`` + are now ignored in both start and end tags. E.g. ````. + +* Multiple ``=`` between attribute name and value are no longer collapsed. + E.g. ```` produces attribute "foo" with value "=bar". + +* Whitespaces between the ``=`` separator and attribute name or value are no + longer ignored. E.g. ```` produces two attributes "foo" and + "=bar", both with value None; ```` produces two attributes: + "foo" with value "" and "bar" with value None. + +.. + +.. date: 2025-06-18-13-28-08 +.. gh-issue: 102555 +.. nonce: nADrzJ +.. section: Security + +Fix comment parsing in :class:`html.parser.HTMLParser` according to the +HTML5 standard. ``--!>`` now ends the comment. ``-- >`` no longer ends the +comment. Support abnormally ended empty comments ``<-->`` and ``<--->``. + +.. + +.. date: 2025-07-05-09-45-04 +.. gh-issue: 136286 +.. nonce: N67Amr +.. section: Library + +Fix pickling failures for protocols 0 and 1 for many objects realted to +subinterpreters. + +.. + +.. date: 2025-07-05-06-56-16 +.. gh-issue: 136316 +.. nonce: 3zj_Do +.. section: Library + +Improve support for evaluating nested forward references in +:func:`typing.evaluate_forward_ref`. + +.. + +.. date: 2025-06-30-11-12-24 +.. gh-issue: 85702 +.. nonce: 0Lrbwu +.. section: Library + +If ``zoneinfo._common.load_tzdata`` is given a package without a resource a +:exc:`zoneinfo.ZoneInfoNotFoundError` is raised rather than a +:exc:`PermissionError`. Patch by Victor Stinner. + +.. + +.. date: 2025-06-27-13-34-28 +.. gh-issue: 136028 +.. nonce: RY727g +.. section: Library + +Fix parsing month names containing "İ" (U+0130, LATIN CAPITAL LETTER I WITH +DOT ABOVE) in :func:`time.strptime`. This affects locales az_AZ, ber_DZ, +ber_MA and crh_UA. + +.. + +.. date: 2025-06-26-17-28-49 +.. gh-issue: 135995 +.. nonce: pPrDCt +.. section: Library + +In the palmos encoding, make byte ``0x9b`` decode to ``›`` (U+203A - SINGLE +RIGHT-POINTING ANGLE QUOTATION MARK). + +.. + +.. date: 2025-06-26-11-52-40 +.. gh-issue: 53203 +.. nonce: TMigBr +.. section: Library + +Fix :func:`time.strptime` for ``%c`` and ``%x`` formats on locales byn_ER, +wal_ET and lzh_TW, and for ``%X`` format on locales ar_SA, bg_BG and lzh_TW. + +.. + +.. date: 2025-06-25-17-25-53 +.. gh-issue: 91555 +.. nonce: xUpTLD +.. section: Library + +An earlier change, which was introduced in 3.14.0b2, has been reverted. It +disabled logging for a logger during handling of log messages for that +logger. Since the reversion, the behaviour should be as it was before +3.14.0b2. + +.. + +.. date: 2025-06-24-14-43-24 +.. gh-issue: 135878 +.. nonce: Db4roX +.. section: Library + +Fixes a crash of :class:`types.SimpleNamespace` on :term:`free threading` +builds, when several threads were calling its :meth:`~object.__repr__` +method at the same time. + +.. + +.. date: 2025-06-24-10-52-35 +.. gh-issue: 135836 +.. nonce: s37351 +.. section: Library + +Fix :exc:`IndexError` in :meth:`asyncio.loop.create_connection` that could +occur when non-\ :exc:`OSError` exception is raised during connection and +socket's ``close()`` raises :exc:`!OSError`. + +.. + +.. date: 2025-06-23-11-04-25 +.. gh-issue: 135836 +.. nonce: -C-c4v +.. section: Library + +Fix :exc:`IndexError` in :meth:`asyncio.loop.create_connection` that could +occur when the Happy Eyeballs algorithm resulted in an empty exceptions list +during connection attempts. + +.. + +.. date: 2025-06-23-10-19-11 +.. gh-issue: 135855 +.. nonce: -J0AGF +.. section: Library + +Raise :exc:`TypeError` instead of :exc:`SystemError` when +:func:`!_interpreters.set___main___attrs` is passed a non-dict object. Patch +by Brian Schubert. + +.. + +.. date: 2025-06-22-16-23-44 +.. gh-issue: 135815 +.. nonce: 0DandH +.. section: Library + +:mod:`netrc`: skip security checks if :func:`os.getuid` is missing. Patch by +Bénédikt Tran. + +.. + +.. date: 2025-06-22-02-16-17 +.. gh-issue: 135640 +.. nonce: FXyFL6 +.. section: Library + +Address bug where it was possible to call +:func:`xml.etree.ElementTree.ElementTree.write` on an ElementTree object +with an invalid root element. This behavior blanked the file passed to +``write`` if it already existed. + +.. + +.. date: 2025-06-18-13-58-13 +.. gh-issue: 135645 +.. nonce: 109nff +.. section: Library + +Added ``supports_isolated_interpreters`` field to +:data:`sys.implementation`. + +.. + +.. date: 2025-06-18-11-43-17 +.. gh-issue: 135646 +.. nonce: r7ekEn +.. section: Library + +Raise consistent :exc:`NameError` exceptions in +:func:`annotationlib.ForwardRef.evaluate` + +.. + +.. date: 2025-06-17-23-13-56 +.. gh-issue: 135557 +.. nonce: Bfcy4v +.. section: Library + +Fix races on :mod:`heapq` updates and :class:`list` reads on the :term:`free +threaded ` build. + +.. + +.. date: 2025-06-17-22-44-19 +.. gh-issue: 119180 +.. nonce: Ogv8Nj +.. section: Library + +Only fetch globals and locals if necessary in +:func:`annotationlib.get_annotations` + +.. + +.. date: 2025-06-16-15-03-03 +.. gh-issue: 135561 +.. nonce: mJCN8D +.. section: Library + +Fix a crash on DEBUG builds when an HACL* HMAC routine fails. Patch by +Bénédikt Tran. + +.. + +.. date: 2025-06-14-12-06-55 +.. gh-issue: 135487 +.. nonce: KdVFff +.. section: Library + +Fix :meth:`!reprlib.Repr.repr_int` when given integers with more than +:func:`sys.get_int_max_str_digits` digits. Patch by Bénédikt Tran. + +.. + +.. date: 2025-06-10-21-42-04 +.. gh-issue: 135335 +.. nonce: WnUqb_ +.. section: Library + +:mod:`multiprocessing`: Flush ``stdout`` and ``stderr`` after preloading +modules in the ``forkserver``. + +.. + +.. date: 2025-06-03-12-59-17 +.. gh-issue: 135069 +.. nonce: xop30V +.. section: Library + +Fix the "Invalid error handling" exception in +:class:`!encodings.idna.IncrementalDecoder` to correctly replace the +'errors' parameter. + +.. + +.. date: 2025-06-02-14-36-28 +.. gh-issue: 130662 +.. nonce: Gpr2GB +.. section: Library + ++Accept leading zeros in precision and width fields for ++:class:`~decimal.Decimal` formatting, for example ``format(Decimal(1.25), +'.016f')``. + +.. + +.. date: 2025-06-02-14-28-30 +.. gh-issue: 130662 +.. nonce: EIgIR8 +.. section: Library + +Accept leading zeros in precision and width fields for +:class:`~fractions.Fraction` formatting, for example ``format(Fraction(1, +3), '.016f')``. + +.. + +.. date: 2025-04-07-10-20-16 +.. gh-issue: 87790 +.. nonce: X2SjJe +.. section: Library + +Support underscore and comma as thousands separators in the fractional part +for :class:`~fractions.Fraction`'s formatting. Patch by Sergey B Kirpichev. + +.. + +.. date: 2025-04-07-09-53-54 +.. gh-issue: 87790 +.. nonce: 6nj3zQ +.. section: Library + +Support underscore and comma as thousands separators in the fractional part +for :class:`~decimal.Decimal`'s formatting. Patch by Sergey B Kirpichev. + +.. + +.. date: 2025-03-11-05-24-14 +.. gh-issue: 130664 +.. nonce: g0yNMm +.. section: Library + +Handle corner-case for :class:`~fractions.Fraction`'s formatting: treat +zero-padding (preceding the width field by a zero (``'0'``) character) as an +equivalent to a fill character of ``'0'`` with an alignment type of ``'='``, +just as in case of :class:`float`'s. + +.. + +.. date: 2025-07-01-21-04-47 +.. gh-issue: 136155 +.. nonce: ufmH4Q +.. section: Documentation + +EPUB builds are fixed by excluding non-XHTML-compatible tags. + +.. + +.. date: 2025-07-06-14-53-19 +.. gh-issue: 109700 +.. nonce: KVNQQi +.. section: Core and Builtins + +Fix memory error handling in :c:func:`PyDict_SetDefault`. + +.. + +.. date: 2025-06-26-15-25-51 +.. gh-issue: 78465 +.. nonce: MbDN8X +.. section: Core and Builtins + +Fix error message for ``cls.__new__(cls, ...)`` where ``cls`` is not +instantiable builtin or extension type (with ``tp_new`` set to ``NULL``). + +.. + +.. date: 2025-06-24-06-41-47 +.. gh-issue: 129958 +.. nonce: EaJuS0 +.. section: Core and Builtins + +Differentiate between t-strings and f-strings in syntax error for newlines +in format specifiers of single-quoted interpolated strings. + +.. + +.. date: 2025-06-23-18-08-32 +.. gh-issue: 135871 +.. nonce: 50C528 +.. section: Core and Builtins + +Non-blocking mutex lock attempts now return immediately when the lock is +busy instead of briefly spinning in the :term:`free threading` build. + +.. + +.. date: 2025-06-18-16-45-36 +.. gh-issue: 135106 +.. nonce: cpl6Aq +.. section: Core and Builtins + +Restrict the trashcan mechanism to GC'ed objects and untrack them while in +the trashcan to prevent the GC and trashcan mechanisms conflicting. + +.. + +.. date: 2025-06-17-22-34-58 +.. gh-issue: 135607 +.. nonce: ucsLVu +.. section: Core and Builtins + +Fix potential :mod:`weakref` races in an object's destructor on the +:term:`free threaded ` build. + +.. + +.. date: 2025-06-17-12-50-48 +.. gh-issue: 135608 +.. nonce: PnHckD +.. section: Core and Builtins + +Fix a crash in the JIT involving attributes of modules. + +.. + +.. date: 2025-06-16-02-31-42 +.. gh-issue: 135543 +.. nonce: 6b0HOF +.. section: Core and Builtins + +Emit ``sys.remote_exec`` audit event when :func:`sys.remote_exec` is called +and migrate ``remote_debugger_script`` to +``cpython.remote_debugger_script``. + +.. + +.. date: 2025-05-31-19-24-54 +.. gh-issue: 134280 +.. nonce: NDVbzY +.. section: Core and Builtins + +Disable constant folding for ``~`` with a boolean argument. This moves the +deprecation warning from compile time to runtime. + +.. + +.. date: 2025-06-25-01-03-10 +.. gh-issue: 135906 +.. nonce: UBrCWq +.. section: C API + +Fix compilation errors when compiling the internal headers with a C++ +compiler. + +.. + +.. date: 2025-05-19-18-09-20 +.. gh-issue: 134273 +.. nonce: ZAliyy +.. section: Build + +Add support for configuring compiler flags for the JIT with ``CFLAGS_JIT`` diff --git a/Misc/NEWS.d/next/Build/2025-05-19-18-09-20.gh-issue-134273.ZAliyy.rst b/Misc/NEWS.d/next/Build/2025-05-19-18-09-20.gh-issue-134273.ZAliyy.rst deleted file mode 100644 index 3eb13cefbe6dfc..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-05-19-18-09-20.gh-issue-134273.ZAliyy.rst +++ /dev/null @@ -1 +0,0 @@ -Add support for configuring compiler flags for the JIT with ``CFLAGS_JIT`` diff --git a/Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst b/Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst deleted file mode 100644 index 7852759a702804..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-06-25-01-03-10.gh-issue-135906.UBrCWq.rst +++ /dev/null @@ -1 +0,0 @@ -Fix compilation errors when compiling the internal headers with a C++ compiler. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-31-19-24-54.gh-issue-134280.NDVbzY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-31-19-24-54.gh-issue-134280.NDVbzY.rst deleted file mode 100644 index f822721690975a..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-31-19-24-54.gh-issue-134280.NDVbzY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Disable constant folding for ``~`` with a boolean argument. -This moves the deprecation warning from compile time to runtime. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-16-02-31-42.gh-issue-135543.6b0HOF.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-16-02-31-42.gh-issue-135543.6b0HOF.rst deleted file mode 100644 index 6efe2a47bac5d4..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-16-02-31-42.gh-issue-135543.6b0HOF.rst +++ /dev/null @@ -1,2 +0,0 @@ -Emit ``sys.remote_exec`` audit event when :func:`sys.remote_exec` is called -and migrate ``remote_debugger_script`` to ``cpython.remote_debugger_script``. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-12-50-48.gh-issue-135608.PnHckD.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-12-50-48.gh-issue-135608.PnHckD.rst deleted file mode 100644 index a65a0c85fa64fa..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-12-50-48.gh-issue-135608.PnHckD.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a crash in the JIT involving attributes of modules. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-22-34-58.gh-issue-135607.ucsLVu.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-22-34-58.gh-issue-135607.ucsLVu.rst deleted file mode 100644 index 859259a9ace758..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-17-22-34-58.gh-issue-135607.ucsLVu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix potential :mod:`weakref` races in an object's destructor on the :term:`free threaded ` build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst deleted file mode 100644 index b6e953a7719be1..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-18-16-45-36.gh-issue-135106.cpl6Aq.rst +++ /dev/null @@ -1,2 +0,0 @@ -Restrict the trashcan mechanism to GC'ed objects and untrack them while in -the trashcan to prevent the GC and trashcan mechanisms conflicting. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-23-18-08-32.gh-issue-135871.50C528.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-23-18-08-32.gh-issue-135871.50C528.rst deleted file mode 100644 index ce29ddecefe17f..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-23-18-08-32.gh-issue-135871.50C528.rst +++ /dev/null @@ -1,2 +0,0 @@ -Non-blocking mutex lock attempts now return immediately when the lock is busy -instead of briefly spinning in the :term:`free threading` build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-24-06-41-47.gh-issue-129958.EaJuS0.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-24-06-41-47.gh-issue-129958.EaJuS0.rst deleted file mode 100644 index 70b3e99425df14..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-24-06-41-47.gh-issue-129958.EaJuS0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Differentiate between t-strings and f-strings in syntax error for newlines -in format specifiers of single-quoted interpolated strings. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-26-15-25-51.gh-issue-78465.MbDN8X.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-26-15-25-51.gh-issue-78465.MbDN8X.rst deleted file mode 100644 index 99734d63c5d87e..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-26-15-25-51.gh-issue-78465.MbDN8X.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix error message for ``cls.__new__(cls, ...)`` where ``cls`` is not -instantiable builtin or extension type (with ``tp_new`` set to ``NULL``). diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst deleted file mode 100644 index a37f4a51050947..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-06-14-53-19.gh-issue-109700.KVNQQi.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory error handling in :c:func:`PyDict_SetDefault`. diff --git a/Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst b/Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst deleted file mode 100644 index 0341b5f7f0d5e6..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2025-07-01-21-04-47.gh-issue-136155.ufmH4Q.rst +++ /dev/null @@ -1 +0,0 @@ -EPUB builds are fixed by excluding non-XHTML-compatible tags. diff --git a/Misc/NEWS.d/next/Library/2025-03-11-05-24-14.gh-issue-130664.g0yNMm.rst b/Misc/NEWS.d/next/Library/2025-03-11-05-24-14.gh-issue-130664.g0yNMm.rst deleted file mode 100644 index dbe783a2a99e0a..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-03-11-05-24-14.gh-issue-130664.g0yNMm.rst +++ /dev/null @@ -1,4 +0,0 @@ -Handle corner-case for :class:`~fractions.Fraction`'s formatting: treat -zero-padding (preceding the width field by a zero (``'0'``) character) as an -equivalent to a fill character of ``'0'`` with an alignment type of ``'='``, -just as in case of :class:`float`'s. diff --git a/Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst b/Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst deleted file mode 100644 index cf80c71271bbd1..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-04-07-09-53-54.gh-issue-87790.6nj3zQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Support underscore and comma as thousands separators in the fractional part -for :class:`~decimal.Decimal`'s formatting. Patch by Sergey B Kirpichev. diff --git a/Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst b/Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst deleted file mode 100644 index be2a30d69cab45..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-04-07-10-20-16.gh-issue-87790.X2SjJe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Support underscore and comma as thousands separators in the fractional part -for :class:`~fractions.Fraction`'s formatting. Patch by Sergey B Kirpichev. diff --git a/Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst b/Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst deleted file mode 100644 index e07200f9a3fbbd..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-02-14-28-30.gh-issue-130662.EIgIR8.rst +++ /dev/null @@ -1,3 +0,0 @@ -Accept leading zeros in precision and width fields for -:class:`~fractions.Fraction` formatting, for example ``format(Fraction(1, -3), '.016f')``. diff --git a/Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst b/Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst deleted file mode 100644 index d97d937376a9d0..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-02-14-36-28.gh-issue-130662.Gpr2GB.rst +++ /dev/null @@ -1,3 +0,0 @@ -+Accept leading zeros in precision and width fields for -+:class:`~decimal.Decimal` formatting, for example ``format(Decimal(1.25), -'.016f')``. diff --git a/Misc/NEWS.d/next/Library/2025-06-03-12-59-17.gh-issue-135069.xop30V.rst b/Misc/NEWS.d/next/Library/2025-06-03-12-59-17.gh-issue-135069.xop30V.rst deleted file mode 100644 index 1affb5e2aadab7..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-03-12-59-17.gh-issue-135069.xop30V.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the "Invalid error handling" exception in -:class:`!encodings.idna.IncrementalDecoder` to correctly replace the -'errors' parameter. diff --git a/Misc/NEWS.d/next/Library/2025-06-10-21-42-04.gh-issue-135335.WnUqb_.rst b/Misc/NEWS.d/next/Library/2025-06-10-21-42-04.gh-issue-135335.WnUqb_.rst deleted file mode 100644 index 466ba0d232cd1f..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-10-21-42-04.gh-issue-135335.WnUqb_.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`multiprocessing`: Flush ``stdout`` and ``stderr`` after preloading -modules in the ``forkserver``. diff --git a/Misc/NEWS.d/next/Library/2025-06-14-12-06-55.gh-issue-135487.KdVFff.rst b/Misc/NEWS.d/next/Library/2025-06-14-12-06-55.gh-issue-135487.KdVFff.rst deleted file mode 100644 index 3ef51fa31dfac9..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-14-12-06-55.gh-issue-135487.KdVFff.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`!reprlib.Repr.repr_int` when given integers with more than -:func:`sys.get_int_max_str_digits` digits. Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-06-16-15-03-03.gh-issue-135561.mJCN8D.rst b/Misc/NEWS.d/next/Library/2025-06-16-15-03-03.gh-issue-135561.mJCN8D.rst deleted file mode 100644 index ee743f161138e6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-16-15-03-03.gh-issue-135561.mJCN8D.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash on DEBUG builds when an HACL* HMAC routine fails. Patch by -Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst b/Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst deleted file mode 100644 index c5e5d5b4f8d85e..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Only fetch globals and locals if necessary in -:func:`annotationlib.get_annotations` diff --git a/Misc/NEWS.d/next/Library/2025-06-17-23-13-56.gh-issue-135557.Bfcy4v.rst b/Misc/NEWS.d/next/Library/2025-06-17-23-13-56.gh-issue-135557.Bfcy4v.rst deleted file mode 100644 index eabf5ea4aaa2ac..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-17-23-13-56.gh-issue-135557.Bfcy4v.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix races on :mod:`heapq` updates and :class:`list` reads on the :term:`free threaded ` -build. diff --git a/Misc/NEWS.d/next/Library/2025-06-18-11-43-17.gh-issue-135646.r7ekEn.rst b/Misc/NEWS.d/next/Library/2025-06-18-11-43-17.gh-issue-135646.r7ekEn.rst deleted file mode 100644 index 5fbd751467dd58..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-18-11-43-17.gh-issue-135646.r7ekEn.rst +++ /dev/null @@ -1 +0,0 @@ -Raise consistent :exc:`NameError` exceptions in :func:`annotationlib.ForwardRef.evaluate` diff --git a/Misc/NEWS.d/next/Library/2025-06-18-13-58-13.gh-issue-135645.109nff.rst b/Misc/NEWS.d/next/Library/2025-06-18-13-58-13.gh-issue-135645.109nff.rst deleted file mode 100644 index a7764a0105b8b3..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-18-13-58-13.gh-issue-135645.109nff.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added ``supports_isolated_interpreters`` field to -:data:`sys.implementation`. diff --git a/Misc/NEWS.d/next/Library/2025-06-22-02-16-17.gh-issue-135640.FXyFL6.rst b/Misc/NEWS.d/next/Library/2025-06-22-02-16-17.gh-issue-135640.FXyFL6.rst deleted file mode 100644 index ad217b57b4b510..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-22-02-16-17.gh-issue-135640.FXyFL6.rst +++ /dev/null @@ -1,4 +0,0 @@ -Address bug where it was possible to call -:func:`xml.etree.ElementTree.ElementTree.write` on an ElementTree object with -an invalid root element. This behavior blanked the file passed to ``write`` -if it already existed. diff --git a/Misc/NEWS.d/next/Library/2025-06-22-16-23-44.gh-issue-135815.0DandH.rst b/Misc/NEWS.d/next/Library/2025-06-22-16-23-44.gh-issue-135815.0DandH.rst deleted file mode 100644 index 0f4a68bf745a8e..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-22-16-23-44.gh-issue-135815.0DandH.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`netrc`: skip security checks if :func:`os.getuid` is missing. -Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-06-23-10-19-11.gh-issue-135855.-J0AGF.rst b/Misc/NEWS.d/next/Library/2025-06-23-10-19-11.gh-issue-135855.-J0AGF.rst deleted file mode 100644 index fcf495bdceb168..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-23-10-19-11.gh-issue-135855.-J0AGF.rst +++ /dev/null @@ -1,3 +0,0 @@ -Raise :exc:`TypeError` instead of :exc:`SystemError` when -:func:`!_interpreters.set___main___attrs` is passed a non-dict object. -Patch by Brian Schubert. diff --git a/Misc/NEWS.d/next/Library/2025-06-23-11-04-25.gh-issue-135836.-C-c4v.rst b/Misc/NEWS.d/next/Library/2025-06-23-11-04-25.gh-issue-135836.-C-c4v.rst deleted file mode 100644 index f93c9faee5863a..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-23-11-04-25.gh-issue-135836.-C-c4v.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :exc:`IndexError` in :meth:`asyncio.loop.create_connection` that could occur when the Happy Eyeballs algorithm resulted in an empty exceptions list during connection attempts. diff --git a/Misc/NEWS.d/next/Library/2025-06-24-10-52-35.gh-issue-135836.s37351.rst b/Misc/NEWS.d/next/Library/2025-06-24-10-52-35.gh-issue-135836.s37351.rst deleted file mode 100644 index 1d1e7a2298c085..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-24-10-52-35.gh-issue-135836.s37351.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :exc:`IndexError` in :meth:`asyncio.loop.create_connection` that could -occur when non-\ :exc:`OSError` exception is raised during connection and -socket's ``close()`` raises :exc:`!OSError`. diff --git a/Misc/NEWS.d/next/Library/2025-06-24-14-43-24.gh-issue-135878.Db4roX.rst b/Misc/NEWS.d/next/Library/2025-06-24-14-43-24.gh-issue-135878.Db4roX.rst deleted file mode 100644 index 969cf2dfa40878..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-24-14-43-24.gh-issue-135878.Db4roX.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixes a crash of :class:`types.SimpleNamespace` on :term:`free threading` builds, -when several threads were calling its :meth:`~object.__repr__` method at the -same time. diff --git a/Misc/NEWS.d/next/Library/2025-06-25-17-25-53.gh-issue-91555.xUpTLD.rst b/Misc/NEWS.d/next/Library/2025-06-25-17-25-53.gh-issue-91555.xUpTLD.rst deleted file mode 100644 index 4e5ccbc45abe01..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-25-17-25-53.gh-issue-91555.xUpTLD.rst +++ /dev/null @@ -1,4 +0,0 @@ -An earlier change, which was introduced in 3.14.0b2, has been reverted. It -disabled logging for a logger during handling of log messages for that -logger. Since the reversion, the behaviour should be as it was before -3.14.0b2. diff --git a/Misc/NEWS.d/next/Library/2025-06-26-11-52-40.gh-issue-53203.TMigBr.rst b/Misc/NEWS.d/next/Library/2025-06-26-11-52-40.gh-issue-53203.TMigBr.rst deleted file mode 100644 index ba2fae49fdc933..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-26-11-52-40.gh-issue-53203.TMigBr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`time.strptime` for ``%c`` and ``%x`` formats on locales byn_ER, -wal_ET and lzh_TW, and for ``%X`` format on locales ar_SA, bg_BG and lzh_TW. diff --git a/Misc/NEWS.d/next/Library/2025-06-26-17-28-49.gh-issue-135995.pPrDCt.rst b/Misc/NEWS.d/next/Library/2025-06-26-17-28-49.gh-issue-135995.pPrDCt.rst deleted file mode 100644 index 998b3cd85b1d5d..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-26-17-28-49.gh-issue-135995.pPrDCt.rst +++ /dev/null @@ -1 +0,0 @@ -In the palmos encoding, make byte ``0x9b`` decode to ``›`` (U+203A - SINGLE RIGHT-POINTING ANGLE QUOTATION MARK). diff --git a/Misc/NEWS.d/next/Library/2025-06-27-13-34-28.gh-issue-136028.RY727g.rst b/Misc/NEWS.d/next/Library/2025-06-27-13-34-28.gh-issue-136028.RY727g.rst deleted file mode 100644 index 9859df7cf6a69c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-27-13-34-28.gh-issue-136028.RY727g.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix parsing month names containing "İ" (U+0130, LATIN CAPITAL LETTER I WITH -DOT ABOVE) in :func:`time.strptime`. This affects locales az_AZ, ber_DZ, -ber_MA and crh_UA. diff --git a/Misc/NEWS.d/next/Library/2025-06-30-11-12-24.gh-issue-85702.0Lrbwu.rst b/Misc/NEWS.d/next/Library/2025-06-30-11-12-24.gh-issue-85702.0Lrbwu.rst deleted file mode 100644 index fc13eb1d9e0c99..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-30-11-12-24.gh-issue-85702.0Lrbwu.rst +++ /dev/null @@ -1,3 +0,0 @@ -If ``zoneinfo._common.load_tzdata`` is given a package without a resource a -:exc:`zoneinfo.ZoneInfoNotFoundError` is raised rather than a :exc:`PermissionError`. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst b/Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst deleted file mode 100644 index dd5cecdf3a1209..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-05-06-56-16.gh-issue-136316.3zj_Do.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve support for evaluating nested forward references in -:func:`typing.evaluate_forward_ref`. diff --git a/Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst b/Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst deleted file mode 100644 index 0a0d66ac0b8abf..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-05-09-45-04.gh-issue-136286.N67Amr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pickling failures for protocols 0 and 1 for many objects realted to -subinterpreters. diff --git a/Misc/NEWS.d/next/Security/2025-06-18-13-28-08.gh-issue-102555.nADrzJ.rst b/Misc/NEWS.d/next/Security/2025-06-18-13-28-08.gh-issue-102555.nADrzJ.rst deleted file mode 100644 index 71d15ee0852ebd..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-06-18-13-28-08.gh-issue-102555.nADrzJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix comment parsing in :class:`html.parser.HTMLParser` according to the -HTML5 standard. ``--!>`` now ends the comment. ``-- >`` no longer ends the -comment. Support abnormally ended empty comments ``<-->`` and ``<--->``. diff --git a/Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst b/Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst deleted file mode 100644 index b6f9e104e44047..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-06-25-14-13-39.gh-issue-135661.idjQ0B.rst +++ /dev/null @@ -1,25 +0,0 @@ -Fix parsing start and end tags in :class:`html.parser.HTMLParser` -according to the HTML5 standard. - -* Whitespaces no longer accepted between ```` does not end the script section. - -* Vertical tabulation (``\v``) and non-ASCII whitespaces no longer recognized - as whitespaces. The only whitespaces are ``\t\n\r\f`` and space. - -* Null character (U+0000) no longer ends the tag name. - -* Attributes and slashes after the tag name in end tags are now ignored, - instead of terminating after the first ``>`` in quoted attribute value. - E.g. ````. - -* Multiple slashes and whitespaces between the last attribute and closing ``>`` - are now ignored in both start and end tags. E.g. ````. - -* Multiple ``=`` between attribute name and value are no longer collapsed. - E.g. ```` produces attribute "foo" with value "=bar". - -* Whitespaces between the ``=`` separator and attribute name or value are no - longer ignored. E.g. ```` produces two attributes "foo" and - "=bar", both with value None; ```` produces two attributes: - "foo" with value "" and "bar" with value None. diff --git a/Misc/NEWS.d/next/Security/2025-06-27-21-23-19.gh-issue-136053.QZxcee.rst b/Misc/NEWS.d/next/Security/2025-06-27-21-23-19.gh-issue-136053.QZxcee.rst deleted file mode 100644 index 93caed3aa3b9dd..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-06-27-21-23-19.gh-issue-136053.QZxcee.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`marshal`: fix a possible crash when deserializing :class:`slice` objects. diff --git a/Misc/NEWS.d/next/Tests/2025-06-19-15-29-38.gh-issue-135494.FVl9a0.rst b/Misc/NEWS.d/next/Tests/2025-06-19-15-29-38.gh-issue-135494.FVl9a0.rst deleted file mode 100644 index 832d1fe033e229..00000000000000 --- a/Misc/NEWS.d/next/Tests/2025-06-19-15-29-38.gh-issue-135494.FVl9a0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix regrtest to support excluding tests from ``--pgo`` tests. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2025-06-26-15-15-35.gh-issue-135966.EBpF8Y.rst b/Misc/NEWS.d/next/Tests/2025-06-26-15-15-35.gh-issue-135966.EBpF8Y.rst deleted file mode 100644 index 8dc007431f3919..00000000000000 --- a/Misc/NEWS.d/next/Tests/2025-06-26-15-15-35.gh-issue-135966.EBpF8Y.rst +++ /dev/null @@ -1 +0,0 @@ -The iOS testbed now handles the ``app_packages`` folder as a site directory. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-06-25-10-36-22.gh-issue-133600.bkdgHC.rst b/Misc/NEWS.d/next/Tools-Demos/2025-06-25-10-36-22.gh-issue-133600.bkdgHC.rst deleted file mode 100644 index 0225806768eb45..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-06-25-10-36-22.gh-issue-133600.bkdgHC.rst +++ /dev/null @@ -1,4 +0,0 @@ -Backport file reorganization for Tools/wasm/wasi. - -This should make backporting future code changes easier. It also simplifies -instructions around how to do WASI builds in the devguide. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-06-26-15-58-13.gh-issue-135968.C4v_-W.rst b/Misc/NEWS.d/next/Tools-Demos/2025-06-26-15-58-13.gh-issue-135968.C4v_-W.rst deleted file mode 100644 index 1c0b3825c71c1d..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-06-26-15-58-13.gh-issue-135968.C4v_-W.rst +++ /dev/null @@ -1 +0,0 @@ -Stubs for ``strip`` are now provided as part of an iOS install. diff --git a/README.rst b/README.rst index 59efafb69d925b..0092dfb497a021 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.14.0 beta 3 +This is Python version 3.14.0 beta 4 ==================================== .. image:: https://github.com/python/cpython/actions/workflows/build.yml/badge.svg?branch=main&event=push From f0e603412bb6945761551c412ad324720909c6cc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:11:28 +0200 Subject: [PATCH 0587/1674] [3.14] gh-101100: Fix sphinx warnings in `Doc/library/exceptions.rst` (GH-136309) (#136414) Co-authored-by: Yuki Kobayashi Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/exceptions.rst | 30 +++++++++++++++++++----------- Doc/tools/.nitignore | 1 - 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 9806ae80905ca0..8cc887b8ceb378 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -204,10 +204,16 @@ The following exceptions are the exceptions that are usually raised. assignment fails. (When an object does not support attribute references or attribute assignments at all, :exc:`TypeError` is raised.) - The :attr:`name` and :attr:`obj` attributes can be set using keyword-only - arguments to the constructor. When set they represent the name of the attribute - that was attempted to be accessed and the object that was accessed for said - attribute, respectively. + The optional *name* and *obj* keyword-only arguments + set the corresponding attributes: + + .. attribute:: name + + The name of the attribute that was attempted to be accessed. + + .. attribute:: obj + + The object that was accessed for the named attribute. .. versionchanged:: 3.10 Added the :attr:`name` and :attr:`obj` attributes. @@ -215,7 +221,7 @@ The following exceptions are the exceptions that are usually raised. .. exception:: EOFError Raised when the :func:`input` function hits an end-of-file condition (EOF) - without reading any data. (N.B.: the :meth:`io.IOBase.read` and + without reading any data. (Note: the :meth:`!io.IOBase.read` and :meth:`io.IOBase.readline` methods return an empty string when they hit EOF.) @@ -312,9 +318,11 @@ The following exceptions are the exceptions that are usually raised. unqualified names. The associated value is an error message that includes the name that could not be found. - The :attr:`name` attribute can be set using a keyword-only argument to the - constructor. When set it represent the name of the variable that was attempted - to be accessed. + The optional *name* keyword-only argument sets the attribute: + + .. attribute:: name + + The name of the variable that was attempted to be accessed. .. versionchanged:: 3.10 Added the :attr:`name` attribute. @@ -382,7 +390,7 @@ The following exceptions are the exceptions that are usually raised. The corresponding error message, as provided by the operating system. It is formatted by the C - functions :c:func:`perror` under POSIX, and :c:func:`FormatMessage` + functions :c:func:`!perror` under POSIX, and :c:func:`!FormatMessage` under Windows. .. attribute:: filename @@ -398,7 +406,7 @@ The following exceptions are the exceptions that are usually raised. .. versionchanged:: 3.3 :exc:`EnvironmentError`, :exc:`IOError`, :exc:`WindowsError`, :exc:`socket.error`, :exc:`select.error` and - :exc:`mmap.error` have been merged into :exc:`OSError`, and the + :exc:`!mmap.error` have been merged into :exc:`OSError`, and the constructor may return a subclass. .. versionchanged:: 3.4 @@ -590,7 +598,7 @@ The following exceptions are the exceptions that are usually raised. handled, the Python interpreter exits; no stack traceback is printed. The constructor accepts the same optional argument passed to :func:`sys.exit`. If the value is an integer, it specifies the system exit status (passed to - C's :c:func:`exit` function); if it is ``None``, the exit status is zero; if + C's :c:func:`!exit` function); if it is ``None``, the exit status is zero; if it has another type (such as a string), the object's value is printed and the exit status is one. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index e29775b075a82f..4f5396857f3024 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -16,7 +16,6 @@ Doc/library/ast.rst Doc/library/asyncio-extending.rst Doc/library/email.charset.rst Doc/library/email.parser.rst -Doc/library/exceptions.rst Doc/library/functools.rst Doc/library/http.cookiejar.rst Doc/library/http.server.rst From 78c12273810036f555c515e807887b9d1473f12b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:48:03 +0200 Subject: [PATCH 0588/1674] [3.14] gh-136186: Fix race condition in test_external_inspection.test_only_active_thread (GH-136347) (#136416) --- Lib/test/test_external_inspection.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_external_inspection.py b/Lib/test/test_external_inspection.py index 0f31c225e68de3..44890ebfe5f76d 100644 --- a/Lib/test/test_external_inspection.py +++ b/Lib/test/test_external_inspection.py @@ -5,6 +5,7 @@ import sys import socket import threading +import time from asyncio import staggered, taskgroups, base_events, tasks from unittest.mock import ANY from test.support import os_helper, SHORT_TIMEOUT, busy_retry, requires_gil_enabled @@ -930,9 +931,6 @@ def main_work(): # Signal threads to start waiting ready_event.set() - # Give threads time to start sleeping - time.sleep(0.1) - # Now do busy work to hold the GIL main_work() """ @@ -967,7 +965,23 @@ def main_work(): # Get stack trace with all threads unwinder_all = RemoteUnwinder(p.pid, all_threads=True) - all_traces = unwinder_all.get_stack_trace() + for _ in range(10): + # Wait for the main thread to start its busy work + all_traces = unwinder_all.get_stack_trace() + found = False + for thread_id, stack in all_traces: + if not stack: + continue + current_frame = stack[0] + if current_frame.funcname == "main_work" and current_frame.lineno >15: + found = True + + if found: + break + # Give a bit of time to take the next sample + time.sleep(0.1) + else: + self.fail("Main thread did not start its busy work on time") # Get stack trace with only GIL holder unwinder_gil = RemoteUnwinder(p.pid, only_active_thread=True) From 72358614d2a4fba2430b0c2827841b1973fa710a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 8 Jul 2025 17:31:34 +0300 Subject: [PATCH 0589/1674] Post 3.14.0b4 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 40135791403f3c..77fc8aeb918cf6 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -24,7 +24,7 @@ #define PY_RELEASE_SERIAL 4 /* Version as a string */ -#define PY_VERSION "3.14.0b4" +#define PY_VERSION "3.14.0b4+" /*--end constants--*/ From f937b9fffbaaf5e604d5a575758c81d411b33c81 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 18:11:48 +0200 Subject: [PATCH 0590/1674] [3.14] gh-136380: Fix import behavior for `concurrent.futures.InterpreterPoolExecutor` (GH-136381) (#136420) gh-136380: Fix import behavior for `concurrent.futures.InterpreterPoolExecutor` (GH-136381) (cherry picked from commit 490eea02819ad303a5042529af7507b7b1fdabdc) Co-authored-by: AN Long Co-authored-by: Serhiy Storchaka Co-authored-by: Peter Bierma Co-authored-by: sobolevn --- Lib/concurrent/futures/__init__.py | 35 ++++++++-------- .../test_interpreter_pool.py | 41 +++++++++++++++++++ ...-07-07-22-12-32.gh-issue-136380.1b_nXl.rst | 3 ++ 3 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst diff --git a/Lib/concurrent/futures/__init__.py b/Lib/concurrent/futures/__init__.py index 7ada7431c1ab8c..e717222cf98b32 100644 --- a/Lib/concurrent/futures/__init__.py +++ b/Lib/concurrent/futures/__init__.py @@ -17,7 +17,7 @@ wait, as_completed) -__all__ = ( +__all__ = [ 'FIRST_COMPLETED', 'FIRST_EXCEPTION', 'ALL_COMPLETED', @@ -29,10 +29,18 @@ 'Executor', 'wait', 'as_completed', - 'InterpreterPoolExecutor', 'ProcessPoolExecutor', 'ThreadPoolExecutor', -) +] + + +try: + import _interpreters +except ImportError: + _interpreters = None + +if _interpreters: + __all__.append('InterpreterPoolExecutor') def __dir__(): @@ -43,22 +51,15 @@ def __getattr__(name): global ProcessPoolExecutor, ThreadPoolExecutor, InterpreterPoolExecutor if name == 'ProcessPoolExecutor': - from .process import ProcessPoolExecutor as pe - ProcessPoolExecutor = pe - return pe + from .process import ProcessPoolExecutor + return ProcessPoolExecutor if name == 'ThreadPoolExecutor': - from .thread import ThreadPoolExecutor as te - ThreadPoolExecutor = te - return te + from .thread import ThreadPoolExecutor + return ThreadPoolExecutor - if name == 'InterpreterPoolExecutor': - try: - from .interpreter import InterpreterPoolExecutor as ie - except ModuleNotFoundError: - ie = InterpreterPoolExecutor = None - else: - InterpreterPoolExecutor = ie - return ie + if _interpreters and name == 'InterpreterPoolExecutor': + from .interpreter import InterpreterPoolExecutor + return InterpreterPoolExecutor raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index 844dfdd6fc901c..b10bbebd0984c4 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -2,7 +2,9 @@ import contextlib import io import os +import subprocess import sys +import textwrap import time import unittest from concurrent.futures.interpreter import BrokenInterpreterPool @@ -457,6 +459,45 @@ def test_free_reference(self): # Weak references don't cross between interpreters. raise unittest.SkipTest('not applicable') + @support.requires_subprocess() + def test_import_interpreter_pool_executor(self): + # Test the import behavior normally if _interpreters is unavailable. + code = textwrap.dedent(""" + import sys + # Set it to None to emulate the case when _interpreter is unavailable. + sys.modules['_interpreters'] = None + from concurrent import futures + + try: + futures.InterpreterPoolExecutor + except AttributeError: + pass + else: + print('AttributeError not raised!', file=sys.stderr) + sys.exit(1) + + try: + from concurrent.futures import InterpreterPoolExecutor + except ImportError: + pass + else: + print('ImportError not raised!', file=sys.stderr) + sys.exit(1) + + from concurrent.futures import * + + if 'InterpreterPoolExecutor' in globals(): + print('InterpreterPoolExecutor should not be imported!', + file=sys.stderr) + sys.exit(1) + """) + + cmd = [sys.executable, '-c', code] + p = subprocess.run(cmd, capture_output=True) + self.assertEqual(p.returncode, 0, p.stderr.decode()) + self.assertEqual(p.stdout.decode(), '') + self.assertEqual(p.stderr.decode(), '') + class AsyncioTest(InterpretersMixin, testasyncio_utils.TestCase): diff --git a/Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst b/Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst new file mode 100644 index 00000000000000..4ac04b9c0a6c5c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst @@ -0,0 +1,3 @@ +Raises :exc:`AttributeError` when accessing +:class:`concurrent.futures.InterpreterPoolExecutor` and subinterpreters are +not available. From 66f85f4be84964d2ffb9611d05cebb986c2abf2d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:38:37 +0200 Subject: [PATCH 0591/1674] [3.14] Update bytecode magic number in tests for the 3.14 release candidate (GH-136427) (#136429) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Lib/test/test_importlib/test_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index 5de89714eb50c7..6d6d5f96aab4a8 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -635,7 +635,7 @@ def test_magic_number(self): # stakeholders such as OS package maintainers must be notified # in advance. Such exceptional releases will then require an # adjustment to this test case. - EXPECTED_MAGIC_NUMBER = 3495 + EXPECTED_MAGIC_NUMBER = 3625 actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little') msg = ( From 6a2a2906f805ce6b4e8315da32e7a4ad0aa6bace Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:58:01 +0200 Subject: [PATCH 0592/1674] [3.14] GH-133136: Revise QSBR to reduce excess memory held (gh-135473) (#135912) The free threading build uses QSBR to delay the freeing of dictionary keys and list arrays when the objects are accessed by multiple threads in order to allow concurrent reads to proceed with holding the object lock. The requests are processed in batches to reduce execution overhead, but for large memory blocks this can lead to excess memory usage. Take into account the size of the memory block when deciding when to process QSBR requests. Also track the amount of memory being held by QSBR for mimalloc pages. Advance the write sequence if this memory exceeds a limit. Advancing the sequence will allow it to be freed more quickly. Process the held QSBR items from the "eval breaker", rather than from `_PyMem_FreeDelayed()`. This gives a higher chance that the global read sequence has advanced enough so that items can be freed. (cherry picked from commit 113de8545ffe74a4a1dddb9351fa1cbd3562b621) Co-authored-by: Neil Schemenauer Co-authored-by: Sam Gross --- Doc/data/python3.14.abi | 6772 +++++++++-------- Include/internal/pycore_pymem.h | 2 +- Include/internal/pycore_qsbr.h | 31 +- ...-06-03-21-06-22.gh-issue-133136.Usnvri.rst | 2 + Objects/codeobject.c | 2 +- Objects/dictobject.c | 4 +- Objects/listobject.c | 3 +- Objects/obmalloc.c | 96 +- Python/ceval_gil.c | 4 + Python/qsbr.c | 12 +- 10 files changed, 3518 insertions(+), 3410 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index 478d23a2a58125..e2cb3cbe30da47 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -2166,7 +2166,7 @@ - + @@ -2671,15 +2671,15 @@ - + - + - + @@ -3954,7 +3954,7 @@ - + @@ -5069,15 +5069,12 @@ - - - - - - + + + - + @@ -5267,14 +5264,14 @@ - + - + @@ -6021,17 +6018,17 @@ - - + + - - + + - - - + + + @@ -6388,159 +6385,159 @@ - - + + - - + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - + + + - - - + + + - - - - - - - + + + + + + + - - - - + + + + - - - - + + + + - - + + - - + + - - + + - - - + + + - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - - - - - - + + + + + + - - - + + + - - + + - - + + - - + + @@ -7055,7 +7052,7 @@ - + @@ -7237,83 +7234,83 @@ - - - - - + + + + + - - - - + + + + - - + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - - - - - + + + + + + @@ -8124,102 +8121,102 @@ - + - + - - + + - - + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + @@ -8414,8 +8411,8 @@ - - + + @@ -8593,54 +8590,54 @@ - - + + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - - + + + @@ -9023,27 +9020,27 @@ - - - + + + - - - - + + + + - - + + - - + + - - + + @@ -9182,62 +9179,62 @@ - - + + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + @@ -9581,76 +9578,76 @@ - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -10264,19 +10261,19 @@ - + - + - + - + @@ -10395,45 +10392,45 @@ - + - + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + - - + + @@ -10493,16 +10490,16 @@ - - + + - - + + - - + + @@ -10596,9 +10593,9 @@ - - - + + + @@ -10929,7 +10926,7 @@ - + @@ -10950,163 +10947,163 @@ - + - - + + - + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - - + + - - - - - + + + + + - - - - + + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - + - - + + - - - - - + + + + + @@ -13153,10 +13150,10 @@ - + - + @@ -14526,27 +14523,27 @@ - - - - - + + - - + + - + - + - + - - - + + + + + + @@ -14576,8 +14573,8 @@ - - + + @@ -14591,7 +14588,7 @@ - + @@ -14627,175 +14624,175 @@ - - + + - + - - + + - + - - + + - + - - + + - - + + - + - + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - + - + - + - + @@ -14806,8 +14803,8 @@ - - + + @@ -14821,7 +14818,7 @@ - + @@ -14929,14 +14926,14 @@ - + - - - + + + @@ -14944,14 +14941,14 @@ - - + + - - - + + + @@ -14963,7 +14960,7 @@ - + @@ -14975,7 +14972,7 @@ - + @@ -14984,10 +14981,10 @@ - - - - + + + + @@ -15043,8 +15040,8 @@ - - + + @@ -15052,9 +15049,9 @@ - - - + + + @@ -15062,7 +15059,7 @@ - + @@ -15070,8 +15067,8 @@ - - + + @@ -15103,8 +15100,8 @@ - - + + @@ -15169,16 +15166,16 @@ - + - + - + - + @@ -15265,7 +15262,7 @@ - + @@ -15313,43 +15310,43 @@ - - + + - + - + - + - - + + - + - + - - + + - + @@ -15358,7 +15355,7 @@ - + @@ -15379,188 +15376,188 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - + - + - + - + - - + + - + - - + + @@ -15574,49 +15571,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -15631,16 +15628,16 @@ - + - + - + @@ -15658,22 +15655,22 @@ - + - + - + - + - + @@ -15697,13 +15694,13 @@ - + - + @@ -15715,27 +15712,27 @@ - - + + - - - + + + - + - + - - + + @@ -15761,28 +15758,28 @@ - + - + - + - + - + - + - - - + + + @@ -15790,19 +15787,19 @@ - - + + - + - - + + - + @@ -15814,8 +15811,8 @@ - - + + @@ -15829,7 +15826,7 @@ - + @@ -15859,10 +15856,10 @@ - + - + @@ -15916,7 +15913,7 @@ - + @@ -15940,10 +15937,10 @@ - + - + @@ -15969,8 +15966,8 @@ - - + + @@ -15979,7 +15976,7 @@ - + @@ -15990,8 +15987,8 @@ - - + + @@ -16002,10 +15999,10 @@ - + - + @@ -16022,10 +16019,10 @@ - - + + - + @@ -16034,18 +16031,18 @@ - - - - + + + + - + - + @@ -16054,7 +16051,7 @@ - + @@ -16074,7 +16071,7 @@ - + @@ -16082,25 +16079,25 @@ - + - - - + + + - - + + - - + + @@ -16116,20 +16113,20 @@ - - + + - - - - - - + + + + + + @@ -16137,11 +16134,11 @@ - + - - + + @@ -16149,11 +16146,11 @@ - + - - + + @@ -16164,8 +16161,8 @@ - - + + @@ -16173,11 +16170,11 @@ - + - - + + @@ -16209,12 +16206,12 @@ - + - + - + @@ -16229,42 +16226,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -16276,49 +16273,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -16326,7 +16323,7 @@ - + @@ -16334,7 +16331,7 @@ - + @@ -16345,7 +16342,7 @@ - + @@ -16353,7 +16350,7 @@ - + @@ -16361,7 +16358,7 @@ - + @@ -16372,7 +16369,7 @@ - + @@ -16380,12 +16377,12 @@ - + - + @@ -16393,7 +16390,7 @@ - + @@ -16409,7 +16406,7 @@ - + @@ -16420,7 +16417,7 @@ - + @@ -16431,7 +16428,7 @@ - + @@ -16442,7 +16439,7 @@ - + @@ -16456,12 +16453,12 @@ - + - + @@ -16469,7 +16466,7 @@ - + @@ -16480,7 +16477,7 @@ - + @@ -16491,7 +16488,7 @@ - + @@ -16499,7 +16496,7 @@ - + @@ -16507,7 +16504,7 @@ - + @@ -16515,7 +16512,7 @@ - + @@ -16526,7 +16523,7 @@ - + @@ -16540,7 +16537,7 @@ - + @@ -16563,7 +16560,7 @@ - + @@ -16586,7 +16583,7 @@ - + @@ -16606,9 +16603,9 @@ - + - + @@ -17352,16 +17349,16 @@ - + - - - - - + + + + + @@ -17372,40 +17369,40 @@ - + - + - - - - + + + + - + - + - - - + + + - + - - + + - + - + - + @@ -17416,13 +17413,13 @@ - - + + - + - + @@ -17434,11 +17431,11 @@ - + - - + + @@ -17449,18 +17446,18 @@ - + - - + + - + - + - + @@ -17469,64 +17466,64 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -17537,7 +17534,7 @@ - + @@ -17587,7 +17584,7 @@ - + @@ -17616,7 +17613,7 @@ - + @@ -17642,7 +17639,7 @@ - + @@ -17677,7 +17674,7 @@ - + @@ -17685,7 +17682,7 @@ - + @@ -17699,7 +17696,7 @@ - + @@ -17710,7 +17707,7 @@ - + @@ -17721,7 +17718,7 @@ - + @@ -17735,7 +17732,7 @@ - + @@ -17746,7 +17743,7 @@ - + @@ -17754,7 +17751,7 @@ - + @@ -17765,7 +17762,7 @@ - + @@ -17776,7 +17773,7 @@ - + @@ -17790,7 +17787,7 @@ - + @@ -17798,7 +17795,7 @@ - + @@ -17812,7 +17809,7 @@ - + @@ -17820,7 +17817,7 @@ - + @@ -17840,8 +17837,8 @@ - - + + @@ -17849,12 +17846,12 @@ - + - + @@ -17863,8 +17860,8 @@ - - + + @@ -17881,21 +17878,21 @@ - + - + - + - + - + @@ -17904,7 +17901,7 @@ - + @@ -17924,7 +17921,7 @@ - + @@ -17964,7 +17961,7 @@ - + @@ -18026,7 +18023,7 @@ - + @@ -18040,24 +18037,24 @@ - + - + - + - + - + - + - + @@ -18066,2602 +18063,2602 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + @@ -20670,22 +20667,22 @@ - - - - + + + + - - + + - + - - + + @@ -20693,10 +20690,10 @@ - + - + @@ -20714,57 +20711,57 @@ - + - + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + @@ -20773,7 +20770,7 @@ - + @@ -20799,19 +20796,19 @@ - + - - + + - + - + @@ -20823,20 +20820,20 @@ - + - + - + - + - + @@ -20845,10 +20842,10 @@ - + - + @@ -20857,7 +20854,7 @@ - + @@ -20865,17 +20862,17 @@ - + - + - + @@ -20886,7 +20883,7 @@ - + @@ -20894,19 +20891,19 @@ - + - - + + - + - + @@ -20914,10 +20911,10 @@ - - + + - + @@ -20926,7 +20923,7 @@ - + @@ -20937,7 +20934,7 @@ - + @@ -20951,16 +20948,16 @@ - + - + - + - + @@ -20984,21 +20981,21 @@ - + - + - + - + @@ -21006,7 +21003,7 @@ - + @@ -21029,13 +21026,13 @@ - + - + - + @@ -21046,12 +21043,12 @@ - + - + @@ -21065,7 +21062,7 @@ - + @@ -21079,7 +21076,7 @@ - + @@ -21088,7 +21085,7 @@ - + @@ -21105,8 +21102,8 @@ - - + + @@ -21123,10 +21120,10 @@ - + - + @@ -21134,13 +21131,13 @@ - + - + @@ -21156,7 +21153,7 @@ - + @@ -21164,15 +21161,15 @@ - + - + - + @@ -21185,7 +21182,7 @@ - + @@ -21196,12 +21193,12 @@ - + - + - + @@ -21224,19 +21221,19 @@ - - + + - + - + - + @@ -21245,15 +21242,15 @@ - + - + - + @@ -21261,10 +21258,10 @@ - + - + @@ -21275,7 +21272,7 @@ - + @@ -21284,7 +21281,7 @@ - + @@ -21292,10 +21289,10 @@ - + - + @@ -21307,8 +21304,8 @@ - - + + @@ -21316,12 +21313,12 @@ - + - + - + @@ -21335,7 +21332,7 @@ - + @@ -21343,18 +21340,18 @@ - + - + - + - + - + @@ -21368,8 +21365,8 @@ - - + + @@ -21380,7 +21377,7 @@ - + @@ -21404,28 +21401,28 @@ - + - + - + - + - + - + - + - + @@ -21458,7 +21455,7 @@ - + @@ -21470,7 +21467,7 @@ - + @@ -21479,19 +21476,19 @@ - + - + - + - + @@ -21506,7 +21503,7 @@ - + @@ -21518,10 +21515,10 @@ - + - + @@ -21533,25 +21530,25 @@ - + - + - + - + - + - + @@ -21572,40 +21569,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -21626,13 +21623,13 @@ - + - + @@ -21653,22 +21650,22 @@ - + - + - + - + - + @@ -21676,7 +21673,7 @@ - + @@ -21729,21 +21726,21 @@ - + - + - + - + - - + + @@ -21754,14 +21751,14 @@ - - + + - - + + @@ -21769,71 +21766,71 @@ - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -21842,17 +21839,17 @@ - + - + - + - + @@ -21876,7 +21873,7 @@ - + @@ -21884,26 +21881,26 @@ - - + + - + - + - - + + - + @@ -21912,7 +21909,7 @@ - + @@ -21920,86 +21917,95 @@ - + - + - + - + - - + + - + - + - + - + - + - + - + - - - - + - + + + + + + + + + + + + + - + - + - - + + - + - + - + - + - + - + - + - + @@ -22007,16 +22013,16 @@ - - + + - + - + @@ -22025,7 +22031,7 @@ - + @@ -22036,115 +22042,115 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -22168,7 +22174,7 @@ - + @@ -22177,70 +22183,70 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -22249,34 +22255,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -22290,7 +22296,7 @@ - + @@ -22298,25 +22304,25 @@ - + - + - + - + - + @@ -22339,32 +22345,32 @@ - + - + - + - - + + - + - + @@ -22372,19 +22378,19 @@ - - + + - - + + - + @@ -22393,8 +22399,8 @@ - - + + @@ -22405,14 +22411,14 @@ - + - + @@ -22429,7 +22435,7 @@ - + @@ -22437,9 +22443,9 @@ - + - + @@ -22448,15 +22454,15 @@ - + - + - + - + @@ -22471,7 +22477,7 @@ - + @@ -22483,13 +22489,13 @@ - + - + - + @@ -22500,9 +22506,9 @@ - + - + @@ -22523,28 +22529,28 @@ - + - + - - - + + + - + - + - - - + + + @@ -22558,23 +22564,23 @@ - + - + - + - + - + @@ -22585,7 +22591,7 @@ - + @@ -22593,43 +22599,43 @@ - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + @@ -22664,36 +22670,36 @@ - - - + + + - + - - - - - - - + + + + + + + - - + + - + - + - + - + @@ -22701,44 +22707,44 @@ - - + + - + - + - + - + - + - - + + - + - + - - + + - + @@ -22750,21 +22756,21 @@ - + - + - + - - - - - - - + + + + + + + @@ -22787,30 +22793,30 @@ - + - + - + - + - - + + - + - + - + - + @@ -22819,32 +22825,32 @@ - + - - - - - - + + + + + + - + - - - + + + - + - - + + @@ -22852,9 +22858,9 @@ - - - + + + @@ -22868,36 +22874,36 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -22905,7 +22911,7 @@ - + @@ -22913,10 +22919,10 @@ - + - + @@ -22924,10 +22930,10 @@ - + - + @@ -22944,7 +22950,7 @@ - + @@ -22952,18 +22958,18 @@ - + - + - + - + - + @@ -22971,7 +22977,7 @@ - + @@ -22979,7 +22985,7 @@ - + @@ -22990,8 +22996,8 @@ - - + + @@ -23002,9 +23008,9 @@ - - - + + + @@ -23042,10 +23048,10 @@ - + - + @@ -23054,7 +23060,7 @@ - + @@ -23066,19 +23072,19 @@ - + - + - + - + @@ -23093,22 +23099,22 @@ - - + + - + - + - + @@ -23134,19 +23140,19 @@ - + - + - + - + @@ -23194,11 +23200,11 @@ - + - - + + @@ -23236,7 +23242,7 @@ - + @@ -23269,19 +23275,19 @@ - + - + - + - + @@ -23320,16 +23326,16 @@ - + - + - + @@ -23344,7 +23350,7 @@ - + @@ -23355,11 +23361,11 @@ - + - - + + @@ -23382,14 +23388,14 @@ - + - - + + @@ -23397,10 +23403,10 @@ - - + + - + @@ -23409,7 +23415,7 @@ - + @@ -23417,8 +23423,8 @@ - - + + @@ -23432,13 +23438,13 @@ - - + + - + @@ -23453,7 +23459,7 @@ - + @@ -23489,7 +23495,7 @@ - + @@ -23504,179 +23510,179 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + + + + - - - - + + + - - + + - - - + + + + + + - - - - - - - + + + + - - + + - - - - - + + + + + - - + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - + - - - + - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + - - + - - - - - - + + + + + + @@ -23977,272 +23983,272 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -24357,14 +24363,14 @@ - - + + - + - + @@ -24382,9 +24388,9 @@ - + - + @@ -24529,9 +24535,9 @@ - - - + + + @@ -24539,7 +24545,7 @@ - + @@ -24547,12 +24553,12 @@ - + - + @@ -24566,9 +24572,9 @@ - - - + + + @@ -24577,8 +24583,8 @@ + - @@ -24635,7 +24641,7 @@ - + @@ -24723,7 +24729,7 @@ - + @@ -24773,7 +24779,7 @@ - + @@ -24784,8 +24790,8 @@ - - + + @@ -24793,10 +24799,10 @@ - + - + @@ -24805,13 +24811,13 @@ - - + + - + @@ -24832,11 +24838,11 @@ - + - - + + @@ -24850,17 +24856,17 @@ - - - - - + + + + + - + - + @@ -24869,7 +24875,7 @@ - + @@ -24882,7 +24888,7 @@ - + @@ -24896,24 +24902,24 @@ - - + + - + - + - + @@ -24937,7 +24943,7 @@ - + @@ -25018,7 +25024,7 @@ - + @@ -25026,7 +25032,7 @@ - + @@ -25119,35 +25125,35 @@ - - + + - + - + - - + + - + - + - + - - + + - + - - + + @@ -25158,27 +25164,27 @@ - + - + - + - - - - - - - - - - - + + + + + + + + + + + @@ -25227,13 +25233,13 @@ - + - + @@ -25241,10 +25247,10 @@ - - - - + + + + @@ -25456,15 +25462,15 @@ - + - + - + @@ -25490,23 +25496,23 @@ - + - + - - + + - + @@ -25600,22 +25606,22 @@ - + - + - + - + @@ -25730,24 +25736,24 @@ - + - + - - - - - + + + + + - - - - + + + + @@ -25765,26 +25771,26 @@ - + - + - + - + - + - + @@ -25792,38 +25798,38 @@ - - + + - + - + - + - + - + - - + + - - + + @@ -25848,7 +25854,7 @@ - + @@ -25860,7 +25866,7 @@ - + @@ -25892,7 +25898,7 @@ - + @@ -25969,10 +25975,10 @@ - - + + - + @@ -25980,7 +25986,7 @@ - + @@ -25995,7 +26001,7 @@ - + @@ -26004,22 +26010,22 @@ - - + + - + - - + + - - + + - + - + @@ -26057,16 +26063,16 @@ - - + + - - + + @@ -26082,25 +26088,25 @@ - + - + - + - + - + - - + + @@ -26111,17 +26117,17 @@ - + - - + + - - + + @@ -26132,17 +26138,17 @@ - + - + - + - + @@ -26151,15 +26157,15 @@ - + - + - + @@ -26169,8 +26175,8 @@ - - + + @@ -26178,25 +26184,25 @@ - - + + - + - - + + - + - + @@ -26214,10 +26220,10 @@ - + - + @@ -26243,7 +26249,7 @@ - + @@ -26261,7 +26267,7 @@ - + @@ -26306,199 +26312,199 @@ - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - - - - + + + + - - - + + + - + - + - + - + @@ -26508,15 +26514,15 @@ - - + + - - + + @@ -26526,71 +26532,71 @@ - + - + - + - - + + - + - + - - - - - - + + + + + + - + - + - + - + - + - - + + - - - - + + + + - + @@ -26611,10 +26617,10 @@ - + - + @@ -26626,24 +26632,24 @@ - + - + - - - - - + + + + + - + @@ -26651,33 +26657,33 @@ - + - + - + - - + + - + - + @@ -26686,24 +26692,24 @@ - - + + - - + + - + - + - + @@ -26713,17 +26719,17 @@ - - + + - - + + - + @@ -26738,7 +26744,7 @@ - + @@ -26747,14 +26753,14 @@ - + - + @@ -26766,11 +26772,11 @@ - + - + @@ -26784,50 +26790,50 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -26868,21 +26874,21 @@ - - - - + + + + + - - - + + - + - + @@ -26897,27 +26903,27 @@ - + - + - + - + - + @@ -26940,9 +26946,9 @@ - - - + + + @@ -26950,10 +26956,10 @@ - - + + - + @@ -26962,7 +26968,7 @@ - + @@ -26976,8 +26982,8 @@ - - + + @@ -26990,10 +26996,10 @@ - - - - + + + + @@ -27001,13 +27007,13 @@ - + - - + + - + @@ -27016,7 +27022,7 @@ - + @@ -27042,23 +27048,23 @@ - - - - - + + + + + + - - - + + - - + + @@ -27071,10 +27077,10 @@ - + - + @@ -27115,18 +27121,18 @@ - + - + - + - + @@ -27182,31 +27188,31 @@ - + - + - + - + - + - + - + - + @@ -27217,151 +27223,151 @@ - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - - - + + + - - + + - + - + - + - + - + - - + + - + @@ -27381,18 +27387,18 @@ - + - + - + @@ -27402,49 +27408,49 @@ - + - + - + - + - - - + + + - + - + - + - + @@ -27582,27 +27588,27 @@ - + - + - + - + - - - - - + + + + + @@ -27646,7 +27652,7 @@ - + @@ -27703,21 +27709,21 @@ - - - - + + + + - - - - + + + + - + @@ -27791,9 +27797,9 @@ - + - + @@ -27833,17 +27839,17 @@ - + - + - - - - + + + + @@ -27864,7 +27870,7 @@ - + @@ -27878,7 +27884,7 @@ - + @@ -27886,18 +27892,18 @@ - - - - - - - - - + + + + + + + + + - + @@ -27954,7 +27960,7 @@ - + @@ -27989,15 +27995,15 @@ - + - + - + @@ -28048,7 +28054,7 @@ - + @@ -28056,7 +28062,7 @@ - + @@ -28064,7 +28070,7 @@ - + @@ -28087,8 +28093,8 @@ - - + + @@ -28100,11 +28106,11 @@ - - + + - + @@ -28122,7 +28128,7 @@ - + @@ -28135,7 +28141,7 @@ - + @@ -28144,22 +28150,22 @@ - + - - + + - - + + @@ -28176,7 +28182,7 @@ - + @@ -28185,7 +28191,7 @@ - + @@ -28193,24 +28199,24 @@ - + - + - + - + - + - + @@ -28220,9 +28226,9 @@ - - - + + + @@ -28230,12 +28236,12 @@ - + + - - - + + @@ -28247,37 +28253,37 @@ - + - + - + - + - + - + - + - + + - @@ -28308,7 +28314,7 @@ - + @@ -28367,7 +28373,7 @@ - + @@ -28432,7 +28438,7 @@ - + @@ -28444,16 +28450,16 @@ - + - - + + - + - + @@ -28468,16 +28474,16 @@ - - + + - + - + - + @@ -28489,27 +28495,27 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - - + + - + @@ -28577,13 +28583,13 @@ - + - - + + @@ -28608,21 +28614,21 @@ - + - + - + - + @@ -28631,7 +28637,7 @@ - + @@ -28645,7 +28651,7 @@ - + @@ -28654,7 +28660,7 @@ - + @@ -28722,12 +28728,12 @@ - + - + @@ -28744,19 +28750,19 @@ - + - + - + @@ -28791,12 +28797,12 @@ - + - + @@ -28809,44 +28815,44 @@ - + - + - + - + - + - + - + - + - + @@ -28855,32 +28861,32 @@ - + - + - + - + - + @@ -28905,7 +28911,7 @@ - + @@ -28913,12 +28919,12 @@ - - + + - + @@ -28928,33 +28934,33 @@ - + - + - + - + - + @@ -28962,85 +28968,85 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -29049,62 +29055,62 @@ - + - + - + - + - - + + - + - + - + - - - + + + - + - - + + - + - - - - - + + + + + @@ -29116,8 +29122,8 @@ - - + + @@ -29163,12 +29169,12 @@ - + - + @@ -29176,8 +29182,8 @@ - - + + @@ -29186,53 +29192,53 @@ - + - + - + - + - + - - - + + + - + - - + + - + - - - - - - + + + + + + @@ -29248,7 +29254,7 @@ - + @@ -29257,21 +29263,21 @@ - + - + - + - + @@ -29287,65 +29293,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -29353,18 +29359,18 @@ - - + + - + - + - + @@ -29382,13 +29388,13 @@ - + - + - + @@ -29400,16 +29406,16 @@ - + - + - - - - + + + + @@ -29434,23 +29440,23 @@ - - + + - - + + - - + + - - + + - + @@ -29511,21 +29517,21 @@ - + - - - - + + + + - + - + @@ -29534,27 +29540,27 @@ - + - + - + - + - + @@ -29620,16 +29626,16 @@ - - + + - + - + @@ -29643,7 +29649,7 @@ - + @@ -29655,23 +29661,23 @@ - - + + - + - + - + @@ -29689,11 +29695,11 @@ - + - + @@ -29703,66 +29709,66 @@ - + - + - + - + - - - - + + + + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + @@ -29770,7 +29776,7 @@ - + @@ -29778,59 +29784,59 @@ - + - + - + - + - - - - - + + + + + - + - + - + - + - + - - - + + + - - - - - - - + + + + + + + @@ -30000,13 +30006,13 @@ - + - - + + @@ -30038,7 +30044,7 @@ - + @@ -30244,41 +30250,41 @@ - + - + - + - + - + - + - + - + - + @@ -30386,7 +30392,7 @@ - + @@ -30395,8 +30401,8 @@ - - + + @@ -30431,7 +30437,7 @@ - + @@ -30461,19 +30467,19 @@ - + - - + + - - - - + + + + @@ -30493,7 +30499,7 @@ - + @@ -30553,20 +30559,20 @@ - + - + - + - + @@ -30579,24 +30585,24 @@ - + - + - + - + - + @@ -30677,11 +30683,11 @@ - + - + @@ -30702,7 +30708,7 @@ - + @@ -30896,7 +30902,7 @@ - + @@ -30910,7 +30916,7 @@ - + @@ -30947,22 +30953,22 @@ - - - - + + + + - + + - + - @@ -31093,7 +31099,7 @@ - + @@ -31102,8 +31108,8 @@ - - + + @@ -31127,7 +31133,7 @@ - + @@ -31219,13 +31225,13 @@ - + - - - - + + + + @@ -31255,7 +31261,7 @@ - + @@ -31276,8 +31282,8 @@ - - + + @@ -31299,26 +31305,26 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + @@ -31336,30 +31342,30 @@ - + - + - + - - + + - + - + @@ -31372,7 +31378,7 @@ - + @@ -31402,7 +31408,7 @@ - + @@ -31411,17 +31417,17 @@ - + - + - - + + @@ -31430,11 +31436,11 @@ - + - + @@ -31469,13 +31475,13 @@ - + - + @@ -31489,8 +31495,8 @@ - - + + @@ -31498,7 +31504,7 @@ - + diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 02537bdfef8598..3e12084b82ab26 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -88,7 +88,7 @@ extern wchar_t *_PyMem_DefaultRawWcsdup(const wchar_t *str); extern int _PyMem_DebugEnabled(void); // Enqueue a pointer to be freed possibly after some delay. -extern void _PyMem_FreeDelayed(void *ptr); +extern void _PyMem_FreeDelayed(void *ptr, size_t size); // Enqueue an object to be freed possibly after some delay #ifdef Py_GIL_DISABLED diff --git a/Include/internal/pycore_qsbr.h b/Include/internal/pycore_qsbr.h index b835c3abaf5d0b..1f9b3fcf777493 100644 --- a/Include/internal/pycore_qsbr.h +++ b/Include/internal/pycore_qsbr.h @@ -48,8 +48,21 @@ struct _qsbr_thread_state { // Thread state (or NULL) PyThreadState *tstate; - // Used to defer advancing write sequence a fixed number of times - int deferrals; + // Number of held items added by this thread since the last write sequence + // advance + int deferred_count; + + // Estimate for the amount of memory that is held by this thread since + // the last write sequence advance + size_t deferred_memory; + + // Amount of memory in mimalloc pages deferred from collection. When + // deferred, they are prevented from being used for a different size class + // and in a different thread. + size_t deferred_page_memory; + + // True if the deferred memory frees should be processed. + bool should_process; // Is this thread state allocated? bool allocated; @@ -109,11 +122,17 @@ _Py_qbsr_goal_reached(struct _qsbr_thread_state *qsbr, uint64_t goal) 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. +// Return the next value for the write sequence (current plus the increment). extern uint64_t -_Py_qsbr_deferred_advance(struct _qsbr_thread_state *qsbr); +_Py_qsbr_shared_next(struct _qsbr_shared *shared); + +// Return true if deferred memory frees held by QSBR should be processed to +// determine if they can be safely freed. +static inline bool +_Py_qsbr_should_process(struct _qsbr_thread_state *qsbr) +{ + return qsbr->should_process; +} // 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). diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst new file mode 100644 index 00000000000000..a9501c13c95b3a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst @@ -0,0 +1,2 @@ +Limit excess memory usage in the :term:`free threading` build when a +large dictionary or list is resized and accessed by multiple threads. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 366622c95ec881..ba178abc0c071e 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -3368,7 +3368,7 @@ create_tlbc_lock_held(PyCodeObject *co, Py_ssize_t idx) } memcpy(new_tlbc->entries, tlbc->entries, tlbc->size * sizeof(void *)); _Py_atomic_store_ptr_release(&co->co_tlbc, new_tlbc); - _PyMem_FreeDelayed(tlbc); + _PyMem_FreeDelayed(tlbc, tlbc->size * sizeof(void *)); tlbc = new_tlbc; } char *bc = PyMem_Calloc(1, _PyCode_NBYTES(co)); diff --git a/Objects/dictobject.c b/Objects/dictobject.c index b4940315a6c28d..be62ae5eefd00d 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -813,7 +813,7 @@ free_keys_object(PyDictKeysObject *keys, bool use_qsbr) { #ifdef Py_GIL_DISABLED if (use_qsbr) { - _PyMem_FreeDelayed(keys); + _PyMem_FreeDelayed(keys, _PyDict_KeysSize(keys)); return; } #endif @@ -858,7 +858,7 @@ free_values(PyDictValues *values, bool use_qsbr) assert(values->embedded == 0); #ifdef Py_GIL_DISABLED if (use_qsbr) { - _PyMem_FreeDelayed(values); + _PyMem_FreeDelayed(values, values_size_from_count(values->capacity)); return; } #endif diff --git a/Objects/listobject.c b/Objects/listobject.c index c5895645a2dd12..23d3472b6d4153 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -61,7 +61,8 @@ free_list_items(PyObject** items, bool use_qsbr) #ifdef Py_GIL_DISABLED _PyListArray *array = _Py_CONTAINER_OF(items, _PyListArray, ob_item); if (use_qsbr) { - _PyMem_FreeDelayed(array); + size_t size = sizeof(_PyListArray) + array->allocated * sizeof(PyObject *); + _PyMem_FreeDelayed(array, size); } else { PyMem_Free(array); diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index d3931aab623b70..092be84d2b9954 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -124,6 +124,33 @@ _PyMem_mi_page_is_safe_to_free(mi_page_t *page) } +#ifdef Py_GIL_DISABLED + +// If we are deferring collection of more than this amount of memory for +// mimalloc pages, advance the write sequence. Advancing allows these +// pages to be re-used in a different thread or for a different size class. +#define QSBR_PAGE_MEM_LIMIT 4096*20 + +// Return true if the global write sequence should be advanced for a mimalloc +// page that is deferred from collection. +static bool +should_advance_qsbr_for_page(struct _qsbr_thread_state *qsbr, mi_page_t *page) +{ + size_t bsize = mi_page_block_size(page); + size_t page_size = page->capacity*bsize; + if (page_size > QSBR_PAGE_MEM_LIMIT) { + qsbr->deferred_page_memory = 0; + return true; + } + qsbr->deferred_page_memory += page_size; + if (qsbr->deferred_page_memory > QSBR_PAGE_MEM_LIMIT) { + qsbr->deferred_page_memory = 0; + return true; + } + return false; +} +#endif + static bool _PyMem_mi_page_maybe_free(mi_page_t *page, mi_page_queue_t *pq, bool force) { @@ -139,7 +166,14 @@ _PyMem_mi_page_maybe_free(mi_page_t *page, mi_page_queue_t *pq, bool force) _PyMem_mi_page_clear_qsbr(page); page->retire_expire = 0; - page->qsbr_goal = _Py_qsbr_deferred_advance(tstate->qsbr); + + if (should_advance_qsbr_for_page(tstate->qsbr, page)) { + page->qsbr_goal = _Py_qsbr_advance(tstate->qsbr->shared); + } + else { + page->qsbr_goal = _Py_qsbr_shared_next(tstate->qsbr->shared); + } + llist_insert_tail(&tstate->mimalloc.page_list, &page->qsbr_node); return false; } @@ -1141,8 +1175,44 @@ free_work_item(uintptr_t ptr, delayed_dealloc_cb cb, void *state) } } + +#ifdef Py_GIL_DISABLED + +// For deferred advance on free: the number of deferred items before advancing +// the write sequence. This is based on WORK_ITEMS_PER_CHUNK. We ideally +// want to process a chunk before it overflows. +#define QSBR_DEFERRED_LIMIT 127 + +// If the deferred memory exceeds 1 MiB, advance the write sequence. This +// helps limit memory usage due to QSBR delaying frees too long. +#define QSBR_FREE_MEM_LIMIT 1024*1024 + +// Return true if the global write sequence should be advanced for a deferred +// memory free. +static bool +should_advance_qsbr_for_free(struct _qsbr_thread_state *qsbr, size_t size) +{ + if (size > QSBR_FREE_MEM_LIMIT) { + qsbr->deferred_count = 0; + qsbr->deferred_memory = 0; + qsbr->should_process = true; + return true; + } + qsbr->deferred_count++; + qsbr->deferred_memory += size; + if (qsbr->deferred_count > QSBR_DEFERRED_LIMIT || + qsbr->deferred_memory > QSBR_FREE_MEM_LIMIT) { + qsbr->deferred_count = 0; + qsbr->deferred_memory = 0; + qsbr->should_process = true; + return true; + } + return false; +} +#endif + static void -free_delayed(uintptr_t ptr) +free_delayed(uintptr_t ptr, size_t size) { #ifndef Py_GIL_DISABLED free_work_item(ptr, NULL, NULL); @@ -1200,23 +1270,32 @@ free_delayed(uintptr_t ptr) } assert(buf != NULL && buf->wr_idx < WORK_ITEMS_PER_CHUNK); - uint64_t seq = _Py_qsbr_deferred_advance(tstate->qsbr); + uint64_t seq; + if (should_advance_qsbr_for_free(tstate->qsbr, size)) { + seq = _Py_qsbr_advance(tstate->qsbr->shared); + } + else { + seq = _Py_qsbr_shared_next(tstate->qsbr->shared); + } buf->array[buf->wr_idx].ptr = ptr; buf->array[buf->wr_idx].qsbr_goal = seq; buf->wr_idx++; if (buf->wr_idx == WORK_ITEMS_PER_CHUNK) { + // Normally the processing of delayed items is done from the eval + // breaker. Processing here is a safety measure to ensure too much + // work does not accumulate. _PyMem_ProcessDelayed((PyThreadState *)tstate); } #endif } void -_PyMem_FreeDelayed(void *ptr) +_PyMem_FreeDelayed(void *ptr, size_t size) { assert(!((uintptr_t)ptr & 0x01)); if (ptr != NULL) { - free_delayed((uintptr_t)ptr); + free_delayed((uintptr_t)ptr, size); } } @@ -1226,7 +1305,10 @@ _PyObject_XDecRefDelayed(PyObject *ptr) { assert(!((uintptr_t)ptr & 0x01)); if (ptr != NULL) { - free_delayed(((uintptr_t)ptr)|0x01); + // We use 0 as the size since we don't have an easy way to know the + // actual size. If we are freeing many objects, the write sequence + // will be advanced due to QSBR_DEFERRED_LIMIT. + free_delayed(((uintptr_t)ptr)|0x01, 0); } } #endif @@ -1302,6 +1384,8 @@ _PyMem_ProcessDelayed(PyThreadState *tstate) PyInterpreterState *interp = tstate->interp; _PyThreadStateImpl *tstate_impl = (_PyThreadStateImpl *)tstate; + tstate_impl->qsbr->should_process = false; + // Process thread-local work process_queue(&tstate_impl->mem_free_queue, tstate_impl, true, NULL, NULL); diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c index 57d8f68b000b60..aa68371ac8febf 100644 --- a/Python/ceval_gil.c +++ b/Python/ceval_gil.c @@ -1387,6 +1387,10 @@ _Py_HandlePending(PyThreadState *tstate) _Py_unset_eval_breaker_bit(tstate, _PY_EVAL_EXPLICIT_MERGE_BIT); _Py_brc_merge_refcounts(tstate); } + /* Process deferred memory frees held by QSBR */ + if (_Py_qsbr_should_process(((_PyThreadStateImpl *)tstate)->qsbr)) { + _PyMem_ProcessDelayed(tstate); + } #endif /* GC scheduled to run */ diff --git a/Python/qsbr.c b/Python/qsbr.c index bf34fb2523dfc8..c9fad5c05ef108 100644 --- a/Python/qsbr.c +++ b/Python/qsbr.c @@ -41,10 +41,6 @@ // Starting size of the array of qsbr thread states #define MIN_ARRAY_SIZE 8 -// For _Py_qsbr_deferred_advance(): the number of deferrals before advancing -// the write sequence. -#define QSBR_DEFERRED_LIMIT 10 - // Allocate a QSBR thread state from the freelist static struct _qsbr_thread_state * qsbr_allocate(struct _qsbr_shared *shared) @@ -117,13 +113,9 @@ _Py_qsbr_advance(struct _qsbr_shared *shared) } uint64_t -_Py_qsbr_deferred_advance(struct _qsbr_thread_state *qsbr) +_Py_qsbr_shared_next(struct _qsbr_shared *shared) { - if (++qsbr->deferrals < QSBR_DEFERRED_LIMIT) { - return _Py_qsbr_shared_current(qsbr->shared) + QSBR_INCR; - } - qsbr->deferrals = 0; - return _Py_qsbr_advance(qsbr->shared); + return _Py_qsbr_shared_current(shared) + QSBR_INCR; } static uint64_t From 9a79c5128f6d10118b9c2a402f2f9582f7a2c489 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 03:21:56 +0200 Subject: [PATCH 0593/1674] [3.14] gh-91048: Revert the memory cache removal for remote debugging (GH-136440) (#136443) gh-91048: Revert the memory cache removal for remote debugging (GH-136440) (cherry picked from commit 77d25e5b169f7c306d3a6d9ca6777c0a0be80d8f) gh-91048: Reintroduce the memory cache for remote debugging Co-authored-by: Pablo Galindo Salgado --- Modules/_remote_debugging_module.c | 10 ++++ Python/remote_debug.h | 78 ++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index e744fe65815985..7b8d272e63b160 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -945,6 +945,10 @@ parse_coro_chain( return -1; } + if (name == NULL) { + return 0; + } + if (PyList_Append(render_to, name)) { Py_DECREF(name); set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append frame to coro chain"); @@ -2762,6 +2766,7 @@ _remote_debugging_RemoteUnwinder_get_stack_trace_impl(RemoteUnwinderObject *self } exit: + _Py_RemoteDebug_ClearCache(&self->handle); return result; } @@ -2885,9 +2890,11 @@ _remote_debugging_RemoteUnwinder_get_all_awaited_by_impl(RemoteUnwinderObject *s goto result_err; } + _Py_RemoteDebug_ClearCache(&self->handle); return result; result_err: + _Py_RemoteDebug_ClearCache(&self->handle); Py_XDECREF(result); return NULL; } @@ -2954,9 +2961,11 @@ _remote_debugging_RemoteUnwinder_get_async_stack_trace_impl(RemoteUnwinderObject goto cleanup; } + _Py_RemoteDebug_ClearCache(&self->handle); return result; cleanup: + _Py_RemoteDebug_ClearCache(&self->handle); Py_XDECREF(result); return NULL; } @@ -2982,6 +2991,7 @@ RemoteUnwinder_dealloc(PyObject *op) } #endif if (self->handle.pid != 0) { + _Py_RemoteDebug_ClearCache(&self->handle); _Py_RemoteDebug_CleanupProcHandle(&self->handle); } PyObject_Del(self); diff --git a/Python/remote_debug.h b/Python/remote_debug.h index d1fcb478d2b035..8f9b6cd4c4960f 100644 --- a/Python/remote_debug.h +++ b/Python/remote_debug.h @@ -110,6 +110,14 @@ get_page_size(void) { return page_size; } +typedef struct page_cache_entry { + uintptr_t page_addr; // page-aligned base address + char *data; + int valid; + struct page_cache_entry *next; +} page_cache_entry_t; + +#define MAX_PAGES 1024 // Define a platform-independent process handle structure typedef struct { @@ -121,9 +129,27 @@ typedef struct { #elif defined(__linux__) int memfd; #endif + page_cache_entry_t pages[MAX_PAGES]; Py_ssize_t page_size; } proc_handle_t; +static void +_Py_RemoteDebug_FreePageCache(proc_handle_t *handle) +{ + for (int i = 0; i < MAX_PAGES; i++) { + PyMem_RawFree(handle->pages[i].data); + handle->pages[i].data = NULL; + handle->pages[i].valid = 0; + } +} + +UNUSED static void +_Py_RemoteDebug_ClearCache(proc_handle_t *handle) +{ + for (int i = 0; i < MAX_PAGES; i++) { + handle->pages[i].valid = 0; + } +} #if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX static mach_port_t pid_to_task(pid_t pid); @@ -152,6 +178,10 @@ _Py_RemoteDebug_InitProcHandle(proc_handle_t *handle, pid_t pid) { handle->memfd = -1; #endif handle->page_size = get_page_size(); + for (int i = 0; i < MAX_PAGES; i++) { + handle->pages[i].data = NULL; + handle->pages[i].valid = 0; + } return 0; } @@ -170,6 +200,7 @@ _Py_RemoteDebug_CleanupProcHandle(proc_handle_t *handle) { } #endif handle->pid = 0; + _Py_RemoteDebug_FreePageCache(handle); } #if defined(__APPLE__) && defined(TARGET_OS_OSX) && TARGET_OS_OSX @@ -1035,6 +1066,53 @@ _Py_RemoteDebug_PagedReadRemoteMemory(proc_handle_t *handle, size_t size, void *out) { + size_t page_size = handle->page_size; + uintptr_t page_base = addr & ~(page_size - 1); + size_t offset_in_page = addr - page_base; + + if (offset_in_page + size > page_size) { + return _Py_RemoteDebug_ReadRemoteMemory(handle, addr, size, out); + } + + // Search for valid cached page + for (int i = 0; i < MAX_PAGES; i++) { + page_cache_entry_t *entry = &handle->pages[i]; + if (entry->valid && entry->page_addr == page_base) { + memcpy(out, entry->data + offset_in_page, size); + return 0; + } + } + + // Find reusable slot + for (int i = 0; i < MAX_PAGES; i++) { + page_cache_entry_t *entry = &handle->pages[i]; + if (!entry->valid) { + if (entry->data == NULL) { + entry->data = PyMem_RawMalloc(page_size); + if (entry->data == NULL) { + _set_debug_exception_cause(PyExc_MemoryError, + "Cannot allocate %zu bytes for page cache entry " + "during read from PID %d at address 0x%lx", + page_size, handle->pid, addr); + return -1; + } + } + + if (_Py_RemoteDebug_ReadRemoteMemory(handle, page_base, page_size, entry->data) < 0) { + // Try to just copy the exact ammount as a fallback + PyErr_Clear(); + goto fallback; + } + + entry->page_addr = page_base; + entry->valid = 1; + memcpy(out, entry->data + offset_in_page, size); + return 0; + } + } + +fallback: + // Cache full — fallback to uncached read return _Py_RemoteDebug_ReadRemoteMemory(handle, addr, size, out); } From e0b9f0721c842a32fb5fd761f2d3e5cd0a568a69 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 04:42:49 +0200 Subject: [PATCH 0594/1674] [3.14] gh-136229: Remove Platform Emscripten is not supported warning (GH-136230) (#136445) Updates configure script to identify Emscripten as Tier 3. (cherry picked from commit 6ea425828540d7a19296183c3410283897767d9a) Co-authored-by: Hood Chatham --- configure | 2 ++ configure.ac | 43 ++++++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/configure b/configure index 1646efe5f061ca..d32ea2dabc2be7 100755 --- a/configure +++ b/configure @@ -7254,6 +7254,8 @@ case $host/$ac_cv_cc_name in #( PY_SUPPORT_TIER=3 ;; #( x86_64-*-linux-android/clang) : PY_SUPPORT_TIER=3 ;; #( + wasm32-*-emscripten/emcc) : + PY_SUPPORT_TIER=3 ;; #( *) : PY_SUPPORT_TIER=0 diff --git a/configure.ac b/configure.ac index d868f7b26bad1c..ab688d93990a2d 100644 --- a/configure.ac +++ b/configure.ac @@ -1208,27 +1208,28 @@ dnl NOTE: Windows support tiers are defined in PC/pyconfig.h. dnl AC_MSG_CHECKING([for PEP 11 support tier]) AS_CASE([$host/$ac_cv_cc_name], - [x86_64-*-linux-gnu/gcc], [PY_SUPPORT_TIER=1], dnl Linux on AMD64, any vendor, glibc, gcc - [x86_64-apple-darwin*/clang], [PY_SUPPORT_TIER=1], dnl macOS on Intel, any version - [aarch64-apple-darwin*/clang], [PY_SUPPORT_TIER=1], dnl macOS on M1, any version - [i686-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=1], dnl 32bit Windows on Intel, MSVC - [x86_64-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=1], dnl 64bit Windows on AMD64, MSVC - - [aarch64-*-linux-gnu/gcc], [PY_SUPPORT_TIER=2], dnl Linux ARM64, glibc, gcc+clang - [aarch64-*-linux-gnu/clang], [PY_SUPPORT_TIER=2], - [powerpc64le-*-linux-gnu/gcc], [PY_SUPPORT_TIER=2], dnl Linux on PPC64 little endian, glibc, gcc - [wasm32-unknown-wasip1/clang], [PY_SUPPORT_TIER=2], dnl WebAssembly System Interface preview1, clang - [x86_64-*-linux-gnu/clang], [PY_SUPPORT_TIER=2], dnl Linux on AMD64, any vendor, glibc, clang - - [aarch64-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=3], dnl Windows ARM64, MSVC - [armv7l-*-linux-gnueabihf/gcc], [PY_SUPPORT_TIER=3], dnl ARMv7 LE with hardware floats, any vendor, glibc, gcc - [powerpc64le-*-linux-gnu/clang], [PY_SUPPORT_TIER=3], dnl Linux on PPC64 little endian, glibc, clang - [s390x-*-linux-gnu/gcc], [PY_SUPPORT_TIER=3], dnl Linux on 64bit s390x (big endian), glibc, gcc - [x86_64-*-freebsd*/clang], [PY_SUPPORT_TIER=3], dnl FreeBSD on AMD64 - [aarch64-apple-ios*-simulator/clang], [PY_SUPPORT_TIER=3], dnl iOS Simulator on arm64 - [aarch64-apple-ios*/clang], [PY_SUPPORT_TIER=3], dnl iOS on ARM64 - [aarch64-*-linux-android/clang], [PY_SUPPORT_TIER=3], dnl Android on ARM64 - [x86_64-*-linux-android/clang], [PY_SUPPORT_TIER=3], dnl Android on AMD64 + [x86_64-*-linux-gnu/gcc], [PY_SUPPORT_TIER=1], dnl Linux on AMD64, any vendor, glibc, gcc + [x86_64-apple-darwin*/clang], [PY_SUPPORT_TIER=1], dnl macOS on Intel, any version + [aarch64-apple-darwin*/clang], [PY_SUPPORT_TIER=1], dnl macOS on M1, any version + [i686-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=1], dnl 32bit Windows on Intel, MSVC + [x86_64-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=1], dnl 64bit Windows on AMD64, MSVC + + [aarch64-*-linux-gnu/gcc], [PY_SUPPORT_TIER=2], dnl Linux ARM64, glibc, gcc+clang + [aarch64-*-linux-gnu/clang], [PY_SUPPORT_TIER=2], + [powerpc64le-*-linux-gnu/gcc], [PY_SUPPORT_TIER=2], dnl Linux on PPC64 little endian, glibc, gcc + [wasm32-unknown-wasip1/clang], [PY_SUPPORT_TIER=2], dnl WebAssembly System Interface preview1, clang + [x86_64-*-linux-gnu/clang], [PY_SUPPORT_TIER=2], dnl Linux on AMD64, any vendor, glibc, clang + + [aarch64-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=3], dnl Windows ARM64, MSVC + [armv7l-*-linux-gnueabihf/gcc], [PY_SUPPORT_TIER=3], dnl ARMv7 LE with hardware floats, any vendor, glibc, gcc + [powerpc64le-*-linux-gnu/clang], [PY_SUPPORT_TIER=3], dnl Linux on PPC64 little endian, glibc, clang + [s390x-*-linux-gnu/gcc], [PY_SUPPORT_TIER=3], dnl Linux on 64bit s390x (big endian), glibc, gcc + [x86_64-*-freebsd*/clang], [PY_SUPPORT_TIER=3], dnl FreeBSD on AMD64 + [aarch64-apple-ios*-simulator/clang], [PY_SUPPORT_TIER=3], dnl iOS Simulator on arm64 + [aarch64-apple-ios*/clang], [PY_SUPPORT_TIER=3], dnl iOS on ARM64 + [aarch64-*-linux-android/clang], [PY_SUPPORT_TIER=3], dnl Android on ARM64 + [x86_64-*-linux-android/clang], [PY_SUPPORT_TIER=3], dnl Android on AMD64 + [wasm32-*-emscripten/emcc], [PY_SUPPORT_TIER=3], dnl Emscripten [PY_SUPPORT_TIER=0] ) From 2cb579283630fca4f831622b264158b10294e4d7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 10:00:30 +0200 Subject: [PATCH 0595/1674] [3.14] gh-94503: Update logging cookbook example with info on addressing log injection. (GH-136446) (GH-136449) Co-authored-by: Vinay Sajip Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/howto/logging-cookbook.rst | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index ae2697fbce30ad..52537a91df542c 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -4140,6 +4140,42 @@ The script, when run, prints something like: 2025-07-02 13:54:47,234 DEBUG fool me ... 2025-07-02 13:54:47,234 DEBUG can't get fooled again +If, on the other hand, you are concerned about `log injection +`_, you can use a +formatter which escapes newlines, as per the following example: + +.. code-block:: python + + import logging + + logger = logging.getLogger(__name__) + + class EscapingFormatter(logging.Formatter): + def format(self, record): + s = super().format(record) + return s.replace('\n', r'\n') + + if __name__ == '__main__': + h = logging.StreamHandler() + h.setFormatter(EscapingFormatter('%(asctime)s %(levelname)-9s %(message)s')) + logging.basicConfig(level=logging.DEBUG, handlers = [h]) + logger.debug('Single line') + logger.debug('Multiple lines:\nfool me once ...') + logger.debug('Another single line') + logger.debug('Multiple lines:\n%s', 'fool me ...\ncan\'t get fooled again') + +You can, of course, use whatever escaping scheme makes the most sense for you. +The script, when run, should produce output like this: + +.. code-block:: text + + 2025-07-09 06:47:33,783 DEBUG Single line + 2025-07-09 06:47:33,783 DEBUG Multiple lines:\nfool me once ... + 2025-07-09 06:47:33,783 DEBUG Another single line + 2025-07-09 06:47:33,783 DEBUG Multiple lines:\nfool me ...\ncan't get fooled again + +Escaping behaviour can't be the stdlib default , as it would break backwards +compatibility. .. patterns-to-avoid: From 85df16b7fa6db7dc0a389ecff9119f72716cee02 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 10:07:18 +0200 Subject: [PATCH 0596/1674] [3.14] gh-53243: Document `codecs.readbuffer_encode()` (GH-136284) (#136452) gh-53243: Document `codecs.readbuffer_encode()` (GH-136284) Closes GH-53243 (cherry picked from commit f1dcf3c7bf90961b8d5475154d3f28cfef0a054f) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index b231fa568cf342..a527d6746b5d07 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -265,6 +265,20 @@ wider range of codecs when working with binary files: :func:`iterencode`. +.. function:: readbuffer_encode(buffer, errors=None, /) + + Return a :class:`tuple` containing the raw bytes of *buffer*, a + :ref:`buffer-compatible object ` or :class:`str` + (encoded to UTF-8 before processing), and their length in bytes. + + The *errors* argument is ignored. + + .. code-block:: pycon + + >>> codecs.readbuffer_encode(b"Zito") + (b'Zito', 4) + + The module also provides the following constants which are useful for reading and writing to platform dependent files: From a9d2f08b579a400e0f2a337116bb29f476249dff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 10:07:34 +0200 Subject: [PATCH 0597/1674] [3.14] gh-136162: Document `encodings` package functions (GH-136164) (#136454) gh-136162: Document `encodings` package functions (GH-136164) Closes GH-136162. (cherry picked from commit ffd7f2f231f5543e6863c6c85e86f72233229771) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 60 ++++++++++++++++++++++++++++++++++++++++++ Doc/whatsnew/3.9.rst | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index a527d6746b5d07..0e84f18dd4d5d5 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1498,6 +1498,66 @@ mapping. It is not supported by :meth:`str.encode` (which only produces Restoration of the ``rot13`` alias. +:mod:`encodings` --- Encodings package +-------------------------------------- + +.. module:: encodings + :synopsis: Encodings package + +This module implements the following functions: + +.. function:: normalize_encoding(encoding) + + Normalize encoding name *encoding*. + + Normalization works as follows: all non-alphanumeric characters except the + dot used for Python package names are collapsed and replaced with a single + underscore, leading and trailing underscores are removed. + For example, ``' -;#'`` becomes ``'_'``. + + Note that *encoding* should be ASCII only. + + +.. note:: + The following functions should not be used directly, except for testing + purposes; :func:`codecs.lookup` should be used instead. + + +.. function:: search_function(encoding) + + Search for the codec module corresponding to the given encoding name + *encoding*. + + This function first normalizes the *encoding* using + :func:`normalize_encoding`, then looks for a corresponding alias. + It attempts to import a codec module from the encodings package using either + the alias or the normalized name. If the module is found and defines a valid + ``getregentry()`` function that returns a :class:`codecs.CodecInfo` object, + the codec is cached and returned. + + If the codec module defines a ``getaliases()`` function any returned aliases + are registered for future use. + + +.. function:: win32_code_page_search_function(encoding) + + Search for a Windows code page encoding *encoding* of the form ``cpXXXX``. + + If the code page is valid and supported, return a :class:`codecs.CodecInfo` + object for it. + + .. availability:: Windows. + + .. versionadded:: 3.14 + + +This module implements the following exception: + +.. exception:: CodecRegistryError + + Raised when a codec is invalid or incompatible. + + :mod:`encodings.idna` --- Internationalized Domain Names in Applications ------------------------------------------------------------------------ diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 7fd9e6ac66e6c8..40d4a27bff9fee 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1139,7 +1139,7 @@ Changes in the Python API (Contributed by Christian Heimes in :issue:`36384`). * :func:`codecs.lookup` now normalizes the encoding name the same way as - :func:`!encodings.normalize_encoding`, except that :func:`codecs.lookup` also + :func:`encodings.normalize_encoding`, except that :func:`codecs.lookup` also converts the name to lower case. For example, ``"latex+latin1"`` encoding name is now normalized to ``"latex_latin1"``. (Contributed by Jordon Xu in :issue:`37751`.) From c29fce05f3b4558f2dcd91ccaac5ab646caf6c1c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 10:34:19 +0200 Subject: [PATCH 0598/1674] [3.14] gh-134657: Remove newly added private names from asyncio.__all__ (GH-134665) (#136455) gh-134657: Remove newly added private names from asyncio.__all__ (GH-134665) (cherry picked from commit 797abd1f7fdeb744bf9f683ef844e7279aad3d72) Co-authored-by: Jelle Zijlstra --- Lib/asyncio/__init__.py | 29 ++++++++++------ Lib/asyncio/events.py | 8 ++--- Lib/asyncio/unix_events.py | 1 - Lib/test/libregrtest/save_env.py | 2 +- Lib/test/test_asyncgen.py | 2 +- Lib/test/test_asyncio/test_base_events.py | 2 +- Lib/test/test_asyncio/test_buffered_proto.py | 2 +- Lib/test/test_asyncio/test_context.py | 2 +- .../test_asyncio/test_eager_task_factory.py | 2 +- Lib/test/test_asyncio/test_events.py | 34 +++++++++---------- Lib/test/test_asyncio/test_free_threading.py | 2 +- Lib/test/test_asyncio/test_futures.py | 2 +- Lib/test/test_asyncio/test_futures2.py | 2 +- Lib/test/test_asyncio/test_graph.py | 2 +- Lib/test/test_asyncio/test_locks.py | 2 +- Lib/test/test_asyncio/test_pep492.py | 2 +- Lib/test/test_asyncio/test_proactor_events.py | 2 +- Lib/test/test_asyncio/test_protocols.py | 2 +- Lib/test/test_asyncio/test_queues.py | 2 +- Lib/test/test_asyncio/test_runners.py | 16 ++++----- Lib/test/test_asyncio/test_selector_events.py | 2 +- Lib/test/test_asyncio/test_sendfile.py | 2 +- Lib/test/test_asyncio/test_server.py | 2 +- Lib/test/test_asyncio/test_sock_lowlevel.py | 2 +- Lib/test/test_asyncio/test_ssl.py | 2 +- Lib/test/test_asyncio/test_sslproto.py | 2 +- Lib/test/test_asyncio/test_staggered.py | 2 +- Lib/test/test_asyncio/test_streams.py | 2 +- Lib/test/test_asyncio/test_subprocess.py | 2 +- Lib/test/test_asyncio/test_taskgroups.py | 2 +- Lib/test/test_asyncio/test_tasks.py | 2 +- Lib/test/test_asyncio/test_threads.py | 2 +- Lib/test/test_asyncio/test_timeouts.py | 2 +- Lib/test/test_asyncio/test_transports.py | 2 +- Lib/test/test_asyncio/test_unix_events.py | 2 +- Lib/test/test_asyncio/test_waitfor.py | 2 +- Lib/test/test_asyncio/test_windows_events.py | 14 ++++---- Lib/test/test_asyncio/test_windows_utils.py | 2 +- Lib/test/test_asyncio/utils.py | 6 ++++ .../test_interpreter_pool.py | 2 +- Lib/test/test_coroutines.py | 2 +- Lib/test/test_inspect/test_inspect.py | 2 +- Lib/test/test_logging.py | 6 ++-- Lib/test/test_os.py | 2 +- Lib/test/test_unittest/test_async_case.py | 6 ++-- Lib/test/test_unittest/testmock/testasync.py | 2 +- ...-05-25-11-02-05.gh-issue-134657.3YFhR9.rst | 1 + 47 files changed, 105 insertions(+), 90 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index 4be7112fa017d4..32a5dbae03af21 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -51,15 +51,24 @@ def __getattr__(name: str): import warnings - deprecated = { - "AbstractEventLoopPolicy", - "DefaultEventLoopPolicy", - "WindowsSelectorEventLoopPolicy", - "WindowsProactorEventLoopPolicy", - } - if name in deprecated: - warnings._deprecated(f"asyncio.{name}", remove=(3, 16)) - # deprecated things have underscores in front of them - return globals()["_" + name] + match name: + case "AbstractEventLoopPolicy": + warnings._deprecated(f"asyncio.{name}", remove=(3, 16)) + return events._AbstractEventLoopPolicy + case "DefaultEventLoopPolicy": + warnings._deprecated(f"asyncio.{name}", remove=(3, 16)) + if sys.platform == 'win32': + return windows_events._DefaultEventLoopPolicy + return unix_events._DefaultEventLoopPolicy + case "WindowsSelectorEventLoopPolicy": + if sys.platform == 'win32': + warnings._deprecated(f"asyncio.{name}", remove=(3, 16)) + return windows_events._WindowsSelectorEventLoopPolicy + # Else fall through to the AttributeError below. + case "WindowsProactorEventLoopPolicy": + if sys.platform == 'win32': + warnings._deprecated(f"asyncio.{name}", remove=(3, 16)) + return windows_events._WindowsProactorEventLoopPolicy + # Else fall through to the AttributeError below. raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 2913f901dca65f..a7fb55982abe9c 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -5,14 +5,11 @@ # SPDX-FileCopyrightText: Copyright (c) 2015-2021 MagicStack Inc. http://magic.io __all__ = ( - "_AbstractEventLoopPolicy", "AbstractEventLoop", "AbstractServer", "Handle", "TimerHandle", - "_get_event_loop_policy", "get_event_loop_policy", - "_set_event_loop_policy", "set_event_loop_policy", "get_event_loop", "set_event_loop", @@ -791,7 +788,10 @@ def _init_event_loop_policy(): global _event_loop_policy with _lock: if _event_loop_policy is None: # pragma: no branch - from . import _DefaultEventLoopPolicy + if sys.platform == 'win32': + from .windows_events import _DefaultEventLoopPolicy + else: + from .unix_events import _DefaultEventLoopPolicy _event_loop_policy = _DefaultEventLoopPolicy() diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index f69c6a64c39ae6..1c1458127db5ac 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -28,7 +28,6 @@ __all__ = ( 'SelectorEventLoop', - '_DefaultEventLoopPolicy', 'EventLoop', ) diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index ffc29fa8dc686a..4cf1a075b30013 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -97,7 +97,7 @@ def get_asyncio_events__event_loop_policy(self): return support.maybe_get_event_loop_policy() def restore_asyncio_events__event_loop_policy(self, policy): asyncio = self.get_module('asyncio') - asyncio._set_event_loop_policy(policy) + asyncio.events._set_event_loop_policy(policy) def get_sys_argv(self): return id(sys.argv), sys.argv, sys.argv[:] diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 2f2865bad2cdb1..fc3bd7dca62fd5 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -629,7 +629,7 @@ def setUp(self): def tearDown(self): self.loop.close() self.loop = None - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def check_async_iterator_anext(self, ait_class): with self.subTest(anext="pure-Python"): diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 12179eb0c9e274..1b727f3b1febef 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -29,7 +29,7 @@ class CustomError(Exception): def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def mock_socket_module(): diff --git a/Lib/test/test_asyncio/test_buffered_proto.py b/Lib/test/test_asyncio/test_buffered_proto.py index 9c386dd2e63815..6d3edcc36f5c79 100644 --- a/Lib/test/test_asyncio/test_buffered_proto.py +++ b/Lib/test/test_asyncio/test_buffered_proto.py @@ -5,7 +5,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class ReceiveStuffProto(asyncio.BufferedProtocol): diff --git a/Lib/test/test_asyncio/test_context.py b/Lib/test/test_asyncio/test_context.py index ad394f44e7e5f6..f85f39839cbd79 100644 --- a/Lib/test/test_asyncio/test_context.py +++ b/Lib/test/test_asyncio/test_context.py @@ -4,7 +4,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) @unittest.skipUnless(decimal.HAVE_CONTEXTVAR, "decimal is built with a thread-local context") diff --git a/Lib/test/test_asyncio/test_eager_task_factory.py b/Lib/test/test_asyncio/test_eager_task_factory.py index 9f3b6f9acef3b6..da79ee9260a0e3 100644 --- a/Lib/test/test_asyncio/test_eager_task_factory.py +++ b/Lib/test/test_asyncio/test_eager_task_factory.py @@ -13,7 +13,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class EagerTaskFactoryLoopTests: diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 873c503fa02b21..919d543b0329e9 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -38,7 +38,7 @@ from test.support import ALWAYS_EQ, LARGEST, SMALLEST def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def broken_unix_getsockname(): @@ -2843,13 +2843,13 @@ def test_default_event_loop_policy_deprecation(self): self.assertIsInstance(policy, asyncio.DefaultEventLoopPolicy) def test_event_loop_policy(self): - policy = asyncio._AbstractEventLoopPolicy() + policy = asyncio.events._AbstractEventLoopPolicy() self.assertRaises(NotImplementedError, policy.get_event_loop) self.assertRaises(NotImplementedError, policy.set_event_loop, object()) self.assertRaises(NotImplementedError, policy.new_event_loop) def test_get_event_loop(self): - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() self.assertIsNone(policy._local._loop) with self.assertRaises(RuntimeError): @@ -2857,7 +2857,7 @@ def test_get_event_loop(self): self.assertIsNone(policy._local._loop) def test_get_event_loop_does_not_call_set_event_loop(self): - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() with mock.patch.object( policy, "set_event_loop", @@ -2869,7 +2869,7 @@ def test_get_event_loop_does_not_call_set_event_loop(self): m_set_event_loop.assert_not_called() def test_get_event_loop_after_set_none(self): - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() policy.set_event_loop(None) self.assertRaises(RuntimeError, policy.get_event_loop) @@ -2877,7 +2877,7 @@ def test_get_event_loop_after_set_none(self): def test_get_event_loop_thread(self, m_current_thread): def f(): - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() self.assertRaises(RuntimeError, policy.get_event_loop) th = threading.Thread(target=f) @@ -2885,14 +2885,14 @@ def f(): th.join() def test_new_event_loop(self): - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() loop = policy.new_event_loop() self.assertIsInstance(loop, asyncio.AbstractEventLoop) loop.close() def test_set_event_loop(self): - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() old_loop = policy.new_event_loop() policy.set_event_loop(old_loop) @@ -2909,7 +2909,7 @@ def test_get_event_loop_policy(self): with self.assertWarnsRegex( DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"): policy = asyncio.get_event_loop_policy() - self.assertIsInstance(policy, asyncio._AbstractEventLoopPolicy) + self.assertIsInstance(policy, asyncio.events._AbstractEventLoopPolicy) self.assertIs(policy, asyncio.get_event_loop_policy()) def test_set_event_loop_policy(self): @@ -2922,7 +2922,7 @@ def test_set_event_loop_policy(self): DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"): old_policy = asyncio.get_event_loop_policy() - policy = asyncio._DefaultEventLoopPolicy() + policy = test_utils.DefaultEventLoopPolicy() with self.assertWarnsRegex( DeprecationWarning, "'asyncio.set_event_loop_policy' is deprecated"): asyncio.set_event_loop_policy(policy) @@ -3034,13 +3034,13 @@ def test_get_event_loop_returns_running_loop(self): class TestError(Exception): pass - class Policy(asyncio._DefaultEventLoopPolicy): + class Policy(test_utils.DefaultEventLoopPolicy): def get_event_loop(self): raise TestError - old_policy = asyncio._get_event_loop_policy() + old_policy = asyncio.events._get_event_loop_policy() try: - asyncio._set_event_loop_policy(Policy()) + asyncio.events._set_event_loop_policy(Policy()) loop = asyncio.new_event_loop() with self.assertRaises(TestError): @@ -3068,7 +3068,7 @@ async def func(): asyncio.get_event_loop() finally: - asyncio._set_event_loop_policy(old_policy) + asyncio.events._set_event_loop_policy(old_policy) if loop is not None: loop.close() @@ -3078,9 +3078,9 @@ async def func(): self.assertIs(asyncio._get_running_loop(), None) def test_get_event_loop_returns_running_loop2(self): - old_policy = asyncio._get_event_loop_policy() + old_policy = asyncio.events._get_event_loop_policy() try: - asyncio._set_event_loop_policy(asyncio._DefaultEventLoopPolicy()) + asyncio.events._set_event_loop_policy(test_utils.DefaultEventLoopPolicy()) loop = asyncio.new_event_loop() self.addCleanup(loop.close) @@ -3106,7 +3106,7 @@ async def func(): asyncio.get_event_loop() finally: - asyncio._set_event_loop_policy(old_policy) + asyncio.events._set_event_loop_policy(old_policy) if loop is not None: loop.close() diff --git a/Lib/test/test_asyncio/test_free_threading.py b/Lib/test/test_asyncio/test_free_threading.py index 110996c348554c..d874ed00bd7e7a 100644 --- a/Lib/test/test_asyncio/test_free_threading.py +++ b/Lib/test/test_asyncio/test_free_threading.py @@ -15,7 +15,7 @@ class MyException(Exception): def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TestFreeThreading: diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index 8b51522278aaa6..785258a2749773 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -17,7 +17,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def _fakefunc(f): diff --git a/Lib/test/test_asyncio/test_futures2.py b/Lib/test/test_asyncio/test_futures2.py index e2cddea01ecd93..c7c0ebdac1b676 100644 --- a/Lib/test/test_asyncio/test_futures2.py +++ b/Lib/test/test_asyncio/test_futures2.py @@ -7,7 +7,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class FutureTests: diff --git a/Lib/test/test_asyncio/test_graph.py b/Lib/test/test_asyncio/test_graph.py index 62f6593c31d2d1..2f22fbccba42bc 100644 --- a/Lib/test/test_asyncio/test_graph.py +++ b/Lib/test/test_asyncio/test_graph.py @@ -5,7 +5,7 @@ # To prevent a warning "test altered the execution environment" def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def capture_test_stack(*, fut=None, depth=1): diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 047f03cbb14b56..e025d2990a3f8a 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -20,7 +20,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class LockTests(unittest.IsolatedAsyncioTestCase): diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index 48f4a75e0fd56c..a0c8434c9457d2 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -11,7 +11,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) # Test that asyncio.iscoroutine() uses collections.abc.Coroutine diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index 24c4e8546b17aa..b25daaface0807 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -18,7 +18,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def close_transport(transport): diff --git a/Lib/test/test_asyncio/test_protocols.py b/Lib/test/test_asyncio/test_protocols.py index 4484a031988533..29d3bd22705c6a 100644 --- a/Lib/test/test_asyncio/test_protocols.py +++ b/Lib/test/test_asyncio/test_protocols.py @@ -7,7 +7,7 @@ def tearDownModule(): # not needed for the test file but added for uniformness with all other # asyncio test files for the sake of unified cleanup - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class ProtocolsAbsTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/test_queues.py b/Lib/test/test_asyncio/test_queues.py index 090b9774c2289f..54bbe79f81ff69 100644 --- a/Lib/test/test_asyncio/test_queues.py +++ b/Lib/test/test_asyncio/test_queues.py @@ -6,7 +6,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class QueueBasicTests(unittest.IsolatedAsyncioTestCase): diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py index 21f277bc2d8d5f..8a4d7f5c796661 100644 --- a/Lib/test/test_asyncio/test_runners.py +++ b/Lib/test/test_asyncio/test_runners.py @@ -12,14 +12,14 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def interrupt_self(): _thread.interrupt_main() -class TestPolicy(asyncio._AbstractEventLoopPolicy): +class TestPolicy(asyncio.events._AbstractEventLoopPolicy): def __init__(self, loop_factory): self.loop_factory = loop_factory @@ -61,15 +61,15 @@ def setUp(self): super().setUp() policy = TestPolicy(self.new_loop) - asyncio._set_event_loop_policy(policy) + asyncio.events._set_event_loop_policy(policy) def tearDown(self): - policy = asyncio._get_event_loop_policy() + policy = asyncio.events._get_event_loop_policy() if policy.loop is not None: self.assertTrue(policy.loop.is_closed()) self.assertTrue(policy.loop.shutdown_ag_run) - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) super().tearDown() @@ -208,7 +208,7 @@ async def main(): await asyncio.sleep(0) return 42 - policy = asyncio._get_event_loop_policy() + policy = asyncio.events._get_event_loop_policy() policy.set_event_loop = mock.Mock() asyncio.run(main()) self.assertTrue(policy.set_event_loop.called) @@ -259,7 +259,7 @@ def new_event_loop(): loop.set_task_factory(Task) return loop - asyncio._set_event_loop_policy(TestPolicy(new_event_loop)) + asyncio.events._set_event_loop_policy(TestPolicy(new_event_loop)) with self.assertRaises(asyncio.CancelledError): asyncio.run(main()) @@ -495,7 +495,7 @@ def test_set_event_loop_called_once(self): async def coro(): pass - policy = asyncio._get_event_loop_policy() + policy = asyncio.events._get_event_loop_policy() policy.set_event_loop = mock.Mock() runner = asyncio.Runner() runner.run(coro()) diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index aab6a779170eb9..7b6d1bce5e460f 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -24,7 +24,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TestBaseSelectorEventLoop(BaseSelectorEventLoop): diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index e1b766d06cbe1e..dcd963b3355ef8 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -22,7 +22,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class MySendfileProto(asyncio.Protocol): diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index 32211f4cba32cb..5bd0f7e2af4f84 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -11,7 +11,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class BaseStartServer(func_tests.FunctionalTestCaseMixin): diff --git a/Lib/test/test_asyncio/test_sock_lowlevel.py b/Lib/test/test_asyncio/test_sock_lowlevel.py index 4f7b9a1dda6b78..df4ec7948975f6 100644 --- a/Lib/test/test_asyncio/test_sock_lowlevel.py +++ b/Lib/test/test_asyncio/test_sock_lowlevel.py @@ -15,7 +15,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class MyProto(asyncio.Protocol): diff --git a/Lib/test/test_asyncio/test_ssl.py b/Lib/test/test_asyncio/test_ssl.py index 3a7185cd8974d0..06118f3a61587b 100644 --- a/Lib/test/test_asyncio/test_ssl.py +++ b/Lib/test/test_asyncio/test_ssl.py @@ -30,7 +30,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class MyBaseProto(asyncio.Protocol): diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index aa248c5786f634..3e304c166425b0 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -21,7 +21,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) @unittest.skipIf(ssl is None, 'No ssl module') diff --git a/Lib/test/test_asyncio/test_staggered.py b/Lib/test/test_asyncio/test_staggered.py index ad34aa6da01f54..32e4817b70d717 100644 --- a/Lib/test/test_asyncio/test_staggered.py +++ b/Lib/test/test_asyncio/test_staggered.py @@ -8,7 +8,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class StaggeredTests(unittest.IsolatedAsyncioTestCase): diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 4fa4384346f9e9..f93ee54abc6469 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -18,7 +18,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class StreamTests(test_utils.TestCase): diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 341e3e979e002b..3a17c169c34f12 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -37,7 +37,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TestSubprocessTransport(base_subprocess.BaseSubprocessTransport): diff --git a/Lib/test/test_asyncio/test_taskgroups.py b/Lib/test/test_asyncio/test_taskgroups.py index 0d69a436fdb840..91f6b03b4597a5 100644 --- a/Lib/test/test_asyncio/test_taskgroups.py +++ b/Lib/test/test_asyncio/test_taskgroups.py @@ -15,7 +15,7 @@ # To prevent a warning "test altered the execution environment" def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class MyExc(Exception): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index f6f976f213ac02..931a43816a257a 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -24,7 +24,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) async def coroutine_function(): diff --git a/Lib/test/test_asyncio/test_threads.py b/Lib/test/test_asyncio/test_threads.py index c98c9a9b395ff9..8ad5f9b2c9e750 100644 --- a/Lib/test/test_asyncio/test_threads.py +++ b/Lib/test/test_asyncio/test_threads.py @@ -8,7 +8,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class ToThreadTests(unittest.IsolatedAsyncioTestCase): diff --git a/Lib/test/test_asyncio/test_timeouts.py b/Lib/test/test_asyncio/test_timeouts.py index 3ba84d63b2ca5f..f60722c48b7617 100644 --- a/Lib/test/test_asyncio/test_timeouts.py +++ b/Lib/test/test_asyncio/test_timeouts.py @@ -9,7 +9,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TimeoutTests(unittest.IsolatedAsyncioTestCase): diff --git a/Lib/test/test_asyncio/test_transports.py b/Lib/test/test_asyncio/test_transports.py index af10d3dc2a80df..dbb572e2e1536b 100644 --- a/Lib/test/test_asyncio/test_transports.py +++ b/Lib/test/test_asyncio/test_transports.py @@ -10,7 +10,7 @@ def tearDownModule(): # not needed for the test file but added for uniformness with all other # asyncio test files for the sake of unified cleanup - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TransportTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index e020c1f3e4f677..22982dc9d8aefe 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -30,7 +30,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) MOCK_ANY = mock.ANY diff --git a/Lib/test/test_asyncio/test_waitfor.py b/Lib/test/test_asyncio/test_waitfor.py index d083f6b4d2a535..dedc6bf69d770e 100644 --- a/Lib/test/test_asyncio/test_waitfor.py +++ b/Lib/test/test_asyncio/test_waitfor.py @@ -5,7 +5,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) # The following value can be used as a very small timeout: diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index 69e9905205eee0..0af3368627afca 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -19,7 +19,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class UpperProto(asyncio.Protocol): @@ -330,16 +330,16 @@ def test_selector_win_policy(self): async def main(): self.assertIsInstance(asyncio.get_running_loop(), asyncio.SelectorEventLoop) - old_policy = asyncio._get_event_loop_policy() + old_policy = asyncio.events._get_event_loop_policy() try: with self.assertWarnsRegex( DeprecationWarning, "'asyncio.WindowsSelectorEventLoopPolicy' is deprecated", ): - asyncio._set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + asyncio.events._set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) asyncio.run(main()) finally: - asyncio._set_event_loop_policy(old_policy) + asyncio.events._set_event_loop_policy(old_policy) def test_proactor_win_policy(self): async def main(): @@ -347,16 +347,16 @@ async def main(): asyncio.get_running_loop(), asyncio.ProactorEventLoop) - old_policy = asyncio._get_event_loop_policy() + old_policy = asyncio.events._get_event_loop_policy() try: with self.assertWarnsRegex( DeprecationWarning, "'asyncio.WindowsProactorEventLoopPolicy' is deprecated", ): - asyncio._set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) + asyncio.events._set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) asyncio.run(main()) finally: - asyncio._set_event_loop_policy(old_policy) + asyncio.events._set_event_loop_policy(old_policy) if __name__ == '__main__': diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py index a6b207567c4f00..97f078ff911b5a 100644 --- a/Lib/test/test_asyncio/test_windows_utils.py +++ b/Lib/test/test_asyncio/test_windows_utils.py @@ -16,7 +16,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class PipeTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 0a96573a81c173..a480e16e81bb91 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -601,3 +601,9 @@ def func(): await asyncio.sleep(0) if exc is not None: raise exc + + +if sys.platform == 'win32': + DefaultEventLoopPolicy = asyncio.windows_events._DefaultEventLoopPolicy +else: + DefaultEventLoopPolicy = asyncio.unix_events._DefaultEventLoopPolicy diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index b10bbebd0984c4..d5c032d01cdf5d 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -512,7 +512,7 @@ def setUpClass(cls): # tests left a policy in place, just in case. policy = support.maybe_get_event_loop_policy() assert policy is None, policy - cls.addClassCleanup(lambda: asyncio._set_event_loop_policy(None)) + cls.addClassCleanup(lambda: asyncio.events._set_event_loop_policy(None)) def setUp(self): super().setUp() diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 954003ab14df93..a515e0f5ca9b5f 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2337,7 +2337,7 @@ async def f(): pass finally: loop.close() - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) self.assertEqual(buffer, [1, 2, 'MyException']) diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 5e1fcc1d3be989..55942c2823c492 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -2820,7 +2820,7 @@ async def asyncTearDown(self): @classmethod def tearDownClass(cls): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) def _asyncgenstate(self): return inspect.getasyncgenstate(self.asyncgen) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index c46e6f8ed77f62..d8d1020a5a3f45 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5421,7 +5421,7 @@ def test_taskName_with_asyncio_imported(self): logging.logAsyncioTasks = False runner.run(make_record(self.assertIsNone)) finally: - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) @support.requires_working_socket() def test_taskName_without_asyncio_imported(self): @@ -5433,7 +5433,7 @@ def test_taskName_without_asyncio_imported(self): logging.logAsyncioTasks = False runner.run(make_record(self.assertIsNone)) finally: - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class BasicConfigTest(unittest.TestCase): @@ -5737,7 +5737,7 @@ async def log_record(): data = f.read().strip() self.assertRegex(data, r'Task-\d+ - hello world') finally: - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) if handler: handler.close() diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 5217037ae9d812..1e50dc43c35f5c 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -104,7 +104,7 @@ def create_file(filename, content=b'content'): def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class MiscTests(unittest.TestCase): diff --git a/Lib/test/test_unittest/test_async_case.py b/Lib/test/test_unittest/test_async_case.py index 993e6bf013cfbf..91d45283eb3b1b 100644 --- a/Lib/test/test_unittest/test_async_case.py +++ b/Lib/test/test_unittest/test_async_case.py @@ -12,7 +12,7 @@ class MyException(Exception): def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TestCM: @@ -480,7 +480,7 @@ def test_setup_get_event_loop(self): class TestCase1(unittest.IsolatedAsyncioTestCase): def setUp(self): - asyncio._get_event_loop_policy().get_event_loop() + asyncio.events._get_event_loop_policy().get_event_loop() async def test_demo1(self): pass @@ -490,7 +490,7 @@ async def test_demo1(self): self.assertTrue(result.wasSuccessful()) def test_loop_factory(self): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class TestCase1(unittest.IsolatedAsyncioTestCase): loop_factory = asyncio.EventLoop diff --git a/Lib/test/test_unittest/testmock/testasync.py b/Lib/test/test_unittest/testmock/testasync.py index 0791675b5401ca..dc36ceeb6502e8 100644 --- a/Lib/test/test_unittest/testmock/testasync.py +++ b/Lib/test/test_unittest/testmock/testasync.py @@ -15,7 +15,7 @@ def tearDownModule(): - asyncio._set_event_loop_policy(None) + asyncio.events._set_event_loop_policy(None) class AsyncClass: diff --git a/Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst b/Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst new file mode 100644 index 00000000000000..1bf8ee504ef180 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst @@ -0,0 +1 @@ +:mod:`asyncio`: Remove some private names from ``asyncio.__all__``. From 19518a4205d064ad6000525f2a3fae0d52bc05c9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 11:23:43 +0200 Subject: [PATCH 0599/1674] [3.14] gh-136447: Use `self.loop` instead of global `loop` variable in asyncio REPL (GH-136448) (#136458) gh-136447: Use `self.loop` instead of global `loop` variable in asyncio REPL (GH-136448) (cherry picked from commit 77fa7a4dcc771bf4d297ebfd4f357483d0750a1c) Co-authored-by: Justin Su --- Lib/asyncio/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index 21ca5c5f62ae83..ff3a69d1e17297 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -64,7 +64,7 @@ def callback(): except BaseException as exc: future.set_exception(exc) - loop.call_soon_threadsafe(callback, context=self.context) + self.loop.call_soon_threadsafe(callback, context=self.context) try: return future.result() From 90717c2cecc20bfbcec7e7c39a99c42b7cbc5f90 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:59:40 +0200 Subject: [PATCH 0600/1674] [3.14] Docs: unittest.enterModuleContext is not a classmethod (GH-136464) (#136465) Co-authored-by: Geoffrey Thomas --- Doc/library/unittest.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index dcdda1719bf593..f8028075047cc3 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2556,7 +2556,7 @@ To add cleanup code that must be run even in the case of an exception, use .. versionadded:: 3.8 -.. classmethod:: enterModuleContext(cm) +.. function:: enterModuleContext(cm) Enter the supplied :term:`context manager`. If successful, also add its :meth:`~object.__exit__` method as a cleanup function by From 75640d4b1f65b316089f294c93745febabeffc87 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:12:47 +0200 Subject: [PATCH 0601/1674] [3.14] gh-131825: Fix `sqlite3` timezone-naive adapter recipe (GH-136270) (GH-136467) gh-131825: Fix `sqlite3` timezone-naive adapter recipe (GH-136270) (cherry picked from commit 6a6cd3c07c0300c8799878a48d555470be2a52f7) Co-authored-by: NekrodNIK <60639354+NekrodNIK@users.noreply.github.com> --- Doc/library/sqlite3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index e2726e53f09cd6..e939e61a9676ee 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -2289,7 +2289,7 @@ This section shows recipes for common adapters and converters. def adapt_datetime_iso(val): """Adapt datetime.datetime to timezone-naive ISO 8601 date.""" - return val.isoformat() + return val.replace(tzinfo=None).isoformat() def adapt_datetime_epoch(val): """Adapt datetime.datetime to Unix timestamp.""" From 78359403c56cf2fa9461851da958ad044a34649d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:00:54 +0200 Subject: [PATCH 0602/1674] [3.14] gh-81520: Document unexpected `os.path.ismount` behaviour with btrfs subvolumes (GH-136058) (GH-136471) gh-81520: Document unexpected `os.path.ismount` behaviour with btrfs subvolumes (GH-136058) (cherry picked from commit 591abcc01fcf1c65c7fdfaca7274f5d3f9f022da) Co-authored-by: Oskar Roesler --- Doc/library/os.path.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index cd2c5dfbb3f122..32a2970d2d3a2c 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -298,9 +298,10 @@ the :mod:`glob` module.) device than *path*, or whether :file:`{path}/..` and *path* point to the same i-node on the same device --- this should detect mount points for all Unix and POSIX variants. It is not able to reliably detect bind mounts on the - same filesystem. On Windows, a drive letter root and a share UNC are - always mount points, and for any other path ``GetVolumePathName`` is called - to see if it is different from the input path. + same filesystem. On Linux systems, it will always return ``True`` for btrfs + subvolumes, even if they aren't mount points. On Windows, a drive letter root + and a share UNC are always mount points, and for any other path + ``GetVolumePathName`` is called to see if it is different from the input path. .. versionchanged:: 3.4 Added support for detecting non-root mount points on Windows. From 4db567546adb4f7049dd8dcc1c6ea1601a000f0f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:39:33 +0200 Subject: [PATCH 0603/1674] [3.14] gh-136145: Define 'standard library' and 'stdlib' in the glossary (GH-136485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 92f392ad9e5e10ff98eac319e58ec79df5951ce0) Co-authored-by: Zachary Ware Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Éric --- Doc/glossary.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index c5c7994f1262a9..705b0a9279c6d4 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1280,6 +1280,16 @@ Glossary and ending with double underscores. Special methods are documented in :ref:`specialnames`. + standard library + The collection of :term:`packages `, :term:`modules ` + and :term:`extension modules ` distributed as a part + of the official Python interpreter package. The exact membership of the + collection may vary based on platform, available system libraries, or + other criteria. Documentation can be found at :ref:`library-index`. + + See also :data:`sys.stdlib_module_names` for a list of all possible + standard library module names. + statement A statement is part of a suite (a "block" of code). A statement is either an :term:`expression` or one of several constructs with a keyword, such @@ -1290,6 +1300,9 @@ Glossary issues such as incorrect types. See also :term:`type hints ` and the :mod:`typing` module. + stdlib + An abbreviation of :term:`standard library`. + 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 From b733bf7437555e24a36f66c98dcd8c771fd197a0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 01:13:29 +0200 Subject: [PATCH 0604/1674] [3.14] gh-102740: Clarify time.monotonic() "system-wide" in the doc (GH-136431) (#136488) gh-102740: Clarify time.monotonic() "system-wide" in the doc (GH-136431) (cherry picked from commit 9c4d28777526e9975b212d49fb0a530f773a3209) Co-authored-by: Victor Stinner --- Doc/library/time.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 29b695a9b193d6..df9be68bf4f69d 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -306,10 +306,11 @@ Functions .. versionadded:: 3.3 .. versionchanged:: 3.5 - The function is now always available and always system-wide. + The function is now always available and the clock is now the same for + all processes. .. versionchanged:: 3.10 - On macOS, the function is now system-wide. + On macOS, the clock is now the same for all processes. .. function:: monotonic_ns() -> int @@ -325,7 +326,8 @@ Functions Return the value (in fractional seconds) of a performance counter, i.e. a clock with the highest available resolution to measure a short duration. It - does include time elapsed during sleep and is system-wide. The reference + does include time elapsed during sleep. The clock is the same for all + processes. The reference point of the returned value is undefined, so that only the difference between the results of two calls is valid. @@ -340,7 +342,7 @@ Functions .. versionadded:: 3.3 .. versionchanged:: 3.10 - On Windows, the function is now system-wide. + On Windows, the clock is now the same for all processes. .. versionchanged:: 3.13 Use the same clock as :func:`time.monotonic`. @@ -987,8 +989,8 @@ The following constant is the only parameter that can be sent to .. data:: CLOCK_REALTIME - System-wide real-time clock. Setting this clock requires appropriate - privileges. + Real-time clock. Setting this clock requires appropriate privileges. + The clock is the same for all processes. .. availability:: Unix. From 4d025a23188e0a8391cac16b264549b50af744ef Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 01:57:40 +0200 Subject: [PATCH 0605/1674] [3.14] gh-136476: Show the full stack in get_async_stack_trace in _remote_debugging (GH-136483) (#136490) gh-136476: Show the full stack in get_async_stack_trace in _remote_debugging (GH-136483) (cherry picked from commit ea45a2f97cb1d4774a6f88e63c6ce0a487f83031) Co-authored-by: Pablo Galindo Salgado --- Lib/test/test_external_inspection.py | 430 +++++-- ...-07-09-20-29-30.gh-issue-136476.HyLLzh.rst | 2 + Modules/_remote_debugging_module.c | 1032 ++++++++--------- Modules/clinic/_remote_debugging_module.c.h | 47 +- 4 files changed, 868 insertions(+), 643 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst diff --git a/Lib/test/test_external_inspection.py b/Lib/test/test_external_inspection.py index 44890ebfe5f76d..a709b837161f48 100644 --- a/Lib/test/test_external_inspection.py +++ b/Lib/test/test_external_inspection.py @@ -8,7 +8,12 @@ import time from asyncio import staggered, taskgroups, base_events, tasks from unittest.mock import ANY -from test.support import os_helper, SHORT_TIMEOUT, busy_retry, requires_gil_enabled +from test.support import ( + os_helper, + SHORT_TIMEOUT, + busy_retry, + requires_gil_enabled, +) from test.support.script_helper import make_script from test.support.socket_helper import find_unused_port @@ -236,55 +241,162 @@ def new_eager_loop(): p.terminate() p.wait(timeout=SHORT_TIMEOUT) - # sets are unordered, so we want to sort "awaited_by"s - stack_trace[2].sort(key=lambda x: x[1]) + # First check all the tasks are present + tasks_names = [ + task.task_name for task in stack_trace[0].awaited_by + ] + for task_name in ["c2_root", "sub_main_1", "sub_main_2"]: + self.assertIn(task_name, tasks_names) + + # Now ensure that the awaited_by_relationships are correct + id_to_task = { + task.task_id: task for task in stack_trace[0].awaited_by + } + task_name_to_awaited_by = { + task.task_name: set( + id_to_task[awaited.task_name].task_name + for awaited in task.awaited_by + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + task_name_to_awaited_by, + { + "c2_root": {"Task-1", "sub_main_1", "sub_main_2"}, + "Task-1": set(), + "sub_main_1": {"Task-1"}, + "sub_main_2": {"Task-1"}, + }, + ) - expected_stack_trace = [ - [ - FrameInfo([script_name, 10, "c5"]), - FrameInfo([script_name, 14, "c4"]), - FrameInfo([script_name, 17, "c3"]), - FrameInfo([script_name, 20, "c2"]), - ], - "c2_root", - [ - CoroInfo( - [ - [ - FrameInfo( + # Now ensure that the coroutine stacks are correct + coroutine_stacks = { + task.task_name: sorted( + tuple(tuple(frame) for frame in coro.call_stack) + for coro in task.coroutine_stack + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + coroutine_stacks, + { + "Task-1": [ + ( + tuple( + [ + taskgroups.__file__, + ANY, + "TaskGroup._aexit", + ] + ), + tuple( + [ + taskgroups.__file__, + ANY, + "TaskGroup.__aexit__", + ] + ), + tuple([script_name, 26, "main"]), + ) + ], + "c2_root": [ + ( + tuple([script_name, 10, "c5"]), + tuple([script_name, 14, "c4"]), + tuple([script_name, 17, "c3"]), + tuple([script_name, 20, "c2"]), + ) + ], + "sub_main_1": [(tuple([script_name, 23, "c1"]),)], + "sub_main_2": [(tuple([script_name, 23, "c1"]),)], + }, + ) + + # Now ensure the coroutine stacks for the awaited_by relationships are correct. + awaited_by_coroutine_stacks = { + task.task_name: sorted( + ( + id_to_task[coro.task_name].task_name, + tuple(tuple(frame) for frame in coro.call_stack), + ) + for coro in task.awaited_by + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + awaited_by_coroutine_stacks, + { + "Task-1": [], + "c2_root": [ + ( + "Task-1", + ( + tuple( [ taskgroups.__file__, ANY, "TaskGroup._aexit", ] ), - FrameInfo( + tuple( [ taskgroups.__file__, ANY, "TaskGroup.__aexit__", ] ), - FrameInfo([script_name, 26, "main"]), - ], + tuple([script_name, 26, "main"]), + ), + ), + ("sub_main_1", (tuple([script_name, 23, "c1"]),)), + ("sub_main_2", (tuple([script_name, 23, "c1"]),)), + ], + "sub_main_1": [ + ( "Task-1", - ] - ), - CoroInfo( - [ - [FrameInfo([script_name, 23, "c1"])], - "sub_main_1", - ] - ), - CoroInfo( - [ - [FrameInfo([script_name, 23, "c1"])], - "sub_main_2", - ] - ), - ], - ] - self.assertEqual(stack_trace, expected_stack_trace) + ( + tuple( + [ + taskgroups.__file__, + ANY, + "TaskGroup._aexit", + ] + ), + tuple( + [ + taskgroups.__file__, + ANY, + "TaskGroup.__aexit__", + ] + ), + tuple([script_name, 26, "main"]), + ), + ) + ], + "sub_main_2": [ + ( + "Task-1", + ( + tuple( + [ + taskgroups.__file__, + ANY, + "TaskGroup._aexit", + ] + ), + tuple( + [ + taskgroups.__file__, + ANY, + "TaskGroup.__aexit__", + ] + ), + tuple([script_name, 26, "main"]), + ), + ) + ], + }, + ) @skip_if_not_supported @unittest.skipIf( @@ -350,19 +462,29 @@ async def main(): p.terminate() p.wait(timeout=SHORT_TIMEOUT) - # sets are unordered, so we want to sort "awaited_by"s - stack_trace[2].sort(key=lambda x: x[1]) - - expected_stack_trace = [ + # For this simple asyncgen test, we only expect one task with the full coroutine stack + self.assertEqual(len(stack_trace[0].awaited_by), 1) + task = stack_trace[0].awaited_by[0] + self.assertEqual(task.task_name, "Task-1") + + # Check the coroutine stack - based on actual output, only shows main + coroutine_stack = sorted( + tuple(tuple(frame) for frame in coro.call_stack) + for coro in task.coroutine_stack + ) + self.assertEqual( + coroutine_stack, [ - FrameInfo([script_name, 10, "gen_nested_call"]), - FrameInfo([script_name, 16, "gen"]), - FrameInfo([script_name, 19, "main"]), + ( + tuple([script_name, 10, "gen_nested_call"]), + tuple([script_name, 16, "gen"]), + tuple([script_name, 19, "main"]), + ) ], - "Task-1", - [], - ] - self.assertEqual(stack_trace, expected_stack_trace) + ) + + # No awaited_by relationships expected for this simple case + self.assertEqual(task.awaited_by, []) @skip_if_not_supported @unittest.skipIf( @@ -429,18 +551,73 @@ async def main(): p.terminate() p.wait(timeout=SHORT_TIMEOUT) - # sets are unordered, so we want to sort "awaited_by"s - stack_trace[2].sort(key=lambda x: x[1]) - - expected_stack_trace = [ - [ - FrameInfo([script_name, 11, "deep"]), - FrameInfo([script_name, 15, "c1"]), - ], - "Task-2", - [CoroInfo([[FrameInfo([script_name, 21, "main"])], "Task-1"])], + # First check all the tasks are present + tasks_names = [ + task.task_name for task in stack_trace[0].awaited_by ] - self.assertEqual(stack_trace, expected_stack_trace) + for task_name in ["Task-1", "Task-2"]: + self.assertIn(task_name, tasks_names) + + # Now ensure that the awaited_by_relationships are correct + id_to_task = { + task.task_id: task for task in stack_trace[0].awaited_by + } + task_name_to_awaited_by = { + task.task_name: set( + id_to_task[awaited.task_name].task_name + for awaited in task.awaited_by + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + task_name_to_awaited_by, + { + "Task-1": set(), + "Task-2": {"Task-1"}, + }, + ) + + # Now ensure that the coroutine stacks are correct + coroutine_stacks = { + task.task_name: sorted( + tuple(tuple(frame) for frame in coro.call_stack) + for coro in task.coroutine_stack + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + coroutine_stacks, + { + "Task-1": [(tuple([script_name, 21, "main"]),)], + "Task-2": [ + ( + tuple([script_name, 11, "deep"]), + tuple([script_name, 15, "c1"]), + ) + ], + }, + ) + + # Now ensure the coroutine stacks for the awaited_by relationships are correct. + awaited_by_coroutine_stacks = { + task.task_name: sorted( + ( + id_to_task[coro.task_name].task_name, + tuple(tuple(frame) for frame in coro.call_stack), + ) + for coro in task.awaited_by + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + awaited_by_coroutine_stacks, + { + "Task-1": [], + "Task-2": [ + ("Task-1", (tuple([script_name, 21, "main"]),)) + ], + }, + ) @skip_if_not_supported @unittest.skipIf( @@ -510,36 +687,93 @@ async def main(): p.terminate() p.wait(timeout=SHORT_TIMEOUT) - # sets are unordered, so we want to sort "awaited_by"s - stack_trace[2].sort(key=lambda x: x[1]) - expected_stack_trace = [ - [ - FrameInfo([script_name, 11, "deep"]), - FrameInfo([script_name, 15, "c1"]), - FrameInfo( - [ - staggered.__file__, - ANY, - "staggered_race..run_one_coro", - ] - ), - ], - "Task-2", - [ - CoroInfo( - [ - [ - FrameInfo( + # First check all the tasks are present + tasks_names = [ + task.task_name for task in stack_trace[0].awaited_by + ] + for task_name in ["Task-1", "Task-2"]: + self.assertIn(task_name, tasks_names) + + # Now ensure that the awaited_by_relationships are correct + id_to_task = { + task.task_id: task for task in stack_trace[0].awaited_by + } + task_name_to_awaited_by = { + task.task_name: set( + id_to_task[awaited.task_name].task_name + for awaited in task.awaited_by + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + task_name_to_awaited_by, + { + "Task-1": set(), + "Task-2": {"Task-1"}, + }, + ) + + # Now ensure that the coroutine stacks are correct + coroutine_stacks = { + task.task_name: sorted( + tuple(tuple(frame) for frame in coro.call_stack) + for coro in task.coroutine_stack + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + coroutine_stacks, + { + "Task-1": [ + ( + tuple([staggered.__file__, ANY, "staggered_race"]), + tuple([script_name, 21, "main"]), + ) + ], + "Task-2": [ + ( + tuple([script_name, 11, "deep"]), + tuple([script_name, 15, "c1"]), + tuple( + [ + staggered.__file__, + ANY, + "staggered_race..run_one_coro", + ] + ), + ) + ], + }, + ) + + # Now ensure the coroutine stacks for the awaited_by relationships are correct. + awaited_by_coroutine_stacks = { + task.task_name: sorted( + ( + id_to_task[coro.task_name].task_name, + tuple(tuple(frame) for frame in coro.call_stack), + ) + for coro in task.awaited_by + ) + for task in stack_trace[0].awaited_by + } + self.assertEqual( + awaited_by_coroutine_stacks, + { + "Task-1": [], + "Task-2": [ + ( + "Task-1", + ( + tuple( [staggered.__file__, ANY, "staggered_race"] ), - FrameInfo([script_name, 21, "main"]), - ], - "Task-1", - ] - ) - ], - ] - self.assertEqual(stack_trace, expected_stack_trace) + tuple([script_name, 21, "main"]), + ), + ) + ], + }, + ) @skip_if_not_supported @unittest.skipIf( @@ -973,7 +1207,10 @@ def main_work(): if not stack: continue current_frame = stack[0] - if current_frame.funcname == "main_work" and current_frame.lineno >15: + if ( + current_frame.funcname == "main_work" + and current_frame.lineno > 15 + ): found = True if found: @@ -981,7 +1218,9 @@ def main_work(): # Give a bit of time to take the next sample time.sleep(0.1) else: - self.fail("Main thread did not start its busy work on time") + self.fail( + "Main thread did not start its busy work on time" + ) # Get stack trace with only GIL holder unwinder_gil = RemoteUnwinder(p.pid, only_active_thread=True) @@ -999,16 +1238,23 @@ def main_work(): p.wait(timeout=SHORT_TIMEOUT) # Verify we got multiple threads in all_traces - self.assertGreater(len(all_traces), 1, "Should have multiple threads") + self.assertGreater( + len(all_traces), 1, "Should have multiple threads" + ) # Verify we got exactly one thread in gil_traces - self.assertEqual(len(gil_traces), 1, "Should have exactly one GIL holder") + self.assertEqual( + len(gil_traces), 1, "Should have exactly one GIL holder" + ) # The GIL holder should be in the all_traces list gil_thread_id = gil_traces[0][0] all_thread_ids = [trace[0] for trace in all_traces] - self.assertIn(gil_thread_id, all_thread_ids, - "GIL holder should be among all threads") + self.assertIn( + gil_thread_id, + all_thread_ids, + "GIL holder should be among all threads", + ) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst b/Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst new file mode 100644 index 00000000000000..7634bd3be9346d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst @@ -0,0 +1,2 @@ +Fix a bug that was causing the ``get_async_stack_trace`` function to miss +some frames in the stack trace. diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index 7b8d272e63b160..0dc797a9da82a0 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -257,20 +257,25 @@ is_frame_valid( uintptr_t code_object_addr ); -static int -parse_tasks_in_set( +typedef int (*thread_processor_func)( RemoteUnwinderObject *unwinder, - uintptr_t set_addr, - PyObject *awaited_by, - int recurse_task + uintptr_t thread_state_addr, + unsigned long tid, + void *context +); + +typedef int (*set_entry_processor_func)( + RemoteUnwinderObject *unwinder, + uintptr_t key_addr, + void *context ); + static int parse_task( RemoteUnwinderObject *unwinder, uintptr_t task_address, - PyObject *render_to, - int recurse_task + PyObject *render_to ); static int @@ -285,9 +290,27 @@ static int parse_frame_object( RemoteUnwinderObject *unwinder, PyObject** result, uintptr_t address, + uintptr_t* address_of_code_object, uintptr_t* previous_frame ); +static int +parse_async_frame_chain( + RemoteUnwinderObject *unwinder, + PyObject *calls, + uintptr_t address_of_thread, + uintptr_t running_task_code_obj +); + +static int read_py_ptr(RemoteUnwinderObject *unwinder, uintptr_t address, uintptr_t *ptr_addr); +static int read_Py_ssize_t(RemoteUnwinderObject *unwinder, uintptr_t address, Py_ssize_t *size); + +static int process_task_and_waiters(RemoteUnwinderObject *unwinder, uintptr_t task_addr, PyObject *result); +static int process_task_awaited_by(RemoteUnwinderObject *unwinder, uintptr_t task_address, set_entry_processor_func processor, void *context); +static int find_running_task_in_thread(RemoteUnwinderObject *unwinder, uintptr_t thread_state_addr, uintptr_t *running_task_addr); +static int get_task_code_object(RemoteUnwinderObject *unwinder, uintptr_t task_addr, uintptr_t *code_obj_addr); +static int append_awaited_by(RemoteUnwinderObject *unwinder, unsigned long tid, uintptr_t head_addr, PyObject *result); + /* ============================================================================ * UTILITY FUNCTIONS AND HELPERS * ============================================================================ */ @@ -405,32 +428,149 @@ validate_debug_offsets(struct _Py_DebugOffsets *debug_offsets) return 0; } -/* ============================================================================ - * MEMORY READING FUNCTIONS - * ============================================================================ */ +// Generic function to iterate through all threads +static int +iterate_threads( + RemoteUnwinderObject *unwinder, + thread_processor_func processor, + void *context +) { + uintptr_t thread_state_addr; + unsigned long tid = 0; -static inline int -read_ptr(RemoteUnwinderObject *unwinder, uintptr_t address, uintptr_t *ptr_addr) -{ - int result = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address, sizeof(void*), ptr_addr); - if (result < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read pointer from remote memory"); + if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + unwinder->interpreter_addr + unwinder->debug_offsets.interpreter_state.threads_main, + sizeof(void*), + &thread_state_addr)) + { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read main thread state"); return -1; } + + while (thread_state_addr != 0) { + if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + thread_state_addr + unwinder->debug_offsets.thread_state.native_thread_id, + sizeof(tid), + &tid)) + { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read thread ID"); + return -1; + } + + // Call the processor function for this thread + if (processor(unwinder, thread_state_addr, tid, context) < 0) { + return -1; + } + + // Move to next thread + if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( + &unwinder->handle, + thread_state_addr + unwinder->debug_offsets.thread_state.next, + sizeof(void*), + &thread_state_addr)) + { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read next thread state"); + return -1; + } + } + return 0; } -static inline int -read_Py_ssize_t(RemoteUnwinderObject *unwinder, uintptr_t address, Py_ssize_t *size) -{ - int result = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address, sizeof(Py_ssize_t), size); - if (result < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read Py_ssize_t from remote memory"); +// Generic function to iterate through set entries +static int +iterate_set_entries( + RemoteUnwinderObject *unwinder, + uintptr_t set_addr, + set_entry_processor_func processor, + void *context +) { + char set_object[SIZEOF_SET_OBJ]; + if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, set_addr, + SIZEOF_SET_OBJ, set_object) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read set object"); return -1; } + + Py_ssize_t num_els = GET_MEMBER(Py_ssize_t, set_object, unwinder->debug_offsets.set_object.used); + Py_ssize_t set_len = GET_MEMBER(Py_ssize_t, set_object, unwinder->debug_offsets.set_object.mask) + 1; + uintptr_t table_ptr = GET_MEMBER(uintptr_t, set_object, unwinder->debug_offsets.set_object.table); + + Py_ssize_t i = 0; + Py_ssize_t els = 0; + while (i < set_len && els < num_els) { + uintptr_t key_addr; + if (read_py_ptr(unwinder, table_ptr, &key_addr) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read set entry key"); + return -1; + } + + if ((void*)key_addr != NULL) { + Py_ssize_t ref_cnt; + if (read_Py_ssize_t(unwinder, table_ptr, &ref_cnt) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read set entry ref count"); + return -1; + } + + if (ref_cnt) { + // Process this valid set entry + if (processor(unwinder, key_addr, context) < 0) { + return -1; + } + els++; + } + } + table_ptr += sizeof(void*) * 2; + i++; + } + return 0; } +// Processor function for task waiters +static int +process_waiter_task( + RemoteUnwinderObject *unwinder, + uintptr_t key_addr, + void *context +) { + PyObject *result = (PyObject *)context; + return process_task_and_waiters(unwinder, key_addr, result); +} + +// Processor function for parsing tasks in sets +static int +process_task_parser( + RemoteUnwinderObject *unwinder, + uintptr_t key_addr, + void *context +) { + PyObject *awaited_by = (PyObject *)context; + return parse_task(unwinder, key_addr, awaited_by); +} + +/* ============================================================================ + * MEMORY READING FUNCTIONS + * ============================================================================ */ + +#define DEFINE_MEMORY_READER(type_name, c_type, error_msg) \ +static inline int \ +read_##type_name(RemoteUnwinderObject *unwinder, uintptr_t address, c_type *result) \ +{ \ + int res = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address, sizeof(c_type), result); \ + if (res < 0) { \ + set_exception_cause(unwinder, PyExc_RuntimeError, error_msg); \ + return -1; \ + } \ + return 0; \ +} + +DEFINE_MEMORY_READER(ptr, uintptr_t, "Failed to read pointer from remote memory") +DEFINE_MEMORY_READER(Py_ssize_t, Py_ssize_t, "Failed to read Py_ssize_t from remote memory") +DEFINE_MEMORY_READER(char, char, "Failed to read char from remote memory") + static int read_py_ptr(RemoteUnwinderObject *unwinder, uintptr_t address, uintptr_t *ptr_addr) { @@ -442,17 +582,6 @@ read_py_ptr(RemoteUnwinderObject *unwinder, uintptr_t address, uintptr_t *ptr_ad return 0; } -static int -read_char(RemoteUnwinderObject *unwinder, uintptr_t address, char *result) -{ - int res = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address, sizeof(char), result); - if (res < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read char from remote memory"); - return -1; - } - return 0; -} - /* ============================================================================ * PYTHON OBJECT READING FUNCTIONS * ============================================================================ */ @@ -799,39 +928,9 @@ parse_task_name( static int parse_task_awaited_by( RemoteUnwinderObject *unwinder, uintptr_t task_address, - PyObject *awaited_by, - int recurse_task + PyObject *awaited_by ) { - // Read the entire TaskObj at once - char task_obj[SIZEOF_TASK_OBJ]; - if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, task_address, - unwinder->async_debug_offsets.asyncio_task_object.size, - task_obj) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read task object in awaited_by parsing"); - return -1; - } - - uintptr_t task_ab_addr = GET_MEMBER_NO_TAG(uintptr_t, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_awaited_by); - - if ((void*)task_ab_addr == NULL) { - return 0; - } - - char awaited_by_is_a_set = GET_MEMBER(char, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_awaited_by_is_set); - - if (awaited_by_is_a_set) { - if (parse_tasks_in_set(unwinder, task_ab_addr, awaited_by, recurse_task)) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse tasks in awaited_by set"); - return -1; - } - } else { - if (parse_task(unwinder, task_ab_addr, awaited_by, recurse_task)) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse single awaited_by task"); - return -1; - } - } - - return 0; + return process_task_awaited_by(unwinder, task_address, process_task_parser, awaited_by); } static int @@ -940,12 +1039,13 @@ parse_coro_chain( // Parse the previous frame using the gi_iframe from local copy uintptr_t prev_frame; uintptr_t gi_iframe_addr = coro_address + unwinder->debug_offsets.gen_object.gi_iframe; - if (parse_frame_object(unwinder, &name, gi_iframe_addr, &prev_frame) < 0) { + uintptr_t address_of_code_object = 0; + if (parse_frame_object(unwinder, &name, gi_iframe_addr, &address_of_code_object, &prev_frame) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse frame object in coro chain"); return -1; } - if (name == NULL) { + if (!name) { return 0; } @@ -966,8 +1066,7 @@ parse_coro_chain( static PyObject* create_task_result( RemoteUnwinderObject *unwinder, - uintptr_t task_address, - int recurse_task + uintptr_t task_address ) { PyObject* result = NULL; PyObject *call_stack = NULL; @@ -983,11 +1082,7 @@ create_task_result( } // Create task name/address for second tuple element - if (recurse_task) { - tn = parse_task_name(unwinder, task_address); - } else { - tn = PyLong_FromUnsignedLongLong(task_address); - } + tn = PyLong_FromUnsignedLongLong(task_address); if (tn == NULL) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to create task name/address"); goto error; @@ -1040,8 +1135,7 @@ static int parse_task( RemoteUnwinderObject *unwinder, uintptr_t task_address, - PyObject *render_to, - int recurse_task + PyObject *render_to ) { char is_task; PyObject* result = NULL; @@ -1057,7 +1151,7 @@ parse_task( } if (is_task) { - result = create_task_result(unwinder, task_address, recurse_task); + result = create_task_result(unwinder, task_address); if (!result) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to create task result"); goto error; @@ -1084,11 +1178,11 @@ parse_task( PyStructSequence_SetItem(result, 0, empty_list); // This steals the reference PyStructSequence_SetItem(result, 1, task_name); // This steals the reference } - if (PyList_Append(render_to, result)) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append task result to render list"); goto error; } + Py_DECREF(result); return 0; @@ -1098,234 +1192,335 @@ parse_task( } static int -process_set_entry( +process_single_task_node( RemoteUnwinderObject *unwinder, - uintptr_t table_ptr, - PyObject *awaited_by, - int recurse_task + uintptr_t task_addr, + PyObject **task_info, + PyObject *result ) { - uintptr_t key_addr; - if (read_py_ptr(unwinder, table_ptr, &key_addr)) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read set entry key"); - return -1; + PyObject *tn = NULL; + PyObject *current_awaited_by = NULL; + PyObject *task_id = NULL; + PyObject *result_item = NULL; + PyObject *coroutine_stack = NULL; + + tn = parse_task_name(unwinder, task_addr); + if (tn == NULL) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse task name in single task node"); + goto error; } - if ((void*)key_addr != NULL) { - Py_ssize_t ref_cnt; - if (read_Py_ssize_t(unwinder, table_ptr, &ref_cnt)) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read set entry reference count"); - return -1; - } + current_awaited_by = PyList_New(0); + if (current_awaited_by == NULL) { + set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create awaited_by list in single task node"); + goto error; + } - if (ref_cnt) { - // if 'ref_cnt=0' it's a set dummy marker - if (parse_task(unwinder, key_addr, awaited_by, recurse_task)) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse task in set entry"); - return -1; - } - return 1; // Successfully processed a valid entry - } + // Extract the coroutine stack for this task + coroutine_stack = PyList_New(0); + if (coroutine_stack == NULL) { + set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create coroutine stack list in single task node"); + goto error; } - return 0; // Entry was NULL or dummy marker -} -static int -parse_tasks_in_set( - RemoteUnwinderObject *unwinder, - uintptr_t set_addr, - PyObject *awaited_by, - int recurse_task -) { - char set_object[SIZEOF_SET_OBJ]; - int err = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, - set_addr, - SIZEOF_SET_OBJ, - set_object); - if (err < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read set object"); - return -1; + if (parse_task(unwinder, task_addr, coroutine_stack) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse task coroutine stack in single task node"); + goto error; } - Py_ssize_t num_els = GET_MEMBER(Py_ssize_t, set_object, unwinder->debug_offsets.set_object.used); - Py_ssize_t set_len = GET_MEMBER(Py_ssize_t, set_object, unwinder->debug_offsets.set_object.mask) + 1; // The set contains the `mask+1` element slots. - uintptr_t table_ptr = GET_MEMBER(uintptr_t, set_object, unwinder->debug_offsets.set_object.table); + task_id = PyLong_FromUnsignedLongLong(task_addr); + if (task_id == NULL) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to create task ID in single task node"); + goto error; + } - Py_ssize_t i = 0; - Py_ssize_t els = 0; - while (i < set_len && els < num_els) { - int result = process_set_entry(unwinder, table_ptr, awaited_by, recurse_task); + RemoteDebuggingState *state = RemoteDebugging_GetStateFromObject((PyObject*)unwinder); + result_item = PyStructSequence_New(state->TaskInfo_Type); + if (result_item == NULL) { + set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create TaskInfo in single task node"); + goto error; + } - if (result < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to process set entry"); - return -1; - } - if (result > 0) { - els++; - } + PyStructSequence_SetItem(result_item, 0, task_id); // steals ref + PyStructSequence_SetItem(result_item, 1, tn); // steals ref + PyStructSequence_SetItem(result_item, 2, coroutine_stack); // steals ref + PyStructSequence_SetItem(result_item, 3, current_awaited_by); // steals ref - table_ptr += sizeof(void*) * 2; - i++; + // References transferred to tuple + task_id = NULL; + tn = NULL; + coroutine_stack = NULL; + current_awaited_by = NULL; + + if (PyList_Append(result, result_item)) { + Py_DECREF(result_item); + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append result item in single task node"); + return -1; + } + if (task_info != NULL) { + *task_info = result_item; + } + Py_DECREF(result_item); + + // Get back current_awaited_by reference for parse_task_awaited_by + current_awaited_by = PyStructSequence_GetItem(result_item, 3); + if (parse_task_awaited_by(unwinder, task_addr, current_awaited_by) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse awaited_by in single task node"); + // No cleanup needed here since all references were transferred to result_item + // and result_item was already added to result list and decreffed + return -1; } + return 0; + +error: + Py_XDECREF(tn); + Py_XDECREF(current_awaited_by); + Py_XDECREF(task_id); + Py_XDECREF(result_item); + Py_XDECREF(coroutine_stack); + return -1; } +// Thread processor for get_all_awaited_by +static int +process_thread_for_awaited_by( + RemoteUnwinderObject *unwinder, + uintptr_t thread_state_addr, + unsigned long tid, + void *context +) { + PyObject *result = (PyObject *)context; + uintptr_t head_addr = thread_state_addr + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_tasks_head; + return append_awaited_by(unwinder, tid, head_addr, result); +} +// Generic function to process task awaited_by static int -setup_async_result_structure(RemoteUnwinderObject *unwinder, PyObject **result, PyObject **calls) -{ - *result = PyList_New(1); - if (*result == NULL) { - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create async result structure"); +process_task_awaited_by( + RemoteUnwinderObject *unwinder, + uintptr_t task_address, + set_entry_processor_func processor, + void *context +) { + // Read the entire TaskObj at once + char task_obj[SIZEOF_TASK_OBJ]; + if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, task_address, + unwinder->async_debug_offsets.asyncio_task_object.size, + task_obj) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read task object"); return -1; } - *calls = PyList_New(0); - if (*calls == NULL) { - Py_DECREF(*result); - *result = NULL; - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create calls list in async result"); - return -1; + uintptr_t task_ab_addr = GET_MEMBER_NO_TAG(uintptr_t, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_awaited_by); + if ((void*)task_ab_addr == NULL) { + return 0; // No tasks waiting for this one } - if (PyList_SetItem(*result, 0, *calls)) { /* steals ref to 'calls' */ - Py_DECREF(*calls); - Py_DECREF(*result); - *result = NULL; - *calls = NULL; - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to set calls list in async result"); - return -1; - } + char awaited_by_is_a_set = GET_MEMBER(char, task_obj, unwinder->async_debug_offsets.asyncio_task_object.task_awaited_by_is_set); - return 0; + if (awaited_by_is_a_set) { + return iterate_set_entries(unwinder, task_ab_addr, processor, context); + } else { + // Single task waiting + return processor(unwinder, task_ab_addr, context); + } } static int -add_task_info_to_result( +process_running_task_chain( RemoteUnwinderObject *unwinder, - PyObject *result, - uintptr_t running_task_addr + uintptr_t running_task_addr, + uintptr_t thread_state_addr, + PyObject *result ) { - PyObject *tn = parse_task_name(unwinder, running_task_addr); - if (tn == NULL) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse task name for result"); + uintptr_t running_task_code_obj = 0; + if(get_task_code_object(unwinder, running_task_addr, &running_task_code_obj) < 0) { + return -1; + } + + // First, add this task to the result + PyObject *task_info = NULL; + if (process_single_task_node(unwinder, running_task_addr, &task_info, result) < 0) { return -1; } - if (PyList_Append(result, tn)) { - Py_DECREF(tn); - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append task name to result"); + // Get the chain from the current frame to this task + PyObject *coro_chain = PyStructSequence_GET_ITEM(task_info, 2); + assert(coro_chain != NULL); + if (PyList_GET_SIZE(coro_chain) != 1) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Coro chain is not a single item"); return -1; } - Py_DECREF(tn); + PyObject *coro_info = PyList_GET_ITEM(coro_chain, 0); + assert(coro_info != NULL); + PyObject *frame_chain = PyStructSequence_GET_ITEM(coro_info, 0); + assert(frame_chain != NULL); - PyObject* awaited_by = PyList_New(0); - if (awaited_by == NULL) { - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create awaited_by list for result"); + // Clear the coro_chain + if (PyList_Clear(frame_chain) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to clear coroutine chain"); return -1; } - if (PyList_Append(result, awaited_by)) { - Py_DECREF(awaited_by); - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append awaited_by to result"); + // Add the chain from the current frame to this task + if (parse_async_frame_chain(unwinder, frame_chain, thread_state_addr, running_task_code_obj) < 0) { return -1; } - Py_DECREF(awaited_by); - if (parse_task_awaited_by( - unwinder, running_task_addr, awaited_by, 1) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse awaited_by for result"); + // Now find all tasks that are waiting for this task and process them + if (process_task_awaited_by(unwinder, running_task_addr, process_waiter_task, result) < 0) { return -1; } return 0; } +// Thread processor for get_async_stack_trace static int -process_single_task_node( +process_thread_for_async_stack_trace( + RemoteUnwinderObject *unwinder, + uintptr_t thread_state_addr, + unsigned long tid, + void *context +) { + PyObject *result = (PyObject *)context; + + // Find running task in this thread + uintptr_t running_task_addr; + if (find_running_task_in_thread(unwinder, thread_state_addr, &running_task_addr) < 0) { + return 0; + } + + // If we found a running task, process it and its waiters + if ((void*)running_task_addr != NULL) { + PyObject *task_list = PyList_New(0); + if (task_list == NULL) { + set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create task list for thread"); + return -1; + } + + if (process_running_task_chain(unwinder, running_task_addr, thread_state_addr, task_list) < 0) { + Py_DECREF(task_list); + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to process running task chain"); + return -1; + } + + // Create AwaitedInfo structure for this thread + PyObject *tid_py = PyLong_FromUnsignedLong(tid); + if (tid_py == NULL) { + Py_DECREF(task_list); + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to create thread ID"); + return -1; + } + + RemoteDebuggingState *state = RemoteDebugging_GetStateFromObject((PyObject*)unwinder); + PyObject *awaited_info = PyStructSequence_New(state->AwaitedInfo_Type); + if (awaited_info == NULL) { + Py_DECREF(tid_py); + Py_DECREF(task_list); + set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create AwaitedInfo"); + return -1; + } + + PyStructSequence_SetItem(awaited_info, 0, tid_py); // steals ref + PyStructSequence_SetItem(awaited_info, 1, task_list); // steals ref + + if (PyList_Append(result, awaited_info)) { + Py_DECREF(awaited_info); + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append AwaitedInfo to result"); + return -1; + } + Py_DECREF(awaited_info); + } + + return 0; +} + +static int +process_task_and_waiters( RemoteUnwinderObject *unwinder, uintptr_t task_addr, PyObject *result ) { - PyObject *tn = NULL; - PyObject *current_awaited_by = NULL; - PyObject *task_id = NULL; - PyObject *result_item = NULL; - PyObject *coroutine_stack = NULL; - - tn = parse_task_name(unwinder, task_addr); - if (tn == NULL) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse task name in single task node"); - goto error; + // First, add this task to the result + if (process_single_task_node(unwinder, task_addr, NULL, result) < 0) { + return -1; } - current_awaited_by = PyList_New(0); - if (current_awaited_by == NULL) { - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create awaited_by list in single task node"); - goto error; + // Now find all tasks that are waiting for this task and process them + return process_task_awaited_by(unwinder, task_addr, process_waiter_task, result); +} + +static int +find_running_task_in_thread( + RemoteUnwinderObject *unwinder, + uintptr_t thread_state_addr, + uintptr_t *running_task_addr +) { + *running_task_addr = (uintptr_t)NULL; + + uintptr_t address_of_running_loop; + int bytes_read = read_py_ptr( + unwinder, + thread_state_addr + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_loop, + &address_of_running_loop); + if (bytes_read == -1) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running loop address"); + return -1; } - // Extract the coroutine stack for this task - coroutine_stack = PyList_New(0); - if (coroutine_stack == NULL) { - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create coroutine stack list in single task node"); - goto error; + // no asyncio loop is now running + if ((void*)address_of_running_loop == NULL) { + return 0; } - if (parse_task(unwinder, task_addr, coroutine_stack, 0) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse task coroutine stack in single task node"); - goto error; + int err = read_ptr( + unwinder, + thread_state_addr + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_task, + running_task_addr); + if (err) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running task address"); + return -1; } - task_id = PyLong_FromUnsignedLongLong(task_addr); - if (task_id == NULL) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to create task ID in single task node"); - goto error; + return 0; +} + +static int +get_task_code_object(RemoteUnwinderObject *unwinder, uintptr_t task_addr, uintptr_t *code_obj_addr) { + uintptr_t running_coro_addr = 0; + + if(read_py_ptr( + unwinder, + task_addr + unwinder->async_debug_offsets.asyncio_task_object.task_coro, + &running_coro_addr) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Running task coro read failed"); + return -1; } - RemoteDebuggingState *state = RemoteDebugging_GetStateFromObject((PyObject*)unwinder); - result_item = PyStructSequence_New(state->TaskInfo_Type); - if (result_item == NULL) { - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create TaskInfo in single task node"); - goto error; + if (running_coro_addr == 0) { + PyErr_SetString(PyExc_RuntimeError, "Running task coro is NULL"); + set_exception_cause(unwinder, PyExc_RuntimeError, "Running task coro address is NULL"); + return -1; } - PyStructSequence_SetItem(result_item, 0, task_id); // steals ref - PyStructSequence_SetItem(result_item, 1, tn); // steals ref - PyStructSequence_SetItem(result_item, 2, coroutine_stack); // steals ref - PyStructSequence_SetItem(result_item, 3, current_awaited_by); // steals ref - - // References transferred to tuple - task_id = NULL; - tn = NULL; - coroutine_stack = NULL; - current_awaited_by = NULL; - - if (PyList_Append(result, result_item)) { - Py_DECREF(result_item); - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to append result item in single task node"); + // note: genobject's gi_iframe is an embedded struct so the address to + // the offset leads directly to its first field: f_executable + if (read_py_ptr( + unwinder, + running_coro_addr + unwinder->debug_offsets.gen_object.gi_iframe, code_obj_addr) < 0) { + set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running task code object"); return -1; } - Py_DECREF(result_item); - // Get back current_awaited_by reference for parse_task_awaited_by - current_awaited_by = PyStructSequence_GetItem(result_item, 3); - if (parse_task_awaited_by(unwinder, task_addr, current_awaited_by, 0) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse awaited_by in single task node"); - // No cleanup needed here since all references were transferred to result_item - // and result_item was already added to result list and decreffed + if (*code_obj_addr == 0) { + PyErr_SetString(PyExc_RuntimeError, "Running task code object is NULL"); + set_exception_cause(unwinder, PyExc_RuntimeError, "Running task code object address is NULL"); return -1; } return 0; - -error: - Py_XDECREF(tn); - Py_XDECREF(current_awaited_by); - Py_XDECREF(task_id); - Py_XDECREF(result_item); - Py_XDECREF(coroutine_stack); - return -1; } /* ============================================================================ @@ -1908,45 +2103,13 @@ populate_initial_state_data( return 0; } + static int find_running_frame( RemoteUnwinderObject *unwinder, - uintptr_t runtime_start_address, + uintptr_t address_of_thread, uintptr_t *frame ) { - uint64_t interpreter_state_list_head = - unwinder->debug_offsets.runtime_state.interpreters_head; - - uintptr_t address_of_interpreter_state; - int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, - runtime_start_address + interpreter_state_list_head, - sizeof(void*), - &address_of_interpreter_state); - if (bytes_read < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read interpreter state for running frame"); - return -1; - } - - if (address_of_interpreter_state == 0) { - PyErr_SetString(PyExc_RuntimeError, "No interpreter state found"); - set_exception_cause(unwinder, PyExc_RuntimeError, "Interpreter state is NULL in running frame search"); - return -1; - } - - uintptr_t address_of_thread; - bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, - address_of_interpreter_state + - unwinder->debug_offsets.interpreter_state.threads_main, - sizeof(void*), - &address_of_thread); - if (bytes_read < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read thread address for running frame"); - return -1; - } - - // No Python frames are available for us (can happen at tear-down). if ((void*)address_of_thread != NULL) { int err = read_ptr( unwinder, @@ -1963,133 +2126,6 @@ find_running_frame( return 0; } -static int -find_running_task( - RemoteUnwinderObject *unwinder, - uintptr_t *running_task_addr -) { - *running_task_addr = (uintptr_t)NULL; - - uint64_t interpreter_state_list_head = - unwinder->debug_offsets.runtime_state.interpreters_head; - - uintptr_t address_of_interpreter_state; - int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, - unwinder->runtime_start_address + interpreter_state_list_head, - sizeof(void*), - &address_of_interpreter_state); - if (bytes_read < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read interpreter state for running task"); - return -1; - } - - if (address_of_interpreter_state == 0) { - PyErr_SetString(PyExc_RuntimeError, "No interpreter state found"); - set_exception_cause(unwinder, PyExc_RuntimeError, "Interpreter state is NULL in running task search"); - return -1; - } - - uintptr_t address_of_thread; - bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, - address_of_interpreter_state + - unwinder->debug_offsets.interpreter_state.threads_head, - sizeof(void*), - &address_of_thread); - if (bytes_read < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read thread head for running task"); - return -1; - } - - uintptr_t address_of_running_loop; - // No Python frames are available for us (can happen at tear-down). - if ((void*)address_of_thread == NULL) { - return 0; - } - - bytes_read = read_py_ptr( - unwinder, - address_of_thread - + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_loop, - &address_of_running_loop); - if (bytes_read == -1) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running loop address"); - return -1; - } - - // no asyncio loop is now running - if ((void*)address_of_running_loop == NULL) { - return 0; - } - - int err = read_ptr( - unwinder, - address_of_thread - + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_task, - running_task_addr); - if (err) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running task address"); - return -1; - } - - return 0; -} - -static int -find_running_task_and_coro( - RemoteUnwinderObject *unwinder, - uintptr_t *running_task_addr, - uintptr_t *running_coro_addr, - uintptr_t *running_task_code_obj -) { - *running_task_addr = (uintptr_t)NULL; - if (find_running_task( - unwinder, running_task_addr) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Running task search failed"); - return -1; - } - - if ((void*)*running_task_addr == NULL) { - PyErr_SetString(PyExc_RuntimeError, "No running task found"); - set_exception_cause(unwinder, PyExc_RuntimeError, "Running task address is NULL"); - return -1; - } - - if (read_py_ptr( - unwinder, - *running_task_addr + unwinder->async_debug_offsets.asyncio_task_object.task_coro, - running_coro_addr) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Running task coro read failed"); - return -1; - } - - if ((void*)*running_coro_addr == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Running task coro is NULL"); - set_exception_cause(unwinder, PyExc_RuntimeError, "Running task coro address is NULL"); - return -1; - } - - // note: genobject's gi_iframe is an embedded struct so the address to - // the offset leads directly to its first field: f_executable - if (read_py_ptr( - unwinder, - *running_coro_addr + unwinder->debug_offsets.gen_object.gi_iframe, - running_task_code_obj) < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running task code object"); - return -1; - } - - if ((void*)*running_task_code_obj == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Running task code object is NULL"); - set_exception_cause(unwinder, PyExc_RuntimeError, "Running task code object address is NULL"); - return -1; - } - - return 0; -} - - /* ============================================================================ * FRAME PARSING FUNCTIONS * ============================================================================ */ @@ -2126,9 +2162,11 @@ parse_frame_object( RemoteUnwinderObject *unwinder, PyObject** result, uintptr_t address, + uintptr_t* address_of_code_object, uintptr_t* previous_frame ) { char frame[SIZEOF_INTERP_FRAME]; + *address_of_code_object = 0; Py_ssize_t bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, @@ -2158,77 +2196,38 @@ parse_frame_object( } #endif - return parse_code_object(unwinder, result, code_object,instruction_pointer, previous_frame, tlbc_index); -} - -static int -parse_async_frame_object( - RemoteUnwinderObject *unwinder, - PyObject** result, - uintptr_t address, - uintptr_t* previous_frame, - uintptr_t* code_object -) { - char frame[SIZEOF_INTERP_FRAME]; - - Py_ssize_t bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, - address, - SIZEOF_INTERP_FRAME, - frame - ); - if (bytes_read < 0) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read async frame"); - return -1; - } - - *previous_frame = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.previous); - *code_object = GET_MEMBER_NO_TAG(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.executable); - int frame_valid = is_frame_valid(unwinder, (uintptr_t)frame, *code_object); - if (frame_valid != 1) { - return frame_valid; - } - - uintptr_t instruction_pointer = GET_MEMBER(uintptr_t, frame, unwinder->debug_offsets.interpreter_frame.instr_ptr); - - // Get tlbc_index for free threading builds - int32_t tlbc_index = 0; -#ifdef Py_GIL_DISABLED - if (unwinder->debug_offsets.interpreter_frame.tlbc_index != 0) { - tlbc_index = GET_MEMBER(int32_t, frame, unwinder->debug_offsets.interpreter_frame.tlbc_index); - } -#endif - - if (parse_code_object( - unwinder, result, *code_object, instruction_pointer, previous_frame, tlbc_index)) { - set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse code object in async frame"); - return -1; - } - - return 1; + *address_of_code_object = code_object; + return parse_code_object(unwinder, result, code_object, instruction_pointer, previous_frame, tlbc_index); } static int -parse_async_frame_chain( + parse_async_frame_chain( RemoteUnwinderObject *unwinder, PyObject *calls, + uintptr_t address_of_thread, uintptr_t running_task_code_obj ) { uintptr_t address_of_current_frame; - if (find_running_frame(unwinder, unwinder->runtime_start_address, &address_of_current_frame) < 0) { + if (find_running_frame(unwinder, address_of_thread, &address_of_current_frame) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Running frame search failed in async chain"); return -1; } - uintptr_t address_of_code_object; + PyObject *frames = PyList_New(0); + if (frames == NULL) { + set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create frames list"); + return -1; + } + while ((void*)address_of_current_frame != NULL) { PyObject* frame_info = NULL; - int res = parse_async_frame_object( + uintptr_t address_of_code_object; + int res = parse_frame_object( unwinder, &frame_info, address_of_current_frame, - &address_of_current_frame, - &address_of_code_object + &address_of_code_object, + &address_of_current_frame ); if (res < 0) { @@ -2294,7 +2293,7 @@ append_awaited_by_for_thread( uintptr_t task_addr = (uintptr_t)GET_MEMBER(uintptr_t, task_node, unwinder->debug_offsets.llist_node.next) - unwinder->async_debug_offsets.asyncio_task_object.task_node; - if (process_single_task_node(unwinder, task_addr, result) < 0) { + if (process_single_task_node(unwinder, task_addr, NULL, result) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to process task node in awaited_by"); return -1; } @@ -2389,7 +2388,8 @@ process_frame_chain( // Try chunks first, fallback to direct memory read if (parse_frame_from_chunks(unwinder, &frame, frame_addr, &next_frame_addr, chunks) < 0) { PyErr_Clear(); - if (parse_frame_object(unwinder, &frame, frame_addr, &next_frame_addr) < 0) { + uintptr_t address_of_code_object = 0; + if (parse_frame_object(unwinder, &frame, frame_addr, &address_of_code_object ,&next_frame_addr) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse frame object in chain"); return -1; } @@ -2830,53 +2830,12 @@ _remote_debugging_RemoteUnwinder_get_all_awaited_by_impl(RemoteUnwinderObject *s goto result_err; } - uintptr_t thread_state_addr; - unsigned long tid = 0; - if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( - &self->handle, - self->interpreter_addr - + self->debug_offsets.interpreter_state.threads_main, - sizeof(void*), - &thread_state_addr)) - { - set_exception_cause(self, PyExc_RuntimeError, "Failed to read main thread state in get_all_awaited_by"); + // Process all threads + if (iterate_threads(self, process_thread_for_awaited_by, result) < 0) { goto result_err; } - uintptr_t head_addr; - while (thread_state_addr != 0) { - if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( - &self->handle, - thread_state_addr - + self->debug_offsets.thread_state.native_thread_id, - sizeof(tid), - &tid)) - { - set_exception_cause(self, PyExc_RuntimeError, "Failed to read thread ID in get_all_awaited_by"); - goto result_err; - } - - head_addr = thread_state_addr - + self->async_debug_offsets.asyncio_thread_state.asyncio_tasks_head; - - if (append_awaited_by(self, tid, head_addr, result)) - { - set_exception_cause(self, PyExc_RuntimeError, "Failed to append awaited_by for thread in get_all_awaited_by"); - goto result_err; - } - - if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( - &self->handle, - thread_state_addr + self->debug_offsets.thread_state.next, - sizeof(void*), - &thread_state_addr)) - { - set_exception_cause(self, PyExc_RuntimeError, "Failed to read next thread state in get_all_awaited_by"); - goto result_err; - } - } - - head_addr = self->interpreter_addr + uintptr_t head_addr = self->interpreter_addr + self->async_debug_offsets.asyncio_interpreter_state.asyncio_tasks_head; // On top of a per-thread task lists used by default by asyncio to avoid @@ -2903,32 +2862,50 @@ _remote_debugging_RemoteUnwinder_get_all_awaited_by_impl(RemoteUnwinderObject *s @critical_section _remote_debugging.RemoteUnwinder.get_async_stack_trace -Returns information about the currently running async task and its stack trace. +Get the currently running async tasks and their dependency graphs from the remote process. -Returns a tuple of (task_info, stack_frames) where: -- task_info is a tuple of (task_id, task_name) identifying the task -- stack_frames is a list of tuples (function_name, filename, line_number) representing - the Python stack frames for the task, ordered from most recent to oldest +This returns information about running tasks and all tasks that are waiting for them, +forming a complete dependency graph for each thread's active task. -Example: - ((4345585712, 'Task-1'), [ - ('run_echo_server', 'server.py', 127), - ('serve_forever', 'server.py', 45), - ('main', 'app.py', 23) - ]) +For each thread with a running task, returns the running task plus all tasks that +transitively depend on it (tasks waiting for the running task, tasks waiting for +those tasks, etc.). + +Returns a list of per-thread results, where each thread result contains: +- Thread ID +- List of task information for the running task and all its waiters + +Each task info contains: +- Task ID (memory address) +- Task name +- Call stack frames: List of (func_name, filename, lineno) +- List of tasks waiting for this task (recursive structure) Raises: RuntimeError: If AsyncioDebug section is not available in the target process - RuntimeError: If there is an error copying memory from the target process - OSError: If there is an error accessing the target process - PermissionError: If access to the target process is denied - UnicodeDecodeError: If there is an error decoding strings from the target process + MemoryError: If memory allocation fails + OSError: If reading from the remote process fails + +Example output (similar structure to get_all_awaited_by but only for running tasks): +[ + # Thread 140234 results + (140234, [ + # Running task and its complete waiter dependency graph + (4345585712, 'main_task', + [("run_server", "server.py", 127), ("main", "app.py", 23)], + [ + # Tasks waiting for main_task + (4345585800, 'worker_1', [...], [...]), + (4345585900, 'worker_2', [...], [...]) + ]) + ]) +] [clinic start generated code]*/ static PyObject * _remote_debugging_RemoteUnwinder_get_async_stack_trace_impl(RemoteUnwinderObject *self) -/*[clinic end generated code: output=6433d52b55e87bbe input=11b7150c59d4c60f]*/ +/*[clinic end generated code: output=6433d52b55e87bbe input=8744b47c9ec2220a]*/ { if (!self->async_debug_offsets_available) { PyErr_SetString(PyExc_RuntimeError, "AsyncioDebug section not available"); @@ -2936,35 +2913,20 @@ _remote_debugging_RemoteUnwinder_get_async_stack_trace_impl(RemoteUnwinderObject return NULL; } - PyObject *result = NULL; - PyObject *calls = NULL; - - if (setup_async_result_structure(self, &result, &calls) < 0) { - set_exception_cause(self, PyExc_RuntimeError, "Failed to setup async result structure"); - goto cleanup; - } - - uintptr_t running_task_addr, running_coro_addr, running_task_code_obj; - if (find_running_task_and_coro(self, &running_task_addr, - &running_coro_addr, &running_task_code_obj) < 0) { - set_exception_cause(self, PyExc_RuntimeError, "Failed to find running task and coro"); - goto cleanup; - } - - if (parse_async_frame_chain(self, calls, running_task_code_obj) < 0) { - set_exception_cause(self, PyExc_RuntimeError, "Failed to parse async frame chain"); - goto cleanup; + PyObject *result = PyList_New(0); + if (result == NULL) { + set_exception_cause(self, PyExc_MemoryError, "Failed to create result list in get_async_stack_trace"); + return NULL; } - if (add_task_info_to_result(self, result, running_task_addr) < 0) { - set_exception_cause(self, PyExc_RuntimeError, "Failed to add task info to result"); - goto cleanup; + // Process all threads + if (iterate_threads(self, process_thread_for_async_stack_trace, result) < 0) { + goto result_err; } _Py_RemoteDebug_ClearCache(&self->handle); return result; - -cleanup: +result_err: _Py_RemoteDebug_ClearCache(&self->handle); Py_XDECREF(result); return NULL; diff --git a/Modules/clinic/_remote_debugging_module.c.h b/Modules/clinic/_remote_debugging_module.c.h index e80b24b54c0ffa..f6a51cdba6b401 100644 --- a/Modules/clinic/_remote_debugging_module.c.h +++ b/Modules/clinic/_remote_debugging_module.c.h @@ -235,26 +235,41 @@ PyDoc_STRVAR(_remote_debugging_RemoteUnwinder_get_async_stack_trace__doc__, "get_async_stack_trace($self, /)\n" "--\n" "\n" -"Returns information about the currently running async task and its stack trace.\n" +"Get the currently running async tasks and their dependency graphs from the remote process.\n" "\n" -"Returns a tuple of (task_info, stack_frames) where:\n" -"- task_info is a tuple of (task_id, task_name) identifying the task\n" -"- stack_frames is a list of tuples (function_name, filename, line_number) representing\n" -" the Python stack frames for the task, ordered from most recent to oldest\n" +"This returns information about running tasks and all tasks that are waiting for them,\n" +"forming a complete dependency graph for each thread\'s active task.\n" "\n" -"Example:\n" -" ((4345585712, \'Task-1\'), [\n" -" (\'run_echo_server\', \'server.py\', 127),\n" -" (\'serve_forever\', \'server.py\', 45),\n" -" (\'main\', \'app.py\', 23)\n" -" ])\n" +"For each thread with a running task, returns the running task plus all tasks that\n" +"transitively depend on it (tasks waiting for the running task, tasks waiting for\n" +"those tasks, etc.).\n" +"\n" +"Returns a list of per-thread results, where each thread result contains:\n" +"- Thread ID\n" +"- List of task information for the running task and all its waiters\n" +"\n" +"Each task info contains:\n" +"- Task ID (memory address)\n" +"- Task name\n" +"- Call stack frames: List of (func_name, filename, lineno)\n" +"- List of tasks waiting for this task (recursive structure)\n" "\n" "Raises:\n" " RuntimeError: If AsyncioDebug section is not available in the target process\n" -" RuntimeError: If there is an error copying memory from the target process\n" -" OSError: If there is an error accessing the target process\n" -" PermissionError: If access to the target process is denied\n" -" UnicodeDecodeError: If there is an error decoding strings from the target process"); +" MemoryError: If memory allocation fails\n" +" OSError: If reading from the remote process fails\n" +"\n" +"Example output (similar structure to get_all_awaited_by but only for running tasks):\n" +"[\n" +" (140234, [\n" +" (4345585712, \'main_task\',\n" +" [(\"run_server\", \"server.py\", 127), (\"main\", \"app.py\", 23)],\n" +" [\n" +" (4345585800, \'worker_1\', [...], [...]),\n" +" (4345585900, \'worker_2\', [...], [...])\n" +" ])\n" +" ])\n" +"]"); #define _REMOTE_DEBUGGING_REMOTEUNWINDER_GET_ASYNC_STACK_TRACE_METHODDEF \ {"get_async_stack_trace", (PyCFunction)_remote_debugging_RemoteUnwinder_get_async_stack_trace, METH_NOARGS, _remote_debugging_RemoteUnwinder_get_async_stack_trace__doc__}, @@ -273,4 +288,4 @@ _remote_debugging_RemoteUnwinder_get_async_stack_trace(PyObject *self, PyObject return return_value; } -/*[clinic end generated code: output=a37ab223d5081b16 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0dd1e6e8bab2a8b1 input=a9049054013a1b77]*/ From 7937f16adeac8efb9ce3e63e35537da6c94f67c1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 02:51:09 +0200 Subject: [PATCH 0606/1674] [3.14] gh-135846: Add zstd dependency to Android build script (GH-136253) (#136491) Adds zstd to the Android build process. (cherry picked from commit 61dd9fdad729fe02d91c03804659f7d0c5a89276) Co-authored-by: Emma Smith Co-authored-by: Malcolm Smith --- Android/android.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Android/android.py b/Android/android.py index 551168fc4b2f5a..a3a48c0c6b7027 100755 --- a/Android/android.py +++ b/Android/android.py @@ -175,7 +175,7 @@ def unpack_deps(host, prefix_dir): os.chdir(prefix_dir) deps_url = "https://github.com/beeware/cpython-android-source-deps/releases/download" for name_ver in ["bzip2-1.0.8-3", "libffi-3.4.4-3", "openssl-3.0.15-4", - "sqlite-3.49.1-0", "xz-5.4.6-1"]: + "sqlite-3.49.1-0", "xz-5.4.6-1", "zstd-1.5.7-1"]: filename = f"{name_ver}-{host}.tar.gz" download(f"{deps_url}/{name_ver}/{filename}") shutil.unpack_archive(filename) From 78804219832a3965784093c76132beeadc762dc0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 10:36:48 +0200 Subject: [PATCH 0607/1674] [3.14] gh-136476: Remove creation of unused list (GH-136494) (GH-136495) (cherry picked from commit b44316a0976fb3fcd50bae9d67b0810ee0252d93) Co-authored-by: Petr Viktorin --- Modules/_remote_debugging_module.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index 0dc797a9da82a0..a2619de0510b59 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -2213,12 +2213,6 @@ static int return -1; } - PyObject *frames = PyList_New(0); - if (frames == NULL) { - set_exception_cause(unwinder, PyExc_MemoryError, "Failed to create frames list"); - return -1; - } - while ((void*)address_of_current_frame != NULL) { PyObject* frame_info = NULL; uintptr_t address_of_code_object; From 2de82bcc62ddcaae7af0f53f59cb019a791a61d3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:30:07 +0200 Subject: [PATCH 0608/1674] [3.14] gh-136438: Make sure `test_builtins` pass with all optimization levels (GH-136474) (#136496) gh-136438: Make sure `test_builtins` pass with all optimization levels (GH-136474) (cherry picked from commit c17654334946b232aa296696cf70ec93a09d8156) Co-authored-by: sobolevn --- Lib/test/test_builtin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 14fe3355239615..8830641f0abdc7 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -436,7 +436,7 @@ def f(): """doc""" # test both direct compilation and compilation via AST codeobjs = [] codeobjs.append(compile(codestr, "", "exec", optimize=optval)) - tree = ast.parse(codestr) + tree = ast.parse(codestr, optimize=optval) codeobjs.append(compile(tree, "", "exec", optimize=optval)) for code in codeobjs: ns = {} @@ -624,7 +624,7 @@ def test_compile_ast(self): for opt in [opt1, opt2]: opt_right = opt.value.right self.assertIsInstance(opt_right, ast.Constant) - self.assertEqual(opt_right.value, True) + self.assertEqual(opt_right.value, __debug__) def test_delattr(self): sys.spam = 1 From 1346049782daca649a0e6f6993e085c7a6637772 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:10:43 +0200 Subject: [PATCH 0609/1674] [3.14] gh-136209: Add .. c:var:: declarations for C exception types (GH-136210) (GH-136504) (cherry picked from commit 85bc89f35f40c844df74d913fd32b2b1475fc942) Co-authored-by: Petr Viktorin Co-authored-by: Victor Stinner --- Doc/c-api/exceptions.rst | 438 +++++++++++++++++---------------------- Doc/conf.py | 69 ------ 2 files changed, 187 insertions(+), 320 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index a750cda3e2d474..3ff4631a8e53c4 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -982,184 +982,135 @@ these are the C equivalent to :func:`reprlib.recursive_repr`. .. _standardexceptions: -Standard Exceptions -=================== - -All standard Python exceptions are available as global variables whose names are -``PyExc_`` followed by the Python exception name. These have the type -:c:expr:`PyObject*`; they are all class objects. For completeness, here are all -the variables: - -.. index:: - single: PyExc_BaseException (C var) - single: PyExc_BaseExceptionGroup (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 | -+=========================================+=================================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | [1]_ | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_BaseExceptionGroup` | :exc:`BaseExceptionGroup` | [1]_ | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | [1]_ | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | [1]_ | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_BlockingIOError` | :exc:`BlockingIOError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_BrokenPipeError` | :exc:`BrokenPipeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_BufferError` | :exc:`BufferError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ConnectionAbortedError` | :exc:`ConnectionAbortedError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ConnectionRefusedError` | :exc:`ConnectionRefusedError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ConnectionResetError` | :exc:`ConnectionResetError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_FileExistsError` | :exc:`FileExistsError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_FileNotFoundError` | :exc:`FileNotFoundError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_GeneratorExit` | :exc:`GeneratorExit` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ImportError` | :exc:`ImportError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_IndentationError` | :exc:`IndentationError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_IndexError` | :exc:`IndexError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_InterruptedError` | :exc:`InterruptedError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_IsADirectoryError` | :exc:`IsADirectoryError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_KeyError` | :exc:`KeyError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | [1]_ | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ModuleNotFoundError` | :exc:`ModuleNotFoundError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_NameError` | :exc:`NameError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_NotADirectoryError` | :exc:`NotADirectoryError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | [1]_ | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_PermissionError` | :exc:`PermissionError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ProcessLookupError` | :exc:`ProcessLookupError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_PythonFinalizationError` | :exc:`PythonFinalizationError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_StopAsyncIteration` | :exc:`StopAsyncIteration` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_StopIteration` | :exc:`StopIteration` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_SystemError` | :exc:`SystemError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_TabError` | :exc:`TabError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_TypeError` | :exc:`TypeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UnboundLocalError` | :exc:`UnboundLocalError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UnicodeDecodeError` | :exc:`UnicodeDecodeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UnicodeEncodeError` | :exc:`UnicodeEncodeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UnicodeError` | :exc:`UnicodeError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UnicodeTranslateError` | :exc:`UnicodeTranslateError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ValueError` | :exc:`ValueError` | | -+-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | | -+-----------------------------------------+---------------------------------+----------+ +Exception and warning types +=========================== + +All standard Python exceptions and warning categories are available as global +variables whose names are ``PyExc_`` followed by the Python exception name. +These have the type :c:expr:`PyObject*`; they are all class objects. + +For completeness, here are all the variables: + +Exception types +--------------- + +.. list-table:: + :align: left + :widths: auto + :header-rows: 1 + + * * C name + * Python name + * * .. c:var:: PyObject *PyExc_BaseException + * :exc:`BaseException` + * * .. c:var:: PyObject *PyExc_BaseExceptionGroup + * :exc:`BaseExceptionGroup` + * * .. c:var:: PyObject *PyExc_Exception + * :exc:`Exception` + * * .. c:var:: PyObject *PyExc_ArithmeticError + * :exc:`ArithmeticError` + * * .. c:var:: PyObject *PyExc_AssertionError + * :exc:`AssertionError` + * * .. c:var:: PyObject *PyExc_AttributeError + * :exc:`AttributeError` + * * .. c:var:: PyObject *PyExc_BlockingIOError + * :exc:`BlockingIOError` + * * .. c:var:: PyObject *PyExc_BrokenPipeError + * :exc:`BrokenPipeError` + * * .. c:var:: PyObject *PyExc_BufferError + * :exc:`BufferError` + * * .. c:var:: PyObject *PyExc_ChildProcessError + * :exc:`ChildProcessError` + * * .. c:var:: PyObject *PyExc_ConnectionAbortedError + * :exc:`ConnectionAbortedError` + * * .. c:var:: PyObject *PyExc_ConnectionError + * :exc:`ConnectionError` + * * .. c:var:: PyObject *PyExc_ConnectionRefusedError + * :exc:`ConnectionRefusedError` + * * .. c:var:: PyObject *PyExc_ConnectionResetError + * :exc:`ConnectionResetError` + * * .. c:var:: PyObject *PyExc_EOFError + * :exc:`EOFError` + * * .. c:var:: PyObject *PyExc_FileExistsError + * :exc:`FileExistsError` + * * .. c:var:: PyObject *PyExc_FileNotFoundError + * :exc:`FileNotFoundError` + * * .. c:var:: PyObject *PyExc_FloatingPointError + * :exc:`FloatingPointError` + * * .. c:var:: PyObject *PyExc_GeneratorExit + * :exc:`GeneratorExit` + * * .. c:var:: PyObject *PyExc_ImportError + * :exc:`ImportError` + * * .. c:var:: PyObject *PyExc_IndentationError + * :exc:`IndentationError` + * * .. c:var:: PyObject *PyExc_IndexError + * :exc:`IndexError` + * * .. c:var:: PyObject *PyExc_InterruptedError + * :exc:`InterruptedError` + * * .. c:var:: PyObject *PyExc_IsADirectoryError + * :exc:`IsADirectoryError` + * * .. c:var:: PyObject *PyExc_KeyError + * :exc:`KeyError` + * * .. c:var:: PyObject *PyExc_KeyboardInterrupt + * :exc:`KeyboardInterrupt` + * * .. c:var:: PyObject *PyExc_LookupError + * :exc:`LookupError` + * * .. c:var:: PyObject *PyExc_MemoryError + * :exc:`MemoryError` + * * .. c:var:: PyObject *PyExc_ModuleNotFoundError + * :exc:`ModuleNotFoundError` + * * .. c:var:: PyObject *PyExc_NameError + * :exc:`NameError` + * * .. c:var:: PyObject *PyExc_NotADirectoryError + * :exc:`NotADirectoryError` + * * .. c:var:: PyObject *PyExc_NotImplementedError + * :exc:`NotImplementedError` + * * .. c:var:: PyObject *PyExc_OSError + * :exc:`OSError` + * * .. c:var:: PyObject *PyExc_OverflowError + * :exc:`OverflowError` + * * .. c:var:: PyObject *PyExc_PermissionError + * :exc:`PermissionError` + * * .. c:var:: PyObject *PyExc_ProcessLookupError + * :exc:`ProcessLookupError` + * * .. c:var:: PyObject *PyExc_PythonFinalizationError + * :exc:`PythonFinalizationError` + * * .. c:var:: PyObject *PyExc_RecursionError + * :exc:`RecursionError` + * * .. c:var:: PyObject *PyExc_ReferenceError + * :exc:`ReferenceError` + * * .. c:var:: PyObject *PyExc_RuntimeError + * :exc:`RuntimeError` + * * .. c:var:: PyObject *PyExc_StopAsyncIteration + * :exc:`StopAsyncIteration` + * * .. c:var:: PyObject *PyExc_StopIteration + * :exc:`StopIteration` + * * .. c:var:: PyObject *PyExc_SyntaxError + * :exc:`SyntaxError` + * * .. c:var:: PyObject *PyExc_SystemError + * :exc:`SystemError` + * * .. c:var:: PyObject *PyExc_SystemExit + * :exc:`SystemExit` + * * .. c:var:: PyObject *PyExc_TabError + * :exc:`TabError` + * * .. c:var:: PyObject *PyExc_TimeoutError + * :exc:`TimeoutError` + * * .. c:var:: PyObject *PyExc_TypeError + * :exc:`TypeError` + * * .. c:var:: PyObject *PyExc_UnboundLocalError + * :exc:`UnboundLocalError` + * * .. c:var:: PyObject *PyExc_UnicodeDecodeError + * :exc:`UnicodeDecodeError` + * * .. c:var:: PyObject *PyExc_UnicodeEncodeError + * :exc:`UnicodeEncodeError` + * * .. c:var:: PyObject *PyExc_UnicodeError + * :exc:`UnicodeError` + * * .. c:var:: PyObject *PyExc_UnicodeTranslateError + * :exc:`UnicodeTranslateError` + * * .. c:var:: PyObject *PyExc_ValueError + * :exc:`ValueError` + * * .. c:var:: PyObject *PyExc_ZeroDivisionError + * :exc:`ZeroDivisionError` .. versionadded:: 3.3 :c:data:`PyExc_BlockingIOError`, :c:data:`PyExc_BrokenPipeError`, @@ -1180,94 +1131,79 @@ the variables: .. versionadded:: 3.11 :c:data:`PyExc_BaseExceptionGroup`. -These are compatibility aliases to :c:data:`PyExc_OSError`: -.. index:: - single: PyExc_EnvironmentError (C var) - single: PyExc_IOError (C var) - single: PyExc_WindowsError (C var) +OSError aliases +--------------- -+-------------------------------------+----------+ -| C Name | Notes | -+=====================================+==========+ -| :c:data:`!PyExc_EnvironmentError` | | -+-------------------------------------+----------+ -| :c:data:`!PyExc_IOError` | | -+-------------------------------------+----------+ -| :c:data:`!PyExc_WindowsError` | [2]_ | -+-------------------------------------+----------+ +The following are a compatibility aliases to :c:data:`PyExc_OSError`. .. versionchanged:: 3.3 These aliases used to be separate exception types. +.. list-table:: + :align: left + :widths: auto + :header-rows: 1 + + * * C name + * Python name + * Notes + * * .. c:var:: PyObject *PyExc_EnvironmentError + * :exc:`OSError` + * + * * .. c:var:: PyObject *PyExc_IOError + * :exc:`OSError` + * + * * .. c:var:: PyObject *PyExc_WindowsError + * :exc:`OSError` + * [win]_ + Notes: -.. [1] - This is a base class for other standard exceptions. +.. [win] + :c:var:`!PyExc_WindowsError` is only defined on Windows; protect code that + uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. -.. [2] - Only defined on Windows; protect code that uses this by testing that the - preprocessor macro ``MS_WINDOWS`` is defined. .. _standardwarningcategories: -Standard Warning Categories -=========================== - -All standard Python warning categories are available as global variables whose -names are ``PyExc_`` followed by the Python exception name. These have the type -:c:expr:`PyObject*`; they are all class objects. For completeness, here are all -the variables: - -.. index:: - single: PyExc_Warning (C var) - single: PyExc_BytesWarning (C var) - single: PyExc_DeprecationWarning (C var) - single: PyExc_EncodingWarning (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 | -+==========================================+=================================+==========+ -| :c:data:`PyExc_Warning` | :exc:`Warning` | [3]_ | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_DeprecationWarning` | :exc:`DeprecationWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_EncodingWarning` | :exc:`EncodingWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_FutureWarning` | :exc:`FutureWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ImportWarning` | :exc:`ImportWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_PendingDeprecationWarning`| :exc:`PendingDeprecationWarning`| | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ResourceWarning` | :exc:`ResourceWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_RuntimeWarning` | :exc:`RuntimeWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_SyntaxWarning` | :exc:`SyntaxWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UnicodeWarning` | :exc:`UnicodeWarning` | | -+------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_UserWarning` | :exc:`UserWarning` | | -+------------------------------------------+---------------------------------+----------+ +Warning types +------------- + +.. list-table:: + :align: left + :widths: auto + :header-rows: 1 + + * * C name + * Python name + * * .. c:var:: PyObject *PyExc_Warning + * :exc:`Warning` + * * .. c:var:: PyObject *PyExc_BytesWarning + * :exc:`BytesWarning` + * * .. c:var:: PyObject *PyExc_DeprecationWarning + * :exc:`DeprecationWarning` + * * .. c:var:: PyObject *PyExc_EncodingWarning + * :exc:`EncodingWarning` + * * .. c:var:: PyObject *PyExc_FutureWarning + * :exc:`FutureWarning` + * * .. c:var:: PyObject *PyExc_ImportWarning + * :exc:`ImportWarning` + * * .. c:var:: PyObject *PyExc_PendingDeprecationWarning + * :exc:`PendingDeprecationWarning` + * * .. c:var:: PyObject *PyExc_ResourceWarning + * :exc:`ResourceWarning` + * * .. c:var:: PyObject *PyExc_RuntimeWarning + * :exc:`RuntimeWarning` + * * .. c:var:: PyObject *PyExc_SyntaxWarning + * :exc:`SyntaxWarning` + * * .. c:var:: PyObject *PyExc_UnicodeWarning + * :exc:`UnicodeWarning` + * * .. c:var:: PyObject *PyExc_UserWarning + * :exc:`UserWarning` .. versionadded:: 3.2 :c:data:`PyExc_ResourceWarning`. .. versionadded:: 3.10 :c:data:`PyExc_EncodingWarning`. - -Notes: - -.. [3] - This is a base class for other standard warning categories. diff --git a/Doc/conf.py b/Doc/conf.py index 8b2a8f20fcc558..c1ed94d7b46ec2 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -233,75 +233,6 @@ # Temporary undocumented names. # In future this list must be empty. nitpick_ignore += [ - # C API: Standard Python exception classes - ('c:data', 'PyExc_ArithmeticError'), - ('c:data', 'PyExc_AssertionError'), - ('c:data', 'PyExc_AttributeError'), - ('c:data', 'PyExc_BaseException'), - ('c:data', 'PyExc_BaseExceptionGroup'), - ('c:data', 'PyExc_BlockingIOError'), - ('c:data', 'PyExc_BrokenPipeError'), - ('c:data', 'PyExc_BufferError'), - ('c:data', 'PyExc_ChildProcessError'), - ('c:data', 'PyExc_ConnectionAbortedError'), - ('c:data', 'PyExc_ConnectionError'), - ('c:data', 'PyExc_ConnectionRefusedError'), - ('c:data', 'PyExc_ConnectionResetError'), - ('c:data', 'PyExc_EOFError'), - ('c:data', 'PyExc_Exception'), - ('c:data', 'PyExc_FileExistsError'), - ('c:data', 'PyExc_FileNotFoundError'), - ('c:data', 'PyExc_FloatingPointError'), - ('c:data', 'PyExc_GeneratorExit'), - ('c:data', 'PyExc_ImportError'), - ('c:data', 'PyExc_IndentationError'), - ('c:data', 'PyExc_IndexError'), - ('c:data', 'PyExc_InterruptedError'), - ('c:data', 'PyExc_IsADirectoryError'), - ('c:data', 'PyExc_KeyboardInterrupt'), - ('c:data', 'PyExc_KeyError'), - ('c:data', 'PyExc_LookupError'), - ('c:data', 'PyExc_MemoryError'), - ('c:data', 'PyExc_ModuleNotFoundError'), - ('c:data', 'PyExc_NameError'), - ('c:data', 'PyExc_NotADirectoryError'), - ('c:data', 'PyExc_NotImplementedError'), - ('c:data', 'PyExc_OSError'), - ('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'), - ('c:data', 'PyExc_StopAsyncIteration'), - ('c:data', 'PyExc_StopIteration'), - ('c:data', 'PyExc_SyntaxError'), - ('c:data', 'PyExc_SystemError'), - ('c:data', 'PyExc_SystemExit'), - ('c:data', 'PyExc_TabError'), - ('c:data', 'PyExc_TimeoutError'), - ('c:data', 'PyExc_TypeError'), - ('c:data', 'PyExc_UnboundLocalError'), - ('c:data', 'PyExc_UnicodeDecodeError'), - ('c:data', 'PyExc_UnicodeEncodeError'), - ('c:data', 'PyExc_UnicodeError'), - ('c:data', 'PyExc_UnicodeTranslateError'), - ('c:data', 'PyExc_ValueError'), - ('c:data', 'PyExc_ZeroDivisionError'), - # C API: Standard Python warning classes - ('c:data', 'PyExc_BytesWarning'), - ('c:data', 'PyExc_DeprecationWarning'), - ('c:data', 'PyExc_EncodingWarning'), - ('c:data', 'PyExc_FutureWarning'), - ('c:data', 'PyExc_ImportWarning'), - ('c:data', 'PyExc_PendingDeprecationWarning'), - ('c:data', 'PyExc_ResourceWarning'), - ('c:data', 'PyExc_RuntimeWarning'), - ('c:data', 'PyExc_SyntaxWarning'), - ('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'), From da8bcfd949885a9a057038ef0095f442b05ee29a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:13:34 +0200 Subject: [PATCH 0610/1674] [3.14] gh-136394: Fix race condition in test_zstd (GH-136432) (GH-136506) gh-136394: Fix race condition in test_zstd (GH-136432) (cherry picked from commit f519918ec6c125715d4efc9713ba80e83346e466) Co-authored-by: Rogdham <3994389+Rogdham@users.noreply.github.com> --- Lib/test/test_zstd.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_zstd.py b/Lib/test/test_zstd.py index e83caaf4c07b13..cf618534add387 100644 --- a/Lib/test/test_zstd.py +++ b/Lib/test/test_zstd.py @@ -2674,8 +2674,12 @@ def test_compress_locking(self): input = b'a'* (16*_1K) num_threads = 8 + # gh-136394: the first output of .compress() includes the frame header + # we run the first .compress() call outside of the threaded portion + # to make the test order-independent + comp = ZstdCompressor() - parts = [] + parts = [comp.compress(input, ZstdCompressor.FLUSH_BLOCK)] for _ in range(num_threads): res = comp.compress(input, ZstdCompressor.FLUSH_BLOCK) if res: @@ -2684,7 +2688,7 @@ def test_compress_locking(self): expected = b''.join(parts) + rest1 comp = ZstdCompressor() - output = [] + output = [comp.compress(input, ZstdCompressor.FLUSH_BLOCK)] def run_method(method, input_data, output_data): res = method(input_data, ZstdCompressor.FLUSH_BLOCK) if res: From 95baa28d9ffaf388fd426ef4474960ccb73c81cf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 16:52:18 +0200 Subject: [PATCH 0611/1674] [3.14] gh-132661: Add default value (of `""`) for `Interpolation.expression` (GH-136441) (#136511) Co-authored-by: Dave Peck --- Lib/test/test_string/_support.py | 44 ++++++++++++------- Lib/test/test_string/test_templatelib.py | 13 ++++++ ...-07-08-23-53-51.gh-issue-132661.B84iYt.rst | 1 + Objects/clinic/interpolationobject.c.h | 23 ++++++---- Objects/interpolationobject.c | 4 +- 5 files changed, 58 insertions(+), 27 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst diff --git a/Lib/test/test_string/_support.py b/Lib/test/test_string/_support.py index eaa3354a559246..cfead782b7d4c1 100644 --- a/Lib/test/test_string/_support.py +++ b/Lib/test/test_string/_support.py @@ -3,33 +3,45 @@ class TStringBaseCase: + def assertInterpolationEqual(self, i, exp): + """Test Interpolation equality. + + The *i* argument must be an Interpolation instance. + + The *exp* argument must be a tuple of the form + (value, expression, conversion, format_spec) where the final three + items may be omitted and are assumed to be '', None and '' respectively. + """ + if len(exp) == 4: + actual = (i.value, i.expression, i.conversion, i.format_spec) + self.assertEqual(actual, exp) + elif len(exp) == 3: + self.assertEqual((i.value, i.expression, i.conversion), exp) + self.assertEqual(i.format_spec, "") + elif len(exp) == 2: + self.assertEqual((i.value, i.expression), exp) + self.assertEqual(i.conversion, None) + self.assertEqual(i.format_spec, "") + elif len(exp) == 1: + self.assertEqual((i.value,), exp) + self.assertEqual(i.expression, "") + self.assertEqual(i.conversion, None) + self.assertEqual(i.format_spec, "") + def assertTStringEqual(self, t, strings, interpolations): """Test template string literal equality. The *strings* argument must be a tuple of strings equal to *t.strings*. The *interpolations* argument must be a sequence of tuples which are - compared against *t.interpolations*. Each tuple consists of - (value, expression, conversion, format_spec), though the final two - items may be omitted, and are assumed to be None and '' respectively. + compared against *t.interpolations*. Each tuple must match the form + described in the `assertInterpolationEqual` method. """ self.assertEqual(t.strings, strings) self.assertEqual(len(t.interpolations), len(interpolations)) for i, exp in zip(t.interpolations, interpolations, strict=True): - if len(exp) == 4: - actual = (i.value, i.expression, i.conversion, i.format_spec) - self.assertEqual(actual, exp) - continue - - if len(exp) == 3: - self.assertEqual((i.value, i.expression, i.conversion), exp) - self.assertEqual(i.format_spec, '') - continue - - self.assertEqual((i.value, i.expression), exp) - self.assertEqual(i.format_spec, '') - self.assertIsNone(i.conversion) + self.assertInterpolationEqual(i, exp) def convert(value, conversion): diff --git a/Lib/test/test_string/test_templatelib.py b/Lib/test/test_string/test_templatelib.py index 85fcff486d6616..adaf590e64dad6 100644 --- a/Lib/test/test_string/test_templatelib.py +++ b/Lib/test/test_string/test_templatelib.py @@ -45,6 +45,19 @@ def test_basic_creation(self): self.assertEqual(len(t.interpolations), 0) self.assertEqual(fstring(t), 'Hello,\nworld') + def test_interpolation_creation(self): + i = Interpolation('Maria', 'name', 'a', 'fmt') + self.assertInterpolationEqual(i, ('Maria', 'name', 'a', 'fmt')) + + i = Interpolation('Maria', 'name', 'a') + self.assertInterpolationEqual(i, ('Maria', 'name', 'a')) + + i = Interpolation('Maria', 'name') + self.assertInterpolationEqual(i, ('Maria', 'name')) + + i = Interpolation('Maria') + self.assertInterpolationEqual(i, ('Maria',)) + def test_creation_interleaving(self): # Should add strings on either side t = Template(Interpolation('Maria', 'name', None, '')) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst new file mode 100644 index 00000000000000..9930413b53c150 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst @@ -0,0 +1 @@ +``Interpolation.expression`` now has a default, the empty string. diff --git a/Objects/clinic/interpolationobject.c.h b/Objects/clinic/interpolationobject.c.h index 7a94dabafc92f2..2030e17e49e47a 100644 --- a/Objects/clinic/interpolationobject.c.h +++ b/Objects/clinic/interpolationobject.c.h @@ -47,26 +47,31 @@ interpolation_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject *argsbuf[4]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); - Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 2; + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; PyObject *value; - PyObject *expression; + PyObject *expression = &_Py_STR(empty); PyObject *conversion = Py_None; PyObject *format_spec = &_Py_STR(empty); fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, - /*minpos*/ 2, /*maxpos*/ 4, /*minkw*/ 0, /*varpos*/ 0, argsbuf); + /*minpos*/ 1, /*maxpos*/ 4, /*minkw*/ 0, /*varpos*/ 0, argsbuf); if (!fastargs) { goto exit; } value = fastargs[0]; - if (!PyUnicode_Check(fastargs[1])) { - _PyArg_BadArgument("Interpolation", "argument 'expression'", "str", fastargs[1]); - goto exit; - } - expression = fastargs[1]; if (!noptargs) { goto skip_optional_pos; } + if (fastargs[1]) { + if (!PyUnicode_Check(fastargs[1])) { + _PyArg_BadArgument("Interpolation", "argument 'expression'", "str", fastargs[1]); + goto exit; + } + expression = fastargs[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } if (fastargs[2]) { if (!_conversion_converter(fastargs[2], &conversion)) { goto exit; @@ -86,4 +91,4 @@ interpolation_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=599742a5ccd6f060 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2391391e2d7708c0 input=a9049054013a1b77]*/ diff --git a/Objects/interpolationobject.c b/Objects/interpolationobject.c index a5d407a7b0e296..b58adb693f0cae 100644 --- a/Objects/interpolationobject.c +++ b/Objects/interpolationobject.c @@ -54,7 +54,7 @@ typedef struct { Interpolation.__new__ as interpolation_new value: object - expression: object(subclass_of='&PyUnicode_Type') + expression: object(subclass_of='&PyUnicode_Type', c_default='&_Py_STR(empty)') = "" conversion: object(converter='_conversion_converter') = None format_spec: object(subclass_of='&PyUnicode_Type', c_default='&_Py_STR(empty)') = "" [clinic start generated code]*/ @@ -63,7 +63,7 @@ static PyObject * interpolation_new_impl(PyTypeObject *type, PyObject *value, PyObject *expression, PyObject *conversion, PyObject *format_spec) -/*[clinic end generated code: output=6488e288765bc1a9 input=d91711024068528c]*/ +/*[clinic end generated code: output=6488e288765bc1a9 input=fc5c285c1dd23d36]*/ { interpolationobject *self = PyObject_GC_New(interpolationobject, type); if (!self) { From 326fe0df66afbe94475e5609adeb1ea7a4956899 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:41:31 +0200 Subject: [PATCH 0612/1674] [3.14] gh-82663: Clarify `codecs.iterdecode/encode` docs (GH-136497) (#136513) gh-82663: Clarify `codecs.iterdecode/encode` docs (GH-136497) Closes GH-82663 (cherry picked from commit 4b41b2043b110a38616ff86ddb3f065ae7f15c3e) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 0e84f18dd4d5d5..37bd913b765d21 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -243,8 +243,8 @@ wider range of codecs when working with binary files: .. function:: iterencode(iterator, encoding, errors='strict', **kwargs) Uses an incremental encoder to iteratively encode the input provided by - *iterator*. This function is a :term:`generator`. - The *errors* argument (as well as any + *iterator*. *iterator* must yield :class:`str` objects. + This function is a :term:`generator`. The *errors* argument (as well as any other keyword argument) is passed through to the incremental encoder. This function requires that the codec accept text :class:`str` objects @@ -255,8 +255,8 @@ wider range of codecs when working with binary files: .. function:: iterdecode(iterator, encoding, errors='strict', **kwargs) Uses an incremental decoder to iteratively decode the input provided by - *iterator*. This function is a :term:`generator`. - The *errors* argument (as well as any + *iterator*. *iterator* must yield :class:`bytes` objects. + This function is a :term:`generator`. The *errors* argument (as well as any other keyword argument) is passed through to the incremental decoder. This function requires that the codec accept :class:`bytes` objects From 183b020cb5960e17b87c34a98ec02fcf2b840578 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 10 Jul 2025 18:09:45 +0200 Subject: [PATCH 0613/1674] [3.14] gh-52876: Implement missing parameter in `codecs.StreamReaderWriter` functions (GH-136498) (#136514) gh-52876: Implement missing parameter in `codecs.StreamReaderWriter` functions (GH-136498) Closes GH-52876 (cherry picked from commit 35e2c359703e076256c1249b74b87043972e04d6) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/codecs.py | 10 +++++----- .../2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst diff --git a/Lib/codecs.py b/Lib/codecs.py index fc38e922257644..e4a8010aba90a5 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -618,7 +618,7 @@ def readlines(self, sizehint=None, keepends=True): method and are included in the list entries. sizehint, if given, is ignored since there is no efficient - way to finding the true end-of-line. + way of finding the true end-of-line. """ data = self.read() @@ -709,13 +709,13 @@ def read(self, size=-1): return self.reader.read(size) - def readline(self, size=None): + def readline(self, size=None, keepends=True): - return self.reader.readline(size) + return self.reader.readline(size, keepends) - def readlines(self, sizehint=None): + def readlines(self, sizehint=None, keepends=True): - return self.reader.readlines(sizehint) + return self.reader.readlines(sizehint, keepends) def __next__(self): diff --git a/Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst b/Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst new file mode 100644 index 00000000000000..a835306868d3dc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst @@ -0,0 +1,3 @@ +Add missing ``keepends`` (default ``True``) parameter to +:meth:`!codecs.StreamReaderWriter.readline` and +:meth:`!codecs.StreamReaderWriter.readlines`. From ec15251af5c937516e4da1f56714c009997c8d5e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 11:43:52 +0200 Subject: [PATCH 0614/1674] [3.14] gh-101100: Fix sphinx warnings in `library/email.parser.rst` (GH-136475) (#136532) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/email.parser.rst | 10 +++++----- Doc/tools/.nitignore | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/library/email.parser.rst b/Doc/library/email.parser.rst index 439b5c8f34b65a..90796370ebb407 100644 --- a/Doc/library/email.parser.rst +++ b/Doc/library/email.parser.rst @@ -48,8 +48,8 @@ methods. FeedParser API ^^^^^^^^^^^^^^ -The :class:`BytesFeedParser`, imported from the :mod:`email.feedparser` module, -provides an API that is conducive to incremental parsing of email messages, +The :class:`BytesFeedParser`, imported from the :mod:`email.parser.FeedParser` +module, provides an API that is conducive to incremental parsing of email messages, such as would be necessary when reading the text of an email message from a source that can block (such as a socket). The :class:`BytesFeedParser` can of course be used to parse an email message fully contained in a :term:`bytes-like @@ -116,7 +116,7 @@ Here is the API for the :class:`BytesFeedParser`: Works like :class:`BytesFeedParser` except that the input to the :meth:`~BytesFeedParser.feed` method must be a string. This is of limited utility, since the only way for such a message to be valid is for it to - contain only ASCII text or, if :attr:`~email.policy.Policy.utf8` is + contain only ASCII text or, if :attr:`~email.policy.EmailPolicy.utf8` is ``True``, no binary attachments. .. versionchanged:: 3.3 Added the *policy* keyword. @@ -155,11 +155,11 @@ message body, instead setting the payload to the raw body. Read all the data from the binary file-like object *fp*, parse the resulting bytes, and return the message object. *fp* must support - both the :meth:`~io.IOBase.readline` and the :meth:`~io.IOBase.read` + both the :meth:`~io.IOBase.readline` and the :meth:`~io.TextIOBase.read` methods. The bytes contained in *fp* must be formatted as a block of :rfc:`5322` - (or, if :attr:`~email.policy.Policy.utf8` is ``True``, :rfc:`6532`) + (or, if :attr:`~email.policy.EmailPolicy.utf8` is ``True``, :rfc:`6532`) style headers and header continuation lines, optionally preceded by an envelope header. The header block is terminated either by the end of the data or by a blank line. Following the header block is the body of the diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 4f5396857f3024..897b404b8d6bb3 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -15,7 +15,6 @@ Doc/extending/extending.rst Doc/library/ast.rst Doc/library/asyncio-extending.rst Doc/library/email.charset.rst -Doc/library/email.parser.rst Doc/library/functools.rst Doc/library/http.cookiejar.rst Doc/library/http.server.rst From fdad31924c57f30056c69dca382e9159e90b837f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:56:34 +0200 Subject: [PATCH 0615/1674] [3.14] gh-76637: Note that `undefined` Codec is for testing (GH-136531) (#136536) gh-76637: Note that `undefined` Codec is for testing (GH-136531) Closes GH-76637 (cherry picked from commit 975b57d945c84000949f241ded8f44413ecc6217) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 37bd913b765d21..c5dae7c8e8fd04 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1395,7 +1395,11 @@ encodings. | | | It is used in the Python | | | | pickle protocol. | +--------------------+---------+---------------------------+ -| undefined | | Raise an exception for | +| undefined | | This Codec should only | +| | | be used for testing | +| | | purposes. | +| | | | +| | | Raise an exception for | | | | all conversions, even | | | | empty strings. The error | | | | handler is ignored. | From a464c4e2e844db0dc09bad4b29d2e765f8fbe9ab Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 14:57:52 +0200 Subject: [PATCH 0616/1674] [3.14] gh-136434: Fix docs generation of `UnboundItem` in subinterpreters (GH-136435) (#136540) gh-136434: Fix docs generation of `UnboundItem` in subinterpreters (GH-136435) (cherry picked from commit 3343fce05acb29a772599ce586abd43edf40bae6) Co-authored-by: sobolevn --- Lib/concurrent/interpreters/_crossinterp.py | 19 ++++++++++++------- ...-07-08-20-58-01.gh-issue-136434.uuJsjS.rst | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst diff --git a/Lib/concurrent/interpreters/_crossinterp.py b/Lib/concurrent/interpreters/_crossinterp.py index f47eb693ac861c..a5f46b20fbb4c5 100644 --- a/Lib/concurrent/interpreters/_crossinterp.py +++ b/Lib/concurrent/interpreters/_crossinterp.py @@ -40,16 +40,21 @@ class UnboundItem: @classonly def singleton(cls, kind, module, name='UNBOUND'): - doc = cls.__doc__.replace('cross-interpreter container', kind) - doc = doc.replace('cross-interpreter', kind) + doc = cls.__doc__ + if doc: + doc = doc.replace( + 'cross-interpreter container', kind, + ).replace( + 'cross-interpreter', kind, + ) subclass = type( f'Unbound{kind.capitalize()}Item', (cls,), - dict( - _MODULE=module, - _NAME=name, - __doc__=doc, - ), + { + "_MODULE": module, + "_NAME": name, + "__doc__": doc, + }, ) return object.__new__(subclass) diff --git a/Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst b/Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst new file mode 100644 index 00000000000000..951f57100b650c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst @@ -0,0 +1,2 @@ +Fix docs generation of ``UnboundItem`` in :mod:`concurrent.interpreters` +when running with :option:`-OO`. From 5535482d2a53ae18859095f569ac95afed3cb095 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:06:19 +0200 Subject: [PATCH 0617/1674] [3.14] gh-136541: Fix several problems of perf trampolines in x86_64 and aarch64 (GH-136500) (#136544) gh-136541: Fix several problems of perf trampolines in x86_64 and aarch64 (GH-136500) This commit fixes the following problems: * The x86_64 trampolines are not preserving frame pointers * The hardcoded offsets to the code segment from the FDE only worked properly for x64_64 * The CIE data was not following conventions of aarch64 * The eh_frame for aarch64 was not fully correct (cherry picked from commit 236f733d8ffb3d587e1167fa0a0248c24512e7fd) Co-authored-by: Pablo Galindo Salgado --- ...-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst | 3 + Python/asm_trampoline.S | 7 +- Python/perf_jit_trampoline.c | 162 ++++++++++++++---- Python/perf_trampoline.c | 16 +- 4 files changed, 147 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst new file mode 100644 index 00000000000000..af9b94ad0613d7 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst @@ -0,0 +1,3 @@ +Fix some issues with the perf trampolines on x86-64 and aarch64. The +trampolines were not being generated correctly for some cases, which could +lead to the perf integration not working correctly. Patch by Pablo Galindo. diff --git a/Python/asm_trampoline.S b/Python/asm_trampoline.S index 616752459ba4d9..a14e68c0e81932 100644 --- a/Python/asm_trampoline.S +++ b/Python/asm_trampoline.S @@ -12,9 +12,10 @@ _Py_trampoline_func_start: #if defined(__CET__) && (__CET__ & 1) endbr64 #endif - sub $8, %rsp - call *%rcx - add $8, %rsp + push %rbp + mov %rsp, %rbp + call *%rcx + pop %rbp ret #endif // __x86_64__ #if defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__) diff --git a/Python/perf_jit_trampoline.c b/Python/perf_jit_trampoline.c index 2ca18c23593547..fafe393065bf6b 100644 --- a/Python/perf_jit_trampoline.c +++ b/Python/perf_jit_trampoline.c @@ -97,10 +97,9 @@ * /tmp/jitted-PID-0.so: [headers][.text][unwind_info][padding] * /tmp/jitted-PID-1.so: [headers][.text][unwind_info][padding] * - * The padding size (0x100) is chosen to accommodate typical unwind info sizes - * while maintaining 16-byte alignment requirements. + * The padding size is now calculated automatically during initialization + * based on the actual unwind information requirements. */ -#define PERF_JIT_CODE_PADDING 0x100 /* Convenient access to the global trampoline API state */ #define trampoline_api _PyRuntime.ceval.perf.trampoline_api @@ -401,10 +400,12 @@ enum { DWRF_CFA_nop = 0x0, // No operation DWRF_CFA_offset_extended = 0x5, // Extended offset instruction DWRF_CFA_def_cfa = 0xc, // Define CFA rule + DWRF_CFA_def_cfa_register = 0xd, // Define CFA register DWRF_CFA_def_cfa_offset = 0xe, // Define CFA offset DWRF_CFA_offset_extended_sf = 0x11, // Extended signed offset DWRF_CFA_advance_loc = 0x40, // Advance location counter - DWRF_CFA_offset = 0x80 // Simple offset instruction + DWRF_CFA_offset = 0x80, // Simple offset instruction + DWRF_CFA_restore = 0xc0 // Restore register }; /* DWARF Exception Handling pointer encodings */ @@ -519,6 +520,7 @@ typedef struct ELFObjectContext { uint8_t* p; // Current write position in buffer uint8_t* startp; // Start of buffer (for offset calculations) uint8_t* eh_frame_p; // Start of EH frame data (for relative offsets) + uint8_t* fde_p; // Start of FDE data (for PC-relative calculations) uint32_t code_size; // Size of the code being described } ELFObjectContext; @@ -643,6 +645,8 @@ static void elfctx_append_uleb128(ELFObjectContext* ctx, uint32_t v) { // DWARF EH FRAME GENERATION // ============================================================================= +static void elf_init_ehframe(ELFObjectContext* ctx); + /* * Initialize DWARF .eh_frame section for a code region * @@ -657,6 +661,23 @@ static void elfctx_append_uleb128(ELFObjectContext* ctx, uint32_t v) { * Args: * ctx: ELF object context containing code size and buffer pointers */ +static size_t calculate_eh_frame_size(void) { + /* Calculate the EH frame size for the trampoline function */ + extern void *_Py_trampoline_func_start; + extern void *_Py_trampoline_func_end; + + size_t code_size = (char*)&_Py_trampoline_func_end - (char*)&_Py_trampoline_func_start; + + ELFObjectContext ctx; + char buffer[1024]; // Buffer for DWARF data (1KB should be sufficient) + ctx.code_size = code_size; + ctx.startp = ctx.p = (uint8_t*)buffer; + ctx.fde_p = NULL; + + elf_init_ehframe(&ctx); + return ctx.p - ctx.startp; +} + static void elf_init_ehframe(ELFObjectContext* ctx) { uint8_t* p = ctx->p; uint8_t* framep = p; // Remember start of frame data @@ -784,7 +805,7 @@ static void elf_init_ehframe(ELFObjectContext* ctx) { * * DWRF_SECTION(FDE, * DWRF_U32((uint32_t)(p - framep)); // Offset to CIE (relative from here) - * DWRF_U32(-0x30); // Initial PC-relative location of the code + * DWRF_U32(pc_relative_offset); // PC-relative location of the code (calculated dynamically) * DWRF_U32(ctx->code_size); // Code range covered by this FDE * DWRF_U8(0); // Augmentation data length (none) * @@ -830,19 +851,31 @@ static void elf_init_ehframe(ELFObjectContext* ctx) { DWRF_U32(0); // CIE ID (0 indicates this is a CIE) DWRF_U8(DWRF_CIE_VERSION); // CIE version (1) DWRF_STR("zR"); // Augmentation string ("zR" = has LSDA) - DWRF_UV(1); // Code alignment factor +#ifdef __x86_64__ + DWRF_UV(1); // Code alignment factor (x86_64: 1 byte) +#elif defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__) + DWRF_UV(4); // Code alignment factor (AArch64: 4 bytes per instruction) +#endif DWRF_SV(-(int64_t)sizeof(uintptr_t)); // Data alignment factor (negative) DWRF_U8(DWRF_REG_RA); // Return address register number DWRF_UV(1); // Augmentation data length DWRF_U8(DWRF_EH_PE_pcrel | DWRF_EH_PE_sdata4); // FDE pointer encoding /* Initial CFI instructions - describe default calling convention */ +#ifdef __x86_64__ + /* x86_64 initial CFI state */ DWRF_U8(DWRF_CFA_def_cfa); // Define CFA (Call Frame Address) DWRF_UV(DWRF_REG_SP); // CFA = SP register DWRF_UV(sizeof(uintptr_t)); // CFA = SP + pointer_size DWRF_U8(DWRF_CFA_offset|DWRF_REG_RA); // Return address is saved DWRF_UV(1); // At offset 1 from CFA - +#elif defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__) + /* AArch64 initial CFI state */ + DWRF_U8(DWRF_CFA_def_cfa); // Define CFA (Call Frame Address) + DWRF_UV(DWRF_REG_SP); // CFA = SP register + DWRF_UV(0); // CFA = SP + 0 (AArch64 starts with offset 0) + // No initial register saves in AArch64 CIE +#endif DWRF_ALIGNNOP(sizeof(uintptr_t)); // Align to pointer boundary ) @@ -853,11 +886,15 @@ static void elf_init_ehframe(ELFObjectContext* ctx) { * * The FDE describes unwinding information specific to this function. * It references the CIE and provides function-specific CFI instructions. + * + * The PC-relative offset is calculated after the entire EH frame is built + * to ensure accurate positioning relative to the synthesized DSO layout. */ DWRF_SECTION(FDE, DWRF_U32((uint32_t)(p - framep)); // Offset to CIE (backwards reference) - DWRF_U32(-0x30); // Machine code offset relative to .text - DWRF_U32(ctx->code_size); // Address range covered by this FDE (code lenght) + ctx->fde_p = p; // Remember where PC offset field is located for later calculation + DWRF_U32(0); // Placeholder for PC-relative offset (calculated at end of elf_init_ehframe) + DWRF_U32(ctx->code_size); // Address range covered by this FDE (code length) DWRF_U8(0); // Augmentation data length (none) /* @@ -868,32 +905,36 @@ static void elf_init_ehframe(ELFObjectContext* ctx) { * conventions and register usage patterns. */ #ifdef __x86_64__ - /* x86_64 calling convention unwinding rules */ + /* x86_64 calling convention unwinding rules with frame pointer */ # if defined(__CET__) && (__CET__ & 1) - DWRF_U8(DWRF_CFA_advance_loc | 8); // Advance location by 8 bytes when CET protection is enabled -# else - DWRF_U8(DWRF_CFA_advance_loc | 4); // Advance location by 4 bytes + DWRF_U8(DWRF_CFA_advance_loc | 4); // Advance past endbr64 (4 bytes) # endif - DWRF_U8(DWRF_CFA_def_cfa_offset); // Redefine CFA offset + DWRF_U8(DWRF_CFA_advance_loc | 1); // Advance past push %rbp (1 byte) + DWRF_U8(DWRF_CFA_def_cfa_offset); // def_cfa_offset 16 DWRF_UV(16); // New offset: SP + 16 - DWRF_U8(DWRF_CFA_advance_loc | 6); // Advance location by 6 bytes - DWRF_U8(DWRF_CFA_def_cfa_offset); // Redefine CFA offset + DWRF_U8(DWRF_CFA_offset | DWRF_REG_BP); // offset r6 at cfa-16 + DWRF_UV(2); // Offset factor: 2 * 8 = 16 bytes + DWRF_U8(DWRF_CFA_advance_loc | 3); // Advance past mov %rsp,%rbp (3 bytes) + DWRF_U8(DWRF_CFA_def_cfa_register); // def_cfa_register r6 + DWRF_UV(DWRF_REG_BP); // Use base pointer register + DWRF_U8(DWRF_CFA_advance_loc | 3); // Advance past call *%rcx (2 bytes) + pop %rbp (1 byte) = 3 + DWRF_U8(DWRF_CFA_def_cfa); // def_cfa r7 ofs 8 + DWRF_UV(DWRF_REG_SP); // Use stack pointer register DWRF_UV(8); // New offset: SP + 8 #elif defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__) /* AArch64 calling convention unwinding rules */ - DWRF_U8(DWRF_CFA_advance_loc | 1); // Advance location by 1 instruction (stp x29, x30) - DWRF_U8(DWRF_CFA_def_cfa_offset); // Redefine CFA offset - DWRF_UV(16); // CFA = SP + 16 (stack pointer after push) - DWRF_U8(DWRF_CFA_offset | DWRF_REG_FP); // Frame pointer (x29) saved - DWRF_UV(2); // At offset 2 from CFA (2 * 8 = 16 bytes) - DWRF_U8(DWRF_CFA_offset | DWRF_REG_RA); // Link register (x30) saved - DWRF_UV(1); // At offset 1 from CFA (1 * 8 = 8 bytes) - DWRF_U8(DWRF_CFA_advance_loc | 3); // Advance by 3 instructions (mov x16, x3; mov x29, sp; ldp...) - DWRF_U8(DWRF_CFA_offset | DWRF_REG_FP); // Restore frame pointer (x29) - DWRF_U8(DWRF_CFA_offset | DWRF_REG_RA); // Restore link register (x30) - DWRF_U8(DWRF_CFA_def_cfa_offset); // Final CFA adjustment - DWRF_UV(0); // CFA = SP + 0 (stack restored) - + DWRF_U8(DWRF_CFA_advance_loc | 1); // Advance by 1 instruction (4 bytes) + DWRF_U8(DWRF_CFA_def_cfa_offset); // CFA = SP + 16 + DWRF_UV(16); // Stack pointer moved by 16 bytes + DWRF_U8(DWRF_CFA_offset | DWRF_REG_FP); // x29 (frame pointer) saved + DWRF_UV(2); // At CFA-16 (2 * 8 = 16 bytes from CFA) + DWRF_U8(DWRF_CFA_offset | DWRF_REG_RA); // x30 (link register) saved + DWRF_UV(1); // At CFA-8 (1 * 8 = 8 bytes from CFA) + DWRF_U8(DWRF_CFA_advance_loc | 3); // Advance by 3 instructions (12 bytes) + DWRF_U8(DWRF_CFA_restore | DWRF_REG_RA); // Restore x30 - NO DWRF_UV() after this! + DWRF_U8(DWRF_CFA_restore | DWRF_REG_FP); // Restore x29 - NO DWRF_UV() after this! + DWRF_U8(DWRF_CFA_def_cfa_offset); // CFA = SP + 0 (stack restored) + DWRF_UV(0); // Back to original stack position #else # error "Unsupported target architecture" #endif @@ -902,6 +943,58 @@ static void elf_init_ehframe(ELFObjectContext* ctx) { ) ctx->p = p; // Update context pointer to end of generated data + + /* Calculate and update the PC-relative offset in the FDE + * + * When perf processes the jitdump, it creates a synthesized DSO with this layout: + * + * Synthesized DSO Memory Layout: + * ┌─────────────────────────────────────────────────────────────┐ < code_start + * │ Code Section │ + * │ (round_up(code_size, 8) bytes) │ + * ├─────────────────────────────────────────────────────────────┤ < start of EH frame data + * │ EH Frame Data │ + * │ ┌─────────────────────────────────────────────────────┐ │ + * │ │ CIE data │ │ + * │ └─────────────────────────────────────────────────────┘ │ + * │ ┌─────────────────────────────────────────────────────┐ │ + * │ │ FDE Header: │ │ + * │ │ - CIE offset (4 bytes) │ │ + * │ │ - PC offset (4 bytes) <─ fde_offset_in_frame ─────┼────┼─> points to code_start + * │ │ - address range (4 bytes) │ │ (this specific field) + * │ │ CFI Instructions... │ │ + * │ └─────────────────────────────────────────────────────┘ │ + * ├─────────────────────────────────────────────────────────────┤ < reference_point + * │ EhFrameHeader │ + * │ (navigation metadata) │ + * └─────────────────────────────────────────────────────────────┘ + * + * The PC offset field in the FDE must contain the distance from itself to code_start: + * + * distance = code_start - fde_pc_field + * + * Where: + * fde_pc_field_location = reference_point - eh_frame_size + fde_offset_in_frame + * code_start_location = reference_point - eh_frame_size - round_up(code_size, 8) + * + * Therefore: + * distance = code_start_location - fde_pc_field_location + * = (ref - eh_frame_size - rounded_code_size) - (ref - eh_frame_size + fde_offset_in_frame) + * = -rounded_code_size - fde_offset_in_frame + * = -(round_up(code_size, 8) + fde_offset_in_frame) + * + * Note: fde_offset_in_frame is the offset from EH frame start to the PC offset field, + * + */ + if (ctx->fde_p != NULL) { + int32_t fde_offset_in_frame = (ctx->fde_p - ctx->startp); + int32_t rounded_code_size = round_up(ctx->code_size, 8); + int32_t pc_relative_offset = -(rounded_code_size + fde_offset_in_frame); + + + // Update the PC-relative offset in the FDE + *(int32_t*)ctx->fde_p = pc_relative_offset; + } } // ============================================================================= @@ -1002,8 +1095,10 @@ static void* perf_map_jit_init(void) { /* Initialize code ID counter */ perf_jit_map_state.code_id = 0; - /* Configure trampoline API with padding information */ - trampoline_api.code_padding = PERF_JIT_CODE_PADDING; + /* Calculate padding size based on actual unwind info requirements */ + size_t eh_frame_size = calculate_eh_frame_size(); + size_t unwind_data_size = sizeof(EhFrameHeader) + eh_frame_size; + trampoline_api.code_padding = round_up(unwind_data_size, 16); return &perf_jit_map_state; } @@ -1092,6 +1187,7 @@ static void perf_map_jit_write_entry(void *state, const void *code_addr, char buffer[1024]; // Buffer for DWARF data (1KB should be sufficient) ctx.code_size = code_size; ctx.startp = ctx.p = (uint8_t*)buffer; + ctx.fde_p = NULL; // Initialize to NULL, will be set when FDE is written /* Generate EH frame (Exception Handling frame) data */ elf_init_ehframe(&ctx); @@ -1110,7 +1206,7 @@ static void perf_map_jit_write_entry(void *state, const void *code_addr, ev2.unwind_data_size = sizeof(EhFrameHeader) + eh_frame_size; /* Verify we don't exceed our padding budget */ - assert(ev2.unwind_data_size <= PERF_JIT_CODE_PADDING); + assert(ev2.unwind_data_size <= (uint64_t)trampoline_api.code_padding); ev2.eh_frame_hdr_size = sizeof(EhFrameHeader); ev2.mapped_size = round_up(ev2.unwind_data_size, 16); // 16-byte alignment @@ -1262,4 +1358,4 @@ _PyPerf_Callbacks _Py_perfmap_jit_callbacks = { &perf_map_jit_fini, // Cleanup function }; -#endif /* PY_HAVE_PERF_TRAMPOLINE */ \ No newline at end of file +#endif /* PY_HAVE_PERF_TRAMPOLINE */ diff --git a/Python/perf_trampoline.c b/Python/perf_trampoline.c index 996e54b82b61e8..4690e7b718f3c8 100644 --- a/Python/perf_trampoline.c +++ b/Python/perf_trampoline.c @@ -162,6 +162,8 @@ static void invalidate_icache(char* begin, char*end) { } #endif +#define CODE_ALIGNMENT 32 + /* The function pointer is passed as last argument. The other three arguments * are passed in the same order as the function requires. This results in * shorter, more efficient ASM code for trampoline. @@ -291,7 +293,9 @@ new_code_arena(void) void *start = &_Py_trampoline_func_start; void *end = &_Py_trampoline_func_end; size_t code_size = end - start; - size_t chunk_size = round_up(code_size + trampoline_api.code_padding, 16); + size_t unaligned_size = code_size + trampoline_api.code_padding; + size_t chunk_size = round_up(unaligned_size, CODE_ALIGNMENT); + assert(chunk_size % CODE_ALIGNMENT == 0); // TODO: Check the effect of alignment of the code chunks. Initial investigation // showed that this has no effect on performance in x86-64 or aarch64 and the current // version has the advantage that the unwinder in GDB can unwind across JIT-ed code. @@ -356,7 +360,9 @@ static inline py_trampoline code_arena_new_code(code_arena_t *code_arena) { py_trampoline trampoline = (py_trampoline)code_arena->current_addr; - size_t total_code_size = round_up(code_arena->code_size + trampoline_api.code_padding, 16); + size_t total_code_size = round_up(code_arena->code_size + trampoline_api.code_padding, + CODE_ALIGNMENT); + assert(total_code_size % CODE_ALIGNMENT == 0); code_arena->size_left -= total_code_size; code_arena->current_addr += total_code_size; return trampoline; @@ -489,9 +495,6 @@ _PyPerfTrampoline_Init(int activate) } else { _PyInterpreterState_SetEvalFrameFunc(tstate->interp, py_trampoline_evaluator); - if (new_code_arena() < 0) { - return -1; - } extra_code_index = _PyEval_RequestCodeExtraIndex(NULL); if (extra_code_index == -1) { return -1; @@ -499,6 +502,9 @@ _PyPerfTrampoline_Init(int activate) if (trampoline_api.state == NULL && trampoline_api.init_state != NULL) { trampoline_api.state = trampoline_api.init_state(); } + if (new_code_arena() < 0) { + return -1; + } perf_status = PERF_STATUS_OK; } #endif From e03db7317f57759c63194b88a5ca886ff9829cf7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:20:05 +0200 Subject: [PATCH 0618/1674] [3.14] gh-136517: Print uncollectable objects if DEBUG_UNCOLLECTABLE mode was set (GH-136518) (#136522) gh-136517: Print uncollectable objects if DEBUG_UNCOLLECTABLE mode was set (GH-136518) (cherry picked from commit c560df9658f1a24edea995fe6f9c84c55b37cfb3) Co-authored-by: Sergey Miryanov --- Lib/test/test_gc.py | 5 +++++ .../2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst | 2 ++ Python/gc.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index b4cbfb6d774080..d9e9622992f543 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -726,6 +726,9 @@ def run_command(code): self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at " b"shutdown; use", stderr) self.assertNotIn(b"", stderr) + one_line_re = b"gc: uncollectable " + expected_re = one_line_re + b"\r?\n" + one_line_re + self.assertNotRegex(stderr, expected_re) # With DEBUG_UNCOLLECTABLE, the garbage list gets printed stderr = run_command(code % "gc.DEBUG_UNCOLLECTABLE") self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at " @@ -733,6 +736,8 @@ def run_command(code): self.assertTrue( (b"[, ]" in stderr) or (b"[, ]" in stderr), stderr) + # we expect two lines with uncollectable objects + self.assertRegex(stderr, expected_re) # With DEBUG_SAVEALL, no additional message should get printed # (because gc.garbage also contains normally reclaimable cyclic # references, and its elements get printed at runtime anyway). diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst new file mode 100644 index 00000000000000..bf26c4eb0e4c74 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst @@ -0,0 +1,2 @@ +Fixed a typo that prevented printing of uncollectable objects when the +:const:`gc.DEBUG_UNCOLLECTABLE` mode was set. diff --git a/Python/gc.c b/Python/gc.c index 7b0e6d6e803504..41854265361b24 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -1763,7 +1763,7 @@ gc_collect_region(PyThreadState *tstate, Py_ssize_t n = 0; for (gc = GC_NEXT(&finalizers); gc != &finalizers; gc = GC_NEXT(gc)) { n++; - if (gcstate->debug & _PyGC_DEBUG_COLLECTABLE) + if (gcstate->debug & _PyGC_DEBUG_UNCOLLECTABLE) debug_cycle("uncollectable", FROM_GC(gc)); } stats->uncollectable = n; From 3b28b402a52d90c47293d20c8a2cef888b700005 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:25:58 +0200 Subject: [PATCH 0619/1674] [3.14] gh-130478: fix HACL* build for macOS Silicon (GH-134188) (#135009) gh-130478: fix HACL* build for macOS Silicon (GH-134188) (cherry picked from commit ac7511062bf8e16ad489b17990d99abd3b4351f5) Co-authored-by: Sam Ng Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- configure | 12 ++++++++++-- configure.ac | 13 +++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/configure b/configure index d32ea2dabc2be7..a62f1ae7cac52d 100755 --- a/configure +++ b/configure @@ -32582,6 +32582,14 @@ LIBHACL_CFLAGS="${LIBHACL_FLAG_I} ${LIBHACL_FLAG_D} \$(PY_STDMODULE_CFLAGS) \$(C LIBHACL_LDFLAGS= # for now, no specific linker flags are needed +if test "$UNIVERSAL_ARCHS" = "universal2" -o \ + \( "$build_cpu" = "aarch64" -a "$build_vendor" = "apple" \) +then + use_hacl_universal2_impl=yes +else + use_hacl_universal2_impl=no +fi + # The SIMD files use aligned_alloc, which is not available on older versions of # Android. # The *mmintrin.h headers are x86-family-specific, so can't be used on WASI. @@ -32635,7 +32643,7 @@ printf "%s\n" "#define _Py_HACL_CAN_COMPILE_VEC128 1" >>confdefs.h # isn't great, so it's disabled on ARM64. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HACL* SIMD128 implementation" >&5 printf %s "checking for HACL* SIMD128 implementation... " >&6; } - if test "$UNIVERSAL_ARCHS" == "universal2"; then + if test "$use_hacl_universal2_impl" = "yes"; then LIBHACL_BLAKE2_SIMD128_OBJS="Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.o" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: universal2" >&5 printf "%s\n" "universal2" >&6; } @@ -32712,7 +32720,7 @@ printf "%s\n" "#define _Py_HACL_CAN_COMPILE_VEC256 1" >>confdefs.h # wrapped implementation if we're building for universal2. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HACL* SIMD256 implementation" >&5 printf %s "checking for HACL* SIMD256 implementation... " >&6; } - if test "$UNIVERSAL_ARCHS" == "universal2"; then + if test "$use_hacl_universal2_impl" = "yes"; then LIBHACL_BLAKE2_SIMD256_OBJS="Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.o" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: universal2" >&5 printf "%s\n" "universal2" >&6; } diff --git a/configure.ac b/configure.ac index ab688d93990a2d..d644c0ca772cd5 100644 --- a/configure.ac +++ b/configure.ac @@ -8008,6 +8008,15 @@ AC_SUBST([LIBHACL_CFLAGS]) LIBHACL_LDFLAGS= # for now, no specific linker flags are needed AC_SUBST([LIBHACL_LDFLAGS]) +dnl Check if universal2 HACL* implementation should be used. +if test "$UNIVERSAL_ARCHS" = "universal2" -o \ + \( "$build_cpu" = "aarch64" -a "$build_vendor" = "apple" \) +then + use_hacl_universal2_impl=yes +else + use_hacl_universal2_impl=no +fi + # The SIMD files use aligned_alloc, which is not available on older versions of # Android. # The *mmintrin.h headers are x86-family-specific, so can't be used on WASI. @@ -8025,7 +8034,7 @@ then # available on x86_64. However, performance of the HACL SIMD128 implementation # isn't great, so it's disabled on ARM64. AC_MSG_CHECKING([for HACL* SIMD128 implementation]) - if test "$UNIVERSAL_ARCHS" == "universal2"; then + if test "$use_hacl_universal2_impl" = "yes"; then [LIBHACL_BLAKE2_SIMD128_OBJS="Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.o"] AC_MSG_RESULT([universal2]) else @@ -8058,7 +8067,7 @@ then # implementation requires symbols that aren't available on ARM64. Use a # wrapped implementation if we're building for universal2. AC_MSG_CHECKING([for HACL* SIMD256 implementation]) - if test "$UNIVERSAL_ARCHS" == "universal2"; then + if test "$use_hacl_universal2_impl" = "yes"; then [LIBHACL_BLAKE2_SIMD256_OBJS="Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.o"] AC_MSG_RESULT([universal2]) else From e4e86a1b87eaa6c327632ef282b48b9f15bc5536 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:03:11 +0200 Subject: [PATCH 0620/1674] [3.14] gh-130160: use `.. program::` directive for documenting `venv` CLI (GH-130699) (#136550) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-130160: use `.. program::` directive for documenting `venv` CLI (GH-130699) (cherry picked from commit fb9f933b8eda6cdc1336582dc8709b759ced91af) Co-authored-by: Kanishk Pachauri Co-authored-by: Semyon Moroz Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/venv.rst | 70 +++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index bed799aedfdfb1..f16e24eac08343 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -105,36 +105,52 @@ The command, if run with ``-h``, will show the available options:: 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. +.. _venv-cli: +.. program:: venv + +.. option:: ENV_DIR + + A required argument specifying the directory to create the environment in. + +.. option:: --system-site-packages + + Give the virtual environment access to the system site-packages directory. + +.. option:: --symlinks + + Try to use symlinks rather than copies, when symlinks are not the default for the platform. + +.. option:: --copies + + Try to use copies rather than symlinks, even when symlinks are the default for the platform. + +.. option:: --clear + + Delete the contents of the environment directory if it already exists, before environment creation. + +.. option:: --upgrade + + Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place. + +.. option:: --without-pip + + Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default). + +.. option:: --prompt + + Provides an alternative prompt prefix for this environment. + +.. option:: --upgrade-deps + + Upgrade core dependencies (pip) to the latest version in PyPI. + +.. option:: --without-scm-ignore-files + + Skips adding SCM ignore files to the environment directory (Git is supported by default). + .. versionchanged:: 3.4 Installs pip by default, added the ``--without-pip`` and ``--copies`` From ac807cb3a0e2c8b119a19e3622de3a9c4884652d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:09:22 +0200 Subject: [PATCH 0621/1674] [3.14] gh-101100: Fix sphinx warnings in Doc/library/functools.rst (GH-136424) (GH-136552) Add index entries and anchors for cache_info, cache_clear and register. (cherry picked from commit 252e2f710ea376a38c4545dd758e03d331c1eaad) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/functools.rst | 33 +++++++++++++++++++++------------ Doc/tools/.nitignore | 1 - 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 3e75621be6dad3..beec9b942afc0f 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -199,12 +199,18 @@ The :mod:`functools` module defines the following functions: and *typed*. This is for information purposes only. Mutating the values has no effect. + .. method:: lru_cache.cache_info() + :no-typesetting: + To help measure the effectiveness of the cache and tune the *maxsize* - parameter, the wrapped function is instrumented with a :func:`cache_info` + parameter, the wrapped function is instrumented with a :func:`!cache_info` function that returns a :term:`named tuple` showing *hits*, *misses*, *maxsize* and *currsize*. - The decorator also provides a :func:`cache_clear` function for clearing or + .. method:: lru_cache.cache_clear() + :no-typesetting: + + The decorator also provides a :func:`!cache_clear` function for clearing or invalidating the cache. The original underlying function is accessible through the @@ -284,9 +290,9 @@ The :mod:`functools` module defines the following functions: class decorator supplies the rest. This simplifies the effort involved in specifying all of the possible rich comparison operations: - The class must define one of :meth:`__lt__`, :meth:`__le__`, - :meth:`__gt__`, or :meth:`__ge__`. - In addition, the class should supply an :meth:`__eq__` method. + The class must define one of :meth:`~object.__lt__`, :meth:`~object.__le__`, + :meth:`~object.__gt__`, or :meth:`~object.__ge__`. + In addition, the class should supply an :meth:`~object.__eq__` method. For example:: @@ -418,7 +424,7 @@ The :mod:`functools` module defines the following functions: like normal functions, are handled as descriptors). When *func* is a descriptor (such as a normal Python function, - :func:`classmethod`, :func:`staticmethod`, :func:`abstractmethod` or + :func:`classmethod`, :func:`staticmethod`, :func:`~abc.abstractmethod` or another instance of :class:`partialmethod`), calls to ``__get__`` are delegated to the underlying descriptor, and an appropriate :ref:`partial object` returned as the result. @@ -499,7 +505,10 @@ The :mod:`functools` module defines the following functions: ... print("Let me just say,", end=" ") ... print(arg) - To add overloaded implementations to the function, use the :func:`register` + .. method:: singledispatch.register() + :no-typesetting: + + To add overloaded implementations to the function, use the :func:`!register` attribute of the generic function, which can be used as a decorator. For functions annotated with types, the decorator will infer the type of the first argument automatically:: @@ -565,14 +574,14 @@ The :mod:`functools` module defines the following functions: runtime impact. To enable registering :term:`lambdas` and pre-existing functions, - the :func:`register` attribute can also be used in a functional form:: + the :func:`~singledispatch.register` attribute can also be used in a functional form:: >>> def nothing(arg, verbose=False): ... print("Nothing.") ... >>> fun.register(type(None), nothing) - The :func:`register` attribute returns the undecorated function. This + The :func:`~singledispatch.register` attribute returns the undecorated function. This enables decorator stacking, :mod:`pickling`, and the creation of unit tests for each variant independently:: @@ -650,10 +659,10 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.4 .. versionchanged:: 3.7 - The :func:`register` attribute now supports using type annotations. + The :func:`~singledispatch.register` attribute now supports using type annotations. .. versionchanged:: 3.11 - The :func:`register` attribute now supports + The :func:`~singledispatch.register` attribute now supports :class:`typing.Union` as a type annotation. @@ -783,7 +792,7 @@ The :mod:`functools` module defines the following functions: 'Docstring' Without the use of this decorator factory, the name of the example function - would have been ``'wrapper'``, and the docstring of the original :func:`example` + would have been ``'wrapper'``, and the docstring of the original :func:`!example` would have been lost. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 897b404b8d6bb3..1fbb45ecd73801 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -15,7 +15,6 @@ Doc/extending/extending.rst Doc/library/ast.rst Doc/library/asyncio-extending.rst Doc/library/email.charset.rst -Doc/library/functools.rst Doc/library/http.cookiejar.rst Doc/library/http.server.rst Doc/library/importlib.rst From 33f561d7be78b984f67a7f97ef11d129b2ff4f3a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 12 Jul 2025 14:33:53 +0200 Subject: [PATCH 0622/1674] [3.14] gh-89083: Add CLI tests for `UUIDv{6,7,8}` (GH-136548) (#136576) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-89083: Add CLI tests for `UUIDv{6,7,8}` (GH-136548) (cherry picked from commit c564847e98db462edfc30a971da061eeb775e475) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_uuid.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 7ddacf07a2c789..0e1a723ce3a151 100755 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -1140,6 +1140,23 @@ def test_uuid_weakref(self): weak = weakref.ref(strong) self.assertIs(strong, weak()) + +class CommandLineTestCases: + uuid = None # to be defined in subclasses + + def do_test_standalone_uuid(self, version): + stdout = io.StringIO() + with contextlib.redirect_stdout(stdout): + self.uuid.main() + output = stdout.getvalue().strip() + u = self.uuid.UUID(output) + self.assertEqual(output, str(u)) + self.assertEqual(u.version, version) + + @mock.patch.object(sys, "argv", ["", "-u", "uuid1"]) + def test_cli_uuid1(self): + self.do_test_standalone_uuid(1) + @mock.patch.object(sys, "argv", ["", "-u", "uuid3", "-n", "@dns"]) @mock.patch('sys.stderr', new_callable=io.StringIO) def test_cli_namespace_required_for_uuid3(self, mock_err): @@ -1214,13 +1231,25 @@ def test_cli_uuid5_ouputted_with_valid_namespace_and_name(self): self.assertEqual(output, str(uuid_output)) self.assertEqual(uuid_output.version, 5) + @mock.patch.object(sys, "argv", ["", "-u", "uuid6"]) + def test_cli_uuid6(self): + self.do_test_standalone_uuid(6) + + @mock.patch.object(sys, "argv", ["", "-u", "uuid7"]) + def test_cli_uuid7(self): + self.do_test_standalone_uuid(7) + + @mock.patch.object(sys, "argv", ["", "-u", "uuid8"]) + def test_cli_uuid8(self): + self.do_test_standalone_uuid(8) + -class TestUUIDWithoutExtModule(BaseTestUUID, unittest.TestCase): +class TestUUIDWithoutExtModule(CommandLineTestCases, BaseTestUUID, unittest.TestCase): uuid = py_uuid @unittest.skipUnless(c_uuid, 'requires the C _uuid module') -class TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase): +class TestUUIDWithExtModule(CommandLineTestCases, BaseTestUUID, unittest.TestCase): uuid = c_uuid def check_has_stable_libuuid_extractable_node(self): From c71ecd14188e6c158fee27a9c2ae75bf69f55f52 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 12 Jul 2025 15:56:10 +0200 Subject: [PATCH 0623/1674] [3.14] gh-134759: fix `UnboundLocalError` in `email.message.Message.get_payload` (GH-136071) (#136579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-134759: fix `UnboundLocalError` in `email.message.Message.get_payload` (GH-136071) (cherry picked from commit 25335d297b5248922a4c82183bcdf0c0ada8352b) Co-authored-by: Kliment Lamonov Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/email/message.py | 2 ++ Lib/test/test_email/test_message.py | 9 +++++++++ Misc/ACKS | 1 + .../2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst | 2 ++ 4 files changed, 14 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst diff --git a/Lib/email/message.py b/Lib/email/message.py index 41fcc2b9778798..36e4b4a9f0b773 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -313,6 +313,8 @@ def get_payload(self, i=None, decode=False): # If it does happen, turn the string into bytes in a way # guaranteed not to fail. bpayload = payload.encode('raw-unicode-escape') + else: + bpayload = payload if cte == 'quoted-printable': return quopri.decodestring(bpayload) elif cte == 'base64': diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index 23c39775a8b2e5..b4128f70f18412 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1055,6 +1055,15 @@ def test_get_body_malformed(self): # AttributeError: 'str' object has no attribute 'is_attachment' m.get_body() + def test_get_bytes_payload_with_quoted_printable_encoding(self): + # We use a memoryview to avoid directly changing the private payload + # and to prevent using the dedicated paths for string or bytes objects. + payload = memoryview(b'Some payload') + m = self._make_message() + m.add_header('Content-Transfer-Encoding', 'quoted-printable') + m.set_payload(payload) + self.assertEqual(m.get_payload(decode=True), payload) + class TestMIMEPart(TestEmailMessageBase, TestEmailBase): # Doing the full test run here may seem a bit redundant, since the two diff --git a/Misc/ACKS b/Misc/ACKS index f80ae7d8fac461..83bc62726eecc9 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1054,6 +1054,7 @@ Alexander Lakeev David Lam Thomas Lamb Valerie Lambert +Kliment Lamonov Peter Lamut Jean-Baptiste "Jiba" Lamy Ronan Lamy diff --git a/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst b/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst new file mode 100644 index 00000000000000..79b85320926954 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst @@ -0,0 +1,2 @@ +Fix :exc:`UnboundLocalError` in :func:`email.message.Message.get_payload` when +the payload to decode is a :class:`bytes` object. Patch by Kliment Lamonov. From d5866a8e8432c15eac65a3059d71bc60d9aa61bf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 12 Jul 2025 16:38:57 +0200 Subject: [PATCH 0624/1674] [3.14] gh-91153: prevent a crash in `bytearray.__setitem__(ind, ...)` when `ind.__index__` has side-effects (GH-132379) (#136581) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-91153: prevent a crash in `bytearray.__setitem__(ind, ...)` when `ind.__index__` has side-effects (GH-132379) (cherry picked from commit 5e1e21dee35b8e9066692d08033bbbdb562e2c28) Co-authored-by: Bast <52266665+bast0006@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_bytes.py | 35 +++++++++++++++++++ ...5-05-17-20-56-05.gh-issue-91153.afgtG2.rst | 1 + Objects/bytearrayobject.c | 8 +++-- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index bb0f8aa99da910..2591e7ca6ab0ec 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1899,6 +1899,8 @@ def test_repeat_after_setslice(self): self.assertEqual(b3, b'xcxcxc') def test_mutating_index(self): + # bytearray slice assignment can call into python code + # that reallocates the internal buffer # See gh-91153 class Boom: @@ -1916,6 +1918,39 @@ def __index__(self): with self.assertRaises(IndexError): self._testlimitedcapi.sequence_setitem(b, 0, Boom()) + def test_mutating_index_inbounds(self): + # gh-91153 continued + # Ensure buffer is not broken even if length is correct + + class MutatesOnIndex: + def __init__(self): + self.ba = bytearray(0x180) + + def __index__(self): + self.ba.clear() + self.new_ba = bytearray(0x180) # to catch out-of-bounds writes + self.ba.extend([0] * 0x180) # to check bounds checks + return 0 + + with self.subTest("skip_bounds_safety"): + instance = MutatesOnIndex() + instance.ba[instance] = ord("?") + self.assertEqual(instance.ba[0], ord("?"), "Assigned bytearray not altered") + self.assertEqual(instance.new_ba, bytearray(0x180), "Wrong object altered") + + with self.subTest("skip_bounds_safety_capi"): + instance = MutatesOnIndex() + instance.ba[instance] = ord("?") + self._testlimitedcapi.sequence_setitem(instance.ba, instance, ord("?")) + self.assertEqual(instance.ba[0], ord("?"), "Assigned bytearray not altered") + self.assertEqual(instance.new_ba, bytearray(0x180), "Wrong object altered") + + with self.subTest("skip_bounds_safety_slice"): + instance = MutatesOnIndex() + instance.ba[instance:1] = [ord("?")] + self.assertEqual(instance.ba[0], ord("?"), "Assigned bytearray not altered") + self.assertEqual(instance.new_ba, bytearray(0x180), "Wrong object altered") + class AssortedBytesTest(unittest.TestCase): # diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst new file mode 100644 index 00000000000000..dc2f1e22ba5b05 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst @@ -0,0 +1 @@ +Fix a crash when a :class:`bytearray` is concurrently mutated during item assignment. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index b5d5ca9178ebdb..bf30c06af5d8fa 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -709,7 +709,9 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op); PyByteArrayObject *self = _PyByteArray_CAST(op); Py_ssize_t start, stop, step, slicelen; - char *buf = PyByteArray_AS_STRING(self); + // Do not store a reference to the internal buffer since + // index.__index__() or _getbytevalue() may alter 'self'. + // See https://github.com/python/cpython/issues/91153. if (_PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); @@ -744,7 +746,7 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value } else { assert(0 <= ival && ival < 256); - buf[i] = (char)ival; + PyByteArray_AS_STRING(self)[i] = (char)ival; return 0; } } @@ -805,6 +807,7 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value /* Delete slice */ size_t cur; Py_ssize_t i; + char *buf = PyByteArray_AS_STRING(self); if (!_canresize(self)) return -1; @@ -845,6 +848,7 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value /* Assign slice */ Py_ssize_t i; size_t cur; + char *buf = PyByteArray_AS_STRING(self); if (needed != slicelen) { PyErr_Format(PyExc_ValueError, From 64df22c19029b1d99eb7993f16bfe9f484a8405e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:18:23 +0200 Subject: [PATCH 0625/1674] [3.14] gh-136549: Fix signature of threading.excepthook() (GH-136559) (GH-136589) (cherry picked from commit be2c3d284ecce67474a260b8c37e2f1e0628a9cf) Co-authored-by: Serhiy Storchaka --- Lib/test/test_inspect/test_inspect.py | 1 + .../next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst | 1 + Modules/_threadmodule.c | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 55942c2823c492..0a8926e00cf8b9 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -5916,6 +5916,7 @@ def test_sysconfig_module_has_signatures(self): def test_threading_module_has_signatures(self): import threading self._test_module_has_signatures(threading) + self.assertIsNotNone(inspect.signature(threading.__excepthook__)) def test_thread_module_has_signatures(self): import _thread diff --git a/Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst b/Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst new file mode 100644 index 00000000000000..f3050ad5d5aa10 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst @@ -0,0 +1 @@ +Fix signature of :func:`threading.excepthook`. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 73dfb943845095..121b0f803715af 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -2317,7 +2317,7 @@ thread_excepthook(PyObject *module, PyObject *args) } PyDoc_STRVAR(excepthook_doc, -"_excepthook($module, (exc_type, exc_value, exc_traceback, thread), /)\n\ +"_excepthook($module, args, /)\n\ --\n\ \n\ Handle uncaught Thread.run() exception."); From d351f29ef08e2f786cdf3400ceabfffb0ae7791d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:22:51 +0200 Subject: [PATCH 0626/1674] [3.14] gh-101100: Fix sphinx warnings in Doc/library/platform.rst (GH-136562) (GH-136597) (cherry picked from commit 47b01da4ccedd9c00fad4325b3e87d7732abeb6d) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/platform.rst | 4 ++-- Doc/tools/.nitignore | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 5c999054323be5..2f176872985632 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -176,8 +176,8 @@ Cross platform :attr:`processor` is resolved late, on demand. Note: the first two attribute names differ from the names presented by - :func:`os.uname`, where they are named :attr:`sysname` and - :attr:`nodename`. + :func:`os.uname`, where they are named :attr:`!sysname` and + :attr:`!nodename`. Entries which cannot be determined are set to ``''``. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 1fbb45ecd73801..510225afab8933 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -26,7 +26,6 @@ Doc/library/multiprocessing.rst Doc/library/optparse.rst Doc/library/os.rst Doc/library/pickletools.rst -Doc/library/platform.rst Doc/library/profile.rst Doc/library/pyexpat.rst Doc/library/resource.rst From f50cd5bec7c507ea1f775ebb30d8d014030c7b94 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 07:42:51 +0200 Subject: [PATCH 0627/1674] [3.14] gh-134939: Correct `concurrent.interpreters` source code link (GH-136564) (#136605) gh-134939: Correct `concurrent.interpreters` source code link (GH-136564) (cherry picked from commit 42b251bcebd749eceeb62389e413a3be37cff343) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/concurrent.interpreters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/concurrent.interpreters.rst b/Doc/library/concurrent.interpreters.rst index 524d505bcf144f..be9d565f8e0d38 100644 --- a/Doc/library/concurrent.interpreters.rst +++ b/Doc/library/concurrent.interpreters.rst @@ -9,7 +9,7 @@ .. versionadded:: 3.14 -**Source code:** :source:`Lib/concurrent/interpreters.py` +**Source code:** :source:`Lib/concurrent/interpreters` -------------- From a1ed132a19ac8a799d1c187527ce16e543e8146f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 08:52:58 +0200 Subject: [PATCH 0628/1674] [3.14] Docs: Fix and improve the `PyUnstable_Object_EnableDeferredRefcount` documentation (GH-135323) (GH-136610) Docs: Fix and improve the `PyUnstable_Object_EnableDeferredRefcount` documentation (GH-135323) (cherry picked from commit 0d4fd10fbab2767fad3eb27639905c8885b88c89) Co-authored-by: Peter Bierma --- Doc/c-api/object.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 0fd159f1eb87f8..241fbd3a4866c7 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -596,12 +596,13 @@ Object Protocol if supported by the runtime. In the :term:`free-threaded ` build, this allows the interpreter to avoid reference count adjustments to *obj*, which may improve multi-threaded performance. The tradeoff is - that *obj* will only be deallocated by the tracing garbage collector. + that *obj* will only be deallocated by the tracing garbage collector, and + not when the interpreter no longer has any references to it. - This function returns ``1`` if deferred reference counting is enabled on *obj* - (including when it was enabled before the call), + This function returns ``1`` if deferred reference counting is enabled on *obj*, and ``0`` if deferred reference counting is not supported or if the hint was - ignored by the runtime. This function is thread-safe, and cannot fail. + ignored by the interpreter, such as when deferred reference counting is already + enabled on *obj*. This function is thread-safe, and cannot fail. This function does nothing on builds with the :term:`GIL` enabled, which do not support deferred reference counting. This also does nothing if *obj* is not @@ -609,7 +610,8 @@ Object Protocol :c:func:`PyObject_GC_IsTracked`). This function is intended to be used soon after *obj* is created, - by the code that creates it. + by the code that creates it, such as in the object's :c:member:`~PyTypeObject.tp_new` + slot. .. versionadded:: 3.14 From e1dc08bd9a20783e40c09fc68fd21658e1ec67e7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 08:58:45 +0200 Subject: [PATCH 0629/1674] [3.14] gh-134833: improve docs for `del s[i:j]` in `Mutable Sequence Types` (GH-134834) (#136608) gh-134833: improve docs for `del s[i:j]` in `Mutable Sequence Types` (GH-134834) (cherry picked from commit 609d5adc7cc241da8fe314a64ddd2c8a883ee8b7) Co-authored-by: Yongzi Li <204532581+Yzi-Li@users.noreply.github.com> --- Doc/library/stdtypes.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 394c302fd354b9..8e688f03eb3a87 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1223,7 +1223,9 @@ accepts integers that meet the value restriction ``0 <= x <= 255``). | | is replaced by the contents of | | | | the iterable *t* | | +------------------------------+--------------------------------+---------------------+ -| ``del s[i:j]`` | same as ``s[i:j] = []`` | | +| ``del s[i:j]`` | removes the elements of | | +| | ``s[i:j]`` from the list | | +| | (same as ``s[i:j] = []``) | | +------------------------------+--------------------------------+---------------------+ | ``s[i:j:k] = t`` | the elements of ``s[i:j:k]`` | \(1) | | | are replaced by those of *t* | | From 9ee72ab266a15906aa7e714ac601b3186e1ef51c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 11:17:48 +0200 Subject: [PATCH 0630/1674] [3.14] gh-132346: Docs: Clarify that reference counts aren't stable between versions (GH-132352) (GH-136613) gh-132346: Docs: Clarify that reference counts aren't stable between versions (GH-132352) (cherry picked from commit 3dbe02ccd3eefc48ac9fa14427bb4cdb82d1ebae) Co-authored-by: Peter Bierma --- Doc/glossary.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 705b0a9279c6d4..199a917f9f101e 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1208,6 +1208,11 @@ Glossary :func:`sys.getrefcount` function to return the reference count for a particular object. + In :term:`CPython`, reference counts are not considered to be stable + or well-defined values; the number of references to an object, and how + that number is affected by Python code, may be different between + versions. + regular package A traditional :term:`package`, such as a directory containing an ``__init__.py`` file. From ed1e0cdc581d328177992e45c74d497c7da22ce2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:19:23 +0200 Subject: [PATCH 0631/1674] [3.14] gh-42237: Link to complete list of codec aliases (GH-136625) (#136626) gh-42237: Link to complete list of codec aliases (GH-136625) Closes GH-42237 (cherry picked from commit a93d9aaf62bb2565e9eec00a2a8d06a91305127b) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index c5dae7c8e8fd04..1cb0e225bca043 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1065,8 +1065,15 @@ or with dictionaries as mapping tables. The following table lists the codecs by name, together with a few common aliases, and the languages for which the encoding is likely used. Neither the list of aliases nor the list of languages is meant to be exhaustive. Notice that spelling alternatives that only differ in -case or use a hyphen instead of an underscore are also valid aliases; therefore, -e.g. ``'utf-8'`` is a valid alias for the ``'utf_8'`` codec. +case or use a hyphen instead of an underscore are also valid aliases +because they are equivalent when normalized by +:func:`~encodings.normalize_encoding`. For example, ``'utf-8'`` is a valid +alias for the ``'utf_8'`` codec. + +.. note:: + + The below table lists the most common aliases, for a complete list + refer to the source :source:`aliases.py ` file. On Windows, ``cpXXX`` codecs are available for all code pages. But only codecs listed in the following table are guarantead to exist on From 348e22cf060695fbd57f099b94f0f9067bb49fca Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:58:03 +0200 Subject: [PATCH 0632/1674] [3.14] gh-127971: fix off-by-one read beyond the end of a string during search (GH-132574) (#136628) gh-127971: fix off-by-one read beyond the end of a string during search (GH-132574) (cherry picked from commit 85ec3b3b503ffd5b7e45f8b3fa2cec0c10e4bef0) Co-authored-by: Duane Griffin --- Lib/test/string_tests.py | 9 +++++++++ .../2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst | 1 + Objects/stringlib/fastsearch.h | 8 ++++---- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 4b82d51b4508ac..1814a55b74ea0c 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -767,6 +767,15 @@ def test_replace(self): self.checkraises(TypeError, 'hello', 'replace', 42, 'h') self.checkraises(TypeError, 'hello', 'replace', 'h', 42) + def test_replacement_on_buffer_boundary(self): + # gh-127971: Check we don't read past the end of the buffer when a + # potential match misses on the last character. + any_3_nonblank_codepoints = '!!!' + seven_codepoints = any_3_nonblank_codepoints + ' ' + any_3_nonblank_codepoints + a = (' ' * 243) + seven_codepoints + (' ' * 7) + b = ' ' * 6 + chr(256) + a.replace(seven_codepoints, b) + def test_replace_uses_two_way_maxcount(self): # Test that maxcount works in _two_way_count in fastsearch.h A, B = "A"*1000, "B"*1000 diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst new file mode 100644 index 00000000000000..ced7a9c9fd3e63 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst @@ -0,0 +1 @@ +Fix off-by-one read beyond the end of a string in string search. diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h index 05e700b06258f0..b447865c986bef 100644 --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -595,7 +595,7 @@ STRINGLIB(default_find)(const STRINGLIB_CHAR* s, Py_ssize_t n, continue; } /* miss: check if next character is part of pattern */ - if (!STRINGLIB_BLOOM(mask, ss[i+1])) { + if (i + 1 <= w && !STRINGLIB_BLOOM(mask, ss[i+1])) { i = i + m; } else { @@ -604,7 +604,7 @@ STRINGLIB(default_find)(const STRINGLIB_CHAR* s, Py_ssize_t n, } else { /* skip: check if next character is part of pattern */ - if (!STRINGLIB_BLOOM(mask, ss[i+1])) { + if (i + 1 <= w && !STRINGLIB_BLOOM(mask, ss[i+1])) { i = i + m; } } @@ -668,7 +668,7 @@ STRINGLIB(adaptive_find)(const STRINGLIB_CHAR* s, Py_ssize_t n, } } /* miss: check if next character is part of pattern */ - if (!STRINGLIB_BLOOM(mask, ss[i+1])) { + if (i + 1 <= w && !STRINGLIB_BLOOM(mask, ss[i+1])) { i = i + m; } else { @@ -677,7 +677,7 @@ STRINGLIB(adaptive_find)(const STRINGLIB_CHAR* s, Py_ssize_t n, } else { /* skip: check if next character is part of pattern */ - if (!STRINGLIB_BLOOM(mask, ss[i+1])) { + if (i + 1 <= w && !STRINGLIB_BLOOM(mask, ss[i+1])) { i = i + m; } } From ba070b6b07ec0fdd9a0258270e4a111100c0d4db Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 13 Jul 2025 22:52:02 +0200 Subject: [PATCH 0633/1674] [3.14] gh-135256: Simplify parsing parameters in Argument Clinic (GH-135257) (121914136635) (cherry picked from commit b74fb8e220a50a9580320dfd398a16995b845c69) Co-authored-by: Serhiy Storchaka --- Lib/test/test_clinic.py | 12 ++---- Tools/clinic/libclinic/dsl_parser.py | 64 ++++++---------------------- 2 files changed, 17 insertions(+), 59 deletions(-) diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 05e46a18b0a92a..4b1f5991a39ee8 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -1277,12 +1277,8 @@ def test_base_invalid_syntax(self): os.stat invalid syntax: int = 42 """ - err = dedent(r""" - Function 'stat' has an invalid parameter declaration: - \s+'invalid syntax: int = 42' - """).strip() - with self.assertRaisesRegex(ClinicError, err): - self.parse_function(block) + err = "Function 'stat' has an invalid parameter declaration: 'invalid syntax: int = 42'" + self.expect_failure(block, err, lineno=2) def test_param_default_invalid_syntax(self): block = """ @@ -1290,7 +1286,7 @@ def test_param_default_invalid_syntax(self): os.stat x: int = invalid syntax """ - err = r"Syntax error: 'x = invalid syntax\n'" + err = "Function 'stat' has an invalid parameter declaration:" self.expect_failure(block, err, lineno=2) def test_cloning_nonexistent_function_correctly_fails(self): @@ -2510,7 +2506,7 @@ def test_cannot_specify_pydefault_without_default(self): self.expect_failure(block, err, lineno=1) def test_vararg_cannot_take_default_value(self): - err = "Vararg can't take a default value!" + err = "Function 'fn' has an invalid parameter declaration:" block = """ fn *args: tuple = None diff --git a/Tools/clinic/libclinic/dsl_parser.py b/Tools/clinic/libclinic/dsl_parser.py index 282ff64cd33089..eca41531f7c8e9 100644 --- a/Tools/clinic/libclinic/dsl_parser.py +++ b/Tools/clinic/libclinic/dsl_parser.py @@ -877,43 +877,16 @@ def parse_parameter(self, line: str) -> None: # handle "as" for parameters too c_name = None - name, have_as_token, trailing = line.partition(' as ') - if have_as_token: - name = name.strip() - if ' ' not in name: - fields = trailing.strip().split(' ') - if not fields: - fail("Invalid 'as' clause!") - c_name = fields[0] - if c_name.endswith(':'): - name += ':' - c_name = c_name[:-1] - fields[0] = name - line = ' '.join(fields) - - default: str | None - base, equals, default = line.rpartition('=') - if not equals: - base = default - default = None - - module = None + m = re.match(r'(?:\* *)?\w+( +as +(\w+))', line) + if m: + c_name = m[2] + line = line[:m.start(1)] + line[m.end(1):] + try: - ast_input = f"def x({base}): pass" + ast_input = f"def x({line}\n): pass" module = ast.parse(ast_input) except SyntaxError: - try: - # the last = was probably inside a function call, like - # c: int(accept={str}) - # so assume there was no actual default value. - default = None - ast_input = f"def x({line}): pass" - module = ast.parse(ast_input) - except SyntaxError: - pass - if not module: - fail(f"Function {self.function.name!r} has an invalid parameter declaration:\n\t", - repr(line)) + fail(f"Function {self.function.name!r} has an invalid parameter declaration: {line!r}") function = module.body[0] assert isinstance(function, ast.FunctionDef) @@ -922,9 +895,6 @@ def parse_parameter(self, line: str) -> None: if len(function_args.args) > 1: fail(f"Function {self.function.name!r} has an " f"invalid parameter declaration (comma?): {line!r}") - if function_args.defaults or function_args.kw_defaults: - fail(f"Function {self.function.name!r} has an " - f"invalid parameter declaration (default value?): {line!r}") if function_args.kwarg: fail(f"Function {self.function.name!r} has an " f"invalid parameter declaration (**kwargs?): {line!r}") @@ -944,7 +914,7 @@ def parse_parameter(self, line: str) -> None: name = 'varpos_' + name value: object - if not default: + if not function_args.defaults: if is_vararg: value = NULL else: @@ -955,17 +925,13 @@ def parse_parameter(self, line: str) -> None: if 'py_default' in kwargs: fail("You can't specify py_default without specifying a default value!") else: - if is_vararg: - fail("Vararg can't take a default value!") + expr = function_args.defaults[0] + default = ast_input[expr.col_offset: expr.end_col_offset].strip() if self.parameter_state is ParamState.REQUIRED: self.parameter_state = ParamState.OPTIONAL - default = default.strip() bad = False - ast_input = f"x = {default}" try: - module = ast.parse(ast_input) - if 'c_default' not in kwargs: # we can only represent very simple data values in C. # detect whether default is okay, via a denylist @@ -992,13 +958,14 @@ def bad_node(self, node: ast.AST) -> None: visit_Starred = bad_node denylist = DetectBadNodes() - denylist.visit(module) + denylist.visit(expr) bad = denylist.bad else: # if they specify a c_default, we can be more lenient about the default value. # but at least make an attempt at ensuring it's a valid expression. + code = compile(ast.Expression(expr), '', 'eval') try: - value = eval(default) + value = eval(code) except NameError: pass # probably a named constant except Exception as e: @@ -1010,9 +977,6 @@ def bad_node(self, node: ast.AST) -> None: if bad: fail(f"Unsupported expression as default value: {default!r}") - assignment = module.body[0] - assert isinstance(assignment, ast.Assign) - expr = assignment.value # mild hack: explicitly support NULL as a default value c_default: str | None if isinstance(expr, ast.Name) and expr.id == 'NULL': @@ -1064,8 +1028,6 @@ def bad_node(self, node: ast.AST) -> None: else: c_default = py_default - except SyntaxError as e: - fail(f"Syntax error: {e.text!r}") except (ValueError, AttributeError): value = unknown c_default = kwargs.get("c_default") From 261818061eb38ac42f9bc35335361c8c55f47b3b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 14 Jul 2025 04:49:36 +0200 Subject: [PATCH 0634/1674] [3.14] gh-127146: Emscripten: Fix test_open_undecodable_uri by setting `-sTEXTDECODER=2` (GH-136624) (#136631) Removes the JS text decoder fallback and gets rid of the bugs due to the differences in behavior on invalid utf8 strings. See https://github.com/emscripten-core/emscripten/issues/24690. (cherry picked from commit 283b05052338dd735cd4927011afc3735d9c6c7c) Co-authored-by: Hood Chatham --- configure | 1 + configure.ac | 2 ++ 2 files changed, 3 insertions(+) diff --git a/configure b/configure index a62f1ae7cac52d..67a40b841aa506 100755 --- a/configure +++ b/configure @@ -9606,6 +9606,7 @@ fi as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV" as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,__Py_DumpTraceback" as_fn_append LINKFORSHARED " -sSTACK_SIZE=5MB" + as_fn_append LINKFORSHARED " -sTEXTDECODER=2" if test "x$enable_wasm_dynamic_linking" = xyes then : diff --git a/configure.ac b/configure.ac index d644c0ca772cd5..bbd0fa8c1ae8f6 100644 --- a/configure.ac +++ b/configure.ac @@ -2338,6 +2338,8 @@ AS_CASE([$ac_sys_system], AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV"]) AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,__Py_DumpTraceback"]) AS_VAR_APPEND([LINKFORSHARED], [" -sSTACK_SIZE=5MB"]) + dnl Avoid bugs in JS fallback string decoding path + AS_VAR_APPEND([LINKFORSHARED], [" -sTEXTDECODER=2"]) AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [ AS_VAR_APPEND([LINKFORSHARED], [" -sMAIN_MODULE"]) From bbbbb2e2d15794bfcaacfdf2bce43ca7032fe50f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:19:23 +0200 Subject: [PATCH 0635/1674] [3.14] Partially revert "gh-101100: Fix sphinx warnings in `library/email.parser.rst` (GH-136475)" (GH-136629) (#136646) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/email.parser.rst | 6 +++--- Doc/tools/.nitignore | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/email.parser.rst b/Doc/library/email.parser.rst index 90796370ebb407..6a70714dc3ee42 100644 --- a/Doc/library/email.parser.rst +++ b/Doc/library/email.parser.rst @@ -48,8 +48,8 @@ methods. FeedParser API ^^^^^^^^^^^^^^ -The :class:`BytesFeedParser`, imported from the :mod:`email.parser.FeedParser` -module, provides an API that is conducive to incremental parsing of email messages, +The :class:`BytesFeedParser`, imported from the :mod:`email.feedparser` module, +provides an API that is conducive to incremental parsing of email messages, such as would be necessary when reading the text of an email message from a source that can block (such as a socket). The :class:`BytesFeedParser` can of course be used to parse an email message fully contained in a :term:`bytes-like @@ -155,7 +155,7 @@ message body, instead setting the payload to the raw body. Read all the data from the binary file-like object *fp*, parse the resulting bytes, and return the message object. *fp* must support - both the :meth:`~io.IOBase.readline` and the :meth:`~io.TextIOBase.read` + both the :meth:`~io.IOBase.readline` and the :meth:`~io.IOBase.read` methods. The bytes contained in *fp* must be formatted as a block of :rfc:`5322` diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 510225afab8933..31b2e567f11056 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -15,6 +15,7 @@ Doc/extending/extending.rst Doc/library/ast.rst Doc/library/asyncio-extending.rst Doc/library/email.charset.rst +Doc/library/email.parser.rst Doc/library/http.cookiejar.rst Doc/library/http.server.rst Doc/library/importlib.rst From 55eaaab8a4064ef76013a82c16c9991eba30dfeb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 07:33:33 +0200 Subject: [PATCH 0636/1674] [3.14] gh-116738: Make grp module thread-safe (GH-135434) (#136658) gh-116738: Make grp module thread-safe (GH-135434) Make grp module methods getgrgid() and getgrnam() thread-safe when the GIL is disabled and getgrgid_r()/getgrnam_r() C APIs are not available. --------- (cherry picked from commit 9363703bd3bf86e363c14a02e3d729caf1e29f44) Co-authored-by: Alper Co-authored-by: Kumar Aditya --- Doc/library/test.rst | 7 ++ Lib/test/support/threading_helper.py | 24 +++++++ Lib/test/test_free_threading/test_grp.py | 35 ++++++++++ Lib/test/test_free_threading/test_heapq.py | 66 +++++++------------ ...-06-12-00-03-34.gh-issue-116738.iBBAdo.rst | 1 + Modules/grpmodule.c | 27 +++++++- Tools/c-analyzer/cpython/ignored.tsv | 1 + 7 files changed, 115 insertions(+), 46 deletions(-) create mode 100644 Lib/test/test_free_threading/test_grp.py create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 0aae14c15a6104..9fdb21b8badbbf 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1384,6 +1384,13 @@ The :mod:`test.support.threading_helper` module provides support for threading t .. versionadded:: 3.8 +.. function:: run_concurrently(worker_func, nthreads, args=(), kwargs={}) + + Run the worker function concurrently in multiple threads. + Re-raises an exception if any thread raises one, after all threads have + finished. + + :mod:`test.support.os_helper` --- Utilities for os tests ======================================================================== diff --git a/Lib/test/support/threading_helper.py b/Lib/test/support/threading_helper.py index afa25a76f63829..3e04c344a0d66f 100644 --- a/Lib/test/support/threading_helper.py +++ b/Lib/test/support/threading_helper.py @@ -248,3 +248,27 @@ def requires_working_threading(*, module=False): raise unittest.SkipTest(msg) else: return unittest.skipUnless(can_start_thread, msg) + + +def run_concurrently(worker_func, nthreads, args=(), kwargs={}): + """ + Run the worker function concurrently in multiple threads. + """ + barrier = threading.Barrier(nthreads) + + def wrapper_func(*args, **kwargs): + # Wait for all threads to reach this point before proceeding. + barrier.wait() + worker_func(*args, **kwargs) + + with catch_threading_exception() as cm: + workers = [ + threading.Thread(target=wrapper_func, args=args, kwargs=kwargs) + for _ in range(nthreads) + ] + with start_threads(workers): + pass + + # If a worker thread raises an exception, re-raise it. + if cm.exc_value is not None: + raise cm.exc_value diff --git a/Lib/test/test_free_threading/test_grp.py b/Lib/test/test_free_threading/test_grp.py new file mode 100644 index 00000000000000..1a47a9757702be --- /dev/null +++ b/Lib/test/test_free_threading/test_grp.py @@ -0,0 +1,35 @@ +import unittest + +from test.support import import_helper, threading_helper +from test.support.threading_helper import run_concurrently + +grp = import_helper.import_module("grp") + +from test import test_grp + + +NTHREADS = 10 + + +@threading_helper.requires_working_threading() +class TestGrp(unittest.TestCase): + def setUp(self): + self.test_grp = test_grp.GroupDatabaseTestCase() + + def test_racing_test_values(self): + # test_grp.test_values() calls grp.getgrall() and checks the entries + run_concurrently( + worker_func=self.test_grp.test_values, nthreads=NTHREADS + ) + + def test_racing_test_values_extended(self): + # test_grp.test_values_extended() calls grp.getgrall(), grp.getgrgid(), + # grp.getgrnam() and checks the entries + run_concurrently( + worker_func=self.test_grp.test_values_extended, + nthreads=NTHREADS, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_free_threading/test_heapq.py b/Lib/test/test_free_threading/test_heapq.py index ee7adfb2b78d83..d771333ffcc9e0 100644 --- a/Lib/test/test_free_threading/test_heapq.py +++ b/Lib/test/test_free_threading/test_heapq.py @@ -3,10 +3,11 @@ import heapq from enum import Enum -from threading import Thread, Barrier, Lock +from threading import Barrier, Lock from random import shuffle, randint from test.support import threading_helper +from test.support.threading_helper import run_concurrently from test import test_heapq @@ -28,8 +29,8 @@ def test_racing_heapify(self): heap = list(range(OBJECT_COUNT)) shuffle(heap) - self.run_concurrently( - worker_func=heapq.heapify, args=(heap,), nthreads=NTHREADS + run_concurrently( + worker_func=heapq.heapify, nthreads=NTHREADS, args=(heap,) ) self.test_heapq.check_invariant(heap) @@ -40,8 +41,8 @@ def heappush_func(heap): for item in reversed(range(OBJECT_COUNT)): heapq.heappush(heap, item) - self.run_concurrently( - worker_func=heappush_func, args=(heap,), nthreads=NTHREADS + run_concurrently( + worker_func=heappush_func, nthreads=NTHREADS, args=(heap,) ) self.test_heapq.check_invariant(heap) @@ -61,10 +62,10 @@ def heappop_func(heap, pop_count): # Each local list should be sorted self.assertTrue(self.is_sorted_ascending(local_list)) - self.run_concurrently( + run_concurrently( worker_func=heappop_func, - args=(heap, per_thread_pop_count), nthreads=NTHREADS, + args=(heap, per_thread_pop_count), ) self.assertEqual(len(heap), 0) @@ -77,10 +78,10 @@ def heappushpop_func(heap, pushpop_items): popped_item = heapq.heappushpop(heap, item) self.assertTrue(popped_item <= item) - self.run_concurrently( + run_concurrently( worker_func=heappushpop_func, - args=(heap, pushpop_items), nthreads=NTHREADS, + args=(heap, pushpop_items), ) self.assertEqual(len(heap), OBJECT_COUNT) self.test_heapq.check_invariant(heap) @@ -93,10 +94,10 @@ def heapreplace_func(heap, replace_items): for item in replace_items: heapq.heapreplace(heap, item) - self.run_concurrently( + run_concurrently( worker_func=heapreplace_func, - args=(heap, replace_items), nthreads=NTHREADS, + args=(heap, replace_items), ) self.assertEqual(len(heap), OBJECT_COUNT) self.test_heapq.check_invariant(heap) @@ -105,8 +106,8 @@ def test_racing_heapify_max(self): max_heap = list(range(OBJECT_COUNT)) shuffle(max_heap) - self.run_concurrently( - worker_func=heapq.heapify_max, args=(max_heap,), nthreads=NTHREADS + run_concurrently( + worker_func=heapq.heapify_max, nthreads=NTHREADS, args=(max_heap,) ) self.test_heapq.check_max_invariant(max_heap) @@ -117,8 +118,8 @@ def heappush_max_func(max_heap): for item in range(OBJECT_COUNT): heapq.heappush_max(max_heap, item) - self.run_concurrently( - worker_func=heappush_max_func, args=(max_heap,), nthreads=NTHREADS + run_concurrently( + worker_func=heappush_max_func, nthreads=NTHREADS, args=(max_heap,) ) self.test_heapq.check_max_invariant(max_heap) @@ -138,10 +139,10 @@ def heappop_max_func(max_heap, pop_count): # Each local list should be sorted self.assertTrue(self.is_sorted_descending(local_list)) - self.run_concurrently( + run_concurrently( worker_func=heappop_max_func, - args=(max_heap, per_thread_pop_count), nthreads=NTHREADS, + args=(max_heap, per_thread_pop_count), ) self.assertEqual(len(max_heap), 0) @@ -154,10 +155,10 @@ def heappushpop_max_func(max_heap, pushpop_items): popped_item = heapq.heappushpop_max(max_heap, item) self.assertTrue(popped_item >= item) - self.run_concurrently( + run_concurrently( worker_func=heappushpop_max_func, - args=(max_heap, pushpop_items), nthreads=NTHREADS, + args=(max_heap, pushpop_items), ) self.assertEqual(len(max_heap), OBJECT_COUNT) self.test_heapq.check_max_invariant(max_heap) @@ -170,10 +171,10 @@ def heapreplace_max_func(max_heap, replace_items): for item in replace_items: heapq.heapreplace_max(max_heap, item) - self.run_concurrently( + run_concurrently( worker_func=heapreplace_max_func, - args=(max_heap, replace_items), nthreads=NTHREADS, + args=(max_heap, replace_items), ) self.assertEqual(len(max_heap), OBJECT_COUNT) self.test_heapq.check_max_invariant(max_heap) @@ -203,7 +204,7 @@ def worker(): except IndexError: pass - self.run_concurrently(worker, (), n_threads * 2) + run_concurrently(worker, n_threads * 2) @staticmethod def is_sorted_ascending(lst): @@ -241,27 +242,6 @@ def create_random_list(a, b, size): """ return [randint(-a, b) for _ in range(size)] - def run_concurrently(self, worker_func, args, nthreads): - """ - Run the worker function concurrently in multiple threads. - """ - barrier = Barrier(nthreads) - - def wrapper_func(*args): - # Wait for all threads to reach this point before proceeding. - barrier.wait() - worker_func(*args) - - with threading_helper.catch_threading_exception() as cm: - workers = ( - Thread(target=wrapper_func, args=args) for _ in range(nthreads) - ) - with threading_helper.start_threads(workers): - pass - - # Worker threads should not raise any exceptions - self.assertIsNone(cm.exc_value) - if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst new file mode 100644 index 00000000000000..2a1ed2944d8ddf --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst @@ -0,0 +1 @@ +Make functions in :mod:`grp` thread-safe on the :term:`free threaded ` build. diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index 29da9936b65504..652958618a2c4c 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -55,6 +55,11 @@ get_grp_state(PyObject *module) static struct PyModuleDef grpmodule; +/* Mutex to protect calls to getgrgid(), getgrnam(), and getgrent(). + * These functions return pointer to static data structure, which + * may be overwritten by any subsequent calls. */ +static PyMutex group_db_mutex = {0}; + #define DEFAULT_BUFFER_SIZE 1024 static PyObject * @@ -168,9 +173,15 @@ grp_getgrgid_impl(PyObject *module, PyObject *id) Py_END_ALLOW_THREADS #else + PyMutex_Lock(&group_db_mutex); + // The getgrgid() function need not be thread-safe. + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrgid.html p = getgrgid(gid); #endif if (p == NULL) { +#ifndef HAVE_GETGRGID_R + PyMutex_Unlock(&group_db_mutex); +#endif PyMem_RawFree(buf); if (nomem == 1) { return PyErr_NoMemory(); @@ -185,6 +196,8 @@ grp_getgrgid_impl(PyObject *module, PyObject *id) retval = mkgrent(module, p); #ifdef HAVE_GETGRGID_R PyMem_RawFree(buf); +#else + PyMutex_Unlock(&group_db_mutex); #endif return retval; } @@ -249,9 +262,15 @@ grp_getgrnam_impl(PyObject *module, PyObject *name) Py_END_ALLOW_THREADS #else + PyMutex_Lock(&group_db_mutex); + // The getgrnam() function need not be thread-safe. + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrnam.html p = getgrnam(name_chars); #endif if (p == NULL) { +#ifndef HAVE_GETGRNAM_R + PyMutex_Unlock(&group_db_mutex); +#endif if (nomem == 1) { PyErr_NoMemory(); } @@ -261,6 +280,9 @@ grp_getgrnam_impl(PyObject *module, PyObject *name) goto out; } retval = mkgrent(module, p); +#ifndef HAVE_GETGRNAM_R + PyMutex_Unlock(&group_db_mutex); +#endif out: PyMem_RawFree(buf); Py_DECREF(bytes); @@ -285,8 +307,7 @@ grp_getgrall_impl(PyObject *module) return NULL; } - static PyMutex getgrall_mutex = {0}; - PyMutex_Lock(&getgrall_mutex); + PyMutex_Lock(&group_db_mutex); setgrent(); struct group *p; @@ -306,7 +327,7 @@ grp_getgrall_impl(PyObject *module) done: endgrent(); - PyMutex_Unlock(&getgrall_mutex); + PyMutex_Unlock(&group_db_mutex); return d; } diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index b128abca39fb41..d5d806be42f39d 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -167,6 +167,7 @@ Python/sysmodule.c - _preinit_xoptions - # XXX need race protection? Modules/faulthandler.c faulthandler_dump_traceback reentrant - Modules/faulthandler.c faulthandler_dump_c_stack reentrant - +Modules/grpmodule.c - group_db_mutex - Python/pylifecycle.c _Py_FatalErrorFormat reentrant - Python/pylifecycle.c fatal_error reentrant - From 088d79e3ee86d31fe69caed1247db7b624f243b5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 07:36:47 +0200 Subject: [PATCH 0637/1674] [3.14] gh-136663: fix signatures of PyFloat_Pack/Unpack in docs (GH-136664) (#136666) gh-136663: fix signatures of PyFloat_Pack/Unpack in docs (GH-136664) (cherry picked from commit e4654e0b3e7d802c8fe984cf39a36a42b67de1ad) Co-authored-by: Sergey B Kirpichev --- Doc/c-api/float.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index c5a7653efca26b..489676caa3a16a 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -124,15 +124,15 @@ There are two problems on non-IEEE platforms: * What this does is undefined if *x* is a NaN or infinity. * ``-0.0`` and ``+0.0`` produce the same bytes string. -.. c:function:: int PyFloat_Pack2(double x, unsigned char *p, int le) +.. c:function:: int PyFloat_Pack2(double x, char *p, int le) Pack a C double as the IEEE 754 binary16 half-precision format. -.. c:function:: int PyFloat_Pack4(double x, unsigned char *p, int le) +.. c:function:: int PyFloat_Pack4(double x, char *p, int le) Pack a C double as the IEEE 754 binary32 single precision format. -.. c:function:: int PyFloat_Pack8(double x, unsigned char *p, int le) +.. c:function:: int PyFloat_Pack8(double x, char *p, int le) Pack a C double as the IEEE 754 binary64 double precision format. @@ -154,14 +154,14 @@ Return value: The unpacked double. On error, this is ``-1.0`` and Note that on a non-IEEE platform this will refuse to unpack a bytes string that represents a NaN or infinity. -.. c:function:: double PyFloat_Unpack2(const unsigned char *p, int le) +.. c:function:: double PyFloat_Unpack2(const char *p, int le) Unpack the IEEE 754 binary16 half-precision format as a C double. -.. c:function:: double PyFloat_Unpack4(const unsigned char *p, int le) +.. c:function:: double PyFloat_Unpack4(const char *p, int le) Unpack the IEEE 754 binary32 single precision format as a C double. -.. c:function:: double PyFloat_Unpack8(const unsigned char *p, int le) +.. c:function:: double PyFloat_Unpack8(const char *p, int le) Unpack the IEEE 754 binary64 double precision format as a C double. From 115477399bb962193026a3035ab07a1c0cd52f9f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 10:12:45 +0200 Subject: [PATCH 0638/1674] [3.14] gh-131189: Fix "msvcrt" import warning on Linux when "_ctypes" is not available. (GH-131201) (GH-136668) Fix "msvcrt" import warning on Linux when "_ctypes" is not available. On Linux, compiling without "libffi" causes a "No module named 'msvcrt'" warning when launching PyREPL. (cherry picked from commit f320c951c3220aa6727b581216463e8b3f8bcd6b) Co-authored-by: Dzmitry Plashchynski --- Lib/_pyrepl/readline.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/_pyrepl/readline.py b/Lib/_pyrepl/readline.py index 9560ae779abfea..23b8fa6b9c7625 100644 --- a/Lib/_pyrepl/readline.py +++ b/Lib/_pyrepl/readline.py @@ -43,10 +43,11 @@ Console: type[ConsoleType] _error: tuple[type[Exception], ...] | type[Exception] -try: - from .unix_console import UnixConsole as Console, _error -except ImportError: + +if os.name == "nt": from .windows_console import WindowsConsole as Console, _error +else: + from .unix_console import UnixConsole as Console, _error ENCODING = sys.getdefaultencoding() or "latin1" From 2ae0eb1a87a6cb991f9639aedb756841cd5dca69 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:22:24 +0200 Subject: [PATCH 0639/1674] [3.14] GH-132661: Add ``string.templatelib.convert()`` (GH-135217) (#136671) GH-132661: Add ``string.templatelib.convert()`` (GH-135217) (cherry picked from commit 5b969fd64502a6e2ba6513e2b18beaeae58b8aa1) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Lib/string/templatelib.py | 17 ++++++++++++----- Lib/test/test_string/test_templatelib.py | 22 +++++++++++++++++++++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Lib/string/templatelib.py b/Lib/string/templatelib.py index 14b40e1e36e30b..8164872432ad09 100644 --- a/Lib/string/templatelib.py +++ b/Lib/string/templatelib.py @@ -1,15 +1,22 @@ """Support for template string literals (t-strings).""" -__all__ = [ - "Interpolation", - "Template", -] - t = t"{0}" Template = type(t) Interpolation = type(t.interpolations[0]) del t +def convert(obj, /, conversion): + """Convert *obj* using formatted string literal semantics.""" + if conversion is None: + return obj + if conversion == 'r': + return repr(obj) + if conversion == 's': + return str(obj) + if conversion == 'a': + return ascii(obj) + raise ValueError(f'invalid conversion specifier: {conversion}') + def _template_unpickle(*args): import itertools diff --git a/Lib/test/test_string/test_templatelib.py b/Lib/test/test_string/test_templatelib.py index adaf590e64dad6..1c86717155fd5a 100644 --- a/Lib/test/test_string/test_templatelib.py +++ b/Lib/test/test_string/test_templatelib.py @@ -1,7 +1,7 @@ import pickle import unittest from collections.abc import Iterator, Iterable -from string.templatelib import Template, Interpolation +from string.templatelib import Template, Interpolation, convert from test.test_string._support import TStringBaseCase, fstring @@ -169,5 +169,25 @@ def test_exhausted(self): self.assertRaises(StopIteration, next, template_iter) +class TestFunctions(unittest.TestCase): + def test_convert(self): + from fractions import Fraction + + for obj in ('Café', None, 3.14, Fraction(1, 2)): + with self.subTest(f'{obj=}'): + self.assertEqual(convert(obj, None), obj) + self.assertEqual(convert(obj, 's'), str(obj)) + self.assertEqual(convert(obj, 'r'), repr(obj)) + self.assertEqual(convert(obj, 'a'), ascii(obj)) + + # Invalid conversion specifier + with self.assertRaises(ValueError): + convert(obj, 'z') + with self.assertRaises(ValueError): + convert(obj, 1) + with self.assertRaises(ValueError): + convert(obj, object()) + + if __name__ == '__main__': unittest.main() From 45b72c447cecad5a904507836eaf146a213d81c4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 14:09:54 +0200 Subject: [PATCH 0640/1674] [3.14] gh-72570: mention the incompatibility of XOFs with HMAC (GH-136676) (#136678) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-72570: mention the incompatibility of XOFs with HMAC (GH-136676) (cherry picked from commit a02cf19deed353d1e0e7564468f10aced61c12e8) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/hmac.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst index d6692033b2d4c3..57076c38086c79 100644 --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -12,6 +12,9 @@ -------------- This module implements the HMAC algorithm as described by :rfc:`2104`. +The interface allows to use any hash function with a *fixed* digest size. +In particular, extendable output functions such as SHAKE-128 or SHAKE-256 +cannot be used with HMAC. .. function:: new(key, msg=None, digestmod) From c939963b53600062f0978c99559e22ab39135402 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 14:59:38 +0200 Subject: [PATCH 0641/1674] [3.14] gh-136682: Remove incorrect statement that `os.path.samestat` accepts file-like objects (GH-136683) (#136684) gh-136682: Remove incorrect statement that `os.path.samestat` accepts file-like objects (GH-136683) (cherry picked from commit 7e10a103dfe52feb0ef3d541e08abc2640838101) Co-authored-by: Ran Benita --- Doc/library/os.path.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 32a2970d2d3a2c..3f2574e55699bf 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -508,9 +508,6 @@ the :mod:`glob` module.) .. versionchanged:: 3.4 Added Windows support. - .. versionchanged:: 3.6 - Accepts a :term:`path-like object`. - .. function:: split(path) From 9ae74e94a06865aee96827838ce16c8924cbe86f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:10:37 +0200 Subject: [PATCH 0642/1674] [3.14] gh-136396: Include instrumentation when creating new copies of the bytecode (GH-136525) (GH-136657) Previously, we assumed that instrumentation would happen for all copies of the bytecode if the instrumentation version on the code object didn't match the per-interpreter instrumentation version. That assumption was incorrect: instrumentation will exit early if there are no new "events," even if there is an instrumentation version mismatch. To fix this, include the instrumented opcodes when creating new copies of the bytecode, rather than replacing them with their uninstrumented variants. I don't think we have to worry about races between instrumentation and creating new copies of the bytecode: instrumentation and new bytecode creation cannot happen concurrently. Instrumentation requires that either the world is stopped or the code object's per-object lock is held and new bytecode creation requires holding the code object's per-object lock. (cherry picked from commit d995922198304a6de19ac1bec3e36d1e886d8468) Co-authored-by: mpage Co-authored-by: Kumar Aditya --- .../test_free_threading/test_monitoring.py | 141 ++++++++++++++++++ ...-07-10-15-53-16.gh-issue-136525.xAko0e.rst | 2 + Objects/codeobject.c | 19 ++- 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst diff --git a/Lib/test/test_free_threading/test_monitoring.py b/Lib/test/test_free_threading/test_monitoring.py index a480e398722c33..c3d0a2bcea5c17 100644 --- a/Lib/test/test_free_threading/test_monitoring.py +++ b/Lib/test/test_free_threading/test_monitoring.py @@ -2,10 +2,12 @@ environment to verify things are thread-safe in a free-threaded build""" import sys +import threading import time import unittest import weakref +from contextlib import contextmanager from sys import monitoring from test.support import threading_helper from threading import Thread, _PyRLock, Barrier @@ -192,6 +194,16 @@ def during_threads(self): self.set = not self.set +class TraceBuf: + def __init__(self): + self.traces = [] + self.traces_lock = threading.Lock() + + def append(self, trace): + with self.traces_lock: + self.traces.append(trace) + + @threading_helper.requires_working_threading() class MonitoringMisc(MonitoringTestMixin, TestCase): def register_callback(self, barrier): @@ -246,6 +258,135 @@ def f(): finally: sys.settrace(None) + def test_toggle_setprofile_no_new_events(self): + # gh-136396: Make sure that profile functions are called for newly + # created threads when profiling is toggled but the set of monitoring + # events doesn't change + traces = [] + + def profiler(frame, event, arg): + traces.append((frame.f_code.co_name, event, arg)) + + def a(x, y): + return b(x, y) + + def b(x, y): + return max(x, y) + + sys.setprofile(profiler) + try: + a(1, 2) + finally: + sys.setprofile(None) + traces.clear() + + def thread_main(x, y): + sys.setprofile(profiler) + try: + a(x, y) + finally: + sys.setprofile(None) + t = Thread(target=thread_main, args=(100, 200)) + t.start() + t.join() + + expected = [ + ("a", "call", None), + ("b", "call", None), + ("b", "c_call", max), + ("b", "c_return", max), + ("b", "return", 200), + ("a", "return", 200), + ("thread_main", "c_call", sys.setprofile), + ] + self.assertEqual(traces, expected) + + def observe_threads(self, observer, buf): + def in_child(ident): + return ident + + def child(ident): + with observer(): + in_child(ident) + + def in_parent(ident): + return ident + + def parent(barrier, ident): + barrier.wait() + with observer(): + t = Thread(target=child, args=(ident,)) + t.start() + t.join() + in_parent(ident) + + num_threads = 5 + barrier = Barrier(num_threads) + threads = [] + for i in range(num_threads): + t = Thread(target=parent, args=(barrier, i)) + t.start() + threads.append(t) + for t in threads: + t.join() + + for i in range(num_threads): + self.assertIn(("in_parent", "return", i), buf.traces) + self.assertIn(("in_child", "return", i), buf.traces) + + def test_profile_threads(self): + buf = TraceBuf() + + def profiler(frame, event, arg): + buf.append((frame.f_code.co_name, event, arg)) + + @contextmanager + def profile(): + sys.setprofile(profiler) + try: + yield + finally: + sys.setprofile(None) + + self.observe_threads(profile, buf) + + def test_trace_threads(self): + buf = TraceBuf() + + def tracer(frame, event, arg): + buf.append((frame.f_code.co_name, event, arg)) + return tracer + + @contextmanager + def trace(): + sys.settrace(tracer) + try: + yield + finally: + sys.settrace(None) + + self.observe_threads(trace, buf) + + def test_monitor_threads(self): + buf = TraceBuf() + + def monitor_py_return(code, off, retval): + buf.append((code.co_name, "return", retval)) + + monitoring.register_callback( + self.tool_id, monitoring.events.PY_RETURN, monitor_py_return + ) + + monitoring.set_events( + self.tool_id, monitoring.events.PY_RETURN + ) + + @contextmanager + def noop(): + yield + + self.observe_threads(noop, buf) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst new file mode 100644 index 00000000000000..f28eb2ca3b71e8 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst @@ -0,0 +1,2 @@ +Fix issue where per-thread bytecode was not instrumented for newly created +threads. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index ba178abc0c071e..42e021679b583f 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -3330,12 +3330,29 @@ _PyCodeArray_New(Py_ssize_t size) return arr; } +// Get the underlying code unit, leaving instrumentation +static _Py_CODEUNIT +deopt_code_unit(PyCodeObject *code, int i) +{ + _Py_CODEUNIT *src_instr = _PyCode_CODE(code) + i; + _Py_CODEUNIT inst = { + .cache = FT_ATOMIC_LOAD_UINT16_RELAXED(*(uint16_t *)src_instr)}; + int opcode = inst.op.code; + if (opcode < MIN_INSTRUMENTED_OPCODE) { + inst.op.code = _PyOpcode_Deopt[opcode]; + assert(inst.op.code < MIN_SPECIALIZED_OPCODE); + } + // JIT should not be enabled with free-threading + assert(inst.op.code != ENTER_EXECUTOR); + return inst; +} + static void copy_code(_Py_CODEUNIT *dst, PyCodeObject *co) { int code_len = (int) Py_SIZE(co); for (int i = 0; i < code_len; i += _PyInstruction_GetLength(co, i)) { - dst[i] = _Py_GetBaseCodeUnit(co, i); + dst[i] = deopt_code_unit(co, i); } _PyCode_Quicken(dst, code_len, 1); } From 323974295d099d9a9ff87887d5e4116b01367141 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:58:52 +0200 Subject: [PATCH 0643/1674] [3.14] Fix index entry and anchor for module.__test__ (GH-136674) (GH-136688) It was "doctest.module attribute". Now it is "module attribute". (cherry picked from commit 7689407fa4406ab79d7e9e02363f50be4ec35b5e) Co-authored-by: Serhiy Storchaka --- Doc/library/doctest.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 8236d703fc1e45..82e570a2a85cd7 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -311,9 +311,13 @@ Which Docstrings Are Examined? The module docstring, and all function, class and method docstrings are searched. Objects imported into the module are not searched. +.. currentmodule:: None + .. attribute:: module.__test__ :no-typesetting: +.. currentmodule:: doctest + 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 From d888f46fba3defa9fa3b39509827768bf3ac01ff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:07:01 +0200 Subject: [PATCH 0644/1674] [3.14] Fix the doctest.testmod() docstring (GH-136675) (GH-136690) __test__ = None is not supported since Python 2.4. (cherry picked from commit cb59eaefeda5ff44ac0c742bff2b8afc023be313) Co-authored-by: Serhiy Storchaka --- Lib/doctest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index dec10a345165da..8860bed2a9f710 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1991,8 +1991,8 @@ def testmod(m=None, name=None, globs=None, verbose=None, from module m (or the current module if m is not supplied), starting with m.__doc__. - Also test examples reachable from dict m.__test__ if it exists and is - not None. m.__test__ maps names to functions, classes and strings; + Also test examples reachable from dict m.__test__ if it exists. + m.__test__ maps names to functions, classes and strings; function and class docstrings are tested even if the name is private; strings are tested directly, as if they were docstrings. From cdf98c3b7ebca89ae2ece1d30f21ee4adc0ef92e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 06:50:51 +0200 Subject: [PATCH 0645/1674] [3.14] gh-127146: Report uid in Emscripten + node as native uid (GH-136509) (#136699) Corrects the handling of getuid on emscripten, which was consistently reporting as 0. (cherry picked from commit e81c4e84b3a8688a367099e3adf9b2fcf914447f) Co-authored-by: Hood Chatham --- Python/emscripten_syscalls.c | 19 +++++++++++++++++++ Tools/c-analyzer/cpython/_parser.py | 1 + configure | 2 +- configure.ac | 2 +- 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Python/emscripten_syscalls.c diff --git a/Python/emscripten_syscalls.c b/Python/emscripten_syscalls.c new file mode 100644 index 00000000000000..7875bfc8fe56ae --- /dev/null +++ b/Python/emscripten_syscalls.c @@ -0,0 +1,19 @@ +#include "emscripten.h" + +// If we're running in node, report the UID of the user in the native system as +// the UID of the user. Since the nodefs will report the uid correctly, if we +// don't make getuid report it correctly too we'll see some permission errors. +// Normally __syscall_getuid32 is a stub that always returns 0 but it is +// defined with weak linkage so we can override it. +EM_JS(int, __syscall_getuid32_js, (void), { + // If we're in node and we can, report the native uid + if (typeof process !== "undefined" && typeof process.getuid === "function") { + return process.getuid(); + } + // Fall back to the stub case of returning 0. + return 0; +}) + +int __syscall_getuid32(void) { + return __syscall_getuid32_js(); +} diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 037fe11ea223c7..cfbf0d14348499 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -66,6 +66,7 @@ def clean_lines(text): Python/dynload_dl.c # dl.h Python/dynload_hpux.c # dl.h Python/emscripten_signal.c +Python/emscripten_syscalls.c Python/thread_pthread.h Python/thread_pthread_stubs.h diff --git a/configure b/configure index 67a40b841aa506..2242865313e57c 100755 --- a/configure +++ b/configure @@ -19077,7 +19077,7 @@ PLATFORM_OBJS= case $ac_sys_system in #( Emscripten) : - as_fn_append PLATFORM_OBJS ' Python/emscripten_signal.o Python/emscripten_trampoline.o' + as_fn_append PLATFORM_OBJS ' Python/emscripten_signal.o Python/emscripten_trampoline.o Python/emscripten_syscalls.o' as_fn_append PLATFORM_HEADERS ' $(srcdir)/Include/internal/pycore_emscripten_signal.h $(srcdir)/Include/internal/pycore_emscripten_trampoline.h' ;; #( *) : diff --git a/configure.ac b/configure.ac index bbd0fa8c1ae8f6..a05b3b18efec36 100644 --- a/configure.ac +++ b/configure.ac @@ -5131,7 +5131,7 @@ PLATFORM_OBJS= AS_CASE([$ac_sys_system], [Emscripten], [ - AS_VAR_APPEND([PLATFORM_OBJS], [' Python/emscripten_signal.o Python/emscripten_trampoline.o']) + AS_VAR_APPEND([PLATFORM_OBJS], [' Python/emscripten_signal.o Python/emscripten_trampoline.o Python/emscripten_syscalls.o']) AS_VAR_APPEND([PLATFORM_HEADERS], [' $(srcdir)/Include/internal/pycore_emscripten_signal.h $(srcdir)/Include/internal/pycore_emscripten_trampoline.h']) ], ) From 677b0e314ccbb7f5cae014fa4edd944f6e5bf857 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 09:26:52 +0200 Subject: [PATCH 0646/1674] [3.14] gh-136523: Fix wave.Wave_write emitting an unraisable when open raises (GH-136529) (GH-136606) (cherry picked from commit 171de05b4884d1353044417ea51a4efcb55ba633) Co-authored-by: Sachin Shah <39803835+inventshah@users.noreply.github.com> --- Lib/test/test_wave.py | 9 +++++++++ Lib/wave.py | 2 ++ .../2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst | 1 + 3 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index 5e771c8de969ec..346a343761a7c1 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -2,6 +2,7 @@ from test import audiotests from test import support import io +import os import struct import sys import wave @@ -222,6 +223,14 @@ def test_read_wrong_sample_width(self): with self.assertRaisesRegex(wave.Error, 'bad sample width'): wave.open(io.BytesIO(b)) + def test_open_in_write_raises(self): + # gh-136523: Wave_write.__del__ should not throw + with support.catch_unraisable_exception() as cm: + with self.assertRaises(OSError): + wave.open(os.curdir, "wb") + support.gc_collect() + self.assertIsNone(cm.unraisable) + if __name__ == '__main__': unittest.main() diff --git a/Lib/wave.py b/Lib/wave.py index a34af244c3e224..b8476e264868fc 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -441,6 +441,8 @@ class Wave_write: _datawritten -- the size of the audio samples actually written """ + _file = None + def __init__(self, f): self._i_opened_the_file = None if isinstance(f, str): diff --git a/Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst b/Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst new file mode 100644 index 00000000000000..71ec66a37ef4c3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst @@ -0,0 +1 @@ +Fix :class:`wave.Wave_write` emitting an unraisable when open raises. From 9ab29cac192b7678ecb133bd743c295f1d8617f5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:01:44 +0200 Subject: [PATCH 0647/1674] [3.14] Add `.gram` file to the `.editorconfig` (GH-136680) (#136714) Add `.gram` file to the `.editorconfig` (GH-136680) (cherry picked from commit 2f0db9b05f0598548c0c136571c31065ecf961e5) Co-authored-by: sobolevn --- .editorconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index 5b04b32a89e3d2..25bc5935258bd1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,11 +1,11 @@ root = true -[*.{py,c,cpp,h,js,rst,md,yml,yaml}] +[*.{py,c,cpp,h,js,rst,md,yml,yaml,gram}] trim_trailing_whitespace = true insert_final_newline = true indent_style = space -[*.{py,c,cpp,h}] +[*.{py,c,cpp,h,gram}] indent_size = 4 [*.rst] From ca6db4fdae9e2a7369502218b46b03c2624a0836 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:54:04 +0200 Subject: [PATCH 0648/1674] [3.14] gh-127146: Emscripten: more regular stack overflow skips (GH-136708) (#136712) Makes the Emscripten stack overflow skip message consistent with WASI, and replaces some ad-hoc skips. (cherry picked from commit c730952aa64b790c75c437cb63a1242dc08c2e97) Co-authored-by: Hood Chatham --- Lib/test/support/__init__.py | 2 +- Lib/test/test_descr.py | 2 +- Lib/test/test_xml_etree_c.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index ce18518bb8aa18..001ecec4dcd4eb 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -570,7 +570,7 @@ def skip_android_selinux(name): is_wasi = sys.platform == "wasi" def skip_emscripten_stack_overflow(): - return unittest.skipIf(is_emscripten, "Exhausts limited stack on Emscripten") + return unittest.skipIf(is_emscripten, "Exhausts stack on Emscripten") def skip_wasi_stack_overflow(): return unittest.skipIf(is_wasi, "Exhausts stack on WASI") diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index ea076ba4fef2db..d420f097e74721 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -3942,7 +3942,7 @@ def __del__(self): # it as a leak. del C.__del__ - @unittest.skipIf(support.is_emscripten, "Seems to works in Pyodide?") + @support.skip_emscripten_stack_overflow() @support.skip_wasi_stack_overflow() def test_slots_trash(self): # Testing slot trash... diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py index 9ed0f4096a45e3..270b9d6da8e7b9 100644 --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -58,7 +58,7 @@ def test_del_attribute(self): self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'}) @support.skip_wasi_stack_overflow() - @unittest.skipIf(support.is_emscripten, "segfaults") + @support.skip_emscripten_stack_overflow() def test_trashcan(self): # If this test fails, it will most likely die via segfault. e = root = cET.Element('root') From 4eee754091eb1f4cf0d989d5d780ca8da45bb0ed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:12:36 +0200 Subject: [PATCH 0649/1674] [3.14] gh-127146: Emscripten: Make os.umask() actually work (GH-136706) (#136711) Provide a stub implementation of umask that is enough to get some tests passing. More work is needed upstream in Emscripten to make all umask tests to pass. (cherry picked from commit 12e52cad718723636a96042f9399634392285c44) Co-authored-by: Hood Chatham --- Lib/test/test_os.py | 6 ++---- Python/emscripten_syscalls.c | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 1e50dc43c35f5c..de3a17fe893170 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1918,11 +1918,9 @@ def test_makedir(self): support.is_wasi, "WASI's umask is a stub." ) - @unittest.skipIf( - support.is_emscripten, - "TODO: Fails in buildbot; see #135783" - ) def test_mode(self): + # Note: in some cases, the umask might already be 2 in which case this + # will pass even if os.umask is actually broken. with os_helper.temp_umask(0o002): base = os_helper.TESTFN parent = os.path.join(base, 'dir1') diff --git a/Python/emscripten_syscalls.c b/Python/emscripten_syscalls.c index 7875bfc8fe56ae..bb80f979420ec1 100644 --- a/Python/emscripten_syscalls.c +++ b/Python/emscripten_syscalls.c @@ -7,7 +7,7 @@ // defined with weak linkage so we can override it. EM_JS(int, __syscall_getuid32_js, (void), { // If we're in node and we can, report the native uid - if (typeof process !== "undefined" && typeof process.getuid === "function") { + if (ENVIRONMENT_IS_NODE) { return process.getuid(); } // Fall back to the stub case of returning 0. @@ -17,3 +17,23 @@ EM_JS(int, __syscall_getuid32_js, (void), { int __syscall_getuid32(void) { return __syscall_getuid32_js(); } + +EM_JS(int, __syscall_umask_js, (int mask), { + // If we're in node and we can, call native process.umask() + if (ENVIRONMENT_IS_NODE) { + try { + return process.umask(mask); + } catch(e) { + // oops... + // NodeJS docs: "In Worker threads, process.umask(mask) will throw an exception." + // umask docs: "This system call always succeeds" + return 0; + } + } + // Fall back to the stub case of returning 0. + return 0; +}) + +int __syscall_umask(int mask) { + return __syscall_umask_js(mask); +} From 9b7c4183cdfe245c06d417e871452398e4be1935 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:24:15 +0200 Subject: [PATCH 0650/1674] [3.14] gh-127146: Emscripten: Don't need to avoid unpaired surrogate anymore (GH-136707) (#136717) This might have been fixed by gh-136624, or by some Emscripten change. In any case, it no longer seems to be needed. (cherry picked from commit dcd27aace180737adaddc79c00c181816fc6e162) Co-authored-by: Hood Chatham --- Lib/test/test_warnings/__init__.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 5c3b1250ceb045..f89e94449b3031 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -555,13 +555,7 @@ def test_warn_explicit_non_ascii_filename(self): with self.module.catch_warnings(record=True) as w: self.module.resetwarnings() self.module.filterwarnings("always", category=UserWarning) - filenames = ["nonascii\xe9\u20ac"] - if not support.is_emscripten: - # JavaScript does not like surrogates. - # Invalid UTF-8 leading byte 0x80 encountered when - # deserializing a UTF-8 string in wasm memory to a JS - # string! - filenames.append("surrogate\udc80") + filenames = ["nonascii\xe9\u20ac", "surrogate\udc80"] for filename in filenames: try: os.fsencode(filename) From 6943d8ef275a5b4a687a730287d9421e2fae3fae Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:40:11 +0200 Subject: [PATCH 0651/1674] [3.14] gh-126548: Add a thread-unsafety warning for `importlib.reload()` (GH-136704) (GH-136723) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-126548: Add a thread-unsafety warning for `importlib.reload()` (GH-136704) (cherry picked from commit 69d8fe50ddc4dbe757c9929a532e2e882f0261ba) Co-authored-by: Bartosz Sławecki --- Doc/library/importlib.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index ea5a77028683b3..4f374be778d6b3 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -206,6 +206,10 @@ Functions :exc:`ModuleNotFoundError` is raised when the module being reloaded lacks a :class:`~importlib.machinery.ModuleSpec`. + .. warning:: + This function is not thread-safe. Calling it from multiple threads can result + in unexpected behavior. It's recommended to use the :class:`threading.Lock` + or other synchronization primitives for thread-safe module reloading. :mod:`importlib.abc` -- Abstract base classes related to import --------------------------------------------------------------- From 5f1d46f7d0b03d4deb192e37e6a727136e2e0aa3 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Wed, 16 Jul 2025 12:15:50 -0500 Subject: [PATCH 0652/1674] [3.14] gh-136710: Fix bad indentation in `os.chdir` docstring (GH-136719) (cherry picked from commit bde808ad6ba5eee8a6201983cf071449d7ce7e39) Co-authored-by: Harmen Stoppels --- Modules/clinic/posixmodule.c.h | 4 ++-- Modules/posixmodule.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 6b8cc3d07ab01c..65d3aff18d7b42 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -380,7 +380,7 @@ PyDoc_STRVAR(os_chdir__doc__, "\n" "path may always be specified as a string.\n" "On some platforms, path may also be specified as an open file descriptor.\n" -" If this functionality is unavailable, using it raises an exception."); +"If this functionality is unavailable, using it raises an exception."); #define OS_CHDIR_METHODDEF \ {"chdir", _PyCFunction_CAST(os_chdir), METH_FASTCALL|METH_KEYWORDS, os_chdir__doc__}, @@ -13398,4 +13398,4 @@ os__emscripten_debugger(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef OS__EMSCRIPTEN_DEBUGGER_METHODDEF #define OS__EMSCRIPTEN_DEBUGGER_METHODDEF #endif /* !defined(OS__EMSCRIPTEN_DEBUGGER_METHODDEF) */ -/*[clinic end generated code: output=f7b5635e0b948be4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c693071966d11548 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 27352f0c20dd48..b3fe9953264ae3 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3477,12 +3477,12 @@ Change the current working directory to the specified path. path may always be specified as a string. On some platforms, path may also be specified as an open file descriptor. - If this functionality is unavailable, using it raises an exception. +If this functionality is unavailable, using it raises an exception. [clinic start generated code]*/ static PyObject * os_chdir_impl(PyObject *module, path_t *path) -/*[clinic end generated code: output=3be6400eee26eaae input=1a4a15b4d12cb15d]*/ +/*[clinic end generated code: output=3be6400eee26eaae input=a74ceab5d72adf74]*/ { int result; From 9bf3464852f07c1562ebb4130d41c05d8ef5c3a8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jul 2025 00:10:46 +0200 Subject: [PATCH 0653/1674] [3.14] gh-135148: Correctly handle f/t strings with comments and debug expressions (GH-135198) (#136720) --- Lib/test/test_fstring.py | 12 +++ ...-06-06-02-24-42.gh-issue-135148.r-t2sC.rst | 3 + Parser/lexer/lexer.c | 88 ++++++++++++++----- 3 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 58a30c8e6ac447..b41e02c3a16379 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1651,6 +1651,18 @@ def __repr__(self): self.assertEqual(f"{1+2 = # my comment }", '1+2 = \n 3') + self.assertEqual(f'{""" # booo + """=}', '""" # booo\n """=\' # booo\\n \'') + + self.assertEqual(f'{" # nooo "=}', '" # nooo "=\' # nooo \'') + self.assertEqual(f'{" \" # nooo \" "=}', '" \\" # nooo \\" "=\' " # nooo " \'') + + self.assertEqual(f'{ # some comment goes here + """hello"""=}', ' \n """hello"""=\'hello\'') + self.assertEqual(f'{"""# this is not a comment + a""" # this is a comment + }', '# this is not a comment\n a') + # These next lines contains tabs. Backslash escapes don't # work in f-strings. # patchcheck doesn't like these tabs. So the only way to test diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst new file mode 100644 index 00000000000000..9b1f62433b45ed --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst @@ -0,0 +1,3 @@ +Fixed a bug where f-string debug expressions (using =) would incorrectly +strip out parts of strings containing escaped quotes and # characters. Patch +by Pablo Galindo. diff --git a/Parser/lexer/lexer.c b/Parser/lexer/lexer.c index 0a078dd594148c..81363cf8e810fe 100644 --- a/Parser/lexer/lexer.c +++ b/Parser/lexer/lexer.c @@ -121,38 +121,88 @@ set_ftstring_expr(struct tok_state* tok, struct token *token, char c) { } PyObject *res = NULL; - // Check if there is a # character in the expression + // Look for a # character outside of string literals int hash_detected = 0; + int in_string = 0; + char quote_char = 0; + for (Py_ssize_t i = 0; i < tok_mode->last_expr_size - tok_mode->last_expr_end; i++) { - if (tok_mode->last_expr_buffer[i] == '#') { + char ch = tok_mode->last_expr_buffer[i]; + + // Skip escaped characters + if (ch == '\\') { + i++; + continue; + } + + // Handle quotes + if (ch == '"' || ch == '\'') { + // The following if/else block works becase there is an off number + // of quotes in STRING tokens and the lexer only ever reaches this + // function with valid STRING tokens. + // For example: """hello""" + // First quote: in_string = 1 + // Second quote: in_string = 0 + // Third quote: in_string = 1 + if (!in_string) { + in_string = 1; + quote_char = ch; + } + else if (ch == quote_char) { + in_string = 0; + } + continue; + } + + // Check for # outside strings + if (ch == '#' && !in_string) { hash_detected = 1; break; } } - + // If we found a # character in the expression, we need to handle comments if (hash_detected) { - Py_ssize_t input_length = tok_mode->last_expr_size - tok_mode->last_expr_end; - char *result = (char *)PyMem_Malloc((input_length + 1) * sizeof(char)); + // Allocate buffer for processed result + char *result = (char *)PyMem_Malloc((tok_mode->last_expr_size - tok_mode->last_expr_end + 1) * sizeof(char)); if (!result) { return -1; } - Py_ssize_t i = 0; - Py_ssize_t j = 0; + Py_ssize_t i = 0; // Input position + Py_ssize_t j = 0; // Output position + in_string = 0; // Whether we're in a string + quote_char = 0; // Current string quote char - for (i = 0, j = 0; i < input_length; i++) { - if (tok_mode->last_expr_buffer[i] == '#') { - // Skip characters until newline or end of string - while (i < input_length && tok_mode->last_expr_buffer[i] != '\0') { - if (tok_mode->last_expr_buffer[i] == '\n') { - result[j++] = tok_mode->last_expr_buffer[i]; - break; - } + // Process each character + while (i < tok_mode->last_expr_size - tok_mode->last_expr_end) { + char ch = tok_mode->last_expr_buffer[i]; + + // Handle string quotes + if (ch == '"' || ch == '\'') { + // See comment above to understand this part + if (!in_string) { + in_string = 1; + quote_char = ch; + } else if (ch == quote_char) { + in_string = 0; + } + result[j++] = ch; + } + // Skip comments + else if (ch == '#' && !in_string) { + while (i < tok_mode->last_expr_size - tok_mode->last_expr_end && + tok_mode->last_expr_buffer[i] != '\n') { i++; } - } else { - result[j++] = tok_mode->last_expr_buffer[i]; + if (i < tok_mode->last_expr_size - tok_mode->last_expr_end) { + result[j++] = '\n'; + } + } + // Copy other chars + else { + result[j++] = ch; } + i++; } result[j] = '\0'; // Null-terminate the result string @@ -164,11 +214,9 @@ set_ftstring_expr(struct tok_state* tok, struct token *token, char c) { tok_mode->last_expr_size - tok_mode->last_expr_end, NULL ); - } - - if (!res) { + if (!res) { return -1; } token->metadata = res; From 2ce207108c381a1f765d03dffd6205ecc35db5e1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:24:54 +0200 Subject: [PATCH 0654/1674] [3.14] Improved venv docs to indicate that isolation is the default. (GH-136698) (GH-136705) (cherry picked from commit 8e2f4b448380b4c835442534d566618f06e32573) Co-authored-by: Facundo Batista Co-authored-by: Vinay Sajip --- Doc/library/venv.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index f16e24eac08343..de427fbafe71dc 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -22,10 +22,10 @@ The :mod:`!venv` module supports creating lightweight "virtual environments", each with their own independent set of Python packages installed in their :mod:`site` directories. A virtual environment is created on top of an existing -Python installation, known as the virtual environment's "base" Python, and may -optionally be isolated from the packages in the base environment, -so only those explicitly installed in the virtual environment are available. -See :ref:`sys-path-init-virtual-environments` and :mod:`site`'s +Python installation, known as the virtual environment's "base" Python, and by +default is isolated from the packages in the base environment, +so that only those explicitly installed in the virtual environment are +available. See :ref:`sys-path-init-virtual-environments` and :mod:`site`'s :ref:`virtual environments documentation ` for more information. From 76d4a43bd8d1409dc0f67a3c2b52b3437a1bd049 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:05:40 +0200 Subject: [PATCH 0655/1674] [3.14] gh-127146: Emscripten: Set umask to zero in python.sh (GH-136740) (#136745) Clears the umask used during a test of pydoc.apropos when testing on Emscripten. This is to work around a known issue in Emscripten; but it's not clear if the chmod call that is causing the problem is actually testing anything of significance. (cherry picked from commit 22af5d35a620ee44393853036a8450ceb047688e) Co-authored-by: Hood Chatham --- Lib/test/test_pydoc/test_pydoc.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index 281b24eaa36b80..f5ba5e1eb754be 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -1303,6 +1303,11 @@ def test_apropos_with_unreadable_dir(self): @os_helper.skip_unless_working_chmod def test_apropos_empty_doc(self): pkgdir = os.path.join(TESTFN, 'walkpkg') + if support.is_emscripten: + # Emscripten's readdir implementation is buggy on directories + # with read permission but no execute permission. + old_umask = os.umask(0) + self.addCleanup(os.umask, old_umask) os.mkdir(pkgdir) self.addCleanup(rmtree, pkgdir) init_path = os.path.join(pkgdir, '__init__.py') From 2ea3b75200d1f78d91a1798630bf28c4d7c9dc9e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:00:09 +0200 Subject: [PATCH 0656/1674] [3.14] gh-136697: Use the standard audit event format for sys.monitoring docs (GH-136747) (#136749) gh-136697: Use the standard audit event format for sys.monitoring docs (GH-136747) (cherry picked from commit 28937d3a21cf8168c853ae43374a8287c21f71c9) Co-authored-by: Tian Gao --- Doc/library/sys.monitoring.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/sys.monitoring.rst b/Doc/library/sys.monitoring.rst index f62a4011e4144b..0f986aa580b3c9 100644 --- a/Doc/library/sys.monitoring.rst +++ b/Doc/library/sys.monitoring.rst @@ -333,6 +333,8 @@ Registering callback functions it is unregistered and returned. Otherwise :func:`register_callback` returns ``None``. + .. audit-event:: sys.monitoring.register_callback func sys.monitoring.register_callback + Functions can be unregistered by calling ``sys.monitoring.register_callback(tool_id, event, None)``. @@ -343,8 +345,6 @@ globally and locally. As such, if an event could be turned on for both global and local events by your code then the callback needs to be written to handle either trigger. -Registering or unregistering a callback function will generate a :func:`sys.audit` event. - Callback function arguments ''''''''''''''''''''''''''' From 201c765d764a56cfaaa5491c6c234348fe72b422 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 11:13:51 +0200 Subject: [PATCH 0657/1674] [3.14] Fix typo: "occured" =>"occurred" (GH-134928) (#136771) Co-authored-by: Roman <121314722+GameRoMan@users.noreply.github.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Modules/_ctypes/stgdict.c | 2 +- Modules/_interpretersmodule.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index f208d2956e429e..ab955a0b824a2f 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -484,7 +484,7 @@ error:; /* Replace array elements at stginfo->ffi_type_pointer.elements. - Return -1 if error occured. + Return -1 if error occurred. */ int _replace_array_elements(ctypes_state *st, PyObject *layout_fields, diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index e7feaa7f186aee..9426ce72733c28 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -666,7 +666,7 @@ _run_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp, // Prep and switch interpreters. if (_PyXI_Enter(session, interp, shareables, &result) < 0) { - // If an error occured at this step, it means that interp + // If an error occurred at this step, it means that interp // was not prepared and switched. _PyXI_FreeSession(session); _PyXI_FreeFailure(failure); From 81aab6d51ccf49a7ec420eaead3f6fa900c57b53 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 11:18:55 +0200 Subject: [PATCH 0658/1674] [3.14] parser_generator.py typo - keywods -> keywords (GH-135014) (#136772) Co-authored-by: chemelnucfin <3982092+chemelnucfin@users.noreply.github.com> --- Tools/peg_generator/pegen/parser_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/peg_generator/pegen/parser_generator.py b/Tools/peg_generator/pegen/parser_generator.py index 52ae743c26b6b8..7dd56f98a652cc 100644 --- a/Tools/peg_generator/pegen/parser_generator.py +++ b/Tools/peg_generator/pegen/parser_generator.py @@ -56,7 +56,7 @@ def visit_NamedItem(self, item: NamedItem) -> None: class KeywordCollectorVisitor(GrammarVisitor): - """Visitor that collects all the keywods and soft keywords in the Grammar""" + """Visitor that collects all the keywords and soft keywords in the Grammar""" def __init__(self, gen: "ParserGenerator", keywords: Dict[str, int], soft_keywords: Set[str]): self.generator = gen From aeeacdb8b56232239e70b6aed5838b640116dcef Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 11:36:35 +0200 Subject: [PATCH 0659/1674] [3.14] Docs: Improve example for ``itertools.batched()`` (GH-136775) (#136778) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs: Improve example for ``itertools.batched()`` (GH-136775) The current example `batched('ABCDEFG', n=3) → ABC DEF G` can confuse readers because both, the size of the tuples and the number of tuples are 3. By using a batch size of n=2, it is clearer that the `n` argument refers to the size of the resulting tuples. I.e. the new example is: `batched('ABCDEFG', n=2) → AB CD EF G` (cherry picked from commit 3eecc72ac70943f7e33297eea17803af15322c88) Co-authored-by: RafaelWO <38643099+RafaelWO@users.noreply.github.com> --- Doc/library/itertools.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 00925ae920aad9..aa46920d3526f0 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -47,7 +47,7 @@ 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:`batched` p, n (p0, p1, ..., p_n-1), ... ``batched('ABCDEFG', n=2) → AB CD EF 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`` @@ -181,7 +181,7 @@ loops that truncate the stream. Roughly equivalent to:: def batched(iterable, n, *, strict=False): - # batched('ABCDEFG', 3) → ABC DEF G + # batched('ABCDEFG', 2) → AB CD EF G if n < 1: raise ValueError('n must be at least one') iterator = iter(iterable) From ba6ea7c53d9b8de78380a1f0b029af92633b5332 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 11:56:55 +0200 Subject: [PATCH 0660/1674] [3.14] gh-74598: document that `fnmatch.filterfalse` is affected by cache limitation (GH-136781) (#136782) gh-74598: document that `fnmatch.filterfalse` is affected by cache limitation (GH-136781) (cherry picked from commit 263e451c4114ac98add1f1e8aa9ee030e054bdfd) Co-authored-by: Gergely Elias --- Doc/library/fnmatch.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/fnmatch.rst b/Doc/library/fnmatch.rst index 12e61bc36f5db0..ee654b7a83e203 100644 --- a/Doc/library/fnmatch.rst +++ b/Doc/library/fnmatch.rst @@ -53,7 +53,7 @@ a :class:`!str` filename, and vice-versa. Finally, note that :func:`functools.lru_cache` with a *maxsize* of 32768 is used to cache the (typed) compiled regex patterns in the following -functions: :func:`fnmatch`, :func:`fnmatchcase`, :func:`.filter`. +functions: :func:`fnmatch`, :func:`fnmatchcase`, :func:`.filter`, :func:`.filterfalse`. .. function:: fnmatch(name, pat) From a91e2bc440b288c4d3ccc51f068f8d591e0eda1b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:23:52 +0200 Subject: [PATCH 0661/1674] [3.14] Fix typo in `Lib/test/test_ast/test_ast.py` (GH-136767) (#136783) Fix typo in `Lib/test/test_ast/test_ast.py` (GH-136767) `ASTOptimiziationTests` -> `ASTOptimizationTests` (cherry picked from commit 60146f4f6f24f37e3bfcb9f101565f6e86cf0146) Co-authored-by: Hunter Hogan --- Lib/test/test_ast/test_ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 59263012bc1440..56e170e128b48c 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -3547,7 +3547,7 @@ def test_show_empty_flag(self): self.check_output(source, expect, '--show-empty') -class ASTOptimiziationTests(unittest.TestCase): +class ASTOptimizationTests(unittest.TestCase): def wrap_expr(self, expr): return ast.Module(body=[ast.Expr(value=expr)]) From 8b4275c99aebef2ac34135584aeb40fad5479b2e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:26:22 +0200 Subject: [PATCH 0662/1674] [3.14] gh-136769: Include fixed-width integers in the fundamental data types table (GH-136784) (#136785) gh-136769: Include fixed-width integers in the fundamental data types table (GH-136784) Fixed-sized types, like ``c_int32``, are currently missing from the fundamental data types table in the ``ctypes`` documentation. This commit adds them, and notes that ``c_[u]int8`` is an alias of ``c_[u]byte``. (cherry picked from commit acefb978dcb5dd554e3c49a3015ee5c2ad6bfda1) Co-authored-by: Sina Zel taat <111974143+SZeltaat@users.noreply.github.com> --- Doc/library/ctypes.rst | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 846cece3761858..09f596101b4d1e 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -232,8 +232,24 @@ Fundamental data types +----------------------+------------------------------------------+----------------------------+ | :class:`c_int` | :c:expr:`int` | int | +----------------------+------------------------------------------+----------------------------+ +| :class:`c_int8` | :c:type:`int8_t` | int | ++----------------------+------------------------------------------+----------------------------+ +| :class:`c_int16` | :c:type:`int16_t` | int | ++----------------------+------------------------------------------+----------------------------+ +| :class:`c_int32` | :c:type:`int32_t` | int | ++----------------------+------------------------------------------+----------------------------+ +| :class:`c_int64` | :c:type:`int64_t` | int | ++----------------------+------------------------------------------+----------------------------+ | :class:`c_uint` | :c:expr:`unsigned int` | int | +----------------------+------------------------------------------+----------------------------+ +| :class:`c_uint8` | :c:type:`uint8_t` | int | ++----------------------+------------------------------------------+----------------------------+ +| :class:`c_uint16` | :c:type:`uint16_t` | int | ++----------------------+------------------------------------------+----------------------------+ +| :class:`c_uint32` | :c:type:`uint32_t` | int | ++----------------------+------------------------------------------+----------------------------+ +| :class:`c_uint64` | :c:type:`uint64_t` | int | ++----------------------+------------------------------------------+----------------------------+ | :class:`c_long` | :c:expr:`long` | int | +----------------------+------------------------------------------+----------------------------+ | :class:`c_ulong` | :c:expr:`unsigned long` | int | @@ -2524,7 +2540,7 @@ These are the fundamental ctypes data types: .. class:: c_int8 - Represents the C 8-bit :c:expr:`signed int` datatype. Usually an alias for + Represents the C 8-bit :c:expr:`signed int` datatype. It is an alias for :class:`c_byte`. @@ -2599,7 +2615,7 @@ These are the fundamental ctypes data types: .. class:: c_uint8 - Represents the C 8-bit :c:expr:`unsigned int` datatype. Usually an alias for + Represents the C 8-bit :c:expr:`unsigned int` datatype. It is an alias for :class:`c_ubyte`. From 03457ca2accabcf70ed0f0118c2e92823635c465 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:57:52 +0200 Subject: [PATCH 0663/1674] [3.14] gh-135730: Clarify multiprocessing.Queue close() documentation (GH-136803) (GH-136806) gh-135730: Clarify multiprocessing.Queue close() documentation (GH-136803) Add a copy of the text from SimpleQueue.close() --------- (cherry picked from commit f575588ccf27d8d54a1e99cfda944f2614b3255c) Co-authored-by: aggshruti99 Co-authored-by: Petr Viktorin --- Doc/library/multiprocessing.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index b41953d21442c9..a692df41a8154b 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -936,8 +936,13 @@ For an example of the usage of queues for interprocess communication see .. method:: close() - Indicate that no more data will be put on this queue by the current - process. The background thread will quit once it has flushed all buffered + Close the queue: release internal resources. + + A queue must not be used anymore after it is closed. For example, + :meth:`~Queue.get`, :meth:`~Queue.put` and :meth:`~Queue.empty` + methods must no longer be called. + + The background thread will quit once it has flushed all buffered data to the pipe. This is called automatically when the queue is garbage collected. From 2a9aeb0f579ff75cd49dd36fb8f62d7a8adb6bfa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 15:56:40 +0200 Subject: [PATCH 0664/1674] [3.14] gh-136801: Fix PyREPL syntax highlightning on match cases after multi-line case (GH-136804) (GH-136813) (cherry picked from commit 3a648445337098abf22c7faa296389dab597797c) Co-authored-by: Olga Matoula --- Lib/_pyrepl/utils.py | 4 ++-- Lib/test/test_pyrepl/test_reader.py | 12 +++++++----- .../2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst diff --git a/Lib/_pyrepl/utils.py b/Lib/_pyrepl/utils.py index e04fbdc6c8a5c4..fd788c8429e15b 100644 --- a/Lib/_pyrepl/utils.py +++ b/Lib/_pyrepl/utils.py @@ -241,14 +241,14 @@ def is_soft_keyword_used(*tokens: TI | None) -> bool: return s in keyword_first_sets_match return True case ( - None | TI(T.NEWLINE) | TI(T.INDENT) | TI(string=":"), + None | TI(T.NEWLINE) | TI(T.INDENT) | TI(T.DEDENT) | TI(string=":"), TI(string="case"), TI(T.NUMBER | T.STRING | T.FSTRING_START | T.TSTRING_START) | TI(T.OP, string="(" | "*" | "-" | "[" | "{") ): return True case ( - None | TI(T.NEWLINE) | TI(T.INDENT) | TI(string=":"), + None | TI(T.NEWLINE) | TI(T.INDENT) | TI(T.DEDENT) | TI(string=":"), TI(string="case"), TI(T.NAME, string=s) ): diff --git a/Lib/test/test_pyrepl/test_reader.py b/Lib/test/test_pyrepl/test_reader.py index 1f655264f1c00a..9a02dff7387563 100644 --- a/Lib/test/test_pyrepl/test_reader.py +++ b/Lib/test/test_pyrepl/test_reader.py @@ -375,7 +375,8 @@ def funct(case: str = sys.platform) -> None: ) match case: case "emscripten": print("on the web") - case "ios" | "android": print("on the phone") + case "ios" | "android": + print("on the phone") case _: print('arms around', match.group(1)) """ ) @@ -393,7 +394,8 @@ def funct(case: str = sys.platform) -> None: {o}){z} {K}match{z} case{o}:{z} {K}case{z} {s}"emscripten"{z}{o}:{z} {b}print{z}{o}({z}{s}"on the web"{z}{o}){z} - {K}case{z} {s}"ios"{z} {o}|{z} {s}"android"{z}{o}:{z} {b}print{z}{o}({z}{s}"on the phone"{z}{o}){z} + {K}case{z} {s}"ios"{z} {o}|{z} {s}"android"{z}{o}:{z} + {b}print{z}{o}({z}{s}"on the phone"{z}{o}){z} {K}case{z} {K}_{z}{o}:{z} {b}print{z}{o}({z}{s}'arms around'{z}{o},{z} match{o}.{z}group{o}({z}{n}1{z}{o}){z}{o}){z} """ ) @@ -402,14 +404,14 @@ def funct(case: str = sys.platform) -> None: reader, _ = handle_all_events(events) self.assert_screen_equal(reader, code, clean=True) self.assert_screen_equal(reader, expected_sync) - self.assertEqual(reader.pos, 2**7 + 2**8) - self.assertEqual(reader.cxy, (0, 14)) + self.assertEqual(reader.pos, 396) + self.assertEqual(reader.cxy, (0, 15)) async_msg = "{k}async{z} ".format(**colors) expected_async = expected.format(a=async_msg, **colors) more_events = itertools.chain( code_to_events(code), - [Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 13, + [Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 14, code_to_events("async "), ) reader, _ = handle_all_events(more_events) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst new file mode 100644 index 00000000000000..5c0813b1a0abda --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst @@ -0,0 +1 @@ +Fix PyREPL syntax highlightning on match cases after multi-line case. Contributed by Olga Matoula. From 8d063f3d922850ee2199d0e63a93904e53f02ef1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:28:52 +0200 Subject: [PATCH 0665/1674] [3.14] gh-54732: Make argparse error caused by empty rows in option files explicit (GH-136795) (#136818) gh-54732: Make argparse error caused by empty rows in option files explicit (GH-136795) (cherry picked from commit 8ffc3ef01e83ffe629c6107082677de4d23974d5) Co-authored-by: jdunter <2ve@mailbox.org> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/argparse.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index f189f6b8fa8953..a08f713ab56ba3 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -434,12 +434,18 @@ arguments they contain. For example:: >>> parser.parse_args(['-f', 'foo', '@args.txt']) Namespace(f='bar') -Arguments read from a file must by default be one per line (but see also +Arguments read from a file must be one per line by default (but see also :meth:`~ArgumentParser.convert_arg_line_to_args`) and are treated as if they were in the same place as the original file referencing argument on the command line. So in the example above, the expression ``['-f', 'foo', '@args.txt']`` is considered equivalent to the expression ``['-f', 'foo', '-f', 'bar']``. +.. note:: + + Empty lines are treated as empty strings (``''``), which are allowed as values but + not as arguments. Empty lines that are read as arguments will result in an + "unrecognized arguments" error. + :class:`ArgumentParser` uses :term:`filesystem encoding and error handler` to read the file containing arguments. From f8af7cb7231bdb4ae7137c690da4e3903d0ce5f9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:50:30 +0200 Subject: [PATCH 0666/1674] [3.14] gh-136752: Clarify documentation for ``IPv{N}Address.is_reserved`` (GH-136794) (#136827) gh-136752: Clarify documentation for ``IPv{N}Address.is_reserved`` (GH-136794) (cherry picked from commit 6293d8a1a648a498b7ac899631b74fa25c71c1ac) Co-authored-by: Matthieu Lienart <50069805+mlnrt@users.noreply.github.com> Co-authored-by: Matthieu Lienart Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/ipaddress.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index e5bdfbb144b65a..9e887d8e65741b 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -240,7 +240,16 @@ write code that handles both IP versions correctly. Address objects are .. attribute:: is_reserved - ``True`` if the address is otherwise IETF reserved. + ``True`` if the address is noted as reserved by the IETF. + For IPv4, this is only ``240.0.0.0/4``, the ``Reserved`` address block. + For IPv6, this is all addresses `allocated `__ as + ``Reserved by IETF`` for future use. + + .. note:: For IPv4, ``is_reserved`` is not related to the address block value of the + ``Reserved-by-Protocol`` column in iana-ipv4-special-registry_. + + .. caution:: For IPv6, ``fec0::/10`` a former Site-Local scoped address prefix is + currently excluded from that list (see :attr:`~IPv6Address.is_site_local` & :rfc:`3879`). .. attribute:: is_loopback @@ -261,6 +270,7 @@ write code that handles both IP versions correctly. Address objects are .. _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 +.. _iana-ipv6-address-space: https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml .. method:: IPv4Address.__format__(fmt) From 4606b4089d727ea879e6233ec4a366fffcb28fa1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 19:36:31 +0200 Subject: [PATCH 0667/1674] [3.14] gh-136839: Refactor simple dict.update calls (GH-136811) (#136840) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-136839: Refactor simple dict.update calls (GH-136811) Refactor simple dict.update calls This commit refactors simple `dict.update({key: value})` calls which can be done via `dict[key] = value` instead. I found those cases with the [semgrep](https://semgrep.dev/) tool: ``` $ semgrep --lang python --pattern '$DICT.update({$A: ...})' ┌─────────────────┐ │ 5 Code Findings │ └─────────────────┘ Lib/dataclasses.py 1268┆ slots.update({slot: doc}) Lib/multiprocessing/resource_tracker.py 50┆ _CLEANUP_FUNCS.update({ 51┆ 'semaphore': _multiprocessing.sem_unlink, 52┆ }) ⋮┆---------------------------------------- 53┆ _CLEANUP_FUNCS.update({ 54┆ 'shared_memory': _posixshmem.shm_unlink, 55┆ }) Lib/tkinter/scrolledtext.py 26┆ kw.update({'yscrollcommand': self.vbar.set}) Lib/xmlrpc/server.py 242┆ self.funcs.update({'system.multicall' : self.system_multicall}) ``` (cherry picked from commit 69ea1b3a8f45fec46add3272ad47f14ff5321ae8) Co-authored-by: Disconnect3d --- Lib/dataclasses.py | 2 +- Lib/multiprocessing/resource_tracker.py | 8 ++------ Lib/tkinter/scrolledtext.py | 2 +- Lib/xmlrpc/server.py | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 86d29df0639184..83ea623dce6281 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1265,7 +1265,7 @@ def _create_slots(defined_fields, inherited_slots, field_names, weakref_slot): doc = getattr(defined_fields.get(slot), 'doc', None) if doc is not None: seen_docs = True - slots.update({slot: doc}) + slots[slot] = doc # We only return dict if there's at least one doc member, # otherwise we return tuple, which is the old default format. diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index 05633ac21a259c..c4d0ca81e7034a 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -47,12 +47,8 @@ def cleanup_noop(name): # absence of POSIX named semaphores. In that case, no named semaphores were # ever opened, so no cleanup would be necessary. if hasattr(_multiprocessing, 'sem_unlink'): - _CLEANUP_FUNCS.update({ - 'semaphore': _multiprocessing.sem_unlink, - }) - _CLEANUP_FUNCS.update({ - 'shared_memory': _posixshmem.shm_unlink, - }) + _CLEANUP_FUNCS['semaphore'] = _multiprocessing.sem_unlink + _CLEANUP_FUNCS['shared_memory'] = _posixshmem.shm_unlink class ReentrantCallError(RuntimeError): diff --git a/Lib/tkinter/scrolledtext.py b/Lib/tkinter/scrolledtext.py index 4f9a8815b6184b..8dcead5e31930e 100644 --- a/Lib/tkinter/scrolledtext.py +++ b/Lib/tkinter/scrolledtext.py @@ -23,7 +23,7 @@ def __init__(self, master=None, **kw): self.vbar = Scrollbar(self.frame) self.vbar.pack(side=RIGHT, fill=Y) - kw.update({'yscrollcommand': self.vbar.set}) + kw['yscrollcommand'] = self.vbar.set Text.__init__(self, self.frame, **kw) self.pack(side=LEFT, fill=BOTH, expand=True) self.vbar['command'] = self.yview diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 8130c739af2fe8..3e6871157d0929 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -239,7 +239,7 @@ def register_multicall_functions(self): see http://www.xmlrpc.com/discuss/msgReader$1208""" - self.funcs.update({'system.multicall' : self.system_multicall}) + self.funcs['system.multicall'] = self.system_multicall def _marshaled_dispatch(self, data, dispatch_method = None, path = None): """Dispatches an XML-RPC method from marshalled (XML) data. From 197f3eca2a48dfa28533645029a926f241e0f25d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 19 Jul 2025 20:00:15 +0200 Subject: [PATCH 0668/1674] [3.14] gh-136764: improve comment in enum.verify.__call__ (GH-136774) (GH-136841) gh-136764: improve comment in enum.verify.__call__ (GH-136774) (cherry picked from commit 6a1c93af806d0ca5d3fb86cd183d00013bbf28d1) Co-authored-by: Saurav Singh --- Lib/enum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/enum.py b/Lib/enum.py index 01fecca3e5aac0..8a72c409b94a8c 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1965,7 +1965,7 @@ def __call__(self, enumeration): if 2**i not in values: missing.append(2**i) elif enum_type == 'enum': - # check for powers of one + # check for missing consecutive integers for i in range(low+1, high): if i not in values: missing.append(i) From cce38eefd4b8f4e90eaa40ebfda64cb5ffde679f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 10:55:06 +0200 Subject: [PATCH 0669/1674] [3.14] Doc/c-api/memory.rst: extend --without-pymalloc doc with ASan information (GH-136790) (GH-136798) Extend the documentation for disabling pymalloc with the `--without-pymalloc` flag regarding why it is worth to use it when enabling AddressSanitizer for Python build (which is done, e.g., in CPython's CI builds). I have tested the CPython latest main build with both ASan and pymalloc enabled and it seems to work just fine. I did run the `python -m test` suite which didn't uncover any ASan crashes (though, it detected some memory leaks, which I believe are irrelevant here). I have discussed ASan and this flag with @encukou on the CPython Core sprint on EuroPython 2025. We initially thought that the `--without-pymalloc` flag is needed for ASan builds due to the fact pymalloc must hit the begining of page when determining if the memory to be freed comes from pymalloc or was allocated by the system malloc. In other words, we thought, that ASan would crash CPython during free of big objects (allocated by system malloc). It may be that this was the case in the past, but it is not the case anymore as the `address_in_range` function used by pymalloc is annotated to be skipped from the ASan instrumentation. (cherry picked from commit d19bb4471331ca2cb87b86e4c904bc9a2bafb044) Co-authored-by: Disconnect3d Co-authored-by: Petr Viktorin --- Doc/c-api/memory.rst | 4 ++++ Doc/using/configure.rst | 3 +++ 2 files changed, 7 insertions(+) diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 61fa49f8681cce..df1bb0ce370919 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -672,6 +672,10 @@ This allocator is disabled if Python is configured with the :option:`--without-pymalloc` option. It can also be disabled at runtime using the :envvar:`PYTHONMALLOC` environment variable (ex: ``PYTHONMALLOC=malloc``). +Typically, it makes sense to disable the pymalloc allocator when building +Python with AddressSanitizer (:option:`--with-address-sanitizer`) which helps +uncover low level bugs within the C code. + Customize pymalloc Arena Allocator ---------------------------------- diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index e5fe3c72b1b26e..2cda9587975ddc 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -802,6 +802,9 @@ Debug options .. option:: --with-address-sanitizer Enable AddressSanitizer memory error detector, ``asan`` (default is no). + To improve ASan detection capabilities you may also want to combine this + with :option:`--without-pymalloc` to disable the specialized small-object + allocator whose allocations are not tracked by ASan. .. versionadded:: 3.6 From 2cb3b534e724ba49a742586590d3ee65efdc2d71 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 13:28:17 +0200 Subject: [PATCH 0670/1674] [3.14] gh-108362: Retarget incremental GC changes to 3.14 (GH-125453) (#136851) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/gc.rst | 8 ++--- Doc/whatsnew/3.14.rst | 71 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 7ccb0e6bdf9406..2ef5c4b35a25cc 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -60,7 +60,7 @@ The :mod:`gc` module provides the following functions: The effect of calling ``gc.collect()`` while the interpreter is already performing a collection is undefined. - .. versionchanged:: 3.13 + .. versionchanged:: 3.14 ``generation=1`` performs an increment of collection. @@ -83,13 +83,13 @@ The :mod:`gc` module provides the following functions: returned. If *generation* is not ``None``, return only the objects as follows: * 0: All objects in the young generation - * 1: No objects, as there is no generation 1 (as of Python 3.13) + * 1: No objects, as there is no generation 1 (as of Python 3.14) * 2: All objects in the old generation .. versionchanged:: 3.8 New *generation* parameter. - .. versionchanged:: 3.13 + .. versionchanged:: 3.14 Generation 1 is removed .. audit-event:: gc.get_objects generation gc.get_objects @@ -142,7 +142,7 @@ The :mod:`gc` module provides the following functions: See `Garbage collector design `_ for more information. - .. versionchanged:: 3.13 + .. versionchanged:: 3.14 *threshold2* is ignored diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index a6fb3e953eae58..ca9aa0b55605f1 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1058,6 +1058,30 @@ free-threaded build and false for the GIL-enabled build. (Contributed by Neil Schemenauer and Kumar Aditya in :gh:`130010`.) +.. _whatsnew314-incremental-gc: + +Incremental garbage collection +------------------------------ + +The cycle garbage collector is now incremental. +This means that maximum pause times are reduced +by an order of magnitude or more for larger heaps. + +There are now only two generations: young and old. +When :func:`gc.collect` is not called directly, the +GC is invoked a little less frequently. When invoked, it +collects the young generation and an increment of the +old generation, instead of collecting one or more generations. + +The behavior of :func:`!gc.collect` changes slightly: + +* ``gc.collect(1)``: Performs an increment of garbage collection, + rather than collecting generation 1. +* Other calls to :func:`!gc.collect` are unchanged. + +(Contributed by Mark Shannon in :gh:`108362`.) + + Other language changes ====================== @@ -1486,6 +1510,36 @@ functools (Contributed by Sayandip Dutta in :gh:`125916`.) +gc +-- + +The cyclic garbage collector is now incremental, +which changes the meaning of the results of +:meth:`~gc.get_threshold` and :meth:`~gc.set_threshold` +as well as :meth:`~gc.get_count` and :meth:`~gc.get_stats`. + +* For backwards compatibility, :meth:`~gc.get_threshold` continues to return + a three-item tuple. + The first value is the threshold for young collections, as before; + the second value determines the rate at which the old collection is scanned + (the default is 10, and higher values mean that the old collection + is scanned more slowly). + The third value is meaningless and is always zero. + +* :meth:`~gc.set_threshold` ignores any items after the second. + +* :meth:`~gc.get_count` and :meth:`~gc.get_stats` continue to return + the same format of results. + The only difference is that instead of the results referring to + the young, aging and old generations, + the results refer to the young generation + and the aging and collecting spaces of the old generation. + +In summary, code that attempted to manipulate the behavior of the cycle GC +may not work exactly as intended, but it is very unlikely to be harmful. +All other code will work just fine. + + getopt ------ @@ -2233,6 +2287,7 @@ asyncio (Contributed by Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa in :gh:`91048`.) + base64 ------ @@ -2241,6 +2296,15 @@ base64 (Contributed by Bénédikt Tran, Chris Markiewicz, and Adam Turner in :gh:`118761`.) +gc +-- + +* The new :ref:`incremental garbage collector ` + means that maximum pause times are reduced + by an order of magnitude or more for larger heaps. + (Contributed by Mark Shannon in :gh:`108362`.) + + io --- * :mod:`io` which provides the built-in :func:`open` makes less system calls @@ -2707,6 +2771,13 @@ Changes in the Python API Wrap it in :func:`staticmethod` if you want to preserve the old behavior. (Contributed by Serhiy Storchaka and Dominykas Grigonis in :gh:`121027`.) +* The :ref:`garbage collector is now incremental `, + which means that the behavior of :func:`gc.collect` changes slightly: + + * ``gc.collect(1)``: Performs an increment of garbage collection, + rather than collecting generation 1. + * Other calls to :func:`!gc.collect` are unchanged. + * The :func:`locale.nl_langinfo` function now sets temporarily the ``LC_CTYPE`` locale in some cases. This temporary change affects other threads. From 0e909267f65bb0050a17e4651877ecec747e528a Mon Sep 17 00:00:00 2001 From: Olga Pustovalova <162949+olp-cs@users.noreply.github.com> Date: Sun, 20 Jul 2025 13:51:59 +0200 Subject: [PATCH 0671/1674] [3.14] gh-136438: Make sure `test_remote_pdb` pass with all optimization levels (GH-136788) (GH-136855) (cherry picked from commit 588d9fb84ae014502811ec8580411ea0df7200fe) --- Lib/test/test_remote_pdb.py | 62 +++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/Lib/test/test_remote_pdb.py b/Lib/test/test_remote_pdb.py index aef8a6b0129092..280e2444ef7d34 100644 --- a/Lib/test/test_remote_pdb.py +++ b/Lib/test/test_remote_pdb.py @@ -1,5 +1,4 @@ import io -import time import itertools import json import os @@ -8,16 +7,13 @@ import socket import subprocess import sys -import tempfile import textwrap -import threading import unittest import unittest.mock from contextlib import closing, contextmanager, redirect_stdout, redirect_stderr, ExitStack -from pathlib import Path -from test.support import is_wasi, cpython_only, force_color, requires_subprocess, SHORT_TIMEOUT -from test.support.os_helper import temp_dir, TESTFN, unlink -from typing import Dict, List, Optional, Tuple, Union, Any +from test.support import is_wasi, cpython_only, force_color, requires_subprocess, SHORT_TIMEOUT, subTests +from test.support.os_helper import TESTFN, unlink +from typing import List import pdb from pdb import _PdbServer, _PdbClient @@ -283,37 +279,50 @@ def test_handling_other_message(self): expected_stdout="Some message.\n", ) - def test_handling_help_for_command(self): - """Test handling a request to display help for a command.""" + @unittest.skipIf(sys.flags.optimize >= 2, "Help not available for -OO") + @subTests( + "help_request,expected_substring", + [ + # a request to display help for a command + ({"help": "ll"}, "Usage: ll | longlist"), + # a request to display a help overview + ({"help": ""}, "type help "), + # a request to display the full PDB manual + ({"help": "pdb"}, ">>> import pdb"), + ], + ) + def test_handling_help_when_available(self, help_request, expected_substring): + """Test handling help requests when help is available.""" incoming = [ - ("server", {"help": "ll"}), + ("server", help_request), ] self.do_test( incoming=incoming, expected_outgoing=[], - expected_stdout_substring="Usage: ll | longlist", + expected_stdout_substring=expected_substring, ) - def test_handling_help_without_a_specific_topic(self): - """Test handling a request to display a help overview.""" + @unittest.skipIf(sys.flags.optimize < 2, "Needs -OO") + @subTests( + "help_request,expected_substring", + [ + # a request to display help for a command + ({"help": "ll"}, "No help for 'll'"), + # a request to display a help overview + ({"help": ""}, "Undocumented commands"), + # a request to display the full PDB manual + ({"help": "pdb"}, "No help for 'pdb'"), + ], + ) + def test_handling_help_when_not_available(self, help_request, expected_substring): + """Test handling help requests when help is not available.""" incoming = [ - ("server", {"help": ""}), + ("server", help_request), ] self.do_test( incoming=incoming, expected_outgoing=[], - expected_stdout_substring="type help ", - ) - - def test_handling_help_pdb(self): - """Test handling a request to display the full PDB manual.""" - incoming = [ - ("server", {"help": "pdb"}), - ] - self.do_test( - incoming=incoming, - expected_outgoing=[], - expected_stdout_substring=">>> import pdb", + expected_stdout_substring=expected_substring, ) def test_handling_pdb_prompts(self): @@ -1434,7 +1443,6 @@ def test_multi_line_commands(self): def _supports_remote_attaching(): - from contextlib import suppress PROCESS_VM_READV_SUPPORTED = False try: From ee37365e0db5712b808456d136c19ef582059bbd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 14:13:48 +0200 Subject: [PATCH 0672/1674] [3.14] gh-136854: Exit on error in `make venv` (GH-136856) (#136860) Co-authored-by: Nacho Caballero Co-authored-by: Nacho Caballero --- Doc/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/Makefile b/Doc/Makefile index c8a749a02a89ec..84578c5c57f478 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -170,6 +170,7 @@ venv: echo "venv already exists."; \ echo "To recreate it, remove it first with \`make clean-venv'."; \ else \ + set -e; \ echo "Creating venv in $(VENVDIR)"; \ if $(UV) --version >/dev/null 2>&1; then \ $(UV) venv --python=$(PYTHON) $(VENVDIR); \ From c537b98e489501e6ad33f244b9eb1e78db1e1bf2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 14:32:58 +0200 Subject: [PATCH 0673/1674] [3.14] gh-130655: gettext: Add fallback testcase (GH-136857) (#136862) gh-130655: gettext: Add fallback testcase (GH-136857) (cherry picked from commit c6e6fe92cd8b90d546652764e3eaf1631da16f8f) Co-authored-by: Dominic H --- Lib/test/test_gettext.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 33b7d75e3ff203..9ad37909a8ec4e 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -937,6 +937,13 @@ def test_lazy_import(self): ensure_lazy_imports("gettext", {"re", "warnings", "locale"}) +class TranslationFallbackTestCase(unittest.TestCase): + def test_translation_fallback(self): + with os_helper.temp_cwd() as tempdir: + t = gettext.translation('gettext', localedir=tempdir, fallback=True) + self.assertIsInstance(t, gettext.NullTranslations) + + if __name__ == '__main__': unittest.main() From 2caae152b962ea67ebc8bb473d7d594152f0e443 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 15:16:19 +0200 Subject: [PATCH 0674/1674] [3.14] gh-86608: Improve and restructure tarfile examples (GH-121771) (#136866) gh-86608: Improve and restructure tarfile examples (GH-121771) Add an example on how to write a tarfile to stdout; general improvements. (cherry picked from commit cc81b4e501138b5793d419c81c3a2859a17207a7) Co-authored-by: Dominic H Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/tarfile.rst | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index 8d10db8f2c2921..add9e8ac2cb587 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -1353,6 +1353,9 @@ Command-line options Examples -------- +Reading examples +~~~~~~~~~~~~~~~~~~~ + How to extract an entire tar archive to the current working directory:: import tarfile @@ -1375,6 +1378,23 @@ a generator function instead of a list:: tar.extractall(members=py_files(tar)) tar.close() +How to read a gzip compressed tar archive and display some member information:: + + import tarfile + tar = tarfile.open("sample.tar.gz", "r:gz") + for tarinfo in tar: + print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="") + if tarinfo.isreg(): + print("a regular file.") + elif tarinfo.isdir(): + print("a directory.") + else: + print("something else.") + tar.close() + +Writing examples +~~~~~~~~~~~~~~~~ + How to create an uncompressed tar archive from a list of filenames:: import tarfile @@ -1390,19 +1410,15 @@ The same example using the :keyword:`with` statement:: for name in ["foo", "bar", "quux"]: tar.add(name) -How to read a gzip compressed tar archive and display some member information:: +How to create and write an archive to stdout using +:data:`sys.stdout.buffer ` in the *fileobj* parameter +in :meth:`TarFile.add`:: - import tarfile - tar = tarfile.open("sample.tar.gz", "r:gz") - for tarinfo in tar: - print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="") - if tarinfo.isreg(): - print("a regular file.") - elif tarinfo.isdir(): - print("a directory.") - else: - print("something else.") - tar.close() + import sys + import tarfile + with tarfile.open("sample.tar.gz", "w|gz", fileobj=sys.stdout.buffer) as tar: + for name in ["foo", "bar", "quux"]: + tar.add(name) How to create an archive and reset the user information using the *filter* parameter in :meth:`TarFile.add`:: From 2f7684ceeef487bedbbae3283ad92bbb9d7e143e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:28:28 +0200 Subject: [PATCH 0675/1674] [3.14] GH-111758: Merge TSan and UBSan reusable GHA workflows (GH-136820) (#136883) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 🇺🇦 Sviatoslav Sydorenko (Святослав Сидоренко) Co-authored-by: Sviatoslav Sydorenko Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/build.yml | 22 +++-- .github/workflows/reusable-san.yml | 124 ++++++++++++++++++++++++++++ .github/workflows/reusable-tsan.yml | 94 --------------------- 3 files changed, 139 insertions(+), 101 deletions(-) create mode 100644 .github/workflows/reusable-san.yml delete mode 100644 .github/workflows/reusable-tsan.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e26433786f74e4..bb29a6760e17cd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -557,20 +557,28 @@ jobs: - name: Tests run: xvfb-run make ci - build-tsan: - name: >- - Thread sanitizer - ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} + build-san: + name: >- # ${{ '' } is a hack to nest jobs under the same sidebar category + Sanitizers${{ '' }} needs: build-context if: needs.build-context.outputs.run-tests == 'true' strategy: fail-fast: false matrix: + check-name: + - Thread free-threading: - false - true - uses: ./.github/workflows/reusable-tsan.yml + sanitizer: + - TSan + include: + - check-name: Undefined behavior + sanitizer: UBSan + free-threading: false + uses: ./.github/workflows/reusable-san.yml with: + sanitizer: ${{ matrix.sanitizer }} config_hash: ${{ needs.build-context.outputs.config-hash }} free-threading: ${{ matrix.free-threading }} @@ -671,7 +679,7 @@ jobs: - build-wasi - test-hypothesis - build-asan - - build-tsan + - build-san - cross-build-linux - cifuzz if: always() @@ -704,7 +712,7 @@ jobs: build-wasi, test-hypothesis, build-asan, - build-tsan, + build-san, cross-build-linux, ' || '' diff --git a/.github/workflows/reusable-san.yml b/.github/workflows/reusable-san.yml new file mode 100644 index 00000000000000..e6ff02e4838ee6 --- /dev/null +++ b/.github/workflows/reusable-san.yml @@ -0,0 +1,124 @@ +name: Reusable Sanitizer + +on: + workflow_call: + inputs: + sanitizer: + required: true + type: string + config_hash: + required: true + type: string + free-threading: + description: Whether to use free-threaded mode + required: false + type: boolean + default: false + +env: + FORCE_COLOR: 1 + +jobs: + build-san-reusable: + name: >- + ${{ inputs.sanitizer }}${{ + inputs.free-threading + && ' (free-threading)' + || '' + }} + runs-on: ubuntu-24.04 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Runner image version + run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" + - name: Restore config.cache + uses: actions/cache@v4 + with: + path: config.cache + key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ inputs.sanitizer }}-${{ inputs.config_hash }} + - name: Install dependencies + run: | + sudo ./.github/workflows/posix-deps-apt.sh + # Install clang + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + + if [ "${SANITIZER}" = "TSan" ]; then + 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 + else + sudo ./llvm.sh 20 + fi + + - name: Sanitizer option setup + run: | + if [ "${SANITIZER}" = "TSan" ]; then + echo "TSAN_OPTIONS=${SAN_LOG_OPTION} suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${{ + fromJSON(inputs.free-threading) + && '_free_threading' + || '' + }}.txt handle_segv=0" >> "$GITHUB_ENV" + else + echo "UBSAN_OPTIONS=${SAN_LOG_OPTION}" >> "$GITHUB_ENV" + fi + echo "CC=clang" >> "$GITHUB_ENV" + echo "CXX=clang++" >> "$GITHUB_ENV" + env: + SANITIZER: ${{ inputs.sanitizer }} + SAN_LOG_OPTION: log_path=${{ github.workspace }}/san_log + - 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: >- + ./configure + --config-cache + ${{ + inputs.sanitizer == 'TSan' + && '--with-thread-sanitizer' + || '--with-undefined-behavior-sanitizer' + }} + --with-pydebug + ${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }} + - name: Build CPython + run: make -j4 + - name: Display build info + run: make pythoninfo + - name: Tests + run: >- + ./python -m test + ${{ inputs.sanitizer == 'TSan' && '--tsan' || '' }} + -j4 + - name: Parallel tests + if: >- + inputs.sanitizer == 'TSan' + && fromJSON(inputs.free-threading) + run: ./python -m test --tsan-parallel --parallel-threads=4 -j4 + - name: Display logs + if: always() + run: find "${GITHUB_WORKSPACE}" -name 'san_log.*' | xargs head -n 1000 + - name: Archive logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: >- + ${{ inputs.sanitizer }}-logs-${{ + fromJSON(inputs.free-threading) + && 'free-threading' + || 'default' + }} + path: san_log.* + if-no-files-found: ignore diff --git a/.github/workflows/reusable-tsan.yml b/.github/workflows/reusable-tsan.yml deleted file mode 100644 index 6a58e5305f8e09..00000000000000 --- a/.github/workflows/reusable-tsan.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Reusable Thread Sanitizer - -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 - -env: - FORCE_COLOR: 1 - -jobs: - build-tsan-reusable: - name: 'Thread sanitizer' - runs-on: ubuntu-24.04 - timeout-minutes: 60 - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - name: Runner image version - run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_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}/Tools/tsan/suppressions${{ - fromJSON(inputs.free-threading) - && '_free_threading' - || '' - }}.txt 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: >- - ./configure - --config-cache - --with-thread-sanitizer - --with-pydebug - ${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }} - - name: Build CPython - run: make -j4 - - name: Display build info - run: make pythoninfo - - name: Tests - run: ./python -m test --tsan -j4 - - name: Parallel tests - if: fromJSON(inputs.free-threading) - run: ./python -m test --tsan-parallel --parallel-threads=4 -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: >- - tsan-logs-${{ - fromJSON(inputs.free-threading) - && 'free-threading' - || 'default' - }} - path: tsan_log.* - if-no-files-found: ignore From 17c5959aa3daee4b63d78e944a1d355daa651e52 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 00:22:53 +0200 Subject: [PATCH 0676/1674] [3.14] GH-130645: Default to color help in argparse (GH-136809) (#136886) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GH-130645: Default to color help in argparse (GH-136809) (cherry picked from commit acbe896cb12d6a92e6150fff22921756f6928035) Co-authored-by: Pablo Galindo Salgado Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Łukasz Langa Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com> --- Doc/library/argparse.rst | 24 +++++++------------ Doc/whatsnew/3.14.rst | 9 ++++--- Lib/argparse.py | 6 ++--- Lib/test/test_argparse.py | 23 +++++++++++++++++- Lib/test/test_clinic.py | 1 + ...-07-19-16-20-54.gh-issue-130645.O-dYcN.rst | 1 + 6 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index a08f713ab56ba3..79e15994491eff 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -74,7 +74,7 @@ ArgumentParser objects prefix_chars='-', fromfile_prefix_chars=None, \ argument_default=None, conflict_handler='error', \ add_help=True, allow_abbrev=True, exit_on_error=True, \ - *, suggest_on_error=False, color=False) + *, suggest_on_error=False, color=True) Create a new :class:`ArgumentParser` object. All parameters should be passed as keyword arguments. Each parameter has its own more detailed description @@ -119,7 +119,7 @@ ArgumentParser objects * suggest_on_error_ - Enables suggestions for mistyped argument choices and subparser names (default: ``False``) - * color_ - Allow color output (default: ``False``) + * color_ - Allow color output (default: ``True``) .. versionchanged:: 3.5 *allow_abbrev* parameter was added. @@ -626,27 +626,19 @@ keyword argument:: color ^^^^^ -By default, the help message is printed in plain text. If you want to allow -color in help messages, you can enable it by setting ``color`` to ``True``:: +By default, the help message is printed in color using `ANSI escape sequences +`__. +If you want plain text help messages, you can disable this :ref:`in your local +environment `, or in the argument parser itself +by setting ``color`` to ``False``:: >>> parser = argparse.ArgumentParser(description='Process some integers.', - ... color=True) + ... color=False) >>> parser.add_argument('--action', choices=['sum', 'max']) >>> parser.add_argument('integers', metavar='N', type=int, nargs='+', ... help='an integer for the accumulator') >>> parser.parse_args(['--help']) -Even if a CLI author has enabled color, it can be -:ref:`controlled using environment variables `. - -If you're writing code that needs to be compatible with older Python versions -and want to opportunistically use ``color`` when it's available, you -can set it as an attribute after initializing the parser instead of using the -keyword argument:: - - >>> parser = argparse.ArgumentParser(description='Process some integers.') - >>> parser.color = True - .. versionadded:: 3.14 diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index ca9aa0b55605f1..b85440736963cb 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1228,11 +1228,10 @@ argparse .. _whatsnew314-color-argparse: -* Introduced the optional *color* parameter to - :class:`argparse.ArgumentParser`, enabling color for help text. - This can be controlled by :ref:`environment variables - `. Color has also been enabled for help in the - :ref:`stdlib CLIs ` which use :mod:`!argparse`. +* Enable color for help text, which can be disabled with the optional *color* + parameter to :class:`argparse.ArgumentParser`. + This can also be controlled by :ref:`environment variables + `. (Contributed by Hugo van Kemenade in :gh:`130645`.) diff --git a/Lib/argparse.py b/Lib/argparse.py index 83258cf3e0f37d..2144c81886ad19 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -167,7 +167,7 @@ def __init__( indent_increment=2, max_help_position=24, width=None, - color=False, + color=True, ): # default setting for width if width is None: @@ -1231,7 +1231,7 @@ def __init__(self, self._name_parser_map = {} self._choices_actions = [] self._deprecated = set() - self._color = False + self._color = True super(_SubParsersAction, self).__init__( option_strings=option_strings, @@ -1878,7 +1878,7 @@ def __init__(self, exit_on_error=True, *, suggest_on_error=False, - color=False, + color=True, ): superinit = super(ArgumentParser, self).__init__ superinit(description=description, diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 08ff41368d9bb0..2f39b42ab74299 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -18,7 +18,11 @@ import warnings from enum import StrEnum -from test.support import captured_stderr +from test.support import ( + captured_stderr, + force_not_colorized, + force_not_colorized_test_class, +) from test.support import import_helper from test.support import os_helper from test.support import script_helper @@ -1007,6 +1011,7 @@ def test_parse_enum_value(self): args = parser.parse_args(['--color', 'red']) self.assertEqual(args.color, self.Color.RED) + @force_not_colorized def test_help_message_contains_enum_choices(self): parser = argparse.ArgumentParser() parser.add_argument('--color', choices=self.Color, help='Choose a color') @@ -2403,6 +2408,7 @@ def test_modified_invalid_action(self): # Subparsers tests # ================ +@force_not_colorized_test_class class TestAddSubparsers(TestCase): """Test the add_subparsers method""" @@ -3009,6 +3015,7 @@ def test_nested_argument_group(self): # Parent parser tests # =================== +@force_not_colorized_test_class class TestParentParsers(TestCase): """Tests that parsers can be created with parent parsers""" @@ -3216,6 +3223,7 @@ def test_mutex_groups_parents(self): # Mutually exclusive group tests # ============================== +@force_not_colorized_test_class class TestMutuallyExclusiveGroupErrors(TestCase): def test_invalid_add_argument_group(self): @@ -3344,21 +3352,25 @@ def test_successes_when_required(self): actual_ns = parse_args(args_string.split()) self.assertEqual(actual_ns, expected_ns) + @force_not_colorized def test_usage_when_not_required(self): format_usage = self.get_parser(required=False).format_usage expected_usage = self.usage_when_not_required self.assertEqual(format_usage(), textwrap.dedent(expected_usage)) + @force_not_colorized def test_usage_when_required(self): format_usage = self.get_parser(required=True).format_usage expected_usage = self.usage_when_required self.assertEqual(format_usage(), textwrap.dedent(expected_usage)) + @force_not_colorized def test_help_when_not_required(self): format_help = self.get_parser(required=False).format_help help = self.usage_when_not_required + self.help self.assertEqual(format_help(), textwrap.dedent(help)) + @force_not_colorized def test_help_when_required(self): format_help = self.get_parser(required=True).format_help help = self.usage_when_required + self.help @@ -4030,11 +4042,13 @@ def _test(self, tester, parser_text): tester.maxDiff = None tester.assertEqual(expected_text, parser_text) + @force_not_colorized def test_format(self, tester): parser = self._get_parser(tester) format = getattr(parser, 'format_%s' % self.func_suffix) self._test(tester, format()) + @force_not_colorized def test_print(self, tester): parser = self._get_parser(tester) print_ = getattr(parser, 'print_%s' % self.func_suffix) @@ -4047,6 +4061,7 @@ def test_print(self, tester): setattr(sys, self.std_name, old_stream) self._test(tester, parser_text) + @force_not_colorized def test_print_file(self, tester): parser = self._get_parser(tester) print_ = getattr(parser, 'print_%s' % self.func_suffix) @@ -4788,6 +4803,7 @@ class TestHelpUsageMetavarsSpacesParentheses(HelpTestCase): version = '' +@force_not_colorized_test_class class TestHelpUsageNoWhitespaceCrash(TestCase): def test_all_suppressed_mutex_followed_by_long_arg(self): @@ -5469,6 +5485,7 @@ def custom_type(string): version = '' +@force_not_colorized_test_class class TestHelpCustomHelpFormatter(TestCase): maxDiff = None @@ -5765,6 +5782,7 @@ def test_conflict_error(self): self.assertRaises(argparse.ArgumentError, parser.add_argument, '--spam') + @force_not_colorized def test_resolve_error(self): get_parser = argparse.ArgumentParser parser = get_parser(prog='PROG', conflict_handler='resolve') @@ -6031,6 +6049,7 @@ def test_argument_error(self): class TestArgumentTypeError(TestCase): + @force_not_colorized def test_argument_type_error(self): def spam(string): @@ -6829,6 +6848,7 @@ def setUp(self): metavar = '' self.parser.add_argument('--proxy', metavar=metavar) + @force_not_colorized def test_help_with_metavar(self): help_text = self.parser.format_help() self.assertEqual(help_text, textwrap.dedent('''\ @@ -6994,6 +7014,7 @@ def test_os_error(self): self.parser.parse_args, ['@no-such-file']) +@force_not_colorized_test_class class TestProgName(TestCase): source = textwrap.dedent('''\ import argparse diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 4b1f5991a39ee8..d5b751eafc5bbb 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2792,6 +2792,7 @@ def test_cli_verbose(self): out = self.expect_success("-v", fn) self.assertEqual(out.strip(), fn) + @support.force_not_colorized def test_cli_help(self): out = self.expect_success("-h") self.assertIn("usage: clinic.py", out) diff --git a/Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst b/Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst new file mode 100644 index 00000000000000..96e076dfe5bd12 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst @@ -0,0 +1 @@ +Enable color help by default in :mod:`argparse`. From 9663f93a50469828e3c149c6b535227170a29409 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 02:00:19 +0200 Subject: [PATCH 0677/1674] [3.14] gh-136470: Correct InterpreterPoolExecutor's default thread name (GH-136472) (GH-136889) gh-136470: Correct InterpreterPoolExecutor's default thread name (GH-136472) The OS thread name is now correctly prefixed with `InterpreterPoolExecutor` instead of `ThreadPoolExecutor`. (cherry picked from commit 246be21de1e2a51d757c747902108dfec13e0605) Co-authored-by: AN Long --- Lib/concurrent/futures/interpreter.py | 2 ++ .../test_interpreter_pool.py | 15 +++++++++++++++ ...2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst | 2 ++ 3 files changed, 19 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst diff --git a/Lib/concurrent/futures/interpreter.py b/Lib/concurrent/futures/interpreter.py index cbb60ce80c1813..53c6e757ded2e3 100644 --- a/Lib/concurrent/futures/interpreter.py +++ b/Lib/concurrent/futures/interpreter.py @@ -118,5 +118,7 @@ def __init__(self, max_workers=None, thread_name_prefix='', each worker interpreter. initargs: A tuple of arguments to pass to the initializer. """ + thread_name_prefix = (thread_name_prefix or + (f"InterpreterPoolExecutor-{self._counter()}")) super().__init__(max_workers, thread_name_prefix, initializer, initargs) diff --git a/Lib/test/test_concurrent_futures/test_interpreter_pool.py b/Lib/test/test_concurrent_futures/test_interpreter_pool.py index d5c032d01cdf5d..7241fcc4b1e74d 100644 --- a/Lib/test/test_concurrent_futures/test_interpreter_pool.py +++ b/Lib/test/test_concurrent_futures/test_interpreter_pool.py @@ -1,3 +1,4 @@ +import _thread import asyncio import contextlib import io @@ -498,6 +499,20 @@ def test_import_interpreter_pool_executor(self): self.assertEqual(p.stdout.decode(), '') self.assertEqual(p.stderr.decode(), '') + def test_thread_name_prefix(self): + self.assertStartsWith(self.executor._thread_name_prefix, + "InterpreterPoolExecutor-") + + @unittest.skipUnless(hasattr(_thread, '_get_name'), "missing _thread._get_name") + def test_thread_name_prefix_with_thread_get_name(self): + def get_thread_name(): + import _thread + return _thread._get_name() + + # Some platforms (Linux) are using 16 bytes to store the thread name, + # so only compare the first 15 bytes (without the trailing \n). + self.assertStartsWith(self.executor.submit(get_thread_name).result(), + "InterpreterPoolExecutor-"[:15]) class AsyncioTest(InterpretersMixin, testasyncio_utils.TestCase): diff --git a/Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst b/Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst new file mode 100644 index 00000000000000..5a0429cae07168 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst @@ -0,0 +1,2 @@ +Correct :class:`concurrent.futures.InterpreterPoolExecutor`'s default thread +name. From d0623cbbf5d0c3763112e5477f207c83f29591a0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 10:29:52 +0200 Subject: [PATCH 0678/1674] [3.14] gh-136428: amend UUIDv8 performance improvements (GH-136903) (#136904) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-136428: amend UUIDv8 performance improvements (GH-136903) UUIDv8 has been added in Python 3.14.0a2 and its construction time has been improved in Python 3.14.0a4, but since those changes will not be visible when comparing the latest Python 3.13 and 3.14 together, we do not document them on the What's New page to avoid confusion. (cherry picked from commit 5798348a0739ccf46f690f5fa1443080ec5de310) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index b85440736963cb..d58f7ecf02ce6b 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -2323,8 +2323,7 @@ uuid * :func:`~uuid.uuid3` and :func:`~uuid.uuid5` are both roughly 40% faster for 16-byte names and 20% faster for 1024-byte names. Performance for longer names remains unchanged. - * :func:`~uuid.uuid4` and :func:`~uuid.uuid8` are 30% and 40% faster - respectively. + * :func:`~uuid.uuid4` is 30% faster. (Contributed by Bénédikt Tran in :gh:`128150`.) From 163f532530efd2c910fa4ee3897ed06b47eeb3b5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:04:39 +0200 Subject: [PATCH 0679/1674] [3.14] gh-136882: Update stale link in the basic logging tutorial. (GH-136885) (#136905) Co-authored-by: Vinay Sajip Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/howto/logging.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 2982cf88bf97b4..b7225ff1c2cbfc 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -302,10 +302,10 @@ reading the following sections. If you're ready for that, grab some of your favourite beverage and carry on. If your logging needs are simple, then use the above examples to incorporate -logging into your own scripts, and if you run into problems or don't -understand something, please post a question on the comp.lang.python Usenet -group (available at https://groups.google.com/g/comp.lang.python) and you -should receive help before too long. +logging into your own scripts, and if you run into problems or don't understand +something, please post a question in the Help category of the `Python +discussion forum `_ and you should receive +help before too long. Still here? You can carry on reading the next few sections, which provide a slightly more advanced/in-depth tutorial than the basic one above. After that, From a69472e242e768545d734cf336bdbbff6f749f3f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:23:33 +0200 Subject: [PATCH 0680/1674] [3.14] gh-134411: assert `PyLong_FromLong(x) != NULL` when `x` is known to be small (GH-134415) (#136910) gh-134411: assert `PyLong_FromLong(x) != NULL` when `x` is known to be small (GH-134415) Since `PyLong_From Long(PY_MONITORING_DEBUGGER_ID)` falls to `small_int` case and can't return `NULL`. Added `assert`s for extra confidence. https://github.com/python/cpython/issues/134411#issuecomment-2897653868 (cherry picked from commit cf19b6435d02dd7be11b84a44f4a8a9f1a935b15) Co-authored-by: Sergey Muraviov --- Python/instrumentation.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 13bdd041becd69..5b26a078085806 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -2558,18 +2558,22 @@ PyObject *_Py_CreateMonitoringObject(void) err = PyObject_SetAttrString(events, "NO_EVENTS", _PyLong_GetZero()); if (err) goto error; PyObject *val = PyLong_FromLong(PY_MONITORING_DEBUGGER_ID); + assert(val != NULL); /* Can't return NULL because the int is small. */ err = PyObject_SetAttrString(mod, "DEBUGGER_ID", val); Py_DECREF(val); if (err) goto error; val = PyLong_FromLong(PY_MONITORING_COVERAGE_ID); + assert(val != NULL); err = PyObject_SetAttrString(mod, "COVERAGE_ID", val); Py_DECREF(val); if (err) goto error; val = PyLong_FromLong(PY_MONITORING_PROFILER_ID); + assert(val != NULL); err = PyObject_SetAttrString(mod, "PROFILER_ID", val); Py_DECREF(val); if (err) goto error; val = PyLong_FromLong(PY_MONITORING_OPTIMIZER_ID); + assert(val != NULL); err = PyObject_SetAttrString(mod, "OPTIMIZER_ID", val); Py_DECREF(val); if (err) goto error; From 4f6f3ee8d3710fef102071c53919a9af7a28613b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:58:57 +0200 Subject: [PATCH 0681/1674] [3.14] gh-136852: Emscripten: Add PYTHON_NODE_VERSION environment variable (GH-136853) (GH-136907) To choose the node version we use. Together with: https://github.com/python/buildmaster-config/pull/614 closes GH-136852. (cherry picked from commit aec7f5f8b2e8b5e02869cdb4e1f8a9ef87c9f953) Co-authored-by: Hood Chatham --- Tools/wasm/emscripten/__main__.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index c0d58aeaadd2cf..1b31e36dd890b3 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -206,6 +206,17 @@ def configure_emscripten_python(context, working_dir): sysconfig_data += "-pydebug" host_runner = context.host_runner + if node_version := os.environ.get("PYTHON_NODE_VERSION", None): + res = subprocess.run( + [ + "bash", + "-c", + f"source ~/.nvm/nvm.sh && nvm which {node_version}", + ], + text=True, + capture_output=True, + ) + host_runner = res.stdout.strip() pkg_config_path_dir = (PREFIX_DIR / "lib/pkgconfig/").resolve() env_additions = { "CONFIG_SITE": config_site, From 031645a88427d8c8df70ae96519b4d2d0ae550f7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 13:02:41 +0200 Subject: [PATCH 0682/1674] [3.14] gh-135621: Remove dependency on curses from PyREPL (GH-136758) (GH-136915) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 09dfb50f1b7c23bc48d86bd579671761bb8ca48b) Co-authored-by: Łukasz Langa --- Lib/_pyrepl/_minimal_curses.py | 68 -- Lib/_pyrepl/curses.py | 33 - Lib/_pyrepl/terminfo.py | 530 ++++++++++++++ Lib/_pyrepl/unix_console.py | 16 +- Lib/_pyrepl/unix_eventqueue.py | 11 +- Lib/test/test_pyrepl/__init__.py | 20 +- Lib/test/test_pyrepl/test_eventqueue.py | 11 +- Lib/test/test_pyrepl/test_pyrepl.py | 9 +- Lib/test/test_pyrepl/test_terminfo.py | 651 ++++++++++++++++++ Lib/test/test_pyrepl/test_unix_console.py | 40 +- ...-07-18-17-15-00.gh-issue-135621.9cyCNb.rst | 2 + 11 files changed, 1230 insertions(+), 161 deletions(-) delete mode 100644 Lib/_pyrepl/_minimal_curses.py delete mode 100644 Lib/_pyrepl/curses.py create mode 100644 Lib/_pyrepl/terminfo.py create mode 100644 Lib/test/test_pyrepl/test_terminfo.py create mode 100644 Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst diff --git a/Lib/_pyrepl/_minimal_curses.py b/Lib/_pyrepl/_minimal_curses.py deleted file mode 100644 index d884f880f50ac7..00000000000000 --- a/Lib/_pyrepl/_minimal_curses.py +++ /dev/null @@ -1,68 +0,0 @@ -"""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/curses.py b/Lib/_pyrepl/curses.py deleted file mode 100644 index 3a624d9f6835d1..00000000000000 --- a/Lib/_pyrepl/curses.py +++ /dev/null @@ -1,33 +0,0 @@ -# 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/terminfo.py b/Lib/_pyrepl/terminfo.py new file mode 100644 index 00000000000000..063a285bb9900c --- /dev/null +++ b/Lib/_pyrepl/terminfo.py @@ -0,0 +1,530 @@ +"""Pure Python curses-like terminal capability queries.""" + +from dataclasses import dataclass, field +import errno +import os +from pathlib import Path +import re +import struct + + +# Terminfo constants +MAGIC16 = 0o432 # Magic number for 16-bit terminfo format +MAGIC32 = 0o1036 # Magic number for 32-bit terminfo format + +# Special values for absent/cancelled capabilities +ABSENT_BOOLEAN = -1 +ABSENT_NUMERIC = -1 +CANCELLED_NUMERIC = -2 +ABSENT_STRING = None +CANCELLED_STRING = None + + +# Standard string capability names from ncurses Caps file +# This matches the order used by ncurses when compiling terminfo +# fmt: off +_STRING_NAMES: tuple[str, ...] = ( + "cbt", "bel", "cr", "csr", "tbc", "clear", "el", "ed", "hpa", "cmdch", + "cup", "cud1", "home", "civis", "cub1", "mrcup", "cnorm", "cuf1", "ll", + "cuu1", "cvvis", "dch1", "dl1", "dsl", "hd", "smacs", "blink", "bold", + "smcup", "smdc", "dim", "smir", "invis", "prot", "rev", "smso", "smul", + "ech", "rmacs", "sgr0", "rmcup", "rmdc", "rmir", "rmso", "rmul", "flash", + "ff", "fsl", "is1", "is2", "is3", "if", "ich1", "il1", "ip", "kbs", "ktbc", + "kclr", "kctab", "kdch1", "kdl1", "kcud1", "krmir", "kel", "ked", "kf0", + "kf1", "kf10", "kf2", "kf3", "kf4", "kf5", "kf6", "kf7", "kf8", "kf9", + "khome", "kich1", "kil1", "kcub1", "kll", "knp", "kpp", "kcuf1", "kind", + "kri", "khts", "kcuu1", "rmkx", "smkx", "lf0", "lf1", "lf10", "lf2", "lf3", + "lf4", "lf5", "lf6", "lf7", "lf8", "lf9", "rmm", "smm", "nel", "pad", "dch", + "dl", "cud", "ich", "indn", "il", "cub", "cuf", "rin", "cuu", "pfkey", + "pfloc", "pfx", "mc0", "mc4", "mc5", "rep", "rs1", "rs2", "rs3", "rf", "rc", + "vpa", "sc", "ind", "ri", "sgr", "hts", "wind", "ht", "tsl", "uc", "hu", + "iprog", "ka1", "ka3", "kb2", "kc1", "kc3", "mc5p", "rmp", "acsc", "pln", + "kcbt", "smxon", "rmxon", "smam", "rmam", "xonc", "xoffc", "enacs", "smln", + "rmln", "kbeg", "kcan", "kclo", "kcmd", "kcpy", "kcrt", "kend", "kent", + "kext", "kfnd", "khlp", "kmrk", "kmsg", "kmov", "knxt", "kopn", "kopt", + "kprv", "kprt", "krdo", "kref", "krfr", "krpl", "krst", "kres", "ksav", + "kspd", "kund", "kBEG", "kCAN", "kCMD", "kCPY", "kCRT", "kDC", "kDL", + "kslt", "kEND", "kEOL", "kEXT", "kFND", "kHLP", "kHOM", "kIC", "kLFT", + "kMSG", "kMOV", "kNXT", "kOPT", "kPRV", "kPRT", "kRDO", "kRPL", "kRIT", + "kRES", "kSAV", "kSPD", "kUND", "rfi", "kf11", "kf12", "kf13", "kf14", + "kf15", "kf16", "kf17", "kf18", "kf19", "kf20", "kf21", "kf22", "kf23", + "kf24", "kf25", "kf26", "kf27", "kf28", "kf29", "kf30", "kf31", "kf32", + "kf33", "kf34", "kf35", "kf36", "kf37", "kf38", "kf39", "kf40", "kf41", + "kf42", "kf43", "kf44", "kf45", "kf46", "kf47", "kf48", "kf49", "kf50", + "kf51", "kf52", "kf53", "kf54", "kf55", "kf56", "kf57", "kf58", "kf59", + "kf60", "kf61", "kf62", "kf63", "el1", "mgc", "smgl", "smgr", "fln", "sclk", + "dclk", "rmclk", "cwin", "wingo", "hup","dial", "qdial", "tone", "pulse", + "hook", "pause", "wait", "u0", "u1", "u2", "u3", "u4", "u5", "u6", "u7", + "u8", "u9", "op", "oc", "initc", "initp", "scp", "setf", "setb", "cpi", + "lpi", "chr", "cvr", "defc", "swidm", "sdrfq", "sitm", "slm", "smicm", + "snlq", "snrmq", "sshm", "ssubm", "ssupm", "sum", "rwidm", "ritm", "rlm", + "rmicm", "rshm", "rsubm", "rsupm", "rum", "mhpa", "mcud1", "mcub1", "mcuf1", + "mvpa", "mcuu1", "porder", "mcud", "mcub", "mcuf", "mcuu", "scs", "smgb", + "smgbp", "smglp", "smgrp", "smgt", "smgtp", "sbim", "scsd", "rbim", "rcsd", + "subcs", "supcs", "docr", "zerom", "csnm", "kmous", "minfo", "reqmp", + "getm", "setaf", "setab", "pfxl", "devt", "csin", "s0ds", "s1ds", "s2ds", + "s3ds", "smglr", "smgtb", "birep", "binel", "bicr", "colornm", "defbi", + "endbi", "setcolor", "slines", "dispc", "smpch", "rmpch", "smsc", "rmsc", + "pctrm", "scesc", "scesa", "ehhlm", "elhlm", "elohlm", "erhlm", "ethlm", + "evhlm", "sgr1", "slength", "OTi2", "OTrs", "OTnl", "OTbc", "OTko", "OTma", + "OTG2", "OTG3", "OTG1", "OTG4", "OTGR", "OTGL", "OTGU", "OTGD", "OTGH", + "OTGV", "OTGC","meml", "memu", "box1" +) +# fmt: on +_STRING_CAPABILITY_NAMES = {name: i for i, name in enumerate(_STRING_NAMES)} + + +def _get_terminfo_dirs() -> list[Path]: + """Get list of directories to search for terminfo files. + + Based on ncurses behavior in: + - ncurses/tinfo/db_iterator.c:_nc_next_db() + - ncurses/tinfo/read_entry.c:_nc_read_entry() + """ + dirs = [] + + terminfo = os.environ.get("TERMINFO") + if terminfo: + dirs.append(terminfo) + + try: + home = Path.home() + dirs.append(str(home / ".terminfo")) + except RuntimeError: + pass + + # Check TERMINFO_DIRS + terminfo_dirs = os.environ.get("TERMINFO_DIRS", "") + if terminfo_dirs: + for d in terminfo_dirs.split(":"): + if d: + dirs.append(d) + + dirs.extend( + [ + "/etc/terminfo", + "/lib/terminfo", + "/usr/lib/terminfo", + "/usr/share/terminfo", + "/usr/share/lib/terminfo", + "/usr/share/misc/terminfo", + "/usr/local/lib/terminfo", + "/usr/local/share/terminfo", + ] + ) + + return [Path(d) for d in dirs if Path(d).is_dir()] + + +def _validate_terminal_name_or_raise(terminal_name: str) -> None: + if not isinstance(terminal_name, str): + raise TypeError("`terminal_name` must be a string") + + if not terminal_name: + raise ValueError("`terminal_name` cannot be empty") + + if "\x00" in terminal_name: + raise ValueError("NUL character found in `terminal_name`") + + t = Path(terminal_name) + if len(t.parts) > 1: + raise ValueError("`terminal_name` cannot contain path separators") + + +def _read_terminfo_file(terminal_name: str) -> bytes: + """Find and read terminfo file for given terminal name. + + Terminfo files are stored in directories using the first character + of the terminal name as a subdirectory. + """ + _validate_terminal_name_or_raise(terminal_name) + first_char = terminal_name[0].lower() + filename = terminal_name + + for directory in _get_terminfo_dirs(): + path = directory / first_char / filename + if path.is_file(): + return path.read_bytes() + + # Try with hex encoding of first char (for special chars) + hex_dir = "%02x" % ord(first_char) + path = directory / hex_dir / filename + if path.is_file(): + return path.read_bytes() + + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), filename) + + +# Hard-coded terminal capabilities for common terminals +# This is a minimal subset needed by PyREPL +_TERMINAL_CAPABILITIES = { + # ANSI/xterm-compatible terminals + "ansi": { + # Bell + "bel": b"\x07", + # Cursor movement + "cub": b"\x1b[%p1%dD", # Move cursor left N columns + "cud": b"\x1b[%p1%dB", # Move cursor down N rows + "cuf": b"\x1b[%p1%dC", # Move cursor right N columns + "cuu": b"\x1b[%p1%dA", # Move cursor up N rows + "cub1": b"\x08", # Move cursor left 1 column + "cud1": b"\n", # Move cursor down 1 row + "cuf1": b"\x1b[C", # Move cursor right 1 column + "cuu1": b"\x1b[A", # Move cursor up 1 row + "cup": b"\x1b[%i%p1%d;%p2%dH", # Move cursor to row, column + "hpa": b"\x1b[%i%p1%dG", # Move cursor to column + # Clear operations + "clear": b"\x1b[H\x1b[2J", # Clear screen and home cursor + "el": b"\x1b[K", # Clear to end of line + # Insert/delete + "dch": b"\x1b[%p1%dP", # Delete N characters + "dch1": b"\x1b[P", # Delete 1 character + "ich": b"\x1b[%p1%d@", # Insert N characters + "ich1": b"", # Insert 1 character + # Cursor visibility + "civis": b"\x1b[?25l", # Make cursor invisible + "cnorm": b"\x1b[?12l\x1b[?25h", # Make cursor normal (visible) + # Scrolling + "ind": b"\n", # Scroll up one line + "ri": b"\x1bM", # Scroll down one line + # Keypad mode + "smkx": b"\x1b[?1h\x1b=", # Enable keypad mode + "rmkx": b"\x1b[?1l\x1b>", # Disable keypad mode + # Padding (not used in modern terminals) + "pad": b"", + # Function keys and special keys + "kdch1": b"\x1b[3~", # Delete key + "kcud1": b"\x1bOB", # Down arrow + "kend": b"\x1bOF", # End key + "kent": b"\x1bOM", # Enter key + "khome": b"\x1bOH", # Home key + "kich1": b"\x1b[2~", # Insert key + "kcub1": b"\x1bOD", # Left arrow + "knp": b"\x1b[6~", # Page down + "kpp": b"\x1b[5~", # Page up + "kcuf1": b"\x1bOC", # Right arrow + "kcuu1": b"\x1bOA", # Up arrow + # Function keys F1-F20 + "kf1": b"\x1bOP", + "kf2": b"\x1bOQ", + "kf3": b"\x1bOR", + "kf4": b"\x1bOS", + "kf5": b"\x1b[15~", + "kf6": b"\x1b[17~", + "kf7": b"\x1b[18~", + "kf8": b"\x1b[19~", + "kf9": b"\x1b[20~", + "kf10": b"\x1b[21~", + "kf11": b"\x1b[23~", + "kf12": b"\x1b[24~", + "kf13": b"\x1b[1;2P", + "kf14": b"\x1b[1;2Q", + "kf15": b"\x1b[1;2R", + "kf16": b"\x1b[1;2S", + "kf17": b"\x1b[15;2~", + "kf18": b"\x1b[17;2~", + "kf19": b"\x1b[18;2~", + "kf20": b"\x1b[19;2~", + }, + # Dumb terminal - minimal capabilities + "dumb": { + "bel": b"\x07", # Bell + "cud1": b"\n", # Move down 1 row (newline) + "ind": b"\n", # Scroll up one line (newline) + }, + # Linux console + "linux": { + # Bell + "bel": b"\x07", + # Cursor movement + "cub": b"\x1b[%p1%dD", # Move cursor left N columns + "cud": b"\x1b[%p1%dB", # Move cursor down N rows + "cuf": b"\x1b[%p1%dC", # Move cursor right N columns + "cuu": b"\x1b[%p1%dA", # Move cursor up N rows + "cub1": b"\x08", # Move cursor left 1 column (backspace) + "cud1": b"\n", # Move cursor down 1 row (newline) + "cuf1": b"\x1b[C", # Move cursor right 1 column + "cuu1": b"\x1b[A", # Move cursor up 1 row + "cup": b"\x1b[%i%p1%d;%p2%dH", # Move cursor to row, column + "hpa": b"\x1b[%i%p1%dG", # Move cursor to column + # Clear operations + "clear": b"\x1b[H\x1b[J", # Clear screen and home cursor (different from ansi!) + "el": b"\x1b[K", # Clear to end of line + # Insert/delete + "dch": b"\x1b[%p1%dP", # Delete N characters + "dch1": b"\x1b[P", # Delete 1 character + "ich": b"\x1b[%p1%d@", # Insert N characters + "ich1": b"\x1b[@", # Insert 1 character + # Cursor visibility + "civis": b"\x1b[?25l\x1b[?1c", # Make cursor invisible + "cnorm": b"\x1b[?25h\x1b[?0c", # Make cursor normal + # Scrolling + "ind": b"\n", # Scroll up one line + "ri": b"\x1bM", # Scroll down one line + # Keypad mode + "smkx": b"\x1b[?1h\x1b=", # Enable keypad mode + "rmkx": b"\x1b[?1l\x1b>", # Disable keypad mode + # Function keys and special keys + "kdch1": b"\x1b[3~", # Delete key + "kcud1": b"\x1b[B", # Down arrow + "kend": b"\x1b[4~", # End key (different from ansi!) + "khome": b"\x1b[1~", # Home key (different from ansi!) + "kich1": b"\x1b[2~", # Insert key + "kcub1": b"\x1b[D", # Left arrow + "knp": b"\x1b[6~", # Page down + "kpp": b"\x1b[5~", # Page up + "kcuf1": b"\x1b[C", # Right arrow + "kcuu1": b"\x1b[A", # Up arrow + # Function keys + "kf1": b"\x1b[[A", + "kf2": b"\x1b[[B", + "kf3": b"\x1b[[C", + "kf4": b"\x1b[[D", + "kf5": b"\x1b[[E", + "kf6": b"\x1b[17~", + "kf7": b"\x1b[18~", + "kf8": b"\x1b[19~", + "kf9": b"\x1b[20~", + "kf10": b"\x1b[21~", + "kf11": b"\x1b[23~", + "kf12": b"\x1b[24~", + "kf13": b"\x1b[25~", + "kf14": b"\x1b[26~", + "kf15": b"\x1b[28~", + "kf16": b"\x1b[29~", + "kf17": b"\x1b[31~", + "kf18": b"\x1b[32~", + "kf19": b"\x1b[33~", + "kf20": b"\x1b[34~", + }, +} + +# Map common TERM values to capability sets +_TERM_ALIASES = { + "xterm": "ansi", + "xterm-color": "ansi", + "xterm-256color": "ansi", + "screen": "ansi", + "screen-256color": "ansi", + "tmux": "ansi", + "tmux-256color": "ansi", + "vt100": "ansi", + "vt220": "ansi", + "rxvt": "ansi", + "rxvt-unicode": "ansi", + "rxvt-unicode-256color": "ansi", + "unknown": "dumb", +} + + +@dataclass +class TermInfo: + terminal_name: str | bytes | None + fallback: bool = True + + _names: list[str] = field(default_factory=list) + _booleans: list[int] = field(default_factory=list) + _numbers: list[int] = field(default_factory=list) + _strings: list[bytes | None] = field(default_factory=list) + _capabilities: dict[str, bytes] = field(default_factory=dict) + + def __post_init__(self) -> None: + """Initialize terminal capabilities for the given terminal type. + + Based on ncurses implementation in: + - ncurses/tinfo/lib_setup.c:setupterm() and _nc_setupterm() + - ncurses/tinfo/lib_setup.c:TINFO_SETUP_TERM() + + This version first attempts to read terminfo database files like ncurses, + then, if `fallback` is True, falls back to hardcoded capabilities for + common terminal types. + """ + # If termstr is None or empty, try to get from environment + if not self.terminal_name: + self.terminal_name = os.environ.get("TERM") or "ANSI" + + if isinstance(self.terminal_name, bytes): + self.terminal_name = self.terminal_name.decode("ascii") + + try: + self._parse_terminfo_file(self.terminal_name) + except (OSError, ValueError): + if not self.fallback: + raise + + term_type = _TERM_ALIASES.get( + self.terminal_name, self.terminal_name + ) + if term_type not in _TERMINAL_CAPABILITIES: + term_type = "dumb" + self._capabilities = _TERMINAL_CAPABILITIES[term_type].copy() + + def _parse_terminfo_file(self, terminal_name: str) -> None: + """Parse a terminfo file. + + Based on ncurses implementation in: + - ncurses/tinfo/read_entry.c:_nc_read_termtype() + - ncurses/tinfo/read_entry.c:_nc_read_file_entry() + """ + data = _read_terminfo_file(terminal_name) + too_short = f"TermInfo file for {terminal_name!r} too short" + offset = 12 + if len(data) < offset: + raise ValueError(too_short) + + magic, name_size, bool_count, num_count, str_count, str_size = ( + struct.unpack(" len(data): + raise ValueError(too_short) + names = data[offset : offset + name_size - 1].decode( + "ascii", errors="ignore" + ) + offset += name_size + + # Read boolean capabilities + if offset + bool_count > len(data): + raise ValueError(too_short) + booleans = list(data[offset : offset + bool_count]) + offset += bool_count + + # Align to even byte boundary for numbers + if offset % 2: + offset += 1 + + # Read numeric capabilities + numbers = [] + for i in range(num_count): + if offset + number_size > len(data): + raise ValueError(too_short) + num = struct.unpack( + number_format, data[offset : offset + number_size] + )[0] + numbers.append(num) + offset += number_size + + # Read string offsets + string_offsets = [] + for i in range(str_count): + if offset + 2 > len(data): + raise ValueError(too_short) + off = struct.unpack(" len(data): + raise ValueError(too_short) + string_table = data[offset : offset + str_size] + + # Extract strings from string table + strings: list[bytes | None] = [] + for off in string_offsets: + if off < 0: + strings.append(CANCELLED_STRING) + elif off < len(string_table): + # Find null terminator + end = off + while end < len(string_table) and string_table[end] != 0: + end += 1 + if end <= len(string_table): + strings.append(string_table[off:end]) + else: + strings.append(ABSENT_STRING) + else: + strings.append(ABSENT_STRING) + + self._names = names.split("|") + self._booleans = booleans + self._numbers = numbers + self._strings = strings + + def get(self, cap: str) -> bytes | None: + """Get terminal capability string by name. + + Based on ncurses implementation in: + - ncurses/tinfo/lib_ti.c:tigetstr() + + The ncurses version searches through compiled terminfo data structures. + This version first checks parsed terminfo data, then falls back to + hardcoded capabilities. + """ + if not isinstance(cap, str): + raise TypeError(f"`cap` must be a string, not {type(cap)}") + + if self._capabilities: + # Fallbacks populated, use them + return self._capabilities.get(cap) + + # Look up in standard capabilities first + if cap in _STRING_CAPABILITY_NAMES: + index = _STRING_CAPABILITY_NAMES[cap] + if index < len(self._strings): + return self._strings[index] + + # Note: we don't support extended capabilities since PyREPL doesn't + # need them. + return None + + +def tparm(cap_bytes: bytes, *params: int) -> bytes: + """Parameterize a terminal capability string. + + Based on ncurses implementation in: + - ncurses/tinfo/lib_tparm.c:tparm() + - ncurses/tinfo/lib_tparm.c:tparam_internal() + + The ncurses version implements a full stack-based interpreter for + terminfo parameter strings. This pure Python version implements only + the subset of parameter substitution operations needed by PyREPL: + - %i (increment parameters for 1-based indexing) + - %p[1-9]%d (parameter substitution) + - %p[1-9]%{n}%+%d (parameter plus constant) + """ + if not isinstance(cap_bytes, bytes): + raise TypeError(f"`cap` must be bytes, not {type(cap_bytes)}") + + result = cap_bytes + + # %i - increment parameters (1-based instead of 0-based) + increment = b"%i" in result + if increment: + result = result.replace(b"%i", b"") + + # Replace %p1%d, %p2%d, etc. with actual parameter values + for i in range(len(params)): + pattern = b"%%p%d%%d" % (i + 1) + if pattern in result: + value = params[i] + if increment: + value += 1 + result = result.replace(pattern, str(value).encode("ascii")) + + # Handle %p1%{1}%+%d (parameter plus constant) + # Used in some cursor positioning sequences + pattern_re = re.compile(rb"%p(\d)%\{(\d+)\}%\+%d") + matches = list(pattern_re.finditer(result)) + for match in reversed(matches): # reversed to maintain positions + param_idx = int(match.group(1)) + constant = int(match.group(2)) + value = params[param_idx] + constant + result = ( + result[: match.start()] + + str(value).encode("ascii") + + result[match.end() :] + ) + + return result diff --git a/Lib/_pyrepl/unix_console.py b/Lib/_pyrepl/unix_console.py index d21cdd9b076d86..a7e49923191c07 100644 --- a/Lib/_pyrepl/unix_console.py +++ b/Lib/_pyrepl/unix_console.py @@ -33,7 +33,7 @@ import platform from fcntl import ioctl -from . import curses +from . import terminfo from .console import Console, Event from .fancy_termios import tcgetattr, tcsetattr from .trace import trace @@ -60,7 +60,7 @@ class InvalidTerminal(RuntimeError): pass -_error = (termios.error, curses.error, InvalidTerminal) +_error = (termios.error, InvalidTerminal) SIGWINCH_EVENT = "repaint" @@ -157,7 +157,7 @@ def __init__( self.pollob = poll() self.pollob.register(self.input_fd, select.POLLIN) - curses.setupterm(term or None, self.output_fd) + self.terminfo = terminfo.TermInfo(term or None) self.term = term @overload @@ -167,7 +167,7 @@ def _my_getstr(cap: str, optional: Literal[False] = False) -> bytes: ... def _my_getstr(cap: str, optional: bool) -> bytes | None: ... def _my_getstr(cap: str, optional: bool = False) -> bytes | None: - r = curses.tigetstr(cap) + r = self.terminfo.get(cap) if not optional and r is None: raise InvalidTerminal( f"terminal doesn't have the required {cap} capability" @@ -201,7 +201,7 @@ def _my_getstr(cap: str, optional: bool = False) -> bytes | None: self.__setup_movement() - self.event_queue = EventQueue(self.input_fd, self.encoding) + self.event_queue = EventQueue(self.input_fd, self.encoding, self.terminfo) self.cursor_visible = 1 signal.signal(signal.SIGCONT, self._sigcont_handler) @@ -597,14 +597,14 @@ def __setup_movement(self): if self._dch1: self.dch1 = self._dch1 elif self._dch: - self.dch1 = curses.tparm(self._dch, 1) + self.dch1 = terminfo.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) + self.ich1 = terminfo.tparm(self._ich, 1) else: self.ich1 = None @@ -701,7 +701,7 @@ def __write(self, text): self.__buffer.append((text, 0)) def __write_code(self, fmt, *args): - self.__buffer.append((curses.tparm(fmt, *args), 1)) + self.__buffer.append((terminfo.tparm(fmt, *args), 1)) def __maybe_write_code(self, fmt, *args): if fmt: diff --git a/Lib/_pyrepl/unix_eventqueue.py b/Lib/_pyrepl/unix_eventqueue.py index 29b3e9dd5efd07..2a9cca59e7477f 100644 --- a/Lib/_pyrepl/unix_eventqueue.py +++ b/Lib/_pyrepl/unix_eventqueue.py @@ -18,7 +18,7 @@ # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -from . import curses +from .terminfo import TermInfo from .trace import trace from .base_eventqueue import BaseEventQueue from termios import tcgetattr, VERASE @@ -54,22 +54,23 @@ b'\033Oc': 'ctrl right', } -def get_terminal_keycodes() -> dict[bytes, str]: +def get_terminal_keycodes(ti: TermInfo) -> 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) + keycode = ti.get(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(BaseEventQueue): - def __init__(self, fd: int, encoding: str) -> None: - keycodes = get_terminal_keycodes() + def __init__(self, fd: int, encoding: str, ti: TermInfo) -> None: + keycodes = get_terminal_keycodes(ti) if os.isatty(fd): backspace = tcgetattr(fd)[6][VERASE] keycodes[backspace] = "backspace" diff --git a/Lib/test/test_pyrepl/__init__.py b/Lib/test/test_pyrepl/__init__.py index 8359d9844623c2..8ef472eb0cffaf 100644 --- a/Lib/test/test_pyrepl/__init__.py +++ b/Lib/test/test_pyrepl/__init__.py @@ -1,14 +1,14 @@ import os -import sys -from test.support import requires, load_package_tests -from test.support.import_helper import import_module - -if sys.platform != "win32": - # On non-Windows platforms, testing pyrepl currently requires that the - # 'curses' resource be given on the regrtest command line using the -u - # option. Additionally, we need to attempt to import curses and readline. - requires("curses") - curses = import_module("curses") +from test.support import load_package_tests +import unittest + + +try: + import termios +except ImportError: + raise unittest.SkipTest("termios required") +else: + del termios def load_tests(*args): diff --git a/Lib/test/test_pyrepl/test_eventqueue.py b/Lib/test/test_pyrepl/test_eventqueue.py index edfe6ac4748f33..69d9612b70dc77 100644 --- a/Lib/test/test_pyrepl/test_eventqueue.py +++ b/Lib/test/test_pyrepl/test_eventqueue.py @@ -3,6 +3,8 @@ from unittest.mock import patch from test import support +from _pyrepl import terminfo + try: from _pyrepl.console import Event from _pyrepl import base_eventqueue @@ -172,17 +174,22 @@ def _push(keys): self.assertEqual(eq.get(), _event("key", "a")) +class EmptyTermInfo(terminfo.TermInfo): + def get(self, cap: str) -> bytes: + return b"" + + @unittest.skipIf(support.MS_WINDOWS, "No Unix event queue on Windows") class TestUnixEventQueue(EventQueueTestBase, unittest.TestCase): def setUp(self): - self.enterContext(patch("_pyrepl.curses.tigetstr", lambda x: b"")) self.file = tempfile.TemporaryFile() def tearDown(self) -> None: self.file.close() def make_eventqueue(self) -> base_eventqueue.BaseEventQueue: - return unix_eventqueue.EventQueue(self.file.fileno(), "utf-8") + ti = EmptyTermInfo("ansi") + return unix_eventqueue.EventQueue(self.file.fileno(), "utf-8", ti) @unittest.skipUnless(support.MS_WINDOWS, "No Windows event queue on Unix") diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 98bae7dd703fd9..de10a8a07c8f3f 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -9,10 +9,10 @@ import sys import tempfile from pkgutil import ModuleInfo -from unittest import TestCase, skipUnless, skipIf +from unittest import TestCase, skipUnless, skipIf, SkipTest from unittest.mock import patch from test.support import force_not_colorized, make_clean_env, Py_DEBUG -from test.support import SHORT_TIMEOUT, STDLIB_DIR +from test.support import has_subprocess_support, SHORT_TIMEOUT, STDLIB_DIR from test.support.import_helper import import_module from test.support.os_helper import EnvironmentVarGuard, unlink @@ -38,6 +38,10 @@ class ReplTestCase(TestCase): + def setUp(self): + if not has_subprocess_support: + raise SkipTest("test module requires subprocess") + def run_repl( self, repl_input: str | list[str], @@ -1371,6 +1375,7 @@ def setUp(self): # Cleanup from PYTHON* variables to isolate from local # user settings, see #121359. Such variables should be # added later in test methods to patched os.environ. + super().setUp() patcher = patch('os.environ', new=make_clean_env()) self.addCleanup(patcher.stop) patcher.start() diff --git a/Lib/test/test_pyrepl/test_terminfo.py b/Lib/test/test_pyrepl/test_terminfo.py new file mode 100644 index 00000000000000..562cf5c905bd67 --- /dev/null +++ b/Lib/test/test_pyrepl/test_terminfo.py @@ -0,0 +1,651 @@ +"""Tests comparing PyREPL's pure Python curses implementation with the standard curses module.""" + +import json +import os +import subprocess +import sys +import unittest +from test.support import requires, has_subprocess_support +from textwrap import dedent + +# Only run these tests if curses is available +requires("curses") + +try: + import _curses +except ImportError: + try: + import curses as _curses + except ImportError: + _curses = None + +from _pyrepl import terminfo + + +ABSENT_STRING = terminfo.ABSENT_STRING +CANCELLED_STRING = terminfo.CANCELLED_STRING + + +class TestCursesCompatibility(unittest.TestCase): + """Test that PyREPL's curses implementation matches the standard curses behavior. + + Python's `curses` doesn't allow calling `setupterm()` again with a different + $TERM in the same process, so we subprocess all `curses` tests to get correctly + set up terminfo.""" + + @classmethod + def setUpClass(cls): + if _curses is None: + raise unittest.SkipTest( + "`curses` capability provided to regrtest but `_curses` not importable" + ) + + if not has_subprocess_support: + raise unittest.SkipTest("test module requires subprocess") + + # we need to ensure there's a terminfo database on the system and that + # `infocmp` works + cls.infocmp("dumb") + + def setUp(self): + self.original_term = os.environ.get("TERM", None) + + def tearDown(self): + if self.original_term is not None: + os.environ["TERM"] = self.original_term + elif "TERM" in os.environ: + del os.environ["TERM"] + + @classmethod + def infocmp(cls, term) -> list[str]: + all_caps = [] + try: + result = subprocess.run( + ["infocmp", "-l1", term], + capture_output=True, + text=True, + check=True, + ) + except Exception: + raise unittest.SkipTest("calling `infocmp` failed on the system") + + for line in result.stdout.splitlines(): + line = line.strip() + if line.startswith("#"): + if "terminfo" not in line and "termcap" in line: + # PyREPL terminfo doesn't parse termcap databases + raise unittest.SkipTest( + "curses using termcap.db: no terminfo database on" + " the system" + ) + elif "=" in line: + cap_name = line.split("=")[0] + all_caps.append(cap_name) + + return all_caps + + def test_setupterm_basic(self): + """Test basic setupterm functionality.""" + # Test with explicit terminal type + test_terms = ["xterm", "xterm-256color", "vt100", "ansi"] + + for term in test_terms: + with self.subTest(term=term): + ncurses_code = dedent( + f""" + import _curses + import json + try: + _curses.setupterm({repr(term)}, 1) + print(json.dumps({{"success": True}})) + except Exception as e: + print(json.dumps({{"success": False, "error": str(e)}})) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + ncurses_data = json.loads(result.stdout) + std_success = ncurses_data["success"] + + # Set up with PyREPL curses + try: + terminfo.TermInfo(term, fallback=False) + pyrepl_success = True + except Exception as e: + pyrepl_success = False + pyrepl_error = e + + # Both should succeed or both should fail + if std_success: + self.assertTrue( + pyrepl_success, + f"Standard curses succeeded but PyREPL failed for {term}", + ) + else: + # If standard curses failed, PyREPL might still succeed with fallback + # This is acceptable as PyREPL has hardcoded fallbacks + pass + + def test_setupterm_none(self): + """Test setupterm with None (uses TERM from environment).""" + # Test with current TERM + ncurses_code = dedent( + """ + import _curses + import json + try: + _curses.setupterm(None, 1) + print(json.dumps({"success": True})) + except Exception as e: + print(json.dumps({"success": False, "error": str(e)})) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + ncurses_data = json.loads(result.stdout) + std_success = ncurses_data["success"] + + try: + terminfo.TermInfo(None, fallback=False) + pyrepl_success = True + except Exception: + pyrepl_success = False + + # Both should have same result + if std_success: + self.assertTrue( + pyrepl_success, + "Standard curses succeeded but PyREPL failed for None", + ) + + def test_tigetstr_common_capabilities(self): + """Test tigetstr for common terminal capabilities.""" + # Test with a known terminal type + term = "xterm" + + # Get ALL capabilities from infocmp + all_caps = self.infocmp(term) + + ncurses_code = dedent( + f""" + import _curses + import json + _curses.setupterm({repr(term)}, 1) + results = {{}} + for cap in {repr(all_caps)}: + try: + val = _curses.tigetstr(cap) + if val is None: + results[cap] = None + elif val == -1: + results[cap] = -1 + else: + results[cap] = list(val) + except BaseException: + results[cap] = "error" + print(json.dumps(results)) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + self.assertEqual( + result.returncode, 0, f"Failed to run ncurses: {result.stderr}" + ) + + ncurses_data = json.loads(result.stdout) + + ti = terminfo.TermInfo(term, fallback=False) + + # Test every single capability + for cap in all_caps: + if cap not in ncurses_data or ncurses_data[cap] == "error": + continue + + with self.subTest(capability=cap): + ncurses_val = ncurses_data[cap] + if isinstance(ncurses_val, list): + ncurses_val = bytes(ncurses_val) + + pyrepl_val = ti.get(cap) + + self.assertEqual( + pyrepl_val, + ncurses_val, + f"Capability {cap}: ncurses={repr(ncurses_val)}, " + f"pyrepl={repr(pyrepl_val)}", + ) + + def test_tigetstr_input_types(self): + """Test tigetstr with different input types.""" + term = "xterm" + cap = "cup" + + # Test standard curses behavior with string in subprocess + ncurses_code = dedent( + f""" + import _curses + import json + _curses.setupterm({repr(term)}, 1) + + # Test with string input + try: + std_str_result = _curses.tigetstr({repr(cap)}) + std_accepts_str = True + if std_str_result is None: + std_str_val = None + elif std_str_result == -1: + std_str_val = -1 + else: + std_str_val = list(std_str_result) + except TypeError: + std_accepts_str = False + std_str_val = None + + print(json.dumps({{ + "accepts_str": std_accepts_str, + "str_result": std_str_val + }})) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + ncurses_data = json.loads(result.stdout) + + # PyREPL setup + ti = terminfo.TermInfo(term, fallback=False) + + # PyREPL behavior with string + try: + pyrepl_str_result = ti.get(cap) + pyrepl_accepts_str = True + except TypeError: + pyrepl_accepts_str = False + + # PyREPL should also only accept strings for compatibility + with self.assertRaises(TypeError): + ti.get(cap.encode("ascii")) + + # Both should accept string input + self.assertEqual( + pyrepl_accepts_str, + ncurses_data["accepts_str"], + "PyREPL and standard curses should have same string handling", + ) + self.assertTrue( + pyrepl_accepts_str, "PyREPL should accept string input" + ) + + def test_tparm_basic(self): + """Test basic tparm functionality.""" + term = "xterm" + ti = terminfo.TermInfo(term, fallback=False) + + # Test cursor positioning (cup) + cup = ti.get("cup") + if cup and cup not in {ABSENT_STRING, CANCELLED_STRING}: + # Test various parameter combinations + test_cases = [ + (0, 0), # Top-left + (5, 10), # Arbitrary position + (23, 79), # Bottom-right of standard terminal + (999, 999), # Large values + ] + + # Get ncurses results in subprocess + ncurses_code = dedent( + f""" + import _curses + import json + _curses.setupterm({repr(term)}, 1) + + # Get cup capability + cup = _curses.tigetstr('cup') + results = {{}} + + for row, col in {repr(test_cases)}: + try: + result = _curses.tparm(cup, row, col) + results[f"{{row}},{{col}}"] = list(result) + except Exception as e: + results[f"{{row}},{{col}}"] = {{"error": str(e)}} + + print(json.dumps(results)) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + self.assertEqual( + result.returncode, 0, f"Failed to run ncurses: {result.stderr}" + ) + ncurses_data = json.loads(result.stdout) + + for row, col in test_cases: + with self.subTest(row=row, col=col): + # Standard curses tparm from subprocess + key = f"{row},{col}" + if ( + isinstance(ncurses_data[key], dict) + and "error" in ncurses_data[key] + ): + self.fail( + f"ncurses tparm failed: {ncurses_data[key]['error']}" + ) + std_result = bytes(ncurses_data[key]) + + # PyREPL curses tparm + pyrepl_result = terminfo.tparm(cup, row, col) + + # Results should be identical + self.assertEqual( + pyrepl_result, + std_result, + f"tparm(cup, {row}, {col}): " + f"std={repr(std_result)}, pyrepl={repr(pyrepl_result)}", + ) + else: + raise unittest.SkipTest( + "test_tparm_basic() requires the `cup` capability" + ) + + def test_tparm_multiple_params(self): + """Test tparm with capabilities using multiple parameters.""" + term = "xterm" + ti = terminfo.TermInfo(term, fallback=False) + + # Test capabilities that take parameters + param_caps = { + "cub": 1, # cursor_left with count + "cuf": 1, # cursor_right with count + "cuu": 1, # cursor_up with count + "cud": 1, # cursor_down with count + "dch": 1, # delete_character with count + "ich": 1, # insert_character with count + } + + # Get all capabilities from PyREPL first + pyrepl_caps = {} + for cap in param_caps: + cap_value = ti.get(cap) + if cap_value and cap_value not in { + ABSENT_STRING, + CANCELLED_STRING, + }: + pyrepl_caps[cap] = cap_value + + if not pyrepl_caps: + self.skipTest("No parametrized capabilities found") + + # Get ncurses results in subprocess + ncurses_code = dedent( + f""" + import _curses + import json + _curses.setupterm({repr(term)}, 1) + + param_caps = {repr(param_caps)} + test_values = [1, 5, 10, 99] + results = {{}} + + for cap in param_caps: + cap_value = _curses.tigetstr(cap) + if cap_value and cap_value != -1: + for value in test_values: + try: + result = _curses.tparm(cap_value, value) + results[f"{{cap}},{{value}}"] = list(result) + except Exception as e: + results[f"{{cap}},{{value}}"] = {{"error": str(e)}} + + print(json.dumps(results)) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + self.assertEqual( + result.returncode, 0, f"Failed to run ncurses: {result.stderr}" + ) + ncurses_data = json.loads(result.stdout) + + for cap, cap_value in pyrepl_caps.items(): + with self.subTest(capability=cap): + # Test with different parameter values + for value in [1, 5, 10, 99]: + key = f"{cap},{value}" + if key in ncurses_data: + if ( + isinstance(ncurses_data[key], dict) + and "error" in ncurses_data[key] + ): + self.fail( + f"ncurses tparm failed: {ncurses_data[key]['error']}" + ) + std_result = bytes(ncurses_data[key]) + + pyrepl_result = terminfo.tparm(cap_value, value) + self.assertEqual( + pyrepl_result, + std_result, + f"tparm({cap}, {value}): " + f"std={repr(std_result)}, pyrepl={repr(pyrepl_result)}", + ) + + def test_tparm_null_handling(self): + """Test tparm with None/null input.""" + term = "xterm" + + ncurses_code = dedent( + f""" + import _curses + import json + _curses.setupterm({repr(term)}, 1) + + # Test with None + try: + _curses.tparm(None) + raises_typeerror = False + except TypeError: + raises_typeerror = True + except Exception as e: + raises_typeerror = False + error_type = type(e).__name__ + + print(json.dumps({{"raises_typeerror": raises_typeerror}})) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + ncurses_data = json.loads(result.stdout) + + # PyREPL setup + ti = terminfo.TermInfo(term, fallback=False) + + # Test with None - both should raise TypeError + if ncurses_data["raises_typeerror"]: + with self.assertRaises(TypeError): + terminfo.tparm(None) + else: + # If ncurses doesn't raise TypeError, PyREPL shouldn't either + try: + terminfo.tparm(None) + except TypeError: + self.fail("PyREPL raised TypeError but ncurses did not") + + def test_special_terminals(self): + """Test with special terminal types.""" + special_terms = [ + "dumb", # Minimal terminal + "unknown", # Should fall back to defaults + "linux", # Linux console + "screen", # GNU Screen + "tmux", # tmux + ] + + # Get all string capabilities from ncurses + for term in special_terms: + with self.subTest(term=term): + all_caps = self.infocmp(term) + ncurses_code = dedent( + f""" + import _curses + import json + import sys + + try: + _curses.setupterm({repr(term)}, 1) + results = {{}} + for cap in {repr(all_caps)}: + try: + val = _curses.tigetstr(cap) + if val is None: + results[cap] = None + elif val == -1: + results[cap] = -1 + else: + # Convert bytes to list of ints for JSON + results[cap] = list(val) + except BaseException: + results[cap] = "error" + print(json.dumps(results)) + except Exception as e: + print(json.dumps({{"error": str(e)}})) + """ + ) + + # Get ncurses results + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + if result.returncode != 0: + self.fail( + f"Failed to get ncurses data for {term}: {result.stderr}" + ) + + try: + ncurses_data = json.loads(result.stdout) + except json.JSONDecodeError: + self.fail( + f"Failed to parse ncurses output for {term}: {result.stdout}" + ) + + if "error" in ncurses_data and len(ncurses_data) == 1: + # ncurses failed to setup this terminal + # PyREPL should still work with fallback + ti = terminfo.TermInfo(term, fallback=True) + continue + + ti = terminfo.TermInfo(term, fallback=False) + + # Compare all capabilities + for cap in all_caps: + if cap not in ncurses_data: + continue + + with self.subTest(term=term, capability=cap): + ncurses_val = ncurses_data[cap] + if isinstance(ncurses_val, list): + # Convert back to bytes + ncurses_val = bytes(ncurses_val) + + pyrepl_val = ti.get(cap) + + # Both should return the same value + self.assertEqual( + pyrepl_val, + ncurses_val, + f"Capability {cap} for {term}: " + f"ncurses={repr(ncurses_val)}, " + f"pyrepl={repr(pyrepl_val)}", + ) + + def test_terminfo_fallback(self): + """Test that PyREPL falls back gracefully when terminfo is not found.""" + # Use a non-existent terminal type + fake_term = "nonexistent-terminal-type-12345" + + # Check if standard curses can setup this terminal in subprocess + ncurses_code = dedent( + f""" + import _curses + import json + try: + _curses.setupterm({repr(fake_term)}, 1) + print(json.dumps({{"success": True}})) + except _curses.error: + print(json.dumps({{"success": False, "error": "curses.error"}})) + except Exception as e: + print(json.dumps({{"success": False, "error": str(e)}})) + """ + ) + + result = subprocess.run( + [sys.executable, "-c", ncurses_code], + capture_output=True, + text=True, + ) + ncurses_data = json.loads(result.stdout) + + if ncurses_data["success"]: + # If it succeeded, skip this test as we can't test fallback + self.skipTest( + f"System unexpectedly has terminfo for '{fake_term}'" + ) + + # PyREPL should succeed with fallback + try: + ti = terminfo.TermInfo(fake_term, fallback=True) + pyrepl_ok = True + except Exception: + pyrepl_ok = False + + self.assertTrue( + pyrepl_ok, "PyREPL should fall back for unknown terminals" + ) + + # Should still be able to get basic capabilities + bel = ti.get("bel") + self.assertIsNotNone( + bel, "PyREPL should provide basic capabilities after fallback" + ) + + def test_invalid_terminal_names(self): + cases = [ + (42, TypeError), + ("", ValueError), + ("w\x00t", ValueError), + (f"..{os.sep}name", ValueError), + ] + + for term, exc in cases: + with self.subTest(term=term): + with self.assertRaises(exc): + terminfo._validate_terminal_name_or_raise(term) diff --git a/Lib/test/test_pyrepl/test_unix_console.py b/Lib/test/test_pyrepl/test_unix_console.py index b3f7dc028fe210..ab1236768cfb3e 100644 --- a/Lib/test/test_pyrepl/test_unix_console.py +++ b/Lib/test/test_pyrepl/test_unix_console.py @@ -16,9 +16,13 @@ except ImportError: pass +from _pyrepl.terminfo import _TERMINAL_CAPABILITIES + +TERM_CAPABILITIES = _TERMINAL_CAPABILITIES["ansi"] + def unix_console(events, **kwargs): - console = UnixConsole() + console = UnixConsole(term="xterm") console.get_event = MagicMock(side_effect=events) console.getpending = MagicMock(return_value=Event("key", "")) @@ -50,41 +54,11 @@ def unix_console(events, **kwargs): ) -TERM_CAPABILITIES = { - "bel": b"\x07", - "civis": b"\x1b[?25l", - "clear": b"\x1b[H\x1b[2J", - "cnorm": b"\x1b[?12l\x1b[?25h", - "cub": b"\x1b[%p1%dD", - "cub1": b"\x08", - "cud": b"\x1b[%p1%dB", - "cud1": b"\n", - "cuf": b"\x1b[%p1%dC", - "cuf1": b"\x1b[C", - "cup": b"\x1b[%i%p1%d;%p2%dH", - "cuu": b"\x1b[%p1%dA", - "cuu1": b"\x1b[A", - "dch1": b"\x1b[P", - "dch": b"\x1b[%p1%dP", - "el": b"\x1b[K", - "hpa": b"\x1b[%i%p1%dG", - "ich": b"\x1b[%p1%d@", - "ich1": None, - "ind": b"\n", - "pad": None, - "ri": b"\x1bM", - "rmkx": b"\x1b[?1l\x1b>", - "smkx": b"\x1b[?1h\x1b=", -} - - @unittest.skipIf(sys.platform == "win32", "No Unix event queue on Windows") -@patch("_pyrepl.curses.tigetstr", lambda s: TERM_CAPABILITIES.get(s)) @patch( - "_pyrepl.curses.tparm", + "_pyrepl.terminfo.tparm", lambda s, *args: s + b":" + b",".join(str(i).encode() for i in args), ) -@patch("_pyrepl.curses.setupterm", lambda a, b: None) @patch( "termios.tcgetattr", lambda _: [ @@ -321,7 +295,7 @@ def same_console(events): def test_getheightwidth_with_invalid_environ(self, _os_write): # gh-128636 - console = UnixConsole() + console = UnixConsole(term="xterm") with os_helper.EnvironmentVarGuard() as env: env["LINES"] = "" self.assertIsInstance(console.getheightwidth(), tuple) diff --git a/Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst b/Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst new file mode 100644 index 00000000000000..fe7f962ccbb096 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst @@ -0,0 +1,2 @@ +PyREPL no longer depends on the :mod:`curses` standard library. Contributed +by Łukasz Langa. From 0d87bb66d3c2fc6331c3b1f9d649ebc9bb385c5a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:29:51 +0200 Subject: [PATCH 0683/1674] [3.14] gh-121028: Soft-deprecate sys.api_version (GH-136463) (GH-136928) (cherry picked from commit 658599c15d13ee3a5cb56c3d9fccaa195465d4b5) Co-authored-by: Petr Viktorin --- Doc/library/sys.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 05bc7cfb9dc089..52f0af31c68726 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -2191,8 +2191,11 @@ always available. Unless explicitly noted otherwise, all variables are read-only .. data:: api_version - The C API version for this interpreter. Programmers may find this useful when - debugging version conflicts between Python and extension modules. + The C API version, equivalent to the C macro :c:macro:`PYTHON_API_VERSION`. + Defined for backwards compatibility. + + Currently, this constant is not updated in new Python versions, and is not + useful for versioning. This may change in the future. .. data:: version_info From af8d1f56f5147f685d0a79f3964fdb5bb07746c2 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Mon, 21 Jul 2025 17:34:54 +0200 Subject: [PATCH 0684/1674] [3.14] gh-132661: Disallow `Template`/`str` concatenation after PEP 750 spec update (#135996) (#136901) Co-authored-by: Dave Peck Co-authored-by: sobolevn --- Grammar/python.gram | 11 +- Lib/_ast_unparse.py | 26 +- Lib/test/test_ast/test_ast.py | 7 - Lib/test/test_tstring.py | 73 +- Lib/test/test_unparse.py | 4 - ...-07-08-23-22-08.gh-issue-132661.34ftJl.rst | 5 + Objects/templateobject.c | 91 +- Objects/unicodeobject.c | 15 +- Parser/action_helpers.c | 17 +- Parser/parser.c | 2502 +++++++++-------- Parser/pegen.h | 1 + Python/ast_unparse.c | 86 +- Python/codegen.c | 10 - 13 files changed, 1406 insertions(+), 1442 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 8b15cf29fa02e2..24017c0023c109 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -985,7 +985,10 @@ tstring[expr_ty] (memo): _PyPegen_template_str(p, a, (asdl_expr_seq*)b, c)) } string[expr_ty]: s[Token*]=STRING { _PyPegen_constant_from_string(p, s) } -strings[expr_ty] (memo): a[asdl_expr_seq*]=(fstring|string|tstring)+ { _PyPegen_concatenate_strings(p, a, EXTRA) } +strings[expr_ty] (memo): + | invalid_string_tstring_concat + | a[asdl_expr_seq*]=(fstring|string)+ { _PyPegen_concatenate_strings(p, a, EXTRA) } + | a[asdl_expr_seq*]=tstring+ { _PyPegen_concatenate_tstrings(p, a, EXTRA) } list[expr_ty]: | '[' a=[star_named_expressions] ']' { _PyAST_List(a, Load, EXTRA) } @@ -1546,6 +1549,12 @@ invalid_tstring_conversion_character: | '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: missing conversion character") } | '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("t-string: invalid conversion character") } +invalid_string_tstring_concat: + | a=(fstring|string)+ b[expr_ty]=tstring { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(PyPegen_last_item(a, expr_ty), b, "cannot mix t-string literals with string or bytes literals") } + | a=tstring+ b[expr_ty]=(fstring|string) { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(PyPegen_last_item(a, expr_ty), b, "cannot mix t-string literals with string or bytes literals") } + invalid_arithmetic: | sum ('+'|'-'|'*'|'/'|'%'|'//'|'@') a='not' b=inversion { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") } invalid_factor: diff --git a/Lib/_ast_unparse.py b/Lib/_ast_unparse.py index c25066eb107de1..16cf56f62cc1e5 100644 --- a/Lib/_ast_unparse.py +++ b/Lib/_ast_unparse.py @@ -626,35 +626,11 @@ def _write_ftstring(self, values, prefix): ) self._ftstring_helper(fstring_parts) - def _tstring_helper(self, node): - if not node.values: - self._write_ftstring([], "t") - return - last_idx = 0 - for i, value in enumerate(node.values): - # This can happen if we have an implicit concat of a t-string - # with an f-string - if isinstance(value, FormattedValue): - if i > last_idx: - # Write t-string until here - self._write_ftstring(node.values[last_idx:i], "t") - self.write(" ") - # Write f-string with the current formatted value - self._write_ftstring([node.values[i]], "f") - if i + 1 < len(node.values): - # Only add a space if there are more values after this - self.write(" ") - last_idx = i + 1 - - if last_idx < len(node.values): - # Write t-string from last_idx to end - self._write_ftstring(node.values[last_idx:], "t") - def visit_JoinedStr(self, node): self._write_ftstring(node.values, "f") def visit_TemplateStr(self, node): - self._tstring_helper(node) + self._write_ftstring(node.values, "t") def _write_ftstring_inner(self, node, is_format_spec=False): if isinstance(node, JoinedStr): diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 56e170e128b48c..269f3ff84f6ab1 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -999,13 +999,6 @@ def test_tstring(self): self.assertIsInstance(tree.body[0].value.values[0], ast.Constant) self.assertIsInstance(tree.body[0].value.values[1], ast.Interpolation) - # Test AST for implicit concat of t-string with f-string - tree = ast.parse('t"Hello {name}" f"{name}"') - self.assertIsInstance(tree.body[0].value, ast.TemplateStr) - self.assertIsInstance(tree.body[0].value.values[0], ast.Constant) - self.assertIsInstance(tree.body[0].value.values[1], ast.Interpolation) - self.assertIsInstance(tree.body[0].value.values[2], ast.FormattedValue) - class CopyTests(unittest.TestCase): """Test copying and pickling AST nodes.""" diff --git a/Lib/test/test_tstring.py b/Lib/test/test_tstring.py index aabae38556735b..74653c77c55de1 100644 --- a/Lib/test/test_tstring.py +++ b/Lib/test/test_tstring.py @@ -150,7 +150,6 @@ def test_raw_tstrings(self): t = tr"{path}\Documents" self.assertTStringEqual(t, ("", r"\Documents"), [(path, "path")]) - def test_template_concatenation(self): # Test template + template t1 = t"Hello, " @@ -161,9 +160,10 @@ def test_template_concatenation(self): # Test template + string t1 = t"Hello" - combined = t1 + ", world" - self.assertTStringEqual(combined, ("Hello, world",), ()) - self.assertEqual(fstring(combined), "Hello, world") + expected_msg = 'can only concatenate string.templatelib.Template ' \ + '\\(not "str"\\) to string.templatelib.Template' + with self.assertRaisesRegex(TypeError, expected_msg): + t1 + ", world" # Test template + template with interpolation name = "Python" @@ -174,9 +174,10 @@ def test_template_concatenation(self): self.assertEqual(fstring(combined), "Hello, Python") # Test string + template - t = "Hello, " + t"{name}" - self.assertTStringEqual(t, ("Hello, ", ""), [(name, "name")]) - self.assertEqual(fstring(t), "Hello, Python") + expected_msg = 'can only concatenate str ' \ + '\\(not "string.templatelib.Template"\\) to str' + with self.assertRaisesRegex(TypeError, expected_msg): + "Hello, " + t"{name}" def test_nested_templates(self): # Test a template inside another template expression @@ -241,52 +242,28 @@ def test_literal_concatenation(self): self.assertTStringEqual(t, ("Hello, ", ""), [(name, "name")]) self.assertEqual(fstring(t), "Hello, Python") - # Test concatenation with string literal - name = "Python" - t = t"Hello, {name}" "and welcome!" - self.assertTStringEqual( - t, ("Hello, ", "and welcome!"), [(name, "name")] - ) - self.assertEqual(fstring(t), "Hello, Pythonand welcome!") - - # Test concatenation with Unicode literal - name = "Python" - t = t"Hello, {name}" u"and welcome!" - self.assertTStringEqual( - t, ("Hello, ", "and welcome!"), [(name, "name")] - ) - self.assertEqual(fstring(t), "Hello, Pythonand welcome!") - - # Test concatenation with f-string literal - tab = '\t' - t = t"Tab: {tab}. " f"f-tab: {tab}." - self.assertTStringEqual(t, ("Tab: ", ". f-tab: \t."), [(tab, "tab")]) - self.assertEqual(fstring(t), "Tab: \t. f-tab: \t.") - - # Test concatenation with raw string literal - tab = '\t' - t = t"Tab: {tab}. " r"Raw tab: \t." - self.assertTStringEqual( - t, ("Tab: ", r". Raw tab: \t."), [(tab, "tab")] - ) - self.assertEqual(fstring(t), "Tab: \t. Raw tab: \\t.") - - # Test concatenation with raw f-string literal - tab = '\t' - t = t"Tab: {tab}. " rf"f-tab: {tab}. Raw tab: \t." - self.assertTStringEqual( - t, ("Tab: ", ". f-tab: \t. Raw tab: \\t."), [(tab, "tab")] - ) - self.assertEqual(fstring(t), "Tab: \t. f-tab: \t. Raw tab: \\t.") - + # Test disallowed mix of t-string and string/f-string (incl. bytes) what = 't' - expected_msg = 'cannot mix bytes and nonbytes literals' + expected_msg = 'cannot mix t-string literals with string or bytes literals' for case in ( + "t'{what}-string literal' 'str literal'", + "t'{what}-string literal' u'unicode literal'", + "t'{what}-string literal' f'f-string literal'", + "t'{what}-string literal' r'raw string literal'", + "t'{what}-string literal' rf'raw f-string literal'", "t'{what}-string literal' b'bytes literal'", "t'{what}-string literal' br'raw bytes literal'", + "'str literal' t'{what}-string literal'", + "u'unicode literal' t'{what}-string literal'", + "f'f-string literal' t'{what}-string literal'", + "r'raw string literal' t'{what}-string literal'", + "rf'raw f-string literal' t'{what}-string literal'", + "b'bytes literal' t'{what}-string literal'", + "br'raw bytes literal' t'{what}-string literal'", ): - with self.assertRaisesRegex(SyntaxError, expected_msg): - eval(case) + with self.subTest(case): + with self.assertRaisesRegex(SyntaxError, expected_msg): + eval(case) def test_triple_quoted(self): # Test triple-quoted t-strings diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index d4db5e60af7978..0d6b05bc660b76 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -206,10 +206,6 @@ def test_tstrings(self): self.check_ast_roundtrip("t'foo'") self.check_ast_roundtrip("t'foo {bar}'") self.check_ast_roundtrip("t'foo {bar!s:.2f}'") - self.check_ast_roundtrip("t'foo {bar}' f'{bar}'") - self.check_ast_roundtrip("f'{bar}' t'foo {bar}'") - self.check_ast_roundtrip("t'foo {bar}' fr'\\hello {bar}'") - self.check_ast_roundtrip("t'foo {bar}' u'bar'") def test_strings(self): self.check_ast_roundtrip("u'foo'") diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst new file mode 100644 index 00000000000000..5d59e024389c18 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst @@ -0,0 +1,5 @@ +Reflect recent :pep:`750` change. + +Disallow concatenation of ``string.templatelib.Template`` and :class:`str`. +Also, disallow implicit concatenation of t-string literals with string or +f-string literals. diff --git a/Objects/templateobject.c b/Objects/templateobject.c index 4293a311c440f7..ac38e4de435d5d 100644 --- a/Objects/templateobject.c +++ b/Objects/templateobject.c @@ -30,7 +30,8 @@ templateiter_next(PyObject *op) Py_SETREF(item, PyIter_Next(self->interpolationsiter)); self->from_strings = 1; } - } else { + } + else { item = PyIter_Next(self->interpolationsiter); self->from_strings = 1; } @@ -245,54 +246,6 @@ template_iter(PyObject *op) return (PyObject *)iter; } -static PyObject * -template_strings_append_str(PyObject *strings, PyObject *str) -{ - Py_ssize_t stringslen = PyTuple_GET_SIZE(strings); - PyObject *string = PyTuple_GET_ITEM(strings, stringslen - 1); - PyObject *concat = PyUnicode_Concat(string, str); - if (concat == NULL) { - return NULL; - } - - PyObject *newstrings = PyTuple_New(stringslen); - if (newstrings == NULL) { - Py_DECREF(concat); - return NULL; - } - - for (Py_ssize_t i = 0; i < stringslen - 1; i++) { - PyTuple_SET_ITEM(newstrings, i, Py_NewRef(PyTuple_GET_ITEM(strings, i))); - } - PyTuple_SET_ITEM(newstrings, stringslen - 1, concat); - - return newstrings; -} - -static PyObject * -template_strings_prepend_str(PyObject *strings, PyObject *str) -{ - Py_ssize_t stringslen = PyTuple_GET_SIZE(strings); - PyObject *string = PyTuple_GET_ITEM(strings, 0); - PyObject *concat = PyUnicode_Concat(str, string); - if (concat == NULL) { - return NULL; - } - - PyObject *newstrings = PyTuple_New(stringslen); - if (newstrings == NULL) { - Py_DECREF(concat); - return NULL; - } - - PyTuple_SET_ITEM(newstrings, 0, concat); - for (Py_ssize_t i = 1; i < stringslen; i++) { - PyTuple_SET_ITEM(newstrings, i, Py_NewRef(PyTuple_GET_ITEM(strings, i))); - } - - return newstrings; -} - static PyObject * template_strings_concat(PyObject *left, PyObject *right) { @@ -344,47 +297,17 @@ template_concat_templates(templateobject *self, templateobject *other) return newtemplate; } -static PyObject * -template_concat_template_str(templateobject *self, PyObject *other) -{ - PyObject *newstrings = template_strings_append_str(self->strings, other); - if (newstrings == NULL) { - return NULL; - } - - PyObject *newtemplate = _PyTemplate_Build(newstrings, self->interpolations); - Py_DECREF(newstrings); - return newtemplate; -} - -static PyObject * -template_concat_str_template(templateobject *self, PyObject *other) -{ - PyObject *newstrings = template_strings_prepend_str(self->strings, other); - if (newstrings == NULL) { - return NULL; - } - - PyObject *newtemplate = _PyTemplate_Build(newstrings, self->interpolations); - Py_DECREF(newstrings); - return newtemplate; -} - PyObject * _PyTemplate_Concat(PyObject *self, PyObject *other) { if (_PyTemplate_CheckExact(self) && _PyTemplate_CheckExact(other)) { return template_concat_templates((templateobject *) self, (templateobject *) other); } - else if ((_PyTemplate_CheckExact(self)) && PyUnicode_Check(other)) { - return template_concat_template_str((templateobject *) self, other); - } - else if (PyUnicode_Check(self) && (_PyTemplate_CheckExact(other))) { - return template_concat_str_template((templateobject *) other, self); - } - else { - Py_RETURN_NOTIMPLEMENTED; - } + + PyErr_Format(PyExc_TypeError, + "can only concatenate string.templatelib.Template (not \"%T\") to string.templatelib.Template", + other); + return NULL; } static PyObject * diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1d01dad9e33e29..c7f560adb99356 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -56,7 +56,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "pycore_pyhash.h" // _Py_HashSecret_t #include "pycore_pylifecycle.h" // _Py_SetFileSystemEncoding() #include "pycore_pystate.h" // _PyInterpreterState_GET() -#include "pycore_template.h" // _PyTemplate_Concat() #include "pycore_tuple.h" // _PyTuple_FromArray() #include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI #include "pycore_unicodeobject.h" // struct _Py_unicode_state @@ -11639,16 +11638,10 @@ PyUnicode_Concat(PyObject *left, PyObject *right) return NULL; if (!PyUnicode_Check(right)) { - if (_PyTemplate_CheckExact(right)) { - // str + tstring is implemented in the tstring type - return _PyTemplate_Concat(left, right); - } - else { - PyErr_Format(PyExc_TypeError, - "can only concatenate str (not \"%.200s\") to str", - Py_TYPE(right)->tp_name); - return NULL; - } + PyErr_Format(PyExc_TypeError, + "can only concatenate str (not \"%.200s\") to str", + Py_TYPE(right)->tp_name); + return NULL; } /* Shortcuts */ diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c index 0d362bf7a9111a..ebc94715b6f361 100644 --- a/Parser/action_helpers.c +++ b/Parser/action_helpers.c @@ -1834,8 +1834,8 @@ _build_concatenated_joined_str(Parser *p, asdl_expr_seq *strings, return _PyAST_JoinedStr(values, lineno, col_offset, end_lineno, end_col_offset, p->arena); } -static expr_ty -_build_concatenated_template_str(Parser *p, asdl_expr_seq *strings, +expr_ty +_PyPegen_concatenate_tstrings(Parser *p, asdl_expr_seq *strings, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { @@ -1853,7 +1853,6 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, Py_ssize_t len = asdl_seq_LEN(strings); assert(len > 0); - int t_string_found = 0; int f_string_found = 0; int unicode_string_found = 0; int bytes_found = 0; @@ -1873,7 +1872,8 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, f_string_found = 1; break; case TemplateStr_kind: - t_string_found = 1; + // python.gram handles this; we should never get here + assert(0); break; default: f_string_found = 1; @@ -1882,13 +1882,13 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, } // Cannot mix unicode and bytes - if ((unicode_string_found || f_string_found || t_string_found) && bytes_found) { + if ((unicode_string_found || f_string_found) && bytes_found) { RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); return NULL; } // If it's only bytes or only unicode string, do a simple concat - if (!f_string_found && !t_string_found) { + if (!f_string_found) { if (len == 1) { return asdl_seq_GET(strings, 0); } @@ -1902,11 +1902,6 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, } } - if (t_string_found) { - return _build_concatenated_template_str(p, strings, lineno, - col_offset, end_lineno, end_col_offset, arena); - } - return _build_concatenated_joined_str(p, strings, lineno, col_offset, end_lineno, end_col_offset, arena); } diff --git a/Parser/parser.c b/Parser/parser.c index 932ad0f594124a..08370f51af480f 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -348,185 +348,187 @@ static char *soft_keywords[] = { #define invalid_fstring_conversion_character_type 1261 #define invalid_tstring_replacement_field_type 1262 #define invalid_tstring_conversion_character_type 1263 -#define invalid_arithmetic_type 1264 -#define invalid_factor_type 1265 -#define invalid_type_params_type 1266 -#define _loop0_1_type 1267 -#define _loop1_2_type 1268 -#define _loop0_3_type 1269 -#define _gather_4_type 1270 -#define _tmp_5_type 1271 -#define _tmp_6_type 1272 -#define _tmp_7_type 1273 -#define _tmp_8_type 1274 -#define _tmp_9_type 1275 -#define _tmp_10_type 1276 -#define _tmp_11_type 1277 -#define _loop1_12_type 1278 -#define _tmp_13_type 1279 -#define _loop0_14_type 1280 -#define _gather_15_type 1281 -#define _tmp_16_type 1282 -#define _tmp_17_type 1283 -#define _loop0_18_type 1284 -#define _loop1_19_type 1285 -#define _loop0_20_type 1286 -#define _gather_21_type 1287 -#define _tmp_22_type 1288 -#define _loop0_23_type 1289 -#define _gather_24_type 1290 -#define _loop1_25_type 1291 -#define _tmp_26_type 1292 -#define _tmp_27_type 1293 -#define _loop0_28_type 1294 -#define _loop0_29_type 1295 -#define _loop1_30_type 1296 -#define _loop1_31_type 1297 -#define _loop0_32_type 1298 -#define _loop1_33_type 1299 -#define _loop0_34_type 1300 -#define _gather_35_type 1301 -#define _tmp_36_type 1302 -#define _loop1_37_type 1303 -#define _loop1_38_type 1304 -#define _loop1_39_type 1305 -#define _loop0_40_type 1306 -#define _gather_41_type 1307 -#define _tmp_42_type 1308 -#define _tmp_43_type 1309 -#define _tmp_44_type 1310 -#define _loop0_45_type 1311 -#define _gather_46_type 1312 -#define _loop0_47_type 1313 -#define _gather_48_type 1314 -#define _tmp_49_type 1315 -#define _loop0_50_type 1316 -#define _gather_51_type 1317 -#define _loop0_52_type 1318 -#define _gather_53_type 1319 -#define _loop0_54_type 1320 -#define _gather_55_type 1321 -#define _loop1_56_type 1322 -#define _loop1_57_type 1323 -#define _loop0_58_type 1324 -#define _gather_59_type 1325 -#define _loop1_60_type 1326 -#define _loop1_61_type 1327 -#define _loop1_62_type 1328 -#define _tmp_63_type 1329 -#define _loop0_64_type 1330 -#define _gather_65_type 1331 -#define _tmp_66_type 1332 -#define _tmp_67_type 1333 -#define _tmp_68_type 1334 -#define _tmp_69_type 1335 -#define _tmp_70_type 1336 -#define _loop0_71_type 1337 -#define _loop0_72_type 1338 -#define _loop1_73_type 1339 -#define _loop1_74_type 1340 -#define _loop0_75_type 1341 -#define _loop1_76_type 1342 -#define _loop0_77_type 1343 -#define _loop0_78_type 1344 -#define _loop0_79_type 1345 -#define _loop0_80_type 1346 -#define _loop1_81_type 1347 -#define _tmp_82_type 1348 -#define _loop0_83_type 1349 -#define _gather_84_type 1350 -#define _loop1_85_type 1351 -#define _loop0_86_type 1352 -#define _tmp_87_type 1353 -#define _loop0_88_type 1354 -#define _gather_89_type 1355 -#define _tmp_90_type 1356 -#define _loop0_91_type 1357 -#define _gather_92_type 1358 -#define _loop0_93_type 1359 -#define _gather_94_type 1360 -#define _loop0_95_type 1361 -#define _loop0_96_type 1362 -#define _gather_97_type 1363 -#define _loop1_98_type 1364 -#define _tmp_99_type 1365 -#define _loop0_100_type 1366 -#define _gather_101_type 1367 -#define _loop0_102_type 1368 -#define _gather_103_type 1369 -#define _tmp_104_type 1370 -#define _tmp_105_type 1371 -#define _loop0_106_type 1372 -#define _gather_107_type 1373 -#define _tmp_108_type 1374 -#define _tmp_109_type 1375 -#define _tmp_110_type 1376 -#define _tmp_111_type 1377 -#define _tmp_112_type 1378 -#define _loop1_113_type 1379 -#define _tmp_114_type 1380 -#define _tmp_115_type 1381 -#define _tmp_116_type 1382 -#define _tmp_117_type 1383 -#define _tmp_118_type 1384 -#define _loop0_119_type 1385 -#define _loop0_120_type 1386 -#define _tmp_121_type 1387 -#define _tmp_122_type 1388 -#define _tmp_123_type 1389 -#define _tmp_124_type 1390 -#define _tmp_125_type 1391 -#define _tmp_126_type 1392 -#define _tmp_127_type 1393 -#define _tmp_128_type 1394 -#define _tmp_129_type 1395 -#define _loop0_130_type 1396 -#define _gather_131_type 1397 -#define _tmp_132_type 1398 -#define _tmp_133_type 1399 -#define _tmp_134_type 1400 -#define _tmp_135_type 1401 -#define _loop0_136_type 1402 -#define _gather_137_type 1403 -#define _tmp_138_type 1404 -#define _loop0_139_type 1405 -#define _gather_140_type 1406 -#define _loop0_141_type 1407 -#define _gather_142_type 1408 -#define _tmp_143_type 1409 -#define _loop0_144_type 1410 -#define _tmp_145_type 1411 -#define _tmp_146_type 1412 -#define _tmp_147_type 1413 -#define _tmp_148_type 1414 -#define _tmp_149_type 1415 -#define _tmp_150_type 1416 -#define _tmp_151_type 1417 -#define _tmp_152_type 1418 -#define _tmp_153_type 1419 -#define _tmp_154_type 1420 -#define _tmp_155_type 1421 -#define _tmp_156_type 1422 -#define _tmp_157_type 1423 -#define _tmp_158_type 1424 -#define _tmp_159_type 1425 -#define _tmp_160_type 1426 -#define _tmp_161_type 1427 -#define _tmp_162_type 1428 -#define _tmp_163_type 1429 -#define _tmp_164_type 1430 -#define _tmp_165_type 1431 -#define _tmp_166_type 1432 -#define _tmp_167_type 1433 -#define _tmp_168_type 1434 -#define _tmp_169_type 1435 -#define _tmp_170_type 1436 -#define _loop0_171_type 1437 -#define _tmp_172_type 1438 -#define _tmp_173_type 1439 -#define _tmp_174_type 1440 -#define _tmp_175_type 1441 -#define _tmp_176_type 1442 +#define invalid_string_tstring_concat_type 1264 +#define invalid_arithmetic_type 1265 +#define invalid_factor_type 1266 +#define invalid_type_params_type 1267 +#define _loop0_1_type 1268 +#define _loop1_2_type 1269 +#define _loop0_3_type 1270 +#define _gather_4_type 1271 +#define _tmp_5_type 1272 +#define _tmp_6_type 1273 +#define _tmp_7_type 1274 +#define _tmp_8_type 1275 +#define _tmp_9_type 1276 +#define _tmp_10_type 1277 +#define _tmp_11_type 1278 +#define _loop1_12_type 1279 +#define _tmp_13_type 1280 +#define _loop0_14_type 1281 +#define _gather_15_type 1282 +#define _tmp_16_type 1283 +#define _tmp_17_type 1284 +#define _loop0_18_type 1285 +#define _loop1_19_type 1286 +#define _loop0_20_type 1287 +#define _gather_21_type 1288 +#define _tmp_22_type 1289 +#define _loop0_23_type 1290 +#define _gather_24_type 1291 +#define _loop1_25_type 1292 +#define _tmp_26_type 1293 +#define _tmp_27_type 1294 +#define _loop0_28_type 1295 +#define _loop0_29_type 1296 +#define _loop1_30_type 1297 +#define _loop1_31_type 1298 +#define _loop0_32_type 1299 +#define _loop1_33_type 1300 +#define _loop0_34_type 1301 +#define _gather_35_type 1302 +#define _tmp_36_type 1303 +#define _loop1_37_type 1304 +#define _loop1_38_type 1305 +#define _loop1_39_type 1306 +#define _loop0_40_type 1307 +#define _gather_41_type 1308 +#define _tmp_42_type 1309 +#define _tmp_43_type 1310 +#define _tmp_44_type 1311 +#define _loop0_45_type 1312 +#define _gather_46_type 1313 +#define _loop0_47_type 1314 +#define _gather_48_type 1315 +#define _tmp_49_type 1316 +#define _loop0_50_type 1317 +#define _gather_51_type 1318 +#define _loop0_52_type 1319 +#define _gather_53_type 1320 +#define _loop0_54_type 1321 +#define _gather_55_type 1322 +#define _loop1_56_type 1323 +#define _loop1_57_type 1324 +#define _loop0_58_type 1325 +#define _gather_59_type 1326 +#define _loop1_60_type 1327 +#define _loop1_61_type 1328 +#define _loop1_62_type 1329 +#define _tmp_63_type 1330 +#define _loop0_64_type 1331 +#define _gather_65_type 1332 +#define _tmp_66_type 1333 +#define _tmp_67_type 1334 +#define _tmp_68_type 1335 +#define _tmp_69_type 1336 +#define _tmp_70_type 1337 +#define _loop0_71_type 1338 +#define _loop0_72_type 1339 +#define _loop1_73_type 1340 +#define _loop1_74_type 1341 +#define _loop0_75_type 1342 +#define _loop1_76_type 1343 +#define _loop0_77_type 1344 +#define _loop0_78_type 1345 +#define _loop0_79_type 1346 +#define _loop0_80_type 1347 +#define _loop1_81_type 1348 +#define _loop1_82_type 1349 +#define _tmp_83_type 1350 +#define _loop0_84_type 1351 +#define _gather_85_type 1352 +#define _loop1_86_type 1353 +#define _loop0_87_type 1354 +#define _tmp_88_type 1355 +#define _loop0_89_type 1356 +#define _gather_90_type 1357 +#define _tmp_91_type 1358 +#define _loop0_92_type 1359 +#define _gather_93_type 1360 +#define _loop0_94_type 1361 +#define _gather_95_type 1362 +#define _loop0_96_type 1363 +#define _loop0_97_type 1364 +#define _gather_98_type 1365 +#define _loop1_99_type 1366 +#define _tmp_100_type 1367 +#define _loop0_101_type 1368 +#define _gather_102_type 1369 +#define _loop0_103_type 1370 +#define _gather_104_type 1371 +#define _tmp_105_type 1372 +#define _tmp_106_type 1373 +#define _loop0_107_type 1374 +#define _gather_108_type 1375 +#define _tmp_109_type 1376 +#define _tmp_110_type 1377 +#define _tmp_111_type 1378 +#define _tmp_112_type 1379 +#define _tmp_113_type 1380 +#define _loop1_114_type 1381 +#define _tmp_115_type 1382 +#define _tmp_116_type 1383 +#define _tmp_117_type 1384 +#define _tmp_118_type 1385 +#define _tmp_119_type 1386 +#define _loop0_120_type 1387 +#define _loop0_121_type 1388 +#define _tmp_122_type 1389 +#define _tmp_123_type 1390 +#define _tmp_124_type 1391 +#define _tmp_125_type 1392 +#define _tmp_126_type 1393 +#define _tmp_127_type 1394 +#define _tmp_128_type 1395 +#define _tmp_129_type 1396 +#define _tmp_130_type 1397 +#define _loop0_131_type 1398 +#define _gather_132_type 1399 +#define _tmp_133_type 1400 +#define _tmp_134_type 1401 +#define _tmp_135_type 1402 +#define _tmp_136_type 1403 +#define _loop0_137_type 1404 +#define _gather_138_type 1405 +#define _tmp_139_type 1406 +#define _loop0_140_type 1407 +#define _gather_141_type 1408 +#define _loop0_142_type 1409 +#define _gather_143_type 1410 +#define _tmp_144_type 1411 +#define _loop0_145_type 1412 +#define _tmp_146_type 1413 +#define _tmp_147_type 1414 +#define _tmp_148_type 1415 +#define _tmp_149_type 1416 +#define _tmp_150_type 1417 +#define _tmp_151_type 1418 +#define _tmp_152_type 1419 +#define _tmp_153_type 1420 +#define _tmp_154_type 1421 +#define _tmp_155_type 1422 +#define _tmp_156_type 1423 +#define _tmp_157_type 1424 +#define _tmp_158_type 1425 +#define _tmp_159_type 1426 +#define _tmp_160_type 1427 +#define _tmp_161_type 1428 +#define _tmp_162_type 1429 +#define _tmp_163_type 1430 +#define _tmp_164_type 1431 +#define _tmp_165_type 1432 +#define _tmp_166_type 1433 +#define _tmp_167_type 1434 +#define _tmp_168_type 1435 +#define _tmp_169_type 1436 +#define _tmp_170_type 1437 +#define _tmp_171_type 1438 +#define _loop0_172_type 1439 +#define _tmp_173_type 1440 +#define _tmp_174_type 1441 +#define _tmp_175_type 1442 +#define _tmp_176_type 1443 +#define _tmp_177_type 1444 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -792,6 +794,7 @@ static void *invalid_fstring_replacement_field_rule(Parser *p); static void *invalid_fstring_conversion_character_rule(Parser *p); static void *invalid_tstring_replacement_field_rule(Parser *p); static void *invalid_tstring_conversion_character_rule(Parser *p); +static void *invalid_string_tstring_concat_rule(Parser *p); static void *invalid_arithmetic_rule(Parser *p); static void *invalid_factor_rule(Parser *p); static void *invalid_type_params_rule(Parser *p); @@ -876,46 +879,46 @@ static asdl_seq *_loop0_78_rule(Parser *p); static asdl_seq *_loop0_79_rule(Parser *p); static asdl_seq *_loop0_80_rule(Parser *p); static asdl_seq *_loop1_81_rule(Parser *p); -static void *_tmp_82_rule(Parser *p); -static asdl_seq *_loop0_83_rule(Parser *p); -static asdl_seq *_gather_84_rule(Parser *p); -static asdl_seq *_loop1_85_rule(Parser *p); -static asdl_seq *_loop0_86_rule(Parser *p); -static void *_tmp_87_rule(Parser *p); -static asdl_seq *_loop0_88_rule(Parser *p); -static asdl_seq *_gather_89_rule(Parser *p); -static void *_tmp_90_rule(Parser *p); -static asdl_seq *_loop0_91_rule(Parser *p); -static asdl_seq *_gather_92_rule(Parser *p); -static asdl_seq *_loop0_93_rule(Parser *p); -static asdl_seq *_gather_94_rule(Parser *p); -static asdl_seq *_loop0_95_rule(Parser *p); +static asdl_seq *_loop1_82_rule(Parser *p); +static void *_tmp_83_rule(Parser *p); +static asdl_seq *_loop0_84_rule(Parser *p); +static asdl_seq *_gather_85_rule(Parser *p); +static asdl_seq *_loop1_86_rule(Parser *p); +static asdl_seq *_loop0_87_rule(Parser *p); +static void *_tmp_88_rule(Parser *p); +static asdl_seq *_loop0_89_rule(Parser *p); +static asdl_seq *_gather_90_rule(Parser *p); +static void *_tmp_91_rule(Parser *p); +static asdl_seq *_loop0_92_rule(Parser *p); +static asdl_seq *_gather_93_rule(Parser *p); +static asdl_seq *_loop0_94_rule(Parser *p); +static asdl_seq *_gather_95_rule(Parser *p); static asdl_seq *_loop0_96_rule(Parser *p); -static asdl_seq *_gather_97_rule(Parser *p); -static asdl_seq *_loop1_98_rule(Parser *p); -static void *_tmp_99_rule(Parser *p); -static asdl_seq *_loop0_100_rule(Parser *p); -static asdl_seq *_gather_101_rule(Parser *p); -static asdl_seq *_loop0_102_rule(Parser *p); -static asdl_seq *_gather_103_rule(Parser *p); -static void *_tmp_104_rule(Parser *p); +static asdl_seq *_loop0_97_rule(Parser *p); +static asdl_seq *_gather_98_rule(Parser *p); +static asdl_seq *_loop1_99_rule(Parser *p); +static void *_tmp_100_rule(Parser *p); +static asdl_seq *_loop0_101_rule(Parser *p); +static asdl_seq *_gather_102_rule(Parser *p); +static asdl_seq *_loop0_103_rule(Parser *p); +static asdl_seq *_gather_104_rule(Parser *p); static void *_tmp_105_rule(Parser *p); -static asdl_seq *_loop0_106_rule(Parser *p); -static asdl_seq *_gather_107_rule(Parser *p); -static void *_tmp_108_rule(Parser *p); +static void *_tmp_106_rule(Parser *p); +static asdl_seq *_loop0_107_rule(Parser *p); +static asdl_seq *_gather_108_rule(Parser *p); static void *_tmp_109_rule(Parser *p); static void *_tmp_110_rule(Parser *p); static void *_tmp_111_rule(Parser *p); static void *_tmp_112_rule(Parser *p); -static asdl_seq *_loop1_113_rule(Parser *p); -static void *_tmp_114_rule(Parser *p); +static void *_tmp_113_rule(Parser *p); +static asdl_seq *_loop1_114_rule(Parser *p); static void *_tmp_115_rule(Parser *p); static void *_tmp_116_rule(Parser *p); static void *_tmp_117_rule(Parser *p); static void *_tmp_118_rule(Parser *p); -static asdl_seq *_loop0_119_rule(Parser *p); +static void *_tmp_119_rule(Parser *p); static asdl_seq *_loop0_120_rule(Parser *p); -static void *_tmp_121_rule(Parser *p); +static asdl_seq *_loop0_121_rule(Parser *p); static void *_tmp_122_rule(Parser *p); static void *_tmp_123_rule(Parser *p); static void *_tmp_124_rule(Parser *p); @@ -924,22 +927,22 @@ static void *_tmp_126_rule(Parser *p); static void *_tmp_127_rule(Parser *p); static void *_tmp_128_rule(Parser *p); static void *_tmp_129_rule(Parser *p); -static asdl_seq *_loop0_130_rule(Parser *p); -static asdl_seq *_gather_131_rule(Parser *p); -static void *_tmp_132_rule(Parser *p); +static void *_tmp_130_rule(Parser *p); +static asdl_seq *_loop0_131_rule(Parser *p); +static asdl_seq *_gather_132_rule(Parser *p); static void *_tmp_133_rule(Parser *p); static void *_tmp_134_rule(Parser *p); static void *_tmp_135_rule(Parser *p); -static asdl_seq *_loop0_136_rule(Parser *p); -static asdl_seq *_gather_137_rule(Parser *p); -static void *_tmp_138_rule(Parser *p); -static asdl_seq *_loop0_139_rule(Parser *p); -static asdl_seq *_gather_140_rule(Parser *p); -static asdl_seq *_loop0_141_rule(Parser *p); -static asdl_seq *_gather_142_rule(Parser *p); -static void *_tmp_143_rule(Parser *p); -static asdl_seq *_loop0_144_rule(Parser *p); -static void *_tmp_145_rule(Parser *p); +static void *_tmp_136_rule(Parser *p); +static asdl_seq *_loop0_137_rule(Parser *p); +static asdl_seq *_gather_138_rule(Parser *p); +static void *_tmp_139_rule(Parser *p); +static asdl_seq *_loop0_140_rule(Parser *p); +static asdl_seq *_gather_141_rule(Parser *p); +static asdl_seq *_loop0_142_rule(Parser *p); +static asdl_seq *_gather_143_rule(Parser *p); +static void *_tmp_144_rule(Parser *p); +static asdl_seq *_loop0_145_rule(Parser *p); static void *_tmp_146_rule(Parser *p); static void *_tmp_147_rule(Parser *p); static void *_tmp_148_rule(Parser *p); @@ -965,12 +968,13 @@ static void *_tmp_167_rule(Parser *p); static void *_tmp_168_rule(Parser *p); static void *_tmp_169_rule(Parser *p); static void *_tmp_170_rule(Parser *p); -static asdl_seq *_loop0_171_rule(Parser *p); -static void *_tmp_172_rule(Parser *p); +static void *_tmp_171_rule(Parser *p); +static asdl_seq *_loop0_172_rule(Parser *p); static void *_tmp_173_rule(Parser *p); static void *_tmp_174_rule(Parser *p); static void *_tmp_175_rule(Parser *p); static void *_tmp_176_rule(Parser *p); +static void *_tmp_177_rule(Parser *p); // file: statements? $ @@ -17057,7 +17061,7 @@ string_rule(Parser *p) return _res; } -// strings: ((fstring | string | tstring))+ +// strings: invalid_string_tstring_concat | ((fstring | string))+ | tstring+ static expr_ty strings_rule(Parser *p) { @@ -17083,18 +17087,37 @@ strings_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // ((fstring | string | tstring))+ + if (p->call_invalid_rules) { // invalid_string_tstring_concat if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string | tstring))+")); + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_string_tstring_concat")); + void *invalid_string_tstring_concat_var; + if ( + (invalid_string_tstring_concat_var = invalid_string_tstring_concat_rule(p)) // invalid_string_tstring_concat + ) + { + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_string_tstring_concat")); + _res = invalid_string_tstring_concat_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_string_tstring_concat")); + } + { // ((fstring | string))+ + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string))+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_loop1_81_rule(p)) // ((fstring | string | tstring))+ + (a = (asdl_expr_seq*)_loop1_81_rule(p)) // ((fstring | string))+ ) { - D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string | tstring))+")); + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string))+")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { p->level--; @@ -17114,7 +17137,40 @@ strings_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((fstring | string | tstring))+")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((fstring | string))+")); + } + { // tstring+ + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring+")); + asdl_expr_seq* a; + if ( + (a = (asdl_expr_seq*)_loop1_82_rule(p)) // tstring+ + ) + { + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tstring+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_concatenate_tstrings ( p , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring+")); } _res = NULL; done: @@ -17224,7 +17280,7 @@ tuple_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_82_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?] + (a = _tmp_83_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?] && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -17439,7 +17495,7 @@ double_starred_kvpairs_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_84_rule(p)) // ','.double_starred_kvpair+ + (a = _gather_85_rule(p)) // ','.double_starred_kvpair+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17598,7 +17654,7 @@ for_if_clauses_rule(Parser *p) D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); asdl_comprehension_seq* a; if ( - (a = (asdl_comprehension_seq*)_loop1_85_rule(p)) // for_if_clause+ + (a = (asdl_comprehension_seq*)_loop1_86_rule(p)) // for_if_clause+ ) { D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); @@ -17663,7 +17719,7 @@ for_if_clause_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_86_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_87_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async' 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -17706,7 +17762,7 @@ for_if_clause_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_86_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_87_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -17985,7 +18041,7 @@ genexp_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_87_rule(p)) // assignment_expression | expression !':=' + (a = _tmp_88_rule(p)) // assignment_expression | expression !':=' && (b = for_if_clauses_rule(p)) // for_if_clauses && @@ -18234,9 +18290,9 @@ args_rule(Parser *p) asdl_expr_seq* a; void *b; if ( - (a = (asdl_expr_seq*)_gather_89_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ + (a = (asdl_expr_seq*)_gather_90_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ && - (b = _tmp_90_rule(p), !p->error_indicator) // [',' kwargs] + (b = _tmp_91_rule(p), !p->error_indicator) // [',' kwargs] ) { D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ [',' kwargs]")); @@ -18326,11 +18382,11 @@ kwargs_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _gather_92_rule(p)) // ','.kwarg_or_starred+ + (a = _gather_93_rule(p)) // ','.kwarg_or_starred+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _gather_94_rule(p)) // ','.kwarg_or_double_starred+ + (b = _gather_95_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); @@ -18352,13 +18408,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - asdl_seq * _gather_92_var; + asdl_seq * _gather_93_var; if ( - (_gather_92_var = _gather_92_rule(p)) // ','.kwarg_or_starred+ + (_gather_93_var = _gather_93_rule(p)) // ','.kwarg_or_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - _res = _gather_92_var; + _res = _gather_93_var; goto done; } p->mark = _mark; @@ -18371,13 +18427,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - asdl_seq * _gather_94_var; + asdl_seq * _gather_95_var; if ( - (_gather_94_var = _gather_94_rule(p)) // ','.kwarg_or_double_starred+ + (_gather_95_var = _gather_95_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - _res = _gather_94_var; + _res = _gather_95_var; goto done; } p->mark = _mark; @@ -18788,7 +18844,7 @@ star_targets_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop0_95_rule(p)) // ((',' star_target))* + (b = _loop0_96_rule(p)) // ((',' star_target))* && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -18844,7 +18900,7 @@ star_targets_list_seq_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_97_rule(p)) // ','.star_target+ + (a = (asdl_expr_seq*)_gather_98_rule(p)) // ','.star_target+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -18894,7 +18950,7 @@ star_targets_tuple_seq_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop1_98_rule(p)) // ((',' star_target))+ + (b = _loop1_99_rule(p)) // ((',' star_target))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -18982,7 +19038,7 @@ star_target_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (a = _tmp_99_rule(p)) // !'*' star_target + (a = _tmp_100_rule(p)) // !'*' star_target ) { D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); @@ -19905,7 +19961,7 @@ del_targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_101_rule(p)) // ','.del_target+ + (a = (asdl_expr_seq*)_gather_102_rule(p)) // ','.del_target+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -20263,7 +20319,7 @@ type_expressions_rule(Parser *p) expr_ty b; expr_ty c; if ( - (a = _gather_103_rule(p)) // ','.expression+ + (a = _gather_104_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -20302,7 +20358,7 @@ type_expressions_rule(Parser *p) asdl_seq * a; expr_ty b; if ( - (a = _gather_103_rule(p)) // ','.expression+ + (a = _gather_104_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -20335,7 +20391,7 @@ type_expressions_rule(Parser *p) asdl_seq * a; expr_ty b; if ( - (a = _gather_103_rule(p)) // ','.expression+ + (a = _gather_104_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -20455,7 +20511,7 @@ type_expressions_rule(Parser *p) D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_103_rule(p)) // ','.expression+ + (a = (asdl_expr_seq*)_gather_104_rule(p)) // ','.expression+ ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+")); @@ -20506,7 +20562,7 @@ func_type_comment_rule(Parser *p) && (t = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' && - _PyPegen_lookahead(1, _tmp_104_rule, p) + _PyPegen_lookahead(1, _tmp_105_rule, p) ) { D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); @@ -20592,15 +20648,15 @@ invalid_arguments_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) ',' ','.(starred_expression !'=')+")); - asdl_seq * _gather_107_var; - void *_tmp_105_var; + asdl_seq * _gather_108_var; + void *_tmp_106_var; Token * a; if ( - (_tmp_105_var = _tmp_105_rule(p)) // (','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs + (_tmp_106_var = _tmp_106_rule(p)) // (','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs && (a = _PyPegen_expect_token(p, 12)) // token=',' && - (_gather_107_var = _gather_107_rule(p)) // ','.(starred_expression !'=')+ + (_gather_108_var = _gather_108_rule(p)) // ','.(starred_expression !'=')+ ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) ',' ','.(starred_expression !'=')+")); @@ -20634,7 +20690,7 @@ invalid_arguments_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_opt_var = _tmp_108_rule(p), !p->error_indicator) // [args | expression for_if_clauses] + (_opt_var = _tmp_109_rule(p), !p->error_indicator) // [args | expression for_if_clauses] ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); @@ -20694,13 +20750,13 @@ invalid_arguments_rule(Parser *p) expr_ty a; Token * b; if ( - (_opt_var = _tmp_109_rule(p), !p->error_indicator) // [(args ',')] + (_opt_var = _tmp_110_rule(p), !p->error_indicator) // [(args ',')] && (a = _PyPegen_name_token(p)) // NAME && (b = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_110_rule, p) + _PyPegen_lookahead(1, _tmp_111_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "[(args ',')] NAME '=' &(',' | ')')")); @@ -20838,7 +20894,7 @@ invalid_kwarg_rule(Parser *p) Token* a; Token * b; if ( - (a = (Token*)_tmp_111_rule(p)) // 'True' | 'False' | 'None' + (a = (Token*)_tmp_112_rule(p)) // 'True' | 'False' | 'None' && (b = _PyPegen_expect_token(p, 22)) // token='=' ) @@ -20898,7 +20954,7 @@ invalid_kwarg_rule(Parser *p) expr_ty a; Token * b; if ( - _PyPegen_lookahead(0, _tmp_112_rule, p) + _PyPegen_lookahead(0, _tmp_113_rule, p) && (a = expression_rule(p)) // expression && @@ -21246,7 +21302,7 @@ invalid_expression_rule(Parser *p) if ( (string_var = _PyPegen_string_token(p)) // STRING && - (a = _loop1_113_rule(p)) // ((!STRING expression_without_invalid))+ + (a = _loop1_114_rule(p)) // ((!STRING expression_without_invalid))+ && (string_var_1 = _PyPegen_string_token(p)) // STRING ) @@ -21273,7 +21329,7 @@ invalid_expression_rule(Parser *p) expr_ty a; expr_ty b; if ( - _PyPegen_lookahead(0, _tmp_114_rule, p) + _PyPegen_lookahead(0, _tmp_115_rule, p) && (a = disjunction_rule(p)) // disjunction && @@ -21309,7 +21365,7 @@ invalid_expression_rule(Parser *p) && (b = disjunction_rule(p)) // disjunction && - _PyPegen_lookahead(0, _tmp_115_rule, p) + _PyPegen_lookahead(0, _tmp_116_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')")); @@ -21372,7 +21428,7 @@ invalid_expression_rule(Parser *p) expr_ty b; stmt_ty c; if ( - (a = (stmt_ty)_tmp_116_rule(p)) // pass_stmt | break_stmt | continue_stmt + (a = (stmt_ty)_tmp_117_rule(p)) // pass_stmt | break_stmt | continue_stmt && (_keyword = _PyPegen_expect_token(p, 682)) // token='if' && @@ -21534,7 +21590,7 @@ invalid_named_expression_rule(Parser *p) && (b = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_117_rule, p) + _PyPegen_lookahead(0, _tmp_118_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' bitwise_or !('=' | ':=')")); @@ -21560,7 +21616,7 @@ invalid_named_expression_rule(Parser *p) Token * b; expr_ty bitwise_or_var; if ( - _PyPegen_lookahead(0, _tmp_118_rule, p) + _PyPegen_lookahead(0, _tmp_119_rule, p) && (a = bitwise_or_rule(p)) // bitwise_or && @@ -21568,7 +21624,7 @@ invalid_named_expression_rule(Parser *p) && (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_117_rule, p) + _PyPegen_lookahead(0, _tmp_118_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!(list | tuple | genexp | 'True' | 'None' | 'False') bitwise_or '=' bitwise_or !('=' | ':=')")); @@ -21648,7 +21704,7 @@ invalid_assignment_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_119_var; + asdl_seq * _loop0_120_var; expr_ty a; expr_ty expression_var; if ( @@ -21656,7 +21712,7 @@ invalid_assignment_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_loop0_119_var = _loop0_119_rule(p)) // star_named_expressions* + (_loop0_120_var = _loop0_120_rule(p)) // star_named_expressions* && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -21713,10 +21769,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); Token * _literal; - asdl_seq * _loop0_120_var; + asdl_seq * _loop0_121_var; expr_ty a; if ( - (_loop0_120_var = _loop0_120_rule(p)) // ((star_targets '='))* + (_loop0_121_var = _loop0_121_rule(p)) // ((star_targets '='))* && (a = star_expressions_rule(p)) // star_expressions && @@ -21743,10 +21799,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); Token * _literal; - asdl_seq * _loop0_120_var; + asdl_seq * _loop0_121_var; expr_ty a; if ( - (_loop0_120_var = _loop0_120_rule(p)) // ((star_targets '='))* + (_loop0_121_var = _loop0_121_rule(p)) // ((star_targets '='))* && (a = yield_expr_rule(p)) // yield_expr && @@ -22002,11 +22058,11 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); - void *_tmp_121_var; + void *_tmp_122_var; expr_ty a; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_121_var = _tmp_121_rule(p)) // '[' | '(' | '{' + (_tmp_122_var = _tmp_122_rule(p)) // '[' | '(' | '{' && (a = starred_expression_rule(p)) // starred_expression && @@ -22033,12 +22089,12 @@ invalid_comprehension_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions for_if_clauses")); Token * _literal; - void *_tmp_122_var; + void *_tmp_123_var; expr_ty a; asdl_expr_seq* b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_122_var = _tmp_122_rule(p)) // '[' | '{' + (_tmp_123_var = _tmp_123_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -22068,12 +22124,12 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' for_if_clauses")); - void *_tmp_122_var; + void *_tmp_123_var; expr_ty a; Token * b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_122_var = _tmp_122_rule(p)) // '[' | '{' + (_tmp_123_var = _tmp_123_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -22209,10 +22265,10 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slash_no_default | slash_with_default) param_maybe_default* '/'")); asdl_seq * _loop0_32_var; - void *_tmp_123_var; + void *_tmp_124_var; Token * a; if ( - (_tmp_123_var = _tmp_123_rule(p)) // slash_no_default | slash_with_default + (_tmp_124_var = _tmp_124_rule(p)) // slash_no_default | slash_with_default && (_loop0_32_var = _loop0_32_rule(p)) // param_maybe_default* && @@ -22314,16 +22370,16 @@ invalid_parameters_rule(Parser *p) asdl_seq * _loop0_32_var_1; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_124_var; + void *_tmp_125_var; Token * a; if ( - (_opt_var = _tmp_123_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] + (_opt_var = _tmp_124_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] && (_loop0_32_var = _loop0_32_rule(p)) // param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_124_var = _tmp_124_rule(p)) // ',' | param_no_default + (_tmp_125_var = _tmp_125_rule(p)) // ',' | param_no_default && (_loop0_32_var_1 = _loop0_32_rule(p)) // param_maybe_default* && @@ -22402,7 +22458,7 @@ invalid_default_rule(Parser *p) if ( (a = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_125_rule, p) + _PyPegen_lookahead(1, _tmp_126_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' &(')' | ',')")); @@ -22447,12 +22503,12 @@ invalid_star_etc_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); - void *_tmp_126_var; + void *_tmp_127_var; Token * a; if ( (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_126_var = _tmp_126_rule(p)) // ')' | ',' (')' | '**') + (_tmp_127_var = _tmp_127_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -22536,19 +22592,19 @@ invalid_star_etc_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); Token * _literal; asdl_seq * _loop0_32_var; - void *_tmp_127_var; - void *_tmp_127_var_1; + void *_tmp_128_var; + void *_tmp_128_var_1; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_127_var = _tmp_127_rule(p)) // param_no_default | ',' + (_tmp_128_var = _tmp_128_rule(p)) // param_no_default | ',' && (_loop0_32_var = _loop0_32_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_127_var_1 = _tmp_127_rule(p)) // param_no_default | ',' + (_tmp_128_var_1 = _tmp_128_rule(p)) // param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); @@ -22663,7 +22719,7 @@ invalid_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_128_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_129_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param ',' ('*' | '**' | '/')")); @@ -22800,10 +22856,10 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* '/'")); asdl_seq * _loop0_75_var; - void *_tmp_129_var; + void *_tmp_130_var; Token * a; if ( - (_tmp_129_var = _tmp_129_rule(p)) // lambda_slash_no_default | lambda_slash_with_default + (_tmp_130_var = _tmp_130_rule(p)) // lambda_slash_no_default | lambda_slash_with_default && (_loop0_75_var = _loop0_75_rule(p)) // lambda_param_maybe_default* && @@ -22863,7 +22919,7 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* '(' ','.lambda_param+ ','? ')'")); - asdl_seq * _gather_131_var; + asdl_seq * _gather_132_var; asdl_seq * _loop0_71_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -22874,7 +22930,7 @@ invalid_lambda_parameters_rule(Parser *p) && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_131_var = _gather_131_rule(p)) // ','.lambda_param+ + (_gather_132_var = _gather_132_rule(p)) // ','.lambda_param+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -22905,16 +22961,16 @@ invalid_lambda_parameters_rule(Parser *p) asdl_seq * _loop0_75_var_1; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_132_var; + void *_tmp_133_var; Token * a; if ( - (_opt_var = _tmp_129_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] + (_opt_var = _tmp_130_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] && (_loop0_75_var = _loop0_75_rule(p)) // lambda_param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_132_var = _tmp_132_rule(p)) // ',' | lambda_param_no_default + (_tmp_133_var = _tmp_133_rule(p)) // ',' | lambda_param_no_default && (_loop0_75_var_1 = _loop0_75_rule(p)) // lambda_param_maybe_default* && @@ -23057,11 +23113,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_133_var; + void *_tmp_134_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_133_var = _tmp_133_rule(p)) // ':' | ',' (':' | '**') + (_tmp_134_var = _tmp_134_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -23115,19 +23171,19 @@ invalid_lambda_star_etc_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); Token * _literal; asdl_seq * _loop0_75_var; - void *_tmp_134_var; - void *_tmp_134_var_1; + void *_tmp_135_var; + void *_tmp_135_var_1; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_134_var = _tmp_134_rule(p)) // lambda_param_no_default | ',' + (_tmp_135_var = _tmp_135_rule(p)) // lambda_param_no_default | ',' && (_loop0_75_var = _loop0_75_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_134_var_1 = _tmp_134_rule(p)) // lambda_param_no_default | ',' + (_tmp_135_var_1 = _tmp_135_rule(p)) // lambda_param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); @@ -23245,7 +23301,7 @@ invalid_lambda_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_128_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_129_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param ',' ('*' | '**' | '/')")); @@ -23395,13 +23451,13 @@ invalid_for_if_clause_rule(Parser *p) Token * _keyword; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_135_var; + void *_tmp_136_var; if ( (_opt_var = _PyPegen_expect_token(p, 698), !p->error_indicator) // 'async'? && (_keyword = _PyPegen_expect_token(p, 694)) // token='for' && - (_tmp_135_var = _tmp_135_rule(p)) // bitwise_or ((',' bitwise_or))* ','? + (_tmp_136_var = _tmp_136_rule(p)) // bitwise_or ((',' bitwise_or))* ','? && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 695) // token='in' ) @@ -23576,14 +23632,14 @@ invalid_import_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_import[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' ','.dotted_name+ 'from' dotted_name")); - asdl_seq * _gather_137_var; + asdl_seq * _gather_138_var; Token * _keyword; Token * a; expr_ty dotted_name_var; if ( (a = _PyPegen_expect_token(p, 634)) // token='import' && - (_gather_137_var = _gather_137_rule(p)) // ','.dotted_name+ + (_gather_138_var = _gather_138_rule(p)) // ','.dotted_name+ && (_keyword = _PyPegen_expect_token(p, 633)) // token='from' && @@ -23663,7 +23719,7 @@ invalid_dotted_as_name_rule(Parser *p) && (_keyword = _PyPegen_expect_token(p, 680)) // token='as' && - _PyPegen_lookahead(0, _tmp_138_rule, p) + _PyPegen_lookahead(0, _tmp_139_rule, p) && (a = expression_rule(p)) // expression ) @@ -23714,7 +23770,7 @@ invalid_import_from_as_name_rule(Parser *p) && (_keyword = _PyPegen_expect_token(p, 680)) // token='as' && - _PyPegen_lookahead(0, _tmp_138_rule, p) + _PyPegen_lookahead(0, _tmp_139_rule, p) && (a = expression_rule(p)) // expression ) @@ -23832,7 +23888,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' ','.(expression ['as' star_target])+ NEWLINE")); - asdl_seq * _gather_140_var; + asdl_seq * _gather_141_var; Token * _keyword; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -23842,7 +23898,7 @@ invalid_with_stmt_rule(Parser *p) && (_keyword = _PyPegen_expect_token(p, 647)) // token='with' && - (_gather_140_var = _gather_140_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_141_var = _gather_141_rule(p)) // ','.(expression ['as' star_target])+ && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -23866,7 +23922,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE")); - asdl_seq * _gather_142_var; + asdl_seq * _gather_143_var; Token * _keyword; Token * _literal; Token * _literal_1; @@ -23882,7 +23938,7 @@ invalid_with_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_142_var = _gather_142_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_143_var = _gather_143_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -23931,7 +23987,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT")); - asdl_seq * _gather_140_var; + asdl_seq * _gather_141_var; Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -23942,7 +23998,7 @@ invalid_with_stmt_indent_rule(Parser *p) && (a = _PyPegen_expect_token(p, 647)) // token='with' && - (_gather_140_var = _gather_140_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_141_var = _gather_141_rule(p)) // ','.(expression ['as' star_target])+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23970,7 +24026,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT")); - asdl_seq * _gather_142_var; + asdl_seq * _gather_143_var; Token * _literal; Token * _literal_1; Token * _literal_2; @@ -23987,7 +24043,7 @@ invalid_with_stmt_indent_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_142_var = _gather_142_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_143_var = _gather_143_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -24084,7 +24140,7 @@ invalid_try_stmt_rule(Parser *p) && (block_var = block_rule(p)) // block && - _PyPegen_lookahead(0, _tmp_143_rule, p) + _PyPegen_lookahead(0, _tmp_144_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block !('except' | 'finally')")); @@ -24109,7 +24165,7 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_144_var; + asdl_seq * _loop0_145_var; asdl_seq * _loop1_37_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -24121,7 +24177,7 @@ invalid_try_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_144_var = _loop0_144_rule(p)) // block* + (_loop0_145_var = _loop0_145_rule(p)) // block* && (_loop1_37_var = _loop1_37_rule(p)) // except_block+ && @@ -24158,7 +24214,7 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_144_var; + asdl_seq * _loop0_145_var; asdl_seq * _loop1_38_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -24168,13 +24224,13 @@ invalid_try_stmt_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_144_var = _loop0_144_rule(p)) // block* + (_loop0_145_var = _loop0_145_rule(p)) // block* && (_loop1_38_var = _loop1_38_rule(p)) // except_star_block+ && (a = _PyPegen_expect_token(p, 677)) // token='except' && - (_opt_var = _tmp_145_rule(p), !p->error_indicator) // [expression ['as' NAME]] + (_opt_var = _tmp_146_rule(p), !p->error_indicator) // [expression ['as' NAME]] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -24469,14 +24525,14 @@ invalid_except_star_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_except_star_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); Token * _literal; - void *_tmp_146_var; + void *_tmp_147_var; Token * a; if ( (a = _PyPegen_expect_token(p, 677)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_146_var = _tmp_146_rule(p)) // NEWLINE | ':' + (_tmp_147_var = _tmp_147_rule(p)) // NEWLINE | ':' ) { D(fprintf(stderr, "%*c+ invalid_except_star_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); @@ -25079,7 +25135,7 @@ invalid_class_argument_pattern_rule(Parser *p) asdl_pattern_seq* a; asdl_seq* keyword_patterns_var; if ( - (_opt_var = _tmp_147_rule(p), !p->error_indicator) // [positional_patterns ','] + (_opt_var = _tmp_148_rule(p), !p->error_indicator) // [positional_patterns ','] && (keyword_patterns_var = keyword_patterns_rule(p)) // keyword_patterns && @@ -25811,11 +25867,11 @@ invalid_double_starred_kvpairs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_double_starred_kvpairs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - asdl_seq * _gather_84_var; + asdl_seq * _gather_85_var; Token * _literal; void *invalid_kvpair_var; if ( - (_gather_84_var = _gather_84_rule(p)) // ','.double_starred_kvpair+ + (_gather_85_var = _gather_85_rule(p)) // ','.double_starred_kvpair+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -25823,7 +25879,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - _res = _PyPegen_dummy_name(p, _gather_84_var, _literal, invalid_kvpair_var); + _res = _PyPegen_dummy_name(p, _gather_85_var, _literal, invalid_kvpair_var); goto done; } p->mark = _mark; @@ -25876,7 +25932,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_148_rule, p) + _PyPegen_lookahead(1, _tmp_149_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -25986,7 +26042,7 @@ invalid_kvpair_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_148_rule, p) + _PyPegen_lookahead(1, _tmp_149_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -26274,7 +26330,7 @@ invalid_fstring_replacement_field_rule(Parser *p) && (annotated_rhs_var = annotated_rhs_rule(p)) // annotated_rhs && - _PyPegen_lookahead(0, _tmp_149_rule, p) + _PyPegen_lookahead(0, _tmp_150_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs !('=' | '!' | ':' | '}')")); @@ -26306,7 +26362,7 @@ invalid_fstring_replacement_field_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(0, _tmp_150_rule, p) + _PyPegen_lookahead(0, _tmp_151_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '=' !('!' | ':' | '}')")); @@ -26370,9 +26426,9 @@ invalid_fstring_replacement_field_rule(Parser *p) && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_151_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_152_rule(p), !p->error_indicator) // ['!' NAME] && - _PyPegen_lookahead(0, _tmp_152_rule, p) + _PyPegen_lookahead(0, _tmp_153_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '='? ['!' NAME] !(':' | '}')")); @@ -26409,7 +26465,7 @@ invalid_fstring_replacement_field_rule(Parser *p) && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_151_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_152_rule(p), !p->error_indicator) // ['!' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -26450,7 +26506,7 @@ invalid_fstring_replacement_field_rule(Parser *p) && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_151_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_152_rule(p), !p->error_indicator) // ['!' NAME] && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' ) @@ -26497,7 +26553,7 @@ invalid_fstring_conversion_character_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' && - _PyPegen_lookahead(1, _tmp_152_rule, p) + _PyPegen_lookahead(1, _tmp_153_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_fstring_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); @@ -26716,7 +26772,7 @@ invalid_tstring_replacement_field_rule(Parser *p) && (annotated_rhs_var = annotated_rhs_rule(p)) // annotated_rhs && - _PyPegen_lookahead(0, _tmp_149_rule, p) + _PyPegen_lookahead(0, _tmp_150_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_tstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs !('=' | '!' | ':' | '}')")); @@ -26748,7 +26804,7 @@ invalid_tstring_replacement_field_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(0, _tmp_150_rule, p) + _PyPegen_lookahead(0, _tmp_151_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_tstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '=' !('!' | ':' | '}')")); @@ -26812,9 +26868,9 @@ invalid_tstring_replacement_field_rule(Parser *p) && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_151_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_152_rule(p), !p->error_indicator) // ['!' NAME] && - _PyPegen_lookahead(0, _tmp_152_rule, p) + _PyPegen_lookahead(0, _tmp_153_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_tstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '='? ['!' NAME] !(':' | '}')")); @@ -26851,7 +26907,7 @@ invalid_tstring_replacement_field_rule(Parser *p) && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_151_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_152_rule(p), !p->error_indicator) // ['!' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -26892,7 +26948,7 @@ invalid_tstring_replacement_field_rule(Parser *p) && (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? && - (_opt_var_1 = _tmp_151_rule(p), !p->error_indicator) // ['!' NAME] + (_opt_var_1 = _tmp_152_rule(p), !p->error_indicator) // ['!' NAME] && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' ) @@ -26939,7 +26995,7 @@ invalid_tstring_conversion_character_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' && - _PyPegen_lookahead(1, _tmp_152_rule, p) + _PyPegen_lookahead(1, _tmp_153_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_tstring_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); @@ -26987,6 +27043,81 @@ invalid_tstring_conversion_character_rule(Parser *p) return _res; } +// invalid_string_tstring_concat: +// | ((fstring | string))+ tstring +// | tstring+ (fstring | string) +static void * +invalid_string_tstring_concat_rule(Parser *p) +{ + if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ((fstring | string))+ tstring + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_string_tstring_concat[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string))+ tstring")); + asdl_seq * a; + expr_ty b; + if ( + (a = _loop1_81_rule(p)) // ((fstring | string))+ + && + (b = (expr_ty)tstring_rule(p)) // tstring + ) + { + D(fprintf(stderr, "%*c+ invalid_string_tstring_concat[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string))+ tstring")); + _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( PyPegen_last_item ( a , expr_ty ) , b , "cannot mix t-string literals with string or bytes literals" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_string_tstring_concat[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((fstring | string))+ tstring")); + } + { // tstring+ (fstring | string) + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_string_tstring_concat[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring+ (fstring | string)")); + asdl_seq * a; + expr_ty b; + if ( + (a = _loop1_82_rule(p)) // tstring+ + && + (b = (expr_ty)_tmp_154_rule(p)) // fstring | string + ) + { + D(fprintf(stderr, "%*c+ invalid_string_tstring_concat[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tstring+ (fstring | string)")); + _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( PyPegen_last_item ( a , expr_ty ) , b , "cannot mix t-string literals with string or bytes literals" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_string_tstring_concat[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring+ (fstring | string)")); + } + _res = NULL; + done: + p->level--; + return _res; +} + // invalid_arithmetic: sum ('+' | '-' | '*' | '/' | '%' | '//' | '@') 'not' inversion static void * invalid_arithmetic_rule(Parser *p) @@ -27006,14 +27137,14 @@ invalid_arithmetic_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_arithmetic[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum ('+' | '-' | '*' | '/' | '%' | '//' | '@') 'not' inversion")); - void *_tmp_153_var; + void *_tmp_155_var; Token * a; expr_ty b; expr_ty sum_var; if ( (sum_var = sum_rule(p)) // sum && - (_tmp_153_var = _tmp_153_rule(p)) // '+' | '-' | '*' | '/' | '%' | '//' | '@' + (_tmp_155_var = _tmp_155_rule(p)) // '+' | '-' | '*' | '/' | '%' | '//' | '@' && (a = _PyPegen_expect_token(p, 703)) // token='not' && @@ -27058,11 +27189,11 @@ invalid_factor_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('+' | '-' | '~') 'not' factor")); - void *_tmp_154_var; + void *_tmp_156_var; Token * a; expr_ty b; if ( - (_tmp_154_var = _tmp_154_rule(p)) // '+' | '-' | '~' + (_tmp_156_var = _tmp_156_rule(p)) // '+' | '-' | '~' && (a = _PyPegen_expect_token(p, 703)) // token='not' && @@ -27836,12 +27967,12 @@ _loop1_12_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_155_var; + void *_tmp_157_var; while ( - (_tmp_155_var = _tmp_155_rule(p)) // star_targets '=' + (_tmp_157_var = _tmp_157_rule(p)) // star_targets '=' ) { - _res = _tmp_155_var; + _res = _tmp_157_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28174,12 +28305,12 @@ _loop0_18_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_156_var; + void *_tmp_158_var; while ( - (_tmp_156_var = _tmp_156_rule(p)) // '.' | '...' + (_tmp_158_var = _tmp_158_rule(p)) // '.' | '...' ) { - _res = _tmp_156_var; + _res = _tmp_158_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28241,12 +28372,12 @@ _loop1_19_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_156_var; + void *_tmp_158_var; while ( - (_tmp_156_var = _tmp_156_rule(p)) // '.' | '...' + (_tmp_158_var = _tmp_158_rule(p)) // '.' | '...' ) { - _res = _tmp_156_var; + _res = _tmp_158_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28593,12 +28724,12 @@ _loop1_25_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_157_var; + void *_tmp_159_var; while ( - (_tmp_157_var = _tmp_157_rule(p)) // '@' named_expression NEWLINE + (_tmp_159_var = _tmp_159_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_157_var; + _res = _tmp_159_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30626,12 +30757,12 @@ _loop1_57_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_158_var; + void *_tmp_160_var; while ( - (_tmp_158_var = _tmp_158_rule(p)) // ',' star_expression + (_tmp_160_var = _tmp_160_rule(p)) // ',' star_expression ) { - _res = _tmp_158_var; + _res = _tmp_160_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30815,12 +30946,12 @@ _loop1_60_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_159_var; + void *_tmp_161_var; while ( - (_tmp_159_var = _tmp_159_rule(p)) // 'or' conjunction + (_tmp_161_var = _tmp_161_rule(p)) // 'or' conjunction ) { - _res = _tmp_159_var; + _res = _tmp_161_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30887,12 +31018,12 @@ _loop1_61_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_160_var; + void *_tmp_162_var; while ( - (_tmp_160_var = _tmp_160_rule(p)) // 'and' inversion + (_tmp_162_var = _tmp_162_rule(p)) // 'and' inversion ) { - _res = _tmp_160_var; + _res = _tmp_162_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31079,7 +31210,7 @@ _loop0_64_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_161_rule(p)) // slice | starred_expression + (elem = _tmp_163_rule(p)) // slice | starred_expression ) { _res = elem; @@ -31144,7 +31275,7 @@ _gather_65_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_161_rule(p)) // slice | starred_expression + (elem = _tmp_163_rule(p)) // slice | starred_expression && (seq = _loop0_64_rule(p)) // _loop0_64 ) @@ -32179,7 +32310,7 @@ _loop0_80_rule(Parser *p) return _seq; } -// _loop1_81: (fstring | string | tstring) +// _loop1_81: (fstring | string) static asdl_seq * _loop1_81_rule(Parser *p) { @@ -32201,18 +32332,18 @@ _loop1_81_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // (fstring | string | tstring) + { // (fstring | string) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string | tstring)")); - void *_tmp_162_var; + D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string)")); + void *_tmp_154_var; while ( - (_tmp_162_var = _tmp_162_rule(p)) // fstring | string | tstring + (_tmp_154_var = _tmp_154_rule(p)) // fstring | string ) { - _res = _tmp_162_var; + _res = _tmp_154_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32230,7 +32361,79 @@ _loop1_81_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string | tstring)")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (Py_ssize_t i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _loop1_82: tstring +static asdl_seq * +_loop1_82_rule(Parser *p) +{ + if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // tstring + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring")); + expr_ty tstring_var; + while ( + (tstring_var = tstring_rule(p)) // tstring + ) + { + _res = tstring_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -32251,9 +32454,9 @@ _loop1_81_rule(Parser *p) return _seq; } -// _tmp_82: star_named_expression ',' star_named_expressions? +// _tmp_83: star_named_expression ',' star_named_expressions? static void * -_tmp_82_rule(Parser *p) +_tmp_83_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32269,7 +32472,7 @@ _tmp_82_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c> _tmp_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); Token * _literal; expr_ty y; void *z; @@ -32281,7 +32484,7 @@ _tmp_82_rule(Parser *p) (z = star_named_expressions_rule(p), !p->error_indicator) // star_named_expressions? ) { - D(fprintf(stderr, "%*c+ _tmp_82[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c+ _tmp_83[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); _res = _PyPegen_seq_insert_in_front ( p , y , z ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -32291,7 +32494,7 @@ _tmp_82_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_82[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_83[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); } _res = NULL; @@ -32300,9 +32503,9 @@ _tmp_82_rule(Parser *p) return _res; } -// _loop0_83: ',' double_starred_kvpair +// _loop0_84: ',' double_starred_kvpair static asdl_seq * -_loop0_83_rule(Parser *p) +_loop0_84_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32327,7 +32530,7 @@ _loop0_83_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; KeyValuePair* elem; while ( @@ -32359,7 +32562,7 @@ _loop0_83_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_83[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32376,9 +32579,9 @@ _loop0_83_rule(Parser *p) return _seq; } -// _gather_84: double_starred_kvpair _loop0_83 +// _gather_85: double_starred_kvpair _loop0_84 static asdl_seq * -_gather_84_rule(Parser *p) +_gather_85_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32389,27 +32592,27 @@ _gather_84_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_83 + { // double_starred_kvpair _loop0_84 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_83")); + D(fprintf(stderr, "%*c> _gather_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_84")); KeyValuePair* elem; asdl_seq * seq; if ( (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_83_rule(p)) // _loop0_83 + (seq = _loop0_84_rule(p)) // _loop0_84 ) { - D(fprintf(stderr, "%*c+ _gather_84[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_83")); + D(fprintf(stderr, "%*c+ _gather_85[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_84")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_84[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_83")); + D(fprintf(stderr, "%*c%s _gather_85[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_84")); } _res = NULL; done: @@ -32417,9 +32620,9 @@ _gather_84_rule(Parser *p) return _res; } -// _loop1_85: for_if_clause +// _loop1_86: for_if_clause static asdl_seq * -_loop1_85_rule(Parser *p) +_loop1_86_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32444,7 +32647,7 @@ _loop1_85_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); + D(fprintf(stderr, "%*c> _loop1_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); comprehension_ty for_if_clause_var; while ( (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause @@ -32467,7 +32670,7 @@ _loop1_85_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_86[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); } if (_n == 0 || p->error_indicator) { @@ -32489,9 +32692,9 @@ _loop1_85_rule(Parser *p) return _seq; } -// _loop0_86: ('if' disjunction) +// _loop0_87: ('if' disjunction) static asdl_seq * -_loop0_86_rule(Parser *p) +_loop0_87_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32516,13 +32719,13 @@ _loop0_86_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_163_var; + D(fprintf(stderr, "%*c> _loop0_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_164_var; while ( - (_tmp_163_var = _tmp_163_rule(p)) // 'if' disjunction + (_tmp_164_var = _tmp_164_rule(p)) // 'if' disjunction ) { - _res = _tmp_163_var; + _res = _tmp_164_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32539,7 +32742,7 @@ _loop0_86_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32556,9 +32759,9 @@ _loop0_86_rule(Parser *p) return _seq; } -// _tmp_87: assignment_expression | expression !':=' +// _tmp_88: assignment_expression | expression !':=' static void * -_tmp_87_rule(Parser *p) +_tmp_88_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32574,18 +32777,18 @@ _tmp_87_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c> _tmp_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); expr_ty assignment_expression_var; if ( (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression ) { - D(fprintf(stderr, "%*c+ _tmp_87[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c+ _tmp_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); _res = assignment_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_87[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); } { // expression !':=' @@ -32593,7 +32796,7 @@ _tmp_87_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c> _tmp_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression @@ -32601,12 +32804,12 @@ _tmp_87_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_87[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c+ _tmp_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); _res = expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_87[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } _res = NULL; @@ -32615,9 +32818,9 @@ _tmp_87_rule(Parser *p) return _res; } -// _loop0_88: ',' (starred_expression | (assignment_expression | expression !':=') !'=') +// _loop0_89: ',' (starred_expression | (assignment_expression | expression !':=') !'=') static asdl_seq * -_loop0_88_rule(Parser *p) +_loop0_89_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32642,13 +32845,13 @@ _loop0_88_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + D(fprintf(stderr, "%*c> _loop0_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_164_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = _tmp_165_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' ) { _res = elem; @@ -32674,7 +32877,7 @@ _loop0_88_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_88[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_89[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32691,10 +32894,10 @@ _loop0_88_rule(Parser *p) return _seq; } -// _gather_89: -// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_88 +// _gather_90: +// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_89 static asdl_seq * -_gather_89_rule(Parser *p) +_gather_90_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32705,27 +32908,27 @@ _gather_89_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_88 + { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_89 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_88")); + D(fprintf(stderr, "%*c> _gather_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_89")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_164_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = _tmp_165_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' && - (seq = _loop0_88_rule(p)) // _loop0_88 + (seq = _loop0_89_rule(p)) // _loop0_89 ) { - D(fprintf(stderr, "%*c+ _gather_89[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_88")); + D(fprintf(stderr, "%*c+ _gather_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_89")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_89[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_88")); + D(fprintf(stderr, "%*c%s _gather_90[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_89")); } _res = NULL; done: @@ -32733,9 +32936,9 @@ _gather_89_rule(Parser *p) return _res; } -// _tmp_90: ',' kwargs +// _tmp_91: ',' kwargs static void * -_tmp_90_rule(Parser *p) +_tmp_91_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32751,7 +32954,7 @@ _tmp_90_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); Token * _literal; asdl_seq* k; if ( @@ -32760,7 +32963,7 @@ _tmp_90_rule(Parser *p) (k = kwargs_rule(p)) // kwargs ) { - D(fprintf(stderr, "%*c+ _tmp_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); _res = k; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -32770,7 +32973,7 @@ _tmp_90_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_90[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); } _res = NULL; @@ -32779,9 +32982,9 @@ _tmp_90_rule(Parser *p) return _res; } -// _loop0_91: ',' kwarg_or_starred +// _loop0_92: ',' kwarg_or_starred static asdl_seq * -_loop0_91_rule(Parser *p) +_loop0_92_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32806,7 +33009,7 @@ _loop0_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c> _loop0_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -32838,7 +33041,7 @@ _loop0_91_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_92[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32855,9 +33058,9 @@ _loop0_91_rule(Parser *p) return _seq; } -// _gather_92: kwarg_or_starred _loop0_91 +// _gather_93: kwarg_or_starred _loop0_92 static asdl_seq * -_gather_92_rule(Parser *p) +_gather_93_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32868,27 +33071,27 @@ _gather_92_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_91 + { // kwarg_or_starred _loop0_92 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_91")); + D(fprintf(stderr, "%*c> _gather_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_92")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred && - (seq = _loop0_91_rule(p)) // _loop0_91 + (seq = _loop0_92_rule(p)) // _loop0_92 ) { - D(fprintf(stderr, "%*c+ _gather_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_91")); + D(fprintf(stderr, "%*c+ _gather_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_92")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_92[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_91")); + D(fprintf(stderr, "%*c%s _gather_93[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_92")); } _res = NULL; done: @@ -32896,9 +33099,9 @@ _gather_92_rule(Parser *p) return _res; } -// _loop0_93: ',' kwarg_or_double_starred +// _loop0_94: ',' kwarg_or_double_starred static asdl_seq * -_loop0_93_rule(Parser *p) +_loop0_94_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32923,7 +33126,7 @@ _loop0_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); Token * _literal; KeywordOrStarred* elem; while ( @@ -32955,7 +33158,7 @@ _loop0_93_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32972,9 +33175,9 @@ _loop0_93_rule(Parser *p) return _seq; } -// _gather_94: kwarg_or_double_starred _loop0_93 +// _gather_95: kwarg_or_double_starred _loop0_94 static asdl_seq * -_gather_94_rule(Parser *p) +_gather_95_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -32985,27 +33188,27 @@ _gather_94_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_93 + { // kwarg_or_double_starred _loop0_94 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_93")); + D(fprintf(stderr, "%*c> _gather_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_94")); KeywordOrStarred* elem; asdl_seq * seq; if ( (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred && - (seq = _loop0_93_rule(p)) // _loop0_93 + (seq = _loop0_94_rule(p)) // _loop0_94 ) { - D(fprintf(stderr, "%*c+ _gather_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_93")); + D(fprintf(stderr, "%*c+ _gather_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_94")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_94[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_93")); + D(fprintf(stderr, "%*c%s _gather_95[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_94")); } _res = NULL; done: @@ -33013,9 +33216,9 @@ _gather_94_rule(Parser *p) return _res; } -// _loop0_95: (',' star_target) +// _loop0_96: (',' star_target) static asdl_seq * -_loop0_95_rule(Parser *p) +_loop0_96_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33040,13 +33243,13 @@ _loop0_95_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_165_var; + D(fprintf(stderr, "%*c> _loop0_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_166_var; while ( - (_tmp_165_var = _tmp_165_rule(p)) // ',' star_target + (_tmp_166_var = _tmp_166_rule(p)) // ',' star_target ) { - _res = _tmp_165_var; + _res = _tmp_166_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33063,7 +33266,7 @@ _loop0_95_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33080,9 +33283,9 @@ _loop0_95_rule(Parser *p) return _seq; } -// _loop0_96: ',' star_target +// _loop0_97: ',' star_target static asdl_seq * -_loop0_96_rule(Parser *p) +_loop0_97_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33107,7 +33310,7 @@ _loop0_96_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _loop0_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty elem; while ( @@ -33139,7 +33342,7 @@ _loop0_96_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_96[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33156,9 +33359,9 @@ _loop0_96_rule(Parser *p) return _seq; } -// _gather_97: star_target _loop0_96 +// _gather_98: star_target _loop0_97 static asdl_seq * -_gather_97_rule(Parser *p) +_gather_98_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33169,27 +33372,27 @@ _gather_97_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_target _loop0_96 + { // star_target _loop0_97 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_96")); + D(fprintf(stderr, "%*c> _gather_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_97")); expr_ty elem; asdl_seq * seq; if ( (elem = star_target_rule(p)) // star_target && - (seq = _loop0_96_rule(p)) // _loop0_96 + (seq = _loop0_97_rule(p)) // _loop0_97 ) { - D(fprintf(stderr, "%*c+ _gather_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_96")); + D(fprintf(stderr, "%*c+ _gather_98[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_97")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_97[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_96")); + D(fprintf(stderr, "%*c%s _gather_98[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_97")); } _res = NULL; done: @@ -33197,9 +33400,9 @@ _gather_97_rule(Parser *p) return _res; } -// _loop1_98: (',' star_target) +// _loop1_99: (',' star_target) static asdl_seq * -_loop1_98_rule(Parser *p) +_loop1_99_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33224,13 +33427,13 @@ _loop1_98_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_165_var; + D(fprintf(stderr, "%*c> _loop1_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_166_var; while ( - (_tmp_165_var = _tmp_165_rule(p)) // ',' star_target + (_tmp_166_var = _tmp_166_rule(p)) // ',' star_target ) { - _res = _tmp_165_var; + _res = _tmp_166_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33247,7 +33450,7 @@ _loop1_98_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_98[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_99[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } if (_n == 0 || p->error_indicator) { @@ -33269,9 +33472,9 @@ _loop1_98_rule(Parser *p) return _seq; } -// _tmp_99: !'*' star_target +// _tmp_100: !'*' star_target static void * -_tmp_99_rule(Parser *p) +_tmp_100_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33287,7 +33490,7 @@ _tmp_99_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c> _tmp_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); expr_ty star_target_var; if ( _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' @@ -33295,12 +33498,12 @@ _tmp_99_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c+ _tmp_100[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); _res = star_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_100[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); } _res = NULL; @@ -33309,9 +33512,9 @@ _tmp_99_rule(Parser *p) return _res; } -// _loop0_100: ',' del_target +// _loop0_101: ',' del_target static asdl_seq * -_loop0_100_rule(Parser *p) +_loop0_101_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33336,7 +33539,7 @@ _loop0_100_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + D(fprintf(stderr, "%*c> _loop0_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); Token * _literal; expr_ty elem; while ( @@ -33368,7 +33571,7 @@ _loop0_100_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_100[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_101[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33385,9 +33588,9 @@ _loop0_100_rule(Parser *p) return _seq; } -// _gather_101: del_target _loop0_100 +// _gather_102: del_target _loop0_101 static asdl_seq * -_gather_101_rule(Parser *p) +_gather_102_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33398,27 +33601,27 @@ _gather_101_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // del_target _loop0_100 + { // del_target _loop0_101 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_100")); + D(fprintf(stderr, "%*c> _gather_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_101")); expr_ty elem; asdl_seq * seq; if ( (elem = del_target_rule(p)) // del_target && - (seq = _loop0_100_rule(p)) // _loop0_100 + (seq = _loop0_101_rule(p)) // _loop0_101 ) { - D(fprintf(stderr, "%*c+ _gather_101[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_100")); + D(fprintf(stderr, "%*c+ _gather_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_101")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_101[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_100")); + D(fprintf(stderr, "%*c%s _gather_102[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_101")); } _res = NULL; done: @@ -33426,9 +33629,9 @@ _gather_101_rule(Parser *p) return _res; } -// _loop0_102: ',' expression +// _loop0_103: ',' expression static asdl_seq * -_loop0_102_rule(Parser *p) +_loop0_103_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33453,7 +33656,7 @@ _loop0_102_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -33485,7 +33688,7 @@ _loop0_102_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_102[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_103[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33502,9 +33705,9 @@ _loop0_102_rule(Parser *p) return _seq; } -// _gather_103: expression _loop0_102 +// _gather_104: expression _loop0_103 static asdl_seq * -_gather_103_rule(Parser *p) +_gather_104_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33515,27 +33718,27 @@ _gather_103_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_102 + { // expression _loop0_103 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_102")); + D(fprintf(stderr, "%*c> _gather_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_103")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_102_rule(p)) // _loop0_102 + (seq = _loop0_103_rule(p)) // _loop0_103 ) { - D(fprintf(stderr, "%*c+ _gather_103[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_102")); + D(fprintf(stderr, "%*c+ _gather_104[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_103")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_103[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_102")); + D(fprintf(stderr, "%*c%s _gather_104[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_103")); } _res = NULL; done: @@ -33543,9 +33746,9 @@ _gather_103_rule(Parser *p) return _res; } -// _tmp_104: NEWLINE INDENT +// _tmp_105: NEWLINE INDENT static void * -_tmp_104_rule(Parser *p) +_tmp_105_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33561,7 +33764,7 @@ _tmp_104_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + D(fprintf(stderr, "%*c> _tmp_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); Token * indent_var; Token * newline_var; if ( @@ -33570,12 +33773,12 @@ _tmp_104_rule(Parser *p) (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' ) { - D(fprintf(stderr, "%*c+ _tmp_104[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + D(fprintf(stderr, "%*c+ _tmp_105[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); _res = _PyPegen_dummy_name(p, newline_var, indent_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_104[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_105[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT")); } _res = NULL; @@ -33584,11 +33787,11 @@ _tmp_104_rule(Parser *p) return _res; } -// _tmp_105: +// _tmp_106: // | (','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) // | kwargs static void * -_tmp_105_rule(Parser *p) +_tmp_106_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33604,18 +33807,18 @@ _tmp_105_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)")); - void *_tmp_166_var; + D(fprintf(stderr, "%*c> _tmp_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)")); + void *_tmp_167_var; if ( - (_tmp_166_var = _tmp_166_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs + (_tmp_167_var = _tmp_167_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs ) { - D(fprintf(stderr, "%*c+ _tmp_105[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)")); - _res = _tmp_166_var; + D(fprintf(stderr, "%*c+ _tmp_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)")); + _res = _tmp_167_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_105[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_106[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)")); } { // kwargs @@ -33623,18 +33826,18 @@ _tmp_105_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwargs")); + D(fprintf(stderr, "%*c> _tmp_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwargs")); asdl_seq* kwargs_var; if ( (kwargs_var = kwargs_rule(p)) // kwargs ) { - D(fprintf(stderr, "%*c+ _tmp_105[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwargs")); + D(fprintf(stderr, "%*c+ _tmp_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwargs")); _res = kwargs_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_105[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_106[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwargs")); } _res = NULL; @@ -33643,9 +33846,9 @@ _tmp_105_rule(Parser *p) return _res; } -// _loop0_106: ',' (starred_expression !'=') +// _loop0_107: ',' (starred_expression !'=') static asdl_seq * -_loop0_106_rule(Parser *p) +_loop0_107_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33670,13 +33873,13 @@ _loop0_106_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression !'=')")); + D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression !'=')")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_167_rule(p)) // starred_expression !'=' + (elem = _tmp_168_rule(p)) // starred_expression !'=' ) { _res = elem; @@ -33702,7 +33905,7 @@ _loop0_106_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_106[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression !'=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33719,9 +33922,9 @@ _loop0_106_rule(Parser *p) return _seq; } -// _gather_107: (starred_expression !'=') _loop0_106 +// _gather_108: (starred_expression !'=') _loop0_107 static asdl_seq * -_gather_107_rule(Parser *p) +_gather_108_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33732,27 +33935,27 @@ _gather_107_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (starred_expression !'=') _loop0_106 + { // (starred_expression !'=') _loop0_107 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_106")); + D(fprintf(stderr, "%*c> _gather_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_107")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_167_rule(p)) // starred_expression !'=' + (elem = _tmp_168_rule(p)) // starred_expression !'=' && - (seq = _loop0_106_rule(p)) // _loop0_106 + (seq = _loop0_107_rule(p)) // _loop0_107 ) { - D(fprintf(stderr, "%*c+ _gather_107[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_106")); + D(fprintf(stderr, "%*c+ _gather_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_107")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_107[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression !'=') _loop0_106")); + D(fprintf(stderr, "%*c%s _gather_108[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression !'=') _loop0_107")); } _res = NULL; done: @@ -33760,9 +33963,9 @@ _gather_107_rule(Parser *p) return _res; } -// _tmp_108: args | expression for_if_clauses +// _tmp_109: args | expression for_if_clauses static void * -_tmp_108_rule(Parser *p) +_tmp_109_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33778,18 +33981,18 @@ _tmp_108_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); expr_ty args_var; if ( (args_var = args_rule(p)) // args ) { - D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); _res = args_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); } { // expression for_if_clauses @@ -33797,7 +34000,7 @@ _tmp_108_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); expr_ty expression_var; asdl_comprehension_seq* for_if_clauses_var; if ( @@ -33806,12 +34009,12 @@ _tmp_108_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); } _res = NULL; @@ -33820,9 +34023,9 @@ _tmp_108_rule(Parser *p) return _res; } -// _tmp_109: args ',' +// _tmp_110: args ',' static void * -_tmp_109_rule(Parser *p) +_tmp_110_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33838,7 +34041,7 @@ _tmp_109_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','")); + D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','")); Token * _literal; expr_ty args_var; if ( @@ -33847,12 +34050,12 @@ _tmp_109_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','")); + D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','")); _res = _PyPegen_dummy_name(p, args_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','")); } _res = NULL; @@ -33861,9 +34064,9 @@ _tmp_109_rule(Parser *p) return _res; } -// _tmp_110: ',' | ')' +// _tmp_111: ',' | ')' static void * -_tmp_110_rule(Parser *p) +_tmp_111_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33879,18 +34082,18 @@ _tmp_110_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -33898,18 +34101,18 @@ _tmp_110_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } _res = NULL; @@ -33918,9 +34121,9 @@ _tmp_110_rule(Parser *p) return _res; } -// _tmp_111: 'True' | 'False' | 'None' +// _tmp_112: 'True' | 'False' | 'None' static void * -_tmp_111_rule(Parser *p) +_tmp_112_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -33936,18 +34139,18 @@ _tmp_111_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 622)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'False' @@ -33955,18 +34158,18 @@ _tmp_111_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 624)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } { // 'None' @@ -33974,18 +34177,18 @@ _tmp_111_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 623)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_112[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } _res = NULL; @@ -33994,9 +34197,9 @@ _tmp_111_rule(Parser *p) return _res; } -// _tmp_112: NAME '=' +// _tmp_113: NAME '=' static void * -_tmp_112_rule(Parser *p) +_tmp_113_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34012,7 +34215,7 @@ _tmp_112_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='")); + D(fprintf(stderr, "%*c> _tmp_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='")); Token * _literal; expr_ty name_var; if ( @@ -34021,12 +34224,12 @@ _tmp_112_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='")); + D(fprintf(stderr, "%*c+ _tmp_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='")); _res = _PyPegen_dummy_name(p, name_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_112[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '='")); } _res = NULL; @@ -34035,9 +34238,9 @@ _tmp_112_rule(Parser *p) return _res; } -// _loop1_113: (!STRING expression_without_invalid) +// _loop1_114: (!STRING expression_without_invalid) static asdl_seq * -_loop1_113_rule(Parser *p) +_loop1_114_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34062,13 +34265,13 @@ _loop1_113_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(!STRING expression_without_invalid)")); - void *_tmp_168_var; + D(fprintf(stderr, "%*c> _loop1_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(!STRING expression_without_invalid)")); + void *_tmp_169_var; while ( - (_tmp_168_var = _tmp_168_rule(p)) // !STRING expression_without_invalid + (_tmp_169_var = _tmp_169_rule(p)) // !STRING expression_without_invalid ) { - _res = _tmp_168_var; + _res = _tmp_169_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -34085,7 +34288,7 @@ _loop1_113_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_114[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(!STRING expression_without_invalid)")); } if (_n == 0 || p->error_indicator) { @@ -34107,9 +34310,9 @@ _loop1_113_rule(Parser *p) return _seq; } -// _tmp_114: NAME STRING | SOFT_KEYWORD +// _tmp_115: NAME STRING | SOFT_KEYWORD static void * -_tmp_114_rule(Parser *p) +_tmp_115_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34125,7 +34328,7 @@ _tmp_114_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING")); + D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING")); expr_ty name_var; expr_ty string_var; if ( @@ -34134,12 +34337,12 @@ _tmp_114_rule(Parser *p) (string_var = _PyPegen_string_token(p)) // STRING ) { - D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING")); + D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING")); _res = _PyPegen_dummy_name(p, name_var, string_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME STRING")); } { // SOFT_KEYWORD @@ -34147,18 +34350,18 @@ _tmp_114_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); + D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); expr_ty soft_keyword_var; if ( (soft_keyword_var = _PyPegen_soft_keyword_token(p)) // SOFT_KEYWORD ) { - D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); + D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); _res = soft_keyword_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "SOFT_KEYWORD")); } _res = NULL; @@ -34167,9 +34370,9 @@ _tmp_114_rule(Parser *p) return _res; } -// _tmp_115: 'else' | ':' +// _tmp_116: 'else' | ':' static void * -_tmp_115_rule(Parser *p) +_tmp_116_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34185,18 +34388,18 @@ _tmp_115_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'")); + D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 686)) // token='else' ) { - D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'")); + D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else'")); } { // ':' @@ -34204,18 +34407,18 @@ _tmp_115_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -34224,9 +34427,9 @@ _tmp_115_rule(Parser *p) return _res; } -// _tmp_116: pass_stmt | break_stmt | continue_stmt +// _tmp_117: pass_stmt | break_stmt | continue_stmt static void * -_tmp_116_rule(Parser *p) +_tmp_117_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34242,18 +34445,18 @@ _tmp_116_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pass_stmt")); + D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pass_stmt")); stmt_ty pass_stmt_var; if ( (pass_stmt_var = pass_stmt_rule(p)) // pass_stmt ) { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pass_stmt")); + D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pass_stmt")); _res = pass_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pass_stmt")); } { // break_stmt @@ -34261,18 +34464,18 @@ _tmp_116_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "break_stmt")); + D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "break_stmt")); stmt_ty break_stmt_var; if ( (break_stmt_var = break_stmt_rule(p)) // break_stmt ) { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "break_stmt")); + D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "break_stmt")); _res = break_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "break_stmt")); } { // continue_stmt @@ -34280,18 +34483,18 @@ _tmp_116_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "continue_stmt")); + D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "continue_stmt")); stmt_ty continue_stmt_var; if ( (continue_stmt_var = continue_stmt_rule(p)) // continue_stmt ) { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "continue_stmt")); + D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "continue_stmt")); _res = continue_stmt_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "continue_stmt")); } _res = NULL; @@ -34300,9 +34503,9 @@ _tmp_116_rule(Parser *p) return _res; } -// _tmp_117: '=' | ':=' +// _tmp_118: '=' | ':=' static void * -_tmp_117_rule(Parser *p) +_tmp_118_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34318,18 +34521,18 @@ _tmp_117_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -34337,18 +34540,18 @@ _tmp_117_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -34357,9 +34560,9 @@ _tmp_117_rule(Parser *p) return _res; } -// _tmp_118: list | tuple | genexp | 'True' | 'None' | 'False' +// _tmp_119: list | tuple | genexp | 'True' | 'None' | 'False' static void * -_tmp_118_rule(Parser *p) +_tmp_119_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34375,18 +34578,18 @@ _tmp_118_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // tuple @@ -34394,18 +34597,18 @@ _tmp_118_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // genexp @@ -34413,18 +34616,18 @@ _tmp_118_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } { // 'True' @@ -34432,18 +34635,18 @@ _tmp_118_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 622)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'None' @@ -34451,18 +34654,18 @@ _tmp_118_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 623)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } { // 'False' @@ -34470,18 +34673,18 @@ _tmp_118_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 624)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_118[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } _res = NULL; @@ -34490,9 +34693,9 @@ _tmp_118_rule(Parser *p) return _res; } -// _loop0_119: star_named_expressions +// _loop0_120: star_named_expressions static asdl_seq * -_loop0_119_rule(Parser *p) +_loop0_120_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34517,7 +34720,7 @@ _loop0_119_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + D(fprintf(stderr, "%*c> _loop0_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); asdl_expr_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions @@ -34540,7 +34743,7 @@ _loop0_119_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_120[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34557,9 +34760,9 @@ _loop0_119_rule(Parser *p) return _seq; } -// _loop0_120: (star_targets '=') +// _loop0_121: (star_targets '=') static asdl_seq * -_loop0_120_rule(Parser *p) +_loop0_121_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34584,13 +34787,13 @@ _loop0_120_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_155_var; + D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_157_var; while ( - (_tmp_155_var = _tmp_155_rule(p)) // star_targets '=' + (_tmp_157_var = _tmp_157_rule(p)) // star_targets '=' ) { - _res = _tmp_155_var; + _res = _tmp_157_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -34607,7 +34810,7 @@ _loop0_120_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_120[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34624,9 +34827,9 @@ _loop0_120_rule(Parser *p) return _seq; } -// _tmp_121: '[' | '(' | '{' +// _tmp_122: '[' | '(' | '{' static void * -_tmp_121_rule(Parser *p) +_tmp_122_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34642,18 +34845,18 @@ _tmp_121_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '(' @@ -34661,18 +34864,18 @@ _tmp_121_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '{' @@ -34680,18 +34883,18 @@ _tmp_121_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -34700,9 +34903,9 @@ _tmp_121_rule(Parser *p) return _res; } -// _tmp_122: '[' | '{' +// _tmp_123: '[' | '{' static void * -_tmp_122_rule(Parser *p) +_tmp_123_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34718,18 +34921,18 @@ _tmp_122_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -34737,18 +34940,18 @@ _tmp_122_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -34757,9 +34960,9 @@ _tmp_122_rule(Parser *p) return _res; } -// _tmp_123: slash_no_default | slash_with_default +// _tmp_124: slash_no_default | slash_with_default static void * -_tmp_123_rule(Parser *p) +_tmp_124_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34775,18 +34978,18 @@ _tmp_123_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -34794,18 +34997,18 @@ _tmp_123_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -34814,9 +35017,9 @@ _tmp_123_rule(Parser *p) return _res; } -// _tmp_124: ',' | param_no_default +// _tmp_125: ',' | param_no_default static void * -_tmp_124_rule(Parser *p) +_tmp_125_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34832,18 +35035,18 @@ _tmp_124_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // param_no_default @@ -34851,18 +35054,18 @@ _tmp_124_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } _res = NULL; @@ -34871,9 +35074,9 @@ _tmp_124_rule(Parser *p) return _res; } -// _tmp_125: ')' | ',' +// _tmp_126: ')' | ',' static void * -_tmp_125_rule(Parser *p) +_tmp_126_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34889,18 +35092,18 @@ _tmp_125_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' @@ -34908,18 +35111,18 @@ _tmp_125_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34928,9 +35131,9 @@ _tmp_125_rule(Parser *p) return _res; } -// _tmp_126: ')' | ',' (')' | '**') +// _tmp_127: ')' | ',' (')' | '**') static void * -_tmp_126_rule(Parser *p) +_tmp_127_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -34946,18 +35149,18 @@ _tmp_126_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -34965,21 +35168,21 @@ _tmp_126_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_169_var; + void *_tmp_170_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_169_var = _tmp_169_rule(p)) // ')' | '**' + (_tmp_170_var = _tmp_170_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_169_var); + D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_170_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -34988,9 +35191,9 @@ _tmp_126_rule(Parser *p) return _res; } -// _tmp_127: param_no_default | ',' +// _tmp_128: param_no_default | ',' static void * -_tmp_127_rule(Parser *p) +_tmp_128_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35006,18 +35209,18 @@ _tmp_127_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -35025,18 +35228,18 @@ _tmp_127_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35045,9 +35248,9 @@ _tmp_127_rule(Parser *p) return _res; } -// _tmp_128: '*' | '**' | '/' +// _tmp_129: '*' | '**' | '/' static void * -_tmp_128_rule(Parser *p) +_tmp_129_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35063,18 +35266,18 @@ _tmp_128_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -35082,18 +35285,18 @@ _tmp_128_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -35101,18 +35304,18 @@ _tmp_128_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -35121,9 +35324,9 @@ _tmp_128_rule(Parser *p) return _res; } -// _tmp_129: lambda_slash_no_default | lambda_slash_with_default +// _tmp_130: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_129_rule(Parser *p) +_tmp_130_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35139,18 +35342,18 @@ _tmp_129_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -35158,18 +35361,18 @@ _tmp_129_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_129[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -35178,9 +35381,9 @@ _tmp_129_rule(Parser *p) return _res; } -// _loop0_130: ',' lambda_param +// _loop0_131: ',' lambda_param static asdl_seq * -_loop0_130_rule(Parser *p) +_loop0_131_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35205,7 +35408,7 @@ _loop0_130_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); + D(fprintf(stderr, "%*c> _loop0_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); Token * _literal; arg_ty elem; while ( @@ -35237,7 +35440,7 @@ _loop0_130_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_131[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35254,9 +35457,9 @@ _loop0_130_rule(Parser *p) return _seq; } -// _gather_131: lambda_param _loop0_130 +// _gather_132: lambda_param _loop0_131 static asdl_seq * -_gather_131_rule(Parser *p) +_gather_132_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35267,27 +35470,27 @@ _gather_131_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // lambda_param _loop0_130 + { // lambda_param _loop0_131 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_130")); + D(fprintf(stderr, "%*c> _gather_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_131")); arg_ty elem; asdl_seq * seq; if ( (elem = lambda_param_rule(p)) // lambda_param && - (seq = _loop0_130_rule(p)) // _loop0_130 + (seq = _loop0_131_rule(p)) // _loop0_131 ) { - D(fprintf(stderr, "%*c+ _gather_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_130")); + D(fprintf(stderr, "%*c+ _gather_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_131")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_131[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_130")); + D(fprintf(stderr, "%*c%s _gather_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_131")); } _res = NULL; done: @@ -35295,9 +35498,9 @@ _gather_131_rule(Parser *p) return _res; } -// _tmp_132: ',' | lambda_param_no_default +// _tmp_133: ',' | lambda_param_no_default static void * -_tmp_132_rule(Parser *p) +_tmp_133_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35313,18 +35516,18 @@ _tmp_132_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // lambda_param_no_default @@ -35332,18 +35535,18 @@ _tmp_132_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } _res = NULL; @@ -35352,9 +35555,9 @@ _tmp_132_rule(Parser *p) return _res; } -// _tmp_133: ':' | ',' (':' | '**') +// _tmp_134: ':' | ',' (':' | '**') static void * -_tmp_133_rule(Parser *p) +_tmp_134_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35370,18 +35573,18 @@ _tmp_133_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -35389,21 +35592,21 @@ _tmp_133_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_170_var; + void *_tmp_171_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_170_var = _tmp_170_rule(p)) // ':' | '**' + (_tmp_171_var = _tmp_171_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_170_var); + D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_171_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -35412,9 +35615,9 @@ _tmp_133_rule(Parser *p) return _res; } -// _tmp_134: lambda_param_no_default | ',' +// _tmp_135: lambda_param_no_default | ',' static void * -_tmp_134_rule(Parser *p) +_tmp_135_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35430,18 +35633,18 @@ _tmp_134_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -35449,18 +35652,18 @@ _tmp_134_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35469,9 +35672,9 @@ _tmp_134_rule(Parser *p) return _res; } -// _tmp_135: bitwise_or ((',' bitwise_or))* ','? +// _tmp_136: bitwise_or ((',' bitwise_or))* ','? static void * -_tmp_135_rule(Parser *p) +_tmp_136_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35487,25 +35690,25 @@ _tmp_135_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?")); - asdl_seq * _loop0_171_var; + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?")); + asdl_seq * _loop0_172_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty bitwise_or_var; if ( (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or && - (_loop0_171_var = _loop0_171_rule(p)) // ((',' bitwise_or))* + (_loop0_172_var = _loop0_172_rule(p)) // ((',' bitwise_or))* && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) { - D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?")); - _res = _PyPegen_dummy_name(p, bitwise_or_var, _loop0_171_var, _opt_var); + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?")); + _res = _PyPegen_dummy_name(p, bitwise_or_var, _loop0_172_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?")); } _res = NULL; @@ -35514,9 +35717,9 @@ _tmp_135_rule(Parser *p) return _res; } -// _loop0_136: ',' dotted_name +// _loop0_137: ',' dotted_name static asdl_seq * -_loop0_136_rule(Parser *p) +_loop0_137_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35541,7 +35744,7 @@ _loop0_136_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_name")); + D(fprintf(stderr, "%*c> _loop0_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_name")); Token * _literal; expr_ty elem; while ( @@ -35573,7 +35776,7 @@ _loop0_136_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35590,9 +35793,9 @@ _loop0_136_rule(Parser *p) return _seq; } -// _gather_137: dotted_name _loop0_136 +// _gather_138: dotted_name _loop0_137 static asdl_seq * -_gather_137_rule(Parser *p) +_gather_138_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35603,27 +35806,27 @@ _gather_137_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // dotted_name _loop0_136 + { // dotted_name _loop0_137 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_136")); + D(fprintf(stderr, "%*c> _gather_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_137")); expr_ty elem; asdl_seq * seq; if ( (elem = dotted_name_rule(p)) // dotted_name && - (seq = _loop0_136_rule(p)) // _loop0_136 + (seq = _loop0_137_rule(p)) // _loop0_137 ) { - D(fprintf(stderr, "%*c+ _gather_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_136")); + D(fprintf(stderr, "%*c+ _gather_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_137")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_137[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name _loop0_136")); + D(fprintf(stderr, "%*c%s _gather_138[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name _loop0_137")); } _res = NULL; done: @@ -35631,9 +35834,9 @@ _gather_137_rule(Parser *p) return _res; } -// _tmp_138: NAME (',' | ')' | NEWLINE) +// _tmp_139: NAME (',' | ')' | NEWLINE) static void * -_tmp_138_rule(Parser *p) +_tmp_139_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35649,21 +35852,21 @@ _tmp_138_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); - void *_tmp_172_var; + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); + void *_tmp_173_var; expr_ty name_var; if ( (name_var = _PyPegen_name_token(p)) // NAME && - (_tmp_172_var = _tmp_172_rule(p)) // ',' | ')' | NEWLINE + (_tmp_173_var = _tmp_173_rule(p)) // ',' | ')' | NEWLINE ) { - D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); - _res = _PyPegen_dummy_name(p, name_var, _tmp_172_var); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); + _res = _PyPegen_dummy_name(p, name_var, _tmp_173_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); } _res = NULL; @@ -35672,9 +35875,9 @@ _tmp_138_rule(Parser *p) return _res; } -// _loop0_139: ',' (expression ['as' star_target]) +// _loop0_140: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_139_rule(Parser *p) +_loop0_140_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35699,13 +35902,13 @@ _loop0_139_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_173_rule(p)) // expression ['as' star_target] + (elem = _tmp_174_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -35731,7 +35934,7 @@ _loop0_139_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_139[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35748,9 +35951,9 @@ _loop0_139_rule(Parser *p) return _seq; } -// _gather_140: (expression ['as' star_target]) _loop0_139 +// _gather_141: (expression ['as' star_target]) _loop0_140 static asdl_seq * -_gather_140_rule(Parser *p) +_gather_141_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35761,27 +35964,27 @@ _gather_140_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_139 + { // (expression ['as' star_target]) _loop0_140 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_139")); + D(fprintf(stderr, "%*c> _gather_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_140")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_173_rule(p)) // expression ['as' star_target] + (elem = _tmp_174_rule(p)) // expression ['as' star_target] && - (seq = _loop0_139_rule(p)) // _loop0_139 + (seq = _loop0_140_rule(p)) // _loop0_140 ) { - D(fprintf(stderr, "%*c+ _gather_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_139")); + D(fprintf(stderr, "%*c+ _gather_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_140")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_140[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_139")); + D(fprintf(stderr, "%*c%s _gather_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_140")); } _res = NULL; done: @@ -35789,9 +35992,9 @@ _gather_140_rule(Parser *p) return _res; } -// _loop0_141: ',' (expressions ['as' star_target]) +// _loop0_142: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_141_rule(Parser *p) +_loop0_142_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35816,13 +36019,13 @@ _loop0_141_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_174_rule(p)) // expressions ['as' star_target] + (elem = _tmp_175_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -35848,7 +36051,7 @@ _loop0_141_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_141[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35865,9 +36068,9 @@ _loop0_141_rule(Parser *p) return _seq; } -// _gather_142: (expressions ['as' star_target]) _loop0_141 +// _gather_143: (expressions ['as' star_target]) _loop0_142 static asdl_seq * -_gather_142_rule(Parser *p) +_gather_143_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35878,27 +36081,27 @@ _gather_142_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_141 + { // (expressions ['as' star_target]) _loop0_142 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_141")); + D(fprintf(stderr, "%*c> _gather_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_142")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_174_rule(p)) // expressions ['as' star_target] + (elem = _tmp_175_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_141_rule(p)) // _loop0_141 + (seq = _loop0_142_rule(p)) // _loop0_142 ) { - D(fprintf(stderr, "%*c+ _gather_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_141")); + D(fprintf(stderr, "%*c+ _gather_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_142")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_142[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_141")); + D(fprintf(stderr, "%*c%s _gather_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_142")); } _res = NULL; done: @@ -35906,9 +36109,9 @@ _gather_142_rule(Parser *p) return _res; } -// _tmp_143: 'except' | 'finally' +// _tmp_144: 'except' | 'finally' static void * -_tmp_143_rule(Parser *p) +_tmp_144_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35924,18 +36127,18 @@ _tmp_143_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 677)) // token='except' ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except'")); } { // 'finally' @@ -35943,18 +36146,18 @@ _tmp_143_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); Token * _keyword; if ( (_keyword = _PyPegen_expect_token(p, 673)) // token='finally' ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally'")); } _res = NULL; @@ -35963,9 +36166,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _loop0_144: block +// _loop0_145: block static asdl_seq * -_loop0_144_rule(Parser *p) +_loop0_145_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -35990,7 +36193,7 @@ _loop0_144_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -36013,7 +36216,7 @@ _loop0_144_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_145[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36030,9 +36233,9 @@ _loop0_144_rule(Parser *p) return _seq; } -// _tmp_145: expression ['as' NAME] +// _tmp_146: expression ['as' NAME] static void * -_tmp_145_rule(Parser *p) +_tmp_146_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36048,7 +36251,7 @@ _tmp_145_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; @@ -36058,12 +36261,12 @@ _tmp_145_rule(Parser *p) (_opt_var = _tmp_22_rule(p), !p->error_indicator) // ['as' NAME] ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' NAME]")); } _res = NULL; @@ -36072,9 +36275,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: NEWLINE | ':' +// _tmp_147: NEWLINE | ':' static void * -_tmp_146_rule(Parser *p) +_tmp_147_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36090,18 +36293,18 @@ _tmp_146_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } { // ':' @@ -36109,18 +36312,18 @@ _tmp_146_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -36129,9 +36332,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: positional_patterns ',' +// _tmp_148: positional_patterns ',' static void * -_tmp_147_rule(Parser *p) +_tmp_148_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36147,7 +36350,7 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); Token * _literal; asdl_pattern_seq* positional_patterns_var; if ( @@ -36156,12 +36359,12 @@ _tmp_147_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); _res = _PyPegen_dummy_name(p, positional_patterns_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "positional_patterns ','")); } _res = NULL; @@ -36170,9 +36373,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: '}' | ',' +// _tmp_149: '}' | ',' static void * -_tmp_148_rule(Parser *p) +_tmp_149_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36188,18 +36391,18 @@ _tmp_148_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -36207,18 +36410,18 @@ _tmp_148_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -36227,9 +36430,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: '=' | '!' | ':' | '}' +// _tmp_150: '=' | '!' | ':' | '}' static void * -_tmp_149_rule(Parser *p) +_tmp_150_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36245,18 +36448,18 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // '!' @@ -36264,18 +36467,18 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); } { // ':' @@ -36283,18 +36486,18 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -36302,18 +36505,18 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -36322,9 +36525,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: '!' | ':' | '}' +// _tmp_151: '!' | ':' | '}' static void * -_tmp_150_rule(Parser *p) +_tmp_151_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36340,18 +36543,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 54)) // token='!' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); } { // ':' @@ -36359,18 +36562,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -36378,18 +36581,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -36398,9 +36601,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: '!' NAME +// _tmp_152: '!' NAME static void * -_tmp_151_rule(Parser *p) +_tmp_152_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36416,7 +36619,7 @@ _tmp_151_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); Token * _literal; expr_ty name_var; if ( @@ -36425,12 +36628,12 @@ _tmp_151_rule(Parser *p) (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); _res = _PyPegen_dummy_name(p, _literal, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); } _res = NULL; @@ -36439,9 +36642,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: ':' | '}' +// _tmp_153: ':' | '}' static void * -_tmp_152_rule(Parser *p) +_tmp_153_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36457,18 +36660,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '}' @@ -36476,18 +36679,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } _res = NULL; @@ -36496,9 +36699,66 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: '+' | '-' | '*' | '/' | '%' | '//' | '@' +// _tmp_154: fstring | string static void * -_tmp_153_rule(Parser *p) +_tmp_154_rule(Parser *p) +{ + if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { + _Pypegen_stack_overflow(p); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // fstring + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring")); + expr_ty fstring_var; + if ( + (fstring_var = fstring_rule(p)) // fstring + ) + { + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring")); + _res = fstring_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring")); + } + { // string + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string")); + expr_ty string_var; + if ( + (string_var = string_rule(p)) // string + ) + { + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string")); + _res = string_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "string")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_155: '+' | '-' | '*' | '/' | '%' | '//' | '@' +static void * +_tmp_155_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36514,18 +36774,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 14)) // token='+' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); } { // '-' @@ -36533,18 +36793,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 15)) // token='-' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); } { // '*' @@ -36552,18 +36812,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '/' @@ -36571,18 +36831,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } { // '%' @@ -36590,18 +36850,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'%'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'%'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 24)) // token='%' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'%'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'%'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'%'")); } { // '//' @@ -36609,18 +36869,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'//'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'//'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 47)) // token='//' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'//'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'//'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'//'")); } { // '@' @@ -36628,18 +36888,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } _res = NULL; @@ -36648,9 +36908,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: '+' | '-' | '~' +// _tmp_156: '+' | '-' | '~' static void * -_tmp_154_rule(Parser *p) +_tmp_156_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36666,18 +36926,18 @@ _tmp_154_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 14)) // token='+' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); } { // '-' @@ -36685,18 +36945,18 @@ _tmp_154_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 15)) // token='-' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); } { // '~' @@ -36704,18 +36964,18 @@ _tmp_154_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'~'")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'~'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 31)) // token='~' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'~'")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'~'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'~'")); } _res = NULL; @@ -36724,9 +36984,9 @@ _tmp_154_rule(Parser *p) return _res; } -// _tmp_155: star_targets '=' +// _tmp_157: star_targets '=' static void * -_tmp_155_rule(Parser *p) +_tmp_157_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36742,7 +37002,7 @@ _tmp_155_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -36751,7 +37011,7 @@ _tmp_155_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -36761,7 +37021,7 @@ _tmp_155_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -36770,9 +37030,9 @@ _tmp_155_rule(Parser *p) return _res; } -// _tmp_156: '.' | '...' +// _tmp_158: '.' | '...' static void * -_tmp_156_rule(Parser *p) +_tmp_158_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36788,18 +37048,18 @@ _tmp_156_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -36807,18 +37067,18 @@ _tmp_156_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -36827,9 +37087,9 @@ _tmp_156_rule(Parser *p) return _res; } -// _tmp_157: '@' named_expression NEWLINE +// _tmp_159: '@' named_expression NEWLINE static void * -_tmp_157_rule(Parser *p) +_tmp_159_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36845,7 +37105,7 @@ _tmp_157_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -36857,7 +37117,7 @@ _tmp_157_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -36867,7 +37127,7 @@ _tmp_157_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -36876,9 +37136,9 @@ _tmp_157_rule(Parser *p) return _res; } -// _tmp_158: ',' star_expression +// _tmp_160: ',' star_expression static void * -_tmp_158_rule(Parser *p) +_tmp_160_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36894,7 +37154,7 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -36903,7 +37163,7 @@ _tmp_158_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -36913,7 +37173,7 @@ _tmp_158_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -36922,9 +37182,9 @@ _tmp_158_rule(Parser *p) return _res; } -// _tmp_159: 'or' conjunction +// _tmp_161: 'or' conjunction static void * -_tmp_159_rule(Parser *p) +_tmp_161_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36940,7 +37200,7 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -36949,7 +37209,7 @@ _tmp_159_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -36959,7 +37219,7 @@ _tmp_159_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -36968,9 +37228,9 @@ _tmp_159_rule(Parser *p) return _res; } -// _tmp_160: 'and' inversion +// _tmp_162: 'and' inversion static void * -_tmp_160_rule(Parser *p) +_tmp_162_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -36986,7 +37246,7 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -36995,7 +37255,7 @@ _tmp_160_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37005,7 +37265,7 @@ _tmp_160_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -37014,9 +37274,9 @@ _tmp_160_rule(Parser *p) return _res; } -// _tmp_161: slice | starred_expression +// _tmp_163: slice | starred_expression static void * -_tmp_161_rule(Parser *p) +_tmp_163_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37032,18 +37292,18 @@ _tmp_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); expr_ty slice_var; if ( (slice_var = slice_rule(p)) // slice ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); _res = slice_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice")); } { // starred_expression @@ -37051,18 +37311,18 @@ _tmp_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } _res = NULL; @@ -37071,85 +37331,9 @@ _tmp_161_rule(Parser *p) return _res; } -// _tmp_162: fstring | string | tstring +// _tmp_164: 'if' disjunction static void * -_tmp_162_rule(Parser *p) -{ - if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { - _Pypegen_stack_overflow(p); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void * _res = NULL; - int _mark = p->mark; - { // fstring - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring")); - expr_ty fstring_var; - if ( - (fstring_var = fstring_rule(p)) // fstring - ) - { - D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring")); - _res = fstring_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring")); - } - { // string - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string")); - expr_ty string_var; - if ( - (string_var = string_rule(p)) // string - ) - { - D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string")); - _res = string_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "string")); - } - { // tstring - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring")); - expr_ty tstring_var; - if ( - (tstring_var = tstring_rule(p)) // tstring - ) - { - D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tstring")); - _res = tstring_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _tmp_163: 'if' disjunction -static void * -_tmp_163_rule(Parser *p) +_tmp_164_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37165,7 +37349,7 @@ _tmp_163_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -37174,7 +37358,7 @@ _tmp_163_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37184,7 +37368,7 @@ _tmp_163_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -37193,9 +37377,9 @@ _tmp_163_rule(Parser *p) return _res; } -// _tmp_164: starred_expression | (assignment_expression | expression !':=') !'=' +// _tmp_165: starred_expression | (assignment_expression | expression !':=') !'=' static void * -_tmp_164_rule(Parser *p) +_tmp_165_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37211,18 +37395,18 @@ _tmp_164_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // (assignment_expression | expression !':=') !'=' @@ -37230,20 +37414,20 @@ _tmp_164_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - void *_tmp_87_var; + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + void *_tmp_88_var; if ( - (_tmp_87_var = _tmp_87_rule(p)) // assignment_expression | expression !':=' + (_tmp_88_var = _tmp_88_rule(p)) // assignment_expression | expression !':=' && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - _res = _tmp_87_var; + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + _res = _tmp_88_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(assignment_expression | expression !':=') !'='")); } _res = NULL; @@ -37252,9 +37436,9 @@ _tmp_164_rule(Parser *p) return _res; } -// _tmp_165: ',' star_target +// _tmp_166: ',' star_target static void * -_tmp_165_rule(Parser *p) +_tmp_166_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37270,7 +37454,7 @@ _tmp_165_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -37279,7 +37463,7 @@ _tmp_165_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37289,7 +37473,7 @@ _tmp_165_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -37298,10 +37482,10 @@ _tmp_165_rule(Parser *p) return _res; } -// _tmp_166: +// _tmp_167: // | ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs static void * -_tmp_166_rule(Parser *p) +_tmp_167_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37317,24 +37501,24 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs")); - asdl_seq * _gather_89_var; + D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs")); + asdl_seq * _gather_90_var; Token * _literal; asdl_seq* kwargs_var; if ( - (_gather_89_var = _gather_89_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ + (_gather_90_var = _gather_90_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && (kwargs_var = kwargs_rule(p)) // kwargs ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs")); - _res = _PyPegen_dummy_name(p, _gather_89_var, _literal, kwargs_var); + D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs")); + _res = _PyPegen_dummy_name(p, _gather_90_var, _literal, kwargs_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs")); } _res = NULL; @@ -37343,9 +37527,9 @@ _tmp_166_rule(Parser *p) return _res; } -// _tmp_167: starred_expression !'=' +// _tmp_168: starred_expression !'=' static void * -_tmp_167_rule(Parser *p) +_tmp_168_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37361,7 +37545,7 @@ _tmp_167_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression !'='")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression @@ -37369,12 +37553,12 @@ _tmp_167_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression !'='")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression !'='")); } _res = NULL; @@ -37383,9 +37567,9 @@ _tmp_167_rule(Parser *p) return _res; } -// _tmp_168: !STRING expression_without_invalid +// _tmp_169: !STRING expression_without_invalid static void * -_tmp_168_rule(Parser *p) +_tmp_169_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37401,7 +37585,7 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid")); + D(fprintf(stderr, "%*c> _tmp_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid")); expr_ty expression_without_invalid_var; if ( _PyPegen_lookahead(0, _PyPegen_string_token, p) @@ -37409,12 +37593,12 @@ _tmp_168_rule(Parser *p) (expression_without_invalid_var = expression_without_invalid_rule(p)) // expression_without_invalid ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid")); + D(fprintf(stderr, "%*c+ _tmp_169[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid")); _res = expression_without_invalid_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_169[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!STRING expression_without_invalid")); } _res = NULL; @@ -37423,9 +37607,9 @@ _tmp_168_rule(Parser *p) return _res; } -// _tmp_169: ')' | '**' +// _tmp_170: ')' | '**' static void * -_tmp_169_rule(Parser *p) +_tmp_170_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37441,18 +37625,18 @@ _tmp_169_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_169[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_170[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_169[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_170[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -37460,18 +37644,18 @@ _tmp_169_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_169[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_170[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_169[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_170[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -37480,9 +37664,9 @@ _tmp_169_rule(Parser *p) return _res; } -// _tmp_170: ':' | '**' +// _tmp_171: ':' | '**' static void * -_tmp_170_rule(Parser *p) +_tmp_171_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37498,18 +37682,18 @@ _tmp_170_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_170[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_170[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -37517,18 +37701,18 @@ _tmp_170_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_170[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_170[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -37537,9 +37721,9 @@ _tmp_170_rule(Parser *p) return _res; } -// _loop0_171: (',' bitwise_or) +// _loop0_172: (',' bitwise_or) static asdl_seq * -_loop0_171_rule(Parser *p) +_loop0_172_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37564,13 +37748,13 @@ _loop0_171_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' bitwise_or)")); - void *_tmp_175_var; + D(fprintf(stderr, "%*c> _loop0_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' bitwise_or)")); + void *_tmp_176_var; while ( - (_tmp_175_var = _tmp_175_rule(p)) // ',' bitwise_or + (_tmp_176_var = _tmp_176_rule(p)) // ',' bitwise_or ) { - _res = _tmp_175_var; + _res = _tmp_176_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -37587,7 +37771,7 @@ _loop0_171_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_171[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_172[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' bitwise_or)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37604,9 +37788,9 @@ _loop0_171_rule(Parser *p) return _seq; } -// _tmp_172: ',' | ')' | NEWLINE +// _tmp_173: ',' | ')' | NEWLINE static void * -_tmp_172_rule(Parser *p) +_tmp_173_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37622,18 +37806,18 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -37641,18 +37825,18 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // NEWLINE @@ -37660,18 +37844,18 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } _res = NULL; @@ -37680,9 +37864,9 @@ _tmp_172_rule(Parser *p) return _res; } -// _tmp_173: expression ['as' star_target] +// _tmp_174: expression ['as' star_target] static void * -_tmp_173_rule(Parser *p) +_tmp_174_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37698,22 +37882,22 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_176_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_177_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_174[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -37722,9 +37906,9 @@ _tmp_173_rule(Parser *p) return _res; } -// _tmp_174: expressions ['as' star_target] +// _tmp_175: expressions ['as' star_target] static void * -_tmp_174_rule(Parser *p) +_tmp_175_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37740,22 +37924,22 @@ _tmp_174_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_176_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_177_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_174[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_174[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -37764,9 +37948,9 @@ _tmp_174_rule(Parser *p) return _res; } -// _tmp_175: ',' bitwise_or +// _tmp_176: ',' bitwise_or static void * -_tmp_175_rule(Parser *p) +_tmp_176_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37782,7 +37966,7 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' bitwise_or")); + D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' bitwise_or")); Token * _literal; expr_ty bitwise_or_var; if ( @@ -37791,12 +37975,12 @@ _tmp_175_rule(Parser *p) (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' bitwise_or")); + D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' bitwise_or")); _res = _PyPegen_dummy_name(p, _literal, bitwise_or_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' bitwise_or")); } _res = NULL; @@ -37805,9 +37989,9 @@ _tmp_175_rule(Parser *p) return _res; } -// _tmp_176: 'as' star_target +// _tmp_177: 'as' star_target static void * -_tmp_176_rule(Parser *p) +_tmp_177_rule(Parser *p) { if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) { _Pypegen_stack_overflow(p); @@ -37823,7 +38007,7 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -37832,12 +38016,12 @@ _tmp_176_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; diff --git a/Parser/pegen.h b/Parser/pegen.h index 804f931871aec8..dfa2b0b4fe726c 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -351,6 +351,7 @@ expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_expr_seq *, asdl_seq *, expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok); expr_ty _PyPegen_decoded_constant_from_token(Parser* p, Token* tok); expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok); +expr_ty _PyPegen_concatenate_tstrings(Parser *p, asdl_expr_seq *, int, int, int, int, PyArena *); expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *, int, int, int, int, PyArena *); expr_ty _PyPegen_FetchRawForm(Parser *p, int, int, int, int); expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty); diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 557c12cfda61ff..c25699978cf651 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -663,27 +663,15 @@ build_ftstring_body(asdl_expr_seq *values, bool is_format_spec) } static int -_write_values_subarray(PyUnicodeWriter *writer, asdl_expr_seq *values, Py_ssize_t first_idx, - Py_ssize_t last_idx, char prefix, PyArena *arena) +append_templatestr(PyUnicodeWriter *writer, expr_ty e) { int result = -1; - - asdl_expr_seq *new_values = _Py_asdl_expr_seq_new(last_idx - first_idx + 1, arena); - if (!new_values) { - return result; - } - - Py_ssize_t j = 0; - for (Py_ssize_t i = first_idx; i <= last_idx; ++i) { - asdl_seq_SET(new_values, j++, asdl_seq_GET(values, i)); - } - - PyObject *body = build_ftstring_body(new_values, false); + PyObject *body = build_ftstring_body(e->v.TemplateStr.values, false); if (!body) { - return result; + return -1; } - if (-1 != append_char(writer, prefix) && + if (-1 != append_charp(writer, "t") && -1 != append_repr(writer, body)) { result = 0; @@ -692,72 +680,6 @@ _write_values_subarray(PyUnicodeWriter *writer, asdl_expr_seq *values, Py_ssize_ return result; } -static int -append_templatestr(PyUnicodeWriter *writer, expr_ty e) -{ - PyArena *arena = _PyArena_New(); - if (!arena) { - return -1; - } - - Py_ssize_t last_idx = 0; - Py_ssize_t len = asdl_seq_LEN(e->v.TemplateStr.values); - if (len == 0) { - int result = _write_values_subarray(writer, e->v.TemplateStr.values, - 0, len - 1, 't', arena); - _PyArena_Free(arena); - return result; - } - - for (Py_ssize_t i = 0; i < len; i++) { - expr_ty value = asdl_seq_GET(e->v.TemplateStr.values, i); - - // Handle implicit concat of t-strings with f-strings - if (value->kind == FormattedValue_kind) { - if (i > last_idx) { - // Create a new TemplateStr with the values between last_idx and i - // and append it to the writer. - if (_write_values_subarray(writer, e->v.TemplateStr.values, - last_idx, i - 1, 't', arena) == -1) { - goto error; - } - - if (append_charp(writer, " ") == -1) { - goto error; - } - } - - // Append the FormattedValue to the writer. - if (_write_values_subarray(writer, e->v.TemplateStr.values, - i, i, 'f', arena) == -1) { - goto error; - } - - if (i + 1 < len) { - if (append_charp(writer, " ") == -1) { - goto error; - } - } - - last_idx = i + 1; - } - } - - if (last_idx < len) { - if (_write_values_subarray(writer, e->v.TemplateStr.values, - last_idx, len - 1, 't', arena) == -1) { - goto error; - } - } - _PyArena_Free(arena); - - return 0; - -error: - _PyArena_Free(arena); - return -1; -} - static int append_joinedstr(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) { diff --git a/Python/codegen.c b/Python/codegen.c index b3dbed7096489b..0488008cd7f16c 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -4070,16 +4070,6 @@ codegen_template_str(compiler *c, expr_ty e) } else { VISIT(c, expr, value); - Py_ssize_t j; - for (j = i + 1; j < value_count; j++) { - value = asdl_seq_GET(e->v.TemplateStr.values, j); - if (value->kind == Interpolation_kind) { - break; - } - VISIT(c, expr, value); - ADDOP_INPLACE(c, loc, Add); - } - i = j - 1; stringslen++; last_was_interpolation = 0; } From 11378e1c859d5601bb08a43ec1c8902bf2428c90 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 18:04:13 +0200 Subject: [PATCH 0685/1674] [3.14] gh-135621: Simplify TermInfo (GH-136916) (#136925) --- Lib/_pyrepl/terminfo.py | 108 ++++++++++++---------------------------- 1 file changed, 33 insertions(+), 75 deletions(-) diff --git a/Lib/_pyrepl/terminfo.py b/Lib/_pyrepl/terminfo.py index 063a285bb9900c..d02ef69cce0bd8 100644 --- a/Lib/_pyrepl/terminfo.py +++ b/Lib/_pyrepl/terminfo.py @@ -71,7 +71,6 @@ "OTGV", "OTGC","meml", "memu", "box1" ) # fmt: on -_STRING_CAPABILITY_NAMES = {name: i for i, name in enumerate(_STRING_NAMES)} def _get_terminfo_dirs() -> list[Path]: @@ -322,10 +321,6 @@ class TermInfo: terminal_name: str | bytes | None fallback: bool = True - _names: list[str] = field(default_factory=list) - _booleans: list[int] = field(default_factory=list) - _numbers: list[int] = field(default_factory=list) - _strings: list[bytes | None] = field(default_factory=list) _capabilities: dict[str, bytes] = field(default_factory=dict) def __post_init__(self) -> None: @@ -362,9 +357,12 @@ def __post_init__(self) -> None: def _parse_terminfo_file(self, terminal_name: str) -> None: """Parse a terminfo file. + Populate the _capabilities dict for easy retrieval + Based on ncurses implementation in: - ncurses/tinfo/read_entry.c:_nc_read_termtype() - ncurses/tinfo/read_entry.c:_nc_read_file_entry() + - ncurses/tinfo/lib_ti.c:tigetstr() """ data = _read_terminfo_file(terminal_name) too_short = f"TermInfo file for {terminal_name!r} too short" @@ -377,53 +375,36 @@ def _parse_terminfo_file(self, terminal_name: str) -> None: ) if magic == MAGIC16: - number_format = " len(data): - raise ValueError(too_short) - names = data[offset : offset + name_size - 1].decode( - "ascii", errors="ignore" - ) + # Skip data than PyREPL doesn't need: + # - names (`|`-separated ASCII strings) + # - boolean capabilities (bytes with value 0 or 1) + # - numbers (little-endian integers, `number_size` bytes each) offset += name_size - - # Read boolean capabilities - if offset + bool_count > len(data): - raise ValueError(too_short) - booleans = list(data[offset : offset + bool_count]) offset += bool_count - - # Align to even byte boundary for numbers if offset % 2: + # Align to even byte boundary for numbers offset += 1 - - # Read numeric capabilities - numbers = [] - for i in range(num_count): - if offset + number_size > len(data): - raise ValueError(too_short) - num = struct.unpack( - number_format, data[offset : offset + number_size] - )[0] - numbers.append(num) - offset += number_size + offset += num_count * number_size + if offset > len(data): + raise ValueError(too_short) # Read string offsets - string_offsets = [] - for i in range(str_count): - if offset + 2 > len(data): - raise ValueError(too_short) - off = struct.unpack(" len(data): + raise ValueError(too_short) + string_offset_data = data[offset:end_offset] + string_offsets = [ + off for [off] in struct.iter_unpack(" len(data): @@ -431,53 +412,30 @@ def _parse_terminfo_file(self, terminal_name: str) -> None: string_table = data[offset : offset + str_size] # Extract strings from string table - strings: list[bytes | None] = [] - for off in string_offsets: + capabilities = {} + for cap, off in zip(_STRING_NAMES, string_offsets): if off < 0: - strings.append(CANCELLED_STRING) + # CANCELLED_STRING; we do not store those + continue elif off < len(string_table): # Find null terminator - end = off - while end < len(string_table) and string_table[end] != 0: - end += 1 - if end <= len(string_table): - strings.append(string_table[off:end]) - else: - strings.append(ABSENT_STRING) - else: - strings.append(ABSENT_STRING) - - self._names = names.split("|") - self._booleans = booleans - self._numbers = numbers - self._strings = strings + end = string_table.find(0, off) + if end >= 0: + capabilities[cap] = string_table[off:end] + # in other cases this is ABSENT_STRING; we don't store those. - def get(self, cap: str) -> bytes | None: - """Get terminal capability string by name. + # Note: we don't support extended capabilities since PyREPL doesn't + # need them. - Based on ncurses implementation in: - - ncurses/tinfo/lib_ti.c:tigetstr() + self._capabilities = capabilities - The ncurses version searches through compiled terminfo data structures. - This version first checks parsed terminfo data, then falls back to - hardcoded capabilities. + def get(self, cap: str) -> bytes | None: + """Get terminal capability string by name. """ if not isinstance(cap, str): raise TypeError(f"`cap` must be a string, not {type(cap)}") - if self._capabilities: - # Fallbacks populated, use them - return self._capabilities.get(cap) - - # Look up in standard capabilities first - if cap in _STRING_CAPABILITY_NAMES: - index = _STRING_CAPABILITY_NAMES[cap] - if index < len(self._strings): - return self._strings[index] - - # Note: we don't support extended capabilities since PyREPL doesn't - # need them. - return None + return self._capabilities.get(cap) def tparm(cap_bytes: bytes, *params: int) -> bytes: From f86a59549b4b819d1eb825e5b87c9230d8b5822b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 18:58:27 +0200 Subject: [PATCH 0686/1674] [3.14] Pedantic rewording of why relative importing doesn't work in main modules (GH-136846) (#136940) Pedantic rewording of why relative importing doesn't work in main modules (GH-136846) Pedantically reword the section about relative imports and main modules. (cherry picked from commit 4b68289ca6954b8d135e2ee2344e67fae38239fd) Co-authored-by: Josh Cannon --- Doc/tutorial/modules.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index 47bf7547b4ae1d..f8105cd5441fec 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -579,8 +579,8 @@ module for example, you might use:: from .. import formats from ..filters import equalizer -Note that relative imports are based on the name of the current module. Since -the name of the main module is always ``"__main__"``, modules intended for use +Note that relative imports are based on the name of the current module's package. +Since the main module does not have a package, modules intended for use as the main module of a Python application must always use absolute imports. From aa17c393397fe582f22d3c449b2dff84ba881537 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:07:56 +0200 Subject: [PATCH 0687/1674] [3.14] gh-136437: Document some `os.path` functions as requiring pos-only (GH-136812) (#136944) gh-136437: Document some `os.path` functions as requiring pos-only (GH-136812) (cherry picked from commit b5428bb0e786f5b67c6077472c0068cadd0b5ea9) Co-authored-by: sobolevn --- Doc/library/os.path.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 3f2574e55699bf..734b6ef5d5d57c 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -64,7 +64,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: basename(path) +.. function:: basename(path, /) Return the base name of pathname *path*. This is the second element of the pair returned by passing *path* to the function :func:`split`. Note that @@ -237,7 +237,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: isabs(path) +.. 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 two (back)slashes, or a @@ -261,7 +261,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: isdir(path) +.. function:: isdir(path, /) Return ``True`` if *path* is an :func:`existing ` directory. This follows symbolic links, so both :func:`islink` and :func:`isdir` can be true @@ -372,7 +372,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object` for *path* and *paths*. -.. function:: normcase(path) +.. function:: normcase(path, /) Normalize the case of a pathname. On Windows, convert all characters in the pathname to lowercase, and also convert forward slashes to backward slashes. @@ -509,7 +509,7 @@ the :mod:`glob` module.) Added Windows support. -.. function:: split(path) +.. function:: split(path, /) Split the pathname *path* into a pair, ``(head, tail)`` where *tail* is the last pathname component and *head* is everything leading up to that. The @@ -525,7 +525,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: splitdrive(path) +.. function:: splitdrive(path, /) Split the pathname *path* into a pair ``(drive, tail)`` where *drive* is either a mount point or the empty string. On systems which do not use drive @@ -550,7 +550,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: splitroot(path) +.. function:: splitroot(path, /) Split the pathname *path* into a 3-item tuple ``(drive, root, tail)`` where *drive* is a device name or mount point, *root* is a string of separators @@ -583,7 +583,7 @@ the :mod:`glob` module.) .. versionadded:: 3.12 -.. function:: splitext(path) +.. function:: splitext(path, /) Split the pathname *path* into a pair ``(root, ext)`` such that ``root + ext == path``, and the extension, *ext*, is empty or begins with a period and contains at From 81edfb7140074bac3407c175664281e7aaad046a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:08:07 +0200 Subject: [PATCH 0688/1674] [3.14] GH-136874: `url2pathname()`: discard query and fragment components (GH-136875) (#136942) GH-136874: `url2pathname()`: discard query and fragment components (GH-136875) In `urllib.request.url2pathname()`, ignore any query or fragment components in the given URL. (cherry picked from commit 80b2d60a51cfd824d025eb8b3ec500acce5c010c) Co-authored-by: Barney Gale --- Doc/library/urllib.request.rst | 3 +++ Doc/whatsnew/3.14.rst | 1 + Lib/test/test_urllib.py | 8 ++++++++ Lib/urllib/request.py | 10 +++++----- .../2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst | 1 + 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 58bd111b5cc374..016bc777fbb232 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -210,6 +210,9 @@ The :mod:`urllib.request` module defines the following functions: Windows a UNC path is returned (as before), and on other platforms a :exc:`~urllib.error.URLError` is raised. + .. versionchanged:: 3.14 + The URL query and fragment components are discarded if present. + .. versionchanged:: 3.14 The *require_scheme* and *resolve_host* parameters were added. diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index d58f7ecf02ce6b..630d011ffbbd1f 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -2192,6 +2192,7 @@ urllib - Discard URL authority if it matches the local hostname. - Discard URL authority if it resolves to a local IP address when the new *resolve_host* argument is set to true. + - Discard URL query and fragment components. - Raise :exc:`~urllib.error.URLError` if a URL authority isn't local, except on Windows where we return a UNC path as before. diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 1d889ae7cf458f..c30fb5e27eea8a 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1526,6 +1526,14 @@ def test_url2pathname(self): self.assertEqual(fn('////foo/bar'), f'{sep}{sep}foo{sep}bar') self.assertEqual(fn('data:blah'), 'data:blah') self.assertEqual(fn('data://blah'), f'data:{sep}{sep}blah') + self.assertEqual(fn('foo?bar'), 'foo') + self.assertEqual(fn('foo#bar'), 'foo') + self.assertEqual(fn('foo?bar=baz'), 'foo') + self.assertEqual(fn('foo?bar#baz'), 'foo') + self.assertEqual(fn('foo%3Fbar'), 'foo?bar') + self.assertEqual(fn('foo%23bar'), 'foo#bar') + self.assertEqual(fn('foo%3Fbar%3Dbaz'), 'foo?bar=baz') + self.assertEqual(fn('foo%3Fbar%23baz'), 'foo?bar#baz') def test_url2pathname_require_scheme(self): sep = os.path.sep diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 41dc5d7b35dedb..c1c373d08815c1 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1654,11 +1654,11 @@ def url2pathname(url, *, require_scheme=False, resolve_host=False): The URL authority may be resolved with gethostbyname() if *resolve_host* is set to true. """ - if require_scheme: - scheme, url = _splittype(url) - if scheme != 'file': - raise URLError("URL is missing a 'file:' scheme") - authority, url = _splithost(url) + if not require_scheme: + url = 'file:' + url + scheme, authority, url = urlsplit(url)[:3] # Discard query and fragment. + if scheme != 'file': + raise URLError("URL is missing a 'file:' scheme") if os.name == 'nt': if not _is_local_authority(authority, resolve_host): # e.g. file://server/share/file.txt diff --git a/Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst b/Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst new file mode 100644 index 00000000000000..9a71eb8ef1ac8d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst @@ -0,0 +1 @@ +Discard URL query and fragment in :func:`urllib.request.url2pathname`. From fa9a369044860d720387573eea5f709658146211 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:29:22 +0200 Subject: [PATCH 0689/1674] [3.14] gh-136437: Document `os.path.dirname` as accepting only pos-only (GH-136946) (#136947) gh-136437: Document `os.path.dirname` as accepting only pos-only (GH-136946) (cherry picked from commit 322442945084ea9055f86a17fa5096b11ba5b344) Co-authored-by: sobolevn --- Doc/library/os.path.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 734b6ef5d5d57c..2ce1bd29d373ff 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -118,7 +118,7 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: dirname(path) +.. function:: dirname(path, /) Return the directory name of pathname *path*. This is the first element of the pair returned by passing *path* to the function :func:`split`. From 893707c53852150e65068fcf80ac5469bde0c0ee Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 21 Jul 2025 21:34:24 +0300 Subject: [PATCH 0690/1674] [3.14] gh-135661: Fix parsing attributes with whitespaces around the "=" separator in HTMLParser (GH-136908) (#136927) --- Lib/html/parser.py | 4 +-- Lib/test/test_htmlparser.py | 28 +++++++++++-------- Misc/NEWS.d/3.14.0b4.rst | 2 +- ...-07-21-14-15-25.gh-issue-135661.nAxXw5.rst | 2 ++ 4 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst diff --git a/Lib/html/parser.py b/Lib/html/parser.py index 9b4f09599134bd..7eea885cfe63c5 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -45,7 +45,7 @@ ( (?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name ) - (= # value indicator + ([\t\n\r\f ]*=[\t\n\r\f ]* # value indicator ('[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value @@ -57,7 +57,7 @@ [a-zA-Z][^\t\n\r\f />]* # tag name [\t\n\r\f /]* # optional whitespace before attribute name (?:(?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name - (?:= # value indicator + (?:[\t\n\r\f ]*=[\t\n\r\f ]* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 15cad061889a79..47c0752fb517b9 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -623,7 +623,7 @@ def test_correct_detection_of_start_tags(self): html = '
The rain' expected = [ - ('starttag', 'div', [('style', ''), (',', None), ('foo', None), ('=', None), ('"bar"', None)]), + ('starttag', 'div', [('style', ''), (',', None), ('foo', 'bar')]), ('starttag', 'b', []), ('data', 'The '), ('starttag', 'a', [('href', 'some_url')]), @@ -813,12 +813,12 @@ def test_attr_syntax(self): ] self._run_check("""""", output) self._run_check("", [('starttag', 'a', [('foo', '=bar')])]) - self._run_check("", [('starttag', 'a', [('foo', None), ('=bar', None)])]) - self._run_check("", [('starttag', 'a', [('foo', None), ('=bar', None)])]) + self._run_check("", [('starttag', 'a', [('foo', 'bar')])]) + self._run_check("", [('starttag', 'a', [('foo', 'bar')])]) self._run_check("", [('starttag', 'a', [('foo\v', 'bar')])]) self._run_check("", [('starttag', 'a', [('foo\xa0', 'bar')])]) - self._run_check("", [('starttag', 'a', [('foo', ''), ('bar', None)])]) - self._run_check("", [('starttag', 'a', [('foo', ''), ('bar', None)])]) + self._run_check("", [('starttag', 'a', [('foo', 'bar')])]) + self._run_check("", [('starttag', 'a', [('foo', 'bar')])]) self._run_check("", [('starttag', 'a', [('foo', '\vbar')])]) self._run_check("", [('starttag', 'a', [('foo', '\xa0bar')])]) @@ -829,8 +829,8 @@ def test_attr_values(self): ("d", "\txyz\n")])]) self._run_check("""""", [("starttag", "a", [("b", ""), ("c", "")])]) - self._run_check("", - [("starttag", "a", [("b", ""), ("c", "")])]) + self._run_check("", + [('starttag', 'a', [('b', 'x'), ('c', 'y')])]) self._run_check("", [("starttag", "a", [("b", "\v"), ("c", "\xa0")])]) # Regression test for SF patch #669683. @@ -899,13 +899,17 @@ def test_malformed_attributes(self): ) expected = [ ('starttag', 'a', [('href', "test'style='color:red;bad1'")]), - ('data', 'test - bad1'), ('endtag', 'a'), + ('data', 'test - bad1'), + ('endtag', 'a'), ('starttag', 'a', [('href', "test'+style='color:red;ba2'")]), - ('data', 'test - bad2'), ('endtag', 'a'), + ('data', 'test - bad2'), + ('endtag', 'a'), ('starttag', 'a', [('href', "test'\xa0style='color:red;bad3'")]), - ('data', 'test - bad3'), ('endtag', 'a'), - ('starttag', 'a', [('href', None), ('=', None), ("test' style", 'color:red;bad4')]), - ('data', 'test - bad4'), ('endtag', 'a') + ('data', 'test - bad3'), + ('endtag', 'a'), + ('starttag', 'a', [('href', "test'\xa0style='color:red;bad4'")]), + ('data', 'test - bad4'), + ('endtag', 'a'), ] self._run_check(html, expected) diff --git a/Misc/NEWS.d/3.14.0b4.rst b/Misc/NEWS.d/3.14.0b4.rst index b96f96caa3f280..349023ec75865d 100644 --- a/Misc/NEWS.d/3.14.0b4.rst +++ b/Misc/NEWS.d/3.14.0b4.rst @@ -75,7 +75,7 @@ to the HTML5 standard. * Multiple ``=`` between attribute name and value are no longer collapsed. E.g. ```` produces attribute "foo" with value "=bar". -* Whitespaces between the ``=`` separator and attribute name or value are no +* [Reverted in :gh:`136927`] Whitespaces between the ``=`` separator and attribute name or value are no longer ignored. E.g. ```` produces two attributes "foo" and "=bar", both with value None; ```` produces two attributes: "foo" with value "" and "bar" with value None. diff --git a/Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst b/Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst new file mode 100644 index 00000000000000..533e4df8626b90 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst @@ -0,0 +1,2 @@ +Fix parsing attributes with whitespaces around the ``=`` separator in +:class:`html.parser.HTMLParser` according to the HTML5 standard. From 718fc5b1393d9ce52fc0353fb361818e865e3e45 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 21 Jul 2025 23:01:14 +0200 Subject: [PATCH 0691/1674] [3.14] gh-136870: fix data race in `PyThreadState_Clear` on `sys_tracing_threads` (GH-136951) (#136953) gh-136870: fix data race in `PyThreadState_Clear` on `sys_tracing_threads` (GH-136951) In free-threading, multiple threads can be cleared concurrently as such the modifications on `sys_tracing_threads` should be done while holding the profile lock, otherwise it can race with other threads setting up profiling. (cherry picked from commit f183996eb77fd2d5662c62667298c292c943ebf5) Co-authored-by: Kumar Aditya --- Python/pystate.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Python/pystate.c b/Python/pystate.c index 015e9f8725c1af..aa2c4bd51814c3 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1793,6 +1793,10 @@ PyThreadState_Clear(PyThreadState *tstate) "PyThreadState_Clear: warning: thread still has a generator\n"); } +#ifdef Py_GIL_DISABLED + PyMutex_Lock(&_PyRuntime.ceval.sys_trace_profile_mutex); +#endif + if (tstate->c_profilefunc != NULL) { tstate->interp->sys_profiling_threads--; tstate->c_profilefunc = NULL; @@ -1801,6 +1805,11 @@ PyThreadState_Clear(PyThreadState *tstate) tstate->interp->sys_tracing_threads--; tstate->c_tracefunc = NULL; } + +#ifdef Py_GIL_DISABLED + PyMutex_Unlock(&_PyRuntime.ceval.sys_trace_profile_mutex); +#endif + Py_CLEAR(tstate->c_profileobj); Py_CLEAR(tstate->c_traceobj); From ecd97caaf5923764d22f6bd29339b8416c0c1917 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 01:23:05 +0200 Subject: [PATCH 0692/1674] [3.14] gh-136421: Load `_datetime` static types during interpreter initialization (GH-136583) (GH-136943) gh-136421: Load `_datetime` static types during interpreter initialization (GH-136583) `_datetime` is a special module, because it's the only non-builtin C extension that contains static types. As such, it would initialize static types in the module's execution function, which can run concurrently. Since static type initialization is not thread-safe, this caused crashes. This fixes it by moving the initialization of `_datetime`'s static types to interpreter startup (where all other static types are initialized), which is already properly protected through other locks. (cherry picked from commit a10960699a2b3e4e62896331c4f9cfd162ebf440) Co-authored-by: Peter Bierma --- Include/internal/pycore_pylifecycle.h | 1 + Lib/test/datetimetester.py | 28 +++ ...-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst | 1 + Modules/Setup.bootstrap.in | 2 + Modules/Setup.stdlib.in | 3 - Modules/_datetimemodule.c | 165 ++++++++---------- PCbuild/_freeze_module.vcxproj | 1 + Python/pylifecycle.c | 5 + 8 files changed, 111 insertions(+), 95 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 6e89ca33e4208c..8faf7a4d403f84 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -41,6 +41,7 @@ extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyGC_Init(PyInterpreterState *interp); extern PyStatus _PyAtExit_Init(PyInterpreterState *interp); +extern PyStatus _PyDateTime_InitTypes(PyInterpreterState *interp); /* Various internal finalizers */ diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 1b551254f86c32..1c1cbd03d02ccc 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -7275,6 +7275,34 @@ def test_update_type_cache(self): """) script_helper.assert_python_ok('-c', script) + def test_concurrent_initialization_subinterpreter(self): + # gh-136421: Concurrent initialization of _datetime across multiple + # interpreters wasn't thread-safe due to its static types. + + # Run in a subprocess to ensure we get a clean version of _datetime + script = """if True: + from concurrent.futures import InterpreterPoolExecutor + + def func(): + import _datetime + print('a', end='') + + with InterpreterPoolExecutor() as executor: + for _ in range(8): + executor.submit(func) + """ + rc, out, err = script_helper.assert_python_ok("-c", script) + self.assertEqual(rc, 0) + self.assertEqual(out, b"a" * 8) + self.assertEqual(err, b"") + + # Now test against concurrent reinitialization + script = "import _datetime\n" + script + rc, out, err = script_helper.assert_python_ok("-c", script) + self.assertEqual(rc, 0) + self.assertEqual(out, b"a" * 8) + self.assertEqual(err, b"") + def load_tests(loader, standard_tests, pattern): standard_tests.addTest(ZoneInfoCompleteTest()) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst new file mode 100644 index 00000000000000..dcc73267a78546 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst @@ -0,0 +1 @@ +Fix crash when initializing :mod:`datetime` concurrently. diff --git a/Modules/Setup.bootstrap.in b/Modules/Setup.bootstrap.in index 2b2e8cb3e3cacd..65a1fefe72e92e 100644 --- a/Modules/Setup.bootstrap.in +++ b/Modules/Setup.bootstrap.in @@ -12,6 +12,8 @@ posix posixmodule.c _signal signalmodule.c _tracemalloc _tracemalloc.c _suggestions _suggestions.c +# needs libm and on some platforms librt +_datetime _datetimemodule.c # modules used by importlib, deepfreeze, freeze, runpy, and sysconfig _codecs _codecsmodule.c diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index 3a38a60a152e8c..905ea4aa2e57a9 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -56,9 +56,6 @@ @MODULE_CMATH_TRUE@cmath cmathmodule.c @MODULE__STATISTICS_TRUE@_statistics _statisticsmodule.c -# needs libm and on some platforms librt -@MODULE__DATETIME_TRUE@_datetime _datetimemodule.c - # _decimal uses libmpdec # either static libmpdec.a from Modules/_decimal/libmpdec or libmpdec.so # with ./configure --with-system-libmpdec diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index f5a9712b64e4de..c4bb44f1234990 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -14,6 +14,7 @@ #include "pycore_object.h" // _PyObject_Init() #include "pycore_time.h" // _PyTime_ObjectToTime_t() #include "pycore_unicodeobject.h" // _PyUnicode_Copy() +#include "pycore_initconfig.h" // _PyStatus_OK() #include "datetime.h" @@ -124,10 +125,9 @@ get_module_state(PyObject *module) #define INTERP_KEY ((PyObject *)&_Py_ID(cached_datetime_module)) static PyObject * -get_current_module(PyInterpreterState *interp, int *p_reloading) +get_current_module(PyInterpreterState *interp) { PyObject *mod = NULL; - int reloading = 0; PyObject *dict = PyInterpreterState_GetDict(interp); if (dict == NULL) { @@ -138,7 +138,6 @@ get_current_module(PyInterpreterState *interp, int *p_reloading) goto error; } if (ref != NULL) { - reloading = 1; if (ref != Py_None) { (void)PyWeakref_GetRef(ref, &mod); if (mod == Py_None) { @@ -147,9 +146,6 @@ get_current_module(PyInterpreterState *interp, int *p_reloading) Py_DECREF(ref); } } - if (p_reloading != NULL) { - *p_reloading = reloading; - } return mod; error: @@ -163,7 +159,7 @@ static datetime_state * _get_current_state(PyObject **p_mod) { PyInterpreterState *interp = PyInterpreterState_Get(); - PyObject *mod = get_current_module(interp, NULL); + PyObject *mod = get_current_module(interp); if (mod == NULL) { assert(!PyErr_Occurred()); if (PyErr_Occurred()) { @@ -4476,7 +4472,7 @@ static PyTypeObject PyDateTime_TimeZoneType = { timezone_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ - 0, /* tp_base; filled in PyInit__datetime */ + &PyDateTime_TZInfoType, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ @@ -7131,8 +7127,7 @@ static PyTypeObject PyDateTime_DateTimeType = { datetime_methods, /* tp_methods */ 0, /* tp_members */ datetime_getset, /* tp_getset */ - 0, /* tp_base; filled in - PyInit__datetime */ + &PyDateTime_DateType, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ @@ -7313,29 +7308,82 @@ clear_state(datetime_state *st) } -static int -init_static_types(PyInterpreterState *interp, int reloading) +PyStatus +_PyDateTime_InitTypes(PyInterpreterState *interp) { - if (reloading) { - return 0; - } - - // `&...` is not a constant expression according to a strict reading - // of C standards. Fill tp_base at run-time rather than statically. - // See https://bugs.python.org/issue40777 - PyDateTime_TimeZoneType.tp_base = &PyDateTime_TZInfoType; - PyDateTime_DateTimeType.tp_base = &PyDateTime_DateType; - /* Bases classes must be initialized before subclasses, * so capi_types must have the types in the appropriate order. */ for (size_t i = 0; i < Py_ARRAY_LENGTH(capi_types); i++) { PyTypeObject *type = capi_types[i]; if (_PyStaticType_InitForExtension(interp, type) < 0) { - return -1; + return _PyStatus_ERR("could not initialize static types"); } } - return 0; +#define DATETIME_ADD_MACRO(dict, c, value_expr) \ + do { \ + assert(!PyErr_Occurred()); \ + PyObject *value = (value_expr); \ + if (value == NULL) { \ + goto error; \ + } \ + if (PyDict_SetItemString(dict, c, value) < 0) { \ + Py_DECREF(value); \ + goto error; \ + } \ + Py_DECREF(value); \ + } while(0) + + /* timedelta values */ + PyObject *d = _PyType_GetDict(&PyDateTime_DeltaType); + DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); + DATETIME_ADD_MACRO(d, "min", new_delta(-MAX_DELTA_DAYS, 0, 0, 0)); + DATETIME_ADD_MACRO(d, "max", + new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0)); + + /* date values */ + d = _PyType_GetDict(&PyDateTime_DateType); + DATETIME_ADD_MACRO(d, "min", new_date(1, 1, 1)); + DATETIME_ADD_MACRO(d, "max", new_date(MAXYEAR, 12, 31)); + DATETIME_ADD_MACRO(d, "resolution", new_delta(1, 0, 0, 0)); + + /* time values */ + d = _PyType_GetDict(&PyDateTime_TimeType); + DATETIME_ADD_MACRO(d, "min", new_time(0, 0, 0, 0, Py_None, 0)); + DATETIME_ADD_MACRO(d, "max", new_time(23, 59, 59, 999999, Py_None, 0)); + DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); + + /* datetime values */ + d = _PyType_GetDict(&PyDateTime_DateTimeType); + DATETIME_ADD_MACRO(d, "min", + new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None, 0)); + DATETIME_ADD_MACRO(d, "max", new_datetime(MAXYEAR, 12, 31, 23, 59, 59, + 999999, Py_None, 0)); + DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); + + /* timezone values */ + d = _PyType_GetDict(&PyDateTime_TimeZoneType); + if (PyDict_SetItemString(d, "utc", (PyObject *)&utc_timezone) < 0) { + goto error; + } + + /* bpo-37642: These attributes are rounded to the nearest minute for backwards + * compatibility, even though the constructor will accept a wider range of + * values. This may change in the future.*/ + + /* -23:59 */ + DATETIME_ADD_MACRO(d, "min", create_timezone_from_delta(-1, 60, 0, 1)); + + /* +23:59 */ + DATETIME_ADD_MACRO( + d, "max", create_timezone_from_delta(0, (23 * 60 + 59) * 60, 0, 0)); + +#undef DATETIME_ADD_MACRO + + return _PyStatus_OK(); + +error: + return _PyStatus_NO_MEMORY(); } @@ -7353,20 +7401,15 @@ _datetime_exec(PyObject *module) { int rc = -1; datetime_state *st = get_module_state(module); - int reloading = 0; PyInterpreterState *interp = PyInterpreterState_Get(); - PyObject *old_module = get_current_module(interp, &reloading); + PyObject *old_module = get_current_module(interp); if (PyErr_Occurred()) { assert(old_module == NULL); goto error; } /* We actually set the "current" module right before a successful return. */ - if (init_static_types(interp, reloading) < 0) { - goto error; - } - for (size_t i = 0; i < Py_ARRAY_LENGTH(capi_types); i++) { PyTypeObject *type = capi_types[i]; const char *name = _PyType_Name(type); @@ -7380,68 +7423,6 @@ _datetime_exec(PyObject *module) goto error; } -#define DATETIME_ADD_MACRO(dict, c, value_expr) \ - do { \ - assert(!PyErr_Occurred()); \ - PyObject *value = (value_expr); \ - if (value == NULL) { \ - goto error; \ - } \ - if (PyDict_SetItemString(dict, c, value) < 0) { \ - Py_DECREF(value); \ - goto error; \ - } \ - Py_DECREF(value); \ - } while(0) - - if (!reloading) { - /* timedelta values */ - PyObject *d = _PyType_GetDict(&PyDateTime_DeltaType); - DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); - DATETIME_ADD_MACRO(d, "min", new_delta(-MAX_DELTA_DAYS, 0, 0, 0)); - DATETIME_ADD_MACRO(d, "max", - new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0)); - - /* date values */ - d = _PyType_GetDict(&PyDateTime_DateType); - DATETIME_ADD_MACRO(d, "min", new_date(1, 1, 1)); - DATETIME_ADD_MACRO(d, "max", new_date(MAXYEAR, 12, 31)); - DATETIME_ADD_MACRO(d, "resolution", new_delta(1, 0, 0, 0)); - - /* time values */ - d = _PyType_GetDict(&PyDateTime_TimeType); - DATETIME_ADD_MACRO(d, "min", new_time(0, 0, 0, 0, Py_None, 0)); - DATETIME_ADD_MACRO(d, "max", new_time(23, 59, 59, 999999, Py_None, 0)); - DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); - - /* datetime values */ - d = _PyType_GetDict(&PyDateTime_DateTimeType); - DATETIME_ADD_MACRO(d, "min", - new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None, 0)); - DATETIME_ADD_MACRO(d, "max", new_datetime(MAXYEAR, 12, 31, 23, 59, 59, - 999999, Py_None, 0)); - DATETIME_ADD_MACRO(d, "resolution", new_delta(0, 0, 1, 0)); - - /* timezone values */ - d = _PyType_GetDict(&PyDateTime_TimeZoneType); - if (PyDict_SetItemString(d, "utc", (PyObject *)&utc_timezone) < 0) { - goto error; - } - - /* bpo-37642: These attributes are rounded to the nearest minute for backwards - * compatibility, even though the constructor will accept a wider range of - * values. This may change in the future.*/ - - /* -23:59 */ - DATETIME_ADD_MACRO(d, "min", create_timezone_from_delta(-1, 60, 0, 1)); - - /* +23:59 */ - DATETIME_ADD_MACRO( - d, "max", create_timezone_from_delta(0, (23 * 60 + 59) * 60, 0, 0)); - } - -#undef DATETIME_ADD_MACRO - /* Add module level attributes */ if (PyModule_AddIntMacro(module, MINYEAR) < 0) { goto error; diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index efff6a58d895cb..5ceddf759b8f3b 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -106,6 +106,7 @@ + diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index c07862edf97d0b..352787c64958b2 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -760,6 +760,11 @@ pycore_init_types(PyInterpreterState *interp) return status; } + status = _PyDateTime_InitTypes(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + return _PyStatus_OK(); } From 4af1b72b31117896fd09c89063d136b51da76dbb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 02:22:57 +0200 Subject: [PATCH 0693/1674] [3.14] gh-133600: Move config.site-wasm32-emscripten into the emscripten folder (GH-136934) (#136956) Reorganises the large Emscripten-specific file into the Emscripten folder. (cherry picked from commit bbe589f93ccaf32eb95fd9d1f8f3dc9a536e8db1) Co-authored-by: Hood Chatham --- Tools/wasm/emscripten/__main__.py | 2 +- Tools/wasm/{ => emscripten}/config.site-wasm32-emscripten | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename Tools/wasm/{ => emscripten}/config.site-wasm32-emscripten (97%) diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index 1b31e36dd890b3..e552f6b680da9d 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -186,7 +186,7 @@ def make_emscripten_libffi(context, working_dir): def configure_emscripten_python(context, working_dir): """Configure the emscripten/host build.""" config_site = os.fsdecode( - CHECKOUT / "Tools" / "wasm" / "config.site-wasm32-emscripten" + EMSCRIPTEN_DIR / "config.site-wasm32-emscripten" ) emscripten_build_dir = working_dir.relative_to(CHECKOUT) diff --git a/Tools/wasm/config.site-wasm32-emscripten b/Tools/wasm/emscripten/config.site-wasm32-emscripten similarity index 97% rename from Tools/wasm/config.site-wasm32-emscripten rename to Tools/wasm/emscripten/config.site-wasm32-emscripten index 1471546a5eec17..8c3a338dacb2dc 100644 --- a/Tools/wasm/config.site-wasm32-emscripten +++ b/Tools/wasm/emscripten/config.site-wasm32-emscripten @@ -1,6 +1,6 @@ # config.site override for cross compiling to wasm32-emscripten platform # -# CONFIG_SITE=Tools/wasm/config.site-wasm32-emscripten \ +# CONFIG_SITE=Tools/wasm/emscripten/config.site-wasm32-emscripten \ # emconfigure ./configure --host=wasm32-unknown-emscripten --build=... # # Written by Christian Heimes From caef946a25aac557f13cb66fbc70f06225546e67 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 05:35:41 +0200 Subject: [PATCH 0694/1674] [3.14] gh-136170: Revert adding `ZipFile.data_offset` (GH-136950) (#136955) gh-136170: Revert adding `ZipFile.data_offset` (GH-136950) * Revert "gh-84481: Make ZipFile.data_offset more robust (GH-132178)" This reverts commit 6cd1d6c6b142697fb72f422b7b448c27ebc30534. * Revert "gh-84481: Add ZipFile.data_offset attribute (GH-132165)" This reverts commit 0788948dcb980c7648b29ca363390b696d7f188f. --------- (cherry picked from commit 6bf1c0ab3497b1b193812654bcdfd0c11b4192d8) Co-authored-by: Emma Smith Co-authored-by: Gregory P. Smith --- Doc/library/zipfile.rst | 8 --- Lib/test/test_zipfile/test_core.py | 54 ------------------- Lib/zipfile/__init__.py | 13 ----- ...-07-21-22-35-50.gh-issue-136170.QUlc78.rst | 3 ++ 4 files changed, 3 insertions(+), 75 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index bf9136a2139112..a1261ec471c92e 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -558,14 +558,6 @@ The following data attributes are also available: it should be no longer than 65535 bytes. Comments longer than this will be truncated. -.. attribute:: ZipFile.data_offset - - The offset to the start of ZIP data from the beginning of the file. When the - :class:`ZipFile` is opened in either mode ``'w'`` or ``'x'`` and the - underlying file does not support ``tell()``, the value will be ``None`` - instead. - - .. versionadded:: 3.14 .. _path-objects: diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index ada96813709aea..c033059a515db6 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -3470,60 +3470,6 @@ def test_execute_zip64(self): self.assertIn(b'number in executable: 5', output) -class TestDataOffsetPrependedZip(unittest.TestCase): - """Test .data_offset on reading zip files with an executable prepended.""" - - def setUp(self): - self.exe_zip = findfile('exe_with_zip', subdir='archivetestdata') - self.exe_zip64 = findfile('exe_with_z64', subdir='archivetestdata') - - def _test_data_offset(self, name): - with zipfile.ZipFile(name) as zipfp: - self.assertEqual(zipfp.data_offset, 713) - - def test_data_offset_with_exe_prepended(self): - self._test_data_offset(self.exe_zip) - - def test_data_offset_with_exe_prepended_zip64(self): - self._test_data_offset(self.exe_zip64) - -class TestDataOffsetZipWrite(unittest.TestCase): - """Test .data_offset for ZipFile opened in write mode.""" - - def setUp(self): - os.mkdir(TESTFNDIR) - self.addCleanup(rmtree, TESTFNDIR) - self.test_path = os.path.join(TESTFNDIR, 'testoffset.zip') - - def test_data_offset_write_no_prefix(self): - with io.BytesIO() as fp: - with zipfile.ZipFile(fp, "w") as zipfp: - self.assertEqual(zipfp.data_offset, 0) - - def test_data_offset_write_with_prefix(self): - with io.BytesIO() as fp: - fp.write(b"this is a prefix") - with zipfile.ZipFile(fp, "w") as zipfp: - self.assertEqual(zipfp.data_offset, 16) - - def test_data_offset_append_with_bad_zip(self): - with io.BytesIO() as fp: - fp.write(b"this is a prefix") - with zipfile.ZipFile(fp, "a") as zipfp: - self.assertEqual(zipfp.data_offset, 16) - - def test_data_offset_write_no_tell(self): - # The initializer in ZipFile checks if tell raises AttributeError or - # OSError when creating a file in write mode when deducing the offset - # of the beginning of zip data - class NoTellBytesIO(io.BytesIO): - def tell(self): - raise OSError("Unimplemented!") - with NoTellBytesIO() as fp: - with zipfile.ZipFile(fp, "w") as zipfp: - self.assertIsNone(zipfp.data_offset) - - class EncodedMetadataTests(unittest.TestCase): file_names = ['\u4e00', '\u4e8c', '\u4e09'] # Han 'one', 'two', 'three' file_content = [ diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py index 18caeb3e04a2b5..2969f735e8abb9 100644 --- a/Lib/zipfile/__init__.py +++ b/Lib/zipfile/__init__.py @@ -1452,7 +1452,6 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True, self._lock = threading.RLock() self._seekable = True self._writing = False - self._data_offset = None try: if mode == 'r': @@ -1463,7 +1462,6 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True, self._didModify = True try: self.start_dir = self.fp.tell() - self._data_offset = self.start_dir except (AttributeError, OSError): self.fp = _Tellable(self.fp) self.start_dir = 0 @@ -1488,7 +1486,6 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True, # even if no files are added to the archive self._didModify = True self.start_dir = self.fp.tell() - self._data_offset = self.start_dir else: raise ValueError("Mode must be 'r', 'w', 'x', or 'a'") except: @@ -1535,10 +1532,6 @@ def _RealGetContents(self): # self.start_dir: Position of start of central directory self.start_dir = offset_cd + concat - # store the offset to the beginning of data for the - # .data_offset property - self._data_offset = concat - if self.start_dir < 0: raise BadZipFile("Bad offset for central directory") fp.seek(self.start_dir, 0) @@ -1599,12 +1592,6 @@ def _RealGetContents(self): zinfo._end_offset = end_offset end_offset = zinfo.header_offset - @property - def data_offset(self): - """The offset to the start of zip data in the file or None if - unavailable.""" - return self._data_offset - def namelist(self): """Return a list of file names in the archive.""" return [data.filename for data in self.filelist] diff --git a/Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst b/Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst new file mode 100644 index 00000000000000..fd30fe156a1b32 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst @@ -0,0 +1,3 @@ +Removed the unreleased ``zipfile.ZipFile.data_offset`` property added in 3.14.0a7 +as it wasn't fully clear which behavior it should have in some situations so +the result was not always what a user might expect. From 6e1b31b87e7a42c7911b517b78fc418217e6480c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 07:08:15 +0200 Subject: [PATCH 0695/1674] [3.14] gh-135228: When @dataclass(slots=True) replaces a dataclass, make the original class collectible (GH-136893) (#136960) gh-135228: When @dataclass(slots=True) replaces a dataclass, make the original class collectible (GH-136893) An interesting hack, but more localized in scope than GH-135230. This may be a breaking change if people intentionally keep the original class around when using `@dataclass(slots=True)`, and then use `__dict__` or `__weakref__` on the original class. (cherry picked from commit 46cbdf967ada11b0286060488b61635fd6a2bb23) Co-authored-by: Jelle Zijlstra Co-authored-by: Alyssa Coghlan --- Lib/dataclasses.py | 15 ++++++++ Lib/test/test_dataclasses/__init__.py | 35 +++++++++++++++++++ ...-07-20-16-56-55.gh-issue-135228.n_XIao.rst | 4 +++ 3 files changed, 54 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 83ea623dce6281..22b78bb2fbe6ed 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1338,6 +1338,13 @@ def _add_slots(cls, is_frozen, weakref_slot, defined_fields): or _update_func_cell_for__class__(member.fdel, cls, newcls)): break + # gh-135228: Make sure the original class can be garbage collected. + # Bypass mapping proxy to allow __dict__ to be removed + old_cls_dict = cls.__dict__ | _deproxier + old_cls_dict.pop('__dict__', None) + if "__weakref__" in cls.__dict__: + del cls.__weakref__ + return newcls @@ -1732,3 +1739,11 @@ def _replace(self, /, **changes): # changes that aren't fields, this will correctly raise a # TypeError. return self.__class__(**changes) + + +# Hack to the get the underlying dict out of a mappingproxy +# Use it with: cls.__dict__ | _deproxier +class _Deproxier: + def __ror__(self, other): + return other +_deproxier = _Deproxier() diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index e98a8f284cec9f..6bf5e5b3e5554b 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -3804,6 +3804,41 @@ class WithCorrectSuper(CorrectSuper): # that we create internally. self.assertEqual(CorrectSuper.args, ["default", "default"]) + def test_original_class_is_gced(self): + # gh-135228: Make sure when we replace the class with slots=True, the original class + # gets garbage collected. + def make_simple(): + @dataclass(slots=True) + class SlotsTest: + pass + + return SlotsTest + + def make_with_annotations(): + @dataclass(slots=True) + class SlotsTest: + x: int + + return SlotsTest + + def make_with_annotations_and_method(): + @dataclass(slots=True) + class SlotsTest: + x: int + + def method(self) -> int: + return self.x + + return SlotsTest + + for make in (make_simple, make_with_annotations, make_with_annotations_and_method): + with self.subTest(make=make): + C = make() + support.gc_collect() + candidates = [cls for cls in object.__subclasses__() if cls.__name__ == 'SlotsTest' + and cls.__firstlineno__ == make.__code__.co_firstlineno + 1] + self.assertEqual(candidates, [C]) + class TestDescriptors(unittest.TestCase): def test_set_name(self): diff --git a/Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst b/Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst new file mode 100644 index 00000000000000..ee8962c6f46e75 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst @@ -0,0 +1,4 @@ +When :mod:`dataclasses` replaces a class with a slotted dataclass, the +original class is now garbage collected again. Earlier changes in Python +3.14 caused this class to remain in existence together with the replacement +class synthesized by :mod:`dataclasses`. From efa984b7ce1b6c544e445adcca806ab5fd84de6c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:15:50 +0200 Subject: [PATCH 0696/1674] [3.14] gh-131531: Android test fixes (GH-136845) (#136962) Modifies the test runner script to no longer export the the HOST environment variable, and to allow for tests that produce no Python output (output from the Android console is still expected and required). These changes stem from knowledge gained during developing a PR for Android support in cibuildwheel. (cherry picked from commit 149bddcc216a398d71ec9497e9bf3ec03d6f2914) Co-authored-by: Malcolm Smith --- Android/android.py | 73 +++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/Android/android.py b/Android/android.py index a3a48c0c6b7027..75f73cd30993da 100755 --- a/Android/android.py +++ b/Android/android.py @@ -50,7 +50,19 @@ + (".bat" if os.name == "nt" else "") ) -logcat_started = False +# Whether we've seen any output from Python yet. +python_started = False + +# Buffer for verbose output which will be displayed only if a test fails and +# there has been no output from Python. +hidden_output = [] + + +def log_verbose(context, line, stream=sys.stdout): + if context.verbose: + stream.write(line) + else: + hidden_output.append((stream, line)) def delete_glob(pattern): @@ -118,7 +130,7 @@ def android_env(host): env_script = ANDROID_DIR / "android-env.sh" env_output = subprocess.run( f"set -eu; " - f"export HOST={host}; " + f"HOST={host}; " f"PREFIX={prefix}; " f". {env_script}; " f"export", @@ -453,17 +465,19 @@ async def logcat_task(context, initial_devices): # `--pid` requires API level 24 or higher. args = [adb, "-s", serial, "logcat", "--pid", pid, "--format", "tag"] - hidden_output = [] + logcat_started = False 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): + logcat_started = True 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. + # If the regex doesn't match, this is either a logcat startup + # error, or the second or subsequent line of a multi-line + # message. Python won't produce multi-line messages, but other + # components might. level, message = None, line # Exclude high-volume messages which are rarely useful. @@ -483,25 +497,22 @@ async def logcat_task(context, initial_devices): # 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 + global python_started + python_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) + # Non-Python messages add a lot of noise, but they may + # sometimes help explain a failure. + log_verbose(context, line, stream) # 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. + # received any logcat messages yet. status = await wait_for(process.wait(), timeout=1) if status != 0 and not logcat_started: - raise CalledProcessError(status, args, "".join(hidden_output)) + raise CalledProcessError(status, args) def stop_app(serial): @@ -516,16 +527,6 @@ async def gradle_task(context): task_prefix = "connected" env["ANDROID_SERIAL"] = context.connected - hidden_output = [] - - def log(line): - # 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) - if context.command: mode = "-c" module = context.command @@ -550,7 +551,7 @@ def log(line): ] if context.verbose >= 2: args.append("--info") - log("> " + join_command(args)) + log_verbose(context, f"> {join_command(args)}\n") try: async with async_process( @@ -558,7 +559,12 @@ def log(line): stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) as process: while line := (await process.stdout.readline()).decode(*DECODE_ARGS): - log(line) + # Gradle may take several minutes to install SDK packages, so + # it's worth showing those messages even in non-verbose mode. + if line.startswith('Preparing "Install'): + sys.stdout.write(line) + else: + log_verbose(context, line) status = await wait_for(process.wait(), timeout=1) if status == 0: @@ -566,11 +572,6 @@ def log(line): 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) @@ -600,6 +601,12 @@ async def run_testbed(context): except* MySystemExit as e: raise SystemExit(*e.exceptions[0].args) from None except* CalledProcessError as e: + # If Python produced no output, then the user probably wants to see the + # verbose output to explain why the test failed. + if not python_started: + for stream, line in hidden_output: + stream.write(line) + # Extract it from the ExceptionGroup so it can be handled by `main`. raise e.exceptions[0] From 72b679423da7fbb4fd4d238d2ade81ca698dbdbc Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:29:17 +0300 Subject: [PATCH 0697/1674] [3.14] Fix 3 typos in "Next" News items (GH-136892) (#136967) Co-authored-by: Cornelius Roemer --- Misc/NEWS.d/3.14.0b1.rst | 4 ++-- .../2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS.d/3.14.0b1.rst b/Misc/NEWS.d/3.14.0b1.rst index 5847dea7d5e8ee..f76896954f321d 100644 --- a/Misc/NEWS.d/3.14.0b1.rst +++ b/Misc/NEWS.d/3.14.0b1.rst @@ -1756,7 +1756,7 @@ Add support for macOS multi-arch builds with the JIT enabled .. nonce: q9fvyM .. section: Core and Builtins -PyREPL now supports syntax highlighing. Contributed by Łukasz Langa. +PyREPL now supports syntax highlighting. Contributed by Łukasz Langa. .. @@ -1797,7 +1797,7 @@ non-``None`` ``closure``. Patch by Bartosz Sławecki. .. nonce: Uj7lyY .. section: Core and Builtins -Fix a bug that was allowing newlines inconsitently in format specifiers for +Fix a bug that was allowing newlines inconsistently in format specifiers for single-quoted f-strings. Patch by Pablo Galindo. .. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst index 5c0813b1a0abda..767d7b97726971 100644 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst @@ -1 +1 @@ -Fix PyREPL syntax highlightning on match cases after multi-line case. Contributed by Olga Matoula. +Fix PyREPL syntax highlighting on match cases after multi-line case. Contributed by Olga Matoula. From d5d3adafa71278da574533f30325605d67a1cdec Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:29:40 +0200 Subject: [PATCH 0698/1674] [3.14] gh-135468: Improve ``BaseHandler.http_error_default()`` parameter descriptions (GH-136797) (#136825) Co-authored-by: Valerio Gianella <49408327+valeriogianella@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com> --- Doc/library/urllib.request.rst | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 016bc777fbb232..e514b98fc5d553 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -832,10 +832,13 @@ The following attribute and methods should only be used by classes derived from errors. It will be called automatically by the :class:`OpenerDirector` getting the error, and should not normally be called in other circumstances. - *req* will be a :class:`Request` object, *fp* will be a file-like object with - the HTTP error body, *code* will be the three-digit code of the error, *msg* - will be the user-visible explanation of the code and *hdrs* will be a mapping - object with the headers of the error. + :class:`OpenerDirector` will call this method with five positional arguments: + + 1. a :class:`Request` object, + #. a file-like object with the HTTP error body, + #. the three-digit code of the error, as a string, + #. the user-visible explanation of the code, as as string, and + #. the headers of the error, as a mapping object. Return values and exceptions raised should be the same as those of :func:`urlopen`. From ddd3413687ef411c7bf7b029337cdf48c6d6c59c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:32:09 +0200 Subject: [PATCH 0699/1674] [3.14] gh-136859: Improve `StrEnum` docs (GH-136864) (#136936) Co-authored-by: Nacho Caballero Co-authored-by: Nacho Caballero Co-authored-by: Antonio Spadaro --- Doc/library/enum.rst | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index c9b2c7d76b6746..2cfc2f4962979f 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -504,16 +504,31 @@ Data Types .. class:: StrEnum - ``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. + *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. + + >>> from enum import StrEnum, auto + >>> class Color(StrEnum): + ... RED = 'r' + ... GREEN = 'g' + ... BLUE = 'b' + ... UNKNOWN = auto() + ... + >>> Color.RED + + >>> Color.UNKNOWN + + >>> str(Color.UNKNOWN) + 'unknown' .. note:: There are places in the stdlib that check for an exact :class:`str` instead of a :class:`str` subclass (i.e. ``type(unknown) == str`` instead of ``isinstance(unknown, str)``), and in those locations you - will need to use ``str(StrEnum.member)``. + will need to use ``str(MyStrEnum.MY_MEMBER)``. .. note:: From 11f510167c5a87e12e9277e36a12841b6b6993b3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:44:59 +0200 Subject: [PATCH 0700/1674] [3.14] gh-133296: Publicly expose critical section API that accepts PyMutex (gh-135899) (#136969) Co-authored-by: Nathan Goldbaum Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/c-api/init.rst | 40 +++++++++++++++++++ Include/cpython/critical_section.h | 20 ++++++++++ Include/internal/pycore_critical_section.h | 14 +------ ...-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst | 3 ++ Modules/_ctypes/ctypes.h | 2 +- Modules/_testcapimodule.c | 10 +++++ Objects/typeobject.c | 4 +- Python/critical_section.c | 18 +++++++++ 8 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index dc96ed7f719fcf..51e9e6c352f0e4 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -2458,6 +2458,12 @@ 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`. +Variants that accept :c:type:`PyMutex` pointers rather than Python objects are also +available. Use these variants to start a critical section in a situation where +there is no :c:type:`PyObject` -- for example, when working with a C type that +does not extend or wrap :c:type:`PyObject` but still needs to call into the C +API in a manner that might lead to deadlocks. + 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 @@ -2503,6 +2509,23 @@ code triggered by the finalizer blocks and calls :c:func:`PyEval_SaveThread`. .. versionadded:: 3.13 +.. c:macro:: Py_BEGIN_CRITICAL_SECTION_MUTEX(m) + + Locks the mutex *m* and begins a critical section. + + In the free-threaded build, this macro expands to:: + + { + PyCriticalSection _py_cs; + PyCriticalSection_BeginMutex(&_py_cs, m) + + Note that unlike :c:macro:`Py_BEGIN_CRITICAL_SECTION`, there is no cast for + the argument of the macro - it must be a :c:type:`PyMutex` pointer. + + On the default build, this macro expands to ``{``. + + .. versionadded:: 3.14 + .. c:macro:: Py_END_CRITICAL_SECTION() Ends the critical section and releases the per-object lock. @@ -2532,6 +2555,23 @@ code triggered by the finalizer blocks and calls :c:func:`PyEval_SaveThread`. .. versionadded:: 3.13 +.. c:macro:: Py_BEGIN_CRITICAL_SECTION2_MUTEX(m1, m2) + + Locks the mutexes *m1* and *m2* and begins a critical section. + + In the free-threaded build, this macro expands to:: + + { + PyCriticalSection2 _py_cs2; + PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2) + + Note that unlike :c:macro:`Py_BEGIN_CRITICAL_SECTION2`, there is no cast for + the arguments of the macro - they must be :c:type:`PyMutex` pointers. + + On the default build, this macro expands to ``{``. + + .. versionadded:: 3.14 + .. c:macro:: Py_END_CRITICAL_SECTION2() Ends the critical section and releases the per-object locks. diff --git a/Include/cpython/critical_section.h b/Include/cpython/critical_section.h index 35db3fb6a59ce6..4fc46fefb93a24 100644 --- a/Include/cpython/critical_section.h +++ b/Include/cpython/critical_section.h @@ -73,22 +73,32 @@ typedef struct PyCriticalSection2 PyCriticalSection2; PyAPI_FUNC(void) PyCriticalSection_Begin(PyCriticalSection *c, PyObject *op); +PyAPI_FUNC(void) +PyCriticalSection_BeginMutex(PyCriticalSection *c, PyMutex *m); + PyAPI_FUNC(void) PyCriticalSection_End(PyCriticalSection *c); PyAPI_FUNC(void) PyCriticalSection2_Begin(PyCriticalSection2 *c, PyObject *a, PyObject *b); +PyAPI_FUNC(void) +PyCriticalSection2_BeginMutex(PyCriticalSection2 *c, PyMutex *m1, PyMutex *m2); + PyAPI_FUNC(void) PyCriticalSection2_End(PyCriticalSection2 *c); #ifndef Py_GIL_DISABLED # define Py_BEGIN_CRITICAL_SECTION(op) \ { +# define Py_BEGIN_CRITICAL_SECTION_MUTEX(mutex) \ + { # define Py_END_CRITICAL_SECTION() \ } # define Py_BEGIN_CRITICAL_SECTION2(a, b) \ { +# define Py_BEGIN_CRITICAL_SECTION2_MUTEX(m1, m2) \ + { # define Py_END_CRITICAL_SECTION2() \ } #else /* !Py_GIL_DISABLED */ @@ -118,6 +128,11 @@ struct PyCriticalSection2 { PyCriticalSection _py_cs; \ PyCriticalSection_Begin(&_py_cs, _PyObject_CAST(op)) +# define Py_BEGIN_CRITICAL_SECTION_MUTEX(mutex) \ + { \ + PyCriticalSection _py_cs; \ + PyCriticalSection_BeginMutex(&_py_cs, mutex) + # define Py_END_CRITICAL_SECTION() \ PyCriticalSection_End(&_py_cs); \ } @@ -127,6 +142,11 @@ struct PyCriticalSection2 { PyCriticalSection2 _py_cs2; \ PyCriticalSection2_Begin(&_py_cs2, _PyObject_CAST(a), _PyObject_CAST(b)) +# define Py_BEGIN_CRITICAL_SECTION2_MUTEX(m1, m2) \ + { \ + PyCriticalSection2 _py_cs2; \ + PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2) + # define Py_END_CRITICAL_SECTION2() \ PyCriticalSection2_End(&_py_cs2); \ } diff --git a/Include/internal/pycore_critical_section.h b/Include/internal/pycore_critical_section.h index 42f06b935bd0a0..2b49b9f00df3ea 100644 --- a/Include/internal/pycore_critical_section.h +++ b/Include/internal/pycore_critical_section.h @@ -21,16 +21,6 @@ extern "C" { #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 @@ -75,8 +65,6 @@ extern "C" { #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) @@ -119,6 +107,7 @@ _PyCriticalSection_BeginMutex(PyCriticalSection *c, PyMutex *m) _PyCriticalSection_BeginSlow(c, m); } } +#define PyCriticalSection_BeginMutex _PyCriticalSection_BeginMutex static inline void _PyCriticalSection_Begin(PyCriticalSection *c, PyObject *op) @@ -194,6 +183,7 @@ _PyCriticalSection2_BeginMutex(PyCriticalSection2 *c, PyMutex *m1, PyMutex *m2) _PyCriticalSection2_BeginSlow(c, m1, m2, 0); } } +#define PyCriticalSection2_BeginMutex _PyCriticalSection2_BeginMutex static inline void _PyCriticalSection2_Begin(PyCriticalSection2 *c, PyObject *a, PyObject *b) diff --git a/Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst b/Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst new file mode 100644 index 00000000000000..41401911a6bc0b --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst @@ -0,0 +1,3 @@ +New variants for the critical section API that accept one or two +:c:type:`PyMutex` pointers rather than :c:type:`PyObject` instances are now +public in the non-limited C API. diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 03fde30c2e0944..f8389f98fec780 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -419,7 +419,7 @@ typedef struct { visible to other threads before the `dict_final` bit is set. */ -#define STGINFO_LOCK(stginfo) Py_BEGIN_CRITICAL_SECTION_MUT(&(stginfo)->mutex) +#define STGINFO_LOCK(stginfo) Py_BEGIN_CRITICAL_SECTION_MUTEX(&(stginfo)->mutex) #define STGINFO_UNLOCK() Py_END_CRITICAL_SECTION() static inline uint8_t diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 71fffedee146fa..2572df9719a703 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2419,6 +2419,16 @@ test_critical_sections(PyObject *module, PyObject *Py_UNUSED(args)) Py_BEGIN_CRITICAL_SECTION2(module, module); Py_END_CRITICAL_SECTION2(); +#ifdef Py_GIL_DISABLED + // avoid unused variable compiler warning on GIL-enabled build + PyMutex mut = {0}; + Py_BEGIN_CRITICAL_SECTION_MUTEX(&mut); + Py_END_CRITICAL_SECTION(); + + Py_BEGIN_CRITICAL_SECTION2_MUTEX(&mut, &mut); + Py_END_CRITICAL_SECTION2(); +#endif + Py_RETURN_NONE; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index a348ea1d531c93..ab6ad1fe8b5f91 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -65,11 +65,11 @@ class object "PyObject *" "&PyBaseObject_Type" // be released and reacquired during a subclass update if there's contention // on the subclass lock. #define TYPE_LOCK &PyInterpreterState_Get()->types.mutex -#define BEGIN_TYPE_LOCK() Py_BEGIN_CRITICAL_SECTION_MUT(TYPE_LOCK) +#define BEGIN_TYPE_LOCK() Py_BEGIN_CRITICAL_SECTION_MUTEX(TYPE_LOCK) #define END_TYPE_LOCK() Py_END_CRITICAL_SECTION() #define BEGIN_TYPE_DICT_LOCK(d) \ - Py_BEGIN_CRITICAL_SECTION2_MUT(TYPE_LOCK, &_PyObject_CAST(d)->ob_mutex) + Py_BEGIN_CRITICAL_SECTION2_MUTEX(TYPE_LOCK, &_PyObject_CAST(d)->ob_mutex) #define END_TYPE_DICT_LOCK() Py_END_CRITICAL_SECTION2() diff --git a/Python/critical_section.c b/Python/critical_section.c index 73857b85496316..e628ba2f6d19bc 100644 --- a/Python/critical_section.c +++ b/Python/critical_section.c @@ -130,6 +130,15 @@ PyCriticalSection_Begin(PyCriticalSection *c, PyObject *op) #endif } +#undef PyCriticalSection_BeginMutex +void +PyCriticalSection_BeginMutex(PyCriticalSection *c, PyMutex *m) +{ +#ifdef Py_GIL_DISABLED + _PyCriticalSection_BeginMutex(c, m); +#endif +} + #undef PyCriticalSection_End void PyCriticalSection_End(PyCriticalSection *c) @@ -148,6 +157,15 @@ PyCriticalSection2_Begin(PyCriticalSection2 *c, PyObject *a, PyObject *b) #endif } +#undef PyCriticalSection2_BeginMutex +void +PyCriticalSection2_BeginMutex(PyCriticalSection2 *c, PyMutex *m1, PyMutex *m2) +{ +#ifdef Py_GIL_DISABLED + _PyCriticalSection2_BeginMutex(c, m1, m2); +#endif +} + #undef PyCriticalSection2_End void PyCriticalSection2_End(PyCriticalSection2 *c) From 8e43b130f7b27657a8bb775e398c0dce325b4741 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:48:08 +0300 Subject: [PATCH 0701/1674] [3.14] gh-134009: Expose `PyMutex_IsLocked` in the public C API (gh-134365) (#136971) Co-authored-by: Sam Gross --- Doc/c-api/init.rst | 12 ++++++++++++ Doc/whatsnew/3.14.rst | 1 + Include/cpython/lock.h | 11 +++++++++++ Include/internal/pycore_lock.h | 7 ------- .../2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst | 1 + Python/lock.c | 8 ++++++++ 6 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 51e9e6c352f0e4..2e255a8781c353 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -2441,6 +2441,18 @@ The C-API provides a basic mutual exclusion lock. .. versionadded:: 3.13 +.. c:function:: int PyMutex_IsLocked(PyMutex *m) + + Returns non-zero if the mutex *m* is currently locked, zero otherwise. + + .. note:: + + This function is intended for use in assertions and debugging only and + should not be used to make concurrency control decisions, as the lock + state may change immediately after the check. + + .. versionadded:: 3.14 + .. _python-critical-section-api: Python Critical Section API diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 630d011ffbbd1f..2906828e05d229 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -3027,6 +3027,7 @@ Porting to Python 3.14 * ``_PyLong_IsPositive()``: :c:func:`PyLong_IsPositive` * ``_PyLong_IsZero()``: :c:func:`PyLong_IsZero` * ``_PyLong_Sign()``: :c:func:`PyLong_GetSign` + * ``_PyMutex_IsLocked()`` : :c:func:`PyMutex_IsLocked` * ``_PyUnicodeWriter_Dealloc()``: :c:func:`PyUnicodeWriter_Discard` * ``_PyUnicodeWriter_Finish()``: :c:func:`PyUnicodeWriter_Finish` * ``_PyUnicodeWriter_Init()``: use :c:func:`PyUnicodeWriter_Create` diff --git a/Include/cpython/lock.h b/Include/cpython/lock.h index 8ee03e82f74dfd..63886fca28eae2 100644 --- a/Include/cpython/lock.h +++ b/Include/cpython/lock.h @@ -36,6 +36,9 @@ PyAPI_FUNC(void) PyMutex_Lock(PyMutex *m); // exported function for unlocking the mutex PyAPI_FUNC(void) PyMutex_Unlock(PyMutex *m); +// exported function for checking if the mutex is locked +PyAPI_FUNC(int) PyMutex_IsLocked(PyMutex *m); + // Locks the mutex. // // If the mutex is currently locked, the calling thread will be parked until @@ -61,3 +64,11 @@ _PyMutex_Unlock(PyMutex *m) } } #define PyMutex_Unlock _PyMutex_Unlock + +// Checks if the mutex is currently locked. +static inline int +_PyMutex_IsLocked(PyMutex *m) +{ + return (_Py_atomic_load_uint8(&m->_bits) & _Py_LOCKED) != 0; +} +#define PyMutex_IsLocked _PyMutex_IsLocked diff --git a/Include/internal/pycore_lock.h b/Include/internal/pycore_lock.h index 7484b05d7f2446..9b071573ad3c74 100644 --- a/Include/internal/pycore_lock.h +++ b/Include/internal/pycore_lock.h @@ -25,13 +25,6 @@ PyMutex_LockFast(PyMutex *m) 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) diff --git a/Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst b/Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst new file mode 100644 index 00000000000000..f060f09de19bb8 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst @@ -0,0 +1 @@ +Expose :c:func:`PyMutex_IsLocked` as part of the public C API. diff --git a/Python/lock.c b/Python/lock.c index 3c0804c468e08d..ca269bd2cb4b51 100644 --- a/Python/lock.c +++ b/Python/lock.c @@ -619,3 +619,11 @@ PyMutex_Unlock(PyMutex *m) Py_FatalError("unlocking mutex that is not locked"); } } + + +#undef PyMutex_IsLocked +int +PyMutex_IsLocked(PyMutex *m) +{ + return _PyMutex_IsLocked(m); +} From d118bc061b4f7ea916bb25f19c5c7f8e1923fbc7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:51:02 +0200 Subject: [PATCH 0702/1674] [3.14] gh-124621: Emscripten: Add support for async input devices (GH-136822) (GH-136935) This is useful for implementing proper `input()`. It requires the JavaScript engine to support the wasm JSPI spec which is now stage 4. It is supported on Chrome since version 137 and on Firefox and node behind a flag. We override the `__wasi_fd_read()` syscall with our own variant that checks for a readAsync operation. If it has it, we use our own async variant of `fd_read()`, otherwise we use the original `fd_read()`. We also add a variant of `FS.createDevice()` called `FS.createAsyncInputDevice()`. Finally, if JSPI is available, we wrap the `main()` symbol with `WebAssembly.promising()` so that we can stack switch from `fd_read()`. If JSPI is not available, attempting to read from an AsyncInputDevice will raise an `OSError`. (cherry picked from commit 7ae4749d064bd49b0dd96172fee20c1f1678d9e9) Co-authored-by: Hood Chatham --- Lib/test/test_capi/test_emscripten.py | 25 ++++ Modules/_testinternalcapi.c | 34 +++++ Python/emscripten_syscalls.c | 182 ++++++++++++++++++++++++++ Tools/wasm/emscripten/__main__.py | 12 +- 4 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 Lib/test/test_capi/test_emscripten.py diff --git a/Lib/test/test_capi/test_emscripten.py b/Lib/test/test_capi/test_emscripten.py new file mode 100644 index 00000000000000..272d9a10ceb950 --- /dev/null +++ b/Lib/test/test_capi/test_emscripten.py @@ -0,0 +1,25 @@ +import unittest +from test.support import is_emscripten + +if not is_emscripten: + raise unittest.SkipTest("Emscripten-only test") + +from _testinternalcapi import emscripten_set_up_async_input_device +from pathlib import Path + + +class EmscriptenAsyncInputDeviceTest(unittest.TestCase): + def test_emscripten_async_input_device(self): + jspi_supported = emscripten_set_up_async_input_device() + p = Path("/dev/blah") + self.addCleanup(p.unlink) + if not jspi_supported: + with open(p, "r") as f: + self.assertRaises(OSError, f.readline) + return + + with open(p, "r") as f: + for _ in range(10): + self.assertEqual(f.readline().strip(), "ab") + self.assertEqual(f.readline().strip(), "fi") + self.assertEqual(f.readline().strip(), "xy") diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 8027f0015c7409..f84cf1a4263a2d 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -2346,6 +2346,37 @@ incref_decref_delayed(PyObject *self, PyObject *op) Py_RETURN_NONE; } +#ifdef __EMSCRIPTEN__ +#include "emscripten.h" + +EM_JS(int, emscripten_set_up_async_input_device_js, (void), { + let idx = 0; + const encoder = new TextEncoder(); + const bufs = [ + encoder.encode("ab\n"), + encoder.encode("fi\n"), + encoder.encode("xy\n"), + ]; + function sleep(t) { + return new Promise(res => setTimeout(res, t)); + } + FS.createAsyncInputDevice("/dev", "blah", async () => { + await sleep(5); + return bufs[(idx ++) % 3]; + }); + return !!WebAssembly.promising; +}); + +static PyObject * +emscripten_set_up_async_input_device(PyObject *self, PyObject *Py_UNUSED(ignored)) { + if (emscripten_set_up_async_input_device_js()) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } +} +#endif + static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -2448,6 +2479,9 @@ static PyMethodDef module_functions[] = { {"is_static_immortal", is_static_immortal, METH_O}, {"incref_decref_delayed", incref_decref_delayed, METH_O}, GET_NEXT_DICT_KEYS_VERSION_METHODDEF +#ifdef __EMSCRIPTEN__ + {"emscripten_set_up_async_input_device", emscripten_set_up_async_input_device, METH_NOARGS}, +#endif {NULL, NULL} /* sentinel */ }; diff --git a/Python/emscripten_syscalls.c b/Python/emscripten_syscalls.c index bb80f979420ec1..886262acbc6810 100644 --- a/Python/emscripten_syscalls.c +++ b/Python/emscripten_syscalls.c @@ -37,3 +37,185 @@ EM_JS(int, __syscall_umask_js, (int mask), { int __syscall_umask(int mask) { return __syscall_umask_js(mask); } + +#include +#include +#undef errno + +// Variant of EM_JS that does C preprocessor substitution on the body +#define EM_JS_MACROS(ret, func_name, args, body...) \ + EM_JS(ret, func_name, args, body) + +EM_JS_MACROS(void, _emscripten_promising_main_js, (void), { + // Define FS.createAsyncInputDevice(), This is quite similar to + // FS.createDevice() defined here: + // https://github.com/emscripten-core/emscripten/blob/4.0.11/src/lib/libfs.js?plain=1#L1642 + // but instead of returning one byte at a time, the input() function should + // return a Uint8Array. This makes the handler code simpler, the + // `createAsyncInputDevice` simpler, and everything faster. + FS.createAsyncInputDevice = function(parent, name, input) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var path = PATH.join2(parent, name); + var mode = FS_getMode(true, false); + FS.createDevice.major ||= 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + async function getDataBuf() { + var buf; + try { + buf = await input(); + } catch (e) { + throw new FS.ErrnoError(EIO); + } + if (!buf?.byteLength) { + throw new FS.ErrnoError(EAGAIN); + } + ops._dataBuf = buf; + } + + var ops = { + _dataBuf: new Uint8Array(0), + open(stream) { + stream.seekable = false; + }, + async readAsync(stream, buffer, offset, length, pos /* ignored */) { + buffer = buffer.subarray(offset, offset + length); + if (!ops._dataBuf.byteLength) { + await getDataBuf(); + } + var toRead = Math.min(ops._dataBuf.byteLength, buffer.byteLength); + buffer.subarray(0, toRead).set(ops._dataBuf); + buffer = buffer.subarray(toRead); + ops._dataBuf = ops._dataBuf.subarray(toRead); + if (toRead) { + stream.node.atime = Date.now(); + } + return toRead; + }, + }; + FS.registerDevice(dev, ops); + return FS.mkdev(path, mode, dev); + }; + if (!WebAssembly.promising) { + // No stack switching support =( + return; + } + const origResolveGlobalSymbol = resolveGlobalSymbol; + if (!Module.onExit && process?.exit) { + Module.onExit = (code) => process.exit(code); + } + // * wrap the main symbol with WebAssembly.promising, + // * call exit_with_live_runtime() to prevent emscripten from shutting down + // the runtime before the promise resolves, + // * call onExit / process.exit ourselves, since exit_with_live_runtime() + // prevented Emscripten from calling it normally. + resolveGlobalSymbol = function (name, direct = false) { + const orig = origResolveGlobalSymbol(name, direct); + if (name === "main") { + const main = WebAssembly.promising(orig.sym); + orig.sym = (...args) => { + (async () => { + const ret = await main(...args); + process?.exit?.(ret); + })(); + _emscripten_exit_with_live_runtime(); + }; + } + return orig; + }; +}) + +__attribute__((constructor)) void _emscripten_promising_main(void) { + _emscripten_promising_main_js(); +} + + +#define IOVEC_T_BUF_OFFSET 0 +#define IOVEC_T_BUF_LEN_OFFSET 4 +#define IOVEC_T_SIZE 8 +_Static_assert(offsetof(__wasi_iovec_t, buf) == IOVEC_T_BUF_OFFSET, + "Unexpected __wasi_iovec_t layout"); +_Static_assert(offsetof(__wasi_iovec_t, buf_len) == IOVEC_T_BUF_LEN_OFFSET, + "Unexpected __wasi_iovec_t layout"); +_Static_assert(sizeof(__wasi_iovec_t) == IOVEC_T_SIZE, + "Unexpected __wasi_iovec_t layout"); + +// If the stream has a readAsync handler, read to buffer defined in iovs, write +// number of bytes read to *nread, and return a promise that resolves to the +// errno. Otherwise, return null. +EM_JS_MACROS(__externref_t, __maybe_fd_read_async, ( + __wasi_fd_t fd, + const __wasi_iovec_t *iovs, + size_t iovcnt, + __wasi_size_t *nread +), { + if (!WebAssembly.promising) { + return null; + } + var stream; + try { + stream = SYSCALLS.getStreamFromFD(fd); + } catch (e) { + // If the fd was already closed or never existed, getStreamFromFD() + // raises. We'll let fd_read_orig() handle setting errno. + return null; + } + if (!stream.stream_ops.readAsync) { + // Not an async device. Fall back to __wasi_fd_read_orig(). + return null; + } + return (async () => { + // This is the same as libwasi.js fd_read() and doReadv() except we use + // readAsync and we await it. + // https://github.com/emscripten-core/emscripten/blob/4.0.11/src/lib/libwasi.js?plain=1#L331 + // https://github.com/emscripten-core/emscripten/blob/4.0.11/src/lib/libwasi.js?plain=1#L197 + try { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(iovs + IOVEC_T_BUF_OFFSET)/4]; + var len = HEAP32[(iovs + IOVEC_T_BUF_LEN_OFFSET)/4]; + iovs += IOVEC_T_SIZE; + var curr = await stream.stream_ops.readAsync(stream, HEAP8, ptr, len); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + HEAP32[nread/4] = ret; + return 0; + } catch (e) { + if (e.name !== 'ErrnoError') { + throw e; + } + return e.errno; + } + })(); +}; +); + +// Bind original fd_read syscall to __wasi_fd_read_orig(). +__wasi_errno_t __wasi_fd_read_orig(__wasi_fd_t fd, const __wasi_iovec_t *iovs, + size_t iovs_len, __wasi_size_t *nread) + __attribute__((__import_module__("wasi_snapshot_preview1"), + __import_name__("fd_read"), __warn_unused_result__)); + +// Take a promise that resolves to __wasi_errno_t and suspend until it resolves, +// get the output. +EM_JS(__wasi_errno_t, __block_for_errno, (__externref_t p), { + return p; +} +if (WebAssembly.Suspending) { + __block_for_errno = new WebAssembly.Suspending(__block_for_errno); +} +) + +// Replacement for fd_read syscall. Call __maybe_fd_read_async. If it returned +// null, delegate back to __wasi_fd_read_orig. Otherwise, use __block_for_errno +// to get the result. +__wasi_errno_t __wasi_fd_read(__wasi_fd_t fd, const __wasi_iovec_t *iovs, + size_t iovs_len, __wasi_size_t *nread) { + __externref_t p = __maybe_fd_read_async(fd, iovs, iovs_len, nread); + if (__builtin_wasm_ref_is_null_extern(p)) { + return __wasi_fd_read_orig(fd, iovs, iovs_len, nread); + } + __wasi_errno_t res = __block_for_errno(p); + return res; +} diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index e552f6b680da9d..b25cbb01dedd31 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -274,10 +274,20 @@ def configure_emscripten_python(context, working_dir): REALPATH=abs_path fi + # Before node 24, --experimental-wasm-jspi uses different API, + # After node 24 JSPI is on by default. + ARGS=$({host_runner} -e "$(cat <<"EOF" + const major_version = Number(process.version.split(".")[0].slice(1)); + if (major_version === 24) {{ + process.stdout.write("--experimental-wasm-jspi"); + }} + EOF + )") + # We compute our own path, not following symlinks and pass it in so that # node_entry.mjs can set sys.executable correctly. # Intentionally allow word splitting on NODEFLAGS. - exec {host_runner} $NODEFLAGS {node_entry} --this-program="$($REALPATH "$0")" "$@" + exec {host_runner} $NODEFLAGS $ARGS {node_entry} --this-program="$($REALPATH "$0")" "$@" """ ) ) From c59a60bdb48120fe7b7ba65507448db358b6671d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:32:00 +0200 Subject: [PATCH 0703/1674] [3.14] gh-132661: Document t-strings and `templatelib` (GH-135229) (#136974) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Dave Peck Co-authored-by: Petr Viktorin Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Loïc Simon Co-authored-by: pauleveritt Co-authored-by: Lysandros Nikolaou --- Doc/glossary.rst | 7 +- Doc/library/ast.rst | 54 ++++- Doc/library/dis.rst | 42 ++++ Doc/library/stdtypes.rst | 6 +- Doc/library/string.rst | 25 ++- Doc/library/string.templatelib.rst | 313 +++++++++++++++++++++++++++++ Doc/library/text.rst | 1 + Doc/reference/compound_stmts.rst | 4 +- Doc/reference/lexical_analysis.rst | 50 ++++- Doc/tutorial/inputoutput.rst | 9 +- 10 files changed, 488 insertions(+), 23 deletions(-) create mode 100644 Doc/library/string.templatelib.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 199a917f9f101e..b7bd547d38fd1e 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -462,7 +462,7 @@ Glossary core and with user code. f-string - String literals prefixed with ``'f'`` or ``'F'`` are commonly called + String literals prefixed with ``f`` or ``F`` are commonly called "f-strings" which is short for :ref:`formatted string literals `. See also :pep:`498`. @@ -1322,6 +1322,11 @@ Glossary See also :term:`borrowed reference`. + t-string + String literals prefixed with ``t`` or ``T`` are commonly called + "t-strings" which is short for + :ref:`template string literals `. + text encoding A string in Python is a sequence of Unicode code points (in range ``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index ca0654acb33689..eff093eebc158e 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -290,9 +290,9 @@ Literals * ``conversion`` is an integer: * -1: no formatting - * 115: ``!s`` string formatting - * 114: ``!r`` repr formatting - * 97: ``!a`` ascii formatting + * 115 (``ord('s')``): ``!s`` string formatting + * 114 (``ord('r')``): ``!r`` repr formatting + * 97 (``ord('a')``): ``!a`` ASCII formatting * ``format_spec`` is a :class:`JoinedStr` node representing the formatting of the value, or ``None`` if no format was specified. Both @@ -326,6 +326,54 @@ Literals Constant(value='.3')]))])) +.. class:: TemplateStr(values) + + A t-string, comprising a series of :class:`Interpolation` and :class:`Constant` + nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('t"{name} finished {place:ordinal}"', mode='eval'), indent=4)) + Expression( + body=TemplateStr( + values=[ + Interpolation( + value=Name(id='name', ctx=Load()), + str='name', + conversion=-1), + Constant(value=' finished '), + Interpolation( + value=Name(id='place', ctx=Load()), + str='place', + conversion=-1, + format_spec=JoinedStr( + values=[ + Constant(value='ordinal')]))])) + + .. versionadded:: 3.14 + + +.. class:: Interpolation(value, str, conversion, format_spec) + + Node representing a single interpolation field in a t-string. + + * ``value`` is any expression node (such as a literal, a variable, or a + function call). + * ``str`` is a constant containing the text of the interpolation expression. + * ``conversion`` is an integer: + + * -1: no conversion + * 115: ``!s`` string conversion + * 114: ``!r`` repr conversion + * 97: ``!a`` ascii conversion + + * ``format_spec`` is a :class:`JoinedStr` node representing the formatting + of the value, or ``None`` if no format was specified. Both + ``conversion`` and ``format_spec`` can be set at the same time. + + .. versionadded:: 3.14 + + .. class:: List(elts, ctx) Tuple(elts, ctx) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 11685a32f48e4f..ac8a911c40a860 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1120,6 +1120,48 @@ iterations of the loop. .. versionadded:: 3.12 +.. opcode:: BUILD_TEMPLATE + + Constructs a new :class:`~string.templatelib.Template` from a tuple + of strings and a tuple of interpolations and pushes the resulting instance + onto the stack:: + + interpolations = STACK.pop() + strings = STACK.pop() + STACK.append(_build_template(strings, interpolations)) + + .. versionadded:: 3.14 + + +.. opcode:: BUILD_INTERPOLATION (format) + + Constructs a new :class:`~string.templatelib.Interpolation` from a + value and its source expression and pushes the resulting instance onto the + stack. + + If no conversion or format specification is present, ``format`` is set to + ``2``. + + If the low bit of ``format`` is set, it indicates that the interpolation + contains a format specification. + + If ``format >> 2`` is non-zero, it indicates that the interpolation + contains a conversion. The value of ``format >> 2`` is the conversion type + (``0`` for no conversion, ``1`` for ``!s``, ``2`` for ``!r``, and + ``3`` for ``!a``):: + + conversion = format >> 2 + if format & 1: + format_spec = STACK.pop() + else: + format_spec = None + expression = STACK.pop() + value = STACK.pop() + STACK.append(_build_interpolation(value, expression, conversion, format_spec)) + + .. versionadded:: 3.14 + + .. opcode:: BUILD_TUPLE (count) Creates a tuple consuming *count* items from the stack, and pushes the diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 8e688f03eb3a87..90683c0b00d78a 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2675,9 +2675,9 @@ For example: lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer :ref:`formatted string literals `, the :meth:`str.format` interface, or :ref:`template strings - ` may help avoid these errors. Each of these - alternatives provides their own trade-offs and benefits of simplicity, - flexibility, and/or extensibility. + ($-strings) ` may help avoid these errors. + Each of these alternatives provides their own trade-offs and benefits of + simplicity, flexibility, and/or extensibility. String objects have one unique built-in operation: the ``%`` operator (modulo). This is also known as the string *formatting* or *interpolation* operator. diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 23e15780075435..83e8ee2722ed8a 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -198,8 +198,9 @@ Format String Syntax The :meth:`str.format` method and the :class:`Formatter` class share the same syntax for format strings (although in the case of :class:`Formatter`, subclasses can define their own format string syntax). The syntax is -related to that of :ref:`formatted string literals `, but it is -less sophisticated and, in particular, does not support arbitrary expressions. +related to that of :ref:`formatted string literals ` and +:ref:`template string literals `, but it is less sophisticated +and, in particular, does not support arbitrary expressions. .. index:: single: {} (curly brackets); in string formatting @@ -264,6 +265,8 @@ Some simple format string examples:: "Weight in tons {0.weight}" # 'weight' attribute of first positional arg "Units destroyed: {players[0]}" # First element of keyword argument 'players'. +.. _formatstrings-conversion: + The *conversion* field causes a type coercion before formatting. Normally, the job of formatting a value is done by the :meth:`~object.__format__` method of the value itself. However, in some cases it is desirable to force a type to be formatted @@ -306,7 +309,7 @@ Format Specification Mini-Language "Format specifications" are used within replacement fields contained within a format string to define how individual values are presented (see -:ref:`formatstrings` and :ref:`f-strings`). +:ref:`formatstrings`, :ref:`f-strings`, and :ref:`t-strings`). They can also be passed directly to the built-in :func:`format` function. Each formattable type may define how the format specification is to be interpreted. @@ -789,10 +792,20 @@ Nesting arguments and more complex examples:: -.. _template-strings: +.. _template-strings-pep292: -Template strings ----------------- +Template strings ($-strings) +---------------------------- + +.. note:: + + The feature described here was introduced in Python 2.4. It is unrelated + to, and should not be confused with, the newer + :ref:`template strings ` and + :ref:`t-string literal syntax ` introduced in Python 3.14. + T-string literals evaluate to instances of a different + :class:`~string.templatelib.Template` class, found in the + :mod:`string.templatelib` module. Template strings provide simpler string substitutions as described in :pep:`292`. A primary use case for template strings is for diff --git a/Doc/library/string.templatelib.rst b/Doc/library/string.templatelib.rst new file mode 100644 index 00000000000000..31b90d75f411f0 --- /dev/null +++ b/Doc/library/string.templatelib.rst @@ -0,0 +1,313 @@ +:mod:`!string.templatelib` --- Support for template string literals +=================================================================== + +.. module:: string.templatelib + :synopsis: Support for template string literals. + +**Source code:** :source:`Lib/string/templatelib.py` + +-------------- + +.. seealso:: + + * :ref:`Format strings ` + * :ref:`T-string literal syntax ` + + +.. _template-strings: + +Template strings +---------------- + +.. versionadded:: 3.14 + +Template strings are a formatting mechanism that allows for deep control over +how strings are processed. You can create templates using +:ref:`t-string literal syntax `, which is identical to +:ref:`f-string syntax ` but uses a ``t`` instead of an ``f``. +While f-strings evaluate to ``str``, t-strings create a :class:`Template` +instance that gives you access to the static and interpolated (in curly braces) +parts of a string *before* they are combined. + + +.. _templatelib-template: + +Template +-------- + +The :class:`!Template` class describes the contents of a template string. + +:class:`!Template` instances are immutable: their attributes cannot be +reassigned. + +.. class:: Template(*args) + + Create a new :class:`!Template` object. + + :param args: A mix of strings and :class:`Interpolation` instances in any order. + :type args: str | Interpolation + + The most common way to create a :class:`!Template` instance is to use the + :ref:`t-string literal syntax `. This syntax is identical to that of + :ref:`f-strings ` except that it uses a ``t`` instead of an ``f``: + + >>> name = "World" + >>> template = t"Hello {name}!" + >>> type(template) + + + Templates ars stored as sequences of literal :attr:`~Template.strings` + and dynamic :attr:`~Template.interpolations`. + A :attr:`~Template.values` attribute holds the interpolation values: + + >>> template.strings + ('Hello ', '!') + >>> template.interpolations + (Interpolation('World', ...),) + >>> template.values + ('World',) + + The :attr:`!strings` tuple has one more element than :attr:`!interpolations` + and :attr:`!values`; the interpolations “belong” between the strings. + This may be easier to understand when tuples are aligned:: + + template.strings: ('Hello ', '!') + template.values: ( 'World', ) + + While literal syntax is the most common way to create :class:`!Template` + instances, it is also possible to create them directly using the constructor: + + >>> from string.templatelib import Interpolation, Template + >>> name = "World" + >>> template = Template("Hello, ", Interpolation(name, "name"), "!") + >>> list(template) + ['Hello, ', Interpolation('World', 'name', None, ''), '!'] + + If two or more consecutive strings are passed, they will be concatenated + into a single value in the :attr:`~Template.strings` attribute. For example, + the following code creates a :class:`Template` with a single final string: + + >>> from string.templatelib import Template + >>> template = Template("Hello ", "World", "!") + >>> template.strings + ('Hello World!',) + + If two or more consecutive interpolations are passed, they will be treated + as separate interpolations and an empty string will be inserted between them. + For example, the following code creates a template with empty placeholders + in the :attr:`~Template.strings` attribute: + + >>> from string.templatelib import Interpolation, Template + >>> template = Template(Interpolation("World", "name"), Interpolation("!", "punctuation")) + >>> template.strings + ('', '', '') + + .. attribute:: strings + :type: tuple[str, ...] + + A :ref:`tuple ` of the static strings in the template. + + >>> name = "World" + >>> t"Hello {name}!".strings + ('Hello ', '!') + + Empty strings *are* included in the tuple: + + >>> name = "World" + >>> t"Hello {name}{name}!".strings + ('Hello ', '', '!') + + The ``strings`` tuple is never empty, and always contains one more + string than the ``interpolations`` and ``values`` tuples: + + >>> t"".strings + ('',) + >>> t"".values + () + >>> t"{'cheese'}".strings + ('', '') + >>> t"{'cheese'}".values + ('cheese',) + + .. attribute:: interpolations + :type: tuple[Interpolation, ...] + + A tuple of the interpolations in the template. + + >>> name = "World" + >>> t"Hello {name}!".interpolations + (Interpolation('World', 'name', None, ''),) + + The ``interpolations`` tuple may be empty and always contains one fewer + values than the ``strings`` tuple: + + >>> t"Hello!".interpolations + () + + .. attribute:: values + :type: tuple[Any, ...] + + A tuple of all interpolated values in the template. + + >>> name = "World" + >>> t"Hello {name}!".values + ('World',) + + The ``values`` tuple always has the same length as the + ``interpolations`` tuple. It is equivalent to + ``tuple(i.value for i in template.interpolations)``. + + .. describe:: iter(template) + + Iterate over the template, yielding each string and + :class:`Interpolation` in order. + + >>> name = "World" + >>> list(t"Hello {name}!") + ['Hello ', Interpolation('World', 'name', None, ''), '!'] + + Empty strings are *not* included in the iteration: + + >>> name = "World" + >>> list(t"Hello {name}{name}") + ['Hello ', Interpolation('World', 'name', None, ''), Interpolation('World', 'name', None, '')] + + .. describe:: template + other + template += other + + Concatenate this template with another, returning a new + :class:`!Template` instance: + + >>> name = "World" + >>> list(t"Hello " + t"there {name}!") + ['Hello there ', Interpolation('World', 'name', None, ''), '!'] + + Concatenation between a :class:`!Template` and a ``str`` is *not* supported. + This is because it is ambiguous whether the string should be treated as + a static string or an interpolation. If you want to concatenate a + :class:`!Template` with a string, you should either wrap the string + directly in a :class:`!Template` (to treat it as a static string) or use + an :class:`!Interpolation` (to treat it as dynamic): + + >>> from string.templatelib import Template, Interpolation + >>> template = t"Hello " + >>> # Treat "there " as a static string + >>> template += Template("there ") + >>> # Treat name as an interpolation + >>> name = "World" + >>> template += Template(Interpolation(name, "name")) + >>> list(template) + ['Hello there ', Interpolation('World', 'name', None, '')] + + +.. class:: Interpolation(value, expression="", conversion=None, format_spec="") + + Create a new :class:`!Interpolation` object. + + :param value: The evaluated, in-scope result of the interpolation. + :type value: object + + :param expression: The text of a valid Python expression, or an empty string. + :type expression: str + + :param conversion: The optional :ref:`conversion ` to be used, one of r, s, and a. + :type conversion: ``Literal["a", "r", "s"] | None`` + + :param format_spec: An optional, arbitrary string used as the :ref:`format specification ` to present the value. + :type format_spec: str + + The :class:`!Interpolation` type represents an expression inside a template string. + + :class:`!Interpolation` instances are immutable: their attributes cannot be + reassigned. + + .. attribute:: value + + :returns: The evaluated value of the interpolation. + :type: object + + >>> t"{1 + 2}".interpolations[0].value + 3 + + .. attribute:: expression + + :returns: The text of a valid Python expression, or an empty string. + :type: str + + The :attr:`~Interpolation.expression` is the original text of the + interpolation's Python expression, if the interpolation was created + from a t-string literal. Developers creating interpolations manually + should either set this to an empty string or choose a suitable valid + Python expression. + + >>> t"{1 + 2}".interpolations[0].expression + '1 + 2' + + .. attribute:: conversion + + :returns: The conversion to apply to the value, or ``None``. + :type: ``Literal["a", "r", "s"] | None`` + + The :attr:`!Interpolation.conversion` is the optional conversion to apply + to the value: + + >>> t"{1 + 2!a}".interpolations[0].conversion + 'a' + + .. note:: + + Unlike f-strings, where conversions are applied automatically, + the expected behavior with t-strings is that code that *processes* the + :class:`!Template` will decide how to interpret and whether to apply + the :attr:`!Interpolation.conversion`. + + .. attribute:: format_spec + + :returns: The format specification to apply to the value. + :type: str + + The :attr:`!Interpolation.format_spec` is an optional, arbitrary string + used as the format specification to present the value: + + >>> t"{1 + 2:.2f}".interpolations[0].format_spec + '.2f' + + .. note:: + + Unlike f-strings, where format specifications are applied automatically + via the :func:`format` protocol, the expected behavior with + t-strings is that code that *processes* the :class:`!Template` will + decide how to interpret and whether to apply the format specification. + As a result, :attr:`!Interpolation.format_spec` values in + :class:`!Template` instances can be arbitrary strings, even those that + do not necessarily conform to the rules of Python's :func:`format` + protocol. + + Interpolations support pattern matching, allowing you to match against + their attributes with the :ref:`match statement `: + + >>> from string.templatelib import Interpolation + >>> interpolation = Interpolation(3.0, "1 + 2", None, ".2f") + >>> match interpolation: + ... case Interpolation(value, expression, conversion, format_spec): + ... print(value, expression, conversion, format_spec) + ... + 3.0 1 + 2 None .2f + + +Helper functions +---------------- + +.. function:: convert(obj, /, conversion) + + Applies formatted string literal :ref:`conversion ` + semantics to the given object *obj*. + This is frequently useful for custom template string processing logic. + + Three conversion flags are currently supported: + + * ``'s'`` which calls :func:`str` on the value, + * ``'r'`` which calls :func:`repr`, and + * ``'a'`` which calls :func:`ascii`. + + If the conversion flag is ``None``, *obj* is returned unchanged. diff --git a/Doc/library/text.rst b/Doc/library/text.rst index 47b678434fc899..92e7dd9a53b80d 100644 --- a/Doc/library/text.rst +++ b/Doc/library/text.rst @@ -16,6 +16,7 @@ Python's built-in string type in :ref:`textseq`. .. toctree:: string.rst + string.templatelib.rst re.rst difflib.rst textwrap.rst diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index e95fa3a6424e23..a416cbb4cc8eab 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -852,8 +852,8 @@ A literal pattern corresponds to most The rule ``strings`` and the token ``NUMBER`` are defined in the :doc:`standard Python grammar <./grammar>`. Triple-quoted strings are -supported. Raw strings and byte strings are supported. :ref:`f-strings` are -not supported. +supported. Raw strings and byte strings are supported. :ref:`f-strings` +and :ref:`t-strings` are not supported. The forms ``signed_number '+' NUMBER`` and ``signed_number '-' NUMBER`` are for expressing :ref:`complex numbers `; they require a real number diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 567c70111c20ec..a7f8e5392b7e71 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -561,9 +561,9 @@ escapes are not treated specially. single: f'; formatted string literal single: f"; formatted string literal -A string literal with ``'f'`` or ``'F'`` in its prefix is a -:dfn:`formatted string literal`; see :ref:`f-strings`. The ``'f'`` may be -combined with ``'r'``, but not with ``'b'`` or ``'u'``, therefore raw +A string literal with ``f`` or ``F`` in its prefix is a +:dfn:`formatted string literal`; see :ref:`f-strings`. The ``f`` may be +combined with ``r``, but not with ``b`` or ``u``, therefore raw formatted strings are possible, but formatted bytes literals are not. In triple-quoted literals, unescaped newlines and quotes are allowed (and are @@ -756,7 +756,7 @@ f-strings .. versionadded:: 3.6 A :dfn:`formatted string literal` or :dfn:`f-string` is a string literal -that is prefixed with ``'f'`` or ``'F'``. These strings may contain +that is prefixed with ``f`` or ``F``. These strings may contain replacement fields, which are expressions delimited by curly braces ``{}``. While other string literals always have a constant value, formatted strings are really expressions evaluated at run time. @@ -913,6 +913,48 @@ See also :pep:`498` for the proposal that added formatted string literals, and :meth:`str.format`, which uses a related format string mechanism. +.. _t-strings: +.. _template-string-literals: + +t-strings +--------- + +.. versionadded:: 3.14 + +A :dfn:`template string literal` or :dfn:`t-string` is a string literal +that is prefixed with ``t`` or ``T``. These strings follow the same +syntax and evaluation rules as :ref:`formatted string literals `, with +the following differences: + +- Rather than evaluating to a ``str`` object, t-strings evaluate to a + :class:`~string.templatelib.Template` object from the + :mod:`string.templatelib` module. + +- The :func:`format` protocol is not used. Instead, the format specifier and + conversions (if any) are passed to a new :class:`~string.templatelib.Interpolation` + object that is created for each evaluated expression. It is up to code that + processes the resulting :class:`~string.templatelib.Template` object to + decide how to handle format specifiers and conversions. + +- Format specifiers containing nested replacement fields are evaluated eagerly, + prior to being passed to the :class:`~string.templatelib.Interpolation` object. + For instance, an interpolation of the form ``{amount:.{precision}f}`` will + evaluate the expression ``{precision}`` before setting the ``format_spec`` + attribute of the resulting :class:`!Interpolation` object; if ``precision`` + is (for example) ``2``, the resulting format specifier will be ``'.2f'``. + +- When the equal sign ``'='`` is provided in an interpolation expression, the + resulting :class:`~string.templatelib.Template` object will have the expression + text along with a ``'='`` character placed in its + :attr:`~string.templatelib.Template.strings` attribute. The + :attr:`~string.templatelib.Template.interpolations` attribute will also + contain an ``Interpolation`` instance for the expression. By default, the + :attr:`~string.templatelib.Interpolation.conversion` attribute will be set to + ``'r'`` (that is, :func:`repr`), unless there is a conversion explicitly + specified (in which case it overrides the default) or a format specifier is + provided (in which case, the ``conversion`` defaults to ``None``). + + .. _numbers: Numeric literals diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 35b8c7cd8eb049..ea546c6a29df44 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -95,10 +95,11 @@ Some examples:: >>> repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" -The :mod:`string` module contains a :class:`~string.Template` class that offers -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. +The :mod:`string` module also contains support for so-called +:ref:`$-strings ` that offer yet another way to +substitute values into strings, using placeholders like ``$x`` and replacing +them with values from a dictionary. This syntax is easy to use, although +it offers much less control of the formatting. .. index:: single: formatted string literal From 4f1f648c3bd36a875501778786bb8d718ab33869 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:25:35 +0200 Subject: [PATCH 0704/1674] [3.14] gh-136251: Improvements to WASM demo REPL (GH-136252) (GH-136977) (cherry picked from commit d1d526afe7ce62c787b150652a2ba136cb949d74) Co-authored-by: adam j hartz Co-authored-by: Hood Chatham --- Makefile.pre.in | 4 +- ...-07-05-15-10-42.gh-issue-136251.GRM6o8.rst | 1 + Python/emscripten_syscalls.c | 2 +- Tools/wasm/README.md | 10 +- .../web_example/{python.html => index.html} | 362 +++++++++++++++--- configure | 2 +- configure.ac | 2 +- 7 files changed, 327 insertions(+), 56 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst rename Tools/wasm/emscripten/web_example/{python.html => index.html} (52%) diff --git a/Makefile.pre.in b/Makefile.pre.in index 66b34b779f27cb..fae5e384d3245f 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1096,7 +1096,7 @@ $(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS) # wasm32-emscripten browser web example WEBEX_DIR=$(srcdir)/Tools/wasm/emscripten/web_example/ -web_example/python.html: $(WEBEX_DIR)/python.html +web_example/index.html: $(WEBEX_DIR)/index.html @mkdir -p web_example @cp $< $@ @@ -1124,7 +1124,7 @@ web_example/python.mjs web_example/python.wasm: $(BUILDPYTHON) cp python.wasm web_example/python.wasm .PHONY: web_example -web_example: web_example/python.mjs web_example/python.worker.mjs web_example/python.html web_example/server.py $(WEB_STDLIB) +web_example: web_example/python.mjs web_example/python.worker.mjs web_example/index.html web_example/server.py $(WEB_STDLIB) ############################################################################ # Header files diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst b/Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst new file mode 100644 index 00000000000000..6a35afe15e3875 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst @@ -0,0 +1 @@ +Fixes and usability improvements for ``Tools/wasm/emscripten/web_example`` diff --git a/Python/emscripten_syscalls.c b/Python/emscripten_syscalls.c index 886262acbc6810..d3eedad30e3639 100644 --- a/Python/emscripten_syscalls.c +++ b/Python/emscripten_syscalls.c @@ -100,7 +100,7 @@ EM_JS_MACROS(void, _emscripten_promising_main_js, (void), { return; } const origResolveGlobalSymbol = resolveGlobalSymbol; - if (!Module.onExit && process?.exit) { + if (!Module.onExit && globalThis?.process?.exit) { Module.onExit = (code) => process.exit(code); } // * wrap the main symbol with WebAssembly.promising, diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 232321c515721e..9288598a0abc29 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -22,7 +22,7 @@ https://github.com/psf/webassembly for more information. ### Build To cross compile to the ``wasm32-emscripten`` platform you need -[the Emscripten compiler toolchain](https://emscripten.org/), +[the Emscripten compiler toolchain](https://emscripten.org/), a Python interpreter, and an installation of Node version 18 or newer. Emscripten version 4.0.2 is recommended; newer versions may also work, but all official testing is performed with that version. All commands below are relative @@ -86,11 +86,11 @@ CLI you will need to write your own alternative to `node_entry.mjs`. ### The Web Example -When building for Emscripten, the web example will be built automatically. It is -in the ``web_example`` directory. To run the web example, ``cd`` into the +When building for Emscripten, the web example will be built automatically. It +is in the ``web_example`` directory. To run the web example, ``cd`` into the ``web_example`` directory, then run ``python server.py``. This will start a web -server; you can then visit ``http://localhost:8000/python.html`` in a browser to -see a simple REPL example. +server; you can then visit ``http://localhost:8000/`` in a browser to see a +simple REPL example. The web example relies on a bug fix in Emscripten version 3.1.73 so if you build with earlier versions of Emscripten it may not work. The web example uses diff --git a/Tools/wasm/emscripten/web_example/python.html b/Tools/wasm/emscripten/web_example/index.html similarity index 52% rename from Tools/wasm/emscripten/web_example/python.html rename to Tools/wasm/emscripten/web_example/index.html index 078f86eb764419..9c89c9c0ed3bf5 100644 --- a/Tools/wasm/emscripten/web_example/python.html +++ b/Tools/wasm/emscripten/web_example/index.html @@ -1,31 +1,39 @@ - - - - - + + + + + wasm-python terminal + > + + +
+ + + diff --git a/Tools/wasm/emscripten/web_example_pyrepl_jspi/src.mjs b/Tools/wasm/emscripten/web_example_pyrepl_jspi/src.mjs new file mode 100644 index 00000000000000..5642372c9d2472 --- /dev/null +++ b/Tools/wasm/emscripten/web_example_pyrepl_jspi/src.mjs @@ -0,0 +1,194 @@ +// Much of this is adapted from here: +// https://github.com/mame/xterm-pty/blob/main/emscripten-pty.js +// Thanks to xterm-pty for making this possible! + +import createEmscriptenModule from "./python.mjs"; +import { openpty } from "https://unpkg.com/xterm-pty/index.mjs"; +import "https://unpkg.com/@xterm/xterm/lib/xterm.js"; + +var term = new Terminal(); +term.open(document.getElementById("terminal")); +const { master, slave: PTY } = openpty(); +term.loadAddon(master); +globalThis.PTY = PTY; + +async function setupStdlib(Module) { + const versionInt = Module.HEAPU32[Module._Py_Version >>> 2]; + const major = (versionInt >>> 24) & 0xff; + const minor = (versionInt >>> 16) & 0xff; + // Prevent complaints about not finding exec-prefix by making a lib-dynload directory + Module.FS.mkdirTree(`/lib/python${major}.${minor}/lib-dynload/`); + const resp = await fetch(`python${major}.${minor}.zip`); + const stdlibBuffer = await resp.arrayBuffer(); + Module.FS.writeFile( + `/lib/python${major}${minor}.zip`, + new Uint8Array(stdlibBuffer), + { canOwn: true }, + ); +} + +const tty_ops = { + ioctl_tcgets: () => { + const termios = PTY.ioctl("TCGETS"); + const data = { + c_iflag: termios.iflag, + c_oflag: termios.oflag, + c_cflag: termios.cflag, + c_lflag: termios.lflag, + c_cc: termios.cc, + }; + return data; + }, + + ioctl_tcsets: (_tty, _optional_actions, data) => { + PTY.ioctl("TCSETS", { + iflag: data.c_iflag, + oflag: data.c_oflag, + cflag: data.c_cflag, + lflag: data.c_lflag, + cc: data.c_cc, + }); + return 0; + }, + + ioctl_tiocgwinsz: () => PTY.ioctl("TIOCGWINSZ").reverse(), + + get_char: () => { + throw new Error("Should not happen"); + }, + put_char: () => { + throw new Error("Should not happen"); + }, + + fsync: () => {}, +}; + +const POLLIN = 1; +const POLLOUT = 4; + +const waitResult = { + READY: 0, + SIGNAL: 1, + TIMEOUT: 2, +}; + +function onReadable() { + var handle; + var promise = new Promise((resolve) => { + handle = PTY.onReadable(() => resolve(waitResult.READY)); + }); + return [promise, handle]; +} + +function onSignal() { + // TODO: signal handling + var handle = { dispose() {} }; + var promise = new Promise((resolve) => {}); + return [promise, handle]; +} + +function onTimeout(timeout) { + var id; + var promise = new Promise((resolve) => { + if (timeout > 0) { + id = setTimeout(resolve, timeout, waitResult.TIMEOUT); + } + }); + var handle = { + dispose() { + if (id) { + clearTimeout(id); + } + }, + }; + return [promise, handle]; +} + +async function waitForReadable(timeout) { + let p1, p2, p3; + let h1, h2, h3; + try { + [p1, h1] = onReadable(); + [p2, h2] = onTimeout(timeout); + [p3, h3] = onSignal(); + return await Promise.race([p1, p2, p3]); + } finally { + h1.dispose(); + h2.dispose(); + h3.dispose(); + } +} + +const FIONREAD = 0x541b; + +const tty_stream_ops = { + async readAsync(stream, buffer, offset, length, pos /* ignored */) { + let readBytes = PTY.read(length); + if (length && !readBytes.length) { + const status = await waitForReadable(-1); + if (status === waitResult.READY) { + readBytes = PTY.read(length); + } else { + throw new Error("Not implemented"); + } + } + buffer.set(readBytes, offset); + return readBytes.length; + }, + + write: (stream, buffer, offset, length) => { + // Note: default `buffer` is for some reason `HEAP8` (signed), while we want unsigned `HEAPU8`. + buffer = new Uint8Array( + buffer.buffer, + buffer.byteOffset, + buffer.byteLength, + ); + const toWrite = Array.from(buffer.subarray(offset, offset + length)); + PTY.write(toWrite); + return length; + }, + + async pollAsync(stream, timeout) { + if (!PTY.readable && timeout) { + await waitForReadable(timeout); + } + return (PTY.readable ? POLLIN : 0) | (PTY.writable ? POLLOUT : 0); + }, + ioctl(stream, request, varargs) { + if (request === FIONREAD) { + const res = PTY.fromLdiscToUpperBuffer.length; + Module.HEAPU32[varargs / 4] = res; + return 0; + } + throw new Error("Unimplemented ioctl request"); + }, +}; + +async function setupStdio(Module) { + Object.assign(Module.TTY.default_tty_ops, tty_ops); + Object.assign(Module.TTY.stream_ops, tty_stream_ops); +} + +const emscriptenSettings = { + async preRun(Module) { + Module.addRunDependency("pre-run"); + Module.ENV.TERM = "xterm-256color"; + // Uncomment next line to turn on tracing (messages go to browser console). + // Module.ENV.PYREPL_TRACE = "1"; + + // Leak module so we can try to show traceback if we crash on startup + globalThis.Module = Module; + await Promise.all([setupStdlib(Module), setupStdio(Module)]); + Module.removeRunDependency("pre-run"); + }, +}; + +try { + await createEmscriptenModule(emscriptenSettings); +} catch (e) { + // Show JavaScript exception and traceback + console.warn(e); + // Show Python exception and traceback + Module.__Py_DumpTraceback(2, Module._PyGILState_GetThisThreadState()); + process.exit(1); +} diff --git a/configure b/configure index 946cd471f64d32..345822a6c6df76 100755 --- a/configure +++ b/configure @@ -9603,7 +9603,7 @@ fi as_fn_append LDFLAGS_NODIST " -sWASM_BIGINT" as_fn_append LINKFORSHARED " -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js" - as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV,HEAPU32" + as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV,HEAPU32,TTY" as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,__Py_DumpTraceback" as_fn_append LINKFORSHARED " -sSTACK_SIZE=5MB" as_fn_append LINKFORSHARED " -sTEXTDECODER=2" @@ -31196,9 +31196,7 @@ case $ac_sys_system in #( - py_cv_module_fcntl=n/a py_cv_module_readline=n/a - py_cv_module_termios=n/a py_cv_module_=n/a ;; #( diff --git a/configure.ac b/configure.ac index 6b15beb050c1af..d6059471771871 100644 --- a/configure.ac +++ b/configure.ac @@ -2335,7 +2335,7 @@ AS_CASE([$ac_sys_system], dnl Include file system support AS_VAR_APPEND([LINKFORSHARED], [" -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js"]) - AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV,HEAPU32"]) + AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV,HEAPU32,TTY"]) AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,__Py_DumpTraceback"]) AS_VAR_APPEND([LINKFORSHARED], [" -sSTACK_SIZE=5MB"]) dnl Avoid bugs in JS fallback string decoding path @@ -7778,9 +7778,7 @@ AS_CASE([$ac_sys_system], ) dnl fcntl, readline, and termios are not particularly useful in browsers. PY_STDLIB_MOD_SET_NA( - [fcntl], [readline], - [termios], ) ], [WASI], [ From c328d140eb85df760a40ca58ab0b27195c550560 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 18:15:27 +0200 Subject: [PATCH 0708/1674] [3.14] Fix code example in `annotationlib` documentation (GH-136972) (#137002) Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> --- Doc/library/annotationlib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/annotationlib.rst b/Doc/library/annotationlib.rst index 7dfc11449a6cbc..981d89be7d58d6 100644 --- a/Doc/library/annotationlib.rst +++ b/Doc/library/annotationlib.rst @@ -511,7 +511,7 @@ code execution even with no access to any globals or builtins. For example: >>> def f(x: (1).__class__.__base__.__subclasses__()[-1].__init__.__builtins__["print"]("Hello world")): pass ... - >>> annotationlib.get_annotations(f, format=annotationlib.Format.SOURCE) + >>> annotationlib.get_annotations(f, format=annotationlib.Format.STRING) Hello world {'x': 'None'} From 805daa2edb19b78f76291d7a3147a06a5670a112 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 22 Jul 2025 19:16:31 +0300 Subject: [PATCH 0709/1674] [3.14] Revert "gh-112068: C API: Add support of nullable arguments in PyArg_Parse (GH-121303)" (GH-136991) (#137006) --- Doc/c-api/arg.rst | 15 -- Doc/whatsnew/3.14.rst | 5 - Lib/test/test_capi/test_getargs.py | 117 --------- Lib/test/test_mmap.py | 2 +- Misc/NEWS.d/3.14.0b1.rst | 2 +- ...-07-22-15-18-08.gh-issue-112068.4WvT-8.rst | 1 + Modules/_ctypes/_ctypes.c | 12 +- Modules/_interpretersmodule.c | 9 +- Modules/_json.c | 13 +- Modules/_threadmodule.c | 18 +- Modules/mmapmodule.c | 15 +- Python/getargs.c | 247 ++++++------------ 12 files changed, 139 insertions(+), 317 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index ab9f9c4539ae9a..112169635d999a 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -113,18 +113,14 @@ There are three ways strings and buffers can be converted to C: ``z`` (:class:`str` or ``None``) [const char \*] Like ``s``, but the Python object may also be ``None``, in which case the C pointer is set to ``NULL``. - It is the same as ``s?`` with the C pointer was initialized to ``NULL``. ``z*`` (:class:`str`, :term:`bytes-like object` or ``None``) [Py_buffer] Like ``s*``, but the Python object may also be ``None``, in which case the ``buf`` member of the :c:type:`Py_buffer` structure is set to ``NULL``. - It is the same as ``s*?`` with the ``buf`` member of the :c:type:`Py_buffer` - structure was initialized to ``NULL``. ``z#`` (:class:`str`, read-only :term:`bytes-like object` or ``None``) [const char \*, :c:type:`Py_ssize_t`] Like ``s#``, but the Python object may also be ``None``, in which case the C pointer is set to ``NULL``. - It is the same as ``s#?`` with the C pointer was initialized to ``NULL``. ``y`` (read-only :term:`bytes-like object`) [const char \*] This format converts a bytes-like object to a C pointer to a @@ -387,17 +383,6 @@ Other objects Non-tuple sequences are deprecated if *items* contains format units which store a borrowed buffer or a borrowed reference. -``unit?`` (anything or ``None``) [*matching-variable(s)*] - ``?`` modifies the behavior of the preceding format unit. - The C variable(s) corresponding to that parameter should be initialized - to their default value --- when the argument is ``None``, - :c:func:`PyArg_ParseTuple` does not touch the contents of the corresponding - C variable(s). - If the argument is not ``None``, it is parsed according to the specified - format unit. - - .. versionadded:: 3.14 - A few other characters have a meaning in a format string. These may not occur inside nested parentheses. They are: diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 2906828e05d229..2517dd93885d7f 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -2940,11 +2940,6 @@ New features file. (Contributed by Victor Stinner in :gh:`127350`.) -* Add support of nullable arguments in :c:func:`PyArg_ParseTuple` and - similar functions. - Adding ``?`` after any format unit makes ``None`` be accepted as a value. - (Contributed by Serhiy Storchaka in :gh:`112068`.) - * The ``k`` and ``K`` formats in :c:func:`PyArg_ParseTuple` and similar functions now use :meth:`~object.__index__` if available, like all other integer formats. diff --git a/Lib/test/test_capi/test_getargs.py b/Lib/test/test_capi/test_getargs.py index 67a8da7599511f..700870b6266717 100644 --- a/Lib/test/test_capi/test_getargs.py +++ b/Lib/test/test_capi/test_getargs.py @@ -1389,123 +1389,6 @@ def test_nested_sequence(self): "argument 1 must be sequence of length 1, not 0"): parse(([],), {}, '(' + f + ')', ['a']) - def test_specific_type_errors(self): - parse = _testcapi.parse_tuple_and_keywords - - def check(format, arg, expected, got='list'): - errmsg = f'must be {expected}, not {got}' - with self.assertRaisesRegex(TypeError, errmsg): - parse((arg,), {}, format, ['a']) - - check('k', [], 'int') - check('k?', [], 'int or None') - check('K', [], 'int') - check('K?', [], 'int or None') - check('c', [], 'a byte string of length 1') - check('c?', [], 'a byte string of length 1 or None') - check('c', b'abc', 'a byte string of length 1', - 'a bytes object of length 3') - check('c?', b'abc', 'a byte string of length 1 or None', - 'a bytes object of length 3') - check('c', bytearray(b'abc'), 'a byte string of length 1', - 'a bytearray object of length 3') - check('c?', bytearray(b'abc'), 'a byte string of length 1 or None', - 'a bytearray object of length 3') - check('C', [], 'a unicode character') - check('C?', [], 'a unicode character or None') - check('C', 'abc', 'a unicode character', - 'a string of length 3') - check('C?', 'abc', 'a unicode character or None', - 'a string of length 3') - check('s', [], 'str') - check('s?', [], 'str or None') - check('z', [], 'str or None') - check('z?', [], 'str or None') - check('es', [], 'str') - check('es?', [], 'str or None') - check('es#', [], 'str') - check('es#?', [], 'str or None') - check('et', [], 'str, bytes or bytearray') - check('et?', [], 'str, bytes, bytearray or None') - check('et#', [], 'str, bytes or bytearray') - check('et#?', [], 'str, bytes, bytearray or None') - check('w*', [], 'read-write bytes-like object') - check('w*?', [], 'read-write bytes-like object or None') - check('S', [], 'bytes') - check('S?', [], 'bytes or None') - check('U', [], 'str') - check('U?', [], 'str or None') - check('Y', [], 'bytearray') - check('Y?', [], 'bytearray or None') - check('(OO)', 42, '2-item tuple', 'int') - check('(OO)?', 42, '2-item tuple or None', 'int') - check('(OO)', (1, 2, 3), 'tuple of length 2', '3') - - def test_nullable(self): - parse = _testcapi.parse_tuple_and_keywords - - def check(format, arg, allows_none=False): - # Because some format units (such as y*) require cleanup, - # we force the parsing code to perform the cleanup by adding - # an argument that always fails. - # By checking for an exception, we ensure that the parsing - # of the first argument was successful. - self.assertRaises(OverflowError, parse, - (arg, 256), {}, format + '?b', ['a', 'b']) - self.assertRaises(OverflowError, parse, - (None, 256), {}, format + '?b', ['a', 'b']) - self.assertRaises(OverflowError, parse, - (arg, 256), {}, format + 'b', ['a', 'b']) - self.assertRaises(OverflowError if allows_none else TypeError, parse, - (None, 256), {}, format + 'b', ['a', 'b']) - - check('b', 42) - check('B', 42) - check('h', 42) - check('H', 42) - check('i', 42) - check('I', 42) - check('n', 42) - check('l', 42) - check('k', 42) - check('L', 42) - check('K', 42) - check('f', 2.5) - check('d', 2.5) - check('D', 2.5j) - check('c', b'a') - check('C', 'a') - check('p', True, allows_none=True) - check('y', b'buffer') - check('y*', b'buffer') - check('y#', b'buffer') - check('s', 'string') - check('s*', 'string') - check('s#', 'string') - check('z', 'string', allows_none=True) - check('z*', 'string', allows_none=True) - check('z#', 'string', allows_none=True) - check('w*', bytearray(b'buffer')) - check('U', 'string') - check('S', b'bytes') - check('Y', bytearray(b'bytearray')) - check('O', object, allows_none=True) - - check('(OO)', (1, 2)) - self.assertEqual(parse((((1, 2), 3),), {}, '((OO)?O)', ['a']), (1, 2, 3)) - self.assertEqual(parse(((None, 3),), {}, '((OO)?O)', ['a']), (NULL, NULL, 3)) - self.assertEqual(parse((((1, 2), 3),), {}, '((OO)O)', ['a']), (1, 2, 3)) - self.assertRaises(TypeError, parse, ((None, 3),), {}, '((OO)O)', ['a']) - - parse((None,), {}, 'es?', ['a']) - parse((None,), {}, 'es#?', ['a']) - parse((None,), {}, 'et?', ['a']) - parse((None,), {}, 'et#?', ['a']) - parse((None,), {}, 'O!?', ['a']) - parse((None,), {}, 'O&?', ['a']) - - # TODO: More tests for es?, es#?, et?, et#?, O!, O& - @unittest.skipIf(_testinternalcapi is None, 'needs _testinternalcapi') def test_gh_119213(self): rc, out, err = script_helper.assert_python_ok("-c", """if True: diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index fd4197b7086976..b2a299ed172967 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -732,7 +732,7 @@ def test_tagname(self): m2.close() m1.close() - with self.assertRaisesRegex(TypeError, 'must be str or None'): + with self.assertRaisesRegex(TypeError, 'tagname'): mmap.mmap(-1, 8, tagname=1) @cpython_only diff --git a/Misc/NEWS.d/3.14.0b1.rst b/Misc/NEWS.d/3.14.0b1.rst index f76896954f321d..f2dd631358550b 100644 --- a/Misc/NEWS.d/3.14.0b1.rst +++ b/Misc/NEWS.d/3.14.0b1.rst @@ -2012,7 +2012,7 @@ interpreter. .. nonce: ofI5Fl .. section: C API -Add support of nullable arguments in :c:func:`PyArg_Parse` and similar +[Reverted in :gh:`136991`] Add support of nullable arguments in :c:func:`PyArg_Parse` and similar functions. Adding ``?`` after any format unit makes ``None`` be accepted as a value. diff --git a/Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst b/Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst new file mode 100644 index 00000000000000..018c5c7880c001 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst @@ -0,0 +1 @@ +Revert support of nullable arguments in :c:func:`PyArg_Parse`. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 55a446d02b27f3..08e00adfd0c3e6 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3918,7 +3918,9 @@ _validate_paramflags(ctypes_state *st, PyTypeObject *type, PyObject *paramflags) PyObject *name = Py_None; PyObject *defval; PyObject *typ; - if (!PyArg_ParseTuple(item, "i|U?O", &flag, &name, &defval)) { + if (!PyArg_ParseTuple(item, "i|OO", &flag, &name, &defval) || + !(name == Py_None || PyUnicode_Check(name))) + { PyErr_SetString(PyExc_TypeError, "paramflags must be a sequence of (int [,string [,value]]) tuples"); return 0; @@ -3983,8 +3985,10 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) void *handle; PyObject *paramflags = NULL; - if (!PyArg_ParseTuple(args, "O|O?", &ftuple, ¶mflags)) + if (!PyArg_ParseTuple(args, "O|O", &ftuple, ¶mflags)) return NULL; + if (paramflags == Py_None) + paramflags = NULL; ftuple = PySequence_Tuple(ftuple); if (!ftuple) @@ -4116,8 +4120,10 @@ PyCFuncPtr_FromVtblIndex(PyTypeObject *type, PyObject *args, PyObject *kwds) GUID *iid = NULL; Py_ssize_t iid_len = 0; - if (!PyArg_ParseTuple(args, "is|O?z#", &index, &name, ¶mflags, &iid, &iid_len)) + if (!PyArg_ParseTuple(args, "is|Oz#", &index, &name, ¶mflags, &iid, &iid_len)) return NULL; + if (paramflags == Py_None) + paramflags = NULL; ctypes_state *st = get_module_state_by_def(Py_TYPE(type)); if (!_validate_paramflags(st, type, paramflags)) { diff --git a/Modules/_interpretersmodule.c b/Modules/_interpretersmodule.c index 9426ce72733c28..faf3b25b68c4eb 100644 --- a/Modules/_interpretersmodule.c +++ b/Modules/_interpretersmodule.c @@ -1415,11 +1415,14 @@ interp_get_config(PyObject *self, PyObject *args, PyObject *kwds) PyObject *idobj = NULL; int restricted = 0; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "O?|$p:get_config", kwlist, + "O|$p:get_config", kwlist, &idobj, &restricted)) { return NULL; } + if (idobj == Py_None) { + idobj = NULL; + } int reqready = 0; PyInterpreterState *interp = \ @@ -1536,14 +1539,14 @@ capture_exception(PyObject *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"exc", NULL}; PyObject *exc_arg = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "|O?:capture_exception", kwlist, + "|O:capture_exception", kwlist, &exc_arg)) { return NULL; } PyObject *exc = exc_arg; - if (exc == NULL) { + if (exc == NULL || exc == Py_None) { exc = PyErr_GetRaisedException(); if (exc == NULL) { Py_RETURN_NONE; diff --git a/Modules/_json.c b/Modules/_json.c index 6c381fab449db2..2f82a69a1579dc 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1228,16 +1228,23 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", NULL}; PyEncoderObject *s; - PyObject *markers = Py_None, *defaultfn, *encoder, *indent, *key_separator; + PyObject *markers, *defaultfn, *encoder, *indent, *key_separator; PyObject *item_separator; int sort_keys, skipkeys, allow_nan; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!?OOOUUppp:make_encoder", kwlist, - &PyDict_Type, &markers, &defaultfn, &encoder, &indent, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOUUppp:make_encoder", kwlist, + &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, &sort_keys, &skipkeys, &allow_nan)) return NULL; + if (markers != Py_None && !PyDict_Check(markers)) { + PyErr_Format(PyExc_TypeError, + "make_encoder() argument 1 must be dict or None, " + "not %.200s", Py_TYPE(markers)->tp_name); + return NULL; + } + s = (PyEncoderObject *)type->tp_alloc(type, 0); if (s == NULL) return NULL; diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 121b0f803715af..775cd704cda4ed 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -667,12 +667,12 @@ PyThreadHandleObject_join(PyObject *op, PyObject *args) PyThreadHandleObject *self = PyThreadHandleObject_CAST(op); PyObject *timeout_obj = NULL; - if (!PyArg_ParseTuple(args, "|O?:join", &timeout_obj)) { + if (!PyArg_ParseTuple(args, "|O:join", &timeout_obj)) { return NULL; } PyTime_t timeout_ns = -1; - if (timeout_obj != NULL) { + if (timeout_obj != NULL && timeout_obj != Py_None) { if (_PyTime_FromSecondsObject(&timeout_ns, timeout_obj, _PyTime_ROUND_TIMEOUT) < 0) { return NULL; @@ -1945,10 +1945,10 @@ thread_PyThread_start_joinable_thread(PyObject *module, PyObject *fargs, PyObject *func = NULL; int daemon = 1; thread_module_state *state = get_thread_state(module); - PyObject *hobj = Py_None; + PyObject *hobj = NULL; if (!PyArg_ParseTupleAndKeywords(fargs, fkwargs, - "O|O!?p:start_joinable_thread", keywords, - &func, state->thread_handle_type, &hobj, &daemon)) { + "O|Op:start_joinable_thread", keywords, + &func, &hobj, &daemon)) { return NULL; } @@ -1958,6 +1958,14 @@ thread_PyThread_start_joinable_thread(PyObject *module, PyObject *fargs, return NULL; } + if (hobj == NULL) { + hobj = Py_None; + } + else if (hobj != Py_None && !Py_IS_TYPE(hobj, state->thread_handle_type)) { + PyErr_SetString(PyExc_TypeError, "'handle' must be a _ThreadHandle"); + return NULL; + } + if (PySys_Audit("_thread.start_joinable_thread", "OiO", func, daemon, hobj) < 0) { return NULL; diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index d9e8c60209dae3..e2ae967ce0c33d 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -23,6 +23,7 @@ #endif #include +#include "pycore_abstract.h" // _Py_convert_optional_to_ssize_t() #include "pycore_bytesobject.h" // _PyBytes_Find() #include "pycore_fileutils.h" // _Py_stat_struct #include "pycore_weakref.h" // FT_CLEAR_WEAKREFS() @@ -515,7 +516,7 @@ mmap_read_method(PyObject *op, PyObject *args) mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "|n?:read", &num_bytes)) + if (!PyArg_ParseTuple(args, "|O&:read", _Py_convert_optional_to_ssize_t, &num_bytes)) return NULL; CHECK_VALID(NULL); @@ -1709,7 +1710,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) DWORD off_lo; /* lower 32 bits of offset */ DWORD size_hi; /* upper 32 bits of size */ DWORD size_lo; /* lower 32 bits of size */ - PyObject *tagname = NULL; + PyObject *tagname = Py_None; DWORD dwErr = 0; int fileno; HANDLE fh = 0; @@ -1719,7 +1720,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) "tagname", "access", "offset", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "in|U?iL", keywords, + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "in|OiL", keywords, &fileno, &map_size, &tagname, &access, &offset)) { return NULL; @@ -1852,7 +1853,13 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) m_obj->weakreflist = NULL; m_obj->exports = 0; /* set the tag name */ - if (tagname != NULL) { + if (!Py_IsNone(tagname)) { + if (!PyUnicode_Check(tagname)) { + Py_DECREF(m_obj); + return PyErr_Format(PyExc_TypeError, "expected str or None for " + "'tagname', not %.200s", + Py_TYPE(tagname)->tp_name); + } m_obj->tagname = PyUnicode_AsWideCharString(tagname, NULL); if (m_obj->tagname == NULL) { Py_DECREF(m_obj); diff --git a/Python/getargs.c b/Python/getargs.c index 0cf596285cc7b5..9d3dea0cb4364b 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1,8 +1,6 @@ /* New getargs implementation */ -#include - #define PY_CXX_CONST const #include "Python.h" #include "pycore_abstract.h" // _PyNumber_Index() @@ -468,12 +466,9 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, const char *format = *p_format; int i; Py_ssize_t len; - bool nullable = false; int istuple = PyTuple_Check(arg); int mustbetuple = istuple; - assert(*format == '('); - format++; for (;;) { int c = *format++; if (c == '(') { @@ -482,12 +477,8 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, level++; } else if (c == ')') { - if (level == 0) { - if (*format == '?') { - nullable = true; - } + if (level == 0) break; - } level--; } else if (c == ':' || c == ';' || c == '\0') @@ -524,13 +515,6 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } } - if (arg == Py_None && nullable) { - const char *msg = skipitem(p_format, p_va, flags); - if (msg != NULL) { - levels[0] = 0; - } - return msg; - } if (istuple) { /* fallthrough */ } @@ -539,10 +523,9 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, { levels[0] = 0; PyOS_snprintf(msgbuf, bufsize, - "must be %d-item tuple%s, not %.50s", - n, - nullable ? " or None" : "", - arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); + "must be %d-item tuple, not %.50s", + n, + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); return msgbuf; } else { @@ -579,7 +562,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, return msgbuf; } - format = *p_format + 1; + format = *p_format; for (i = 0; i < n; i++) { const char *msg; PyObject *item = PyTuple_GET_ITEM(arg, i); @@ -594,10 +577,6 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } } - format++; - if (*format == '?') { - format++; - } *p_format = format; if (!istuple) { Py_DECREF(arg); @@ -616,8 +595,11 @@ convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, const char *format = *p_format; if (*format == '(' /* ')' */) { + format++; msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, bufsize, freelist); + if (msg == NULL) + format++; } else { msg = convertsimple(arg, &format, p_va, flags, @@ -647,7 +629,7 @@ _PyArg_BadArgument(const char *fname, const char *displayname, } static const char * -converterr(bool nullable, const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) +converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) { assert(expected != NULL); assert(arg != NULL); @@ -657,23 +639,20 @@ converterr(bool nullable, const char *expected, PyObject *arg, char *msgbuf, siz } else { PyOS_snprintf(msgbuf, bufsize, - "must be %.50s%s, not %.50s", expected, - nullable ? " or None" : "", + "must be %.50s, not %.50s", expected, arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } return msgbuf; } static const char * -convertcharerr(bool nullable, const char *expected, const char *what, Py_ssize_t size, +convertcharerr(const char *expected, const char *what, Py_ssize_t size, char *msgbuf, size_t bufsize) { assert(expected != NULL); PyOS_snprintf(msgbuf, bufsize, - "must be %.50s%s, not %.50s of length %zd", - expected, - nullable ? " or None" : "", - what, size); + "must be %.50s, not %.50s of length %zd", + expected, what, size); return msgbuf; } @@ -693,26 +672,15 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, char *msgbuf, size_t bufsize, freelist_t *freelist) { #define RETURN_ERR_OCCURRED return msgbuf -#define HANDLE_NULLABLE \ - if (*format == '?') { \ - format++; \ - if (arg == Py_None) { \ - break; \ - } \ - nullable = true; \ - } - const char *format = *p_format; char c = *format++; const char *sarg; - bool nullable = false; switch (c) { case 'b': { /* unsigned byte -- very short int */ unsigned char *p = va_arg(*p_va, unsigned char *); - HANDLE_NULLABLE; long ival = PyLong_AsLong(arg); if (ival == -1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -726,6 +694,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, "unsigned byte integer is greater than maximum"); RETURN_ERR_OCCURRED; } + else *p = (unsigned char) ival; break; } @@ -733,7 +702,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'B': {/* byte sized bitfield - both signed and unsigned values allowed */ unsigned char *p = va_arg(*p_va, unsigned char *); - HANDLE_NULLABLE; unsigned long ival = PyLong_AsUnsignedLongMask(arg); if (ival == (unsigned long)-1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -744,7 +712,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'h': {/* signed short int */ short *p = va_arg(*p_va, short *); - HANDLE_NULLABLE; long ival = PyLong_AsLong(arg); if (ival == -1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -766,7 +733,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'H': { /* short int sized bitfield, both signed and unsigned allowed */ unsigned short *p = va_arg(*p_va, unsigned short *); - HANDLE_NULLABLE; unsigned long ival = PyLong_AsUnsignedLongMask(arg); if (ival == (unsigned long)-1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -777,7 +743,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'i': {/* signed int */ int *p = va_arg(*p_va, int *); - HANDLE_NULLABLE; long ival = PyLong_AsLong(arg); if (ival == -1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -799,7 +764,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'I': { /* int sized bitfield, both signed and unsigned allowed */ unsigned int *p = va_arg(*p_va, unsigned int *); - HANDLE_NULLABLE; unsigned long ival = PyLong_AsUnsignedLongMask(arg); if (ival == (unsigned long)-1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -812,7 +776,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, { PyObject *iobj; Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); - HANDLE_NULLABLE; Py_ssize_t ival = -1; iobj = _PyNumber_Index(arg); if (iobj != NULL) { @@ -826,7 +789,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } case 'l': {/* long int */ long *p = va_arg(*p_va, long *); - HANDLE_NULLABLE; long ival = PyLong_AsLong(arg); if (ival == -1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -837,10 +799,9 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'k': { /* long sized bitfield */ unsigned long *p = va_arg(*p_va, unsigned long *); - HANDLE_NULLABLE; unsigned long ival; if (!PyIndex_Check(arg)) { - return converterr(nullable, "int", arg, msgbuf, bufsize); + return converterr("int", arg, msgbuf, bufsize); } ival = PyLong_AsUnsignedLongMask(arg); if (ival == (unsigned long)(long)-1 && PyErr_Occurred()) { @@ -852,7 +813,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'L': {/* long long */ long long *p = va_arg( *p_va, long long * ); - HANDLE_NULLABLE; long long ival = PyLong_AsLongLong(arg); if (ival == (long long)-1 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -863,10 +823,9 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'K': { /* long long sized bitfield */ unsigned long long *p = va_arg(*p_va, unsigned long long *); - HANDLE_NULLABLE; unsigned long long ival; if (!PyIndex_Check(arg)) { - return converterr(nullable, "int", arg, msgbuf, bufsize); + return converterr("int", arg, msgbuf, bufsize); } ival = PyLong_AsUnsignedLongLongMask(arg); if (ival == (unsigned long long)(long long)-1 && PyErr_Occurred()) { @@ -878,7 +837,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'f': {/* float */ float *p = va_arg(*p_va, float *); - HANDLE_NULLABLE; double dval = PyFloat_AsDouble(arg); if (dval == -1.0 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -889,7 +847,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'd': {/* double */ double *p = va_arg(*p_va, double *); - HANDLE_NULLABLE; double dval = PyFloat_AsDouble(arg); if (dval == -1.0 && PyErr_Occurred()) RETURN_ERR_OCCURRED; @@ -900,7 +857,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'D': {/* complex double */ Py_complex *p = va_arg(*p_va, Py_complex *); - HANDLE_NULLABLE; Py_complex cval; cval = PyComplex_AsCComplex(arg); if (PyErr_Occurred()) @@ -912,10 +868,9 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'c': {/* char */ char *p = va_arg(*p_va, char *); - HANDLE_NULLABLE; if (PyBytes_Check(arg)) { if (PyBytes_GET_SIZE(arg) != 1) { - return convertcharerr(nullable, "a byte string of length 1", + return convertcharerr("a byte string of length 1", "a bytes object", PyBytes_GET_SIZE(arg), msgbuf, bufsize); } @@ -923,28 +878,27 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } else if (PyByteArray_Check(arg)) { if (PyByteArray_GET_SIZE(arg) != 1) { - return convertcharerr(nullable, "a byte string of length 1", + return convertcharerr("a byte string of length 1", "a bytearray object", PyByteArray_GET_SIZE(arg), msgbuf, bufsize); } *p = PyByteArray_AS_STRING(arg)[0]; } else - return converterr(nullable, "a byte string of length 1", arg, msgbuf, bufsize); + return converterr("a byte string of length 1", arg, msgbuf, bufsize); break; } case 'C': {/* unicode char */ int *p = va_arg(*p_va, int *); - HANDLE_NULLABLE; int kind; const void *data; if (!PyUnicode_Check(arg)) - return converterr(nullable, "a unicode character", arg, msgbuf, bufsize); + return converterr("a unicode character", arg, msgbuf, bufsize); if (PyUnicode_GET_LENGTH(arg) != 1) { - return convertcharerr(nullable, "a unicode character", + return convertcharerr("a unicode character", "a string", PyUnicode_GET_LENGTH(arg), msgbuf, bufsize); } @@ -957,7 +911,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'p': {/* boolean *p*redicate */ int *p = va_arg(*p_va, int *); - HANDLE_NULLABLE; int val = PyObject_IsTrue(arg); if (val > 0) *p = 1; @@ -976,31 +929,24 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, const char *buf; Py_ssize_t count; if (*format == '*') { - format++; - HANDLE_NULLABLE; if (getbuffer(arg, (Py_buffer*)p, &buf) < 0) - return converterr(nullable, buf, arg, msgbuf, bufsize); + return converterr(buf, arg, msgbuf, bufsize); + format++; if (addcleanup(p, freelist, cleanup_buffer)) { return converterr( - nullable, "(cleanup problem)", + "(cleanup problem)", arg, msgbuf, bufsize); } break; } - else if (*format == '#') { + count = convertbuffer(arg, (const void **)p, &buf); + if (count < 0) + return converterr(buf, arg, msgbuf, bufsize); + if (*format == '#') { Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*); - format++; - HANDLE_NULLABLE; - count = convertbuffer(arg, (const void **)p, &buf); - if (count < 0) - return converterr(nullable, buf, arg, msgbuf, bufsize); *psize = count; - } - else { - HANDLE_NULLABLE; - count = convertbuffer(arg, (const void **)p, &buf); - if (count < 0) - return converterr(nullable, buf, arg, msgbuf, bufsize); + format++; + } else { if (strlen(*p) != (size_t)count) { PyErr_SetString(PyExc_ValueError, "embedded null byte"); RETURN_ERR_OCCURRED; @@ -1016,35 +962,32 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, /* "s*" or "z*" */ Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); - format++; - HANDLE_NULLABLE; if (c == 'z' && arg == Py_None) PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0); else if (PyUnicode_Check(arg)) { Py_ssize_t len; sarg = PyUnicode_AsUTF8AndSize(arg, &len); if (sarg == NULL) - return converterr(nullable, CONV_UNICODE, + return converterr(CONV_UNICODE, arg, msgbuf, bufsize); PyBuffer_FillInfo(p, arg, (void *)sarg, len, 1, 0); } else { /* any bytes-like object */ const char *buf; if (getbuffer(arg, p, &buf) < 0) - return converterr(nullable, buf, arg, msgbuf, bufsize); + return converterr(buf, arg, msgbuf, bufsize); } if (addcleanup(p, freelist, cleanup_buffer)) { return converterr( - nullable, "(cleanup problem)", + "(cleanup problem)", arg, msgbuf, bufsize); } + format++; } else if (*format == '#') { /* a string or read-only bytes-like object */ /* "s#" or "z#" */ const void **p = (const void **)va_arg(*p_va, const char **); Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*); - format++; - HANDLE_NULLABLE; if (c == 'z' && arg == Py_None) { *p = NULL; *psize = 0; @@ -1053,7 +996,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, Py_ssize_t len; sarg = PyUnicode_AsUTF8AndSize(arg, &len); if (sarg == NULL) - return converterr(nullable, CONV_UNICODE, + return converterr(CONV_UNICODE, arg, msgbuf, bufsize); *p = sarg; *psize = len; @@ -1063,22 +1006,22 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, const char *buf; Py_ssize_t count = convertbuffer(arg, p, &buf); if (count < 0) - return converterr(nullable, buf, arg, msgbuf, bufsize); + return converterr(buf, arg, msgbuf, bufsize); *psize = count; } + format++; } else { /* "s" or "z" */ const char **p = va_arg(*p_va, const char **); Py_ssize_t len; sarg = NULL; - HANDLE_NULLABLE; if (c == 'z' && arg == Py_None) *p = NULL; else if (PyUnicode_Check(arg)) { sarg = PyUnicode_AsUTF8AndSize(arg, &len); if (sarg == NULL) - return converterr(nullable, CONV_UNICODE, + return converterr(CONV_UNICODE, arg, msgbuf, bufsize); if (strlen(sarg) != (size_t)len) { PyErr_SetString(PyExc_ValueError, "embedded null character"); @@ -1087,7 +1030,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, *p = sarg; } else - return converterr(c == 'z' || nullable, "str", + return converterr(c == 'z' ? "str or None" : "str", arg, msgbuf, bufsize); } break; @@ -1116,46 +1059,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, recode_strings = 0; else return converterr( - nullable, "(unknown parser marker combination)", + "(unknown parser marker combination)", arg, msgbuf, bufsize); buffer = (char **)va_arg(*p_va, char **); format++; if (buffer == NULL) - return converterr(nullable, "(buffer is NULL)", + return converterr("(buffer is NULL)", arg, msgbuf, bufsize); - Py_ssize_t *psize = NULL; - if (*format == '#') { - /* Using buffer length parameter '#': - - - if *buffer is NULL, a new buffer of the - needed size is allocated and the data - copied into it; *buffer is updated to point - to the new buffer; the caller is - responsible for PyMem_Free()ing it after - usage - - - if *buffer is not NULL, the data is - copied to *buffer; *buffer_len has to be - set to the size of the buffer on input; - buffer overflow is signalled with an error; - buffer has to provide enough room for the - encoded string plus the trailing 0-byte - - - in both cases, *buffer_len is updated to - the size of the buffer /excluding/ the - trailing 0-byte - - */ - psize = va_arg(*p_va, Py_ssize_t*); - - format++; - if (psize == NULL) { - return converterr( - nullable, "(buffer_len is NULL)", - arg, msgbuf, bufsize); - } - } - HANDLE_NULLABLE; /* Encode object */ if (!recode_strings && @@ -1176,7 +1086,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, encoding, NULL); if (s == NULL) - return converterr(nullable, "(encoding failed)", + return converterr("(encoding failed)", arg, msgbuf, bufsize); assert(PyBytes_Check(s)); size = PyBytes_GET_SIZE(s); @@ -1186,15 +1096,42 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } else { return converterr( - nullable, - recode_strings ? "str" - : nullable ? "str, bytes, bytearray" - : "str, bytes or bytearray", + recode_strings ? "str" : "str, bytes or bytearray", arg, msgbuf, bufsize); } /* Write output; output is guaranteed to be 0-terminated */ - if (psize != NULL) { + if (*format == '#') { + /* Using buffer length parameter '#': + + - if *buffer is NULL, a new buffer of the + needed size is allocated and the data + copied into it; *buffer is updated to point + to the new buffer; the caller is + responsible for PyMem_Free()ing it after + usage + + - if *buffer is not NULL, the data is + copied to *buffer; *buffer_len has to be + set to the size of the buffer on input; + buffer overflow is signalled with an error; + buffer has to provide enough room for the + encoded string plus the trailing 0-byte + + - in both cases, *buffer_len is updated to + the size of the buffer /excluding/ the + trailing 0-byte + + */ + Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*); + + format++; + if (psize == NULL) { + Py_DECREF(s); + return converterr( + "(buffer_len is NULL)", + arg, msgbuf, bufsize); + } if (*buffer == NULL) { *buffer = PyMem_NEW(char, size + 1); if (*buffer == NULL) { @@ -1205,7 +1142,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, if (addcleanup(buffer, freelist, cleanup_ptr)) { Py_DECREF(s); return converterr( - nullable, "(cleanup problem)", + "(cleanup problem)", arg, msgbuf, bufsize); } } else { @@ -1239,7 +1176,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, if ((Py_ssize_t)strlen(ptr) != size) { Py_DECREF(s); return converterr( - nullable, "encoded string without null bytes", + "encoded string without null bytes", arg, msgbuf, bufsize); } *buffer = PyMem_NEW(char, size + 1); @@ -1250,7 +1187,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } if (addcleanup(buffer, freelist, cleanup_ptr)) { Py_DECREF(s); - return converterr(nullable, "(cleanup problem)", + return converterr("(cleanup problem)", arg, msgbuf, bufsize); } memcpy(*buffer, ptr, size+1); @@ -1261,32 +1198,29 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'S': { /* PyBytes object */ PyObject **p = va_arg(*p_va, PyObject **); - HANDLE_NULLABLE; if (PyBytes_Check(arg)) *p = arg; else - return converterr(nullable, "bytes", arg, msgbuf, bufsize); + return converterr("bytes", arg, msgbuf, bufsize); break; } case 'Y': { /* PyByteArray object */ PyObject **p = va_arg(*p_va, PyObject **); - HANDLE_NULLABLE; if (PyByteArray_Check(arg)) *p = arg; else - return converterr(nullable, "bytearray", arg, msgbuf, bufsize); + return converterr("bytearray", arg, msgbuf, bufsize); break; } case 'U': { /* PyUnicode object */ PyObject **p = va_arg(*p_va, PyObject **); - HANDLE_NULLABLE; if (PyUnicode_Check(arg)) { *p = arg; } else - return converterr(nullable, "str", arg, msgbuf, bufsize); + return converterr("str", arg, msgbuf, bufsize); break; } @@ -1297,11 +1231,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, type = va_arg(*p_va, PyTypeObject*); p = va_arg(*p_va, PyObject **); format++; - HANDLE_NULLABLE; if (PyType_IsSubtype(Py_TYPE(arg), type)) *p = arg; else - return converterr(nullable, type->tp_name, arg, msgbuf, bufsize); + return converterr(type->tp_name, arg, msgbuf, bufsize); } else if (*format == '&') { @@ -1310,18 +1243,16 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, void *addr = va_arg(*p_va, void *); int res; format++; - HANDLE_NULLABLE; if (! (res = (*convert)(arg, addr))) - return converterr(nullable, "(unspecified)", + return converterr("(unspecified)", arg, msgbuf, bufsize); if (res == Py_CLEANUP_SUPPORTED && addcleanup(addr, freelist, convert) == -1) - return converterr(nullable, "(cleanup problem)", + return converterr("(cleanup problem)", arg, msgbuf, bufsize); } else { p = va_arg(*p_va, PyObject **); - HANDLE_NULLABLE; *p = arg; } break; @@ -1333,30 +1264,29 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, if (*format != '*') return converterr( - nullable, "(invalid use of 'w' format character)", + "(invalid use of 'w' format character)", arg, msgbuf, bufsize); format++; - HANDLE_NULLABLE; /* Caller is interested in Py_buffer, and the object supports it directly. The request implicitly asks for PyBUF_SIMPLE, so the result is C-contiguous with format 'B'. */ if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) { PyErr_Clear(); - return converterr(nullable, "read-write bytes-like object", + return converterr("read-write bytes-like object", arg, msgbuf, bufsize); } assert(PyBuffer_IsContiguous((Py_buffer *)p, 'C')); if (addcleanup(p, freelist, cleanup_buffer)) { return converterr( - nullable, "(cleanup problem)", + "(cleanup problem)", arg, msgbuf, bufsize); } break; } default: - return converterr(nullable, "(impossible)", arg, msgbuf, bufsize); + return converterr("(impossible)", arg, msgbuf, bufsize); } @@ -2751,9 +2681,6 @@ skipitem(const char **p_format, va_list *p_va, int flags) return "impossible"; } - if (*format == '?') { - format++; - } *p_format = format; return NULL; From 715c658bf87d00874a0c1a1db10ea3f9b29ab48b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 22 Jul 2025 18:21:19 +0200 Subject: [PATCH 0710/1674] [3.14] Fix tables in 'Using on Windows' for the text writer (GH-137012) (#137015) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/using/windows.rst | 362 +++++++++++++++++++++++++----------------- 1 file changed, 213 insertions(+), 149 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 9628da3d2f6b12..a5e203a867724f 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -385,50 +385,77 @@ The following settings are those that are considered likely to be modified in normal use. Later sections list those that are intended for administrative customization. -.. csv-table:: Standard configuration options - :header: "Config Key", "Environment Variable", "Description" - :widths: 2, 2, 4 - - ``default_tag``,``PYTHON_MANAGER_DEFAULT``,"The preferred default - version to launch or install. By default, this is interpreted as the most - recent non-prerelease version from the CPython team. - " - ``default_platform``,``PYTHON_MANAGER_DEFAULT_PLATFORM``,"The preferred - default platform to launch or install. This is treated as a suffix to the - specified tag, such that ``py -V:3.14`` would prefer an install for - ``3.14-64`` if it exists (and ``default_platform`` is ``-64``), but will use - ``3.14`` if no tagged install exists. - " - ``logs_dir``,``PYTHON_MANAGER_LOGS``,"The location where log files are - written. By default, :file:`%TEMP%`. - " - ``automatic_install``,``PYTHON_MANAGER_AUTOMATIC_INSTALL``,"True to - allow automatic installs when specifying a particular runtime to launch. - By default, true. - " - ``include_unmanaged``,``PYTHON_MANAGER_INCLUDE_UNMANAGED``,"True to - allow listing and launching runtimes that were not installed by the Python - install manager, or false to exclude them. By default, true. - " - ``shebang_can_run_anything``,"``PYTHON_MANAGER_SHEBANG_CAN_RUN_ANYTHING`` - ","True to allow shebangs in ``.py`` files to launch applications other than - Python runtimes, or false to prevent it. By default, true. - " - ``log_level``,"``PYMANAGER_VERBOSE``, ``PYMANAGER_DEBUG``","Set - the default level of output (0-50) By default, 20. Lower values produce more - output. The environment variables are boolean, and may produce additional - output during startup that is later suppressed by other configuration. - " - ``confirm``,``PYTHON_MANAGER_CONFIRM``,"True to confirm certain actions - before taking them (such as uninstall), or false to skip the confirmation. By - default, true. - " - ``install.source``,``PYTHON_MANAGER_SOURCE_URL``,"Override the index - feed to obtain new installs from. - " - ``list.format``,``PYTHON_MANAGER_LIST_FORMAT``,"Specify the default - format used by the ``py list`` command. By default, ``table``. - " +.. Sphinx bug with text writer; remove widths & caption temporarily +.. :widths: 2, 2, 4 + +.. rubric:: Standard configuration options + +.. list-table:: + :header-rows: 1 + + * - Config Key + - Environment Variable + - Description + + * - ``default_tag`` + - ``PYTHON_MANAGER_DEFAULT`` + - The preferred default version to launch or install. + By default, this is interpreted as the most recent non-prerelease version + from the CPython team. + + * - ``default_platform`` + - ``PYTHON_MANAGER_DEFAULT_PLATFORM`` + - The preferred default platform to launch or install. + This is treated as a suffix to the specified tag, such that ``py -V:3.14`` + would prefer an install for ``3.14-64`` if it exists + (and ``default_platform`` is ``-64``), + but will use ``3.14`` if no tagged install exists. + + * - ``logs_dir`` + - ``PYTHON_MANAGER_LOGS`` + - The location where log files are written. + By default, :file:`%TEMP%`. + + * - ``automatic_install`` + - ``PYTHON_MANAGER_AUTOMATIC_INSTALL`` + - True to allow automatic installs when specifying a particular runtime + to launch. + By default, true. + + * - ``include_unmanaged`` + - ``PYTHON_MANAGER_INCLUDE_UNMANAGED`` + - True to allow listing and launching runtimes that were not installed + by the Python install manager, or false to exclude them. + By default, true. + + * - ``shebang_can_run_anything`` + - ``PYTHON_MANAGER_SHEBANG_CAN_RUN_ANYTHING`` + - True to allow shebangs in ``.py`` files to launch applications other than + Python runtimes, or false to prevent it. + By default, true. + + * - ``log_level`` + - ``PYMANAGER_VERBOSE``, ``PYMANAGER_DEBUG`` + - Set the default level of output (0-50). + By default, 20. + Lower values produce more output. + The environment variables are boolean, and may produce additional + output during startup that is later suppressed by other configuration. + + * - ``confirm`` + - ``PYTHON_MANAGER_CONFIRM`` + - True to confirm certain actions before taking them (such as uninstall), + or false to skip the confirmation. + By default, true. + + * - ``install.source`` + - ``PYTHON_MANAGER_SOURCE_URL`` + - Override the index feed to obtain new installs from. + + * - ``list.format`` + - ``PYTHON_MANAGER_LIST_FORMAT`` + - Specify the default format used by the ``py list`` command. + By default, ``table``. Dotted names should be nested inside JSON objects, for example, ``list.format`` would be specified as ``{"list": {"format": "table"}}``. @@ -492,7 +519,7 @@ which the path to the script and any additional arguments will be appended. This functionality may be disabled by the ``shebang_can_run_anything`` configuration option. -.. note: +.. note:: The behaviour of shebangs in the Python install manager is subtly different from the previous ``py.exe`` launcher, and the old configuration options no @@ -638,46 +665,64 @@ variable will be used instead. Configuration settings that are paths are interpreted as relative to the directory containing the configuration file that specified them. -.. csv-table:: Administrative configuration options - :header: "Config Key", "Description" - :widths: 1, 4 - - ``base_config``,"The highest priority configuration file to read. Note that - only the built-in configuration file and the registry can modify this - setting. - " - ``user_config``,"The second configuration file to read. - " - ``additional_config``,"The third configuration file to read. - " - ``registry_override_key``,"Registry location to check for overrides. Note - that only the built-in configuration file can modify this setting. - " - ``bundled_dir``,"Read-only directory containing locally cached files. - " - ``install.fallback_source``,"Path or URL to an index to consult when the - main index cannot be accessed. - " - ``install.enable_shortcut_kinds``,"Comma-separated list of shortcut kinds - to allow (e.g. ``""pep514,start""``). Enabled shortcuts may still be disabled - by ``disable_shortcut_kinds``. - " - ``install.disable_shortcut_kinds``,"Comma-separated list of shortcut kinds - to exclude (e.g. ``""pep514,start""``). Disabled shortcuts are not - reactivated by ``enable_shortcut_kinds``. - " - ``pep514_root``,"Registry location to read and write PEP 514 entries into. - By default, :file:`HKEY_CURRENT_USER\\Software\\Python`. - " - ``start_folder``,"Start menu folder to write shortcuts into. By default, - ``Python``. This path is relative to the user's Programs folder. - " - ``virtual_env``,"Path to the active virtual environment. By default, this - is ``%VIRTUAL_ENV%``, but may be set empty to disable venv detection. - " - ``shebang_can_run_anything_silently``,"True to suppress visible warnings - when a shebang launches an application other than a Python runtime. - " +.. Sphinx bug with text writer; remove widths & caption temporarily +.. :widths: 1, 4 + +.. rubric:: Administrative configuration options + +.. list-table:: + :header-rows: 1 + + * - Config Key + - Description + + * - ``base_config`` + - The highest priority configuration file to read. + Note that only the built-in configuration file and the registry can + modify this setting. + + * - ``user_config`` + - The second configuration file to read. + + * - ``additional_config`` + - The third configuration file to read. + + * - ``registry_override_key`` + - Registry location to check for overrides. + Note that only the built-in configuration file can modify this setting. + + * - ``bundled_dir`` + - Read-only directory containing locally cached files. + + * - ``install.fallback_source`` + - Path or URL to an index to consult when the main index cannot be accessed. + + * - ``install.enable_shortcut_kinds`` + - Comma-separated list of shortcut kinds to allow (e.g. ``"pep514,start"``). + Enabled shortcuts may still be disabled by ``disable_shortcut_kinds``. + + * - ``install.disable_shortcut_kinds`` + - Comma-separated list of shortcut kinds to exclude + (e.g. ``"pep514,start"``). + Disabled shortcuts are not reactivated by ``enable_shortcut_kinds``. + + * - ``pep514_root`` + - Registry location to read and write PEP 514 entries into. + By default, :file:`HKEY_CURRENT_USER\\Software\\Python`. + + * - ``start_folder`` + - Start menu folder to write shortcuts into. + By default, ``Python``. + This path is relative to the user's Programs folder. + + * - ``virtual_env`` + - Path to the active virtual environment. + By default, this is ``%VIRTUAL_ENV%``, but may be set empty + to disable venv detection. + + * - ``shebang_can_run_anything_silently`` + - True to suppress visible warnings when a shebang launches an application + other than a Python runtime. .. _install-freethreaded-windows: @@ -716,70 +761,89 @@ issue at `our bug tracker `_, including any relevant log files (written to your :file:`%TEMP%` directory by default). -.. csv-table:: Troubleshooting - :header: "Symptom", "Things to try" - :widths: 1, 1 - - "``python`` gives me a ""command not found"" error or opens the Store app - when I type it in my terminal.", "Did you :ref:`install the Python install - manager `? - " - "", "Click Start, open ""Manage app execution aliases"", and check that the - aliases for ""Python (default)"" are enabled. If they already are, try - disabling and re-enabling to refresh the command. The ""Python (default - windowed)"" and ""Python install manager"" commands may also need refreshing. - " - "", "Check that the ``py`` and ``pymanager`` commands work. - " - "``py`` gives me a ""command not found"" error when I type it in my - terminal.","Did you :ref:`install the Python install manager `? - " - "", "Click Start, open ""Manage app execution aliases"", and check that the - aliases for ""Python install manager"" are enabled. If they already are, try - disabling and re-enabling to refresh the command. The ""Python (default - windowed)"" and ""Python install manager"" commands may also need refreshing. - " - "``py`` gives me a ""can't open file"" error when I type commands in my - terminal.", "This usually means you have the legacy launcher installed and it - has priority over the Python install manager. To remove, click Start, open - ""Installed apps"", search for ""Python launcher"" and uninstall it. - " - "``python`` doesn't launch the same runtime as ``py``", "Click Start, open - ""Installed apps"", look for any existing Python runtimes, and either remove - them or Modify and disable the :envvar:`PATH` options. - " - "", "Click Start, open ""Manage app execution aliases"", and check that your - ``python.exe`` alias is set to ""Python (default)"" - " - "``python`` and ``py`` don't launch the runtime I expect", "Check your - ``PYTHON_MANAGER_DEFAULT`` environment variable or ``default_tag`` - configuration. The ``py list`` command will show your default based on these - settings. - " - "", "Installs that are managed by the Python install manager will be chosen - ahead of unmanaged installs. Use ``py install`` to install the runtime you - expect, or configure your default tag. - " - "", "Prerelease and experimental installs that are not managed by the Python - install manager may be chosen ahead of stable releases. Configure your - default tag or uninstall the prerelease runtime and reinstall using ``py - install``. - " - "``pythonw`` or ``pyw`` don't launch the same runtime as ``python`` or - ``py``","Click Start, open ""Manage app execution aliases"", and check that - your ``pythonw.exe`` and ``pyw.exe`` aliases are consistent with your - others. - " - "``pip`` gives me a ""command not found"" error when I type it in my - terminal.","Have you activated a virtual environment? Run the - ``.venv\Scripts\activate`` script in your terminal to activate. - " - "","The package may be available but missing the generated executable. - We recommend using the ``python -m pip`` command instead, or alternatively - the ``python -m pip install --force pip`` command will recreate the - executables and show you the path to add to :envvar:`PATH`. These scripts are - separated for each runtime, and so you may need to add multiple paths. - " +.. Sphinx bug with text writer; remove widths & caption temporarily +.. :widths: 1, 1 + +.. rubric:: Troubleshooting + +.. list-table:: + :header-rows: 1 + + * - Symptom + - Things to try + + * - ``python`` gives me a "command not found" error or opens the Store app + when I type it in my terminal. + - Did you :ref:`install the Python install manager `? + + * - + - Click Start, open "Manage app execution aliases", and check that the + aliases for "Python (default)" are enabled. + If they already are, try disabling and re-enabling to refresh the command. + The "Python (default windowed)" and "Python install manager" commands + may also need refreshing. + + * - + - Check that the ``py`` and ``pymanager`` commands work. + + * - ``py`` gives me a "command not found" error when I type it in my terminal. + - Did you :ref:`install the Python install manager `? + + * - + - Click Start, open "Manage app execution aliases", and check that the + aliases for "Python (default)" are enabled. + If they already are, try disabling and re-enabling to refresh the command. + The "Python (default windowed)" and "Python install manager" commands + may also need refreshing. + + * - ``py`` gives me a "can't open file" error when I type commands in my + terminal. + - This usually means you have the legacy launcher installed and + it has priority over the Python install manager. + To remove, click Start, open "Installed apps", + search for "Python launcher" and uninstall it. + + * - ``python`` doesn't launch the same runtime as ``py`` + - Click Start, open "Installed apps", look for any existing Python runtimes, + and either remove them or Modify and disable the :envvar:`PATH` options. + + * - + - Click Start, open "Manage app execution aliases", and check that your + ``python.exe`` alias is set to "Python (default)" + + * - ``python`` and ``py`` don't launch the runtime I expect + - Check your ``PYTHON_MANAGER_DEFAULT`` environment variable + or ``default_tag`` configuration. + The ``py list`` command will show your default based on these settings. + + * - + - Installs that are managed by the Python install manager will be chosen + ahead of unmanaged installs. + Use ``py install`` to install the runtime you expect, + or configure your default tag. + + * - + - Prerelease and experimental installs that are not managed by the Python + install manager may be chosen ahead of stable releases. + Configure your default tag or uninstall the prerelease runtime + and reinstall using ``py install``. + + * - ``pythonw`` or ``pyw`` don't launch the same runtime as ``python`` or ``py`` + - Click Start, open "Manage app execution aliases", and check that your + ``pythonw.exe`` and ``pyw.exe`` aliases are consistent with your others. + + * - ``pip`` gives me a "command not found" error when I type it in my terminal. + - Have you activated a virtual environment? + Run the ``.venv\Scripts\activate`` script in your terminal to activate. + + * - + - The package may be available but missing the generated executable. + We recommend using the ``python -m pip`` command instead, + or alternatively the ``python -m pip install --force pip`` command + will recreate the executables and show you the path to + add to :envvar:`PATH`. + These scripts are separated for each runtime, and so you may need to + add multiple paths. .. _windows-embeddable: From 70990ed5cad5b886a7f595923724706a222c5945 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 22 Jul 2025 09:23:53 -0700 Subject: [PATCH 0711/1674] =?UTF-8?q?[3.14]=20Revert=20"[3.14]=20gh-135228?= =?UTF-8?q?:=20When=20@dataclass(slots=3DTrue)=20replaces=E2=80=A6=20(#137?= =?UTF-8?q?013)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/dataclasses.py | 15 -------- Lib/test/test_dataclasses/__init__.py | 35 ------------------- ...-07-20-16-56-55.gh-issue-135228.n_XIao.rst | 4 --- 3 files changed, 54 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 22b78bb2fbe6ed..83ea623dce6281 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1338,13 +1338,6 @@ def _add_slots(cls, is_frozen, weakref_slot, defined_fields): or _update_func_cell_for__class__(member.fdel, cls, newcls)): break - # gh-135228: Make sure the original class can be garbage collected. - # Bypass mapping proxy to allow __dict__ to be removed - old_cls_dict = cls.__dict__ | _deproxier - old_cls_dict.pop('__dict__', None) - if "__weakref__" in cls.__dict__: - del cls.__weakref__ - return newcls @@ -1739,11 +1732,3 @@ def _replace(self, /, **changes): # changes that aren't fields, this will correctly raise a # TypeError. return self.__class__(**changes) - - -# Hack to the get the underlying dict out of a mappingproxy -# Use it with: cls.__dict__ | _deproxier -class _Deproxier: - def __ror__(self, other): - return other -_deproxier = _Deproxier() diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index 6bf5e5b3e5554b..e98a8f284cec9f 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -3804,41 +3804,6 @@ class WithCorrectSuper(CorrectSuper): # that we create internally. self.assertEqual(CorrectSuper.args, ["default", "default"]) - def test_original_class_is_gced(self): - # gh-135228: Make sure when we replace the class with slots=True, the original class - # gets garbage collected. - def make_simple(): - @dataclass(slots=True) - class SlotsTest: - pass - - return SlotsTest - - def make_with_annotations(): - @dataclass(slots=True) - class SlotsTest: - x: int - - return SlotsTest - - def make_with_annotations_and_method(): - @dataclass(slots=True) - class SlotsTest: - x: int - - def method(self) -> int: - return self.x - - return SlotsTest - - for make in (make_simple, make_with_annotations, make_with_annotations_and_method): - with self.subTest(make=make): - C = make() - support.gc_collect() - candidates = [cls for cls in object.__subclasses__() if cls.__name__ == 'SlotsTest' - and cls.__firstlineno__ == make.__code__.co_firstlineno + 1] - self.assertEqual(candidates, [C]) - class TestDescriptors(unittest.TestCase): def test_set_name(self): diff --git a/Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst b/Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst deleted file mode 100644 index ee8962c6f46e75..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-20-16-56-55.gh-issue-135228.n_XIao.rst +++ /dev/null @@ -1,4 +0,0 @@ -When :mod:`dataclasses` replaces a class with a slotted dataclass, the -original class is now garbage collected again. Earlier changes in Python -3.14 caused this class to remain in existence together with the replacement -class synthesized by :mod:`dataclasses`. From 48f88310044c6ef877f3b0761cf7afece2f8fb3a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 22 Jul 2025 19:42:27 +0300 Subject: [PATCH 0712/1674] Python 3.14.0rc1 --- Include/patchlevel.h | 6 +- Lib/pydoc_data/topics.py | 33 +- Misc/NEWS.d/3.14.0rc1.rst | 316 ++++++++++++++++++ ...-07-18-17-15-00.gh-issue-135621.9cyCNb.rst | 2 - ...-05-20-17-13-51.gh-issue-134009.CpCmry.rst | 1 - ...-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst | 3 - ...-07-22-15-18-08.gh-issue-112068.4WvT-8.rst | 1 - ...-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst | 1 - ...5-05-17-20-56-05.gh-issue-91153.afgtG2.rst | 1 - ...-06-03-21-06-22.gh-issue-133136.Usnvri.rst | 2 - ...-06-06-02-24-42.gh-issue-135148.r-t2sC.rst | 3 - ...-06-12-00-03-34.gh-issue-116738.iBBAdo.rst | 1 - ...-07-08-23-22-08.gh-issue-132661.34ftJl.rst | 5 - ...-07-08-23-53-51.gh-issue-132661.B84iYt.rst | 1 - ...-07-10-15-53-16.gh-issue-136525.xAko0e.rst | 2 - ...-07-10-23-23-50.gh-issue-136517._NHJyv.rst | 2 - ...-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst | 3 - ...-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst | 1 - ...-07-19-12-37-05.gh-issue-136801.XU_tF2.rst | 1 - ...-05-25-11-02-05.gh-issue-134657.3YFhR9.rst | 1 - ...-06-28-11-32-57.gh-issue-134759.AjjKcG.rst | 2 - ...-07-07-22-12-32.gh-issue-136380.1b_nXl.rst | 3 - ...-07-08-20-58-01.gh-issue-136434.uuJsjS.rst | 2 - ...-07-09-20-29-30.gh-issue-136476.HyLLzh.rst | 2 - ...-07-10-00-47-37.gh-issue-136470.KlUEUG.rst | 2 - ...5-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst | 3 - ...-07-11-03-39-15.gh-issue-136523.s7caKL.rst | 1 - ...-07-11-23-04-39.gh-issue-136549.oAi8u4.rst | 1 - ...-07-19-16-20-54.gh-issue-130645.O-dYcN.rst | 1 - ...-07-20-16-02-00.gh-issue-136874.cLC3o1.rst | 1 - ...-07-21-16-10-24.gh-issue-124621.wyoWc1.rst | 1 - ...-07-21-22-35-50.gh-issue-136170.QUlc78.rst | 3 - ...-06-09-20-38-25.gh-issue-118350.KgWCcP.rst | 2 - ...-07-21-14-15-25.gh-issue-135661.nAxXw5.rst | 2 - ...-07-05-15-10-42.gh-issue-136251.GRM6o8.rst | 1 - README.rst | 4 +- 36 files changed, 340 insertions(+), 77 deletions(-) create mode 100644 Misc/NEWS.d/3.14.0rc1.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-21-16-10-24.gh-issue-124621.wyoWc1.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-06-09-20-38-25.gh-issue-118350.KgWCcP.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 77fc8aeb918cf6..c926ee8c32b738 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,11 +20,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 14 #define PY_MICRO_VERSION 0 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA -#define PY_RELEASE_SERIAL 4 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.14.0b4+" +#define PY_VERSION "3.14.0rc1" /*--end constants--*/ diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index e32517960d44d1..71b1917de1c395 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Tue Jul 8 11:57:16 2025 +# Autogenerated by Sphinx on Tue Jul 22 19:42:37 2025 # as part of the release process. topics = { @@ -2328,7 +2328,8 @@ def foo(): The rule "strings" and the token "NUMBER" are defined in the standard Python grammar. Triple-quoted strings are supported. Raw strings and -byte strings are supported. f-strings are not supported. +byte strings are supported. f-strings and t-strings are not +supported. The forms "signed_number '+' NUMBER" and "signed_number '-' NUMBER" are for expressing complex numbers; they require a real number on the @@ -5232,9 +5233,9 @@ class of the instance or a *non-virtual base class* thereof. The The "str.format()" method and the "Formatter" class share the same syntax for format strings (although in the case of "Formatter", subclasses can define their own format string syntax). The syntax is -related to that of formatted string literals, but it is less -sophisticated and, in particular, does not support arbitrary -expressions. +related to that of formatted string literals and template string +literals, but it is less sophisticated and, in particular, does not +support arbitrary expressions. Format strings contain “replacement fields” surrounded by curly braces "{}". Anything that is not contained in braces is considered literal @@ -5334,9 +5335,9 @@ class of the instance or a *non-virtual base class* thereof. The “Format specifications” are used within replacement fields contained within a format string to define how individual values are presented -(see Format String Syntax and f-strings). They can also be passed -directly to the built-in "format()" function. Each formattable type -may define how the format specification is to be interpreted. +(see Format String Syntax, f-strings, and t-strings). They can also be +passed directly to the built-in "format()" function. Each formattable +type may define how the format specification is to be interpreted. Most built-in types implement the following options for format specifications, although some of the formatting options are only @@ -10264,10 +10265,10 @@ class is used in a class pattern with positional arguments, each ("u'value'") was reintroduced to simplify the maintenance of dual Python 2.x and 3.x codebases. See **PEP 414** for more information. -A string literal with "'f'" or "'F'" in its prefix is a *formatted -string literal*; see f-strings. The "'f'" may be combined with "'r'", -but not with "'b'" or "'u'", therefore raw formatted strings are -possible, but formatted bytes literals are not. +A string literal with "f" or "F" in its prefix is a *formatted string +literal*; see f-strings. The "f" may be combined with "r", but not +with "b" or "u", therefore raw formatted strings are possible, but +formatted bytes literals are not. In triple-quoted literals, unescaped newlines and quotes are allowed (and are retained), except that three unescaped quotes in a row @@ -12703,7 +12704,9 @@ class dict(iterable, **kwargs) | | replaced by the contents of the | | | | iterable *t* | | +--------------------------------+----------------------------------+-----------------------+ -| "del s[i:j]" | same as "s[i:j] = []" | | +| "del s[i:j]" | removes the elements of "s[i:j]" | | +| | from the list (same as "s[i:j] = | | +| | []") | | +--------------------------------+----------------------------------+-----------------------+ | "s[i:j:k] = t" | the elements of "s[i:j:k]" are | (1) | | | replaced by those of *t* | | @@ -13033,7 +13036,9 @@ class range(start, stop[, step]) | | replaced by the contents of the | | | | iterable *t* | | +--------------------------------+----------------------------------+-----------------------+ -| "del s[i:j]" | same as "s[i:j] = []" | | +| "del s[i:j]" | removes the elements of "s[i:j]" | | +| | from the list (same as "s[i:j] = | | +| | []") | | +--------------------------------+----------------------------------+-----------------------+ | "s[i:j:k] = t" | the elements of "s[i:j:k]" are | (1) | | | replaced by those of *t* | | diff --git a/Misc/NEWS.d/3.14.0rc1.rst b/Misc/NEWS.d/3.14.0rc1.rst new file mode 100644 index 00000000000000..b7e9a2a7b122fc --- /dev/null +++ b/Misc/NEWS.d/3.14.0rc1.rst @@ -0,0 +1,316 @@ +.. date: 2025-07-05-15-10-42 +.. gh-issue: 136251 +.. nonce: GRM6o8 +.. release date: 2025-07-22 +.. section: Tools/Demos + +Fixes and usability improvements for ``Tools/wasm/emscripten/web_example`` + +.. + +.. date: 2025-07-21-14-15-25 +.. gh-issue: 135661 +.. nonce: nAxXw5 +.. section: Security + +Fix parsing attributes with whitespaces around the ``=`` separator in +:class:`html.parser.HTMLParser` according to the HTML5 standard. + +.. + +.. date: 2025-06-09-20-38-25 +.. gh-issue: 118350 +.. nonce: KgWCcP +.. section: Security + +Fix support of escapable raw text mode (elements "textarea" and "title") in +:class:`html.parser.HTMLParser`. + +.. + +.. date: 2025-07-21-22-35-50 +.. gh-issue: 136170 +.. nonce: QUlc78 +.. section: Library + +Removed the unreleased ``zipfile.ZipFile.data_offset`` property added in +3.14.0a7 as it wasn't fully clear which behavior it should have in some +situations so the result was not always what a user might expect. + +.. + +.. date: 2025-07-21-16-10-24 +.. gh-issue: 124621 +.. nonce: wyoWc1 +.. section: Library + +pyrepl now works in Emscripten. + +.. + +.. date: 2025-07-20-16-02-00 +.. gh-issue: 136874 +.. nonce: cLC3o1 +.. section: Library + +Discard URL query and fragment in :func:`urllib.request.url2pathname`. + +.. + +.. date: 2025-07-19-16-20-54 +.. gh-issue: 130645 +.. nonce: O-dYcN +.. section: Library + +Enable color help by default in :mod:`argparse`. + +.. + +.. date: 2025-07-11-23-04-39 +.. gh-issue: 136549 +.. nonce: oAi8u4 +.. section: Library + +Fix signature of :func:`threading.excepthook`. + +.. + +.. date: 2025-07-11-03-39-15 +.. gh-issue: 136523 +.. nonce: s7caKL +.. section: Library + +Fix :class:`wave.Wave_write` emitting an unraisable when open raises. + +.. + +.. date: 2025-07-10-10-18-19 +.. gh-issue: 52876 +.. nonce: 9Vjrd8 +.. section: Library + +Add missing ``keepends`` (default ``True``) parameter to +:meth:`!codecs.StreamReaderWriter.readline` and +:meth:`!codecs.StreamReaderWriter.readlines`. + +.. + +.. date: 2025-07-10-00-47-37 +.. gh-issue: 136470 +.. nonce: KlUEUG +.. section: Library + +Correct :class:`concurrent.futures.InterpreterPoolExecutor`'s default thread +name. + +.. + +.. date: 2025-07-09-20-29-30 +.. gh-issue: 136476 +.. nonce: HyLLzh +.. section: Library + +Fix a bug that was causing the ``get_async_stack_trace`` function to miss +some frames in the stack trace. + +.. + +.. date: 2025-07-08-20-58-01 +.. gh-issue: 136434 +.. nonce: uuJsjS +.. section: Library + +Fix docs generation of ``UnboundItem`` in :mod:`concurrent.interpreters` +when running with :option:`-OO`. + +.. + +.. date: 2025-07-07-22-12-32 +.. gh-issue: 136380 +.. nonce: 1b_nXl +.. section: Library + +Raises :exc:`AttributeError` when accessing +:class:`concurrent.futures.InterpreterPoolExecutor` and subinterpreters are +not available. + +.. + +.. date: 2025-06-28-11-32-57 +.. gh-issue: 134759 +.. nonce: AjjKcG +.. section: Library + +Fix :exc:`UnboundLocalError` in :func:`email.message.Message.get_payload` +when the payload to decode is a :class:`bytes` object. Patch by Kliment +Lamonov. + +.. + +.. date: 2025-05-25-11-02-05 +.. gh-issue: 134657 +.. nonce: 3YFhR9 +.. section: Library + +:mod:`asyncio`: Remove some private names from ``asyncio.__all__``. + +.. + +.. date: 2025-07-19-12-37-05 +.. gh-issue: 136801 +.. nonce: XU_tF2 +.. section: Core and Builtins + +Fix PyREPL syntax highlighting on match cases after multi-line case. +Contributed by Olga Matoula. + +.. + +.. date: 2025-07-12-09-59-14 +.. gh-issue: 136421 +.. nonce: ZD1rNj +.. section: Core and Builtins + +Fix crash when initializing :mod:`datetime` concurrently. + +.. + +.. date: 2025-07-11-13-45-48 +.. gh-issue: 136541 +.. nonce: uZ_-Ju +.. section: Core and Builtins + +Fix some issues with the perf trampolines on x86-64 and aarch64. The +trampolines were not being generated correctly for some cases, which could +lead to the perf integration not working correctly. Patch by Pablo Galindo. + +.. + +.. date: 2025-07-10-23-23-50 +.. gh-issue: 136517 +.. nonce: _NHJyv +.. section: Core and Builtins + +Fixed a typo that prevented printing of uncollectable objects when the +:const:`gc.DEBUG_UNCOLLECTABLE` mode was set. + +.. + +.. date: 2025-07-10-15-53-16 +.. gh-issue: 136525 +.. nonce: xAko0e +.. section: Core and Builtins + +Fix issue where per-thread bytecode was not instrumented for newly created +threads. + +.. + +.. date: 2025-07-08-23-53-51 +.. gh-issue: 132661 +.. nonce: B84iYt +.. section: Core and Builtins + +``Interpolation.expression`` now has a default, the empty string. + +.. + +.. date: 2025-07-08-23-22-08 +.. gh-issue: 132661 +.. nonce: 34ftJl +.. section: Core and Builtins + +Reflect recent :pep:`750` change. + +Disallow concatenation of ``string.templatelib.Template`` and :class:`str`. +Also, disallow implicit concatenation of t-string literals with string or +f-string literals. + +.. + +.. date: 2025-06-12-00-03-34 +.. gh-issue: 116738 +.. nonce: iBBAdo +.. section: Core and Builtins + +Make functions in :mod:`grp` thread-safe on the :term:`free threaded ` build. + +.. + +.. date: 2025-06-06-02-24-42 +.. gh-issue: 135148 +.. nonce: r-t2sC +.. section: Core and Builtins + +Fixed a bug where f-string debug expressions (using =) would incorrectly +strip out parts of strings containing escaped quotes and # characters. Patch +by Pablo Galindo. + +.. + +.. date: 2025-06-03-21-06-22 +.. gh-issue: 133136 +.. nonce: Usnvri +.. section: Core and Builtins + +Limit excess memory usage in the :term:`free threading` build when a large +dictionary or list is resized and accessed by multiple threads. + +.. + +.. date: 2025-05-17-20-56-05 +.. gh-issue: 91153 +.. nonce: afgtG2 +.. section: Core and Builtins + +Fix a crash when a :class:`bytearray` is concurrently mutated during item +assignment. + +.. + +.. date: 2025-04-16-12-01-13 +.. gh-issue: 127971 +.. nonce: pMDOQ0 +.. section: Core and Builtins + +Fix off-by-one read beyond the end of a string in string search. + +.. + +.. date: 2025-07-22-15-18-08 +.. gh-issue: 112068 +.. nonce: 4WvT-8 +.. section: C API + +Revert support of nullable arguments in :c:func:`PyArg_Parse`. + +.. + +.. date: 2025-06-24-11-10-01 +.. gh-issue: 133296 +.. nonce: lIEuVJ +.. section: C API + +New variants for the critical section API that accept one or two +:c:type:`PyMutex` pointers rather than :c:type:`PyObject` instances are now +public in the non-limited C API. + +.. + +.. date: 2025-05-20-17-13-51 +.. gh-issue: 134009 +.. nonce: CpCmry +.. section: C API + +Expose :c:func:`PyMutex_IsLocked` as part of the public C API. + +.. + +.. date: 2025-07-18-17-15-00 +.. gh-issue: 135621 +.. nonce: 9cyCNb +.. section: Build + +PyREPL no longer depends on the :mod:`curses` standard library. Contributed +by Łukasz Langa. diff --git a/Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst b/Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst deleted file mode 100644 index fe7f962ccbb096..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-07-18-17-15-00.gh-issue-135621.9cyCNb.rst +++ /dev/null @@ -1,2 +0,0 @@ -PyREPL no longer depends on the :mod:`curses` standard library. Contributed -by Łukasz Langa. diff --git a/Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst b/Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst deleted file mode 100644 index f060f09de19bb8..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-05-20-17-13-51.gh-issue-134009.CpCmry.rst +++ /dev/null @@ -1 +0,0 @@ -Expose :c:func:`PyMutex_IsLocked` as part of the public C API. diff --git a/Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst b/Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst deleted file mode 100644 index 41401911a6bc0b..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-06-24-11-10-01.gh-issue-133296.lIEuVJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -New variants for the critical section API that accept one or two -:c:type:`PyMutex` pointers rather than :c:type:`PyObject` instances are now -public in the non-limited C API. diff --git a/Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst b/Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst deleted file mode 100644 index 018c5c7880c001..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-07-22-15-18-08.gh-issue-112068.4WvT-8.rst +++ /dev/null @@ -1 +0,0 @@ -Revert support of nullable arguments in :c:func:`PyArg_Parse`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst deleted file mode 100644 index ced7a9c9fd3e63..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-16-12-01-13.gh-issue-127971.pMDOQ0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix off-by-one read beyond the end of a string in string search. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst deleted file mode 100644 index dc2f1e22ba5b05..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-17-20-56-05.gh-issue-91153.afgtG2.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a crash when a :class:`bytearray` is concurrently mutated during item assignment. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst deleted file mode 100644 index a9501c13c95b3a..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-03-21-06-22.gh-issue-133136.Usnvri.rst +++ /dev/null @@ -1,2 +0,0 @@ -Limit excess memory usage in the :term:`free threading` build when a -large dictionary or list is resized and accessed by multiple threads. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst deleted file mode 100644 index 9b1f62433b45ed..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-06-02-24-42.gh-issue-135148.r-t2sC.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a bug where f-string debug expressions (using =) would incorrectly -strip out parts of strings containing escaped quotes and # characters. Patch -by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst deleted file mode 100644 index 2a1ed2944d8ddf..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-12-00-03-34.gh-issue-116738.iBBAdo.rst +++ /dev/null @@ -1 +0,0 @@ -Make functions in :mod:`grp` thread-safe on the :term:`free threaded ` build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst deleted file mode 100644 index 5d59e024389c18..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-22-08.gh-issue-132661.34ftJl.rst +++ /dev/null @@ -1,5 +0,0 @@ -Reflect recent :pep:`750` change. - -Disallow concatenation of ``string.templatelib.Template`` and :class:`str`. -Also, disallow implicit concatenation of t-string literals with string or -f-string literals. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst deleted file mode 100644 index 9930413b53c150..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst +++ /dev/null @@ -1 +0,0 @@ -``Interpolation.expression`` now has a default, the empty string. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst deleted file mode 100644 index f28eb2ca3b71e8..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-15-53-16.gh-issue-136525.xAko0e.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix issue where per-thread bytecode was not instrumented for newly created -threads. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst deleted file mode 100644 index bf26c4eb0e4c74..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-10-23-23-50.gh-issue-136517._NHJyv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a typo that prevented printing of uncollectable objects when the -:const:`gc.DEBUG_UNCOLLECTABLE` mode was set. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst deleted file mode 100644 index af9b94ad0613d7..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-11-13-45-48.gh-issue-136541.uZ_-Ju.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix some issues with the perf trampolines on x86-64 and aarch64. The -trampolines were not being generated correctly for some cases, which could -lead to the perf integration not working correctly. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst deleted file mode 100644 index dcc73267a78546..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-12-09-59-14.gh-issue-136421.ZD1rNj.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash when initializing :mod:`datetime` concurrently. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst deleted file mode 100644 index 767d7b97726971..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst +++ /dev/null @@ -1 +0,0 @@ -Fix PyREPL syntax highlighting on match cases after multi-line case. Contributed by Olga Matoula. diff --git a/Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst b/Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst deleted file mode 100644 index 1bf8ee504ef180..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-05-25-11-02-05.gh-issue-134657.3YFhR9.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`asyncio`: Remove some private names from ``asyncio.__all__``. diff --git a/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst b/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst deleted file mode 100644 index 79b85320926954..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-28-11-32-57.gh-issue-134759.AjjKcG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :exc:`UnboundLocalError` in :func:`email.message.Message.get_payload` when -the payload to decode is a :class:`bytes` object. Patch by Kliment Lamonov. diff --git a/Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst b/Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst deleted file mode 100644 index 4ac04b9c0a6c5c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-07-22-12-32.gh-issue-136380.1b_nXl.rst +++ /dev/null @@ -1,3 +0,0 @@ -Raises :exc:`AttributeError` when accessing -:class:`concurrent.futures.InterpreterPoolExecutor` and subinterpreters are -not available. diff --git a/Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst b/Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst deleted file mode 100644 index 951f57100b650c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-08-20-58-01.gh-issue-136434.uuJsjS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix docs generation of ``UnboundItem`` in :mod:`concurrent.interpreters` -when running with :option:`-OO`. diff --git a/Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst b/Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst deleted file mode 100644 index 7634bd3be9346d..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-09-20-29-30.gh-issue-136476.HyLLzh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug that was causing the ``get_async_stack_trace`` function to miss -some frames in the stack trace. diff --git a/Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst b/Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst deleted file mode 100644 index 5a0429cae07168..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-10-00-47-37.gh-issue-136470.KlUEUG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct :class:`concurrent.futures.InterpreterPoolExecutor`'s default thread -name. diff --git a/Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst b/Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst deleted file mode 100644 index a835306868d3dc..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-10-10-18-19.gh-issue-52876.9Vjrd8.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add missing ``keepends`` (default ``True``) parameter to -:meth:`!codecs.StreamReaderWriter.readline` and -:meth:`!codecs.StreamReaderWriter.readlines`. diff --git a/Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst b/Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst deleted file mode 100644 index 71ec66a37ef4c3..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-11-03-39-15.gh-issue-136523.s7caKL.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :class:`wave.Wave_write` emitting an unraisable when open raises. diff --git a/Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst b/Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst deleted file mode 100644 index f3050ad5d5aa10..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-11-23-04-39.gh-issue-136549.oAi8u4.rst +++ /dev/null @@ -1 +0,0 @@ -Fix signature of :func:`threading.excepthook`. diff --git a/Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst b/Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst deleted file mode 100644 index 96e076dfe5bd12..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-19-16-20-54.gh-issue-130645.O-dYcN.rst +++ /dev/null @@ -1 +0,0 @@ -Enable color help by default in :mod:`argparse`. diff --git a/Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst b/Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst deleted file mode 100644 index 9a71eb8ef1ac8d..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-20-16-02-00.gh-issue-136874.cLC3o1.rst +++ /dev/null @@ -1 +0,0 @@ -Discard URL query and fragment in :func:`urllib.request.url2pathname`. diff --git a/Misc/NEWS.d/next/Library/2025-07-21-16-10-24.gh-issue-124621.wyoWc1.rst b/Misc/NEWS.d/next/Library/2025-07-21-16-10-24.gh-issue-124621.wyoWc1.rst deleted file mode 100644 index 34049183649271..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-21-16-10-24.gh-issue-124621.wyoWc1.rst +++ /dev/null @@ -1 +0,0 @@ -pyrepl now works in Emscripten. diff --git a/Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst b/Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst deleted file mode 100644 index fd30fe156a1b32..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-21-22-35-50.gh-issue-136170.QUlc78.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the unreleased ``zipfile.ZipFile.data_offset`` property added in 3.14.0a7 -as it wasn't fully clear which behavior it should have in some situations so -the result was not always what a user might expect. diff --git a/Misc/NEWS.d/next/Security/2025-06-09-20-38-25.gh-issue-118350.KgWCcP.rst b/Misc/NEWS.d/next/Security/2025-06-09-20-38-25.gh-issue-118350.KgWCcP.rst deleted file mode 100644 index 6ad3caf33b2201..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-06-09-20-38-25.gh-issue-118350.KgWCcP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix support of escapable raw text mode (elements "textarea" and "title") -in :class:`html.parser.HTMLParser`. diff --git a/Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst b/Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst deleted file mode 100644 index 533e4df8626b90..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-07-21-14-15-25.gh-issue-135661.nAxXw5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix parsing attributes with whitespaces around the ``=`` separator in -:class:`html.parser.HTMLParser` according to the HTML5 standard. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst b/Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst deleted file mode 100644 index 6a35afe15e3875..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-07-05-15-10-42.gh-issue-136251.GRM6o8.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes and usability improvements for ``Tools/wasm/emscripten/web_example`` diff --git a/README.rst b/README.rst index 0092dfb497a021..63211550bc6654 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.14.0 beta 4 -==================================== +This is Python version 3.14.0 release candidate 1 +================================================= .. image:: https://github.com/python/cpython/actions/workflows/build.yml/badge.svg?branch=main&event=push :alt: CPython build status on GitHub Actions From 9f25781bf9b4e14cdc7a165a6bc1c15cf7d736e5 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:54:14 +0300 Subject: [PATCH 0713/1674] Post 3.14.0rc1 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index c926ee8c32b738..4ce274449460c1 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -24,7 +24,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.14.0rc1" +#define PY_VERSION "3.14.0rc1+" /*--end constants--*/ From 4832ceaa78ec680688f718fa1bae2bb3884ac58c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 23 Jul 2025 18:23:25 +0200 Subject: [PATCH 0714/1674] [3.14] gh-135676: Lexical analysis: Reword String literals and related sections (GH-135942) (#137048) Co-authored-by: Petr Viktorin Co-authored-by: Blaise Pabon Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/reference/expressions.rst | 63 ++- Doc/reference/grammar.rst | 5 +- Doc/reference/introduction.rst | 16 +- Doc/reference/lexical_analysis.rst | 599 +++++++++++++++++++---------- 4 files changed, 460 insertions(+), 223 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 24544a055c3ed2..9aca25e3214a16 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -133,13 +133,18 @@ Literals Python supports string and bytes literals and various numeric literals: -.. productionlist:: python-grammar - literal: `stringliteral` | `bytesliteral` | `NUMBER` +.. grammar-snippet:: + :group: python-grammar + + literal: `strings` | `NUMBER` 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) -literals. See section :ref:`literals` for details. +literals. +See section :ref:`literals` for details. +See section :ref:`string-concatenation` for details on ``strings``. + .. index:: triple: immutable; data; type @@ -152,6 +157,58 @@ occurrence) may obtain the same object or a different object with the same value. +.. _string-concatenation: + +String literal concatenation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Multiple adjacent string or bytes literals (delimited by whitespace), possibly +using different quoting conventions, are allowed, and their meaning is the same +as their concatenation:: + + >>> "hello" 'world' + "helloworld" + +Formally: + +.. grammar-snippet:: + :group: python-grammar + + strings: ( `STRING` | fstring)+ | tstring+ + +This feature is defined at the syntactical level, so it only works with literals. +To concatenate string expressions at run time, the '+' operator may be used:: + + >>> greeting = "Hello" + >>> space = " " + >>> name = "Blaise" + >>> print(greeting + space + name) # not: print(greeting space name) + Hello Blaise + +Literal concatenation can freely mix raw strings, triple-quoted strings, +and formatted string literals. +For example:: + + >>> "Hello" r', ' f"{name}!" + "Hello, Blaise!" + +This feature can be used to reduce the number of backslashes +needed, to split long strings conveniently across long lines, or even to add +comments to parts of strings. For example:: + + re.compile("[A-Za-z_]" # letter or underscore + "[A-Za-z0-9_]*" # letter, digit or underscore + ) + +However, bytes literals may only be combined with other byte literals; +not with string literals of any kind. +Also, template string literals may only be combined with other template +string literals:: + + >>> t"Hello" t"{name}!" + Template(strings=('Hello', '!'), interpolations=(...)) + + .. _parenthesized: Parenthesized forms diff --git a/Doc/reference/grammar.rst b/Doc/reference/grammar.rst index 55c148801d8559..1037feb691f6bc 100644 --- a/Doc/reference/grammar.rst +++ b/Doc/reference/grammar.rst @@ -10,11 +10,8 @@ error recovery. The notation used here is the same as in the preceding docs, and is described in the :ref:`notation ` section, -except for a few extra complications: +except for an extra complication: -* ``&e``: a positive lookahead (that is, ``e`` is required to match but - not consumed) -* ``!e``: a negative lookahead (that is, ``e`` is required *not* to match) * ``~`` ("cut"): commit to the current alternative and fail the rule even if this fails to parse diff --git a/Doc/reference/introduction.rst b/Doc/reference/introduction.rst index 444acac374a690..c62240b18cfe55 100644 --- a/Doc/reference/introduction.rst +++ b/Doc/reference/introduction.rst @@ -145,15 +145,23 @@ The definition to the right of the colon uses the following syntax elements: * ``e?``: A question mark has exactly the same meaning as square brackets: the preceding item is optional. * ``(e)``: Parentheses are used for grouping. + +The following notation is only used in +:ref:`lexical definitions `. + * ``"a"..."z"``: Two literal characters separated by three dots mean a choice of any single character in the given (inclusive) range of ASCII characters. - This notation is only used in - :ref:`lexical definitions `. * ``<...>``: A phrase between angular brackets gives an informal description of the matched symbol (for example, ````), or an abbreviation that is defined in nearby text (for example, ````). - This notation is only used in - :ref:`lexical definitions `. + +.. _lexical-lookaheads: + +Some definitions also use *lookaheads*, which indicate that an element +must (or must not) match at a given position, but without consuming any input: + +* ``&e``: a positive lookahead (that is, ``e`` is required to match) +* ``!e``: a negative lookahead (that is, ``e`` is required *not* to match) The unary operators (``*``, ``+``, ``?``) bind as tightly as possible; the vertical bar (``|``) binds most loosely. diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index a7f8e5392b7e71..cf241829b71120 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -39,7 +39,8 @@ The end of a logical line is represented by the token :data:`~token.NEWLINE`. Statements cannot cross logical line boundaries except where :data:`!NEWLINE` is allowed by the syntax (e.g., between statements in compound statements). A logical line is constructed from one or more *physical lines* by following -the explicit or implicit *line joining* rules. +the :ref:`explicit ` or :ref:`implicit ` +*line joining* rules. .. _physical-lines: @@ -47,17 +48,30 @@ the explicit or implicit *line joining* rules. Physical lines -------------- -A physical line is a sequence of characters terminated by an end-of-line -sequence. In source files and strings, any of the standard platform line -termination sequences can be used - the Unix form using ASCII LF (linefeed), -the Windows form using the ASCII sequence CR LF (return followed by linefeed), -or the old Macintosh form using the ASCII CR (return) character. All of these -forms can be used equally, regardless of platform. The end of input also serves -as an implicit terminator for the final physical line. +A physical line is a sequence of characters terminated by one the following +end-of-line sequences: -When embedding Python, source code strings should be passed to Python APIs using -the standard C conventions for newline characters (the ``\n`` character, -representing ASCII LF, is the line terminator). +* the Unix form using ASCII LF (linefeed), +* the Windows form using the ASCII sequence CR LF (return followed by linefeed), +* the '`Classic Mac OS`__' form using the ASCII CR (return) character. + + __ https://en.wikipedia.org/wiki/Classic_Mac_OS + +Regardless of platform, each of these sequences is replaced by a single +ASCII LF (linefeed) character. +(This is done even inside :ref:`string literals `.) +Each line can use any of the sequences; they do not need to be consistent +within a file. + +The end of input also serves as an implicit terminator for the final +physical line. + +Formally: + +.. grammar-snippet:: + :group: python-grammar + + newline: | | .. _comments: @@ -106,6 +120,16 @@ If an encoding is declared, the encoding name must be recognized by Python encoding is used for all lexical analysis, including string literals, comments and identifiers. +All lexical analysis, including string literals, comments +and identifiers, works on Unicode text decoded using the source encoding. +Any Unicode code point, except the NUL control character, can appear in +Python source. + +.. grammar-snippet:: + :group: python-grammar + + source_character: + .. _explicit-joining: @@ -474,80 +498,110 @@ Literals Literals are notations for constant values of some built-in types. +In terms of lexical analysis, Python has :ref:`string, bytes ` +and :ref:`numeric ` literals. + +Other "literals" are lexically denoted using :ref:`keywords ` +(``None``, ``True``, ``False``) and the special +:ref:`ellipsis token ` (``...``). + .. index:: string literal, bytes literal, ASCII single: ' (single quote); string literal single: " (double quote); string literal - single: u'; string literal - single: u"; string literal .. _strings: String and Bytes literals -------------------------- +========================= -String literals are described by the following lexical definitions: +String literals are text enclosed in single quotes (``'``) or double +quotes (``"``). For example: -.. productionlist:: python-grammar - stringliteral: [`stringprefix`](`shortstring` | `longstring`) - stringprefix: "r" | "u" | "R" | "U" | "f" | "F" | "t" | "T" - : | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" - : | "tr" | "Tr" | "tR" | "TR" | "rt" | "rT" | "Rt" | "RT" - shortstring: "'" `shortstringitem`* "'" | '"' `shortstringitem`* '"' - longstring: "'''" `longstringitem`* "'''" | '"""' `longstringitem`* '"""' - shortstringitem: `shortstringchar` | `stringescapeseq` - longstringitem: `longstringchar` | `stringescapeseq` - shortstringchar: - longstringchar: - stringescapeseq: "\" +.. code-block:: python -.. productionlist:: python-grammar - bytesliteral: `bytesprefix`(`shortbytes` | `longbytes`) - bytesprefix: "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" - shortbytes: "'" `shortbytesitem`* "'" | '"' `shortbytesitem`* '"' - longbytes: "'''" `longbytesitem`* "'''" | '"""' `longbytesitem`* '"""' - shortbytesitem: `shortbyteschar` | `bytesescapeseq` - longbytesitem: `longbyteschar` | `bytesescapeseq` - shortbyteschar: - longbyteschar: - bytesescapeseq: "\" - -One syntactic restriction not indicated by these productions is that whitespace -is not allowed between the :token:`~python-grammar:stringprefix` or -:token:`~python-grammar:bytesprefix` and the rest of the literal. The source -character set is defined by the encoding declaration; it is UTF-8 if no encoding -declaration is given in the source file; see section :ref:`encodings`. - -.. index:: triple-quoted string, Unicode Consortium, raw string + "spam" + 'eggs' + +The quote used to start the literal also terminates it, so a string literal +can only contain the other quote (except with escape sequences, see below). +For example: + +.. code-block:: python + + 'Say "Hello", please.' + "Don't do that!" + +Except for this limitation, the choice of quote character (``'`` or ``"``) +does not affect how the literal is parsed. + +Inside a string literal, the backslash (``\``) character introduces an +:dfn:`escape sequence`, which has special meaning depending on the character +after the backslash. +For example, ``\"`` denotes the double quote character, and does *not* end +the string: + +.. code-block:: pycon + + >>> print("Say \"Hello\" to everyone!") + Say "Hello" to everyone! + +See :ref:`escape sequences ` below for a full list of such +sequences, and more details. + + +.. index:: triple-quoted string single: """; string literal single: '''; string literal -In plain English: Both types of literals can be enclosed in matching single quotes -(``'``) or double quotes (``"``). They can also be enclosed in matching groups -of three single or double quotes (these are generally referred to as -*triple-quoted strings*). The backslash (``\``) character is used to give special -meaning to otherwise ordinary characters like ``n``, which means 'newline' when -escaped (``\n``). It can also be used to escape characters that otherwise have a -special meaning, such as newline, backslash itself, or the quote character. -See :ref:`escape sequences ` below for examples. +Triple-quoted strings +--------------------- -.. index:: - single: b'; bytes literal - single: b"; bytes literal +Strings can also be enclosed in matching groups of three single or double +quotes. +These are generally referred to as :dfn:`triple-quoted strings`:: + + """This is a triple-quoted string.""" + +In triple-quoted literals, unescaped quotes are allowed (and are +retained), except that three unescaped quotes in a row terminate the literal, +if they are of the same kind (``'`` or ``"``) used at the start:: + + """This string has "quotes" inside.""" + +Unescaped newlines are also allowed and retained:: + + '''This triple-quoted string + continues on the next line.''' -Bytes literals are always prefixed with ``'b'`` or ``'B'``; they produce an -instance of the :class:`bytes` type instead of the :class:`str` type. They -may only contain ASCII characters; bytes with a numeric value of 128 or greater -must be expressed with escapes. .. index:: - single: r'; raw string literal - single: r"; raw string literal + single: u'; string literal + single: u"; string literal -Both string and bytes literals may optionally be prefixed with a letter ``'r'`` -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. +String prefixes +--------------- + +String literals can have an optional :dfn:`prefix` that influences how the +content of the literal is parsed, for example: + +.. code-block:: python + + b"data" + f'{result=}' + +The allowed prefixes are: + +* ``b``: :ref:`Bytes literal ` +* ``r``: :ref:`Raw string ` +* ``f``: :ref:`Formatted string literal ` ("f-string") +* ``t``: :ref:`Template string literal ` ("t-string") +* ``u``: No effect (allowed for backwards compatibility) + +See the linked sections for details on each type. + +Prefixes are case-insensitive (for example, ``B`` works the same as ``b``). +The ``r`` prefix can be combined with ``f``, ``t`` or ``b``, so ``fr``, +``rf``, ``tr``, ``rt``, ``br`` and ``rb`` are also valid prefixes. .. versionadded:: 3.3 The ``'rb'`` prefix of raw bytes literals has been added as a synonym @@ -557,18 +611,35 @@ escapes are not treated specially. to simplify the maintenance of dual Python 2.x and 3.x codebases. See :pep:`414` for more information. -.. index:: - single: f'; formatted string literal - single: f"; formatted string literal -A string literal with ``f`` or ``F`` in its prefix is a -:dfn:`formatted string literal`; see :ref:`f-strings`. The ``f`` may be -combined with ``r``, but not with ``b`` or ``u``, therefore raw -formatted strings are possible, but formatted bytes literals are not. +Formal grammar +-------------- + +String literals, except :ref:`"f-strings" ` and +:ref:`"t-strings" `, are described by the +following lexical definitions. + +These definitions use :ref:`negative lookaheads ` (``!``) +to indicate that an ending quote ends the literal. + +.. grammar-snippet:: + :group: python-grammar -In triple-quoted literals, unescaped newlines and quotes are allowed (and are -retained), except that three unescaped quotes in a row terminate the literal. (A -"quote" is the character used to open the literal, i.e. either ``'`` or ``"``.) + STRING: [`stringprefix`] (`stringcontent`) + stringprefix: <("r" | "u" | "b" | "br" | "rb"), case-insensitive> + stringcontent: + | "'" ( !"'" `stringitem`)* "'" + | '"' ( !'"' `stringitem`)* '"' + | "'''" ( !"'''" `longstringitem`)* "'''" + | '"""' ( !'"""' `longstringitem`)* '"""' + stringitem: `stringchar` | `stringescapeseq` + stringchar: + longstringitem: `stringitem` | newline + stringescapeseq: "\" + +Note that as in all lexical definitions, whitespace is significant. +In particular, the prefix (if any) must be immediately followed by the starting +quote. .. index:: physical line, escape sequence, Standard C, C single: \ (backslash); escape sequence @@ -587,120 +658,237 @@ retained), except that three unescaped quotes in a row terminate the literal. ( .. _escape-sequences: - Escape sequences -^^^^^^^^^^^^^^^^ +---------------- Unless an ``'r'`` or ``'R'`` prefix is present, escape sequences in string and bytes literals are interpreted according to rules similar to those used by Standard C. The recognized escape sequences are: -+-------------------------+---------------------------------+-------+ -| Escape Sequence | Meaning | Notes | -+=========================+=================================+=======+ -| ``\``\ | Backslash and newline ignored | \(1) | -+-------------------------+---------------------------------+-------+ -| ``\\`` | Backslash (``\``) | | -+-------------------------+---------------------------------+-------+ -| ``\'`` | Single quote (``'``) | | -+-------------------------+---------------------------------+-------+ -| ``\"`` | Double quote (``"``) | | -+-------------------------+---------------------------------+-------+ -| ``\a`` | ASCII Bell (BEL) | | -+-------------------------+---------------------------------+-------+ -| ``\b`` | ASCII Backspace (BS) | | -+-------------------------+---------------------------------+-------+ -| ``\f`` | ASCII Formfeed (FF) | | -+-------------------------+---------------------------------+-------+ -| ``\n`` | ASCII Linefeed (LF) | | -+-------------------------+---------------------------------+-------+ -| ``\r`` | ASCII Carriage Return (CR) | | -+-------------------------+---------------------------------+-------+ -| ``\t`` | ASCII Horizontal Tab (TAB) | | -+-------------------------+---------------------------------+-------+ -| ``\v`` | ASCII Vertical Tab (VT) | | -+-------------------------+---------------------------------+-------+ -| :samp:`\\\\{ooo}` | Character with octal value | (2,4) | -| | *ooo* | | -+-------------------------+---------------------------------+-------+ -| :samp:`\\x{hh}` | Character with hex value *hh* | (3,4) | -+-------------------------+---------------------------------+-------+ - -Escape sequences only recognized in string literals are: - -+-------------------------+---------------------------------+-------+ -| Escape Sequence | Meaning | Notes | -+=========================+=================================+=======+ -| :samp:`\\N\\{{name}\\}` | Character named *name* in the | \(5) | -| | Unicode database | | -+-------------------------+---------------------------------+-------+ -| :samp:`\\u{xxxx}` | Character with 16-bit hex value | \(6) | -| | *xxxx* | | -+-------------------------+---------------------------------+-------+ -| :samp:`\\U{xxxxxxxx}` | Character with 32-bit hex value | \(7) | -| | *xxxxxxxx* | | -+-------------------------+---------------------------------+-------+ - -Notes: - -(1) - A backslash can be added at the end of a line to ignore the newline:: - - >>> 'This string will not include \ - ... backslashes or newline characters.' - 'This string will not include backslashes or newline characters.' - - The same result can be achieved using :ref:`triple-quoted strings `, - or parentheses and :ref:`string literal concatenation `. - - -(2) - As in Standard C, up to three octal digits are accepted. - - .. versionchanged:: 3.11 - Octal escapes with value larger than ``0o377`` produce a - :exc:`DeprecationWarning`. - - .. versionchanged:: 3.12 - Octal escapes with value larger than ``0o377`` produce a - :exc:`SyntaxWarning`. In a future Python version they will be eventually - a :exc:`SyntaxError`. - -(3) - Unlike in Standard C, exactly two hex digits are required. - -(4) - In a bytes literal, hexadecimal and octal escapes denote the byte with the - given value. In a string literal, these escapes denote a Unicode character - with the given value. - -(5) - .. versionchanged:: 3.3 - Support for name aliases [#]_ has been added. - -(6) - Exactly four hex digits are required. - -(7) - Any Unicode character can be encoded this way. Exactly eight hex digits - are required. +.. list-table:: + :widths: auto + :header-rows: 1 + + * * Escape Sequence + * Meaning + * * ``\``\ + * :ref:`string-escape-ignore` + * * ``\\`` + * :ref:`Backslash ` + * * ``\'`` + * :ref:`Single quote ` + * * ``\"`` + * :ref:`Double quote ` + * * ``\a`` + * ASCII Bell (BEL) + * * ``\b`` + * ASCII Backspace (BS) + * * ``\f`` + * ASCII Formfeed (FF) + * * ``\n`` + * ASCII Linefeed (LF) + * * ``\r`` + * ASCII Carriage Return (CR) + * * ``\t`` + * ASCII Horizontal Tab (TAB) + * * ``\v`` + * ASCII Vertical Tab (VT) + * * :samp:`\\\\{ooo}` + * :ref:`string-escape-oct` + * * :samp:`\\x{hh}` + * :ref:`string-escape-hex` + * * :samp:`\\N\\{{name}\\}` + * :ref:`string-escape-named` + * * :samp:`\\u{xxxx}` + * :ref:`Hexadecimal Unicode character ` + * * :samp:`\\U{xxxxxxxx}` + * :ref:`Hexadecimal Unicode character ` + +.. _string-escape-ignore: + +Ignored end of line +^^^^^^^^^^^^^^^^^^^ + +A backslash can be added at the end of a line to ignore the newline:: + + >>> 'This string will not include \ + ... backslashes or newline characters.' + 'This string will not include backslashes or newline characters.' + +The same result can be achieved using :ref:`triple-quoted strings `, +or parentheses and :ref:`string literal concatenation `. + +.. _string-escape-escaped-char: + +Escaped characters +^^^^^^^^^^^^^^^^^^ + +To include a backslash in a non-:ref:`raw ` Python string +literal, it must be doubled. The ``\\`` escape sequence denotes a single +backslash character:: + + >>> print('C:\\Program Files') + C:\Program Files + +Similarly, the ``\'`` and ``\"`` sequences denote the single and double +quote character, respectively:: + + >>> print('\' and \"') + ' and " + +.. _string-escape-oct: + +Octal character +^^^^^^^^^^^^^^^ + +The sequence :samp:`\\\\{ooo}` denotes a *character* with the octal (base 8) +value *ooo*:: + + >>> '\120' + 'P' + +Up to three octal digits (0 through 7) are accepted. + +In a bytes literal, *character* means a *byte* with the given value. +In a string literal, it means a Unicode character with the given value. + +.. versionchanged:: 3.11 + Octal escapes with value larger than ``0o377`` (255) produce a + :exc:`DeprecationWarning`. + +.. versionchanged:: 3.12 + Octal escapes with value larger than ``0o377`` (255) produce a + :exc:`SyntaxWarning`. + In a future Python version they will raise a :exc:`SyntaxError`. + +.. _string-escape-hex: + +Hexadecimal character +^^^^^^^^^^^^^^^^^^^^^ + +The sequence :samp:`\\x{hh}` denotes a *character* with the hex (base 16) +value *hh*:: + + >>> '\x50' + 'P' + +Unlike in Standard C, exactly two hex digits are required. + +In a bytes literal, *character* means a *byte* with the given value. +In a string literal, it means a Unicode character with the given value. + +.. _string-escape-named: + +Named Unicode character +^^^^^^^^^^^^^^^^^^^^^^^ + +The sequence :samp:`\\N\\{{name}\\}` denotes a Unicode character +with the given *name*:: + + >>> '\N{LATIN CAPITAL LETTER P}' + 'P' + >>> '\N{SNAKE}' + '🐍' + +This sequence cannot appear in :ref:`bytes literals `. + +.. versionchanged:: 3.3 + Support for `name aliases `__ + has been added. + +.. _string-escape-long-hex: + +Hexadecimal Unicode characters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These sequences :samp:`\\u{xxxx}` and :samp:`\\U{xxxxxxxx}` denote the +Unicode character with the given hex (base 16) value. +Exactly four digits are required for ``\u``; exactly eight digits are +required for ``\U``. +The latter can encode any Unicode character. + +.. code-block:: pycon + + >>> '\u1234' + 'ሴ' + >>> '\U0001f40d' + '🐍' + +These sequences cannot appear in :ref:`bytes literals `. .. index:: unrecognized escape sequence -Unlike Standard C, all unrecognized escape sequences are left in the string -unchanged, i.e., *the backslash is left in the result*. (This behavior is -useful when debugging: if an escape sequence is mistyped, the resulting output -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. +Unrecognized escape sequences +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unlike in Standard C, all unrecognized escape sequences are left in the string +unchanged, that is, *the backslash is left in the result*:: + + >>> print('\q') + \q + >>> list('\q') + ['\\', 'q'] + +Note that for bytes literals, the escape sequences only recognized in string +literals (``\N...``, ``\u...``, ``\U...``) fall into the category of +unrecognized escapes. .. 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`. + Unrecognized escape sequences produce a :exc:`SyntaxWarning`. + In a future Python version they will raise a :exc:`SyntaxError`. + + +.. index:: + single: b'; bytes literal + single: b"; bytes literal + + +.. _bytes-literal: + +Bytes literals +-------------- + +:dfn:`Bytes literals` are always prefixed with ``'b'`` or ``'B'``; they produce an +instance of the :class:`bytes` type instead of the :class:`str` type. +They may only contain ASCII characters; bytes with a numeric value of 128 +or greater must be expressed with escape sequences (typically +:ref:`string-escape-hex` or :ref:`string-escape-oct`): + +.. code-block:: pycon + + >>> b'\x89PNG\r\n\x1a\n' + b'\x89PNG\r\n\x1a\n' + >>> list(b'\x89PNG\r\n\x1a\n') + [137, 80, 78, 71, 13, 10, 26, 10] + +Similarly, a zero byte must be expressed using an escape sequence (typically +``\0`` or ``\x00``). + + +.. index:: + single: r'; raw string literal + single: r"; raw string literal + +.. _raw-strings: + +Raw string literals +------------------- + +Both string and bytes literals may optionally be prefixed with a letter ``'r'`` +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, :ref:`escape sequences ` +are not treated specially: + +.. code-block:: pycon + + >>> r'\d{4}-\d{2}-\d{2}' + '\\d{4}-\\d{2}-\\d{2}' 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 @@ -712,29 +900,6 @@ that a single backslash followed by a newline is interpreted as those two characters as part of the literal, *not* as a line continuation. -.. _string-concatenation: - -String literal concatenation ----------------------------- - -Multiple adjacent string or bytes literals (delimited by whitespace), possibly -using different quoting conventions, are allowed, and their meaning is the same -as their concatenation. Thus, ``"hello" 'world'`` is equivalent to -``"helloworld"``. This feature can be used to reduce the number of backslashes -needed, to split long strings conveniently across long lines, or even to add -comments to parts of strings, for example:: - - re.compile("[A-Za-z_]" # letter or underscore - "[A-Za-z0-9_]*" # letter, digit or underscore - ) - -Note that this feature is defined at the syntactical level, but implemented at -compile time. The '+' operator must be used to concatenate string expressions -at run time. Also note that literal concatenation can use different quoting -styles for each component (even mixing raw strings and triple quoted strings), -and formatted string literals may be concatenated with plain string literals. - - .. index:: single: formatted string literal single: interpolated string literal @@ -742,6 +907,8 @@ and formatted string literals may be concatenated with plain string literals. single: string; interpolated literal single: f-string single: fstring + single: f'; formatted string literal + single: f"; formatted string literal single: {} (curly brackets); in formatted string literal single: ! (exclamation); in formatted string literal single: : (colon); in formatted string literal @@ -958,7 +1125,7 @@ the following differences: .. _numbers: Numeric literals ----------------- +================ .. index:: number, numeric literal, integer literal floating-point literal, hexadecimal literal @@ -991,7 +1158,7 @@ actually an expression composed of the unary operator '``-``' and the literal .. _integers: Integer literals -^^^^^^^^^^^^^^^^ +---------------- Integer literals denote whole numbers. For example:: @@ -1064,7 +1231,7 @@ Formally, integer literals are described by the following lexical definitions: .. _floating: Floating-point literals -^^^^^^^^^^^^^^^^^^^^^^^ +----------------------- Floating-point (float) literals, such as ``3.14`` or ``1.5``, denote :ref:`approximations of real numbers `. @@ -1126,7 +1293,7 @@ lexical definitions: .. _imaginary: Imaginary literals -^^^^^^^^^^^^^^^^^^ +------------------ Python has :ref:`complex number ` objects, but no complex literals. @@ -1214,14 +1381,26 @@ The following tokens serve as delimiters in the grammar: ( ) [ ] { } , : ! . ; @ = + +The period can also occur in floating-point and imaginary literals. + +.. _lexical-ellipsis: + +A sequence of three periods has a special meaning as an +:py:data:`Ellipsis` literal: + +.. code-block:: none + + ... + +The following *augmented assignment operators* serve +lexically as delimiters, but also perform an operation: + +.. 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 -of the list, the augmented assignment operators, serve lexically as delimiters, -but also perform an operation. - The following printing ASCII characters have special meaning as part of other tokens or are otherwise significant to the lexical analyzer: @@ -1236,7 +1415,3 @@ occurrence outside string literals and comments is an unconditional error: $ ? ` - -.. rubric:: Footnotes - -.. [#] https://www.unicode.org/Public/16.0.0/ucd/NameAliases.txt From f2981acd6be797a75d1f6a4f019c031fa44ba186 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 23 Jul 2025 19:45:55 +0200 Subject: [PATCH 0715/1674] [3.14] gh-137043: mention `PyList_GET_ITEM` as unsafe borrowed API in free-threading docs (GH-137042) (#137045) Co-authored-by: Guido Imperiale --- Doc/howto/free-threading-extensions.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/howto/free-threading-extensions.rst b/Doc/howto/free-threading-extensions.rst index 02b45879ccfaca..577e283bb9cb4c 100644 --- a/Doc/howto/free-threading-extensions.rst +++ b/Doc/howto/free-threading-extensions.rst @@ -161,6 +161,8 @@ that return :term:`strong references `. +===================================+===================================+ | :c:func:`PyList_GetItem` | :c:func:`PyList_GetItemRef` | +-----------------------------------+-----------------------------------+ +| :c:func:`PyList_GET_ITEM` | :c:func:`PyList_GetItemRef` | ++-----------------------------------+-----------------------------------+ | :c:func:`PyDict_GetItem` | :c:func:`PyDict_GetItemRef` | +-----------------------------------+-----------------------------------+ | :c:func:`PyDict_GetItemWithError` | :c:func:`PyDict_GetItemRef` | From b7168d216bf5c0c8d7438ee6581df0457e80f2fa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 23 Jul 2025 22:48:11 +0200 Subject: [PATCH 0716/1674] [3.14] GH-136975: Emend a spelling error (algorthm -> algorithm) (GH-136999) (#137003) GH-136975: Emend a spelling error (algorthm -> algorithm) (GH-136999) (cherry picked from commit b6d324224474c54061a6aaeace50bc5666dc1779) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Modules/_zstd/_zstdmodule.c | 2 +- Modules/_zstd/_zstdmodule.h | 2 +- Modules/_zstd/buffer.h | 2 +- Modules/_zstd/compressor.c | 2 +- Modules/_zstd/decompressor.c | 2 +- Modules/_zstd/zstddict.c | 2 +- Modules/_zstd/zstddict.h | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Modules/_zstd/_zstdmodule.c b/Modules/_zstd/_zstdmodule.c index d75c0779474a82..8af6156a0da575 100644 --- a/Modules/_zstd/_zstdmodule.c +++ b/Modules/_zstd/_zstdmodule.c @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ #ifndef Py_BUILD_CORE_BUILTIN # define Py_BUILD_CORE_MODULE 1 diff --git a/Modules/_zstd/_zstdmodule.h b/Modules/_zstd/_zstdmodule.h index 4e8f708f2232c7..82226ff8718e6b 100644 --- a/Modules/_zstd/_zstdmodule.h +++ b/Modules/_zstd/_zstdmodule.h @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ /* Declarations shared between different parts of the _zstd module*/ diff --git a/Modules/_zstd/buffer.h b/Modules/_zstd/buffer.h index 4c885fa0d720fd..0ac7bcb4ddc416 100644 --- a/Modules/_zstd/buffer.h +++ b/Modules/_zstd/buffer.h @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ #ifndef ZSTD_BUFFER_H #define ZSTD_BUFFER_H diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c index bc9e6eff89af68..508b136817872b 100644 --- a/Modules/_zstd/compressor.c +++ b/Modules/_zstd/compressor.c @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ /* ZstdCompressor class definitions */ diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c index c53d6e4cb05cf0..b00ee05d2f51bf 100644 --- a/Modules/_zstd/decompressor.c +++ b/Modules/_zstd/decompressor.c @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ /* ZstdDecompressor class definition */ diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c index 14f74aaed46ec5..35d6ca8e55a265 100644 --- a/Modules/_zstd/zstddict.c +++ b/Modules/_zstd/zstddict.c @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ /* ZstdDict class definitions */ diff --git a/Modules/_zstd/zstddict.h b/Modules/_zstd/zstddict.h index 4a403416dbd4a3..e0d3f46b2b14a6 100644 --- a/Modules/_zstd/zstddict.h +++ b/Modules/_zstd/zstddict.h @@ -1,4 +1,4 @@ -/* Low level interface to the Zstandard algorthm & the zstd library. */ +/* Low level interface to the Zstandard algorithm & the zstd library. */ #ifndef ZSTD_DICT_H #define ZSTD_DICT_H From d996cb6700ebc93b6b5f4dbe0a7e31875aa861f9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 24 Jul 2025 23:36:11 +0200 Subject: [PATCH 0717/1674] [3.14] Exclude _testclinic_depr.c.h from c-analyzer (GH-137086) (#137089) Exclude _testclinic_depr.c.h from c-analyzer (GH-137086) _testclinic.c mocks out PY_VERSION_HEX to 3.8 before including _testclinic_depr.c.h to avoid the errors the preprocessor would otherwise throw due to the deprecation feature it is testing. (cherry picked from commit d5e75c07682864e9d265e11f5e4730147e7d4842) Co-authored-by: Zachary Ware --- Tools/c-analyzer/cpython/_parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index cfbf0d14348499..1e754040eaf1cc 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -83,6 +83,8 @@ def clean_lines(text): Python/generated_cases.c.h Python/executor_cases.c.h Python/optimizer_cases.c.h +# XXX: Throws errors if PY_VERSION_HEX is not mocked out +Modules/clinic/_testclinic_depr.c.h # not actually source Python/bytecodes.c From 87422988f988ebc04c79ccc4044746fe7eb25a4a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 25 Jul 2025 11:30:11 +0200 Subject: [PATCH 0718/1674] [3.14] gh-132983: Add missing references to Zstandard in shutil docstrings (GH-136617) (#137052) Co-authored-by: Rogdham <3994389+Rogdham@users.noreply.github.com> Co-authored-by: Zachary Ware --- Lib/shutil.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/shutil.py b/Lib/shutil.py index ca0a2ea2f7fa8a..8d8fe145567822 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -994,14 +994,14 @@ def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, """Create a (possibly compressed) tar file from all the files under 'base_dir'. - 'compress' must be "gzip" (the default), "bzip2", "xz", or None. + 'compress' must be "gzip" (the default), "bzip2", "xz", "zst", or None. 'owner' and 'group' can be used to define an owner and a group for the archive that is being built. If not provided, the current owner and group will be used. The output tar file will be named 'base_name' + ".tar", possibly plus - the appropriate compression extension (".gz", ".bz2", or ".xz"). + the appropriate compression extension (".gz", ".bz2", ".xz", or ".zst"). Returns the output filename. """ @@ -1187,7 +1187,7 @@ def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, 'base_name' is the name of the file to create, minus any format-specific extension; 'format' is the archive format: one of "zip", "tar", "gztar", - "bztar", "zstdtar", or "xztar". Or any other registered format. + "bztar", "xztar", or "zstdtar". Or any other registered format. 'root_dir' is a directory that will be the root directory of the archive; ie. we typically chdir into 'root_dir' before creating the @@ -1337,7 +1337,7 @@ def _unpack_zipfile(filename, extract_dir): zip.close() def _unpack_tarfile(filename, extract_dir, *, filter=None): - """Unpack tar/tar.gz/tar.bz2/tar.xz `filename` to `extract_dir` + """Unpack tar/tar.gz/tar.bz2/tar.xz/tar.zst `filename` to `extract_dir` """ import tarfile # late import for breaking circular dependency try: @@ -1392,7 +1392,7 @@ def unpack_archive(filename, extract_dir=None, format=None, *, filter=None): is unpacked. If not provided, the current working directory is used. `format` is the archive format: one of "zip", "tar", "gztar", "bztar", - or "xztar". Or any other registered format. If not provided, + "xztar", or "zstdtar". Or any other registered format. If not provided, unpack_archive will use the filename extension and see if an unpacker was registered for that extension. From 5746e067fd07c9ec396e2594eb128f9418acb277 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 25 Jul 2025 18:08:28 +0200 Subject: [PATCH 0719/1674] [3.14] gh-137090: Remove redundant statement in ``Doc/library/concurrent.interpreters.rst`` (GH-137091) (#137108) gh-137090: Remove redundant statement in ``Doc/library/concurrent.interpreters.rst`` (GH-137091) (cherry picked from commit 1e69cd1634e4f0f8c375be85d11925bd12deef23) Co-authored-by: soolabettu <17737361+soolabettu@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/concurrent.interpreters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/concurrent.interpreters.rst b/Doc/library/concurrent.interpreters.rst index be9d565f8e0d38..41ea6af3b226e9 100644 --- a/Doc/library/concurrent.interpreters.rst +++ b/Doc/library/concurrent.interpreters.rst @@ -134,7 +134,7 @@ makes them similar to processes, but they still enjoy in-process efficiency, like threads. All that said, interpreters do naturally support certain flavors of -concurrency, as a powerful side effect of that isolation. +concurrency. There's a powerful side effect of that isolation. It enables a different approach to concurrency than you can take with async or threads. It's a similar concurrency model to CSP or the actor model, From fc911a93cbeda70a5282461ac4793b30129621b8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:28:40 +0200 Subject: [PATCH 0720/1674] [3.14] gh-131038: Use text=True in subprocesses in test_perf_profiler (GH-137117) (#137124) --- Lib/test/test_perf_profiler.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_perf_profiler.py b/Lib/test/test_perf_profiler.py index 7529c853f9c152..0207843cc0e8f7 100644 --- a/Lib/test/test_perf_profiler.py +++ b/Lib/test/test_perf_profiler.py @@ -318,6 +318,7 @@ def run_perf(cwd, *args, use_jit=False, **env_vars): stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, + text=True, ) if proc.returncode: print(proc.stderr, file=sys.stderr) @@ -327,10 +328,10 @@ def run_perf(cwd, *args, use_jit=False, **env_vars): jit_output_file = cwd + "/jit_output.dump" command = ("perf", "inject", "-j", "-i", output_file, "-o", jit_output_file) proc = subprocess.run( - command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, env=env + command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, env=env, text=True ) if proc.returncode: - print(proc.stderr) + print(proc.stderr, file=sys.stderr) raise ValueError(f"Perf failed with return code {proc.returncode}") # Copy the jit_output_file to the output_file os.rename(jit_output_file, output_file) @@ -342,10 +343,9 @@ def run_perf(cwd, *args, use_jit=False, **env_vars): stderr=subprocess.PIPE, env=env, check=True, + text=True, ) - return proc.stdout.decode("utf-8", "replace"), proc.stderr.decode( - "utf-8", "replace" - ) + return proc.stdout, proc.stderr class TestPerfProfilerMixin: From 47a2109c1a9dd9fd213d5def2dd60dda12426d37 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 27 Jul 2025 08:54:41 +0200 Subject: [PATCH 0721/1674] [3.14] Link to plaintext for "show source" links (GH-137131) (#137132) Link to plaintext for "show source" links (GH-137131) (cherry picked from commit 9cbf46d9920c269fe736ed689236d00223545f73) Co-authored-by: ryan-duve --- Doc/tools/templates/customsourcelink.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index 43d3a7a892a880..8e271bca1e08c8 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -4,7 +4,7 @@

{{ _('This page') }}

{% trans %}Packed as .zip{% endtrans %} {% trans %}Packed as .tar.bz2{% endtrans %}
{% trans %}PDF{% endtrans %}{% trans download_size="17" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="17" %}Download (ca. {{ download_size }} MiB){% endtrans %}
{% trans %}HTML{% endtrans %} {% trans download_size="13" %}Download (ca. {{ download_size }} MiB){% endtrans %}
7wEnnLSL|gHT2OX`>`83aV9Apw%Excr%*ikLU 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 z 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 cvNz_qG39+2A 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

-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 AF#rGn literal 236250 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%0A@>J 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%0DWC0rb;oy@MC+ebM>c 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 diff --git a/Doc/using/win_installer.png b/Doc/using/win_installer.png index 03bf2d7b16c599b1f2d1d2cea577ba60fbc4570f..fc9605a79cfcc5181e3227973218b8167419dbe5 100644 GIT binary patch literal 79713 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

u#G}L#3 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 GL;fGTg%8sJ literal 84383 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 diff --git a/Lib/idlelib/Icons/idle_256.png b/Lib/idlelib/Icons/idle_256.png index 64f276b40d23b7937c95746bff1a1ce73543c5b0..84ffdfddc6f91814583a2755d8cad268727b5957 100644 GIT binary patch literal 31216 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 literal 39205 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 mp@aWiD6vu$LRjT2?((aBI;7RD=A literal 33040 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 VMgU89l*m^wF@WUjRBn;ku|o^no_ILnQsw)Q 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 diff --git a/Objects/object_layout_313.png b/Objects/object_layout_313.png index f7059c286c84e6cd9a71f59b640a628a110d80ac..f3df59253da131073616ac809a2dcf9108d1b99e 100644 GIT binary patch literal 25347 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 literal 35055 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 K3oBE#4gD|NwZdos literal 16983 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 T4t`JsK`0(ok$ZXg{Ehz)XB)p= diff --git a/PC/icons/idlex150.png b/PC/icons/idlex150.png index 806cb0c8aa219be92c78937b5d291ba905cf9978..dbdca5b00f881238ead7bc27cf529048f557acd6 100644 GIT binary patch literal 15502 zcmV;9JaNN`P)l*RS`QBh-Jja~EqStA;av5TN|6*P$`CKhZ- z6vY|~2#OIkVl*}sMX&%Wh>9W#79=)AMMOkF1Qk$v@8xpK{Lkmz`7X12ckk}K+_KAM zpXWUL?z?ZD`OKL!XU@#jsgwG%#U`m#+1$%!b!z$N7bZKH?6^rPMYcEjmB}wnw)U{q z%Fi|?dn{kRe4@#>>14%<6*VF&SFWsfS+#0a)}nLlStl=9vSj|kg$sX}IdkT7?c2An zXX(1D$#x#F&1)rCYu2nOvcz$rSb`eZ{W5_^`cWbN9uSxG@b zK~}PE-MXx#u&^*e*he}nTC^xipJmIIMf>bsrgZAm=~xdKTC8rZ2Fns=&6Fuq#?GBP zcV-CCoH=ux?aK?Gsv4$L!aK~KJ=^{GmGBLZ&f)Tz<-;>C-jgylC0O$p|>>eNn4 zmoAO8M|pv=!W6v&|Nr#UPtoOVhn;6I=;kz4_*w{p|PgCcib=w|@QlM;TB>fJ9>d{PWLou%=C$76}PEVZsFW z{rBHHvoqYpi4!B?dS8G2b)@Bhi1UGt{gWq8j*jI&u0iz?f<)&0@WT%gBnZcHUMB4X z$lQ}_lCc0zf#AOUhj4wa83M+8eel5tZvOoF(XjvqG@NTtMBD7c91u`|#65Tyws}X= zfNOmD<(KZQx88~X=h^L3Vvs&;Y5JSm0#^c9@4ox))AsvNlif_VZPB8|{hsS(j}m{>s8R0IPd|+^jEo4i6Pb**;C$1Xkp>81B7?auV1{6E zO@IWfkt0V&_vM~I&2O&5F~ApUD>DD9ufB@z&pYuvAy@#!dGEdVUR*mNJPXgq_Gh1c z7M)8v4j(?;4H+^dDs)I~gew6o%kX*UpMQQ+_L=31A`P#*K@<`JdxB=YRkEpBp-KXap;12Izvzo}qhffGYyaGAyo@ ztXf)bRnZ7bqzR#BB4Mbq%43L=VXEdxbiiVp4B|ho2`qfeCgV2{qSd6~_%9n{oO@yC z`S*xxB(6pEht0#a_%FF-$G!BMnhrYjJRQTD1+X1hA}`{FMDZ z%w%_7vQeW(`x#h;xm?}l5=^PUQllpmTpL@pm;e@b)fs1;agqmXCsXD33mVy2wcU2g z1eAn#mKIm*xHf671h5b@-j`UFH`G-4*bpERDD;r$GEg-IQ}`i`00-9t=}_C?iomjr zEy`5Q39L=pscfJ^u&4_0bK#%E9tAQSx4?yCl`bH97;pyTh{f2qV@mA5$MPMnQea_I zSt5LAC1`P|ohW5;0B+JwsbNY6%Yzaf&-;)@6i$R50n(EO5gH2!0S$A*j?H_`l>nAi ze@oi7ZF`yRYrNA=JDp^u=*_Y~LXB_IPN_fgV*!>v>R+r4)nWoz@4WNQ^WNQXkjZ|h zo_gwWw!fIfptG3LC8+4&MSTMe`w>bZi9`qr$DsZ>4`8&PYC-*mAy6D^u}e|&9KRUX z!*8beCXPV^a9@SFkZI{)qNADWhD_q#^x5%DT!ZRKHW2rd&k11ZOy*o)(4zbEj*7xS z_{}wvKZ1|`Q98Zpj`EO1AFeMqjZ6!{1y~%o25`dVas>27NYZ)1m%AcnFJ=m>0IWT zz`=g5ivVak?L=k)H2`uB&x)oXQ?YXp-idF3CPO)vj$<;MZLY5n8$jnebY$~9z>^G= zg!6emI-@CUI>yr1J@Ld7u1}vn(KRR-97`eV-@m`>)vK5L@WT(I;{=zzONkZu4*3RG z0$8R^W}b4&DGfYWJ6dLTlkEf)BvLA{0E&df5Pkps_ai{aKr)6*10qEmAS%frRA@3v zIrkybK*BYEl7uGnIYtgy&H*AIPOjR>c%FxEU_iUddCN5c2%Cm?K*(GQ0RM5G`uh0r zOle2C+(CB78;l5R7@5hp0!`Ues18vfe~#7^Gwo8d^i`_6flTZR&)md0V*09O{-QU*XH?rfzB(qN`aNm_*P7OCSx2Rs>&D# z&TI_wY>aS@<9)OFWNX;#{tBV_6Rc%L$G*hN=|KR*_9V4i5e@R#tK`8Nb)`kBpN$a-y&6| zulh@{x$?oFPXNoRqh*(0e)*NS8}`^^kH+>w@8-IzAXi`tMFTQu$fRmLruwLQ^`T2; zx+3h@b!MmD8NgLHr@=C#a)AAA;N1=TpLW`5$J_p5l|XC&LBvZ^l2GlaY7#{50Bjc$ z0DB7~nM9ItkL^Lig`->2!9?lBu-4!V?ypc3GM9T$(y>E$rkVyyBKHLi8PZ7uIWh?~ z0@a|L(QK>HWdECp_!Cb4R zUNDf}r_V~ZlUjx0$X{S%n`%%45BOH8CA0Ng)fS22hoEO=Kk0mhqA0^P&QQ&Jo}(sV z3Pr9A`O!315lG}tAU%|(VPtODWu_6;fh%aWU1y@n8fpWoNvlOlw%l^dBmBs!oY7jP zz)EL`>*Z@p%dR3oA*2b=U zSS41XW*9`PLV#pM<^xdG4O0k}ASkPqoNX%`t(4rAW_d81*1Lwg0iRW;pZf;a&bea5 z$HDT|-HID-xZzsc*JS_w_it`5_Q59YlpRpnNVY(wa!^}AUw7Yq_x;QArs=lZZrjN0 zuR%ZuTxM@gv;Bvd?2;>ftpu>ltNVg?H!#1`{%4+f<_Y$q#U!3)o5@$8@)0Ilx*Du& z#`}AgCnuU5Oy2Ci`|gLC9$3o%RwbgbeqSdxHNw_82bT3k^$Oh$2OoU!zP5i|n2?*a zQ`G|%+EUs!pWy43Cr8$aO^L)TjC-1WH4CHOd|P938Z0viryX&`5yuAZhFijxj`#X* z(oR(fQz$r*)l#%7Z&B;kt(yxhbL(8F)?&_rRTTSZE`piX9nsGqd&_)Tu+aQn{mrj6*!CAF3M4PUN@qLiA5tC#B-7|cX`3mz@ zgec!ULvp03=8E8YY?H}sYc5p9&I1$um}D-`s>#-{AH$hp=(E)PqV)4=j3Cbyf`t2p zG~oR?k8T|7P{rDFU9Q3VaZjQ&QdMv1fTBx?t}C{!Z}EN0lasu^>VV(;<~P5`QR?T_ z$ZfE^yW#hWdEeJQ#Qu=MD)9n~7iATmD$=XRB%UlN`bAX55 zejo)DI-3E5j$AT21WQvia;`@I;IX#(REgGzv;;754Pc=lBx@zklee6XVn9@(A@m1O z=uqZ*p?2clyf^3bY>J!W8i1NS4pSjUnY5Ecqlx^iheHB)10BwL8l*Gx0xTxLuUD_0 z!Z5bC#O)A{Jkj7wghU4vGL*zeOHn$3Os$y^EHWDjp`!Ex5Z47Lh0d^#r~tZ<$S^V$ z*nk;L#IsVG0iAmT0U1VE4G?jEw#jHRm-}k^$5dc(T{I>di+ckh+KFx58+f>$cUH#1 z;@$!ms7Vvf;r_{B0j!3hl?7BdqmTL-Ev*)|Y}vAj?`+=QLTvu3j_aHU%SR1Nw^G;3 zAR9uwk08)siR2ko)N15EX(LLSG*(&ml49hOjpEQT2rz`+D1Z)8w55!0jV}Zmo|AnV zbu8_|Z||#%GC293s-pb-712ITEvcA)4JP4THA+dt!!!vU-@rzJ2xofcz8Y_t?d&~N zuVLf^t6!KVeA)mXX#3aXJXj$>WkHZBG^HvG@$&Rh=1R*h-NY%`0wrKH5-FW%GQ7M2 z%Szf}%cz3TR#KpUzPbvk(@n4;Fol9?fYuB5SspB9^^kCm*qjH;5^U8y_uSK&ChhUZ zAAg$J1EaHP+0_QWljf=rFj~DLl_=b$qClk*7ILtW()U^3G~aK({Z6)4;#+wGmKlVD z>~}-ogMNU;SvM~6Docwr>BGxnu*=ayRV7lnC5E=fN@!FnOPS_Bm4S1_S1wvYk|VL;n*c8wdbP{fHzm zU;&W)PGK|z8jaG7CJLbf8l4x;-JqpL$Y?Sdt;V@pN(ErJKbl9d^DNw#(LewU6l`mr z3I4}bz%}IJ&@3`M1NY-OxdyHS%{{?+`0BU@@5b{0E^u=_o`HfTzgk6L3I(mL*0^1F zz72FaN$v*oIi6+zmE;9jd<>xPS?a`8`ir)|FmyK{$wSmtwSWyqgKL%*%AS@#eJwp!DNphOtW55Pd}!Ha+q$ccmR)&a3I$M;7amO|ISp14 zM5~kcq2iH^J)$5NfYSPqRJqcQ68pW@YL!AAD;Cv1ZZ4O^JL)8VH>dq z$oE%Wb=A!_pGKQqcipwo-h1!e+|p^KZ)JaB`SpjK1a$_pK9K*nG2`>V!6}G-+#WwyUbtbbPCn_1OMK;p`r4?4w z*-oi66T%?r2)ga0-K;7c6&geDRa(@zz9lL*Gx`xetzTE$s*PzoYu3@J^ zuK8`Ry3_9*;@Up&mb>NIk*@dKNT_l=dnG zRyspGoX2xh%dTtzBAmBCrFl^GepBZzbB`KG=XHPIop9?LCa=2_ZW-bl++r}@GB^fQ z09C_IFS~{}zhv^FJMrd$?!=BS#H7Oj*QnzFcUkv0U7z9O-Mq!i!!%@8#vwM~_#i)b z*5)-1mRGH7p+5vjlYwnaKvjjC0BxlxR#oA=-{e_K+^qx0x`ww6Gnj^!0o5xRpc)WC zbz+D9?xYUSyOVBu&g5Cw{O0G~{V$Jlvlc9kr;|O)v^H(p9PHuRti}dY*uxZ9llJak z{Nfia?19=?0*%k4ou~?`8YZd|Rc+W|XaTA*G7-&y9ak1WT9AO2Ee3UYfugmmPVsa= z$*-io(DlKJ>sFXNZ*vGZH<$3qk=9Or7zbs6dEqTx8jD{((EJ{?$e5~~%9fnApGNf8@7Gteqp z0h^BZONJ>Ftz@CurPrEt8t{dy-(^^qPz}leRsS-fYIMUhF}eO}*L&#a@%OiP7-fCH zdsgSfYzbgl)3~R1H|!yIgTYV$NP0+tMJtKS*7T2L0HBcgH0{Y~GLsgPpCGK1OF&ah z%FO_9+(RM8y1q(ZxUH2d!j@UO0SRAzktKU6nmhN|)PPnkUF27NGI?^j~) z^>^=zsD7|an@srCuYPs7ceHJ1+T^lOLm}bvBtSt1%U4BWY9Is&%r>w90wrD%1Y{T) zj4MH!fNk~zAyoJ9d zXdg|;%e!eh$8=z!Z3QgpFzUNG2~ah@eW)8hZDE3sYRc>-?&PkouLr73sGiRN)zb-3 zHU4LBck)e7xta48sXCuvdAe(L8S)8}f*_XY<1I1&ZB^Bibn$3EnWhydBw_rK_JziC za#VpL7NkkMfte85pl|Ib)9`Z%DEY;B7F|biOPoVhoUDyBvz`J01rZ=5g9W@QL_o{6 z0a4X%I&H-*?Cw)j$5sFTVI<>*_M%(}I-@4T+{D-8R;Ug7N|t zf<@I%H7>_zvXTDU=xHgZ9T+-hY6Mg&s1l6y3P9E5y2o9M>wCtZ-AsaiR+pWX0G4I! zx~HFh`u-hu*x?k5cR$xanz%7LGB*UKvcQ@;cWJ4X-^Gu-=L!mo61r#TuDSfN5s6TB zC@)k1l^Uuh*FI*_!=5qr4rY_yR$V@=gvo8qXdM!`8-9Dm6<3_9DY+HGQQNgsD#0F; zpNvLO1XhAOA?8xJ`pJ*nw=>L6HNd9LTjo0U9cfSv%m7ut3{dqh6RM`y^f2&a&uNX7 zngPpt-f=e^?gRFJz2lBM?o$x^#6x6jyLJk-ltf@*zylW0WZy+o22?k0C{&L|0$4s$ zq-Maf#QA!wt+qPMyBoGOSHj-}4Xq;$C$G)gDFiANSQzLru*%o(m)`MN7F4|=X(Fhu zO@```NNki?&4T4U<6qbVbTJ2K56kG)0!T}qY)n9v7beZCo-7(ysVSDG&tJYl{eG1R zRnx1xM_}>n=1O5Y@9lj^O|ooWnZT7=udu8ce3O^ts14dlek@wVz=N*}&wMEO#&FEy zCyVCvion|Ne!n z^4Zvd3bhkjS_@GszMW&jYlhFOrR`R%S?7j~o*Kz(pZ&02KK(wD!JkY{kXJvRC<4p(!_GJOzqdwMg4n((=1v-Cg=C2Jl(h5k?YJR} z5hQ?RnZEA%=b!IxeT1#9yz}He80!cCIiZ9pj_k6dVsNV3~;pJC9XQ~xCQcazi zDcUnRQY4iNN9p^(%O98FqbdukhvQH+yXrxEpQZ6Nvcu|IQ>;s5N89#l>&|7* z5%{0}J~EK*6S`A4MiZuSeQj5zb_zvPRZ_i43&j8^bdzQ-ac_P3vwQWkscx`2JY!

398{= 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 ah2+BoRbd=;N(XBG5KcHZhdR3pY5xcQN_)fr From ffc67b3505cdf7c4e7fa50a7916a06accf4961ba Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:58:35 +0200 Subject: [PATCH 1058/1674] [3.14] gh-138004: Fix setting a thread name on OpenIndiana (GH-138017) (#138384) gh-138004: Fix setting a thread name on OpenIndiana (GH-138017) Encode Solaris/Illumos thread names to ASCII, since OpenIndiana does not support non-ASCII names. Add tests for setting non-ASCII name for the main thread. (cherry picked from commit c19db1d2b8935b6f4f775a0957a076f1864fbf80) Co-authored-by: jadonduff Co-authored-by: Serhiy Storchaka --- Lib/test/test_threading.py | 14 +++++++++++--- Misc/ACKS | 1 + .../2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst | 1 + Modules/_threadmodule.c | 9 ++++++--- 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 731e1046c000af..59db91b0ffce5e 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -2254,6 +2254,9 @@ def test__all__(self): @unittest.skipUnless(hasattr(_thread, 'set_name'), "missing _thread.set_name") @unittest.skipUnless(hasattr(_thread, '_get_name'), "missing _thread._get_name") def test_set_name(self): + # Ensure main thread name is restored after test + self.addCleanup(_thread.set_name, _thread._get_name()) + # set_name() limit in bytes truncate = getattr(_thread, "_NAME_MAXLEN", None) limit = truncate or 100 @@ -2293,7 +2296,8 @@ def test_set_name(self): tests.append(os_helper.TESTFN_UNENCODABLE) if sys.platform.startswith("sunos"): - encoding = "utf-8" + # Use ASCII encoding on Solaris/Illumos/OpenIndiana + encoding = "ascii" else: encoding = sys.getfilesystemencoding() @@ -2309,7 +2313,7 @@ def work(): if truncate is not None: encoded = encoded[:truncate] if sys.platform.startswith("sunos"): - expected = encoded.decode("utf-8", "surrogateescape") + expected = encoded.decode("ascii", "surrogateescape") else: expected = os.fsdecode(encoded) else: @@ -2328,7 +2332,11 @@ def work(): if '\0' in expected: expected = expected.split('\0', 1)[0] - with self.subTest(name=name, expected=expected): + with self.subTest(name=name, expected=expected, thread="main"): + _thread.set_name(name) + self.assertEqual(_thread._get_name(), expected) + + with self.subTest(name=name, expected=expected, thread="worker"): work_name = None thread = threading.Thread(target=work, name=name) thread.start() diff --git a/Misc/ACKS b/Misc/ACKS index ee3d66a04f0217..1730eb71cb86eb 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -482,6 +482,7 @@ Weilin Du John DuBois Paul Dubois Jacques Ducasse +Jadon Duff Andrei Dorian Duma Graham Dumpleton Quinn Dunkan diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst new file mode 100644 index 00000000000000..e73be998f4be7b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst @@ -0,0 +1 @@ +On Solaris/Illumos platforms, thread names are now encoded as ASCII to avoid errors on systems (e.g. OpenIndiana) that don't support non-ASCII names. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 26d3c0a2266b71..1389a1ef2c1b23 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -2474,7 +2474,9 @@ _thread__get_name_impl(PyObject *module) } #ifdef __sun - return PyUnicode_DecodeUTF8(name, strlen(name), "surrogateescape"); + // gh-138004: Decode Solaris/Illumos (e.g. OpenIndiana) thread names + // from ASCII, since OpenIndiana only supports ASCII names. + return PyUnicode_DecodeASCII(name, strlen(name), "surrogateescape"); #else return PyUnicode_DecodeFSDefault(name); #endif @@ -2512,8 +2514,9 @@ _thread_set_name_impl(PyObject *module, PyObject *name_obj) { #ifndef MS_WINDOWS #ifdef __sun - // Solaris always uses UTF-8 - const char *encoding = "utf-8"; + // gh-138004: Encode Solaris/Illumos thread names to ASCII, + // since OpenIndiana does not support non-ASCII names. + const char *encoding = "ascii"; #else // Encode the thread name to the filesystem encoding using the "replace" // error handler From c7326813f57ea736388462fba40acd6ccb9775b0 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Tue, 7 Oct 2025 12:07:36 -0700 Subject: [PATCH 1059/1674] [3.14] Always use the latest dev container image in `devcontainer.json` (GH-138003) This is a manual backport of 14319a99e52954d038d7568c5119be161a00a6b8 . --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 64c85c1101e6e6..2720ac30e1cc6a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "image": "ghcr.io/python/devcontainer:2024.09.25.11038928730", + "image": "ghcr.io/python/devcontainer:latest", "onCreateCommand": [ // Install common tooling. "dnf", From df739f33d375f515c2e5c73446a7a14ed4e0cef8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:11:43 +0200 Subject: [PATCH 1060/1674] [3.14] gh-131178: Add tests for `site` command-line interface (GH-133582) (GH-137832) gh-131178: Add tests for `site` command-line interface (GH-133582) (cherry picked from commit 03f5519d776e28ffd0b8344ef328ecddf863fe0a) Co-authored-by: ggqlq <124190229+ggqlq@users.noreply.github.com> --- Lib/test/test_site.py | 104 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index d0e3294263557e..39c451fbbbba41 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -13,6 +13,7 @@ from test.support import socket_helper from test.support import captured_stderr from test.support.os_helper import TESTFN, EnvironmentVarGuard +from test.support.script_helper import spawn_python, kill_python import ast import builtins import glob @@ -25,6 +26,7 @@ import sys import sysconfig import tempfile +from textwrap import dedent import urllib.error import urllib.request from unittest import mock @@ -803,5 +805,107 @@ def test_underpth_dll_file(self): self.assertTrue(rc, "sys.path is incorrect") +class CommandLineTests(unittest.TestCase): + def exists(self, path): + if path is not None and os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + + def get_excepted_output(self, *args): + if len(args) == 0: + user_base = site.getuserbase() + user_site = site.getusersitepackages() + output = io.StringIO() + output.write("sys.path = [\n") + for dir in sys.path: + output.write(" %r,\n" % (dir,)) + output.write("]\n") + output.write(f"USER_BASE: {user_base} ({self.exists(user_base)})\n") + output.write(f"USER_SITE: {user_site} ({self.exists(user_site)})\n") + output.write(f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}\n") + return 0, dedent(output.getvalue()).strip() + + buffer = [] + if '--user-base' in args: + buffer.append(site.getuserbase()) + if '--user-site' in args: + buffer.append(site.getusersitepackages()) + + if buffer: + return_code = 3 + if site.ENABLE_USER_SITE: + return_code = 0 + elif site.ENABLE_USER_SITE is False: + return_code = 1 + elif site.ENABLE_USER_SITE is None: + return_code = 2 + output = os.pathsep.join(buffer) + return return_code, os.path.normpath(dedent(output).strip()) + else: + return 10, None + + def invoke_command_line(self, *args): + args = ["-m", "site", *args] + + with EnvironmentVarGuard() as env: + env["PYTHONUTF8"] = "1" + env["PYTHONIOENCODING"] = "utf-8" + proc = spawn_python(*args, text=True, env=env, + encoding='utf-8', errors='replace') + + output = kill_python(proc) + return_code = proc.returncode + return return_code, os.path.normpath(dedent(output).strip()) + + @support.requires_subprocess() + def test_no_args(self): + return_code, output = self.invoke_command_line() + excepted_return_code, _ = self.get_excepted_output() + self.assertEqual(return_code, excepted_return_code) + lines = output.splitlines() + self.assertEqual(lines[0], "sys.path = [") + self.assertEqual(lines[-4], "]") + excepted_base = f"USER_BASE: '{site.getuserbase()}'" +\ + f" ({self.exists(site.getuserbase())})" + self.assertEqual(lines[-3], excepted_base) + excepted_site = f"USER_SITE: '{site.getusersitepackages()}'" +\ + f" ({self.exists(site.getusersitepackages())})" + self.assertEqual(lines[-2], excepted_site) + self.assertEqual(lines[-1], f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}") + + @support.requires_subprocess() + def test_unknown_args(self): + return_code, output = self.invoke_command_line("--unknown-arg") + excepted_return_code, _ = self.get_excepted_output("--unknown-arg") + self.assertEqual(return_code, excepted_return_code) + self.assertIn('[--user-base] [--user-site]', output) + + @support.requires_subprocess() + def test_base_arg(self): + return_code, output = self.invoke_command_line("--user-base") + excepted = self.get_excepted_output("--user-base") + excepted_return_code, excepted_output = excepted + self.assertEqual(return_code, excepted_return_code) + self.assertEqual(output, excepted_output) + + @support.requires_subprocess() + def test_site_arg(self): + return_code, output = self.invoke_command_line("--user-site") + excepted = self.get_excepted_output("--user-site") + excepted_return_code, excepted_output = excepted + self.assertEqual(return_code, excepted_return_code) + self.assertEqual(output, excepted_output) + + @support.requires_subprocess() + def test_both_args(self): + return_code, output = self.invoke_command_line("--user-base", + "--user-site") + excepted = self.get_excepted_output("--user-base", "--user-site") + excepted_return_code, excepted_output = excepted + self.assertEqual(return_code, excepted_return_code) + self.assertEqual(output, excepted_output) + + if __name__ == "__main__": unittest.main() From 2f14d2301361d1a92736749db9581a4a8e6aed55 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:13:27 +0200 Subject: [PATCH 1061/1674] [3.14] gh-139210: Fix use-after-free in xml.etree.ElementTree.iterparse() (GH-139211) (GH-139455) (cherry picked from commit c86eb4d3ac5984efc1ea920ba643e3c4f02fdee8) Co-authored-by: Ken Jin Co-authored-by: Petr Viktorin --- Lib/test/test_xml_etree.py | 2 ++ .../next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst | 1 + Modules/_elementtree.c | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index bf6d5074fdebd8..f65baa0cfae2ad 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1749,6 +1749,8 @@ def __next__(self): def test_unknown_event(self): with self.assertRaises(ValueError): ET.XMLPullParser(events=('start', 'end', 'bogus')) + with self.assertRaisesRegex(ValueError, "unknown event 'bogus'"): + ET.XMLPullParser(events=(x.decode() for x in (b'start', b'end', b'bogus'))) @unittest.skipIf(pyexpat.version_info < (2, 6, 0), f'Expat {pyexpat.version_info} does not ' diff --git a/Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst b/Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst new file mode 100644 index 00000000000000..1227b29a68a9d7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst @@ -0,0 +1 @@ +Fix use-after-free when reporting unknown event in :func:`xml.etree.ElementTree.iterparse`. Patch by Ken Jin. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index b9e12ab2026f65..9263f14b57f972 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -4214,8 +4214,8 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, (XML_ProcessingInstructionHandler) expat_pi_handler ); } else { - Py_DECREF(events_seq); PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name); + Py_DECREF(events_seq); return NULL; } } From cd8fc3aad33ef8c384281e2378a09fedfb934bfd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:14:54 +0200 Subject: [PATCH 1062/1674] [3.14] gh-95844: Move help_url code to a help module function (GH-129971) (#138484) gh-95844: Move help_url code to a help module function (GH-129971) --------- (cherry picked from commit 3b4cd885634abc029b409cb566e8d9a530d061f8) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Terry Jan Reedy --- Lib/idlelib/editor.py | 40 ++----------------------------------- Lib/idlelib/help.py | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 17b498f63ba43b..b4d6d25871bcf4 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -29,6 +29,7 @@ from idlelib.tree import wheel_event from idlelib.util import py_extensions from idlelib import window +from idlelib.help import _get_dochome # The default tab setting for a Text widget, in average-width characters. TK_TABWIDTH_DEFAULT = 8 @@ -76,44 +77,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): from idlelib.runscript import ScriptBinding if EditorWindow.help_url is None: - dochome = os.path.join(sys.base_prefix, 'Doc', 'index.html') - if sys.platform.count('linux'): - # look for html docs in a couple of standard places - pyver = 'python-docs-' + '%s.%s.%s' % sys.version_info[:3] - if os.path.isdir('/var/www/html/python/'): # "python2" rpm - dochome = '/var/www/html/python/index.html' - else: - basepath = '/usr/share/doc/' # standard location - dochome = os.path.join(basepath, pyver, - 'Doc', 'index.html') - elif sys.platform[:3] == 'win': - import winreg # Windows only, block only executed once. - docfile = '' - KEY = (rf"Software\Python\PythonCore\{sys.winver}" - r"\Help\Main Python Documentation") - try: - docfile = winreg.QueryValue(winreg.HKEY_CURRENT_USER, KEY) - except FileNotFoundError: - try: - docfile = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, - KEY) - except FileNotFoundError: - pass - if os.path.isfile(docfile): - dochome = docfile - elif sys.platform == 'darwin': - # documentation may be stored inside a python framework - dochome = os.path.join(sys.base_prefix, - 'Resources/English.lproj/Documentation/index.html') - dochome = os.path.normpath(dochome) - if os.path.isfile(dochome): - EditorWindow.help_url = dochome - if sys.platform == 'darwin': - # Safari requires real file:-URLs - EditorWindow.help_url = 'file://' + EditorWindow.help_url - else: - EditorWindow.help_url = ("https://docs.python.org/%d.%d/" - % sys.version_info[:2]) + EditorWindow.help_url = _get_dochome() self.flist = flist root = root or flist.root self.root = root diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index 063a749df54bc0..48e7eca280ebf8 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -23,7 +23,12 @@ copy_strip - Copy the text part of idle.html to help.html while rstripping each line. show_idlehelp - Create HelpWindow. Called in EditorWindow.help_dialog. + +_get_dochome() - Return path to docs on user's system if present, +otherwise return link to docs.python.org. """ +import os +import sys from html.parser import HTMLParser from os.path import abspath, dirname, isfile, join from platform import python_version @@ -289,6 +294,47 @@ def show_idlehelp(parent): return HelpWindow(parent, filename, 'IDLE Doc (%s)' % python_version()) +def _get_dochome(): + "Return path to local docs if present, otherwise link to docs.python.org." + + dochome = os.path.join(sys.base_prefix, 'Doc', 'index.html') + if sys.platform.count('linux'): + # look for html docs in a couple of standard places + pyver = 'python-docs-' + '%s.%s.%s' % sys.version_info[:3] + if os.path.isdir('/var/www/html/python/'): # rpm package manager + dochome = '/var/www/html/python/index.html' + else: + basepath = '/usr/share/doc/' # dnf/apt package managers + dochome = os.path.join(basepath, pyver, 'Doc', 'index.html') + + elif sys.platform[:3] == 'win': + import winreg # Windows only, block only executed once. + docfile = '' + KEY = (rf"Software\Python\PythonCore\{sys.winver}" + r"\Help\Main Python Documentation") + try: + docfile = winreg.QueryValue(winreg.HKEY_CURRENT_USER, KEY) + except FileNotFoundError: + try: + docfile = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, KEY) + except FileNotFoundError: + pass + if os.path.isfile(docfile): + dochome = docfile + elif sys.platform == 'darwin': + # documentation may be stored inside a python framework + dochome = os.path.join(sys.base_prefix, + 'Resources/English.lproj/Documentation/index.html') + dochome = os.path.normpath(dochome) + if os.path.isfile(dochome): + if sys.platform == 'darwin': + # Safari requires real file:-URLs + return 'file://' + dochome + return dochome + else: + return "https://docs.python.org/%d.%d/" % sys.version_info[:2] + + if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_help', verbosity=2, exit=False) From cde02ae7825c09ded31e253bc58839716a943795 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:23:08 +0200 Subject: [PATCH 1063/1674] [3.14] gh-139283: correctly handle `size` limit in `cursor.fetchmany()` (GH-139296) (GH-139441) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Passing a negative or zero size to `cursor.fetchmany()` made it fetch all rows instead of none. While this could be considered a security vulnerability, it was decided to treat this issue as a regular bug as passing a non-sanitized *size* value in the first place is not recommended. (cherry picked from commit bc172ee8307431caf4c89612e9e454081635191f) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Petr Viktorin --- Doc/library/sqlite3.rst | 6 +++ Lib/test/test_sqlite3/test_dbapi.py | 40 +++++++++++++- ...-09-24-13-39-56.gh-issue-139283.jODz_q.rst | 4 ++ Modules/_sqlite/clinic/cursor.c.h | 52 +++++++++++++++++-- Modules/_sqlite/cursor.c | 49 ++++++++++++----- Modules/_sqlite/cursor.h | 2 +- 6 files changed, 134 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 0f00f7e93c1810..55a97bc0788576 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -1612,6 +1612,9 @@ Cursor objects If the *size* parameter is used, then it is best for it to retain the same value from one :meth:`fetchmany` call to the next. + .. versionchanged:: next + Negative *size* values are rejected by raising :exc:`ValueError`. + .. method:: fetchall() Return all (remaining) rows of a query result as a :class:`list`. @@ -1639,6 +1642,9 @@ Cursor objects Read/write attribute that controls the number of rows returned by :meth:`fetchmany`. The default value is 1 which means a single row would be fetched per call. + .. versionchanged:: next + Negative values are rejected by raising :exc:`ValueError`. + .. attribute:: connection Read-only attribute that provides the SQLite database :class:`Connection` diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 0ef05ff1929b24..0284f2d10b052b 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -21,6 +21,7 @@ # 3. This notice may not be removed or altered from any source distribution. import contextlib +import functools import os import sqlite3 as sqlite import subprocess @@ -1060,7 +1061,7 @@ def test_array_size(self): # now set to 2 self.cu.arraysize = 2 - # now make the query return 3 rows + # now make the query return 2 rows from a table of 3 rows self.cu.execute("delete from test") self.cu.execute("insert into test(name) values ('A')") self.cu.execute("insert into test(name) values ('B')") @@ -1070,13 +1071,50 @@ def test_array_size(self): self.assertEqual(len(res), 2) + def test_invalid_array_size(self): + UINT32_MAX = (1 << 32) - 1 + setter = functools.partial(setattr, self.cu, 'arraysize') + + self.assertRaises(TypeError, setter, 1.0) + self.assertRaises(ValueError, setter, -3) + self.assertRaises(OverflowError, setter, UINT32_MAX + 1) + def test_fetchmany(self): + # no active SQL statement + res = self.cu.fetchmany() + self.assertEqual(res, []) + res = self.cu.fetchmany(1000) + self.assertEqual(res, []) + + # test default parameter + self.cu.execute("select name from test") + res = self.cu.fetchmany() + self.assertEqual(len(res), 1) + + # test when the number of requested rows exceeds the actual count self.cu.execute("select name from test") res = self.cu.fetchmany(100) self.assertEqual(len(res), 1) res = self.cu.fetchmany(100) self.assertEqual(res, []) + # test when size = 0 + self.cu.execute("select name from test") + res = self.cu.fetchmany(0) + self.assertEqual(res, []) + res = self.cu.fetchmany(100) + self.assertEqual(len(res), 1) + res = self.cu.fetchmany(100) + self.assertEqual(res, []) + + def test_invalid_fetchmany(self): + UINT32_MAX = (1 << 32) - 1 + fetchmany = self.cu.fetchmany + + self.assertRaises(TypeError, fetchmany, 1.0) + self.assertRaises(ValueError, fetchmany, -3) + self.assertRaises(OverflowError, fetchmany, UINT32_MAX + 1) + def test_fetchmany_kw_arg(self): """Checks if fetchmany works with keyword arguments""" self.cu.execute("select name from test") diff --git a/Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst b/Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst new file mode 100644 index 00000000000000..a8fd83bca52554 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst @@ -0,0 +1,4 @@ +:mod:`sqlite3`: correctly handle maximum number of rows to fetch in +:meth:`Cursor.fetchmany ` and reject negative +values for :attr:`Cursor.arraysize `. Patch by +Bénédikt Tran. diff --git a/Modules/_sqlite/clinic/cursor.c.h b/Modules/_sqlite/clinic/cursor.c.h index 350577f488df4b..3cad9f3aef5ecd 100644 --- a/Modules/_sqlite/clinic/cursor.c.h +++ b/Modules/_sqlite/clinic/cursor.c.h @@ -6,6 +6,7 @@ preserve # include "pycore_gc.h" // PyGC_Head # include "pycore_runtime.h" // _Py_ID() #endif +#include "pycore_long.h" // _PyLong_UInt32_Converter() #include "pycore_modsupport.h" // _PyArg_CheckPositional() static int @@ -181,7 +182,7 @@ PyDoc_STRVAR(pysqlite_cursor_fetchmany__doc__, {"fetchmany", _PyCFunction_CAST(pysqlite_cursor_fetchmany), METH_FASTCALL|METH_KEYWORDS, pysqlite_cursor_fetchmany__doc__}, static PyObject * -pysqlite_cursor_fetchmany_impl(pysqlite_Cursor *self, int maxrows); +pysqlite_cursor_fetchmany_impl(pysqlite_Cursor *self, uint32_t maxrows); static PyObject * pysqlite_cursor_fetchmany(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) @@ -216,7 +217,7 @@ pysqlite_cursor_fetchmany(PyObject *self, PyObject *const *args, Py_ssize_t narg #undef KWTUPLE PyObject *argsbuf[1]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - int maxrows = ((pysqlite_Cursor *)self)->arraysize; + uint32_t maxrows = ((pysqlite_Cursor *)self)->arraysize; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, /*minpos*/ 0, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); @@ -226,8 +227,7 @@ pysqlite_cursor_fetchmany(PyObject *self, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - maxrows = PyLong_AsInt(args[0]); - if (maxrows == -1 && PyErr_Occurred()) { + if (!_PyLong_UInt32_Converter(args[0], &maxrows)) { goto exit; } skip_optional_pos: @@ -329,4 +329,46 @@ pysqlite_cursor_close(PyObject *self, PyObject *Py_UNUSED(ignored)) { return pysqlite_cursor_close_impl((pysqlite_Cursor *)self); } -/*[clinic end generated code: output=d05c7cbbc8bcab26 input=a9049054013a1b77]*/ + +#if !defined(_sqlite3_Cursor_arraysize_DOCSTR) +# define _sqlite3_Cursor_arraysize_DOCSTR NULL +#endif +#if defined(_SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF) +# undef _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF +# define _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF {"arraysize", (getter)_sqlite3_Cursor_arraysize_get, (setter)_sqlite3_Cursor_arraysize_set, _sqlite3_Cursor_arraysize_DOCSTR}, +#else +# define _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF {"arraysize", (getter)_sqlite3_Cursor_arraysize_get, NULL, _sqlite3_Cursor_arraysize_DOCSTR}, +#endif + +static PyObject * +_sqlite3_Cursor_arraysize_get_impl(pysqlite_Cursor *self); + +static PyObject * +_sqlite3_Cursor_arraysize_get(PyObject *self, void *Py_UNUSED(context)) +{ + return _sqlite3_Cursor_arraysize_get_impl((pysqlite_Cursor *)self); +} + +#if !defined(_sqlite3_Cursor_arraysize_DOCSTR) +# define _sqlite3_Cursor_arraysize_DOCSTR NULL +#endif +#if defined(_SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF) +# undef _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF +# define _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF {"arraysize", (getter)_sqlite3_Cursor_arraysize_get, (setter)_sqlite3_Cursor_arraysize_set, _sqlite3_Cursor_arraysize_DOCSTR}, +#else +# define _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF {"arraysize", NULL, (setter)_sqlite3_Cursor_arraysize_set, NULL}, +#endif + +static int +_sqlite3_Cursor_arraysize_set_impl(pysqlite_Cursor *self, PyObject *value); + +static int +_sqlite3_Cursor_arraysize_set(PyObject *self, PyObject *value, void *Py_UNUSED(context)) +{ + int return_value; + + return_value = _sqlite3_Cursor_arraysize_set_impl((pysqlite_Cursor *)self, value); + + return return_value; +} +/*[clinic end generated code: output=a0e3ebba9e4d0ece input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index a38bf534d1b334..cb0f9adcc45a96 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -1162,35 +1162,31 @@ pysqlite_cursor_fetchone_impl(pysqlite_Cursor *self) /*[clinic input] _sqlite3.Cursor.fetchmany as pysqlite_cursor_fetchmany - size as maxrows: int(c_default='((pysqlite_Cursor *)self)->arraysize') = 1 + size as maxrows: uint32(c_default='((pysqlite_Cursor *)self)->arraysize') = 1 The default value is set by the Cursor.arraysize attribute. Fetches several rows from the resultset. [clinic start generated code]*/ static PyObject * -pysqlite_cursor_fetchmany_impl(pysqlite_Cursor *self, int maxrows) -/*[clinic end generated code: output=a8ef31fea64d0906 input=035dbe44a1005bf2]*/ +pysqlite_cursor_fetchmany_impl(pysqlite_Cursor *self, uint32_t maxrows) +/*[clinic end generated code: output=3325f2b477c71baf input=a509c412aa70b27e]*/ { PyObject* row; PyObject* list; - int counter = 0; list = PyList_New(0); if (!list) { return NULL; } - while ((row = pysqlite_cursor_iternext((PyObject *)self))) { - if (PyList_Append(list, row) < 0) { - Py_DECREF(row); - break; - } + while (maxrows > 0 && (row = pysqlite_cursor_iternext((PyObject *)self))) { + int rc = PyList_Append(list, row); Py_DECREF(row); - - if (++counter == maxrows) { + if (rc < 0) { break; } + maxrows--; } if (PyErr_Occurred()) { @@ -1304,6 +1300,30 @@ pysqlite_cursor_close_impl(pysqlite_Cursor *self) Py_RETURN_NONE; } +/*[clinic input] +@getter +_sqlite3.Cursor.arraysize +[clinic start generated code]*/ + +static PyObject * +_sqlite3_Cursor_arraysize_get_impl(pysqlite_Cursor *self) +/*[clinic end generated code: output=e0919d97175e6c50 input=3278f8d3ecbd90e3]*/ +{ + return PyLong_FromUInt32(self->arraysize); +} + +/*[clinic input] +@setter +_sqlite3.Cursor.arraysize +[clinic start generated code]*/ + +static int +_sqlite3_Cursor_arraysize_set_impl(pysqlite_Cursor *self, PyObject *value) +/*[clinic end generated code: output=af59a6b09f8cce6e input=ace48cb114e26060]*/ +{ + return PyLong_AsUInt32(value, &self->arraysize); +} + static PyMethodDef cursor_methods[] = { PYSQLITE_CURSOR_CLOSE_METHODDEF PYSQLITE_CURSOR_EXECUTEMANY_METHODDEF @@ -1321,7 +1341,6 @@ static struct PyMemberDef cursor_members[] = { {"connection", _Py_T_OBJECT, offsetof(pysqlite_Cursor, connection), Py_READONLY}, {"description", _Py_T_OBJECT, offsetof(pysqlite_Cursor, description), Py_READONLY}, - {"arraysize", Py_T_INT, offsetof(pysqlite_Cursor, arraysize), 0}, {"lastrowid", _Py_T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), Py_READONLY}, {"rowcount", Py_T_LONG, offsetof(pysqlite_Cursor, rowcount), Py_READONLY}, {"row_factory", _Py_T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0}, @@ -1329,6 +1348,11 @@ static struct PyMemberDef cursor_members[] = {NULL} }; +static struct PyGetSetDef cursor_getsets[] = { + _SQLITE3_CURSOR_ARRAYSIZE_GETSETDEF + {NULL}, +}; + static const char cursor_doc[] = PyDoc_STR("SQLite database cursor class."); @@ -1339,6 +1363,7 @@ static PyType_Slot cursor_slots[] = { {Py_tp_iternext, pysqlite_cursor_iternext}, {Py_tp_methods, cursor_methods}, {Py_tp_members, cursor_members}, + {Py_tp_getset, cursor_getsets}, {Py_tp_init, pysqlite_cursor_init}, {Py_tp_traverse, cursor_traverse}, {Py_tp_clear, cursor_clear}, diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h index 42f817af7c54ad..c840a3d7ed0d15 100644 --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -35,7 +35,7 @@ typedef struct pysqlite_Connection* connection; PyObject* description; PyObject* row_cast_map; - int arraysize; + uint32_t arraysize; PyObject* lastrowid; long rowcount; PyObject* row_factory; From d912e9a8520c92ec0fed2bc8e8fd5cc83fa8776b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:24:01 +0200 Subject: [PATCH 1064/1674] [3.14] gh-69605: Hardcode some stdlib submodules in PyREPL module completion (os.path, collections.abc...) (GH-138268) (GH-138943) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 537133d2b63611ce1c04aac4c283c932dee9985a) Co-authored-by: Loïc Simon Co-authored-by: Łukasz Langa --- Lib/_pyrepl/_module_completer.py | 31 +++++++++- Lib/test/test_pyrepl/test_pyrepl.py | 62 +++++++++++++++---- ...5-08-30-17-15-05.gh-issue-69605.KjBk99.rst | 1 + 3 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst diff --git a/Lib/_pyrepl/_module_completer.py b/Lib/_pyrepl/_module_completer.py index 1e9462a42156d4..cf59e007f4df80 100644 --- a/Lib/_pyrepl/_module_completer.py +++ b/Lib/_pyrepl/_module_completer.py @@ -1,9 +1,12 @@ from __future__ import annotations +import importlib +import os import pkgutil import sys import token import tokenize +from importlib.machinery import FileFinder from io import StringIO from contextlib import contextmanager from dataclasses import dataclass @@ -16,6 +19,15 @@ from typing import Any, Iterable, Iterator, Mapping +HARDCODED_SUBMODULES = { + # Standard library submodules that are not detected by pkgutil.iter_modules + # but can be imported, so should be proposed in completion + "collections": ["abc"], + "os": ["path"], + "xml.parsers.expat": ["errors", "model"], +} + + def make_default_module_completer() -> ModuleCompleter: # Inside pyrepl, __package__ is set to None by default return ModuleCompleter(namespace={'__package__': None}) @@ -41,6 +53,7 @@ def __init__(self, namespace: Mapping[str, Any] | None = None) -> None: self.namespace = namespace or {} self._global_cache: list[pkgutil.ModuleInfo] = [] self._curr_sys_path: list[str] = sys.path[:] + self._stdlib_path = os.path.dirname(importlib.__path__[0]) def get_completions(self, line: str) -> list[str] | None: """Return the next possible import completions for 'line'.""" @@ -95,12 +108,26 @@ def _find_modules(self, path: str, prefix: str) -> list[str]: return [] modules: Iterable[pkgutil.ModuleInfo] = self.global_cache + is_stdlib_import: bool | None = None for segment in path.split('.'): modules = [mod_info for mod_info in modules if mod_info.ispkg and mod_info.name == segment] + if is_stdlib_import is None: + # Top-level import decide if we import from stdlib or not + is_stdlib_import = all( + self._is_stdlib_module(mod_info) for mod_info in modules + ) modules = self.iter_submodules(modules) - return [module.name for module in modules - if self.is_suggestion_match(module.name, prefix)] + + module_names = [module.name for module in modules] + if is_stdlib_import: + module_names.extend(HARDCODED_SUBMODULES.get(path, ())) + return [module_name for module_name in module_names + if self.is_suggestion_match(module_name, prefix)] + + def _is_stdlib_module(self, module_info: pkgutil.ModuleInfo) -> bool: + return (isinstance(module_info.module_finder, FileFinder) + and module_info.module_finder.path == self._stdlib_path) def is_suggestion_match(self, module_name: str, prefix: str) -> bool: if prefix: diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 8c2325b2b669ce..05b19dc4afa7a2 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1,3 +1,4 @@ +import importlib import io import itertools import os @@ -26,9 +27,16 @@ code_to_events, ) from _pyrepl.console import Event -from _pyrepl._module_completer import ImportParser, ModuleCompleter -from _pyrepl.readline import (ReadlineAlikeReader, ReadlineConfig, - _ReadlineWrapper) +from _pyrepl._module_completer import ( + ImportParser, + ModuleCompleter, + HARDCODED_SUBMODULES, +) +from _pyrepl.readline import ( + ReadlineAlikeReader, + ReadlineConfig, + _ReadlineWrapper, +) from _pyrepl.readline import multiline_input as readline_multiline_input try: @@ -930,7 +938,6 @@ def test_func(self): class TestPyReplModuleCompleter(TestCase): def setUp(self): - import importlib # Make iter_modules() search only the standard library. # This makes the test more reliable in case there are # other user packages/scripts on PYTHONPATH which can @@ -1013,14 +1020,6 @@ def test_sub_module_private_completions(self): self.assertEqual(output, expected) def test_builtin_completion_top_level(self): - import importlib - # Make iter_modules() search only the standard library. - # This makes the test more reliable in case there are - # other user packages/scripts on PYTHONPATH which can - # intefere with the completions. - lib_path = os.path.dirname(importlib.__path__[0]) - sys.path = [lib_path] - cases = ( ("import bui\t\n", "import builtins"), ("from bui\t\n", "from builtins"), @@ -1076,6 +1075,32 @@ def test_no_fallback_on_regular_completion(self): output = reader.readline() self.assertEqual(output, expected) + def test_hardcoded_stdlib_submodules(self): + cases = ( + ("import collections.\t\n", "import collections.abc"), + ("from os import \t\n", "from os import path"), + ("import xml.parsers.expat.\t\te\t\n\n", "import xml.parsers.expat.errors"), + ("from xml.parsers.expat import \t\tm\t\n\n", "from xml.parsers.expat import model"), + ) + for code, expected in cases: + with self.subTest(code=code): + events = code_to_events(code) + reader = self.prepare_reader(events, namespace={}) + output = reader.readline() + self.assertEqual(output, expected) + + def test_hardcoded_stdlib_submodules_not_proposed_if_local_import(self): + with tempfile.TemporaryDirectory() as _dir: + dir = pathlib.Path(_dir) + (dir / "collections").mkdir() + (dir / "collections" / "__init__.py").touch() + (dir / "collections" / "foo.py").touch() + with patch.object(sys, "path", [dir, *sys.path]): + events = code_to_events("import collections.\t\n") + reader = self.prepare_reader(events, namespace={}) + output = reader.readline() + self.assertEqual(output, "import collections.foo") + def test_get_path_and_prefix(self): cases = ( ('', ('', '')), @@ -1204,6 +1229,19 @@ def test_parse_error(self): with self.subTest(code=code): self.assertEqual(actual, None) + +class TestHardcodedSubmodules(TestCase): + def test_hardcoded_stdlib_submodules_are_importable(self): + for parent_path, submodules in HARDCODED_SUBMODULES.items(): + for module_name in submodules: + path = f"{parent_path}.{module_name}" + with self.subTest(path=path): + # We can't use importlib.util.find_spec here, + # since some hardcoded submodules parents are + # not proper packages + importlib.import_module(path) + + class TestPasteEvent(TestCase): def prepare_reader(self, events): console = FakeConsole(events) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst new file mode 100644 index 00000000000000..d855470fc2b326 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst @@ -0,0 +1 @@ +Fix some standard library submodules missing from the :term:`REPL` auto-completion of imports. From fff26500e52898b21021121ca8b32fc18820e518 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:54:04 +0200 Subject: [PATCH 1065/1674] [3.14] gh-130567: Fix possible crash in locale.strxfrm() (GH-138940) (GH-139265) On some macOS versions there was an off-by-one error in wcsxfrm() which caused writing past the end of the array if its size was not calculated by running wcsxfrm() first. (cherry picked from commit 5854cf38a25ab8b0c6ab0296098166014f77caa3) Co-authored-by: Serhiy Storchaka Co-authored-by: Ronald Oussoren Co-authored-by: Petr Viktorin --- .../Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst | 2 ++ Modules/_localemodule.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst diff --git a/Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst b/Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst new file mode 100644 index 00000000000000..c194b2331e5f4a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst @@ -0,0 +1,2 @@ +Fix possible crash in :func:`locale.strxfrm` due to a platform bug on +macOS. diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 17b5220fd6f9e1..ae36130964c149 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -457,7 +457,9 @@ _locale_strxfrm_impl(PyObject *module, PyObject *str) /* assume no change in size, first */ n1 = n1 + 1; - buf = PyMem_New(wchar_t, n1); + /* Yet another +1 is needed to work around a platform bug in wcsxfrm() + * on macOS. See gh-130567. */ + buf = PyMem_New(wchar_t, n1+1); if (!buf) { PyErr_NoMemory(); goto exit; From b53f46a7b76ac6f7001027e1ba7433fe571e9987 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:55:52 +0200 Subject: [PATCH 1066/1674] [3.14] Doc: Improve clarity for subinterpreters in What's New in 3.14 (GH-139221) (GH-139722) (cherry picked from commit 25edfa7cf1c0ddeaae2dd76ca6c18807b339257a) Co-authored-by: Cornelius Roemer Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/whatsnew/3.14.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index 655243fee9803c..ad4330e63e0b59 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -217,7 +217,7 @@ has significant benefits: * they support a new (to Python), human-friendly concurrency model * true multi-core parallelism -For some use cases, concurrency in software enables efficiency and +For some use cases, concurrency in software improves efficiency and can simplify design, at a high level. At the same time, implementing and maintaining all but the simplest concurrency is often a struggle for the human brain. @@ -225,9 +225,10 @@ That especially applies to plain threads (for example, :mod:`threading`), where all memory is shared between all threads. With multiple isolated interpreters, you can take advantage of a class -of concurrency models, like CSP or the actor model, that have found +of concurrency models, like Communicating Sequential Processes (CSP) +or the actor model, that have found success in other programming languages, like Smalltalk, Erlang, -Haskell, and Go. Think of multiple interpreters like threads +Haskell, and Go. Think of multiple interpreters as threads but with opt-in sharing. Regarding multi-core parallelism: as of Python 3.12, interpreters @@ -249,8 +250,8 @@ having the isolation of processes with the efficiency of threads. While the feature has been around for decades, multiple interpreters have not been used widely, due to low awareness and the lack of a standard library module. Consequently, they currently have several -notable limitations, which will improve significantly now that the -feature is finally going mainstream. +notable limitations, which are expected to improve significantly now +that the feature is going mainstream. Current limitations: From 103766528fe9e678dd007474597b11156feaa7a6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:57:28 +0200 Subject: [PATCH 1067/1674] [3.14] gh-139076: Fix regression in pydoc not showing extension functions (GH-139077) (GH-139160) Fix a bug in the pydoc module that was hiding functions in a Python module if they were implemented in an extension module and the module did not have __all__. (cherry picked from commit 7257b24140ac1b39fb8cfd4610134ec79575a396) Co-authored-by: Serhiy Storchaka --- Lib/pydoc.py | 2 ++ Lib/test/test_pydoc/pydocfodder.py | 3 +++ Lib/test/test_pydoc/test_pydoc.py | 13 +++++++++++++ .../2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst | 3 +++ 4 files changed, 21 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 7528178fdcae97..2a99fc40dda3fd 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -884,6 +884,7 @@ def docmodule(self, object, name=None, mod=None, *ignored): for key, value in inspect.getmembers(object, inspect.isroutine): # if __all__ exists, believe it. Otherwise use a heuristic. if (all is not None + or inspect.isbuiltin(value) or (inspect.getmodule(value) or object) is object): if visiblename(key, all, object): funcs.append((key, value)) @@ -1328,6 +1329,7 @@ def docmodule(self, object, name=None, mod=None, *ignored): for key, value in inspect.getmembers(object, inspect.isroutine): # if __all__ exists, believe it. Otherwise use a heuristic. if (all is not None + or inspect.isbuiltin(value) or (inspect.getmodule(value) or object) is object): if visiblename(key, all, object): funcs.append((key, value)) diff --git a/Lib/test/test_pydoc/pydocfodder.py b/Lib/test/test_pydoc/pydocfodder.py index 3cc2d5bd57fe5b..412aa3743e430b 100644 --- a/Lib/test/test_pydoc/pydocfodder.py +++ b/Lib/test/test_pydoc/pydocfodder.py @@ -87,6 +87,8 @@ def B_classmethod(cls, x): object_repr = object.__repr__ get = {}.get # same name dict_get = {}.get + from math import sin + B.B_classmethod_ref = B.B_classmethod @@ -186,3 +188,4 @@ def __call__(self, inst): object_repr = object.__repr__ get = {}.get # same name dict_get = {}.get +from math import sin # noqa: F401 diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index 953cfe69f87cb8..fb0a8bb7b2339b 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -1939,9 +1939,11 @@ def test_text_doc_routines_in_class(self, cls=pydocfodder.B): if not support.MISSING_C_DOCSTRINGS: self.assertIn(' | get(key, default=None, /) method of builtins.dict instance', lines) self.assertIn(' | dict_get = get(key, default=None, /) method of builtins.dict instance', lines) + self.assertIn(' | sin(x, /)', lines) else: self.assertIn(' | get(...) method of builtins.dict instance', lines) self.assertIn(' | dict_get = get(...) method of builtins.dict instance', lines) + self.assertIn(' | sin(...)', lines) lines = self.getsection(result, f' | Class methods {where}:', ' | ' + '-'*70) self.assertIn(' | B_classmethod(x)', lines) @@ -2027,6 +2029,11 @@ def test_text_doc_routines_in_module(self): self.assertIn(' __repr__(...) unbound builtins.object method', lines) self.assertIn(' object_repr = __repr__(...) unbound builtins.object method', lines) + # builtin functions + if not support.MISSING_C_DOCSTRINGS: + self.assertIn(' sin(x, /)', lines) + else: + self.assertIn(' sin(...)', lines) def test_html_doc_routines_in_module(self): doc = pydoc.HTMLDoc() @@ -2067,6 +2074,12 @@ def test_html_doc_routines_in_module(self): self.assertIn(' __repr__(...) unbound builtins.object method', lines) self.assertIn(' object_repr = __repr__(...) unbound builtins.object method', lines) + # builtin functions + if not support.MISSING_C_DOCSTRINGS: + self.assertIn(' sin(x, /)', lines) + else: + self.assertIn(' sin(...)', lines) + @unittest.skipIf( is_wasm32, diff --git a/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst b/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst new file mode 100644 index 00000000000000..5e0ae6ed73edd4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst @@ -0,0 +1,3 @@ +Fix a bug in the :mod:`pydoc` module that was hiding functions in a Python +module if they were implemented in an extension module and the module did +not have ``__all__``. From f0f0566292fd4f6253ae98e2dea135a6a27eac27 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:11:34 +0200 Subject: [PATCH 1068/1674] [3.14] gh-130567: Enable previously skipped locale tests on FreeBSD and macOS (GH-138652) (GH-139421) (cherry picked from commit 1b8dcdacc75caa8175f89c7e739e45d856ebf511) Co-authored-by: Serhiy Storchaka --- Lib/test/test_locale.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 698e137e3e8abd..8e49aa8954ee0d 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -350,8 +350,7 @@ def setUp(self): enc = codecs.lookup(locale.getencoding() or 'ascii').name if enc not in ('utf-8', 'iso8859-1', 'cp1252'): raise unittest.SkipTest('encoding not suitable') - if enc != 'iso8859-1' and (sys.platform == 'darwin' or is_android or - sys.platform.startswith('freebsd')): + if enc != 'iso8859-1' and is_android: raise unittest.SkipTest('wcscoll/wcsxfrm have known bugs') BaseLocalizedTest.setUp(self) From 89a7b05f2318e7638c7412b675d0bad269d49534 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:12:30 +0200 Subject: [PATCH 1069/1674] [3.14] gh-78319: Fix implementation of IMAP APPEND UTF8 (GH-9436) (GH-139406) Make UTF8 support for the IMAP APPEND command RFC 6855 compliant. (cherry picked from commit 408154d64a7b3d43b05f44ea5c4cdf781bdd1352) Co-authored-by: Gordon Messmer --- Lib/imaplib.py | 8 +++-- Lib/test/test_imaplib.py | 29 +++++++++++++------ ...3-02-13-20-34-52.gh-issue-78319.V1zzed.rst | 1 + 3 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 362d6a2dcf2573..cbe129b3e7c214 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -497,8 +497,6 @@ def append(self, mailbox, flags, date_time, message): else: date_time = None literal = MapCRLF.sub(CRLF, message) - if self.utf8_enabled: - literal = b'UTF8 (' + literal + b')' self.literal = literal return self._simple_command(name, mailbox, flags, date_time) @@ -1119,7 +1117,11 @@ def _command(self, name, *args): literator = literal else: literator = None - data = data + bytes(' {%s}' % len(literal), self._encoding) + if self.utf8_enabled: + data = data + bytes(' UTF8 (~{%s}' % len(literal), self._encoding) + literal = literal + b')' + else: + data = data + bytes(' {%s}' % len(literal), self._encoding) if __debug__: if self.debug >= 4: diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index e0bd1febab88c7..a03d7b8bb2a42c 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -373,7 +373,11 @@ def cmd_AUTHENTICATE(self, tag, args): self._send_tagged(tag, 'OK', 'FAKEAUTH successful') def cmd_APPEND(self, tag, args): self._send_textline('+') - self.server.response = yield + self.server.response = args + literal = yield + self.server.response.append(literal) + literal = yield + self.server.response.append(literal) self._send_tagged(tag, 'OK', 'okay') client, server = self._setup(UTF8AppendServer) self.assertEqual(client._encoding, 'ascii') @@ -384,10 +388,13 @@ def cmd_APPEND(self, tag, args): self.assertEqual(code, 'OK') self.assertEqual(client._encoding, 'utf-8') msg_string = 'Subject: üñí©öðé' - typ, data = client.append(None, None, None, msg_string.encode('utf-8')) + typ, data = client.append( + None, None, None, (msg_string + '\n').encode('utf-8')) self.assertEqual(typ, 'OK') self.assertEqual(server.response, - ('UTF8 (%s)\r\n' % msg_string).encode('utf-8')) + ['INBOX', 'UTF8', + '(~{25}', ('%s\r\n' % msg_string).encode('utf-8'), + b')\r\n' ]) def test_search_disallows_charset_in_utf8_mode(self): class UTF8Server(SimpleIMAPHandler): @@ -887,7 +894,11 @@ def test_enable_UTF8_True_append(self): class UTF8AppendServer(self.UTF8Server): def cmd_APPEND(self, tag, args): self._send_textline('+') - self.server.response = yield + self.server.response = args + literal = yield + self.server.response.append(literal) + literal = yield + self.server.response.append(literal) self._send_tagged(tag, 'OK', 'okay') with self.reaped_pair(UTF8AppendServer) as (server, client): @@ -901,12 +912,12 @@ def cmd_APPEND(self, tag, args): self.assertEqual(client._encoding, 'utf-8') msg_string = 'Subject: üñí©öðé' typ, data = client.append( - None, None, None, msg_string.encode('utf-8')) + None, None, None, (msg_string + '\n').encode('utf-8')) self.assertEqual(typ, 'OK') - self.assertEqual( - server.response, - ('UTF8 (%s)\r\n' % msg_string).encode('utf-8') - ) + self.assertEqual(server.response, + ['INBOX', 'UTF8', + '(~{25}', ('%s\r\n' % msg_string).encode('utf-8'), + b')\r\n' ]) # XXX also need a test that makes sure that the Literal and Untagged_status # regexes uses unicode in UTF8 mode instead of the default ASCII. diff --git a/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst b/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst new file mode 100644 index 00000000000000..cc8a6e73942203 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst @@ -0,0 +1 @@ +UTF8 support for the IMAP APPEND command has been made RFC compliant. From 9853bbb1dcb5b67d1cc12cac7af266a0f963c924 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:15:56 +0200 Subject: [PATCH 1070/1674] [3.14] gh-134466: Don't run when termios is inaccessible (GH-138911) (GH-139029) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without the ability to set required capabilities, the REPL cannot function properly (syntax highlighting and multiline editing can't work). We refuse to work in this degraded state. (cherry picked from commit 2fc7004d5437e7bb0a1f5b962be441ef0ee7434b) Co-authored-by: Łukasz Langa --- Lib/_pyrepl/fancy_termios.py | 44 ++++++++------ Lib/_pyrepl/unix_console.py | 59 ++++++++++++------- ...-09-15-14-04-56.gh-issue-134466.yR4fYW.rst | 2 + 3 files changed, 64 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst diff --git a/Lib/_pyrepl/fancy_termios.py b/Lib/_pyrepl/fancy_termios.py index 0468b9a2670267..8d5bd183f21339 100644 --- a/Lib/_pyrepl/fancy_termios.py +++ b/Lib/_pyrepl/fancy_termios.py @@ -20,19 +20,25 @@ import termios +TYPE_CHECKING = False + +if TYPE_CHECKING: + from typing import cast +else: + cast = lambda typ, val: val + + class TermState: - def __init__(self, tuples): - ( - self.iflag, - self.oflag, - self.cflag, - self.lflag, - self.ispeed, - self.ospeed, - self.cc, - ) = tuples + def __init__(self, attrs: list[int | list[bytes]]) -> None: + self.iflag = cast(int, attrs[0]) + self.oflag = cast(int, attrs[1]) + self.cflag = cast(int, attrs[2]) + self.lflag = cast(int, attrs[3]) + self.ispeed = cast(int, attrs[4]) + self.ospeed = cast(int, attrs[5]) + self.cc = cast(list[bytes], attrs[6]) - def as_list(self): + def as_list(self) -> list[int | list[bytes]]: return [ self.iflag, self.oflag, @@ -45,32 +51,32 @@ def as_list(self): self.cc[:], ] - def copy(self): + def copy(self) -> "TermState": return self.__class__(self.as_list()) -def tcgetattr(fd): +def tcgetattr(fd: int) -> TermState: return TermState(termios.tcgetattr(fd)) -def tcsetattr(fd, when, attrs): +def tcsetattr(fd: int, when: int, attrs: TermState) -> None: termios.tcsetattr(fd, when, attrs.as_list()) class Term(TermState): TS__init__ = TermState.__init__ - def __init__(self, fd=0): + def __init__(self, fd: int = 0) -> None: self.TS__init__(termios.tcgetattr(fd)) self.fd = fd - self.stack = [] + self.stack: list[list[int | list[bytes]]] = [] - def save(self): + def save(self) -> None: self.stack.append(self.as_list()) - def set(self, when=termios.TCSANOW): + def set(self, when: int = termios.TCSANOW) -> None: termios.tcsetattr(self.fd, when, self.as_list()) - def restore(self): + def restore(self) -> None: self.TS__init__(self.stack.pop()) self.set() diff --git a/Lib/_pyrepl/unix_console.py b/Lib/_pyrepl/unix_console.py index 8b9122a48e775b..fe45b4eb384067 100644 --- a/Lib/_pyrepl/unix_console.py +++ b/Lib/_pyrepl/unix_console.py @@ -35,7 +35,7 @@ from . import terminfo from .console import Console, Event -from .fancy_termios import tcgetattr, tcsetattr +from .fancy_termios import tcgetattr, tcsetattr, TermState from .trace import trace from .unix_eventqueue import EventQueue from .utils import wlen @@ -51,16 +51,19 @@ # types if TYPE_CHECKING: - from typing import IO, Literal, overload + from typing import AbstractSet, IO, Literal, overload, cast else: overload = lambda func: None + cast = lambda typ, val: val class InvalidTerminal(RuntimeError): - pass + def __init__(self, message: str) -> None: + super().__init__(errno.EIO, message) _error = (termios.error, InvalidTerminal) +_error_codes_to_ignore = frozenset([errno.EIO, errno.ENXIO, errno.EPERM]) SIGWINCH_EVENT = "repaint" @@ -125,12 +128,13 @@ def __init__(self): 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) + r, w, e = select.select([self.fd], [], [], timeout / 1000) return r poll = MinimalPoll # type: ignore[assignment] @@ -164,8 +168,15 @@ def __init__( and os.getenv("TERM_PROGRAM") == "Apple_Terminal" ) + try: + self.__input_fd_set(tcgetattr(self.input_fd), ignore=frozenset()) + except _error as e: + raise RuntimeError(f"termios failure ({e.args[1]})") + @overload - def _my_getstr(cap: str, optional: Literal[False] = False) -> bytes: ... + def _my_getstr( + cap: str, optional: Literal[False] = False + ) -> bytes: ... @overload def _my_getstr(cap: str, optional: bool) -> bytes | None: ... @@ -205,7 +216,9 @@ def _my_getstr(cap: str, optional: bool = False) -> bytes | None: self.__setup_movement() - self.event_queue = EventQueue(self.input_fd, self.encoding, self.terminfo) + self.event_queue = EventQueue( + self.input_fd, self.encoding, self.terminfo + ) self.cursor_visible = 1 signal.signal(signal.SIGCONT, self._sigcont_handler) @@ -217,7 +230,6 @@ def _sigcont_handler(self, signum, frame): def __read(self, n: int) -> bytes: return os.read(self.input_fd, n) - def change_encoding(self, encoding: str) -> None: """ Change the encoding used for I/O operations. @@ -329,6 +341,8 @@ def prepare(self): """ Prepare the console for input/output operations. """ + self.__buffer = [] + self.__svtermstate = tcgetattr(self.input_fd) raw = self.__svtermstate.copy() raw.iflag &= ~(termios.INPCK | termios.ISTRIP | termios.IXON) @@ -340,14 +354,7 @@ def prepare(self): raw.lflag |= termios.ISIG raw.cc[termios.VMIN] = 1 raw.cc[termios.VTIME] = 0 - try: - tcsetattr(self.input_fd, termios.TCSADRAIN, raw) - except termios.error as e: - if e.args[0] != errno.EIO: - # gh-135329: when running under external programs (like strace), - # tcsetattr may fail with EIO. We can safely ignore this - # and continue with default terminal settings. - raise + self.__input_fd_set(raw) # In macOS terminal we need to deactivate line wrap via ANSI escape code if self.is_apple_terminal: @@ -356,8 +363,6 @@ def prepare(self): self.screen = [] self.height, self.width = self.getheightwidth() - self.__buffer = [] - self.posxy = 0, 0 self.__gone_tall = 0 self.__move = self.__move_short @@ -379,11 +384,7 @@ def restore(self): self.__disable_bracketed_paste() self.__maybe_write_code(self._rmkx) self.flushoutput() - try: - tcsetattr(self.input_fd, termios.TCSADRAIN, self.__svtermstate) - except termios.error as e: - if e.args[0] != errno.EIO: - raise + self.__input_fd_set(self.__svtermstate) if self.is_apple_terminal: os.write(self.output_fd, b"\033[?7h") @@ -820,3 +821,17 @@ def __tputs(self, fmt, prog=delayprog): os.write(self.output_fd, self._pad * nchars) else: time.sleep(float(delay) / 1000.0) + + def __input_fd_set( + self, + state: TermState, + ignore: AbstractSet[int] = _error_codes_to_ignore, + ) -> bool: + try: + tcsetattr(self.input_fd, termios.TCSADRAIN, state) + except termios.error as te: + if te.args[0] not in ignore: + raise + return False + else: + return True diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst new file mode 100644 index 00000000000000..4fae7e0d6f6326 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst @@ -0,0 +1,2 @@ +Don't run PyREPL in a degraded environment where setting termios attributes +is not allowed. From 537b558ce99e5783c451a5e152eddf5fdd6bf6ea Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:21:41 +0100 Subject: [PATCH 1071/1674] [3.14] gh-137920: Fix semantically relevant typo in curses.window.attron (#137940) (GH-138506) Originally authored by: vict-Yang (cherry picked from commit ce70a57bc02fddc8cb18a08aaf1449fceb10d66e) --- Doc/library/curses.rst | 2 +- Modules/_cursesmodule.c | 4 ++-- Modules/clinic/_cursesmodule.c.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index ce52cdb694504c..fb84cf32246879 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -772,7 +772,7 @@ Window Objects .. method:: window.attron(attr) - Add attribute *attr* from the "background" set applied to all writes to the + Add attribute *attr* to the "background" set applied to all writes to the current window. diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 706aa8ea72122b..f4e7732b657d4e 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1139,12 +1139,12 @@ _curses.window.attron attr: long / -Add attribute attr from the "background" set. +Add attribute attr to the "background" set. [clinic start generated code]*/ static PyObject * _curses_window_attron_impl(PyCursesWindowObject *self, long attr) -/*[clinic end generated code: output=7afea43b237fa870 input=5a88fba7b1524f32]*/ +/*[clinic end generated code: output=7afea43b237fa870 input=b57f824e1bf58326]*/ { return PyCursesCheckERR_ForWin(self, wattron(self->win, (attr_t)attr), "attron"); } diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index a898a7e17cf8d1..8172440dc58c9d 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -301,7 +301,7 @@ PyDoc_STRVAR(_curses_window_attron__doc__, "attron($self, attr, /)\n" "--\n" "\n" -"Add attribute attr from the \"background\" set."); +"Add attribute attr to the \"background\" set."); #define _CURSES_WINDOW_ATTRON_METHODDEF \ {"attron", (PyCFunction)_curses_window_attron, METH_O, _curses_window_attron__doc__}, @@ -4435,4 +4435,4 @@ _curses_has_extended_color_support(PyObject *module, PyObject *Py_UNUSED(ignored #ifndef _CURSES_ASSUME_DEFAULT_COLORS_METHODDEF #define _CURSES_ASSUME_DEFAULT_COLORS_METHODDEF #endif /* !defined(_CURSES_ASSUME_DEFAULT_COLORS_METHODDEF) */ -/*[clinic end generated code: output=7753612d7613903c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=78252f8805206d95 input=a9049054013a1b77]*/ From 9ec4e3838a44ed198acd28970c4854a619d595dc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 7 Oct 2025 23:26:05 +0300 Subject: [PATCH 1072/1674] [3.14] gh-138264: Fix gcc 14 compiler warnings (GH-138265) (GH-138426) (cherry picked from commit 4a33077fdb546db71b16d50cdd552529a9a1c910) --- Include/internal/pycore_stats.h | 2 +- Lib/test/test_generated_cases.py | 2 +- Modules/_sre/sre.c | 2 +- Python/executor_cases.c.h | 8 +++--- Python/generated_cases.c.h | 30 +++++++++++----------- Tools/cases_generator/generators_common.py | 2 +- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Include/internal/pycore_stats.h b/Include/internal/pycore_stats.h index ab649574f33dbf..24f239a2135b93 100644 --- a/Include/internal/pycore_stats.h +++ b/Include/internal/pycore_stats.h @@ -77,7 +77,7 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #define RARE_EVENT_INTERP_INC(interp, name) \ do { \ /* saturating add */ \ - int val = FT_ATOMIC_LOAD_UINT8_RELAXED(interp->rare_events.name); \ + uint8_t val = FT_ATOMIC_LOAD_UINT8_RELAXED(interp->rare_events.name); \ if (val < UINT8_MAX) { \ FT_ATOMIC_STORE_UINT8(interp->rare_events.name, val + 1); \ } \ diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py index d481cb07f757d8..fc34ac2fdc98ce 100644 --- a/Lib/test/test_generated_cases.py +++ b/Lib/test/test_generated_cases.py @@ -1601,7 +1601,7 @@ def test_instruction_size_macro(self): frame->instr_ptr = next_instr; next_instr += 1; INSTRUCTION_STATS(OP); - frame->return_offset = 1 ; + frame->return_offset = 1u ; DISPATCH(); } """ diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index e8943920043906..694a66818f90d8 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -2355,7 +2355,7 @@ match_getindex(MatchObject* self, PyObject* index) } // Check that i*2 cannot overflow to make static analyzers happy - assert(i <= SRE_MAXGROUPS); + assert((size_t)i <= SRE_MAXGROUPS); return i; } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index af4c39d03afa86..e3f4e5bdb65fd5 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1576,7 +1576,7 @@ new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame); new_frame->localsplus[0] = container; new_frame->localsplus[1] = sub; - frame->return_offset = 6 ; + frame->return_offset = 6u ; stack_pointer[-3].bits = (uintptr_t)new_frame; stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); @@ -1944,8 +1944,8 @@ gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - assert( 2 + oparg <= UINT16_MAX); - frame->return_offset = (uint16_t)( 2 + oparg); + assert( 2u + oparg <= UINT16_MAX); + frame->return_offset = (uint16_t)( 2u + oparg); gen_frame->previous = frame; stack_pointer[-1].bits = (uintptr_t)gen_frame; break; @@ -4544,7 +4544,7 @@ gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; gen_frame->previous = frame; - frame->return_offset = (uint16_t)( 2 + oparg); + frame->return_offset = (uint16_t)( 2u + oparg); stack_pointer[0].bits = (uintptr_t)gen_frame; stack_pointer += 1; assert(WITHIN_STACK_BOUNDS()); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 5d464b06bc1804..f2b99365772f4d 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -653,7 +653,7 @@ new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame); new_frame->localsplus[0] = container; new_frame->localsplus[1] = sub; - frame->return_offset = 6 ; + frame->return_offset = 6u ; } // _PUSH_FRAME { @@ -1586,7 +1586,7 @@ if (new_frame == NULL) { JUMP_TO_LABEL(error); } - frame->return_offset = 4 ; + frame->return_offset = 4u ; DISPATCH_INLINED(new_frame); } STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o); @@ -2641,7 +2641,7 @@ if (new_frame == NULL) { JUMP_TO_LABEL(error); } - assert( 1 == 1); + assert( 1u == 1); frame->return_offset = 1; DISPATCH_INLINED(new_frame); } @@ -2922,8 +2922,8 @@ if (new_frame == NULL) { JUMP_TO_LABEL(error); } - assert( 4 == 1 + INLINE_CACHE_ENTRIES_CALL_KW); - frame->return_offset = 4 ; + assert( 4u == 1 + INLINE_CACHE_ENTRIES_CALL_KW); + frame->return_offset = 4u ; DISPATCH_INLINED(new_frame); } STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o); @@ -5821,7 +5821,7 @@ gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; gen_frame->previous = frame; - frame->return_offset = (uint16_t)( 2 + oparg); + frame->return_offset = (uint16_t)( 2u + oparg); } // _PUSH_FRAME { @@ -6460,7 +6460,7 @@ if (new_frame == NULL) { JUMP_TO_LABEL(error); } - frame->return_offset = 4 ; + frame->return_offset = 4u ; DISPATCH_INLINED(new_frame); } STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o); @@ -6681,7 +6681,7 @@ if (new_frame == NULL) { JUMP_TO_LABEL(error); } - assert( 1 == 1); + assert( 1u == 1); frame->return_offset = 1; DISPATCH_INLINED(new_frame); } @@ -6832,8 +6832,8 @@ if (new_frame == NULL) { JUMP_TO_LABEL(error); } - assert( 4 == 1 + INLINE_CACHE_ENTRIES_CALL_KW); - frame->return_offset = 4 ; + assert( 4u == 1 + INLINE_CACHE_ENTRIES_CALL_KW); + frame->return_offset = 4u ; DISPATCH_INLINED(new_frame); } STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o); @@ -8237,7 +8237,7 @@ stack_pointer += -1; assert(WITHIN_STACK_BOUNDS()); new_frame->localsplus[1] = PyStackRef_FromPyObjectNew(name); - frame->return_offset = 10 ; + frame->return_offset = 10u ; DISPATCH_INLINED(new_frame); } @@ -10690,8 +10690,8 @@ gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - assert( 2 + oparg <= UINT16_MAX); - frame->return_offset = (uint16_t)( 2 + oparg); + assert( 2u + oparg <= UINT16_MAX); + frame->return_offset = (uint16_t)( 2u + oparg); assert(gen_frame->previous == NULL); gen_frame->previous = frame; DISPATCH_INLINED(gen_frame); @@ -10791,8 +10791,8 @@ gen->gi_frame_state = FRAME_EXECUTING; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - assert( 2 + oparg <= UINT16_MAX); - frame->return_offset = (uint16_t)( 2 + oparg); + assert( 2u + oparg <= UINT16_MAX); + frame->return_offset = (uint16_t)( 2u + oparg); gen_frame->previous = frame; } // _PUSH_FRAME diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py index 9e60d219a71c4a..0b3d89660099de 100644 --- a/Tools/cases_generator/generators_common.py +++ b/Tools/cases_generator/generators_common.py @@ -443,7 +443,7 @@ def instruction_size(self, """Replace the INSTRUCTION_SIZE macro with the size of the current instruction.""" if uop.instruction_size is None: raise analysis_error("The INSTRUCTION_SIZE macro requires uop.instruction_size to be set", tkn) - self.out.emit(f" {uop.instruction_size} ") + self.out.emit(f" {uop.instruction_size}u ") return True def _print_storage(self, reason:str, storage: Storage) -> None: From 181cecc5c006873d6ef23d8c48e43a69f44503ed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:34:36 +0200 Subject: [PATCH 1073/1674] [3.14] gh-126008: Improve docstrings for Tkinter cget and configure methods (GH-133303) (GH-137660) * Explain the behavior of Widget.configure() depending on arguments. * Unify descriptions. * Replace "resource" with "option". (cherry picked from commit 027cacb67ce1b16a96a6a2866299803eff16a4a6) Co-authored-by: Serhiy Storchaka --- Lib/tkinter/__init__.py | 131 +++++++++++++++++++++------------------- Lib/tkinter/ttk.py | 2 +- 2 files changed, 70 insertions(+), 63 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index a693b04870b995..9526d8b949fa3b 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -7,25 +7,25 @@ LabelFrame and PanedWindow. Properties of the widgets are specified with keyword arguments. -Keyword arguments have the same name as the corresponding resource +Keyword arguments have the same name as the corresponding options under Tk. Widgets are positioned with one of the geometry managers Place, Pack or Grid. These managers can be called with methods place, pack, grid available in every Widget. -Actions are bound to events by resources (e.g. keyword argument -command) or with the method bind. +Actions are bound to events by options (e.g. the command +keyword argument) or with the bind() method. Example (Hello, World): import tkinter from tkinter.constants import * tk = tkinter.Tk() frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2) -frame.pack(fill=BOTH,expand=1) +frame.pack(fill=BOTH, expand=1) label = tkinter.Label(frame, text="Hello, World") label.pack(fill=X, expand=1) -button = tkinter.Button(frame,text="Exit",command=tk.destroy) +button = tkinter.Button(frame, text="Exit", command=tk.destroy) button.pack(side=BOTTOM) tk.mainloop() """ @@ -847,7 +847,7 @@ def tk_focusNext(self): The focus order first goes to the next child, then to the children of the child recursively and then to the next sibling which is higher in the stacking order. A - widget is omitted if it has the takefocus resource set + widget is omitted if it has the takefocus option set to 0.""" name = self.tk.call('tk_focusNext', self._w) if not name: return None @@ -1827,18 +1827,24 @@ def _configure(self, cmd, cnf, kw): # These used to be defined in Widget: def configure(self, cnf=None, **kw): - """Configure resources of a widget. + """Query or modify the configuration options of the widget. - The values for resources are specified as keyword - arguments. To get an overview about - the allowed keyword arguments call the method keys. + If no arguments are specified, return a dictionary describing + all of the available options for the widget. + + If an option name is specified, then return a tuple describing + the one named option. + + If one or more keyword arguments are specified or a dictionary + is specified, then modify the widget option(s) to have the given + value(s). """ return self._configure('configure', cnf, kw) config = configure def cget(self, key): - """Return the resource value for a KEY given as string.""" + """Return the current value of the configuration option.""" return self.tk.call(self._w, 'cget', '-' + key) __getitem__ = cget @@ -1847,7 +1853,7 @@ def __setitem__(self, key, value): self.configure({key: value}) def keys(self): - """Return a list of all resource names of this widget.""" + """Return a list of all option names of this widget.""" splitlist = self.tk.splitlist return [splitlist(x)[0][1:] for x in splitlist(self.tk.call(self._w, 'configure'))] @@ -1966,7 +1972,7 @@ def _grid_configure(self, command, index, cnf, kw): def grid_columnconfigure(self, index, cnf={}, **kw): """Configure column INDEX of a grid. - Valid resources are minsize (minimum size of the column), + Valid options are minsize (minimum size of the column), weight (how much does additional space propagate to this column) and pad (how much space to let additionally).""" return self._grid_configure('columnconfigure', index, cnf, kw) @@ -1997,7 +2003,7 @@ def grid_propagate(self, flag=_noarg_): def grid_rowconfigure(self, index, cnf={}, **kw): """Configure row INDEX of a grid. - Valid resources are minsize (minimum size of the row), + Valid options are minsize (minimum size of the row), weight (how much does additional space propagate to this row) and pad (how much space to let additionally).""" return self._grid_configure('rowconfigure', index, cnf, kw) @@ -2817,7 +2823,7 @@ class Toplevel(BaseWidget, Wm): def __init__(self, master=None, cnf={}, **kw): """Construct a toplevel widget with the parent MASTER. - Valid resource names: background, bd, bg, borderwidth, class, + Valid option names: background, bd, bg, borderwidth, class, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, menu, relief, screen, takefocus, use, visual, width.""" @@ -2894,7 +2900,7 @@ class Canvas(Widget, XView, YView): def __init__(self, master=None, cnf={}, **kw): """Construct a canvas widget with the parent MASTER. - Valid resource names: background, bd, bg, borderwidth, closeenough, + Valid option names: background, bd, bg, borderwidth, closeenough, confine, cursor, height, highlightbackground, highlightcolor, highlightthickness, insertbackground, insertborderwidth, insertofftime, insertontime, insertwidth, offset, relief, @@ -3103,16 +3109,14 @@ def insert(self, *args): self.tk.call((self._w, 'insert') + args) def itemcget(self, tagOrId, option): - """Return the resource value for an OPTION for item TAGORID.""" + """Return the value of OPTION for item TAGORID.""" return self.tk.call( (self._w, 'itemcget') + (tagOrId, '-'+option)) def itemconfigure(self, tagOrId, cnf=None, **kw): - """Configure resources of an item TAGORID. + """Query or modify the configuration options of an item TAGORID. - The values for resources are specified as keyword - arguments. To get an overview about - the allowed keyword arguments call the method without arguments. + Similar to configure() except that it applies to the specified item. """ return self._configure(('itemconfigure', tagOrId), cnf, kw) @@ -3204,7 +3208,7 @@ class Checkbutton(Widget): def __init__(self, master=None, cnf={}, **kw): """Construct a checkbutton widget with the parent MASTER. - Valid resource names: activebackground, activeforeground, anchor, + Valid option names: activebackground, activeforeground, anchor, background, bd, bg, bitmap, borderwidth, command, cursor, disabledforeground, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, image, @@ -3235,7 +3239,7 @@ def flash(self): self.tk.call(self._w, 'flash') def invoke(self): - """Toggle the button and invoke a command if given as resource.""" + """Toggle the button and invoke a command if given as option.""" return self.tk.call(self._w, 'invoke') def select(self): @@ -3253,7 +3257,7 @@ class Entry(Widget, XView): def __init__(self, master=None, cnf={}, **kw): """Construct an entry widget with the parent MASTER. - Valid resource names: background, bd, bg, borderwidth, cursor, + Valid option names: background, bd, bg, borderwidth, cursor, exportselection, fg, font, foreground, highlightbackground, highlightcolor, highlightthickness, insertbackground, insertborderwidth, insertofftime, insertontime, insertwidth, @@ -3339,7 +3343,7 @@ class Frame(Widget): def __init__(self, master=None, cnf={}, **kw): """Construct a frame widget with the parent MASTER. - Valid resource names: background, bd, bg, borderwidth, class, + Valid option names: background, bd, bg, borderwidth, class, colormap, container, cursor, height, highlightbackground, highlightcolor, highlightthickness, relief, takefocus, visual, width.""" cnf = _cnfmerge((cnf, kw)) @@ -3383,7 +3387,7 @@ class Listbox(Widget, XView, YView): def __init__(self, master=None, cnf={}, **kw): """Construct a listbox widget with the parent MASTER. - Valid resource names: background, bd, bg, borderwidth, cursor, + Valid option names: background, bd, bg, borderwidth, cursor, exportselection, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, relief, selectbackground, selectborderwidth, selectforeground, selectmode, setgrid, takefocus, @@ -3476,18 +3480,15 @@ def size(self): return self.tk.getint(self.tk.call(self._w, 'size')) def itemcget(self, index, option): - """Return the resource value for an ITEM and an OPTION.""" + """Return the value of OPTION for item at INDEX.""" return self.tk.call( (self._w, 'itemcget') + (index, '-'+option)) def itemconfigure(self, index, cnf=None, **kw): - """Configure resources of an ITEM. + """Query or modify the configuration options of an item at INDEX. - The values for resources are specified as keyword arguments. - To get an overview about the allowed keyword arguments - call the method without arguments. - Valid resource names: background, bg, foreground, fg, - selectbackground, selectforeground.""" + Similar to configure() except that it applies to the specified item. + """ return self._configure(('itemconfigure', index), cnf, kw) itemconfig = itemconfigure @@ -3499,7 +3500,7 @@ class Menu(Widget): def __init__(self, master=None, cnf={}, **kw): """Construct menu widget with the parent MASTER. - Valid resource names: activebackground, activeborderwidth, + Valid option names: activebackground, activeborderwidth, activeforeground, background, bd, bg, borderwidth, cursor, disabledforeground, fg, font, foreground, postcommand, relief, selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" @@ -3580,11 +3581,15 @@ def delete(self, index1, index2=None): self.tk.call(self._w, 'delete', index1, index2) def entrycget(self, index, option): - """Return the resource value of a menu item for OPTION at INDEX.""" + """Return the value of OPTION for a menu item at INDEX.""" return self.tk.call(self._w, 'entrycget', index, '-' + option) def entryconfigure(self, index, cnf=None, **kw): - """Configure a menu item at INDEX.""" + """Query or modify the configuration options of a menu item at INDEX. + + Similar to configure() except that it applies to the specified + menu item. + """ return self._configure(('entryconfigure', index), cnf, kw) entryconfig = entryconfigure @@ -3642,7 +3647,7 @@ class Radiobutton(Widget): def __init__(self, master=None, cnf={}, **kw): """Construct a radiobutton widget with the parent MASTER. - Valid resource names: activebackground, activeforeground, anchor, + Valid option names: activebackground, activeforeground, anchor, background, bd, bg, bitmap, borderwidth, command, cursor, disabledforeground, fg, font, foreground, height, highlightbackground, highlightcolor, highlightthickness, image, @@ -3661,7 +3666,7 @@ def flash(self): self.tk.call(self._w, 'flash') def invoke(self): - """Toggle the button and invoke a command if given as resource.""" + """Toggle the button and invoke a command if given as option.""" return self.tk.call(self._w, 'invoke') def select(self): @@ -3675,7 +3680,7 @@ class Scale(Widget): def __init__(self, master=None, cnf={}, **kw): """Construct a scale widget with the parent MASTER. - Valid resource names: activebackground, background, bigincrement, bd, + Valid option names: activebackground, background, bigincrement, bd, bg, borderwidth, command, cursor, digits, fg, font, foreground, from, highlightbackground, highlightcolor, highlightthickness, label, length, orient, relief, repeatdelay, repeatinterval, resolution, @@ -3714,7 +3719,7 @@ class Scrollbar(Widget): def __init__(self, master=None, cnf={}, **kw): """Construct a scrollbar widget with the parent MASTER. - Valid resource names: activebackground, activerelief, + Valid option names: activebackground, activerelief, background, bd, bg, borderwidth, command, cursor, elementborderwidth, highlightbackground, highlightcolor, highlightthickness, jump, orient, @@ -3958,7 +3963,11 @@ def image_cget(self, index, option): return self.tk.call(self._w, "image", "cget", index, option) def image_configure(self, index, cnf=None, **kw): - """Configure an embedded image at INDEX.""" + """Query or modify the configuration options of an embedded image at INDEX. + + Similar to configure() except that it applies to the specified + embedded image. + """ return self._configure(('image', 'configure', index), cnf, kw) def image_create(self, index, cnf={}, **kw): @@ -4096,7 +4105,10 @@ def tag_cget(self, tagName, option): return self.tk.call(self._w, 'tag', 'cget', tagName, option) def tag_configure(self, tagName, cnf=None, **kw): - """Configure a tag TAGNAME.""" + """Query or modify the configuration options of a tag TAGNAME. + + Similar to configure() except that it applies to the specified tag. + """ return self._configure(('tag', 'configure', tagName), cnf, kw) tag_config = tag_configure @@ -4154,7 +4166,11 @@ def window_cget(self, index, option): return self.tk.call(self._w, 'window', 'cget', index, option) def window_configure(self, index, cnf=None, **kw): - """Configure an embedded window at INDEX.""" + """Query or modify the configuration options of an embedded window at INDEX. + + Similar to configure() except that it applies to the specified + embedded window. + """ return self._configure(('window', 'configure', index), cnf, kw) window_config = window_configure @@ -4194,7 +4210,7 @@ class OptionMenu(Menubutton): def __init__(self, master, variable, value, *values, **kwargs): """Construct an optionmenu widget with the parent MASTER, with - the resource textvariable set to VARIABLE, the initially selected + the option textvariable set to VARIABLE, the initially selected value VALUE, the other menu values VALUES and an additional keyword argument command.""" kw = {"borderwidth": 2, "textvariable": variable, @@ -4296,7 +4312,7 @@ class PhotoImage(Image): def __init__(self, name=None, cnf={}, master=None, **kw): """Create an image with NAME. - Valid resource names: data, format, file, gamma, height, palette, + Valid option names: data, format, file, gamma, height, palette, width.""" Image.__init__(self, 'photo', name, cnf, master, **kw) @@ -4559,7 +4575,7 @@ class BitmapImage(Image): def __init__(self, name=None, cnf={}, master=None, **kw): """Create a bitmap with NAME. - Valid resource names: background, data, file, foreground, maskdata, maskfile.""" + Valid option names: background, data, file, foreground, maskdata, maskfile.""" Image.__init__(self, 'bitmap', name, cnf, master, **kw) @@ -4877,26 +4893,17 @@ def sash_place(self, index, x, y): return self.sash("place", index, x, y) def panecget(self, child, option): - """Query a management option for window. - - Option may be any value allowed by the paneconfigure subcommand - """ + """Return the value of option for a child window.""" return self.tk.call( (self._w, 'panecget') + (child, '-'+option)) def paneconfigure(self, tagOrId, cnf=None, **kw): - """Query or modify the management options for window. - - If no option is specified, returns a list describing all - of the available options for pathName. If option is - specified with no value, then the command 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 command modifies the given widget - option(s) to have the given value(s); in this case the - command returns an empty string. The following options - are supported: + """Query or modify the configuration options for a child window. + + Similar to configure() except that it applies to the specified + window. + + The following options are supported: after window Insert the window after the window specified. window diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index c0cf1e787fa9ad..ef2b91dfbb6638 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -1589,7 +1589,7 @@ class OptionMenu(Menubutton): def __init__(self, master, variable, default=None, *values, **kwargs): """Construct a themed OptionMenu widget with master as the parent, - the resource textvariable set to variable, the initially selected + the option textvariable set to variable, the initially selected value specified by the default parameter, the menu values given by *values and additional keywords. From 827c90b8b2425b1d71080c6db18104912b31da61 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:35:06 +0200 Subject: [PATCH 1074/1674] [3.14] Add test for opening an SQLite with bytes path (GH-136331) (GH-137632) (cherry picked from commit 1bde13b0e99592fbfce3538b27ada29ea09840a6) Co-authored-by: Serhiy Storchaka --- Lib/test/test_sqlite3/test_dbapi.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 0284f2d10b052b..1e595bdbd645a2 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -639,6 +639,14 @@ def test_deserialize_corrupt_database(self): class OpenTests(unittest.TestCase): _sql = "create table test(id integer)" + def test_open_with_bytes_path(self): + path = os.fsencode(TESTFN) + self.addCleanup(unlink, path) + self.assertFalse(os.path.exists(path)) + with contextlib.closing(sqlite.connect(path)) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) + def test_open_with_path_like_object(self): """ Checks that we can successfully connect to a database using an object that is PathLike, i.e. has __fspath__(). """ From 2fc69e88e6d5708c2a3758cfc65cfa7c88fea2c4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:38:47 +0200 Subject: [PATCH 1075/1674] [3.14] gh-123441: Correct the supported languages of the iso-8859-4 codec (GH-137034) (GH-137419) (cherry picked from commit 525784aa65d35a5609aba53c873a9a3a578f992b) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index f96f2f8281f450..5932012c535b56 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1251,7 +1251,7 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | iso8859_3 | iso-8859-3, latin3, L3 | Esperanto, Maltese | +-----------------+--------------------------------+--------------------------------+ -| iso8859_4 | iso-8859-4, latin4, L4 | Baltic languages | +| iso8859_4 | iso-8859-4, latin4, L4 | Northern Europe | +-----------------+--------------------------------+--------------------------------+ | iso8859_5 | iso-8859-5, cyrillic | Belarusian, Bulgarian, | | | | Macedonian, Russian, Serbian | From a869796927932b17573344c64ba4302ed58742d7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:51:14 +0200 Subject: [PATCH 1076/1674] [3.14] gh-63161: Add more tests for source encoding (GH-139440) (GH-139442) (cherry picked from commit b2f5ad0c6d7cfd249c41bfbcdd0a75a9f21f1e72) Co-authored-by: Serhiy Storchaka --- Lib/test/test_source_encoding.py | 102 ++++++++++++++++++++++++++++--- Lib/test/test_tokenize.py | 95 ++++++++++++++++++++++++---- 2 files changed, 177 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py index 1399f3fcd2d393..5df40782382120 100644 --- a/Lib/test/test_source_encoding.py +++ b/Lib/test/test_source_encoding.py @@ -172,6 +172,8 @@ def test_tokenizer_fstring_warning_in_first_line(self): os.unlink(TESTFN) +BUFSIZ = 2**13 + class AbstractSourceEncodingTest: def test_default_coding(self): @@ -184,14 +186,20 @@ def test_first_coding_line(self): self.check_script_output(src, br"'\xc3\u20ac'") def test_second_coding_line(self): - src = (b'#\n' + src = (b'#!/usr/bin/python\n' + b'#coding:iso8859-15\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xc3\u20ac'") + + def test_second_coding_line_empty_first_line(self): + src = (b'\n' b'#coding:iso8859-15\n' b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xc3\u20ac'") def test_third_coding_line(self): # Only first two lines are tested for a magic comment. - src = (b'#\n' + src = (b'#!/usr/bin/python\n' b'#\n' b'#coding:iso8859-15\n' b'print(ascii("\xc3\xa4"))\n') @@ -209,13 +217,52 @@ def test_double_coding_same_line(self): b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xc3\u20ac'") + def test_double_coding_utf8(self): + src = (b'#coding:utf-8\n' + b'#coding:latin1\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xe4'") + + def test_long_first_coding_line(self): + src = (b'#' + b' '*BUFSIZ + b'coding:iso8859-15\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xc3\u20ac'") + + def test_long_second_coding_line(self): + src = (b'#!/usr/bin/python\n' + b'#' + b' '*BUFSIZ + b'coding:iso8859-15\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xc3\u20ac'") + + def test_long_coding_line(self): + src = (b'#coding:iso-8859-15' + b' '*BUFSIZ + b'\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xc3\u20ac'") + + def test_long_coding_name(self): + src = (b'#coding:iso-8859-1-' + b'x'*BUFSIZ + b'\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xc3\xa4'") + + def test_long_first_utf8_line(self): + src = b'#' + b'\xc3\xa4'*(BUFSIZ//2) + b'\n' + self.check_script_output(src, b'') + src = b'# ' + b'\xc3\xa4'*(BUFSIZ//2) + b'\n' + self.check_script_output(src, b'') + + def test_long_second_utf8_line(self): + src = b'\n#' + b'\xc3\xa4'*(BUFSIZ//2) + b'\n' + self.check_script_output(src, b'') + src = b'\n# ' + b'\xc3\xa4'*(BUFSIZ//2) + b'\n' + self.check_script_output(src, b'') + def test_first_non_utf8_coding_line(self): src = (b'#coding:iso-8859-15 \xa4\n' b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xc3\u20ac'") def test_second_non_utf8_coding_line(self): - src = (b'\n' + src = (b'#!/usr/bin/python\n' b'#coding:iso-8859-15 \xa4\n' b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xc3\u20ac'") @@ -224,27 +271,56 @@ def test_utf8_bom(self): src = (b'\xef\xbb\xbfprint(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xe4'") + def test_utf8_bom_utf8_comments(self): + src = (b'\xef\xbb\xbf#\xc3\xa4\n' + b'#\xc3\xa4\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xe4'") + def test_utf8_bom_and_utf8_coding_line(self): src = (b'\xef\xbb\xbf#coding:utf-8\n' b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xe4'") + def test_utf8_non_utf8_comment_line_error(self): + src = (b'#coding: utf8\n' + b'#\n' + b'#\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"'utf-8' codec can't decode byte|" + br"encoding problem: utf8") + def test_crlf(self): src = (b'print(ascii("""\r\n"""))\n') - out = self.check_script_output(src, br"'\n'") + self.check_script_output(src, br"'\n'") def test_crcrlf(self): src = (b'print(ascii("""\r\r\n"""))\n') - out = self.check_script_output(src, br"'\n\n'") + self.check_script_output(src, br"'\n\n'") def test_crcrcrlf(self): src = (b'print(ascii("""\r\r\r\n"""))\n') - out = self.check_script_output(src, br"'\n\n\n'") + self.check_script_output(src, br"'\n\n\n'") def test_crcrcrlf2(self): src = (b'#coding:iso-8859-1\n' b'print(ascii("""\r\r\r\n"""))\n') - out = self.check_script_output(src, br"'\n\n\n'") + self.check_script_output(src, br"'\n\n\n'") + + def test_nul_in_first_coding_line(self): + src = (b'#coding:iso8859-15\x00\n' + b'\n' + b'\n' + b'raise RuntimeError\n') + self.check_script_error(src, br"source code (string )?cannot contain null bytes") + + def test_nul_in_second_coding_line(self): + src = (b'#!/usr/bin/python\n' + b'#coding:iso8859-15\x00\n' + b'\n' + b'raise RuntimeError\n') + self.check_script_error(src, br"source code (string )?cannot contain null bytes") class UTF8ValidatorTest(unittest.TestCase): @@ -324,6 +400,10 @@ def check_script_output(self, src, expected): out = stdout.getvalue().encode('latin1') self.assertEqual(out.rstrip(), expected) + def check_script_error(self, src, expected): + with self.assertRaisesRegex(SyntaxError, expected.decode()) as cm: + exec(src) + class FileSourceEncodingTest(AbstractSourceEncodingTest, unittest.TestCase): @@ -335,6 +415,14 @@ def check_script_output(self, src, expected): res = script_helper.assert_python_ok(fn) self.assertEqual(res.out.rstrip(), expected) + def check_script_error(self, src, expected): + with tempfile.TemporaryDirectory() as tmpd: + fn = os.path.join(tmpd, 'test.py') + with open(fn, 'wb') as fp: + fp.write(src) + res = script_helper.assert_python_failure(fn) + self.assertRegex(res.err.rstrip().splitlines()[-1], b'SyntaxError.*?' + expected) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 1e485dfb1e2585..8fdd03f347b632 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1363,7 +1363,8 @@ def readline(): def test_no_bom_no_encoding_cookie(self): lines = ( - b'# something\n', + b'#!/home/\xc3\xa4/bin/python\n', + b'# something \xe2\x82\xac\n', b'print(something)\n', b'do_something(else)\n' ) @@ -1371,16 +1372,54 @@ def test_no_bom_no_encoding_cookie(self): self.assertEqual(encoding, 'utf-8') self.assertEqual(consumed_lines, list(lines[:2])) + def test_no_bom_no_encoding_cookie_first_line_error(self): + lines = ( + b'#!/home/\xa4/bin/python\n\n', + b'print(something)\n', + b'do_something(else)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) + + def test_no_bom_no_encoding_cookie_second_line_error(self): + lines = ( + b'#!/usr/bin/python\n', + b'# something \xe2\n', + b'print(something)\n', + b'do_something(else)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) + def test_bom_no_cookie(self): lines = ( - b'\xef\xbb\xbf# something\n', + b'\xef\xbb\xbf#!/home/\xc3\xa4/bin/python\n', b'print(something)\n', b'do_something(else)\n' ) encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) self.assertEqual(encoding, 'utf-8-sig') self.assertEqual(consumed_lines, - [b'# something\n', b'print(something)\n']) + [b'#!/home/\xc3\xa4/bin/python\n', b'print(something)\n']) + + def test_bom_no_cookie_first_line_error(self): + lines = ( + b'\xef\xbb\xbf#!/home/\xa4/bin/python\n', + b'print(something)\n', + b'do_something(else)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) + + def test_bom_no_cookie_second_line_error(self): + lines = ( + b'\xef\xbb\xbf#!/usr/bin/python\n', + b'# something \xe2\n', + b'print(something)\n', + b'do_something(else)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) def test_cookie_first_line_no_bom(self): lines = ( @@ -1456,27 +1495,58 @@ def test_cookie_second_line_noncommented_first_line(self): expected = [b"print('\xc2\xa3')\n"] self.assertEqual(consumed_lines, expected) - def test_cookie_second_line_commented_first_line(self): + def test_cookie_second_line_empty_first_line(self): lines = ( - b"#print('\xc2\xa3')\n", + b'\n', b'# vim: set fileencoding=iso8859-15 :\n', b"print('\xe2\x82\xac')\n" ) encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) self.assertEqual(encoding, 'iso8859-15') - expected = [b"#print('\xc2\xa3')\n", b'# vim: set fileencoding=iso8859-15 :\n'] + expected = [b'\n', b'# vim: set fileencoding=iso8859-15 :\n'] self.assertEqual(consumed_lines, expected) - def test_cookie_second_line_empty_first_line(self): + def test_cookie_third_line(self): lines = ( - b'\n', - b'# vim: set fileencoding=iso8859-15 :\n', - b"print('\xe2\x82\xac')\n" + b'#!/home/\xc3\xa4/bin/python\n', + b'# something\n', + b'# vim: set fileencoding=ascii :\n', + b'print(something)\n', + b'do_something(else)\n' + ) + encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) + self.assertEqual(encoding, 'utf-8') + self.assertEqual(consumed_lines, list(lines[:2])) + + def test_double_coding_line(self): + # If the first line matches the second line is ignored. + lines = ( + b'#coding:iso8859-15\n', + b'#coding:latin1\n', + b'print(something)\n' ) encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) self.assertEqual(encoding, 'iso8859-15') - expected = [b'\n', b'# vim: set fileencoding=iso8859-15 :\n'] - self.assertEqual(consumed_lines, expected) + self.assertEqual(consumed_lines, list(lines[:1])) + + def test_double_coding_same_line(self): + lines = ( + b'#coding:iso8859-15 coding:latin1\n', + b'print(something)\n' + ) + encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) + self.assertEqual(encoding, 'iso8859-15') + self.assertEqual(consumed_lines, list(lines[:1])) + + def test_double_coding_utf8(self): + lines = ( + b'#coding:utf-8\n', + b'#coding:latin1\n', + b'print(something)\n' + ) + encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) + self.assertEqual(encoding, 'utf-8') + self.assertEqual(consumed_lines, list(lines[:1])) def test_latin1_normalization(self): # See get_normal_name() in Parser/tokenizer/helpers.c. @@ -1502,7 +1572,6 @@ def test_syntaxerror_latin1(self): readline = self.get_readline(lines) self.assertRaises(SyntaxError, tokenize.detect_encoding, readline) - def test_utf8_normalization(self): # See get_normal_name() in Parser/tokenizer/helpers.c. encodings = ("utf-8", "utf-8-mac", "utf-8-unix") From e953cead6104f96f70a0cf944ab8bc47e63811de Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:58:53 +0200 Subject: [PATCH 1077/1674] [3.14] Touch up `Setup.local` handling in `Tools/wasm/wasi` (GH-137051) (GH-137053) Touch up `Setup.local` handling in `Tools/wasm/wasi` (GH-137051) The comment in the generated file is now more self-explanatory. The checks for unexpected file contents are also strengthened. (cherry picked from commit ec7fad79d24e79961b86e17177a32b32bb340fe5) Co-authored-by: Brett Cannon Co-authored-by: Zachary Ware --- Tools/wasm/wasi/__main__.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index 54ccc95157d57d..f3c97ff3fd11a0 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -23,7 +23,8 @@ BUILD_DIR = CROSS_BUILD_DIR / "build" LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local" -LOCAL_SETUP_MARKER = "# Generated by Tools/wasm/wasi.py\n".encode("utf-8") +LOCAL_SETUP_MARKER = ("# Generated by Tools/wasm/wasi .\n" + "# Required to statically build extension modules.").encode("utf-8") WASMTIME_VAR_NAME = "WASMTIME" WASMTIME_HOST_RUNNER_VAR = f"{{{WASMTIME_VAR_NAME}}}" @@ -141,9 +142,12 @@ def build_python_is_pydebug(): def configure_build_python(context, working_dir): """Configure the build/host Python.""" if LOCAL_SETUP.exists(): - print(f"👍 {LOCAL_SETUP} exists ...") + if LOCAL_SETUP.read_bytes() == LOCAL_SETUP_MARKER: + print(f"👍 {LOCAL_SETUP} exists ...") + else: + print(f"⚠️ {LOCAL_SETUP} exists, but has unexpected contents") else: - print(f"📝 Touching {LOCAL_SETUP} ...") + print(f"📝 Creating {LOCAL_SETUP} ...") LOCAL_SETUP.write_bytes(LOCAL_SETUP_MARKER) configure = [os.path.relpath(CHECKOUT / 'configure', working_dir)] @@ -297,9 +301,8 @@ def clean_contents(context): shutil.rmtree(CROSS_BUILD_DIR) if LOCAL_SETUP.exists(): - with LOCAL_SETUP.open("rb") as file: - if file.read(len(LOCAL_SETUP_MARKER)) == LOCAL_SETUP_MARKER: - print(f"🧹 Deleting generated {LOCAL_SETUP} ...") + if LOCAL_SETUP.read_bytes() == LOCAL_SETUP_MARKER: + print(f"🧹 Deleting generated {LOCAL_SETUP} ...") def main(): From 61d49a5d37fbff7839fe7f2f746bbc9d464feb87 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:02:32 +0200 Subject: [PATCH 1078/1674] [3.14] gh-138239: Fix incorrect highlighting of "type" in type statements in the REPL (GH-138241) (GH-138937) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 26cfb1794255222b20cd7b502ab9193861df3184) Co-authored-by: 00ll00 <40747228+00ll00@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/_pyrepl/utils.py | 6 ++++++ Lib/test/test_pyrepl/test_reader.py | 8 +++++--- .../2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst diff --git a/Lib/_pyrepl/utils.py b/Lib/_pyrepl/utils.py index 99b5c5aaf39e5a..64708e843b685b 100644 --- a/Lib/_pyrepl/utils.py +++ b/Lib/_pyrepl/utils.py @@ -264,6 +264,12 @@ def is_soft_keyword_used(*tokens: TI | None) -> bool: return True case (TI(string="case"), TI(string="_"), TI(string=":")): return True + case ( + None | TI(T.NEWLINE) | TI(T.INDENT) | TI(T.DEDENT) | TI(string=":"), + TI(string="type"), + TI(T.NAME, string=s) + ): + return not keyword.iskeyword(s) case _: return False diff --git a/Lib/test/test_pyrepl/test_reader.py b/Lib/test/test_pyrepl/test_reader.py index 9a02dff7387563..b1b6ae16a1e592 100644 --- a/Lib/test/test_pyrepl/test_reader.py +++ b/Lib/test/test_pyrepl/test_reader.py @@ -378,6 +378,7 @@ def funct(case: str = sys.platform) -> None: case "ios" | "android": print("on the phone") case _: print('arms around', match.group(1)) + type type = type[type] """ ) expected = dedent( @@ -397,6 +398,7 @@ def funct(case: str = sys.platform) -> None: {K}case{z} {s}"ios"{z} {o}|{z} {s}"android"{z}{o}:{z} {b}print{z}{o}({z}{s}"on the phone"{z}{o}){z} {K}case{z} {K}_{z}{o}:{z} {b}print{z}{o}({z}{s}'arms around'{z}{o},{z} match{o}.{z}group{o}({z}{n}1{z}{o}){z}{o}){z} + {K}type{z} {b}type{z} {o}={z} {b}type{z}{o}[{z}{b}type{z}{o}]{z} """ ) expected_sync = expected.format(a="", **colors) @@ -404,14 +406,14 @@ def funct(case: str = sys.platform) -> None: reader, _ = handle_all_events(events) self.assert_screen_equal(reader, code, clean=True) self.assert_screen_equal(reader, expected_sync) - self.assertEqual(reader.pos, 396) - self.assertEqual(reader.cxy, (0, 15)) + self.assertEqual(reader.pos, 419) + self.assertEqual(reader.cxy, (0, 16)) async_msg = "{k}async{z} ".format(**colors) expected_async = expected.format(a=async_msg, **colors) more_events = itertools.chain( code_to_events(code), - [Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 14, + [Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 15, code_to_events("async "), ) reader, _ = handle_all_events(more_events) diff --git a/Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst b/Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst new file mode 100644 index 00000000000000..9e0218e02664c6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst @@ -0,0 +1,2 @@ +The REPL now highlights :keyword:`type` as a soft keyword +in :ref:`type statements `. From dfdda53e6795c7e9621041fbb4b309759b7c1b06 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:06:37 +0200 Subject: [PATCH 1079/1674] [3.14] gh-138432: Improved invalid path checking in zoneinfo.reset_tzpath() (GH-138433) (GH-138777) * Improve error messages for path-like relative paths and path-like bytes paths. * TZPATH is now always a tuple of strings. (cherry picked from commit 859aecc33b82f45e5b7ae30138d28f2a2f33a575) Co-authored-by: Stephen Morton --- Lib/test/test_zoneinfo/test_zoneinfo.py | 11 ++++++++++- Lib/zoneinfo/_tzpath.py | 7 +++++++ .../2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst | 6 ++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py index 44e87e71c8ee7b..67c570563110e9 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -18,7 +18,7 @@ from functools import cached_property from test.support import MISSING_C_DOCSTRINGS -from test.support.os_helper import EnvironmentVarGuard +from test.support.os_helper import EnvironmentVarGuard, FakePath from test.test_zoneinfo import _support as test_support from test.test_zoneinfo._support import TZPATH_TEST_LOCK, ZoneInfoTestBase from test.support.import_helper import import_module, CleanImport @@ -1783,6 +1783,7 @@ def test_reset_tzpath_relative_paths(self): ("/usr/share/zoneinfo", "../relative/path",), ("path/to/somewhere", "../relative/path",), ("/usr/share/zoneinfo", "path/to/somewhere", "../relative/path",), + (FakePath("path/to/somewhere"),) ] for input_paths in bad_values: with self.subTest(input_paths=input_paths): @@ -1794,6 +1795,9 @@ def test_tzpath_type_error(self): "/etc/zoneinfo:/usr/share/zoneinfo", b"/etc/zoneinfo:/usr/share/zoneinfo", 0, + (b"/bytes/path", "/valid/path"), + (FakePath(b"/bytes/path"),), + (0,), ] for bad_value in bad_values: @@ -1804,6 +1808,7 @@ def test_tzpath_type_error(self): def test_tzpath_attribute(self): tzpath_0 = [f"{DRIVE}/one", f"{DRIVE}/two"] tzpath_1 = [f"{DRIVE}/three"] + tzpath_pathlike = (FakePath(f"{DRIVE}/usr/share/zoneinfo"),) with self.tzpath_context(tzpath_0): query_0 = self.module.TZPATH @@ -1811,8 +1816,12 @@ def test_tzpath_attribute(self): with self.tzpath_context(tzpath_1): query_1 = self.module.TZPATH + with self.tzpath_context(tzpath_pathlike): + query_pathlike = self.module.TZPATH + self.assertSequenceEqual(tzpath_0, query_0) self.assertSequenceEqual(tzpath_1, query_1) + self.assertSequenceEqual(tuple([os.fspath(p) for p in tzpath_pathlike]), query_pathlike) class CTzPathTest(TzPathTest): diff --git a/Lib/zoneinfo/_tzpath.py b/Lib/zoneinfo/_tzpath.py index 5db17bea045d8c..d8ccec82059391 100644 --- a/Lib/zoneinfo/_tzpath.py +++ b/Lib/zoneinfo/_tzpath.py @@ -13,6 +13,13 @@ def _reset_tzpath(to=None, stacklevel=4): + f"not {type(tzpaths)}: {tzpaths!r}" ) + tzpaths = [os.fspath(p) for p in tzpaths] + if not all(isinstance(p, str) for p in tzpaths): + raise TypeError( + "All elements of a tzpath sequence must be strings or " + "os.PathLike objects which convert to strings." + ) + if not all(map(os.path.isabs, tzpaths)): raise ValueError(_get_invalid_paths_message(tzpaths)) base_tzpath = tzpaths diff --git a/Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst b/Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst new file mode 100644 index 00000000000000..b48b978a6d5c75 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst @@ -0,0 +1,6 @@ +:meth:`zoneinfo.reset_tzpath` will now convert any :class:`os.PathLike` objects +it receives into strings before adding them to ``TZPATH``. It will raise +``TypeError`` if anything other than a string is found after this conversion. +If given an :class:`os.PathLike` object that represents a relative path, it +will now raise ``ValueError`` instead of ``TypeError``, and present a more +informative error message. From 63bd8cfcdb7b8682390517cf89796c5b027a09db Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:10:49 +0200 Subject: [PATCH 1080/1674] [3.14] gh-138729: Cover `inspect.formatannotationrelativeto` with tests (GH-138730) (GH-138747) (cherry picked from commit f5fa336579d124e389b1c36a5431e7908aaf5e53) Co-authored-by: sobolevn --- Lib/test/test_inspect/test_inspect.py | 43 ++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 50eb1703125c91..148d4779456422 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -1755,14 +1755,55 @@ class C(metaclass=M): class TestFormatAnnotation(unittest.TestCase): def test_typing_replacement(self): - from test.typinganndata.ann_module9 import ann, ann1 + from test.typinganndata.ann_module9 import A, ann, ann1 self.assertEqual(inspect.formatannotation(ann), 'List[str] | int') self.assertEqual(inspect.formatannotation(ann1), 'List[testModule.typing.A] | int') + self.assertEqual(inspect.formatannotation(A, 'testModule.typing'), 'A') + self.assertEqual(inspect.formatannotation(A, 'other'), 'testModule.typing.A') + self.assertEqual( + inspect.formatannotation(ann1, 'testModule.typing'), + 'List[testModule.typing.A] | int', + ) + def test_forwardref(self): fwdref = ForwardRef('fwdref') self.assertEqual(inspect.formatannotation(fwdref), 'fwdref') + def test_formatannotationrelativeto(self): + from test.typinganndata.ann_module9 import A, ann1 + + # Builtin types: + self.assertEqual( + inspect.formatannotationrelativeto(object)(type), + 'type', + ) + + # Custom types: + self.assertEqual( + inspect.formatannotationrelativeto(None)(A), + 'testModule.typing.A', + ) + + class B: ... + B.__module__ = 'testModule.typing' + + self.assertEqual( + inspect.formatannotationrelativeto(B)(A), + 'A', + ) + + self.assertEqual( + inspect.formatannotationrelativeto(object)(A), + 'testModule.typing.A', + ) + + # Not an instance of "type": + self.assertEqual( + inspect.formatannotationrelativeto(A)(ann1), + 'List[testModule.typing.A] | int', + ) + class TestIsMethodDescriptor(unittest.TestCase): From 09fdd219a5e81019dc56f3cf8793dd83b6176ae8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:12:13 +0200 Subject: [PATCH 1081/1674] [3.14] gh-105487: Fix `__dir__` entries of `GenericAlias` (GH-138578) (GH-138629) (cherry picked from commit b0420b505e6c9bbc8418e0f6240835ea777137b5) Co-authored-by: sobolevn Co-authored-by: Emma Smith --- Lib/test/test_genericalias.py | 27 ++++++++++++++++--- ...-09-06-13-53-33.gh-issue-105487.a43YaY.rst | 1 + Objects/genericaliasobject.c | 22 +++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 7601cb00ff6685..4e08adaca05cdd 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -402,7 +402,10 @@ def __deepcopy__(self, memo): aliases = [ GenericAlias(list, T), GenericAlias(deque, T), - GenericAlias(X, T) + GenericAlias(X, T), + X[T], + list[T], + deque[T], ] + _UNPACKED_TUPLES for alias in aliases: with self.subTest(alias=alias): @@ -432,10 +435,26 @@ def test_union_generic(self): self.assertEqual(a.__parameters__, (T,)) def test_dir(self): - dir_of_gen_alias = set(dir(list[int])) + ga = list[int] + dir_of_gen_alias = set(dir(ga)) self.assertTrue(dir_of_gen_alias.issuperset(dir(list))) - for generic_alias_property in ("__origin__", "__args__", "__parameters__"): - self.assertIn(generic_alias_property, dir_of_gen_alias) + for generic_alias_property in ( + "__origin__", "__args__", "__parameters__", + "__unpacked__", + ): + with self.subTest(generic_alias_property=generic_alias_property): + self.assertIn(generic_alias_property, dir_of_gen_alias) + for blocked in ( + "__bases__", + "__copy__", + "__deepcopy__", + ): + with self.subTest(blocked=blocked): + self.assertNotIn(blocked, dir_of_gen_alias) + + for entry in dir_of_gen_alias: + with self.subTest(entry=entry): + getattr(ga, entry) # must not raise `AttributeError` def test_weakref(self): for t in self.generic_types: diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst new file mode 100644 index 00000000000000..968e92c94c1ffc --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst @@ -0,0 +1 @@ +Remove non-existent :meth:`~object.__copy__`, :meth:`~object.__deepcopy__`, and :attr:`~type.__bases__` from the :meth:`~object.__dir__` entries of :class:`types.GenericAlias`. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 2ef2ec1c54a234..8b526f43f1e053 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -648,7 +648,6 @@ ga_vectorcall(PyObject *self, PyObject *const *args, static const char* const attr_exceptions[] = { "__class__", - "__bases__", "__origin__", "__args__", "__unpacked__", @@ -657,6 +656,11 @@ static const char* const attr_exceptions[] = { "__mro_entries__", "__reduce_ex__", // needed so we don't look up object.__reduce_ex__ "__reduce__", + NULL, +}; + +static const char* const attr_blocked[] = { + "__bases__", "__copy__", "__deepcopy__", NULL, @@ -667,15 +671,29 @@ ga_getattro(PyObject *self, PyObject *name) { gaobject *alias = (gaobject *)self; if (PyUnicode_Check(name)) { + // When we check blocked attrs, we don't allow to proxy them to `__origin__`. + // Otherwise, we can break existing code. + for (const char * const *p = attr_blocked; ; p++) { + if (*p == NULL) { + break; + } + if (_PyUnicode_EqualToASCIIString(name, *p)) { + goto generic_getattr; + } + } + + // When we see own attrs, it has a priority over `__origin__`'s attr. for (const char * const *p = attr_exceptions; ; p++) { if (*p == NULL) { return PyObject_GetAttr(alias->origin, name); } if (_PyUnicode_EqualToASCIIString(name, *p)) { - break; + goto generic_getattr; } } } + +generic_getattr: return PyObject_GenericGetAttr(self, name); } From d11e69d6203080e3ec450446bfed0516727b85c3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:16:26 +0200 Subject: [PATCH 1082/1674] [3.14] gh-139700: Check consistency of the zip64 end of central directory record (GH-139702) (GH-139706) Support records with "zip64 extensible data" if there are no bytes prepended to the ZIP file. (cherry picked from commit 162997bb70e067668c039700141770687bc8f267) Co-authored-by: Serhiy Storchaka --- Lib/test/test_zipfile/test_core.py | 82 ++++++++++++++++++- Lib/zipfile/__init__.py | 51 +++++++----- ...-10-07-19-31-34.gh-issue-139700.vNHU1O.rst | 3 + 3 files changed, 113 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index c033059a515db6..6acfefc74d6665 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -898,6 +898,8 @@ def make_zip64_file( self, file_size_64_set=False, file_size_extra=False, compress_size_64_set=False, compress_size_extra=False, header_offset_64_set=False, header_offset_extra=False, + extensible_data=b'', + end_of_central_dir_size=None, offset_to_end_of_central_dir=None, ): """Generate bytes sequence for a zip with (incomplete) zip64 data. @@ -951,6 +953,12 @@ def make_zip64_file( central_dir_size = struct.pack(' 2: inferred = concat + offset_cd @@ -289,16 +286,15 @@ def _EndRecData64(fpin, offset, endrec): """ Read the ZIP64 end-of-archive records and use that to update endrec """ - try: - fpin.seek(offset - sizeEndCentDir64Locator, 2) - except OSError: - # If the seek fails, the file is not large enough to contain a ZIP64 + offset -= sizeEndCentDir64Locator + if offset < 0: + # The file is not large enough to contain a ZIP64 # end-of-archive record, so just return the end record we were given. return endrec - + fpin.seek(offset) data = fpin.read(sizeEndCentDir64Locator) if len(data) != sizeEndCentDir64Locator: - return endrec + raise OSError("Unknown I/O error") sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data) if sig != stringEndArchive64Locator: return endrec @@ -306,16 +302,33 @@ def _EndRecData64(fpin, offset, endrec): if diskno != 0 or disks > 1: raise BadZipFile("zipfiles that span multiple disks are not supported") - # Assume no 'zip64 extensible data' - fpin.seek(offset - sizeEndCentDir64Locator - sizeEndCentDir64, 2) + offset -= sizeEndCentDir64 + if reloff > offset: + raise BadZipFile("Corrupt zip64 end of central directory locator") + # First, check the assumption that there is no prepended data. + fpin.seek(reloff) + extrasz = offset - reloff data = fpin.read(sizeEndCentDir64) if len(data) != sizeEndCentDir64: - return endrec + raise OSError("Unknown I/O error") + if not data.startswith(stringEndArchive64) and reloff != offset: + # Since we already have seen the Zip64 EOCD Locator, it's + # possible we got here because there is prepended data. + # Assume no 'zip64 extensible data' + fpin.seek(offset) + extrasz = 0 + data = fpin.read(sizeEndCentDir64) + if len(data) != sizeEndCentDir64: + raise OSError("Unknown I/O error") + if not data.startswith(stringEndArchive64): + raise BadZipFile("Zip64 end of central directory record not found") + sig, sz, create_version, read_version, disk_num, disk_dir, \ dircount, dircount2, dirsize, diroffset = \ struct.unpack(structEndArchive64, data) - if sig != stringEndArchive64: - return endrec + if (diroffset + dirsize != reloff or + sz + 12 != sizeEndCentDir64 + extrasz): + raise BadZipFile("Corrupt zip64 end of central directory record") # Update the original endrec using data from the ZIP64 record endrec[_ECD_SIGNATURE] = sig @@ -325,6 +338,7 @@ def _EndRecData64(fpin, offset, endrec): endrec[_ECD_ENTRIES_TOTAL] = dircount2 endrec[_ECD_SIZE] = dirsize endrec[_ECD_OFFSET] = diroffset + endrec[_ECD_LOCATION] = offset - extrasz return endrec @@ -358,7 +372,7 @@ def _EndRecData(fpin): endrec.append(filesize - sizeEndCentDir) # Try to read the "Zip64 end of central directory" structure - return _EndRecData64(fpin, -sizeEndCentDir, endrec) + return _EndRecData64(fpin, filesize - sizeEndCentDir, endrec) # Either this is not a ZIP file, or it is a ZIP file with an archive # comment. Search the end of the file for the "end of central directory" @@ -382,8 +396,7 @@ def _EndRecData(fpin): endrec.append(maxCommentStart + start) # Try to read the "Zip64 end of central directory" structure - return _EndRecData64(fpin, maxCommentStart + start - filesize, - endrec) + return _EndRecData64(fpin, maxCommentStart + start, endrec) # Unable to find a valid end of central directory structure return None @@ -2142,7 +2155,7 @@ def _write_end_record(self): " would require ZIP64 extensions") zip64endrec = struct.pack( structEndArchive64, stringEndArchive64, - 44, 45, 45, 0, 0, centDirCount, centDirCount, + sizeEndCentDir64 - 12, 45, 45, 0, 0, centDirCount, centDirCount, centDirSize, centDirOffset) self.fp.write(zip64endrec) diff --git a/Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst b/Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst new file mode 100644 index 00000000000000..a8e7a1f1878c6b --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst @@ -0,0 +1,3 @@ +Check consistency of the zip64 end of central directory record. Support +records with "zip64 extensible data" if there are no bytes prepended to the +ZIP file. From 357618266b62c21e0e451b5dd09c2585ff7fa51b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:38:31 +0200 Subject: [PATCH 1083/1674] [3.14] Drop explicit tool installation in the dev container (GH-138211) (GH-138212) Drop explicit tool installation in the dev container (GH-138211) This is now handled upstream in the dev container image itself. (cherry picked from commit d910b93f786982a11d7d6b7562716c2f50513f00) Co-authored-by: Brett Cannon --- .devcontainer/devcontainer.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 2720ac30e1cc6a..fb11c82bb96d9c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,9 +5,6 @@ "dnf", "install", "-y", - "which", - "zsh", - "fish", // For umask fix below. "/usr/bin/setfacl" ], From 9f97fa30f8f8fd0d78dcba37289eb38678b0d713 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 01:13:35 +0200 Subject: [PATCH 1084/1674] [3.14] GH-137243: Have `Tools/wasm/wasi` detect WASI SDK installs in `/opt` when the release tarball is extracted (GH-137244) (GH-137250) GH-137243: Have `Tools/wasm/wasi` detect WASI SDK installs in `/opt` when the release tarball is extracted (GH-137244) (cherry picked from commit 2f1a9f2ed498b3cb2dd5f4616bf3a07fd1ad074c) Co-authored-by: Brett Cannon --- ...-07-30-10-28-35.gh-issue-137243.NkdUqH.rst | 2 ++ Tools/wasm/wasi/__main__.py | 36 +++++++++++++------ 2 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst b/Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst new file mode 100644 index 00000000000000..c9c6c2ca287efd --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst @@ -0,0 +1,2 @@ +Have Tools/wasm/wasi detect a WASI SDK install in /opt when it was directly +extracted from a release tarball. diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index f3c97ff3fd11a0..d2461c387fab54 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -26,6 +26,8 @@ LOCAL_SETUP_MARKER = ("# Generated by Tools/wasm/wasi .\n" "# Required to statically build extension modules.").encode("utf-8") +WASI_SDK_VERSION = 24 + WASMTIME_VAR_NAME = "WASMTIME" WASMTIME_HOST_RUNNER_VAR = f"{{{WASMTIME_VAR_NAME}}}" @@ -173,10 +175,22 @@ def make_build_python(context, working_dir): def find_wasi_sdk(): - """Find the path to wasi-sdk.""" + """Find the path to the WASI SDK.""" if wasi_sdk_path := os.environ.get("WASI_SDK_PATH"): return pathlib.Path(wasi_sdk_path) - elif (default_path := pathlib.Path("/opt/wasi-sdk")).exists(): + + opt_path = pathlib.Path("/opt") + # WASI SDK versions have a ``.0`` suffix, but it's a constant; the WASI SDK team + # has said they don't plan to ever do a point release and all of their Git tags + # lack the ``.0`` suffix. + # Starting with WASI SDK 23, the tarballs went from containing a directory named + # ``wasi-sdk-{WASI_SDK_VERSION}.0`` to e.g. + # ``wasi-sdk-{WASI_SDK_VERSION}.0-x86_64-linux``. + potential_sdks = [path for path in opt_path.glob(f"wasi-sdk-{WASI_SDK_VERSION}.0*") + if path.is_dir()] + if len(potential_sdks) == 1: + return potential_sdks[0] + elif (default_path := opt_path / "wasi-sdk").is_dir(): return default_path @@ -306,6 +320,8 @@ def clean_contents(context): def main(): + default_host_triple = "wasm32-wasip1" + default_wasi_sdk = find_wasi_sdk() default_host_runner = (f"{WASMTIME_HOST_RUNNER_VAR} run " # Make sure the stack size will work for a pydebug # build. @@ -349,17 +365,17 @@ def main(): for subcommand in build, configure_host: subcommand.add_argument("--wasi-sdk", type=pathlib.Path, dest="wasi_sdk_path", - default=find_wasi_sdk(), - help="Path to wasi-sdk; defaults to " - "$WASI_SDK_PATH or /opt/wasi-sdk") + default=default_wasi_sdk, + help=f"Path to the WASI SDK; defaults to {default_wasi_sdk}") subcommand.add_argument("--host-runner", action="store", default=default_host_runner, dest="host_runner", - help="Command template for running the WASI host " - "(default designed for wasmtime 14 or newer: " - f"`{default_host_runner}`)") + help="Command template for running the WASI host; defaults to " + f"`{default_host_runner}`") for subcommand in build, configure_host, make_host: - subcommand.add_argument("--host-triple", action="store", default="wasm32-wasip1", - help="The target triple for the WASI host build") + subcommand.add_argument("--host-triple", action="store", + default=default_host_triple, + help="The target triple for the WASI host build; " + f"defaults to {default_host_triple}") context = parser.parse_args() context.init_dir = pathlib.Path().absolute() From 6b090c92723083b365fac5f1836e4657705da9fe Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 01:51:19 +0200 Subject: [PATCH 1085/1674] [3.14] GH-137248: Add a `--logdir` option to `Tools/wasm/wasi` (GH-137249) (GH-137252) GH-137248: Add a `--logdir` option to `Tools/wasm/wasi` (GH-137249) (cherry picked from commit 94498a53f308a079be9860e0f0d470eeaeb082ff) Co-authored-by: Brett Cannon --- ...-07-30-11-15-47.gh-issue-137248.8IxwY3.rst | 2 ++ Tools/wasm/wasi/__main__.py | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst b/Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst new file mode 100644 index 00000000000000..311ade0c8f3040 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst @@ -0,0 +1,2 @@ +Add a ``--logdir`` option to ``Tools/wasm/wasi`` for specifying where to +write log files. diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index d2461c387fab54..fdd93d5c0aa4af 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -93,11 +93,17 @@ def wrapper(context): return decorator -def call(command, *, quiet, **kwargs): +def call(command, *, context=None, quiet=False, logdir=None, **kwargs): """Execute a command. If 'quiet' is true, then redirect stdout and stderr to a temporary file. """ + if context is not None: + quiet = context.quiet + logdir = context.logdir + elif quiet and logdir is None: + raise ValueError("When quiet is True, logdir must be specified") + print("❯", " ".join(map(str, command))) if not quiet: stdout = None @@ -105,6 +111,7 @@ def call(command, *, quiet, **kwargs): else: stdout = tempfile.NamedTemporaryFile("w", encoding="utf-8", delete=False, + dir=logdir, prefix="cpython-wasi-", suffix=".log") stderr = subprocess.STDOUT @@ -156,14 +163,14 @@ def configure_build_python(context, working_dir): if context.args: configure.extend(context.args) - call(configure, quiet=context.quiet) + call(configure, context=context) @subdir(BUILD_DIR) def make_build_python(context, working_dir): """Make/build the build Python.""" call(["make", "--jobs", str(cpu_count()), "all"], - quiet=context.quiet) + context=context) binary = build_python_path() cmd = [binary, "-c", @@ -275,7 +282,7 @@ def configure_wasi_python(context, working_dir): configure.extend(context.args) call(configure, env=updated_env(env_additions | wasi_sdk_env(context)), - quiet=context.quiet) + context=context) python_wasm = working_dir / "python.wasm" exec_script = working_dir / "python.sh" @@ -291,7 +298,7 @@ def make_wasi_python(context, working_dir): """Run `make` for the WASI/host build.""" call(["make", "--jobs", str(cpu_count()), "all"], env=updated_env(), - quiet=context.quiet) + context=context) exec_script = working_dir / "python.sh" call([exec_script, "--version"], quiet=False) @@ -333,6 +340,7 @@ def main(): "--dir {HOST_DIR}::{GUEST_DIR} " # Set PYTHONPATH to the sysconfig data. "--env {ENV_VAR_NAME}={ENV_VAR_VALUE}") + default_logdir = pathlib.Path(tempfile.gettempdir()) parser = argparse.ArgumentParser() subcommands = parser.add_subparsers(dest="subcommand") @@ -355,6 +363,9 @@ def main(): subcommand.add_argument("--quiet", action="store_true", default=False, dest="quiet", help="Redirect output from subprocesses to a log file") + subcommand.add_argument("--logdir", type=pathlib.Path, default=default_logdir, + help="Directory to store log files; " + f"defaults to {default_logdir}") for subcommand in configure_build, configure_host: subcommand.add_argument("--clean", action="store_true", default=False, dest="clean", From 64f0e2d6fac3729ea1bc7ea3a07934e8b486d608 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 02:37:04 +0200 Subject: [PATCH 1086/1674] [3.14] gh-126631: gh-137996: fix pre-loading of `__main__` (GH-135295) (#138607) gh-126631: gh-137996: fix pre-loading of `__main__` (GH-135295) gh-126631: gh-137996: fix pre-loading of `__main__` The `main_path` parameter was renamed `init_main_from_name`, update the forkserver code accordingly. This was leading to slower startup times when people were trying to preload the main module. --------- (cherry picked from commit 0912b3a6dbd226bea79eb8d70d5a06230804d4cb) Co-authored-by: Duane Griffin Co-authored-by: Gregory P. Smith Co-authored-by: Petr Viktorin Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/multiprocessing/forkserver.py | 9 +++++---- Lib/test/_test_multiprocessing.py | 12 ++++++++++++ Lib/test/mp_preload_main.py | 14 ++++++++++++++ .../2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst | 2 ++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 Lib/test/mp_preload_main.py create mode 100644 Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index c91891ff162c2d..cc8947c5e04fb1 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -145,12 +145,13 @@ def ensure_running(self): cmd = ('from multiprocessing.forkserver import main; ' + 'main(%d, %d, %r, **%r)') + main_kws = {} if self._preload_modules: - desired_keys = {'main_path', 'sys_path'} data = spawn.get_preparation_data('ignore') - main_kws = {x: y for x, y in data.items() if x in desired_keys} - else: - main_kws = {} + if 'sys_path' in data: + main_kws['sys_path'] = data['sys_path'] + if 'init_main_from_path' in data: + main_kws['main_path'] = data['init_main_from_path'] with socket.socket(socket.AF_UNIX) as listener: address = connection.arbitrary_address('AF_UNIX') diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 9a72362c022343..a7fa862d4cf100 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -6883,6 +6883,18 @@ def child(): self.assertEqual(q.get_nowait(), "done") close_queue(q) + def test_preload_main(self): + # gh-126631: Check that __main__ can be pre-loaded + if multiprocessing.get_start_method() != "forkserver": + self.skipTest("forkserver specific test") + + name = os.path.join(os.path.dirname(__file__), 'mp_preload_main.py') + _, out, err = test.support.script_helper.assert_python_ok(name) + self.assertEqual(err, b'') + + # The trailing empty string comes from split() on output ending with \n + out = out.decode().split("\n") + self.assertEqual(out, ['__main__', '__mp_main__', 'f', 'f', '']) # # Mixins diff --git a/Lib/test/mp_preload_main.py b/Lib/test/mp_preload_main.py new file mode 100644 index 00000000000000..acb342822ecc89 --- /dev/null +++ b/Lib/test/mp_preload_main.py @@ -0,0 +1,14 @@ +import multiprocessing + +print(f"{__name__}") + +def f(): + print("f") + +if __name__ == "__main__": + ctx = multiprocessing.get_context("forkserver") + ctx.set_forkserver_preload(['__main__']) + for _ in range(2): + p = ctx.Process(target=f) + p.start() + p.join() diff --git a/Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst b/Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst new file mode 100644 index 00000000000000..195253b1ec1e39 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst @@ -0,0 +1,2 @@ +Fix :mod:`multiprocessing` ``forkserver`` bug which prevented ``__main__`` +from being preloaded. From 6b26e62f376097a0e4db315b660cbdc40646efb0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 02:37:30 +0200 Subject: [PATCH 1087/1674] [3.14] gh-138813: Fix mutable default kwargs={} in multiprocessing BaseProcess and DummyProcess to use None (GH-138814) (#139084) gh-138813: Fix mutable default kwargs={} in multiprocessing BaseProcess and DummyProcess to use None (GH-138814) * gh-138813: Default `BaseProcess` `kwargs` to `None` (GH-138814) Set `BaseProcess.__init__(..., kwargs=None)` and initialize `kwargs` with `dict(kwargs) if kwargs else {}`. This avoids a shared mutable default and matches threading.Thread behavior. * DummyProcess kwargs=None (which threading.Thread accepts properly) (cherry picked from commit 5a15e7378996358848394930343e9633b6fec8a9) Co-authored-by: Denis Sergeev Co-authored-by: Gregory P. Smith Co-authored-by: Petr Viktorin Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/multiprocessing/dummy/__init__.py | 2 +- Lib/multiprocessing/process.py | 4 ++-- Lib/test/_test_multiprocessing.py | 17 +++++++++++++++++ ...25-09-17-08-32-43.gh-issue-138813.LHkHjX.rst | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py index 6a1468609e347b..7dc5d1c8dde848 100644 --- a/Lib/multiprocessing/dummy/__init__.py +++ b/Lib/multiprocessing/dummy/__init__.py @@ -33,7 +33,7 @@ class DummyProcess(threading.Thread): - def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): + def __init__(self, group=None, target=None, name=None, args=(), kwargs=None): threading.Thread.__init__(self, group, target, name, args, kwargs) self._pid = None self._children = weakref.WeakKeyDictionary() diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index 9db322be1aa6d6..262513f295fde5 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -77,7 +77,7 @@ class BaseProcess(object): def _Popen(self): raise NotImplementedError - def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, + def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): assert group is None, 'group argument must be None for now' count = next(_process_counter) @@ -89,7 +89,7 @@ def __init__(self, group=None, target=None, name=None, args=(), kwargs={}, self._closed = False self._target = target self._args = tuple(args) - self._kwargs = dict(kwargs) + self._kwargs = dict(kwargs) if kwargs else {} self._name = name or type(self).__name__ + '-' + \ ':'.join(str(i) for i in self._identity) if daemon is not None: diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index a7fa862d4cf100..047d17aed41d50 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -5173,6 +5173,23 @@ def test_invalid_handles(self): multiprocessing.connection.Connection, -1) +# +# Regression tests for BaseProcess kwargs handling +# + +class TestBaseProcessKwargs(unittest.TestCase): + def test_default_kwargs_not_shared_between_instances(self): + # Creating multiple Process instances without passing kwargs + # must create independent empty dicts (no shared state). + p1 = multiprocessing.Process(target=lambda: None) + p2 = multiprocessing.Process(target=lambda: None) + self.assertIsInstance(p1._kwargs, dict) + self.assertIsInstance(p2._kwargs, dict) + self.assertIsNot(p1._kwargs, p2._kwargs) + # Mutating one should not affect the other + p1._kwargs['x'] = 1 + self.assertNotIn('x', p2._kwargs) + @hashlib_helper.requires_hashdigest('sha256') class OtherTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst b/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst new file mode 100644 index 00000000000000..97f4d76bb2f454 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst @@ -0,0 +1 @@ +:class:`!multiprocessing.BaseProcess` defaults ``kwargs`` to ``None`` instead of a shared dictionary. From 9e0b7d086665c73b35d8919557dbc41ef7cd3872 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 04:11:31 +0200 Subject: [PATCH 1088/1674] [3.14] GH-137484: Have `Tools/wasm/wasi` use the build triple instead of "build" (GH-137485) (#137487) GH-137484: Have `Tools/wasm/wasi` use the build triple instead of "build" (GH-37485) This should help prevent issuse where something like a container is used to do one build and then someone tries to build again locally. (cherry picked from commit 0953200b136bcb3293cc1bd57a062796ffcd529d) Co-authored-by: Brett Cannon Co-authored-by: Petr Viktorin --- ...25-08-06-11-54-55.gh-issue-137484.8iFAQs.rst | 2 ++ Tools/wasm/wasi/__main__.py | 17 ++++++----------- 2 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst b/Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst new file mode 100644 index 00000000000000..bd7bc0984ecfcc --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst @@ -0,0 +1,2 @@ +Have ``Tools/wasm/wasi`` put the build Python into a directory named after +the build triple instead of "build". diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index fdd93d5c0aa4af..973d78caa0849e 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -20,7 +20,8 @@ assert (CHECKOUT / "configure").is_file(), "Please update the location of the file" CROSS_BUILD_DIR = CHECKOUT / "cross-build" -BUILD_DIR = CROSS_BUILD_DIR / "build" +# Build platform can also be found via `config.guess`. +BUILD_DIR = CROSS_BUILD_DIR / sysconfig.get_config_var("BUILD_GNU_TYPE") LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local" LOCAL_SETUP_MARKER = ("# Generated by Tools/wasm/wasi .\n" @@ -80,7 +81,7 @@ def wrapper(context): print("📁", working_dir) if (clean_ok and getattr(context, "clean", False) and working_dir.exists()): - print(f"🚮 Deleting directory (--clean)...") + print("🚮 Deleting directory (--clean)...") shutil.rmtree(working_dir) working_dir.mkdir(parents=True, exist_ok=True) @@ -120,12 +121,6 @@ def call(command, *, context=None, quiet=False, logdir=None, **kwargs): subprocess.check_call(command, **kwargs, stdout=stdout, stderr=stderr) -def build_platform(): - """The name of the build/host platform.""" - # Can also be found via `config.guess`. - return sysconfig.get_config_var("BUILD_GNU_TYPE") - - def build_python_path(): """The path to the build Python binary.""" binary = BUILD_DIR / "python" @@ -274,7 +269,7 @@ def configure_wasi_python(context, working_dir): # executed from within a checkout. configure = [os.path.relpath(CHECKOUT / 'configure', working_dir), f"--host={context.host_triple}", - f"--build={build_platform()}", + f"--build={BUILD_DIR.name}", f"--with-build-python={build_python}"] if build_python_is_pydebug(): configure.append("--with-pydebug") @@ -357,8 +352,8 @@ def main(): "Python)") make_host = subcommands.add_parser("make-host", help="Run `make` for the host/WASI") - clean = subcommands.add_parser("clean", help="Delete files and directories " - "created by this script") + subcommands.add_parser("clean", help="Delete files and directories " + "created by this script") for subcommand in build, configure_build, make_build, configure_host, make_host: subcommand.add_argument("--quiet", action="store_true", default=False, dest="quiet", From ed0e63fd0abcbb68a384f8b5baccf616a5534570 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 06:23:22 +0200 Subject: [PATCH 1089/1674] [3.14] gh-138558: Improve handling of Template annotations in annotationlib (GH-139072) (#139272) gh-138558: Improve handling of Template annotations in annotationlib (GH-139072) (cherry picked from commit 6ec058a1f7fcc016fa3b7432bcd0aa6e7d2b21ce) Co-authored-by: Dave Peck --- Lib/annotationlib.py | 64 +++++++++++++++---- Lib/test/test_annotationlib.py | 22 ++++++- ...-09-17-17-17-21.gh-issue-138558.0VbzCH.rst | 1 + 3 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index bee019cd51591e..43e1d51bc4b807 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -560,32 +560,70 @@ def unary_op(self): del _make_unary_op -def _template_to_ast(template): +def _template_to_ast_constructor(template): + """Convert a `template` instance to a non-literal AST.""" + args = [] + for part in template: + match part: + case str(): + args.append(ast.Constant(value=part)) + case _: + interp = ast.Call( + func=ast.Name(id="Interpolation"), + args=[ + ast.Constant(value=part.value), + ast.Constant(value=part.expression), + ast.Constant(value=part.conversion), + ast.Constant(value=part.format_spec), + ] + ) + args.append(interp) + return ast.Call(func=ast.Name(id="Template"), args=args, keywords=[]) + + +def _template_to_ast_literal(template, parsed): + """Convert a `template` instance to a t-string literal AST.""" values = [] + interp_count = 0 for part in template: match part: case str(): values.append(ast.Constant(value=part)) - # Interpolation, but we don't want to import the string module case _: interp = ast.Interpolation( str=part.expression, - value=ast.parse(part.expression), - conversion=( - ord(part.conversion) - if part.conversion is not None - else -1 - ), - format_spec=( - ast.Constant(value=part.format_spec) - if part.format_spec != "" - else None - ), + value=parsed[interp_count], + conversion=ord(part.conversion) if part.conversion else -1, + format_spec=ast.Constant(value=part.format_spec) + if part.format_spec + else None, ) values.append(interp) + interp_count += 1 return ast.TemplateStr(values=values) +def _template_to_ast(template): + """Make a best-effort conversion of a `template` instance to an AST.""" + # gh-138558: Not all Template instances can be represented as t-string + # literals. Return the most accurate AST we can. See issue for details. + + # If any expr is empty or whitespace only, we cannot convert to a literal. + if any(part.expression.strip() == "" for part in template.interpolations): + return _template_to_ast_constructor(template) + + try: + # Wrap in parens to allow whitespace inside interpolation curly braces + parsed = tuple( + ast.parse(f"({part.expression})", mode="eval").body + for part in template.interpolations + ) + except SyntaxError: + return _template_to_ast_constructor(template) + + return _template_to_ast_literal(template, parsed) + + class _StringifierDict(dict): def __init__(self, namespace, *, globals=None, owner=None, is_class=False, format): super().__init__(namespace) diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 88e0d611647f28..a8a8bcec76a429 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -7,7 +7,7 @@ import functools import itertools import pickle -from string.templatelib import Template +from string.templatelib import Template, Interpolation import typing import unittest from annotationlib import ( @@ -282,6 +282,7 @@ def f( a: t"a{b}c{d}e{f}g", b: t"{a:{1}}", c: t"{a | b * c}", + gh138558: t"{ 0}", ): pass annos = get_annotations(f, format=Format.STRING) @@ -293,6 +294,7 @@ def f( # interpolations in the format spec are eagerly evaluated so we can't recover the source "b": "t'{a:1}'", "c": "t'{a | b * c}'", + "gh138558": "t'{ 0}'", }) def g( @@ -1350,6 +1352,24 @@ def nested(): self.assertEqual(type_repr("1"), "'1'") self.assertEqual(type_repr(Format.VALUE), repr(Format.VALUE)) self.assertEqual(type_repr(MyClass()), "my repr") + # gh138558 tests + self.assertEqual(type_repr(t'''{ 0 + & 1 + | 2 + }'''), 't"""{ 0\n & 1\n | 2}"""') + self.assertEqual( + type_repr(Template("hi", Interpolation(42, "42"))), "t'hi{42}'" + ) + self.assertEqual( + type_repr(Template("hi", Interpolation(42))), + "Template('hi', Interpolation(42, '', None, ''))", + ) + self.assertEqual( + type_repr(Template("hi", Interpolation(42, " "))), + "Template('hi', Interpolation(42, ' ', None, ''))", + ) + # gh138558: perhaps in the future, we can improve this behavior: + self.assertEqual(type_repr(Template(Interpolation(42, "99"))), "t'{99}'") class TestAnnotationsToString(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst new file mode 100644 index 00000000000000..23c995d2452f7b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst @@ -0,0 +1 @@ +Fix handling of unusual t-string annotations in annotationlib. Patch by Dave Peck. From dd5d86c7d584eda78791c802a60a82fb27271d16 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 06:23:47 +0200 Subject: [PATCH 1090/1674] [3.14] gh-137706: make typing._is_unpacked_typevartuple check for `True` instead of truthy (GH-137712) (#138574) gh-137706: make typing._is_unpacked_typevartuple check for `True` instead of truthy (GH-137712) (cherry picked from commit 7e652f402f84b412ec46cec42cb103f489a0087e) Co-authored-by: David Ellis --- Lib/test/test_typing.py | 13 +++++++++++++ Lib/typing.py | 4 +++- .../2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f19044bbcdeeae..b799be5ba7d8fd 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -9851,6 +9851,19 @@ class B(str): ... self.assertIs(type(field_c2.__metadata__[0]), float) self.assertIs(type(field_c3.__metadata__[0]), bool) + def test_forwardref_partial_evaluation(self): + # Test that Annotated partially evaluates if it contains a ForwardRef + # See: https://github.com/python/cpython/issues/137706 + def f(x: Annotated[undefined, '']): pass + + ann = annotationlib.get_annotations(f, format=annotationlib.Format.FORWARDREF) + + # Test that the attributes are retrievable from the partially evaluated annotation + x_ann = ann['x'] + self.assertIs(get_origin(x_ann), Annotated) + self.assertEqual(x_ann.__origin__, EqualToForwardRef('undefined', owner=f)) + self.assertEqual(x_ann.__metadata__, ('',)) + class TypeAliasTests(BaseTestCase): def test_canonical_usage_with_variable_annotation(self): diff --git a/Lib/typing.py b/Lib/typing.py index dbc8734418d9a9..434cd0370e099a 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1024,8 +1024,10 @@ def evaluate_forward_ref( def _is_unpacked_typevartuple(x: Any) -> bool: + # Need to check 'is True' here + # See: https://github.com/python/cpython/issues/137706 return ((not isinstance(x, type)) and - getattr(x, '__typing_is_unpacked_typevartuple__', False)) + getattr(x, '__typing_is_unpacked_typevartuple__', False) is True) def _is_typevar_like(x: Any) -> bool: diff --git a/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst b/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst new file mode 100644 index 00000000000000..9eed50ec20a8f6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst @@ -0,0 +1 @@ +Fix the partial evaluation of annotations that use ``typing.Annotated[T, x]`` where ``T`` is a forward reference. From e104aadcafeaa7a47742a0587bf262e36b754da6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 06:29:02 +0200 Subject: [PATCH 1091/1674] [3.14] gh-127647: Fix and enable I/O protocol tests (GH-138369) (#138376) gh-127647: Fix and enable I/O protocol tests (GH-138369) (cherry picked from commit 3f23888fd773dd1ead2adcdd0d586eb6e831d154) Co-authored-by: Sebastian Rittau --- Lib/test/test_io.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 0c921ffbc2576a..925fe7771611b5 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -5014,12 +5014,12 @@ def write(self, b: bytes): pass def test_reader_subclass(self): - self.assertIsSubclass(MyReader, io.Reader[bytes]) - self.assertNotIsSubclass(str, io.Reader[bytes]) + self.assertIsSubclass(self.MyReader, io.Reader) + self.assertNotIsSubclass(str, io.Reader) def test_writer_subclass(self): - self.assertIsSubclass(MyWriter, io.Writer[bytes]) - self.assertNotIsSubclass(str, io.Writer[bytes]) + self.assertIsSubclass(self.MyWriter, io.Writer) + self.assertNotIsSubclass(str, io.Writer) def load_tests(loader, tests, pattern): @@ -5033,6 +5033,7 @@ def load_tests(loader, tests, pattern): CTextIOWrapperTest, PyTextIOWrapperTest, CMiscIOTest, PyMiscIOTest, CSignalsTest, PySignalsTest, TestIOCTypes, + ProtocolsTest, ) # Put the namespaces of the IO module we are testing and some useful mock From 51dfc67092475e6772485aac8394c342771f96af Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 06:29:28 +0200 Subject: [PATCH 1092/1674] [3.14] gh-138010: Fix `__init_subclass__` forwarding by `warnings.deprecated` (GH-138210) (#138561) gh-138010: Fix `__init_subclass__` forwarding by `warnings.deprecated` (GH-138210) (cherry picked from commit e2c038f5be2df39a7b06364dec0836a25c423b67) Co-authored-by: Brian Schubert `-decorated base class may not invoke the correct +:meth:`~object.__init_subclass__` method in cases involving multiple +inheritance. Patch by Brian Schubert. From 8ab7081015e6b7233762fea23452d50569fc20b5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 10:41:09 +0200 Subject: [PATCH 1093/1674] [3.14] gh-135386: Fix "unable to open database file" errors on readonly DB (GH-135566) (GH-138056) Add immutable=1 flag for read-only SQLite access to avoid WAL/SHM errors on readonly DB. (cherry picked from commit c0ae92b7c07d8146bbcc6ed5197f97a7a16efded) Co-authored-by: General_K1ng Co-authored-by: Serhiy Storchaka Co-authored-by: Petr Viktorin --- Lib/dbm/sqlite3.py | 14 +++-- Lib/test/test_dbm_sqlite3.py | 51 +++++++++++++++++++ ...-06-16-15-00-13.gh-issue-135386.lNrxLc.rst | 2 + 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst diff --git a/Lib/dbm/sqlite3.py b/Lib/dbm/sqlite3.py index 7e0ae2a29e3a64..d0eed54e0f84c1 100644 --- a/Lib/dbm/sqlite3.py +++ b/Lib/dbm/sqlite3.py @@ -59,18 +59,22 @@ def __init__(self, path, /, *, flag, mode): # We use the URI format when opening the database. uri = _normalize_uri(path) uri = f"{uri}?mode={flag}" + if flag == "ro": + # Add immutable=1 to allow read-only SQLite access even if wal/shm missing + uri += "&immutable=1" 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 != "ro": + # 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) + if flag == "rwc": + self._execute(BUILD_TABLE) def _execute(self, *args, **kwargs): if not self._cx: diff --git a/Lib/test/test_dbm_sqlite3.py b/Lib/test/test_dbm_sqlite3.py index 9216da8a63f957..f367a98865d4aa 100644 --- a/Lib/test/test_dbm_sqlite3.py +++ b/Lib/test/test_dbm_sqlite3.py @@ -1,3 +1,5 @@ +import os +import stat import sys import unittest from contextlib import closing @@ -14,6 +16,11 @@ from dbm.sqlite3 import _normalize_uri +root_in_posix = False +if hasattr(os, 'geteuid'): + root_in_posix = (os.geteuid() == 0) + + class _SQLiteDbmTests(unittest.TestCase): def setUp(self): @@ -90,6 +97,50 @@ def test_readonly_iter(self): self.assertEqual([k for k in self.db], [b"key1", b"key2"]) +@unittest.skipIf(root_in_posix, "test is meanless with root privilege") +class ReadOnlyFilesystem(unittest.TestCase): + + def setUp(self): + self.test_dir = os_helper.TESTFN + self.addCleanup(os_helper.rmtree, self.test_dir) + os.mkdir(self.test_dir) + self.db_path = os.path.join(self.test_dir, "test.db") + + db = dbm_sqlite3.open(self.db_path, "c") + db[b"key"] = b"value" + db.close() + + def test_readonly_file_read(self): + os.chmod(self.db_path, stat.S_IREAD) + with dbm_sqlite3.open(self.db_path, "r") as db: + self.assertEqual(db[b"key"], b"value") + + def test_readonly_file_write(self): + os.chmod(self.db_path, stat.S_IREAD) + with dbm_sqlite3.open(self.db_path, "w") as db: + with self.assertRaises(dbm_sqlite3.error): + db[b"newkey"] = b"newvalue" + + def test_readonly_dir_read(self): + os.chmod(self.test_dir, stat.S_IREAD | stat.S_IEXEC) + with dbm_sqlite3.open(self.db_path, "r") as db: + self.assertEqual(db[b"key"], b"value") + + def test_readonly_dir_write(self): + os.chmod(self.test_dir, stat.S_IREAD | stat.S_IEXEC) + with dbm_sqlite3.open(self.db_path, "w") as db: + try: + db[b"newkey"] = b"newvalue" + modified = True # on Windows and macOS + except dbm_sqlite3.error: + modified = False + with dbm_sqlite3.open(self.db_path, "r") as db: + if modified: + self.assertEqual(db[b"newkey"], b"newvalue") + else: + self.assertNotIn(b"newkey", db) + + class ReadWrite(_SQLiteDbmTests): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst b/Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst new file mode 100644 index 00000000000000..dbf1f4525092c6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst @@ -0,0 +1,2 @@ +Fix opening a :mod:`dbm.sqlite3` database for reading from read-only file +or directory. From c625839237b85b16f6e6d00d0af5e50849003706 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 10:42:42 +0200 Subject: [PATCH 1094/1674] [3.14] gh-91214: Skip tests failing on Solaris (GH-31978) (GH-138450) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 34ed03875a786879fe292fe472142ae0f3da0e80) Co-authored-by: Jakub Kulík --- Lib/test/test_re.py | 4 ++++ Lib/test/test_socket.py | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index e9128ac1d9762d..f6e797b3785dbe 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2178,6 +2178,8 @@ def test_bug_20998(self): self.assertEqual(re.fullmatch('[a-c]+', 'ABC', re.I).span(), (0, 3)) @unittest.skipIf(linked_to_musl(), "musl libc issue, bpo-46390") + @unittest.skipIf(sys.platform.startswith("sunos"), + "test doesn't work on Solaris, gh-91214") def test_locale_caching(self): # Issue #22410 oldlocale = locale.setlocale(locale.LC_CTYPE) @@ -2215,6 +2217,8 @@ def check_en_US_utf8(self): self.assertIsNone(re.match(b'(?Li)\xe5', b'\xc5')) @unittest.skipIf(linked_to_musl(), "musl libc issue, bpo-46390") + @unittest.skipIf(sys.platform.startswith("sunos"), + "test doesn't work on Solaris, gh-91214") def test_locale_compiled(self): oldlocale = locale.setlocale(locale.LC_CTYPE) self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index cd07e94b3b160d..cfb9619341b324 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -52,6 +52,7 @@ VSOCKPORT = 1234 AIX = platform.system() == "AIX" +SOLARIS = sys.platform.startswith("sunos") WSL = "microsoft-standard-WSL" in platform.release() try: @@ -3888,6 +3889,10 @@ def testCMSG_SPACE(self): # Test CMSG_SPACE() with various valid and invalid values, # checking the assumptions used by sendmsg(). toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1 + if SOLARIS and platform.processor() == "sparc": + # On Solaris SPARC, number of bytes returned by socket.CMSG_SPACE + # increases at different lengths; see gh-91214. + toobig -= 3 values = list(range(257)) + list(range(toobig - 257, toobig)) last = socket.CMSG_SPACE(0) @@ -4034,6 +4039,7 @@ def _testFDPassCMSG_LEN(self): self.createAndSendFDs(1) @unittest.skipIf(is_apple, "skipping, see issue #12958") + @unittest.skipIf(SOLARIS, "skipping, see gh-91214") @unittest.skipIf(AIX, "skipping, see issue #22397") @requireAttrs(socket, "CMSG_SPACE") def testFDPassSeparate(self): @@ -4045,6 +4051,7 @@ def testFDPassSeparate(self): @testFDPassSeparate.client_skip @unittest.skipIf(is_apple, "skipping, see issue #12958") + @unittest.skipIf(SOLARIS, "skipping, see gh-91214") @unittest.skipIf(AIX, "skipping, see issue #22397") def _testFDPassSeparate(self): fd0, fd1 = self.newFDs(2) @@ -4058,6 +4065,7 @@ def _testFDPassSeparate(self): len(MSG)) @unittest.skipIf(is_apple, "skipping, see issue #12958") + @unittest.skipIf(SOLARIS, "skipping, see gh-91214") @unittest.skipIf(AIX, "skipping, see issue #22397") @requireAttrs(socket, "CMSG_SPACE") def testFDPassSeparateMinSpace(self): @@ -4072,6 +4080,7 @@ def testFDPassSeparateMinSpace(self): @testFDPassSeparateMinSpace.client_skip @unittest.skipIf(is_apple, "skipping, see issue #12958") + @unittest.skipIf(SOLARIS, "skipping, see gh-91214") @unittest.skipIf(AIX, "skipping, see issue #22397") def _testFDPassSeparateMinSpace(self): fd0, fd1 = self.newFDs(2) From 8ad6eda4830f480380f84c2847acd7f550b2d1c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:09:45 +0200 Subject: [PATCH 1095/1674] [3.14] gh-136912: fix handling of `OverflowError` in `hmac.digest` (GH-136917) (#137116) The OpenSSL and HACL* implementations of HMAC single-shot digest computation reject keys whose length exceeds `INT_MAX` and `UINT32_MAX` respectively. The OpenSSL implementation also rejects messages whose length exceed `INT_MAX`. Using such keys in `hmac.digest` previously raised an `OverflowError` which was propagated to the caller. This commit mitigates this case by making `hmac.digest` fall back to HMAC's pure Python implementation which accepts arbitrary large keys or messages. This change only affects the top-level entrypoint `hmac.digest`, leaving `_hashopenssl.hmac_digest` and `_hmac.compute_digest` untouched. (cherry picked from commit d658b9053beaacaae80e318f59a5ddd672aa757a) --- Lib/hmac.py | 12 ++++ Lib/test/test_hmac.py | 65 ++++++++++++++++--- ...-07-21-11-56-47.gh-issue-136912.zWosAL.rst | 3 + 3 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst diff --git a/Lib/hmac.py b/Lib/hmac.py index 3683a4aa653a0a..16022c9ceb5439 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -229,6 +229,14 @@ def digest(key, msg, digest): if _hashopenssl and isinstance(digest, (str, _functype)): try: return _hashopenssl.hmac_digest(key, msg, digest) + except OverflowError: + # OpenSSL's HMAC limits the size of the key to INT_MAX. + # Instead of falling back to HACL* implementation which + # may still not be supported due to a too large key, we + # directly switch to the pure Python fallback instead + # even if we could have used streaming HMAC for small keys + # but large messages. + return _compute_digest_fallback(key, msg, digest) except _hashopenssl.UnsupportedDigestmodError: pass @@ -236,6 +244,10 @@ def digest(key, msg, digest): try: return _hmac.compute_digest(key, msg, digest) except (OverflowError, _hmac.UnknownHashError): + # HACL* HMAC limits the size of the key to UINT32_MAX + # so we fallback to the pure Python implementation even + # if streaming HMAC may have been used for small keys + # and large messages. pass return _compute_digest_fallback(key, msg, digest) diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index e898644dd8a552..344c6ddf28afcf 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -21,21 +21,21 @@ import hmac import hashlib import random -import test.support -import test.support.hashlib_helper as hashlib_helper import types import unittest -import unittest.mock as mock import warnings from _operator import _compare_digest as operator_compare_digest +from test.support import _4G, bigmemtest from test.support import check_disallow_instantiation +from test.support import hashlib_helper, import_helper from test.support.hashlib_helper import ( BuiltinHashFunctionsTrait, HashFunctionsTrait, NamedHashFunctionsTrait, OpenSSLHashFunctionsTrait, ) -from test.support.import_helper import import_fresh_module, import_module +from test.support.import_helper import import_fresh_module +from unittest.mock import patch try: import _hashlib @@ -728,7 +728,7 @@ def setUpClass(cls): super().setUpClass() for meth in ['_init_openssl_hmac', '_init_builtin_hmac']: fn = getattr(cls.hmac.HMAC, meth) - cm = mock.patch.object(cls.hmac.HMAC, meth, autospec=True, wraps=fn) + cm = patch.object(cls.hmac.HMAC, meth, autospec=True, wraps=fn) cls.enterClassContext(cm) @classmethod @@ -950,7 +950,11 @@ class PyConstructorTestCase(ThroughObjectMixin, PyConstructorBaseMixin, class PyModuleConstructorTestCase(ThroughModuleAPIMixin, PyConstructorBaseMixin, unittest.TestCase): - """Test the hmac.new() and hmac.digest() functions.""" + """Test the hmac.new() and hmac.digest() functions. + + Note that "self.hmac" is imported by blocking "_hashlib" and "_hmac". + For testing functions in "hmac", extend PyMiscellaneousTests instead. + """ def test_hmac_digest_digestmod_parameter(self): func = self.hmac_digest @@ -1446,9 +1450,8 @@ def test_hmac_constructor_uses_builtin(self): hmac = import_fresh_module("hmac", blocked=["_hashlib"]) def watch_method(cls, name): - return mock.patch.object( - cls, name, autospec=True, wraps=getattr(cls, name) - ) + wraps = getattr(cls, name) + return patch.object(cls, name, autospec=True, wraps=wraps) with ( watch_method(hmac.HMAC, '_init_openssl_hmac') as f, @@ -1500,6 +1503,48 @@ def test_with_fallback(self): finally: cache.pop('foo') + @hashlib_helper.requires_openssl_hashdigest("md5") + @bigmemtest(size=_4G + 5, memuse=2, dry_run=False) + def test_hmac_digest_overflow_error_openssl_only(self, size): + hmac = import_fresh_module("hmac", blocked=["_hmac"]) + self.do_test_hmac_digest_overflow_error_switch_to_slow(hmac, size) + + @hashlib_helper.requires_builtin_hashdigest("_md5", "md5") + @bigmemtest(size=_4G + 5, memuse=2, dry_run=False) + def test_hmac_digest_overflow_error_builtin_only(self, size): + hmac = import_fresh_module("hmac", blocked=["_hashlib"]) + self.do_test_hmac_digest_overflow_error_switch_to_slow(hmac, size) + + def do_test_hmac_digest_overflow_error_switch_to_slow(self, hmac, size): + """Check that hmac.digest() falls back to pure Python. + + The *hmac* argument implements the HMAC module interface. + The *size* argument is a large key size or message size that would + trigger an OverflowError in the C implementation(s) of hmac.digest(). + """ + + bigkey = b'K' * size + bigmsg = b'M' * size + + with patch.object(hmac, "_compute_digest_fallback") as slow: + hmac.digest(bigkey, b'm', "md5") + slow.assert_called_once() + + with patch.object(hmac, "_compute_digest_fallback") as slow: + hmac.digest(b'k', bigmsg, "md5") + slow.assert_called_once() + + @hashlib_helper.requires_hashdigest("md5", openssl=True) + @bigmemtest(size=_4G + 5, memuse=2, dry_run=False) + def test_hmac_digest_no_overflow_error_in_fallback(self, size): + hmac = import_fresh_module("hmac", blocked=["_hashlib", "_hmac"]) + + for key, msg in [(b'K' * size, b'm'), (b'k', b'M' * size)]: + with self.subTest(keysize=len(key), msgsize=len(msg)): + with patch.object(hmac, "_compute_digest_fallback") as slow: + hmac.digest(key, msg, "md5") + slow.assert_called_once() + class BuiltinMiscellaneousTests(BuiltinModuleMixin, unittest.TestCase): """HMAC-BLAKE2 is not standardized as BLAKE2 is a keyed hash function. @@ -1512,7 +1557,7 @@ class BuiltinMiscellaneousTests(BuiltinModuleMixin, unittest.TestCase): @classmethod def setUpClass(cls): super().setUpClass() - cls.blake2 = import_module("_blake2") + cls.blake2 = import_helper.import_module("_blake2") cls.blake2b = cls.blake2.blake2b cls.blake2s = cls.blake2.blake2s diff --git a/Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst b/Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst new file mode 100644 index 00000000000000..6c5f31145f76d1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst @@ -0,0 +1,3 @@ +:func:`hmac.digest` now properly handles large keys and messages +by falling back to the pure Python implementation when necessary. +Patch by Bénédikt Tran. From 297157d96855d1592ceca63ac3db8da7809827bb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:25:17 +0200 Subject: [PATCH 1096/1674] [3.14] gh-92266: Update pre-commit (GH-139411) (#139466) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .pre-commit-config.yaml | 21 ++++++++++----------- Tools/build/.ruff.toml | 1 - Tools/clinic/.ruff.toml | 3 --- Tools/peg_generator/.ruff.toml | 5 ----- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2e0e67e728490a..014dab1d2b58be 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,28 +1,28 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.8 + rev: v0.13.2 hooks: - - id: ruff + - id: ruff-check name: Run Ruff (lint) on Doc/ args: [--exit-non-zero-on-fix] files: ^Doc/ - - id: ruff + - id: ruff-check name: Run Ruff (lint) on Lib/test/ args: [--exit-non-zero-on-fix] files: ^Lib/test/ - - id: ruff + - id: ruff-check name: Run Ruff (lint) on Tools/build/ args: [--exit-non-zero-on-fix, --config=Tools/build/.ruff.toml] files: ^Tools/build/ - - id: ruff + - id: ruff-check name: Run Ruff (lint) on Tools/i18n/ args: [--exit-non-zero-on-fix, --config=Tools/i18n/.ruff.toml] files: ^Tools/i18n/ - - id: ruff + - id: ruff-check 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 + - id: ruff-check name: Run Ruff (lint) on Tools/peg_generator/ args: [--exit-non-zero-on-fix, --config=Tools/peg_generator/.ruff.toml] files: ^Tools/peg_generator/ @@ -36,7 +36,7 @@ repos: files: ^Tools/build/check_warnings.py - repo: https://github.com/psf/black-pre-commit-mirror - rev: 25.1.0 + rev: 25.9.0 hooks: - id: black name: Run Black on Tools/jit/ @@ -47,7 +47,6 @@ repos: hooks: - id: remove-tabs types: [python] - exclude: ^Tools/c-analyzer/cpython/_parser.py - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 @@ -68,7 +67,7 @@ repos: files: '^\.github/CODEOWNERS|\.(gram)$' - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.33.2 + rev: 0.34.0 hooks: - id: check-dependabot - id: check-github-workflows @@ -80,7 +79,7 @@ repos: - id: actionlint - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.11.0 + rev: v1.14.1 hooks: - id: zizmor diff --git a/Tools/build/.ruff.toml b/Tools/build/.ruff.toml index dcbf2936290f12..996f725fdcb9b5 100644 --- a/Tools/build/.ruff.toml +++ b/Tools/build/.ruff.toml @@ -29,7 +29,6 @@ ignore = [ "F541", # f-string without any placeholders "PYI024", # Use `typing.NamedTuple` instead of `collections.namedtuple` "PYI025", # Use `from collections.abc import Set as AbstractSet` - "UP038", # Use `X | Y` in `isinstance` call instead of `(X, Y)` ] [lint.per-file-ignores] diff --git a/Tools/clinic/.ruff.toml b/Tools/clinic/.ruff.toml index 5033887df0c1cd..944d17ee3e9855 100644 --- a/Tools/clinic/.ruff.toml +++ b/Tools/clinic/.ruff.toml @@ -17,9 +17,6 @@ ignore = [ # Use f-strings instead of format specifiers. # Doesn't always make code more readable. "UP032", - # Use PEP-604 unions rather than tuples for isinstance() checks. - # Makes code slower and more verbose. https://github.com/astral-sh/ruff/issues/7871. - "UP038", ] unfixable = [ # The autofixes sometimes do the wrong things for these; diff --git a/Tools/peg_generator/.ruff.toml b/Tools/peg_generator/.ruff.toml index d778cf0df9b49f..bcf57248713df4 100644 --- a/Tools/peg_generator/.ruff.toml +++ b/Tools/peg_generator/.ruff.toml @@ -13,11 +13,6 @@ select = [ "RUF100", # Ban unused `# noqa` comments "PGH004", # Ban blanket `# noqa` comments (only ignore specific error codes) ] -ignore = [ - # Use PEP-604 unions rather than tuples for isinstance() checks. - # Makes code slower and more verbose. https://github.com/astral-sh/ruff/issues/7871. - "UP038", -] unfixable = [ # The autofixes sometimes do the wrong things for these; # it's better to have to manually look at the code and see how it needs fixing From 32233d68d842e96130656fb30caabe53669b98e7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:39:59 +0200 Subject: [PATCH 1097/1674] [3.14] gh-70765: avoid waiting for HTTP headers when parsing HTTP/0.9 requests (GH-139514) (#139600) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 13dc2fde8cec1e8aad04c7635b3da4ff3e3dcb00) (cherry picked from commit 1fe89d324e6b96dc44a7bd593c428a90d1f39d55) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/http/server.py | 7 ++++ Lib/test/test_httpservers.py | 39 +++++++++++++++++++ ...5-10-02-17-40-10.gh-issue-70765.zVlLZn.rst | 5 +++ 3 files changed, 51 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 10d18a9a753929..8bb49275e78cbd 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -324,6 +324,7 @@ def parse_request(self): error response has already been sent back. """ + is_http_0_9 = False self.command = None # set in case of error on the first line self.request_version = version = self.default_request_version self.close_connection = True @@ -381,6 +382,7 @@ def parse_request(self): HTTPStatus.BAD_REQUEST, "Bad HTTP/0.9 request type (%r)" % command) return False + is_http_0_9 = True self.command, self.path = command, path # gh-87389: The purpose of replacing '//' with '/' is to protect @@ -390,6 +392,11 @@ def parse_request(self): if self.path.startswith('//'): self.path = '/' + self.path.lstrip('/') # Reduce to a single / + # For HTTP/0.9, headers are not expected at all. + if is_http_0_9: + self.headers = {} + return True + # Examine the headers and look for a Connection directive. try: self.headers = http.client.parse_headers(self.rfile, diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 9a321952a8d61e..9539457d4d829d 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -8,6 +8,7 @@ SimpleHTTPRequestHandler, CGIHTTPRequestHandler from http import server, HTTPStatus +import contextlib import os import socket import sys @@ -359,6 +360,44 @@ def test_head_via_send_error(self): self.assertEqual(b'', data) +class HTTP09ServerTestCase(BaseTestCase): + + class request_handler(NoLogRequestHandler, BaseHTTPRequestHandler): + """Request handler for HTTP/0.9 server.""" + + def do_GET(self): + self.wfile.write(f'OK: here is {self.path}\r\n'.encode()) + + def setUp(self): + super().setUp() + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock = self.enterContext(self.sock) + self.sock.connect((self.HOST, self.PORT)) + + def test_simple_get(self): + self.sock.send(b'GET /index.html\r\n') + res = self.sock.recv(1024) + self.assertEqual(res, b"OK: here is /index.html\r\n") + + def test_invalid_request(self): + self.sock.send(b'POST /index.html\r\n') + res = self.sock.recv(1024) + self.assertIn(b"Bad HTTP/0.9 request type ('POST')", res) + + def test_single_request(self): + self.sock.send(b'GET /foo.html\r\n') + res = self.sock.recv(1024) + self.assertEqual(res, b"OK: here is /foo.html\r\n") + + # Ignore errors if the connection is already closed, + # as this is the expected behavior of HTTP/0.9. + with contextlib.suppress(OSError): + self.sock.send(b'GET /bar.html\r\n') + res = self.sock.recv(1024) + # The server should not process our request. + self.assertEqual(res, b'') + + def certdata_file(*path): return os.path.join(os.path.dirname(__file__), "certdata", *path) diff --git a/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst b/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst new file mode 100644 index 00000000000000..e1a9bbe9afe4d1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst @@ -0,0 +1,5 @@ +:mod:`http.server`: fix default handling of HTTP/0.9 requests in +:class:`~http.server.BaseHTTPRequestHandler`. Previously, +:meth:`!BaseHTTPRequestHandler.parse_request`` incorrectly +waited for headers in the request although those are not +supported in HTTP/0.9. Patch by Bénédikt Tran. From 3013683e9962f5f7f0915ed6c94a551dc396b8ac Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:22:05 +0200 Subject: [PATCH 1098/1674] [3.14] gh-118981: multiprocessing.popen_spawn_posix, fix potential hang (gh-118982) (GH-138605) fix potential hang. It can happen that the child crashes right in the beginning for whatever reason. In this case, the parent will hang when writing into the pipe, because the child fd is not closed yet. The normal pattern is to close the child fds right after the child proc is forked/executed/spawned, so when the child dies, then also the pipes will be closed, and there will be no hang (the parent gets SIGPIPE instead). (cherry picked from commit 8ed5a2b56cc6a8635e586c641b0b837669f6677b) Co-authored-by: Albert Zeyer --- Lib/multiprocessing/popen_spawn_posix.py | 4 ++++ .../Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst diff --git a/Lib/multiprocessing/popen_spawn_posix.py b/Lib/multiprocessing/popen_spawn_posix.py index 24b8634523e5f2..cccd659ae77637 100644 --- a/Lib/multiprocessing/popen_spawn_posix.py +++ b/Lib/multiprocessing/popen_spawn_posix.py @@ -57,6 +57,10 @@ def _launch(self, process_obj): self._fds.extend([child_r, child_w]) self.pid = util.spawnv_passfds(spawn.get_executable(), cmd, self._fds) + os.close(child_r) + child_r = None + os.close(child_w) + child_w = None self.sentinel = parent_r with open(parent_w, 'wb', closefd=False) as f: f.write(fp.getbuffer()) diff --git a/Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst b/Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst new file mode 100644 index 00000000000000..72b9f6c9e4eb99 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst @@ -0,0 +1,2 @@ +Fix potential hang in ``multiprocessing.popen_spawn_posix`` that can happen +when the child proc dies early by closing the child fds right away. From 8da7c7e1f3c35ef9267cdc4b4f8c7cbaba21b39a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:22:44 +0200 Subject: [PATCH 1099/1674] [3.14] gh-88375, gh-111788: Fix parsing errors and normalization in robotparser (GH-138502) (GH-138548) * Don't fail trying to parse weird patterns. * Don't fail trying to decode non-UTF-8 "robots.txt" files. * No longer ignore trailing "?" in patterns and URLs. * Distinguish raw special characters "?", "=" and "&" from the percent-encoded ones. * Remove tests that do nothing. (cherry picked from commit cb7ef18d70a0bc1363799e2dfa475db457155e43) Co-authored-by: Serhiy Storchaka --- Lib/test/test_robotparser.py | 161 +++++++++++++++--- Lib/urllib/robotparser.py | 35 ++-- ...-09-04-15-18-11.gh-issue-111788.tuTEM5.rst | 3 + ...5-09-05-15-35-59.gh-issue-88375.dC491a.rst | 4 + 4 files changed, 172 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst create mode 100644 Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 8d89e2a8224452..e33723cc70c877 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -16,6 +16,14 @@ class BaseRobotTest: bad = [] site_maps = None + def __init_subclass__(cls): + super().__init_subclass__() + # Remove tests that do nothing. + if not cls.good: + cls.test_good_urls = None + if not cls.bad: + cls.test_bad_urls = None + def setUp(self): lines = io.StringIO(self.robots_txt).readlines() self.parser = urllib.robotparser.RobotFileParser() @@ -231,9 +239,16 @@ class DisallowQueryStringTest(BaseRobotTest, unittest.TestCase): robots_txt = """\ User-agent: * Disallow: /some/path?name=value +Disallow: /another/path? +Disallow: /yet/one/path?name=value&more """ - good = ['/some/path'] - bad = ['/some/path?name=value'] + good = ['/some/path', '/some/path?', + '/some/path%3Fname=value', '/some/path?name%3Dvalue', + '/another/path', '/another/path%3F', + '/yet/one/path?name=value%26more'] + bad = ['/some/path?name=value' + '/another/path?', '/another/path?name=value', + '/yet/one/path?name=value&more'] class UseFirstUserAgentWildcardTest(BaseRobotTest, unittest.TestCase): @@ -249,15 +264,79 @@ class UseFirstUserAgentWildcardTest(BaseRobotTest, unittest.TestCase): bad = ['/some/path'] -class EmptyQueryStringTest(BaseRobotTest, unittest.TestCase): - # normalize the URL first (#17403) +class PercentEncodingTest(BaseRobotTest, unittest.TestCase): robots_txt = """\ User-agent: * -Allow: /some/path? -Disallow: /another/path? - """ - good = ['/some/path?'] - bad = ['/another/path?'] +Disallow: /a1/Z-._~ # unreserved characters +Disallow: /a2/%5A%2D%2E%5F%7E # percent-encoded unreserved characters +Disallow: /u1/%F0%9F%90%8D # percent-encoded ASCII Unicode character +Disallow: /u2/%f0%9f%90%8d +Disallow: /u3/\U0001f40d # raw non-ASCII Unicode character +Disallow: /v1/%F0 # percent-encoded non-ASCII octet +Disallow: /v2/%f0 +Disallow: /v3/\udcf0 # raw non-ASCII octet +Disallow: /p1%xy # raw percent +Disallow: /p2% +Disallow: /p3%25xy # percent-encoded percent +Disallow: /p4%2525xy # double percent-encoded percent +Disallow: /john%20smith # space +Disallow: /john doe +Disallow: /trailingspace%20 +Disallow: /question%3Fq=v # not query +Disallow: /hash%23f # not fragment +Disallow: /dollar%24 +Disallow: /asterisk%2A +Disallow: /sub/dir +Disallow: /slash%2F +Disallow: /query/question?q=%3F +Disallow: /query/raw/question?q=? +Disallow: /query/eq?q%3Dv +Disallow: /query/amp?q=v%26a +""" + good = [ + '/u1/%F0', '/u1/%f0', + '/u2/%F0', '/u2/%f0', + '/u3/%F0', '/u3/%f0', + '/p1%2525xy', '/p2%f0', '/p3%2525xy', '/p4%xy', '/p4%25xy', + '/question?q=v', + '/dollar', '/asterisk', + '/query/eq?q=v', + '/query/amp?q=v&a', + ] + bad = [ + '/a1/Z-._~', '/a1/%5A%2D%2E%5F%7E', + '/a2/Z-._~', '/a2/%5A%2D%2E%5F%7E', + '/u1/%F0%9F%90%8D', '/u1/%f0%9f%90%8d', '/u1/\U0001f40d', + '/u2/%F0%9F%90%8D', '/u2/%f0%9f%90%8d', '/u2/\U0001f40d', + '/u3/%F0%9F%90%8D', '/u3/%f0%9f%90%8d', '/u3/\U0001f40d', + '/v1/%F0', '/v1/%f0', '/v1/\udcf0', '/v1/\U0001f40d', + '/v2/%F0', '/v2/%f0', '/v2/\udcf0', '/v2/\U0001f40d', + '/v3/%F0', '/v3/%f0', '/v3/\udcf0', '/v3/\U0001f40d', + '/p1%xy', '/p1%25xy', + '/p2%', '/p2%25', '/p2%2525', '/p2%xy', + '/p3%xy', '/p3%25xy', + '/p4%2525xy', + '/john%20smith', '/john smith', + '/john%20doe', '/john doe', + '/trailingspace%20', '/trailingspace ', + '/question%3Fq=v', + '/hash#f', '/hash%23f', + '/dollar$', '/dollar%24', + '/asterisk*', '/asterisk%2A', + '/sub/dir', '/sub%2Fdir', + '/slash%2F', '/slash/', + '/query/question?q=?', '/query/question?q=%3F', + '/query/raw/question?q=?', '/query/raw/question?q=%3F', + '/query/eq?q%3Dv', + '/query/amp?q=v%26a', + ] + # other reserved characters + for c in ":/#[]@!$&'()*+,;=": + robots_txt += f'Disallow: /raw{c}\nDisallow: /pc%{ord(c):02X}\n' + bad.append(f'/raw{c}') + bad.append(f'/raw%{ord(c):02X}') + bad.append(f'/pc{c}') + bad.append(f'/pc%{ord(c):02X}') class DefaultEntryTest(BaseRequestRateTest, unittest.TestCase): @@ -299,26 +378,17 @@ def test_string_formatting(self): self.assertEqual(str(self.parser), self.expected_output) -class RobotHandler(BaseHTTPRequestHandler): - - def do_GET(self): - self.send_error(403, "Forbidden access") - - def log_message(self, format, *args): - pass - - @unittest.skipUnless( support.has_socket_support, "Socket server requires working socket." ) -class PasswordProtectedSiteTestCase(unittest.TestCase): +class BaseLocalNetworkTestCase: def setUp(self): # clear _opener global variable self.addCleanup(urllib.request.urlcleanup) - self.server = HTTPServer((socket_helper.HOST, 0), RobotHandler) + self.server = HTTPServer((socket_helper.HOST, 0), self.RobotHandler) self.t = threading.Thread( name='HTTPServer serving', @@ -335,6 +405,57 @@ def tearDown(self): self.t.join() self.server.server_close() + +SAMPLE_ROBOTS_TXT = b'''\ +User-agent: test_robotparser +Disallow: /utf8/\xf0\x9f\x90\x8d +Disallow: /non-utf8/\xf0 +Disallow: //[spam]/path +''' + + +class LocalNetworkTestCase(BaseLocalNetworkTestCase, unittest.TestCase): + class RobotHandler(BaseHTTPRequestHandler): + + def do_GET(self): + self.send_response(200) + self.end_headers() + self.wfile.write(SAMPLE_ROBOTS_TXT) + + def log_message(self, format, *args): + pass + + @threading_helper.reap_threads + def testRead(self): + # Test that reading a weird robots.txt doesn't fail. + addr = self.server.server_address + url = f'http://{socket_helper.HOST}:{addr[1]}' + robots_url = url + '/robots.txt' + parser = urllib.robotparser.RobotFileParser() + parser.set_url(robots_url) + parser.read() + # And it can even interpret the weird paths in some reasonable way. + agent = 'test_robotparser' + self.assertTrue(parser.can_fetch(agent, robots_url)) + self.assertTrue(parser.can_fetch(agent, url + '/utf8/')) + self.assertFalse(parser.can_fetch(agent, url + '/utf8/\U0001f40d')) + self.assertFalse(parser.can_fetch(agent, url + '/utf8/%F0%9F%90%8D')) + self.assertFalse(parser.can_fetch(agent, url + '/utf8/\U0001f40d')) + self.assertTrue(parser.can_fetch(agent, url + '/non-utf8/')) + self.assertFalse(parser.can_fetch(agent, url + '/non-utf8/%F0')) + self.assertFalse(parser.can_fetch(agent, url + '/non-utf8/\U0001f40d')) + self.assertFalse(parser.can_fetch(agent, url + '/%2F[spam]/path')) + + +class PasswordProtectedSiteTestCase(BaseLocalNetworkTestCase, unittest.TestCase): + class RobotHandler(BaseHTTPRequestHandler): + + def do_GET(self): + self.send_error(403, "Forbidden access") + + def log_message(self, format, *args): + pass + @threading_helper.reap_threads def testPasswordProtectedSite(self): addr = self.server.server_address diff --git a/Lib/urllib/robotparser.py b/Lib/urllib/robotparser.py index 409f2b2e48de6e..4009fd6b58f594 100644 --- a/Lib/urllib/robotparser.py +++ b/Lib/urllib/robotparser.py @@ -11,6 +11,7 @@ """ import collections +import re import urllib.error import urllib.parse import urllib.request @@ -20,6 +21,19 @@ RequestRate = collections.namedtuple("RequestRate", "requests seconds") +def normalize(path): + unquoted = urllib.parse.unquote(path, errors='surrogateescape') + return urllib.parse.quote(unquoted, errors='surrogateescape') + +def normalize_path(path): + path, sep, query = path.partition('?') + path = normalize(path) + if sep: + query = re.sub(r'[^=&]+', lambda m: normalize(m[0]), query) + path += '?' + query + return path + + class RobotFileParser: """ This class provides a set of methods to read, parse and answer questions about a single robots.txt file. @@ -55,7 +69,7 @@ def modified(self): def set_url(self, url): """Sets the URL referring to a robots.txt file.""" self.url = url - self.host, self.path = urllib.parse.urlparse(url)[1:3] + self.host, self.path = urllib.parse.urlsplit(url)[1:3] def read(self): """Reads the robots.txt URL and feeds it to the parser.""" @@ -69,7 +83,7 @@ def read(self): err.close() else: raw = f.read() - self.parse(raw.decode("utf-8").splitlines()) + self.parse(raw.decode("utf-8", "surrogateescape").splitlines()) def _add_entry(self, entry): if "*" in entry.useragents: @@ -113,7 +127,7 @@ def parse(self, lines): line = line.split(':', 1) if len(line) == 2: line[0] = line[0].strip().lower() - line[1] = urllib.parse.unquote(line[1].strip()) + line[1] = line[1].strip() if line[0] == "user-agent": if state == 2: self._add_entry(entry) @@ -167,10 +181,11 @@ def can_fetch(self, useragent, url): return False # search for given user agent matches # the first match counts - parsed_url = urllib.parse.urlparse(urllib.parse.unquote(url)) - url = urllib.parse.urlunparse(('','',parsed_url.path, - parsed_url.params,parsed_url.query, parsed_url.fragment)) - url = urllib.parse.quote(url) + # TODO: The private API is used in order to preserve an empty query. + # This is temporary until the public API starts supporting this feature. + parsed_url = urllib.parse._urlsplit(url, '') + url = urllib.parse._urlunsplit(None, None, *parsed_url[2:]) + url = normalize_path(url) if not url: url = "/" for entry in self.entries: @@ -213,7 +228,6 @@ def __str__(self): entries = entries + [self.default_entry] return '\n\n'.join(map(str, entries)) - class RuleLine: """A rule line is a single "Allow:" (allowance==True) or "Disallow:" (allowance==False) followed by a path.""" @@ -221,8 +235,7 @@ def __init__(self, path, allowance): if path == '' and not allowance: # an empty value means allow all allowance = True - path = urllib.parse.urlunparse(urllib.parse.urlparse(path)) - self.path = urllib.parse.quote(path) + self.path = normalize_path(path) self.allowance = allowance def applies_to(self, filename): @@ -268,7 +281,7 @@ def applies_to(self, useragent): def allowance(self, filename): """Preconditions: - our agent applies to this entry - - filename is URL decoded""" + - filename is URL encoded""" for line in self.rulelines: if line.applies_to(filename): return line.allowance diff --git a/Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst b/Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst new file mode 100644 index 00000000000000..a86e71e052d9f1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst @@ -0,0 +1,3 @@ +Fix parsing errors in the :mod:`urllib.robotparser` module. +Don't fail trying to parse weird paths. +Don't fail trying to decode non-UTF-8 ``robots.txt`` files. diff --git a/Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst b/Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst new file mode 100644 index 00000000000000..1660f39ddb1d3c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst @@ -0,0 +1,4 @@ +Fix normalization of the ``robots.txt`` rules and URLs in the +:mod:`urllib.robotparser` module. No longer ignore trailing ``?``. +Distinguish raw special characters ``?``, ``=`` and ``&`` from the +percent-encoded ones. From 669253fde5210950ca4b32e5b22194aff7dd136e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:26:09 +0200 Subject: [PATCH 1100/1674] [3.14] gh-138204: Forbid expansion of a shared anonymous mmap on Linux (GH-138220) (GH-138386) This is a Linux kernel bug which caused a bus error. https://bugzilla.kernel.org/show_bug.cgi?id=8691 (cherry picked from commit 33fcb0c4a054f646d9d3686c145209a893b09bb0) Co-authored-by: Serhiy Storchaka --- Lib/test/test_mmap.py | 68 ++++++++++++++----- ...-08-28-13-20-09.gh-issue-138204.8oLOud.rst | 2 + Modules/mmapmodule.c | 9 +++ 3 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index b2a299ed172967..38d1a496c30e21 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -901,35 +901,69 @@ def test_madvise(self): self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, 2), None) self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, size), None) - @unittest.skipUnless(os.name == 'nt', 'requires Windows') - def test_resize_up_when_mapped_to_pagefile(self): + def test_resize_up_anonymous_mapping(self): """If the mmap is backed by the pagefile ensure a resize up can happen and that the original data is still in place """ start_size = PAGESIZE new_size = 2 * start_size - data = bytes(random.getrandbits(8) for _ in range(start_size)) + data = random.randbytes(start_size) - m = mmap.mmap(-1, start_size) - m[:] = data - m.resize(new_size) - self.assertEqual(len(m), new_size) - self.assertEqual(m[:start_size], data[:start_size]) + with mmap.mmap(-1, start_size) as m: + m[:] = data + if sys.platform.startswith(('linux', 'android')): + # Can't expand a shared anonymous mapping on Linux. + # See https://bugzilla.kernel.org/show_bug.cgi?id=8691 + with self.assertRaises(ValueError): + m.resize(new_size) + else: + try: + m.resize(new_size) + except SystemError: + pass + else: + self.assertEqual(len(m), new_size) + self.assertEqual(m[:start_size], data) + self.assertEqual(m[start_size:], b'\0' * (new_size - start_size)) - @unittest.skipUnless(os.name == 'nt', 'requires Windows') - def test_resize_down_when_mapped_to_pagefile(self): + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + def test_resize_up_private_anonymous_mapping(self): + start_size = PAGESIZE + new_size = 2 * start_size + data = random.randbytes(start_size) + + with mmap.mmap(-1, start_size, flags=mmap.MAP_PRIVATE) as m: + m[:] = data + try: + m.resize(new_size) + except SystemError: + pass + else: + self.assertEqual(len(m), new_size) + self.assertEqual(m[:start_size], data) + self.assertEqual(m[start_size:], b'\0' * (new_size - start_size)) + + def test_resize_down_anonymous_mapping(self): """If the mmap is backed by the pagefile ensure a resize down up can happen and that a truncated form of the original data is still in place """ - start_size = PAGESIZE + start_size = 2 * PAGESIZE new_size = start_size // 2 - data = bytes(random.getrandbits(8) for _ in range(start_size)) + data = random.randbytes(start_size) - m = mmap.mmap(-1, start_size) - m[:] = data - m.resize(new_size) - self.assertEqual(len(m), new_size) - self.assertEqual(m[:new_size], data[:new_size]) + with mmap.mmap(-1, start_size) as m: + m[:] = data + try: + m.resize(new_size) + except SystemError: + pass + else: + self.assertEqual(len(m), new_size) + self.assertEqual(m[:], data[:new_size]) + if sys.platform.startswith(('linux', 'android')): + # Can't expand to its original size. + with self.assertRaises(ValueError): + m.resize(start_size) @unittest.skipUnless(os.name == 'nt', 'requires Windows') def test_resize_fails_if_mapping_held_elsewhere(self): diff --git a/Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst b/Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst new file mode 100644 index 00000000000000..8eb5497f5da545 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst @@ -0,0 +1,2 @@ +Forbid expansion of shared anonymous :mod:`memory maps ` on Linux, +which caused a bus error. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index e2ae967ce0c33d..f58a48900bf6d7 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -120,6 +120,7 @@ typedef struct { #ifdef UNIX int fd; _Bool trackfd; + int flags; #endif PyObject *weakreflist; @@ -875,6 +876,13 @@ mmap_resize_method(PyObject *op, PyObject *args) #else void *newmap; +#ifdef __linux__ + if (self->fd == -1 && !(self->flags & MAP_PRIVATE) && new_size > self->size) { + PyErr_Format(PyExc_ValueError, + "mmap: can't expand a shared anonymous mapping on Linux"); + return NULL; + } +#endif if (self->fd != -1 && ftruncate(self->fd, self->offset + new_size) == -1) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -1671,6 +1679,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) else { m_obj->fd = -1; } + m_obj->flags = flags; Py_BEGIN_ALLOW_THREADS m_obj->data = mmap(NULL, map_size, prot, flags, fd, offset); From d424344ce9e7f4a5d7ed42f660a33769e5606f9a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:26:59 +0200 Subject: [PATCH 1101/1674] [3.14] bpo-41839: Fix error checking in sched_get_priority_ functions (GH-22374) (GH-138201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit bbcb75c986c47887e6c0757e63d59cd7af544f39) Co-authored-by: Jakub Kulík --- .../Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst | 2 ++ Modules/posixmodule.c | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst diff --git a/Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst b/Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst new file mode 100644 index 00000000000000..760660408100d5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst @@ -0,0 +1,2 @@ +Allow negative priority values from :func:`os.sched_get_priority_min` and +:func:`os.sched_get_priority_max` functions. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c6bc9c9c50488f..06a40db1078057 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8186,10 +8186,10 @@ static PyObject * os_sched_get_priority_max_impl(PyObject *module, int policy) /*[clinic end generated code: output=9e465c6e43130521 input=2097b7998eca6874]*/ { - int max; - - max = sched_get_priority_max(policy); - if (max < 0) + /* make sure that errno is cleared before the call */ + errno = 0; + int max = sched_get_priority_max(policy); + if (max == -1 && errno) return posix_error(); return PyLong_FromLong(max); } @@ -8207,8 +8207,10 @@ static PyObject * os_sched_get_priority_min_impl(PyObject *module, int policy) /*[clinic end generated code: output=7595c1138cc47a6d input=21bc8fa0d70983bf]*/ { + /* make sure that errno is cleared before the call */ + errno = 0; int min = sched_get_priority_min(policy); - if (min < 0) + if (min == -1 && errno) return posix_error(); return PyLong_FromLong(min); } From ebbce6b0f9d59b817ea019ad83b12f26cb301a1a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:27:28 +0200 Subject: [PATCH 1102/1674] [3.14] gh-71679: Improve tests for repr() of bytes and bytearray (GH-138180) (GH-138182) * Merge existing tests test_repr_str and test_to_str. * Add more tests for non-printable and non-ASCII bytes. * Add tests for special escape sequences ('\t\n\r'). * Add tests for slashes. * Add more tests for quotes. * Add tests for subclasses. * Add test for non-ASCII class name. * Only apply @check_bytes_warnings for str() tests. (cherry picked from commit 0dbbf61cc2550428ff99daee367364c688031e1a) Co-authored-by: Serhiy Storchaka --- Lib/test/test_bytes.py | 59 ++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 2591e7ca6ab0ec..5e57b6d0eee5ba 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1957,16 +1957,43 @@ class AssortedBytesTest(unittest.TestCase): # Test various combinations of bytes and bytearray # + def test_bytes_repr(self, f=repr): + self.assertEqual(f(b''), "b''") + self.assertEqual(f(b"abc"), "b'abc'") + self.assertEqual(f(bytes([92])), r"b'\\'") + self.assertEqual(f(bytes([0, 1, 254, 255])), r"b'\x00\x01\xfe\xff'") + self.assertEqual(f(b'\a\b\t\n\v\f\r'), r"b'\x07\x08\t\n\x0b\x0c\r'") + self.assertEqual(f(b'"'), """b'"'""") # '"' + self.assertEqual(f(b"'"), '''b"'"''') # "'" + self.assertEqual(f(b"'\""), r"""b'\'"'""") # '\'"' + self.assertEqual(f(b"\"'\""), r"""b'"\'"'""") # '"\'"' + self.assertEqual(f(b"'\"'"), r"""b'\'"\''""") # '\'"\'' + self.assertEqual(f(BytesSubclass(b"abc")), "b'abc'") + + def test_bytearray_repr(self, f=repr): + self.assertEqual(f(bytearray()), "bytearray(b'')") + self.assertEqual(f(bytearray(b'abc')), "bytearray(b'abc')") + self.assertEqual(f(bytearray([92])), r"bytearray(b'\\')") + self.assertEqual(f(bytearray([0, 1, 254, 255])), + r"bytearray(b'\x00\x01\xfe\xff')") + self.assertEqual(f(bytearray([7, 8, 9, 10, 11, 12, 13])), + r"bytearray(b'\x07\x08\t\n\x0b\x0c\r')") + self.assertEqual(f(bytearray(b'"')), """bytearray(b'"')""") # '"' + self.assertEqual(f(bytearray(b"'")), r'''bytearray(b"\'")''') # "\'" + self.assertEqual(f(bytearray(b"'\"")), r"""bytearray(b'\'"')""") # '\'"' + self.assertEqual(f(bytearray(b"\"'\"")), r"""bytearray(b'"\'"')""") # '"\'"' + self.assertEqual(f(bytearray(b'\'"\'')), r"""bytearray(b'\'"\'')""") # '\'"\'' + self.assertEqual(f(ByteArraySubclass(b"abc")), "ByteArraySubclass(b'abc')") + self.assertEqual(f(ByteArraySubclass.Nested(b"abc")), "Nested(b'abc')") + self.assertEqual(f(ByteArraySubclass.Ŭñıçöđë(b"abc")), "Ŭñıçöđë(b'abc')") + + @check_bytes_warnings + def test_bytes_str(self): + self.test_bytes_repr(str) + @check_bytes_warnings - def test_repr_str(self): - for f in str, repr: - self.assertEqual(f(bytearray()), "bytearray(b'')") - self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')") - self.assertEqual(f(bytearray([0, 1, 254, 255])), - "bytearray(b'\\x00\\x01\\xfe\\xff')") - self.assertEqual(f(b"abc"), "b'abc'") - self.assertEqual(f(b"'"), '''b"'"''') # ''' - self.assertEqual(f(b"'\""), r"""b'\'"'""") # ' + def test_bytearray_str(self): + self.test_bytearray_repr(str) @check_bytes_warnings def test_format(self): @@ -2019,15 +2046,6 @@ def test_from_bytearray(self): b = bytearray(buf) self.assertEqual(b, bytearray(sample)) - @check_bytes_warnings - def test_to_str(self): - self.assertEqual(str(b''), "b''") - self.assertEqual(str(b'x'), "b'x'") - self.assertEqual(str(b'\x80'), "b'\\x80'") - self.assertEqual(str(bytearray(b'')), "bytearray(b'')") - self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')") - self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')") - def test_literal(self): tests = [ (b"Wonderful spam", "Wonderful spam"), @@ -2235,7 +2253,10 @@ def __init__(me, *args, **kwargs): class ByteArraySubclass(bytearray): - pass + class Nested(bytearray): + pass + class Ŭñıçöđë(bytearray): + pass class ByteArraySubclassWithSlots(bytearray): __slots__ = ('x', 'y', '__dict__') From 0188e0fd38bea72c39f2e5a0e04b20181e21c1ce Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:27:57 +0200 Subject: [PATCH 1103/1674] [3.14] gh-137986: Fix and improve the csv functions docstrings (GH-137987) (GH-138107) The csv.register_dialect() docstring no longer imply that it returns a dialect. All functions have now signatures. (cherry picked from commit aa1dbd4dde32951de2e7438b56d6761001604ee2) Co-authored-by: Serhiy Storchaka Co-authored-by: maurycy <5383+maurycy@users.noreply.github.com> --- Doc/library/csv.rst | 9 +++--- Modules/_csv.c | 67 +++++++++++++++++++---------------------- Modules/clinic/_csv.c.h | 16 +++------- 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 4242fc51ab395c..3ea7cd210f729d 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -113,7 +113,7 @@ The :mod:`csv` module defines the following functions: spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) -.. function:: register_dialect(name[, dialect[, **fmtparams]]) +.. function:: register_dialect(name, /, dialect='excel', **fmtparams) Associate *dialect* with *name*. *name* must be a string. The dialect can be specified either by passing a sub-class of :class:`Dialect`, or @@ -139,7 +139,8 @@ The :mod:`csv` module defines the following functions: Return the names of all registered dialects. -.. function:: field_size_limit([new_limit]) +.. function:: field_size_limit() + field_size_limit(new_limit) Returns the current maximum field size allowed by the parser. If *new_limit* is given, this becomes the new limit. @@ -527,7 +528,7 @@ out surrounded by parens. This may cause some problems for other programs which read CSV files (assuming they support complex numbers at all). -.. method:: csvwriter.writerow(row) +.. method:: csvwriter.writerow(row, /) Write the *row* parameter to the writer's file object, formatted according to the current :class:`Dialect`. Return the return value of the call to the @@ -536,7 +537,7 @@ read CSV files (assuming they support complex numbers at all). .. versionchanged:: 3.5 Added support of arbitrary iterables. -.. method:: csvwriter.writerows(rows) +.. method:: csvwriter.writerows(rows, /) Write all elements in *rows* (an iterable of *row* objects as described above) to the writer's file object, formatted according to the current diff --git a/Modules/_csv.c b/Modules/_csv.c index 2e04136e0ac657..87be7a8f1fb136 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1304,10 +1304,11 @@ join_append_lineterminator(WriterObj *self) } PyDoc_STRVAR(csv_writerow_doc, -"writerow(iterable)\n" +"writerow($self, row, /)\n" +"--\n\n" +"Construct and write a CSV record from an iterable of fields.\n" "\n" -"Construct and write a CSV record from an iterable of fields. Non-string\n" -"elements will be converted to string."); +"Non-string elements will be converted to string."); static PyObject * csv_writerow(PyObject *op, PyObject *seq) @@ -1414,10 +1415,11 @@ csv_writerow(PyObject *op, PyObject *seq) } PyDoc_STRVAR(csv_writerows_doc, -"writerows(iterable of iterables)\n" +"writerows($self, rows, /)\n" +"--\n\n" +"Construct and write a series of iterables to a csv file.\n" "\n" -"Construct and write a series of iterables to a csv file. Non-string\n" -"elements will be converted to string."); +"Non-string elements will be converted to string."); static PyObject * csv_writerows(PyObject *self, PyObject *seqseq) @@ -1574,13 +1576,11 @@ csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args) _csv.list_dialects Return a list of all known dialect names. - - names = csv.list_dialects() [clinic start generated code]*/ static PyObject * _csv_list_dialects_impl(PyObject *module) -/*[clinic end generated code: output=a5b92b215b006a6d input=8953943eb17d98ab]*/ +/*[clinic end generated code: output=a5b92b215b006a6d input=ec58040aafd6a20a]*/ { return PyDict_Keys(get_csv_state(module)->dialects); } @@ -1617,13 +1617,11 @@ _csv.unregister_dialect name: object Delete the name/dialect mapping associated with a string name. - - csv.unregister_dialect(name) [clinic start generated code]*/ static PyObject * _csv_unregister_dialect_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=0813ebca6c058df4 input=6b5c1557bf60c7e7]*/ +/*[clinic end generated code: output=0813ebca6c058df4 input=e1cf81bfe3ba0f62]*/ { _csvstate *module_state = get_csv_state(module); int rc = PyDict_Pop(module_state->dialects, name, NULL); @@ -1643,13 +1641,11 @@ _csv.get_dialect name: object Return the dialect instance associated with name. - - dialect = csv.get_dialect(name) [clinic start generated code]*/ static PyObject * _csv_get_dialect_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=aa988cd573bebebb input=edf9ddab32e448fb]*/ +/*[clinic end generated code: output=aa988cd573bebebb input=74865c659dcb441f]*/ { return get_dialect_from_registry(name, get_csv_state(module)); } @@ -1661,15 +1657,13 @@ _csv.field_size_limit Sets an upper limit on parsed fields. - csv.field_size_limit([limit]) - Returns old limit. If limit is not given, no new limit is set and the old limit is returned [clinic start generated code]*/ static PyObject * _csv_field_size_limit_impl(PyObject *module, PyObject *new_limit) -/*[clinic end generated code: output=f2799ecd908e250b input=cec70e9226406435]*/ +/*[clinic end generated code: output=f2799ecd908e250b input=77db7485ee3ae90a]*/ { _csvstate *module_state = get_csv_state(module); Py_ssize_t old_limit = FT_ATOMIC_LOAD_SSIZE_RELAXED(module_state->field_limit); @@ -1705,14 +1699,13 @@ PyType_Spec error_spec = { PyDoc_STRVAR(csv_module_doc, "CSV parsing and writing.\n"); PyDoc_STRVAR(csv_reader_doc, -" csv_reader = reader(iterable [, dialect='excel']\n" -" [optional keyword args])\n" -" for row in csv_reader:\n" -" process(row)\n" +"reader($module, iterable, /, dialect='excel', **fmtparams)\n" +"--\n\n" +"Return a reader object that will process lines from the given iterable.\n" "\n" "The \"iterable\" argument can be any object that returns a line\n" "of input for each iteration, such as a file object or a list. The\n" -"optional \"dialect\" parameter is discussed below. The function\n" +"optional \"dialect\" argument defines a CSV dialect. The function\n" "also accepts optional keyword arguments which override settings\n" "provided by the dialect.\n" "\n" @@ -1720,22 +1713,24 @@ PyDoc_STRVAR(csv_reader_doc, "of the CSV file (which can span multiple input lines).\n"); PyDoc_STRVAR(csv_writer_doc, -" csv_writer = csv.writer(fileobj [, dialect='excel']\n" -" [optional keyword args])\n" -" for row in sequence:\n" -" csv_writer.writerow(row)\n" +"writer($module, fileobj, /, dialect='excel', **fmtparams)\n" +"--\n\n" +"Return a writer object that will write user data on the given file object.\n" "\n" -" [or]\n" -"\n" -" csv_writer = csv.writer(fileobj [, dialect='excel']\n" -" [optional keyword args])\n" -" csv_writer.writerows(rows)\n" -"\n" -"The \"fileobj\" argument can be any object that supports the file API.\n"); +"The \"fileobj\" argument can be any object that supports the file API.\n" +"The optional \"dialect\" argument defines a CSV dialect. The function\n" +"also accepts optional keyword arguments which override settings\n" +"provided by the dialect.\n"); PyDoc_STRVAR(csv_register_dialect_doc, -"Create a mapping from a string name to a dialect class.\n" -" dialect = csv.register_dialect(name[, dialect[, **fmtparams]])"); +"register_dialect($module, name, /, dialect='excel', **fmtparams)\n" +"--\n\n" +"Create a mapping from a string name to a CVS dialect.\n" +"\n" +"The optional \"dialect\" argument specifies the base dialect instance\n" +"or the name of the registered dialect. The function also accepts\n" +"optional keyword arguments which override settings provided by the\n" +"dialect.\n"); static struct PyMethodDef csv_methods[] = { { "reader", _PyCFunction_CAST(csv_reader), diff --git a/Modules/clinic/_csv.c.h b/Modules/clinic/_csv.c.h index 416aeafccf917b..b8dd8ac35fac59 100644 --- a/Modules/clinic/_csv.c.h +++ b/Modules/clinic/_csv.c.h @@ -12,9 +12,7 @@ PyDoc_STRVAR(_csv_list_dialects__doc__, "list_dialects($module, /)\n" "--\n" "\n" -"Return a list of all known dialect names.\n" -"\n" -" names = csv.list_dialects()"); +"Return a list of all known dialect names."); #define _CSV_LIST_DIALECTS_METHODDEF \ {"list_dialects", (PyCFunction)_csv_list_dialects, METH_NOARGS, _csv_list_dialects__doc__}, @@ -32,9 +30,7 @@ PyDoc_STRVAR(_csv_unregister_dialect__doc__, "unregister_dialect($module, /, name)\n" "--\n" "\n" -"Delete the name/dialect mapping associated with a string name.\n" -"\n" -" csv.unregister_dialect(name)"); +"Delete the name/dialect mapping associated with a string name."); #define _CSV_UNREGISTER_DIALECT_METHODDEF \ {"unregister_dialect", _PyCFunction_CAST(_csv_unregister_dialect), METH_FASTCALL|METH_KEYWORDS, _csv_unregister_dialect__doc__}, @@ -92,9 +88,7 @@ PyDoc_STRVAR(_csv_get_dialect__doc__, "get_dialect($module, /, name)\n" "--\n" "\n" -"Return the dialect instance associated with name.\n" -"\n" -" dialect = csv.get_dialect(name)"); +"Return the dialect instance associated with name."); #define _CSV_GET_DIALECT_METHODDEF \ {"get_dialect", _PyCFunction_CAST(_csv_get_dialect), METH_FASTCALL|METH_KEYWORDS, _csv_get_dialect__doc__}, @@ -154,8 +148,6 @@ PyDoc_STRVAR(_csv_field_size_limit__doc__, "\n" "Sets an upper limit on parsed fields.\n" "\n" -" csv.field_size_limit([limit])\n" -"\n" "Returns old limit. If limit is not given, no new limit is set and\n" "the old limit is returned"); @@ -215,4 +207,4 @@ _csv_field_size_limit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=1fb09d5e7667ad0d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ed77cb69fad9f3b4 input=a9049054013a1b77]*/ From 333cab0da7e148c713a862330fabc269a145536a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:28:41 +0200 Subject: [PATCH 1104/1674] [3.14] gh-137754: Fix import of zoneinfo if _datetime is not available (GH-137845) (GH-138084) Both modules should use the Python implementation in that case. (cherry picked from commit 6620ef0ff62dea2632bedf9afa88aa4780a2c9d9) Co-authored-by: Serhiy Storchaka --- Lib/test/test_zoneinfo/test_zoneinfo.py | 21 +++++++++++++++++++ Lib/zoneinfo/__init__.py | 5 ++++- ...-08-16-09-02-11.gh-issue-137754.mCev1Y.rst | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py index 67c570563110e9..2f9a5dfc1a89a0 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -22,6 +22,7 @@ from test.test_zoneinfo import _support as test_support from test.test_zoneinfo._support import TZPATH_TEST_LOCK, ZoneInfoTestBase from test.support.import_helper import import_module, CleanImport +from test.support.script_helper import assert_python_ok lzma = import_module('lzma') py_zoneinfo, c_zoneinfo = test_support.get_modules() @@ -1955,6 +1956,26 @@ class CTestModule(TestModule): module = c_zoneinfo +class MiscTests(unittest.TestCase): + def test_pydatetime(self): + # Test that zoneinfo works if the C implementation of datetime + # is not available and the Python implementation of datetime is used. + # The Python implementation of zoneinfo should be used in thet case. + # + # Run the test in a subprocess, as importing _zoneinfo with + # _datettime disabled causes crash in the previously imported + # _zoneinfo. + assert_python_ok('-c', '''if 1: + import sys + sys.modules['_datetime'] = None + import datetime + import zoneinfo + tzinfo = zoneinfo.ZoneInfo('Europe/London') + datetime.datetime(2025, 10, 26, 2, 0, tzinfo=tzinfo) + ''', + PYTHONTZPATH=str(ZONEINFO_DATA.tzpath)) + + class ExtensionBuiltTest(unittest.TestCase): """Smoke test to ensure that the C and Python extensions are both tested. diff --git a/Lib/zoneinfo/__init__.py b/Lib/zoneinfo/__init__.py index f5510ee0497513..df2ae909f53cf2 100644 --- a/Lib/zoneinfo/__init__.py +++ b/Lib/zoneinfo/__init__.py @@ -12,7 +12,10 @@ try: from _zoneinfo import ZoneInfo -except ImportError: # pragma: nocover +except (ImportError, AttributeError): # pragma: nocover + # AttributeError: module 'datetime' has no attribute 'datetime_CAPI'. + # This happens when the '_datetime' module is not available and the + # pure Python implementation is used instead. from ._zoneinfo import ZoneInfo reset_tzpath = _tzpath.reset_tzpath diff --git a/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst b/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst new file mode 100644 index 00000000000000..323870afd97106 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst @@ -0,0 +1,2 @@ +Fix import of the :mod:`zoneinfo` module if the C implementation of the +:mod:`datetime` module is not available. From 7ed541960493b1b5fce687c8c97d9a41e1095cd9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:30:54 +0200 Subject: [PATCH 1105/1674] [3.14] gh-137463: Update `validate_abstract_methods` in `test_collections.py` (GH-137464) (GH-137503) Update `validate_abstract_methods` in `test_collections.py` The test for missing abstract methods in `validate_abstract_methods` incorrectly attempted to instantiate the generated class `C` with an argument (`C(name)`), which always raises a `TypeError: C() takes no arguments`. Although the test originally passes, it passes for the wrong reason. This change makes the test correctly validate the enforcement of abstract methods in ABCs. (cherry picked from commit 5be872350d562e6c9987b09ff4b7bda80a2f9cd0) Co-authored-by: Guilherme Leobas --- Lib/test/test_collections.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 6c91d7aba2d53e..3dac736e0189b1 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -736,7 +736,7 @@ def validate_abstract_methods(self, abc, *names): stubs = methodstubs.copy() del stubs[name] C = type('C', (abc,), stubs) - self.assertRaises(TypeError, C, name) + self.assertRaises(TypeError, C) def validate_isinstance(self, abc, name): stub = lambda s, *args: 0 @@ -963,7 +963,7 @@ class AnextOnly: async def __anext__(self): raise StopAsyncIteration self.assertNotIsInstance(AnextOnly(), AsyncIterator) - self.validate_abstract_methods(AsyncIterator, '__anext__', '__aiter__') + self.validate_abstract_methods(AsyncIterator, '__anext__') def test_Iterable(self): # Check some non-iterables @@ -1159,7 +1159,7 @@ def test_Iterator(self): for x in samples: self.assertIsInstance(x, Iterator) self.assertIsSubclass(type(x), Iterator) - self.validate_abstract_methods(Iterator, '__next__', '__iter__') + self.validate_abstract_methods(Iterator, '__next__') # Issue 10565 class NextOnly: @@ -1843,8 +1843,7 @@ def test_Mapping(self): for sample in [dict]: self.assertIsInstance(sample(), Mapping) self.assertIsSubclass(sample, Mapping) - self.validate_abstract_methods(Mapping, '__contains__', '__iter__', '__len__', - '__getitem__') + self.validate_abstract_methods(Mapping, '__iter__', '__len__', '__getitem__') class MyMapping(Mapping): def __len__(self): return 0 @@ -1859,7 +1858,7 @@ def test_MutableMapping(self): for sample in [dict]: self.assertIsInstance(sample(), MutableMapping) self.assertIsSubclass(sample, MutableMapping) - self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__', + self.validate_abstract_methods(MutableMapping, '__iter__', '__len__', '__getitem__', '__setitem__', '__delitem__') def test_MutableMapping_subclass(self): @@ -1898,8 +1897,7 @@ def test_Sequence(self): self.assertIsInstance(memoryview(b""), Sequence) self.assertIsSubclass(memoryview, Sequence) self.assertIsSubclass(str, Sequence) - self.validate_abstract_methods(Sequence, '__contains__', '__iter__', '__len__', - '__getitem__') + self.validate_abstract_methods(Sequence, '__len__', '__getitem__') def test_Sequence_mixins(self): class SequenceSubclass(Sequence): @@ -1976,8 +1974,8 @@ def test_MutableSequence(self): self.assertIsSubclass(sample, MutableSequence) self.assertIsSubclass(array.array, MutableSequence) self.assertNotIsSubclass(str, MutableSequence) - self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__', - '__len__', '__getitem__', '__setitem__', '__delitem__', 'insert') + self.validate_abstract_methods(MutableSequence, '__len__', '__getitem__', + '__setitem__', '__delitem__', 'insert') def test_MutableSequence_mixins(self): # Test the mixins of MutableSequence by creating a minimal concrete From cbd532f2e86442f61f35bb978430d1eb6fc5daed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:31:26 +0200 Subject: [PATCH 1106/1674] [3.14] gh-137056: Fix DTrace build support on NetBSD (GH-137057) (GH-137444) (cherry picked from commit 54a5fdffc8e20f111e7a7d2df352e8be057177ff) Co-authored-by: Furkan Onder --- Makefile.pre.in | 4 ++-- configure | 22 ++++++++++++++++++++-- configure.ac | 21 +++++++++++++++++++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 34a270ab31167a..711628a4c22242 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2230,7 +2230,7 @@ Python/frozen.o: $(FROZEN_FILES_OUT) # an include guard, so we can't use a pipeline to transform its output. Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d $(MKDIR_P) Include - CC="$(CC)" CFLAGS="$(CFLAGS)" $(DTRACE) $(DFLAGS) -o $@ -h -s $< + CC="$(CC)" CFLAGS="$(CFLAGS)" $(DTRACE) $(DFLAGS) -o $@ -h -s $(srcdir)/Include/pydtrace.d : sed in-place edit with POSIX-only tools sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp mv $@.tmp $@ @@ -2240,7 +2240,7 @@ Python/gc.o: $(srcdir)/Include/pydtrace.h Python/import.o: $(srcdir)/Include/pydtrace.h Python/pydtrace.o: $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) - CC="$(CC)" CFLAGS="$(CFLAGS)" $(DTRACE) $(DFLAGS) -o $@ -G -s $< $(DTRACE_DEPS) + CC="$(CC)" CFLAGS="$(CFLAGS)" $(DTRACE) $(DFLAGS) -o $@ -G -s $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) Objects/typeobject.o: Objects/typeslots.inc diff --git a/configure b/configure index dc66ea068ebc1f..2c403f4965ddfe 100755 --- a/configure +++ b/configure @@ -19051,15 +19051,27 @@ printf "%s\n" "#define WITH_DTRACE 1" >>confdefs.h # linked into the binary. Correspondingly, dtrace(1) is missing the ELF # generation flag '-G'. We check for presence of this flag, rather than # hardcoding support by OS, in the interest of robustness. + # + # NetBSD DTrace requires the -x nolibs flag to avoid system library conflicts + # and uses header generation for testing instead of object generation. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether DTrace probes require linking" >&5 printf %s "checking whether DTrace probes require linking... " >&6; } if test ${ac_cv_dtrace_link+y} then : printf %s "(cached) " >&6 else case e in #( - e) ac_cv_dtrace_link=no + e) + ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" $DFLAGS -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + case $host in + *netbsd*) + DTRACE_TEST_FLAGS="-x nolibs -h" + ;; + *) + DTRACE_TEST_FLAGS="-G" + ;; + esac + "$DTRACE" $DFLAGS $DTRACE_TEST_FLAGS -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes ;; esac @@ -19069,6 +19081,12 @@ printf "%s\n" "$ac_cv_dtrace_link" >&6; } if test "$ac_cv_dtrace_link" = "yes"; then DTRACE_OBJS="Python/pydtrace.o" fi + # Set NetBSD-specific DTrace flags in DFLAGS + case $host in + *netbsd*) + DFLAGS="$DFLAGS -x nolibs" + ;; + esac fi PLATFORM_HEADERS= diff --git a/configure.ac b/configure.ac index 9412e3614c4206..07b005bacaf279 100644 --- a/configure.ac +++ b/configure.ac @@ -5113,16 +5113,33 @@ then # linked into the binary. Correspondingly, dtrace(1) is missing the ELF # generation flag '-G'. We check for presence of this flag, rather than # hardcoding support by OS, in the interest of robustness. + # + # NetBSD DTrace requires the -x nolibs flag to avoid system library conflicts + # and uses header generation for testing instead of object generation. AC_CACHE_CHECK([whether DTrace probes require linking], - [ac_cv_dtrace_link], [dnl + [ac_cv_dtrace_link], [ ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" $DFLAGS -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + case $host in + *netbsd*) + DTRACE_TEST_FLAGS="-x nolibs -h" + ;; + *) + DTRACE_TEST_FLAGS="-G" + ;; + esac + "$DTRACE" $DFLAGS $DTRACE_TEST_FLAGS -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes ]) if test "$ac_cv_dtrace_link" = "yes"; then DTRACE_OBJS="Python/pydtrace.o" fi + # Set NetBSD-specific DTrace flags in DFLAGS + case $host in + *netbsd*) + DFLAGS="$DFLAGS -x nolibs" + ;; + esac fi dnl Platform-specific C and header files. From 4e8f5e65ebeb8c270d0114ffe2e6b5b204d82301 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:33:30 +0200 Subject: [PATCH 1107/1674] [3.14] gh-137490: Fix signal.sigwaitinfo() on NetBSD (GH-137523) (GH-138935) Handle ECANCELED in the same way as EINTR to work around the Posix violation in the NetBSD's implementation. (cherry picked from commit 07d0b95b05dfaf5832f44c2fbc956761f9e29571) Co-authored-by: Serhiy Storchaka --- .../2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst | 2 ++ Modules/signalmodule.c | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst diff --git a/Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst b/Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst new file mode 100644 index 00000000000000..bcb0938b8e3acb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst @@ -0,0 +1,2 @@ +Handle :data:`~errno.ECANCELED` in the same way as :data:`~errno.EINTR` in +:func:`signal.sigwaitinfo` on NetBSD. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index c25e695e7ff5fa..d7edbc09242fad 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1180,7 +1180,13 @@ signal_sigwaitinfo_impl(PyObject *module, sigset_t sigset) err = sigwaitinfo(&sigset, &si); Py_END_ALLOW_THREADS } while (err == -1 - && errno == EINTR && !(async_err = PyErr_CheckSignals())); + && (errno == EINTR +#if defined(__NetBSD__) + /* NetBSD's implementation violates POSIX by setting + * errno to ECANCELED instead of EINTR. */ + || errno == ECANCELED +#endif + ) && !(async_err = PyErr_CheckSignals())); if (err == -1) return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL; From 5579708b1c7ff4a1c2dffe0be9f8500336534651 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:34:51 +0200 Subject: [PATCH 1108/1674] [3.14] gh-60462: Fix locale.strxfrm() on Solaris (GH-138242) (GH-138448) It should interpret the result of wcsxfrm() as a sequence of abstract integers, not a sequence of Unicode code points or using other encoding scheme that does not preserve ordering. (cherry picked from commit 482fd0c811a366f25bd076fc73bf37ffb6b3081e) Co-authored-by: Serhiy Storchaka --- ...5-08-30-10-04-28.gh-issue-60462.yh_vDc.rst | 1 + Modules/_localemodule.c | 49 ++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst diff --git a/Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst b/Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst new file mode 100644 index 00000000000000..1365b1bfdf28f6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst @@ -0,0 +1 @@ +Fix :func:`locale.strxfrm` on Solaris (and possibly other platforms). diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index ae36130964c149..cb448b14d8cd63 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -485,7 +485,54 @@ _locale_strxfrm_impl(PyObject *module, PyObject *str) goto exit; } } - result = PyUnicode_FromWideChar(buf, n2); + /* The result is just a sequence of integers, they are not necessary + Unicode code points, so PyUnicode_FromWideChar() cannot be used + here. For example, 0xD83D 0xDC0D should not be larger than 0xFF41. + */ +#if SIZEOF_WCHAR_T == 4 + { + /* Some codes can exceed the range of Unicode code points + (0 - 0x10FFFF), so they cannot be directly used in + PyUnicode_FromKindAndData(). They should be first encoded in + a way that preserves the lexicographical order. + + Codes in the range 0-0xFFFF represent themself. + Codes larger than 0xFFFF are encoded as a pair: + * 0x1xxxx -- the highest 16 bits + * 0x0xxxx -- the lowest 16 bits + */ + size_t n3 = 0; + for (size_t i = 0; i < n2; i++) { + if ((Py_UCS4)buf[i] > 0x10000u) { + n3++; + } + } + if (n3) { + n3 += n2; // no integer overflow + Py_UCS4 *buf2 = PyMem_New(Py_UCS4, n3); + if (buf2 == NULL) { + PyErr_NoMemory(); + goto exit; + } + size_t j = 0; + for (size_t i = 0; i < n2; i++) { + Py_UCS4 c = (Py_UCS4)buf[i]; + if (c > 0x10000u) { + buf2[j++] = (c >> 16) | 0x10000u; + buf2[j++] = c & 0xFFFFu; + } + else { + buf2[j++] = c; + } + } + assert(j == n3); + result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buf2, n3); + PyMem_Free(buf2); + goto exit; + } + } +#endif + result = PyUnicode_FromKindAndData(sizeof(wchar_t), buf, n2); exit: PyMem_Free(buf); PyMem_Free(s); From fb223e691e1f95126d3bebfcf20138c66d7d76d7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:44:16 +0200 Subject: [PATCH 1109/1674] [3.14] GH-137573: Add test to check that the margin used for overflow protection is larger than the stack space used by the interpreter (GH-137724) (GH-139295) (cherry picked from commit 16eae6d90d49ef036b010777ceffd130cfa96126) Co-authored-by: Mark Shannon Co-authored-by: Petr Viktorin --- Lib/test/test_call.py | 16 ++++++++++++++++ Modules/_testinternalcapi.c | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 2c28f106ec7cb6..fcbef1ae86bed5 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -12,6 +12,10 @@ import _testlimitedcapi except ImportError: _testlimitedcapi = None +try: + import _testinternalcapi +except ImportError: + _testinternalcapi = None import struct import collections import itertools @@ -1037,6 +1041,18 @@ def test_unexpected_keyword_suggestion_via_getargs(self): @cpython_only class TestRecursion(unittest.TestCase): + def test_margin_is_sufficient(self): + + def get_sp(): + return _testinternalcapi.get_stack_pointer() + + this_sp = _testinternalcapi.get_stack_pointer() + lower_sp = _testcapi.pyobject_vectorcall(get_sp, (), ()) + self.assertLess(lower_sp, this_sp) + # Add an (arbitrary) extra 20% for safety + safe_margin = (this_sp - lower_sp) * 6 / 5 + self.assertLess(safe_margin, _testinternalcapi.get_stack_margin()) + @skip_on_s390x @unittest.skipIf(is_wasi and Py_DEBUG, "requires deep stack") @skip_if_sanitizer("requires deep stack", thread=True) diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index f84cf1a4263a2d..afb72d3df83236 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -125,6 +125,18 @@ get_c_recursion_remaining(PyObject *self, PyObject *Py_UNUSED(args)) return PyLong_FromLong(remaining); } +static PyObject* +get_stack_pointer(PyObject *self, PyObject *Py_UNUSED(args)) +{ + uintptr_t here_addr = _Py_get_machine_stack_pointer(); + return PyLong_FromSize_t(here_addr); +} + +static PyObject* +get_stack_margin(PyObject *self, PyObject *Py_UNUSED(args)) +{ + return PyLong_FromSize_t(_PyOS_STACK_MARGIN_BYTES); +} static PyObject* test_bswap(PyObject *self, PyObject *Py_UNUSED(args)) @@ -2381,6 +2393,8 @@ static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, {"get_c_recursion_remaining", get_c_recursion_remaining, METH_NOARGS}, + {"get_stack_pointer", get_stack_pointer, METH_NOARGS}, + {"get_stack_margin", get_stack_margin, METH_NOARGS}, {"test_bswap", test_bswap, METH_NOARGS}, {"test_popcount", test_popcount, METH_NOARGS}, {"test_bit_length", test_bit_length, METH_NOARGS}, From c05053589f15d1f0fefef72740b3f5c062286e2c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:46:41 +0200 Subject: [PATCH 1110/1674] [3.14] gh-101100: Fix some Sphinx reference warnings in ``whatsnew/2.6.rst`` (GH-139236) (GH-139568) (cherry picked from commit 04a2f80a604ccb214902f35deebf0d075543737c) Co-authored-by: rowanbudge Co-authored-by: rowanvil Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com> --- Doc/whatsnew/2.6.rst | 174 +++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 82 deletions(-) diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 8519619ba8b7aa..243ab85d4296b5 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -56,7 +56,7 @@ Python 2.6 incorporates new features and syntax from 3.0 while remaining compatible with existing code by not removing older features or syntax. When it's not possible to do that, Python 2.6 tries to do what it can, adding compatibility functions in a -:mod:`future_builtins` module and a :option:`!-3` switch to warn about +:mod:`!future_builtins` module and a :option:`!-3` switch to warn about usages that will become unsupported in 3.0. Some significant new packages have been added to the standard library, @@ -109,7 +109,7 @@ are: Python 3.0 adds several new built-in functions and changes the semantics of some existing builtins. Functions that are new in 3.0 such as :func:`bin` have simply been added to Python 2.6, but existing -builtins haven't been changed; instead, the :mod:`future_builtins` +builtins haven't been changed; instead, the :mod:`!future_builtins` module has versions with the new 3.0 semantics. Code written to be compatible with 3.0 can do ``from future_builtins import hex, map`` as necessary. @@ -118,7 +118,7 @@ A new command-line switch, :option:`!-3`, enables warnings 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`, +to Python code as the boolean variable :data:`!sys.py3kwarning`, and to C extension code as :c:data:`!Py_Py3kWarningFlag`. .. seealso:: @@ -307,9 +307,9 @@ The :mod:`threading` module's locks and condition variables also support the The lock is acquired before the block is executed and always released once the block is complete. -The :func:`localcontext` function in the :mod:`decimal` module makes it easy -to save and restore the current decimal context, which encapsulates the desired -precision and rounding characteristics for computations:: +The :func:`~decimal.localcontext` function in the :mod:`decimal` module makes +it easy to save and restore the current decimal context, which encapsulates +the desired precision and rounding characteristics for computations:: from decimal import Decimal, Context, localcontext @@ -337,12 +337,12 @@ 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:`~object.__enter__` and :meth:`~object.__exit__` - methods. + manager". The context manager must have :meth:`~object.__enter__` and + :meth:`~object.__exit__` methods. -* 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 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. @@ -378,7 +378,7 @@ be to let the user write code like this:: The transaction should be committed if the code in the block runs flawlessly or rolled back if there's an exception. Here's the basic interface for -:class:`DatabaseConnection` that I'll assume:: +:class:`!DatabaseConnection` that I'll assume:: class DatabaseConnection: # Database interface @@ -431,14 +431,15 @@ The contextlib module The :mod:`contextlib` module provides some functions and a decorator that 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:`~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:`~object.__exit__` method. Any exception raised in the block will -be raised by the :keyword:`!yield` statement. +The decorator is called :func:`~contextlib.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:`~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:`~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 could be written as:: @@ -469,7 +470,7 @@ statement both starts a database transaction and acquires a thread lock:: with nested (db_transaction(db), lock) as (cursor, locked): ... -Finally, the :func:`closing` function returns its argument so that it can be +Finally, the :func:`~contextlib.closing` function returns its argument so that it can be bound to a variable, and calls the argument's ``.close()`` method at the end of the block. :: @@ -538,7 +539,7 @@ If you don't like the default directory, it can be overridden by an environment variable. :envvar:`PYTHONUSERBASE` sets the root directory used for all Python versions supporting this feature. On Windows, the directory for application-specific data can be changed by -setting the :envvar:`APPDATA` environment variable. You can also +setting the :envvar:`!APPDATA` environment variable. You can also modify the :file:`site.py` file for your Python installation. The feature can be disabled entirely by running Python with the @@ -568,11 +569,12 @@ The :mod:`multiprocessing` module started out as an exact emulation of the :mod:`threading` module using processes instead of threads. That goal was discarded along the path to Python 2.6, but the general approach of the module is still similar. The fundamental class -is the :class:`Process`, which is passed a callable object and -a collection of arguments. The :meth:`start` method +is the :class:`~multiprocessing.Process`, which is passed a callable object and +a collection of arguments. The :meth:`~multiprocessing.Process.start` method sets the callable running in a subprocess, after which you can call -the :meth:`is_alive` method to check whether the subprocess is still running -and the :meth:`join` method to wait for the process to exit. +the :meth:`~multiprocessing.Process.is_alive` method to check whether the +subprocess is still running and the :meth:`~multiprocessing.Process.join` +method to wait for the process to exit. Here's a simple example where the subprocess will calculate a factorial. The function doing the calculation is written strangely so @@ -619,13 +621,16 @@ the object to communicate. (If the parent were to change the value of the global variable, the child's value would be unaffected, and vice versa.) -Two other classes, :class:`Pool` and :class:`Manager`, provide -higher-level interfaces. :class:`Pool` will create a fixed number of -worker processes, and requests can then be distributed to the workers -by calling :meth:`apply` or :meth:`apply_async` to add a single request, -and :meth:`map` or :meth:`map_async` to add a number of -requests. The following code uses a :class:`Pool` to spread requests -across 5 worker processes and retrieve a list of results:: +Two other classes, :class:`~multiprocessing.pool.Pool` and +:class:`~multiprocessing.Manager`, provide higher-level interfaces. +:class:`~multiprocessing.pool.Pool` will create a fixed number of worker +processes, and requests can then be distributed to the workers by calling +:meth:`~multiprocessing.pool.Pool.apply` or +:meth:`~multiprocessing.pool.Pool.apply_async` to add a single request, and +:meth:`~multiprocessing.pool.Pool.map` or +:meth:`~multiprocessing.pool.Pool.map_async` to add a number of +requests. The following code uses a :class:`~multiprocessing.pool.Pool` to +spread requests across 5 worker processes and retrieve a list of results:: from multiprocessing import Pool @@ -646,15 +651,18 @@ This produces the following output:: 33452526613163807108170062053440751665152000000000 ... -The other high-level interface, the :class:`Manager` class, creates a -separate server process that can hold master copies of Python data +The other high-level interface, the :class:`~multiprocessing.Manager` class, +creates a separate server process that can hold master copies of Python data structures. Other processes can then access and modify these data structures using proxy objects. The following example creates a shared dictionary by calling the :meth:`dict` method; the worker processes then insert values into the dictionary. (Locking is not done for you automatically, which doesn't matter in this example. -:class:`Manager`'s methods also include :meth:`Lock`, :meth:`RLock`, -and :meth:`Semaphore` to create shared locks.) +:class:`~multiprocessing.Manager`'s methods also include +:meth:`~multiprocessing.managers.SyncManager.Lock`, +:meth:`~multiprocessing.managers.SyncManager.RLock`, +and :meth:`~multiprocessing.managers.SyncManager.Semaphore` to create +shared locks.) :: @@ -824,7 +832,7 @@ documentation for a :ref:`complete list `; here's a sample: format, followed by a percent sign. ===== ======================================================================== -Classes and types can define a :meth:`__format__` method to control how they're +Classes and types can define a :meth:`~object.__format__` method to control how they're formatted. It receives a single argument, the format specifier:: def __format__(self, format_spec): @@ -834,7 +842,7 @@ formatted. It receives a single argument, the format specifier:: return str(self) There's also a :func:`format` builtin that will format a single -value. It calls the type's :meth:`__format__` method with the +value. It calls the type's :meth:`~object.__format__` method with the provided specifier:: >>> format(75.6564, '.2f') @@ -1029,56 +1037,58 @@ PEP 3116: New I/O Library Python's built-in file objects support a number of methods, but file-like objects don't necessarily support all of them. Objects that -imitate files usually support :meth:`read` and :meth:`write`, but they -may not support :meth:`readline`, for example. Python 3.0 introduces -a layered I/O library in the :mod:`io` module that separates buffering -and text-handling features from the fundamental read and write -operations. +imitate files usually support :meth:`!read` and +:meth:`!write`, but they may not support :meth:`!readline`, +for example. Python 3.0 introduces a layered I/O library in the :mod:`io` +module that separates buffering and text-handling features from the +fundamental read and write operations. There are three levels of abstract base classes provided by the :mod:`io` module: -* :class:`RawIOBase` defines raw I/O operations: :meth:`read`, - :meth:`readinto`, - :meth:`write`, :meth:`seek`, :meth:`tell`, :meth:`truncate`, - and :meth:`close`. +* :class:`~io.RawIOBase` defines raw I/O operations: :meth:`~io.RawIOBase.read`, + :meth:`~io.RawIOBase.readinto`, :meth:`~io.RawIOBase.write`, + :meth:`~io.IOBase.seek`, :meth:`~io.IOBase.tell`, :meth:`~io.IOBase.truncate`, + and :meth:`~io.IOBase.close`. Most of the methods of this class will often map to a single system call. - There are also :meth:`readable`, :meth:`writable`, and :meth:`seekable` - methods for determining what operations a given object will allow. + There are also :meth:`~io.IOBase.readable`, :meth:`~io.IOBase.writable`, + and :meth:`~io.IOBase.seekable` methods for determining what operations a + given object will allow. Python 3.0 has concrete implementations of this class for files and sockets, but Python 2.6 hasn't restructured its file and socket objects in this way. -* :class:`BufferedIOBase` is an abstract base class that +* :class:`~io.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. - It supports all of the methods of :class:`RawIOBase`, - and adds a :attr:`raw` attribute holding the underlying raw object. + It supports all of the methods of :class:`~io.RawIOBase`, + and adds a :attr:`~io.BufferedIOBase.raw` attribute holding the underlying + raw object. There are five concrete classes implementing this ABC. - :class:`BufferedWriter` and :class:`BufferedReader` are for objects - that support write-only or read-only usage that have a :meth:`seek` - method for random access. :class:`BufferedRandom` objects support + :class:`~io.BufferedWriter` and :class:`~io.BufferedReader` are for objects + that support write-only or read-only usage that have a :meth:`~io.IOBase.seek` + method for random access. :class:`~io.BufferedRandom` objects support read and write access upon the same underlying stream, and - :class:`BufferedRWPair` is for objects such as TTYs that have both + :class:`~io.BufferedRWPair` is for objects such as TTYs that have both read and write operations acting upon unconnected streams of data. - The :class:`BytesIO` class supports reading, writing, and seeking + The :class:`~io.BytesIO` class supports reading, writing, and seeking over an in-memory buffer. .. index:: single: universal newlines; What's new -* :class:`TextIOBase`: Provides functions for reading and writing +* :class:`~io.TextIOBase`: Provides functions for reading and writing strings (remember, strings will be Unicode in Python 3.0), - and supporting :term:`universal newlines`. :class:`TextIOBase` defines + and supporting :term:`universal newlines`. :class:`~io.TextIOBase` defines the :meth:`readline` method and supports iteration upon objects. - There are two concrete implementations. :class:`TextIOWrapper` + There are two concrete implementations. :class:`~io.TextIOWrapper` wraps a buffered I/O object, supporting all of the methods for - text I/O and adding a :attr:`buffer` attribute for access - to the underlying object. :class:`StringIO` simply buffers + text I/O and adding a :attr:`~io.TextIOBase.buffer` attribute for access + to the underlying object. :class:`~io.StringIO` simply buffers everything in memory without ever writing anything to disk. (In Python 2.6, :class:`io.StringIO` is implemented in @@ -1162,7 +1172,7 @@ Some object-oriented languages such as Java support interfaces, declaring that a class has a given set of methods or supports a given access protocol. Abstract Base Classes (or ABCs) are an equivalent feature for Python. The ABC support consists of an :mod:`abc` module -containing a metaclass called :class:`ABCMeta`, special handling of +containing a metaclass called :class:`~abc.ABCMeta`, special handling of this metaclass by the :func:`isinstance` and :func:`issubclass` builtins, and a collection of basic ABCs that the Python developers think will be widely useful. Future versions of Python will probably @@ -1172,17 +1182,17 @@ Let's say you have a particular class and wish to know whether it supports dictionary-style access. The phrase "dictionary-style" is vague, however. It probably means that accessing items with ``obj[1]`` works. Does it imply that setting items with ``obj[2] = value`` works? -Or that the object will have :meth:`keys`, :meth:`values`, and :meth:`items` -methods? What about the iterative variants such as :meth:`iterkeys`? :meth:`copy` -and :meth:`update`? Iterating over the object with :func:`iter`? +Or that the object will have :meth:`!keys`, :meth:`!values`, and :meth:`!items` +methods? What about the iterative variants such as :meth:`!iterkeys`? +:meth:`!copy`and :meth:`!update`? Iterating over the object with :func:`!iter`? The Python 2.6 :mod:`collections` module includes a number of different ABCs that represent these distinctions. :class:`Iterable` -indicates that a class defines :meth:`__iter__`, and -:class:`Container` means the class defines a :meth:`__contains__` +indicates that a class defines :meth:`~object.__iter__`, and +:class:`Container` means the class defines a :meth:`~object.__contains__` method and therefore supports ``x in y`` expressions. The basic dictionary interface of getting items, setting items, and -:meth:`keys`, :meth:`values`, and :meth:`items`, is defined by the +:meth:`!keys`, :meth:`!values`, and :meth:`!items`, is defined by the :class:`MutableMapping` ABC. You can derive your own classes from a particular ABC @@ -1196,7 +1206,7 @@ to indicate they support that ABC's interface:: Alternatively, you could write the class without deriving from the desired ABC and instead register the class by -calling the ABC's :meth:`register` method:: +calling the ABC's :meth:`~abc.ABCMeta.register` method:: import collections @@ -1206,10 +1216,10 @@ calling the ABC's :meth:`register` method:: collections.MutableMapping.register(Storage) For classes that you write, deriving from the ABC is probably clearer. -The :meth:`register` method is useful when you've written a new +The :meth:`~abc.ABCMeta.register` method is useful when you've written a new ABC that can describe an existing type or class, or if you want to declare that some third-party class implements an ABC. -For example, if you defined a :class:`PrintableType` ABC, +For example, if you defined a :class:`!PrintableType` ABC, it's legal to do:: # Register Python's types @@ -1256,16 +1266,16 @@ metaclass in a class definition:: ... -In the :class:`Drawable` ABC above, the :meth:`draw_doubled` method +In the :class:`!Drawable` ABC above, the :meth:`!draw_doubled` method renders the object at twice its size and can be implemented in terms -of other methods described in :class:`Drawable`. Classes implementing +of other methods described in :class:`!Drawable`. Classes implementing this ABC therefore don't need to provide their own implementation -of :meth:`draw_doubled`, though they can do so. An implementation -of :meth:`draw` is necessary, though; the ABC can't provide +of :meth:`!draw_doubled`, though they can do so. An implementation +of :meth:`!draw` is necessary, though; the ABC can't provide a useful generic implementation. -You can apply the ``@abstractmethod`` decorator to methods such as -:meth:`draw` that must be implemented; Python will then raise an +You can apply the :deco:`~abc.abstractmethod` decorator to methods such as +:meth:`!draw` that must be implemented; Python will then raise an exception for classes that don't define the method. Note that the exception is only raised when you actually try to create an instance of a subclass lacking the method:: @@ -1289,7 +1299,7 @@ Abstract data attributes can be declared using the def readonly(self): return self._x -Subclasses must then define a :meth:`readonly` property. +Subclasses must then define a ``readonly`` property. .. seealso:: @@ -2739,13 +2749,13 @@ numbers. .. ====================================================================== -The :mod:`future_builtins` module +The :mod:`!future_builtins` module -------------------------------------- Python 3.0 makes many changes to the repertoire of built-in functions, and most of the changes can't be introduced in the Python 2.x series because they would break compatibility. -The :mod:`future_builtins` module provides versions +The :mod:`!future_builtins` module provides versions of these built-in functions that can be imported when writing 3.0-compatible code. From 7e23d3677000deacd368e8b94b6a32923f38446a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:48:06 +0200 Subject: [PATCH 1111/1674] [3.14] gh-137317: Fix inspect.signature() for class with wrapped __init__ or __new__ (GH-137862) (#138224) gh-137317: Fix inspect.signature() for class with wrapped __init__ or __new__ (GH-137862) Fixed several cases where __init__, __new__ or metaclass` __call__ is a descriptor that returns a wrapped function. (cherry picked from commit 025a2135eff848abf24f9dc52c81386eea9da397) Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> --- Lib/inspect.py | 12 +- Lib/test/test_inspect/test_inspect.py | 307 ++++++++++++++++-- ...-08-16-16-04-15.gh-issue-137317.Dl13B5.rst | 3 + 3 files changed, 287 insertions(+), 35 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index faaddadbb87d64..c642b5308ed384 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1916,17 +1916,21 @@ def _signature_get_user_defined_method(cls, method_name, *, follow_wrapper_chain if meth is None: return None + # NOTE: The meth may wraps a non-user-defined callable. + # In this case, we treat the meth as non-user-defined callable too. + # (e.g. cls.__new__ generated by @warnings.deprecated) + unwrapped_meth = None if follow_wrapper_chains: - meth = unwrap(meth, stop=(lambda m: hasattr(m, "__signature__") + unwrapped_meth = unwrap(meth, stop=(lambda m: hasattr(m, "__signature__") or _signature_is_builtin(m))) - if isinstance(meth, _NonUserDefinedCallables): + + if (isinstance(meth, _NonUserDefinedCallables) + or isinstance(unwrapped_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) - if follow_wrapper_chains: - meth = unwrap(meth, stop=lambda m: hasattr(m, "__signature__")) return meth diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 148d4779456422..0c4c878ea492c8 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -148,6 +148,29 @@ def meth_self_o(self, object, /): pass def meth_type_noargs(type, /): pass def meth_type_o(type, object, /): pass +# Decorator decorator that returns a simple wrapped function +def identity_wrapper(func): + @functools.wraps(func) + def wrapped(*args, **kwargs): + return func(*args, **kwargs) + return wrapped + +# Original signature of the simple wrapped function returned by +# identity_wrapper(). +varargs_signature = ( + (('args', ..., ..., 'var_positional'), + ('kwargs', ..., ..., 'var_keyword')), + ..., +) + +# Decorator decorator that returns a simple descriptor +class custom_descriptor: + def __init__(self, func): + self.func = func + + def __get__(self, instance, owner): + return self.func.__get__(instance, owner) + class TestPredicates(IsTestBase): @@ -4068,44 +4091,266 @@ def __init__(self, b): ('bar', 2, ..., "keyword_only")), ...)) - def test_signature_on_class_with_decorated_new(self): - def identity(func): - @functools.wraps(func) - def wrapped(*args, **kwargs): - return func(*args, **kwargs) - return wrapped - - class Foo: - @identity - def __new__(cls, a, b): + def test_signature_on_class_with_wrapped_metaclass_call(self): + class CM(type): + @identity_wrapper + def __call__(cls, a): + pass + class C(metaclass=CM): + def __init__(self, b): pass - self.assertEqual(self.signature(Foo), - ((('a', ..., ..., "positional_or_keyword"), - ('b', ..., ..., "positional_or_keyword")), + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), ...)) - self.assertEqual(self.signature(Foo.__new__), - ((('cls', ..., ..., "positional_or_keyword"), - ('a', ..., ..., "positional_or_keyword"), - ('b', ..., ..., "positional_or_keyword")), - ...)) + with self.subTest('classmethod'): + class CM(type): + @classmethod + @identity_wrapper + def __call__(cls, a): + return a + class C(metaclass=CM): + def __init__(self, b): + pass - class Bar: - __new__ = identity(object.__new__) + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) - varargs_signature = ( - (('args', ..., ..., 'var_positional'), - ('kwargs', ..., ..., 'var_keyword')), - ..., - ) + with self.subTest('staticmethod'): + class CM(type): + @staticmethod + @identity_wrapper + def __call__(a): + return a + class C(metaclass=CM): + def __init__(self, b): + pass + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('MethodType'): + class A: + @identity_wrapper + def call(self, a): + return a + class CM(type): + __call__ = A().call + class C(metaclass=CM): + def __init__(self, b): + pass + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('descriptor'): + class CM(type): + @custom_descriptor + @identity_wrapper + def __call__(self, a): + return a + class C(metaclass=CM): + def __init__(self, b): + pass + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + self.assertEqual(self.signature(C.__call__), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + self.assertEqual(self.signature(C, follow_wrapped=False), + varargs_signature) + self.assertEqual(self.signature(C.__call__, follow_wrapped=False), + varargs_signature) + + def test_signature_on_class_with_wrapped_init(self): + class C: + @identity_wrapper + def __init__(self, b): + pass + + C(1) # does not raise + self.assertEqual(self.signature(C), + ((('b', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('classmethod'): + class C: + @classmethod + @identity_wrapper + def __init__(cls, b): + pass + + C(1) # does not raise + self.assertEqual(self.signature(C), + ((('b', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('staticmethod'): + class C: + @staticmethod + @identity_wrapper + def __init__(b): + pass + + C(1) # does not raise + self.assertEqual(self.signature(C), + ((('b', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('MethodType'): + class A: + @identity_wrapper + def call(self, a): + pass + + class C: + __init__ = A().call + + C(1) # does not raise + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('partial'): + class C: + __init__ = functools.partial(identity_wrapper(lambda x, a, b: None), 2) + + C(1) # does not raise + self.assertEqual(self.signature(C), + ((('b', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('partialmethod'): + class C: + @identity_wrapper + def _init(self, x, a): + self.a = (x, a) + __init__ = functools.partialmethod(_init, 2) + + self.assertEqual(C(1).a, (2, 1)) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('descriptor'): + class C: + @custom_descriptor + @identity_wrapper + def __init__(self, a): + pass + + C(1) # does not raise + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + self.assertEqual(self.signature(C.__init__), + ((('self', ..., ..., "positional_or_keyword"), + ('a', ..., ..., "positional_or_keyword")), + ...)) + + self.assertEqual(self.signature(C, follow_wrapped=False), + varargs_signature) + self.assertEqual(self.signature(C.__new__, follow_wrapped=False), + varargs_signature) + + def test_signature_on_class_with_wrapped_new(self): + with self.subTest('FunctionType'): + class C: + @identity_wrapper + def __new__(cls, a): + return a + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('classmethod'): + class C: + @classmethod + @identity_wrapper + def __new__(cls, cls2, a): + return a + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('staticmethod'): + class C: + @staticmethod + @identity_wrapper + def __new__(cls, a): + return a + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('MethodType'): + class A: + @identity_wrapper + def call(self, cls, a): + return a + class C: + __new__ = A().call + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('partial'): + class C: + __new__ = functools.partial(identity_wrapper(lambda x, cls, a: (x, a)), 2) + + self.assertEqual(C(1), (2, 1)) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('partialmethod'): + class C: + __new__ = functools.partialmethod(identity_wrapper(lambda cls, x, a: (x, a)), 2) + + self.assertEqual(C(1), (2, 1)) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + + with self.subTest('descriptor'): + class C: + @custom_descriptor + @identity_wrapper + def __new__(cls, a): + return a + + self.assertEqual(C(1), 1) + self.assertEqual(self.signature(C), + ((('a', ..., ..., "positional_or_keyword"),), + ...)) + self.assertEqual(self.signature(C.__new__), + ((('cls', ..., ..., "positional_or_keyword"), + ('a', ..., ..., "positional_or_keyword")), + ...)) - self.assertEqual(self.signature(Bar), ((), ...)) - self.assertEqual(self.signature(Bar.__new__), varargs_signature) - self.assertEqual(self.signature(Bar, follow_wrapped=False), - varargs_signature) - self.assertEqual(self.signature(Bar.__new__, follow_wrapped=False), - varargs_signature) + self.assertEqual(self.signature(C, follow_wrapped=False), + varargs_signature) + self.assertEqual(self.signature(C.__new__, follow_wrapped=False), + varargs_signature) def test_signature_on_class_with_init(self): class C: diff --git a/Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst b/Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst new file mode 100644 index 00000000000000..026cc320455963 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst @@ -0,0 +1,3 @@ +:func:`inspect.signature` now correctly handles classes that use a descriptor +on a wrapped :meth:`!__init__` or :meth:`!__new__` method. +Contributed by Yongyu Yan. From d729fcf6e372ccc49ee15948ef1bab320af95a0b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:52:08 +0200 Subject: [PATCH 1112/1674] [3.14] gh-137589: Zipfile tests: close file objects (GH-138080) (#139766) gh-137589: Zipfile tests: close file objects (GH-138080) Zipfile tests: close file objects (cherry picked from commit 5cea8435943b4f9d22c89c80d86c2ba3b392c6f9) Co-authored-by: Rogdham <3994389+Rogdham@users.noreply.github.com> --- Lib/test/test_zipfile/_path/test_path.py | 11 +++++--- Lib/test/test_zipfile/test_core.py | 34 +++++++++++++----------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_zipfile/_path/test_path.py b/Lib/test/test_zipfile/_path/test_path.py index 696134023a56b9..351d9eefeb09a5 100644 --- a/Lib/test/test_zipfile/_path/test_path.py +++ b/Lib/test/test_zipfile/_path/test_path.py @@ -274,7 +274,8 @@ def test_pathlike_construction(self, alpharep): """ zipfile_ondisk = self.zipfile_ondisk(alpharep) pathlike = FakePath(str(zipfile_ondisk)) - zipfile.Path(pathlike) + root = zipfile.Path(pathlike) + root.root.close() @pass_alpharep def test_traverse_pathlike(self, alpharep): @@ -373,6 +374,7 @@ def test_root_on_disk(self, alpharep): root = zipfile.Path(self.zipfile_ondisk(alpharep)) assert root.name == 'alpharep.zip' == root.filename.name assert root.stem == 'alpharep' == root.filename.stem + root.root.close() @pass_alpharep def test_suffix(self, alpharep): @@ -574,11 +576,13 @@ def test_inheritance(self, alpharep): ) def test_pickle(self, alpharep, path_type, subpath): zipfile_ondisk = path_type(str(self.zipfile_ondisk(alpharep))) - - saved_1 = pickle.dumps(zipfile.Path(zipfile_ondisk, at=subpath)) + root = zipfile.Path(zipfile_ondisk, at=subpath) + saved_1 = pickle.dumps(root) + root.root.close() restored_1 = pickle.loads(saved_1) first, *rest = restored_1.iterdir() assert first.read_text(encoding='utf-8').startswith('content of ') + restored_1.root.close() @pass_alpharep def test_extract_orig_with_implied_dirs(self, alpharep): @@ -590,6 +594,7 @@ def test_extract_orig_with_implied_dirs(self, alpharep): # wrap the zipfile for its side effect zipfile.Path(zf) zf.extractall(source_path.parent) + zf.close() @pass_alpharep def test_getinfo_missing(self, alpharep): diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index 6acfefc74d6665..1edb5dde998658 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -312,26 +312,26 @@ def test_low_compression(self): self.assertEqual(openobj.read(1), b'2') def test_writestr_compression(self): - zipfp = zipfile.ZipFile(TESTFN2, "w") - zipfp.writestr("b.txt", "hello world", compress_type=self.compression) - info = zipfp.getinfo('b.txt') - self.assertEqual(info.compress_type, self.compression) + with zipfile.ZipFile(TESTFN2, "w") as zipfp: + zipfp.writestr("b.txt", "hello world", compress_type=self.compression) + info = zipfp.getinfo('b.txt') + self.assertEqual(info.compress_type, self.compression) def test_writestr_compresslevel(self): - zipfp = zipfile.ZipFile(TESTFN2, "w", compresslevel=1) - zipfp.writestr("a.txt", "hello world", compress_type=self.compression) - zipfp.writestr("b.txt", "hello world", compress_type=self.compression, - compresslevel=2) + with zipfile.ZipFile(TESTFN2, "w", compresslevel=1) as zipfp: + zipfp.writestr("a.txt", "hello world", compress_type=self.compression) + zipfp.writestr("b.txt", "hello world", compress_type=self.compression, + compresslevel=2) - # Compression level follows the constructor. - a_info = zipfp.getinfo('a.txt') - self.assertEqual(a_info.compress_type, self.compression) - self.assertEqual(a_info.compress_level, 1) + # Compression level follows the constructor. + a_info = zipfp.getinfo('a.txt') + self.assertEqual(a_info.compress_type, self.compression) + self.assertEqual(a_info.compress_level, 1) - # Compression level is overridden. - b_info = zipfp.getinfo('b.txt') - self.assertEqual(b_info.compress_type, self.compression) - self.assertEqual(b_info._compresslevel, 2) + # Compression level is overridden. + b_info = zipfp.getinfo('b.txt') + self.assertEqual(b_info.compress_type, self.compression) + self.assertEqual(b_info._compresslevel, 2) def test_read_return_size(self): # Issue #9837: ZipExtFile.read() shouldn't return more bytes @@ -2330,6 +2330,7 @@ def test_empty_zipfile(self): zipf = zipfile.ZipFile(TESTFN, mode="r") except zipfile.BadZipFile: self.fail("Unable to create empty ZIP file in 'w' mode") + zipf.close() zipf = zipfile.ZipFile(TESTFN, mode="a") zipf.close() @@ -2337,6 +2338,7 @@ def test_empty_zipfile(self): zipf = zipfile.ZipFile(TESTFN, mode="r") except: self.fail("Unable to create empty ZIP file in 'a' mode") + zipf.close() def test_open_empty_file(self): # Issue 1710703: Check that opening a file with less than 22 bytes From b5230d73a9c9893df0f00035a2c7ab0d61d83233 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:56:13 +0200 Subject: [PATCH 1113/1674] [3.14] gh-83424: Allow empty name if handle is non-null when create ctypes.CDLL on Windows (GH-136878) (#138546) gh-83424: Allow empty name if handle is non-null when create ctypes.CDLL on Windows (GH-136878) (cherry picked from commit ed522ed211b7b9ea9d85a93b5d6ca79b2df3ef58) Co-authored-by: AN Long Co-authored-by: Petr Viktorin --- Lib/ctypes/__init__.py | 79 ++++++++++--------- Lib/test/test_ctypes/test_loading.py | 6 ++ ...5-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst | 2 + 3 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 823a3692fd1bbf..a41f4a16a5c6ee 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -108,7 +108,7 @@ class CFunctionType(_CFuncPtr): return CFunctionType if _os.name == "nt": - from _ctypes import LoadLibrary as _dlopen + from _ctypes import LoadLibrary as _LoadLibrary from _ctypes import FUNCFLAG_STDCALL as _FUNCFLAG_STDCALL _win_functype_cache = {} @@ -416,52 +416,59 @@ def __init__(self, name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None): + class _FuncPtr(_CFuncPtr): + _flags_ = self._func_flags_ + _restype_ = self._func_restype_ + if use_errno: + _flags_ |= _FUNCFLAG_USE_ERRNO + if use_last_error: + _flags_ |= _FUNCFLAG_USE_LASTERROR + + self._FuncPtr = _FuncPtr if name: name = _os.fspath(name) + self._handle = self._load_library(name, mode, handle, winmode) + + if _os.name == "nt": + def _load_library(self, name, mode, handle, winmode): + if winmode is None: + import nt as _nt + winmode = _nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS + # WINAPI LoadLibrary searches for a DLL if the given name + # is not fully qualified with an explicit drive. For POSIX + # compatibility, and because the DLL search path no longer + # contains the working directory, begin by fully resolving + # any name that contains a path separator. + if name is not None and ('/' in name or '\\' in name): + name = _nt._getfullpathname(name) + winmode |= _nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR + self._name = name + if handle is not None: + return handle + return _LoadLibrary(self._name, winmode) + + else: + def _load_library(self, name, mode, handle, winmode): # 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"): + if name and 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: - flags |= _FUNCFLAG_USE_ERRNO - if use_last_error: - flags |= _FUNCFLAG_USE_LASTERROR - if _sys.platform.startswith("aix"): - """When the name contains ".a(" and ends with ")", - e.g., "libFOO.a(libFOO.so)" - this is taken to be an - archive(member) syntax for dlopen(), and the mode is adjusted. - Otherwise, name is presented to dlopen() as a file argument. - """ - if name and name.endswith(")") and ".a(" in name: - mode |= ( _os.RTLD_MEMBER | _os.RTLD_NOW ) - if _os.name == "nt": - if winmode is not None: - mode = winmode - else: - import nt - mode = nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS - if '/' in name or '\\' in name: - self._name = nt._getfullpathname(self._name) - mode |= nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR - - class _FuncPtr(_CFuncPtr): - _flags_ = flags - _restype_ = self._func_restype_ - self._FuncPtr = _FuncPtr - - if handle is None: - self._handle = _dlopen(self._name, mode) - else: - self._handle = handle + if _sys.platform.startswith("aix"): + """When the name contains ".a(" and ends with ")", + e.g., "libFOO.a(libFOO.so)" - this is taken to be an + archive(member) syntax for dlopen(), and the mode is adjusted. + Otherwise, name is presented to dlopen() as a file argument. + """ + if name and name.endswith(")") and ".a(" in name: + mode |= _os.RTLD_MEMBER | _os.RTLD_NOW + self._name = name + return _dlopen(name, mode) def __repr__(self): return "<%s '%s', handle %x at %#x>" % \ diff --git a/Lib/test/test_ctypes/test_loading.py b/Lib/test/test_ctypes/test_loading.py index 13ed813ad98c31..3b8332fbb30928 100644 --- a/Lib/test/test_ctypes/test_loading.py +++ b/Lib/test/test_ctypes/test_loading.py @@ -100,6 +100,12 @@ def test_load_ordinal_functions(self): self.assertRaises(AttributeError, dll.__getitem__, 1234) + @unittest.skipUnless(os.name == "nt", 'Windows-specific test') + def test_load_without_name_and_with_handle(self): + handle = ctypes.windll.kernel32._handle + lib = ctypes.WinDLL(name=None, handle=handle) + self.assertIs(handle, lib._handle) + @unittest.skipUnless(os.name == "nt", 'Windows-specific test') def test_1703286_A(self): # On winXP 64-bit, advapi32 loads at an address that does diff --git a/Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst b/Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst new file mode 100644 index 00000000000000..0c1a16cdb29f43 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst @@ -0,0 +1,2 @@ +Allows creating a :class:`ctypes.CDLL` without name when passing a handle as +an argument. From d8bdc1e6f7e394cac8a682fa8209ceeb58acd80b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:14:19 +0200 Subject: [PATCH 1114/1674] [3.14] gh-133210: Fix `test_inspect` without docstrings (GH-139651) (#139776) gh-133210: Fix `test_inspect` without docstrings (GH-139651) (cherry picked from commit 7c70cc5c23971ef448ea59827c6e6ae310157356) Co-authored-by: sobolevn --- Lib/test/test_inspect/test_inspect.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 0c4c878ea492c8..94804eb135418a 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -4261,8 +4261,14 @@ def __init__(self, a): self.assertEqual(self.signature(C, follow_wrapped=False), varargs_signature) - self.assertEqual(self.signature(C.__new__, follow_wrapped=False), - varargs_signature) + if support.MISSING_C_DOCSTRINGS: + self.assertRaisesRegex( + ValueError, "no signature found", + self.signature, C.__new__, follow_wrapped=False, + ) + else: + self.assertEqual(self.signature(C.__new__, follow_wrapped=False), + varargs_signature) def test_signature_on_class_with_wrapped_new(self): with self.subTest('FunctionType'): From a96cde9f80e1b38250e5d9db466c290931575afd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:15:52 +0200 Subject: [PATCH 1115/1674] [3.14] gh-133210: Fix `test_pydoc` without docstrings (GH-139654) (#139777) gh-133210: Fix `test_pydoc` without docstrings (GH-139654) (cherry picked from commit 708de26e31b65cd3ae768882c8da59284917a80d) Co-authored-by: Mikhail Efimov --- Lib/test/test_pydoc/test_pydoc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index fb0a8bb7b2339b..5de99b8329bf74 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -1943,7 +1943,7 @@ def test_text_doc_routines_in_class(self, cls=pydocfodder.B): else: self.assertIn(' | get(...) method of builtins.dict instance', lines) self.assertIn(' | dict_get = get(...) method of builtins.dict instance', lines) - self.assertIn(' | sin(...)', lines) + self.assertIn(' | sin(object, /)', lines) lines = self.getsection(result, f' | Class methods {where}:', ' | ' + '-'*70) self.assertIn(' | B_classmethod(x)', lines) @@ -2033,7 +2033,7 @@ def test_text_doc_routines_in_module(self): if not support.MISSING_C_DOCSTRINGS: self.assertIn(' sin(x, /)', lines) else: - self.assertIn(' sin(...)', lines) + self.assertIn(' sin(object, /)', lines) def test_html_doc_routines_in_module(self): doc = pydoc.HTMLDoc() @@ -2078,7 +2078,7 @@ def test_html_doc_routines_in_module(self): if not support.MISSING_C_DOCSTRINGS: self.assertIn(' sin(x, /)', lines) else: - self.assertIn(' sin(...)', lines) + self.assertIn(' sin(object, /)', lines) @unittest.skipIf( From c5ab1b7661c9c39967b8c5309faab1be036637c5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:11:09 +0200 Subject: [PATCH 1116/1674] [3.14] GH-139590: Run `ruff format` on pre-commit for Tools/wasm (GH-139591) (#139744) Co-authored-by: Savannah Ostrowski Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .pre-commit-config.yaml | 4 + Tools/wasm/.ruff.toml | 28 ++ Tools/wasm/emscripten/__main__.py | 70 ++-- .../wasm/emscripten/prepare_external_wasm.py | 5 +- Tools/wasm/emscripten/wasm_assets.py | 4 +- Tools/wasm/emscripten/web_example/server.py | 10 +- Tools/wasm/wasi.py | 10 +- Tools/wasm/wasi/__main__.py | 324 +++++++++++------- Tools/wasm/wasm_build.py | 27 +- 9 files changed, 324 insertions(+), 158 deletions(-) create mode 100644 Tools/wasm/.ruff.toml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 014dab1d2b58be..0e00ffb3bd2d66 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,6 +34,10 @@ repos: name: Run Ruff (format) on Tools/build/check_warnings.py args: [--check, --config=Tools/build/.ruff.toml] files: ^Tools/build/check_warnings.py + - id: ruff-format + name: Run Ruff (format) on Tools/wasm/ + args: [--check, --config=Tools/wasm/.ruff.toml] + files: ^Tools/wasm/ - repo: https://github.com/psf/black-pre-commit-mirror rev: 25.9.0 diff --git a/Tools/wasm/.ruff.toml b/Tools/wasm/.ruff.toml new file mode 100644 index 00000000000000..aabcf8dc4f502e --- /dev/null +++ b/Tools/wasm/.ruff.toml @@ -0,0 +1,28 @@ +extend = "../../.ruff.toml" # Inherit the project-wide settings + +[format] +preview = true +docstring-code-format = true + +[lint] +select = [ + "C4", # flake8-comprehensions + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "ISC", # flake8-implicit-str-concat + "LOG", # flake8-logging + "PGH", # pygrep-hooks + "PT", # flake8-pytest-style + "PYI", # flake8-pyi + "RUF100", # Ban unused `# noqa` comments + "UP", # pyupgrade + "W", # pycodestyle + "YTT", # flake8-2020 +] +ignore = [ + "E501", # Line too long + "F541", # f-string without any placeholders + "PYI024", # Use `typing.NamedTuple` instead of `collections.namedtuple` + "PYI025", # Use `from collections.abc import Set as AbstractSet` +] diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index 202dd298199b56..fdf3142c0a3b1a 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -33,7 +33,9 @@ PREFIX_DIR = CROSS_BUILD_DIR / HOST_TRIPLE / "prefix" LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local" -LOCAL_SETUP_MARKER = "# Generated by Tools/wasm/emscripten.py\n".encode("utf-8") +LOCAL_SETUP_MARKER = "# Generated by Tools/wasm/emscripten.py\n".encode( + "utf-8" +) def updated_env(updates={}): @@ -45,7 +47,9 @@ def updated_env(updates={}): # https://reproducible-builds.org/docs/source-date-epoch/ git_epoch_cmd = ["git", "log", "-1", "--pretty=%ct"] try: - epoch = subprocess.check_output(git_epoch_cmd, encoding="utf-8").strip() + epoch = subprocess.check_output( + git_epoch_cmd, encoding="utf-8" + ).strip() env_defaults["SOURCE_DATE_EPOCH"] = epoch except subprocess.CalledProcessError: pass # Might be building from a tarball. @@ -79,7 +83,11 @@ def wrapper(context): terminal_width = 80 print("⎯" * terminal_width) print("📁", working_dir) - if clean_ok and getattr(context, "clean", False) and working_dir.exists(): + if ( + clean_ok + and getattr(context, "clean", False) + and working_dir.exists() + ): print("🚮 Deleting directory (--clean)...") shutil.rmtree(working_dir) @@ -128,7 +136,9 @@ def build_python_path(): if not binary.is_file(): binary = binary.with_suffix(".exe") if not binary.is_file(): - raise FileNotFoundError("Unable to find `python(.exe)` in " f"{NATIVE_BUILD_DIR}") + raise FileNotFoundError( + f"Unable to find `python(.exe)` in {NATIVE_BUILD_DIR}" + ) return binary @@ -158,7 +168,8 @@ def make_build_python(context, working_dir): cmd = [ binary, "-c", - "import sys; " "print(f'{sys.version_info.major}.{sys.version_info.minor}')", + "import sys; " + "print(f'{sys.version_info.major}.{sys.version_info.minor}')", ] version = subprocess.check_output(cmd, encoding="utf-8").strip() @@ -173,7 +184,9 @@ def check_shasum(file: str, expected_shasum: str): def download_and_unpack(working_dir: Path, url: str, expected_shasum: str): - with tempfile.NamedTemporaryFile(suffix=".tar.gz", delete_on_close=False) as tmp_file: + with tempfile.NamedTemporaryFile( + suffix=".tar.gz", delete_on_close=False + ) as tmp_file: with urlopen(url) as response: shutil.copyfileobj(response, tmp_file) tmp_file.close() @@ -186,7 +199,11 @@ def make_emscripten_libffi(context, working_dir): ver = "3.4.6" libffi_dir = working_dir / f"libffi-{ver}" shutil.rmtree(libffi_dir, ignore_errors=True) - download_and_unpack(working_dir, f"https://github.com/libffi/libffi/releases/download/v{ver}/libffi-{ver}.tar.gz", "b0dea9df23c863a7a50e825440f3ebffabd65df1497108e5d437747843895a4e") + download_and_unpack( + working_dir, + f"https://github.com/libffi/libffi/releases/download/v{ver}/libffi-{ver}.tar.gz", + "b0dea9df23c863a7a50e825440f3ebffabd65df1497108e5d437747843895a4e", + ) call( [EMSCRIPTEN_DIR / "make_libffi.sh"], env=updated_env({"PREFIX": PREFIX_DIR}), @@ -200,7 +217,11 @@ def make_mpdec(context, working_dir): ver = "4.0.1" mpdec_dir = working_dir / f"mpdecimal-{ver}" shutil.rmtree(mpdec_dir, ignore_errors=True) - download_and_unpack(working_dir, f"https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-{ver}.tar.gz", "96d33abb4bb0070c7be0fed4246cd38416188325f820468214471938545b1ac8") + download_and_unpack( + working_dir, + f"https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-{ver}.tar.gz", + "96d33abb4bb0070c7be0fed4246cd38416188325f820468214471938545b1ac8", + ) call( [ "emconfigure", @@ -214,10 +235,7 @@ def make_mpdec(context, working_dir): quiet=context.quiet, ) call( - [ - "make", - "install" - ], + ["make", "install"], cwd=mpdec_dir, quiet=context.quiet, ) @@ -226,17 +244,15 @@ def make_mpdec(context, working_dir): @subdir(HOST_DIR, clean_ok=True) def configure_emscripten_python(context, working_dir): """Configure the emscripten/host build.""" - config_site = os.fsdecode( - EMSCRIPTEN_DIR / "config.site-wasm32-emscripten" - ) + config_site = os.fsdecode(EMSCRIPTEN_DIR / "config.site-wasm32-emscripten") emscripten_build_dir = working_dir.relative_to(CHECKOUT) python_build_dir = NATIVE_BUILD_DIR / "build" lib_dirs = list(python_build_dir.glob("lib.*")) - assert ( - len(lib_dirs) == 1 - ), f"Expected a single lib.* directory in {python_build_dir}" + assert len(lib_dirs) == 1, ( + f"Expected a single lib.* directory in {python_build_dir}" + ) lib_dir = os.fsdecode(lib_dirs[0]) pydebug = lib_dir.endswith("-pydebug") python_version = lib_dir.removesuffix("-pydebug").rpartition("-")[-1] @@ -290,7 +306,9 @@ def configure_emscripten_python(context, working_dir): quiet=context.quiet, ) - shutil.copy(EMSCRIPTEN_DIR / "node_entry.mjs", working_dir / "node_entry.mjs") + shutil.copy( + EMSCRIPTEN_DIR / "node_entry.mjs", working_dir / "node_entry.mjs" + ) node_entry = working_dir / "node_entry.mjs" exec_script = working_dir / "python.sh" @@ -383,13 +401,15 @@ def main(): subcommands = parser.add_subparsers(dest="subcommand") build = subcommands.add_parser("build", help="Build everything") configure_build = subcommands.add_parser( - "configure-build-python", help="Run `configure` for the " "build Python" + "configure-build-python", help="Run `configure` for the build Python" ) make_mpdec_cmd = subcommands.add_parser( - "make-mpdec", help="Clone mpdec repo, configure and build it for emscripten" + "make-mpdec", + help="Clone mpdec repo, configure and build it for emscripten", ) make_libffi_cmd = subcommands.add_parser( - "make-libffi", help="Clone libffi repo, configure and build it for emscripten" + "make-libffi", + help="Clone libffi repo, configure and build it for emscripten", ) make_build = subcommands.add_parser( "make-build-python", help="Run `make` for the build Python" @@ -457,7 +477,11 @@ def main(): if not context.subcommand: # No command provided, display help and exit - print("Expected one of", ", ".join(sorted(dispatch.keys())), file=sys.stderr) + print( + "Expected one of", + ", ".join(sorted(dispatch.keys())), + file=sys.stderr, + ) parser.print_help(sys.stderr) sys.exit(1) dispatch[context.subcommand](context) diff --git a/Tools/wasm/emscripten/prepare_external_wasm.py b/Tools/wasm/emscripten/prepare_external_wasm.py index 960e5aefd24eb5..1b0a9de4b1fe8d 100644 --- a/Tools/wasm/emscripten/prepare_external_wasm.py +++ b/Tools/wasm/emscripten/prepare_external_wasm.py @@ -19,6 +19,7 @@ }}); """ + def prepare_wasm(input_file, output_file, function_name): # Read the compiled WASM as binary and convert to hex wasm_bytes = Path(input_file).read_bytes() @@ -31,9 +32,7 @@ def prepare_wasm(input_file, output_file, function_name): ) Path(output_file).write_text(js_content) - print( - f"Successfully compiled {input_file} and generated {output_file}" - ) + print(f"Successfully compiled {input_file} and generated {output_file}") return 0 diff --git a/Tools/wasm/emscripten/wasm_assets.py b/Tools/wasm/emscripten/wasm_assets.py index 78da913ff6059b..90f318f319a9f1 100755 --- a/Tools/wasm/emscripten/wasm_assets.py +++ b/Tools/wasm/emscripten/wasm_assets.py @@ -27,7 +27,9 @@ WASM_STDLIB_ZIP = ( WASM_LIB / f"python{sys.version_info.major}{sys.version_info.minor}.zip" ) -WASM_STDLIB = WASM_LIB / f"python{sys.version_info.major}.{sys.version_info.minor}" +WASM_STDLIB = ( + WASM_LIB / f"python{sys.version_info.major}.{sys.version_info.minor}" +) WASM_DYNLOAD = WASM_STDLIB / "lib-dynload" diff --git a/Tools/wasm/emscripten/web_example/server.py b/Tools/wasm/emscripten/web_example/server.py index 768e6f84e07798..f2e6ed56c6bcff 100755 --- a/Tools/wasm/emscripten/web_example/server.py +++ b/Tools/wasm/emscripten/web_example/server.py @@ -6,10 +6,16 @@ description="Start a local webserver with a Python terminal." ) parser.add_argument( - "--port", type=int, default=8000, help="port for the http server to listen on" + "--port", + type=int, + default=8000, + help="port for the http server to listen on", ) parser.add_argument( - "--bind", type=str, default="127.0.0.1", help="Bind address (empty for all)" + "--bind", + type=str, + default="127.0.0.1", + help="Bind address (empty for all)", ) diff --git a/Tools/wasm/wasi.py b/Tools/wasm/wasi.py index b49b27cbbbe66e..af55e03d10f754 100644 --- a/Tools/wasm/wasi.py +++ b/Tools/wasm/wasi.py @@ -1,10 +1,12 @@ -if __name__ == "__main__": +if __name__ == "__main__": import pathlib import runpy import sys - print("⚠️ WARNING: This script is deprecated and slated for removal in Python 3.20; " - "execute the `wasi/` directory instead (i.e. `python Tools/wasm/wasi`)\n", - file=sys.stderr) + print( + "⚠️ WARNING: This script is deprecated and slated for removal in Python 3.20; " + "execute the `wasi/` directory instead (i.e. `python Tools/wasm/wasi`)\n", + file=sys.stderr, + ) runpy.run_path(pathlib.Path(__file__).parent / "wasi", run_name="__main__") diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index 973d78caa0849e..a0658cb351a86f 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -4,6 +4,7 @@ import contextlib import functools import os + try: from os import process_cpu_count as cpu_count except ImportError: @@ -17,15 +18,19 @@ CHECKOUT = pathlib.Path(__file__).parent.parent.parent.parent -assert (CHECKOUT / "configure").is_file(), "Please update the location of the file" +assert (CHECKOUT / "configure").is_file(), ( + "Please update the location of the file" +) CROSS_BUILD_DIR = CHECKOUT / "cross-build" # Build platform can also be found via `config.guess`. BUILD_DIR = CROSS_BUILD_DIR / sysconfig.get_config_var("BUILD_GNU_TYPE") LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local" -LOCAL_SETUP_MARKER = ("# Generated by Tools/wasm/wasi .\n" - "# Required to statically build extension modules.").encode("utf-8") +LOCAL_SETUP_MARKER = ( + "# Generated by Tools/wasm/wasi .\n" + "# Required to statically build extension modules." +).encode("utf-8") WASI_SDK_VERSION = 24 @@ -42,7 +47,9 @@ def updated_env(updates={}): # https://reproducible-builds.org/docs/source-date-epoch/ git_epoch_cmd = ["git", "log", "-1", "--pretty=%ct"] try: - epoch = subprocess.check_output(git_epoch_cmd, encoding="utf-8").strip() + epoch = subprocess.check_output( + git_epoch_cmd, encoding="utf-8" + ).strip() env_defaults["SOURCE_DATE_EPOCH"] = epoch except subprocess.CalledProcessError: pass # Might be building from a tarball. @@ -63,6 +70,7 @@ def updated_env(updates={}): def subdir(working_dir, *, clean_ok=False): """Decorator to change to a working directory.""" + def decorator(func): @functools.wraps(func) def wrapper(context): @@ -71,16 +79,20 @@ def wrapper(context): if callable(working_dir): working_dir = working_dir(context) try: - tput_output = subprocess.check_output(["tput", "cols"], - encoding="utf-8") + tput_output = subprocess.check_output( + ["tput", "cols"], encoding="utf-8" + ) except subprocess.CalledProcessError: terminal_width = 80 else: terminal_width = int(tput_output.strip()) print("⎯" * terminal_width) print("📁", working_dir) - if (clean_ok and getattr(context, "clean", False) and - working_dir.exists()): + if ( + clean_ok + and getattr(context, "clean", False) + and working_dir.exists() + ): print("🚮 Deleting directory (--clean)...") shutil.rmtree(working_dir) @@ -110,11 +122,14 @@ def call(command, *, context=None, quiet=False, logdir=None, **kwargs): stdout = None stderr = None else: - stdout = tempfile.NamedTemporaryFile("w", encoding="utf-8", - delete=False, - dir=logdir, - prefix="cpython-wasi-", - suffix=".log") + stdout = tempfile.NamedTemporaryFile( + "w", + encoding="utf-8", + delete=False, + dir=logdir, + prefix="cpython-wasi-", + suffix=".log", + ) stderr = subprocess.STDOUT print(f"📝 Logging output to {stdout.name} (--quiet)...") @@ -127,8 +142,9 @@ def build_python_path(): 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}") + raise FileNotFoundError( + f"Unable to find `python(.exe)` in {BUILD_DIR}" + ) return binary @@ -136,9 +152,11 @@ def build_python_path(): def build_python_is_pydebug(): """Find out if the build Python is a pydebug build.""" test = "import sys, test.support; sys.exit(test.support.Py_DEBUG)" - result = subprocess.run([build_python_path(), "-c", test], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + result = subprocess.run( + [build_python_path(), "-c", test], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) return bool(result.returncode) @@ -154,7 +172,7 @@ def configure_build_python(context, working_dir): print(f"📝 Creating {LOCAL_SETUP} ...") LOCAL_SETUP.write_bytes(LOCAL_SETUP_MARKER) - configure = [os.path.relpath(CHECKOUT / 'configure', working_dir)] + configure = [os.path.relpath(CHECKOUT / "configure", working_dir)] if context.args: configure.extend(context.args) @@ -164,13 +182,15 @@ def configure_build_python(context, working_dir): @subdir(BUILD_DIR) def make_build_python(context, working_dir): """Make/build the build Python.""" - call(["make", "--jobs", str(cpu_count()), "all"], - context=context) + call(["make", "--jobs", str(cpu_count()), "all"], context=context) binary = build_python_path() - cmd = [binary, "-c", - "import sys; " - "print(f'{sys.version_info.major}.{sys.version_info.minor}')"] + cmd = [ + binary, + "-c", + "import sys; " + "print(f'{sys.version_info.major}.{sys.version_info.minor}')", + ] version = subprocess.check_output(cmd, encoding="utf-8").strip() print(f"🎉 {binary} {version}") @@ -188,8 +208,11 @@ def find_wasi_sdk(): # Starting with WASI SDK 23, the tarballs went from containing a directory named # ``wasi-sdk-{WASI_SDK_VERSION}.0`` to e.g. # ``wasi-sdk-{WASI_SDK_VERSION}.0-x86_64-linux``. - potential_sdks = [path for path in opt_path.glob(f"wasi-sdk-{WASI_SDK_VERSION}.0*") - if path.is_dir()] + potential_sdks = [ + path + for path in opt_path.glob(f"wasi-sdk-{WASI_SDK_VERSION}.0*") + if path.is_dir() + ] if len(potential_sdks) == 1: return potential_sdks[0] elif (default_path := opt_path / "wasi-sdk").is_dir(): @@ -200,8 +223,13 @@ def wasi_sdk_env(context): """Calculate environment variables for building with wasi-sdk.""" wasi_sdk_path = context.wasi_sdk_path sysroot = wasi_sdk_path / "share" / "wasi-sysroot" - env = {"CC": "clang", "CPP": "clang-cpp", "CXX": "clang++", - "AR": "llvm-ar", "RANLIB": "ranlib"} + env = { + "CC": "clang", + "CPP": "clang-cpp", + "CXX": "clang++", + "AR": "llvm-ar", + "RANLIB": "ranlib", + } for env_var, binary_name in list(env.items()): env[env_var] = os.fsdecode(wasi_sdk_path / "bin" / binary_name) @@ -212,16 +240,20 @@ def wasi_sdk_env(context): env["PKG_CONFIG_PATH"] = "" env["PKG_CONFIG_LIBDIR"] = os.pathsep.join( - map(os.fsdecode, - [sysroot / "lib" / "pkgconfig", - sysroot / "share" / "pkgconfig"])) + map( + os.fsdecode, + [sysroot / "lib" / "pkgconfig", sysroot / "share" / "pkgconfig"], + ) + ) env["PKG_CONFIG_SYSROOT_DIR"] = os.fsdecode(sysroot) env["WASI_SDK_PATH"] = os.fsdecode(wasi_sdk_path) env["WASI_SYSROOT"] = os.fsdecode(sysroot) - env["PATH"] = os.pathsep.join([os.fsdecode(wasi_sdk_path / "bin"), - os.environ["PATH"]]) + env["PATH"] = os.pathsep.join([ + os.fsdecode(wasi_sdk_path / "bin"), + os.environ["PATH"], + ]) return env @@ -230,54 +262,70 @@ def wasi_sdk_env(context): def configure_wasi_python(context, working_dir): """Configure the WASI/host build.""" if not context.wasi_sdk_path or not context.wasi_sdk_path.exists(): - raise ValueError("WASI-SDK not found; " - "download from " - "https://github.com/WebAssembly/wasi-sdk and/or " - "specify via $WASI_SDK_PATH or --wasi-sdk") - - config_site = os.fsdecode(CHECKOUT / "Tools" / "wasm" / "wasi" / "config.site-wasm32-wasi") + raise ValueError( + "WASI-SDK not found; " + "download from " + "https://github.com/WebAssembly/wasi-sdk and/or " + "specify via $WASI_SDK_PATH or --wasi-sdk" + ) + + config_site = os.fsdecode( + CHECKOUT / "Tools" / "wasm" / "wasi" / "config.site-wasm32-wasi" + ) wasi_build_dir = working_dir.relative_to(CHECKOUT) python_build_dir = BUILD_DIR / "build" lib_dirs = list(python_build_dir.glob("lib.*")) - assert len(lib_dirs) == 1, f"Expected a single lib.* directory in {python_build_dir}" + assert len(lib_dirs) == 1, ( + f"Expected a single lib.* directory in {python_build_dir}" + ) lib_dir = os.fsdecode(lib_dirs[0]) python_version = lib_dir.rpartition("-")[-1] - sysconfig_data_dir = f"{wasi_build_dir}/build/lib.wasi-wasm32-{python_version}" + sysconfig_data_dir = ( + f"{wasi_build_dir}/build/lib.wasi-wasm32-{python_version}" + ) # Use PYTHONPATH to include sysconfig data which must be anchored to the # WASI guest's `/` directory. - args = {"GUEST_DIR": "/", - "HOST_DIR": CHECKOUT, - "ENV_VAR_NAME": "PYTHONPATH", - "ENV_VAR_VALUE": f"/{sysconfig_data_dir}", - "PYTHON_WASM": working_dir / "python.wasm"} + args = { + "GUEST_DIR": "/", + "HOST_DIR": CHECKOUT, + "ENV_VAR_NAME": "PYTHONPATH", + "ENV_VAR_VALUE": f"/{sysconfig_data_dir}", + "PYTHON_WASM": working_dir / "python.wasm", + } # Check dynamically for wasmtime in case it was specified manually via # `--host-runner`. if WASMTIME_HOST_RUNNER_VAR in context.host_runner: if wasmtime := shutil.which("wasmtime"): args[WASMTIME_VAR_NAME] = wasmtime else: - raise FileNotFoundError("wasmtime not found; download from " - "https://github.com/bytecodealliance/wasmtime") + raise FileNotFoundError( + "wasmtime not found; download from " + "https://github.com/bytecodealliance/wasmtime" + ) host_runner = context.host_runner.format_map(args) env_additions = {"CONFIG_SITE": config_site, "HOSTRUNNER": host_runner} build_python = os.fsdecode(build_python_path()) # The path to `configure` MUST be relative, else `python.wasm` is unable # to find the stdlib due to Python not recognizing that it's being # executed from within a checkout. - configure = [os.path.relpath(CHECKOUT / 'configure', working_dir), - f"--host={context.host_triple}", - f"--build={BUILD_DIR.name}", - f"--with-build-python={build_python}"] + configure = [ + os.path.relpath(CHECKOUT / "configure", working_dir), + f"--host={context.host_triple}", + f"--build={BUILD_DIR.name}", + f"--with-build-python={build_python}", + ] if build_python_is_pydebug(): configure.append("--with-pydebug") if context.args: configure.extend(context.args) - call(configure, - env=updated_env(env_additions | wasi_sdk_env(context)), - context=context) + call( + configure, + env=updated_env(env_additions | wasi_sdk_env(context)), + context=context, + ) python_wasm = working_dir / "python.wasm" exec_script = working_dir / "python.sh" @@ -291,9 +339,11 @@ def configure_wasi_python(context, working_dir): @subdir(lambda context: CROSS_BUILD_DIR / context.host_triple) def make_wasi_python(context, working_dir): """Run `make` for the WASI/host build.""" - call(["make", "--jobs", str(cpu_count()), "all"], - env=updated_env(), - context=context) + call( + ["make", "--jobs", str(cpu_count()), "all"], + env=updated_env(), + context=context, + ) exec_script = working_dir / "python.sh" call([exec_script, "--version"], quiet=False) @@ -305,11 +355,16 @@ def make_wasi_python(context, working_dir): def build_all(context): """Build everything.""" - steps = [configure_build_python, make_build_python, configure_wasi_python, - make_wasi_python] + steps = [ + configure_build_python, + make_build_python, + configure_wasi_python, + make_wasi_python, + ] for step in steps: step(context) + def clean_contents(context): """Delete all files created by this script.""" if CROSS_BUILD_DIR.exists(): @@ -324,76 +379,113 @@ def clean_contents(context): def main(): default_host_triple = "wasm32-wasip1" default_wasi_sdk = find_wasi_sdk() - default_host_runner = (f"{WASMTIME_HOST_RUNNER_VAR} run " - # Make sure the stack size will work for a pydebug - # build. - # Use 16 MiB stack. - "--wasm max-wasm-stack=16777216 " - # Enable thread support; causes use of preview1. - #"--wasm threads=y --wasi threads=y " - # Map the checkout to / to load the stdlib from /Lib. - "--dir {HOST_DIR}::{GUEST_DIR} " - # Set PYTHONPATH to the sysconfig data. - "--env {ENV_VAR_NAME}={ENV_VAR_VALUE}") + default_host_runner = ( + f"{WASMTIME_HOST_RUNNER_VAR} run " + # Make sure the stack size will work for a pydebug + # build. + # Use 16 MiB stack. + "--wasm max-wasm-stack=16777216 " + # Enable thread support; causes use of preview1. + # "--wasm threads=y --wasi threads=y " + # Map the checkout to / to load the stdlib from /Lib. + "--dir {HOST_DIR}::{GUEST_DIR} " + # Set PYTHONPATH to the sysconfig data. + "--env {ENV_VAR_NAME}={ENV_VAR_VALUE}" + ) default_logdir = pathlib.Path(tempfile.gettempdir()) parser = argparse.ArgumentParser() subcommands = parser.add_subparsers(dest="subcommand") build = subcommands.add_parser("build", help="Build everything") - configure_build = subcommands.add_parser("configure-build-python", - help="Run `configure` for the " - "build Python") - make_build = subcommands.add_parser("make-build-python", - help="Run `make` for the build Python") - configure_host = subcommands.add_parser("configure-host", - help="Run `configure` for the " - "host/WASI (pydebug builds " - "are inferred from the build " - "Python)") - make_host = subcommands.add_parser("make-host", - help="Run `make` for the host/WASI") - subcommands.add_parser("clean", help="Delete files and directories " - "created by this script") - for subcommand in build, configure_build, make_build, configure_host, make_host: - subcommand.add_argument("--quiet", action="store_true", default=False, - dest="quiet", - help="Redirect output from subprocesses to a log file") - subcommand.add_argument("--logdir", type=pathlib.Path, default=default_logdir, - help="Directory to store log files; " - f"defaults to {default_logdir}") + configure_build = subcommands.add_parser( + "configure-build-python", help="Run `configure` for the build Python" + ) + make_build = subcommands.add_parser( + "make-build-python", help="Run `make` for the build Python" + ) + configure_host = subcommands.add_parser( + "configure-host", + help="Run `configure` for the " + "host/WASI (pydebug builds " + "are inferred from the build " + "Python)", + ) + make_host = subcommands.add_parser( + "make-host", help="Run `make` for the host/WASI" + ) + subcommands.add_parser( + "clean", help="Delete files and directories created by this script" + ) + for subcommand in ( + build, + configure_build, + make_build, + configure_host, + make_host, + ): + subcommand.add_argument( + "--quiet", + action="store_true", + default=False, + dest="quiet", + help="Redirect output from subprocesses to a log file", + ) + subcommand.add_argument( + "--logdir", + type=pathlib.Path, + default=default_logdir, + help=f"Directory to store log files; defaults to {default_logdir}", + ) for subcommand in configure_build, configure_host: - subcommand.add_argument("--clean", action="store_true", default=False, - dest="clean", - help="Delete any relevant directories before building") + subcommand.add_argument( + "--clean", + action="store_true", + default=False, + dest="clean", + help="Delete any relevant directories before building", + ) for subcommand in build, configure_build, configure_host: - subcommand.add_argument("args", nargs="*", - help="Extra arguments to pass to `configure`") + subcommand.add_argument( + "args", nargs="*", help="Extra arguments to pass to `configure`" + ) for subcommand in build, configure_host: - subcommand.add_argument("--wasi-sdk", type=pathlib.Path, - dest="wasi_sdk_path", - default=default_wasi_sdk, - help=f"Path to the WASI SDK; defaults to {default_wasi_sdk}") - subcommand.add_argument("--host-runner", action="store", - default=default_host_runner, dest="host_runner", - help="Command template for running the WASI host; defaults to " - f"`{default_host_runner}`") + subcommand.add_argument( + "--wasi-sdk", + type=pathlib.Path, + dest="wasi_sdk_path", + default=default_wasi_sdk, + help=f"Path to the WASI SDK; defaults to {default_wasi_sdk}", + ) + subcommand.add_argument( + "--host-runner", + action="store", + default=default_host_runner, + dest="host_runner", + help="Command template for running the WASI host; defaults to " + f"`{default_host_runner}`", + ) for subcommand in build, configure_host, make_host: - subcommand.add_argument("--host-triple", action="store", - default=default_host_triple, - help="The target triple for the WASI host build; " - f"defaults to {default_host_triple}") + subcommand.add_argument( + "--host-triple", + action="store", + default=default_host_triple, + help="The target triple for the WASI host build; " + f"defaults to {default_host_triple}", + ) context = parser.parse_args() context.init_dir = pathlib.Path().absolute() - dispatch = {"configure-build-python": configure_build_python, - "make-build-python": make_build_python, - "configure-host": configure_wasi_python, - "make-host": make_wasi_python, - "build": build_all, - "clean": clean_contents} + dispatch = { + "configure-build-python": configure_build_python, + "make-build-python": make_build_python, + "configure-host": configure_wasi_python, + "make-host": make_wasi_python, + "build": build_all, + "clean": clean_contents, + } dispatch[context.subcommand](context) -if __name__ == "__main__": +if __name__ == "__main__": main() diff --git a/Tools/wasm/wasm_build.py b/Tools/wasm/wasm_build.py index bcb80212362b71..73875a2205e6a8 100755 --- a/Tools/wasm/wasm_build.py +++ b/Tools/wasm/wasm_build.py @@ -21,6 +21,7 @@ ./Tools/wasm/wasm_builder.py --clean build build """ + import argparse import enum import dataclasses @@ -67,7 +68,9 @@ # path to Emscripten SDK config file. # auto-detect's EMSDK in /opt/emsdk without ". emsdk_env.sh". -EM_CONFIG = pathlib.Path(os.environ.setdefault("EM_CONFIG", "/opt/emsdk/.emscripten")) +EM_CONFIG = pathlib.Path( + os.environ.setdefault("EM_CONFIG", "/opt/emsdk/.emscripten") +) EMSDK_MIN_VERSION = (3, 1, 19) EMSDK_BROKEN_VERSION = { (3, 1, 14): "https://github.com/emscripten-core/emscripten/issues/17338", @@ -261,8 +264,7 @@ def _check_emscripten() -> None: # git / upstream / tot-upstream installation version = version[:-4] version_tuple = cast( - Tuple[int, int, int], - tuple(int(v) for v in version.split(".")) + Tuple[int, int, int], tuple(int(v) for v in version.split(".")) ) if version_tuple < EMSDK_MIN_VERSION: raise ConditionError( @@ -518,7 +520,7 @@ def make_cmd(self) -> List[str]: def getenv(self) -> Dict[str, Any]: """Generate environ dict for platform""" env = os.environ.copy() - if hasattr(os, 'process_cpu_count'): + if hasattr(os, "process_cpu_count"): cpu_count = os.process_cpu_count() else: cpu_count = os.cpu_count() @@ -596,7 +598,9 @@ def run_py(self, *args: str) -> int: """Run Python with hostrunner""" self._check_execute() return self.run_make( - "--eval", f"run: all; $(HOSTRUNNER) ./$(PYTHON) {shlex.join(args)}", "run" + "--eval", + f"run: all; $(HOSTRUNNER) ./$(PYTHON) {shlex.join(args)}", + "run", ) def run_browser(self, bind: str = "127.0.0.1", port: int = 8000) -> None: @@ -666,9 +670,12 @@ def build_emports(self, force: bool = False) -> None: # Pre-build libbz2, libsqlite3, libz, and some system libs. ports_cmd.extend(["-sUSE_ZLIB", "-sUSE_BZIP2", "-sUSE_SQLITE3"]) # Multi-threaded sqlite3 has different suffix - embuilder_cmd.extend( - ["build", "bzip2", "sqlite3-mt" if self.pthreads else "sqlite3", "zlib"] - ) + embuilder_cmd.extend([ + "build", + "bzip2", + "sqlite3-mt" if self.pthreads else "sqlite3", + "zlib", + ]) self._run_cmd(embuilder_cmd, cwd=SRCDIR) @@ -817,7 +824,9 @@ def build_emports(self, force: bool = False) -> None: # Don't list broken and experimental variants in help platforms_choices = list(p.name for p in _profiles) + ["cleanall"] -platforms_help = list(p.name for p in _profiles if p.support_level) + ["cleanall"] +platforms_help = list(p.name for p in _profiles if p.support_level) + [ + "cleanall" +] parser.add_argument( "platform", metavar="PLATFORM", From d8898e1fbe50ddb5de6e537d2dc9f58178265944 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:13:13 +0200 Subject: [PATCH 1117/1674] Adds support for building with VisualStudioVersion = 18.0 (GH-138980) (cherry picked from commit 6920fa4bcddad4abb46a3ae40e16f13566d6cf26) Co-authored-by: Steve Dower Co-authored-by: Petr Viktorin --- PCbuild/python.props | 1 + 1 file changed, 1 insertion(+) diff --git a/PCbuild/python.props b/PCbuild/python.props index d4d9a54248d648..cc1572526559ce 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -11,6 +11,7 @@ We set BasePlatformToolset for ICC's benefit, it's otherwise ignored. --> + v143 v143 v142 v141 From f10dc2666c88576353ff98acbd9632b9e6416a48 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:26:22 +0200 Subject: [PATCH 1118/1674] gh-139769: Update `PCBuild/find_python.bat` to allow discovery of Python 3.14 (GH-139770) Enable 3.14 py.exe can be use on PCBuild (cherry picked from commit 570d17259f824302d20567a3a2f32c67ebdaefcd) Co-authored-by: Wulian233 <1055917385@qq.com> --- PCbuild/find_python.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCbuild/find_python.bat b/PCbuild/find_python.bat index d65d080ca71a90..841d83968c60be 100644 --- a/PCbuild/find_python.bat +++ b/PCbuild/find_python.bat @@ -47,7 +47,7 @@ @rem If py.exe finds a recent enough version, use that one @rem It is fine to add new versions to this list when they have released, @rem but we do not use prerelease builds here. -@for %%p in (3.13 3.12 3.11 3.10) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found +@for %%p in (3.14 3.13 3.12 3.11 3.10) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found @if NOT exist "%_Py_EXTERNALS_DIR%" mkdir "%_Py_EXTERNALS_DIR%" @set _Py_NUGET=%NUGET% From ea1ed82feda87a41086717aebf4a8e2f7d7dc109 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:39:09 +0200 Subject: [PATCH 1119/1674] [3.14] gh-139774: use relaxed atomics for datetime hashes (GH-139775) (#139780) gh-139774: use relaxed atomics for datetime hashes (GH-139775) (cherry picked from commit 49fb46f555881c9f2d20ca87c8187c8718217c77) Co-authored-by: Kumar Aditya --- Modules/_datetimemodule.c | 47 ++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index ddb9e9fd2e57c0..cb6e3c80224846 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -15,6 +15,7 @@ #include "pycore_time.h" // _PyTime_ObjectToTime_t() #include "pycore_unicodeobject.h" // _PyUnicode_Copy() #include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_pyatomic_ft_wrappers.h" #include "datetime.h" @@ -2533,14 +2534,16 @@ static Py_hash_t delta_hash(PyObject *op) { PyDateTime_Delta *self = PyDelta_CAST(op); - if (self->hashcode == -1) { + Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode); + if (hash == -1) { PyObject *temp = delta_getstate(self); if (temp != NULL) { - self->hashcode = PyObject_Hash(temp); + hash = PyObject_Hash(temp); + FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash); Py_DECREF(temp); } } - return self->hashcode; + return hash; } static PyObject * @@ -3860,12 +3863,14 @@ static Py_hash_t date_hash(PyObject *op) { PyDateTime_Date *self = PyDate_CAST(op); - if (self->hashcode == -1) { - self->hashcode = generic_hash( + Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode); + if (hash == -1) { + hash = generic_hash( (unsigned char *)self->data, _PyDateTime_DATE_DATASIZE); + FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash); } - return self->hashcode; + return hash; } static PyObject * @@ -4944,7 +4949,8 @@ static Py_hash_t time_hash(PyObject *op) { PyDateTime_Time *self = PyTime_CAST(op); - if (self->hashcode == -1) { + Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode); + if (hash == -1) { PyObject *offset, *self0; if (TIME_GET_FOLD(self)) { self0 = new_time_ex2(TIME_GET_HOUR(self), @@ -4966,10 +4972,11 @@ time_hash(PyObject *op) return -1; /* Reduce this to a hash of another object. */ - if (offset == Py_None) - self->hashcode = generic_hash( + if (offset == Py_None) { + hash = generic_hash( (unsigned char *)self->data, _PyDateTime_TIME_DATASIZE); - else { + FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash); + } else { PyObject *temp1, *temp2; int seconds, microseconds; assert(HASTZINFO(self)); @@ -4988,12 +4995,13 @@ time_hash(PyObject *op) Py_DECREF(offset); return -1; } - self->hashcode = PyObject_Hash(temp2); + hash = PyObject_Hash(temp2); + FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash); Py_DECREF(temp2); } Py_DECREF(offset); } - return self->hashcode; + return hash; } /*[clinic input] @@ -6451,7 +6459,8 @@ static Py_hash_t datetime_hash(PyObject *op) { PyDateTime_DateTime *self = PyDateTime_CAST(op); - if (self->hashcode == -1) { + Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->hashcode); + if (hash == -1) { PyObject *offset, *self0; if (DATE_GET_FOLD(self)) { self0 = new_datetime_ex2(GET_YEAR(self), @@ -6476,10 +6485,11 @@ datetime_hash(PyObject *op) return -1; /* Reduce this to a hash of another object. */ - if (offset == Py_None) - self->hashcode = generic_hash( + if (offset == Py_None) { + hash = generic_hash( (unsigned char *)self->data, _PyDateTime_DATETIME_DATASIZE); - else { + FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash); + } else { PyObject *temp1, *temp2; int days, seconds; @@ -6503,12 +6513,13 @@ datetime_hash(PyObject *op) Py_DECREF(offset); return -1; } - self->hashcode = PyObject_Hash(temp2); + hash = PyObject_Hash(temp2); + FT_ATOMIC_STORE_SSIZE_RELAXED(self->hashcode, hash); Py_DECREF(temp2); } Py_DECREF(offset); } - return self->hashcode; + return hash; } /*[clinic input] From 4e3fc92c403f608d59475f6541baab0207dfe8e0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:45:37 +0200 Subject: [PATCH 1120/1674] [3.14] gh-101100: Fix all Sphinx warnings in `Doc/library/subprocess.rst` (GH-139576) (#139787) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/subprocess.rst | 4 ++-- Doc/tools/.nitignore | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 028a7861f36798..1aade881745f21 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -649,7 +649,7 @@ functions. If specified, *env* must provide any variables required for the program to execute. On Windows, in order to run a `side-by-side assembly`_ the - specified *env* **must** include a valid :envvar:`SystemRoot`. + specified *env* **must** include a valid ``%SystemRoot%``. .. _side-by-side assembly: https://en.wikipedia.org/wiki/Side-by-Side_Assembly @@ -1473,7 +1473,7 @@ handling consistency are valid for these functions. Return ``(exitcode, output)`` of executing *cmd* in a shell. - Execute the string *cmd* in a shell with :meth:`Popen.check_output` and + Execute the string *cmd* in a shell with :func:`check_output` and return a 2-tuple ``(exitcode, output)``. *encoding* and *errors* are used to decode output; see the notes on :ref:`frequently-used-arguments` for more details. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 0ee92dce43790b..4ee09c6bbaa069 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -35,7 +35,6 @@ Doc/library/smtplib.rst Doc/library/socket.rst Doc/library/ssl.rst Doc/library/stdtypes.rst -Doc/library/subprocess.rst Doc/library/termios.rst Doc/library/test.rst Doc/library/tkinter.rst From 14c923cc857124f45ca19d5c28c9fda9ee3d72b3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:02:08 +0200 Subject: [PATCH 1121/1674] [3.14] gh-139736: Fix argparse indentation overshoot (GH-139738) (#139793) gh-139736: Fix argparse indentation overshoot (GH-139738) (cherry picked from commit 72e370c910bd941806a36b01f2f57f4c53a78eed) Co-authored-by: ed Co-authored-by: Savannah Ostrowski --- Lib/argparse.py | 2 +- Lib/test/test_argparse.py | 12 ++++++------ .../2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 2144c81886ad19..01d30a278496fc 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -281,7 +281,7 @@ def add_argument(self, action): if action.help is not SUPPRESS: # find all invocations - get_invocation = self._format_action_invocation + get_invocation = lambda x: self._decolor(self._format_action_invocation(x)) invocation_lengths = [len(get_invocation(action)) + self._current_indent] for subaction in self._iter_indented_subactions(action): invocation_lengths.append(len(get_invocation(subaction)) + self._current_indent) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 2f39b42ab74299..7de1d3e2373c33 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -7311,11 +7311,11 @@ def custom_formatter(prog): {heading}usage: {reset}{prog}PROG{reset} [{short}-h{reset}] [{short}+f {label}FOO{reset}] {pos}spam{reset} {heading}positional arguments:{reset} - {pos_b}spam{reset} spam help + {pos_b}spam{reset} spam help {heading}options:{reset} - {short_b}-h{reset}, {long_b}--help{reset} show this help message and exit - {short_b}+f{reset}, {long_b}++foo{reset} {label_b}FOO{reset} foo help + {short_b}-h{reset}, {long_b}--help{reset} show this help message and exit + {short_b}+f{reset}, {long_b}++foo{reset} {label_b}FOO{reset} foo help ''')) def test_custom_formatter_class(self): @@ -7348,11 +7348,11 @@ def __init__(self, prog): {heading}usage: {reset}{prog}PROG{reset} [{short}-h{reset}] [{short}+f {label}FOO{reset}] {pos}spam{reset} {heading}positional arguments:{reset} - {pos_b}spam{reset} spam help + {pos_b}spam{reset} spam help {heading}options:{reset} - {short_b}-h{reset}, {long_b}--help{reset} show this help message and exit - {short_b}+f{reset}, {long_b}++foo{reset} {label_b}FOO{reset} foo help + {short_b}-h{reset}, {long_b}--help{reset} show this help message and exit + {short_b}+f{reset}, {long_b}++foo{reset} {label_b}FOO{reset} foo help ''')) diff --git a/Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst b/Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst new file mode 100644 index 00000000000000..820679632d1e26 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst @@ -0,0 +1,2 @@ +Fix excessive indentation in the default :mod:`argparse` +:class:`!HelpFormatter`. Patch by Alexander Edland. From 1c1a0bdfdcda50815408c957a356370f41d4a296 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:07:05 +0200 Subject: [PATCH 1122/1674] [3.14] gh-135676: Add a summary of source characters (GH-138194) (GH-139781) (cherry picked from commit 59a6f9d8c52af40ccd31e5dca848f71808c24b06) Co-authored-by: Petr Viktorin Co-authored-by: Carol Willing Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Blaise Pabon Co-authored-by: Micha Albert Co-authored-by: KeithTheEE --- Doc/reference/lexical_analysis.rst | 76 ++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index f93666dcdc8f44..dfa340763d9255 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -10,12 +10,76 @@ Lexical analysis A Python program is read by a *parser*. Input to the parser is a stream of :term:`tokens `, generated by the *lexical analyzer* (also known as the *tokenizer*). -This chapter describes how the lexical analyzer breaks a file into tokens. +This chapter describes how the lexical analyzer produces these tokens. -Python reads program text as Unicode code points; the encoding of a source file -can be given by an encoding declaration and defaults to UTF-8, see :pep:`3120` -for details. If the source file cannot be decoded, a :exc:`SyntaxError` is -raised. +The lexical analyzer determines the program text's :ref:`encoding ` +(UTF-8 by default), and decodes the text into +:ref:`source characters `. +If the text cannot be decoded, a :exc:`SyntaxError` is raised. + +Next, the lexical analyzer uses the source characters to generate a stream of tokens. +The type of a generated token generally depends on the next source character to +be processed. Similarly, other special behavior of the analyzer depends on +the first source character that hasn't yet been processed. +The following table gives a quick summary of these source characters, +with links to sections that contain more information. + +.. list-table:: + :header-rows: 1 + + * - Character + - Next token (or other relevant documentation) + + * - * space + * tab + * formfeed + - * :ref:`Whitespace ` + + * - * CR, LF + - * :ref:`New line ` + * :ref:`Indentation ` + + * - * backslash (``\``) + - * :ref:`Explicit line joining ` + * (Also significant in :ref:`string escape sequences `) + + * - * hash (``#``) + - * :ref:`Comment ` + + * - * quote (``'``, ``"``) + - * :ref:`String literal ` + + * - * ASCII letter (``a``-``z``, ``A``-``Z``) + * non-ASCII character + - * :ref:`Name ` + * Prefixed :ref:`string or bytes literal ` + + * - * underscore (``_``) + - * :ref:`Name ` + * (Can also be part of :ref:`numeric literals `) + + * - * number (``0``-``9``) + - * :ref:`Numeric literal ` + + * - * dot (``.``) + - * :ref:`Numeric literal ` + * :ref:`Operator ` + + * - * question mark (``?``) + * dollar (``$``) + * + .. (the following uses zero-width space characters to render + .. a literal backquote) + + backquote (``​`​``) + * control character + - * Error (outside string literals and comments) + + * - * other printing character + - * :ref:`Operator or delimiter ` + + * - * end of file + - * :ref:`End marker ` .. _line-structure: @@ -120,6 +184,8 @@ If an encoding is declared, the encoding name must be recognized by Python encoding is used for all lexical analysis, including string literals, comments and identifiers. +.. _lexical-source-character: + All lexical analysis, including string literals, comments and identifiers, works on Unicode text decoded using the source encoding. Any Unicode code point, except the NUL control character, can appear in From 81dc8b12f08f64da756b5d0de5592e60740ba02c Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Wed, 8 Oct 2025 09:13:34 -0700 Subject: [PATCH 1123/1674] [3.14] gh-139525: Don't specialize functions which have a modified vectorcall (GH-139524) (#139709) Don't specialize functions which have a modified vectorcall --- Lib/test/test_opcache.py | 8 ++++++++ Modules/_testinternalcapi.c | 20 ++++++++++++++++++++ Python/specialize.c | 9 +++++++++ 3 files changed, 37 insertions(+) diff --git a/Lib/test/test_opcache.py b/Lib/test/test_opcache.py index a45aafc63fa697..2e50c1c62b328c 100644 --- a/Lib/test/test_opcache.py +++ b/Lib/test/test_opcache.py @@ -567,6 +567,14 @@ def test(default=None): with self.assertRaises(RecursionError): test() + def test_dont_specialize_custom_vectorcall(self): + def f(): + raise Exception("no way") + + _testinternalcapi.set_vectorcall_nop(f) + for _ in range(_testinternalcapi.SPECIALIZATION_THRESHOLD): + f() + def make_deferred_ref_count_obj(): """Create an object that uses deferred reference counting. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index afb72d3df83236..5d877b5655b89c 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -2389,6 +2389,25 @@ emscripten_set_up_async_input_device(PyObject *self, PyObject *Py_UNUSED(ignored } #endif +static PyObject * +vectorcall_nop(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + Py_RETURN_NONE; +} + +static PyObject * +set_vectorcall_nop(PyObject *self, PyObject *func) +{ + if (!PyFunction_Check(func)) { + PyErr_SetString(PyExc_TypeError, "expected function"); + return NULL; + } + + ((PyFunctionObject*)func)->vectorcall = vectorcall_nop; + Py_RETURN_NONE; +} + static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -2496,6 +2515,7 @@ static PyMethodDef module_functions[] = { #ifdef __EMSCRIPTEN__ {"emscripten_set_up_async_input_device", emscripten_set_up_async_input_device, METH_NOARGS}, #endif + {"set_vectorcall_nop", set_vectorcall_nop, METH_O}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/specialize.c b/Python/specialize.c index dd00f1cb6b0024..4ba854d2ae8c3a 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -630,6 +630,7 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters #define SPEC_FAIL_CALL_INIT_NOT_PYTHON 21 #define SPEC_FAIL_CALL_PEP_523 22 #define SPEC_FAIL_CALL_BOUND_METHOD 23 +#define SPEC_FAIL_CALL_VECTORCALL 24 #define SPEC_FAIL_CALL_CLASS_MUTABLE 26 #define SPEC_FAIL_CALL_METHOD_WRAPPER 28 #define SPEC_FAIL_CALL_OPERATOR_WRAPPER 29 @@ -2071,6 +2072,10 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_PEP_523); return -1; } + if (func->vectorcall != _PyFunction_Vectorcall) { + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_VECTORCALL); + return -1; + } int argcount = -1; if (kind == SPEC_FAIL_CODE_NOT_OPTIMIZED) { SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CODE_NOT_OPTIMIZED); @@ -2110,6 +2115,10 @@ specialize_py_call_kw(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_PEP_523); return -1; } + if (func->vectorcall != _PyFunction_Vectorcall) { + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_VECTORCALL); + return -1; + } if (kind == SPEC_FAIL_CODE_NOT_OPTIMIZED) { SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CODE_NOT_OPTIMIZED); return -1; From 077652b44f87dc03f671d5d9569e94b8fa817d39 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:21:50 +0200 Subject: [PATCH 1124/1674] [3.14] gh-138843: Clean up downloads page (GH-138844) (#139796) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/tools/templates/download.html | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index 26fc9571d17423..523b505f59673e 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -42,22 +42,22 @@

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

{% trans %}HTML{% endtrans %}{% trans download_size="13" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="8" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans %}Download{% endtrans %}{% trans %}Download{% endtrans %}
{% trans %}Plain text{% endtrans %}{% trans download_size="4" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="3" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans %}Download{% endtrans %}{% trans %}Download{% endtrans %}
{% trans %}Texinfo{% endtrans %}{% trans download_size="9" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="7" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans %}Download{% endtrans %}{% trans %}Download{% endtrans %}
{% trans %}EPUB{% endtrans %}{% trans download_size="6" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans %}Download{% endtrans %}
@@ -71,6 +71,9 @@

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

and run make dist-pdf in the Doc/ directory of a copy of the CPython repository. {% endtrans %}

+

{% trans %} +See the directory listing +for file sizes.{% endtrans %}

{% trans %}Unpacking{% endtrans %}

@@ -83,9 +86,8 @@

{% trans %}Unpacking{% endtrans %}

{% 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 %}

-

{% trans %}Problems{% endtrans %}

- -

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

+{% set bugs = pathto('bugs') %} +

{% trans bugs = bugs %}Open an issue +if you have comments or suggestions for the Python documentation.{% endtrans %}

{% endblock %} From 90cd009209fc494a62ebfdbea18a4e557f8e2fbb Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Wed, 8 Oct 2025 22:16:21 +0530 Subject: [PATCH 1125/1674] =?UTF-8?q?[3.14]=20gh-139748:=20fix=20leaks=20i?= =?UTF-8?q?n=20AC=20error=20paths=20when=20using=20unicode=20FS-b=E2=80=A6?= =?UTF-8?q?=20(#139789)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [3.14] gh-139748: fix leaks in AC error paths when using unicode FS-based converters (GH-139765) (cherry picked from commit b04a57deef66ce08233be57d1ab5873388df2cea) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_clinic.py | 2 + Lib/test/test_compile.py | 15 +++++++ Lib/test/test_symtable.py | 7 ++++ ...-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst | 2 + Modules/_ssl.c | 5 +-- Modules/clinic/_ssl.c.h | 7 +++- Modules/clinic/socketmodule.c.h | 7 +++- Modules/clinic/symtablemodule.c.h | 7 +++- Modules/posixmodule.c | 39 +++++++------------ Modules/socketmodule.c | 5 +-- Modules/symtablemodule.c | 6 +-- Python/bltinmodule.c | 5 +-- Python/clinic/bltinmodule.c.h | 7 +++- Tools/clinic/libclinic/converters.py | 20 ++++++++++ 14 files changed, 88 insertions(+), 46 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index d5b751eafc5bbb..b25108e0ff7903 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2833,6 +2833,8 @@ def test_cli_converters(self): "uint64", "uint8", "unicode", + "unicode_fs_decoded", + "unicode_fs_encoded", "unsigned_char", "unsigned_int", "unsigned_long", diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 8a66be9b331262..7d7409ef93aa5f 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -651,6 +651,21 @@ def test_compile_filename(self): compile('pass', filename, 'exec') self.assertRaises(TypeError, compile, 'pass', list(b'file.py'), 'exec') + def test_compile_filename_refleak(self): + # Regression tests for reference leak in PyUnicode_FSDecoder. + # See https://github.com/python/cpython/issues/139748. + mortal_str = 'this is a mortal string' + # check error path when 'mode' AC conversion failed + self.assertRaises(TypeError, compile, b'', mortal_str, mode=1234) + # check error path when 'optimize' AC conversion failed + self.assertRaises(OverflowError, compile, b'', mortal_str, + 'exec', optimize=1 << 1000) + # check error path when 'dont_inherit' AC conversion failed + class EvilBool: + def __bool__(self): raise ValueError + self.assertRaises(ValueError, compile, b'', mortal_str, + 'exec', dont_inherit=EvilBool()) + @support.cpython_only def test_same_filename_used(self): s = """def f(): pass\ndef g(): pass""" diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py index 24d89b09d946ad..9537de3756fd32 100644 --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -527,6 +527,13 @@ def test_symtable_entry_repr(self): expected = f"" self.assertEqual(repr(self.top._table), expected) + def test__symtable_refleak(self): + # Regression test for reference leak in PyUnicode_FSDecoder. + # See https://github.com/python/cpython/issues/139748. + mortal_str = 'this is a mortal string' + # check error path when 'compile_type' AC conversion failed + self.assertRaises(TypeError, symtable.symtable, '', mortal_str, 1) + class ComprehensionTests(unittest.TestCase): def get_identifiers_recursive(self, st, res): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst new file mode 100644 index 00000000000000..3b190f3f6df6e3 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst @@ -0,0 +1,2 @@ +Fix reference leaks in error branches of functions accepting path strings or +bytes such as :func:`compile` and :func:`os.system`. Patch by Bénédikt Tran. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 5af0c3f8668fbb..6898d73b8ffb2a 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1831,14 +1831,14 @@ _certificate_to_der(_sslmodulestate *state, X509 *certificate) /*[clinic input] _ssl._test_decode_cert - path: object(converter="PyUnicode_FSConverter") + path: unicode_fs_encoded / [clinic start generated code]*/ static PyObject * _ssl__test_decode_cert_impl(PyObject *module, PyObject *path) -/*[clinic end generated code: output=96becb9abb23c091 input=cdeaaf02d4346628]*/ +/*[clinic end generated code: output=96becb9abb23c091 input=cb4988d5e651a4f8]*/ { PyObject *retval = NULL; X509 *x=NULL; @@ -1868,7 +1868,6 @@ _ssl__test_decode_cert_impl(PyObject *module, PyObject *path) X509_free(x); fail0: - Py_DECREF(path); if (cert != NULL) BIO_free(cert); return retval; } diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h index c6e2abd4d93474..6c6ef4cebd7998 100644 --- a/Modules/clinic/_ssl.c.h +++ b/Modules/clinic/_ssl.c.h @@ -47,7 +47,7 @@ static PyObject * _ssl__test_decode_cert(PyObject *module, PyObject *arg) { PyObject *return_value = NULL; - PyObject *path; + PyObject *path = NULL; if (!PyUnicode_FSConverter(arg, &path)) { goto exit; @@ -55,6 +55,9 @@ _ssl__test_decode_cert(PyObject *module, PyObject *arg) return_value = _ssl__test_decode_cert_impl(module, path); exit: + /* Cleanup for path */ + Py_XDECREF(path); + return return_value; } @@ -2900,4 +2903,4 @@ _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje #ifndef _SSL_ENUM_CRLS_METHODDEF #define _SSL_ENUM_CRLS_METHODDEF #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */ -/*[clinic end generated code: output=748650909fec8906 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=cbd8526cd625c433 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/socketmodule.c.h b/Modules/clinic/socketmodule.c.h index 573903be87e6ea..2b27640cd0aaf3 100644 --- a/Modules/clinic/socketmodule.c.h +++ b/Modules/clinic/socketmodule.c.h @@ -315,7 +315,7 @@ static PyObject * _socket_if_nametoindex(PyObject *module, PyObject *arg) { PyObject *return_value = NULL; - PyObject *oname; + PyObject *oname = NULL; if (!PyUnicode_FSConverter(arg, &oname)) { goto exit; @@ -323,6 +323,9 @@ _socket_if_nametoindex(PyObject *module, PyObject *arg) return_value = _socket_if_nametoindex_impl(module, oname); exit: + /* Cleanup for oname */ + Py_XDECREF(oname); + return return_value; } @@ -370,4 +373,4 @@ _socket_if_indextoname(PyObject *module, PyObject *arg) #ifndef _SOCKET_IF_INDEXTONAME_METHODDEF #define _SOCKET_IF_INDEXTONAME_METHODDEF #endif /* !defined(_SOCKET_IF_INDEXTONAME_METHODDEF) */ -/*[clinic end generated code: output=07776dd21d1e3b56 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1bbfda36b02c29c2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/symtablemodule.c.h b/Modules/clinic/symtablemodule.c.h index 2ecd3afc00d2be..bd55d77c5409e9 100644 --- a/Modules/clinic/symtablemodule.c.h +++ b/Modules/clinic/symtablemodule.c.h @@ -22,7 +22,7 @@ _symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; PyObject *source; - PyObject *filename; + PyObject *filename = NULL; const char *startstr; if (!_PyArg_CheckPositional("symtable", nargs, 3, 3)) { @@ -48,6 +48,9 @@ _symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return_value = _symtable_symtable_impl(module, source, filename, startstr); exit: + /* Cleanup for filename */ + Py_XDECREF(filename); + return return_value; } -/*[clinic end generated code: output=931964a76a72f850 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7a8545d9a1efe837 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 06a40db1078057..3dc62240952f68 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3122,17 +3122,6 @@ class dev_t_return_converter(unsigned_long_return_converter): conversion_fn = '_PyLong_FromDev' unsigned_cast = '(dev_t)' -class FSConverter_converter(CConverter): - type = 'PyObject *' - converter = 'PyUnicode_FSConverter' - def converter_init(self): - if self.default is not unspecified: - fail("FSConverter_converter does not support default values") - self.c_default = 'NULL' - - def cleanup(self): - return "Py_XDECREF(" + self.name + ");\n" - class pid_t_converter(CConverter): type = 'pid_t' format_unit = '" _Py_PARSE_PID "' @@ -3196,7 +3185,7 @@ class confname_converter(CConverter): """, argname=argname, converter=self.converter, table=self.table) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=8189d5ae78244626]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=d2759f2332cd39b3]*/ /*[clinic input] @@ -6098,14 +6087,14 @@ os_system_impl(PyObject *module, const wchar_t *command) /*[clinic input] os.system -> long - command: FSConverter + command: unicode_fs_encoded Execute the command in a subshell. [clinic start generated code]*/ static long os_system_impl(PyObject *module, PyObject *command) -/*[clinic end generated code: output=290fc437dd4f33a0 input=86a58554ba6094af]*/ +/*[clinic end generated code: output=290fc437dd4f33a0 input=47c6f24b6dc92881]*/ { long result; const char *bytes = PyBytes_AsString(command); @@ -9285,7 +9274,7 @@ os_getgroups_impl(PyObject *module) /*[clinic input] os.initgroups - username as oname: FSConverter + username as oname: unicode_fs_encoded gid: int / @@ -9298,12 +9287,12 @@ group id. static PyObject * os_initgroups_impl(PyObject *module, PyObject *oname, int gid) -/*[clinic end generated code: output=7f074d30a425fd3a input=df3d54331b0af204]*/ +/*[clinic end generated code: output=7f074d30a425fd3a input=984e60c7fed88cb4]*/ #else /*[clinic input] os.initgroups - username as oname: FSConverter + username as oname: unicode_fs_encoded gid: gid_t / @@ -9316,7 +9305,7 @@ group id. static PyObject * os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid) -/*[clinic end generated code: output=59341244521a9e3f input=0cb91bdc59a4c564]*/ +/*[clinic end generated code: output=59341244521a9e3f input=17d8fbe2dea42ca4]*/ #endif { const char *username = PyBytes_AS_STRING(oname); @@ -13067,8 +13056,8 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic input] os.putenv - name: FSConverter - value: FSConverter + name: unicode_fs_encoded + value: unicode_fs_encoded / Change or add an environment variable. @@ -13076,7 +13065,7 @@ Change or add an environment variable. static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) -/*[clinic end generated code: output=d29a567d6b2327d2 input=a97bc6152f688d31]*/ +/*[clinic end generated code: output=d29a567d6b2327d2 input=84fcd30f873c8c45]*/ { const char *name_string = PyBytes_AS_STRING(name); const char *value_string = PyBytes_AS_STRING(value); @@ -13119,7 +13108,7 @@ os_unsetenv_impl(PyObject *module, PyObject *name) #else /*[clinic input] os.unsetenv - name: FSConverter + name: unicode_fs_encoded / Delete an environment variable. @@ -13127,7 +13116,7 @@ Delete an environment variable. static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=54c4137ab1834f02 input=2bb5288a599c7107]*/ +/*[clinic end generated code: output=54c4137ab1834f02 input=78ff12e505ade80a]*/ { if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { return NULL; @@ -15185,14 +15174,14 @@ os_urandom_impl(PyObject *module, Py_ssize_t size) /*[clinic input] os.memfd_create - name: FSConverter + name: unicode_fs_encoded flags: unsigned_int(bitwise=True, c_default="MFD_CLOEXEC") = MFD_CLOEXEC [clinic start generated code]*/ static PyObject * os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags) -/*[clinic end generated code: output=6681ede983bdb9a6 input=a42cfc199bcd56e9]*/ +/*[clinic end generated code: output=6681ede983bdb9a6 input=cd0eb092cfac474b]*/ { int fd; const char *bytes = PyBytes_AS_STRING(name); diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 92c9aa8b510dca..c90b693dd2d62b 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7261,7 +7261,7 @@ Returns a list of network interface information (index, name) tuples."); /*[clinic input] _socket.if_nametoindex - oname: object(converter="PyUnicode_FSConverter") + oname: unicode_fs_encoded / Returns the interface index corresponding to the interface name if_name. @@ -7269,7 +7269,7 @@ Returns the interface index corresponding to the interface name if_name. static PyObject * _socket_if_nametoindex_impl(PyObject *module, PyObject *oname) -/*[clinic end generated code: output=289a411614f30244 input=01e0f1205307fb77]*/ +/*[clinic end generated code: output=289a411614f30244 input=6125dc20683560cf]*/ { #ifdef MS_WINDOWS NET_IFINDEX index; @@ -7278,7 +7278,6 @@ _socket_if_nametoindex_impl(PyObject *module, PyObject *oname) #endif index = if_nametoindex(PyBytes_AS_STRING(oname)); - Py_DECREF(oname); if (index == 0) { /* if_nametoindex() doesn't set errno */ PyErr_SetString(PyExc_OSError, "no interface with this name"); diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c index d0d5223e5acea8..d353f406831ecd 100644 --- a/Modules/symtablemodule.c +++ b/Modules/symtablemodule.c @@ -13,7 +13,7 @@ module _symtable _symtable.symtable source: object - filename: object(converter='PyUnicode_FSDecoder') + filename: unicode_fs_decoded startstr: str / @@ -23,7 +23,7 @@ Return symbol and scope dictionaries used internally by compiler. static PyObject * _symtable_symtable_impl(PyObject *module, PyObject *source, PyObject *filename, const char *startstr) -/*[clinic end generated code: output=59eb0d5fc7285ac4 input=9dd8a50c0c36a4d7]*/ +/*[clinic end generated code: output=59eb0d5fc7285ac4 input=436ffff90d02e4f6]*/ { struct symtable *st; PyObject *t; @@ -47,12 +47,10 @@ _symtable_symtable_impl(PyObject *module, PyObject *source, else { PyErr_SetString(PyExc_ValueError, "symtable() arg 3 must be 'exec' or 'eval' or 'single'"); - Py_DECREF(filename); Py_XDECREF(source_copy); return NULL; } st = _Py_SymtableStringObjectFlags(str, filename, start, &cf); - Py_DECREF(filename); Py_XDECREF(source_copy); if (st == NULL) { return NULL; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 1ca23626ea52fd..4ab67bdee1d6ba 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -745,7 +745,7 @@ builtin_chr(PyObject *module, PyObject *i) compile as builtin_compile source: object - filename: object(converter="PyUnicode_FSDecoder") + filename: unicode_fs_decoded mode: str flags: int = 0 dont_inherit: bool = False @@ -771,7 +771,7 @@ static PyObject * builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *mode, int flags, int dont_inherit, int optimize, int feature_version) -/*[clinic end generated code: output=b0c09c84f116d3d7 input=cc78e20e7c7682ba]*/ +/*[clinic end generated code: output=b0c09c84f116d3d7 input=8f0069edbdac381b]*/ { PyObject *source_copy; const char *str; @@ -889,7 +889,6 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, error: result = NULL; finally: - Py_DECREF(filename); return result; } diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index c1fcbbba8e2f57..b44a8d1e2972e4 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -296,7 +296,7 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj PyObject *argsbuf[7]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; PyObject *source; - PyObject *filename; + PyObject *filename = NULL; const char *mode; int flags = 0; int dont_inherit = 0; @@ -367,6 +367,9 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize, feature_version); exit: + /* Cleanup for filename */ + Py_XDECREF(filename); + return return_value; } @@ -1274,4 +1277,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=cd5f80e3dc3082d5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b5d2231033c7591c input=a9049054013a1b77]*/ diff --git a/Tools/clinic/libclinic/converters.py b/Tools/clinic/libclinic/converters.py index 39d0ac557a60f5..8c92b766ba0862 100644 --- a/Tools/clinic/libclinic/converters.py +++ b/Tools/clinic/libclinic/converters.py @@ -920,6 +920,26 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st return super().parse_arg(argname, displayname, limited_capi=limited_capi) +class _unicode_fs_converter_base(CConverter): + type = 'PyObject *' + + def converter_init(self) -> None: + if self.default is not unspecified: + fail(f"{self.__class__.__name__} does not support default values") + self.c_default = 'NULL' + + def cleanup(self) -> str: + return f"Py_XDECREF({self.parser_name});" + + +class unicode_fs_encoded_converter(_unicode_fs_converter_base): + converter = 'PyUnicode_FSConverter' + + +class unicode_fs_decoded_converter(_unicode_fs_converter_base): + converter = 'PyUnicode_FSDecoder' + + @add_legacy_c_converter('u') @add_legacy_c_converter('u#', zeroes=True) @add_legacy_c_converter('Z', accept={str, NoneType}) From 824c1bce4824efc0c78aaf613d3c84efe358bd4d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:38:38 +0200 Subject: [PATCH 1126/1674] [3.14] Remove Cirrus macOS runners from CI (GH-139799) (#139802) Co-authored-by: Jacob Coffee Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/build.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b245c3b6d2776a..3710adf9f12fc9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -249,23 +249,15 @@ jobs: strategy: fail-fast: false matrix: - # Cirrus and macos-14 are M1, macos-15-intel is default GHA Intel. - # macOS 13 only runs tests against the GIL-enabled CPython. - # Cirrus used for upstream, macos-14 for forks. + # macos-14 is M1, macos-15-intel is Intel. + # macos-15-intel only runs tests against the GIL-enabled CPython. os: - - ghcr.io/cirruslabs/macos-runner:sonoma - macos-14 - macos-15-intel - 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-15-intel free-threading: true uses: ./.github/workflows/reusable-macos.yml @@ -381,9 +373,8 @@ jobs: fail-fast: false matrix: include: - # Use the same runs-on configuration as build-macos and build-ubuntu. - arch: aarch64 - runs-on: ${{ github.repository_owner == 'python' && 'ghcr.io/cirruslabs/macos-runner:sonoma' || 'macos-14' }} + runs-on: macos-14 - arch: x86_64 runs-on: ubuntu-24.04 From 56072f9c050b8dd960bb5630eb924eb02a889f9b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 01:00:20 +0200 Subject: [PATCH 1127/1674] [3.14] gh-139805: Bump `test_repl_eio` timeout for slow builtbots (GH-139807) (#139812) gh-139805: Bump `test_repl_eio` timeout for slow builtbots (GH-139807) (cherry picked from commit e7e3d1d4a8dece01b1bbd0253684d5b46b2409d7) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/test/test_pyrepl/test_unix_console.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_pyrepl/test_unix_console.py b/Lib/test/test_pyrepl/test_unix_console.py index 6e422806cec47e..9ac2e9961df2dc 100644 --- a/Lib/test/test_pyrepl/test_unix_console.py +++ b/Lib/test/test_pyrepl/test_unix_console.py @@ -361,7 +361,7 @@ def test_repl_eio(self): os.kill(proc.pid, signal.SIGUSR1) # sleep for pty to settle - _, err = proc.communicate(timeout=support.SHORT_TIMEOUT) + _, err = proc.communicate(timeout=support.LONG_TIMEOUT) self.assertEqual( proc.returncode, 1, From 17873b9b9c080e5fcb36dd6131a9c1a25a97dff6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 10:25:38 +0200 Subject: [PATCH 1128/1674] [3.14] gh-139743: Avoid import-time print in test_sqlite3 (GH-139746) (GH-139828) (cherry picked from commit 65089406a54df6d3fdc65f5f7e7691ec5de088d8) Co-authored-by: Peter --- Lib/test/test_sqlite3/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_sqlite3/__init__.py b/Lib/test/test_sqlite3/__init__.py index d777fca82da4b0..78a1e2078a5da0 100644 --- a/Lib/test/test_sqlite3/__init__.py +++ b/Lib/test/test_sqlite3/__init__.py @@ -8,8 +8,7 @@ # Implement the unittest "load tests" protocol. def load_tests(*args): + if verbose: + print(f"test_sqlite3: testing with SQLite version {sqlite3.sqlite_version}") pkg_dir = os.path.dirname(__file__) return load_package_tests(pkg_dir, *args) - -if verbose: - print(f"test_sqlite3: testing with SQLite version {sqlite3.sqlite_version}") From 08faef865c6293eafe719996f3218e081db96c0a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:41:57 +0200 Subject: [PATCH 1129/1674] [3.14] gh-101100: Fix reference warnings in `c-api/init.rst` documenting `PyGILState_STATE` (GH-139572) (#139832) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/init.rst | 25 +++++++++++++++++++------ Doc/tools/.nitignore | 1 - 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index c36e0b4c000155..660ab3c3cf97ac 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1278,7 +1278,7 @@ code, or when embedding the Python interpreter: This function is safe to call without an :term:`attached thread state`; it will simply return ``NULL`` indicating that there was no prior thread state. - .. seealso: + .. seealso:: :c:func:`PyEval_ReleaseThread` .. note:: @@ -1289,6 +1289,19 @@ code, or when embedding the Python interpreter: The following functions use thread-local storage, and are not compatible with sub-interpreters: +.. c:type:: PyGILState_STATE + + The type of the value returned by :c:func:`PyGILState_Ensure` and passed to + :c:func:`PyGILState_Release`. + + .. c:enumerator:: PyGILState_LOCKED + + The GIL was already held when :c:func:`PyGILState_Ensure` was called. + + .. c:enumerator:: PyGILState_UNLOCKED + + The GIL was not held when :c:func:`PyGILState_Ensure` was called. + .. c:function:: PyGILState_STATE PyGILState_Ensure() Ensure that the current thread is ready to call the Python C API regardless @@ -1339,12 +1352,12 @@ with sub-interpreters: made on the main thread. This is mainly a helper/diagnostic function. .. note:: - This function does not account for :term:`thread states ` created - by something other than :c:func:`PyGILState_Ensure` (such as :c:func:`PyThreadState_New`). + This function may return non-``NULL`` even when the :term:`thread state` + is detached. Prefer :c:func:`PyThreadState_Get` or :c:func:`PyThreadState_GetUnchecked` for most cases. - .. seealso: :c:func:`PyThreadState_Get`` + .. seealso:: :c:func:`PyThreadState_Get` .. c:function:: int PyGILState_Check() @@ -1443,11 +1456,11 @@ All of the following functions must be called after :c:func:`Py_Initialize`. must be :term:`attached ` .. versionchanged:: 3.9 - This function now calls the :c:member:`PyThreadState.on_delete` callback. + 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. + The :c:member:`!PyThreadState.on_delete` callback was removed. .. c:function:: void PyThreadState_Delete(PyThreadState *tstate) diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 4ee09c6bbaa069..827c5808fa5865 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -4,7 +4,6 @@ Doc/c-api/descriptor.rst Doc/c-api/float.rst -Doc/c-api/init.rst Doc/c-api/init_config.rst Doc/c-api/intro.rst Doc/c-api/module.rst From 342b644bd22e27bb4f0ed886736c088de40dd121 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:51:58 +0200 Subject: [PATCH 1130/1674] [3.14] gh-139742: Add support for Python 3.14 t-string prefixes in IDLE colorizer and tests (GH-139756) (#139831) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-139742: Add support for Python 3.14 t-string prefixes in IDLE colorizer and tests (GH-139756) Add 't' prefix to colorizer.py stringprefix regex to support Python 3.14 template strings. Add t prefixes to test_colorizer.py source test text and adjust line numbers on test methods. --------- (cherry picked from commit 6fd141834193e3dc2423e785d97eb127c972a70e) Co-authored-by: Anuradha Agrawal Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Łukasz Langa Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/idlelib/colorizer.py | 2 +- Lib/idlelib/idle_test/test_colorizer.py | 29 ++++++++++--------- ...-10-08-08-35-50.gh-issue-139742.B3fZLg.rst | 1 + 3 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index b4df353012b788..bffa2ddd3cd9cd 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -47,7 +47,7 @@ def make_pat(): name not in keyword.kwlist] builtin = r"([^.'\"\\#]\b|^)" + any("BUILTIN", builtinlist) + r"\b" comment = any("COMMENT", [r"#[^\n]*"]) - stringprefix = r"(?i:r|u|f|fr|rf|b|br|rb)?" + stringprefix = r"(?i:r|u|f|fr|rf|b|br|rb|t|rt|tr)?" sqstring = stringprefix + r"'[^'\\\n]*(\\.[^'\\\n]*)*'?" dqstring = stringprefix + r'"[^"\\\n]*(\\.[^"\\\n]*)*"?' sq3string = stringprefix + r"'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?" diff --git a/Lib/idlelib/idle_test/test_colorizer.py b/Lib/idlelib/idle_test/test_colorizer.py index 308bc389384d33..40800df97b0bd3 100644 --- a/Lib/idlelib/idle_test/test_colorizer.py +++ b/Lib/idlelib/idle_test/test_colorizer.py @@ -36,6 +36,7 @@ async def f(): await g() # All valid prefixes for unicode and byte strings should be colored. r'x', u'x', R'x', U'x', f'x', F'x' fr'x', Fr'x', fR'x', FR'x', rf'x', rF'x', Rf'x', RF'x' + tr'x', Tr'x', tR'x', TR'x', rt'x', rT'x', Rt'x', RT'x' b'x',B'x', br'x',Br'x',bR'x',BR'x', rb'x', rB'x',Rb'x',RB'x' # Invalid combinations of legal characters should be half colored. ur'x', ru'x', uf'x', fu'x', UR'x', ufr'x', rfu'x', xf'x', fx'x' @@ -390,19 +391,19 @@ def test_recolorize_main(self, mock_notify): ('6.0', ('KEYWORD',)), ('6.10', ('DEFINITION',)), ('6.11', ()), ('8.0', ('STRING',)), ('8.4', ()), ('8.5', ('STRING',)), ('8.12', ()), ('8.14', ('STRING',)), - ('19.0', ('KEYWORD',)), - ('20.4', ('KEYWORD',)), ('20.16', ('KEYWORD',)),# ('20.19', ('KEYWORD',)), - #('22.4', ('KEYWORD',)), ('22.10', ('KEYWORD',)), ('22.14', ('KEYWORD',)), ('22.19', ('STRING',)), - #('23.12', ('KEYWORD',)), - ('24.8', ('KEYWORD',)), - ('25.4', ('KEYWORD',)), ('25.9', ('KEYWORD',)), - ('25.11', ('KEYWORD',)), ('25.15', ('STRING',)), - ('25.19', ('KEYWORD',)), ('25.22', ()), - ('25.24', ('KEYWORD',)), ('25.29', ('BUILTIN',)), ('25.37', ('KEYWORD',)), - ('26.4', ('KEYWORD',)), ('26.9', ('KEYWORD',)),# ('26.11', ('KEYWORD',)), ('26.14', (),), - ('27.25', ('STRING',)), ('27.38', ('STRING',)), - ('29.0', ('STRING',)), - ('30.1', ('STRING',)), + ('20.0', ('KEYWORD',)), + ('21.4', ('KEYWORD',)), ('21.16', ('KEYWORD',)),# ('21.19', ('KEYWORD',)), + #('23.4', ('KEYWORD',)), ('23.10', ('KEYWORD',)), ('23.14', ('KEYWORD',)), ('23.19', ('STRING',)), + #('24.12', ('KEYWORD',)), + ('25.8', ('KEYWORD',)), + ('26.4', ('KEYWORD',)), ('26.9', ('KEYWORD',)), + ('26.11', ('KEYWORD',)), ('26.15', ('STRING',)), + ('26.19', ('KEYWORD',)), ('26.22', ()), + ('26.24', ('KEYWORD',)), ('26.29', ('BUILTIN',)), ('26.37', ('KEYWORD',)), + ('27.4', ('KEYWORD',)), ('27.9', ('KEYWORD',)),# ('27.11', ('KEYWORD',)), ('27.14', (),), + ('28.25', ('STRING',)), ('28.38', ('STRING',)), + ('30.0', ('STRING',)), + ('31.1', ('STRING',)), # SYNC at the end of every line. ('1.55', ('SYNC',)), ('2.50', ('SYNC',)), ('3.34', ('SYNC',)), ) @@ -433,7 +434,7 @@ def test_recolorize_main(self, mock_notify): eq(text.tag_nextrange('STRING', '8.12'), ('8.14', '8.17')) eq(text.tag_nextrange('STRING', '8.17'), ('8.19', '8.26')) eq(text.tag_nextrange('SYNC', '8.0'), ('8.26', '9.0')) - eq(text.tag_nextrange('SYNC', '30.0'), ('30.10', '32.0')) + eq(text.tag_nextrange('SYNC', '31.0'), ('31.10', '33.0')) def _assert_highlighting(self, source, tag_ranges): """Check highlighting of a given piece of code. diff --git a/Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst b/Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst new file mode 100644 index 00000000000000..c9e2f977a7967d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst @@ -0,0 +1 @@ +Colorize t-string prefixes for template strings in IDLE, as done for f-string prefixes. From 7c03e9078d8b41b3e558aab2b09face5e12b308c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 13:12:25 +0200 Subject: [PATCH 1131/1674] [3.14] GH-129805: Clean up some changes from GH-129806 (GH-133540) (#138972) Co-authored-by: Brandt Bucher --- Tools/jit/_stencils.py | 6 +----- Tools/jit/_targets.py | 17 ++++------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/Tools/jit/_stencils.py b/Tools/jit/_stencils.py index 03b0ba647b0db7..5977a7a30502ba 100644 --- a/Tools/jit/_stencils.py +++ b/Tools/jit/_stencils.py @@ -140,11 +140,7 @@ class Hole: def __post_init__(self) -> None: self.func = _PATCH_FUNCS[self.kind] - def fold( - self, - other: typing.Self, - body: bytes | bytearray, - ) -> typing.Self | None: + def fold(self, other: typing.Self, body: bytearray) -> typing.Self | None: """Combine two holes into a single hole, if possible.""" instruction_a = int.from_bytes( body[self.offset : self.offset + 4], byteorder=sys.byteorder diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index b383e39da19456..ed63e388e433b9 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -114,7 +114,7 @@ def _handle_section(self, section: _S, group: _stencils.StencilGroup) -> None: raise NotImplementedError(type(self)) def _handle_relocation( - self, base: int, relocation: _R, raw: bytes | bytearray + self, base: int, relocation: _R, raw: bytearray ) -> _stencils.Hole: raise NotImplementedError(type(self)) @@ -282,10 +282,7 @@ def _unwrap_dllimport(self, name: str) -> tuple[_stencils.HoleValue, str | None] return _stencils.symbol_to_value(name) def _handle_relocation( - self, - base: int, - relocation: _schema.COFFRelocation, - raw: bytes | bytearray, + self, base: int, relocation: _schema.COFFRelocation, raw: bytearray ) -> _stencils.Hole: match relocation: case { @@ -380,10 +377,7 @@ def _handle_section( }, section_type def _handle_relocation( - self, - base: int, - relocation: _schema.ELFRelocation, - raw: bytes | bytearray, + self, base: int, relocation: _schema.ELFRelocation, raw: bytearray ) -> _stencils.Hole: symbol: str | None match relocation: @@ -459,10 +453,7 @@ def _handle_section( stencil.holes.append(hole) def _handle_relocation( - self, - base: int, - relocation: _schema.MachORelocation, - raw: bytes | bytearray, + self, base: int, relocation: _schema.MachORelocation, raw: bytearray ) -> _stencils.Hole: symbol: str | None match relocation: From 926d734840654f106ffc9b703036756e6f32d356 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Thu, 9 Oct 2025 20:19:03 +0530 Subject: [PATCH 1132/1674] [3.14] gh-116738: make `mmap` module thread-safe (GH-139237) (#139825) * [3.14] gh-116738: make `mmap` module thread-safe (GH-139237) (cherry picked from commit 7f155f9c46e2dd7dec5e12ebec3323dfd95fe1f0) Co-authored-by: Alper --- Lib/test/test_free_threading/test_mmap.py | 270 ++++++ Lib/test/test_mmap.py | 8 + ...-09-21-14-33-17.gh-issue-116738.vNaI4h.rst | 2 + Modules/clinic/mmapmodule.c.h | 769 ++++++++++++++++++ Modules/mmapmodule.c | 645 ++++++++++----- 5 files changed, 1497 insertions(+), 197 deletions(-) create mode 100644 Lib/test/test_free_threading/test_mmap.py create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst create mode 100644 Modules/clinic/mmapmodule.c.h diff --git a/Lib/test/test_free_threading/test_mmap.py b/Lib/test/test_free_threading/test_mmap.py new file mode 100644 index 00000000000000..e23a0ee5da45b1 --- /dev/null +++ b/Lib/test/test_free_threading/test_mmap.py @@ -0,0 +1,270 @@ +import unittest + +from test.support import import_helper, threading_helper +from test.support.threading_helper import run_concurrently + +import os +import string +import tempfile +import threading + +from collections import Counter + +mmap = import_helper.import_module("mmap") + +NTHREADS = 10 +ANONYMOUS_MEM = -1 + + +@threading_helper.requires_working_threading() +class MmapTests(unittest.TestCase): + def test_read_and_read_byte(self): + ascii_uppercase = string.ascii_uppercase.encode() + # Choose a total mmap size that evenly divides across threads and the + # read pattern (3 bytes per loop). + mmap_size = 3 * NTHREADS * len(ascii_uppercase) + num_bytes_to_read_per_thread = mmap_size // NTHREADS + bytes_read_from_mmap = [] + + def read(mm_obj): + nread = 0 + while nread < num_bytes_to_read_per_thread: + b = mm_obj.read_byte() + bytes_read_from_mmap.append(b) + b = mm_obj.read(2) + bytes_read_from_mmap.extend(b) + nread += 3 + + with mmap.mmap(ANONYMOUS_MEM, mmap_size) as mm_obj: + for i in range(mmap_size // len(ascii_uppercase)): + mm_obj.write(ascii_uppercase) + + mm_obj.seek(0) + run_concurrently( + worker_func=read, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + self.assertEqual(len(bytes_read_from_mmap), mmap_size) + # Count each letter/byte to verify read correctness + counter = Counter(bytes_read_from_mmap) + self.assertEqual(len(counter), len(ascii_uppercase)) + # Each letter/byte should be read (3 * NTHREADS) times + for letter in ascii_uppercase: + self.assertEqual(counter[letter], 3 * NTHREADS) + + def test_readline(self): + num_lines = 1000 + lines_read_from_mmap = [] + expected_lines = [] + + def readline(mm_obj): + for i in range(num_lines // NTHREADS): + line = mm_obj.readline() + lines_read_from_mmap.append(line) + + # Allocate mmap enough for num_lines (max line 5 bytes including NL) + with mmap.mmap(ANONYMOUS_MEM, num_lines * 5) as mm_obj: + for i in range(num_lines): + line = b"%d\n" % i + mm_obj.write(line) + expected_lines.append(line) + + mm_obj.seek(0) + run_concurrently( + worker_func=readline, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + self.assertEqual(len(lines_read_from_mmap), num_lines) + # Every line should be read once by threads; order is non-deterministic + # Sort numerically by integer value + lines_read_from_mmap.sort(key=lambda x: int(x)) + self.assertEqual(lines_read_from_mmap, expected_lines) + + def test_write_and_write_byte(self): + thread_letters = list(string.ascii_uppercase) + self.assertLessEqual(NTHREADS, len(thread_letters)) + per_thread_write_loop = 100 + + def write(mm_obj): + # Each thread picks a unique letter to write + thread_letter = thread_letters.pop(0) + thread_bytes = (thread_letter * 2).encode() + for _ in range(per_thread_write_loop): + mm_obj.write_byte(thread_bytes[0]) + mm_obj.write(thread_bytes) + + with mmap.mmap( + ANONYMOUS_MEM, per_thread_write_loop * 3 * NTHREADS + ) as mm_obj: + run_concurrently( + worker_func=write, + args=(mm_obj,), + nthreads=NTHREADS, + ) + mm_obj.seek(0) + data = mm_obj.read() + self.assertEqual(len(data), NTHREADS * per_thread_write_loop * 3) + counter = Counter(data) + self.assertEqual(len(counter), NTHREADS) + # Each thread letter should be written `per_thread_write_loop` * 3 + for letter in counter: + self.assertEqual(counter[letter], per_thread_write_loop * 3) + + def test_move(self): + ascii_uppercase = string.ascii_uppercase.encode() + num_letters = len(ascii_uppercase) + + def move(mm_obj): + for i in range(num_letters): + # Move 1 byte from the first half to the second half + mm_obj.move(0 + i, num_letters + i, 1) + + with mmap.mmap(ANONYMOUS_MEM, 2 * num_letters) as mm_obj: + mm_obj.write(ascii_uppercase) + run_concurrently( + worker_func=move, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + def test_seek_and_tell(self): + seek_per_thread = 10 + + def seek(mm_obj): + self.assertTrue(mm_obj.seekable()) + for _ in range(seek_per_thread): + before_seek = mm_obj.tell() + mm_obj.seek(1, os.SEEK_CUR) + self.assertLess(before_seek, mm_obj.tell()) + + with mmap.mmap(ANONYMOUS_MEM, 1024) as mm_obj: + run_concurrently( + worker_func=seek, + args=(mm_obj,), + nthreads=NTHREADS, + ) + # Each thread seeks from current position, the end position should + # be the sum of all seeks from all threads. + self.assertEqual(mm_obj.tell(), NTHREADS * seek_per_thread) + + def test_slice_update_and_slice_read(self): + thread_letters = list(string.ascii_uppercase) + self.assertLessEqual(NTHREADS, len(thread_letters)) + + def slice_update_and_slice_read(mm_obj): + # Each thread picks a unique letter to write + thread_letter = thread_letters.pop(0) + thread_bytes = (thread_letter * 1024).encode() + for _ in range(100): + mm_obj[:] = thread_bytes + read_bytes = mm_obj[:] + # Read bytes should be all the same letter, showing no + # interleaving + self.assertTrue(all_same(read_bytes)) + + with mmap.mmap(ANONYMOUS_MEM, 1024) as mm_obj: + run_concurrently( + worker_func=slice_update_and_slice_read, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + def test_item_update_and_item_read(self): + thread_indexes = [i for i in range(NTHREADS)] + + def item_update_and_item_read(mm_obj): + # Each thread picks a unique index to write + thread_index = thread_indexes.pop() + for i in range(100): + mm_obj[thread_index] = i + self.assertEqual(mm_obj[thread_index], i) + + # Read values set by other threads, all values + # should be less than '100' + for val in mm_obj: + self.assertLess(int.from_bytes(val), 100) + + with mmap.mmap(ANONYMOUS_MEM, NTHREADS + 1) as mm_obj: + run_concurrently( + worker_func=item_update_and_item_read, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + def test_close_and_closed(self): + def close_mmap(mm_obj): + mm_obj.close() + self.assertTrue(mm_obj.closed) + + with mmap.mmap(ANONYMOUS_MEM, 1) as mm_obj: + run_concurrently( + worker_func=close_mmap, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + def test_find_and_rfind(self): + per_thread_loop = 10 + + def find_and_rfind(mm_obj): + pattern = b'Thread-Ident:"%d"' % threading.get_ident() + mm_obj.write(pattern) + for _ in range(per_thread_loop): + found_at = mm_obj.find(pattern, 0) + self.assertNotEqual(found_at, -1) + # Should not find it after the `found_at` + self.assertEqual(mm_obj.find(pattern, found_at + 1), -1) + found_at_rev = mm_obj.rfind(pattern, 0) + self.assertEqual(found_at, found_at_rev) + # Should not find it after the `found_at` + self.assertEqual(mm_obj.rfind(pattern, found_at + 1), -1) + + with mmap.mmap(ANONYMOUS_MEM, 1024) as mm_obj: + run_concurrently( + worker_func=find_and_rfind, + args=(mm_obj,), + nthreads=NTHREADS, + ) + + def test_mmap_export_as_memoryview(self): + """ + Each thread creates a memoryview and updates the internal state of the + mmap object. + """ + buffer_size = 42 + + def create_memoryview_from_mmap(mm_obj): + memoryviews = [] + for _ in range(100): + mv = memoryview(mm_obj) + memoryviews.append(mv) + self.assertEqual(len(mv), buffer_size) + self.assertEqual(mv[:7], b"CPython") + + # Cannot close the mmap while it is exported as buffers + with self.assertRaisesRegex( + BufferError, "cannot close exported pointers exist" + ): + mm_obj.close() + + with mmap.mmap(ANONYMOUS_MEM, 42) as mm_obj: + mm_obj.write(b"CPython") + run_concurrently( + worker_func=create_memoryview_from_mmap, + args=(mm_obj,), + nthreads=NTHREADS, + ) + # Implicit mm_obj.close() verifies all exports (memoryviews) are + # properly freed. + + +def all_same(lst): + return all(item == lst[0] for item in lst) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 38d1a496c30e21..f468dda1d163c4 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -887,6 +887,10 @@ def test_madvise(self): size = 2 * PAGESIZE m = mmap.mmap(-1, size) + class Number: + def __index__(self): + return 2 + with self.assertRaisesRegex(ValueError, "madvise start out of bounds"): m.madvise(mmap.MADV_NORMAL, size) with self.assertRaisesRegex(ValueError, "madvise start out of bounds"): @@ -895,10 +899,14 @@ def test_madvise(self): m.madvise(mmap.MADV_NORMAL, 0, -1) with self.assertRaisesRegex(OverflowError, "madvise length too large"): m.madvise(mmap.MADV_NORMAL, PAGESIZE, sys.maxsize) + with self.assertRaisesRegex( + TypeError, "'str' object cannot be interpreted as an integer"): + m.madvise(mmap.MADV_NORMAL, PAGESIZE, "Not a Number") self.assertEqual(m.madvise(mmap.MADV_NORMAL), None) self.assertEqual(m.madvise(mmap.MADV_NORMAL, PAGESIZE), None) self.assertEqual(m.madvise(mmap.MADV_NORMAL, PAGESIZE, size), None) self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, 2), None) + self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, Number()), None) self.assertEqual(m.madvise(mmap.MADV_NORMAL, 0, size), None) def test_resize_up_anonymous_mapping(self): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst new file mode 100644 index 00000000000000..0668d57604bc43 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst @@ -0,0 +1,2 @@ +Make :mod:`mmap` thread-safe on the :term:`free threaded ` +build. diff --git a/Modules/clinic/mmapmodule.c.h b/Modules/clinic/mmapmodule.c.h new file mode 100644 index 00000000000000..e00f82fb88bdd1 --- /dev/null +++ b/Modules/clinic/mmapmodule.c.h @@ -0,0 +1,769 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +#include "pycore_abstract.h" // _PyNumber_Index() +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() +#include "pycore_modsupport.h" // _PyArg_CheckPositional() + +PyDoc_STRVAR(mmap_mmap_close__doc__, +"close($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_CLOSE_METHODDEF \ + {"close", (PyCFunction)mmap_mmap_close, METH_NOARGS, mmap_mmap_close__doc__}, + +static PyObject * +mmap_mmap_close_impl(mmap_object *self); + +static PyObject * +mmap_mmap_close(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_close_impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_read_byte__doc__, +"read_byte($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_READ_BYTE_METHODDEF \ + {"read_byte", (PyCFunction)mmap_mmap_read_byte, METH_NOARGS, mmap_mmap_read_byte__doc__}, + +static PyObject * +mmap_mmap_read_byte_impl(mmap_object *self); + +static PyObject * +mmap_mmap_read_byte(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_read_byte_impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_readline__doc__, +"readline($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_READLINE_METHODDEF \ + {"readline", (PyCFunction)mmap_mmap_readline, METH_NOARGS, mmap_mmap_readline__doc__}, + +static PyObject * +mmap_mmap_readline_impl(mmap_object *self); + +static PyObject * +mmap_mmap_readline(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_readline_impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_read__doc__, +"read($self, n=None, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_READ_METHODDEF \ + {"read", _PyCFunction_CAST(mmap_mmap_read), METH_FASTCALL, mmap_mmap_read__doc__}, + +static PyObject * +mmap_mmap_read_impl(mmap_object *self, Py_ssize_t num_bytes); + +static PyObject * +mmap_mmap_read(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_ssize_t num_bytes = PY_SSIZE_T_MAX; + + if (!_PyArg_CheckPositional("read", nargs, 0, 1)) { + goto exit; + } + if (nargs < 1) { + goto skip_optional; + } + if (!_Py_convert_optional_to_ssize_t(args[0], &num_bytes)) { + goto exit; + } +skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_read_impl((mmap_object *)self, num_bytes); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_find__doc__, +"find($self, view, start=None, end=None, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_FIND_METHODDEF \ + {"find", _PyCFunction_CAST(mmap_mmap_find), METH_FASTCALL, mmap_mmap_find__doc__}, + +static PyObject * +mmap_mmap_find_impl(mmap_object *self, Py_buffer *view, PyObject *start, + PyObject *end); + +static PyObject * +mmap_mmap_find(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_buffer view = {NULL, NULL}; + PyObject *start = Py_None; + PyObject *end = Py_None; + + if (!_PyArg_CheckPositional("find", nargs, 1, 3)) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &view, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (nargs < 2) { + goto skip_optional; + } + start = args[1]; + if (nargs < 3) { + goto skip_optional; + } + end = args[2]; +skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_find_impl((mmap_object *)self, &view, start, end); + Py_END_CRITICAL_SECTION(); + +exit: + /* Cleanup for view */ + if (view.obj) { + PyBuffer_Release(&view); + } + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_rfind__doc__, +"rfind($self, view, start=None, end=None, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_RFIND_METHODDEF \ + {"rfind", _PyCFunction_CAST(mmap_mmap_rfind), METH_FASTCALL, mmap_mmap_rfind__doc__}, + +static PyObject * +mmap_mmap_rfind_impl(mmap_object *self, Py_buffer *view, PyObject *start, + PyObject *end); + +static PyObject * +mmap_mmap_rfind(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_buffer view = {NULL, NULL}; + PyObject *start = Py_None; + PyObject *end = Py_None; + + if (!_PyArg_CheckPositional("rfind", nargs, 1, 3)) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &view, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (nargs < 2) { + goto skip_optional; + } + start = args[1]; + if (nargs < 3) { + goto skip_optional; + } + end = args[2]; +skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_rfind_impl((mmap_object *)self, &view, start, end); + Py_END_CRITICAL_SECTION(); + +exit: + /* Cleanup for view */ + if (view.obj) { + PyBuffer_Release(&view); + } + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_write__doc__, +"write($self, bytes, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_WRITE_METHODDEF \ + {"write", (PyCFunction)mmap_mmap_write, METH_O, mmap_mmap_write__doc__}, + +static PyObject * +mmap_mmap_write_impl(mmap_object *self, Py_buffer *data); + +static PyObject * +mmap_mmap_write(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer data = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_write_impl((mmap_object *)self, &data); + Py_END_CRITICAL_SECTION(); + +exit: + /* Cleanup for data */ + if (data.obj) { + PyBuffer_Release(&data); + } + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_write_byte__doc__, +"write_byte($self, byte, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_WRITE_BYTE_METHODDEF \ + {"write_byte", (PyCFunction)mmap_mmap_write_byte, METH_O, mmap_mmap_write_byte__doc__}, + +static PyObject * +mmap_mmap_write_byte_impl(mmap_object *self, unsigned char value); + +static PyObject * +mmap_mmap_write_byte(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + unsigned char value; + + { + long ival = PyLong_AsLong(arg); + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + else if (ival < 0) { + PyErr_SetString(PyExc_OverflowError, + "unsigned byte integer is less than minimum"); + goto exit; + } + else if (ival > UCHAR_MAX) { + PyErr_SetString(PyExc_OverflowError, + "unsigned byte integer is greater than maximum"); + goto exit; + } + else { + value = (unsigned char) ival; + } + } + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_write_byte_impl((mmap_object *)self, value); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_size__doc__, +"size($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_SIZE_METHODDEF \ + {"size", (PyCFunction)mmap_mmap_size, METH_NOARGS, mmap_mmap_size__doc__}, + +static PyObject * +mmap_mmap_size_impl(mmap_object *self); + +static PyObject * +mmap_mmap_size(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_size_impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_resize__doc__, +"resize($self, newsize, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_RESIZE_METHODDEF \ + {"resize", (PyCFunction)mmap_mmap_resize, METH_O, mmap_mmap_resize__doc__}, + +static PyObject * +mmap_mmap_resize_impl(mmap_object *self, Py_ssize_t new_size); + +static PyObject * +mmap_mmap_resize(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_ssize_t new_size; + + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(arg); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + new_size = ival; + } + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_resize_impl((mmap_object *)self, new_size); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_tell__doc__, +"tell($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_TELL_METHODDEF \ + {"tell", (PyCFunction)mmap_mmap_tell, METH_NOARGS, mmap_mmap_tell__doc__}, + +static PyObject * +mmap_mmap_tell_impl(mmap_object *self); + +static PyObject * +mmap_mmap_tell(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_tell_impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_flush__doc__, +"flush($self, offset=0, size=None, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_FLUSH_METHODDEF \ + {"flush", _PyCFunction_CAST(mmap_mmap_flush), METH_FASTCALL, mmap_mmap_flush__doc__}, + +static PyObject * +mmap_mmap_flush_impl(mmap_object *self, Py_ssize_t offset, + PyObject *size_obj); + +static PyObject * +mmap_mmap_flush(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_ssize_t offset = 0; + PyObject *size_obj = Py_None; + + if (!_PyArg_CheckPositional("flush", nargs, 0, 2)) { + goto exit; + } + if (nargs < 1) { + goto skip_optional; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + offset = ival; + } + if (nargs < 2) { + goto skip_optional; + } + size_obj = args[1]; +skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_flush_impl((mmap_object *)self, offset, size_obj); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_seek__doc__, +"seek($self, pos, whence=0, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_SEEK_METHODDEF \ + {"seek", _PyCFunction_CAST(mmap_mmap_seek), METH_FASTCALL, mmap_mmap_seek__doc__}, + +static PyObject * +mmap_mmap_seek_impl(mmap_object *self, Py_ssize_t dist, int how); + +static PyObject * +mmap_mmap_seek(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_ssize_t dist; + int how = 0; + + if (!_PyArg_CheckPositional("seek", nargs, 1, 2)) { + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + dist = ival; + } + if (nargs < 2) { + goto skip_optional; + } + how = PyLong_AsInt(args[1]); + if (how == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_seek_impl((mmap_object *)self, dist, how); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +PyDoc_STRVAR(mmap_mmap_seekable__doc__, +"seekable($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_SEEKABLE_METHODDEF \ + {"seekable", (PyCFunction)mmap_mmap_seekable, METH_NOARGS, mmap_mmap_seekable__doc__}, + +static PyObject * +mmap_mmap_seekable_impl(mmap_object *self); + +static PyObject * +mmap_mmap_seekable(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return mmap_mmap_seekable_impl((mmap_object *)self); +} + +PyDoc_STRVAR(mmap_mmap_move__doc__, +"move($self, dest, src, count, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_MOVE_METHODDEF \ + {"move", _PyCFunction_CAST(mmap_mmap_move), METH_FASTCALL, mmap_mmap_move__doc__}, + +static PyObject * +mmap_mmap_move_impl(mmap_object *self, Py_ssize_t dest, Py_ssize_t src, + Py_ssize_t cnt); + +static PyObject * +mmap_mmap_move(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + Py_ssize_t dest; + Py_ssize_t src; + Py_ssize_t cnt; + + if (!_PyArg_CheckPositional("move", nargs, 3, 3)) { + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + dest = ival; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + src = ival; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + cnt = ival; + } + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_move_impl((mmap_object *)self, dest, src, cnt); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +PyDoc_STRVAR(mmap_mmap___enter____doc__, +"__enter__($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP___ENTER___METHODDEF \ + {"__enter__", (PyCFunction)mmap_mmap___enter__, METH_NOARGS, mmap_mmap___enter____doc__}, + +static PyObject * +mmap_mmap___enter___impl(mmap_object *self); + +static PyObject * +mmap_mmap___enter__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap___enter___impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(mmap_mmap___exit____doc__, +"__exit__($self, exc_type, exc_value, traceback, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP___EXIT___METHODDEF \ + {"__exit__", _PyCFunction_CAST(mmap_mmap___exit__), METH_FASTCALL, mmap_mmap___exit____doc__}, + +static PyObject * +mmap_mmap___exit___impl(mmap_object *self, PyObject *exc_type, + PyObject *exc_value, PyObject *traceback); + +static PyObject * +mmap_mmap___exit__(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *exc_type; + PyObject *exc_value; + PyObject *traceback; + + if (!_PyArg_CheckPositional("__exit__", nargs, 3, 3)) { + goto exit; + } + exc_type = args[0]; + exc_value = args[1]; + traceback = args[2]; + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap___exit___impl((mmap_object *)self, exc_type, exc_value, traceback); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(mmap_mmap___sizeof____doc__, +"__sizeof__($self, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP___SIZEOF___METHODDEF \ + {"__sizeof__", (PyCFunction)mmap_mmap___sizeof__, METH_NOARGS, mmap_mmap___sizeof____doc__}, + +static PyObject * +mmap_mmap___sizeof___impl(mmap_object *self); + +static PyObject * +mmap_mmap___sizeof__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap___sizeof___impl((mmap_object *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if (defined(MS_WINDOWS) && defined(Py_DEBUG)) + +PyDoc_STRVAR(mmap_mmap__protect__doc__, +"_protect($self, flNewProtect, start, length, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP__PROTECT_METHODDEF \ + {"_protect", _PyCFunction_CAST(mmap_mmap__protect), METH_FASTCALL, mmap_mmap__protect__doc__}, + +static PyObject * +mmap_mmap__protect_impl(mmap_object *self, unsigned int flNewProtect, + Py_ssize_t start, Py_ssize_t length); + +static PyObject * +mmap_mmap__protect(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + unsigned int flNewProtect; + Py_ssize_t start; + Py_ssize_t length; + + if (!_PyArg_CheckPositional("_protect", nargs, 3, 3)) { + goto exit; + } + flNewProtect = (unsigned int)PyLong_AsUnsignedLongMask(args[0]); + if (flNewProtect == (unsigned int)-1 && PyErr_Occurred()) { + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + start = ival; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap__protect_impl((mmap_object *)self, flNewProtect, start, length); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +#endif /* (defined(MS_WINDOWS) && defined(Py_DEBUG)) */ + +#if defined(HAVE_MADVISE) + +PyDoc_STRVAR(mmap_mmap_madvise__doc__, +"madvise($self, option, start=0, length=None, /)\n" +"--\n" +"\n"); + +#define MMAP_MMAP_MADVISE_METHODDEF \ + {"madvise", _PyCFunction_CAST(mmap_mmap_madvise), METH_FASTCALL, mmap_mmap_madvise__doc__}, + +static PyObject * +mmap_mmap_madvise_impl(mmap_object *self, int option, Py_ssize_t start, + PyObject *length_obj); + +static PyObject * +mmap_mmap_madvise(PyObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int option; + Py_ssize_t start = 0; + PyObject *length_obj = Py_None; + + if (!_PyArg_CheckPositional("madvise", nargs, 1, 3)) { + goto exit; + } + option = PyLong_AsInt(args[0]); + if (option == -1 && PyErr_Occurred()) { + goto exit; + } + if (nargs < 2) { + goto skip_optional; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + start = ival; + } + if (nargs < 3) { + goto skip_optional; + } + length_obj = args[2]; +skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); + return_value = mmap_mmap_madvise_impl((mmap_object *)self, option, start, length_obj); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; +} + +#endif /* defined(HAVE_MADVISE) */ + +#ifndef MMAP_MMAP___SIZEOF___METHODDEF + #define MMAP_MMAP___SIZEOF___METHODDEF +#endif /* !defined(MMAP_MMAP___SIZEOF___METHODDEF) */ + +#ifndef MMAP_MMAP__PROTECT_METHODDEF + #define MMAP_MMAP__PROTECT_METHODDEF +#endif /* !defined(MMAP_MMAP__PROTECT_METHODDEF) */ + +#ifndef MMAP_MMAP_MADVISE_METHODDEF + #define MMAP_MMAP_MADVISE_METHODDEF +#endif /* !defined(MMAP_MMAP_MADVISE_METHODDEF) */ +/*[clinic end generated code: output=fe4e2131abc1e971 input=a9049054013a1b77]*/ diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index f58a48900bf6d7..43f4763c4fdc0d 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -91,6 +91,12 @@ my_getpagesize(void) # define MAP_ANONYMOUS MAP_ANON #endif +/*[clinic input] +module mmap +class mmap.mmap "mmap_object *" "" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=82a9f8a529905b9b]*/ + typedef enum { ACCESS_DEFAULT, @@ -129,6 +135,27 @@ typedef struct { #define mmap_object_CAST(op) ((mmap_object *)(op)) +#include "clinic/mmapmodule.c.h" + + +/* Return a Py_ssize_t from the object arg. This conversion logic is similar + to what AC uses for `Py_ssize_t` arguments. + + Returns -1 on error. Use PyErr_Occurred() to disambiguate. +*/ +static Py_ssize_t +_As_Py_ssize_t(PyObject *arg) { + assert(arg != NULL); + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(arg); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + return ival; +} + + static int mmap_object_traverse(PyObject *op, visitproc visit, void *arg) { @@ -172,10 +199,16 @@ mmap_object_dealloc(PyObject *op) Py_DECREF(tp); } +/*[clinic input] +@critical_section +mmap.mmap.close + +[clinic start generated code]*/ + static PyObject * -mmap_close_method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap_close_impl(mmap_object *self) +/*[clinic end generated code: output=a1ae0c727546f78d input=25020035f047eae1]*/ { - mmap_object *self = mmap_object_CAST(op); if (self->exports > 0) { PyErr_SetString(PyExc_BufferError, "cannot close "\ "exported pointers exist"); @@ -463,10 +496,16 @@ _safe_PyBytes_FromStringAndSize(char *start, size_t num_bytes) { } } +/*[clinic input] +@critical_section +mmap.mmap.read_byte + +[clinic start generated code]*/ + static PyObject * -mmap_read_byte_method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap_read_byte_impl(mmap_object *self) +/*[clinic end generated code: output=d931da1319f3869b input=5b8c6a904bdddda9]*/ { - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); if (self->pos >= self->size) { PyErr_SetString(PyExc_ValueError, "read byte out of range"); @@ -480,12 +519,18 @@ mmap_read_byte_method(PyObject *op, PyObject *Py_UNUSED(ignored)) return PyLong_FromLong((unsigned char) dest); } +/*[clinic input] +@critical_section +mmap.mmap.readline + +[clinic start generated code]*/ + static PyObject * -mmap_read_line_method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap_readline_impl(mmap_object *self) +/*[clinic end generated code: output=b9d2bf9999283311 input=2c4efd1d06e1cdd1]*/ { Py_ssize_t remaining; char *start, *eol; - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); @@ -510,16 +555,22 @@ mmap_read_line_method(PyObject *op, PyObject *Py_UNUSED(ignored)) return result; } +/*[clinic input] +@critical_section +mmap.mmap.read + + n as num_bytes: object(converter='_Py_convert_optional_to_ssize_t', type='Py_ssize_t', c_default='PY_SSIZE_T_MAX') = None + / + +[clinic start generated code]*/ + static PyObject * -mmap_read_method(PyObject *op, PyObject *args) +mmap_mmap_read_impl(mmap_object *self, Py_ssize_t num_bytes) +/*[clinic end generated code: output=3b4d4f3704ed0969 input=8f97f361d435e357]*/ { - Py_ssize_t num_bytes = PY_SSIZE_T_MAX, remaining; - mmap_object *self = mmap_object_CAST(op); + Py_ssize_t remaining; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "|O&:read", _Py_convert_optional_to_ssize_t, &num_bytes)) - return NULL; - CHECK_VALID(NULL); /* silently 'adjust' out-of-range requests */ remaining = (self->pos < self->size) ? self->size - self->pos : 0; @@ -535,81 +586,105 @@ mmap_read_method(PyObject *op, PyObject *args) } static PyObject * -mmap_gfind(mmap_object *self, - PyObject *args, - int reverse) +mmap_gfind_lock_held(mmap_object *self, Py_buffer *view, PyObject *start_obj, + PyObject *end_obj, int reverse) { Py_ssize_t start = self->pos; Py_ssize_t end = self->size; - Py_buffer view; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, reverse ? "y*|nn:rfind" : "y*|nn:find", - &view, &start, &end)) { - return NULL; - } - else { - if (start < 0) - start += self->size; - if (start < 0) - start = 0; - else if (start > self->size) - start = self->size; - - if (end < 0) - end += self->size; - if (end < 0) - end = 0; - else if (end > self->size) - end = self->size; - - Py_ssize_t index; - PyObject *result; - CHECK_VALID_OR_RELEASE(NULL, view); - if (end < start) { - result = PyLong_FromSsize_t(-1); + if (start_obj != Py_None) { + start = _As_Py_ssize_t(start_obj); + if (start == -1 && PyErr_Occurred()) { + return NULL; } - else if (reverse) { - assert(0 <= start && start <= end && end <= self->size); - if (_safe_PyBytes_ReverseFind(&index, self, - self->data + start, end - start, - view.buf, view.len, start) < 0) - { - result = NULL; - } - else { - result = PyLong_FromSsize_t(index); + + if (end_obj != Py_None) { + end = _As_Py_ssize_t(end_obj); + if (end == -1 && PyErr_Occurred()) { + return NULL; } } + } + + if (start < 0) + start += self->size; + if (start < 0) + start = 0; + else if (start > self->size) + start = self->size; + + if (end < 0) + end += self->size; + if (end < 0) + end = 0; + else if (end > self->size) + end = self->size; + + Py_ssize_t index; + PyObject *result; + CHECK_VALID(NULL); + if (end < start) { + result = PyLong_FromSsize_t(-1); + } + else if (reverse) { + assert(0 <= start && start <= end && end <= self->size); + if (_safe_PyBytes_ReverseFind(&index, self, + self->data + start, end - start, + view->buf, view->len, start) < 0) + { + result = NULL; + } else { - assert(0 <= start && start <= end && end <= self->size); - if (_safe_PyBytes_Find(&index, self, - self->data + start, end - start, - view.buf, view.len, start) < 0) - { - result = NULL; - } - else { - result = PyLong_FromSsize_t(index); - } + result = PyLong_FromSsize_t(index); } - PyBuffer_Release(&view); - return result; } + else { + assert(0 <= start && start <= end && end <= self->size); + if (_safe_PyBytes_Find(&index, self, + self->data + start, end - start, + view->buf, view->len, start) < 0) + { + result = NULL; + } + else { + result = PyLong_FromSsize_t(index); + } + } + return result; } +/*[clinic input] +@critical_section +mmap.mmap.find + + view: Py_buffer + start: object = None + end: object = None + / + +[clinic start generated code]*/ + static PyObject * -mmap_find_method(PyObject *op, PyObject *args) +mmap_mmap_find_impl(mmap_object *self, Py_buffer *view, PyObject *start, + PyObject *end) +/*[clinic end generated code: output=ef8878a322f00192 input=0135504494b52c2b]*/ { - mmap_object *self = mmap_object_CAST(op); - return mmap_gfind(self, args, 0); + return mmap_gfind_lock_held(self, view, start, end, 0); } +/*[clinic input] +@critical_section +mmap.mmap.rfind = mmap.mmap.find + +[clinic start generated code]*/ + static PyObject * -mmap_rfind_method(PyObject *op, PyObject *args) +mmap_mmap_rfind_impl(mmap_object *self, Py_buffer *view, PyObject *start, + PyObject *end) +/*[clinic end generated code: output=73b918940d67c2b8 input=8aecdd1f70c06c62]*/ { - mmap_object *self = mmap_object_CAST(op); - return mmap_gfind(self, args, 1); + return mmap_gfind_lock_held(self, view, start, end, 1); } static int @@ -645,50 +720,55 @@ is_resizeable(mmap_object *self) } +/*[clinic input] +@critical_section +mmap.mmap.write + + bytes as data: Py_buffer + / + +[clinic start generated code]*/ + static PyObject * -mmap_write_method(PyObject *op, PyObject *args) +mmap_mmap_write_impl(mmap_object *self, Py_buffer *data) +/*[clinic end generated code: output=9e97063efb6fb27b input=3f16fa79aa89d6f7]*/ { - Py_buffer data; - mmap_object *self = mmap_object_CAST(op); - CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "y*:write", &data)) - return NULL; - if (!is_writable(self)) { - PyBuffer_Release(&data); return NULL; } - if (self->pos > self->size || self->size - self->pos < data.len) { - PyBuffer_Release(&data); + if (self->pos > self->size || self->size - self->pos < data->len) { PyErr_SetString(PyExc_ValueError, "data out of range"); return NULL; } - CHECK_VALID_OR_RELEASE(NULL, data); + CHECK_VALID(NULL); PyObject *result; - if (safe_memcpy(self->data + self->pos, data.buf, data.len) < 0) { + if (safe_memcpy(self->data + self->pos, data->buf, data->len) < 0) { result = NULL; } else { - self->pos += data.len; - result = PyLong_FromSsize_t(data.len); + self->pos += data->len; + result = PyLong_FromSsize_t(data->len); } - PyBuffer_Release(&data); return result; } +/*[clinic input] +@critical_section +mmap.mmap.write_byte + + byte as value: unsigned_char + / + +[clinic start generated code]*/ + static PyObject * -mmap_write_byte_method(PyObject *op, PyObject *args) +mmap_mmap_write_byte_impl(mmap_object *self, unsigned char value) +/*[clinic end generated code: output=aa11adada9b17510 input=32740bfa174f0991]*/ { - char value; - mmap_object *self = mmap_object_CAST(op); - CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "b:write_byte", &value)) - return(NULL); - if (!is_writable(self)) return NULL; @@ -698,17 +778,23 @@ mmap_write_byte_method(PyObject *op, PyObject *args) return NULL; } - if (safe_byte_copy(self->data + self->pos, &value) < 0) { + if (safe_byte_copy(self->data + self->pos, (const char*)&value) < 0) { return NULL; } self->pos++; Py_RETURN_NONE; } +/*[clinic input] +@critical_section +mmap.mmap.size + +[clinic start generated code]*/ + static PyObject * -mmap_size_method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap_size_impl(mmap_object *self) +/*[clinic end generated code: output=c177e65e83a648ff input=f69c072efd2e1595]*/ { - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); #ifdef MS_WINDOWS @@ -755,14 +841,21 @@ mmap_size_method(PyObject *op, PyObject *Py_UNUSED(ignored)) / new size? */ +/*[clinic input] +@critical_section +mmap.mmap.resize + + newsize as new_size: Py_ssize_t + / + +[clinic start generated code]*/ + static PyObject * -mmap_resize_method(PyObject *op, PyObject *args) +mmap_mmap_resize_impl(mmap_object *self, Py_ssize_t new_size) +/*[clinic end generated code: output=6f262537ce9c2dcc input=b6b5dee52a41b79f]*/ { - Py_ssize_t new_size; - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "n:resize", &new_size) || - !is_resizeable(self)) { + if (!is_resizeable(self)) { return NULL; } if (new_size < 0 || PY_SSIZE_T_MAX - new_size < self->offset) { @@ -910,23 +1003,45 @@ mmap_resize_method(PyObject *op, PyObject *args) } } +/*[clinic input] +@critical_section +mmap.mmap.tell + +[clinic start generated code]*/ + static PyObject * -mmap_tell_method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap_tell_impl(mmap_object *self) +/*[clinic end generated code: output=6034958630e1b1d1 input=fd163acacf45c3a5]*/ { - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); return PyLong_FromSize_t(self->pos); } +/*[clinic input] +@critical_section +mmap.mmap.flush + + offset: Py_ssize_t = 0 + size as size_obj: object = None + / + +[clinic start generated code]*/ + static PyObject * -mmap_flush_method(PyObject *op, PyObject *args) +mmap_mmap_flush_impl(mmap_object *self, Py_ssize_t offset, + PyObject *size_obj) +/*[clinic end generated code: output=41a10c349ed1608a input=7e6bb8f9462f53e6]*/ { - Py_ssize_t offset = 0; - mmap_object *self = mmap_object_CAST(op); Py_ssize_t size = self->size; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size)) - return NULL; + + if (size_obj != Py_None) { + size = _As_Py_ssize_t(size_obj); + if (size == -1 && PyErr_Occurred()) { + return NULL; + } + } + if (size < 0 || offset < 0 || self->size - offset < size) { PyErr_SetString(PyExc_ValueError, "flush values out of range"); return NULL; @@ -954,60 +1069,80 @@ mmap_flush_method(PyObject *op, PyObject *args) #endif } +/*[clinic input] +@critical_section +mmap.mmap.seek + + pos as dist: Py_ssize_t + whence as how: int = 0 + / + +[clinic start generated code]*/ + static PyObject * -mmap_seek_method(PyObject *op, PyObject *args) +mmap_mmap_seek_impl(mmap_object *self, Py_ssize_t dist, int how) +/*[clinic end generated code: output=00310494e8b8c592 input=e2fda5d081c3db22]*/ { - Py_ssize_t dist; - mmap_object *self = mmap_object_CAST(op); - int how=0; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "n|i:seek", &dist, &how)) - return NULL; - else { - Py_ssize_t where; - switch (how) { - case 0: /* relative to start */ - where = dist; - break; - case 1: /* relative to current position */ - if (PY_SSIZE_T_MAX - self->pos < dist) - goto onoutofrange; - where = self->pos + dist; - break; - case 2: /* relative to end */ - if (PY_SSIZE_T_MAX - self->size < dist) - goto onoutofrange; - where = self->size + dist; - break; - default: - PyErr_SetString(PyExc_ValueError, "unknown seek type"); - return NULL; - } - if (where > self->size || where < 0) + Py_ssize_t where; + switch (how) { + case 0: /* relative to start */ + where = dist; + break; + case 1: /* relative to current position */ + if (PY_SSIZE_T_MAX - self->pos < dist) goto onoutofrange; - self->pos = where; - return PyLong_FromSsize_t(self->pos); + where = self->pos + dist; + break; + case 2: /* relative to end */ + if (PY_SSIZE_T_MAX - self->size < dist) + goto onoutofrange; + where = self->size + dist; + break; + default: + PyErr_SetString(PyExc_ValueError, "unknown seek type"); + return NULL; } + if (where > self->size || where < 0) + goto onoutofrange; + self->pos = where; + return PyLong_FromSsize_t(self->pos); onoutofrange: PyErr_SetString(PyExc_ValueError, "seek out of range"); return NULL; } +/*[clinic input] +mmap.mmap.seekable + +[clinic start generated code]*/ + static PyObject * -mmap_seekable_method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap_seekable_impl(mmap_object *self) +/*[clinic end generated code: output=6311dc3ea300fa38 input=5132505f6e259001]*/ { Py_RETURN_TRUE; } +/*[clinic input] +@critical_section +mmap.mmap.move + + dest: Py_ssize_t + src: Py_ssize_t + count as cnt: Py_ssize_t + / + +[clinic start generated code]*/ + static PyObject * -mmap_move_method(PyObject *op, PyObject *args) +mmap_mmap_move_impl(mmap_object *self, Py_ssize_t dest, Py_ssize_t src, + Py_ssize_t cnt) +/*[clinic end generated code: output=391f549a44181793 input=cf8cfe10d9f6b448]*/ { - Py_ssize_t dest, src, cnt; - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "nnn:move", &dest, &src, &cnt) || - !is_writable(self)) { + if (!is_writable(self)) { return NULL; } else { /* bounds check the values */ @@ -1033,30 +1168,53 @@ static PyObject * mmap_closed_get(PyObject *op, void *Py_UNUSED(closure)) { mmap_object *self = mmap_object_CAST(op); + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); #ifdef MS_WINDOWS - return PyBool_FromLong(self->map_handle == NULL ? 1 : 0); + result = PyBool_FromLong(self->map_handle == NULL ? 1 : 0); #elif defined(UNIX) - return PyBool_FromLong(self->data == NULL ? 1 : 0); + result = PyBool_FromLong(self->data == NULL ? 1 : 0); #endif + Py_END_CRITICAL_SECTION(); + return result; } +/*[clinic input] +@critical_section +mmap.mmap.__enter__ + +[clinic start generated code]*/ + static PyObject * -mmap__enter__method(PyObject *op, PyObject *Py_UNUSED(ignored)) +mmap_mmap___enter___impl(mmap_object *self) +/*[clinic end generated code: output=92cfc59f4c4e2d26 input=a446541fbfe0b890]*/ { - mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); return Py_NewRef(self); } +/*[clinic input] +@critical_section +mmap.mmap.__exit__ + + exc_type: object + exc_value: object + traceback: object + / + +[clinic start generated code]*/ + static PyObject * -mmap__exit__method(PyObject *op, PyObject *Py_UNUSED(args)) +mmap_mmap___exit___impl(mmap_object *self, PyObject *exc_type, + PyObject *exc_value, PyObject *traceback) +/*[clinic end generated code: output=bec7e3e319c1f07e input=5f28e91cf752bc64]*/ { - return mmap_close_method(op, NULL); + return mmap_mmap_close_impl(self); } static PyObject * -mmap__repr__method(PyObject *op) +mmap__repr__method_lock_held(PyObject *op) { mmap_object *mobj = mmap_object_CAST(op); @@ -1100,11 +1258,27 @@ mmap__repr__method(PyObject *op) } } +static PyObject * +mmap__repr__method(PyObject *op) +{ + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap__repr__method_lock_held(op); + Py_END_CRITICAL_SECTION(); + return result; +} + #ifdef MS_WINDOWS +/*[clinic input] +@critical_section +mmap.mmap.__sizeof__ + +[clinic start generated code]*/ + static PyObject * -mmap__sizeof__method(PyObject *op, PyObject *Py_UNUSED(dummy)) +mmap_mmap___sizeof___impl(mmap_object *self) +/*[clinic end generated code: output=1aed30daff807d09 input=8a648868a089553c]*/ { - mmap_object *self = mmap_object_CAST(op); size_t res = _PyObject_SIZE(Py_TYPE(self)); if (self->tagname) { res += (wcslen(self->tagname) + 1) * sizeof(self->tagname[0]); @@ -1114,18 +1288,26 @@ mmap__sizeof__method(PyObject *op, PyObject *Py_UNUSED(dummy)) #endif #if defined(MS_WINDOWS) && defined(Py_DEBUG) +/*[clinic input] +@critical_section +mmap.mmap._protect + + flNewProtect: unsigned_int(bitwise=True) + start: Py_ssize_t + length: Py_ssize_t + / + +[clinic start generated code]*/ + static PyObject * -mmap_protect_method(PyObject *op, PyObject *args) { - DWORD flNewProtect, flOldProtect; - Py_ssize_t start, length; - mmap_object *self = mmap_object_CAST(op); +mmap_mmap__protect_impl(mmap_object *self, unsigned int flNewProtect, + Py_ssize_t start, Py_ssize_t length) +/*[clinic end generated code: output=a87271a34d1ad6cf input=9170498c5e1482da]*/ +{ + DWORD flOldProtect; CHECK_VALID(NULL); - if (!PyArg_ParseTuple(args, "Inn:protect", &flNewProtect, &start, &length)) { - return NULL; - } - if (!VirtualProtect((void *) (self->data + start), length, flNewProtect, &flOldProtect)) { @@ -1138,18 +1320,32 @@ mmap_protect_method(PyObject *op, PyObject *args) { #endif #ifdef HAVE_MADVISE +/*[clinic input] +@critical_section +mmap.mmap.madvise + + option: int + start: Py_ssize_t = 0 + length as length_obj: object = None + / + +[clinic start generated code]*/ + static PyObject * -mmap_madvise_method(PyObject *op, PyObject *args) +mmap_mmap_madvise_impl(mmap_object *self, int option, Py_ssize_t start, + PyObject *length_obj) +/*[clinic end generated code: output=816be656f08c0e3c input=2d37f7a4c87f1053]*/ { - int option; - Py_ssize_t start = 0, length; - mmap_object *self = mmap_object_CAST(op); + Py_ssize_t length; CHECK_VALID(NULL); - length = self->size; - - if (!PyArg_ParseTuple(args, "i|nn:madvise", &option, &start, &length)) { - return NULL; + if (length_obj == Py_None) { + length = self->size; + } else { + length = _As_Py_ssize_t(length_obj); + if (length == -1 && PyErr_Occurred()) { + return NULL; + } } if (start < 0 || start >= self->size) { @@ -1185,32 +1381,26 @@ static struct PyMemberDef mmap_object_members[] = { }; static struct PyMethodDef mmap_object_methods[] = { - {"close", mmap_close_method, METH_NOARGS}, - {"find", mmap_find_method, METH_VARARGS}, - {"rfind", mmap_rfind_method, METH_VARARGS}, - {"flush", mmap_flush_method, METH_VARARGS}, -#ifdef HAVE_MADVISE - {"madvise", mmap_madvise_method, METH_VARARGS}, -#endif - {"move", mmap_move_method, METH_VARARGS}, - {"read", mmap_read_method, METH_VARARGS}, - {"read_byte", mmap_read_byte_method, METH_NOARGS}, - {"readline", mmap_read_line_method, METH_NOARGS}, - {"resize", mmap_resize_method, METH_VARARGS}, - {"seek", mmap_seek_method, METH_VARARGS}, - {"seekable", mmap_seekable_method, METH_NOARGS}, - {"size", mmap_size_method, METH_NOARGS}, - {"tell", mmap_tell_method, METH_NOARGS}, - {"write", mmap_write_method, METH_VARARGS}, - {"write_byte", mmap_write_byte_method, METH_VARARGS}, - {"__enter__", mmap__enter__method, METH_NOARGS}, - {"__exit__", mmap__exit__method, METH_VARARGS}, -#ifdef MS_WINDOWS - {"__sizeof__", mmap__sizeof__method, METH_NOARGS}, -#ifdef Py_DEBUG - {"_protect", mmap_protect_method, METH_VARARGS}, -#endif // Py_DEBUG -#endif // MS_WINDOWS + MMAP_MMAP_CLOSE_METHODDEF + MMAP_MMAP_FIND_METHODDEF + MMAP_MMAP_RFIND_METHODDEF + MMAP_MMAP_FLUSH_METHODDEF + MMAP_MMAP_MADVISE_METHODDEF + MMAP_MMAP_MOVE_METHODDEF + MMAP_MMAP_READ_METHODDEF + MMAP_MMAP_READ_BYTE_METHODDEF + MMAP_MMAP_READLINE_METHODDEF + MMAP_MMAP_RESIZE_METHODDEF + MMAP_MMAP_SEEK_METHODDEF + MMAP_MMAP_SEEKABLE_METHODDEF + MMAP_MMAP_SIZE_METHODDEF + MMAP_MMAP_TELL_METHODDEF + MMAP_MMAP_WRITE_METHODDEF + MMAP_MMAP_WRITE_BYTE_METHODDEF + MMAP_MMAP___ENTER___METHODDEF + MMAP_MMAP___EXIT___METHODDEF + MMAP_MMAP___SIZEOF___METHODDEF + MMAP_MMAP__PROTECT_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -1223,7 +1413,7 @@ static PyGetSetDef mmap_object_getset[] = { /* Functions for treating an mmap'ed file as a buffer */ static int -mmap_buffer_getbuf(PyObject *op, Py_buffer *view, int flags) +mmap_buffer_getbuf_lock_held(PyObject *op, Py_buffer *view, int flags) { mmap_object *self = mmap_object_CAST(op); CHECK_VALID(-1); @@ -1234,23 +1424,45 @@ mmap_buffer_getbuf(PyObject *op, Py_buffer *view, int flags) return 0; } +static int +mmap_buffer_getbuf(PyObject *op, Py_buffer *view, int flags) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap_buffer_getbuf_lock_held(op, view, flags); + Py_END_CRITICAL_SECTION(); + return result; +} + static void mmap_buffer_releasebuf(PyObject *op, Py_buffer *Py_UNUSED(view)) { mmap_object *self = mmap_object_CAST(op); + Py_BEGIN_CRITICAL_SECTION(self); self->exports--; + Py_END_CRITICAL_SECTION(); } static Py_ssize_t -mmap_length(PyObject *op) +mmap_length_lock_held(PyObject *op) { mmap_object *self = mmap_object_CAST(op); CHECK_VALID(-1); return self->size; } +static Py_ssize_t +mmap_length(PyObject *op) +{ + Py_ssize_t result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap_length_lock_held(op); + Py_END_CRITICAL_SECTION(); + return result; +} + static PyObject * -mmap_item(PyObject *op, Py_ssize_t i) +mmap_item_lock_held(PyObject *op, Py_ssize_t i) { mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); @@ -1267,7 +1479,16 @@ mmap_item(PyObject *op, Py_ssize_t i) } static PyObject * -mmap_subscript(PyObject *op, PyObject *item) +mmap_item(PyObject *op, Py_ssize_t i) { + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap_item_lock_held(op, i); + Py_END_CRITICAL_SECTION(); + return result; +} + +static PyObject * +mmap_subscript_lock_held(PyObject *op, PyObject *item) { mmap_object *self = mmap_object_CAST(op); CHECK_VALID(NULL); @@ -1329,8 +1550,18 @@ mmap_subscript(PyObject *op, PyObject *item) } } +static PyObject * +mmap_subscript(PyObject *op, PyObject *item) +{ + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap_subscript_lock_held(op, item); + Py_END_CRITICAL_SECTION(); + return result; +} + static int -mmap_ass_item(PyObject *op, Py_ssize_t i, PyObject *v) +mmap_ass_item_lock_held(PyObject *op, Py_ssize_t i, PyObject *v) { const char *buf; mmap_object *self = mmap_object_CAST(op); @@ -1361,7 +1592,17 @@ mmap_ass_item(PyObject *op, Py_ssize_t i, PyObject *v) } static int -mmap_ass_subscript(PyObject *op, PyObject *item, PyObject *value) +mmap_ass_item(PyObject *op, Py_ssize_t i, PyObject *v) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap_ass_item_lock_held(op, i, v); + Py_END_CRITICAL_SECTION(); + return result; +} + +static int +mmap_ass_subscript_lock_held(PyObject *op, PyObject *item, PyObject *value) { mmap_object *self = mmap_object_CAST(op); CHECK_VALID(-1); @@ -1457,6 +1698,16 @@ mmap_ass_subscript(PyObject *op, PyObject *item, PyObject *value) } } +static int +mmap_ass_subscript(PyObject *op, PyObject *item, PyObject *value) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(op); + result = mmap_ass_subscript_lock_held(op, item, value); + Py_END_CRITICAL_SECTION(); + return result; +} + static PyObject * new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict); From de87549eb8c1cf23d12a14ddb47e54242b697c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Thu, 9 Oct 2025 16:38:25 +0100 Subject: [PATCH 1133/1674] [3.14] gh-133400: Fixed Ctrl+D (^D) behavior in :mod:`_pyrepl` module (GH-133883) (GH-139850) (cherry picked from commit 81959a0364f5bc15414d5bd61c5c0d019d486fe5) Co-authored-by: DeepWzh Co-authored-by: adam j hartz --- Lib/_pyrepl/commands.py | 19 +++-- Lib/test/test_pyrepl/test_pyrepl.py | 84 +++++++++++++++++++ ...-05-11-09-40-19.gh-issue-133400.zkWla8.rst | 1 + 3 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst diff --git a/Lib/_pyrepl/commands.py b/Lib/_pyrepl/commands.py index 50c824995d85b8..10127e58897a58 100644 --- a/Lib/_pyrepl/commands.py +++ b/Lib/_pyrepl/commands.py @@ -420,14 +420,17 @@ 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 + if self.event[-1] == "\004": + if b and b[-1].endswith("\n"): + self.finish = True + elif ( + r.pos == 0 + and len(b) == 0 # this is something of a hack + ): + r.update_screen() + r.console.finish() + raise EOFError + for i in range(r.get_arg()): if r.pos != len(b): del b[r.pos] diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 05b19dc4afa7a2..50d7e72060ba23 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1814,3 +1814,87 @@ def test_showrefcount(self): output, _ = self.run_repl("1\n1+2\nexit()\n", cmdline_args=['-Xshowrefcount'], env=env) matches = re.findall(r'\[-?\d+ refs, \d+ blocks\]', output) self.assertEqual(len(matches), 3) + + +class TestPyReplCtrlD(TestCase): + """Test Ctrl+D behavior in _pyrepl to match old pre-3.13 REPL behavior. + + Ctrl+D should: + - Exit on empty buffer (raises EOFError) + - Delete character when cursor is in middle of line + - Perform no operation when cursor is at end of line without newline + - Exit multiline mode when cursor is at end with trailing newline + - Run code up to that point when pressed on blank line with preceding lines + """ + def prepare_reader(self, events): + console = FakeConsole(events) + config = ReadlineConfig(readline_completer=None) + reader = ReadlineAlikeReader(console=console, config=config) + return reader + + def test_ctrl_d_empty_line(self): + """Test that pressing Ctrl+D on empty line exits the program""" + events = [ + Event(evt="key", data="\x04", raw=bytearray(b"\x04")), # Ctrl+D + ] + reader = self.prepare_reader(events) + with self.assertRaises(EOFError): + multiline_input(reader) + + def test_ctrl_d_multiline_with_new_line(self): + """Test that pressing Ctrl+D in multiline mode with trailing newline exits multiline mode""" + events = itertools.chain( + code_to_events("def f():\n pass\n"), # Enter multiline mode with trailing newline + [ + Event(evt="key", data="\x04", raw=bytearray(b"\x04")), # Ctrl+D + ], + ) + reader, _ = handle_all_events(events) + self.assertTrue(reader.finished) + self.assertEqual("def f():\n pass\n", "".join(reader.buffer)) + + def test_ctrl_d_multiline_middle_of_line(self): + """Test that pressing Ctrl+D in multiline mode with cursor in middle deletes character""" + events = itertools.chain( + code_to_events("def f():\n hello world"), # Enter multiline mode + [ + Event(evt="key", data="left", raw=bytearray(b"\x1bOD")) + ] * 5, # move cursor to 'w' in "world" + [ + Event(evt="key", data="\x04", raw=bytearray(b"\x04")) + ], # Ctrl+D should delete 'w' + ) + reader, _ = handle_all_events(events) + self.assertFalse(reader.finished) + self.assertEqual("def f():\n hello orld", "".join(reader.buffer)) + + def test_ctrl_d_multiline_end_of_line_no_newline(self): + """Test that pressing Ctrl+D at end of line without newline performs no operation""" + events = itertools.chain( + code_to_events("def f():\n hello"), # Enter multiline mode, no trailing newline + [ + Event(evt="key", data="\x04", raw=bytearray(b"\x04")) + ], # Ctrl+D should be no-op + ) + reader, _ = handle_all_events(events) + self.assertFalse(reader.finished) + self.assertEqual("def f():\n hello", "".join(reader.buffer)) + + def test_ctrl_d_single_line_middle_of_line(self): + """Test that pressing Ctrl+D in single line mode deletes current character""" + events = itertools.chain( + code_to_events("hello"), + [Event(evt="key", data="left", raw=bytearray(b"\x1bOD"))], # move left + [Event(evt="key", data="\x04", raw=bytearray(b"\x04"))], # Ctrl+D + ) + reader, _ = handle_all_events(events) + self.assertEqual("hell", "".join(reader.buffer)) + + def test_ctrl_d_single_line_end_no_newline(self): + """Test that pressing Ctrl+D at end of single line without newline does nothing""" + events = itertools.chain( + code_to_events("hello"), # cursor at end of line + [Event(evt="key", data="\x04", raw=bytearray(b"\x04"))], # Ctrl+D + ) + reader, _ = handle_all_events(events) + self.assertEqual("hello", "".join(reader.buffer)) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst new file mode 100644 index 00000000000000..2498d6ebaa543e --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst @@ -0,0 +1 @@ +Fixed Ctrl+D (^D) behavior in _pyrepl module to match old pre-3.13 REPL behavior. From 8761d6e64473c3434e333cfec3836762c8f4cbaf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:10:51 +0200 Subject: [PATCH 1134/1674] [3.14] gh-139391: properly handle `signal.signal()` in `UnixConsole` when called from a non-main thread (GH-139392) (#139858) gh-139391: properly handle `signal.signal()` in `UnixConsole` when called from a non-main thread (GH-139392) (cherry picked from commit b8c8b8f1d30767e5358ffa93d41e6e27ca60570d) Co-authored-by: yihong --- Lib/_pyrepl/unix_console.py | 7 ++++++- Lib/test/test_pyrepl/test_unix_console.py | 14 +++++++++++++- .../2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst diff --git a/Lib/_pyrepl/unix_console.py b/Lib/_pyrepl/unix_console.py index fe45b4eb384067..09247de748ee3b 100644 --- a/Lib/_pyrepl/unix_console.py +++ b/Lib/_pyrepl/unix_console.py @@ -390,7 +390,12 @@ def restore(self): os.write(self.output_fd, b"\033[?7h") if hasattr(self, "old_sigwinch"): - signal.signal(signal.SIGWINCH, self.old_sigwinch) + try: + signal.signal(signal.SIGWINCH, self.old_sigwinch) + except ValueError as e: + import threading + if threading.current_thread() is threading.main_thread(): + raise e del self.old_sigwinch def push_char(self, char: int | bytes) -> None: diff --git a/Lib/test/test_pyrepl/test_unix_console.py b/Lib/test/test_pyrepl/test_unix_console.py index 9ac2e9961df2dc..f4fb9237ffdfd0 100644 --- a/Lib/test/test_pyrepl/test_unix_console.py +++ b/Lib/test/test_pyrepl/test_unix_console.py @@ -4,11 +4,12 @@ import signal import subprocess import sys +import threading import unittest from functools import partial from test import support from test.support import os_helper, force_not_colorized_test_class -from test.support import script_helper +from test.support import script_helper, threading_helper from unittest import TestCase from unittest.mock import MagicMock, call, patch, ANY, Mock @@ -318,6 +319,17 @@ def test_restore_with_invalid_environ_on_macos(self, _os_write): console.prepare() # needed to call restore() console.restore() # this should succeed + @threading_helper.reap_threads + @threading_helper.requires_working_threading() + def test_restore_in_thread(self, _os_write): + # gh-139391: ensure that console.restore() silently suppresses + # exceptions when calling signal.signal() from a non-main thread. + console = unix_console([]) + console.old_sigwinch = signal.SIG_DFL + thread = threading.Thread(target=console.restore) + thread.start() + thread.join() # this should not raise + @unittest.skipIf(sys.platform == "win32", "No Unix console on Windows") class TestUnixConsoleEIOHandling(TestCase): diff --git a/Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst b/Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst new file mode 100644 index 00000000000000..93d1ce613bc2d6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst @@ -0,0 +1,3 @@ +Fix an issue when, on non-Windows platforms, it was not possible to +gracefully exit a ``python -m asyncio`` process suspended by Ctrl+Z +and later resumed by :manpage:`fg` other than with :manpage:`kill`. From 925625447f72e104d0de7f1ef2722bd8ad21d58c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:13:11 +0200 Subject: [PATCH 1135/1674] [3.14] gh-139845: do not print twice in default asyncio REPL (GH-139846) (#139859) gh-139845: do not print twice in default asyncio REPL (GH-139846) (cherry picked from commit a310b3a99d05e107963023a5736b67afe4ae1968) Co-authored-by: yihong Co-authored-by: Kumar Aditya --- Lib/asyncio/__main__.py | 3 ++- .../Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index ff3a69d1e17297..e07dd52a2a5efc 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -74,7 +74,8 @@ def callback(): return except BaseException: if keyboard_interrupted: - self.write("\nKeyboardInterrupt\n") + if not CAN_USE_PYREPL: + self.write("\nKeyboardInterrupt\n") else: self.showtraceback() return self.STATEMENT_FAILED diff --git a/Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst b/Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst new file mode 100644 index 00000000000000..3cd294e49cdda3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst @@ -0,0 +1 @@ +Fix to not print KeyboardInterrupt twice in default asyncio REPL. From 2cc13ff304b92a5c371c52a653fb275326714a1a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 19:19:35 +0200 Subject: [PATCH 1136/1674] [3.14] gh-139672: Remove references to `passlib` (GH-139673) (#139867) gh-139672: Remove references to `passlib` (GH-139673) (cherry picked from commit 04461510fb8bedc054477c2634ffd0e575485b12) Co-authored-by: Kirill Podoprigora --- Doc/library/crypt.rst | 2 +- Doc/whatsnew/3.13.rst | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index 9ff37196ccf69f..647cb4925f31da 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -13,7 +13,7 @@ being deprecated in Python 3.11. The removal was decided in :pep:`594`. 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`. +:pypi:`legacycrypt`, :pypi:`bcrypt`, or :pypi:`argon2-cffi`. These are not supported or maintained by the Python core team. The last version of Python that provided the :mod:`!crypt` module was diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 20aeee764f189d..092af5aaa1c97a 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -1569,8 +1569,6 @@ and are now removed: * :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`: From af1cb1cdb883a3cd4ec0f284cc714cfc246f12cd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 19:19:54 +0200 Subject: [PATCH 1137/1674] [3.14] GH-139809: Fix argparse subcommand prog not respecting color environment variables (GH-139818) (#139866) GH-139809: Fix argparse subcommand prog not respecting color environment variables (GH-139818) (cherry picked from commit 9fc4366f09904fd9aac797d542e332e8a4c1a921) Co-authored-by: Savannah Ostrowski --- Lib/argparse.py | 4 +++- Lib/test/test_argparse.py | 15 ++++++++++++++- ...2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 01d30a278496fc..88c1f5a7ef3342 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1960,7 +1960,9 @@ def add_subparsers(self, **kwargs): # prog defaults to the usage message of this parser, skipping # optional arguments and with no "usage:" prefix if kwargs.get('prog') is None: - formatter = self._get_formatter() + # Create formatter without color to avoid storing ANSI codes in prog + formatter = self.formatter_class(prog=self.prog) + formatter._set_color(False) positionals = self._get_positional_actions() groups = self._mutually_exclusive_groups formatter.add_usage(None, positionals, groups, '') diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 7de1d3e2373c33..af7cbcafcbea25 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -22,6 +22,7 @@ captured_stderr, force_not_colorized, force_not_colorized_test_class, + swap_attr, ) from test.support import import_helper from test.support import os_helper @@ -7128,7 +7129,8 @@ class TestColorized(TestCase): def setUp(self): super().setUp() # Ensure color even if ran with NO_COLOR=1 - _colorize.can_colorize = lambda *args, **kwargs: True + self.enterContext(swap_attr(_colorize, 'can_colorize', + lambda *args, **kwargs: True)) self.theme = _colorize.get_theme(force_color=True).argparse def test_argparse_color(self): @@ -7355,6 +7357,17 @@ def __init__(self, prog): {short_b}+f{reset}, {long_b}++foo{reset} {label_b}FOO{reset} foo help ''')) + def test_subparser_prog_is_stored_without_color(self): + parser = argparse.ArgumentParser(prog='complex', color=True) + sub = parser.add_subparsers(dest='command') + demo_parser = sub.add_parser('demo') + + self.assertNotIn('\x1b[', demo_parser.prog) + + demo_parser.color = False + help_text = demo_parser.format_help() + self.assertNotIn('\x1b[', help_text) + def tearDownModule(): # Remove global references to avoid looking like we have refleaks. diff --git a/Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst b/Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst new file mode 100644 index 00000000000000..498b8f7fd27bd3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst @@ -0,0 +1 @@ +Prevent premature colorization of subparser ``prog`` in :meth:`argparse.ArgumentParser.add_subparsers` to respect color environment variable changes after parser creation. From 60732d7397485262bd9fec4b017d029dd16b5e3a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 9 Oct 2025 20:01:53 +0200 Subject: [PATCH 1138/1674] [3.14] gh-139842: Clarify `__module__` description in typing.rst (GH-139863) (#139869) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Timothée Mazzucotelli --- Doc/library/typing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 313cb6b5bcf1c4..b4364c371b2d7e 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2269,7 +2269,7 @@ without the dedicated syntax, as documented below. .. attribute:: __module__ - The module in which the type alias was defined:: + The name of the module in which the type alias was defined:: >>> type Alias = int >>> Alias.__module__ @@ -2462,7 +2462,7 @@ types. .. attribute:: __module__ - The module in which the new type is defined. + The name of the module in which the new type is defined. .. attribute:: __name__ From 321dfb2ff5f14ad613a6c96e6eb860feb954255c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 08:30:53 +0200 Subject: [PATCH 1139/1674] [3.14] gh-139843: Document `signal.SIGQUIT` to fix Sphinx references (GH-139844) (#139885) gh-139843: Document `signal.SIGQUIT` to fix Sphinx references (GH-139844) (cherry picked from commit 1f87d528a1fb999ff9cdb411a1ccc3f8ee674293) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/signal.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index b0307d3dea1170..7ef7bbe8d96839 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -205,6 +205,12 @@ The variables defined in the :mod:`signal` module are: .. availability:: Unix. +.. data:: SIGQUIT + + Terminal quit signal. + + .. availability:: Unix. + .. data:: SIGSEGV Segmentation fault: invalid memory reference. From 5d34830f4dd00bc92da3d3a28506ff0fb1a8368e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 08:56:05 +0200 Subject: [PATCH 1140/1674] [3.14] gh-139823: Extend list of optional dependencies in `configure.rst` (GH-139826) (#139887) gh-139823: Extend list of optional dependencies in `configure.rst` (GH-139826) (cherry picked from commit 8f14bddeae8935817166c4f594466f42c9f14139) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Emma Smith Co-authored-by: Victor Stinner --- Doc/using/configure.rst | 43 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index e27b0141a6bf30..60f50090b1d971 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -22,16 +22,51 @@ Features and minimum versions required to build CPython: * Support for threads. -* OpenSSL 1.1.1 is the minimum version and OpenSSL 3.0.18 is the recommended - minimum version for the :mod:`ssl` and :mod:`hashlib` extension modules. +To build optional modules: -* SQLite 3.15.2 for the :mod:`sqlite3` extension module. +* `libbz2 `_ for the :mod:`bz2` module. -* Tcl/Tk 8.5.12 for the :mod:`tkinter` module. +* `libb2 `_ (:ref:`BLAKE2 `), + used by :mod:`hashlib` module. + +* `libffi `_ 3.3.0 is the recommended + minimum version for the :mod:`ctypes` module. + +* ``liblzma``, for the :mod:`lzma` module. * `libmpdec `_ 2.5.0 for the :mod:`decimal` module. +* ``libncurses`` or ``libncursesw``, + for the :mod:`curses` module. + +* ``libpanel`` or ``libpanelw``, + for the :mod:`curses.panel` module. + +* `libreadline `_ or + `libedit `_ + for the :mod:`readline` module. + +* `libuuid `_, for the :mod:`uuid` module. + +* `OpenSSL `_ 1.1.1 is the minimum version and + OpenSSL 3.0.18 is the recommended minimum version for the + :mod:`ssl` and :mod:`hashlib` extension modules. + +* `SQLite `_ 3.15.2 for the :mod:`sqlite3` extension module. + +* `Tcl/Tk `_ 8.5.12 for the :mod:`tkinter` module. + +* `zlib `_ 1.1.4 is the reccomended minimum version for the + :mod:`zlib` module. + +* `zstd `_ 1.4.5 is the minimum version for + the :mod:`compression.zstd` module. + +For a full list of dependencies required to build all modules and how to install +them, see the +`devguide `_. + * Autoconf 2.72 and aclocal 1.16.5 are required to regenerate the :file:`configure` script. From 08738ce52109a5a1ee9baaa59b3e2263442be99a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:18:32 +0200 Subject: [PATCH 1141/1674] [3.14] gh-139783: Fix inspect.getsourcelines() for the case when a decorator is followed by a comment or an empty line (GH-139836) (GH-139889) (cherry picked from commit f4104f5d74b99712253fceb39a4460ee3f7a281c) Co-authored-by: Serhiy Storchaka --- Lib/inspect.py | 4 +++- Lib/test/test_inspect/inspect_fodder2.py | 12 ++++++++++++ Lib/test/test_inspect/test_inspect.py | 4 ++++ .../2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index c642b5308ed384..385fbc686b6233 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1065,7 +1065,9 @@ def __init__(self): def tokeneater(self, type, token, srowcol, erowcol, line): if not self.started and not self.indecorator: - if type == tokenize.INDENT or token == "async": + if type in (tokenize.INDENT, tokenize.COMMENT, tokenize.NL): + pass + elif token == "async": pass # skip any decorators elif token == "@": diff --git a/Lib/test/test_inspect/inspect_fodder2.py b/Lib/test/test_inspect/inspect_fodder2.py index 1de283f672d362..157e12167b5d27 100644 --- a/Lib/test/test_inspect/inspect_fodder2.py +++ b/Lib/test/test_inspect/inspect_fodder2.py @@ -388,4 +388,16 @@ def func383(): ) return ge385 +# line 391 +@decorator +# comment +def func394(): + return 395 + +# line 397 +@decorator + +def func400(): + return 401 + pass # end of file diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 94804eb135418a..1ba253db48151e 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -1223,6 +1223,10 @@ def test_generator_expression(self): self.assertSourceEqual(next(mod2.ge377), 377, 380) self.assertSourceEqual(next(mod2.func383()), 385, 388) + def test_comment_or_empty_line_after_decorator(self): + self.assertSourceEqual(mod2.func394, 392, 395) + self.assertSourceEqual(mod2.func400, 398, 401) + class TestNoEOL(GetSourceBase): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst b/Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst new file mode 100644 index 00000000000000..336653e73bfa98 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst @@ -0,0 +1,2 @@ +Fix :func:`inspect.getsourcelines` for the case when a decorator is followed +by a comment or an empty line. From ade6dea24bcb3daa18447edc46a4dbfa351df45d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:54:46 +0200 Subject: [PATCH 1142/1674] [3.14] gh-139065: Fix trailing space before long word in textwrap (GH-139070) (GH-139902) Fix trailing space before a wrapped long word if the line length with a space is exactly "width". (cherry picked from commit 1c598e04361dbfc9cf465f3a02f83715c11b028c) Co-authored-by: Serhiy Storchaka --- Lib/test/test_textwrap.py | 4 ++-- Lib/textwrap.py | 2 +- .../Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst diff --git a/Lib/test/test_textwrap.py b/Lib/test/test_textwrap.py index cbd383ea4e2656..aca1f427656bb5 100644 --- a/Lib/test/test_textwrap.py +++ b/Lib/test/test_textwrap.py @@ -605,7 +605,7 @@ def test_break_long(self): # bug 1146. Prevent a long word to be wrongly wrapped when the # preceding word is exactly one character shorter than the width self.check_wrap(self.text, 12, - ['Did you say ', + ['Did you say', '"supercalifr', 'agilisticexp', 'ialidocious?', @@ -633,7 +633,7 @@ def test_nobreak_long(self): def test_max_lines_long(self): self.check_wrap(self.text, 12, - ['Did you say ', + ['Did you say', '"supercalifr', 'agilisticexp', '[...]'], diff --git a/Lib/textwrap.py b/Lib/textwrap.py index 5ae439f5cd3b78..41366fbf443a4f 100644 --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -211,7 +211,7 @@ def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): # If we're allowed to break long words, then do so: put as much # of the next chunk onto the current line as will fit. - if self.break_long_words: + if self.break_long_words and space_left > 0: end = space_left chunk = reversed_chunks[-1] if self.break_on_hyphens and len(chunk) > space_left: diff --git a/Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst b/Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst new file mode 100644 index 00000000000000..20c00603959276 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst @@ -0,0 +1,2 @@ +Fix trailing space before a wrapped long word if the line length is exactly +*width* in :mod:`textwrap`. From 51b104302988b9da8e83edf6c42a9de8ca5a22c2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 16:23:52 +0200 Subject: [PATCH 1143/1674] [3.14] gh-138860: Lazy import rlcompleter in pdb to avoid deadlock in subprocess (GH-139185) (GH-139305) (GH-139280) * gh-138860: Lazy import rlcompleter in pdb to avoid deadlock in subprocess (GH-139185) (cherry picked from commit c8624cd36746b17d8f991cde63705e9419e940de) * gh-139289: Lazy import rlcompleter to fix the refleak (GH-139305) (cherry picked from commit 8288f3693f50058ad9b9fe04e01f5dad902d8bad) Co-authored-by: Tian Gao --- Lib/pdb.py | 32 ++++++++++++++++--- Lib/test/test_pdb.py | 22 +++++++++++++ Lib/test/test_pyclbr.py | 2 +- ...-09-20-17-50-31.gh-issue-138860.Y9JXap.rst | 1 + ...-09-24-14-17-34.gh-issue-139289.Vmk25k.rst | 1 + 5 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst create mode 100644 Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 2d7da2f82bea81..14ed25ed147011 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -100,7 +100,6 @@ import _pyrepl.utils from contextlib import ExitStack, closing, contextmanager -from rlcompleter import Completer from types import CodeType from warnings import deprecated @@ -364,6 +363,7 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None, 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 @@ -1092,6 +1092,31 @@ def set_convenience_variable(self, frame, name, value): # Generic completion functions. Individual complete_foo methods can be # assigned below to one of these functions. + @property + def rlcompleter(self): + """Return the `Completer` class from `rlcompleter`, while avoiding the + side effects of changing the completer from `import rlcompleter`. + + This is a compromise between GH-138860 and GH-139289. If GH-139289 is + fixed, then we don't need this and we can just `import rlcompleter` in + `Pdb.__init__`. + """ + if not hasattr(self, "_rlcompleter"): + try: + import readline + except ImportError: + # readline is not available, just get the Completer + from rlcompleter import Completer + self._rlcompleter = Completer + else: + # importing rlcompleter could have side effect of changing + # the current completer, we need to restore it + prev_completer = readline.get_completer() + from rlcompleter import Completer + self._rlcompleter = Completer + readline.set_completer(prev_completer) + return self._rlcompleter + 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 @@ -1186,10 +1211,9 @@ def completedefault(self, text, line, begidx, endidx): 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.f_locals) + completer = self.rlcompleter(self.curframe.f_globals | self.curframe.f_locals) while (match := completer.complete(text, state)) is not None: matches.append(match) state += 1 @@ -1204,8 +1228,8 @@ def _enable_rlcompleter(self, ns): return try: + completer = self.rlcompleter(ns) old_completer = readline.get_completer() - completer = Completer(ns) readline.set_completer(completer.complete) yield finally: diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 6b74e21ad73d1a..9a7d855003551a 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -4688,6 +4688,28 @@ def foo(): stdout, _ = self._run_script(script, commands) self.assertIn("42", stdout) + def test_readline_not_imported(self): + """GH-138860 + Directly or indirectly importing readline might deadlock a subprocess + if it's launched with process_group=0 or preexec_fn=setpgrp + + It's also a pattern that readline is never imported with just import pdb. + + This test is to ensure that readline is not imported for import pdb. + It's possible that we have a good reason to do that in the future. + """ + + script = textwrap.dedent(""" + import sys + import pdb + if "readline" in sys.modules: + print("readline imported") + """) + commands = "" + stdout, stderr = self._run_script(script, commands) + self.assertNotIn("readline imported", stdout) + self.assertEqual(stderr, "") + @support.force_colorized_test_class class PdbTestColorize(unittest.TestCase): diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 3e7b2cd0dc9912..3062f4eb9be557 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -254,7 +254,7 @@ def test_others(self): 'pdb', # pyclbr does not handle elegantly `typing` or properties ignore=('Union', '_ModuleTarget', '_ScriptTarget', '_ZipTarget', 'curframe_locals', - '_InteractState'), + '_InteractState', 'rlcompleter'), ) cm('pydoc', ignore=('input', 'output',)) # properties diff --git a/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst b/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst new file mode 100644 index 00000000000000..0903eb71ae4346 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst @@ -0,0 +1 @@ +Lazy import :mod:`rlcompleter` in :mod:`pdb` to avoid deadlock in subprocess. diff --git a/Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst b/Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst new file mode 100644 index 00000000000000..04162619cf218b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst @@ -0,0 +1 @@ +Do a real lazy-import on :mod:`rlcompleter` in :mod:`pdb` and restore the existing completer after importing :mod:`rlcompleter`. From f8eb754dab20c99bb47127f100730e15302e9335 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:36:01 +0200 Subject: [PATCH 1144/1674] [3.14] gh-139843: Document signals (SIGSTOP, SIGVTALRM, SIGPROF) to fix sphinx references (GH-139896) (GH-139908) gh-139843: Document signals (SIGSTOP, SIGVTALRM, SIGPROF) to fix sphinx references (GH-139896) (cherry picked from commit 302f19d1f1880dd29deb5ad02fa2c21639319559) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/signal.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 7ef7bbe8d96839..d030b75bb19038 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -205,6 +205,12 @@ The variables defined in the :mod:`signal` module are: .. availability:: Unix. +.. data:: SIGPROF + + Profiling timer expired. + + .. availability:: Unix. + .. data:: SIGQUIT Terminal quit signal. @@ -215,6 +221,10 @@ The variables defined in the :mod:`signal` module are: Segmentation fault: invalid memory reference. +.. data:: SIGSTOP + + Stop executing (cannot be caught or ignored). + .. data:: SIGSTKFLT Stack fault on coprocessor. The Linux kernel does not raise this signal: it @@ -243,6 +253,12 @@ The variables defined in the :mod:`signal` module are: .. availability:: Unix. +.. data:: SIGVTALRM + + Virtual timer expired. + + .. availability:: Unix. + .. data:: SIGWINCH Window resize signal. From 60d15e1717f31aecce93042929f7e177b31726bc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:38:35 +0200 Subject: [PATCH 1145/1674] [3.14] gh-101100: Document `zlib` public constants to fix reference warnings (GH-139835) (#139910) gh-101100: Document `zlib` public constants to fix reference warnings (GH-139835) (cherry picked from commit c7f1da97eb4639a17fb01ef122155bab2f262a34) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Victor Stinner --- Doc/library/zlib.rst | 136 ++++++++++++++++++++++++++++++++++++++++++- Doc/tools/.nitignore | 1 - 2 files changed, 133 insertions(+), 4 deletions(-) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index 75ead3c4cb144c..50eae4547a99df 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -16,7 +16,7 @@ earlier than 1.1.3; 1.1.3 has a `security vulnerability `_ for authoritative information. For reading and writing ``.gz`` files see the :mod:`gzip` module. @@ -312,6 +312,136 @@ Decompression objects support the following methods and attributes: objects. +The following constants are available to configure compression and decompression +behavior: + +.. data:: DEFLATED + + The deflate compression method. + + +.. data:: MAX_WBITS + + The maximum window size, expressed as a power of 2. + For example, if :const:`!MAX_WBITS` is ``15`` it results in a window size + of ``32 KiB``. + + +.. data:: DEF_MEM_LEVEL + + The default memory level for compression objects. + + +.. data:: DEF_BUF_SIZE + + The default buffer size for decompression operations. + + +.. data:: Z_NO_COMPRESSION + + Compression level ``0``. + + .. versionadded:: 3.6 + + +.. data:: Z_BEST_SPEED + + Compression level ``1``. + + +.. data:: Z_BEST_COMPRESSION + + Compression level ``9``. + + +.. data:: Z_DEFAULT_COMPRESSION + + Default compression level (``-1``). + + +.. data:: Z_DEFAULT_STRATEGY + + Default compression strategy, for normal data. + + +.. data:: Z_FILTERED + + Compression strategy for data produced by a filter (or predictor). + + +.. data:: Z_HUFFMAN_ONLY + + Compression strategy that forces Huffman coding only. + + +.. data:: Z_RLE + + Compression strategy that limits match distances to one (run-length encoding). + + This constant is only available if Python was compiled with zlib + 1.2.0.1 or greater. + + .. versionadded:: 3.6 + + +.. data:: Z_FIXED + + Compression strategy that prevents the use of dynamic Huffman codes. + + This constant is only available if Python was compiled with zlib + 1.2.2.2 or greater. + + .. versionadded:: 3.6 + + +.. data:: Z_NO_FLUSH + + Flush mode ``0``. No special flushing behavior. + + .. versionadded:: 3.6 + + +.. data:: Z_PARTIAL_FLUSH + + Flush mode ``1``. Flush as much output as possible. + + +.. data:: Z_SYNC_FLUSH + + Flush mode ``2``. All output is flushed and the output is aligned to a byte boundary. + + +.. data:: Z_FULL_FLUSH + + Flush mode ``3``. All output is flushed and the compression state is reset. + + +.. data:: Z_FINISH + + Flush mode ``4``. All pending input is processed, no more input is expected. + + +.. data:: Z_BLOCK + + Flush mode ``5``. A deflate block is completed and emitted. + + This constant is only available if Python was compiled with zlib + 1.2.2.2 or greater. + + .. versionadded:: 3.6 + + +.. data:: Z_TREES + + Flush mode ``6``, for inflate operations. Instructs inflate to return when + it gets to the next deflate block boundary. + + This constant is only available if Python was compiled with zlib + 1.2.3.4 or greater. + + .. versionadded:: 3.6 + + Information about the version of the zlib library in use is available through the following constants: @@ -347,10 +477,10 @@ the following constants: Module :mod:`gzip` Reading and writing :program:`gzip`\ -format files. - http://www.zlib.net + https://www.zlib.net The zlib library home page. - http://www.zlib.net/manual.html + https://www.zlib.net/manual.html The zlib manual explains the semantics and usage of the library's many functions. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 827c5808fa5865..657d720e766179 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -51,7 +51,6 @@ Doc/library/xml.sax.reader.rst Doc/library/xml.sax.rst Doc/library/xmlrpc.client.rst Doc/library/xmlrpc.server.rst -Doc/library/zlib.rst Doc/whatsnew/2.4.rst Doc/whatsnew/2.5.rst Doc/whatsnew/2.6.rst From 72f25a8d9a5673d39c107cf522465a566b979ed5 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Fri, 10 Oct 2025 22:36:02 +0530 Subject: [PATCH 1146/1674] [3.14] gh-139894: fix incorrect sharing of current task while forking in `asyncio` (GH-139897) (#139913) * [3.14] gh-139894: fix incorrect sharing of current task while forking in `asyncio` (GH-139897) Fix incorrect sharing of current task with the forked child process by clearing thread state's current task and current loop in `PyOS_AfterFork_Child`. (cherry picked from commit b881df47ff1adca515d1de04f689160ddae72142) Co-authored-by: Kumar Aditya * Update Lib/test/test_asyncio/test_unix_events.py --- Lib/test/test_asyncio/test_unix_events.py | 41 +++++++++++++++++-- ...-10-10-11-22-50.gh-issue-139894.ECAXqj.rst | 1 + Modules/posixmodule.c | 10 +++++ 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 22982dc9d8aefe..520f5c733c3bf2 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -1180,11 +1180,46 @@ async def runner(): @support.requires_fork() -class TestFork(unittest.IsolatedAsyncioTestCase): +class TestFork(unittest.TestCase): + + def test_fork_not_share_current_task(self): + loop = object() + task = object() + asyncio._set_running_loop(loop) + self.addCleanup(asyncio._set_running_loop, None) + asyncio.tasks._enter_task(loop, task) + self.addCleanup(asyncio.tasks._leave_task, loop, task) + self.assertIs(asyncio.current_task(), task) + r, w = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + pid = os.fork() + if pid == 0: + # child + try: + asyncio._set_running_loop(loop) + current_task = asyncio.current_task() + if current_task is None: + os.write(w, b'NO TASK') + else: + os.write(w, b'TASK:' + str(id(current_task)).encode()) + except BaseException as e: + os.write(w, b'ERROR:' + ascii(e).encode()) + finally: + asyncio._set_running_loop(None) + os._exit(0) + else: + # parent + result = os.read(r, 100) + self.assertEqual(result, b'NO TASK') + wait_process(pid, exitcode=0) - async def test_fork_not_share_event_loop(self): + def test_fork_not_share_event_loop(self): # The forked process should not share the event loop with the parent - loop = asyncio.get_running_loop() + loop = object() + asyncio._set_running_loop(loop) + self.assertIs(asyncio.get_running_loop(), loop) + self.addCleanup(asyncio._set_running_loop, None) r, w = os.pipe() self.addCleanup(os.close, r) self.addCleanup(os.close, w) diff --git a/Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst b/Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst new file mode 100644 index 00000000000000..05a977ad119e07 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst @@ -0,0 +1 @@ +Fix incorrect sharing of current task with the child process while forking in :mod:`asyncio`. Patch by Kumar Aditya. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3dc62240952f68..2dad3352982f7b 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -689,6 +689,14 @@ reset_remotedebug_data(PyThreadState *tstate) _Py_MAX_SCRIPT_PATH_SIZE); } +static void +reset_asyncio_state(_PyThreadStateImpl *tstate) +{ + llist_init(&tstate->asyncio_tasks_head); + tstate->asyncio_running_loop = NULL; + tstate->asyncio_running_task = NULL; +} + void PyOS_AfterFork_Child(void) @@ -725,6 +733,8 @@ PyOS_AfterFork_Child(void) reset_remotedebug_data(tstate); + reset_asyncio_state((_PyThreadStateImpl *)tstate); + // Remove the dead thread states. We "start the world" once we are the only // thread state left to undo the stop the world call in `PyOS_BeforeFork`. // That needs to happen before `_PyThreadState_DeleteList`, because that From 7ea79f6342db5851a9e734130ffec003e7045dea Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 21:31:38 +0200 Subject: [PATCH 1147/1674] [3.14] gh-138843: Removing "Unpacking" section from Download page (GH-139921) (cherry picked from commit aa840f500ca901deea29669df68992193a273a62) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/tools/templates/download.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index 523b505f59673e..f914ad862116d7 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -75,16 +75,6 @@

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

See the directory listing for file sizes.{% endtrans %}

-

{% trans %}Unpacking{% endtrans %}

- -

{% 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 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.{% endtrans %}

- -

{% 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 %}

{% trans %}Problems{% endtrans %}

{% set bugs = pathto('bugs') %} From 2660e98b30f83cdba6b52a89e74dfe7de17c1a85 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 10 Oct 2025 23:47:47 +0200 Subject: [PATCH 1148/1674] [3.14] gh-139001: Fix thread-safety issue in `pathlib.Path` (gh-139066) (gh-139926) Don't cache the joined path in `_raw_path` because the caching isn't thread safe. (cherry picked from commit d9b4eef71e7904fbe3a3786a908e493be7debbff) Co-authored-by: Sam Gross --- Lib/pathlib/__init__.py | 7 +----- Lib/test/test_pathlib/test_join.py | 22 +++++++++++++++++++ ...-09-17-12-07-21.gh-issue-139001.O6tseN.rst | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst diff --git a/Lib/pathlib/__init__.py b/Lib/pathlib/__init__.py index 12cf9f579cb32d..0d763d1f0dcaa5 100644 --- a/Lib/pathlib/__init__.py +++ b/Lib/pathlib/__init__.py @@ -334,13 +334,8 @@ def _raw_path(self): return paths[0] elif paths: # Join path segments from the initializer. - path = self.parser.join(*paths) - # Cache the joined path. - paths.clear() - paths.append(path) - return path + return self.parser.join(*paths) else: - paths.append('') return '' @property diff --git a/Lib/test/test_pathlib/test_join.py b/Lib/test/test_pathlib/test_join.py index f1a24204b4c30a..6b51a09e5ac168 100644 --- a/Lib/test/test_pathlib/test_join.py +++ b/Lib/test/test_pathlib/test_join.py @@ -3,6 +3,8 @@ """ import unittest +import threading +from test.support import threading_helper from .support import is_pypi from .support.lexical_path import LexicalPath @@ -158,6 +160,26 @@ def test_parts(self): parts = p.parts self.assertEqual(parts, (sep, 'a', 'b')) + @threading_helper.requires_working_threading() + def test_parts_multithreaded(self): + P = self.cls + + NUM_THREADS = 10 + NUM_ITERS = 10 + + for _ in range(NUM_ITERS): + b = threading.Barrier(NUM_THREADS) + path = P('a') / 'b' / 'c' / 'd' / 'e' + expected = ('a', 'b', 'c', 'd', 'e') + + def check_parts(): + b.wait() + self.assertEqual(path.parts, expected) + + threads = [threading.Thread(target=check_parts) for _ in range(NUM_THREADS)] + with threading_helper.start_threads(threads): + pass + def test_parent(self): # Relative P = self.cls diff --git a/Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst b/Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst new file mode 100644 index 00000000000000..3ad5a1272df4af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst @@ -0,0 +1,2 @@ +Fix race condition in :class:`pathlib.Path` on the internal ``_raw_paths`` +field. From 1a355d73663692d77811686f5d655ce161a256a1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 11 Oct 2025 04:02:34 +0200 Subject: [PATCH 1149/1674] [3.14] gh-96491: Deduplicate version in IDLE shell title (GH-139841) (#139931) gh-96491: Deduplicate version in IDLE shell title (GH-139841) Saving to a file added both the filename and repeated the version. --------- (cherry picked from commit d4e5802588db3459f04d4b8013cc571a8988e203) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Terry Jan Reedy --- Lib/idlelib/CREDITS.txt | 1 + Lib/idlelib/editor.py | 7 +++++-- Lib/idlelib/idle_test/test_outwin.py | 3 ++- Lib/idlelib/pyshell.py | 3 +-- .../IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst | 1 + 5 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst diff --git a/Lib/idlelib/CREDITS.txt b/Lib/idlelib/CREDITS.txt index bea3ba7c20de22..1b853e8cc1c462 100644 --- a/Lib/idlelib/CREDITS.txt +++ b/Lib/idlelib/CREDITS.txt @@ -37,6 +37,7 @@ Major contributors since 2005: - 2014: Saimadhav Heblikar - 2015: Mark Roseman - 2017: Louie Lu, Cheryl Sabella, and Serhiy Storchaka +- 2025: Stan Ulbrych For additional details refer to NEWS.txt and Changelog. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index b4d6d25871bcf4..83112d85575e47 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -33,7 +33,6 @@ # The default tab setting for a Text widget, in average-width characters. TK_TABWIDTH_DEFAULT = 8 -_py_version = ' (%s)' % platform.python_version() darwin = sys.platform == 'darwin' def _sphinx_version(): @@ -1008,12 +1007,16 @@ def open_recent_file(fn_closure=file_name): def saved_change_hook(self): short = self.short_title() long = self.long_title() + _py_version = ' (%s)' % platform.python_version() if short and long and not macosx.isCocoaTk(): # Don't use both values on macOS because # that doesn't match platform conventions. title = short + " - " + long + _py_version elif short: - title = short + if short == "IDLE Shell": + title = short + " " + platform.python_version() + else: + title = short + _py_version elif long: title = long else: diff --git a/Lib/idlelib/idle_test/test_outwin.py b/Lib/idlelib/idle_test/test_outwin.py index 81f4aad7e95e95..0f13363f84f361 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 platform import sys import unittest from test.support import requires @@ -41,7 +42,7 @@ def test_ispythonsource(self): self.assertFalse(w.ispythonsource(__file__)) def test_window_title(self): - self.assertEqual(self.window.top.title(), 'Output') + self.assertEqual(self.window.top.title(), 'Output' + ' (%s)' % platform.python_version()) def test_maybesave(self): w = self.window diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 74a0e03994f69a..1b7c2af1a923d7 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -22,7 +22,6 @@ import linecache import os import os.path -from platform import python_version import re import socket import subprocess @@ -841,7 +840,7 @@ def display_executing_dialog(self): class PyShell(OutputWindow): from idlelib.squeezer import Squeezer - shell_title = "IDLE Shell " + python_version() + shell_title = "IDLE Shell" # Override classes ColorDelegator = ModifiedColorDelegator diff --git a/Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst b/Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst new file mode 100644 index 00000000000000..beb6ef5ade562f --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst @@ -0,0 +1 @@ +Deduplicate version number in IDLE shell title bar after saving to a file. From 46148d18a262a5d3977bf13386fac762e1b5f2ae Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 11 Oct 2025 17:40:23 +0200 Subject: [PATCH 1150/1674] [3.14] gh-139905: Provide suggestion in error message if `Generic.__init_subclass__` was not called (GH-139943) (#139955) gh-139905: Provide suggestion in error message if `Generic.__init_subclass__` was not called (GH-139943) (cherry picked from commit 5776d0d2e08f4d93dcd62d875bae8c1396a04ba4) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/test/test_typing.py | 28 +++++++++++++++++++ Lib/typing.py | 16 +++++++++-- ...-10-11-10-02-56.gh-issue-139905.UyJIR_.rst | 3 ++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b799be5ba7d8fd..f84f972a29437d 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4674,6 +4674,34 @@ class D(Generic[T]): pass with self.assertRaises(TypeError): D[()] + def test_generic_init_subclass_not_called_error(self): + notes = ["Note: this exception may have been caused by " + r"'GenericTests.test_generic_init_subclass_not_called_error..Base.__init_subclass__' " + "(or the '__init_subclass__' method on a superclass) not calling 'super().__init_subclass__()'"] + + class Base: + def __init_subclass__(cls) -> None: + # Oops, I forgot super().__init_subclass__()! + pass + + with self.subTest(): + class Sub(Base, Generic[T]): + pass + + with self.assertRaises(AttributeError) as cm: + Sub[int] + + self.assertEqual(cm.exception.__notes__, notes) + + with self.subTest(): + class Sub[U](Base): + pass + + with self.assertRaises(AttributeError) as cm: + Sub[int] + + self.assertEqual(cm.exception.__notes__, notes) + def test_generic_subclass_checks(self): for typ in [list[int], List[int], tuple[int, str], Tuple[int, str], diff --git a/Lib/typing.py b/Lib/typing.py index 434cd0370e099a..72c0d7349eaaaa 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1142,14 +1142,26 @@ def _generic_class_getitem(cls, args): f"Parameters to {cls.__name__}[...] must all be unique") else: # Subscripting a regular Generic subclass. - for param in cls.__parameters__: + try: + parameters = cls.__parameters__ + except AttributeError as e: + init_subclass = getattr(cls, '__init_subclass__', None) + if init_subclass not in {None, Generic.__init_subclass__}: + e.add_note( + f"Note: this exception may have been caused by " + f"{init_subclass.__qualname__!r} (or the " + f"'__init_subclass__' method on a superclass) not " + f"calling 'super().__init_subclass__()'" + ) + raise + for param in parameters: prepare = getattr(param, '__typing_prepare_subst__', None) if prepare is not None: args = prepare(cls, args) _check_generic_specialization(cls, args) new_args = [] - for param, new_arg in zip(cls.__parameters__, args): + for param, new_arg in zip(parameters, args): if isinstance(param, TypeVarTuple): new_args.extend(new_arg) else: diff --git a/Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst b/Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst new file mode 100644 index 00000000000000..a6876ca2df8299 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst @@ -0,0 +1,3 @@ +Add suggestion to error message for :class:`typing.Generic` subclasses when +``cls.__parameters__`` is missing due to a parent class failing to call +:meth:`super().__init_subclass__() ` in its ``__init_subclass__``. From 187588e67522b54429a05975396233ea2cf695a3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 11 Oct 2025 19:59:55 +0200 Subject: [PATCH 1151/1674] [3.14] gh-139929: fix incorrect OpenSSL version-based guard in `_ssl.c` (GH-139945) (#139964) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-139929: fix incorrect OpenSSL version-based guard in `_ssl.c` (GH-139945) fix OpenSSL version-based guards (cherry picked from commit cdd3eee7fc26538c8365dcbf2dd844ec7cdf7fb7) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Modules/_ssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 6898d73b8ffb2a..051efce4cfaa99 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -910,7 +910,7 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, } /* bpo43522 and OpenSSL < 1.1.1l: copy hostflags manually */ -#if OPENSSL_VERSION < 0x101010cf +#if OPENSSL_VERSION_NUMBER < 0x101010cf X509_VERIFY_PARAM *ssl_verification_params = SSL_get0_param(self->ssl); X509_VERIFY_PARAM *ssl_ctx_verification_params = SSL_CTX_get0_param(ctx); From ae91b4bcd07d512c6020b76c80f5420e9dee0c2a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 11 Oct 2025 20:34:30 +0200 Subject: [PATCH 1152/1674] [3.14] gh-101100: Fix Sphinx warnings in `Doc/library/signal.rst` (GH-139930) (GH-139966) gh-101100: Fix Sphinx warnings in `Doc/library/signal.rst` (GH-139930) (cherry picked from commit 447c7a89fb41b7fa84b9b26f111aedd649bc5400) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/signal.rst | 7 +++---- Doc/tools/.nitignore | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index d030b75bb19038..f8e22a50bd19bc 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -270,7 +270,7 @@ The variables defined in the :mod:`signal` module are: All the signal numbers are defined symbolically. For example, the hangup signal is defined as :const:`signal.SIGHUP`; the variable names are identical to the names used in C programs, as found in ````. The Unix man page for - ':c:func:`signal`' lists the existing signals (on some systems this is + '``signal``' lists the existing signals (on some systems this is :manpage:`signal(2)`, on others the list is in :manpage:`signal(7)`). Note that not all systems define the same set of signal names; only those names defined by the system are defined by this module. @@ -661,9 +661,8 @@ The :mod:`signal` module defines the following functions: *sigset*. The return value is an object representing the data contained in the - :c:type:`siginfo_t` structure, namely: :attr:`si_signo`, :attr:`si_code`, - :attr:`si_errno`, :attr:`si_pid`, :attr:`si_uid`, :attr:`si_status`, - :attr:`si_band`. + ``siginfo_t`` structure, namely: ``si_signo``, ``si_code``, + ``si_errno``, ``si_pid``, ``si_uid``, ``si_status``, ``si_band``. .. availability:: Unix. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 657d720e766179..60a80fe2c72a72 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -29,7 +29,6 @@ Doc/library/profile.rst Doc/library/pyexpat.rst Doc/library/resource.rst Doc/library/select.rst -Doc/library/signal.rst Doc/library/smtplib.rst Doc/library/socket.rst Doc/library/ssl.rst From 3b9694a8e6db8c401b8f02e021c1416023f8f90a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 12 Oct 2025 13:16:43 +0200 Subject: [PATCH 1153/1674] [3.14] gh-139988: fix a leak when failing to create a Union type (GH-139990) (#139993) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-139988: fix a leak when failing to create a Union type (GH-139990) (cherry picked from commit 6710156bd27dd48493d15f515506a0ead5d0328f) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- .../2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst | 2 ++ Objects/unionobject.c | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst new file mode 100644 index 00000000000000..60fa3b1d339cb1 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst @@ -0,0 +1,2 @@ +Fix a memory leak when failing to create a :class:`~typing.Union` type. +Patch by Bénédikt Tran. diff --git a/Objects/unionobject.c b/Objects/unionobject.c index 2206ed80ef03fd..c4ece0fe09f018 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -474,11 +474,13 @@ _Py_union_from_tuple(PyObject *args) } if (PyTuple_CheckExact(args)) { if (!unionbuilder_add_tuple(&ub, args)) { + unionbuilder_finalize(&ub); return NULL; } } else { if (!unionbuilder_add_single(&ub, args)) { + unionbuilder_finalize(&ub); return NULL; } } From 07eb67b859e173481964d8b3502e03343e65ca48 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 12 Oct 2025 14:26:29 +0200 Subject: [PATCH 1154/1674] [3.14] gh-127081: add critical sections to `dbm` objects (gh-132749) (#139996) gh-127081: add critical sections to `dbm` objects (gh-132749) (cherry picked from commit ffaeb3dddf17b891301e6f172c87267f59784d00) Co-authored-by: Duane Griffin --- ...-04-21-01-05-14.gh-issue-127081.Egrpq7.rst | 2 + Modules/_dbmmodule.c | 76 ++++++++++++++--- Modules/_gdbmmodule.c | 85 ++++++++++++++++--- Modules/clinic/_dbmmodule.c.h | 37 ++++++-- Modules/clinic/_gdbmmodule.c.h | 70 ++++++++++++--- 5 files changed, 229 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst diff --git a/Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst b/Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst new file mode 100644 index 00000000000000..30643673bf9a3f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst @@ -0,0 +1,2 @@ +Fix libc thread safety issues with :mod:`dbm` by performing stateful +operations in critical sections. diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index cc65cbd98d71dc..0cd0f043de453d 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -69,6 +69,7 @@ typedef struct { #include "clinic/_dbmmodule.c.h" #define check_dbmobject_open(v, err) \ + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED((v)) \ if ((v)->di_dbm == NULL) { \ PyErr_SetString(err, "DBM object has already been closed"); \ return NULL; \ @@ -116,7 +117,7 @@ dbm_dealloc(PyObject *self) } static Py_ssize_t -dbm_length(PyObject *self) +dbm_length_lock_held(PyObject *self) { dbmobject *dp = dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); @@ -138,8 +139,18 @@ dbm_length(PyObject *self) return dp->di_size; } +static Py_ssize_t +dbm_length(PyObject *self) +{ + Py_ssize_t result; + Py_BEGIN_CRITICAL_SECTION(self); + result = dbm_length_lock_held(self); + Py_END_CRITICAL_SECTION(); + return result; +} + static int -dbm_bool(PyObject *self) +dbm_bool_lock_held(PyObject *self) { dbmobject *dp = dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); @@ -170,8 +181,18 @@ dbm_bool(PyObject *self) return 1; } +static int +dbm_bool(PyObject *self) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(self); + result = dbm_bool_lock_held(self); + Py_END_CRITICAL_SECTION(); + return result; +} + static PyObject * -dbm_subscript(PyObject *self, PyObject *key) +dbm_subscript_lock_held(PyObject *self, PyObject *key) { datum drec, krec; Py_ssize_t tmp_size; @@ -197,8 +218,18 @@ dbm_subscript(PyObject *self, PyObject *key) return PyBytes_FromStringAndSize(drec.dptr, drec.dsize); } +static PyObject * +dbm_subscript(PyObject *self, PyObject *key) +{ + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(self); + result = dbm_subscript_lock_held(self, key); + Py_END_CRITICAL_SECTION(); + return result; +} + static int -dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w) +dbm_ass_sub_lock_held(PyObject *self, PyObject *v, PyObject *w) { datum krec, drec; Py_ssize_t tmp_size; @@ -252,7 +283,18 @@ dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w) return 0; } +static int +dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(self); + result = dbm_ass_sub_lock_held(self, v, w); + Py_END_CRITICAL_SECTION(); + return result; +} + /*[clinic input] +@critical_section _dbm.dbm.close Close the database. @@ -260,7 +302,7 @@ Close the database. static PyObject * _dbm_dbm_close_impl(dbmobject *self) -/*[clinic end generated code: output=c8dc5b6709600b86 input=046db72377d51be8]*/ +/*[clinic end generated code: output=c8dc5b6709600b86 input=4a94f79facbc28ca]*/ { if (self->di_dbm) { dbm_close(self->di_dbm); @@ -270,6 +312,7 @@ _dbm_dbm_close_impl(dbmobject *self) } /*[clinic input] +@critical_section _dbm.dbm.keys cls: defining_class @@ -279,7 +322,7 @@ Return a list of all keys in the database. static PyObject * _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=f2a593b3038e5996 input=d3706a28fc051097]*/ +/*[clinic end generated code: output=f2a593b3038e5996 input=6ddefeadf2a80156]*/ { PyObject *v, *item; datum key; @@ -310,7 +353,7 @@ _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls) } static int -dbm_contains(PyObject *self, PyObject *arg) +dbm_contains_lock_held(PyObject *self, PyObject *arg) { dbmobject *dp = dbmobject_CAST(self); datum key, val; @@ -343,7 +386,18 @@ dbm_contains(PyObject *self, PyObject *arg) return val.dptr != NULL; } +static int +dbm_contains(PyObject *self, PyObject *arg) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(self); + result = dbm_contains_lock_held(self, arg); + Py_END_CRITICAL_SECTION(); + return result; +} + /*[clinic input] +@critical_section _dbm.dbm.get cls: defining_class key: str(accept={str, robuffer}, zeroes=True) @@ -356,7 +410,7 @@ Return the value for key if present, otherwise default. static PyObject * _dbm_dbm_get_impl(dbmobject *self, PyTypeObject *cls, const char *key, Py_ssize_t key_length, PyObject *default_value) -/*[clinic end generated code: output=b4e55f8b6d482bc4 input=66b993b8349fa8c1]*/ +/*[clinic end generated code: output=b4e55f8b6d482bc4 input=1d88a22bb5e55202]*/ { datum dbm_key, val; _dbm_state *state = PyType_GetModuleState(cls); @@ -373,6 +427,7 @@ _dbm_dbm_get_impl(dbmobject *self, PyTypeObject *cls, const char *key, } /*[clinic input] +@critical_section _dbm.dbm.setdefault cls: defining_class key: str(accept={str, robuffer}, zeroes=True) @@ -387,7 +442,7 @@ If key is not in the database, it is inserted with default as the value. static PyObject * _dbm_dbm_setdefault_impl(dbmobject *self, PyTypeObject *cls, const char *key, Py_ssize_t key_length, PyObject *default_value) -/*[clinic end generated code: output=9c2f6ea6d0fb576c input=126a3ff15c5f8232]*/ +/*[clinic end generated code: output=9c2f6ea6d0fb576c input=c01510ef7571e13b]*/ { datum dbm_key, val; Py_ssize_t tmp_size; @@ -427,6 +482,7 @@ _dbm_dbm_setdefault_impl(dbmobject *self, PyTypeObject *cls, const char *key, } /*[clinic input] +@critical_section _dbm.dbm.clear cls: defining_class / @@ -436,7 +492,7 @@ Remove all items from the database. static PyObject * _dbm_dbm_clear_impl(dbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=8d126b9e1d01a434 input=43aa6ca1acb7f5f5]*/ +/*[clinic end generated code: output=8d126b9e1d01a434 input=a1aa5d99adfb9656]*/ { _dbm_state *state = PyType_GetModuleState(cls); assert(state != NULL); diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index ab2ebdba9249bf..9c402e20e513b9 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -81,6 +81,7 @@ typedef struct { #include "clinic/_gdbmmodule.c.h" #define check_gdbmobject_open(v, err) \ + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED((v)) \ if ((v)->di_dbm == NULL) { \ PyErr_SetString(err, "GDBM object has already been closed"); \ return NULL; \ @@ -142,7 +143,7 @@ gdbm_dealloc(PyObject *op) } static Py_ssize_t -gdbm_length(PyObject *op) +gdbm_length_lock_held(PyObject *op) { gdbmobject *dp = _gdbmobject_CAST(op); _gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); @@ -188,8 +189,18 @@ gdbm_length(PyObject *op) return dp->di_size; } +static Py_ssize_t +gdbm_length(PyObject *op) +{ + Py_ssize_t result; + Py_BEGIN_CRITICAL_SECTION(op); + result = gdbm_length_lock_held(op); + Py_END_CRITICAL_SECTION(); + return result; +} + static int -gdbm_bool(PyObject *op) +gdbm_bool_lock_held(PyObject *op) { gdbmobject *dp = _gdbmobject_CAST(op); _gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); @@ -218,6 +229,16 @@ gdbm_bool(PyObject *op) return 1; } +static int +gdbm_bool(PyObject *op) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(op); + result = gdbm_bool_lock_held(op); + Py_END_CRITICAL_SECTION(); + return result; +} + // Wrapper function for PyArg_Parse(o, "s#", &d.dptr, &d.size). // This function is needed to support PY_SSIZE_T_CLEAN. // Return 1 on success, same to PyArg_Parse(). @@ -240,7 +261,7 @@ parse_datum(PyObject *o, datum *d, const char *failmsg) } static PyObject * -gdbm_subscript(PyObject *op, PyObject *key) +gdbm_subscript_lock_held(PyObject *op, PyObject *key) { PyObject *v; datum drec, krec; @@ -265,6 +286,16 @@ gdbm_subscript(PyObject *op, PyObject *key) return v; } +static PyObject * +gdbm_subscript(PyObject *op, PyObject *key) +{ + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); + result = gdbm_subscript_lock_held(op, key); + Py_END_CRITICAL_SECTION(); + return result; +} + /*[clinic input] _gdbm.gdbm.get @@ -290,7 +321,7 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value) } static int -gdbm_ass_sub(PyObject *op, PyObject *v, PyObject *w) +gdbm_ass_sub_lock_held(PyObject *op, PyObject *v, PyObject *w) { datum krec, drec; const char *failmsg = "gdbm mappings have bytes or string indices only"; @@ -335,7 +366,18 @@ gdbm_ass_sub(PyObject *op, PyObject *v, PyObject *w) return 0; } +static int +gdbm_ass_sub(PyObject *op, PyObject *v, PyObject *w) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(op); + result = gdbm_ass_sub_lock_held(op, v, w); + Py_END_CRITICAL_SECTION(); + return result; +} + /*[clinic input] +@critical_section _gdbm.gdbm.setdefault key: object @@ -348,7 +390,7 @@ Get value for key, or set it to default and return default if not present. static PyObject * _gdbm_gdbm_setdefault_impl(gdbmobject *self, PyObject *key, PyObject *default_value) -/*[clinic end generated code: output=f3246e880509f142 input=0db46b69e9680171]*/ +/*[clinic end generated code: output=f3246e880509f142 input=854374cd81ab51b6]*/ { PyObject *res; @@ -363,6 +405,7 @@ _gdbm_gdbm_setdefault_impl(gdbmobject *self, PyObject *key, } /*[clinic input] +@critical_section _gdbm.gdbm.close Close the database. @@ -370,7 +413,7 @@ Close the database. static PyObject * _gdbm_gdbm_close_impl(gdbmobject *self) -/*[clinic end generated code: output=f5abb4d6bb9e52d5 input=0a203447379b45fd]*/ +/*[clinic end generated code: output=f5abb4d6bb9e52d5 input=56b604f4e77f533d]*/ { if (self->di_dbm) { gdbm_close(self->di_dbm); @@ -381,6 +424,7 @@ _gdbm_gdbm_close_impl(gdbmobject *self) /* XXX Should return a set or a set view */ /*[clinic input] +@critical_section _gdbm.gdbm.keys cls: defining_class @@ -390,7 +434,7 @@ Get a list of all keys in the database. static PyObject * _gdbm_gdbm_keys_impl(gdbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=c24b824e81404755 input=1428b7c79703d7d5]*/ +/*[clinic end generated code: output=c24b824e81404755 input=785988b1ea8f77e0]*/ { PyObject *v, *item; datum key, nextkey; @@ -432,7 +476,7 @@ _gdbm_gdbm_keys_impl(gdbmobject *self, PyTypeObject *cls) } static int -gdbm_contains(PyObject *self, PyObject *arg) +gdbm_contains_lock_held(PyObject *self, PyObject *arg) { gdbmobject *dp = (gdbmobject *)self; datum key; @@ -463,7 +507,18 @@ gdbm_contains(PyObject *self, PyObject *arg) return gdbm_exists(dp->di_dbm, key); } +static int +gdbm_contains(PyObject *self, PyObject *arg) +{ + int result; + Py_BEGIN_CRITICAL_SECTION(self); + result = gdbm_contains_lock_held(self, arg); + Py_END_CRITICAL_SECTION(); + return result; +} + /*[clinic input] +@critical_section _gdbm.gdbm.firstkey cls: defining_class @@ -477,7 +532,7 @@ hash values, and won't be sorted by the key values. static PyObject * _gdbm_gdbm_firstkey_impl(gdbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=139275e9c8b60827 input=ed8782a029a5d299]*/ +/*[clinic end generated code: output=139275e9c8b60827 input=aad5a7c886c542f5]*/ { PyObject *v; datum key; @@ -497,6 +552,7 @@ _gdbm_gdbm_firstkey_impl(gdbmobject *self, PyTypeObject *cls) } /*[clinic input] +@critical_section _gdbm.gdbm.nextkey cls: defining_class @@ -517,7 +573,7 @@ to create a list in memory that contains them all: static PyObject * _gdbm_gdbm_nextkey_impl(gdbmobject *self, PyTypeObject *cls, const char *key, Py_ssize_t key_length) -/*[clinic end generated code: output=c81a69300ef41766 input=365e297bc0b3db48]*/ +/*[clinic end generated code: output=c81a69300ef41766 input=181f1130d5bfeb1e]*/ { PyObject *v; datum dbm_key, nextkey; @@ -539,6 +595,7 @@ _gdbm_gdbm_nextkey_impl(gdbmobject *self, PyTypeObject *cls, const char *key, } /*[clinic input] +@critical_section _gdbm.gdbm.reorganize cls: defining_class @@ -554,7 +611,7 @@ kept and reused as new (key,value) pairs are added. static PyObject * _gdbm_gdbm_reorganize_impl(gdbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=d77c69e8e3dd644a input=e1359faeef844e46]*/ +/*[clinic end generated code: output=d77c69e8e3dd644a input=3e3ca0d2ea787861]*/ { _gdbm_state *state = PyType_GetModuleState(cls); assert(state != NULL); @@ -573,6 +630,7 @@ _gdbm_gdbm_reorganize_impl(gdbmobject *self, PyTypeObject *cls) } /*[clinic input] +@critical_section _gdbm.gdbm.sync cls: defining_class @@ -585,7 +643,7 @@ any unwritten data to be written to the disk. static PyObject * _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=bb680a2035c3f592 input=3d749235f79b6f2a]*/ +/*[clinic end generated code: output=bb680a2035c3f592 input=6054385b071d238a]*/ { _gdbm_state *state = PyType_GetModuleState(cls); assert(state != NULL); @@ -595,6 +653,7 @@ _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls) } /*[clinic input] +@critical_section _gdbm.gdbm.clear cls: defining_class / @@ -604,7 +663,7 @@ Remove all items from the database. static PyObject * _gdbm_gdbm_clear_impl(gdbmobject *self, PyTypeObject *cls) -/*[clinic end generated code: output=673577c573318661 input=34136d52fcdd4210]*/ +/*[clinic end generated code: output=673577c573318661 input=b17467adfe62f23d]*/ { _gdbm_state *state = PyType_GetModuleState(cls); assert(state != NULL); diff --git a/Modules/clinic/_dbmmodule.c.h b/Modules/clinic/_dbmmodule.c.h index 5e503194408776..091ce9edc43d4b 100644 --- a/Modules/clinic/_dbmmodule.c.h +++ b/Modules/clinic/_dbmmodule.c.h @@ -5,6 +5,7 @@ preserve #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) # include "pycore_runtime.h" // _Py_SINGLETON() #endif +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() PyDoc_STRVAR(_dbm_dbm_close__doc__, @@ -22,7 +23,13 @@ _dbm_dbm_close_impl(dbmobject *self); static PyObject * _dbm_dbm_close(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _dbm_dbm_close_impl((dbmobject *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _dbm_dbm_close_impl((dbmobject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_dbm_dbm_keys__doc__, @@ -40,11 +47,18 @@ _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls); static PyObject * _dbm_dbm_keys(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "keys() takes no arguments"); - return NULL; + goto exit; } - return _dbm_dbm_keys_impl((dbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _dbm_dbm_keys_impl((dbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_dbm_dbm_get__doc__, @@ -85,7 +99,9 @@ _dbm_dbm_get(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_ &key, &key_length, &default_value)) { goto exit; } + Py_BEGIN_CRITICAL_SECTION(self); return_value = _dbm_dbm_get_impl((dbmobject *)self, cls, key, key_length, default_value); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -131,7 +147,9 @@ _dbm_dbm_setdefault(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py &key, &key_length, &default_value)) { goto exit; } + Py_BEGIN_CRITICAL_SECTION(self); return_value = _dbm_dbm_setdefault_impl((dbmobject *)self, cls, key, key_length, default_value); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -152,11 +170,18 @@ _dbm_dbm_clear_impl(dbmobject *self, PyTypeObject *cls); static PyObject * _dbm_dbm_clear(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "clear() takes no arguments"); - return NULL; + goto exit; } - return _dbm_dbm_clear_impl((dbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _dbm_dbm_clear_impl((dbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(dbmopen__doc__, @@ -221,4 +246,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=3b456118f231b160 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=279511ea7cda38dd input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_gdbmmodule.c.h b/Modules/clinic/_gdbmmodule.c.h index 00950f18e53541..6fd6aa3da50335 100644 --- a/Modules/clinic/_gdbmmodule.c.h +++ b/Modules/clinic/_gdbmmodule.c.h @@ -5,6 +5,7 @@ preserve #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) # include "pycore_runtime.h" // _Py_SINGLETON() #endif +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_CheckPositional() PyDoc_STRVAR(_gdbm_gdbm_get__doc__, @@ -70,7 +71,9 @@ _gdbm_gdbm_setdefault(PyObject *self, PyObject *const *args, Py_ssize_t nargs) } default_value = args[1]; skip_optional: + Py_BEGIN_CRITICAL_SECTION(self); return_value = _gdbm_gdbm_setdefault_impl((gdbmobject *)self, key, default_value); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -91,7 +94,13 @@ _gdbm_gdbm_close_impl(gdbmobject *self); static PyObject * _gdbm_gdbm_close(PyObject *self, PyObject *Py_UNUSED(ignored)) { - return _gdbm_gdbm_close_impl((gdbmobject *)self); + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _gdbm_gdbm_close_impl((gdbmobject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; } PyDoc_STRVAR(_gdbm_gdbm_keys__doc__, @@ -109,11 +118,18 @@ _gdbm_gdbm_keys_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_keys(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "keys() takes no arguments"); - return NULL; + goto exit; } - return _gdbm_gdbm_keys_impl((gdbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _gdbm_gdbm_keys_impl((gdbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_gdbm_gdbm_firstkey__doc__, @@ -135,11 +151,18 @@ _gdbm_gdbm_firstkey_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_firstkey(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "firstkey() takes no arguments"); - return NULL; + goto exit; } - return _gdbm_gdbm_firstkey_impl((gdbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _gdbm_gdbm_firstkey_impl((gdbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_gdbm_gdbm_nextkey__doc__, @@ -187,7 +210,9 @@ _gdbm_gdbm_nextkey(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ &key, &key_length)) { goto exit; } + Py_BEGIN_CRITICAL_SECTION(self); return_value = _gdbm_gdbm_nextkey_impl((gdbmobject *)self, cls, key, key_length); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -214,11 +239,18 @@ _gdbm_gdbm_reorganize_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_reorganize(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "reorganize() takes no arguments"); - return NULL; + goto exit; } - return _gdbm_gdbm_reorganize_impl((gdbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _gdbm_gdbm_reorganize_impl((gdbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_gdbm_gdbm_sync__doc__, @@ -239,11 +271,18 @@ _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_sync(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "sync() takes no arguments"); - return NULL; + goto exit; } - return _gdbm_gdbm_sync_impl((gdbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _gdbm_gdbm_sync_impl((gdbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(_gdbm_gdbm_clear__doc__, @@ -261,11 +300,18 @@ _gdbm_gdbm_clear_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_clear(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyObject *return_value = NULL; + if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) { PyErr_SetString(PyExc_TypeError, "clear() takes no arguments"); - return NULL; + goto exit; } - return _gdbm_gdbm_clear_impl((gdbmobject *)self, cls); + Py_BEGIN_CRITICAL_SECTION(self); + return_value = _gdbm_gdbm_clear_impl((gdbmobject *)self, cls); + Py_END_CRITICAL_SECTION(); + +exit: + return return_value; } PyDoc_STRVAR(dbmopen__doc__, @@ -343,4 +389,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=d974cb39e4ee5d67 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8bca34ce9d4493dd input=a9049054013a1b77]*/ From 6d6d02a98231f9d1755eb67d3d19b3ff77d2e9cf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 12 Oct 2025 14:51:42 +0200 Subject: [PATCH 1155/1674] [3.14] gh-116738: test `dbm.gnu` module on FT Python build (GH-138467) (#139987) gh-116738: test `dbm.gnu` module on FT Python build (GH-138467) (cherry picked from commit a18843dbfba32387be4236379260f7c15a002e0d) Co-authored-by: Alper --- Lib/test/test_free_threading/test_dbm_gnu.py | 79 ++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Lib/test/test_free_threading/test_dbm_gnu.py diff --git a/Lib/test/test_free_threading/test_dbm_gnu.py b/Lib/test/test_free_threading/test_dbm_gnu.py new file mode 100644 index 00000000000000..d2d7b78be712f7 --- /dev/null +++ b/Lib/test/test_free_threading/test_dbm_gnu.py @@ -0,0 +1,79 @@ +import unittest + +from test.support import import_helper, os_helper, threading_helper +from test.support.threading_helper import run_concurrently + +import threading + +gdbm = import_helper.import_module("dbm.gnu") + +NTHREADS = 10 +KEY_PER_THREAD = 1000 + +gdbm_filename = "test_gdbm_file" + + +@threading_helper.requires_working_threading() +class TestGdbm(unittest.TestCase): + def test_racing_dbm_gnu(self): + def gdbm_multi_op_worker(db): + # Each thread sets, gets, and iterates + tid = threading.get_ident() + + # Insert keys + for i in range(KEY_PER_THREAD): + db[f"key_{tid}_{i}"] = f"value_{tid}_{i}" + + for i in range(KEY_PER_THREAD): + # Keys and values are stored as bytes; encode values for + # comparison + key = f"key_{tid}_{i}" + value = f"value_{tid}_{i}".encode() + self.assertIn(key, db) + self.assertEqual(db[key], value) + self.assertEqual(db.get(key), value) + self.assertIsNone(db.get("not_exist")) + with self.assertRaises(KeyError): + db["not_exist"] + + # Iterate over the database keys and verify only those belonging + # to this thread. Other threads may concurrently delete their keys. + key_prefix = f"key_{tid}".encode() + key = db.firstkey() + key_count = 0 + while key: + if key.startswith(key_prefix): + self.assertIn(key, db) + key_count += 1 + key = db.nextkey(key) + + # Can't assert key_count == KEY_PER_THREAD because concurrent + # threads may insert or delete keys during iteration. This can + # cause keys to be skipped or counted multiple times, making the + # count unreliable. + # See: https://www.gnu.org.ua/software/gdbm/manual/Sequential.html + # self.assertEqual(key_count, KEY_PER_THREAD) + + # Delete this thread's keys + for i in range(KEY_PER_THREAD): + key = f"key_{tid}_{i}" + del db[key] + self.assertNotIn(key, db) + with self.assertRaises(KeyError): + del db["not_exist"] + + # Re-insert keys + for i in range(KEY_PER_THREAD): + db[f"key_{tid}_{i}"] = f"value_{tid}_{i}" + + with os_helper.temp_dir() as tmpdirname: + db = gdbm.open(f"{tmpdirname}/{gdbm_filename}", "c") + run_concurrently( + worker_func=gdbm_multi_op_worker, nthreads=NTHREADS, args=(db,) + ) + self.assertEqual(len(db), NTHREADS * KEY_PER_THREAD) + db.close() + + +if __name__ == "__main__": + unittest.main() From 7e8f10710699fd263f533a87ed94e2a3b44c3aaf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 12 Oct 2025 18:55:49 +0200 Subject: [PATCH 1156/1674] [3.14] gh-139155: Remove "dictionaries are sorted by key" note in `pprint` docs (GH-139159) (GH-140003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-139155: Remove "dictionaries are sorted by key" note in `pprint` docs (GH-139159) (cherry picked from commit 68622be935b36f0ca75729157992972dbf426603) Co-authored-by: Bartosz Sławecki --- Doc/library/pprint.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index 2985f31bacb47a..f51892450798ae 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -22,8 +22,6 @@ 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, adjustable by the *width* parameter defaulting to 80 characters. -Dictionaries are sorted by key before the display is computed. - .. versionchanged:: 3.9 Added support for pretty-printing :class:`types.SimpleNamespace`. From 11ac373d7c3f9cdb886f6efe5261843f0af229e8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 12 Oct 2025 19:16:21 +0200 Subject: [PATCH 1157/1674] [3.14] GH-139979: Add @force_not_colorized_test_class to TestOptionalHelpVersionActions (GH-139980) (#140005) GH-139979: Add @force_not_colorized_test_class to TestOptionalHelpVersionActions (GH-139980) (cherry picked from commit 0fc5c56815b963e4b45469b2b6a5610ea2f2d181) Co-authored-by: Savannah Ostrowski --- Lib/test/test_argparse.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index af7cbcafcbea25..9b8179ef9693b2 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -5831,6 +5831,7 @@ def test_subparser_conflict(self): # Help and Version option tests # ============================= +@force_not_colorized_test_class class TestOptionalsHelpVersionActions(TestCase): """Test the help and version actions""" From 0b84334e528bd59ffa68eca0c3d00ff1ab055c36 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 13 Oct 2025 10:48:28 +0200 Subject: [PATCH 1158/1674] [3.14] gh-131189: Remove `curses` mention from `PYTHON_BASIC_REPL` docs (GH-140022) (#140027) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-131189: Remove `curses` mention from `PYTHON_BASIC_REPL` docs (GH-140022) The `curses` dependency for the default REPL has been removed in 031645a88427d8c8df70ae96519b4d2d0ae550f7 (backport of 09dfb50f1b7c23bc48d86bd579671761bb8ca48b). (cherry picked from commit 0344db8d60621705af88daa7ff65bde063271f99) Co-authored-by: Bartosz Sławecki --- Doc/using/cmdline.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 448f2725e9a3db..24541e84732faf 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -1256,9 +1256,8 @@ conflict. .. envvar:: PYTHON_BASIC_REPL If this variable is set to any value, 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`. + load the Python-based :term:`REPL` that requires :mod:`readline`, and will + instead use the traditional parser-based :term:`REPL`. .. versionadded:: 3.13 From 3cef7801dd496f002622c77a223ab210047f3fcd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 13 Oct 2025 13:30:27 +0200 Subject: [PATCH 1159/1674] [3.14] gh-107073: fix relevant typo in `PyObject_ClearManagedDict` (GH-140032) (#140033) gh-107073: fix relevant typo in `PyObject_ClearManagedDict` (GH-140032) (cherry picked from commit 52996aaa78706e0f2a70953feaf97b474eb438e7) Co-authored-by: Mikhail Efimov --- Doc/c-api/object.rst | 2 +- Doc/c-api/typeobj.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 241fbd3a4866c7..1e39505588f6fd 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -585,7 +585,7 @@ Object Protocol Clear the managed dictionary of *obj*. - This function must only be called in a traverse function of the type which + This function must only be called in a clear function of the type which has the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag set. .. versionadded:: 3.13 diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 060d6f60174b41..d86b3ed730a3d1 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1691,7 +1691,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) :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:member:`~PyTypeObject.tp_flags` field, the clear function must call :c:func:`PyObject_ClearManagedDict` like this:: PyObject_ClearManagedDict((PyObject*)self); From a5bf8a9a29080262ec238298c79c2f26ec73d9a4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 13 Oct 2025 16:25:49 +0200 Subject: [PATCH 1160/1674] [3.14] Using Python on Windows: Free-threaded is supported from 3.14 (GH-139992) (#140045) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/using/windows.rst | 61 ++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 3cdbd3ad1da8ea..ab0ed3fb110fac 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -60,7 +60,7 @@ packages. .. _windows-path-mod: .. _launcher: -Python Install Manager +Python install manager ====================== Installation @@ -103,7 +103,7 @@ Windows Server 2019, please see :ref:`pymanager-advancedinstall` below for more information. -Basic Use +Basic use --------- The recommended command for launching Python is ``python``, which will either @@ -193,7 +193,7 @@ installed if automatic installation is configured (most likely by setting ``pymanager exec`` forms of the command were used. -Command Help +Command help ------------ The ``py help`` command will display the full list of supported commands, along @@ -218,7 +218,7 @@ override multiple settings at once. See :ref:`pymanager-config` below for more information about these files. -Listing Runtimes +Listing runtimes ---------------- .. code:: @@ -259,7 +259,7 @@ For compatibility with the old launcher, the ``--list``, ``--list-paths``, additional options, and will produce legacy formatted output. -Installing Runtimes +Installing runtimes ------------------- .. code:: @@ -298,7 +298,7 @@ useful for embedding runtimes into larger applications. .. _pymanager-offline: -Offline Installs +Offline installs ---------------- To perform offline installs of Python, you will need to first create an offline @@ -330,7 +330,7 @@ In this way, Python runtimes can be installed and managed on a machine without access to the internet. -Uninstalling Runtimes +Uninstalling runtimes --------------------- .. code:: @@ -541,7 +541,7 @@ configuration option. .. _pymanager-advancedinstall: -Advanced Installation +Advanced installation --------------------- For situations where an MSIX cannot be installed, such as some older @@ -635,7 +635,7 @@ the Store package in this way. .. _pymanager-admin-config: -Administrative Configuration +Administrative configuration ---------------------------- There are a number of options that may be useful for administrators to override @@ -726,17 +726,12 @@ directory containing the configuration file that specified them. .. _install-freethreaded-windows: -Installing Free-threaded Binaries +Installing free-threaded binaries --------------------------------- -.. versionadded:: 3.13 (Experimental) +.. versionadded:: 3.13 -.. note:: - - Everything described in this section is considered experimental, - and should be expected to change in future releases. - -Pre-built distributions of the experimental free-threaded build are available +Pre-built distributions of the free-threaded build are available by installing tags with the ``t`` suffix. .. code:: @@ -885,7 +880,7 @@ versions before providing updates to users. The two recommended use cases for this distribution are described below. -Python Application +Python application ------------------ An application written in Python does not necessarily require users to be aware @@ -989,12 +984,7 @@ for the 64-bit version, `www.nuget.org/packages/pythonx86 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. +.. versionadded:: 3.13 Packages containing free-threaded binaries are named `python-freethreaded `_ @@ -1046,7 +1036,7 @@ please install Python 3.12. .. _max-path: -Removing the MAX_PATH Limitation +Removing the MAX_PATH limitation ================================ Windows historically has limited path lengths to 260 characters. This meant that @@ -1327,7 +1317,7 @@ installation". In this case: * Shortcuts are available for all users -Removing the MAX_PATH Limitation +Removing the MAX_PATH limitation -------------------------------- Windows historically has limited path lengths to 260 characters. This meant that @@ -1350,7 +1340,7 @@ After changing the above option, no further configuration is required. .. _install-quiet-option: -Installing Without UI +Installing without UI --------------------- All of the options available in the installer UI can also be specified from the @@ -1499,7 +1489,7 @@ example file sets the same options as the previous example: .. _install-layout-option: -Installing Without Downloading +Installing without downloading ------------------------------ As some features of Python are not included in the initial installer download, @@ -1540,15 +1530,10 @@ settings and replace any that have been removed or modified. :ref:`launcher`, which has its own entry in Programs and Features. -Installing Free-threaded Binaries +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. +.. versionadded:: 3.13 To install pre-built binaries with free-threading enabled (see :pep:`703`), you should select "Customize installation". The second page of options includes the @@ -1580,7 +1565,7 @@ builds. Free-threaded binaries are also available :ref:`on nuget.org `. -Python Launcher for Windows (Deprecated) +Python launcher for Windows (deprecated) ======================================== .. deprecated:: 3.14 @@ -1732,7 +1717,7 @@ have the script specify the version which should be used. The key benefit of this is that a single launcher can support multiple Python versions at the same time depending on the contents of the first line. -Shebang Lines +Shebang lines ------------- If the first line of a script file starts with ``#!``, it is known as a @@ -1944,7 +1929,7 @@ should allow you to see what versions of Python were located, why a particular version was chosen and the exact command-line used to execute the target Python. It is primarily intended for testing and debugging. -Dry Run +Dry run ------- If an environment variable :envvar:`!PYLAUNCHER_DRYRUN` is set (to any value), From 17d9f7169a6ce0c6c4bd6b3106015091e508ce60 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:56:26 +0200 Subject: [PATCH 1161/1674] [3.14] gh-138772: Fix and improve documentation for turtle color functions (GH-139325) (GH-140047) Use multiple signatures for clarity. Explain different forms of bgcolor() in details. Fix outdated docstrings. (cherry picked from commit 525dcfe5236ee21b234cad16d2a3d5769e77e0ec) Co-authored-by: Serhiy Storchaka --- Doc/library/turtle.rst | 52 +++++++++++++++---- Lib/turtle.py | 115 ++++++++++++++++++++++++----------------- 2 files changed, 110 insertions(+), 57 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index fea6b57edf0f1f..b687231bd489cc 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -777,13 +777,17 @@ Turtle motion 180.0 -.. function:: dot(size=None, *color) +.. function:: dot() + dot(size) + dot(color, /) + dot(size, color, /) + dot(size, r, g, b, /) :param size: an integer >= 1 (if given) :param color: a colorstring or a numeric color tuple Draw a circular dot with diameter *size*, using *color*. If *size* is - not given, the maximum of pensize+4 and 2*pensize is used. + not given, the maximum of ``pensize+4`` and ``2*pensize`` is used. .. doctest:: @@ -1152,7 +1156,9 @@ Drawing state Color control ~~~~~~~~~~~~~ -.. function:: pencolor(*args) +.. function:: pencolor() + pencolor(color, /) + pencolor(r, g, b, /) Return or set the pencolor. @@ -1161,7 +1167,7 @@ Color control ``pencolor()`` Return the current pencolor as color specification string or as a tuple (see example). May be used as input to another - color/pencolor/fillcolor call. + color/pencolor/fillcolor/bgcolor call. ``pencolor(colorstring)`` Set pencolor to *colorstring*, which is a Tk color specification string, @@ -1201,7 +1207,9 @@ Color control (50.0, 193.0, 143.0) -.. function:: fillcolor(*args) +.. function:: fillcolor() + fillcolor(color, /) + fillcolor(r, g, b, /) Return or set the fillcolor. @@ -1210,7 +1218,7 @@ Color control ``fillcolor()`` Return the current fillcolor as color specification string, possibly in tuple format (see example). May be used as input to another - color/pencolor/fillcolor call. + color/pencolor/fillcolor/bgcolor call. ``fillcolor(colorstring)`` Set fillcolor to *colorstring*, which is a Tk color specification string, @@ -1244,7 +1252,10 @@ Color control (255.0, 255.0, 255.0) -.. function:: color(*args) +.. function:: color() + color(color, /) + color(r, g, b, /) + color(pencolor, fillcolor, /) Return or set pencolor and fillcolor. @@ -1870,13 +1881,32 @@ Most of the examples in this section refer to a TurtleScreen instance called Window control -------------- -.. function:: bgcolor(*args) +.. function:: bgcolor() + bgcolor(color, /) + bgcolor(r, g, b, /) - :param args: a color string or three numbers in the range 0..colormode or a - 3-tuple of such numbers + Return or set the background color of the TurtleScreen. + Four input formats are allowed: + + ``bgcolor()`` + Return the current background color as color specification string or + as a tuple (see example). May be used as input to another + color/pencolor/fillcolor/bgcolor call. + + ``bgcolor(colorstring)`` + Set the background color to *colorstring*, which is a Tk color + specification string, such as ``"red"``, ``"yellow"``, or ``"#33cc8c"``. - Set or return background color of the TurtleScreen. + ``bgcolor((r, g, b))`` + Set the background color to the RGB color represented by the tuple of + *r*, *g*, and *b*. + Each of *r*, *g*, and *b* must be in the range 0..colormode, where + colormode is either 1.0 or 255 (see :func:`colormode`). + + ``bgcolor(r, g, b)`` + Set the background color to the RGB color represented by *r*, *g*, and *b*. Each of + *r*, *g*, and *b* must be in the range 0..colormode. .. doctest:: :skipif: _tkinter is None diff --git a/Lib/turtle.py b/Lib/turtle.py index e88981d298ad52..e5ce2c0a03cad6 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -1214,16 +1214,32 @@ def turtles(self): def bgcolor(self, *args): """Set or return backgroundcolor of the TurtleScreen. - Arguments (if given): a color string or three numbers - in the range 0..colormode or a 3-tuple of such numbers. + Four input formats are allowed: + - bgcolor() + Return the current background color as color specification + string or as a tuple (see example). May be used as input + to another color/pencolor/fillcolor/bgcolor call. + - bgcolor(colorstring) + Set the background color to colorstring, which is a Tk color + specification string, such as "red", "yellow", or "#33cc8c". + - bgcolor((r, g, b)) + Set the background color to the RGB color represented by + the tuple of r, g, and b. Each of r, g, and b must be in + the range 0..colormode, where colormode is either 1.0 or 255 + (see colormode()). + - bgcolor(r, g, b) + Set the background color to the RGB color represented by + r, g, and b. Each of r, g, and b must be in the range + 0..colormode. Example (for a TurtleScreen instance named screen): >>> screen.bgcolor("orange") >>> screen.bgcolor() 'orange' - >>> screen.bgcolor(0.5,0,0.5) + >>> colormode(255) + >>> screen.bgcolor('#800080') >>> screen.bgcolor() - '#800080' + (128.0, 0.0, 128.0) """ if args: color = self._colorstr(args) @@ -1678,7 +1694,7 @@ def forward(self, distance): Example (for a Turtle instance named turtle): >>> turtle.position() - (0.00, 0.00) + (0.00,0.00) >>> turtle.forward(25) >>> turtle.position() (25.00,0.00) @@ -1701,10 +1717,10 @@ def back(self, distance): Example (for a Turtle instance named turtle): >>> turtle.position() - (0.00, 0.00) + (0.00,0.00) >>> turtle.backward(30) >>> turtle.position() - (-30.00, 0.00) + (-30.00,0.00) """ self._go(-distance) @@ -1811,7 +1827,7 @@ def goto(self, x, y=None): Example (for a Turtle instance named turtle): >>> tp = turtle.pos() >>> tp - (0.00, 0.00) + (0.00,0.00) >>> turtle.setpos(60,30) >>> turtle.pos() (60.00,30.00) @@ -1891,7 +1907,7 @@ def distance(self, x, y=None): Example (for a Turtle instance named turtle): >>> turtle.pos() - (0.00, 0.00) + (0.00,0.00) >>> turtle.distance(30,40) 50.0 >>> pen = Turtle() @@ -2230,19 +2246,17 @@ def color(self, *args): Arguments: Several input formats are allowed. - They use 0, 1, 2, or 3 arguments as follows: - - color() - Return the current pencolor and the current fillcolor - as a pair of color specification strings as are returned - by pencolor and fillcolor. - color(colorstring), color((r,g,b)), color(r,g,b) - inputs as in pencolor, set both, fillcolor and pencolor, + They use 0 to 3 arguments as follows: + - color() + Return the current pencolor and the current fillcolor as + a pair of color specification strings or tuples as returned + by pencolor() and fillcolor(). + - color(colorstring), color((r,g,b)), color(r,g,b) + Inputs as in pencolor(), set both, fillcolor and pencolor, to the given value. - color(colorstring1, colorstring2), - color((r1,g1,b1), (r2,g2,b2)) - equivalent to pencolor(colorstring1) and fillcolor(colorstring2) - and analogously, if the other input format is used. + - color(colorstring1, colorstring2), color((r1,g1,b1), (r2,g2,b2)) + Equivalent to pencolor(colorstring1) and fillcolor(colorstring2) + and analogously if the other input format is used. If turtleshape is a polygon, outline and interior of that polygon is drawn with the newly set colors. @@ -2253,9 +2267,9 @@ def color(self, *args): >>> turtle.color() ('red', 'green') >>> colormode(255) - >>> color((40, 80, 120), (160, 200, 240)) + >>> color(('#285078', '#a0c8f0')) >>> color() - ('#285078', '#a0c8f0') + ((40.0, 80.0, 120.0), (160.0, 200.0, 240.0)) """ if args: l = len(args) @@ -2277,28 +2291,32 @@ def pencolor(self, *args): Arguments: Four input formats are allowed: - pencolor() - Return the current pencolor as color specification string, - possibly in hex-number format (see example). - May be used as input to another color/pencolor/fillcolor call. + Return the current pencolor as color specification string or + as a tuple (see example). May be used as input to another + color/pencolor/fillcolor/bgcolor call. - pencolor(colorstring) - s is a Tk color specification string, such as "red" or "yellow" + Set pencolor to colorstring, which is a Tk color + specification string, such as "red", "yellow", or "#33cc8c". - pencolor((r, g, b)) - *a tuple* of r, g, and b, which represent, an RGB color, - and each of r, g, and b are in the range 0..colormode, - where colormode is either 1.0 or 255 + Set pencolor to the RGB color represented by the tuple of + r, g, and b. Each of r, g, and b must be in the range + 0..colormode, where colormode is either 1.0 or 255 (see + colormode()). - pencolor(r, g, b) - r, g, and b represent an RGB color, and each of r, g, and b - are in the range 0..colormode + Set pencolor to the RGB color represented by r, g, and b. + Each of r, g, and b must be in the range 0..colormode. If turtleshape is a polygon, the outline of that polygon is drawn with the newly set pencolor. Example (for a Turtle instance named turtle): >>> turtle.pencolor('brown') - >>> tup = (0.2, 0.8, 0.55) - >>> turtle.pencolor(tup) >>> turtle.pencolor() - '#33cc8c' + 'brown' + >>> colormode(255) + >>> turtle.pencolor('#32c18f') + >>> turtle.pencolor() + (50.0, 193.0, 143.0) """ if args: color = self._colorstr(args) @@ -2315,26 +2333,31 @@ def fillcolor(self, *args): Four input formats are allowed: - fillcolor() Return the current fillcolor as color specification string, - possibly in hex-number format (see example). - May be used as input to another color/pencolor/fillcolor call. + possibly in tuple format (see example). May be used as + input to another color/pencolor/fillcolor/bgcolor call. - fillcolor(colorstring) - s is a Tk color specification string, such as "red" or "yellow" + Set fillcolor to colorstring, which is a Tk color + specification string, such as "red", "yellow", or "#33cc8c". - fillcolor((r, g, b)) - *a tuple* of r, g, and b, which represent, an RGB color, - and each of r, g, and b are in the range 0..colormode, - where colormode is either 1.0 or 255 + Set fillcolor to the RGB color represented by the tuple of + r, g, and b. Each of r, g, and b must be in the range + 0..colormode, where colormode is either 1.0 or 255 (see + colormode()). - fillcolor(r, g, b) - r, g, and b represent an RGB color, and each of r, g, and b - are in the range 0..colormode + Set fillcolor to the RGB color represented by r, g, and b. + Each of r, g, and b must be in the range 0..colormode. If turtleshape is a polygon, the interior of that polygon is drawn with the newly set fillcolor. Example (for a Turtle instance named turtle): >>> turtle.fillcolor('violet') - >>> col = turtle.pencolor() - >>> turtle.fillcolor(col) - >>> turtle.fillcolor(0, .5, 0) + >>> turtle.fillcolor() + 'violet' + >>> colormode(255) + >>> turtle.fillcolor('#ffffff') + >>> turtle.fillcolor() + (255.0, 255.0, 255.0) """ if args: color = self._colorstr(args) From 511078099a5ce5a52b272539d38e08f28d1b5ff1 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Mon, 13 Oct 2025 23:25:24 +0530 Subject: [PATCH 1162/1674] [3.14] gh-125996: fix thread safety of `collections.OrderedDict` (GH-133734) (#140053) (cherry picked from commit 6481539a6d9692ddf13ab01baad1bc9133409413) --- Include/internal/pycore_dict.h | 6 + ...-05-10-17-42-03.gh-issue-125996.vaQp0-.rst | 1 + Objects/clinic/odictobject.c.h | 106 ++++++++- Objects/dictobject.c | 16 +- Objects/odictobject.c | 213 ++++++++++++------ 5 files changed, 266 insertions(+), 76 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst diff --git a/Include/internal/pycore_dict.h b/Include/internal/pycore_dict.h index 25bb224921aa8b..afd468735b4893 100644 --- a/Include/internal/pycore_dict.h +++ b/Include/internal/pycore_dict.h @@ -30,6 +30,10 @@ PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key, // Export for '_asyncio' shared extension PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, Py_hash_t hash); + +extern int _PyDict_DelItem_KnownHash_LockHeld(PyObject *mp, PyObject *key, + Py_hash_t hash); + extern int _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t); // "Id" variants @@ -47,6 +51,8 @@ extern int _PyDict_HasOnlyStringKeys(PyObject *mp); // Export for '_ctypes' shared extension PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *); +extern Py_ssize_t _PyDict_SizeOf_LockHeld(PyDictObject *); + #define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) /* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, diff --git a/Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst b/Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst new file mode 100644 index 00000000000000..4bbfaa3a5e2d85 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst @@ -0,0 +1 @@ +Fix thread safety of :class:`collections.OrderedDict`. Patch by Kumar Aditya. diff --git a/Objects/clinic/odictobject.c.h b/Objects/clinic/odictobject.c.h index e71c29a1b268d0..894e9be91bbdce 100644 --- a/Objects/clinic/odictobject.c.h +++ b/Objects/clinic/odictobject.c.h @@ -6,6 +6,7 @@ preserve # include "pycore_gc.h" // PyGC_Head # include "pycore_runtime.h" // _Py_ID() #endif +#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() PyDoc_STRVAR(OrderedDict_fromkeys__doc__, @@ -73,6 +74,53 @@ OrderedDict_fromkeys(PyObject *type, PyObject *const *args, Py_ssize_t nargs, Py return return_value; } +PyDoc_STRVAR(OrderedDict___sizeof____doc__, +"__sizeof__($self, /)\n" +"--\n" +"\n"); + +#define ORDEREDDICT___SIZEOF___METHODDEF \ + {"__sizeof__", (PyCFunction)OrderedDict___sizeof__, METH_NOARGS, OrderedDict___sizeof____doc__}, + +static Py_ssize_t +OrderedDict___sizeof___impl(PyODictObject *self); + +static PyObject * +OrderedDict___sizeof__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + Py_ssize_t _return_value; + + Py_BEGIN_CRITICAL_SECTION(self); + _return_value = OrderedDict___sizeof___impl((PyODictObject *)self); + Py_END_CRITICAL_SECTION(); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(OrderedDict___reduce____doc__, +"__reduce__($self, /)\n" +"--\n" +"\n" +"Return state information for pickling"); + +#define ORDEREDDICT___REDUCE___METHODDEF \ + {"__reduce__", (PyCFunction)OrderedDict___reduce__, METH_NOARGS, OrderedDict___reduce____doc__}, + +static PyObject * +OrderedDict___reduce___impl(PyODictObject *od); + +static PyObject * +OrderedDict___reduce__(PyObject *od, PyObject *Py_UNUSED(ignored)) +{ + return OrderedDict___reduce___impl((PyODictObject *)od); +} + PyDoc_STRVAR(OrderedDict_setdefault__doc__, "setdefault($self, /, key, default=None)\n" "--\n" @@ -135,7 +183,9 @@ OrderedDict_setdefault(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } default_value = args[1]; skip_optional_pos: + Py_BEGIN_CRITICAL_SECTION(self); return_value = OrderedDict_setdefault_impl((PyODictObject *)self, key, default_value); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -204,7 +254,9 @@ OrderedDict_pop(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObjec } default_value = args[1]; skip_optional_pos: + Py_BEGIN_CRITICAL_SECTION(self); return_value = OrderedDict_pop_impl((PyODictObject *)self, key, default_value); + Py_END_CRITICAL_SECTION(); exit: return return_value; @@ -272,12 +324,62 @@ OrderedDict_popitem(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyO goto exit; } skip_optional_pos: + Py_BEGIN_CRITICAL_SECTION(self); return_value = OrderedDict_popitem_impl((PyODictObject *)self, last); + Py_END_CRITICAL_SECTION(); exit: return return_value; } +PyDoc_STRVAR(OrderedDict_clear__doc__, +"clear($self, /)\n" +"--\n" +"\n" +"Remove all items from ordered dict."); + +#define ORDEREDDICT_CLEAR_METHODDEF \ + {"clear", (PyCFunction)OrderedDict_clear, METH_NOARGS, OrderedDict_clear__doc__}, + +static PyObject * +OrderedDict_clear_impl(PyODictObject *self); + +static PyObject * +OrderedDict_clear(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(self); + return_value = OrderedDict_clear_impl((PyODictObject *)self); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + +PyDoc_STRVAR(OrderedDict_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"A shallow copy of ordered dict."); + +#define ORDEREDDICT_COPY_METHODDEF \ + {"copy", (PyCFunction)OrderedDict_copy, METH_NOARGS, OrderedDict_copy__doc__}, + +static PyObject * +OrderedDict_copy_impl(PyObject *od); + +static PyObject * +OrderedDict_copy(PyObject *od, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + + Py_BEGIN_CRITICAL_SECTION(od); + return_value = OrderedDict_copy_impl(od); + Py_END_CRITICAL_SECTION(); + + return return_value; +} + PyDoc_STRVAR(OrderedDict_move_to_end__doc__, "move_to_end($self, /, key, last=True)\n" "--\n" @@ -342,9 +444,11 @@ OrderedDict_move_to_end(PyObject *self, PyObject *const *args, Py_ssize_t nargs, goto exit; } skip_optional_pos: + Py_BEGIN_CRITICAL_SECTION(self); return_value = OrderedDict_move_to_end_impl((PyODictObject *)self, key, last); + Py_END_CRITICAL_SECTION(); exit: return return_value; } -/*[clinic end generated code: output=7d8206823bb1f419 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7bc997ca7900f06f input=a9049054013a1b77]*/ diff --git a/Objects/dictobject.c b/Objects/dictobject.c index be62ae5eefd00d..d669f8421c4792 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2770,8 +2770,8 @@ PyDict_DelItem(PyObject *op, PyObject *key) return _PyDict_DelItem_KnownHash(op, key, hash); } -static int -delitem_knownhash_lock_held(PyObject *op, PyObject *key, Py_hash_t hash) +int +_PyDict_DelItem_KnownHash_LockHeld(PyObject *op, PyObject *key, Py_hash_t hash) { Py_ssize_t ix; PyDictObject *mp; @@ -2806,7 +2806,7 @@ _PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash) { int res; Py_BEGIN_CRITICAL_SECTION(op); - res = delitem_knownhash_lock_held(op, key, hash); + res = _PyDict_DelItem_KnownHash_LockHeld(op, key, hash); Py_END_CRITICAL_SECTION(); return res; } @@ -4654,9 +4654,11 @@ dict_tp_clear(PyObject *op) static PyObject *dictiter_new(PyDictObject *, PyTypeObject *); -static Py_ssize_t -sizeof_lock_held(PyDictObject *mp) +Py_ssize_t +_PyDict_SizeOf_LockHeld(PyDictObject *mp) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp); + size_t res = _PyObject_SIZE(Py_TYPE(mp)); if (_PyDict_HasSplitTable(mp)) { res += shared_keys_usable_size(mp->ma_keys) * sizeof(PyObject*); @@ -4675,7 +4677,7 @@ _PyDict_SizeOf(PyDictObject *mp) { Py_ssize_t res; Py_BEGIN_CRITICAL_SECTION(mp); - res = sizeof_lock_held(mp); + res = _PyDict_SizeOf_LockHeld(mp); Py_END_CRITICAL_SECTION(); return res; @@ -6865,7 +6867,7 @@ _PyDict_SetItem_LockHeld(PyDictObject *dict, PyObject *name, PyObject *value) dict_unhashable_type(name); return -1; } - return delitem_knownhash_lock_held((PyObject *)dict, name, hash); + return _PyDict_DelItem_KnownHash_LockHeld((PyObject *)dict, name, hash); } else { return setitem_lock_held(dict, name, value); } diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 896e6e3c30f9c9..bdd37fae99c5c0 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -536,6 +536,7 @@ struct _odictnode { static Py_ssize_t _odict_get_index_raw(PyODictObject *od, PyObject *key, Py_hash_t hash) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); PyObject *value = NULL; PyDictKeysObject *keys = ((PyDictObject *)od)->ma_keys; Py_ssize_t ix; @@ -560,6 +561,7 @@ _odict_get_index_raw(PyODictObject *od, PyObject *key, Py_hash_t hash) static int _odict_resize(PyODictObject *od) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); Py_ssize_t size, i; _ODictNode **fast_nodes, *node; @@ -596,6 +598,7 @@ _odict_resize(PyODictObject *od) static Py_ssize_t _odict_get_index(PyODictObject *od, PyObject *key, Py_hash_t hash) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); PyDictKeysObject *keys; assert(key != NULL); @@ -616,6 +619,7 @@ _odict_get_index(PyODictObject *od, PyObject *key, Py_hash_t hash) static _ODictNode * _odict_find_node_hash(PyODictObject *od, PyObject *key, Py_hash_t hash) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); Py_ssize_t index; if (_odict_EMPTY(od)) @@ -630,6 +634,7 @@ _odict_find_node_hash(PyODictObject *od, PyObject *key, Py_hash_t hash) static _ODictNode * _odict_find_node(PyODictObject *od, PyObject *key) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); Py_ssize_t index; Py_hash_t hash; @@ -648,6 +653,7 @@ _odict_find_node(PyODictObject *od, PyObject *key) static void _odict_add_head(PyODictObject *od, _ODictNode *node) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); _odictnode_PREV(node) = NULL; _odictnode_NEXT(node) = _odict_FIRST(od); if (_odict_FIRST(od) == NULL) @@ -661,6 +667,7 @@ _odict_add_head(PyODictObject *od, _ODictNode *node) static void _odict_add_tail(PyODictObject *od, _ODictNode *node) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); _odictnode_PREV(node) = _odict_LAST(od); _odictnode_NEXT(node) = NULL; if (_odict_LAST(od) == NULL) @@ -675,6 +682,7 @@ _odict_add_tail(PyODictObject *od, _ODictNode *node) static int _odict_add_new_node(PyODictObject *od, PyObject *key, Py_hash_t hash) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); Py_ssize_t i; _ODictNode *node; @@ -719,6 +727,7 @@ _odict_add_new_node(PyODictObject *od, PyObject *key, Py_hash_t hash) static void _odict_remove_node(PyODictObject *od, _ODictNode *node) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); if (_odict_FIRST(od) == node) _odict_FIRST(od) = _odictnode_NEXT(node); else if (_odictnode_PREV(node) != NULL) @@ -754,6 +763,7 @@ static int _odict_clear_node(PyODictObject *od, _ODictNode *node, PyObject *key, Py_hash_t hash) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); Py_ssize_t i; assert(key != NULL); @@ -951,31 +961,34 @@ OrderedDict_fromkeys_impl(PyTypeObject *type, PyObject *seq, PyObject *value) return _PyDict_FromKeys((PyObject *)type, seq, value); } -/* __sizeof__() */ - -/* OrderedDict.__sizeof__() does not have a docstring. */ -PyDoc_STRVAR(odict_sizeof__doc__, ""); +/*[clinic input] +@critical_section +OrderedDict.__sizeof__ -> Py_ssize_t +[clinic start generated code]*/ -static PyObject * -odict_sizeof(PyObject *op, PyObject *Py_UNUSED(ignored)) +static Py_ssize_t +OrderedDict___sizeof___impl(PyODictObject *self) +/*[clinic end generated code: output=1a8560db8cf83ac5 input=655e989ae24daa6a]*/ { - PyODictObject *od = _PyODictObject_CAST(op); - Py_ssize_t res = _PyDict_SizeOf((PyDictObject *)od); - res += sizeof(_ODictNode *) * od->od_fast_nodes_size; /* od_fast_nodes */ - if (!_odict_EMPTY(od)) { - res += sizeof(_ODictNode) * PyODict_SIZE(od); /* linked-list */ + Py_ssize_t res = _PyDict_SizeOf_LockHeld((PyDictObject *)self); + res += sizeof(_ODictNode *) * self->od_fast_nodes_size; /* od_fast_nodes */ + if (!_odict_EMPTY(self)) { + res += sizeof(_ODictNode) * PyODict_SIZE(self); /* linked-list */ } - return PyLong_FromSsize_t(res); + return res; } -/* __reduce__() */ +/*[clinic input] +OrderedDict.__reduce__ + self as od: self(type="PyODictObject *") -PyDoc_STRVAR(odict_reduce__doc__, "Return state information for pickling"); +Return state information for pickling +[clinic start generated code]*/ static PyObject * -odict_reduce(PyObject *op, PyObject *Py_UNUSED(ignored)) +OrderedDict___reduce___impl(PyODictObject *od) +/*[clinic end generated code: output=71eeb81f760a6a8e input=b0467c7ec400fe5e]*/ { - register PyODictObject *od = _PyODictObject_CAST(op); PyObject *state, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -1010,8 +1023,10 @@ odict_reduce(PyObject *op, PyObject *Py_UNUSED(ignored)) /* setdefault(): Skips __missing__() calls. */ +static int PyODict_SetItem_LockHeld(PyObject *self, PyObject *key, PyObject *value); /*[clinic input] +@critical_section OrderedDict.setdefault key: object @@ -1025,7 +1040,7 @@ Return the value for key if key is in the dictionary, else default. static PyObject * OrderedDict_setdefault_impl(PyODictObject *self, PyObject *key, PyObject *default_value) -/*[clinic end generated code: output=97537cb7c28464b6 input=38e098381c1efbc6]*/ +/*[clinic end generated code: output=97537cb7c28464b6 input=d7b93e92734f99b5]*/ { PyObject *result = NULL; @@ -1035,7 +1050,7 @@ OrderedDict_setdefault_impl(PyODictObject *self, PyObject *key, if (PyErr_Occurred()) return NULL; assert(_odict_find_node(self, key) == NULL); - if (PyODict_SetItem((PyObject *)self, key, default_value) >= 0) { + if (PyODict_SetItem_LockHeld((PyObject *)self, key, default_value) >= 0) { result = Py_NewRef(default_value); } } @@ -1065,10 +1080,9 @@ static PyObject * _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj, Py_hash_t hash) { - PyObject *value = NULL; - - Py_BEGIN_CRITICAL_SECTION(od); + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); + PyObject *value = NULL; _ODictNode *node = _odict_find_node_hash(_PyODictObject_CAST(od), key, hash); if (node != NULL) { /* Pop the node first to avoid a possible dict resize (due to @@ -1093,7 +1107,6 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj, PyErr_SetObject(PyExc_KeyError, key); } } - Py_END_CRITICAL_SECTION(); done: return value; @@ -1101,6 +1114,7 @@ _odict_popkey_hash(PyObject *od, PyObject *key, PyObject *failobj, /* Skips __missing__() calls. */ /*[clinic input] +@critical_section OrderedDict.pop key: object @@ -1115,7 +1129,7 @@ raise a KeyError. static PyObject * OrderedDict_pop_impl(PyODictObject *self, PyObject *key, PyObject *default_value) -/*[clinic end generated code: output=7a6447d104e7494b input=7efe36601007dff7]*/ +/*[clinic end generated code: output=7a6447d104e7494b input=a79988887b4a651f]*/ { Py_hash_t hash = PyObject_Hash(key); if (hash == -1) @@ -1127,6 +1141,7 @@ OrderedDict_pop_impl(PyODictObject *self, PyObject *key, /* popitem() */ /*[clinic input] +@critical_section OrderedDict.popitem last: bool = True @@ -1138,7 +1153,7 @@ Pairs are returned in LIFO order if last is true or FIFO order if false. static PyObject * OrderedDict_popitem_impl(PyODictObject *self, int last) -/*[clinic end generated code: output=98e7d986690d49eb input=d992ac5ee8305e1a]*/ +/*[clinic end generated code: output=98e7d986690d49eb input=8aafc7433e0a40e7]*/ { PyObject *key, *value, *item = NULL; _ODictNode *node; @@ -1167,6 +1182,9 @@ OrderedDict_popitem_impl(PyODictObject *self, int last) PyDoc_STRVAR(odict_keys__doc__, ""); static PyObject * odictkeys_new(PyObject *od, PyObject *Py_UNUSED(ignored)); /* forward */ +static int +_PyODict_SetItem_KnownHash_LockHeld(PyObject *od, PyObject *key, PyObject *value, + Py_hash_t hash); /* forward */ /* values() */ @@ -1192,32 +1210,36 @@ static PyObject * mutablemapping_update(PyObject *, PyObject *, PyObject *); #define odict_update mutablemapping_update -/* clear() */ +/*[clinic input] +@critical_section +OrderedDict.clear -PyDoc_STRVAR(odict_clear__doc__, - "od.clear() -> None. Remove all items from od."); +Remove all items from ordered dict. +[clinic start generated code]*/ static PyObject * -odict_clear(PyObject *op, PyObject *Py_UNUSED(ignored)) +OrderedDict_clear_impl(PyODictObject *self) +/*[clinic end generated code: output=a1a76d1322f556c5 input=08b12322e74c535c]*/ { - register PyODictObject *od = _PyODictObject_CAST(op); - PyDict_Clear(op); - _odict_clear_nodes(od); + _PyDict_Clear_LockHeld((PyObject *)self); + _odict_clear_nodes(self); Py_RETURN_NONE; } /* copy() */ -/* forward */ -static int _PyODict_SetItem_KnownHash(PyObject *, PyObject *, PyObject *, - Py_hash_t); +/*[clinic input] +@critical_section +OrderedDict.copy + self as od: self -PyDoc_STRVAR(odict_copy__doc__, "od.copy() -> a shallow copy of od"); +A shallow copy of ordered dict. +[clinic start generated code]*/ static PyObject * -odict_copy(PyObject *op, PyObject *Py_UNUSED(ignored)) +OrderedDict_copy_impl(PyObject *od) +/*[clinic end generated code: output=9cdbe7394aecc576 input=e329951ae617ed48]*/ { - register PyODictObject *od = _PyODictObject_CAST(op); _ODictNode *node; PyObject *od_copy; @@ -1237,8 +1259,8 @@ odict_copy(PyObject *op, PyObject *Py_UNUSED(ignored)) PyErr_SetObject(PyExc_KeyError, key); goto fail; } - if (_PyODict_SetItem_KnownHash((PyObject *)od_copy, key, value, - _odictnode_HASH(node)) != 0) + if (_PyODict_SetItem_KnownHash_LockHeld((PyObject *)od_copy, key, value, + _odictnode_HASH(node)) != 0) goto fail; } } @@ -1286,6 +1308,7 @@ odict_reversed(PyObject *op, PyObject *Py_UNUSED(ignored)) /* move_to_end() */ /*[clinic input] +@critical_section OrderedDict.move_to_end key: object @@ -1298,7 +1321,7 @@ Raise KeyError if the element does not exist. static PyObject * OrderedDict_move_to_end_impl(PyODictObject *self, PyObject *key, int last) -/*[clinic end generated code: output=fafa4c5cc9b92f20 input=d6ceff7132a2fcd7]*/ +/*[clinic end generated code: output=fafa4c5cc9b92f20 input=09f8bc7053c0f6d4]*/ { _ODictNode *node; @@ -1339,10 +1362,8 @@ static PyMethodDef odict_methods[] = { /* overridden dict methods */ ORDEREDDICT_FROMKEYS_METHODDEF - {"__sizeof__", odict_sizeof, METH_NOARGS, - odict_sizeof__doc__}, - {"__reduce__", odict_reduce, METH_NOARGS, - odict_reduce__doc__}, + ORDEREDDICT___SIZEOF___METHODDEF + ORDEREDDICT___REDUCE___METHODDEF ORDEREDDICT_SETDEFAULT_METHODDEF ORDEREDDICT_POP_METHODDEF ORDEREDDICT_POPITEM_METHODDEF @@ -1354,11 +1375,8 @@ static PyMethodDef odict_methods[] = { odict_items__doc__}, {"update", _PyCFunction_CAST(odict_update), METH_VARARGS | METH_KEYWORDS, odict_update__doc__}, - {"clear", odict_clear, METH_NOARGS, - odict_clear__doc__}, - {"copy", odict_copy, METH_NOARGS, - odict_copy__doc__}, - + ORDEREDDICT_CLEAR_METHODDEF + ORDEREDDICT_COPY_METHODDEF /* new methods */ {"__reversed__", odict_reversed, METH_NOARGS, odict_reversed__doc__}, @@ -1457,7 +1475,8 @@ odict_tp_clear(PyObject *op) { PyODictObject *od = _PyODictObject_CAST(op); Py_CLEAR(od->od_inst_dict); - PyDict_Clear((PyObject *)od); + // cannot use lock held variant as critical section is not held here + PyDict_Clear(op); _odict_clear_nodes(od); return 0; } @@ -1465,7 +1484,7 @@ odict_tp_clear(PyObject *op) /* tp_richcompare */ static PyObject * -odict_richcompare(PyObject *v, PyObject *w, int op) +odict_richcompare_lock_held(PyObject *v, PyObject *w, int op) { if (!PyODict_Check(v) || !PyDict_Check(w)) { Py_RETURN_NOTIMPLEMENTED; @@ -1498,6 +1517,16 @@ odict_richcompare(PyObject *v, PyObject *w, int op) } } +static PyObject * +odict_richcompare(PyObject *v, PyObject *w, int op) +{ + PyObject *res; + Py_BEGIN_CRITICAL_SECTION2(v, w); + res = odict_richcompare_lock_held(v, w, op); + Py_END_CRITICAL_SECTION2(); + return res; +} + /* tp_iter */ static PyObject * @@ -1588,10 +1617,11 @@ PyODict_New(void) } static int -_PyODict_SetItem_KnownHash(PyObject *od, PyObject *key, PyObject *value, - Py_hash_t hash) +_PyODict_SetItem_KnownHash_LockHeld(PyObject *od, PyObject *key, PyObject *value, + Py_hash_t hash) { - int res = _PyDict_SetItem_KnownHash(od, key, value, hash); + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); + int res = _PyDict_SetItem_KnownHash_LockHeld((PyDictObject *)od, key, value, hash); if (res == 0) { res = _odict_add_new_node(_PyODictObject_CAST(od), key, hash); if (res < 0) { @@ -1604,18 +1634,32 @@ _PyODict_SetItem_KnownHash(PyObject *od, PyObject *key, PyObject *value, return res; } -int -PyODict_SetItem(PyObject *od, PyObject *key, PyObject *value) + +static int +PyODict_SetItem_LockHeld(PyObject *od, PyObject *key, PyObject *value) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); Py_hash_t hash = PyObject_Hash(key); - if (hash == -1) + if (hash == -1) { return -1; - return _PyODict_SetItem_KnownHash(od, key, value, hash); + } + return _PyODict_SetItem_KnownHash_LockHeld(od, key, value, hash); } int -PyODict_DelItem(PyObject *od, PyObject *key) +PyODict_SetItem(PyObject *od, PyObject *key, PyObject *value) +{ + int res; + Py_BEGIN_CRITICAL_SECTION(od); + res = PyODict_SetItem_LockHeld(od, key, value); + Py_END_CRITICAL_SECTION(); + return res; +} + +int +PyODict_DelItem_LockHeld(PyObject *od, PyObject *key) { + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(od); int res; Py_hash_t hash = PyObject_Hash(key); if (hash == -1) @@ -1623,9 +1667,18 @@ PyODict_DelItem(PyObject *od, PyObject *key) res = _odict_clear_node(_PyODictObject_CAST(od), NULL, key, hash); if (res < 0) return -1; - return _PyDict_DelItem_KnownHash(od, key, hash); + return _PyDict_DelItem_KnownHash_LockHeld(od, key, hash); } +int +PyODict_DelItem(PyObject *od, PyObject *key) +{ + int res; + Py_BEGIN_CRITICAL_SECTION(od); + res = PyODict_DelItem_LockHeld(od, key); + Py_END_CRITICAL_SECTION(); + return res; +} /* ------------------------------------------- * The OrderedDict views (keys/values/items) @@ -1667,14 +1720,14 @@ odictiter_traverse(PyObject *op, visitproc visit, void *arg) /* In order to protect against modifications during iteration, we track * the current key instead of the current node. */ static PyObject * -odictiter_nextkey(odictiterobject *di) +odictiter_nextkey_lock_held(odictiterobject *di) { + assert(di->di_odict != NULL); + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(di->di_odict); PyObject *key = NULL; _ODictNode *node; int reversed = di->kind & _odict_ITER_REVERSED; - if (di->di_odict == NULL) - return NULL; if (di->di_current == NULL) goto done; /* We're already done. */ @@ -1719,8 +1772,23 @@ odictiter_nextkey(odictiterobject *di) return key; } + +static PyObject * +odictiter_nextkey(odictiterobject *di) +{ + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(di); + if (di->di_odict == NULL) { + return NULL; + } + PyObject *res; + Py_BEGIN_CRITICAL_SECTION(di->di_odict); + res = odictiter_nextkey_lock_held(di); + Py_END_CRITICAL_SECTION(); + return res; +} + static PyObject * -odictiter_iternext(PyObject *op) +odictiter_iternext_lock_held(PyObject *op) { odictiterobject *di = (odictiterobject*)op; PyObject *result, *value; @@ -1734,14 +1802,12 @@ odictiter_iternext(PyObject *op) return key; } - value = PyODict_GetItem((PyObject *)di->di_odict, key); /* borrowed */ - if (value == NULL) { + if (PyDict_GetItemRef((PyObject *)di->di_odict, key, &value) != 1) { if (!PyErr_Occurred()) PyErr_SetObject(PyExc_KeyError, key); Py_DECREF(key); goto done; } - Py_INCREF(value); /* Handle the values case. */ if (!(di->kind & _odict_ITER_KEYS)) { @@ -1752,7 +1818,7 @@ odictiter_iternext(PyObject *op) /* Handle the items case. */ result = di->di_result; - if (Py_REFCNT(result) == 1) { + if (_PyObject_IsUniquelyReferenced(result)) { /* not in use so we can reuse it * (the common case during iteration) */ Py_INCREF(result); @@ -1781,6 +1847,17 @@ odictiter_iternext(PyObject *op) return NULL; } +static PyObject * +odictiter_iternext(PyObject *op) +{ + PyObject *res; + Py_BEGIN_CRITICAL_SECTION(op); + res = odictiter_iternext_lock_held(op); + Py_END_CRITICAL_SECTION(); + return res; +} + + /* No need for tp_clear because odictiterobject is not mutable. */ PyDoc_STRVAR(reduce_doc, "Return state information for pickling"); From c5edf7d6f42886eee057816c2c4b8c46867222ae Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:08:42 +0200 Subject: [PATCH 1163/1674] gh-139810: Always generate -dev tags for PyManager packages (GH-139814) (cherry picked from commit c46265d94a2d2c5bcaabbbc312f8f6ac9162cd5f) Co-authored-by: Steve Dower --- ...-10-08-22-54-38.gh-issue-139810.LAaemi.rst | 2 ++ PC/layout/support/pymanager.py | 22 ++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst diff --git a/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst b/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst new file mode 100644 index 00000000000000..55252f288b0a33 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst @@ -0,0 +1,2 @@ +Installing with ``py install 3[.x]-dev`` will now select final versions as +well as prereleases. diff --git a/PC/layout/support/pymanager.py b/PC/layout/support/pymanager.py index 667c89cdd2cc7a..831d49ea3f9b46 100644 --- a/PC/layout/support/pymanager.py +++ b/PC/layout/support/pymanager.py @@ -80,7 +80,9 @@ def calculate_install_json(ns, *, for_embed=False, for_test=False): # Tag used in runtime ID (for side-by-side install/updates) ID_TAG = XY_ARCH_TAG - # Tag shown in 'py list' output + # Tag shown in 'py list' output. + # gh-139810: We only include '-dev' here for prereleases, even though it + # works for final releases too. DISPLAY_TAG = f"{XY_TAG}-dev{TAG_ARCH}" if VER_SUFFIX else XY_ARCH_TAG # Tag used for PEP 514 registration SYS_WINVER = XY_TAG + (TAG_ARCH if TAG_ARCH != '-64' else '') @@ -102,9 +104,10 @@ def calculate_install_json(ns, *, for_embed=False, for_test=False): FULL_ARCH_TAG, XY_ARCH_TAG, X_ARCH_TAG, - # X_TAG and XY_TAG doesn't include VER_SUFFIX, so create -dev versions - f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG and VER_SUFFIX else "", - f"{X_TAG}-dev{TAG_ARCH}" if X_TAG and VER_SUFFIX else "", + # gh-139810: The -dev tags are always included so that the latest + # release is chosen, no matter whether it's prerelease or final. + f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG else "", + f"{X_TAG}-dev{TAG_ARCH}" if X_TAG else "", ] # Generate run-for entries for each target. @@ -115,16 +118,15 @@ def calculate_install_json(ns, *, for_embed=False, for_test=False): ]: if not base["target"]: continue - STD_RUN_FOR.append({**base, "tag": FULL_ARCH_TAG}) + STD_RUN_FOR.extend([ + {**base, "tag": FULL_ARCH_TAG}, + {**base, "tag": f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG else ""}, + {**base, "tag": f"{X_TAG}-dev{TAG_ARCH}" if X_TAG else ""}, + ]) if XY_TAG: STD_RUN_FOR.append({**base, "tag": XY_ARCH_TAG}) if X_TAG: STD_RUN_FOR.append({**base, "tag": X_ARCH_TAG}) - if VER_SUFFIX: - STD_RUN_FOR.extend([ - {**base, "tag": f"{XY_TAG}-dev{TAG_ARCH}" if XY_TAG else ""}, - {**base, "tag": f"{X_TAG}-dev{TAG_ARCH}" if X_TAG else ""}, - ]) # Generate alias entries for each target. We need both arch and non-arch # versions as well as windowed/non-windowed versions to make sure that all From 7a13953bc33a0c8a1835b565833dfc1b92b80e20 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:36:24 +0200 Subject: [PATCH 1164/1674] [3.14] gh-140000: Traverse `name` attribute for `TypeVar`, `TypeVarTuple`, `TypeAliasType`, `ParamSpec` (GH-140016) (#140063) gh-140000: Traverse `name` attribute for `TypeVar`, `TypeVarTuple`, `TypeAliasType`, `ParamSpec` (GH-140016) (cherry picked from commit be60e4b4f34a097d999d337446786ae14e35c964) Co-authored-by: Mikhail Efimov --- ...025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst | 4 ++++ Objects/typevarobject.c | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst new file mode 100644 index 00000000000000..2c6259635eaf04 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst @@ -0,0 +1,4 @@ +Fix potential memory leak when a reference cycle exists between an instance +of :class:`typing.TypeAliasType`, :class:`typing.TypeVar`, +:class:`typing.ParamSpec`, or :class:`typing.TypeVarTuple` and its +``__name__`` attribute. Patch by Mikhail Efimov. diff --git a/Objects/typevarobject.c b/Objects/typevarobject.c index cead6e69af5451..e6dc4360eaeb62 100644 --- a/Objects/typevarobject.c +++ b/Objects/typevarobject.c @@ -472,7 +472,7 @@ typevar_dealloc(PyObject *self) _PyObject_GC_UNTRACK(self); - Py_DECREF(tv->name); + Py_XDECREF(tv->name); Py_XDECREF(tv->bound); Py_XDECREF(tv->evaluate_bound); Py_XDECREF(tv->constraints); @@ -491,6 +491,7 @@ typevar_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); typevarobject *tv = typevarobject_CAST(self); + Py_VISIT(tv->name); Py_VISIT(tv->bound); Py_VISIT(tv->evaluate_bound); Py_VISIT(tv->constraints); @@ -505,6 +506,7 @@ static int typevar_clear(PyObject *op) { typevarobject *self = typevarobject_CAST(op); + Py_CLEAR(self->name); Py_CLEAR(self->bound); Py_CLEAR(self->evaluate_bound); Py_CLEAR(self->constraints); @@ -1171,7 +1173,7 @@ paramspec_dealloc(PyObject *self) _PyObject_GC_UNTRACK(self); - Py_DECREF(ps->name); + Py_XDECREF(ps->name); Py_XDECREF(ps->bound); Py_XDECREF(ps->default_value); Py_XDECREF(ps->evaluate_default); @@ -1187,6 +1189,7 @@ paramspec_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); paramspecobject *ps = paramspecobject_CAST(self); + Py_VISIT(ps->name); Py_VISIT(ps->bound); Py_VISIT(ps->default_value); Py_VISIT(ps->evaluate_default); @@ -1198,6 +1201,7 @@ static int paramspec_clear(PyObject *op) { paramspecobject *self = paramspecobject_CAST(op); + Py_CLEAR(self->name); Py_CLEAR(self->bound); Py_CLEAR(self->default_value); Py_CLEAR(self->evaluate_default); @@ -1519,7 +1523,7 @@ typevartuple_dealloc(PyObject *self) _PyObject_GC_UNTRACK(self); typevartupleobject *tvt = typevartupleobject_CAST(self); - Py_DECREF(tvt->name); + Py_XDECREF(tvt->name); Py_XDECREF(tvt->default_value); Py_XDECREF(tvt->evaluate_default); PyObject_ClearManagedDict(self); @@ -1683,6 +1687,7 @@ typevartuple_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); typevartupleobject *tvt = typevartupleobject_CAST(self); + Py_VISIT(tvt->name); Py_VISIT(tvt->default_value); Py_VISIT(tvt->evaluate_default); PyObject_VisitManagedDict(self, visit, arg); @@ -1693,6 +1698,7 @@ static int typevartuple_clear(PyObject *self) { typevartupleobject *tvt = typevartupleobject_CAST(self); + Py_CLEAR(tvt->name); Py_CLEAR(tvt->default_value); Py_CLEAR(tvt->evaluate_default); PyObject_ClearManagedDict(self); @@ -1851,7 +1857,7 @@ typealias_dealloc(PyObject *self) PyTypeObject *tp = Py_TYPE(self); _PyObject_GC_UNTRACK(self); typealiasobject *ta = typealiasobject_CAST(self); - Py_DECREF(ta->name); + Py_XDECREF(ta->name); Py_XDECREF(ta->type_params); Py_XDECREF(ta->compute_value); Py_XDECREF(ta->value); @@ -2032,6 +2038,7 @@ static int typealias_traverse(PyObject *op, visitproc visit, void *arg) { typealiasobject *self = typealiasobject_CAST(op); + Py_VISIT(self->name); Py_VISIT(self->type_params); Py_VISIT(self->compute_value); Py_VISIT(self->value); @@ -2043,6 +2050,7 @@ static int typealias_clear(PyObject *op) { typealiasobject *self = typealiasobject_CAST(op); + Py_CLEAR(self->name); Py_CLEAR(self->type_params); Py_CLEAR(self->compute_value); Py_CLEAR(self->value); From 5848d805366c6a1c681a0cc863992ad7ae705e8d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 09:29:32 +0200 Subject: [PATCH 1165/1674] [3.14] gh-139590: Stricter `ruff` rules for `Tools/wasm` (GH-139752) (#139811) Co-authored-by: sobolevn Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/mypy.yml | 2 - .pre-commit-config.yaml | 4 ++ Tools/wasm/.ruff.toml | 3 - Tools/wasm/emscripten/__main__.py | 9 ++- Tools/wasm/emscripten/wasm_assets.py | 5 +- Tools/wasm/mypy.ini | 11 ---- Tools/wasm/wasi/__main__.py | 10 ++-- Tools/wasm/wasm_build.py | 86 +++++++++++++--------------- 8 files changed, 53 insertions(+), 77 deletions(-) delete mode 100644 Tools/wasm/mypy.ini diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 498a7d0a844110..5d5d77f29f6eb1 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -29,7 +29,6 @@ on: - "Tools/jit/**" - "Tools/peg_generator/**" - "Tools/requirements-dev.txt" - - "Tools/wasm/**" workflow_dispatch: permissions: @@ -61,7 +60,6 @@ jobs: "Tools/clinic", "Tools/jit", "Tools/peg_generator", - "Tools/wasm", ] steps: - uses: actions/checkout@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e00ffb3bd2d66..b0311f052798ad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,6 +26,10 @@ repos: name: Run Ruff (lint) on Tools/peg_generator/ args: [--exit-non-zero-on-fix, --config=Tools/peg_generator/.ruff.toml] files: ^Tools/peg_generator/ + - id: ruff-check + name: Run Ruff (lint) on Tools/wasm/ + args: [--exit-non-zero-on-fix, --config=Tools/wasm/.ruff.toml] + files: ^Tools/wasm/ - id: ruff-format name: Run Ruff (format) on Doc/ args: [--check] diff --git a/Tools/wasm/.ruff.toml b/Tools/wasm/.ruff.toml index aabcf8dc4f502e..3d8e59fa3f22c4 100644 --- a/Tools/wasm/.ruff.toml +++ b/Tools/wasm/.ruff.toml @@ -22,7 +22,4 @@ select = [ ] ignore = [ "E501", # Line too long - "F541", # f-string without any placeholders - "PYI024", # Use `typing.NamedTuple` instead of `collections.namedtuple` - "PYI025", # Use `from collections.abc import Set as AbstractSet` ] diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index fdf3142c0a3b1a..c88e9edba6d230 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -3,16 +3,16 @@ import argparse import contextlib import functools +import hashlib import os import shutil import subprocess import sys import sysconfig -import hashlib import tempfile -from urllib.request import urlopen from pathlib import Path from textwrap import dedent +from urllib.request import urlopen try: from os import process_cpu_count as cpu_count @@ -33,9 +33,7 @@ PREFIX_DIR = CROSS_BUILD_DIR / HOST_TRIPLE / "prefix" LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local" -LOCAL_SETUP_MARKER = "# Generated by Tools/wasm/emscripten.py\n".encode( - "utf-8" -) +LOCAL_SETUP_MARKER = b"# Generated by Tools/wasm/emscripten.py\n" def updated_env(updates={}): @@ -432,6 +430,7 @@ def main(): make_build, configure_host, make_host, + clean, ): subcommand.add_argument( "--quiet", diff --git a/Tools/wasm/emscripten/wasm_assets.py b/Tools/wasm/emscripten/wasm_assets.py index 90f318f319a9f1..384790872353b2 100755 --- a/Tools/wasm/emscripten/wasm_assets.py +++ b/Tools/wasm/emscripten/wasm_assets.py @@ -15,7 +15,6 @@ import sys import sysconfig import zipfile -from typing import Dict # source directory SRCDIR = pathlib.Path(__file__).parents[3].absolute() @@ -134,7 +133,7 @@ def filterfunc(filename: str) -> bool: pzf.writepy(entry, filterfunc=filterfunc) -def detect_extension_modules(args: argparse.Namespace) -> Dict[str, bool]: +def detect_extension_modules(args: argparse.Namespace) -> dict[str, bool]: modules = {} # disabled by Modules/Setup.local ? @@ -149,7 +148,7 @@ def detect_extension_modules(args: argparse.Namespace) -> Dict[str, bool]: # disabled by configure? with open(args.sysconfig_data) as f: data = f.read() - loc: Dict[str, Dict[str, str]] = {} + loc: dict[str, dict[str, str]] = {} exec(data, globals(), loc) for key, value in loc["build_time_vars"].items(): diff --git a/Tools/wasm/mypy.ini b/Tools/wasm/mypy.ini deleted file mode 100644 index 4de0a30c260f5f..00000000000000 --- a/Tools/wasm/mypy.ini +++ /dev/null @@ -1,11 +0,0 @@ -[mypy] -files = Tools/wasm/wasm_*.py -pretty = True -show_traceback = True - -# Make sure the wasm can be run using Python 3.8: -python_version = 3.8 - -# Be strict... -strict = True -enable_error_code = truthy-bool,ignore-without-code diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index a0658cb351a86f..b2f643ddbfc213 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -16,7 +16,6 @@ import sysconfig import tempfile - CHECKOUT = pathlib.Path(__file__).parent.parent.parent.parent assert (CHECKOUT / "configure").is_file(), ( "Please update the location of the file" @@ -28,9 +27,9 @@ LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local" LOCAL_SETUP_MARKER = ( - "# Generated by Tools/wasm/wasi .\n" - "# Required to statically build extension modules." -).encode("utf-8") + b"# Generated by Tools/wasm/wasi .\n" + b"# Required to statically build extension modules." +) WASI_SDK_VERSION = 24 @@ -154,8 +153,7 @@ def build_python_is_pydebug(): test = "import sys, test.support; sys.exit(test.support.Py_DEBUG)" result = subprocess.run( [build_python_path(), "-c", test], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, + capture_output=True, ) return bool(result.returncode) diff --git a/Tools/wasm/wasm_build.py b/Tools/wasm/wasm_build.py index 73875a2205e6a8..3f1bde3853fce7 100755 --- a/Tools/wasm/wasm_build.py +++ b/Tools/wasm/wasm_build.py @@ -23,8 +23,8 @@ """ import argparse -import enum import dataclasses +import enum import logging import os import pathlib @@ -39,18 +39,12 @@ import time import warnings import webbrowser +from collections.abc import Callable, Iterable # for Python 3.8 from typing import ( - cast, Any, - Callable, - Dict, - Iterable, - List, - Optional, - Tuple, - Union, + cast, ) logger = logging.getLogger("wasm_build") @@ -122,7 +116,7 @@ def parse_emconfig( emconfig: pathlib.Path = EM_CONFIG, -) -> Tuple[pathlib.Path, pathlib.Path]: +) -> tuple[pathlib.Path, pathlib.Path]: """Parse EM_CONFIG file and lookup EMSCRIPTEN_ROOT and NODE_JS. The ".emscripten" config file is a Python snippet that uses "EM_CONFIG" @@ -134,7 +128,7 @@ def parse_emconfig( with open(emconfig, encoding="utf-8") as f: code = f.read() # EM_CONFIG file is a Python snippet - local: Dict[str, Any] = {} + local: dict[str, Any] = {} exec(code, globals(), local) emscripten_root = pathlib.Path(local["EMSCRIPTEN_ROOT"]) node_js = pathlib.Path(local["NODE_JS"]) @@ -192,16 +186,16 @@ class Platform: name: str pythonexe: str - config_site: Optional[pathlib.PurePath] - configure_wrapper: Optional[pathlib.Path] - make_wrapper: Optional[pathlib.PurePath] - environ: Dict[str, Any] + config_site: pathlib.PurePath | None + configure_wrapper: pathlib.Path | None + make_wrapper: pathlib.PurePath | None + environ: dict[str, Any] check: Callable[[], None] # Used for build_emports(). - ports: Optional[pathlib.PurePath] - cc: Optional[pathlib.PurePath] + ports: pathlib.PurePath | None + cc: pathlib.PurePath | None - def getenv(self, profile: "BuildProfile") -> Dict[str, Any]: + def getenv(self, profile: "BuildProfile") -> dict[str, Any]: return self.environ.copy() @@ -264,7 +258,7 @@ def _check_emscripten() -> None: # git / upstream / tot-upstream installation version = version[:-4] version_tuple = cast( - Tuple[int, int, int], tuple(int(v) for v in version.split(".")) + tuple[int, int, int], tuple(int(v) for v in version.split(".")) ) if version_tuple < EMSDK_MIN_VERSION: raise ConditionError( @@ -388,7 +382,7 @@ def get_extra_paths(self) -> Iterable[pathlib.PurePath]: return [] @property - def emport_args(self) -> List[str]: + def emport_args(self) -> list[str]: """Host-specific port args (Emscripten).""" cls = type(self) if self is cls.wasm64_emscripten: @@ -399,7 +393,7 @@ def emport_args(self) -> List[str]: return [] @property - def embuilder_args(self) -> List[str]: + def embuilder_args(self) -> list[str]: """Host-specific embuilder args (Emscripten).""" cls = type(self) if self is cls.wasm64_emscripten: @@ -422,7 +416,7 @@ def is_browser(self) -> bool: return self in {cls.browser, cls.browser_debug} @property - def emport_args(self) -> List[str]: + def emport_args(self) -> list[str]: """Target-specific port args.""" cls = type(self) if self in {cls.browser_debug, cls.node_debug}: @@ -448,9 +442,9 @@ class BuildProfile: name: str support_level: SupportLevel host: Host - target: Union[EmscriptenTarget, None] = None - dynamic_linking: Union[bool, None] = None - pthreads: Union[bool, None] = None + target: EmscriptenTarget | None = None + dynamic_linking: bool | None = None + pthreads: bool | None = None default_testopts: str = "-j2" @property @@ -474,7 +468,7 @@ def makefile(self) -> pathlib.Path: return self.builddir / "Makefile" @property - def configure_cmd(self) -> List[str]: + def configure_cmd(self) -> list[str]: """Generate configure command""" # use relative path, so WASI tests can find lib prefix. # pathlib.Path.relative_to() does not work here. @@ -509,7 +503,7 @@ def configure_cmd(self) -> List[str]: return cmd @property - def make_cmd(self) -> List[str]: + def make_cmd(self) -> list[str]: """Generate make command""" cmd = ["make"] platform = self.host.platform @@ -517,7 +511,7 @@ def make_cmd(self) -> List[str]: cmd.insert(0, os.fspath(platform.make_wrapper)) return cmd - def getenv(self) -> Dict[str, Any]: + def getenv(self) -> dict[str, Any]: """Generate environ dict for platform""" env = os.environ.copy() if hasattr(os, "process_cpu_count"): @@ -531,7 +525,7 @@ def getenv(self) -> Dict[str, Any]: env.pop(key, None) elif key == "PATH": # list of path items, prefix with extra paths - new_path: List[pathlib.PurePath] = [] + new_path: list[pathlib.PurePath] = [] new_path.extend(self.host.get_extra_paths()) new_path.extend(value) env[key] = os.pathsep.join(os.fspath(p) for p in new_path) @@ -549,7 +543,7 @@ def _run_cmd( self, cmd: Iterable[str], args: Iterable[str] = (), - cwd: Optional[pathlib.Path] = None, + cwd: pathlib.Path | None = None, ) -> int: cmd = list(cmd) cmd.extend(args) @@ -587,7 +581,7 @@ def run_pythoninfo(self, *args: str) -> int: self._check_execute() return self.run_make("pythoninfo", *args) - def run_test(self, target: str, testopts: Optional[str] = None) -> int: + def run_test(self, target: str, testopts: str | None = None) -> int: """Run buildbottests""" self._check_execute() if testopts is None: @@ -823,10 +817,8 @@ def build_emports(self, force: bool = False) -> None: ) # Don't list broken and experimental variants in help -platforms_choices = list(p.name for p in _profiles) + ["cleanall"] -platforms_help = list(p.name for p in _profiles if p.support_level) + [ - "cleanall" -] +platforms_choices = [p.name for p in _profiles] + ["cleanall"] +platforms_help = [p.name for p in _profiles if p.support_level] + ["cleanall"] parser.add_argument( "platform", metavar="PLATFORM", @@ -834,18 +826,18 @@ def build_emports(self, force: bool = False) -> None: choices=platforms_choices, ) -ops = dict( - build="auto build (build 'build' Python, emports, configure, compile)", - configure="run ./configure", - compile="run 'make all'", - pythoninfo="run 'make pythoninfo'", - test="run 'make buildbottest TESTOPTS=...' (supports parallel tests)", - hostrunnertest="run 'make hostrunnertest TESTOPTS=...'", - repl="start interactive REPL / webserver + browser session", - clean="run 'make clean'", - cleanall="remove all build directories", - emports="build Emscripten port with embuilder (only Emscripten)", -) +ops = { + "build": "auto build (build 'build' Python, emports, configure, compile)", + "configure": "run ./configure", + "compile": "run 'make all'", + "pythoninfo": "run 'make pythoninfo'", + "test": "run 'make buildbottest TESTOPTS=...' (supports parallel tests)", + "hostrunnertest": "run 'make hostrunnertest TESTOPTS=...'", + "repl": "start interactive REPL / webserver + browser session", + "clean": "run 'make clean'", + "cleanall": "remove all build directories", + "emports": "build Emscripten port with embuilder (only Emscripten)", +} ops_help = "\n".join(f"{op:16s} {help}" for op, help in ops.items()) parser.add_argument( "ops", From 4c0dab9807f02bb1eebc844e72932c78211b2f7f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:19:29 +0200 Subject: [PATCH 1166/1674] [3.14] gh-101100: Fix sphinx warnings in `library/smtplib.rst` (GH-139991) (#140084) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/smtplib.rst | 62 ++++++++++++++++++++++++++++++----------- Doc/tools/.nitignore | 1 - 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index c5f8516f768a68..c5a3de52090cee 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -80,8 +80,8 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). An :class:`SMTP_SSL` instance behaves exactly the same as instances of :class:`SMTP`. :class:`SMTP_SSL` should be used for situations where SSL is - required from the beginning of the connection and using :meth:`starttls` is - not appropriate. If *host* is not specified, the local host is used. If + required from the beginning of the connection and using :meth:`~SMTP.starttls` + is not appropriate. If *host* is not specified, the local host is used. If *port* is zero, the standard SMTP-over-SSL port (465) is used. The optional arguments *local_hostname*, *timeout* and *source_address* have the same meaning as they do in the :class:`SMTP` class. *context*, also optional, @@ -112,7 +112,7 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). The LMTP protocol, which is very similar to ESMTP, is heavily based on the standard SMTP client. It's common to use Unix sockets for LMTP, so our - :meth:`connect` method must support that as well as a regular host:port + :meth:`~SMTP.connect` method must support that as well as a regular host:port server. The optional arguments *local_hostname* and *source_address* have the same meaning as they do in the :class:`SMTP` class. To specify a Unix socket, you must use an absolute path for *host*, starting with a '/'. @@ -147,9 +147,15 @@ A nice selection of exceptions is defined as well: .. exception:: SMTPResponseException Base class for all exceptions that include an SMTP error code. These exceptions - are generated in some instances when the SMTP server returns an error code. The - error code is stored in the :attr:`smtp_code` attribute of the error, and the - :attr:`smtp_error` attribute is set to the error message. + are generated in some instances when the SMTP server returns an error code. + + .. attribute:: smtp_code + + The error code. + + .. attribute:: smtp_error + + The error message. .. exception:: SMTPSenderRefused @@ -161,9 +167,13 @@ A nice selection of exceptions is defined as well: .. exception:: SMTPRecipientsRefused - All recipient addresses refused. The errors for each recipient are accessible - through the attribute :attr:`recipients`, which is a dictionary of exactly the - same sort as :meth:`SMTP.sendmail` returns. + All recipient addresses refused. + + .. attribute:: recipients + + A dictionary of exactly the same sort as returned + by :meth:`SMTP.sendmail` containing the errors for + each recipient. .. exception:: SMTPDataError @@ -213,7 +223,6 @@ SMTP Objects An :class:`SMTP` instance has the following methods: - .. method:: SMTP.set_debuglevel(level) Set the debug output level. A value of 1 or ``True`` for *level* results in @@ -417,7 +426,7 @@ An :class:`SMTP` instance has the following methods: .. versionchanged:: 3.4 The method now supports hostname check with - :attr:`SSLContext.check_hostname` and *Server Name Indicator* (see + :attr:`ssl.SSLContext.check_hostname` and *Server Name Indicator* (see :const:`~ssl.HAS_SNI`). .. versionchanged:: 3.5 @@ -435,7 +444,7 @@ An :class:`SMTP` instance has the following methods: ESMTP options (such as ``DSN`` commands) that should be used with all ``RCPT`` commands can be passed as *rcpt_options*. (If you need to use different ESMTP options to different recipients you have to use the low-level methods such as - :meth:`mail`, :meth:`rcpt` and :meth:`data` to send the message.) + :meth:`!mail`, :meth:`!rcpt` and :meth:`!data` to send the message.) .. note:: @@ -467,10 +476,7 @@ An :class:`SMTP` instance has the following methods: This method may raise the following exceptions: :exc:`SMTPRecipientsRefused` - All recipients were refused. Nobody got the mail. The :attr:`recipients` - attribute of the exception object is a dictionary with information about the - refused recipients (like the one returned when at least one recipient was - accepted). + All recipients were refused. Nobody got the mail. :exc:`SMTPHeloError` The server didn't reply properly to the ``HELO`` greeting. @@ -546,6 +552,30 @@ Low-level methods corresponding to the standard SMTP/ESMTP commands ``HELP``, Normally these do not need to be called directly, so they are not documented here. For details, consult the module code. +Additionally, an SMTP instance has the following attributes: + + +.. attribute:: SMTP.helo_resp + + The response to the ``HELO`` command, see :meth:`helo`. + + +.. attribute:: SMTP.ehlo_resp + + The response to the ``EHLO`` command, see :meth:`ehlo`. + + +.. attribute:: SMTP.does_esmtp + + A boolean value indicating whether the server supports ESMTP, see + :meth:`ehlo`. + + +.. attribute:: SMTP.esmtp_features + + A dictionary of the names of SMTP service extensions supported by the server, + see :meth:`ehlo`. + .. _smtp-example: diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 60a80fe2c72a72..29fd3cfda458f0 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -29,7 +29,6 @@ Doc/library/profile.rst Doc/library/pyexpat.rst Doc/library/resource.rst Doc/library/select.rst -Doc/library/smtplib.rst Doc/library/socket.rst Doc/library/ssl.rst Doc/library/stdtypes.rst From e1caa1e6fa1a9d842e91cc040ccfdebc78018293 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:26:00 +0200 Subject: [PATCH 1167/1674] [3.14] gh-102247: Improve documentation of http.HTTPStatus members update (GH-133190) (#140089) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Loïc Simon --- Doc/library/http.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/http.rst b/Doc/library/http.rst index ce3fb9f8120502..b0bdfc65e4508d 100644 --- a/Doc/library/http.rst +++ b/Doc/library/http.rst @@ -139,7 +139,8 @@ equal to the constant name (i.e. ``http.HTTPStatus.OK`` is also available as .. versionchanged:: 3.13 Implemented RFC9110 naming for status constants. Old constant names are preserved for - backwards compatibility. + backwards compatibility: ``413 REQUEST_ENTITY_TOO_LARGE``, ``414 REQUEST_URI_TOO_LONG``, + ``416 REQUESTED_RANGE_NOT_SATISFIABLE`` and ``422 UNPROCESSABLE_ENTITY``. HTTP status category -------------------- From b0c92e4b33db0c515aabbc96ff88f1bba8e8b754 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:27:21 +0200 Subject: [PATCH 1168/1674] [3.14] gh-138072: Fix typos and grammatical errors and improve clarity in asyncio howto document (GH-138895) (#140091) Co-authored-by: Morteza24 --- .../a-conceptual-overview-of-asyncio.rst | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/Doc/howto/a-conceptual-overview-of-asyncio.rst b/Doc/howto/a-conceptual-overview-of-asyncio.rst index d68f7cc6921fc9..af1e39480cc1f6 100644 --- a/Doc/howto/a-conceptual-overview-of-asyncio.rst +++ b/Doc/howto/a-conceptual-overview-of-asyncio.rst @@ -9,12 +9,11 @@ model of how :mod:`asyncio` fundamentally works, helping you understand the how and why behind the recommended patterns. You might be curious about some key :mod:`!asyncio` concepts. -You'll be comfortably able to answer these questions by the end of this -article: +By the end of this article, you'll be able to comfortably answer these questions: - What's happening behind the scenes when an object is awaited? - How does :mod:`!asyncio` differentiate between a task which doesn't need - CPU-time (such as a network request or file read) as opposed to a task that + CPU time (such as a network request or file read) as opposed to a task that does (such as computing n-factorial)? - How to write an asynchronous variant of an operation, such as an async sleep or database request. @@ -35,7 +34,7 @@ A conceptual overview part 1: the high-level -------------------------------------------- In part 1, we'll cover the main, high-level building blocks of :mod:`!asyncio`: -the event loop, coroutine functions, coroutine objects, tasks and ``await``. +the event loop, coroutine functions, coroutine objects, tasks, and ``await``. ========== Event Loop @@ -56,7 +55,7 @@ Once it pauses or completes, it returns control to the event loop. The event loop will then select another job from its pool and invoke it. You can *roughly* think of the collection of jobs as a queue: jobs are added and then processed one at a time, generally (but not always) in order. -This process repeats indefinitely with the event loop cycling endlessly +This process repeats indefinitely, with the event loop cycling endlessly onwards. If there are no more jobs pending execution, the event loop is smart enough to rest and avoid needlessly wasting CPU cycles, and will come back when there's @@ -276,7 +275,7 @@ in this case, a call to resume ``plant_a_tree()``. Generally speaking, when the awaited task finishes (``dig_the_hole_task``), the original task or coroutine (``plant_a_tree()``) is added back to the event -loops to-do list to be resumed. +loop's to-do list to be resumed. This is a basic, yet reliable mental model. In practice, the control handoffs are slightly more complex, but not by much. @@ -310,7 +309,7 @@ Consider this program:: The first statement in the coroutine ``main()`` creates ``task_b`` and schedules it for execution via the event loop. Then, ``coro_a()`` is repeatedly awaited. Control never cedes to the -event loop which is why we see the output of all three ``coro_a()`` +event loop, which is why we see the output of all three ``coro_a()`` invocations before ``coro_b()``'s output: .. code-block:: none @@ -338,8 +337,8 @@ This behavior of ``await coroutine`` can trip a lot of people up! That example highlights how using only ``await coroutine`` could unintentionally hog control from other tasks and effectively stall the event loop. -:func:`asyncio.run` can help you detect such occurences via the -``debug=True`` flag which accordingly enables +:func:`asyncio.run` can help you detect such occurrences via the +``debug=True`` flag, which enables :ref:`debug mode `. Among other things, it will log any coroutines that monopolize execution for 100ms or longer. @@ -348,8 +347,8 @@ The design intentionally trades off some conceptual clarity around usage of ``await`` for improved performance. Each time a task is awaited, control needs to be passed all the way up the call stack to the event loop. -That might sound minor, but in a large program with many ``await``'s and a deep -callstack that overhead can add up to a meaningful performance drag. +That might sound minor, but in a large program with many ``await`` statements and a deep +call stack, that overhead can add up to a meaningful performance drag. ------------------------------------------------ A conceptual overview part 2: the nuts and bolts @@ -372,7 +371,7 @@ resume a coroutine. If the coroutine was paused and is now being resumed, the argument ``arg`` will be sent in as the return value of the ``yield`` statement which originally paused it. -If the coroutine is being used for the first time (as opposed to being resumed) +If the coroutine is being used for the first time (as opposed to being resumed), ``arg`` must be ``None``. .. code-block:: @@ -403,14 +402,14 @@ If the coroutine is being used for the first time (as opposed to being resumed) returned_value = e.value print(f"Coroutine main() finished and provided value: {returned_value}.") -:ref:`yield `, like usual, pauses execution and returns control +:ref:`yield `, as usual, pauses execution and returns control to the caller. In the example above, the ``yield``, on line 3, is called by ``... = await rock`` on line 11. More broadly speaking, ``await`` calls the :meth:`~object.__await__` method of the given object. ``await`` also does one more very special thing: it propagates (or "passes -along") any ``yield``\ s it receives up the call-chain. +along") any ``yield``\ s it receives up the call chain. In this case, that's back to ``... = coroutine.send(None)`` on line 16. The coroutine is resumed via the ``coroutine.send(42)`` call on line 21. @@ -462,12 +461,12 @@ computation's status and result. The term is a nod to the idea of something still to come or not yet happened, and the object is a way to keep an eye on that something. -A future has a few important attributes. One is its state which can be either -"pending", "cancelled" or "done". +A future has a few important attributes. One is its state, which can be either +"pending", "cancelled", or "done". Another is its result, which is set when the state transitions to done. Unlike a coroutine, a future does not represent the actual computation to be done; instead, it represents the status and result of that computation, kind of -like a status light (red, yellow or green) or indicator. +like a status light (red, yellow, or green) or indicator. :class:`asyncio.Task` subclasses :class:`asyncio.Future` in order to gain these various capabilities. @@ -490,8 +489,8 @@ We'll go through an example of how you could leverage a future to create your own variant of asynchronous sleep (``async_sleep``) which mimics :func:`asyncio.sleep`. -This snippet registers a few tasks with the event loop and then awaits a -coroutine wrapped in a task: ``async_sleep(3)``. +This snippet registers a few tasks with the event loop and then awaits the task +created by ``asyncio.create_task``, which wraps the ``async_sleep(3)`` coroutine. We want that task to finish only after three seconds have elapsed, but without preventing other tasks from running. @@ -540,8 +539,8 @@ will monitor how much time has elapsed and, accordingly, call # Block until the future is marked as done. await future -Below, we'll use a rather bare object, ``YieldToEventLoop()``, to ``yield`` -from ``__await__`` in order to cede control to the event loop. +Below, we use a rather bare ``YieldToEventLoop()`` object to ``yield`` +from its ``__await__`` method, ceding control to the event loop. This is effectively the same as calling ``asyncio.sleep(0)``, but this approach offers more clarity, not to mention it's somewhat cheating to use ``asyncio.sleep`` when showcasing how to implement it! @@ -552,13 +551,13 @@ The ``watcher_task``, which runs the coroutine ``_sleep_watcher(...)``, will be invoked once per full cycle of the event loop. On each resumption, it'll check the time and if not enough has elapsed, then it'll pause once again and hand control back to the event loop. -Eventually, enough time will have elapsed, and ``_sleep_watcher(...)`` will -mark the future as done, and then itself finish too by breaking out of the +Once enough time has elapsed, ``_sleep_watcher(...)`` +marks the future as done and completes by exiting its infinite ``while`` loop. Given this helper task is only invoked once per cycle of the event loop, you'd be correct to note that this asynchronous sleep will sleep *at least* three seconds, rather than exactly three seconds. -Note this is also of true of ``asyncio.sleep``. +Note this is also true of ``asyncio.sleep``. :: @@ -601,6 +600,6 @@ For reference, you could implement it without futures, like so:: else: await YieldToEventLoop() -But, that's all for now. Hopefully you're ready to more confidently dive into +But that's all for now. Hopefully you're ready to more confidently dive into some async programming or check out advanced topics in the :mod:`rest of the documentation `. From b24b656a4e106a8c9621c71a71f907366af117ed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:28:12 +0200 Subject: [PATCH 1169/1674] [3.14] gh-97914: Reword misleading sentence on conditional expressions (GH-139064) (#140093) Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Co-authored-by: Gilles Peiffer Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/reference/expressions.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 9aca25e3214a16..c655d6c52ecc16 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1938,8 +1938,9 @@ Conditional expressions conditional_expression: `or_test` ["if" `or_test` "else" `expression`] expression: `conditional_expression` | `lambda_expr` -Conditional expressions (sometimes called a "ternary operator") have the lowest -priority of all Python operations. +A conditional expression (sometimes called a "ternary operator") is an +alternative to the if-else statement. As it is an expression, it returns a value +and can appear as a sub-expression. The expression ``x if C else y`` first evaluates the condition, *C* rather than *x*. If *C* is true, *x* is evaluated and its value is returned; otherwise, *y* is From 2695844d266a91c7a46016daeb62ce75e74accc5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:32:27 +0200 Subject: [PATCH 1170/1674] [3.14] gh-137871: Clarify cmath.nan documentation by linking to math module (GH-137876) (#140095) Co-authored-by: Aziz Co-authored-by: Sergey B Kirpichev --- Doc/library/cmath.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/cmath.rst b/Doc/library/cmath.rst index 26518a0458fd81..b6d5dbee21dcd5 100644 --- a/Doc/library/cmath.rst +++ b/Doc/library/cmath.rst @@ -338,7 +338,7 @@ Constants .. data:: nan A floating-point "not a number" (NaN) value. Equivalent to - ``float('nan')``. + ``float('nan')``. See also :data:`math.nan`. .. versionadded:: 3.6 From af9b8970efcbbd0f5f7bba9a4c0efcafe4251c10 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:36:39 +0200 Subject: [PATCH 1171/1674] [3.14] gh-82575: Adjust `time.get_clock_info` *adjustable* attribute doc (GH-135920) (#140097) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/time.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index b05c0a312dbe34..a990101057019b 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -238,8 +238,8 @@ Functions The result has the following attributes: - - *adjustable*: ``True`` if the clock can be changed automatically (e.g. by - a NTP daemon) or manually by the system administrator, ``False`` otherwise + - *adjustable*: ``True`` if the clock can be set to jump forward or backward + in time, ``False`` otherwise. Does not refer to gradual NTP rate adjustments. - *implementation*: The name of the underlying C function used to get the clock value. Refer to :ref:`time-clock-id-constants` for possible values. - *monotonic*: ``True`` if the clock cannot go backward, From 45577c93de18be55365cd8db4aac6742491754f5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:15:36 +0200 Subject: [PATCH 1172/1674] [3.14] gh-70765: Remove unnecessary extra backtick from Changelog entry (GH-140071) (#140102) gh-70765: Remove unnecessary extra backtick from Changelog entry (GH-140071) (cherry picked from commit f70082b4777804b69e98192121a61c2048669a16) Co-authored-by: Rafael Fontenelle --- .../next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst b/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst index e1a9bbe9afe4d1..d20f881eb09d55 100644 --- a/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst +++ b/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst @@ -1,5 +1,5 @@ :mod:`http.server`: fix default handling of HTTP/0.9 requests in :class:`~http.server.BaseHTTPRequestHandler`. Previously, -:meth:`!BaseHTTPRequestHandler.parse_request`` incorrectly +:meth:`!BaseHTTPRequestHandler.parse_request` incorrectly waited for headers in the request although those are not supported in HTTP/0.9. Patch by Bénédikt Tran. From 2142f4efcffcf19ce776d2e27e9781c300e852ec Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:40:30 +0200 Subject: [PATCH 1173/1674] [3.14] GH-140058: Clear key and value if `PyTuple_New` fails in `dictiter_iternextitem` (GH-140059) (#140107) GH-140058: Clear key and value if `PyTuple_New` fails in `dictiter_iternextitem` (GH-140059) (cherry picked from commit ded59f7e8e93274488584574ff2336a98bc4eff6) Co-authored-by: Sergey Miryanov --- Objects/dictobject.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index d669f8421c4792..80a44a87be4c4f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -5670,8 +5670,11 @@ dictiter_iternextitem(PyObject *self) } else { result = PyTuple_New(2); - if (result == NULL) + if (result == NULL) { + Py_DECREF(key); + Py_DECREF(value); return NULL; + } PyTuple_SET_ITEM(result, 0, key); PyTuple_SET_ITEM(result, 1, value); } From 1c55b9163bd048f14db4f3c7e55df801ee760ac8 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Tue, 14 Oct 2025 16:44:30 +0300 Subject: [PATCH 1174/1674] [3.14] gh-102431: Clarify constraints on operands of Decimal logical operations (GH-102836) (#140105) * [3.14] gh-102431: Clarify constraints on operands of Decimal logical operations (GH-102836) Sync C/Python implementation of the decimal: logical_ops for contexts. (cherry picked from commit 6ecf77dbdec7838e9ce2298cb8d16e8c2250da81) Co-authored-by: Sergey B Kirpichev --- Lib/_pydecimal.py | 20 ++++- ...-03-21-10-59-40.gh-issue-102431.eUDnf4.rst | 2 + Modules/_decimal/docstrings.h | 88 +++++++++++++++++-- 3 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 9b8e42a2342536..97a629fe92ccec 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -3340,7 +3340,10 @@ def _fill_logical(self, context, opa, opb): return opa, opb def logical_and(self, other, context=None): - """Applies an 'and' operation between self and other's digits.""" + """Applies an 'and' operation between self and other's digits. + + Both self and other must be logical numbers. + """ if context is None: context = getcontext() @@ -3357,14 +3360,20 @@ def logical_and(self, other, context=None): return _dec_from_triple(0, result.lstrip('0') or '0', 0) def logical_invert(self, context=None): - """Invert all its digits.""" + """Invert all its digits. + + The self must be logical number. + """ if context is None: context = getcontext() return self.logical_xor(_dec_from_triple(0,'1'*context.prec,0), context) def logical_or(self, other, context=None): - """Applies an 'or' operation between self and other's digits.""" + """Applies an 'or' operation between self and other's digits. + + Both self and other must be logical numbers. + """ if context is None: context = getcontext() @@ -3381,7 +3390,10 @@ def logical_or(self, other, context=None): return _dec_from_triple(0, result.lstrip('0') or '0', 0) def logical_xor(self, other, context=None): - """Applies an 'xor' operation between self and other's digits.""" + """Applies an 'xor' operation between self and other's digits. + + Both self and other must be logical numbers. + """ if context is None: context = getcontext() diff --git a/Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst b/Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst new file mode 100644 index 00000000000000..e82ddb6e1011ad --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst @@ -0,0 +1,2 @@ +Clarify constraints for "logical" arguments in methods of +:class:`decimal.Context`. diff --git a/Modules/_decimal/docstrings.h b/Modules/_decimal/docstrings.h index 77017a92252cb8..9c2da5e35f919a 100644 --- a/Modules/_decimal/docstrings.h +++ b/Modules/_decimal/docstrings.h @@ -292,22 +292,26 @@ an infinity then Decimal('Infinity') is returned.\n\ PyDoc_STRVAR(doc_logical_and, "logical_and($self, /, other, context=None)\n--\n\n\ -Return the digit-wise 'and' of the two (logical) operands.\n\ +Applies an 'and' operation between self and other's digits.\n\n\ +Both self and other must be logical numbers.\n\ \n"); PyDoc_STRVAR(doc_logical_invert, "logical_invert($self, /, context=None)\n--\n\n\ -Return the digit-wise inversion of the (logical) operand.\n\ +Invert all its digits.\n\n\ +The self must be logical number.\n\ \n"); PyDoc_STRVAR(doc_logical_or, "logical_or($self, /, other, context=None)\n--\n\n\ -Return the digit-wise 'or' of the two (logical) operands.\n\ +Applies an 'or' operation between self and other's digits.\n\n\ +Both self and other must be logical numbers. \n\ \n"); PyDoc_STRVAR(doc_logical_xor, "logical_xor($self, /, other, context=None)\n--\n\n\ -Return the digit-wise 'exclusive or' of the two (logical) operands.\n\ +Applies an 'xor' operation between self and other's digits.\n\n\ +Both self and other must be logical numbers.\n\ \n"); PyDoc_STRVAR(doc_max, @@ -712,22 +716,90 @@ Return the exponent of the magnitude of the operand's MSD.\n\ PyDoc_STRVAR(doc_ctx_logical_and, "logical_and($self, x, y, /)\n--\n\n\ -Digit-wise and of x and y.\n\ +Applies the logical operation 'and' between each operand's digits.\n\n\ +The operands must be both logical numbers.\n\n\ + >>> ExtendedContext.logical_and(Decimal('0'), Decimal('0'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_and(Decimal('0'), Decimal('1'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_and(Decimal('1'), Decimal('0'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_and(Decimal('1'), Decimal('1'))\n\ + Decimal('1')\n\ + >>> ExtendedContext.logical_and(Decimal('1100'), Decimal('1010'))\n\ + Decimal('1000')\n\ + >>> ExtendedContext.logical_and(Decimal('1111'), Decimal('10'))\n\ + Decimal('10')\n\ + >>> ExtendedContext.logical_and(110, 1101)\n\ + Decimal('100')\n\ + >>> ExtendedContext.logical_and(Decimal(110), 1101)\n\ + Decimal('100')\n\ + >>> ExtendedContext.logical_and(110, Decimal(1101))\n\ + Decimal('100')\n\ \n"); PyDoc_STRVAR(doc_ctx_logical_invert, "logical_invert($self, x, /)\n--\n\n\ -Invert all digits of x.\n\ +Invert all the digits in the operand.\n\n\ +The operand must be a logical number.\n\n\ + >>> ExtendedContext.logical_invert(Decimal('0'))\n\ + Decimal('111111111')\n\ + >>> ExtendedContext.logical_invert(Decimal('1'))\n\ + Decimal('111111110')\n\ + >>> ExtendedContext.logical_invert(Decimal('111111111'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_invert(Decimal('101010101'))\n\ + Decimal('10101010')\n\ + >>> ExtendedContext.logical_invert(1101)\n\ + Decimal('111110010')\n\ \n"); PyDoc_STRVAR(doc_ctx_logical_or, "logical_or($self, x, y, /)\n--\n\n\ -Digit-wise or of x and y.\n\ +Applies the logical operation 'or' between each operand's digits.\n\n\ +The operands must be both logical numbers.\n\n\ + >>> ExtendedContext.logical_or(Decimal('0'), Decimal('0'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_or(Decimal('0'), Decimal('1'))\n\ + Decimal('1')\n\ + >>> ExtendedContext.logical_or(Decimal('1'), Decimal('0'))\n\ + Decimal('1')\n\ + >>> ExtendedContext.logical_or(Decimal('1'), Decimal('1'))\n\ + Decimal('1')\n\ + >>> ExtendedContext.logical_or(Decimal('1100'), Decimal('1010'))\n\ + Decimal('1110')\n\ + >>> ExtendedContext.logical_or(Decimal('1110'), Decimal('10'))\n\ + Decimal('1110')\n\ + >>> ExtendedContext.logical_or(110, 1101)\n\ + Decimal('1111')\n\ + >>> ExtendedContext.logical_or(Decimal(110), 1101)\n\ + Decimal('1111')\n\ + >>> ExtendedContext.logical_or(110, Decimal(1101))\n\ + Decimal('1111')\n\ \n"); PyDoc_STRVAR(doc_ctx_logical_xor, "logical_xor($self, x, y, /)\n--\n\n\ -Digit-wise xor of x and y.\n\ +Applies the logical operation 'xor' between each operand's digits.\n\n\ +The operands must be both logical numbers.\n\n\ + >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('0'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_xor(Decimal('0'), Decimal('1'))\n\ + Decimal('1')\n\ + >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('0'))\n\ + Decimal('1')\n\ + >>> ExtendedContext.logical_xor(Decimal('1'), Decimal('1'))\n\ + Decimal('0')\n\ + >>> ExtendedContext.logical_xor(Decimal('1100'), Decimal('1010'))\n\ + Decimal('110')\n\ + >>> ExtendedContext.logical_xor(Decimal('1111'), Decimal('10'))\n\ + Decimal('1101')\n\ + >>> ExtendedContext.logical_xor(110, 1101)\n\ + Decimal('1011')\n\ + >>> ExtendedContext.logical_xor(Decimal(110), 1101)\n\ + Decimal('1011')\n\ + >>> ExtendedContext.logical_xor(110, Decimal(1101))\n\ + Decimal('1011')\n\ \n"); PyDoc_STRVAR(doc_ctx_max, From 525f7c23b9409e8b40e1426ff7743954685ab1a5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:13:33 +0200 Subject: [PATCH 1175/1674] [3.14] gh-114827: clarify `threading.Event.wait` timeout behavior (GH-114834) (#140100) Co-authored-by: Doug Hoskisson Co-authored-by: Kumar Aditya --- Lib/threading.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/threading.py b/Lib/threading.py index 79b753d983aaaf..c03b0b5370c933 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -660,7 +660,8 @@ def wait(self, timeout=None): (or fractions thereof). This method returns the internal flag on exit, so it will always return - True except if a timeout is given and the operation times out. + ``True`` except if a timeout is given and the operation times out, when + it will return ``False``. """ with self._cond: From 6a467d3edaf588971f48fd2cfaefd055ce72e8f6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:27:37 +0200 Subject: [PATCH 1176/1674] [3.14] gh-106318: Add examples for str.istitle() (GH-140046) (#140113) Co-authored-by: Adorilson Bezerra --- Doc/library/stdtypes.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index aea73724ef56d6..a9658820f66eb9 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2157,6 +2157,19 @@ expression support in the :mod:`re` module). character, for example uppercase characters may only follow uncased characters and lowercase characters only cased ones. Return ``False`` otherwise. + For example: + + .. doctest:: + + >>> 'Spam, Spam, Spam'.istitle() + True + >>> 'spam, spam, spam'.istitle() + False + >>> 'SPAM, SPAM, SPAM'.istitle() + False + + See also :meth:`title`. + .. method:: str.isupper() @@ -2534,6 +2547,8 @@ expression support in the :mod:`re` module). >>> titlecase("they're bill's friends.") "They're Bill's Friends." + See also :meth:`istitle`. + .. method:: str.translate(table, /) From 99e42ab49cb38f792f9ddca960fdb361c3522a3f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:36:05 +0200 Subject: [PATCH 1177/1674] [3.14] gh-101828: Fix `jisx0213` codecs removing null characters (gh-139340) (gh-140110) gh-101828: Fix `jisx0213` codecs removing null characters (gh-139340) (cherry picked from commit 87eadce3e0309d80a95e85d70a00028b5dca9907) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/test/multibytecodec_support.py | 17 +++++++++++++++++ ...25-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst | 3 +++ Modules/cjkcodecs/_codecs_iso2022.c | 11 +++++++---- Modules/cjkcodecs/_codecs_jp.c | 9 +++++++-- 4 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py index dbf0cc428e3ff6..6b4c57d0b4bad7 100644 --- a/Lib/test/multibytecodec_support.py +++ b/Lib/test/multibytecodec_support.py @@ -282,6 +282,23 @@ def test_incrementalencoder_del_segfault(self): with self.assertRaises(AttributeError): del e.errors + def test_null_terminator(self): + # see gh-101828 + text = "フルーツ" + try: + text.encode(self.encoding) + except UnicodeEncodeError: + text = "Python is cool" + encode_w_null = (text + "\0").encode(self.encoding) + encode_plus_null = text.encode(self.encoding) + "\0".encode(self.encoding) + self.assertTrue(encode_w_null.endswith(b'\x00')) + self.assertEqual(encode_w_null, encode_plus_null) + + encode_w_null_2 = (text + "\0" + text + "\0").encode(self.encoding) + encode_plus_null_2 = encode_plus_null + encode_plus_null + self.assertEqual(encode_w_null_2.count(b'\x00'), 2) + self.assertEqual(encode_w_null_2, encode_plus_null_2) + class TestBase_Mapping(unittest.TestCase): pass_enctest = [] diff --git a/Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst b/Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst new file mode 100644 index 00000000000000..1d100180c072ec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst @@ -0,0 +1,3 @@ +Fix ``'shift_jisx0213'``, ``'shift_jis_2004'``, ``'euc_jisx0213'`` and +``'euc_jis_2004'`` codecs truncating null chars +as they were treated as part of multi-character sequences. diff --git a/Modules/cjkcodecs/_codecs_iso2022.c b/Modules/cjkcodecs/_codecs_iso2022.c index ef6faeb71274e1..b1984df2695b17 100644 --- a/Modules/cjkcodecs/_codecs_iso2022.c +++ b/Modules/cjkcodecs/_codecs_iso2022.c @@ -802,10 +802,13 @@ jisx0213_encoder(const MultibyteCodec *codec, const Py_UCS4 *data, return coded; case 2: /* second character of unicode pair */ - coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1], - jisx0213_pair_encmap, JISX0213_ENCPAIRS); - if (coded != DBCINV) - return coded; + if (data[1] != 0) { /* Don't consume null char as part of pair */ + coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1], + jisx0213_pair_encmap, JISX0213_ENCPAIRS); + if (coded != DBCINV) { + return coded; + } + } _Py_FALLTHROUGH; case -1: /* flush unterminated */ diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c index f7127487aa5f59..cd77888d5514b8 100644 --- a/Modules/cjkcodecs/_codecs_jp.c +++ b/Modules/cjkcodecs/_codecs_jp.c @@ -192,8 +192,11 @@ ENCODER(euc_jis_2004) JISX0213_ENCPAIRS); if (code == DBCINV) return 1; - } else + } + else if (c2 != 0) { + /* Don't consume null char as part of pair */ insize = 2; + } } } } @@ -611,8 +614,10 @@ ENCODER(shift_jis_2004) if (code == DBCINV) return 1; } - else + else if (ch2 != 0) { + /* Don't consume null char as part of pair */ insize = 2; + } } } } From af28efd8b4a17b3c2fe63fc62bdade0bcb9146cd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 14 Oct 2025 17:56:01 +0200 Subject: [PATCH 1178/1674] [3.14] gh-139640: Fix swallowing syntax warnings in different modules (GH-139755) (GH-140117) Revert GH-131993. Fix swallowing some syntax warnings in different modules if they accidentally have the same message and are emitted from the same line. Fix duplicated warnings in the "finally" block. (cherry picked from commit 279db6bede30be3a1b86803585eb4404d27800da) Co-authored-by: Serhiy Storchaka * Update 2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst --------- Co-authored-by: Serhiy Storchaka --- Include/cpython/warnings.h | 6 -- Lib/test/test_compile.py | 66 ++++++++++++++----- Lib/test/test_pyrepl/test_interact.py | 26 -------- ...-10-06-10-03-37.gh-issue-139640.gY5oTb.rst | 3 + Python/_warnings.c | 22 ------- Python/compile.c | 10 +++ Python/errors.c | 4 +- 7 files changed, 63 insertions(+), 74 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst diff --git a/Include/cpython/warnings.h b/Include/cpython/warnings.h index 8731fd2e96b716..4e3eb88e8ff447 100644 --- a/Include/cpython/warnings.h +++ b/Include/cpython/warnings.h @@ -18,9 +18,3 @@ PyAPI_FUNC(int) PyErr_WarnExplicitFormat( // DEPRECATED: Use PyErr_WarnEx() instead. #define PyErr_Warn(category, msg) PyErr_WarnEx((category), (msg), 1) - -int _PyErr_WarnExplicitObjectWithContext( - PyObject *category, - PyObject *message, - PyObject *filename, - int lineno); diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 7d7409ef93aa5f..b2beba6e70e2ae 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1662,22 +1662,21 @@ class WeirdDict(dict): self.assertRaises(NameError, ns['foo']) def test_compile_warnings(self): - # See gh-131927 - # Compile warnings originating from the same file and - # line are now only emitted once. + # Each invocation of compile() emits compiler warnings, even if they + # have the same message and line number. + source = textwrap.dedent(r""" + # tokenizer + 1or 0 # line 3 + # code generator + 1 is 1 # line 5 + """) with warnings.catch_warnings(record=True) as caught: warnings.simplefilter("default") - compile('1 is 1', '', 'eval') - compile('1 is 1', '', 'eval') - - self.assertEqual(len(caught), 1) + for i in range(2): + # Even if compile() is at the same line. + compile(source, '', 'exec') - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always") - compile('1 is 1', '', 'eval') - compile('1 is 1', '', 'eval') - - self.assertEqual(len(caught), 2) + self.assertEqual([wm.lineno for wm in caught], [3, 5] * 2) def test_compile_warning_in_finally(self): # Ensure that warnings inside finally blocks are @@ -1688,16 +1687,47 @@ def test_compile_warning_in_finally(self): try: pass finally: - 1 is 1 + 1 is 1 # line 5 + try: + pass + finally: # nested + 1 is 1 # line 9 """) with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("default") + warnings.simplefilter("always") compile(source, '', 'exec') - self.assertEqual(len(caught), 1) - self.assertEqual(caught[0].category, SyntaxWarning) - self.assertIn("\"is\" with 'int' literal", str(caught[0].message)) + self.assertEqual(sorted(wm.lineno for wm in caught), [5, 9]) + for wm in caught: + self.assertEqual(wm.category, SyntaxWarning) + self.assertIn("\"is\" with 'int' literal", str(wm.message)) + + # Other code path is used for "try" with "except*". + source = textwrap.dedent(""" + try: + pass + except *Exception: + pass + finally: + 1 is 1 # line 7 + try: + pass + except *Exception: + pass + finally: # nested + 1 is 1 # line 13 + """) + + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + compile(source, '', 'exec') + + self.assertEqual(sorted(wm.lineno for wm in caught), [7, 13]) + for wm in caught: + self.assertEqual(wm.category, SyntaxWarning) + self.assertIn("\"is\" with 'int' literal", str(wm.message)) + class TestBooleanExpression(unittest.TestCase): class Value: diff --git a/Lib/test/test_pyrepl/test_interact.py b/Lib/test/test_pyrepl/test_interact.py index a20719033fc9b7..af5d4d0e67632a 100644 --- a/Lib/test/test_pyrepl/test_interact.py +++ b/Lib/test/test_pyrepl/test_interact.py @@ -1,7 +1,6 @@ import contextlib import io import unittest -import warnings from unittest.mock import patch from textwrap import dedent @@ -274,28 +273,3 @@ def test_incomplete_statement(self): code = "if foo:" console = InteractiveColoredConsole(namespace, filename="") self.assertTrue(_more_lines(console, code)) - - -class TestWarnings(unittest.TestCase): - def test_pep_765_warning(self): - """ - Test that a SyntaxWarning emitted from the - AST optimizer is only shown once in the REPL. - """ - # gh-131927 - console = InteractiveColoredConsole() - code = dedent("""\ - def f(): - try: - return 1 - finally: - return 2 - """) - - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("default") - console.runsource(code) - - count = sum("'return' in a 'finally' block" in str(w.message) - for w in caught) - self.assertEqual(count, 1) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst new file mode 100644 index 00000000000000..396e40f0e1360b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst @@ -0,0 +1,3 @@ +Fix swallowing some syntax warnings in different modules if they +accidentally have the same message and are emitted from the same line. +Fix duplicated warnings in the ``finally`` block. diff --git a/Python/_warnings.c b/Python/_warnings.c index 39bf1b225ccb0c..912468d2a59a95 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1479,28 +1479,6 @@ PyErr_WarnExplicitObject(PyObject *category, PyObject *message, return 0; } -/* Like PyErr_WarnExplicitObject, but automatically sets up context */ -int -_PyErr_WarnExplicitObjectWithContext(PyObject *category, PyObject *message, - PyObject *filename, int lineno) -{ - PyObject *unused_filename, *module, *registry; - int unused_lineno; - int stack_level = 1; - - if (!setup_context(stack_level, NULL, &unused_filename, &unused_lineno, - &module, ®istry)) { - return -1; - } - - int rc = PyErr_WarnExplicitObject(category, message, filename, lineno, - module, registry); - Py_DECREF(unused_filename); - Py_DECREF(registry); - Py_DECREF(module); - return rc; -} - int PyErr_WarnExplicit(PyObject *category, const char *text, const char *filename_str, int lineno, diff --git a/Python/compile.c b/Python/compile.c index c04391e682f9ac..8070d3f03760ef 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -103,6 +103,7 @@ typedef struct _PyCompiler { bool c_save_nested_seqs; /* if true, construct recursive instruction sequences * (including instructions for nested code objects) */ + int c_disable_warning; } compiler; static int @@ -765,6 +766,9 @@ _PyCompile_PushFBlock(compiler *c, location loc, f->fb_loc = loc; f->fb_exit = exit; f->fb_datum = datum; + if (t == COMPILE_FBLOCK_FINALLY_END) { + c->c_disable_warning++; + } return SUCCESS; } @@ -776,6 +780,9 @@ _PyCompile_PopFBlock(compiler *c, fblocktype t, jump_target_label block_label) u->u_nfblocks--; assert(u->u_fblock[u->u_nfblocks].fb_type == t); assert(SAME_JUMP_TARGET_LABEL(u->u_fblock[u->u_nfblocks].fb_block, block_label)); + if (t == COMPILE_FBLOCK_FINALLY_END) { + c->c_disable_warning--; + } } fblockinfo * @@ -1203,6 +1210,9 @@ _PyCompile_Error(compiler *c, location loc, const char *format, ...) int _PyCompile_Warn(compiler *c, location loc, const char *format, ...) { + if (c->c_disable_warning) { + return 0; + } va_list vargs; va_start(vargs, format); PyObject *msg = PyUnicode_FromFormatV(format, vargs); diff --git a/Python/errors.c b/Python/errors.c index 81f267b043afaf..89ea79f8c914fb 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1938,8 +1938,8 @@ int _PyErr_EmitSyntaxWarning(PyObject *msg, PyObject *filename, int lineno, int col_offset, int end_lineno, int end_col_offset) { - if (_PyErr_WarnExplicitObjectWithContext(PyExc_SyntaxWarning, msg, - filename, lineno) < 0) + if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, + filename, lineno, NULL, NULL) < 0) { if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { /* Replace the SyntaxWarning exception with a SyntaxError From 9e235ffb215fcf31f8792a37e8a935741e8d3097 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:05:47 +0200 Subject: [PATCH 1179/1674] [3.14] gh-138993: Dedent `credits` text (GH-138994) (#140088) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/site.py | 6 +++--- .../Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst diff --git a/Lib/site.py b/Lib/site.py index f93271971594d8..aeb7c6cfc71de9 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -449,9 +449,9 @@ def setcopyright(): """Set 'copyright' and 'credits' in builtins""" builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright) builtins.credits = _sitebuiltins._Printer("credits", """\ - Thanks to CWI, CNRI, BeOpen, Zope Corporation, the Python Software - Foundation, and a cast of thousands for supporting Python - development. See www.python.org for more information.""") +Thanks to CWI, CNRI, BeOpen, Zope Corporation, the Python Software +Foundation, and a cast of thousands for supporting Python +development. See www.python.org for more information.""") files, dirs = [], [] # Not all modules are required to have a __file__ attribute. See # PEP 420 for more details. diff --git a/Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst b/Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst new file mode 100644 index 00000000000000..1be588f2ba568c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst @@ -0,0 +1 @@ +Dedent :data:`credits` text. From 6b94c7ceebc7570d95cc68713fd3d62e5bb25391 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:06:18 +0200 Subject: [PATCH 1180/1674] [3.14] gh-129559: Remove extra dot in bytearray.resize AC (GH-140134) (#140143) Co-authored-by: Cody Maloney --- Objects/bytearrayobject.c | 4 ++-- Objects/clinic/bytearrayobject.c.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index bf30c06af5d8fa..bb4216ecc5aeac 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1537,14 +1537,14 @@ bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix) /*[clinic input] bytearray.resize size: Py_ssize_t - New size to resize to.. + New size to resize to. / Resize the internal buffer of bytearray to len. [clinic start generated code]*/ static PyObject * bytearray_resize_impl(PyByteArrayObject *self, Py_ssize_t size) -/*[clinic end generated code: output=f73524922990b2d9 input=75fd4d17c4aa47d3]*/ +/*[clinic end generated code: output=f73524922990b2d9 input=6c9a260ca7f72071]*/ { Py_ssize_t start_size = PyByteArray_GET_SIZE(self); int result = PyByteArray_Resize((PyObject *)self, size); diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index ffb45ade11f6dc..6f13865177dde5 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -599,7 +599,7 @@ PyDoc_STRVAR(bytearray_resize__doc__, "Resize the internal buffer of bytearray to len.\n" "\n" " size\n" -" New size to resize to.."); +" New size to resize to."); #define BYTEARRAY_RESIZE_METHODDEF \ {"resize", (PyCFunction)bytearray_resize, METH_O, bytearray_resize__doc__}, @@ -1796,4 +1796,4 @@ bytearray_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl((PyByteArrayObject *)self); } -/*[clinic end generated code: output=be6d28193bc96a2c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=fdfe41139c91e409 input=a9049054013a1b77]*/ From 045e34964a37ac50eecde481f93deedc640884da Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 15 Oct 2025 16:49:17 +0200 Subject: [PATCH 1181/1674] [3.14] gh-140061: Use `_PyObject_IsUniquelyReferenced()` to check if objects are uniquely referenced (gh-140062) (gh-140157) The previous `Py_REFCNT(x) == 1` checks can have data races in the free threaded build. `_PyObject_IsUniquelyReferenced(x)` is a more conservative check that is safe in the free threaded build and is identical to `Py_REFCNT(x) == 1` in the default GIL-enabled build. (cherry picked from commit 32c264982ec67460642b907dabc3304019318291) Co-authored-by: Sergey Miryanov --- ...025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst | 2 ++ Modules/_elementtree.c | 7 ++++--- Modules/_functoolsmodule.c | 4 ++-- Modules/itertoolsmodule.c | 14 +++++++------- Objects/bytesobject.c | 4 ++-- Objects/dictobject.c | 16 ++-------------- Objects/longobject.c | 7 ++++--- Objects/setobject.c | 4 ++-- Objects/tupleobject.c | 4 ++-- Python/marshal.c | 3 ++- 10 files changed, 29 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst new file mode 100644 index 00000000000000..7c3924195eb85f --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst @@ -0,0 +1,2 @@ +Fixing the checking of whether an object is uniquely referenced to ensure +free-threaded compatibility. Patch by Sergey Miryanov. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 9263f14b57f972..3173b52afb31b6 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -912,7 +912,7 @@ deepcopy(elementtreestate *st, PyObject *object, PyObject *memo) return Py_NewRef(object); } - if (Py_REFCNT(object) == 1) { + if (_PyObject_IsUniquelyReferenced(object)) { if (PyDict_CheckExact(object)) { PyObject *key, *value; Py_ssize_t pos = 0; @@ -2794,8 +2794,9 @@ treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) self->data = Py_NewRef(data); } else { /* more than one item; use a list to collect items */ - if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 && - PyBytes_CheckExact(data) && PyBytes_GET_SIZE(data) == 1) { + if (PyBytes_CheckExact(self->data) + && _PyObject_IsUniquelyReferenced(self->data) + && PyBytes_CheckExact(data) && PyBytes_GET_SIZE(data) == 1) { /* XXX this code path unused in Python 3? */ /* expat often generates single character data sections; handle the most common case by resizing the existing string... */ diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index d3dabd58b89c70..3d45da493f4b3d 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -298,7 +298,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (kw == NULL) { pto->kw = PyDict_New(); } - else if (Py_REFCNT(kw) == 1) { + else if (_PyObject_IsUniquelyReferenced(kw)) { pto->kw = Py_NewRef(kw); } else { @@ -995,7 +995,7 @@ _functools_reduce_impl(PyObject *module, PyObject *func, PyObject *seq, for (;;) { PyObject *op2; - if (Py_REFCNT(args) > 1) { + if (!_PyObject_IsUniquelyReferenced(args)) { Py_DECREF(args); if ((args = PyTuple_New(2)) == NULL) goto Fail; diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 943c1e8607b38f..a48d2fe76d0bf2 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -376,7 +376,7 @@ pairwise_next(PyObject *op) } result = po->result; - if (Py_REFCNT(result) == 1) { + if (_PyObject_IsUniquelyReferenced(result)) { Py_INCREF(result); PyObject *last_old = PyTuple_GET_ITEM(result, 0); PyObject *last_new = PyTuple_GET_ITEM(result, 1); @@ -802,7 +802,7 @@ teedataobject_traverse(PyObject *op, visitproc visit, void * arg) static void teedataobject_safe_decref(PyObject *obj) { - while (obj && Py_REFCNT(obj) == 1) { + while (obj && _PyObject_IsUniquelyReferenced(obj)) { teedataobject *tmp = teedataobject_CAST(obj); PyObject *nextlink = tmp->nextlink; tmp->nextlink = NULL; @@ -2114,7 +2114,7 @@ product_next(PyObject *op) Py_ssize_t *indices = lz->indices; /* Copy the previous result tuple or re-use it if available */ - if (Py_REFCNT(result) > 1) { + if (!_PyObject_IsUniquelyReferenced(result)) { PyObject *old_result = result; result = _PyTuple_FromArray(_PyTuple_ITEMS(old_result), npools); if (result == NULL) @@ -2343,7 +2343,7 @@ combinations_next(PyObject *op) } } else { /* Copy the previous result tuple or re-use it if available */ - if (Py_REFCNT(result) > 1) { + if (!_PyObject_IsUniquelyReferenced(result)) { PyObject *old_result = result; result = _PyTuple_FromArray(_PyTuple_ITEMS(old_result), r); if (result == NULL) @@ -2589,7 +2589,7 @@ cwr_next(PyObject *op) } } else { /* Copy the previous result tuple or re-use it if available */ - if (Py_REFCNT(result) > 1) { + if (!_PyObject_IsUniquelyReferenced(result)) { PyObject *old_result = result; result = _PyTuple_FromArray(_PyTuple_ITEMS(old_result), r); if (result == NULL) @@ -2850,7 +2850,7 @@ permutations_next(PyObject *op) goto empty; /* Copy the previous result tuple or re-use it if available */ - if (Py_REFCNT(result) > 1) { + if (!_PyObject_IsUniquelyReferenced(result)) { PyObject *old_result = result; result = _PyTuple_FromArray(_PyTuple_ITEMS(old_result), r); if (result == NULL) @@ -3818,7 +3818,7 @@ zip_longest_next(PyObject *op) return NULL; if (lz->numactive == 0) return NULL; - if (Py_REFCNT(result) == 1) { + if (_PyObject_IsUniquelyReferenced(result)) { Py_INCREF(result); for (i=0 ; i < tuplesize ; i++) { it = PyTuple_GET_ITEM(lz->ittuple, i); diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 87ea1162e03513..5dd1a1f09c82f1 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3147,7 +3147,7 @@ PyBytes_Concat(PyObject **pv, PyObject *w) return; } - if (Py_REFCNT(*pv) == 1 && PyBytes_CheckExact(*pv)) { + if (_PyObject_IsUniquelyReferenced(*pv) && PyBytes_CheckExact(*pv)) { /* Only one reference, so we can resize in place */ Py_ssize_t oldsize; Py_buffer wb; @@ -3232,7 +3232,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) Py_DECREF(v); return 0; } - if (Py_REFCNT(v) != 1) { + if (!_PyObject_IsUniquelyReferenced(v)) { if (oldsize < newsize) { *pv = _PyBytes_FromSize(newsize, 0); if (*pv) { diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 80a44a87be4c4f..1fd5ef0c5e190a 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -5618,22 +5618,10 @@ dictiter_iternext_threadsafe(PyDictObject *d, PyObject *self, #endif -static bool -has_unique_reference(PyObject *op) -{ -#ifdef Py_GIL_DISABLED - return (_Py_IsOwnedByCurrentThread(op) && - op->ob_ref_local == 1 && - _Py_atomic_load_ssize_relaxed(&op->ob_ref_shared) == 0); -#else - return Py_REFCNT(op) == 1; -#endif -} - static bool acquire_iter_result(PyObject *result) { - if (has_unique_reference(result)) { + if (_PyObject_IsUniquelyReferenced(result)) { Py_INCREF(result); return true; } @@ -5782,7 +5770,7 @@ dictreviter_iter_lock_held(PyDictObject *d, PyObject *self) } else if (Py_IS_TYPE(di, &PyDictRevIterItem_Type)) { result = di->di_result; - if (Py_REFCNT(result) == 1) { + if (_PyObject_IsUniquelyReferenced(result)) { PyObject *oldkey = PyTuple_GET_ITEM(result, 0); PyObject *oldvalue = PyTuple_GET_ITEM(result, 1); PyTuple_SET_ITEM(result, 0, Py_NewRef(key)); diff --git a/Objects/longobject.c b/Objects/longobject.c index ec2b8fc4182643..6a35413136fe3f 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -324,7 +324,7 @@ _PyLong_Negate(PyLongObject **x_p) PyLongObject *x; x = (PyLongObject *)*x_p; - if (Py_REFCNT(x) == 1) { + if (_PyObject_IsUniquelyReferenced((PyObject *)x)) { _PyLong_FlipSign(x); return; } @@ -5754,7 +5754,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) assert(size_a >= 0); _PyLong_SetSignAndDigitCount(c, 1, size_a); } - else if (Py_REFCNT(a) == 1) { + else if (_PyObject_IsUniquelyReferenced((PyObject *)a)) { c = (PyLongObject*)Py_NewRef(a); } else { @@ -5768,7 +5768,8 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) assert(size_a >= 0); _PyLong_SetSignAndDigitCount(d, 1, size_a); } - else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) { + else if (_PyObject_IsUniquelyReferenced((PyObject *)b) + && size_a <= alloc_b) { d = (PyLongObject*)Py_NewRef(b); assert(size_a >= 0); _PyLong_SetSignAndDigitCount(d, 1, size_a); diff --git a/Objects/setobject.c b/Objects/setobject.c index 6e4fc5957cad7f..83004e57b66c20 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2428,7 +2428,7 @@ set_init(PyObject *so, PyObject *args, PyObject *kwds) if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable)) return -1; - if (Py_REFCNT(self) == 1 && self->fill == 0) { + if (_PyObject_IsUniquelyReferenced((PyObject *)self) && self->fill == 0) { self->hash = -1; if (iterable == NULL) { return 0; @@ -2758,7 +2758,7 @@ int PySet_Add(PyObject *anyset, PyObject *key) { if (!PySet_Check(anyset) && - (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) { + (!PyFrozenSet_Check(anyset) || !_PyObject_IsUniquelyReferenced(anyset))) { PyErr_BadInternalCall(); return -1; } diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 9b31758485ca5e..38a130d889d0c1 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -118,7 +118,7 @@ int PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem) { PyObject **p; - if (!PyTuple_Check(op) || Py_REFCNT(op) != 1) { + if (!PyTuple_Check(op) || !_PyObject_IsUniquelyReferenced(op)) { Py_XDECREF(newitem); PyErr_BadInternalCall(); return -1; @@ -923,7 +923,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) v = (PyTupleObject *) *pv; if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) || - (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) { + (Py_SIZE(v) != 0 && !_PyObject_IsUniquelyReferenced(*pv))) { *pv = 0; Py_XDECREF(v); PyErr_BadInternalCall(); diff --git a/Python/marshal.c b/Python/marshal.c index a0f3e0a9f5668c..50001497f6250b 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -11,6 +11,7 @@ #include "pycore_code.h" // _PyCode_New() #include "pycore_hashtable.h" // _Py_hashtable_t #include "pycore_long.h" // _PyLong_IsZero() +#include "pycore_object.h" // _PyObject_IsUniquelyReferenced #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_setobject.h" // _PySet_NextEntryRef() #include "pycore_unicodeobject.h" // _PyUnicode_InternImmortal() @@ -388,7 +389,7 @@ w_ref(PyObject *v, char *flag, WFILE *p) * But we use TYPE_REF always for interned string, to PYC file stable * as possible. */ - if (Py_REFCNT(v) == 1 && + if (_PyObject_IsUniquelyReferenced(v) && !(PyUnicode_CheckExact(v) && PyUnicode_CHECK_INTERNED(v))) { return 0; } From 95c03d018df5f1e287a4577669b1ced5bc5518f8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 15 Oct 2025 17:02:03 +0200 Subject: [PATCH 1182/1674] [3.14] gh-140153: Fix Py_REFCNT() definition on limited C API 3.11-3.13 (GH-140158) (#140164) gh-140153: Fix Py_REFCNT() definition on limited C API 3.11-3.13 (GH-140158) (cherry picked from commit 728d239e57b650c392517b7ae569b0eb05af826e) Co-authored-by: Victor Stinner --- Include/refcount.h | 2 ++ .../next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst diff --git a/Include/refcount.h b/Include/refcount.h index 1ecba5ee78d685..1ef6b2186bba03 100644 --- a/Include/refcount.h +++ b/Include/refcount.h @@ -117,6 +117,8 @@ PyAPI_FUNC(Py_ssize_t) Py_REFCNT(PyObject *ob); } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_REFCNT(ob) _Py_REFCNT(_PyObject_CAST(ob)) + #else + # define Py_REFCNT(ob) _Py_REFCNT(ob) #endif #endif diff --git a/Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst b/Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst new file mode 100644 index 00000000000000..502c48b6842d1c --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst @@ -0,0 +1,2 @@ +Fix :c:func:`Py_REFCNT` definition on limited C API 3.11-3.13. Patch by +Victor Stinner. From 5caf64335cb3504d0b1321b9da6ef1a0a040eb43 Mon Sep 17 00:00:00 2001 From: yihong Date: Wed, 15 Oct 2025 23:25:06 +0800 Subject: [PATCH 1183/1674] [3.14] gh-140080: Add test for executing `atexit` callbacks under no memory (GH-140161) --- Lib/test/test_atexit.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index eb01da6e88a8bc..30c445a9c2a5f3 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -1,9 +1,11 @@ import atexit import os +import subprocess import textwrap import unittest +from test.support import os_helper from test import support -from test.support import script_helper +from test.support import SuppressCrashReport, script_helper from test.support import threading_helper class GeneralTest(unittest.TestCase): @@ -133,6 +135,37 @@ def callback(): self.assertEqual(os.read(r, len(expected)), expected) os.close(r) + # Python built with Py_TRACE_REFS fail with a fatal error in + # _PyRefchain_Trace() on memory allocation error. + @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build') + def test_atexit_with_low_memory(self): + # gh-140080: Test that setting low memory after registering an atexit + # callback doesn't cause an infinite loop during finalization. + code = textwrap.dedent(""" + import atexit + import _testcapi + + def callback(): + print("hello") + + atexit.register(callback) + # Simulate low memory condition + _testcapi.set_nomemory(0) + """) + + with os_helper.temp_dir() as temp_dir: + script = script_helper.make_script(temp_dir, 'test_atexit_script', code) + with SuppressCrashReport(): + with script_helper.spawn_python(script, + stderr=subprocess.PIPE) as proc: + proc.wait() + stdout = proc.stdout.read() + stderr = proc.stderr.read() + + self.assertIn(proc.returncode, (0, 1)) + self.assertNotIn(b"hello", stdout) + self.assertIn(b"MemoryError", stderr) + if __name__ == "__main__": unittest.main() From 504bf76dd267cfa82d02aaca7e797e57257f83c1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 16 Oct 2025 00:08:35 +0200 Subject: [PATCH 1184/1674] [3.14] gh-140041: Fix import of `ctypes` on Android and Cygwin when ABI flags are present (GH-140178) (#140180) Use sysconfig to determine the full name of libpython, rather than hardcoding a library name that doesn't have ABI flags. (cherry picked from commit 7f371ed84ba471bb1b11e79b502f244a9c17ac84) Co-authored-by: Malcolm Smith --- Android/testbed/app/build.gradle.kts | 9 +++++---- Lib/ctypes/__init__.py | 11 ++++++----- .../2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts index 92cffd61f86876..4de628a279ca3f 100644 --- a/Android/testbed/app/build.gradle.kts +++ b/Android/testbed/app/build.gradle.kts @@ -47,7 +47,7 @@ for ((i, prefix) in prefixes.withIndex()) { val libDir = file("$prefix/lib") val version = run { for (filename in libDir.list()!!) { - """python(\d+\.\d+)""".toRegex().matchEntire(filename)?.let { + """python(\d+\.\d+[a-z]*)""".toRegex().matchEntire(filename)?.let { return@run it.groupValues[1] } } @@ -64,9 +64,10 @@ for ((i, prefix) in prefixes.withIndex()) { val libPythonDir = file("$libDir/python$pythonVersion") val triplet = run { for (filename in libPythonDir.list()!!) { - """_sysconfigdata__android_(.+).py""".toRegex().matchEntire(filename)?.let { - return@run it.groupValues[1] - } + """_sysconfigdata_[a-z]*_android_(.+).py""".toRegex() + .matchEntire(filename)?.let { + return@run it.groupValues[1] + } } throw GradleException("Failed to find Python triplet in $libPythonDir") } diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index a41f4a16a5c6ee..04ec0270148e0e 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -1,6 +1,8 @@ """create and manipulate C data types in Python""" -import os as _os, sys as _sys +import os as _os +import sys as _sys +import sysconfig as _sysconfig import types as _types __version__ = "1.1.0" @@ -556,10 +558,9 @@ def LoadLibrary(self, name): 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]) +elif _sys.platform in ["android", "cygwin"]: + # These are Unix-like platforms which use a dynamically-linked libpython. + pythonapi = PyDLL(_sysconfig.get_config_var("LDLIBRARY")) else: pythonapi = PyDLL(None) diff --git a/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst b/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst new file mode 100644 index 00000000000000..243ff39311cf06 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst @@ -0,0 +1 @@ +Fix import of :mod:`ctypes` on Android and Cygwin when ABI flags are present. From 231552c6f7e6fc5cc4b2f401fe63663fcb6c646a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 16 Oct 2025 09:50:01 +0200 Subject: [PATCH 1185/1674] [3.14] gh-140065: Lexical analysis: Correct note about leading zeros in floating point numbers (GH-140066) (GH-140167) (cherry picked from commit 1624c646b045df15ba41d17ff03231978b80c3ff) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/reference/lexical_analysis.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index dfa340763d9255..969da12690636d 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -1308,8 +1308,8 @@ The parts are separated by a decimal point, ``.``:: 2.71828 4.0 -Unlike in integer literals, leading zeros are allowed in the numeric parts. -For example, ``077.010`` is legal, and denotes the same number as ``77.10``. +Unlike in integer literals, leading zeros are allowed. +For example, ``077.010`` is legal, and denotes the same number as ``77.01``. As in integer literals, single underscores may occur between digits to help readability:: From e69fb2008e288f57d95fde6f327b4c9bbdb5d878 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 16 Oct 2025 12:31:59 +0200 Subject: [PATCH 1186/1674] [3.14] gh-140170: Fix test_site with -s flag (GH-140179) (#140198) gh-140170: Fix test_site with -s flag (GH-140179) Commit (cherry picked from commit 7ac94fcb1d09796f55faeaf30e349a86a88f7ed6) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/test/test_site.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 39c451fbbbba41..f8c6f37c607cfb 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -846,12 +846,15 @@ def get_excepted_output(self, *args): return 10, None def invoke_command_line(self, *args): - args = ["-m", "site", *args] + cmd_args = [] + if sys.flags.no_user_site: + cmd_args.append("-s") + cmd_args.extend(["-m", "site", *args]) with EnvironmentVarGuard() as env: env["PYTHONUTF8"] = "1" env["PYTHONIOENCODING"] = "utf-8" - proc = spawn_python(*args, text=True, env=env, + proc = spawn_python(*cmd_args, text=True, env=env, encoding='utf-8', errors='replace') output = kill_python(proc) From 48b60495b73e1f8db9348e41c5c17ce8d1f3ec05 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:22:57 +0200 Subject: [PATCH 1187/1674] [3.14] gh-140078: fix typo in tkinter docs (GH-140081) (#140217) gh-140078: fix typo in tkinter docs (GH-140081) Remove extraneous word. (cherry picked from commit 5f357f3b0de0d937afb0154d0df7e0298c2523cf) Co-authored-by: wangxiaolei --- Doc/library/tkinter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index f284988daf2d4e..be26af02bcee0d 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -392,7 +392,7 @@ by spaces. Without getting into too many details, notice the following: * Operations which are implemented as separate *commands* in Tcl (like ``grid`` or ``destroy``) are represented as *methods* on Tkinter widget objects. As you'll see shortly, at other times Tcl uses what appear to be - method calls on widget objects, which more closely mirror what would is + method calls on widget objects, which more closely mirror what is used in Tkinter. From 12903c098be9c9c775d3f26dd4adbea2c7823b6d Mon Sep 17 00:00:00 2001 From: Tan Long Date: Fri, 17 Oct 2025 02:10:15 +0800 Subject: [PATCH 1188/1674] [3.14] Remove duplicate words in the documentation (GH-140221) (GH-140225) (cherry picked from commit 2ebd0cdb16a8824957ea588e1aab0a35d45e6b7b) --- Doc/library/importlib.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/whatsnew/3.14.rst | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index ddf503af82d988..743d617fbe77a0 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1253,7 +1253,7 @@ find and load modules. 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`` + is 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 diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index a9658820f66eb9..f8397b861d9a8b 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5944,7 +5944,7 @@ It is written as ``None``. The Ellipsis Object ------------------- -This object is commonly used used to indicate that something is omitted. +This object is commonly used to indicate that something is omitted. It supports no special operations. There is exactly one ellipsis object, named :const:`Ellipsis` (a built-in name). ``type(Ellipsis)()`` produces the :const:`Ellipsis` singleton. diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index ad4330e63e0b59..bc4e34fa338b3d 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -1140,7 +1140,7 @@ concurrent.futures .. _whatsnew314-concurrent-futures-start-method: * On Unix platforms other than macOS, :ref:`'forkserver' - ` is now the the default :ref:`start + ` is now the default :ref:`start method ` for :class:`~concurrent.futures.ProcessPoolExecutor` (replacing :ref:`'fork' `). @@ -1591,7 +1591,7 @@ multiprocessing .. _whatsnew314-multiprocessing-start-method: * On Unix platforms other than macOS, :ref:`'forkserver' - ` is now the the default :ref:`start + ` is now the default :ref:`start method ` (replacing :ref:`'fork' `). This change does not affect Windows or macOS, where :ref:`'spawn' From 54261b67825811a0dcc07a0cc6dfc85bbeb0c79f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:26:29 +0200 Subject: [PATCH 1189/1674] =?UTF-8?q?[3.14]=20gh-138859:=20Account=20for?= =?UTF-8?q?=20`ParamSpec`=20defaults=20that=20are=20not=20lists=20?= =?UTF-8?q?=E2=80=A6=20(GH-138868)=20(#140207)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-138859: Account for `ParamSpec` defaults that are not lists … (GH-138868) (cherry picked from commit 379fd020a0116754f22b04fa2f7f27a8f7b372b0) Co-authored-by: bzoracler <50305397+bzoracler@users.noreply.github.com> --- Lib/test/test_typing.py | 10 ++++++++++ Lib/typing.py | 2 +- .../2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f84f972a29437d..4b8280b647f647 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -762,6 +762,16 @@ class A(Generic[T, P, U]): ... self.assertEqual(A[float, [range]].__args__, (float, (range,), float)) self.assertEqual(A[float, [range], int].__args__, (float, (range,), int)) + def test_paramspec_and_typevar_specialization_2(self): + T = TypeVar("T") + P = ParamSpec('P', default=...) + U = TypeVar("U", default=float) + self.assertEqual(P.__default__, ...) + class A(Generic[T, P, U]): ... + self.assertEqual(A[float].__args__, (float, ..., float)) + self.assertEqual(A[float, [range]].__args__, (float, (range,), float)) + self.assertEqual(A[float, [range], int].__args__, (float, (range,), int)) + def test_typevartuple_none(self): U = TypeVarTuple('U') U_None = TypeVarTuple('U_None', default=None) diff --git a/Lib/typing.py b/Lib/typing.py index 72c0d7349eaaaa..92b78defd11976 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1097,7 +1097,7 @@ def _paramspec_prepare_subst(self, alias, args): params = alias.__parameters__ i = params.index(self) if i == len(args) and self.has_default(): - args = [*args, self.__default__] + args = (*args, self.__default__) if i >= len(args): raise TypeError(f"Too few arguments for {alias}") # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. diff --git a/Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst b/Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst new file mode 100644 index 00000000000000..a5d4dd042fcd5b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst @@ -0,0 +1 @@ +Fix generic type parameterization raising a :exc:`TypeError` when omitting a :class:`ParamSpec` that has a default which is not a list of types. From 32e60fa220ec096739f95485f2b62ab950d921e4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 17 Oct 2025 05:53:12 +0200 Subject: [PATCH 1190/1674] [3.14] gh-140120: Refresh HACL* to fix an hmac memory leak (GH-140188) (#140192) gh-140120: Refresh HACL* to fix an hmac memory leak (GH-140188) This pulls an updated version of HACL* that fixes the memory leak reported in GH-140120, via an upstream fix. (cherry picked from commit 3a81313019ba82152653bd86f6ffd87dfe339c60) Co-authored-by: Jonathan Protzenko --- ...-10-15-20-47-04.gh-issue-140120.3gffZq.rst | 2 + Misc/sbom.spdx.json | 124 +++++++++--------- Modules/_hacl/Hacl_HMAC.h | 8 +- Modules/_hacl/Hacl_Hash_Blake2b.h | 8 +- Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h | 8 +- Modules/_hacl/Hacl_Hash_Blake2s.h | 8 +- Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h | 8 +- Modules/_hacl/Hacl_Hash_MD5.h | 8 +- Modules/_hacl/Hacl_Hash_SHA1.h | 8 +- Modules/_hacl/Hacl_Hash_SHA2.h | 8 +- Modules/_hacl/Hacl_Hash_SHA3.h | 8 +- Modules/_hacl/Hacl_Streaming_HMAC.c | 8 +- Modules/_hacl/Hacl_Streaming_HMAC.h | 8 +- Modules/_hacl/Hacl_Streaming_Types.h | 8 +- .../include/krml/FStar_UInt128_Verified.h | 8 +- .../include/krml/FStar_UInt_8_16_32_64.h | 16 ++- Modules/_hacl/include/krml/internal/target.h | 9 +- Modules/_hacl/include/krml/internal/types.h | 2 +- .../_hacl/include/krml/lowstar_endianness.h | 6 +- Modules/_hacl/internal/Hacl_HMAC.h | 8 +- Modules/_hacl/internal/Hacl_Hash_Blake2b.h | 8 +- .../internal/Hacl_Hash_Blake2b_Simd256.h | 8 +- Modules/_hacl/internal/Hacl_Hash_Blake2s.h | 8 +- .../internal/Hacl_Hash_Blake2s_Simd128.h | 8 +- Modules/_hacl/internal/Hacl_Hash_MD5.h | 8 +- Modules/_hacl/internal/Hacl_Hash_SHA1.h | 8 +- Modules/_hacl/internal/Hacl_Hash_SHA2.h | 8 +- Modules/_hacl/internal/Hacl_Hash_SHA3.h | 8 +- .../internal/Hacl_Impl_Blake2_Constants.h | 8 +- Modules/_hacl/internal/Hacl_Streaming_HMAC.h | 8 +- Modules/_hacl/internal/Hacl_Streaming_Types.h | 8 +- Modules/_hacl/refresh.sh | 2 +- 32 files changed, 189 insertions(+), 172 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst diff --git a/Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst b/Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst new file mode 100644 index 00000000000000..9eefe1405203bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst @@ -0,0 +1,2 @@ +Fixed a memory leak in :mod:`hmac` when it was using the hacl-star backend. +Discovered by ``@ashm-dev`` using AddressSanitizer. diff --git a/Misc/sbom.spdx.json b/Misc/sbom.spdx.json index 6ca09684a595a0..d64857ce233b5c 100644 --- a/Misc/sbom.spdx.json +++ b/Misc/sbom.spdx.json @@ -300,11 +300,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "de7179fe6970e2b5d281dfed977ed91be635b8d2" + "checksumValue": "a57d53c35aa916ce0cd1567c8f10dcea58270321" }, { "algorithm": "SHA256", - "checksumValue": "c0ba888d87775c7d7f7d8a08dac7b3988fed81e11bb52396d90f762a8e90a7eb" + "checksumValue": "d68209032703137326f9aadd9abac8fe4a5c92d391e2f43b0414fa63087adc6b" } ], "fileName": "Modules/_hacl/Hacl_HMAC.h" @@ -328,11 +328,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "7c66ac004a1dcf3fee0ab9aa62d61972f029de3a" + "checksumValue": "4d767388a34e2a2000e0cbd31f06cf36af1ae10d" }, { "algorithm": "SHA256", - "checksumValue": "9a7239a01a4ee8defbe3ebd9f0d12c873a1dd8e0659070380b2eab3ab0177333" + "checksumValue": "fac493e96af252abcf5705f0ab4eec59c1f3bc8244e105d75a57c43552dd1569" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2b.h" @@ -356,11 +356,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "7f273d26942233e5dcdfb4c1a16ff2486b15f899" + "checksumValue": "280fd03ee23e13ecf90711d2be8230035d957343" }, { "algorithm": "SHA256", - "checksumValue": "dbc0dacc68ed52dbf1b7d6fba2c87870317998bc046e65f6deaaa150625432f8" + "checksumValue": "817dcd05d06d804587fce7d8f2f3f42a6fcf6818d2419a3551ef0df70cb7125a" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h" @@ -398,11 +398,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "2120c8c467aeebcc7c8b9678c15e79648433b91a" + "checksumValue": "79f47ab5458d88bce0f210a566aa117ce2125049" }, { "algorithm": "SHA256", - "checksumValue": "45735f7fe2dbbad7656d07854e9ec8176ad26c79f90dcc0fec0b9a59a6311ba7" + "checksumValue": "5cc96313f8c066f055c2819e473c79aeff086ba91a1449d54aa569127cd8601e" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2s.h" @@ -426,11 +426,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "9028e24c9876d9d16b2435ec29240c6b57bfe2a0" + "checksumValue": "c98890b6193baa3dbd472cfb67f22aea3dd0d3e1" }, { "algorithm": "SHA256", - "checksumValue": "062e3b856acac4f929c1e04b8264a754cad21ca6580215f7094a3f0a04edb912" + "checksumValue": "fe3f17bf237166f872ba88c8204333c4f64bdc4bb29c265448581c7bfea4b151" } ], "fileName": "Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h" @@ -468,11 +468,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "e67a9bc18358c57afaeff3a174893ddfdb52dfc6" + "checksumValue": "2ed70f612a998ef6c04d62f9487a1b2534e6d76a" }, { "algorithm": "SHA256", - "checksumValue": "16e982081f6c2fd03ea751fcc64f5a835c94652841836e231fe562b9e287f4bc" + "checksumValue": "a34534ef36bc8428ac1169ca5f4f1c17a0817507ebae388e3dd825d1a331f28d" } ], "fileName": "Modules/_hacl/Hacl_Hash_MD5.h" @@ -496,11 +496,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "f1ca21f1ee8b15ad9ccfbda72165b9d86912166c" + "checksumValue": "a3f9bdc9e73f80eb4a586dc180246cfb8267ffc0" }, { "algorithm": "SHA256", - "checksumValue": "4b2ad9ea93fdd9c2fdc521fc4e14e02550666c2717a23b85819db2e07ea555f3" + "checksumValue": "2d5cae94382f5473cf6d2654760375ff1ee9cebdb8d4506b63ba33f488de1559" } ], "fileName": "Modules/_hacl/Hacl_Hash_SHA1.h" @@ -524,11 +524,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "f38cebeeca40a83aeb2cf5dfce578ffefe176d84" + "checksumValue": "68b35d0c573f7301ba4d6919b1680d55675a0d98" }, { "algorithm": "SHA256", - "checksumValue": "ee03bf9368d1a3a3c70cfd4e9391b2485466404db4a60bfc5319630cc314b590" + "checksumValue": "442d8997d2bcda20ddf628665e2e69945400e1ab3019bc14fc7c8e20db20c320" } ], "fileName": "Modules/_hacl/Hacl_Hash_SHA2.h" @@ -552,11 +552,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "01717207aef77174e328186d48c27517f6644c15" + "checksumValue": "db1008095b64b2f8ee2a4ce72fa7cfc4a622a108" }, { "algorithm": "SHA256", - "checksumValue": "620dded172e94cb3f25f9904b44977d91f2cc9573e41b38f19e929d083ae0308" + "checksumValue": "961a686186b76a1cd6a64bcfd06afdc8657b1f901bac991166f498ed16f9349a" } ], "fileName": "Modules/_hacl/Hacl_Hash_SHA3.h" @@ -566,11 +566,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "417e68ac8498cb2f93a06a19003ea1cc3f0f6753" + "checksumValue": "eb224e26bc0503a48c88c837e28bbc7a9878ba5c" }, { "algorithm": "SHA256", - "checksumValue": "843db4bba78a476d4d53dabe4eed5c9235f490ccc9fdaf19e22af488af858920" + "checksumValue": "29fcf948a3715e09cbbd434cebb6105f276236a6e4947d237b7bf06634bf2432" } ], "fileName": "Modules/_hacl/Hacl_Streaming_HMAC.c" @@ -580,11 +580,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "49523144583a15d96ba1646af02dc292e633bf8f" + "checksumValue": "2d6c600024275c780e8313e0a5ab506e025bb4d6" }, { "algorithm": "SHA256", - "checksumValue": "78345519bf6789264f6792b809ee97a9ecf7cb5829c674c61e2d99bfdfdc36fc" + "checksumValue": "6450aef92f507fb0a8a3086b1d2792e7fca07121580c24fdaedd1b32e9ad0a76" } ], "fileName": "Modules/_hacl/Hacl_Streaming_HMAC.h" @@ -594,11 +594,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "372448599774a98e5c5d083e91f301ed1c4b822e" + "checksumValue": "ed283b95ebb772b05bdf802b70dbb301ece84e91" }, { "algorithm": "SHA256", - "checksumValue": "95d8e70ca4bc6aa98f6d2435ceb6410ead299b1f700fae1f5c603ec3f57ea551" + "checksumValue": "efc7bd11460744768425aedf4e004d3ad3397a5489752b80044ae785f30b78d4" } ], "fileName": "Modules/_hacl/Hacl_Streaming_Types.h" @@ -622,11 +622,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "911c97a0f24067635b164fbca49da76055f192cd" + "checksumValue": "ae06c415ae7e0e1e85558863f29d1b9013e46e9b" }, { "algorithm": "SHA256", - "checksumValue": "972b5111ebada8e11dd60df3119da1af505fd3e0b6c782ead6cab7f1daf134f1" + "checksumValue": "69dc2e78411e9b271100eb0d2a2d8dc39dd2348afc26f8b4cfba14c025102c7f" } ], "fileName": "Modules/_hacl/include/krml/FStar_UInt128_Verified.h" @@ -636,11 +636,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "41ee1e34ede7ef5b24b87d4ca816fd6d9fac8010" + "checksumValue": "edefe48ced707327fd6cdf3f18b3ca42dda9a9f7" }, { "algorithm": "SHA256", - "checksumValue": "d48ed03e504cb87793a310a9552fb3ba2ebd6fe90127b7d642c8740fba1b9748" + "checksumValue": "f01e3f0892935f3f659019875f580445b9ea23482afbe11ffbe7cdbd22dbd4d2" } ], "fileName": "Modules/_hacl/include/krml/FStar_UInt_8_16_32_64.h" @@ -678,11 +678,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "e01d7d493fbaceeedc4b1c6451d8240bcb9c903a" + "checksumValue": "7a943fbb8f55729a960f9b426e9ff2794453aca9" }, { "algorithm": "SHA256", - "checksumValue": "c2f0a43884771f24d7cb744b79818b160020d2739b2881b2054cfc97fb2e7b4a" + "checksumValue": "08bb43ef5626a8450f985da0af345b6658ac8bcc4585f77271decd0e41fc02e0" } ], "fileName": "Modules/_hacl/include/krml/internal/target.h" @@ -692,11 +692,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "3f66313d16891f43b21c1a736081c2c6d46bf370" + "checksumValue": "b4e6c5fc5e17864cc2bf452db2688be733d6df72" }, { "algorithm": "SHA256", - "checksumValue": "78e9bff9124968108e1699e1c6388e3d4ec9bd72dd8adff49734a69ab380ee5c" + "checksumValue": "404691cf9b2269ecc754ceca27bb8f8f029f1c8deaa4d967990dcf5ce08cd016" } ], "fileName": "Modules/_hacl/include/krml/internal/types.h" @@ -706,11 +706,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "e18efc9239a5df0f222b5f7b0a65f72509d7e304" + "checksumValue": "8c3e09e00459951e060ad469c1fa31eeb9b6b9cb" }, { "algorithm": "SHA256", - "checksumValue": "47dd5a7d21b5302255f9fff28884f65d3056fc3f54471ed62ec85fa1904f8aa5" + "checksumValue": "6d1a350ec272c83761f1789611d8f60947a4d69fed3d23d8eee38709a0ad2c0a" } ], "fileName": "Modules/_hacl/include/krml/lowstar_endianness.h" @@ -720,11 +720,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "aaa656e25a92ba83655e1398a97efa6981f60fc4" + "checksumValue": "c9517c43046de129f02da8b74e454bade4872c00" }, { "algorithm": "SHA256", - "checksumValue": "a59abc6e9b3019cb18976a15e634f5146bd965fc9babf4ccbf2b531164a34f85" + "checksumValue": "96c2a973bc01b1295f7af67c7de3839facfeee36c8848d7d88c62695de98ab21" } ], "fileName": "Modules/_hacl/internal/Hacl_HMAC.h" @@ -734,11 +734,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "0741cb8497309d648428be1e7b5944b1fc167187" + "checksumValue": "1c5eeb5d1866acb6bc8b4e5a01a107e3a87f5694" }, { "algorithm": "SHA256", - "checksumValue": "f9b923a566d62de047c753637143d439ca1c25221c08352ddc1738ff4a6ac721" + "checksumValue": "f262738390f56e8e9692acadecd1434c688075047d788283e1fb45d920ea6956" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_Blake2b.h" @@ -748,11 +748,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "878ae284c93824b80b1763e8b3e6be3c410777a8" + "checksumValue": "b600c1b5eafc34b29a778186737d8a51e2342d85" }, { "algorithm": "SHA256", - "checksumValue": "49df6223f6403daf503a1af1a3d2f943d30b5889fe7ed20299c3df24c1e3853d" + "checksumValue": "f22e088ad9c2eb739aefc3685ef3ab1ccaab3c5ef2e5d06cc846ad9f8e3d2669" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_Blake2b_Simd256.h" @@ -762,11 +762,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "25552d8cbf8aa345907635b38f284eec9075301e" + "checksumValue": "eb618ecc6ca2830066448f5f6d4df84a5c09f0f4" }, { "algorithm": "SHA256", - "checksumValue": "a3424cf4c5518654908086bbbf5d465715ec3b23625ef0cadc29492d1f90366c" + "checksumValue": "a4728e43deb0a9d8213b8ddcbda68a63bc73a12fb99aad54b7d28b314776a0d4" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_Blake2s.h" @@ -776,11 +776,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "54a712fc3ed5a817288351cbac5b7d9afa7e379f" + "checksumValue": "5441b6a97cc053c332b29477238d70fa011c74ac" }, { "algorithm": "SHA256", - "checksumValue": "c6abae648b8a1e9d5631c0a959620cad1f7e92ce522e07c3416199fe51debef6" + "checksumValue": "dad568d256a2ccbbbcdd419fe0543ea7137d8065a713a5f009aa52521c0f7f6a" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_Blake2s_Simd128.h" @@ -790,11 +790,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "c15c5f83bbb9f62611c49f0f8f723eaab1a27488" + "checksumValue": "7081b58f28568f600d4624dd5bd6f735191e068b" }, { "algorithm": "SHA256", - "checksumValue": "95cd5d91c4a9217901d0b3395dcd8881e62e2055d723b532ec5176386a636d22" + "checksumValue": "305af1422213ed97e8e5d3d8a9dfee4f21cb2fcd2acf65ee7303ce00b2b4bd2a" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_MD5.h" @@ -804,11 +804,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "7b8717e3a24e7e16a34b251d0d02da6f68439695" + "checksumValue": "b6fb6219cb40d039e789666e34b43461e3b5c82a" }, { "algorithm": "SHA256", - "checksumValue": "9473d8bc9506fe0053d7d98c225d4873011329863f1c4a8e93e43fc71bd1f314" + "checksumValue": "63c58363ff95e8146d5628dab2da25bc2fd0e8b590fd4823b512c33f843355bb" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_SHA1.h" @@ -818,11 +818,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "e319c949f5a2dd765be2c8c7ff77bfe52ee6c7da" + "checksumValue": "bcc71e702df1070cb0081cb983aec7683e036719" }, { "algorithm": "SHA256", - "checksumValue": "75261448e51c3eb1ba441e973b193e23570b167f67743942ee2ee57417491c9f" + "checksumValue": "709c6272f77e2368f6cc0bf36527e3b16dd5d5f3dc26a2afdef8238200af8770" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_SHA2.h" @@ -832,11 +832,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "dbd92415c31606804102b79d5ba3d1752fe03887" + "checksumValue": "e3b5e6add5357760554b032b818992ce9bc211e0" }, { "algorithm": "SHA256", - "checksumValue": "5d74a76a0ac3659a1ae1276c3ca55521f09e83d2f0039f5c519a76f8f3c76a8e" + "checksumValue": "cf49d536a5663379fb4517018b4b3f8a232f8d4c7ddc7edfd60163d13f98a530" } ], "fileName": "Modules/_hacl/internal/Hacl_Hash_SHA3.h" @@ -846,11 +846,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "ad788265f8e1b078c4d1cb6e90b8c031590e6baf" + "checksumValue": "09a0ea364fb073f5f622a763f1351fbf4bac4627" }, { "algorithm": "SHA256", - "checksumValue": "d8354a9b75e2470085fa7e538493130e81fa23a804a6a69d34da8fdcc941c038" + "checksumValue": "916d54d7217517f0360edea920dc21585fbe6d1c2458eac86826182e12c82ec2" } ], "fileName": "Modules/_hacl/internal/Hacl_Impl_Blake2_Constants.h" @@ -860,11 +860,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "2048f3cd61dbda2df862a2982ebaf24b6815ed51" + "checksumValue": "b082645b43f8841db5e9e57c0b9a3825fa7e52f5" }, { "algorithm": "SHA256", - "checksumValue": "b0f5a79c98525b0cb1659238e095641328b7da16a94cb57a0793e635d1da3653" + "checksumValue": "059cf0d31427abf84c626797a97c140630a1a6ead578005162f46fad46663389" } ], "fileName": "Modules/_hacl/internal/Hacl_Streaming_HMAC.h" @@ -874,11 +874,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "4e6b098e89fd447bd03f47b55208208456b20966" + "checksumValue": "1f85ed69e395829b3ac5af9e2d049af7708cb9cb" }, { "algorithm": "SHA256", - "checksumValue": "d54d947968ca125978d61fea844711b990f0a18ab0fbca87e41029004d9d04b6" + "checksumValue": "76997c7069a347ac78b65d26354a0324d54add4ca7a02e7be36d6d5e1c9702e0" } ], "fileName": "Modules/_hacl/internal/Hacl_Streaming_Types.h" @@ -1752,14 +1752,14 @@ "checksums": [ { "algorithm": "SHA256", - "checksumValue": "39f6fd4f2fe98aecc995a2fd980fae0e0835cef6e563ebbf25f69d3d3102bafd" + "checksumValue": "61e48893f37cb2280d106cefacf6fb5afe84edf625fec39572d0ee94e1018f26" } ], - "downloadLocation": "https://github.com/hacl-star/hacl-star/archive/4ef25b547b377dcef855db4289c6a00580e7221c.zip", + "downloadLocation": "https://github.com/hacl-star/hacl-star/archive/8ba599b2f6c9701b3dc961db895b0856a2210f76.zip", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:hacl-star:hacl-star:4ef25b547b377dcef855db4289c6a00580e7221c:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:hacl-star:hacl-star:8ba599b2f6c9701b3dc961db895b0856a2210f76:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], @@ -1767,7 +1767,7 @@ "name": "hacl-star", "originator": "Organization: HACL* Developers", "primaryPackagePurpose": "SOURCE", - "versionInfo": "4ef25b547b377dcef855db4289c6a00580e7221c" + "versionInfo": "8ba599b2f6c9701b3dc961db895b0856a2210f76" }, { "SPDXID": "SPDXRef-PACKAGE-macholib", diff --git a/Modules/_hacl/Hacl_HMAC.h b/Modules/_hacl/Hacl_HMAC.h index 10ff15183f2834..7dca53c9254546 100644 --- a/Modules/_hacl/Hacl_HMAC.h +++ b/Modules/_hacl/Hacl_HMAC.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_HMAC_H -#define __Hacl_HMAC_H +#ifndef Hacl_HMAC_H +#define Hacl_HMAC_H #if defined(__cplusplus) extern "C" { @@ -220,5 +220,5 @@ Hacl_HMAC_compute_blake2b_32( } #endif -#define __Hacl_HMAC_H_DEFINED -#endif +#define Hacl_HMAC_H_DEFINED +#endif /* Hacl_HMAC_H */ diff --git a/Modules/_hacl/Hacl_Hash_Blake2b.h b/Modules/_hacl/Hacl_Hash_Blake2b.h index 3a73f358c98cc3..b07893ba339245 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2b.h +++ b/Modules/_hacl/Hacl_Hash_Blake2b.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_Blake2b_H -#define __Hacl_Hash_Blake2b_H +#ifndef Hacl_Hash_Blake2b_H +#define Hacl_Hash_Blake2b_H #if defined(__cplusplus) extern "C" { @@ -220,5 +220,5 @@ Hacl_Hash_Blake2b_hash_with_key_and_params( } #endif -#define __Hacl_Hash_Blake2b_H_DEFINED -#endif +#define Hacl_Hash_Blake2b_H_DEFINED +#endif /* Hacl_Hash_Blake2b_H */ diff --git a/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h b/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h index 0271ab8e024e51..8be8f32db62b15 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h +++ b/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_Blake2b_Simd256_H -#define __Hacl_Hash_Blake2b_Simd256_H +#ifndef Hacl_Hash_Blake2b_Simd256_H +#define Hacl_Hash_Blake2b_Simd256_H #if defined(__cplusplus) extern "C" { @@ -206,5 +206,5 @@ Hacl_Hash_Blake2b_Simd256_hash_with_key_and_params( } #endif -#define __Hacl_Hash_Blake2b_Simd256_H_DEFINED -#endif +#define Hacl_Hash_Blake2b_Simd256_H_DEFINED +#endif /* Hacl_Hash_Blake2b_Simd256_H */ diff --git a/Modules/_hacl/Hacl_Hash_Blake2s.h b/Modules/_hacl/Hacl_Hash_Blake2s.h index fbf8cff5cd1073..2582a3d34e34fc 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2s.h +++ b/Modules/_hacl/Hacl_Hash_Blake2s.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_Blake2s_H -#define __Hacl_Hash_Blake2s_H +#ifndef Hacl_Hash_Blake2s_H +#define Hacl_Hash_Blake2s_H #if defined(__cplusplus) extern "C" { @@ -198,5 +198,5 @@ Hacl_Hash_Blake2s_hash_with_key_and_params( } #endif -#define __Hacl_Hash_Blake2s_H_DEFINED -#endif +#define Hacl_Hash_Blake2s_H_DEFINED +#endif /* Hacl_Hash_Blake2s_H */ diff --git a/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h b/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h index 56456e6fbb3df8..4b3b4e4fbb5630 100644 --- a/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h +++ b/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_Blake2s_Simd128_H -#define __Hacl_Hash_Blake2s_Simd128_H +#ifndef Hacl_Hash_Blake2s_Simd128_H +#define Hacl_Hash_Blake2s_Simd128_H #if defined(__cplusplus) extern "C" { @@ -206,5 +206,5 @@ Hacl_Hash_Blake2s_Simd128_hash_with_key_and_params( } #endif -#define __Hacl_Hash_Blake2s_Simd128_H_DEFINED -#endif +#define Hacl_Hash_Blake2s_Simd128_H_DEFINED +#endif /* Hacl_Hash_Blake2s_Simd128_H */ diff --git a/Modules/_hacl/Hacl_Hash_MD5.h b/Modules/_hacl/Hacl_Hash_MD5.h index 521c2addc50289..b220bbf6890ffa 100644 --- a/Modules/_hacl/Hacl_Hash_MD5.h +++ b/Modules/_hacl/Hacl_Hash_MD5.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_MD5_H -#define __Hacl_Hash_MD5_H +#ifndef Hacl_Hash_MD5_H +#define Hacl_Hash_MD5_H #if defined(__cplusplus) extern "C" { @@ -62,5 +62,5 @@ void Hacl_Hash_MD5_hash(uint8_t *output, uint8_t *input, uint32_t input_len); } #endif -#define __Hacl_Hash_MD5_H_DEFINED -#endif +#define Hacl_Hash_MD5_H_DEFINED +#endif /* Hacl_Hash_MD5_H */ diff --git a/Modules/_hacl/Hacl_Hash_SHA1.h b/Modules/_hacl/Hacl_Hash_SHA1.h index 63ac83f9dce018..7fc8c8cfd205d9 100644 --- a/Modules/_hacl/Hacl_Hash_SHA1.h +++ b/Modules/_hacl/Hacl_Hash_SHA1.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_SHA1_H -#define __Hacl_Hash_SHA1_H +#ifndef Hacl_Hash_SHA1_H +#define Hacl_Hash_SHA1_H #if defined(__cplusplus) extern "C" { @@ -62,5 +62,5 @@ void Hacl_Hash_SHA1_hash(uint8_t *output, uint8_t *input, uint32_t input_len); } #endif -#define __Hacl_Hash_SHA1_H_DEFINED -#endif +#define Hacl_Hash_SHA1_H_DEFINED +#endif /* Hacl_Hash_SHA1_H */ diff --git a/Modules/_hacl/Hacl_Hash_SHA2.h b/Modules/_hacl/Hacl_Hash_SHA2.h index a93138fb7ee7a7..dd168b8aa1a424 100644 --- a/Modules/_hacl/Hacl_Hash_SHA2.h +++ b/Modules/_hacl/Hacl_Hash_SHA2.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_SHA2_H -#define __Hacl_Hash_SHA2_H +#ifndef Hacl_Hash_SHA2_H +#define Hacl_Hash_SHA2_H #if defined(__cplusplus) extern "C" { @@ -199,5 +199,5 @@ void Hacl_Hash_SHA2_hash_384(uint8_t *output, uint8_t *input, uint32_t input_len } #endif -#define __Hacl_Hash_SHA2_H_DEFINED -#endif +#define Hacl_Hash_SHA2_H_DEFINED +#endif /* Hacl_Hash_SHA2_H */ diff --git a/Modules/_hacl/Hacl_Hash_SHA3.h b/Modules/_hacl/Hacl_Hash_SHA3.h index 65ec99ee3a3ac9..df6ebe439e98b1 100644 --- a/Modules/_hacl/Hacl_Hash_SHA3.h +++ b/Modules/_hacl/Hacl_Hash_SHA3.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Hash_SHA3_H -#define __Hacl_Hash_SHA3_H +#ifndef Hacl_Hash_SHA3_H +#define Hacl_Hash_SHA3_H #if defined(__cplusplus) extern "C" { @@ -155,5 +155,5 @@ Hacl_Hash_SHA3_shake128_squeeze_nblocks( } #endif -#define __Hacl_Hash_SHA3_H_DEFINED -#endif +#define Hacl_Hash_SHA3_H_DEFINED +#endif /* Hacl_Hash_SHA3_H */ diff --git a/Modules/_hacl/Hacl_Streaming_HMAC.c b/Modules/_hacl/Hacl_Streaming_HMAC.c index 8dd7e2c0bf3e71..f89c00ee1ae416 100644 --- a/Modules/_hacl/Hacl_Streaming_HMAC.c +++ b/Modules/_hacl/Hacl_Streaming_HMAC.c @@ -2375,9 +2375,13 @@ Hacl_Streaming_HMAC_digest( Hacl_Agile_Hash_state_s *s112 = tmp_block_state1.snd; update_multi(s112, prev_len, buf_multi, 0U); uint64_t prev_len_last = total_len - (uint64_t)r; - Hacl_Agile_Hash_state_s *s11 = tmp_block_state1.snd; - update_last(s11, prev_len_last, buf_last, r); + Hacl_Agile_Hash_state_s *s113 = tmp_block_state1.snd; + update_last(s113, prev_len_last, buf_last, r); finish0(tmp_block_state1, output); + Hacl_Agile_Hash_state_s *s210 = tmp_block_state1.thd; + Hacl_Agile_Hash_state_s *s11 = tmp_block_state1.snd; + free_(s11); + free_(s210); return Hacl_Streaming_Types_Success; } KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", diff --git a/Modules/_hacl/Hacl_Streaming_HMAC.h b/Modules/_hacl/Hacl_Streaming_HMAC.h index a0806c02d0bb9f..6c302b1f92d6a3 100644 --- a/Modules/_hacl/Hacl_Streaming_HMAC.h +++ b/Modules/_hacl/Hacl_Streaming_HMAC.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Streaming_HMAC_H -#define __Hacl_Streaming_HMAC_H +#ifndef Hacl_Streaming_HMAC_H +#define Hacl_Streaming_HMAC_H #if defined(__cplusplus) extern "C" { @@ -130,5 +130,5 @@ Hacl_Streaming_HMAC_agile_state } #endif -#define __Hacl_Streaming_HMAC_H_DEFINED -#endif +#define Hacl_Streaming_HMAC_H_DEFINED +#endif /* Hacl_Streaming_HMAC_H */ diff --git a/Modules/_hacl/Hacl_Streaming_Types.h b/Modules/_hacl/Hacl_Streaming_Types.h index 5c497750793720..cce25eb7946750 100644 --- a/Modules/_hacl/Hacl_Streaming_Types.h +++ b/Modules/_hacl/Hacl_Streaming_Types.h @@ -23,8 +23,8 @@ */ -#ifndef __Hacl_Streaming_Types_H -#define __Hacl_Streaming_Types_H +#ifndef Hacl_Streaming_Types_H +#define Hacl_Streaming_Types_H #if defined(__cplusplus) extern "C" { @@ -68,5 +68,5 @@ typedef struct Hacl_Streaming_MD_state_64_s Hacl_Streaming_MD_state_64; } #endif -#define __Hacl_Streaming_Types_H_DEFINED -#endif +#define Hacl_Streaming_Types_H_DEFINED +#endif /* Hacl_Streaming_Types_H */ diff --git a/Modules/_hacl/include/krml/FStar_UInt128_Verified.h b/Modules/_hacl/include/krml/FStar_UInt128_Verified.h index f85982f33735d3..7aa2a6d83f9c4b 100644 --- a/Modules/_hacl/include/krml/FStar_UInt128_Verified.h +++ b/Modules/_hacl/include/krml/FStar_UInt128_Verified.h @@ -4,8 +4,8 @@ */ -#ifndef __FStar_UInt128_Verified_H -#define __FStar_UInt128_Verified_H +#ifndef FStar_UInt128_Verified_H +#define FStar_UInt128_Verified_H #include "FStar_UInt_8_16_32_64.h" #include @@ -331,5 +331,5 @@ static inline FStar_UInt128_uint128 FStar_UInt128_mul_wide(uint64_t x, uint64_t } -#define __FStar_UInt128_Verified_H_DEFINED -#endif +#define FStar_UInt128_Verified_H_DEFINED +#endif /* FStar_UInt128_Verified_H */ diff --git a/Modules/_hacl/include/krml/FStar_UInt_8_16_32_64.h b/Modules/_hacl/include/krml/FStar_UInt_8_16_32_64.h index 00be80836574af..2720348bbb79e6 100644 --- a/Modules/_hacl/include/krml/FStar_UInt_8_16_32_64.h +++ b/Modules/_hacl/include/krml/FStar_UInt_8_16_32_64.h @@ -4,8 +4,8 @@ */ -#ifndef __FStar_UInt_8_16_32_64_H -#define __FStar_UInt_8_16_32_64_H +#ifndef FStar_UInt_8_16_32_64_H +#define FStar_UInt_8_16_32_64_H #include #include @@ -30,6 +30,8 @@ extern uint64_t FStar_UInt64_zero; extern uint64_t FStar_UInt64_one; +extern bool FStar_UInt64_ne(uint64_t a, uint64_t b); + extern uint64_t FStar_UInt64_minus(uint64_t a); extern uint32_t FStar_UInt64_n_minus_one; @@ -80,6 +82,8 @@ extern uint32_t FStar_UInt32_zero; extern uint32_t FStar_UInt32_one; +extern bool FStar_UInt32_ne(uint32_t a, uint32_t b); + extern uint32_t FStar_UInt32_minus(uint32_t a); extern uint32_t FStar_UInt32_n_minus_one; @@ -130,6 +134,8 @@ extern uint16_t FStar_UInt16_zero; extern uint16_t FStar_UInt16_one; +extern bool FStar_UInt16_ne(uint16_t a, uint16_t b); + extern uint16_t FStar_UInt16_minus(uint16_t a); extern uint32_t FStar_UInt16_n_minus_one; @@ -180,6 +186,8 @@ extern uint8_t FStar_UInt8_zero; extern uint8_t FStar_UInt8_one; +extern bool FStar_UInt8_ne(uint8_t a, uint8_t b); + extern uint8_t FStar_UInt8_minus(uint8_t a); extern uint32_t FStar_UInt8_n_minus_one; @@ -217,5 +225,5 @@ extern uint8_t FStar_UInt8_of_string(Prims_string uu___); typedef uint8_t FStar_UInt8_byte; -#define __FStar_UInt_8_16_32_64_H_DEFINED -#endif +#define FStar_UInt_8_16_32_64_H_DEFINED +#endif /* FStar_UInt_8_16_32_64_H */ diff --git a/Modules/_hacl/include/krml/internal/target.h b/Modules/_hacl/include/krml/internal/target.h index c592214634a3bd..73555ab5ca19a4 100644 --- a/Modules/_hacl/include/krml/internal/target.h +++ b/Modules/_hacl/include/krml/internal/target.h @@ -1,8 +1,8 @@ /* Copyright (c) INRIA and Microsoft Corporation. All rights reserved. Licensed under the Apache 2.0 and MIT Licenses. */ -#ifndef __KRML_TARGET_H -#define __KRML_TARGET_H +#ifndef KRML_HEADER_TARGET_H +#define KRML_HEADER_TARGET_H #include #include @@ -12,6 +12,9 @@ #include #include +typedef float float32_t; +typedef double float64_t; + /* Since KaRaMeL emits the inline keyword unconditionally, we follow the * guidelines at https://gcc.gnu.org/onlinedocs/gcc/Inline.html and make this * __inline__ to ensure the code compiles with -std=c90 and earlier. */ @@ -425,4 +428,4 @@ inline static int32_t krml_time(void) { #else # define KRML_MAYBE_FOR16(i, z, n, k, x) KRML_ACTUAL_FOR(i, z, n, k, x) #endif -#endif +#endif /* KRML_HEADER_TARGET_H */ diff --git a/Modules/_hacl/include/krml/internal/types.h b/Modules/_hacl/include/krml/internal/types.h index 2280dfad48db1e..d96ed19fcca5ac 100644 --- a/Modules/_hacl/include/krml/internal/types.h +++ b/Modules/_hacl/include/krml/internal/types.h @@ -92,7 +92,7 @@ typedef FStar_UInt128_uint128 FStar_UInt128_t, uint128_t; /* Avoid a circular loop: if this header is included via FStar_UInt8_16_32_64, * then don't bring the uint128 definitions into scope. */ -#ifndef __FStar_UInt_8_16_32_64_H +#ifndef FStar_UInt_8_16_32_64_H #if !defined(KRML_VERIFIED_UINT128) && defined(IS_MSVC64) #include "fstar_uint128_msvc.h" diff --git a/Modules/_hacl/include/krml/lowstar_endianness.h b/Modules/_hacl/include/krml/lowstar_endianness.h index af6b882cf259cc..5f706fa51aad10 100644 --- a/Modules/_hacl/include/krml/lowstar_endianness.h +++ b/Modules/_hacl/include/krml/lowstar_endianness.h @@ -1,8 +1,8 @@ /* Copyright (c) INRIA and Microsoft Corporation. All rights reserved. Licensed under the Apache 2.0 and MIT Licenses. */ -#ifndef __LOWSTAR_ENDIANNESS_H -#define __LOWSTAR_ENDIANNESS_H +#ifndef KRML_HEADER_LOWSTAR_ENDIANNESS_H +#define KRML_HEADER_LOWSTAR_ENDIANNESS_H #include #include @@ -228,4 +228,4 @@ inline static void store64(uint8_t *b, uint64_t i) { #define load128_be0 load128_be #define store128_be0 store128_be -#endif +#endif /* KRML_HEADER_LOWSTAR_ENDIANNESS_H */ diff --git a/Modules/_hacl/internal/Hacl_HMAC.h b/Modules/_hacl/internal/Hacl_HMAC.h index ad29d50760c3aa..ef9f25f5d420d3 100644 --- a/Modules/_hacl/internal/Hacl_HMAC.h +++ b/Modules/_hacl/internal/Hacl_HMAC.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_HMAC_H -#define __internal_Hacl_HMAC_H +#ifndef internal_Hacl_HMAC_H +#define internal_Hacl_HMAC_H #if defined(__cplusplus) extern "C" { @@ -48,5 +48,5 @@ K___uint32_t_uint32_t; } #endif -#define __internal_Hacl_HMAC_H_DEFINED -#endif +#define internal_Hacl_HMAC_H_DEFINED +#endif /* internal_Hacl_HMAC_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_Blake2b.h b/Modules/_hacl/internal/Hacl_Hash_Blake2b.h index e74c320e073f4b..7ca8e10e34cbbc 100644 --- a/Modules/_hacl/internal/Hacl_Hash_Blake2b.h +++ b/Modules/_hacl/internal/Hacl_Hash_Blake2b.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_Blake2b_H -#define __internal_Hacl_Hash_Blake2b_H +#ifndef internal_Hacl_Hash_Blake2b_H +#define internal_Hacl_Hash_Blake2b_H #if defined(__cplusplus) extern "C" { @@ -91,5 +91,5 @@ Hacl_Hash_Blake2b_state_t; } #endif -#define __internal_Hacl_Hash_Blake2b_H_DEFINED -#endif +#define internal_Hacl_Hash_Blake2b_H_DEFINED +#endif /* internal_Hacl_Hash_Blake2b_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_Blake2b_Simd256.h b/Modules/_hacl/internal/Hacl_Hash_Blake2b_Simd256.h index 27633f22b24f0d..6507d287922eec 100644 --- a/Modules/_hacl/internal/Hacl_Hash_Blake2b_Simd256.h +++ b/Modules/_hacl/internal/Hacl_Hash_Blake2b_Simd256.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_Blake2b_Simd256_H -#define __internal_Hacl_Hash_Blake2b_Simd256_H +#ifndef internal_Hacl_Hash_Blake2b_Simd256_H +#define internal_Hacl_Hash_Blake2b_Simd256_H #if defined(__cplusplus) extern "C" { @@ -134,5 +134,5 @@ Hacl_Hash_Blake2b_Simd256_state_t; } #endif -#define __internal_Hacl_Hash_Blake2b_Simd256_H_DEFINED -#endif +#define internal_Hacl_Hash_Blake2b_Simd256_H_DEFINED +#endif /* internal_Hacl_Hash_Blake2b_Simd256_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_Blake2s.h b/Modules/_hacl/internal/Hacl_Hash_Blake2s.h index 0c5781df8cea81..5fa5bb34efc0e0 100644 --- a/Modules/_hacl/internal/Hacl_Hash_Blake2s.h +++ b/Modules/_hacl/internal/Hacl_Hash_Blake2s.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_Blake2s_H -#define __internal_Hacl_Hash_Blake2s_H +#ifndef internal_Hacl_Hash_Blake2s_H +#define internal_Hacl_Hash_Blake2s_H #if defined(__cplusplus) extern "C" { @@ -90,5 +90,5 @@ Hacl_Hash_Blake2s_state_t; } #endif -#define __internal_Hacl_Hash_Blake2s_H_DEFINED -#endif +#define internal_Hacl_Hash_Blake2s_H_DEFINED +#endif /* internal_Hacl_Hash_Blake2s_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_Blake2s_Simd128.h b/Modules/_hacl/internal/Hacl_Hash_Blake2s_Simd128.h index 0f5db552d6cfed..3220cddac30288 100644 --- a/Modules/_hacl/internal/Hacl_Hash_Blake2s_Simd128.h +++ b/Modules/_hacl/internal/Hacl_Hash_Blake2s_Simd128.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_Blake2s_Simd128_H -#define __internal_Hacl_Hash_Blake2s_Simd128_H +#ifndef internal_Hacl_Hash_Blake2s_Simd128_H +#define internal_Hacl_Hash_Blake2s_Simd128_H #if defined(__cplusplus) extern "C" { @@ -134,5 +134,5 @@ Hacl_Hash_Blake2s_Simd128_state_t; } #endif -#define __internal_Hacl_Hash_Blake2s_Simd128_H_DEFINED -#endif +#define internal_Hacl_Hash_Blake2s_Simd128_H_DEFINED +#endif /* internal_Hacl_Hash_Blake2s_Simd128_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_MD5.h b/Modules/_hacl/internal/Hacl_Hash_MD5.h index 7fe71a49c6df85..d8761de99f5e2a 100644 --- a/Modules/_hacl/internal/Hacl_Hash_MD5.h +++ b/Modules/_hacl/internal/Hacl_Hash_MD5.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_MD5_H -#define __internal_Hacl_Hash_MD5_H +#ifndef internal_Hacl_Hash_MD5_H +#define internal_Hacl_Hash_MD5_H #if defined(__cplusplus) extern "C" { @@ -53,5 +53,5 @@ void Hacl_Hash_MD5_hash_oneshot(uint8_t *output, uint8_t *input, uint32_t input_ } #endif -#define __internal_Hacl_Hash_MD5_H_DEFINED -#endif +#define internal_Hacl_Hash_MD5_H_DEFINED +#endif /* internal_Hacl_Hash_MD5_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_SHA1.h b/Modules/_hacl/internal/Hacl_Hash_SHA1.h index ed53be559fe465..0e9f1c911f6165 100644 --- a/Modules/_hacl/internal/Hacl_Hash_SHA1.h +++ b/Modules/_hacl/internal/Hacl_Hash_SHA1.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_SHA1_H -#define __internal_Hacl_Hash_SHA1_H +#ifndef internal_Hacl_Hash_SHA1_H +#define internal_Hacl_Hash_SHA1_H #if defined(__cplusplus) extern "C" { @@ -52,5 +52,5 @@ void Hacl_Hash_SHA1_hash_oneshot(uint8_t *output, uint8_t *input, uint32_t input } #endif -#define __internal_Hacl_Hash_SHA1_H_DEFINED -#endif +#define internal_Hacl_Hash_SHA1_H_DEFINED +#endif /* internal_Hacl_Hash_SHA1_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_SHA2.h b/Modules/_hacl/internal/Hacl_Hash_SHA2.h index 98498ee9376996..e6750207980aef 100644 --- a/Modules/_hacl/internal/Hacl_Hash_SHA2.h +++ b/Modules/_hacl/internal/Hacl_Hash_SHA2.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_SHA2_H -#define __internal_Hacl_Hash_SHA2_H +#ifndef internal_Hacl_Hash_SHA2_H +#define internal_Hacl_Hash_SHA2_H #if defined(__cplusplus) extern "C" { @@ -161,5 +161,5 @@ void Hacl_Hash_SHA2_sha384_finish(uint64_t *st, uint8_t *h); } #endif -#define __internal_Hacl_Hash_SHA2_H_DEFINED -#endif +#define internal_Hacl_Hash_SHA2_H_DEFINED +#endif /* internal_Hacl_Hash_SHA2_H */ diff --git a/Modules/_hacl/internal/Hacl_Hash_SHA3.h b/Modules/_hacl/internal/Hacl_Hash_SHA3.h index e653c73b1d03f7..c08a4e7858bbab 100644 --- a/Modules/_hacl/internal/Hacl_Hash_SHA3.h +++ b/Modules/_hacl/internal/Hacl_Hash_SHA3.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Hash_SHA3_H -#define __internal_Hacl_Hash_SHA3_H +#ifndef internal_Hacl_Hash_SHA3_H +#define internal_Hacl_Hash_SHA3_H #if defined(__cplusplus) extern "C" { @@ -81,5 +81,5 @@ Hacl_Hash_SHA3_state_t; } #endif -#define __internal_Hacl_Hash_SHA3_H_DEFINED -#endif +#define internal_Hacl_Hash_SHA3_H_DEFINED +#endif /* internal_Hacl_Hash_SHA3_H */ diff --git a/Modules/_hacl/internal/Hacl_Impl_Blake2_Constants.h b/Modules/_hacl/internal/Hacl_Impl_Blake2_Constants.h index fb3a045cd5c608..2726cc484780e8 100644 --- a/Modules/_hacl/internal/Hacl_Impl_Blake2_Constants.h +++ b/Modules/_hacl/internal/Hacl_Impl_Blake2_Constants.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Impl_Blake2_Constants_H -#define __internal_Hacl_Impl_Blake2_Constants_H +#ifndef internal_Hacl_Impl_Blake2_Constants_H +#define internal_Hacl_Impl_Blake2_Constants_H #if defined(__cplusplus) extern "C" { @@ -69,5 +69,5 @@ Hacl_Hash_Blake2b_ivTable_B[8U] = } #endif -#define __internal_Hacl_Impl_Blake2_Constants_H_DEFINED -#endif +#define internal_Hacl_Impl_Blake2_Constants_H_DEFINED +#endif /* internal_Hacl_Impl_Blake2_Constants_H */ diff --git a/Modules/_hacl/internal/Hacl_Streaming_HMAC.h b/Modules/_hacl/internal/Hacl_Streaming_HMAC.h index acc4f3996026ee..fb44f707463e04 100644 --- a/Modules/_hacl/internal/Hacl_Streaming_HMAC.h +++ b/Modules/_hacl/internal/Hacl_Streaming_HMAC.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Streaming_HMAC_H -#define __internal_Hacl_Streaming_HMAC_H +#ifndef internal_Hacl_Streaming_HMAC_H +#define internal_Hacl_Streaming_HMAC_H #if defined(__cplusplus) extern "C" { @@ -90,5 +90,5 @@ Hacl_Streaming_HMAC_agile_state; } #endif -#define __internal_Hacl_Streaming_HMAC_H_DEFINED -#endif +#define internal_Hacl_Streaming_HMAC_H_DEFINED +#endif /* internal_Hacl_Streaming_HMAC_H */ diff --git a/Modules/_hacl/internal/Hacl_Streaming_Types.h b/Modules/_hacl/internal/Hacl_Streaming_Types.h index fed3cbd425917c..d6c4fc0d6255f7 100644 --- a/Modules/_hacl/internal/Hacl_Streaming_Types.h +++ b/Modules/_hacl/internal/Hacl_Streaming_Types.h @@ -23,8 +23,8 @@ */ -#ifndef __internal_Hacl_Streaming_Types_H -#define __internal_Hacl_Streaming_Types_H +#ifndef internal_Hacl_Streaming_Types_H +#define internal_Hacl_Streaming_Types_H #if defined(__cplusplus) extern "C" { @@ -83,5 +83,5 @@ Hacl_Streaming_MD_state_64; } #endif -#define __internal_Hacl_Streaming_Types_H_DEFINED -#endif +#define internal_Hacl_Streaming_Types_H_DEFINED +#endif /* internal_Hacl_Streaming_Types_H */ diff --git a/Modules/_hacl/refresh.sh b/Modules/_hacl/refresh.sh index a6776282423b95..72ceb27b7f70e8 100755 --- a/Modules/_hacl/refresh.sh +++ b/Modules/_hacl/refresh.sh @@ -22,7 +22,7 @@ fi # Update this when updating to a new version after verifying that the changes # the update brings in are good. -expected_hacl_star_rev=4ef25b547b377dcef855db4289c6a00580e7221c +expected_hacl_star_rev=8ba599b2f6c9701b3dc961db895b0856a2210f76 hacl_dir="$(realpath "$1")" cd "$(dirname "$0")" From 5513f6a99d3dc05b93f92c740484a607ef7c0cbf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 17 Oct 2025 06:25:14 +0200 Subject: [PATCH 1191/1674] [3.14] gh-131788: make resource_tracker re-entrant safe (GH-131787) (#137737) gh-131788: make resource_tracker re-entrant safe (GH-131787) * make resource_tracker re-entrant safe * Update Lib/multiprocessing/resource_tracker.py * trim trailing whitespace * use f-string and args = [x, *y, z] * raise self._reentrant_call_error --------- (cherry picked from commit f24a012350f71141648cbd61081a25a458dd7fff) Co-authored-by: Thomas Grainger Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Gregory P. Smith Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/multiprocessing/resource_tracker.py | 163 ++++++++++-------- ...-03-27-08-13-32.gh-issue-131788.0RWiFc.rst | 1 + 2 files changed, 94 insertions(+), 70 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index c4d0ca81e7034a..c53092f6e34b32 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -20,6 +20,7 @@ import sys import threading import warnings +from collections import deque from . import spawn from . import util @@ -62,6 +63,7 @@ def __init__(self): self._fd = None self._pid = None self._exitcode = None + self._reentrant_messages = deque() def _reentrant_call_error(self): # gh-109629: this happens if an explicit call to the ResourceTracker @@ -98,7 +100,7 @@ def _stop_locked( # This shouldn't happen (it might when called by a finalizer) # so we check for it anyway. if self._lock._recursion_count() > 1: - return self._reentrant_call_error() + raise self._reentrant_call_error() if self._fd is None: # not running return @@ -128,69 +130,99 @@ def ensure_running(self): This can be run from any process. Usually a child process will use the resource created by its parent.''' + return self._ensure_running_and_write() + + def _teardown_dead_process(self): + os.close(self._fd) + + # Clean-up to avoid dangling processes. + try: + # _pid can be None if this process is a child from another + # python process, which has started the resource_tracker. + if self._pid is not None: + os.waitpid(self._pid, 0) + except ChildProcessError: + # The resource_tracker has already been terminated. + pass + self._fd = None + self._pid = None + self._exitcode = None + + warnings.warn('resource_tracker: process died unexpectedly, ' + 'relaunching. Some resources might leak.') + + def _launch(self): + fds_to_pass = [] + try: + fds_to_pass.append(sys.stderr.fileno()) + except Exception: + pass + r, w = os.pipe() + try: + fds_to_pass.append(r) + # process will out live us, so no need to wait on pid + exe = spawn.get_executable() + args = [ + exe, + *util._args_from_interpreter_flags(), + '-c', + f'from multiprocessing.resource_tracker import main;main({r})', + ] + # bpo-33613: Register a signal mask that will block the signals. + # This signal mask will be inherited by the child that is going + # to be spawned and will protect the child from a race condition + # that can make the child die before it registers signal handlers + # for SIGINT and SIGTERM. The mask is unregistered after spawning + # the child. + prev_sigmask = None + try: + if _HAVE_SIGMASK: + prev_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS) + pid = util.spawnv_passfds(exe, args, fds_to_pass) + finally: + if prev_sigmask is not None: + signal.pthread_sigmask(signal.SIG_SETMASK, prev_sigmask) + except: + os.close(w) + raise + else: + self._fd = w + self._pid = pid + finally: + os.close(r) + + def _ensure_running_and_write(self, msg=None): 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 msg is None: + raise self._reentrant_call_error() + return self._reentrant_messages.append(msg) + if self._fd is not None: # resource tracker was launched before, is it still running? - if self._check_alive(): - # => still alive - return - # => dead, launch it again - os.close(self._fd) - - # Clean-up to avoid dangling processes. + if msg is None: + to_send = b'PROBE:0:noop\n' + else: + to_send = msg try: - # _pid can be None if this process is a child from another - # python process, which has started the resource_tracker. - if self._pid is not None: - os.waitpid(self._pid, 0) - except ChildProcessError: - # The resource_tracker has already been terminated. - pass - self._fd = None - self._pid = None - self._exitcode = None + self._write(to_send) + except OSError: + self._teardown_dead_process() + self._launch() - warnings.warn('resource_tracker: process died unexpectedly, ' - 'relaunching. Some resources might leak.') + msg = None # message was sent in probe + else: + self._launch() - fds_to_pass = [] + while True: try: - fds_to_pass.append(sys.stderr.fileno()) - except Exception: - pass - cmd = 'from multiprocessing.resource_tracker import main;main(%d)' - r, w = os.pipe() - try: - fds_to_pass.append(r) - # process will out live us, so no need to wait on pid - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() - args += ['-c', cmd % r] - # bpo-33613: Register a signal mask that will block the signals. - # This signal mask will be inherited by the child that is going - # to be spawned and will protect the child from a race condition - # that can make the child die before it registers signal handlers - # for SIGINT and SIGTERM. The mask is unregistered after spawning - # the child. - prev_sigmask = None - try: - if _HAVE_SIGMASK: - prev_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS) - pid = util.spawnv_passfds(exe, args, fds_to_pass) - finally: - if prev_sigmask is not None: - signal.pthread_sigmask(signal.SIG_SETMASK, prev_sigmask) - except: - os.close(w) - raise - else: - self._fd = w - self._pid = pid - finally: - os.close(r) + reentrant_msg = self._reentrant_messages.popleft() + except IndexError: + break + self._write(reentrant_msg) + if msg is not None: + self._write(msg) def _check_alive(self): '''Check that the pipe has not been closed by sending a probe.''' @@ -211,27 +243,18 @@ def unregister(self, name, rtype): '''Unregister name of resource with resource tracker.''' self._send('UNREGISTER', name, rtype) + def _write(self, msg): + nbytes = os.write(self._fd, msg) + assert nbytes == len(msg), f"{nbytes=} != {len(msg)=}" + def _send(self, cmd, name, rtype): - 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') + msg = f"{cmd}:{name}:{rtype}\n".encode("ascii") if len(msg) > 512: # posix guarantees that writes to a pipe of less than PIPE_BUF # bytes are atomic, and that PIPE_BUF >= 512 raise ValueError('msg too long') - nbytes = os.write(self._fd, msg) - assert nbytes == len(msg), "nbytes {0:n} but len(msg) {1:n}".format( - nbytes, len(msg)) + self._ensure_running_and_write(msg) _resource_tracker = ResourceTracker() ensure_running = _resource_tracker.ensure_running diff --git a/Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst b/Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst new file mode 100644 index 00000000000000..525802405bd8bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst @@ -0,0 +1 @@ +Make ``ResourceTracker.send`` from :mod:`multiprocessing` re-entrant safe From 889e9184bfab7c46546d338e1b212121b3f88169 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 17 Oct 2025 13:48:03 +0200 Subject: [PATCH 1192/1674] [3.14] gh-135801: Add tests for filtering warnings by module (GH-140240) (GH-140246) (cherry picked from commit fbf0843e39e01ec8a8295f6475065b08053f13dd) Co-authored-by: Serhiy Storchaka --- Lib/test/test_warnings/__init__.py | 79 ++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index f495f0fcb0f97f..4c3c715a8fbf0a 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -241,6 +241,85 @@ def test_once(self): 42) self.assertEqual(len(w), 0) + def test_filter_module(self): + MS_WINDOWS = (sys.platform == 'win32') + with self.module.catch_warnings(record=True) as w: + self.module.simplefilter('error') + self.module.filterwarnings('always', module=r'package\.module\z') + self.module.warn_explicit('msg', UserWarning, 'filename', 42, + module='package.module') + self.assertEqual(len(w), 1) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, '/path/to/package/module', 42) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, '/path/to/package/module.py', 42) + + with self.module.catch_warnings(record=True) as w: + self.module.simplefilter('error') + self.module.filterwarnings('always', module='package') + self.module.warn_explicit('msg', UserWarning, 'filename', 42, + module='package.module') + self.assertEqual(len(w), 1) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, 'filename', 42, + module='other.package.module') + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, '/path/to/otherpackage/module.py', 42) + + with self.module.catch_warnings(record=True) as w: + self.module.simplefilter('error') + self.module.filterwarnings('always', module=r'/path/to/package/module\z') + self.module.warn_explicit('msg', UserWarning, '/path/to/package/module', 42) + self.assertEqual(len(w), 1) + self.module.warn_explicit('msg', UserWarning, '/path/to/package/module.py', 42) + self.assertEqual(len(w), 2) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, '/PATH/TO/PACKAGE/MODULE', 42) + if MS_WINDOWS: + if self.module is py_warnings: + self.module.warn_explicit('msg', UserWarning, r'/path/to/package/module.PY', 42) + self.assertEqual(len(w), 3) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'/path/to/package/module/__init__.py', 42) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'/path/to/package/module.pyw', 42) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'\path\to\package\module', 42) + + with self.module.catch_warnings(record=True) as w: + self.module.simplefilter('error') + self.module.filterwarnings('always', module=r'/path/to/package/__init__\z') + self.module.warn_explicit('msg', UserWarning, '/path/to/package/__init__.py', 42) + self.assertEqual(len(w), 1) + self.module.warn_explicit('msg', UserWarning, '/path/to/package/__init__', 42) + self.assertEqual(len(w), 2) + + if MS_WINDOWS: + with self.module.catch_warnings(record=True) as w: + self.module.simplefilter('error') + self.module.filterwarnings('always', module=r'C:\\path\\to\\package\\module\z') + self.module.warn_explicit('msg', UserWarning, r'C:\path\to\package\module', 42) + self.assertEqual(len(w), 1) + self.module.warn_explicit('msg', UserWarning, r'C:\path\to\package\module.py', 42) + self.assertEqual(len(w), 2) + if self.module is py_warnings: + self.module.warn_explicit('msg', UserWarning, r'C:\path\to\package\module.PY', 42) + self.assertEqual(len(w), 3) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'C:\path\to\package\module.pyw', 42) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'C:\PATH\TO\PACKAGE\MODULE', 42) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'C:/path/to/package/module', 42) + with self.assertRaises(UserWarning): + self.module.warn_explicit('msg', UserWarning, r'C:\path\to\package\module\__init__.py', 42) + + with self.module.catch_warnings(record=True) as w: + self.module.simplefilter('error') + self.module.filterwarnings('always', module=r'\z') + self.module.warn_explicit('msg', UserWarning, '', 42) + self.assertEqual(len(w), 1) + def test_module_globals(self): with self.module.catch_warnings(record=True) as w: self.module.simplefilter("always", UserWarning) From e07b78c01a57c5921614388e287c584d19a3e40c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 17 Oct 2025 17:29:15 +0200 Subject: [PATCH 1193/1674] [3.14] gh-116738: test `uuid` module thread safety in free-threading (GH-140068) (#140229) gh-116738: test `uuid` module thread safety in free-threading (GH-140068) (cherry picked from commit 9a87ce8b57f5d698900d84b4f6f5aa47b5f37a89) Co-authored-by: Alper --- Lib/test/test_free_threading/test_uuid.py | 60 +++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 Lib/test/test_free_threading/test_uuid.py diff --git a/Lib/test/test_free_threading/test_uuid.py b/Lib/test/test_free_threading/test_uuid.py new file mode 100755 index 00000000000000..d794afc552a652 --- /dev/null +++ b/Lib/test/test_free_threading/test_uuid.py @@ -0,0 +1,60 @@ +import os +import unittest + +from test.support import import_helper, threading_helper +from test.support.threading_helper import run_concurrently +from uuid import SafeUUID + +c_uuid = import_helper.import_module("_uuid") + +NTHREADS = 10 +UUID_PER_THREAD = 1000 + + +@threading_helper.requires_working_threading() +class UUIDTests(unittest.TestCase): + @unittest.skipUnless(os.name == "posix", "POSIX only") + def test_generate_time_safe(self): + uuids = [] + + def worker(): + local_uuids = [] + for _ in range(UUID_PER_THREAD): + uuid, is_safe = c_uuid.generate_time_safe() + self.assertIs(type(uuid), bytes) + self.assertEqual(len(uuid), 16) + # Collect the UUID only if it is safe. If not, we cannot ensure + # UUID uniqueness. According to uuid_generate_time_safe() man + # page, it is theoretically possible for two concurrently + # running processes to generate the same UUID(s) if the return + # value is not 0. + if is_safe == SafeUUID.safe: + local_uuids.append(uuid) + + # Merge all safe uuids + uuids.extend(local_uuids) + + run_concurrently(worker_func=worker, nthreads=NTHREADS) + self.assertEqual(len(uuids), len(set(uuids))) + + @unittest.skipUnless(os.name == "nt", "Windows only") + def test_UuidCreate(self): + uuids = [] + + def worker(): + local_uuids = [] + for _ in range(UUID_PER_THREAD): + uuid = c_uuid.UuidCreate() + self.assertIs(type(uuid), bytes) + self.assertEqual(len(uuid), 16) + local_uuids.append(uuid) + + # Merge all uuids + uuids.extend(local_uuids) + + run_concurrently(worker_func=worker, nthreads=NTHREADS) + self.assertEqual(len(uuids), len(set(uuids))) + + +if __name__ == "__main__": + unittest.main() From f59236b746b8cab8eb06a1c9fcd6c8ad9b6a93d1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 00:23:01 +0200 Subject: [PATCH 1194/1674] [3.14] GH-133789: Fix unpickling of pathlib objects pickled in Python 3.13 (GH-133831) (#140276) GH-133789: Fix unpickling of pathlib objects pickled in Python 3.13 (GH-133831) In Python 3.13 (but not 3.12 or 3.14), pathlib classes are defined in `pathlib._local` rather than `pathlib`. In hindsight this was a mistake, but it was difficult to predict how the abstract/local split would pan out. In this patch we re-introduce `pathlib._local` as a stub module that re-exports the classes from `pathlib`. This allows path objects pickled in 3.13 to be unpicked in 3.14+ (cherry picked from commit f4e51f253ad6c27583438f6182c33cf368bfa45f) Co-authored-by: Barney Gale --- Lib/pathlib/_local.py | 12 ++++++++++++ Lib/test/test_pathlib/test_pathlib.py | 6 ++++++ .../2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst | 1 + 3 files changed, 19 insertions(+) create mode 100644 Lib/pathlib/_local.py create mode 100644 Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst diff --git a/Lib/pathlib/_local.py b/Lib/pathlib/_local.py new file mode 100644 index 00000000000000..58e137f2a92d3b --- /dev/null +++ b/Lib/pathlib/_local.py @@ -0,0 +1,12 @@ +""" +This module exists so that pathlib objects pickled under Python 3.13 can be +unpickled in 3.14+. +""" + +from pathlib import * + +__all__ = [ + "UnsupportedOperation", + "PurePath", "PurePosixPath", "PureWindowsPath", + "Path", "PosixPath", "WindowsPath", +] diff --git a/Lib/test/test_pathlib/test_pathlib.py b/Lib/test/test_pathlib/test_pathlib.py index 177646724b0731..a1ea69a6b906e8 100644 --- a/Lib/test/test_pathlib/test_pathlib.py +++ b/Lib/test/test_pathlib/test_pathlib.py @@ -293,6 +293,12 @@ def test_pickling_common(self): self.assertEqual(hash(pp), hash(p)) self.assertEqual(str(pp), str(p)) + def test_unpicking_3_13(self): + data = (b"\x80\x04\x95'\x00\x00\x00\x00\x00\x00\x00\x8c\x0e" + b"pathlib._local\x94\x8c\rPurePosixPath\x94\x93\x94)R\x94.") + p = pickle.loads(data) + self.assertIsInstance(p, pathlib.PurePosixPath) + def test_repr_common(self): for pathstr in ('a', 'a/b', 'a/b/c', '/', '/a/b', '/a/b/c'): with self.subTest(pathstr=pathstr): diff --git a/Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst b/Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst new file mode 100644 index 00000000000000..d2a4f7f42c3b38 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst @@ -0,0 +1 @@ +Fix unpickling of :mod:`pathlib` objects that were pickled in Python 3.13. From 128f48fd2dc47d7e17f50cb872e7e2fd19f7babb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 12:17:42 +0200 Subject: [PATCH 1195/1674] [3.14] gh-140272: Fix memory leak in _gdbm.gdbm.clear() (GH-140274) (GH-140285) (cherry picked from commit f937468e7c88c768a28ff4e653da051ffa30d86c) Co-authored-by: Shamil --- .../2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst | 1 + Modules/_gdbmmodule.c | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst new file mode 100644 index 00000000000000..666a45055f5a58 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst @@ -0,0 +1 @@ +Fix memory leak in the :meth:`!clear` method of the :mod:`dbm.gnu` database. diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index 9c402e20e513b9..ce8696d9225e72 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -678,8 +678,10 @@ _gdbm_gdbm_clear_impl(gdbmobject *self, PyTypeObject *cls) } if (gdbm_delete(self->di_dbm, key) < 0) { PyErr_SetString(state->gdbm_error, "cannot delete item from database"); + free(key.dptr); return NULL; } + free(key.dptr); } Py_RETURN_NONE; } From b2d3957511c4812e5238585983d27f61558b700d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 13:00:28 +0200 Subject: [PATCH 1196/1674] [3.14] Move the NEWS entry for gh-140272 to the correct place (GH-140290) (GH-140291) (cherry picked from commit 936de256a9542c58da72a8986658bb307b2f2175) Co-authored-by: Serhiy Storchaka --- .../2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Misc/NEWS.d/next/{Core_and_Builtins => Library}/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst (100%) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst b/Misc/NEWS.d/next/Library/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst similarity index 100% rename from Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst rename to Misc/NEWS.d/next/Library/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst From c70f409da05de4e9ad36dfd529650d9b8573000b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 13:02:09 +0200 Subject: [PATCH 1197/1674] [3.14] gh-140241: Fix documentation for the registry parameter of warnings.warn_explicit() (GH-140242) (GH-140292) (cherry picked from commit 78e1d65a4d656e783bc28a02e113f59e4323e41a) Co-authored-by: Serhiy Storchaka Co-authored-by: Petr Viktorin --- Doc/library/warnings.rst | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index 006d45b1bc72a4..15b62a0653d73d 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -476,14 +476,21 @@ Available Functions .. function:: warn_explicit(message, category, filename, lineno, module=None, registry=None, module_globals=None, source=None) This is a low-level interface to the functionality of :func:`warn`, passing in - explicitly the message, category, filename and line number, and optionally the - module name and the registry (which should be the ``__warningregistry__`` - dictionary of the module). The module name defaults to the filename with - ``.py`` stripped; if no registry is passed, the warning is never suppressed. + explicitly the message, category, filename and line number, and optionally + other arguments. *message* must be a string and *category* a subclass of :exc:`Warning` or *message* may be a :exc:`Warning` instance, in which case *category* will be ignored. + *module*, if supplied, should be the module name. + If no module is passed, the filename with ``.py`` stripped is used. + + *registry*, if supplied, should be the ``__warningregistry__`` dictionary + of the module. + If no registry is passed, each warning is treated as the first occurrence, + that is, filter actions ``"default"``, ``"module"`` and ``"once"`` are + handled as ``"always"``. + *module_globals*, if supplied, should be the global namespace in use by the code for which the warning is issued. (This argument is used to support displaying source for modules found in zipfiles or other non-filesystem import From 3ca7ea1f8fd593296106346b4dea06f126638aba Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 13:28:53 +0200 Subject: [PATCH 1198/1674] [3.14] gh-140257: fix data race on eval_breaker during finalization (GH-140265) (#140294) gh-140257: fix data race on eval_breaker during finalization (GH-140265) (cherry picked from commit c8729c9909e150989050ce2a435d018955bea41d) Co-authored-by: Shamil --- .../2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst | 2 ++ Python/pystate.c | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst new file mode 100644 index 00000000000000..50f7e0e48ae369 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst @@ -0,0 +1,2 @@ +Fix data race between interpreter_clear() and take_gil() on eval_breaker +during finalization with daemon threads. diff --git a/Python/pystate.c b/Python/pystate.c index 6859dbc9a7f469..9f6e961e71ae9f 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -860,10 +860,11 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) Py_CLEAR(interp->audit_hooks); - // At this time, all the threads should be cleared so we don't need atomic - // operations for instrumentation_version or eval_breaker. + // gh-140257: Threads have already been cleared, but daemon threads may + // still access eval_breaker atomically via take_gil() right before they + // hang. Use an atomic store to prevent data races during finalization. interp->ceval.instrumentation_version = 0; - tstate->eval_breaker = 0; + _Py_atomic_store_uintptr(&tstate->eval_breaker, 0); for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) { interp->monitors.tools[i] = 0; From 1d11627ba555a365c820e1e1535a42a4f4fbd4c6 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 18 Oct 2025 19:40:43 +0530 Subject: [PATCH 1199/1674] [3.14] gh-140067: Fix memory leak in sub-interpreter creation (GH-140111) (#140118) * [3.14] gh-140067: Fix memory leak in sub-interpreter creation (GH-140111) Fix memory leak in sub-interpreter creation caused by overwriting of the previously used `_malloced` field. Now the pointer is stored in the first word of the memory block to avoid it being overwritten accidentally. (cherry picked from commit 59547a251f7069dc6e08cb6082dd21872671e381) Co-authored-by: Shamil Co-authored-by: Kumar Aditya --- Include/internal/pycore_interp_structs.h | 5 +---- Lib/test/test_threading.py | 1 + ...2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst | 1 + Python/pystate.c | 15 +++++++++------ 4 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index d1f916fa7f727c..15885b5f228c8b 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -768,10 +768,7 @@ struct _is { * and should be placed at the beginning. */ struct _ceval_state ceval; - /* This structure is carefully allocated so that it's correctly aligned - * to avoid undefined behaviors during LOAD and STORE. The '_malloced' - * field stores the allocated pointer address that will later be freed. - */ + // unused, kept for ABI compatibility void *_malloced; PyInterpreterState *next; diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 59db91b0ffce5e..bb51ddd38e2cad 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1727,6 +1727,7 @@ def task(): self.assertEqual(os.read(r_interp, 1), DONE) @cpython_only + @support.skip_if_sanitizer(thread=True, memory=True) def test_daemon_threads_fatal_error(self): import_module("_testcapi") subinterp_code = f"""if 1: diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst new file mode 100644 index 00000000000000..3c5a828101d9a8 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst @@ -0,0 +1 @@ +Fix memory leak in sub-interpreter creation. diff --git a/Python/pystate.c b/Python/pystate.c index 9f6e961e71ae9f..7f365ea50cab7d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -565,16 +565,19 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) static PyInterpreterState * alloc_interpreter(void) { + // Aligned allocation for PyInterpreterState. + // the first word of the memory block is used to store + // the original pointer to be used later to free the memory. size_t alignment = _Alignof(PyInterpreterState); - size_t allocsize = sizeof(PyInterpreterState) + alignment - 1; + size_t allocsize = sizeof(PyInterpreterState) + sizeof(void *) + alignment - 1; void *mem = PyMem_RawCalloc(1, allocsize); if (mem == NULL) { return NULL; } - PyInterpreterState *interp = _Py_ALIGN_UP(mem, alignment); - assert(_Py_IS_ALIGNED(interp, alignment)); - interp->_malloced = mem; - return interp; + void *ptr = _Py_ALIGN_UP((char *)mem + sizeof(void *), alignment); + ((void **)ptr)[-1] = mem; + assert(_Py_IS_ALIGNED(ptr, alignment)); + return ptr; } static void @@ -589,7 +592,7 @@ free_interpreter(PyInterpreterState *interp) interp->obmalloc = NULL; } assert(_Py_IS_ALIGNED(interp, _Alignof(PyInterpreterState))); - PyMem_RawFree(interp->_malloced); + PyMem_RawFree(((void **)interp)[-1]); } } From 7be317fea616fdeefd1f5de9fe7f4155ec5f9882 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:59:37 +0200 Subject: [PATCH 1200/1674] [3.14] gh-128571: Document UTF-16/32 native byte order (GH-139974) (#140309) Closes GH-128571 (cherry picked from commit 920de7ccdcfa7284b6d23a124771b17c66dd3e4f) Co-authored-by: Parham MohammadAlizadeh Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/codecs.rst | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 5932012c535b56..24b5a9d64b2cd2 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -982,17 +982,22 @@ defined in Unicode. A simple and straightforward way that can store each Unicode code point, is to store each code point as four consecutive bytes. There are two possibilities: store the bytes in big endian or in little endian order. These two encodings are called ``UTF-32-BE`` and ``UTF-32-LE`` respectively. Their -disadvantage is that if e.g. you use ``UTF-32-BE`` on a little endian machine you -will always have to swap bytes on encoding and decoding. ``UTF-32`` avoids this -problem: bytes will always be in natural endianness. When these bytes are read -by a CPU with a different endianness, then bytes have to be swapped though. To -be able to detect the endianness of a ``UTF-16`` or ``UTF-32`` byte sequence, -there's the so called BOM ("Byte Order Mark"). This is the Unicode character -``U+FEFF``. This character can be prepended to every ``UTF-16`` or ``UTF-32`` -byte sequence. The byte swapped version of this character (``0xFFFE``) is an -illegal character that may not appear in a Unicode text. So when the -first character in a ``UTF-16`` or ``UTF-32`` byte sequence -appears to be a ``U+FFFE`` the bytes have to be swapped on decoding. +disadvantage is that if, for example, you use ``UTF-32-BE`` on a little endian +machine you will always have to swap bytes on encoding and decoding. +Python's ``UTF-16`` and ``UTF-32`` codecs avoid this problem by using the +platform's native byte order when no BOM is present. +Python follows prevailing platform +practice, so native-endian data round-trips without redundant byte swapping, +even though the Unicode Standard defaults to big-endian when the byte order is +unspecified. When these bytes are read by a CPU with a different endianness, +the bytes have to be swapped. To be able to detect the endianness of a +``UTF-16`` or ``UTF-32`` byte sequence, a BOM ("Byte Order Mark") is used. +This is the Unicode character ``U+FEFF``. This character can be prepended to every +``UTF-16`` or ``UTF-32`` byte sequence. The byte swapped version of this character +(``0xFFFE``) is an illegal character that may not appear in a Unicode text. +When the first character of a ``UTF-16`` or ``UTF-32`` byte sequence is +``U+FFFE``, the bytes have to be swapped on decoding. + Unfortunately the character ``U+FEFF`` had a second purpose as a ``ZERO WIDTH NO-BREAK SPACE``: a character that has no width and doesn't allow a word to be split. It can e.g. be used to give hints to a ligature algorithm. From a4b977cfe258bbc93373cf5c26a899d8e91e2653 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 19 Oct 2025 05:52:59 +0200 Subject: [PATCH 1201/1674] [3.14] gh-138997: Remove false justify `fill` option from Tkinter docs (GH-139023) (#140319) gh-138997: Remove false justify `fill` option from Tkinter docs (GH-139023) (cherry picked from commit 115a04b80259ac3116571eb601c5efc51004e90c) Co-authored-by: Marat Khagazheev Co-authored-by: marat --- Doc/library/tkinter.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index be26af02bcee0d..22e08c45d01ef9 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -839,8 +839,7 @@ geometry For example: ``fred["geometry"] = "200x100"``. justify - Legal values are the strings: ``"left"``, ``"center"``, ``"right"``, and - ``"fill"``. + Legal values are the strings: ``"left"``, ``"center"``, and ``"right"``. region This is a string with four space-delimited elements, each of which is a legal From 69d263cfe1ecbbf957a1f05a23cbea70a3bf6582 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 19 Oct 2025 10:49:48 +0200 Subject: [PATCH 1202/1674] [3.14] `Lib/idlelib/idle_test/__init__.py`: remove commented out duplicate code (GH-140259) (#140322) `Lib/idlelib/idle_test/__init__.py`: remove commented out duplicate code (GH-140259) (cherry picked from commit 790cdae5a0295586a55f00a57ed24a86b83928dc) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/idlelib/idle_test/__init__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Lib/idlelib/idle_test/__init__.py b/Lib/idlelib/idle_test/__init__.py index 79b5d102dd7da5..8eed2699c41211 100644 --- a/Lib/idlelib/idle_test/__init__.py +++ b/Lib/idlelib/idle_test/__init__.py @@ -20,8 +20,4 @@ def load_tests(loader, standard_tests, pattern): pattern='test_*.py', # Insert here. top_level_dir=top_dir) standard_tests.addTests(module_tests) -## module_tests = loader.discover(start_dir=this_dir, -## pattern='test_*.py', # Insert here. -## top_level_dir=top_dir) -## standard_tests.addTests(module_tests) return standard_tests From 9ff705c6c59a7561b065639ebb07f3341083e869 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 19 Oct 2025 21:16:33 +0200 Subject: [PATCH 1203/1674] [3.14] gh-63161: Fix PEP 263 support (GH-139481) (GH-139898) * Support non-UTF-8 shebang and comments if non-UTF-8 encoding is specified. * Detect decoding error in comments for UTF-8 encoding. * Include the decoding error position for default encoding in SyntaxError. (cherry picked from commit 5c942f11cdf5f9d7313200983fa0c58b3bc670a2) Co-authored-by: Serhiy Storchaka --- Lib/test/test_exceptions.py | 8 +- Lib/test/test_source_encoding.py | 124 ++++++++++++++++-- ...5-10-01-18-21-19.gh-issue-63161.ef1S6N.rst | 5 + Parser/pegen_errors.c | 8 ++ Parser/tokenizer/file_tokenizer.c | 49 +++++-- Parser/tokenizer/helpers.c | 53 +++++--- Parser/tokenizer/helpers.h | 2 +- Parser/tokenizer/readline_tokenizer.c | 2 +- Parser/tokenizer/string_tokenizer.c | 6 + 9 files changed, 211 insertions(+), 46 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 57d0656487d4db..273f73937183b8 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -224,6 +224,8 @@ def check(self, src, lineno, offset, end_lineno=None, end_offset=None, encoding= if not isinstance(src, str): src = src.decode(encoding, 'replace') line = src.split('\n')[lineno-1] + if lineno == 1: + line = line.removeprefix('\ufeff') self.assertIn(line, cm.exception.text) def test_error_offset_continuation_characters(self): @@ -239,7 +241,9 @@ def testSyntaxErrorOffset(self): check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20) check(b'# -*- coding: cp1251 -*-\nPython = "\xcf\xb3\xf2\xee\xed" +', 2, 19, encoding='cp1251') - check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 10) + check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 12) + check(b'\n\n\nPython = "\xcf\xb3\xf2\xee\xed" +', 4, 12) + check(b'\xef\xbb\xbfPython = "\xcf\xb3\xf2\xee\xed" +', 1, 12) check('x = "a', 1, 5) check('lambda x: x = 2', 1, 1) check('f{a + b + c}', 1, 2) @@ -287,7 +291,7 @@ def baz(): check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4) check("(1+)", 1, 4) check("[interesting\nfoo()\n", 1, 1) - check(b"\xef\xbb\xbf#coding: utf8\nprint('\xe6\x88\x91')\n", 0, -1) + check(b"\xef\xbb\xbf#coding: utf8\nprint('\xe6\x88\x91')\n", 1, 0) check("""f''' { (123_a) diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py index 5df40782382120..a285fc2ceef24e 100644 --- a/Lib/test/test_source_encoding.py +++ b/Lib/test/test_source_encoding.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- import unittest -from test.support import script_helper, captured_stdout, requires_subprocess, requires_resource +from test import support +from test.support import script_helper from test.support.os_helper import TESTFN, unlink, rmtree from test.support.import_helper import unload import importlib @@ -64,7 +65,7 @@ def test_issue7820(self): # two bytes in common with the UTF-8 BOM self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20') - @requires_subprocess() + @support.requires_subprocess() def test_20731(self): sub = subprocess.Popen([sys.executable, os.path.join(os.path.dirname(__file__), @@ -267,6 +268,17 @@ def test_second_non_utf8_coding_line(self): b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xc3\u20ac'") + def test_first_utf8_coding_line_error(self): + src = (b'#coding:ascii \xc3\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, br"(\(unicode error\) )?'ascii' codec can't decode byte") + + def test_second_utf8_coding_line_error(self): + src = (b'#!/usr/bin/python\n' + b'#coding:ascii \xc3\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, br"(\(unicode error\) )?'ascii' codec can't decode byte") + def test_utf8_bom(self): src = (b'\xef\xbb\xbfprint(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xe4'") @@ -282,10 +294,80 @@ def test_utf8_bom_and_utf8_coding_line(self): b'print(ascii("\xc3\xa4"))\n') self.check_script_output(src, br"'\xe4'") - def test_utf8_non_utf8_comment_line_error(self): + def test_utf8_bom_and_non_utf8_first_coding_line(self): + src = (b'\xef\xbb\xbf#coding:iso-8859-15\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"encoding problem: iso-8859-15 with BOM", + lineno=1) + + def test_utf8_bom_and_non_utf8_second_coding_line(self): + src = (b'\xef\xbb\xbf#first\n' + b'#coding:iso-8859-15\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"encoding problem: iso-8859-15 with BOM", + lineno=2) + + def test_non_utf8_shebang(self): + src = (b'#!/home/\xa4/bin/python\n' + b'#coding:iso-8859-15\n' + b'print(ascii("\xc3\xa4"))\n') + self.check_script_output(src, br"'\xc3\u20ac'") + + def test_utf8_shebang_error(self): + src = (b'#!/home/\xc3\xa4/bin/python\n' + b'#coding:ascii\n' + b'raise RuntimeError\n') + self.check_script_error(src, br"(\(unicode error\) )?'ascii' codec can't decode byte") + + def test_non_utf8_shebang_error(self): + src = (b'#!/home/\xa4/bin/python\n' + b'raise RuntimeError\n') + self.check_script_error(src, br"Non-UTF-8 code starting with .* on line 1", + lineno=1) + + def test_non_utf8_second_line_error(self): + src = (b'#first\n' + b'#second\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"Non-UTF-8 code starting with .* on line 2", + lineno=2) + + def test_non_utf8_third_line_error(self): + src = (b'#first\n' + b'#second\n' + b'#third\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"Non-UTF-8 code starting with .* on line 3", + lineno=3) + + def test_utf8_bom_non_utf8_third_line_error(self): + src = (b'\xef\xbb\xbf#first\n' + b'#second\n' + b'#third\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"Non-UTF-8 code starting with .* on line 3|" + br"'utf-8' codec can't decode byte", + lineno=3) + + def test_utf_8_non_utf8_third_line_error(self): + src = (b'#coding: utf-8\n' + b'#second\n' + b'#third\xa4\n' + b'raise RuntimeError\n') + self.check_script_error(src, + br"Non-UTF-8 code starting with .* on line 3|" + br"'utf-8' codec can't decode byte", + lineno=3) + + def test_utf8_non_utf8_third_line_error(self): src = (b'#coding: utf8\n' - b'#\n' - b'#\xa4\n' + b'#second\n' + b'#third\xa4\n' b'raise RuntimeError\n') self.check_script_error(src, br"'utf-8' codec can't decode byte|" @@ -326,7 +408,7 @@ def test_nul_in_second_coding_line(self): class UTF8ValidatorTest(unittest.TestCase): @unittest.skipIf(not sys.platform.startswith("linux"), "Too slow to run on non-Linux platforms") - @requires_resource('cpu') + @support.requires_resource('cpu') def test_invalid_utf8(self): # This is a port of test_utf8_decode_invalid_sequences in # test_unicode.py to exercise the separate utf8 validator in @@ -392,19 +474,29 @@ def check(content): check(b'\xF4'+cb+b'\xBF\xBF') +@support.force_not_colorized_test_class class BytesSourceEncodingTest(AbstractSourceEncodingTest, unittest.TestCase): def check_script_output(self, src, expected): - with captured_stdout() as stdout: + with support.captured_stdout() as stdout: exec(src) out = stdout.getvalue().encode('latin1') self.assertEqual(out.rstrip(), expected) - def check_script_error(self, src, expected): - with self.assertRaisesRegex(SyntaxError, expected.decode()) as cm: + def check_script_error(self, src, expected, lineno=...): + with self.assertRaises(SyntaxError) as cm: exec(src) + exc = cm.exception + self.assertRegex(str(exc), expected.decode()) + if lineno is not ...: + self.assertEqual(exc.lineno, lineno) + line = src.splitlines()[lineno-1].decode(errors='replace') + if lineno == 1: + line = line.removeprefix('\ufeff') + self.assertEqual(line, exc.text) +@support.force_not_colorized_test_class class FileSourceEncodingTest(AbstractSourceEncodingTest, unittest.TestCase): def check_script_output(self, src, expected): @@ -415,13 +507,23 @@ def check_script_output(self, src, expected): res = script_helper.assert_python_ok(fn) self.assertEqual(res.out.rstrip(), expected) - def check_script_error(self, src, expected): + def check_script_error(self, src, expected, lineno=...): with tempfile.TemporaryDirectory() as tmpd: fn = os.path.join(tmpd, 'test.py') with open(fn, 'wb') as fp: fp.write(src) res = script_helper.assert_python_failure(fn) - self.assertRegex(res.err.rstrip().splitlines()[-1], b'SyntaxError.*?' + expected) + err = res.err.rstrip() + self.assertRegex(err.splitlines()[-1], b'SyntaxError: ' + expected) + if lineno is not ...: + self.assertIn(f', line {lineno}\n'.encode(), + err.replace(os.linesep.encode(), b'\n')) + line = src.splitlines()[lineno-1].decode(errors='replace') + if lineno == 1: + line = line.removeprefix('\ufeff') + line = line.encode(sys.stderr.encoding, sys.stderr.errors) + self.assertIn(line, err) + if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst new file mode 100644 index 00000000000000..5eafe0813dc933 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst @@ -0,0 +1,5 @@ +Support non-UTF-8 shebang and comments in Python source files if non-UTF-8 +encoding is specified. Detect decoding error in comments for default (UTF-8) +encoding. Show the line and position of decoding error for default encoding +in a traceback. Show the line containing the coding cookie when it conflicts +with the BOM in a traceback. diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index f62b8695995617..0639a4e42436be 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -2,6 +2,7 @@ #include #include "pycore_pyerrors.h" // _PyErr_ProgramDecodedTextObject() +#include "pycore_runtime.h" // _Py_ID() #include "lexer/state.h" #include "lexer/lexer.h" #include "pegen.h" @@ -23,6 +24,13 @@ _PyPegen_raise_tokenizer_init_error(PyObject *filename) PyObject *value; PyObject *tback; PyErr_Fetch(&type, &value, &tback); + if (PyErr_GivenExceptionMatches(value, PyExc_SyntaxError)) { + if (PyObject_SetAttr(value, &_Py_ID(filename), filename)) { + goto error; + } + PyErr_Restore(type, value, tback); + return; + } errstr = PyObject_Str(value); if (!errstr) { goto error; diff --git a/Parser/tokenizer/file_tokenizer.c b/Parser/tokenizer/file_tokenizer.c index 01e473f58a0777..8c836a3f725829 100644 --- a/Parser/tokenizer/file_tokenizer.c +++ b/Parser/tokenizer/file_tokenizer.c @@ -282,10 +282,8 @@ tok_underflow_interactive(struct tok_state *tok) { } static int -tok_underflow_file(struct tok_state *tok) { - if (tok->start == NULL && !INSIDE_FSTRING(tok)) { - tok->cur = tok->inp = tok->buf; - } +tok_underflow_file(struct tok_state *tok) +{ if (tok->decoding_state == STATE_INIT) { /* We have not yet determined the encoding. If an encoding is found, use the file-pointer @@ -296,8 +294,16 @@ tok_underflow_file(struct tok_state *tok) { } assert(tok->decoding_state != STATE_INIT); } + int raw = tok->decoding_readline == NULL; + if (raw && tok->decoding_state != STATE_NORMAL) { + /* Keep the first line in the buffer to validate it later if + * the encoding has not yet been determined. */ + } + else if (tok->start == NULL && !INSIDE_FSTRING(tok)) { + tok->cur = tok->inp = tok->buf; + } /* Read until '\n' or EOF */ - if (tok->decoding_readline != NULL) { + if (!raw) { /* We already have a codec associated with this input. */ if (!tok_readline_recode(tok)) { return 0; @@ -328,20 +334,35 @@ tok_underflow_file(struct tok_state *tok) { ADVANCE_LINENO(); if (tok->decoding_state != STATE_NORMAL) { - if (tok->lineno > 2) { - tok->decoding_state = STATE_NORMAL; - } - else if (!_PyTokenizer_check_coding_spec(tok->cur, strlen(tok->cur), + if (!_PyTokenizer_check_coding_spec(tok->cur, strlen(tok->cur), tok, fp_setreadl)) { return 0; } + if (tok->lineno >= 2) { + tok->decoding_state = STATE_NORMAL; + } } - /* The default encoding is UTF-8, so make sure we don't have any - non-UTF-8 sequences in it. */ - if (!tok->encoding && !_PyTokenizer_ensure_utf8(tok->cur, tok)) { - _PyTokenizer_error_ret(tok); - return 0; + if (raw && tok->decoding_state == STATE_NORMAL) { + const char *line = tok->lineno <= 2 ? tok->buf : tok->cur; + int lineno = tok->lineno <= 2 ? 1 : tok->lineno; + if (!tok->encoding) { + /* The default encoding is UTF-8, so make sure we don't have any + non-UTF-8 sequences in it. */ + if (!_PyTokenizer_ensure_utf8(line, tok, lineno)) { + _PyTokenizer_error_ret(tok); + return 0; + } + } + else { + PyObject *tmp = PyUnicode_Decode(line, strlen(line), + tok->encoding, NULL); + if (tmp == NULL) { + _PyTokenizer_error_ret(tok); + return 0; + } + Py_DECREF(tmp); + } } assert(tok->done == E_OK); return tok->done == E_OK; diff --git a/Parser/tokenizer/helpers.c b/Parser/tokenizer/helpers.c index 5a416adb875aa1..e5e2eed2d34aee 100644 --- a/Parser/tokenizer/helpers.c +++ b/Parser/tokenizer/helpers.c @@ -47,8 +47,10 @@ _syntaxerror_range(struct tok_state *tok, const char *format, goto error; } - args = Py_BuildValue("(O(OiiNii))", errmsg, tok->filename, tok->lineno, - col_offset, errtext, tok->lineno, end_col_offset); + args = Py_BuildValue("(O(OiiNii))", errmsg, + tok->filename ? tok->filename : Py_None, + tok->lineno, col_offset, errtext, + tok->lineno, end_col_offset); if (args) { PyErr_SetObject(PyExc_SyntaxError, args); Py_DECREF(args); @@ -422,10 +424,13 @@ _PyTokenizer_check_coding_spec(const char* line, Py_ssize_t size, struct tok_sta tok->encoding = cs; } else { /* then, compare cs with BOM */ if (strcmp(tok->encoding, cs) != 0) { - _PyTokenizer_error_ret(tok); - PyErr_Format(PyExc_SyntaxError, - "encoding problem: %s with BOM", cs); + tok->line_start = line; + tok->cur = (char *)line; + assert(size <= INT_MAX); + _PyTokenizer_syntaxerror_known_range(tok, 0, (int)size, + "encoding problem: %s with BOM", cs); PyMem_Free(cs); + _PyTokenizer_error_ret(tok); return 0; } PyMem_Free(cs); @@ -496,24 +501,38 @@ valid_utf8(const unsigned char* s) } int -_PyTokenizer_ensure_utf8(char *line, struct tok_state *tok) +_PyTokenizer_ensure_utf8(const char *line, struct tok_state *tok, int lineno) { - int badchar = 0; - unsigned char *c; + const char *badchar = NULL; + const char *c; int length; - for (c = (unsigned char *)line; *c; c += length) { - if (!(length = valid_utf8(c))) { - badchar = *c; + int col_offset = 0; + const char *line_start = line; + for (c = line; *c; c += length) { + if (!(length = valid_utf8((const unsigned char *)c))) { + badchar = c; break; } + col_offset++; + if (*c == '\n') { + lineno++; + col_offset = 0; + line_start = c + 1; + } } if (badchar) { - PyErr_Format(PyExc_SyntaxError, - "Non-UTF-8 code starting with '\\x%.2x' " - "in file %U on line %i, " - "but no encoding declared; " - "see https://peps.python.org/pep-0263/ for details", - badchar, tok->filename, tok->lineno); + tok->lineno = lineno; + tok->line_start = line_start; + tok->cur = (char *)badchar; + _PyTokenizer_syntaxerror_known_range(tok, + col_offset + 1, col_offset + 1, + "Non-UTF-8 code starting with '\\x%.2x'" + "%s%V on line %i, " + "but no encoding declared; " + "see https://peps.python.org/pep-0263/ for details", + (unsigned char)*badchar, + tok->filename ? " in file " : "", tok->filename, "", + lineno); return 0; } return 1; diff --git a/Parser/tokenizer/helpers.h b/Parser/tokenizer/helpers.h index 42ea13cd1f853f..98f6445d5a3b40 100644 --- a/Parser/tokenizer/helpers.h +++ b/Parser/tokenizer/helpers.h @@ -26,7 +26,7 @@ int _PyTokenizer_check_bom(int get_char(struct tok_state *), struct tok_state *tok); int _PyTokenizer_check_coding_spec(const char* line, Py_ssize_t size, struct tok_state *tok, int set_readline(struct tok_state *, const char *)); -int _PyTokenizer_ensure_utf8(char *line, struct tok_state *tok); +int _PyTokenizer_ensure_utf8(const char *line, struct tok_state *tok, int lineno); #ifdef Py_DEBUG void _PyTokenizer_print_escape(FILE *f, const char *s, Py_ssize_t size); diff --git a/Parser/tokenizer/readline_tokenizer.c b/Parser/tokenizer/readline_tokenizer.c index 22f84c77a12b47..0f7769aeb8fd57 100644 --- a/Parser/tokenizer/readline_tokenizer.c +++ b/Parser/tokenizer/readline_tokenizer.c @@ -97,7 +97,7 @@ tok_underflow_readline(struct tok_state* tok) { ADVANCE_LINENO(); /* The default encoding is UTF-8, so make sure we don't have any non-UTF-8 sequences in it. */ - if (!tok->encoding && !_PyTokenizer_ensure_utf8(tok->cur, tok)) { + if (!tok->encoding && !_PyTokenizer_ensure_utf8(tok->cur, tok, tok->lineno)) { _PyTokenizer_error_ret(tok); return 0; } diff --git a/Parser/tokenizer/string_tokenizer.c b/Parser/tokenizer/string_tokenizer.c index 0c26d5df8d4a40..7299ecf483ccd9 100644 --- a/Parser/tokenizer/string_tokenizer.c +++ b/Parser/tokenizer/string_tokenizer.c @@ -86,15 +86,18 @@ decode_str(const char *input, int single, struct tok_state *tok, int preserve_cr /* need to check line 1 and 2 separately since check_coding_spec assumes a single line as input */ if (newl[0]) { + tok->lineno = 1; if (!_PyTokenizer_check_coding_spec(str, newl[0] - str, tok, buf_setreadl)) { return NULL; } if (tok->enc == NULL && tok->decoding_state != STATE_NORMAL && newl[1]) { + tok->lineno = 2; if (!_PyTokenizer_check_coding_spec(newl[0]+1, newl[1] - newl[0], tok, buf_setreadl)) return NULL; } } + tok->lineno = 0; if (tok->enc != NULL) { assert(utf8 == NULL); utf8 = _PyTokenizer_translate_into_utf8(str, tok->enc); @@ -102,6 +105,9 @@ decode_str(const char *input, int single, struct tok_state *tok, int preserve_cr return _PyTokenizer_error_ret(tok); str = PyBytes_AS_STRING(utf8); } + else if (!_PyTokenizer_ensure_utf8(str, tok, 1)) { + return _PyTokenizer_error_ret(tok); + } assert(tok->decoding_buffer == NULL); tok->decoding_buffer = utf8; /* CAUTION */ return str; From 6cee144d3a6e31401a5e26ee0c804dd0389bc89d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 19 Oct 2025 21:53:36 +0200 Subject: [PATCH 1204/1674] [3.14] gh-140306: Fix memory leaks in cross-interpreter data handling (GH-140307) (GH-140338) (cherry picked from commit f9323213c98c9f1f7f3bf5af883b73047432fe50) Co-authored-by: Shamil --- ...2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst | 2 ++ Modules/_interpchannelsmodule.c | 2 +- Modules/_interpqueuesmodule.c | 2 +- Python/crossinterp.c | 15 ++++++++++++--- 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst new file mode 100644 index 00000000000000..2178c4960636cb --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst @@ -0,0 +1,2 @@ +Fix memory leaks in cross-interpreter channel operations and shared +namespace handling. diff --git a/Modules/_interpchannelsmodule.c b/Modules/_interpchannelsmodule.c index 274bfacfed874b..ef9cf01ecbec5e 100644 --- a/Modules/_interpchannelsmodule.c +++ b/Modules/_interpchannelsmodule.c @@ -580,7 +580,7 @@ _channelitem_clear_data(_channelitem *item, int removed) { if (item->data != NULL) { // It was allocated in channel_send(). - (void)_release_xid_data(item->data, XID_IGNORE_EXC & XID_FREE); + (void)_release_xid_data(item->data, XID_IGNORE_EXC | XID_FREE); item->data = NULL; } diff --git a/Modules/_interpqueuesmodule.c b/Modules/_interpqueuesmodule.c index 03ed081efbae0d..872495d32fbf8f 100644 --- a/Modules/_interpqueuesmodule.c +++ b/Modules/_interpqueuesmodule.c @@ -431,7 +431,7 @@ _queueitem_clear_data(_queueitem *item) return; } // It was allocated in queue_put(). - (void)_release_xid_data(item->data, XID_IGNORE_EXC & XID_FREE); + (void)_release_xid_data(item->data, XID_IGNORE_EXC | XID_FREE); item->data = NULL; } diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 16a23f0351cd26..542253c14de9b8 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -1153,8 +1153,8 @@ _release_xid_data(_PyXIData_t *xidata, int rawfree) { PyObject *exc = PyErr_GetRaisedException(); int res = rawfree - ? _PyXIData_Release(xidata) - : _PyXIData_ReleaseAndRawFree(xidata); + ? _PyXIData_ReleaseAndRawFree(xidata) + : _PyXIData_Release(xidata); if (res < 0) { /* The owning interpreter is already destroyed. */ _PyXIData_Clear(NULL, xidata); @@ -1805,6 +1805,15 @@ _PyXI_InitFailureUTF8(_PyXI_failure *failure, int _PyXI_InitFailure(_PyXI_failure *failure, _PyXI_errcode code, PyObject *obj) { + *failure = (_PyXI_failure){ + .code = code, + .msg = NULL, + .msg_owned = 0, + }; + if (obj == NULL) { + return 0; + } + PyObject *msgobj = PyObject_Str(obj); if (msgobj == NULL) { return -1; @@ -1813,7 +1822,7 @@ _PyXI_InitFailure(_PyXI_failure *failure, _PyXI_errcode code, PyObject *obj) // That happens automatically in _capture_current_exception(). const char *msg = _copy_string_obj_raw(msgobj, NULL); Py_DECREF(msgobj); - if (PyErr_Occurred()) { + if (msg == NULL) { return -1; } *failure = (_PyXI_failure){ From 13e1642845613fd07a375c8323c898def0d45f6c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 19 Oct 2025 23:13:48 +0200 Subject: [PATCH 1205/1674] [3.14] Standardize translation of `Doc/bugs.rst` (GH-137449) (#140275) Standardize translation of `Doc/bugs.rst` (GH-137449) (cherry picked from commit 869bb6948eb501b19db53cb27c523c3203a5ab11) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/bugs.rst | 6 ++++++ Doc/conf.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/Doc/bugs.rst b/Doc/bugs.rst index 5d0f68ca69675e..1d27579e53f4ef 100644 --- a/Doc/bugs.rst +++ b/Doc/bugs.rst @@ -19,6 +19,12 @@ If you find a bug in this documentation or would like to propose an improvement, please submit a bug report on the :ref:`issue tracker `. If you have a suggestion on how to fix it, include that as well. +.. only:: translation + + If the bug or suggested improvement concerns the translation of this + documentation, submit the report to the + `translation’s repository `_ instead. + You can also open a discussion item on our `Documentation Discourse forum `_. diff --git a/Doc/conf.py b/Doc/conf.py index c1b07df08b1782..a8e376c0ae44fe 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -444,6 +444,25 @@ # https://github.com/sphinx-doc/sphinx/issues/12359 epub_use_index = False +# translation tag +# --------------- + +language_code = None +for arg in sys.argv: + if arg.startswith('language='): + language_code = arg.split('=', 1)[1] + +if language_code: + tags.add('translation') # noqa: F821 + + rst_epilog += f"""\ +.. _TRANSLATION_REPO: https://github.com/python/python-docs-{language_code.replace("_", "-").lower()} +""" # noqa: F821 +else: + rst_epilog += """\ +.. _TRANSLATION_REPO: https://github.com/python +""" + # Options for the coverage checker # -------------------------------- From 2699643d715aeccdbdbb9b429f7bd423050e8f41 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 06:31:05 +0200 Subject: [PATCH 1206/1674] [3.14] docs: be clearer that glob results are unordered (GH-140184) (#140339) (cherry picked from commit ed672f7a8a3c843d8e6e6b673d5a7c1f752f208c) Co-authored-by: Ned Batchelder --- Doc/library/glob.rst | 20 ++++++++++++-------- Lib/glob.py | 6 ++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 59ad1b07f27338..52c44928153337 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -18,23 +18,27 @@ single: - (minus); in glob-style wildcards single: . (dot); in glob-style wildcards -The :mod:`glob` module finds all the pathnames matching a specified pattern -according to the rules used by the Unix shell, although results are returned in -arbitrary order. No tilde expansion is done, but ``*``, ``?``, and character +The :mod:`!glob` module finds pathnames +using pattern matching rules similar to the Unix shell. +No tilde expansion is done, but ``*``, ``?``, and character ranges expressed with ``[]`` will be correctly matched. This is done by using the :func:`os.scandir` and :func:`fnmatch.fnmatch` functions in concert, and not by actually invoking a subshell. -Note that files beginning with a dot (``.``) can only be matched by +.. note:: + The pathnames are returned in no particular order. If you need a specific + order, sort the results. + +Files beginning with a dot (``.``) can only be matched by patterns that also start with a dot, unlike :func:`fnmatch.fnmatch` or :func:`pathlib.Path.glob`. -(For tilde and shell variable expansion, use :func:`os.path.expanduser` and -:func:`os.path.expandvars`.) +For tilde and shell variable expansion, use :func:`os.path.expanduser` and +:func:`os.path.expandvars`. For a literal match, wrap the meta-characters in brackets. For example, ``'[?]'`` matches the character ``'?'``. -The :mod:`glob` module defines the following functions: +The :mod:`!glob` module defines the following functions: .. function:: glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, \ @@ -51,7 +55,7 @@ The :mod:`glob` module defines the following functions: If *root_dir* is not ``None``, it should be a :term:`path-like object` specifying the root directory for searching. It has the same effect on - :func:`glob` as changing the current directory before calling it. If + :func:`!glob` as changing the current directory before calling it. If *pathname* is relative, the result will contain paths relative to *root_dir*. diff --git a/Lib/glob.py b/Lib/glob.py index 341524282ba675..f1a87c82fc5585 100644 --- a/Lib/glob.py +++ b/Lib/glob.py @@ -22,6 +22,9 @@ def glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, dot are special cases that are not matched by '*' and '?' patterns by default. + The order of the returned list is undefined. Sort it if you need a + particular order. + If `include_hidden` is true, the patterns '*', '?', '**' will match hidden directories. @@ -40,6 +43,9 @@ def iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, dot are special cases that are not matched by '*' and '?' patterns. + The order of the returned paths is undefined. Sort them if you need a + particular order. + If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. """ From 357284edb554360f7248507cee15b37c111d3b23 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 09:21:31 +0200 Subject: [PATCH 1207/1674] [3.14] gh-101100: Fix sphinx warnings in `library/resource.rst` (GH-140023) (#140352) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> --- Doc/library/resource.rst | 74 ++++++++++++++++++++-------------------- Doc/library/signal.rst | 6 ++++ Doc/tools/.nitignore | 1 - 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index 140de234fb7dc8..512f0852dd5333 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -127,7 +127,7 @@ platform. .. data:: RLIMIT_CPU The maximum amount of processor time (in seconds) that a process can use. If - this limit is exceeded, a :const:`SIGXCPU` signal is sent to the process. (See + this limit is exceeded, a :const:`~signal.SIGXCPU` signal is sent to the process. (See the :mod:`signal` module documentation for information about how to catch this signal and do something useful, e.g. flush open files to disk.) @@ -310,47 +310,47 @@ These functions are used to retrieve resource usage information: For backward compatibility, the return value is also accessible as a tuple of 16 elements. - The fields :attr:`ru_utime` and :attr:`ru_stime` of the return value are + 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 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: - +--------+---------------------+---------------------------------------+ - | Index | Field | Resource | - +========+=====================+=======================================+ - | ``0`` | :attr:`ru_utime` | time in user mode (float seconds) | - +--------+---------------------+---------------------------------------+ - | ``1`` | :attr:`ru_stime` | time in system mode (float seconds) | - +--------+---------------------+---------------------------------------+ - | ``2`` | :attr:`ru_maxrss` | maximum resident set size | - +--------+---------------------+---------------------------------------+ - | ``3`` | :attr:`ru_ixrss` | shared memory size | - +--------+---------------------+---------------------------------------+ - | ``4`` | :attr:`ru_idrss` | unshared memory size | - +--------+---------------------+---------------------------------------+ - | ``5`` | :attr:`ru_isrss` | unshared stack size | - +--------+---------------------+---------------------------------------+ - | ``6`` | :attr:`ru_minflt` | page faults not requiring I/O | - +--------+---------------------+---------------------------------------+ - | ``7`` | :attr:`ru_majflt` | page faults requiring I/O | - +--------+---------------------+---------------------------------------+ - | ``8`` | :attr:`ru_nswap` | number of swap outs | - +--------+---------------------+---------------------------------------+ - | ``9`` | :attr:`ru_inblock` | block input operations | - +--------+---------------------+---------------------------------------+ - | ``10`` | :attr:`ru_oublock` | block output operations | - +--------+---------------------+---------------------------------------+ - | ``11`` | :attr:`ru_msgsnd` | messages sent | - +--------+---------------------+---------------------------------------+ - | ``12`` | :attr:`ru_msgrcv` | messages received | - +--------+---------------------+---------------------------------------+ - | ``13`` | :attr:`ru_nsignals` | signals received | - +--------+---------------------+---------------------------------------+ - | ``14`` | :attr:`ru_nvcsw` | voluntary context switches | - +--------+---------------------+---------------------------------------+ - | ``15`` | :attr:`ru_nivcsw` | involuntary context switches | - +--------+---------------------+---------------------------------------+ + +--------+----------------------+---------------------------------------+ + | Index | Field | Resource | + +========+======================+=======================================+ + | ``0`` | :attr:`!ru_utime` | time in user mode (float seconds) | + +--------+----------------------+---------------------------------------+ + | ``1`` | :attr:`!ru_stime` | time in system mode (float seconds) | + +--------+----------------------+---------------------------------------+ + | ``2`` | :attr:`!ru_maxrss` | maximum resident set size | + +--------+----------------------+---------------------------------------+ + | ``3`` | :attr:`!ru_ixrss` | shared memory size | + +--------+----------------------+---------------------------------------+ + | ``4`` | :attr:`!ru_idrss` | unshared memory size | + +--------+----------------------+---------------------------------------+ + | ``5`` | :attr:`!ru_isrss` | unshared stack size | + +--------+----------------------+---------------------------------------+ + | ``6`` | :attr:`!ru_minflt` | page faults not requiring I/O | + +--------+----------------------+---------------------------------------+ + | ``7`` | :attr:`!ru_majflt` | page faults requiring I/O | + +--------+----------------------+---------------------------------------+ + | ``8`` | :attr:`!ru_nswap` | number of swap outs | + +--------+----------------------+---------------------------------------+ + | ``9`` | :attr:`!ru_inblock` | block input operations | + +--------+----------------------+---------------------------------------+ + | ``10`` | :attr:`!ru_oublock` | block output operations | + +--------+----------------------+---------------------------------------+ + | ``11`` | :attr:`!ru_msgsnd` | messages sent | + +--------+----------------------+---------------------------------------+ + | ``12`` | :attr:`!ru_msgrcv` | messages received | + +--------+----------------------+---------------------------------------+ + | ``13`` | :attr:`!ru_nsignals` | signals received | + +--------+----------------------+---------------------------------------+ + | ``14`` | :attr:`!ru_nvcsw` | voluntary context switches | + +--------+----------------------+---------------------------------------+ + | ``15`` | :attr:`!ru_nivcsw` | involuntary context switches | + +--------+----------------------+---------------------------------------+ This function will raise a :exc:`ValueError` if an invalid *who* parameter is specified. It may also raise :exc:`error` exception in unusual circumstances. diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index f8e22a50bd19bc..1a2a555f5c0fc5 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -265,6 +265,12 @@ The variables defined in the :mod:`signal` module are: .. availability:: Unix. +.. data:: SIGXCPU + + CPU time limit exceeded. + + .. availability:: Unix. + .. data:: SIG* All the signal numbers are defined symbolically. For example, the hangup signal diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 29fd3cfda458f0..6fee1c192c3aff 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -27,7 +27,6 @@ Doc/library/os.rst Doc/library/pickletools.rst Doc/library/profile.rst Doc/library/pyexpat.rst -Doc/library/resource.rst Doc/library/select.rst Doc/library/socket.rst Doc/library/ssl.rst From d7fe4e99a2d1b660d444876c721c8889b8a9fd28 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:54:41 +0200 Subject: [PATCH 1208/1674] [3.14] gh-140301: Fix memory leak in subinterpreter `PyConfig` cleanup (GH-140303) (#140360) gh-140301: Fix memory leak in subinterpreter `PyConfig` cleanup (GH-140303) (cherry picked from commit a615fb49c948902a982c3256899507abcc9f9bc8) Co-authored-by: Shamil Co-authored-by: Kumar Aditya --- .../2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst | 1 + Python/pystate.c | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst new file mode 100644 index 00000000000000..8b1c81c04ece92 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst @@ -0,0 +1 @@ +Fix memory leak of ``PyConfig`` in subinterpreters. diff --git a/Python/pystate.c b/Python/pystate.c index 7f365ea50cab7d..06f997fb5ad5be 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1049,6 +1049,8 @@ PyInterpreterState_Delete(PyInterpreterState *interp) _PyObject_FiniState(interp); + PyConfig_Clear(&interp->config); + free_interpreter(interp); } From 6493a6aaf3cfd7ccf6bb9de76e1a5c5e28feb75b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 16:25:42 +0200 Subject: [PATCH 1209/1674] [3.14] gh-140263: Fix data race in test_lock_two_threads (gh-140264) (gh-140369) Clang-20 detects a data race between the unlock and the non-atomic read of the lock state. Use a relaxed load for the assertion to avoid the race. (cherry picked from commit f11ec6e643f54f4ee698f7dfc878812a315f2af4) Co-authored-by: Sam Gross --- Modules/_testinternalcapi/test_lock.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_testinternalcapi/test_lock.c b/Modules/_testinternalcapi/test_lock.c index 8d8cb992b0e07f..ded76ca9fe6819 100644 --- a/Modules/_testinternalcapi/test_lock.c +++ b/Modules/_testinternalcapi/test_lock.c @@ -91,7 +91,8 @@ test_lock_two_threads(PyObject *self, PyObject *obj) } while (v != 3 && iters < 200); // both the "locked" and the "has parked" bits should be set - assert(test_data.m._bits == 3); + v = _Py_atomic_load_uint8_relaxed(&test_data.m._bits); + assert(v == 3); PyMutex_Unlock(&test_data.m); PyEvent_Wait(&test_data.done); From abb3b3142b2ac25e034a1d52fcb08f8b71b1e023 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 20 Oct 2025 20:05:42 +0300 Subject: [PATCH 1210/1674] [3.14] gh-63161: Fix test_source_encoding when stderr is StringIO (GH-140361) --- Lib/test/test_source_encoding.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py index a285fc2ceef24e..36c8d87182dcf9 100644 --- a/Lib/test/test_source_encoding.py +++ b/Lib/test/test_source_encoding.py @@ -521,7 +521,7 @@ def check_script_error(self, src, expected, lineno=...): line = src.splitlines()[lineno-1].decode(errors='replace') if lineno == 1: line = line.removeprefix('\ufeff') - line = line.encode(sys.stderr.encoding, sys.stderr.errors) + line = line.encode(sys.__stderr__.encoding, sys.__stderr__.errors) self.assertIn(line, err) From 8e93f6e203bd6cd2f22ec238442f82f52b354289 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 19:34:56 +0200 Subject: [PATCH 1211/1674] [3.14] gh-63161: Fix tokenize.detect_encoding() (GH-139446) (GH-140378) * Support non-UTF-8 shebang and comments if non-UTF-8 encoding is specified. * Detect decoding error for non-UTF-8 encoding. * Detect null bytes in source code. (cherry picked from commit 38d4b436ca767351db834189b3a5379406cd52a8) Co-authored-by: Serhiy Storchaka --- Lib/test/test_tokenize.py | 77 +++++++++++++++++++ Lib/tokenize.py | 22 ++++-- ...5-09-30-12-52-54.gh-issue-63161.mECM1A.rst | 3 + 3 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 8fdd03f347b632..d274726eed2e65 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1495,6 +1495,61 @@ def test_cookie_second_line_noncommented_first_line(self): expected = [b"print('\xc2\xa3')\n"] self.assertEqual(consumed_lines, expected) + def test_first_non_utf8_coding_line(self): + lines = ( + b'#coding:iso-8859-15 \xa4\n', + b'print(something)\n' + ) + encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) + self.assertEqual(encoding, 'iso-8859-15') + self.assertEqual(consumed_lines, list(lines[:1])) + + def test_first_utf8_coding_line_error(self): + lines = ( + b'#coding:ascii \xc3\xa4\n', + b'print(something)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) + + def test_second_non_utf8_coding_line(self): + lines = ( + b'#!/usr/bin/python\n', + b'#coding:iso-8859-15 \xa4\n', + b'print(something)\n' + ) + encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) + self.assertEqual(encoding, 'iso-8859-15') + self.assertEqual(consumed_lines, list(lines[:2])) + + def test_second_utf8_coding_line_error(self): + lines = ( + b'#!/usr/bin/python\n', + b'#coding:ascii \xc3\xa4\n', + b'print(something)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) + + def test_non_utf8_shebang(self): + lines = ( + b'#!/home/\xa4/bin/python\n', + b'#coding:iso-8859-15\n', + b'print(something)\n' + ) + encoding, consumed_lines = tokenize.detect_encoding(self.get_readline(lines)) + self.assertEqual(encoding, 'iso-8859-15') + self.assertEqual(consumed_lines, list(lines[:2])) + + def test_utf8_shebang_error(self): + lines = ( + b'#!/home/\xc3\xa4/bin/python\n', + b'#coding:ascii\n', + b'print(something)\n' + ) + with self.assertRaises(SyntaxError): + tokenize.detect_encoding(self.get_readline(lines)) + def test_cookie_second_line_empty_first_line(self): lines = ( b'\n', @@ -1548,6 +1603,28 @@ def test_double_coding_utf8(self): self.assertEqual(encoding, 'utf-8') self.assertEqual(consumed_lines, list(lines[:1])) + def test_nul_in_first_coding_line(self): + lines = ( + b'#coding:iso8859-15\x00\n', + b'\n', + b'\n', + b'print(something)\n' + ) + with self.assertRaisesRegex(SyntaxError, + "source code cannot contain null bytes"): + tokenize.detect_encoding(self.get_readline(lines)) + + def test_nul_in_second_coding_line(self): + lines = ( + b'#!/usr/bin/python\n', + b'#coding:iso8859-15\x00\n', + b'\n', + b'print(something)\n' + ) + with self.assertRaisesRegex(SyntaxError, + "source code cannot contain null bytes"): + tokenize.detect_encoding(self.get_readline(lines)) + def test_latin1_normalization(self): # See get_normal_name() in Parser/tokenizer/helpers.c. encodings = ("latin-1", "iso-8859-1", "iso-latin-1", "latin-1-unix", diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 7e71755068e1df..1f31258ce361c9 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -36,7 +36,7 @@ from token import EXACT_TOKEN_TYPES import _tokenize -cookie_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)', re.ASCII) +cookie_re = re.compile(br'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)', re.ASCII) blank_re = re.compile(br'^[ \t\f]*(?:[#\r\n]|$)', re.ASCII) import token @@ -385,22 +385,23 @@ def read_or_stop(): except StopIteration: return b'' - def find_cookie(line): + def check(line, encoding): + # Check if the line matches the encoding. + if 0 in line: + raise SyntaxError("source code cannot contain null bytes") try: - # Decode as UTF-8. Either the line is an encoding declaration, - # in which case it should be pure ASCII, or it must be UTF-8 - # per default encoding. - line_string = line.decode('utf-8') + line.decode(encoding) except UnicodeDecodeError: msg = "invalid or missing encoding declaration" if filename is not None: msg = '{} for {!r}'.format(msg, filename) raise SyntaxError(msg) - match = cookie_re.match(line_string) + def find_cookie(line): + match = cookie_re.match(line) if not match: return None - encoding = _get_normal_name(match.group(1)) + encoding = _get_normal_name(match.group(1).decode()) try: codec = lookup(encoding) except LookupError: @@ -433,18 +434,23 @@ def find_cookie(line): encoding = find_cookie(first) if encoding: + check(first, encoding) return encoding, [first] if not blank_re.match(first): + check(first, default) return default, [first] second = read_or_stop() if not second: + check(first, default) return default, [first] encoding = find_cookie(second) if encoding: + check(first + second, encoding) return encoding, [first, second] + check(first + second, default) return default, [first, second] diff --git a/Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst b/Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst new file mode 100644 index 00000000000000..3daed20d099a8a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst @@ -0,0 +1,3 @@ +Fix :func:`tokenize.detect_encoding`. Support non-UTF-8 shebang and comments +if non-UTF-8 encoding is specified. Detect decoding error for non-UTF-8 +encoding. Detect null bytes in source code. From 62f44dda1c327a2b1fede7ebb47cf33a7a2ce6bb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:20:47 +0200 Subject: [PATCH 1212/1674] [3.14] gh-138891: fix star-unpack in get_annotations (GH-138951) (#140384) gh-138891: fix star-unpack in get_annotations (GH-138951) (cherry picked from commit c6be6e453730228053783f3444cb62e1425a3feb) Co-authored-by: Christoph Walcher --- Lib/annotationlib.py | 22 +++++++++++-------- Lib/test/test_annotationlib.py | 6 +++++ ...-09-15-21-03-11.gh-issue-138891.oZFdtR.rst | 2 ++ 3 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 43e1d51bc4b807..544e069626d0d9 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -241,15 +241,8 @@ def __forward_code__(self): if self.__code__ is not None: return self.__code__ arg = self.__forward_arg__ - # If we do `def f(*args: *Ts)`, then we'll have `arg = '*Ts'`. - # Unfortunately, this isn't a valid expression on its own, so we - # do the unpacking manually. - if arg.startswith("*"): - arg_to_compile = f"({arg},)[0]" # E.g. (*Ts,)[0] or (*tuple[int, int],)[0] - else: - arg_to_compile = arg try: - self.__code__ = compile(arg_to_compile, "", "eval") + self.__code__ = compile(_rewrite_star_unpack(arg), "", "eval") except SyntaxError: raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}") return self.__code__ @@ -1025,7 +1018,8 @@ def get_annotations( locals = {param.__name__: param for param in type_params} | locals return_value = { - key: value if not isinstance(value, str) else eval(value, globals, locals) + key: value if not isinstance(value, str) + else eval(_rewrite_star_unpack(value), globals, locals) for key, value in ann.items() } return return_value @@ -1062,6 +1056,16 @@ def annotations_to_string(annotations): } +def _rewrite_star_unpack(arg): + """If the given argument annotation expression is a star unpack e.g. `'*Ts'` + rewrite it to a valid expression. + """ + if arg.startswith("*"): + return f"({arg},)[0]" # E.g. (*Ts,)[0] or (*tuple[int, int],)[0] + else: + return arg + + def _get_and_call_annotate(obj, format): """Get the __annotate__ function and call it. diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index a8a8bcec76a429..2c5bf2b3417344 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -787,6 +787,12 @@ def test_stringized_annotations_in_empty_module(self): self.assertEqual(get_annotations(isa2, eval_str=True), {}) self.assertEqual(get_annotations(isa2, eval_str=False), {}) + def test_stringized_annotations_with_star_unpack(self): + def f(*args: *tuple[int, ...]): ... + self.assertEqual(get_annotations(f, eval_str=True), + {'args': (*tuple[int, ...],)[0]}) + + def test_stringized_annotations_on_wrapper(self): isa = inspect_stringized_annotations wrapped = times_three(isa.function) diff --git a/Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst b/Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst new file mode 100644 index 00000000000000..f7ecb05d20c241 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst @@ -0,0 +1,2 @@ +Fix ``SyntaxError`` when ``inspect.get_annotations(f, eval_str=True)`` is +called on a function annotated with a :pep:`646` ``star_expression`` From ba6d956eb98bea2eaff245d8da092a0a95060d97 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:23:19 +0200 Subject: [PATCH 1213/1674] [3.14] [Docs] Add missing note about Required/NotRequired/ReadOnly in get_type_hints() (GH-139565) (#140386) [Docs] Add missing note about Required/NotRequired/ReadOnly in get_type_hints() (GH-139565) (cherry picked from commit a752f58d6b628ab4fe6e4263137ec4cc244ff390) Co-authored-by: Sam Bull --- Doc/library/typing.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index b4364c371b2d7e..862f765b148c73 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -3360,7 +3360,8 @@ Introspection helpers ``__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, ...]`` + * The function recursively replaces all occurrences of + ``Annotated[T, ...]``, ``Required[T]``, ``NotRequired[T]``, and ``ReadOnly[T]`` with ``T``, unless *include_extras* is set to ``True`` (see :class:`Annotated` for more information). From 4215f7f519cf75edc0ef5dcd803c24e7767a2a62 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 09:06:49 +0200 Subject: [PATCH 1214/1674] [3.14] gh-66646: Explain __base__ attribute in the docs (GH-102554) (GH-140365) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit faa169afa0dad9586b294ea9ab6e5e17c5712861) Co-authored-by: Furkan Onder Co-authored-by: Éric --- Doc/reference/datamodel.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c37ed4695d0aba..c176e7158e48bb 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1185,6 +1185,7 @@ Special attributes single: __module__ (class attribute) single: __dict__ (class attribute) single: __bases__ (class attribute) + single: __base__ (class attribute) single: __doc__ (class attribute) single: __annotations__ (class attribute) single: __annotate__ (class attribute) @@ -1219,6 +1220,13 @@ Special attributes 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.__base__ + - .. impl-detail:: + + The single base class in the inheritance chain that is responsible + for the memory layout of instances. This attribute corresponds to + :c:member:`~PyTypeObject.tp_base` at the C level. + * - .. attribute:: type.__doc__ - The class's documentation string, or ``None`` if undefined. Not inherited by subclasses. From 98d4c21c09030e7ec4dfb4a0e726c14202b6e3c3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 10:20:14 +0200 Subject: [PATCH 1215/1674] [3.14] gh-140398: fix memory leaks in `readline` module when `PySys_Audit` fails (GH-140400) (#140403) gh-140398: fix memory leaks in `readline` module when `PySys_Audit` fails (GH-140400) (cherry picked from commit e8e0f411bae1dde634fb152a81e1db1ad1cd2eaa) Co-authored-by: Shamil --- .../2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst | 4 ++++ Modules/readline.c | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst new file mode 100644 index 00000000000000..481dac7f26dd5e --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst @@ -0,0 +1,4 @@ +Fix memory leaks in :mod:`readline` functions +:func:`~readline.read_init_file`, :func:`~readline.read_history_file`, +:func:`~readline.write_history_file`, and +:func:`~readline.append_history_file` when :c:func:`PySys_Audit` fails. diff --git a/Modules/readline.c b/Modules/readline.c index 0dd99dc66c08e9..4da66ca6e7b94c 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -255,6 +255,7 @@ readline_read_init_file_impl(PyObject *module, PyObject *filename_obj) if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) return NULL; if (PySys_Audit("open", "OCi", filename_obj, 'r', 0) < 0) { + Py_DECREF(filename_bytes); return NULL; } errno = rl_read_init_file(PyBytes_AS_STRING(filename_bytes)); @@ -298,6 +299,7 @@ readline_read_history_file_impl(PyObject *module, PyObject *filename_obj) if (!PyUnicode_FSConverter(filename_obj, &filename_bytes)) return NULL; if (PySys_Audit("open", "OCi", filename_obj, 'r', 0) < 0) { + Py_DECREF(filename_bytes); return NULL; } errno = read_history(PyBytes_AS_STRING(filename_bytes)); @@ -343,6 +345,7 @@ readline_write_history_file_impl(PyObject *module, PyObject *filename_obj) return NULL; filename = PyBytes_AS_STRING(filename_bytes); if (PySys_Audit("open", "OCi", filename_obj, 'w', 0) < 0) { + Py_DECREF(filename_bytes); return NULL; } } else { @@ -400,6 +403,7 @@ readline_append_history_file_impl(PyObject *module, int nelements, return NULL; filename = PyBytes_AS_STRING(filename_bytes); if (PySys_Audit("open", "OCi", filename_obj, 'a', 0) < 0) { + Py_DECREF(filename_bytes); return NULL; } } else { From c0f0eca4dac61f13b7d6c29c91853474a8b31b80 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:35:31 +0200 Subject: [PATCH 1216/1674] [3.14] gh-140406: Fix memory leak upon `__hash__` returning a non-integer (GH-140411) (GH-140417) gh-140406: Fix memory leak upon `__hash__` returning a non-integer (GH-140411) (cherry picked from commit 71db05a12d9953a96f809d84b4d0d452a464e431) Co-authored-by: Peter Bierma --- Lib/test/test_builtin.py | 10 ++++++++++ .../2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst | 2 ++ Objects/typeobject.c | 1 + 3 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 8830641f0abdc7..413429f51096c5 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1183,6 +1183,16 @@ def __hash__(self): return self self.assertEqual(hash(Z(42)), hash(42)) + def test_invalid_hash_typeerror(self): + # GH-140406: The returned object from __hash__() would leak if it + # wasn't an integer. + class A: + def __hash__(self): + return 1.0 + + with self.assertRaises(TypeError): + hash(A()) + def test_hex(self): self.assertEqual(hex(16), '0x10') self.assertEqual(hex(-16), '-0x10') diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst new file mode 100644 index 00000000000000..3506ba42581faa --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst @@ -0,0 +1,2 @@ +Fix memory leak when an object's :meth:`~object.__hash__` method returns an +object that isn't an :class:`int`. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 28451fee7ec10f..954547eb4fb7b0 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -10195,6 +10195,7 @@ slot_tp_hash(PyObject *self) return PyObject_HashNotImplemented(self); } if (!PyLong_Check(res)) { + Py_DECREF(res); PyErr_SetString(PyExc_TypeError, "__hash__ method should return an integer"); return -1; From d7dc6bfe2f92e9901ff15489c604b8a5fe2df0d3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 15:06:48 +0200 Subject: [PATCH 1217/1674] [3.14] GH-139436: Remove references to downloadable PDF documentation (GH-140416) (#140419) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/faq/general.rst | 2 +- README.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index 578777d7f23621..698f2117ff5c64 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -186,7 +186,7 @@ How do I get documentation on Python? ------------------------------------- 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 +at https://docs.python.org/3/. EPUB, plain text, and downloadable HTML versions are also available at https://docs.python.org/3/download.html. The documentation is written in reStructuredText and processed by `the Sphinx diff --git a/README.rst b/README.rst index a0266f08ae72c2..367fcba602c2ea 100644 --- a/README.rst +++ b/README.rst @@ -153,7 +153,7 @@ Documentation updated daily. It can also be downloaded in many formats for faster access. The documentation -is downloadable in HTML, PDF, and reStructuredText formats; the latter version +is downloadable in HTML, EPUB, and reStructuredText formats; the latter version is primarily for documentation authors, translators, and people with special formatting requirements. @@ -232,4 +232,4 @@ This Python distribution contains *no* GNU General Public License (GPL) code, so it may be used in proprietary projects. There are interfaces to some GNU code but these are entirely optional. -All trademarks referenced herein are property of their respective holders. \ No newline at end of file +All trademarks referenced herein are property of their respective holders. From 3d4cf3bda37ac9c0fa2b65c91caf8c5aa1df9e99 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 17:44:33 +0200 Subject: [PATCH 1218/1674] [3.14] gh-139951: Test on GC collection disabled if threshold is zero (GH-140304) (#140362) gh-139951: Test on GC collection disabled if threshold is zero (GH-140304) (cherry picked from commit 5d0abb69715b9638f26c896444643055ec2ef038) Co-authored-by: Mikhail Efimov --- Lib/test/test_gc.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 969d290c259f73..71a4f035fbb02a 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1501,6 +1501,20 @@ def test_indirect_calls_with_gc_disabled(self): finally: gc.enable() + # Ensure that setting *threshold0* to zero disables collection. + @gc_threshold(0) + def test_threshold_zero(self): + junk = [] + i = 0 + detector = GC_Detector() + while not detector.gc_happened: + i += 1 + if i > 50000: + break + junk.append([]) # this may eventually trigger gc (if it is enabled) + + self.assertEqual(i, 50001) + class PythonFinalizationTests(unittest.TestCase): def test_ast_fini(self): From d9e3d0eec7128986fa79b017b56b5405ec6d075a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 18:08:56 +0200 Subject: [PATCH 1219/1674] [3.14] Use ``sphinxext-opengraph`` v0.13.0 (GH-140425) (#140427) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/requirements.txt b/Doc/requirements.txt index 7b7286429a1041..d5f7b473c3aa84 100644 --- a/Doc/requirements.txt +++ b/Doc/requirements.txt @@ -11,7 +11,7 @@ sphinx~=8.2.0 blurb -sphinxext-opengraph~=0.12.0 +sphinxext-opengraph~=0.13.0 sphinx-notfound-page~=1.0.0 # The theme used by the documentation is stored separately, so we need From c7fda9b3d18871a728cc6f38dc9d1edf15297c63 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 21 Oct 2025 18:22:29 +0200 Subject: [PATCH 1220/1674] [3.14] gh-138764: annotationlib: Make `call_annotate_function` fallback to using `VALUE` annotations if both the requested format and `VALUE_WITH_FAKE_GLOBALS` are not implemented (GH-138803) (#140426) gh-138764: annotationlib: Make `call_annotate_function` fallback to using `VALUE` annotations if both the requested format and `VALUE_WITH_FAKE_GLOBALS` are not implemented (GH-138803) (cherry picked from commit 95c257e2e691456140e79bd98d1674cbd289eb38) Co-authored-by: David Ellis --- Doc/library/annotationlib.rst | 15 ++ Lib/annotationlib.py | 15 ++ Lib/test/test_annotationlib.py | 176 ++++++++++++++++++ ...-09-12-09-34-37.gh-issue-138764.mokHoY.rst | 3 + 4 files changed, 209 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst diff --git a/Doc/library/annotationlib.rst b/Doc/library/annotationlib.rst index d6f5055955e8cf..40f2a6dc30460b 100644 --- a/Doc/library/annotationlib.rst +++ b/Doc/library/annotationlib.rst @@ -340,14 +340,29 @@ Functions * VALUE: :attr:`!object.__annotations__` is tried first; if that does not exist, the :attr:`!object.__annotate__` function is called if it exists. + * FORWARDREF: If :attr:`!object.__annotations__` exists and can be evaluated successfully, it is used; otherwise, the :attr:`!object.__annotate__` function is called. If it does not exist either, :attr:`!object.__annotations__` is tried again and any error from accessing it is re-raised. + + * When calling :attr:`!object.__annotate__` it is first called with :attr:`~Format.FORWARDREF`. + If this is not implemented, it will then check if :attr:`~Format.VALUE_WITH_FAKE_GLOBALS` + is supported and use that in the fake globals environment. + If neither of these formats are supported, it will fall back to using :attr:`~Format.VALUE`. + If :attr:`~Format.VALUE` fails, the error from this call will be raised. + * STRING: If :attr:`!object.__annotate__` exists, it is called first; otherwise, :attr:`!object.__annotations__` is used and stringified using :func:`annotations_to_string`. + * When calling :attr:`!object.__annotate__` it is first called with :attr:`~Format.STRING`. + If this is not implemented, it will then check if :attr:`~Format.VALUE_WITH_FAKE_GLOBALS` + is supported and use that in the fake globals environment. + If neither of these formats are supported, it will fall back to using :attr:`~Format.VALUE` + with the result converted using :func:`annotations_to_string`. + If :attr:`~Format.VALUE` fails, the error from this call will be raised. + Returns a dict. :func:`!get_annotations` returns a new dict every time it's called; calling it twice on the same object will return two different but equivalent dicts. diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 544e069626d0d9..81886a0467d001 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -695,6 +695,18 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): # possibly constants if the annotate function uses them directly). We then # convert each of those into a string to get an approximation of the # original source. + + # Attempt to call with VALUE_WITH_FAKE_GLOBALS to check if it is implemented + # See: https://github.com/python/cpython/issues/138764 + # Only fail on NotImplementedError + try: + annotate(Format.VALUE_WITH_FAKE_GLOBALS) + except NotImplementedError: + # Both STRING and VALUE_WITH_FAKE_GLOBALS are not implemented: fallback to VALUE + return annotations_to_string(annotate(Format.VALUE)) + except Exception: + pass + globals = _StringifierDict({}, format=format) is_class = isinstance(owner, type) closure = _build_closure( @@ -753,6 +765,9 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): ) try: result = func(Format.VALUE_WITH_FAKE_GLOBALS) + except NotImplementedError: + # FORWARDREF and VALUE_WITH_FAKE_GLOBALS not supported, fall back to VALUE + return annotate(Format.VALUE) except Exception: pass else: diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 2c5bf2b3417344..8da4ff096e7593 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -1194,6 +1194,25 @@ class RaisesAttributeError: }, ) + def test_raises_error_from_value(self): + # test that if VALUE is the only supported format, but raises an error + # that error is propagated from get_annotations + class DemoException(Exception): ... + + def annotate(format, /): + if format == Format.VALUE: + raise DemoException() + else: + raise NotImplementedError(format) + + def f(): ... + + f.__annotate__ = annotate + + for fmt in [Format.VALUE, Format.FORWARDREF, Format.STRING]: + with self.assertRaises(DemoException): + get_annotations(f, format=fmt) + class TestCallEvaluateFunction(unittest.TestCase): def test_evaluation(self): @@ -1214,6 +1233,163 @@ def evaluate(format, exc=NotImplementedError): ) +class TestCallAnnotateFunction(unittest.TestCase): + # Tests for user defined annotate functions. + + # Format and NotImplementedError are provided as arguments so they exist in + # the fake globals namespace. + # This avoids non-matching conditions passing by being converted to stringifiers. + # See: https://github.com/python/cpython/issues/138764 + + def test_user_annotate_value(self): + def annotate(format, /): + if format == Format.VALUE: + return {"x": str} + else: + raise NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.VALUE, + ) + + self.assertEqual(annotations, {"x": str}) + + def test_user_annotate_forwardref_supported(self): + # If Format.FORWARDREF is supported prefer it over Format.VALUE + def annotate(format, /, __Format=Format, __NotImplementedError=NotImplementedError): + if format == __Format.VALUE: + return {'x': str} + elif format == __Format.VALUE_WITH_FAKE_GLOBALS: + return {'x': int} + elif format == __Format.FORWARDREF: + return {'x': float} + else: + raise __NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.FORWARDREF + ) + + self.assertEqual(annotations, {"x": float}) + + def test_user_annotate_forwardref_fakeglobals(self): + # If Format.FORWARDREF is not supported, use Format.VALUE_WITH_FAKE_GLOBALS + # before falling back to Format.VALUE + def annotate(format, /, __Format=Format, __NotImplementedError=NotImplementedError): + if format == __Format.VALUE: + return {'x': str} + elif format == __Format.VALUE_WITH_FAKE_GLOBALS: + return {'x': int} + else: + raise __NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.FORWARDREF + ) + + self.assertEqual(annotations, {"x": int}) + + def test_user_annotate_forwardref_value_fallback(self): + # If Format.FORWARDREF and Format.VALUE_WITH_FAKE_GLOBALS are not supported + # use Format.VALUE + def annotate(format, /, __Format=Format, __NotImplementedError=NotImplementedError): + if format == __Format.VALUE: + return {"x": str} + else: + raise __NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.FORWARDREF, + ) + + self.assertEqual(annotations, {"x": str}) + + def test_user_annotate_string_supported(self): + # If Format.STRING is supported prefer it over Format.VALUE + def annotate(format, /, __Format=Format, __NotImplementedError=NotImplementedError): + if format == __Format.VALUE: + return {'x': str} + elif format == __Format.VALUE_WITH_FAKE_GLOBALS: + return {'x': int} + elif format == __Format.STRING: + return {'x': "float"} + else: + raise __NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.STRING, + ) + + self.assertEqual(annotations, {"x": "float"}) + + def test_user_annotate_string_fakeglobals(self): + # If Format.STRING is not supported but Format.VALUE_WITH_FAKE_GLOBALS is + # prefer that over Format.VALUE + def annotate(format, /, __Format=Format, __NotImplementedError=NotImplementedError): + if format == __Format.VALUE: + return {'x': str} + elif format == __Format.VALUE_WITH_FAKE_GLOBALS: + return {'x': int} + else: + raise __NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.STRING, + ) + + self.assertEqual(annotations, {"x": "int"}) + + def test_user_annotate_string_value_fallback(self): + # If Format.STRING and Format.VALUE_WITH_FAKE_GLOBALS are not + # supported fall back to Format.VALUE and convert to strings + def annotate(format, /, __Format=Format, __NotImplementedError=NotImplementedError): + if format == __Format.VALUE: + return {"x": str} + else: + raise __NotImplementedError(format) + + annotations = annotationlib.call_annotate_function( + annotate, + Format.STRING, + ) + + self.assertEqual(annotations, {"x": "str"}) + + def test_condition_not_stringified(self): + # Make sure the first condition isn't evaluated as True by being converted + # to a _Stringifier + def annotate(format, /): + if format == Format.FORWARDREF: + return {"x": str} + else: + raise NotImplementedError(format) + + with self.assertRaises(NotImplementedError): + annotationlib.call_annotate_function(annotate, Format.STRING) + + def test_error_from_value_raised(self): + # Test that the error from format.VALUE is raised + # if all formats fail + + class DemoException(Exception): ... + + def annotate(format, /): + if format == Format.VALUE: + raise DemoException() + else: + raise NotImplementedError(format) + + for fmt in [Format.VALUE, Format.FORWARDREF, Format.STRING]: + with self.assertRaises(DemoException): + annotationlib.call_annotate_function(annotate, format=fmt) + + class MetaclassTests(unittest.TestCase): def test_annotated_meta(self): class Meta(type): diff --git a/Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst b/Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst new file mode 100644 index 00000000000000..85ebef8ff11d5c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst @@ -0,0 +1,3 @@ +Prevent :func:`annotationlib.call_annotate_function` from calling ``__annotate__`` functions that don't support ``VALUE_WITH_FAKE_GLOBALS`` in a fake globals namespace with empty globals. + +Make ``FORWARDREF`` and ``STRING`` annotations fall back to using ``VALUE`` annotations in the case that neither their own format, nor ``VALUE_WITH_FAKE_GLOBALS`` are supported. From a490d671fad24859a31afdb7a64f090deb3346c2 Mon Sep 17 00:00:00 2001 From: Emma Smith Date: Tue, 21 Oct 2025 14:44:47 -0700 Subject: [PATCH 1221/1674] [3.14] `zlib.rst`: Link to constants and deduplicate text (GH-140115) (GH-140349) * Link to compression setting constants from compression functions * De-duplicate descriptions of the constants (cherry picked from commit 091e8513bb58747ade56a03fccb98e220c7722cc) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Victor Stinner --- Doc/library/zlib.rst | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index 50eae4547a99df..9f507f754b63ce 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -44,21 +44,20 @@ The available exception and functions in this module are: .. versionchanged:: 3.0 The result is always unsigned. -.. function:: compress(data, /, level=-1, wbits=MAX_WBITS) +.. function:: compress(data, /, level=Z_DEFAULT_COMPRESSION, wbits=MAX_WBITS) Compresses the bytes in *data*, returning a bytes object containing compressed data. *level* is an integer from ``0`` to ``9`` or ``-1`` controlling the level of compression; - ``1`` (Z_BEST_SPEED) is fastest and produces the least compression, ``9`` (Z_BEST_COMPRESSION) - is slowest and produces the most. ``0`` (Z_NO_COMPRESSION) is no compression. - The default value is ``-1`` (Z_DEFAULT_COMPRESSION). Z_DEFAULT_COMPRESSION represents a default - compromise between speed and compression (currently equivalent to level 6). + See :const:`Z_BEST_SPEED` (``1``), :const:`Z_BEST_COMPRESSION` (``9``), + :const:`Z_NO_COMPRESSION` (``0``), and the default, + :const:`Z_DEFAULT_COMPRESSION` (``-1``) for more information about these values. .. _compress-wbits: The *wbits* argument controls the size of the history buffer (or the "window size") used when compressing data, and whether a header and trailer is included in the output. It can take several ranges of values, - defaulting to ``15`` (MAX_WBITS): + defaulting to ``15`` (:const:`MAX_WBITS`): * +9 to +15: The base-two logarithm of the window size, which therefore ranges between 512 and 32768. Larger values produce @@ -82,17 +81,15 @@ The available exception and functions in this module are: The *wbits* parameter is now available to set window bits and compression type. -.. function:: compressobj(level=-1, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict]) +.. function:: compressobj(level=Z_DEFAULT_COMPRESSION, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict]) Returns a compression object, to be used for compressing data streams that won't fit into memory at once. *level* is the compression level -- an integer from ``0`` to ``9`` or ``-1``. - A value of ``1`` (Z_BEST_SPEED) is fastest and produces the least compression, - while a value of ``9`` (Z_BEST_COMPRESSION) is slowest and produces the most. - ``0`` (Z_NO_COMPRESSION) is no compression. The default value is ``-1`` (Z_DEFAULT_COMPRESSION). - Z_DEFAULT_COMPRESSION represents a default compromise between speed and compression - (currently equivalent to level 6). + See :const:`Z_BEST_SPEED` (``1``), :const:`Z_BEST_COMPRESSION` (``9``), + :const:`Z_NO_COMPRESSION` (``0``), and the default, + :const:`Z_DEFAULT_COMPRESSION` (``-1``) for more information about these values. *method* is the compression algorithm. Currently, the only supported value is :const:`DEFLATED`. @@ -107,7 +104,7 @@ The available exception and functions in this module are: *strategy* is used to tune the compression algorithm. Possible values are :const:`Z_DEFAULT_STRATEGY`, :const:`Z_FILTERED`, :const:`Z_HUFFMAN_ONLY`, - :const:`Z_RLE` (zlib 1.2.0.1) and :const:`Z_FIXED` (zlib 1.2.2.2). + :const:`Z_RLE` and :const:`Z_FIXED`. *zdict* is a predefined compression dictionary. This is a sequence of bytes (such as a :class:`bytes` object) containing subsequences that are expected @@ -221,7 +218,7 @@ Compression objects support the following methods: All pending input is processed, and a bytes object containing the remaining compressed output is returned. *mode* can be selected from the constants :const:`Z_NO_FLUSH`, :const:`Z_PARTIAL_FLUSH`, :const:`Z_SYNC_FLUSH`, - :const:`Z_FULL_FLUSH`, :const:`Z_BLOCK` (zlib 1.2.3.4), or :const:`Z_FINISH`, + :const:`Z_FULL_FLUSH`, :const:`Z_BLOCK`, or :const:`Z_FINISH`, defaulting to :const:`Z_FINISH`. Except :const:`Z_FINISH`, all constants allow compressing further bytestrings of data, while :const:`Z_FINISH` finishes the compressed stream and prevents compressing any more data. After calling :meth:`flush` @@ -339,24 +336,25 @@ behavior: .. data:: Z_NO_COMPRESSION - Compression level ``0``. + Compression level ``0``; no compression. .. versionadded:: 3.6 .. data:: Z_BEST_SPEED - Compression level ``1``. + Compression level ``1``; fastest and produces the least compression. .. data:: Z_BEST_COMPRESSION - Compression level ``9``. + Compression level ``9``; slowest and produces the most compression. .. data:: Z_DEFAULT_COMPRESSION - Default compression level (``-1``). + Default compression level (``-1``); a compromise between speed and + compression. Currently equivalent to compression level ``6``. .. data:: Z_DEFAULT_STRATEGY From 9d547dab0bb59adcd969172ef8e69540668db6a0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 22 Oct 2025 05:45:06 +0200 Subject: [PATCH 1222/1674] [3.14] gh-132835: Add defensive NULL checks to MRO resolution (GH-134763) (GH-140436) Currently, there are a few places where tp_mro could theoretically become NULL, but do not in practice. This commit adds defensive checks for NULL values to ensure that any changes do not introduce a crash and that state invariants are upheld. The assertions added in this commit are all instances where a NULL value would get passed to something not expecting a NULL, so it is better to catch an assertion failure than crash later on. There are a few cases where it is OK for the return of lookup_tp_mro to be NULL, such as when passed to is_subtype_with_mro, which handles this explicitly. (cherry picked from commit a8edca62fc6d44d16c7f86d49421be1a5ebea3e5) Co-authored-by: Emma Smith --- Objects/typeobject.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 954547eb4fb7b0..0c6c597dd8b8bf 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1658,7 +1658,7 @@ static int recurse_down_subclasses(PyTypeObject *type, PyObject *name, update_callback callback, void *data); static int -mro_hierarchy(PyTypeObject *type, PyObject *temp) +mro_hierarchy_for_complete_type(PyTypeObject *type, PyObject *temp) { ASSERT_TYPE_LOCK_HELD(); @@ -1669,6 +1669,7 @@ mro_hierarchy(PyTypeObject *type, PyObject *temp) return res; } PyObject *new_mro = lookup_tp_mro(type); + assert(new_mro != NULL); PyObject *tuple; if (old_mro != NULL) { @@ -1713,7 +1714,7 @@ mro_hierarchy(PyTypeObject *type, PyObject *temp) Py_ssize_t n = PyList_GET_SIZE(subclasses); for (Py_ssize_t i = 0; i < n; i++) { PyTypeObject *subclass = _PyType_CAST(PyList_GET_ITEM(subclasses, i)); - res = mro_hierarchy(subclass, temp); + res = mro_hierarchy_for_complete_type(subclass, temp); if (res < 0) { break; } @@ -1795,7 +1796,7 @@ type_set_bases_unlocked(PyTypeObject *type, PyObject *new_bases) if (temp == NULL) { goto bail; } - if (mro_hierarchy(type, temp) < 0) { + if (mro_hierarchy_for_complete_type(type, temp) < 0) { goto undo; } Py_DECREF(temp); @@ -3291,6 +3292,7 @@ mro_implementation_unlocked(PyTypeObject *type) */ PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, 0)); PyObject *base_mro = lookup_tp_mro(base); + assert(base_mro != NULL); Py_ssize_t k = PyTuple_GET_SIZE(base_mro); PyObject *result = PyTuple_New(k + 1); if (result == NULL) { @@ -3325,9 +3327,12 @@ mro_implementation_unlocked(PyTypeObject *type) return NULL; } + PyObject *mro_to_merge; for (Py_ssize_t i = 0; i < n; i++) { PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, i)); - to_merge[i] = lookup_tp_mro(base); + mro_to_merge = lookup_tp_mro(base); + assert(mro_to_merge != NULL); + to_merge[i] = mro_to_merge; } to_merge[n] = bases; @@ -8623,6 +8628,7 @@ type_ready_inherit(PyTypeObject *type) // Inherit slots PyObject *mro = lookup_tp_mro(type); + assert(mro != NULL); Py_ssize_t n = PyTuple_GET_SIZE(mro); for (Py_ssize_t i = 1; i < n; i++) { PyObject *b = PyTuple_GET_ITEM(mro, i); From 01b52ea5c03ed83dbf44369b75f3b158c14dd912 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 22 Oct 2025 17:44:09 +0200 Subject: [PATCH 1223/1674] [3.14] gh-116738: Add critical section to dbm/gdbm context manager (gh-140391) (gh-140459) (cherry picked from commit d51be28876ac0715b6fc674ef41618d214021348) Co-authored-by: Alper --- Modules/_dbmmodule.c | 6 +++++- Modules/_gdbmmodule.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 0cd0f043de453d..c393cde21f5491 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -523,8 +523,12 @@ dbm__enter__(PyObject *self, PyObject *Py_UNUSED(dummy)) static PyObject * dbm__exit__(PyObject *self, PyObject *Py_UNUSED(args)) { + PyObject *result; dbmobject *dp = dbmobject_CAST(self); - return _dbm_dbm_close_impl(dp); + Py_BEGIN_CRITICAL_SECTION(self); + result = _dbm_dbm_close_impl(dp); + Py_END_CRITICAL_SECTION(); + return result; } static PyMethodDef dbm_methods[] = { diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index ce8696d9225e72..d9abab19719789 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -695,7 +695,11 @@ gdbm__enter__(PyObject *self, PyObject *args) static PyObject * gdbm__exit__(PyObject *self, PyObject *args) { - return _gdbm_gdbm_close_impl((gdbmobject *)self); + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(self); + result = _gdbm_gdbm_close_impl((gdbmobject *)self); + Py_END_CRITICAL_SECTION(); + return result; } static PyMethodDef gdbm_methods[] = { From 853e5d94eb656d60396fcea9f67461f83514a395 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 22 Oct 2025 19:04:47 +0200 Subject: [PATCH 1224/1674] [3.14] gh-130317: Fix SNaN broken tests on HP PA RISC (GH-140452) (#140467) gh-130317: Fix SNaN broken tests on HP PA RISC (GH-140452) While looking at GH-140028, I found some unrelated test regressions in the 3.14 cycle. These seem to all come from GH-130317. From what I can tell, that made Python more correct than it was before. According to [0], HP PA RISC uses 1 for SNaN and thus a 0 for QNaN. [0]: https://grouper.ieee.org/groups/1788/email/msg03272.html (cherry picked from commit 76fea5596c235a7853cda8df87c3998d506e950c) Co-authored-by: Stefano Rivera --- Lib/test/test_capi/test_float.py | 5 +++++ Lib/test/test_struct.py | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_capi/test_float.py b/Lib/test/test_capi/test_float.py index f7efe0d02549a3..983b991b4f163d 100644 --- a/Lib/test/test_capi/test_float.py +++ b/Lib/test/test_capi/test_float.py @@ -1,5 +1,6 @@ import math import random +import platform import sys import unittest import warnings @@ -197,6 +198,10 @@ def test_pack_unpack_roundtrip_for_nans(self): # PyFloat_Pack/Unpack*() API. See also gh-130317 and # e.g. https://developercommunity.visualstudio.com/t/155064 signaling = 0 + if platform.machine().startswith('parisc'): + # HP PA RISC uses 0 for quiet, see: + # https://en.wikipedia.org/wiki/NaN#Encoding + signaling = 1 quiet = int(not signaling) if size == 8: payload = random.randint(signaling, 0x7ffffffffffff) diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 7df01f28f09118..75c76a36ee92f5 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -5,6 +5,7 @@ import math import operator import unittest +import platform import struct import sys import weakref @@ -917,10 +918,17 @@ def test_half_float(self): # Check that packing produces a bit pattern representing a quiet NaN: # all exponent bits and the msb of the fraction should all be 1. + if platform.machine().startswith('parisc'): + # HP PA RISC uses 0 for quiet, see: + # https://en.wikipedia.org/wiki/NaN#Encoding + expected = 0x7c + else: + expected = 0x7e + packed = struct.pack(' Date: Thu, 23 Oct 2025 12:20:16 +0200 Subject: [PATCH 1225/1674] [3.14] gh-140474: Fix memory leak in `array.array` (GH-140478) (GH-140498) gh-140474: Fix memory leak in `array.array` (GH-140478) (cherry picked from commit aa9d0a61d5c48717454f36351f0aabe4cc532de5) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/test/test_array.py | 8 ++++++++ .../2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst | 2 ++ Modules/arraymodule.c | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 58ea89c4fac833..83b3c978da3581 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1255,6 +1255,14 @@ def test_typecode_u_deprecation(self): with self.assertWarns(DeprecationWarning): array.array("u") + def test_empty_string_mem_leak_gh140474(self): + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + for _ in range(1000): + a = array.array('u', '') + self.assertEqual(len(a), 0) + self.assertEqual(a.typecode, 'u') + class UCS4Test(UnicodeTest): typecode = 'w' diff --git a/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst b/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst new file mode 100644 index 00000000000000..aca4e68b1e5e49 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst @@ -0,0 +1,2 @@ +Fix memory leak in :class:`array.array` when creating arrays from an empty +:class:`str` and the ``u`` type code. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 5d07de2fba9526..39d505c02596b8 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2838,6 +2838,9 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_SET_SIZE(self, n); self->allocated = n; } + else { + PyMem_Free(ustr); + } } else { // c == 'w' Py_ssize_t n = PyUnicode_GET_LENGTH(initial); From d1a434f7b211b7061883b8cf4c8687cf00e0c2c7 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 23 Oct 2025 15:26:58 +0100 Subject: [PATCH 1226/1674] [3.14] GH-139951: Fix major GC performance regression. Backport of GH-140262 (GH-140447) * Count number of actually tracked objects, instead of trackable objects. This ensures that untracking tuples has the desired effect of reducing GC overhead * Do not track most untrackable tuples during creation. This prevents large numbers of small tuples causing execessive GCs. --- Include/internal/pycore_gc.h | 23 ++++++++-- Lib/test/test_gc.py | 18 ++++---- ...-10-17-18-03-12.gh-issue-139951.IdwM2O.rst | 7 +++ Objects/tupleobject.c | 39 +++++++++++++++-- Python/gc.c | 43 ++++++++++--------- 5 files changed, 94 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index a6519aa086309d..fd284d0e4ecc2f 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -205,6 +205,12 @@ static inline void _PyGC_CLEAR_FINALIZED(PyObject *op) { #endif } +extern void _Py_ScheduleGC(PyThreadState *tstate); + +#ifndef Py_GIL_DISABLED +extern void _Py_TriggerGC(struct _gc_runtime_state *gcstate); +#endif + /* Tell the GC to track this object. * @@ -238,14 +244,19 @@ static inline void _PyObject_GC_TRACK( "object is in generation which is garbage collected", filename, lineno, __func__); - PyInterpreterState *interp = _PyInterpreterState_GET(); - PyGC_Head *generation0 = &interp->gc.young.head; + struct _gc_runtime_state *gcstate = &_PyInterpreterState_GET()->gc; + PyGC_Head *generation0 = &gcstate->young.head; PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); - uintptr_t not_visited = 1 ^ interp->gc.visited_space; + uintptr_t not_visited = 1 ^ gcstate->visited_space; gc->_gc_next = ((uintptr_t)generation0) | not_visited; generation0->_gc_prev = (uintptr_t)gc; + gcstate->young.count++; /* number of tracked GC objects */ + gcstate->heap_size++; + if (gcstate->young.count > gcstate->young.threshold) { + _Py_TriggerGC(gcstate); + } #endif } @@ -280,6 +291,11 @@ static inline void _PyObject_GC_UNTRACK( _PyGCHead_SET_PREV(next, prev); gc->_gc_next = 0; gc->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; + struct _gc_runtime_state *gcstate = &_PyInterpreterState_GET()->gc; + if (gcstate->young.count > 0) { + gcstate->young.count--; + } + gcstate->heap_size--; #endif } @@ -343,7 +359,6 @@ extern PyObject *_PyGC_GetReferrers(PyInterpreterState *interp, PyObject *objs); // Functions to clear types free lists extern void _PyGC_ClearAllFreeLists(PyInterpreterState *interp); -extern void _Py_ScheduleGC(PyThreadState *tstate); extern void _Py_RunGC(PyThreadState *tstate); union _PyStackRef; diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 71a4f035fbb02a..a0bdf0955041fb 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1329,6 +1329,7 @@ def setUp(self): def tearDown(self): gc.disable() + @unittest.skipIf(Py_GIL_DISABLED, "requires GC generations or increments") def test_bug1055820c(self): # Corresponds to temp2c.py in the bug report. This is pretty # elaborate. @@ -1390,10 +1391,11 @@ def callback(ignored): # The free-threaded build doesn't have multiple generations, so # just trigger a GC manually. gc.collect() + assert not detector.gc_happened while not detector.gc_happened: i += 1 - if i > 10000: - self.fail("gc didn't happen after 10000 iterations") + if i > 100000: + self.fail("gc didn't happen after 100000 iterations") self.assertEqual(len(ouch), 0) junk.append([]) # this will eventually trigger gc @@ -1464,8 +1466,8 @@ def __del__(self): gc.collect() while not detector.gc_happened: i += 1 - if i > 10000: - self.fail("gc didn't happen after 10000 iterations") + if i > 50000: + self.fail("gc didn't happen after 50000 iterations") self.assertEqual(len(ouch), 0) junk.append([]) # this will eventually trigger gc @@ -1482,8 +1484,8 @@ def test_indirect_calls_with_gc_disabled(self): detector = GC_Detector() while not detector.gc_happened: i += 1 - if i > 10000: - self.fail("gc didn't happen after 10000 iterations") + if i > 100000: + self.fail("gc didn't happen after 100000 iterations") junk.append([]) # this will eventually trigger gc try: @@ -1493,11 +1495,11 @@ def test_indirect_calls_with_gc_disabled(self): detector = GC_Detector() while not detector.gc_happened: i += 1 - if i > 10000: + if i > 100000: break junk.append([]) # this may eventually trigger gc (if it is enabled) - self.assertEqual(i, 10001) + self.assertEqual(i, 100001) finally: gc.enable() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst new file mode 100644 index 00000000000000..e03996188a7e22 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst @@ -0,0 +1,7 @@ +Fixes a regression in GC performance for a growing heap composed mostly of +small tuples. + +* Counts number of actually tracked objects, instead of trackable objects. + This ensures that untracking tuples has the desired effect of reducing GC overhead. +* Does not track most untrackable tuples during creation. + This prevents large numbers of small tuples causing excessive GCs. diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 38a130d889d0c1..c950d0da70fb86 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -156,6 +156,18 @@ _PyTuple_MaybeUntrack(PyObject *op) _PyObject_GC_UNTRACK(op); } +/* Fast, but conservative check if an object maybe tracked + May return true for an object that is not tracked, + Will always return true for an object that is tracked. + This is a temporary workaround until _PyObject_GC_IS_TRACKED + becomes fast and safe to call on non-GC objects. +*/ +static bool +maybe_tracked(PyObject *ob) +{ + return _PyType_IS_GC(Py_TYPE(ob)); +} + PyObject * PyTuple_Pack(Py_ssize_t n, ...) { @@ -163,6 +175,7 @@ PyTuple_Pack(Py_ssize_t n, ...) PyObject *o; PyObject **items; va_list vargs; + bool track = false; if (n == 0) { return tuple_get_empty(); @@ -177,10 +190,15 @@ PyTuple_Pack(Py_ssize_t n, ...) items = result->ob_item; for (i = 0; i < n; i++) { o = va_arg(vargs, PyObject *); + if (!track && maybe_tracked(o)) { + track = true; + } items[i] = Py_NewRef(o); } va_end(vargs); - _PyObject_GC_TRACK(result); + if (track) { + _PyObject_GC_TRACK(result); + } return (PyObject *)result; } @@ -377,11 +395,17 @@ _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) return NULL; } PyObject **dst = tuple->ob_item; + bool track = false; for (Py_ssize_t i = 0; i < n; i++) { PyObject *item = src[i]; + if (!track && maybe_tracked(item)) { + track = true; + } dst[i] = Py_NewRef(item); } - _PyObject_GC_TRACK(tuple); + if (track) { + _PyObject_GC_TRACK(tuple); + } return (PyObject *)tuple; } @@ -396,10 +420,17 @@ _PyTuple_FromStackRefStealOnSuccess(const _PyStackRef *src, Py_ssize_t n) return NULL; } PyObject **dst = tuple->ob_item; + bool track = false; for (Py_ssize_t i = 0; i < n; i++) { - dst[i] = PyStackRef_AsPyObjectSteal(src[i]); + PyObject *item = PyStackRef_AsPyObjectSteal(src[i]); + if (!track && maybe_tracked(item)) { + track = true; + } + dst[i] = item; + } + if (track) { + _PyObject_GC_TRACK(tuple); } - _PyObject_GC_TRACK(tuple); return (PyObject *)tuple; } diff --git a/Python/gc.c b/Python/gc.c index 41854265361b24..55546cd0099354 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -1590,7 +1590,7 @@ assess_work_to_do(GCState *gcstate) scale_factor = 2; } intptr_t new_objects = gcstate->young.count; - intptr_t max_heap_fraction = new_objects*3/2; + intptr_t max_heap_fraction = new_objects*2; intptr_t heap_fraction = gcstate->heap_size / SCAN_RATE_DIVISOR / scale_factor; if (heap_fraction > max_heap_fraction) { heap_fraction = max_heap_fraction; @@ -1605,6 +1605,9 @@ gc_collect_increment(PyThreadState *tstate, struct gc_collection_stats *stats) GC_STAT_ADD(1, collections, 1); GCState *gcstate = &tstate->interp->gc; gcstate->work_to_do += assess_work_to_do(gcstate); + if (gcstate->work_to_do < 0) { + return; + } untrack_tuples(&gcstate->young.head); if (gcstate->phase == GC_PHASE_MARK) { Py_ssize_t objects_marked = mark_at_start(tstate); @@ -1647,7 +1650,6 @@ gc_collect_increment(PyThreadState *tstate, struct gc_collection_stats *stats) gc_collect_region(tstate, &increment, &survivors, stats); gc_list_merge(&survivors, visited); assert(gc_list_is_empty(&increment)); - gcstate->work_to_do += gcstate->heap_size / SCAN_RATE_DIVISOR / scale_factor; gcstate->work_to_do -= increment_size; add_stats(gcstate, 1, stats); @@ -2231,21 +2233,11 @@ _Py_ScheduleGC(PyThreadState *tstate) } void -_PyObject_GC_Link(PyObject *op) +_Py_TriggerGC(struct _gc_runtime_state *gcstate) { - PyGC_Head *gc = AS_GC(op); - // gc must be correctly aligned - _PyObject_ASSERT(op, ((uintptr_t)gc & (sizeof(uintptr_t)-1)) == 0); - PyThreadState *tstate = _PyThreadState_GET(); - GCState *gcstate = &tstate->interp->gc; - gc->_gc_next = 0; - gc->_gc_prev = 0; - gcstate->young.count++; /* number of allocated GC objects */ - gcstate->heap_size++; - if (gcstate->young.count > gcstate->young.threshold && - gcstate->enabled && - gcstate->young.threshold && + if (gcstate->enabled && + gcstate->young.threshold != 0 && !_Py_atomic_load_int_relaxed(&gcstate->collecting) && !_PyErr_Occurred(tstate)) { @@ -2253,6 +2245,17 @@ _PyObject_GC_Link(PyObject *op) } } +void +_PyObject_GC_Link(PyObject *op) +{ + PyGC_Head *gc = AS_GC(op); + // gc must be correctly aligned + _PyObject_ASSERT(op, ((uintptr_t)gc & (sizeof(uintptr_t)-1)) == 0); + gc->_gc_next = 0; + gc->_gc_prev = 0; + +} + void _Py_RunGC(PyThreadState *tstate) { @@ -2359,6 +2362,11 @@ PyObject_GC_Del(void *op) PyGC_Head *g = AS_GC(op); if (_PyObject_GC_IS_TRACKED(op)) { gc_list_remove(g); + GCState *gcstate = get_gc_state(); + if (gcstate->young.count > 0) { + gcstate->young.count--; + } + gcstate->heap_size--; #ifdef Py_DEBUG PyObject *exc = PyErr_GetRaisedException(); if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0, @@ -2372,11 +2380,6 @@ PyObject_GC_Del(void *op) PyErr_SetRaisedException(exc); #endif } - GCState *gcstate = get_gc_state(); - if (gcstate->young.count > 0) { - gcstate->young.count--; - } - gcstate->heap_size--; PyObject_Free(((char *)op)-presize); } From 564bb00b2763d57d0379be5f522dd9a2b81b61f7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 23 Oct 2025 16:39:02 +0200 Subject: [PATCH 1227/1674] [3.14] gh-138774: use `value` to `ast.unparse` code when `str` is `None` in `ast.Interpolation` (GH-139415) (#140503) gh-138774: use `value` to `ast.unparse` code when `str` is `None` in `ast.Interpolation` (GH-139415) (cherry picked from commit 4d0849426f4c6862e50658c4e35341ffb5ab288b) Co-authored-by: George Ogden <38294960+George-Ogden@users.noreply.github.com> --- Doc/library/ast.rst | 5 + Lib/_ast_unparse.py | 7 +- Lib/test/test_unparse.py | 100 ++++++++++++++++-- ...-10-23-12-12-22.gh-issue-138774.mnh2gU.rst | 2 + 4 files changed, 102 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index d6c30aad5f13d3..83cb6e9f215869 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -364,6 +364,11 @@ Literals function call). This has the same meaning as ``FormattedValue.value``. * ``str`` is a constant containing the text of the interpolation expression. + + If ``str`` is set to ``None``, then ``value`` is used to generate code + when calling :func:`ast.unparse`. This no longer guarantees that the + generated code is identical to the original and is intended for code + generation. * ``conversion`` is an integer: * -1: no conversion diff --git a/Lib/_ast_unparse.py b/Lib/_ast_unparse.py index 16cf56f62cc1e5..1c8741b5a55483 100644 --- a/Lib/_ast_unparse.py +++ b/Lib/_ast_unparse.py @@ -658,9 +658,9 @@ def _unparse_interpolation_value(self, inner): unparser.set_precedence(_Precedence.TEST.next(), inner) return unparser.visit(inner) - def _write_interpolation(self, node, is_interpolation=False): + def _write_interpolation(self, node, use_str_attr=False): with self.delimit("{", "}"): - if is_interpolation: + if use_str_attr: expr = node.str else: expr = self._unparse_interpolation_value(node.value) @@ -678,7 +678,8 @@ def visit_FormattedValue(self, node): self._write_interpolation(node) def visit_Interpolation(self, node): - self._write_interpolation(node, is_interpolation=True) + # If `str` is set to `None`, use the `value` to generate the source code. + self._write_interpolation(node, use_str_attr=node.str is not None) def visit_Name(self, node): self.write(node.id) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 0d6b05bc660b76..35e4652a87b423 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -206,6 +206,97 @@ def test_tstrings(self): self.check_ast_roundtrip("t'foo'") self.check_ast_roundtrip("t'foo {bar}'") self.check_ast_roundtrip("t'foo {bar!s:.2f}'") + self.check_ast_roundtrip("t'{a + b}'") + self.check_ast_roundtrip("t'{a + b:x}'") + self.check_ast_roundtrip("t'{a + b!s}'") + self.check_ast_roundtrip("t'{ {a}}'") + self.check_ast_roundtrip("t'{ {a}=}'") + self.check_ast_roundtrip("t'{{a}}'") + self.check_ast_roundtrip("t''") + self.check_ast_roundtrip('t""') + self.check_ast_roundtrip("t'{(lambda x: x)}'") + self.check_ast_roundtrip("t'{t'{x}'}'") + + def test_tstring_with_nonsensical_str_field(self): + # `value` suggests that the original code is `t'{test1}`, but `str` suggests otherwise + self.assertEqual( + ast.unparse( + ast.TemplateStr( + values=[ + ast.Interpolation( + value=ast.Name(id="test1", ctx=ast.Load()), str="test2", conversion=-1 + ) + ] + ) + ), + "t'{test2}'", + ) + + def test_tstring_with_none_str_field(self): + self.assertEqual( + ast.unparse( + ast.TemplateStr( + [ast.Interpolation(value=ast.Name(id="test1"), str=None, conversion=-1)] + ) + ), + "t'{test1}'", + ) + self.assertEqual( + ast.unparse( + ast.TemplateStr( + [ + ast.Interpolation( + value=ast.Lambda( + args=ast.arguments(args=[ast.arg(arg="x")]), + body=ast.Name(id="x"), + ), + str=None, + conversion=-1, + ) + ] + ) + ), + "t'{(lambda x: x)}'", + ) + self.assertEqual( + ast.unparse( + ast.TemplateStr( + values=[ + ast.Interpolation( + value=ast.TemplateStr( + # `str` field kept here + [ast.Interpolation(value=ast.Name(id="x"), str="y", conversion=-1)] + ), + str=None, + conversion=-1, + ) + ] + ) + ), + '''t"{t'{y}'}"''', + ) + self.assertEqual( + ast.unparse( + ast.TemplateStr( + values=[ + ast.Interpolation( + value=ast.TemplateStr( + [ast.Interpolation(value=ast.Name(id="x"), str=None, conversion=-1)] + ), + str=None, + conversion=-1, + ) + ] + ) + ), + '''t"{t'{x}'}"''', + ) + self.assertEqual( + ast.unparse(ast.TemplateStr( + [ast.Interpolation(value=ast.Constant(value="foo"), str=None, conversion=114)] + )), + '''t"{'foo'!r}"''', + ) def test_strings(self): self.check_ast_roundtrip("u'foo'") @@ -813,15 +904,6 @@ def test_type_params(self): self.check_ast_roundtrip("def f[T: int = int, **P = int, *Ts = *int]():\n pass") self.check_ast_roundtrip("class C[T: int = int, **P = int, *Ts = *int]():\n pass") - def test_tstr(self): - self.check_ast_roundtrip("t'{a + b}'") - self.check_ast_roundtrip("t'{a + b:x}'") - self.check_ast_roundtrip("t'{a + b!s}'") - self.check_ast_roundtrip("t'{ {a}}'") - self.check_ast_roundtrip("t'{ {a}=}'") - self.check_ast_roundtrip("t'{{a}}'") - self.check_ast_roundtrip("t''") - class ManualASTCreationTestCase(unittest.TestCase): """Test that AST nodes created without a type_params field unparse correctly.""" diff --git a/Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst b/Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst new file mode 100644 index 00000000000000..e12f789e674454 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst @@ -0,0 +1,2 @@ +:func:`ast.unparse` now generates full source code when handling +:class:`ast.Interpolation` nodes that do not have a specified source. From 3944e9b3b24de994d46eb7f4af6eec49b3324271 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 23 Oct 2025 16:44:21 +0200 Subject: [PATCH 1228/1674] [3.14] gh-140431: Fix GC crash due to partially initialized coroutines (gh-140470) (gh-140504) The `make_gen()` function creates and tracks generator/coro objects, but doesn't fully initialize all the fields. At a minimum, we need to initialize all the fields that may be accessed by gen_traverse because the call to `compute_cr_origin()` can trigger a GC. (cherry picked from commit 574405c19e9b5de0504be46a3925027ded4495ae) Co-authored-by: Sam Gross --- .../2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst | 3 +++ Objects/genobject.c | 1 + 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst new file mode 100644 index 00000000000000..3d62d210f1f007 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst @@ -0,0 +1,3 @@ +Fix a crash in Python's :term:`garbage collector ` due to +partially initialized :term:`coroutine` objects when coroutine origin tracking +depth is enabled (:func:`sys.set_coroutine_origin_tracking_depth`). diff --git a/Objects/genobject.c b/Objects/genobject.c index f1fd995a246ed9..f429bc47678fed 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -922,6 +922,7 @@ make_gen(PyTypeObject *type, PyFunctionObject *func) gen->gi_weakreflist = NULL; gen->gi_exc_state.exc_value = NULL; gen->gi_exc_state.previous_item = NULL; + gen->gi_iframe.f_executable = PyStackRef_None; assert(func->func_name != NULL); gen->gi_name = Py_NewRef(func->func_name); assert(func->func_qualname != NULL); From 29c42cc62115367bea117d6ea0789b0420b06638 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 23 Oct 2025 17:48:26 +0200 Subject: [PATCH 1229/1674] [3.14] gh-140438: properly run the asyncio REPL tests (GH-140298) (#140507) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-140438: properly run the asyncio REPL tests (GH-140298) (cherry picked from commit 1a3da2c0700839b6e334e368ff2b600c2389763f) Co-authored-by: Bartosz Sławecki --- Lib/test/test_repl.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index 47e041ef8273a1..58bd2b5d916858 100644 --- a/Lib/test/test_repl.py +++ b/Lib/test/test_repl.py @@ -5,6 +5,7 @@ import subprocess import sys import unittest +from functools import partial from textwrap import dedent from test import support from test.support import ( @@ -27,7 +28,7 @@ raise unittest.SkipTest("test module requires subprocess") -def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw): +def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, custom=False, **kw): """Run the Python REPL with the given arguments. kw is extra keyword args to pass to subprocess.Popen. Returns a Popen @@ -41,7 +42,11 @@ def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw): # path may be used by Py_GetPath() to build the default module search # path. stdin_fname = os.path.join(os.path.dirname(sys.executable), "") - cmd_line = [stdin_fname, '-I', '-i'] + cmd_line = [stdin_fname, '-I'] + # Don't re-run the built-in REPL from interactive mode + # if we're testing a custom REPL (such as the asyncio REPL). + if not custom: + cmd_line.append('-i') cmd_line.extend(args) # Set TERM=vt100, for the rationale see the comments in spawn_python() of @@ -55,6 +60,10 @@ def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw): stdout=stdout, stderr=stderr, **kw) + +spawn_asyncio_repl = partial(spawn_repl, "-m", "asyncio", custom=True) + + def run_on_interactive_mode(source): """Spawn a new Python interpreter, pass the given input source code from the stdin and return the @@ -359,7 +368,7 @@ def f(): class TestAsyncioREPL(unittest.TestCase): def test_multiple_statements_fail_early(self): user_input = "1 / 0; print(f'afterwards: {1+1}')" - p = spawn_repl("-m", "asyncio") + p = spawn_asyncio_repl() p.stdin.write(user_input) output = kill_python(p) self.assertIn("ZeroDivisionError", output) @@ -371,7 +380,7 @@ def test_toplevel_contextvars_sync(self): var = ContextVar("var", default="failed") var.set("ok") """) - p = spawn_repl("-m", "asyncio") + p = spawn_asyncio_repl() p.stdin.write(user_input) user_input2 = dedent(""" print(f"toplevel contextvar test: {var.get()}") @@ -387,7 +396,7 @@ def test_toplevel_contextvars_async(self): from contextvars import ContextVar var = ContextVar('var', default='failed') """) - p = spawn_repl("-m", "asyncio") + p = spawn_asyncio_repl() p.stdin.write(user_input) user_input2 = "async def set_var(): var.set('ok')\n" p.stdin.write(user_input2) From 8285bc7ea2a99b571a08eb1d7883eff0c7ca7e1c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:20:21 +0200 Subject: [PATCH 1230/1674] [3.14] gh-140471: Fix buffer overflow in AST node initialization with malformed `_fields` (GH-140506) (#140509) gh-140471: Fix buffer overflow in AST node initialization with malformed `_fields` (GH-140506) (cherry picked from commit 95953b692db6cbd88139de12d81fb123293ec2d5) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/test/test_ast/test_ast.py | 9 +++++++++ .../2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst | 2 ++ Parser/asdl_c.py | 4 ++-- Python/Python-ast.c | 4 ++-- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 5dbf36c6ce4f3b..963a3e705e2b81 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -3309,6 +3309,15 @@ class MoreFieldsThanTypes(ast.AST): self.assertEqual(obj.a, 1) self.assertEqual(obj.b, 2) + def test_malformed_fields_with_bytes(self): + class BadFields(ast.AST): + _fields = (b'\xff'*64,) + _field_types = {'a': int} + + # This should not crash + with self.assertWarnsRegex(DeprecationWarning, r"Field b'\\xff\\xff.*' .*"): + obj = BadFields() + def test_complete_field_types(self): class _AllFieldTypes(ast.AST): _fields = ('a', 'b') diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst new file mode 100644 index 00000000000000..afa9326fff3aee --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst @@ -0,0 +1,2 @@ +Fix potential buffer overflow in :class:`ast.AST` node initialization when +encountering malformed :attr:`~ast.AST._fields` containing non-:class:`str`. diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index dba20226c3283a..3e252cbc4883d1 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1009,7 +1009,7 @@ def visitModule(self, mod): else { if (PyErr_WarnFormat( PyExc_DeprecationWarning, 1, - "Field '%U' is missing from %.400s._field_types. " + "Field %R is missing from %.400s._field_types. " "This will become an error in Python 3.15.", name, Py_TYPE(self)->tp_name ) < 0) { @@ -1044,7 +1044,7 @@ def visitModule(self, mod): // simple field (e.g., identifier) if (PyErr_WarnFormat( PyExc_DeprecationWarning, 1, - "%.400s.__init__ missing 1 required positional argument: '%U'. " + "%.400s.__init__ missing 1 required positional argument: %R. " "This will become an error in Python 3.15.", Py_TYPE(self)->tp_name, name ) < 0) { diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 660bc598a4862c..aac24ed7d3c0c5 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -5293,7 +5293,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) else { if (PyErr_WarnFormat( PyExc_DeprecationWarning, 1, - "Field '%U' is missing from %.400s._field_types. " + "Field %R is missing from %.400s._field_types. " "This will become an error in Python 3.15.", name, Py_TYPE(self)->tp_name ) < 0) { @@ -5328,7 +5328,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) // simple field (e.g., identifier) if (PyErr_WarnFormat( PyExc_DeprecationWarning, 1, - "%.400s.__init__ missing 1 required positional argument: '%U'. " + "%.400s.__init__ missing 1 required positional argument: %R. " "This will become an error in Python 3.15.", Py_TYPE(self)->tp_name, name ) < 0) { From 6efd78d7ab01c5daf2197c8c9e8f2db046e6d8f1 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Fri, 24 Oct 2025 13:21:44 +0530 Subject: [PATCH 1231/1674] [3.14] gh-137093: Fix race condition in `test_embed.test_bpo20891` (GH-137094) (#140524) Use a `PyEvent` instead of a lock to fix a race on the free-threaded build. (cherry picked from commit 9b451fb457a5de9ed535a0e2f41161dfaa9a419a) Co-authored-by: Peter Bierma --- Programs/_testembed.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 41cc5b145344ae..6958a1679a2a0c 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -413,9 +413,9 @@ static int test_pre_initialization_sys_options(void) /* bpo-20891: Avoid race condition when initialising the GIL */ -static void bpo20891_thread(void *lockp) +static void bpo20891_thread(void *eventp) { - PyThread_type_lock lock = *((PyThread_type_lock*)lockp); + PyEvent *event = (PyEvent *)eventp; PyGILState_STATE state = PyGILState_Ensure(); if (!PyGILState_Check()) { @@ -424,8 +424,7 @@ static void bpo20891_thread(void *lockp) } PyGILState_Release(state); - - PyThread_release_lock(lock); + _PyEvent_Notify(event); } static int test_bpo20891(void) @@ -435,27 +434,17 @@ static int test_bpo20891(void) /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not crash. */ - PyThread_type_lock lock = PyThread_allocate_lock(); - if (!lock) { - error("PyThread_allocate_lock failed!"); - return 1; - } _testembed_Py_InitializeFromConfig(); + PyEvent event = {0}; - unsigned long thrd = PyThread_start_new_thread(bpo20891_thread, &lock); + unsigned long thrd = PyThread_start_new_thread(bpo20891_thread, &event); if (thrd == PYTHREAD_INVALID_THREAD_ID) { error("PyThread_start_new_thread failed!"); return 1; } - PyThread_acquire_lock(lock, WAIT_LOCK); - - Py_BEGIN_ALLOW_THREADS - /* wait until the thread exit */ - PyThread_acquire_lock(lock, WAIT_LOCK); - Py_END_ALLOW_THREADS - PyThread_free_lock(lock); + PyEvent_Wait(&event); Py_Finalize(); From 08f6b3f422987e0f6f03960deb40ca993b19f7ba Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:45:44 +0200 Subject: [PATCH 1232/1674] [3.14] gh-136535: Tests: Correct `Py_TPFLAGS_MANAGED_DICT` in `test_class.py` (gh-136538) (gh-140532) --- Lib/test/test_class.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 4c12d43556fc2a..418dd9a4120585 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -858,7 +858,12 @@ def __init__(self, arg): from _testinternalcapi import has_inline_values -Py_TPFLAGS_MANAGED_DICT = (1 << 2) +Py_TPFLAGS_INLINE_VALUES = (1 << 2) +Py_TPFLAGS_MANAGED_DICT = (1 << 4) + +class NoManagedDict: + __slots__ = ('a',) + class Plain: pass @@ -873,11 +878,31 @@ def __init__(self): self.d = 4 +class VarSizedSubclass(tuple): + pass + + class TestInlineValues(unittest.TestCase): - def test_flags(self): - self.assertEqual(Plain.__flags__ & Py_TPFLAGS_MANAGED_DICT, Py_TPFLAGS_MANAGED_DICT) - self.assertEqual(WithAttrs.__flags__ & Py_TPFLAGS_MANAGED_DICT, Py_TPFLAGS_MANAGED_DICT) + def test_no_flags_for_slots_class(self): + flags = NoManagedDict.__flags__ + self.assertEqual(flags & Py_TPFLAGS_MANAGED_DICT, 0) + self.assertEqual(flags & Py_TPFLAGS_INLINE_VALUES, 0) + self.assertFalse(has_inline_values(NoManagedDict())) + + def test_both_flags_for_regular_class(self): + for cls in (Plain, WithAttrs): + with self.subTest(cls=cls.__name__): + flags = cls.__flags__ + self.assertEqual(flags & Py_TPFLAGS_MANAGED_DICT, Py_TPFLAGS_MANAGED_DICT) + self.assertEqual(flags & Py_TPFLAGS_INLINE_VALUES, Py_TPFLAGS_INLINE_VALUES) + self.assertTrue(has_inline_values(cls())) + + def test_managed_dict_only_for_varsized_subclass(self): + flags = VarSizedSubclass.__flags__ + self.assertEqual(flags & Py_TPFLAGS_MANAGED_DICT, Py_TPFLAGS_MANAGED_DICT) + self.assertEqual(flags & Py_TPFLAGS_INLINE_VALUES, 0) + self.assertFalse(has_inline_values(VarSizedSubclass())) def test_has_inline_values(self): c = Plain() From 4bb2f1f3224cdeaa90e8657440cc6604b93fde7c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 14:24:26 +0200 Subject: [PATCH 1233/1674] [3.14] Docs: Fix a grammatical error in `Doc/c-api/arg.rst` (GH-140525) (GH-140538) Docs: Fix a grammatical error in `Doc/c-api/arg.rst` (GH-140525) "have" -> "has" (cherry picked from commit fc2e23c2ed25bb7b23cf8a870a2e21f012735507) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/arg.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 112169635d999a..005a46a85caf82 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -160,7 +160,7 @@ There are three ways strings and buffers can be converted to C: ``w*`` (read-write :term:`bytes-like object`) [Py_buffer] This format accepts any object which implements the read-write buffer interface. It fills a :c:type:`Py_buffer` structure provided by the caller. - The buffer may contain embedded null bytes. The caller have to call + The buffer may contain embedded null bytes. The caller has to call :c:func:`PyBuffer_Release` when it is done with the buffer. ``es`` (:class:`str`) [const char \*encoding, char \*\*buffer] From a975bea9b578beef9f979b3a527d324d791bef0d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 15:36:35 +0200 Subject: [PATCH 1234/1674] [3.14] Document that PyModule_GetDef can return NULL with or without setting an exception (GH-140529) (GH-140545) (cherry picked from commit 289360ae63933c8956f87307ff091ec9ed19afed) Co-authored-by: Petr Viktorin --- Doc/c-api/module.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index c8edcecc5b419f..1089bc34369fae 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -102,6 +102,10 @@ Module Objects Return a pointer to the :c:type:`PyModuleDef` struct from which the module was created, or ``NULL`` if the module wasn't created from a definition. + On error, return ``NULL`` with an exception set. + Use :c:func:`PyErr_Occurred` to tell this case apart from a mising + :c:type:`!PyModuleDef`. + .. c:function:: PyObject* PyModule_GetFilenameObject(PyObject *module) From 11b5e0b9c285c7890ff6b1fee1964f9f810a71df Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 18:30:36 +0200 Subject: [PATCH 1235/1674] [3.14] gh-140517: fix leak in `map_next` in strict mode (GH-140543) (#140554) gh-140517: fix leak in `map_next` in strict mode (GH-140543) (cherry picked from commit be5af997f3461eee638645396866d9cd7acf18fb) Co-authored-by: Mikhail Efimov --- Lib/test/test_builtin.py | 16 +++++++++++++++ Python/bltinmodule.c | 44 +++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 413429f51096c5..5e9b087db91aad 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1384,6 +1384,22 @@ def test_map_strict(self): self.assertRaises(ValueError, tuple, map(pack, (1, 2), (1, 2), 'abc', strict=True)) + # gh-140517: Testing refleaks with mortal objects. + t1 = (None, object()) + t2 = (object(), object()) + t3 = (object(),) + + self.assertRaises(ValueError, tuple, + map(pack, t1, 'a', strict=True)) + self.assertRaises(ValueError, tuple, + map(pack, t1, t2, 'a', strict=True)) + self.assertRaises(ValueError, tuple, + map(pack, t1, t2, t3, strict=True)) + self.assertRaises(ValueError, tuple, + map(pack, 'a', t1, strict=True)) + self.assertRaises(ValueError, tuple, + map(pack, 'a', t2, t3, strict=True)) + def test_map_strict_iterators(self): x = iter(range(5)) y = [0] diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 4ab67bdee1d6ba..9b9e56a5b117c0 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1501,34 +1501,27 @@ map_next(PyObject *self) } Py_ssize_t nargs = 0; - for (i=0; i < niters; i++) { + for (i = 0; i < niters; i++) { PyObject *it = PyTuple_GET_ITEM(lz->iters, i); PyObject *val = Py_TYPE(it)->tp_iternext(it); if (val == NULL) { if (lz->strict) { goto check; } - goto exit; + goto exit_no_result; } stack[i] = val; nargs++; } result = _PyObject_VectorcallTstate(tstate, lz->func, stack, nargs, NULL); + goto exit; -exit: - for (i=0; i < nargs; i++) { - Py_DECREF(stack[i]); - } - if (stack != small_stack) { - PyMem_Free(stack); - } - return result; check: if (PyErr_Occurred()) { if (!PyErr_ExceptionMatches(PyExc_StopIteration)) { // next() on argument i raised an exception (not StopIteration) - return NULL; + goto exit_no_result; } PyErr_Clear(); } @@ -1536,9 +1529,10 @@ map_next(PyObject *self) // ValueError: map() argument 2 is shorter than argument 1 // ValueError: map() argument 3 is shorter than arguments 1-2 const char* plural = i == 1 ? " " : "s 1-"; - return PyErr_Format(PyExc_ValueError, - "map() argument %d is shorter than argument%s%d", - i + 1, plural, i); + PyErr_Format(PyExc_ValueError, + "map() argument %d is shorter than argument%s%d", + i + 1, plural, i); + goto exit_no_result; } for (i = 1; i < niters; i++) { PyObject *it = PyTuple_GET_ITEM(lz->iters, i); @@ -1546,21 +1540,33 @@ map_next(PyObject *self) if (val) { Py_DECREF(val); const char* plural = i == 1 ? " " : "s 1-"; - return PyErr_Format(PyExc_ValueError, - "map() argument %d is longer than argument%s%d", - i + 1, plural, i); + PyErr_Format(PyExc_ValueError, + "map() argument %d is longer than argument%s%d", + i + 1, plural, i); + goto exit_no_result; } if (PyErr_Occurred()) { if (!PyErr_ExceptionMatches(PyExc_StopIteration)) { // next() on argument i raised an exception (not StopIteration) - return NULL; + goto exit_no_result; } PyErr_Clear(); } // Argument i is exhausted. So far so good... } // All arguments are exhausted. Success! - goto exit; + +exit_no_result: + assert(result == NULL); + +exit: + for (i = 0; i < nargs; i++) { + Py_DECREF(stack[i]); + } + if (stack != small_stack) { + PyMem_Free(stack); + } + return result; } static PyObject * From 7545ea6b3ae053ac1e20bd2667c9678e5e1c6aaa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 21:24:17 +0200 Subject: [PATCH 1236/1674] [3.14] gh-140482: Preserve and restore `stty echo` as a test environment (GH-140519) (#140562) gh-140482: Preserve and restore `stty echo` as a test environment (GH-140519) (cherry picked from commit b3c713a0af5f5c4b5704d8019a893a1b70eba941) gh-140482: Restore `stty echo` as a test environment Co-authored-by: Barry Warsaw --- Lib/test/libregrtest/save_env.py | 26 +++++++++++++++++++ ...-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst | 1 + 2 files changed, 27 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 4cf1a075b30013..138465012a252c 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -9,6 +9,13 @@ from .utils import print_warning +# Import termios to save and restore terminal echo. This is only available on +# Unix, and it's fine if the module can't be found. +try: + import termios # noqa: F401 +except ModuleNotFoundError: + pass + class SkipTestEnvironment(Exception): pass @@ -65,6 +72,7 @@ def __init__(self, test_name, verbose, quiet, *, pgo): 'shutil_archive_formats', 'shutil_unpack_formats', 'asyncio.events._event_loop_policy', 'urllib.requests._url_tempfiles', 'urllib.requests._opener', + 'stty_echo', ) def get_module(self, name): @@ -292,6 +300,24 @@ def restore_warnings_showwarning(self, fxn): warnings = self.get_module('warnings') warnings.showwarning = fxn + def get_stty_echo(self): + termios = self.try_get_module('termios') + if not os.isatty(fd := sys.__stdin__.fileno()): + return None + attrs = termios.tcgetattr(fd) + lflags = attrs[3] + return bool(lflags & termios.ECHO) + def restore_stty_echo(self, echo): + termios = self.get_module('termios') + attrs = termios.tcgetattr(fd := sys.__stdin__.fileno()) + if echo: + # Turn echo on. + attrs[3] |= termios.ECHO + else: + # Turn echo off. + attrs[3] &= ~termios.ECHO + termios.tcsetattr(fd, termios.TCSADRAIN, attrs) + def resource_info(self): for name in self.resources: method_suffix = name.replace('.', '_') diff --git a/Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst b/Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst new file mode 100644 index 00000000000000..20747ad7f113ec --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst @@ -0,0 +1 @@ +Preserve and restore the state of ``stty echo`` as part of the test environment. From bff0455319e88ec18b73860fd2a7c7fcfde5f1c3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 22:00:21 +0200 Subject: [PATCH 1237/1674] [3.14] Add missing NEWS entry for gh-140517 (GH-140560) (GH-140565) (cherry picked from commit d78d7a50b06c4ea10d13fc2dcb42607a97f9260c) Co-authored-by: Mikhail Efimov --- .../2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst new file mode 100644 index 00000000000000..15aaea8ab027e3 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst @@ -0,0 +1,3 @@ +Fixed a reference leak when iterating over the result of :func:`map` +with ``strict=True`` when the input iterables have different lengths. +Patch by Mikhail Efimov. From 4fcc102524ace77e4a70ff51cc2ebe7b0438cb0f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 24 Oct 2025 22:53:24 +0200 Subject: [PATCH 1238/1674] [3.14] gh-140463: Fix typo in xmlrpc.client documentation (GH-140552) (#140568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-140463: Fix typo in xmlrpc.client documentation (GH-140552) Fix typo in xmlrpc.client documentation (cherry picked from commit 44b6eead21080e1abb3ca9ee2e1c7bc8e7a3c3a6) Co-authored-by: Miša Jakovljević --- Doc/library/xmlrpc.client.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 547cb50be78a78..a21c7d3e4e3ad5 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -524,7 +524,7 @@ Convenience Functions .. function:: dumps(params, methodname=None, methodresponse=None, encoding=None, allow_none=False) - Convert *params* into an XML-RPC request. or into a response if *methodresponse* + Convert *params* into an XML-RPC request, or into a response if *methodresponse* is true. *params* can be either a tuple of arguments or an instance of the :exc:`Fault` exception class. If *methodresponse* is true, only a single value can be returned, meaning that *params* must be of length 1. *encoding*, if From 568cf8b4af03484700054b7769f0d7172e45b28c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 25 Oct 2025 16:02:20 +0200 Subject: [PATCH 1239/1674] [3.14] Docs: Fix a grammatical error in `Doc/c-api/capsule.rst` (GH-140577) (GH-140580) Docs: Fix a grammatical error in `Doc/c-api/capsule.rst` (GH-140577) "who" -> "which" (cherry picked from commit 4ad599501fe8ec58ef2842d26330696820b2cc5c) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/capsule.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/capsule.rst b/Doc/c-api/capsule.rst index 64dc4f5275b512..6da020efc7f27c 100644 --- a/Doc/c-api/capsule.rst +++ b/Doc/c-api/capsule.rst @@ -15,7 +15,7 @@ Refer to :ref:`using-capsules` for more information on using these objects. .. c:type:: PyCapsule This subtype of :c:type:`PyObject` represents an opaque value, useful for C - extension modules who need to pass an opaque value (as a :c:expr:`void*` + extension modules which need to pass an opaque value (as a :c:expr:`void*` pointer) through Python code to other C code. It is often used to make a C function pointer defined in one module available to other modules, so the regular import mechanism can be used to access C APIs defined in dynamically From 96029bc4724ca2d01cb6a81e66aa159571a99b8f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 25 Oct 2025 17:39:42 +0200 Subject: [PATCH 1240/1674] [3.14] Remove unreachable break statements in _ctypes_test.c (GH-140585) (#140587) Remove unreachable break statements in _ctypes_test.c (GH-140585) (cherry picked from commit 2a1c9bd616b1b3a07c74d280e3f7e2bd94d0cc22) Co-authored-by: Shamil --- Modules/_ctypes/_ctypes_test.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 66338805007853..a0c9d8b70fee46 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -989,13 +989,10 @@ EXPORT(RECT) ReturnRect(int i, RECT ar, RECT* br, POINT cp, RECT dr, { case 0: return ar; - break; case 1: return dr; - break; case 2: return gr; - break; } return ar; From 62c9d4837863605e63d8beb59a5703dcc6a67d9b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 25 Oct 2025 17:41:04 +0200 Subject: [PATCH 1241/1674] [3.14] Fix typo in `Doc/c-api/code.rst` (GH-140586) (#140591) Fix typo in `Doc/c-api/code.rst` (GH-140586) (cherry picked from commit d74a96366df58b6e55d4a03612c3e67da2211ddd) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/code.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 717b0da8f87c7f..c9741b61254b19 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -289,7 +289,7 @@ may change without deprecation warnings. .. c:function:: Py_ssize_t PyUnstable_Eval_RequestCodeExtraIndex(freefunc free) - Return a new an opaque index value used to adding data to code objects. + Return a new opaque index value used to adding data to code objects. You generally call this function once (per interpreter) and use the result with ``PyCode_GetExtra`` and ``PyCode_SetExtra`` to manipulate From 596111546d69cb6272fe671577c198fc75d1c46b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:37:24 +0200 Subject: [PATCH 1242/1674] [3.14] gh-124694: Add versionadded note to InterpreterPoolExecutor (GH-140605) (cherry picked from commit 421a475c87771d46752c27def264e5c622a58427) Co-authored-by: Zachary Ware --- Doc/library/concurrent.futures.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 6f8043e6cf7735..c2e2f7f820f4ef 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -239,6 +239,8 @@ ThreadPoolExecutor Example InterpreterPoolExecutor ----------------------- +.. versionadded:: 3.14 + The :class:`InterpreterPoolExecutor` class uses a pool of interpreters to execute calls asynchronously. It is a :class:`ThreadPoolExecutor` subclass, which means each worker is running in its own thread. From 57ba6aedf6c11b52154e0ba17ae86bb8bcabd574 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 26 Oct 2025 10:45:34 +0100 Subject: [PATCH 1243/1674] [3.14] Docs: Fix a grammatical error in `Doc/c-api/codec.rst` (GH-140612) (#140616) Docs: Fix a grammatical error in `Doc/c-api/codec.rst` (GH-140612) (cherry picked from commit 33b2ca80bb073e25b8e23691da96cf0eda67c7bf) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/codec.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst index 8ae5c4fecd6248..9876060dd74ac4 100644 --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -7,7 +7,7 @@ Codec registry and support functions Register a new codec search function. - As side effect, this tries to load the :mod:`!encodings` package, if not yet + As a side effect, this tries to load the :mod:`!encodings` package, if not yet done, to make sure that it is always first in the list of search functions. .. c:function:: int PyCodec_Unregister(PyObject *search_function) From d664102a45cd0024878883640e29996170114bc6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 26 Oct 2025 13:00:10 +0100 Subject: [PATCH 1244/1674] [3.14] gh-133346: make `_colorize.Argparse` kw-only constructible (GH-140620) (#140621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-133346: make `_colorize.Argparse` kw-only constructible (GH-140620) Other themes are kw-only constructible. (cherry picked from commit 387ac2d2f3a9de139d2e1ad5f0dc7996af015f54) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/_colorize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_colorize.py b/Lib/_colorize.py index 4f510a7141b3d2..766b2d8b80b1a4 100644 --- a/Lib/_colorize.py +++ b/Lib/_colorize.py @@ -155,7 +155,7 @@ def __iter__(self) -> Iterator[str]: return iter(self.__dataclass_fields__) -@dataclass(frozen=True) +@dataclass(frozen=True, kw_only=True) class Argparse(ThemeSection): usage: str = ANSIColors.BOLD_BLUE prog: str = ANSIColors.BOLD_MAGENTA From 46a3fd2da56737c6343977882b0858b35bfd05cd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 26 Oct 2025 13:49:20 +0100 Subject: [PATCH 1245/1674] [3.14] gh-133346: add tests for `_colorize.Theme` (GH-139687) (#140622) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gh-133346: add tests for `_colorize.Theme` (GH-139687) (cherry picked from commit 37827c17526b7d3e1275861a1207be71aef6b284) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test__colorize.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Lib/test/test__colorize.py b/Lib/test/test__colorize.py index b2f0bb1386fe5b..3ac89987f91e44 100644 --- a/Lib/test/test__colorize.py +++ b/Lib/test/test__colorize.py @@ -1,4 +1,5 @@ import contextlib +import dataclasses import io import sys import unittest @@ -21,6 +22,41 @@ def supports_virtual_terminal(): return contextlib.nullcontext() +class TestTheme(unittest.TestCase): + + def test_attributes(self): + # only theme configurations attributes by default + for field in dataclasses.fields(_colorize.Theme): + with self.subTest(field.name): + self.assertIsSubclass(field.type, _colorize.ThemeSection) + self.assertIsNotNone(field.default_factory) + + def test_copy_with(self): + theme = _colorize.Theme() + + copy = theme.copy_with() + self.assertEqual(theme, copy) + + unittest_no_colors = _colorize.Unittest.no_colors() + copy = theme.copy_with(unittest=unittest_no_colors) + self.assertEqual(copy.argparse, theme.argparse) + self.assertEqual(copy.syntax, theme.syntax) + self.assertEqual(copy.traceback, theme.traceback) + self.assertEqual(copy.unittest, unittest_no_colors) + + def test_no_colors(self): + # idempotence test + theme_no_colors = _colorize.Theme().no_colors() + theme_no_colors_no_colors = theme_no_colors.no_colors() + self.assertEqual(theme_no_colors, theme_no_colors_no_colors) + + # attributes check + for section in dataclasses.fields(_colorize.Theme): + with self.subTest(section.name): + section_theme = getattr(theme_no_colors, section.name) + self.assertEqual(section_theme, section.type.no_colors()) + + class TestColorizeFunction(unittest.TestCase): def test_colorized_detection_checks_for_environment_variables(self): def check(env, fallback, expected): From 30ee67b2e408fecc61ff20a001b93d85c9815838 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 26 Oct 2025 16:15:49 +0100 Subject: [PATCH 1246/1674] [3.14] gh-137568: Ignore startup file in `test_dumb_terminal_exits_cleanly` (GH-140295) (GH-140628) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-137568: Ignore startup file in `test_dumb_terminal_exits_cleanly` (GH-140295) (cherry picked from commit 06c779474c7f53bccb8ebf42c66e73b2488bf488) Co-authored-by: Bartosz Sławecki --- Lib/test/test_pyrepl/test_pyrepl.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index 50d7e72060ba23..c1485af524aebc 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1406,6 +1406,9 @@ class TestDumbTerminal(ReplTestCase): def test_dumb_terminal_exits_cleanly(self): env = os.environ.copy() env.pop('PYTHON_BASIC_REPL', None) + # Ignore PYTHONSTARTUP to not pollute the output + # with an unrelated traceback. See GH-137568. + env.pop('PYTHONSTARTUP', None) env.update({"TERM": "dumb"}) output, exit_code = self.run_repl("exit()\n", env=env) self.assertEqual(exit_code, 0) From 842c49b35432a5f0bcbe1145f0f8cea904249cd4 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Sun, 26 Oct 2025 16:19:18 +0100 Subject: [PATCH 1247/1674] [3.14] gh-140593: Fix a memory leak in function `my_ElementDeclHandler` of `pyexpat` (GH-140602) (#140629) [3.14] gh-140593: Fix a memory leak in function `my_ElementDeclHandler` of `pyexpat` (GH-140602) Ensure that the memory allocated for the content model passed to `my_ElementDeclHandler` is freed in all error paths. (cherry picked from commit e34a5e33049ce845de646cf24a498766a2da3586) --- Lib/test/test_pyexpat.py | 18 ++++++++++++++++++ ...5-10-25-21-26-16.gh-issue-140593.OxlLc9.rst | 3 +++ Modules/pyexpat.c | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index a0914304638a96..5c8189b33c3285 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -4,6 +4,7 @@ import os import sys import sysconfig +import textwrap import unittest import traceback from io import BytesIO @@ -668,6 +669,23 @@ def test_change_size_2(self): parser.Parse(xml2, True) self.assertEqual(self.n, 4) +class ElementDeclHandlerTest(unittest.TestCase): + def test_trigger_leak(self): + # Unfixed, this test would leak the memory of the so-called + # "content model" in function ``my_ElementDeclHandler`` of pyexpat. + # See https://github.com/python/cpython/issues/140593. + data = textwrap.dedent('''\ + + ]> + + ''').encode('UTF-8') + + parser = expat.ParserCreate() + parser.NotStandaloneHandler = lambda: 1.234 # arbitrary float + parser.ElementDeclHandler = lambda _1, _2: None + self.assertRaises(TypeError, parser.Parse, data, True) + class MalformedInputTest(unittest.TestCase): def test1(self): xml = b"\0\r\n" diff --git a/Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst b/Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst new file mode 100644 index 00000000000000..612ad82dc64309 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst @@ -0,0 +1,3 @@ +:mod:`xml.parsers.expat`: Fix a memory leak that could affect users with +:meth:`~xml.parsers.expat.xmlparser.ElementDeclHandler` set to a custom +element declaration handler. Patch by Sebastian Pipping. diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 502ebcdc56eb37..d55ad3cdeef2a8 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -597,7 +597,7 @@ my_ElementDeclHandler(void *userData, PyObject *modelobj, *nameobj; if (PyErr_Occurred()) - return; + goto finally; if (flush_character_buffer(self) < 0) goto finally; From 97c59f9d61f28a86ab4e470fd5382848c9b5536f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 27 Oct 2025 10:21:43 +0100 Subject: [PATCH 1248/1674] [3.14] Remove dead stores to 'size' in UTF-8 decoder (unicodeobject.c) (GH-140637) (#140658) Remove dead stores to 'size' in UTF-8 decoder (unicodeobject.c) (GH-140637) (cherry picked from commit 7d70a147f58edabc9691869a0e8b606c9c3ac184) Co-authored-by: Shamil --- Objects/unicodeobject.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 0ff2d71924ff9c..c71c5720ea090e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5497,7 +5497,6 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, if (maxchr <= 255) { memcpy(PyUnicode_1BYTE_DATA(u), s, pos); s += pos; - size -= pos; writer.pos = pos; } @@ -5545,7 +5544,6 @@ unicode_decode_utf8_writer(_PyUnicodeWriter *writer, return 0; } s += decoded; - size -= decoded; } return unicode_decode_utf8_impl(writer, starts, s, end, From 5ae4612e72c315ac18edaeee9e4851654844a454 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 27 Oct 2025 10:51:14 +0100 Subject: [PATCH 1249/1674] [3.14] Docs: Replace "encoder" with "decoder" in `Doc/c-api/codec.rst` (GH-140613) (#140661) Docs: Replace "encoder" with "decoder" in `Doc/c-api/codec.rst` (GH-140613) (cherry picked from commit d12086e8228323cc2e31d263f1aeb8190bd1c1d9) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/codec.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst index 9876060dd74ac4..08a99245ad6528 100644 --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -39,7 +39,7 @@ Codec registry and support functions *object* is passed through the decoder function found for the given *encoding* using the error handling method defined by *errors*. *errors* may be ``NULL`` to use the default method defined for the codec. Raises a - :exc:`LookupError` if no encoder can be found. + :exc:`LookupError` if no decoder can be found. Codec lookup API From 87afee231278417f87078bf3a225e012c72e9339 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:08:00 +0100 Subject: [PATCH 1250/1674] [3.14] gh-140633: AppleFrameworkLoader: Ignore AttributeError when setting __file__ (GH-140635) (GH-140660) (cherry picked from commit 3416e7c8dc004773d814b6f9ec9562434ed961cd) Co-authored-by: Petr Viktorin --- Lib/importlib/_bootstrap_external.py | 8 +++++++- .../2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 8a1437a2cc5d1e..d19c20b6d62a74 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -1498,7 +1498,13 @@ def create_module(self, spec): ) # Ensure that the __file__ points at the .fwork location - module.__file__ = path + try: + module.__file__ = path + except AttributeError: + # Not important enough to report. + # (The error is also ignored in _bootstrap._init_module_attrs or + # import_run_extension in import.c) + pass return module diff --git a/Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst b/Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst new file mode 100644 index 00000000000000..9675a5d427a0d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst @@ -0,0 +1,2 @@ +Ignore :exc:`AttributeError` when setting a module's ``__file__`` attribute +when loading an extension module packaged as Apple Framework. From ce1deb947ef7fbf58bf0a6dfe35bf7e1b543e381 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:15:49 +0100 Subject: [PATCH 1251/1674] [3.14] gh-140487: Fix Py_RETURN_NOTIMPLEMENTED in limited C API 3.11 (GH-140636) (#140668) gh-140487: Fix Py_RETURN_NOTIMPLEMENTED in limited C API 3.11 (GH-140636) Py_RETURN_NONE, Py_RETURN_TRUE and Py_RETURN_FALSE have already been fixed by commit 9258f3da9175134d03f2c8c7c7eed223802ad945 (issue gh-134989). (cherry picked from commit c6364775236e3c634c3393c7f50fece50611245f) Co-authored-by: Victor Stinner --- Include/object.h | 9 +++++++-- .../C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst diff --git a/Include/object.h b/Include/object.h index 9901815bd64604..4d577d0e32d791 100644 --- a/Include/object.h +++ b/Include/object.h @@ -674,8 +674,13 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ # define Py_NotImplemented (&_Py_NotImplementedStruct) #endif -/* Macro for returning Py_NotImplemented from a function */ -#define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented +/* Macro for returning Py_NotImplemented from a function. Only treat + * Py_NotImplemented as immortal in the limited C API 3.12 and newer. */ +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030c0000 +# define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(Py_NotImplemented) +#else +# define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented +#endif /* Rich comparison opcodes */ #define Py_LT 0 diff --git a/Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst b/Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst new file mode 100644 index 00000000000000..16b0d9d4084ba0 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst @@ -0,0 +1,2 @@ +Fix :c:macro:`Py_RETURN_NOTIMPLEMENTED` in limited C API 3.11 and older: +don't treat ``Py_NotImplemented`` as immortal. Patch by Victor Stinner. From c1bfd4cb9c86a35c03ca330589ff0eda4d5ce77c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:29:43 +0100 Subject: [PATCH 1252/1674] [3.14] gh-140358: Bring back elapsed time and unreachable count to gc debug output (GH-140359) (#140405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pål Grønås Drange --- Lib/test/test_gc.py | 26 +++++++++++++++++++ ...-10-20-11-24-36.gh-issue-140358.UQuKdV.rst | 4 +++ Python/gc.c | 13 ++++++++++ 3 files changed, 43 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index a0bdf0955041fb..a6adc2c98514ba 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -776,6 +776,32 @@ def __del__(self): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') + @unittest.skipIf(Py_GIL_DISABLED, "requires GC generations or increments") + def test_gc_debug_stats(self): + # Checks that debug information is printed to stderr + # when DEBUG_STATS is set. + code = """if 1: + import gc + gc.set_debug(%s) + gc.collect() + """ + _, _, err = assert_python_ok("-c", code % "gc.DEBUG_STATS") + self.assertRegex(err, b"gc: collecting generation [0-9]+") + self.assertRegex( + err, + b"gc: objects in each generation: [0-9]+ [0-9]+ [0-9]+", + ) + self.assertRegex( + err, b"gc: objects in permanent generation: [0-9]+" + ) + self.assertRegex( + err, + b"gc: done, .* unreachable, .* uncollectable, .* elapsed", + ) + + _, _, err = assert_python_ok("-c", code % "0") + self.assertNotIn(b"elapsed", err) + def test_global_del_SystemExit(self): code = """if 1: class ClassWithDel: diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst new file mode 100644 index 00000000000000..739228f7e36f20 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst @@ -0,0 +1,4 @@ +Restore elapsed time and unreachable object count in GC debug output. These +were inadvertently removed during a refactor of ``gc.c``. The debug log now +again reports elapsed collection time and the number of unreachable objects. +Contributed by Pål Grønås Drange. diff --git a/Python/gc.c b/Python/gc.c index 55546cd0099354..c87d714ce4cfb1 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -2024,8 +2024,10 @@ _PyGC_Collect(PyThreadState *tstate, int generation, _PyGC_Reason reason) if (reason != _Py_GC_REASON_SHUTDOWN) { invoke_gc_callback(gcstate, "start", generation, &stats); } + PyTime_t t1; if (gcstate->debug & _PyGC_DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); + (void)PyTime_PerfCounterRaw(&t1); show_stats_each_generations(gcstate); } if (PyDTrace_GC_START_ENABLED()) { @@ -2062,6 +2064,17 @@ _PyGC_Collect(PyThreadState *tstate, int generation, _PyGC_Reason reason) #endif validate_spaces(gcstate); _Py_atomic_store_int(&gcstate->collecting, 0); + + if (gcstate->debug & _PyGC_DEBUG_STATS) { + PyTime_t t2; + (void)PyTime_PerfCounterRaw(&t2); + double d = PyTime_AsSecondsDouble(t2 - t1); + PySys_WriteStderr( + "gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n", + stats.collected + stats.uncollectable, stats.uncollectable, d + ); + } + return stats.uncollectable + stats.collected; } From 3bb0eb4ca97721de85ad394d0d010d9da2904da2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 27 Oct 2025 21:08:57 +0100 Subject: [PATCH 1253/1674] [3.14] gh-140634: Fix a reference counting bug in os.sched_param.__reduce__() (GH-140667) (GH-140685) (cherry picked from commit 364ae607d8035db8ba92486ebebd8225446c1a90) Co-authored-by: Serhiy Storchaka --- Lib/test/test_posix.py | 8 ++++++++ .../2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst | 1 + Modules/posixmodule.c | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 0bb65fe717d359..aad6fc6b4b619b 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1366,6 +1366,14 @@ def test_sched_param(self): self.assertNotEqual(newparam, param) self.assertEqual(newparam.sched_priority, 0) + @requires_sched + def test_bug_140634(self): + sched_priority = float('inf') # any new reference + param = posix.sched_param(sched_priority) + param.__reduce__() + del sched_priority, param # should not crash + support.gc_collect() # just to be sure + @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function") def test_sched_rr_get_interval(self): try: diff --git a/Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst b/Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst new file mode 100644 index 00000000000000..b1ba9b26ad5431 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst @@ -0,0 +1 @@ +Fix a reference counting bug in :meth:`!os.sched_param.__reduce__`. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 2dad3352982f7b..9295324f6c1eeb 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8270,7 +8270,7 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) static PyObject * os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(dummy)) { - return Py_BuildValue("(O(N))", Py_TYPE(self), PyStructSequence_GetItem(self, 0)); + return Py_BuildValue("(O(O))", Py_TYPE(self), PyStructSequence_GetItem(self, 0)); } static PyMethodDef os_sched_param_reduce_method = { From 2e216728038a03d387231f39ded091ec318ba61b Mon Sep 17 00:00:00 2001 From: Mikhail Efimov Date: Tue, 28 Oct 2025 02:49:10 +0300 Subject: [PATCH 1254/1674] [3.14] gh-140104: Set next_instr properly in the JIT during exceptions (GH-140233) (GH-140687) Co-authored-by: Ken Jin Co-authored-by: devdanzin <74280297+devdanzin@users.noreply.github.com> Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> --- Lib/test/test_capi/test_opt.py | 21 +++++++++++++++++++ ...-10-16-21-47-00.gh-issue-140104.A8SQIm.rst | 2 ++ Python/ceval_macros.h | 4 +++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index c74c8ee0eef8e2..bdcda12c76e1bc 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1972,6 +1972,27 @@ def testfunc(n): assert ex is not None """)) + def test_next_instr_for_exception_handler_set(self): + # gh-140104: We just want the exception to be caught properly. + def f(): + for i in range(TIER2_THRESHOLD + 3): + try: + undefined_variable(i) + except Exception: + pass + + f() + + def test_next_instr_for_exception_handler_set_lasts_instr(self): + # gh-140104: We just want the exception to be caught properly. + def f(): + a_list = [] + for _ in range(TIER2_THRESHOLD + 3): + try: + a_list[""] = 0 + except Exception: + pass + def global_identity(x): return x diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst new file mode 100644 index 00000000000000..1c18cbc9ad0588 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst @@ -0,0 +1,2 @@ +Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported +by Daniel Diniz. diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 187ec8fdd26584..df1950416c2ddd 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -368,7 +368,9 @@ do { \ frame = tstate->current_frame; \ stack_pointer = _PyFrame_GetStackPointer(frame); \ if (next_instr == NULL) { \ - next_instr = frame->instr_ptr; \ + /* gh-140104: The exception handler expects frame->instr_ptr + to after this_instr, not this_instr! */ \ + next_instr = frame->instr_ptr + 1; \ JUMP_TO_LABEL(error); \ } \ DISPATCH(); \ From 3fa7bf4b269c5dd76140a83712117e6da4061cc9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:13:30 +0100 Subject: [PATCH 1255/1674] [3.14] gh-140189: Add CI job to test iOS builds. (GH-140190) (#140696) Adds a CI configuration to test iOS builds on every build. (cherry picked from commit f4e6370582380b12286b6f5b625c282eaf12c84a) Co-authored-by: Russell Keith-Magee Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/build.yml | 25 +++++++++ Apple/__main__.py | 54 +++++++++++++++---- Apple/testbed/__main__.py | 5 ++ ...-10-16-11-30-53.gh-issue-140189.YCrUyt.rst | 1 + 4 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3710adf9f12fc9..d556bd02956d7a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -386,6 +386,29 @@ jobs: - name: Build and test run: ./Android/android.py ci --fast-ci ${{ matrix.arch }}-linux-android + build-ios: + name: iOS + needs: build-context + if: needs.build-context.outputs.run-tests == 'true' + timeout-minutes: 60 + runs-on: macos-15 + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + # GitHub recommends explicitly selecting the desired Xcode version: + # https://github.com/actions/runner-images/issues/12541#issuecomment-3083850140 + # This became a necessity as a result of + # https://github.com/actions/runner-images/issues/12541 and + # https://github.com/actions/runner-images/issues/12751. + - name: Select Xcode version + run: | + sudo xcode-select --switch /Applications/Xcode_16.4.app + + - name: Build and test + run: python3 Apple ci iOS --fast-ci --simulator 'iPhone 16e,OS=18.5' + build-wasi: name: 'WASI' needs: build-context @@ -694,6 +717,7 @@ jobs: - build-ubuntu - build-ubuntu-ssltests - build-android + - build-ios - build-wasi - test-hypothesis - build-asan @@ -728,6 +752,7 @@ jobs: build-ubuntu, build-ubuntu-ssltests, build-android, + build-ios, build-wasi, test-hypothesis, build-asan, diff --git a/Apple/__main__.py b/Apple/__main__.py index 96c2d34fbe0959..34744871f681ea 100644 --- a/Apple/__main__.py +++ b/Apple/__main__.py @@ -823,7 +823,7 @@ def test(context: argparse.Namespace, host: str | None = None) -> None: + [ "--", "test", - "--slow-ci" if context.slow else "--fast-ci", + f"--{context.ci_mode}-ci", "--single-process", "--no-randomize", # Timeout handling requires subprocesses; explicitly setting @@ -836,11 +836,39 @@ def test(context: argparse.Namespace, host: str | None = None) -> None: ) +def apple_sim_host(platform_name: str) -> str: + """Determine the native simulator target for this platform.""" + for _, slice_parts in HOSTS[platform_name].items(): + for host_triple in slice_parts: + parts = host_triple.split('-') + if parts[0] == platform.machine() and parts[-1] == "simulator": + return host_triple + + raise KeyError(platform_name) + + def ci(context: argparse.Namespace) -> None: - """The implementation of the "ci" command.""" + """The implementation of the "ci" command. + + In "Fast" mode, this compiles the build python, and the simulator for the + build machine's architecture; and runs the test suite with `--fast-ci` + configuration. + + In "Slow" mode, it compiles the build python, plus all candidate + architectures (both device and simulator); then runs the test suite with + `--slow-ci` configuration. + """ clean(context, "all") - build(context, host="all") - test(context, host="all") + if context.ci_mode == "slow": + # In slow mode, build and test the full XCframework + build(context, host="all") + test(context, host="all") + else: + # In fast mode, just build the simulator platform. + sim_host = apple_sim_host(context.platform) + build(context, host="build") + build(context, host=sim_host) + test(context, host=sim_host) def parse_args() -> argparse.Namespace: @@ -947,11 +975,13 @@ def parse_args() -> argparse.Namespace: "an ARM64 iPhone 16 Pro simulator running iOS 26.0." ), ) - cmd.add_argument( - "--slow", - action="store_true", - help="Run tests with --slow-ci options.", - ) + group = cmd.add_mutually_exclusive_group() + group.add_argument( + "--fast-ci", action="store_const", dest="ci_mode", const="fast", + help="Add test arguments for GitHub Actions") + group.add_argument( + "--slow-ci", action="store_const", dest="ci_mode", const="slow", + help="Add test arguments for buildbots") for subcommand in [configure_build, configure_host, build, ci]: subcommand.add_argument( @@ -1012,4 +1042,10 @@ def signal_handler(*args): if __name__ == "__main__": + # 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) + main() diff --git a/Apple/testbed/__main__.py b/Apple/testbed/__main__.py index 4a1333380cdb6d..f3407ecdf7e734 100644 --- a/Apple/testbed/__main__.py +++ b/Apple/testbed/__main__.py @@ -412,4 +412,9 @@ def main(): if __name__ == "__main__": + # 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) main() diff --git a/Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst b/Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst new file mode 100644 index 00000000000000..a1b81659242670 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst @@ -0,0 +1 @@ +iOS builds were added to CI. From 84e01df17536cf1431506d89424bd2870a633971 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:24:11 +0100 Subject: [PATCH 1256/1674] [3.14] gh-134160: Add more comments for the xxlimited module (GH-140214) (GH-140664) (cherry picked from commit 18e4a89e42c681fe035d4d39a71e79d3c6b70903) Co-authored-by: Petr Viktorin --- Modules/xxlimited.c | 60 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index 0480fb0849876b..09c8d9487f5426 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -14,7 +14,9 @@ This module roughly corresponds to:: class Xxo: - """A class that explicitly stores attributes in an internal dict""" + """A class that explicitly stores attributes in an internal dict + (to simulate custom attribute handling). + """ def __init__(self): # In the C class, "_x_attr" is not accessible from Python code @@ -85,13 +87,16 @@ typedef struct { // Instance state typedef struct { PyObject_HEAD - PyObject *x_attr; /* Attributes dictionary */ + PyObject *x_attr; /* Attributes dictionary. + * May be NULL, which acts as an + * empty dict. + */ char x_buffer[BUFSIZE]; /* buffer for Py_buffer */ Py_ssize_t x_exports; /* how many buffer are exported */ } XxoObject; #define XxoObject_CAST(op) ((XxoObject *)(op)) -// XXX: no good way to do this yet +// TODO: full support for type-checking was added in 3.14 (Py_tp_token) // #define XxoObject_Check(v) Py_IS_TYPE(v, Xxo_Type) static XxoObject * @@ -112,8 +117,13 @@ newXxoObject(PyObject *module) return self; } -/* Xxo finalization */ +/* Xxo finalization. + * + * Types that store references to other PyObjects generally need to implement + * the GC slots: traverse, clear, dealloc, and (optionally) finalize. + */ +// traverse: Visit all references from an object, including its type static int Xxo_traverse(PyObject *op, visitproc visit, void *arg) { @@ -126,6 +136,7 @@ Xxo_traverse(PyObject *op, visitproc visit, void *arg) return 0; } +// clear: drop references in order to break all reference cycles static int Xxo_clear(PyObject *op) { @@ -134,6 +145,8 @@ Xxo_clear(PyObject *op) return 0; } +// finalize: like clear, but should leave the object in a consistent state. +// Equivalent to `__del__` in Python. static void Xxo_finalize(PyObject *op) { @@ -141,6 +154,7 @@ Xxo_finalize(PyObject *op) Py_CLEAR(self->x_attr); } +// dealloc: drop all remaining references and free memory static void Xxo_dealloc(PyObject *self) { @@ -155,6 +169,7 @@ Xxo_dealloc(PyObject *self) /* Xxo attribute handling */ +// Get an attribute. static PyObject * Xxo_getattro(PyObject *op, PyObject *name) { @@ -168,9 +183,12 @@ Xxo_getattro(PyObject *op, PyObject *name) return NULL; } } + // Fall back to generic implementation (this handles special attributes, + // raising AttributeError, etc.) return PyObject_GenericGetAttr(op, name); } +// Set or delete an attribute. static int Xxo_setattro(PyObject *op, PyObject *name, PyObject *v) { @@ -198,7 +216,9 @@ Xxo_setattro(PyObject *op, PyObject *name, PyObject *v) } } -/* Xxo methods */ +/* Xxo methods: C functions plus a PyMethodDef array that lists them and + * specifies metadata. + */ static PyObject * Xxo_demo(PyObject *op, PyTypeObject *defining_class, @@ -234,7 +254,10 @@ static PyMethodDef Xxo_methods[] = { {NULL, NULL} /* sentinel */ }; -/* Xxo buffer interface */ +/* Xxo buffer interface: C functions later referenced from PyType_Slot array. + * Other interfaces (e.g. for sequence-like or number-like types) are defined + * similarly. + */ static int Xxo_getbuffer(PyObject *op, Py_buffer *view, int flags) @@ -300,6 +323,7 @@ static PyType_Spec Xxo_Type_spec = { /* Str type definition*/ static PyType_Slot Str_Type_slots[] = { + // slots array intentionally kept empty {0, 0}, /* sentinel */ }; @@ -400,12 +424,32 @@ xx_modexec(PyObject *m) } static PyModuleDef_Slot xx_slots[] = { + + /* exec function to initialize the module (called as part of import + * after the object was added to sys.modules) + */ {Py_mod_exec, xx_modexec}, + + /* Signal that this module supports being loaded in multiple interpreters + * with separate GILs (global interpreter locks). + * See "Isolating Extension Modules" on how to prepare a module for this: + * https://docs.python.org/3/howto/isolating-extensions.html + */ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, + + /* Signal that this module does not rely on the GIL for its own needs. + * Without this slot, free-threaded builds of CPython will enable + * the GIL when this module is loaded. + */ {Py_mod_gil, Py_MOD_GIL_NOT_USED}, + {0, NULL} }; +// Module finalization: modules that hold references in their module state +// need to implement the fullowing GC hooks. They're similar to the ones for +// types (see "Xxo finalization"). + static int xx_traverse(PyObject *module, visitproc visit, void *arg) { @@ -444,7 +488,9 @@ static struct PyModuleDef xxmodule = { }; -/* Export function for the module (*must* be called PyInit_xx) */ +/* Export function for the module. *Must* be called PyInit_xx; usually it is + * the only non-`static` object in a module definition. + */ PyMODINIT_FUNC PyInit_xxlimited(void) From 02604314ba3e97cc1918520e9ef5c0c4a6e7fe47 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:45:27 +0100 Subject: [PATCH 1257/1674] [3.14] GH-140590: Fix setstate for functools.partial C-module (GH-140671) (#140698) GH-140590: Fix setstate for functools.partial C-module (GH-140671) (cherry picked from commit d26686a7f87d63499f7296c0811fa0535637a93b) Co-authored-by: Sergey Miryanov Co-authored-by: Mikhail Efimov --- Lib/test/test_functools.py | 3 +++ .../Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst | 2 ++ Modules/_functoolsmodule.c | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index f7e09fd771eaf2..ce9e7f6d57dd3c 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -406,6 +406,7 @@ def test_setstate(self): def test_setstate_errors(self): f = self.partial(signature) + self.assertRaises(TypeError, f.__setstate__, (capture, (), {})) self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, {}, None)) self.assertRaises(TypeError, f.__setstate__, [capture, (), {}, None]) @@ -413,6 +414,8 @@ def test_setstate_errors(self): self.assertRaises(TypeError, f.__setstate__, (capture, None, {}, None)) self.assertRaises(TypeError, f.__setstate__, (capture, [], {}, None)) self.assertRaises(TypeError, f.__setstate__, (capture, (), [], None)) + self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, ())) + self.assertRaises(TypeError, f.__setstate__, (capture, (), {}, 'test')) def test_setstate_subclasses(self): f = self.partial(signature) diff --git a/Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst b/Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst new file mode 100644 index 00000000000000..802183673cfacc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst @@ -0,0 +1,2 @@ +Fix arguments checking for the :meth:`!functools.partial.__setstate__` that +may lead to internal state corruption and crash. Patch by Sergey Miryanov. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 3d45da493f4b3d..3420e7d8c37b74 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -699,7 +699,8 @@ partial_setstate(PyObject *self, PyObject *state) if (!PyArg_ParseTuple(state, "OOOO", &fn, &fnargs, &kw, &dict) || !PyCallable_Check(fn) || !PyTuple_Check(fnargs) || - (kw != Py_None && !PyDict_Check(kw))) + (kw != Py_None && !PyDict_Check(kw)) || + (dict != Py_None && !PyDict_Check(dict))) { PyErr_SetString(PyExc_TypeError, "invalid partial state"); return NULL; From 6822b135f2f36c5e3ae35c99eb5c2a13083cb57e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 28 Oct 2025 18:33:34 +0100 Subject: [PATCH 1258/1674] [3.14] gh-140657: Don't rerun test_import single phase init test (GH-140712) (#140713) gh-140657: Don't rerun test_import single phase init test (GH-140712) test_basic_multiple_interpreters_main_no_reset() leaks memory: import_in_subinterp() is called with postcleanup=False. (cherry picked from commit c6d4c79c9abac5c5cc2e7b429d72946d15c5e132) Co-authored-by: Victor Stinner --- Lib/test/test_import/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index b71a36ec2f7aab..95121debbbfa74 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -3160,6 +3160,7 @@ def test_check_state_first(self): # Also, we test with a single-phase module that has global state, # which is shared by all interpreters. + @no_rerun(reason="module state is not cleared (see gh-140657)") @requires_subinterpreters def test_basic_multiple_interpreters_main_no_reset(self): # without resetting; already loaded in main interpreter From 52338ec6cc8b1ed12c688f39d32c79fe2563f2b7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 28 Oct 2025 21:05:28 +0100 Subject: [PATCH 1259/1674] [3.14] gh-139588: Increase maximum LaTeX list depth (GH-140709) (#140724) Co-authored-by: Maciej Olko Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/conf.py b/Doc/conf.py index a8e376c0ae44fe..f1dda10052e109 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -359,6 +359,7 @@ 'papersize': 'a4paper', # The font size ('10pt', '11pt' or '12pt'). 'pointsize': '10pt', + 'maxlistdepth': '8', # See https://github.com/python/cpython/issues/139588 } # Grouping the document tree into LaTeX files. List of tuples From 8f322ad7b9f84317bbd9e904b016d2f4ef9146d1 Mon Sep 17 00:00:00 2001 From: Mikhail Efimov Date: Wed, 29 Oct 2025 10:17:49 +0300 Subject: [PATCH 1260/1674] [3.14] gh-139951: Tests on tuple GC tracking (GH-140575) (#140701) --- Lib/test/test_capi/test_tuple.py | 13 +++++++++++++ Lib/test/test_tuple.py | 30 ++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_capi/test_tuple.py b/Lib/test/test_capi/test_tuple.py index 7c07bc64e247c5..be6c9155831206 100644 --- a/Lib/test/test_capi/test_tuple.py +++ b/Lib/test/test_capi/test_tuple.py @@ -14,6 +14,12 @@ class TupleSubclass(tuple): class CAPITest(unittest.TestCase): + def _not_tracked(self, t): + self.assertFalse(gc.is_tracked(t), t) + + def _tracked(self, t): + self.assertTrue(gc.is_tracked(t), t) + def test_check(self): # Test PyTuple_Check() check = _testlimitedcapi.tuple_check @@ -52,11 +58,14 @@ def test_tuple_new(self): self.assertEqual(tup1, ()) self.assertEqual(size(tup1), 0) self.assertIs(type(tup1), tuple) + self._not_tracked(tup1) + tup2 = tuple_new(1) self.assertIs(type(tup2), tuple) self.assertEqual(size(tup2), 1) self.assertIsNot(tup2, tup1) self.assertTrue(checknull(tup2, 0)) + self._tracked(tup2) self.assertRaises(SystemError, tuple_new, -1) self.assertRaises(SystemError, tuple_new, PY_SSIZE_T_MIN) @@ -70,6 +79,10 @@ def test_tuple_pack(self): self.assertEqual(pack(1, [1]), ([1],)) self.assertEqual(pack(2, [1], [2]), ([1], [2])) + self._tracked(pack(1, [1])) + self._tracked(pack(2, [1], b'abc')) + self._not_tracked(pack(2, 42, b'abc')) + self.assertRaises(SystemError, pack, PY_SSIZE_T_MIN) self.assertRaises(SystemError, pack, -1) self.assertRaises(MemoryError, pack, PY_SSIZE_T_MAX) diff --git a/Lib/test/test_tuple.py b/Lib/test/test_tuple.py index 9ce80c5e8ea009..e533392b8cae94 100644 --- a/Lib/test/test_tuple.py +++ b/Lib/test/test_tuple.py @@ -290,12 +290,18 @@ def test_repr(self): self.assertEqual(repr(a0), "()") self.assertEqual(repr(a2), "(0, 1, 2)") + # Checks that t is not tracked without any GC collections. + def _not_tracked_instantly(self, t): + self.assertFalse(gc.is_tracked(t), t) + + # Checks that t is not tracked after GC collection. def _not_tracked(self, t): # Nested tuples can take several collections to untrack gc.collect() gc.collect() self.assertFalse(gc.is_tracked(t), t) + # Checks that t continues to be tracked even after GC collection. def _tracked(self, t): self.assertTrue(gc.is_tracked(t), t) gc.collect() @@ -307,13 +313,19 @@ def test_track_literals(self): # Test GC-optimization of tuple literals x, y, z = 1.5, "a", [] - self._not_tracked(()) - self._not_tracked((1,)) - self._not_tracked((1, 2)) - self._not_tracked((1, 2, "a")) - self._not_tracked((1, 2, (None, True, False, ()), int)) - self._not_tracked((object(),)) + # We check that those objects aren't tracked at all. + # It's essential for the GC performance, see gh-139951. + self._not_tracked_instantly(()) + self._not_tracked_instantly((1,)) + self._not_tracked_instantly((1, 2)) + self._not_tracked_instantly((1, 2, "a")) + self._not_tracked_instantly((1, 2) * 5) + self._not_tracked_instantly((12, 10**10, 'a_' * 100)) + self._not_tracked_instantly((object(),)) + self._not_tracked(((1, x), y, (2, 3))) + self._not_tracked((1, 2, (None, True, False, ()), int)) + self._not_tracked((object(), ())) # Tuples with mutable elements are always tracked, even if those # elements are not tracked right now. @@ -343,6 +355,12 @@ def check_track_dynamic(self, tp, always_track): self._tracked(tp(tuple([obj]) for obj in [x, y, z])) self._tracked(tuple(tp([obj]) for obj in [x, y, z])) + t = tp([1, x, y, z]) + self.assertEqual(type(t), tp) + self._tracked(t) + self.assertEqual(type(t[:]), tuple) + self._tracked(t[:]) + @support.cpython_only def test_track_dynamic(self): # Test GC-optimization of dynamically constructed tuples. From 7c4a8e58188d63f9f83ca888dd33e6973b915351 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:01:39 +0100 Subject: [PATCH 1261/1674] [3.14] gh-140702: Add test skip for Unix Datagram tests on iOS when on Github Actions (GH-140740) (#140742) Exposes the GITHUB_ACTIONS environment variable to iOS simulator test runs, and uses this variable to skip a Unix Datagram socketserver test that is unreliable in the iOS GitHub Actions environment. (cherry picked from commit 9f8d005d2961777aa533ec330f96b50324a3446f) Co-authored-by: Russell Keith-Magee Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Apple/iOS/README.md | 11 +++++++++++ Apple/testbed/TestbedTests/TestbedTests.m | 3 +++ Apple/testbed/__main__.py | 9 +++++++++ Lib/test/support/__init__.py | 3 ++- Lib/test/test_socketserver.py | 4 ++++ .../2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst | 2 ++ 6 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst diff --git a/Apple/iOS/README.md b/Apple/iOS/README.md index 124a05657aae09..7ee257b5d648f4 100644 --- a/Apple/iOS/README.md +++ b/Apple/iOS/README.md @@ -224,6 +224,17 @@ Once you have a built an XCframework, you can test that framework by running: $ python Apple test iOS +This test will attempt to find an "SE-class" simulator (i.e., an iPhone SE, or +iPhone 16e, or similar), and run the test suite on the most recent version of +iOS that is available. You can specify a simulator using the `--simulator` +command line argument, providing the name of the simulator (e.g., `--simulator +'iPhone 16 Pro'`). You can also use this argument to control the OS version used +for testing; `--simulator 'iPhone 16 Pro,OS=18.2'` would attempt to run the +tests on an iPhone 16 Pro running iOS 18.2. + +If the test runner is executed on GitHub Actions, the `GITHUB_ACTIONS` +environment variable will be exposed to the iOS process at runtime. + ### Testing a single-architecture framework The `Apple/testbed` folder that contains an Xcode project that is able to run diff --git a/Apple/testbed/TestbedTests/TestbedTests.m b/Apple/testbed/TestbedTests/TestbedTests.m index 80741097e4c80d..f7788c47f2c229 100644 --- a/Apple/testbed/TestbedTests/TestbedTests.m +++ b/Apple/testbed/TestbedTests/TestbedTests.m @@ -35,6 +35,9 @@ - (void)testPython { setenv("NO_COLOR", "1", true); setenv("PYTHON_COLORS", "0", true); + if (getenv("GITHUB_ACTIONS")) { + NSLog(@"Running in a GitHub Actions environment"); + } // Arguments to pass into the test suite runner. // argv[0] must identify the process; any subsequent arg // will be handled as if it were an argument to `python -m test` diff --git a/Apple/testbed/__main__.py b/Apple/testbed/__main__.py index f3407ecdf7e734..42eb60a4c8dc02 100644 --- a/Apple/testbed/__main__.py +++ b/Apple/testbed/__main__.py @@ -1,5 +1,6 @@ import argparse import json +import os import re import shutil import subprocess @@ -78,6 +79,13 @@ def xcode_test(location: Path, platform: str, simulator: str, verbose: bool): check=True, ) + # Any environment variable prefixed with TEST_RUNNER_ is exposed into the + # test runner environment. There are some variables (like those identifying + # CI platforms) that can be useful to have access to. + test_env = os.environ.copy() + if "GITHUB_ACTIONS" in os.environ: + test_env["TEST_RUNNER_GITHUB_ACTIONS"] = os.environ["GITHUB_ACTIONS"] + print("Running test project...") # Test execution *can't* be run -quiet; verbose mode # is how we see the output of the test output. @@ -85,6 +93,7 @@ def xcode_test(location: Path, platform: str, simulator: str, verbose: bool): ["xcodebuild", "test-without-building"] + args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=test_env, ) while line := (process.stdout.readline()).decode(*DECODE_ARGS): # Strip the timestamp/process prefix from each log line diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 88f61103512459..da72b0c7dab878 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -68,7 +68,7 @@ "BrokenIter", "in_systemd_nspawn_sync_suppressed", "run_no_yield_async_fn", "run_yielding_async_fn", "async_yield", - "reset_code", + "reset_code", "on_github_actions" ] @@ -1370,6 +1370,7 @@ def reset_code(f: types.FunctionType) -> types.FunctionType: f.__code__ = f.__code__.replace() return f +on_github_actions = "GITHUB_ACTIONS" in os.environ #======================================================================= # Check for the presence of docstrings. diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 0f62f9eb200e42..2ca356606b260c 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -218,12 +218,16 @@ def test_ForkingUDPServer(self): self.dgram_examine) @requires_unix_sockets + @unittest.skipIf(test.support.is_apple_mobile and test.support.on_github_actions, + "gh-140702: Test fails regularly on iOS simulator on GitHub Actions") def test_UnixDatagramServer(self): self.run_server(socketserver.UnixDatagramServer, socketserver.DatagramRequestHandler, self.dgram_examine) @requires_unix_sockets + @unittest.skipIf(test.support.is_apple_mobile and test.support.on_github_actions, + "gh-140702: Test fails regularly on iOS simulator on GitHub Actions") def test_ThreadingUnixDatagramServer(self): self.run_server(socketserver.ThreadingUnixDatagramServer, socketserver.DatagramRequestHandler, diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst b/Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst new file mode 100644 index 00000000000000..9efbf0162dd1c1 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst @@ -0,0 +1,2 @@ +The iOS testbed app will now expose the ``GITHUB_ACTIONS`` environment +variable to iOS apps being tested. From 9a7dccd7a179c82ed50717e7d855e0be558c7c91 Mon Sep 17 00:00:00 2001 From: Cody Maloney Date: Wed, 29 Oct 2025 05:31:48 -0700 Subject: [PATCH 1262/1674] [3.14] gh-140607: Validate returned byte count in RawIOBase.read (GH-140611) (#140728) * [3.14] gh-140607: Validate returned byte count in RawIOBase.read (GH-140611) While `RawIOBase.readinto` should return a count of bytes between 0 and the length of the given buffer, it is not required to. Add validation inside RawIOBase.read() that the returned byte count is valid. (cherry picked from commit 0f0a362768aecb4c791724cce486d8317533a94d) Co-authored-by: Cody Maloney Co-authored-by: Shamil Co-authored-by: Victor Stinner * fixup: Use older attribute name --------- Co-authored-by: Shamil Co-authored-by: Victor Stinner --- Lib/_pyio.py | 2 ++ Lib/test/test_io.py | 16 ++++++++++++++++ ...025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst | 2 ++ Modules/_io/iobase.c | 13 ++++++++++--- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index fb2a6d049caab6..612e4a175e5a65 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -617,6 +617,8 @@ def read(self, size=-1): n = self.readinto(b) if n is None: return None + if n < 0 or n > len(b): + raise ValueError(f"readinto returned {n} outside buffer size {len(b)}") del b[n:] return bytes(b) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 925fe7771611b5..2ed95530ba534a 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -893,6 +893,22 @@ def test_RawIOBase_read(self): self.assertEqual(rawio.read(2), None) self.assertEqual(rawio.read(2), b"") + def test_RawIOBase_read_bounds_checking(self): + # Make sure a `.readinto` call which returns a value outside + # (0, len(buffer)) raises. + class Misbehaved(self.RawIOBase): + def __init__(self, readinto_return) -> None: + self._readinto_return = readinto_return + def readinto(self, b): + return self._readinto_return + + with self.assertRaises(ValueError) as cm: + Misbehaved(2).read(1) + self.assertEqual(str(cm.exception), "readinto returned 2 outside buffer size 1") + for bad_size in (2147483647, sys.maxsize, -1, -1000): + with self.assertRaises(ValueError): + Misbehaved(bad_size).read() + def test_types_have_dict(self): test = ( self.IOBase(), diff --git a/Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst b/Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst new file mode 100644 index 00000000000000..cc33217c9f563e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst @@ -0,0 +1,2 @@ +Inside :meth:`io.RawIOBase.read`, validate that the count of bytes returned by +:meth:`io.RawIOBase.readinto` is valid (inside the provided buffer). diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 044f6b7803c571..17a9d2800e9d7a 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -938,14 +938,21 @@ _io__RawIOBase_read_impl(PyObject *self, Py_ssize_t n) return res; } - n = PyNumber_AsSsize_t(res, PyExc_ValueError); + Py_ssize_t bytes_filled = PyNumber_AsSsize_t(res, PyExc_ValueError); Py_DECREF(res); - if (n == -1 && PyErr_Occurred()) { + if (bytes_filled == -1 && PyErr_Occurred()) { Py_DECREF(b); return NULL; } + if (bytes_filled < 0 || bytes_filled > n) { + Py_DECREF(b); + PyErr_Format(PyExc_ValueError, + "readinto returned %zd outside buffer size %zd", + bytes_filled, n); + return NULL; + } - res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n); + res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), bytes_filled); Py_DECREF(b); return res; } From e0f54a0bdab5e804568744156b9507e86037ea2a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 29 Oct 2025 13:54:04 +0100 Subject: [PATCH 1263/1674] [3.14] gh-140702: Log color and GHA env vars in test.pythoninfo (GH-140747) (#140753) gh-140702: Log color and GHA env vars in test.pythoninfo (GH-140747) (cherry picked from commit 376559bf54762d7b6e0a14591a1f284c8f09a855) Co-authored-by: Victor Stinner --- Lib/test/pythoninfo.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 23e49772291b0d..6f6e0903d86055 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -291,6 +291,8 @@ def format_groups(groups): "DISTUTILS_USE_SDK", "DYLD_LIBRARY_PATH", "ENSUREPIP_OPTIONS", + "FORCE_COLOR", + "GITHUB_ACTIONS", "HISTORY_FILE", "HOME", "HOMEDRIVE", @@ -307,11 +309,13 @@ def format_groups(groups): "MAKEFLAGS", "MIXERDEV", "MSSDK", + "NO_COLOR", "PATH", "PATHEXT", "PIP_CONFIG_FILE", "PLAT", "POSIXLY_CORRECT", + "PYTHON_COLORS", "PY_SAX_PARSER", "ProgramFiles", "ProgramFiles(x86)", From c45ab05a3ad779ba7316714eacae75d25944cd73 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 29 Oct 2025 14:54:37 +0100 Subject: [PATCH 1264/1674] [3.14] gh-140576: Fixed crash produced by lexer in case of dedented zero byte (GH-140583) (#140757) gh-140576: Fixed crash produced by lexer in case of dedented zero byte (GH-140583) (cherry picked from commit 8706167474e9a625e5f6613d3c7ac77a62faff58) Co-authored-by: Mikhail Efimov --- Lib/test/test_tokenize.py | 1 + .../2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst | 2 ++ Parser/lexer/lexer.c | 3 +++ 3 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index d274726eed2e65..ca67e381958757 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -3183,6 +3183,7 @@ def get_tokens(string): f'__{ x:d }__'""", + " a\n\x00", ]: with self.subTest(case=case): self.assertRaises(tokenize.TokenError, get_tokens, case) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst new file mode 100644 index 00000000000000..2c27525d9f782c --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst @@ -0,0 +1,2 @@ +Fixed crash in :func:`tokenize.generate_tokens` in case of +specific incorrect input. Patch by Mikhail Efimov. diff --git a/Parser/lexer/lexer.c b/Parser/lexer/lexer.c index a69994e9b3d005..7f25afec302c22 100644 --- a/Parser/lexer/lexer.c +++ b/Parser/lexer/lexer.c @@ -539,6 +539,9 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t return MAKE_TOKEN(ERRORTOKEN); } } + else if (c == EOF && PyErr_Occurred()) { + return MAKE_TOKEN(ERRORTOKEN); + } else { break; } From 6d0e1c8478cbf3d16f7dd9ef3c947de8c9a46a11 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 29 Oct 2025 17:26:38 +0100 Subject: [PATCH 1265/1674] [3.14] gh-140228: Avoid making unnecessary syscalls in linecache for frozen modules (GH-140377) (#140738) gh-140228: Avoid making unnecessary syscalls in linecache for frozen modules (GH-140377) (cherry picked from commit c41f84ff61c52e3ff7ef86b0c66208b29613d23d) Co-authored-by: tconley1428 --- Lib/linecache.py | 5 ++++- .../Library/2025-10-28-17-43-51.gh-issue-140228.8kfHhO.rst | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-28-17-43-51.gh-issue-140228.8kfHhO.rst diff --git a/Lib/linecache.py b/Lib/linecache.py index 87d7d6fda657e4..2b5a31b3e75bc1 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -131,9 +131,12 @@ def updatecache(filename, module_globals=None): if _source_unavailable(filename): return [] - if filename.startswith(' Date: Wed, 29 Oct 2025 19:11:24 +0100 Subject: [PATCH 1266/1674] [3.14] gh-140082: Forward colorizing from libregrtest to unittest (GH-140083) (#140756) gh-140082: Forward colorizing from libregrtest to unittest (GH-140083) libregrtest redirects test output to a file as part of its operation. When `unittest` checks to see if it should colorize with `isatty(sys.stdout)` that fails resulting in no colorizing of the unittest output. Update `libregrtest` to set `FORCE_COLOR=1` when redirecting test output so that unittest will do color printing. (cherry picked from commit 6ff62ac4fbc3f17529823c146cc3a3f8c21eed42) Co-authored-by: Cody Maloney Co-authored-by: Victor Stinner --- Lib/test/libregrtest/setup.py | 8 ++++++++ Lib/test/libregrtest/worker.py | 7 +++++++ .../Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst | 3 +++ 3 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 9bfc414cd615c8..b9b76a44e3b4e7 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -8,6 +8,7 @@ import unittest from test import support from test.support.os_helper import TESTFN_UNDECODABLE, FS_NONASCII +from _colorize import can_colorize # type: ignore[import-not-found] from .filter import set_match_tests from .runtests import RunTests @@ -139,3 +140,10 @@ def setup_tests(runtests: RunTests) -> None: gc.set_threshold(runtests.gc_threshold) random.seed(runtests.random_seed) + + # sys.stdout is redirected to a StringIO in single process mode on which + # color auto-detect fails as StringIO is not a TTY. If the original + # sys.stdout supports color pass that through with FORCE_COLOR so that when + # results are printed, such as with -W, they get color. + if can_colorize(file=sys.stdout): + os.environ['FORCE_COLOR'] = "1" diff --git a/Lib/test/libregrtest/worker.py b/Lib/test/libregrtest/worker.py index 5d75bf7ae787ed..1ad67e1cebf288 100644 --- a/Lib/test/libregrtest/worker.py +++ b/Lib/test/libregrtest/worker.py @@ -1,6 +1,7 @@ import subprocess import sys import os +from _colorize import can_colorize # type: ignore[import-not-found] from typing import Any, NoReturn from test.support import os_helper, Py_DEBUG @@ -32,6 +33,12 @@ def create_worker_process(runtests: WorkerRunTests, output_fd: int, env['TEMP'] = tmp_dir env['TMP'] = tmp_dir + # The subcommand is run with a temporary output which means it is not a TTY + # and won't auto-color. The test results are printed to stdout so if we can + # color that have the subprocess use color. + if can_colorize(file=sys.stdout): + env['FORCE_COLOR'] = '1' + # Running the child from the same working directory as regrtest's original # invocation ensures that TEMPDIR for the child is the same when # sysconfig.is_python_build() is true. See issue 15300. diff --git a/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst b/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst new file mode 100644 index 00000000000000..70e70218254488 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst @@ -0,0 +1,3 @@ +Update ``python -m test`` to set ``FORCE_COLOR=1`` when being run with color +enabled so that :mod:`unittest` which is run by it with redirected output will +output in color. From 6e70c75d1bad67bb0f7248abe081161d28f7ea6a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 29 Oct 2025 23:22:20 +0100 Subject: [PATCH 1267/1674] [3.14] gh-120057: add `os.reload_environ` to `__all__` (GH-140763) (#140773) Co-authored-by: Guo Ci Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Alex Waygood --- Lib/os.py | 1 + .../next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst diff --git a/Lib/os.py b/Lib/os.py index 12926c832f5ba5..ac03b4163906a5 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -813,6 +813,7 @@ def reload_environ(): env_data.clear() env_data.update(data) + __all__.append("reload_environ") def getenv(key, default=None): """Get an environment variable, return None if it doesn't exist. diff --git a/Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst b/Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst new file mode 100644 index 00000000000000..f6b42be1fbf50d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst @@ -0,0 +1 @@ +Add :func:`os.reload_environ` to ``os.__all__``. From 6bb49ae650e5ecd7c31150ee9d2c4056c5416688 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:19:27 +0100 Subject: [PATCH 1268/1674] [3.14] gh-138162: Fix logging.LoggerAdapter with merge_extra=True and without the extra argument (GH-140511) (GH-140784) (cherry picked from commit 327dbbedffa3f2c95e70129a11974b83e27864f9) Co-authored-by: Serhiy Storchaka --- Doc/library/logging.rst | 15 ++++++--- Lib/logging/__init__.py | 11 ++++--- Lib/test/test_logging.py | 33 ++++++++++++++++++- ...-10-23-19-39-16.gh-issue-138162.Znw5DN.rst | 2 ++ 4 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index dd92e73b88ec2e..8c8f50692fa1fa 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1082,12 +1082,13 @@ 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, merge_extra=False) +.. class:: LoggerAdapter(logger, extra=None, merge_extra=False) Returns an instance of :class:`LoggerAdapter` initialized with an - 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. + underlying :class:`Logger` instance, an optional dict-like object (*extra*), + and an optional 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 @@ -1127,9 +1128,13 @@ 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.10 + + The *extra* argument is now optional. + .. versionchanged:: 3.13 - The *merge_extra* argument was added. + The *merge_extra* parameter was added. Thread Safety diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index b95c3aacf7d17a..9005f1ef865c90 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1852,9 +1852,9 @@ class LoggerAdapter(object): 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 - easy stacking of LoggerAdapters, if so desired. + Initialize the adapter with a logger and an optional dict-like object + which provides contextual information. This constructor signature + allows easy stacking of LoggerAdapters, if so desired. You can effectively pass keyword arguments as shown in the following example: @@ -1885,8 +1885,9 @@ def process(self, msg, kwargs): Normally, you'll only need to override this one method in a LoggerAdapter subclass for your specific needs. """ - if self.merge_extra and "extra" in kwargs: - kwargs["extra"] = {**self.extra, **kwargs["extra"]} + if self.merge_extra and kwargs.get("extra") is not None: + if self.extra is not None: + kwargs["extra"] = {**self.extra, **kwargs["extra"]} else: kwargs["extra"] = self.extra return msg, kwargs diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index d8d1020a5a3f45..99869fdd9e7061 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5800,7 +5800,7 @@ def cleanup(): self.addCleanup(cleanup) self.addCleanup(logging.shutdown) - self.adapter = logging.LoggerAdapter(logger=self.logger, extra=None) + self.adapter = logging.LoggerAdapter(logger=self.logger) def test_exception(self): msg = 'testing exception: %r' @@ -5971,6 +5971,18 @@ def test_extra_merged(self): self.assertEqual(record.foo, '1') self.assertEqual(record.bar, '2') + self.adapter.critical('no extra') # should not fail + self.assertEqual(len(self.recording.records), 2) + record = self.recording.records[-1] + self.assertEqual(record.foo, '1') + self.assertNotHasAttr(record, 'bar') + + self.adapter.critical('none extra', extra=None) # should not fail + self.assertEqual(len(self.recording.records), 3) + record = self.recording.records[-1] + self.assertEqual(record.foo, '1') + self.assertNotHasAttr(record, 'bar') + def test_extra_merged_log_call_has_precedence(self): self.adapter = logging.LoggerAdapter(logger=self.logger, extra={'foo': '1'}, @@ -5982,6 +5994,25 @@ def test_extra_merged_log_call_has_precedence(self): self.assertHasAttr(record, 'foo') self.assertEqual(record.foo, '2') + def test_extra_merged_without_extra(self): + self.adapter = logging.LoggerAdapter(logger=self.logger, + merge_extra=True) + + self.adapter.critical('foo should be here', extra={'foo': '1'}) + self.assertEqual(len(self.recording.records), 1) + record = self.recording.records[-1] + self.assertEqual(record.foo, '1') + + self.adapter.critical('no extra') # should not fail + self.assertEqual(len(self.recording.records), 2) + record = self.recording.records[-1] + self.assertNotHasAttr(record, 'foo') + + self.adapter.critical('none extra', extra=None) # should not fail + self.assertEqual(len(self.recording.records), 3) + record = self.recording.records[-1] + self.assertNotHasAttr(record, 'foo') + class PrefixAdapter(logging.LoggerAdapter): prefix = 'Adapter' diff --git a/Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst b/Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst new file mode 100644 index 00000000000000..ef7a90bc37e650 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst @@ -0,0 +1,2 @@ +Fix :class:`logging.LoggerAdapter` with ``merge_extra=True`` and without the +*extra* argument. From a7cfe862ba84886107173826955d248570714fff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:25:34 +0100 Subject: [PATCH 1269/1674] [3.14] gh-131927: Do not emit PEP 765 warnings in ast.parse() (GH-139642) (GH-140786) ast.parse() no longer emits syntax warnings for return/break/continue in finally (see PEP-765) -- they are only emitted during compilation. (cherry picked from commit ad0a3f733b23e7fc69aff13055c7fac8ab9dcd66) Co-authored-by: Serhiy Storchaka --- Include/internal/pycore_compile.h | 3 +- Lib/test/test_ast/test_ast.py | 55 ----------------- Lib/test/test_compile.py | 60 +++++++++++++++++++ Lib/test/test_pyrepl/test_interact.py | 26 ++++++++ ...10-06-10-03-37.gh-issue-139640.gY5oTb2.rst | 3 + Python/ast_preprocess.c | 8 ++- Python/compile.c | 4 +- 7 files changed, 98 insertions(+), 61 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index aecc50be1e6c34..ed776bbb73a0ee 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -49,7 +49,8 @@ extern int _PyAST_Preprocess( PyObject *filename, int optimize, int ff_features, - int syntax_check_only); + int syntax_check_only, + int enable_warnings); typedef struct { diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 963a3e705e2b81..361ee508376d2a 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -1057,61 +1057,6 @@ def test_repr_large_input_crash(self): r"Exceeds the limit \(\d+ digits\)"): repr(ast.Constant(value=eval(source))) - def test_pep_765_warnings(self): - srcs = [ - textwrap.dedent(""" - def f(): - try: - pass - finally: - return 42 - """), - textwrap.dedent(""" - for x in y: - try: - pass - finally: - break - """), - textwrap.dedent(""" - for x in y: - try: - pass - finally: - continue - """), - ] - for src in srcs: - with self.assertWarnsRegex(SyntaxWarning, 'finally'): - ast.parse(src) - - def test_pep_765_no_warnings(self): - srcs = [ - textwrap.dedent(""" - try: - pass - finally: - def f(): - return 42 - """), - textwrap.dedent(""" - try: - pass - finally: - for x in y: - break - """), - textwrap.dedent(""" - try: - pass - finally: - for x in y: - continue - """), - ] - for src in srcs: - ast.parse(src) - def test_tstring(self): # Test AST structure for simple t-string tree = ast.parse('t"Hello"') diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index b2beba6e70e2ae..b978be8bc6862b 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1728,6 +1728,66 @@ def test_compile_warning_in_finally(self): self.assertEqual(wm.category, SyntaxWarning) self.assertIn("\"is\" with 'int' literal", str(wm.message)) + @support.subTests('src', [ + textwrap.dedent(""" + def f(): + try: + pass + finally: + return 42 + """), + textwrap.dedent(""" + for x in y: + try: + pass + finally: + break + """), + textwrap.dedent(""" + for x in y: + try: + pass + finally: + continue + """), + ]) + def test_pep_765_warnings(self, src): + with self.assertWarnsRegex(SyntaxWarning, 'finally'): + compile(src, '', 'exec') + with warnings.catch_warnings(): + warnings.simplefilter("error") + tree = ast.parse(src) + with self.assertWarnsRegex(SyntaxWarning, 'finally'): + compile(tree, '', 'exec') + + @support.subTests('src', [ + textwrap.dedent(""" + try: + pass + finally: + def f(): + return 42 + """), + textwrap.dedent(""" + try: + pass + finally: + for x in y: + break + """), + textwrap.dedent(""" + try: + pass + finally: + for x in y: + continue + """), + ]) + def test_pep_765_no_warnings(self, src): + with warnings.catch_warnings(): + warnings.simplefilter("error") + compile(src, '', 'exec') + class TestBooleanExpression(unittest.TestCase): class Value: diff --git a/Lib/test/test_pyrepl/test_interact.py b/Lib/test/test_pyrepl/test_interact.py index af5d4d0e67632a..f0837ee94e9beb 100644 --- a/Lib/test/test_pyrepl/test_interact.py +++ b/Lib/test/test_pyrepl/test_interact.py @@ -1,5 +1,6 @@ import contextlib import io +import warnings import unittest from unittest.mock import patch from textwrap import dedent @@ -273,3 +274,28 @@ def test_incomplete_statement(self): code = "if foo:" console = InteractiveColoredConsole(namespace, filename="") self.assertTrue(_more_lines(console, code)) + + +class TestWarnings(unittest.TestCase): + def test_pep_765_warning(self): + """ + Test that a SyntaxWarning emitted from the + AST optimizer is only shown once in the REPL. + """ + # gh-131927 + console = InteractiveColoredConsole() + code = dedent("""\ + def f(): + try: + return 1 + finally: + return 2 + """) + + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + console.runsource(code) + + count = sum("'return' in a 'finally' block" in str(w.message) + for w in caught) + self.assertEqual(count, 1) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst new file mode 100644 index 00000000000000..b147b430ccccf5 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst @@ -0,0 +1,3 @@ +:func:`ast.parse` no longer emits syntax warnings for +``return``/``break``/``continue`` in ``finally`` (see :pep:`765`) -- they are +only emitted during compilation. diff --git a/Python/ast_preprocess.c b/Python/ast_preprocess.c index 44d3075098be75..fe6fd9479d1531 100644 --- a/Python/ast_preprocess.c +++ b/Python/ast_preprocess.c @@ -19,6 +19,7 @@ typedef struct { int optimize; int ff_features; int syntax_check_only; + int enable_warnings; _Py_c_array_t cf_finally; /* context for PEP 765 check */ int cf_finally_used; @@ -78,7 +79,7 @@ control_flow_in_finally_warning(const char *kw, stmt_ty n, _PyASTPreprocessState static int before_return(_PyASTPreprocessState *state, stmt_ty node_) { - if (state->cf_finally_used > 0) { + if (state->enable_warnings && state->cf_finally_used > 0) { ControlFlowInFinallyContext *ctx = get_cf_finally_top(state); if (ctx->in_finally && ! ctx->in_funcdef) { if (!control_flow_in_finally_warning("return", node_, state)) { @@ -92,7 +93,7 @@ before_return(_PyASTPreprocessState *state, stmt_ty node_) static int before_loop_exit(_PyASTPreprocessState *state, stmt_ty node_, const char *kw) { - if (state->cf_finally_used > 0) { + if (state->enable_warnings && state->cf_finally_used > 0) { ControlFlowInFinallyContext *ctx = get_cf_finally_top(state); if (ctx->in_finally && ! ctx->in_loop) { if (!control_flow_in_finally_warning(kw, node_, state)) { @@ -968,7 +969,7 @@ astfold_type_param(type_param_ty node_, PyArena *ctx_, _PyASTPreprocessState *st int _PyAST_Preprocess(mod_ty mod, PyArena *arena, PyObject *filename, int optimize, - int ff_features, int syntax_check_only) + int ff_features, int syntax_check_only, int enable_warnings) { _PyASTPreprocessState state; memset(&state, 0, sizeof(_PyASTPreprocessState)); @@ -976,6 +977,7 @@ _PyAST_Preprocess(mod_ty mod, PyArena *arena, PyObject *filename, int optimize, state.optimize = optimize; state.ff_features = ff_features; state.syntax_check_only = syntax_check_only; + state.enable_warnings = enable_warnings; if (_Py_CArray_Init(&state.cf_finally, sizeof(ControlFlowInFinallyContext), 20) < 0) { return -1; } diff --git a/Python/compile.c b/Python/compile.c index 8070d3f03760ef..e2f1c7e8eb5bce 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -136,7 +136,7 @@ compiler_setup(compiler *c, mod_ty mod, PyObject *filename, c->c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize; c->c_save_nested_seqs = false; - if (!_PyAST_Preprocess(mod, arena, filename, c->c_optimize, merged, 0)) { + if (!_PyAST_Preprocess(mod, arena, filename, c->c_optimize, merged, 0, 1)) { return ERROR; } c->c_st = _PySymtable_Build(mod, filename, &c->c_future); @@ -1502,7 +1502,7 @@ _PyCompile_AstPreprocess(mod_ty mod, PyObject *filename, PyCompilerFlags *cf, if (optimize == -1) { optimize = _Py_GetConfig()->optimization_level; } - if (!_PyAST_Preprocess(mod, arena, filename, optimize, flags, no_const_folding)) { + if (!_PyAST_Preprocess(mod, arena, filename, optimize, flags, no_const_folding, 0)) { return -1; } return 0; From 064e989de50e37c8e79d3328a05804d72137e917 Mon Sep 17 00:00:00 2001 From: Donghee Na Date: Thu, 30 Oct 2025 22:51:25 +0900 Subject: [PATCH 1270/1674] [3.14] gh-137821: Fix wrongly tested json.decoder.scanstring (gh-140782) --- Lib/test/test_json/test_scanstring.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_json/test_scanstring.py b/Lib/test/test_json/test_scanstring.py index cca556a3b95bab..9a6cdfe12d266c 100644 --- a/Lib/test/test_json/test_scanstring.py +++ b/Lib/test/test_json/test_scanstring.py @@ -144,7 +144,7 @@ def test_bad_escapes(self): def test_overflow(self): with self.assertRaises(OverflowError): - self.json.decoder.scanstring(b"xxx", sys.maxsize+1) + self.json.decoder.scanstring("xxx", sys.maxsize+1) class TestPyScanstring(TestScanstring, PyTest): pass From e595d995c409c2bf387fc6013e70df232d362fe4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 30 Oct 2025 18:01:22 +0100 Subject: [PATCH 1271/1674] [3.14] GH-140768: Warn when the WASI SDK version doesn't match the supported version (GH-140769) (GH-140801) GH-140768: Warn when the WASI SDK version doesn't match the supported version (GH-140769) (cherry picked from commit 95a3564869daa3cc083e4d4603f5f03ee5f53e31) Co-authored-by: Brett Cannon --- ...-10-29-12-30-38.gh-issue-140768.ITYrzw.rst | 1 + Tools/wasm/wasi/__main__.py | 57 ++++++++++++------- 2 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst diff --git a/Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst b/Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst new file mode 100644 index 00000000000000..0009f83cd20d8f --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst @@ -0,0 +1 @@ +Warn when the WASI SDK version doesn't match what's supported. diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index b2f643ddbfc213..fac32926cbcaff 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -196,25 +196,44 @@ def make_build_python(context, working_dir): def find_wasi_sdk(): """Find the path to the WASI SDK.""" - if wasi_sdk_path := os.environ.get("WASI_SDK_PATH"): - return pathlib.Path(wasi_sdk_path) - - opt_path = pathlib.Path("/opt") - # WASI SDK versions have a ``.0`` suffix, but it's a constant; the WASI SDK team - # has said they don't plan to ever do a point release and all of their Git tags - # lack the ``.0`` suffix. - # Starting with WASI SDK 23, the tarballs went from containing a directory named - # ``wasi-sdk-{WASI_SDK_VERSION}.0`` to e.g. - # ``wasi-sdk-{WASI_SDK_VERSION}.0-x86_64-linux``. - potential_sdks = [ - path - for path in opt_path.glob(f"wasi-sdk-{WASI_SDK_VERSION}.0*") - if path.is_dir() - ] - if len(potential_sdks) == 1: - return potential_sdks[0] - elif (default_path := opt_path / "wasi-sdk").is_dir(): - return default_path + wasi_sdk_path = None + + if wasi_sdk_path_env_var := os.environ.get("WASI_SDK_PATH"): + wasi_sdk_path = pathlib.Path(wasi_sdk_path_env_var) + else: + opt_path = pathlib.Path("/opt") + # WASI SDK versions have a ``.0`` suffix, but it's a constant; the WASI SDK team + # has said they don't plan to ever do a point release and all of their Git tags + # lack the ``.0`` suffix. + # Starting with WASI SDK 23, the tarballs went from containing a directory named + # ``wasi-sdk-{WASI_SDK_VERSION}.0`` to e.g. + # ``wasi-sdk-{WASI_SDK_VERSION}.0-x86_64-linux``. + potential_sdks = [ + path + for path in opt_path.glob(f"wasi-sdk-{WASI_SDK_VERSION}.0*") + if path.is_dir() + ] + if len(potential_sdks) == 1: + wasi_sdk_path = potential_sdks[0] + elif (default_path := opt_path / "wasi-sdk").is_dir(): + wasi_sdk_path = default_path + + # Starting with WASI SDK 25, a VERSION file is included in the root + # of the SDK directory that we can read to warn folks when they are using + # an unsupported version. + if wasi_sdk_path and (version_file := wasi_sdk_path / "VERSION").is_file(): + version_details = version_file.read_text(encoding="utf-8") + found_version = version_details.splitlines()[0] + # Make sure there's a trailing dot to avoid false positives if somehow the + # supported version is a prefix of the found version (e.g. `25` and `2567`). + if not found_version.startswith(f"{WASI_SDK_VERSION}."): + major_version = found_version.partition(".")[0] + print( + f"⚠️ Found WASI SDK {major_version}, " + f"but WASI SDK {WASI_SDK_VERSION} is the supported version" + ) + + return wasi_sdk_path def wasi_sdk_env(context): From 5954b5ba92c143b019f7d13d38b6812b4b7194bb Mon Sep 17 00:00:00 2001 From: Mikhail Efimov Date: Thu, 30 Oct 2025 20:03:35 +0300 Subject: [PATCH 1272/1674] [3.14] gh-140551: Fix dict crash if clear is called at lookup stage (GH-140558) (#140743) gh-140551: Fix `dict` crash if `clear` is called at `lookup` stage (#140558) Co-authored-by: Inada Naoki --- Lib/test/test_dict.py | 20 +++++ ...-10-24-20-42-33.gh-issue-140551.-9swrl.rst | 2 + Objects/dictobject.c | 82 ++++++++----------- 3 files changed, 54 insertions(+), 50 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 60c62430370e96..2e6c2bbdf19409 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1601,6 +1601,26 @@ def __hash__(self): with self.assertRaises(KeyError): d.get(key2) + def test_clear_at_lookup(self): + class X: + def __hash__(self): + return 1 + def __eq__(self, other): + nonlocal d + d.clear() + + d = {} + for _ in range(10): + d[X()] = None + + self.assertEqual(len(d), 1) + + d = {} + for _ in range(10): + d.setdefault(X(), None) + + self.assertEqual(len(d), 1) + class CAPITest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst new file mode 100644 index 00000000000000..8fd9b46c0aeabe --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst @@ -0,0 +1,2 @@ +Fixed crash in :class:`dict` if :meth:`dict.clear` is called at the lookup +stage. Patch by Mikhail Efimov and Inada Naoki. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 1fd5ef0c5e190a..1b4640f9649569 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1723,6 +1723,14 @@ static inline int insert_combined_dict(PyInterpreterState *interp, PyDictObject *mp, Py_hash_t hash, PyObject *key, PyObject *value) { + // gh-140551: If dict was cleared in _Py_dict_lookup, + // we have to resize one more time to force general key kind. + if (DK_IS_UNICODE(mp->ma_keys) && !PyUnicode_CheckExact(key)) { + if (insertion_resize(interp, mp, 0) < 0) + return -1; + assert(mp->ma_keys->dk_kind == DICT_KEYS_GENERAL); + } + if (mp->ma_keys->dk_usable <= 0) { /* Need to resize. */ if (insertion_resize(interp, mp, 1) < 0) { @@ -1819,38 +1827,31 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) { PyObject *old_value; + Py_ssize_t ix; ASSERT_DICT_LOCKED(mp); - if (DK_IS_UNICODE(mp->ma_keys) && !PyUnicode_CheckExact(key)) { - if (insertion_resize(interp, mp, 0) < 0) - goto Fail; - assert(mp->ma_keys->dk_kind == DICT_KEYS_GENERAL); - } - - if (_PyDict_HasSplitTable(mp)) { - Py_ssize_t ix = insert_split_key(mp->ma_keys, key, hash); + if (_PyDict_HasSplitTable(mp) && PyUnicode_CheckExact(key)) { + ix = insert_split_key(mp->ma_keys, key, hash); if (ix != DKIX_EMPTY) { insert_split_value(interp, mp, key, value, ix); Py_DECREF(key); Py_DECREF(value); return 0; } - - /* No space in shared keys. Resize and continue below. */ - if (insertion_resize(interp, mp, 1) < 0) { + // No space in shared keys. Go to insert_combined_dict() below. + } + else { + ix = _Py_dict_lookup(mp, key, hash, &old_value); + if (ix == DKIX_ERROR) goto Fail; - } } - Py_ssize_t ix = _Py_dict_lookup(mp, key, hash, &old_value); - if (ix == DKIX_ERROR) - goto Fail; - if (ix == DKIX_EMPTY) { - assert(!_PyDict_HasSplitTable(mp)); - /* Insert into new slot. */ - assert(old_value == NULL); + // insert_combined_dict() will convert from non DICT_KEYS_GENERAL table + // into DICT_KEYS_GENERAL table if key is not Unicode. + // We don't convert it before _Py_dict_lookup because non-Unicode key + // may change generic table into Unicode table. if (insert_combined_dict(interp, mp, hash, key, value) < 0) { goto Fail; } @@ -4326,6 +4327,7 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu PyDictObject *mp = (PyDictObject *)d; PyObject *value; Py_hash_t hash; + Py_ssize_t ix; PyInterpreterState *interp = _PyInterpreterState_GET(); ASSERT_DICT_LOCKED(d); @@ -4361,17 +4363,8 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu return 0; } - if (!PyUnicode_CheckExact(key) && DK_IS_UNICODE(mp->ma_keys)) { - if (insertion_resize(interp, mp, 0) < 0) { - if (result) { - *result = NULL; - } - return -1; - } - } - - if (_PyDict_HasSplitTable(mp)) { - Py_ssize_t ix = insert_split_key(mp->ma_keys, key, hash); + if (_PyDict_HasSplitTable(mp) && PyUnicode_CheckExact(key)) { + ix = insert_split_key(mp->ma_keys, key, hash); if (ix != DKIX_EMPTY) { PyObject *value = mp->ma_values->values[ix]; int already_present = value != NULL; @@ -4384,27 +4377,22 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu } return already_present; } - - /* No space in shared keys. Resize and continue below. */ - if (insertion_resize(interp, mp, 1) < 0) { - goto error; - } + // No space in shared keys. Go to insert_combined_dict() below. } - - assert(!_PyDict_HasSplitTable(mp)); - - Py_ssize_t ix = _Py_dict_lookup(mp, key, hash, &value); - if (ix == DKIX_ERROR) { - if (result) { - *result = NULL; + else { + ix = _Py_dict_lookup(mp, key, hash, &value); + if (ix == DKIX_ERROR) { + if (result) { + *result = NULL; + } + return -1; } - return -1; } if (ix == DKIX_EMPTY) { - assert(!_PyDict_HasSplitTable(mp)); value = default_value; + // See comment to this function in insertdict. if (insert_combined_dict(interp, mp, hash, Py_NewRef(key), Py_NewRef(value)) < 0) { Py_DECREF(key); Py_DECREF(value); @@ -4429,12 +4417,6 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu *result = incref_result ? Py_NewRef(value) : value; } return 1; - -error: - if (result) { - *result = NULL; - } - return -1; } int From 6c025a040d1b1529be22a9ab0c2ce9976ed37b6c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 30 Oct 2025 19:02:10 +0100 Subject: [PATCH 1273/1674] [3.14] Make printing log lines to the terminal a little cleaner when building WASI (GH-140772) (GH-140804) Make printing log lines to the terminal a little cleaner when building WASI (GH-140772) (cherry picked from commit abd19eddee20a7d05266f11f6042a84b04d29664) Co-authored-by: Brett Cannon --- Tools/wasm/wasi/__main__.py | 77 +++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index fac32926cbcaff..628fbb10b630bc 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -37,6 +37,30 @@ WASMTIME_HOST_RUNNER_VAR = f"{{{WASMTIME_VAR_NAME}}}" +def separator(): + """Print a separator line across the terminal width.""" + try: + tput_output = subprocess.check_output( + ["tput", "cols"], encoding="utf-8" + ) + except subprocess.CalledProcessError: + terminal_width = 80 + else: + terminal_width = int(tput_output.strip()) + print("⎯" * terminal_width) + + +def log(emoji, message, *, spacing=None): + """Print a notification with an emoji. + + If 'spacing' is None, calculate the spacing based on the number of code points + in the emoji as terminals "eat" a space when the emoji has multiple code points. + """ + if spacing is None: + spacing = " " if len(emoji) == 1 else " " + print("".join([emoji, spacing, message])) + + def updated_env(updates={}): """Create a new dict representing the environment to use. @@ -60,9 +84,10 @@ def updated_env(updates={}): if os.environ.get(key) != value: env_diff[key] = value - print("🌎 Environment changes:") - for key in sorted(env_diff.keys()): - print(f" {key}={env_diff[key]}") + env_vars = ( + f"\n {key}={item}" for key, item in sorted(env_diff.items()) + ) + log("🌎", f"Environment changes:{''.join(env_vars)}") return environment @@ -77,22 +102,14 @@ def wrapper(context): if callable(working_dir): working_dir = working_dir(context) - try: - tput_output = subprocess.check_output( - ["tput", "cols"], encoding="utf-8" - ) - except subprocess.CalledProcessError: - terminal_width = 80 - else: - terminal_width = int(tput_output.strip()) - print("⎯" * terminal_width) - print("📁", working_dir) + separator() + log("📁", os.fsdecode(working_dir)) if ( clean_ok and getattr(context, "clean", False) and working_dir.exists() ): - print("🚮 Deleting directory (--clean)...") + log("🚮", "Deleting directory (--clean)...") shutil.rmtree(working_dir) working_dir.mkdir(parents=True, exist_ok=True) @@ -116,7 +133,7 @@ def call(command, *, context=None, quiet=False, logdir=None, **kwargs): elif quiet and logdir is None: raise ValueError("When quiet is True, logdir must be specified") - print("❯", " ".join(map(str, command))) + log("❯", " ".join(map(str, command)), spacing=" ") if not quiet: stdout = None stderr = None @@ -130,7 +147,7 @@ def call(command, *, context=None, quiet=False, logdir=None, **kwargs): suffix=".log", ) stderr = subprocess.STDOUT - print(f"📝 Logging output to {stdout.name} (--quiet)...") + log("📝", f"Logging output to {stdout.name} (--quiet)...") subprocess.check_call(command, **kwargs, stdout=stdout, stderr=stderr) @@ -163,11 +180,11 @@ def configure_build_python(context, working_dir): """Configure the build/host Python.""" if LOCAL_SETUP.exists(): if LOCAL_SETUP.read_bytes() == LOCAL_SETUP_MARKER: - print(f"👍 {LOCAL_SETUP} exists ...") + log("👍", f"{LOCAL_SETUP} exists ...") else: - print(f"⚠️ {LOCAL_SETUP} exists, but has unexpected contents") + log("⚠️", f"{LOCAL_SETUP} exists, but has unexpected contents") else: - print(f"📝 Creating {LOCAL_SETUP} ...") + log("📝", f"Creating {LOCAL_SETUP} ...") LOCAL_SETUP.write_bytes(LOCAL_SETUP_MARKER) configure = [os.path.relpath(CHECKOUT / "configure", working_dir)] @@ -191,7 +208,7 @@ def make_build_python(context, working_dir): ] version = subprocess.check_output(cmd, encoding="utf-8").strip() - print(f"🎉 {binary} {version}") + log("🎉", f"{binary} {version}") def find_wasi_sdk(): @@ -228,9 +245,10 @@ def find_wasi_sdk(): # supported version is a prefix of the found version (e.g. `25` and `2567`). if not found_version.startswith(f"{WASI_SDK_VERSION}."): major_version = found_version.partition(".")[0] - print( - f"⚠️ Found WASI SDK {major_version}, " - f"but WASI SDK {WASI_SDK_VERSION} is the supported version" + log( + "⚠️", + f" Found WASI SDK {major_version}, " + f"but WASI SDK {WASI_SDK_VERSION} is the supported version", ) return wasi_sdk_path @@ -349,7 +367,7 @@ def configure_wasi_python(context, working_dir): with exec_script.open("w", encoding="utf-8") as file: file.write(f'#!/bin/sh\nexec {host_runner} {python_wasm} "$@"\n') exec_script.chmod(0o755) - print(f"🏃‍♀️ Created {exec_script} (--host-runner)... ") + log("🏃", f"Created {exec_script} (--host-runner)... ") sys.stdout.flush() @@ -364,9 +382,10 @@ def make_wasi_python(context, working_dir): exec_script = working_dir / "python.sh" call([exec_script, "--version"], quiet=False) - print( - f"🎉 Use `{exec_script.relative_to(context.init_dir)}` " - "to run CPython w/ the WASI host specified by --host-runner" + log( + "🎉", + f"Use `{exec_script.relative_to(context.init_dir)}` " + "to run CPython w/ the WASI host specified by --host-runner", ) @@ -385,12 +404,12 @@ def build_all(context): def clean_contents(context): """Delete all files created by this script.""" if CROSS_BUILD_DIR.exists(): - print(f"🧹 Deleting {CROSS_BUILD_DIR} ...") + log("🧹", f"Deleting {CROSS_BUILD_DIR} ...") shutil.rmtree(CROSS_BUILD_DIR) if LOCAL_SETUP.exists(): if LOCAL_SETUP.read_bytes() == LOCAL_SETUP_MARKER: - print(f"🧹 Deleting generated {LOCAL_SETUP} ...") + log("🧹", f"Deleting generated {LOCAL_SETUP} ...") def main(): From d0c78a458b3b3d908981fe306f77865de35d040a Mon Sep 17 00:00:00 2001 From: Brian Schubert Date: Fri, 31 Oct 2025 06:26:40 -0400 Subject: [PATCH 1274/1674] [3.14] gh-138944: Fix `SyntaxError` message for invalid syntax following valid import-as statement (GH-138945) (#140646) (cherry picked from commit 3dab11f888fda34c02734e4468d1acd4c36927fe) --- Grammar/python.gram | 4 +- Lib/test/test_syntax.py | 19 +++++++ ...-09-15-13-06-11.gh-issue-138944.PeCgLb.rst | 3 ++ Parser/parser.c | 53 +++++++++++++------ 4 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst diff --git a/Grammar/python.gram b/Grammar/python.gram index 27748bf1d91b67..7b27b04bf7989e 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -1387,11 +1387,11 @@ invalid_import: | 'import' token=NEWLINE { RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") } invalid_dotted_as_name: - | dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) a=expression { + | dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use %s as import target", _PyPegen_get_expr_name(a)) } invalid_import_from_as_name: - | NAME 'as' !(NAME (',' | ')' | NEWLINE)) a=expression { + | NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use %s as import target", _PyPegen_get_expr_name(a)) } diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 2624588a41b165..de8c94fe8d2d18 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -2111,6 +2111,25 @@ Traceback (most recent call last): SyntaxError: cannot use subscript as import target +# Check that we don't raise a "cannot use name as import target" error +# if there is an error in an unrelated statement after ';' + +>>> import a as b; None = 1 +Traceback (most recent call last): +SyntaxError: cannot assign to None + +>>> import a, b as c; d = 1; None = 1 +Traceback (most recent call last): +SyntaxError: cannot assign to None + +>>> from a import b as c; None = 1 +Traceback (most recent call last): +SyntaxError: cannot assign to None + +>>> from a import b, c as d; e = 1; None = 1 +Traceback (most recent call last): +SyntaxError: cannot assign to None + # Check that we dont raise the "trailing comma" error if there is more # input to the left of the valid part that we parsed. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst new file mode 100644 index 00000000000000..248585e2eba995 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst @@ -0,0 +1,3 @@ +Fix :exc:`SyntaxError` message when invalid syntax appears on the same line +as a valid ``import ... as ...`` or ``from ... import ... as ...`` +statement. Patch by Brian Schubert. diff --git a/Parser/parser.c b/Parser/parser.c index 95521b9933c348..1c507937077deb 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -23692,7 +23692,7 @@ invalid_import_rule(Parser *p) return _res; } -// invalid_dotted_as_name: dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression +// invalid_dotted_as_name: dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression static void * invalid_dotted_as_name_rule(Parser *p) { @@ -23705,12 +23705,12 @@ invalid_dotted_as_name_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression + { // dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> invalid_dotted_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression")); + D(fprintf(stderr, "%*c> invalid_dotted_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression")); Token * _keyword; expr_ty a; expr_ty dotted_name_var; @@ -23724,7 +23724,7 @@ invalid_dotted_as_name_rule(Parser *p) (a = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ invalid_dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression")); + D(fprintf(stderr, "%*c+ invalid_dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use %s as import target" , _PyPegen_get_expr_name ( a ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -23735,7 +23735,7 @@ invalid_dotted_as_name_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_dotted_as_name[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression")); } _res = NULL; done: @@ -23743,7 +23743,7 @@ invalid_dotted_as_name_rule(Parser *p) return _res; } -// invalid_import_from_as_name: NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression +// invalid_import_from_as_name: NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression static void * invalid_import_from_as_name_rule(Parser *p) { @@ -23756,12 +23756,12 @@ invalid_import_from_as_name_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression + { // NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> invalid_import_from_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression")); + D(fprintf(stderr, "%*c> invalid_import_from_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression")); Token * _keyword; expr_ty a; expr_ty name_var; @@ -23775,7 +23775,7 @@ invalid_import_from_as_name_rule(Parser *p) (a = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ invalid_import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression")); + D(fprintf(stderr, "%*c+ invalid_import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use %s as import target" , _PyPegen_get_expr_name ( a ) ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -23786,7 +23786,7 @@ invalid_import_from_as_name_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_import_from_as_name[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression")); } _res = NULL; done: @@ -35834,7 +35834,7 @@ _gather_138_rule(Parser *p) return _res; } -// _tmp_139: NAME (',' | ')' | NEWLINE) +// _tmp_139: NAME (',' | ')' | ';' | NEWLINE) static void * _tmp_139_rule(Parser *p) { @@ -35847,27 +35847,27 @@ _tmp_139_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // NAME (',' | ')' | NEWLINE) + { // NAME (',' | ')' | ';' | NEWLINE) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | ';' | NEWLINE)")); void *_tmp_173_var; expr_ty name_var; if ( (name_var = _PyPegen_name_token(p)) // NAME && - (_tmp_173_var = _tmp_173_rule(p)) // ',' | ')' | NEWLINE + (_tmp_173_var = _tmp_173_rule(p)) // ',' | ')' | ';' | NEWLINE ) { - D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | ';' | NEWLINE)")); _res = _PyPegen_dummy_name(p, name_var, _tmp_173_var); goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME (',' | ')' | NEWLINE)")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME (',' | ')' | ';' | NEWLINE)")); } _res = NULL; done: @@ -37788,7 +37788,7 @@ _loop0_172_rule(Parser *p) return _seq; } -// _tmp_173: ',' | ')' | NEWLINE +// _tmp_173: ',' | ')' | ';' | NEWLINE static void * _tmp_173_rule(Parser *p) { @@ -37839,6 +37839,25 @@ _tmp_173_rule(Parser *p) D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } + { // ';' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 13)) // token=';' + ) + { + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'")); + } { // NEWLINE if (p->error_indicator) { p->level--; From 89818a5939b3783073e284d90b9e508728e8c186 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:13:13 +0100 Subject: [PATCH 1275/1674] [3.14] gh-137836: Support more RAWTEXT and PLAINTEXT elements in HTMLParser (GH-137837) (GH-140841) * the "plaintext" element * the RAWTEXT elements "xmp", "iframe", "noembed" and "noframes" * optionally RAWTEXT (if scripting=True) element "noscript" (cherry picked from commit a17c57eee5b5cc81390750d07e4800b19c0c3084) Co-authored-by: Serhiy Storchaka --- Doc/library/html.parser.rst | 33 +-- Lib/html/parser.py | 24 +- Lib/test/test_htmlparser.py | 217 ++++++++++-------- ...-08-15-23-08-44.gh-issue-137836.b55rhh.rst | 3 + 4 files changed, 163 insertions(+), 114 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst index dd67fc34e856f1..341a8337ba2ceb 100644 --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -15,14 +15,18 @@ This module defines a class :class:`HTMLParser` which serves as the basis for parsing text files formatted in HTML (HyperText Mark-up Language) and XHTML. -.. class:: HTMLParser(*, convert_charrefs=True) +.. class:: HTMLParser(*, convert_charrefs=True, scripting=False) Create a parser instance able to parse invalid markup. - If *convert_charrefs* is ``True`` (the default), all character - references (except the ones in ``script``/``style`` elements) are + If *convert_charrefs* is true (the default), all character + references (except the ones in elements like ``script`` and ``style``) are automatically converted to the corresponding Unicode characters. + If *scripting* is false (the default), the content of the ``noscript`` + element is parsed normally; if it's true, it's returned as is without + being parsed. + An :class:`.HTMLParser` instance is fed HTML data and calls handler methods when start tags, end tags, text, comments, and other markup elements are encountered. The user should subclass :class:`.HTMLParser` and override its @@ -37,6 +41,9 @@ parsing text files formatted in HTML (HyperText Mark-up Language) and XHTML. .. versionchanged:: 3.5 The default value for argument *convert_charrefs* is now ``True``. + .. versionchanged:: 3.14.1 + Added the *scripting* parameter. + Example HTML Parser Application ------------------------------- @@ -161,15 +168,15 @@ implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): .. method:: HTMLParser.handle_data(data) This method is called to process arbitrary data (e.g. text nodes and the - content of ```` and ````). + content of elements like ``script`` and ``style``). .. method:: HTMLParser.handle_entityref(name) This method is called to process a named character reference of the form ``&name;`` (e.g. ``>``), where *name* is a general entity reference - (e.g. ``'gt'``). This method is never called if *convert_charrefs* is - ``True``. + (e.g. ``'gt'``). + This method is only called if *convert_charrefs* is false. .. method:: HTMLParser.handle_charref(name) @@ -177,8 +184,8 @@ implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): This method is called to process decimal and hexadecimal numeric character references of the form :samp:`&#{NNN};` and :samp:`&#x{NNN};`. For example, the decimal equivalent for ``>`` is ``>``, whereas the hexadecimal is ``>``; - in this case the method will receive ``'62'`` or ``'x3E'``. This method - is never called if *convert_charrefs* is ``True``. + in this case the method will receive ``'62'`` or ``'x3E'``. + This method is only called if *convert_charrefs* is false. .. method:: HTMLParser.handle_comment(data) @@ -292,8 +299,8 @@ Parsing an element with a few attributes and a title: Data : Python End tag : h1 -The content of ``script`` and ``style`` elements is returned as is, without -further parsing: +The content of elements like ``script`` and ``style`` is returned as is, +without further parsing: .. doctest:: @@ -304,10 +311,10 @@ further parsing: End tag : style >>> parser.feed('') + ... 'alert("hello! ☺");') Start tag: script attr: ('type', 'text/javascript') - Data : alert("hello!"); + Data : alert("hello! ☺"); End tag : script Parsing comments: @@ -336,7 +343,7 @@ correct char (note: these 3 references are all equivalent to ``'>'``): Feeding incomplete chunks to :meth:`~HTMLParser.feed` works, but :meth:`~HTMLParser.handle_data` might be called more than once -(unless *convert_charrefs* is set to ``True``): +if *convert_charrefs* is false: .. doctest:: diff --git a/Lib/html/parser.py b/Lib/html/parser.py index 5d7050dad2396b..e50620de800d63 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -127,17 +127,25 @@ class HTMLParser(_markupbase.ParserBase): argument. """ - CDATA_CONTENT_ELEMENTS = ("script", "style") + # See the HTML5 specs section "13.4 Parsing HTML fragments". + # https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments + # CDATA_CONTENT_ELEMENTS are parsed in RAWTEXT mode + CDATA_CONTENT_ELEMENTS = ("script", "style", "xmp", "iframe", "noembed", "noframes") RCDATA_CONTENT_ELEMENTS = ("textarea", "title") - def __init__(self, *, convert_charrefs=True): + def __init__(self, *, convert_charrefs=True, scripting=False): """Initialize and reset this instance. - If convert_charrefs is True (the default), all character references + If convert_charrefs is true (the default), all character references are automatically converted to the corresponding Unicode characters. + + If *scripting* is false (the default), the content of the + ``noscript`` element is parsed normally; if it's true, + it's returned as is without being parsed. """ super().__init__() self.convert_charrefs = convert_charrefs + self.scripting = scripting self.reset() def reset(self): @@ -172,7 +180,9 @@ def get_starttag_text(self): def set_cdata_mode(self, elem, *, escapable=False): self.cdata_elem = elem.lower() self._escapable = escapable - if escapable and not self.convert_charrefs: + if self.cdata_elem == 'plaintext': + self.interesting = re.compile(r'\z') + elif escapable and not self.convert_charrefs: self.interesting = re.compile(r'&|])' % self.cdata_elem, re.IGNORECASE|re.ASCII) else: @@ -444,8 +454,10 @@ def parse_starttag(self, i): self.handle_startendtag(tag, attrs) else: self.handle_starttag(tag, attrs) - if tag in self.CDATA_CONTENT_ELEMENTS: - self.set_cdata_mode(tag) + if (tag in self.CDATA_CONTENT_ELEMENTS or + (self.scripting and tag == "noscript") or + tag == "plaintext"): + self.set_cdata_mode(tag, escapable=False) elif tag in self.RCDATA_CONTENT_ELEMENTS: self.set_cdata_mode(tag, escapable=True) return endpos diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 6a1d69335a0616..19dde9362a43b6 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -8,6 +8,18 @@ from test import support +SAMPLE_RCDATA = ( + '' + "" + '' + '' + '' + '\u2603' +) + +SAMPLE_RAWTEXT = SAMPLE_RCDATA + '&☺' + + class EventCollector(html.parser.HTMLParser): def __init__(self, *args, autocdata=False, **kw): @@ -293,30 +305,20 @@ def test_get_starttag_text(self): 'Date().getTime()+\'"><\\/s\'+\'cript>\');\n//]]>'), '\n\n', '', - 'foo = ""', - 'foo = ""', - 'foo = ""', - 'foo = ""', - 'foo = ""', - 'foo = ""', ]) def test_script_content(self, content): s = f'' - self._run_check(s, [("starttag", "script", []), - ("data", content), - ("endtag", "script")]) + self._run_check(s, [ + ("starttag", "script", []), + ("data", content), + ("endtag", "script"), + ]) @support.subTests('content', [ 'a::before { content: ""; }', 'a::before { content: "¬-an-entity-ref;"; }', 'a::before { content: ""; }', 'a::before { content: "\u2603"; }', - 'a::before { content: "< /style>"; }', - 'a::before { content: ""; }', - 'a::before { content: ""; }', - 'a::before { content: ""; }', - 'a::before { content: ""; }', - 'a::before { content: ""; }', ]) def test_style_content(self, content): s = f'' @@ -324,47 +326,59 @@ def test_style_content(self, content): ("data", content), ("endtag", "style")]) - @support.subTests('content', [ - '', - "", - '', - '', - '', - '\u2603', - '< /title>', - '', - '', - '', - '', - '', + @support.subTests('tag', ['title', 'textarea']) + def test_rcdata_content(self, tag): + source = f"<{tag}>{SAMPLE_RCDATA}" + self._run_check(source, [ + ("starttag", tag, []), + ("data", SAMPLE_RCDATA), + ("endtag", tag), ]) - def test_title_content(self, content): - source = f"{content}" + source = f"<{tag}>&" self._run_check(source, [ - ("starttag", "title", []), - ("data", content), - ("endtag", "title"), + ("starttag", tag, []), + ('entityref', 'amp'), + ("endtag", tag), ]) - @support.subTests('content', [ - '', - "", - '', - '', - '', - '\u2603', - '< /textarea>', - '', - '', - '', - '', + @support.subTests('tag', + ['style', 'xmp', 'iframe', 'noembed', 'noframes', 'script']) + def test_rawtext_content(self, tag): + source = f"<{tag}>{SAMPLE_RAWTEXT}" + self._run_check(source, [ + ("starttag", tag, []), + ("data", SAMPLE_RAWTEXT), + ("endtag", tag), + ]) + + def test_noscript_content(self): + source = f"" + # scripting=False -- normal mode + self._run_check(source, [ + ('starttag', 'noscript', []), + ('comment', ' not a comment '), + ('starttag', 'not', [('a', 'start tag')]), + ('unknown decl', 'CDATA[not a cdata'), + ('comment', 'not a bogus comment'), + ('endtag', 'not'), + ('data', '☃'), + ('entityref', 'amp'), + ('charref', '9786'), + ('endtag', 'noscript'), ]) - def test_textarea_content(self, content): - source = f"" + # scripting=True -- RAWTEXT mode + self._run_check(source, [ + ("starttag", "noscript", []), + ("data", SAMPLE_RAWTEXT), + ("endtag", "noscript"), + ], collector=EventCollector(scripting=True)) + + def test_plaintext_content(self): + content = SAMPLE_RAWTEXT + '' # not closing + source = f"{content}" self._run_check(source, [ - ("starttag", "textarea", []), + ("starttag", "plaintext", []), ("data", content), - ("endtag", "textarea"), ]) @support.subTests('endtag', ['script', 'SCRIPT', 'script ', 'script\n', @@ -381,52 +395,65 @@ def test_script_closing_tag(self, endtag): ("endtag", "script")], collector=EventCollectorNoNormalize(convert_charrefs=False)) - @support.subTests('endtag', ['style', 'STYLE', 'style ', 'style\n', - 'style/', 'style foo=bar', 'style foo=">"']) - def test_style_closing_tag(self, endtag): - content = """ - b::before { content: "<!-- not a comment -->"; } - p::before { content: "&not-an-entity-ref;"; } - a::before { content: "<i>"; } - a::after { content: "</i>"; } - """ - s = f'<StyLE>{content}</{endtag}>' - self._run_check(s, [("starttag", "style", []), - ("data", content), - ("endtag", "style")], - collector=EventCollectorNoNormalize(convert_charrefs=False)) - - @support.subTests('endtag', ['title', 'TITLE', 'title ', 'title\n', - 'title/', 'title foo=bar', 'title foo=">"']) - def test_title_closing_tag(self, endtag): - content = "<!-- not a comment --><i>Egg &amp; Spam</i>" - s = f'<TitLe>{content}</{endtag}>' - self._run_check(s, [("starttag", "title", []), - ('data', '<!-- not a comment --><i>Egg & Spam</i>'), - ("endtag", "title")], - collector=EventCollectorNoNormalize(convert_charrefs=True)) - self._run_check(s, [("starttag", "title", []), - ('data', '<!-- not a comment --><i>Egg '), - ('entityref', 'amp'), - ('data', ' Spam</i>'), - ("endtag", "title")], - collector=EventCollectorNoNormalize(convert_charrefs=False)) - - @support.subTests('endtag', ['textarea', 'TEXTAREA', 'textarea ', 'textarea\n', - 'textarea/', 'textarea foo=bar', 'textarea foo=">"']) - def test_textarea_closing_tag(self, endtag): - content = "<!-- not a comment --><i>Egg &amp; Spam</i>" - s = f'<TexTarEa>{content}</{endtag}>' - self._run_check(s, [("starttag", "textarea", []), - ('data', '<!-- not a comment --><i>Egg & Spam</i>'), - ("endtag", "textarea")], - collector=EventCollectorNoNormalize(convert_charrefs=True)) - self._run_check(s, [("starttag", "textarea", []), - ('data', '<!-- not a comment --><i>Egg '), - ('entityref', 'amp'), - ('data', ' Spam</i>'), - ("endtag", "textarea")], - collector=EventCollectorNoNormalize(convert_charrefs=False)) + @support.subTests('tag', [ + 'script', 'style', 'xmp', 'iframe', 'noembed', 'noframes', + 'textarea', 'title', 'noscript', + ]) + def test_closing_tag(self, tag): + for endtag in [tag, tag.upper(), f'{tag} ', f'{tag}\n', + f'{tag}/', f'{tag} foo=bar', f'{tag} foo=">"']: + content = "<!-- not a comment --><i>Spam</i>" + s = f'<{tag.upper()}>{content}</{endtag}>' + self._run_check(s, [ + ("starttag", tag, []), + ('data', content), + ("endtag", tag), + ], collector=EventCollectorNoNormalize(convert_charrefs=False, scripting=True)) + + @support.subTests('tag', [ + 'script', 'style', 'xmp', 'iframe', 'noembed', 'noframes', + 'textarea', 'title', 'noscript', + ]) + def test_invalid_closing_tag(self, tag): + content = ( + f'< /{tag}>' + f'</ {tag}>' + f'</{tag}x>' + f'</{tag}\v>' + f'</{tag}\xa0>' + ) + source = f"<{tag}>{content}</{tag}>" + self._run_check(source, [ + ("starttag", tag, []), + ("data", content), + ("endtag", tag), + ], collector=EventCollector(convert_charrefs=False, scripting=True)) + + @support.subTests('tag,endtag', [ + ('title', 'tıtle'), + ('style', 'ſtyle'), + ('style', 'ſtyle'), + ('style', 'style'), + ('iframe', 'ıframe'), + ('noframes', 'noframeſ'), + ('noscript', 'noſcript'), + ('noscript', 'noscrıpt'), + ('script', 'ſcript'), + ('script', 'scrıpt'), + ]) + def test_invalid_nonascii_closing_tag(self, tag, endtag): + content = f"<br></{endtag}>" + source = f"<{tag}>{content}" + self._run_check(source, [ + ("starttag", tag, []), + ("data", content), + ], collector=EventCollector(convert_charrefs=False, scripting=True)) + source = f"<{tag}>{content}</{tag}>" + self._run_check(source, [ + ("starttag", tag, []), + ("data", content), + ("endtag", tag), + ], collector=EventCollector(convert_charrefs=False, scripting=True)) @support.subTests('tail,end', [ ('', False), diff --git a/Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst b/Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst new file mode 100644 index 00000000000000..c30c9439a76a19 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst @@ -0,0 +1,3 @@ +Add support of the "plaintext" element, RAWTEXT elements "xmp", "iframe", +"noembed" and "noframes", and optionally RAWTEXT element "noscript" in +:class:`html.parser.HTMLParser`. From 631ba3407e3348ccd56ce5160c4fb2c5dc5f4d84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= <lukasz@langa.pl> Date: Fri, 31 Oct 2025 17:43:23 +0100 Subject: [PATCH 1276/1674] [3.14] gh-136065: Fix quadratic complexity in os.path.expandvars() (GH-134952) (GH-140844) (cherry picked from commit f029e8db626ddc6e3a3beea4eff511a71aaceb5c) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/ntpath.py | 126 ++++++------------ Lib/posixpath.py | 43 +++--- Lib/test/test_genericpath.py | 21 ++- Lib/test/test_ntpath.py | 22 ++- ...-05-30-22-33-27.gh-issue-136065.bu337o.rst | 1 + 5 files changed, 96 insertions(+), 117 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 9cdc16480f9afe..01f060e70beed9 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -400,17 +400,23 @@ def expanduser(path): # XXX With COMMAND.COM you can use any characters in a variable name, # XXX except '^|<>='. +_varpattern = r"'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)" +_varsub = None +_varsubb = None + def expandvars(path): """Expand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.""" path = os.fspath(path) + global _varsub, _varsubb if isinstance(path, bytes): if b'$' not in path and b'%' not in path: return path - import string - varchars = bytes(string.ascii_letters + string.digits + '_-', 'ascii') - quote = b'\'' + if not _varsubb: + import re + _varsubb = re.compile(_varpattern.encode(), re.ASCII).sub + sub = _varsubb percent = b'%' brace = b'{' rbrace = b'}' @@ -419,94 +425,44 @@ def expandvars(path): else: if '$' not in path and '%' not in path: return path - import string - varchars = string.ascii_letters + string.digits + '_-' - quote = '\'' + if not _varsub: + import re + _varsub = re.compile(_varpattern, re.ASCII).sub + sub = _varsub percent = '%' brace = '{' rbrace = '}' dollar = '$' environ = os.environ - res = path[:0] - index = 0 - pathlen = len(path) - while index < pathlen: - c = path[index:index+1] - if c == quote: # no expansion within single quotes - path = path[index + 1:] - pathlen = len(path) - try: - index = path.index(c) - res += c + path[:index + 1] - except ValueError: - res += c + path - index = pathlen - 1 - elif c == percent: # variable or '%' - if path[index + 1:index + 2] == percent: - res += c - index += 1 - else: - path = path[index+1:] - pathlen = len(path) - try: - index = path.index(percent) - except ValueError: - res += percent + path - index = pathlen - 1 - else: - var = path[:index] - try: - if environ is None: - value = os.fsencode(os.environ[os.fsdecode(var)]) - else: - value = environ[var] - except KeyError: - value = percent + var + percent - res += value - elif c == dollar: # variable or '$$' - if path[index + 1:index + 2] == dollar: - res += c - index += 1 - elif path[index + 1:index + 2] == brace: - path = path[index+2:] - pathlen = len(path) - try: - index = path.index(rbrace) - except ValueError: - res += dollar + brace + path - index = pathlen - 1 - else: - var = path[:index] - try: - if environ is None: - value = os.fsencode(os.environ[os.fsdecode(var)]) - else: - value = environ[var] - except KeyError: - value = dollar + brace + var + rbrace - res += value - else: - var = path[:0] - index += 1 - c = path[index:index + 1] - while c and c in varchars: - var += c - index += 1 - c = path[index:index + 1] - try: - if environ is None: - value = os.fsencode(os.environ[os.fsdecode(var)]) - else: - value = environ[var] - except KeyError: - value = dollar + var - res += value - if c: - index -= 1 + + def repl(m): + lastindex = m.lastindex + if lastindex is None: + return m[0] + name = m[lastindex] + if lastindex == 1: + if name == percent: + return name + if not name.endswith(percent): + return m[0] + name = name[:-1] else: - res += c - index += 1 - return res + if name == dollar: + return name + if name.startswith(brace): + if not name.endswith(rbrace): + return m[0] + name = name[1:-1] + + try: + if environ is None: + return os.fsencode(os.environ[os.fsdecode(name)]) + else: + return environ[name] + except KeyError: + return m[0] + + return sub(repl, path) # Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A\B. diff --git a/Lib/posixpath.py b/Lib/posixpath.py index d38f3bd5872bcd..ad86cc06c017a0 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -284,42 +284,41 @@ def expanduser(path): # This expands the forms $variable and ${variable} only. # Non-existent variables are left unchanged. -_varprog = None -_varprogb = None +_varpattern = r'\$(\w+|\{[^}]*\}?)' +_varsub = None +_varsubb = None def expandvars(path): """Expand shell variables of form $var and ${var}. Unknown variables are left unchanged.""" path = os.fspath(path) - global _varprog, _varprogb + global _varsub, _varsubb if isinstance(path, bytes): if b'$' not in path: return path - if not _varprogb: + if not _varsubb: import re - _varprogb = re.compile(br'\$(\w+|\{[^}]*\})', re.ASCII) - search = _varprogb.search + _varsubb = re.compile(_varpattern.encode(), re.ASCII).sub + sub = _varsubb start = b'{' end = b'}' environ = getattr(os, 'environb', None) else: if '$' not in path: return path - if not _varprog: + if not _varsub: import re - _varprog = re.compile(r'\$(\w+|\{[^}]*\})', re.ASCII) - search = _varprog.search + _varsub = re.compile(_varpattern, re.ASCII).sub + sub = _varsub start = '{' end = '}' environ = os.environ - i = 0 - while True: - m = search(path, i) - if not m: - break - i, j = m.span(0) - name = m.group(1) - if name.startswith(start) and name.endswith(end): + + def repl(m): + name = m[1] + if name.startswith(start): + if not name.endswith(end): + return m[0] name = name[1:-1] try: if environ is None: @@ -327,13 +326,11 @@ def expandvars(path): else: value = environ[name] except KeyError: - i = j + return m[0] else: - tail = path[j:] - path = path[:i] + value - i = len(path) - path += tail - return path + return value + + return sub(repl, path) # Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index df07af01fc7540..1a44cedcd360b1 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -7,9 +7,9 @@ import sys import unittest import warnings -from test.support import ( - is_apple, is_emscripten, os_helper, warnings_helper -) +from test import support +from test.support import os_helper +from test.support import warnings_helper from test.support.script_helper import assert_python_ok from test.support.os_helper import FakePath @@ -445,6 +445,19 @@ def check(value, expected): os.fsencode('$bar%s bar' % nonascii)) check(b'$spam}bar', os.fsencode('%s}bar' % nonascii)) + @support.requires_resource('cpu') + def test_expandvars_large(self): + expandvars = self.pathmodule.expandvars + with os_helper.EnvironmentVarGuard() as env: + env.clear() + env["A"] = "B" + n = 100_000 + self.assertEqual(expandvars('$A'*n), 'B'*n) + self.assertEqual(expandvars('${A}'*n), 'B'*n) + self.assertEqual(expandvars('$A!'*n), 'B!'*n) + self.assertEqual(expandvars('${A}A'*n), 'BA'*n) + self.assertEqual(expandvars('${'*10*n), '${'*10*n) + def test_abspath(self): self.assertIn("foo", self.pathmodule.abspath("foo")) with warnings.catch_warnings(): @@ -502,7 +515,7 @@ def test_nonascii_abspath(self): # directory (when the bytes name is used). and sys.platform not in { "win32", "emscripten", "wasi" - } and not is_apple + } and not support.is_apple ): name = os_helper.TESTFN_UNDECODABLE elif os_helper.TESTFN_NONASCII: diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 03bfccf260b25d..9270f3257068d6 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -7,8 +7,7 @@ import unittest import warnings from test import support -from test.support import cpython_only, os_helper -from test.support import TestFailed +from test.support import os_helper from ntpath import ALLOW_MISSING from test.support.os_helper import FakePath from test import test_genericpath @@ -59,7 +58,7 @@ def tester(fn, wantResult): fn = fn.replace("\\", "\\\\") gotResult = eval(fn) if wantResult != gotResult and _norm(wantResult) != _norm(gotResult): - raise TestFailed("%s should return: %s but returned: %s" \ + raise support.TestFailed("%s should return: %s but returned: %s" \ %(str(fn), str(wantResult), str(gotResult))) # then with bytes @@ -75,7 +74,7 @@ def tester(fn, wantResult): warnings.simplefilter("ignore", DeprecationWarning) gotResult = eval(fn) if _norm(wantResult) != _norm(gotResult): - raise TestFailed("%s should return: %s but returned: %s" \ + raise support.TestFailed("%s should return: %s but returned: %s" \ %(str(fn), str(wantResult), repr(gotResult))) @@ -1022,6 +1021,19 @@ def check(value, expected): check('%spam%bar', '%sbar' % nonascii) check('%{}%bar'.format(nonascii), 'ham%sbar' % nonascii) + @support.requires_resource('cpu') + def test_expandvars_large(self): + expandvars = ntpath.expandvars + with os_helper.EnvironmentVarGuard() as env: + env.clear() + env["A"] = "B" + n = 100_000 + self.assertEqual(expandvars('%A%'*n), 'B'*n) + self.assertEqual(expandvars('%A%A'*n), 'BA'*n) + self.assertEqual(expandvars("''"*n + '%%'), "''"*n + '%') + self.assertEqual(expandvars("%%"*n), "%"*n) + self.assertEqual(expandvars("$$"*n), "$"*n) + def test_expanduser(self): tester('ntpath.expanduser("test")', 'test') @@ -1439,7 +1451,7 @@ def test_con_device(self): self.assertTrue(os.path.exists(r"\\.\CON")) @unittest.skipIf(sys.platform != 'win32', "Fast paths are only for win32") - @cpython_only + @support.cpython_only def test_fast_paths_in_use(self): # There are fast paths of these functions implemented in posixmodule.c. # Confirm that they are being used, and not the Python fallbacks in diff --git a/Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst b/Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst new file mode 100644 index 00000000000000..1d152bb5318380 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst @@ -0,0 +1 @@ +Fix quadratic complexity in :func:`os.path.expandvars`. From c7ede76d8e6d3e2ec027b76fb977e806269045c2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 1 Nov 2025 12:21:51 +0100 Subject: [PATCH 1277/1674] [3.14] gh-140874: Upgrade bundled pip to 25.3 (GH-140876) (gh-140881) gh-140874: Upgrade bundled pip to 25.3 (GH-140876) Upgrade bundled pip to 25.3 (cherry picked from commit d440a0f96c6e87ee93810e0184068e90087af466) Co-authored-by: Damian Shaw <damian.peter.shaw@gmail.com> --- Lib/ensurepip/__init__.py | 2 +- ...none-any.whl => pip-25.3-py3-none-any.whl} | Bin 1752557 -> 1778622 bytes ...-11-01-00-36-14.gh-issue-140874.eAWt3K.rst | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename Lib/ensurepip/_bundled/{pip-25.2-py3-none-any.whl => pip-25.3-py3-none-any.whl} (79%) create mode 100644 Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 4bd85990e8614a..21bbfad0fe6b3e 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -10,7 +10,7 @@ __all__ = ["version", "bootstrap"] -_PIP_VERSION = "25.2" +_PIP_VERSION = "25.3" # Directory of system wheel packages. Some Linux distribution packaging # policies recommend against bundling dependencies. For example, Fedora diff --git a/Lib/ensurepip/_bundled/pip-25.2-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-25.3-py3-none-any.whl similarity index 79% rename from Lib/ensurepip/_bundled/pip-25.2-py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-25.3-py3-none-any.whl index e14bb3f37c0ff4cfa105c71d5e536f2f496cb160..755e1aa0c3dc5a90defba25ab35f4b8877ca95ab 100644 GIT binary patch delta 300478 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%0D(IUld=^fBUkErF+_Yolzw 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%0DTRlH~DS|IA%jYlI{>V#_t!XTn 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 VRG_kNo7^_py%hh)ZzkP({~xhCe`^2$ delta 300566 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 Z-Fvi)>P)K=YKQu`x-T|K31M_I^?zCXe7^ty diff --git a/Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst b/Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst new file mode 100644 index 00000000000000..a48162de76b496 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst @@ -0,0 +1 @@ +Bump the version of pip bundled in ensurepip to version 25.3 From ab1fdf3d7c2e9461301003d60b5c6c6f88d01c3e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 1 Nov 2025 17:49:35 +0100 Subject: [PATCH 1278/1674] [3.14] gh-140312: Set lltrace on JIT debug builds (GH-140313) (#140887) gh-140312: Set lltrace on JIT debug builds (GH-140313) (cherry picked from commit f701f98052e906af9a065d68bdf2398ef3b476d9) Co-authored-by: Ken Jin <kenjin@python.org> Co-authored-by: Mark Shannon <mark@hotpy.org> --- Tools/jit/template.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Tools/jit/template.c b/Tools/jit/template.c index 5ee26f93f1e266..d042699680c639 100644 --- a/Tools/jit/template.c +++ b/Tools/jit/template.c @@ -70,9 +70,11 @@ do { \ } while (0) #undef LLTRACE_RESUME_FRAME -#define LLTRACE_RESUME_FRAME() \ - do { \ - } while (0) +#ifdef Py_DEBUG +#define LLTRACE_RESUME_FRAME() (frame->lltrace = 0) +#else +#define LLTRACE_RESUME_FRAME() do {} while (0) +#endif #define PATCH_JUMP(ALIAS) \ do { \ From 4d68b758fa0a18c949d7d2f22dde091c8d7a3ba7 Mon Sep 17 00:00:00 2001 From: Ken Jin <kenjin@python.org> Date: Sun, 2 Nov 2025 02:41:01 +0800 Subject: [PATCH 1279/1674] [3.14] gh-140104: Revert "Set next_instr properly in the JIT during exceptions (GH-140233) (GH-140687)" (#140890) Revert "[3.14] gh-140104: Set next_instr properly in the JIT during exceptions (GH-140233) (GH-140687)" This reverts commit 2e216728038a03d387231f39ded091ec318ba61b. --- Lib/test/test_capi/test_opt.py | 21 ------------------- ...-10-16-21-47-00.gh-issue-140104.A8SQIm.rst | 2 -- Python/ceval_macros.h | 4 +--- 3 files changed, 1 insertion(+), 26 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index bdcda12c76e1bc..c74c8ee0eef8e2 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1972,27 +1972,6 @@ def testfunc(n): assert ex is not None """)) - def test_next_instr_for_exception_handler_set(self): - # gh-140104: We just want the exception to be caught properly. - def f(): - for i in range(TIER2_THRESHOLD + 3): - try: - undefined_variable(i) - except Exception: - pass - - f() - - def test_next_instr_for_exception_handler_set_lasts_instr(self): - # gh-140104: We just want the exception to be caught properly. - def f(): - a_list = [] - for _ in range(TIER2_THRESHOLD + 3): - try: - a_list[""] = 0 - except Exception: - pass - def global_identity(x): return x diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst deleted file mode 100644 index 1c18cbc9ad0588..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported -by Daniel Diniz. diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index df1950416c2ddd..187ec8fdd26584 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -368,9 +368,7 @@ do { \ frame = tstate->current_frame; \ stack_pointer = _PyFrame_GetStackPointer(frame); \ if (next_instr == NULL) { \ - /* gh-140104: The exception handler expects frame->instr_ptr - to after this_instr, not this_instr! */ \ - next_instr = frame->instr_ptr + 1; \ + next_instr = frame->instr_ptr; \ JUMP_TO_LABEL(error); \ } \ DISPATCH(); \ From 4d7fab9b15f9ce9239af809064fe5ce70faab433 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 2 Nov 2025 09:38:56 +0100 Subject: [PATCH 1280/1674] [3.14] Docs: fix some grammatical errors in `Doc/c-api/dict.rst` (GH-140899) (#140901) Docs: fix some grammatical errors in `Doc/c-api/dict.rst` (GH-140899) (cherry picked from commit d12cbf2865d2845d238f697ddace83face814972) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/dict.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 0fbe26b56c0a7c..0abbd662dad394 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -50,7 +50,7 @@ Dictionary Objects .. c:function:: int PyDict_Contains(PyObject *p, PyObject *key) - Determine if dictionary *p* contains *key*. If an item in *p* is matches + Determine if dictionary *p* contains *key*. If an item in *p* matches *key*, return ``1``, otherwise return ``0``. On error, return ``-1``. This is equivalent to the Python expression ``key in p``. @@ -198,7 +198,7 @@ Dictionary Objects .. 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. + Do not raise :exc:`KeyError` if the key is missing. - If the key is present, set *\*result* to a new reference to the removed value if *result* is not ``NULL``, and return ``1``. @@ -207,7 +207,7 @@ Dictionary Objects - On error, raise an exception and return ``-1``. Similar to :meth:`dict.pop`, but without the default value and - not raising :exc:`KeyError` if the key missing. + not raising :exc:`KeyError` if the key is missing. .. versionadded:: 3.13 From bf2865f80f50d0a9a4ea7082ced6087fa76b6f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sun, 2 Nov 2025 10:33:36 +0100 Subject: [PATCH 1281/1674] [3.14] gh-90949: add Expat API to prevent XML deadly allocations (CVE-2025-59375) (GH-139234) (#139359) * [3.14] gh-90949: add Expat API to prevent XML deadly allocations (CVE-2025-59375) (GH-139234) Expose the XML Expat 2.7.2 mitigation APIs to disallow use of disproportional amounts of dynamic memory from within an Expat parser (see CVE-2025-59375 for instance). The exposed APIs are available on Expat parsers, that is, parsers created by `xml.parsers.expat.ParserCreate()`, as: - `parser.SetAllocTrackerActivationThreshold(threshold)`, and - `parser.SetAllocTrackerMaximumAmplification(max_factor)`. (cherry picked from commit f04bea44c37793561d753dd4ca6e7cd658137553) (cherry picked from commit 68a1778b7721f3fb853cd3aa674f7039c2a4df36) --- Doc/library/pyexpat.rst | 57 +++++ Include/pyexpat.h | 5 + Lib/test/test_pyexpat.py | 199 ++++++++++++++++- ...5-09-22-14-40-11.gh-issue-90949.UM35nb.rst | 5 + Modules/clinic/pyexpat.c.h | 136 +++++++++++- Modules/expat/pyexpatns.h | 2 + Modules/pyexpat.c | 208 +++++++++++++++--- 7 files changed, 583 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 5506ac828e5abe..0b08a9b0dedef6 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -72,6 +72,13 @@ The :mod:`xml.parsers.expat` module contains two functions: *encoding* [1]_ is given it will override the implicit or explicit encoding of the document. + .. _xmlparser-non-root: + + Parsers created through :func:`!ParserCreate` are called "root" parsers, + in the sense that they do not have any parent parser attached. Non-root + parsers are created by :meth:`parser.ExternalEntityParserCreate + <xmlparser.ExternalEntityParserCreate>`. + Expat can optionally do XML namespace processing for you, enabled by providing a value for *namespace_separator*. The value must be a one-character string; a :exc:`ValueError` will be raised if the string has an illegal length (``None`` @@ -231,6 +238,55 @@ XMLParser Objects .. versionadded:: 3.13 +:class:`!xmlparser` objects have the following methods to mitigate some +common XML vulnerabilities. + +.. method:: xmlparser.SetAllocTrackerActivationThreshold(threshold, /) + + Sets the number of allocated bytes of dynamic memory needed to activate + protection against disproportionate use of RAM. + + By default, parser objects have an allocation activation threshold of 64 MiB, + or equivalently 67,108,864 bytes. + + An :exc:`ExpatError` is raised if this method is called on a + |xml-non-root-parser| parser. + The corresponding :attr:`~ExpatError.lineno` and :attr:`~ExpatError.offset` + should not be used as they may have no special meaning. + + .. versionadded:: next + +.. method:: xmlparser.SetAllocTrackerMaximumAmplification(max_factor, /) + + Sets the maximum amplification factor between direct input and bytes + of dynamic memory allocated. + + The amplification factor is calculated as ``allocated / direct`` + while parsing, where ``direct`` is the number of bytes read from + the primary document in parsing and ``allocated`` is the number + of bytes of dynamic memory allocated in the parser hierarchy. + + The *max_factor* value must be a non-NaN :class:`float` value greater than + or equal to 1.0. Amplification factors greater than 100.0 can be observed + near the start of parsing even with benign files in practice. In particular, + the activation threshold should be carefully chosen to avoid false positives. + + By default, parser objects have a maximum amplification factor of 100.0. + + An :exc:`ExpatError` is raised if this method is called on a + |xml-non-root-parser| parser or if *max_factor* is outside the valid range. + The corresponding :attr:`~ExpatError.lineno` and :attr:`~ExpatError.offset` + should not be used as they may have no special meaning. + + .. note:: + + The maximum amplification factor is only considered if the threshold + that can be adjusted by :meth:`.SetAllocTrackerActivationThreshold` + is exceeded. + + .. versionadded:: next + + :class:`xmlparser` objects have the following attributes: @@ -954,3 +1010,4 @@ The ``errors`` module has the following attributes: not. See https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl and https://www.iana.org/assignments/character-sets/character-sets.xhtml. +.. |xml-non-root-parser| replace:: :ref:`non-root <xmlparser-non-root>` diff --git a/Include/pyexpat.h b/Include/pyexpat.h index 9824d099c3df7d..04548b7684a2fd 100644 --- a/Include/pyexpat.h +++ b/Include/pyexpat.h @@ -52,6 +52,11 @@ struct PyExpat_CAPI 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); + /* might be NULL for expat < 2.7.2 */ + XML_Bool (*SetAllocTrackerActivationThreshold)( + XML_Parser parser, unsigned long long activationThresholdBytes); + XML_Bool (*SetAllocTrackerMaximumAmplification)( + XML_Parser parser, float maxAmplificationFactor); /* always add new stuff to the end! */ }; diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 5c8189b33c3285..daeaa38a3c5085 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -1,7 +1,10 @@ # XXX TypeErrors on calling handlers, or on bad return values from a # handler, are obscure and unhelpful. +import abc +import functools import os +import re import sys import sysconfig import textwrap @@ -9,7 +12,7 @@ import traceback from io import BytesIO from test import support -from test.support import os_helper +from test.support import import_helper, os_helper from xml.parsers import expat from xml.parsers.expat import errors @@ -863,5 +866,199 @@ def start_element(name, _): self.assertEqual(started, ['doc']) +class AttackProtectionTestBase(abc.ABC): + """ + Base class for testing protections against XML payloads with + disproportionate amplification. + + The protections being tested should detect and prevent attacks + that leverage disproportionate amplification from small inputs. + """ + + @staticmethod + def exponential_expansion_payload(*, nrows, ncols, text='.'): + """Create a billion laughs attack payload. + + Be careful: the number of total items is pow(n, k), thereby + requiring at least pow(ncols, nrows) * sizeof(text) memory! + """ + template = textwrap.dedent(f"""\ + <?xml version="1.0"?> + <!DOCTYPE doc [ + <!ENTITY row0 "{text}"> + <!ELEMENT doc (#PCDATA)> + {{body}} + ]> + <doc>&row{nrows};</doc> + """).rstrip() + + body = '\n'.join( + f'<!ENTITY row{i + 1} "{f"&row{i};" * ncols}">' + for i in range(nrows) + ) + body = textwrap.indent(body, ' ' * 4) + return template.format(body=body) + + def test_payload_generation(self): + # self-test for exponential_expansion_payload() + payload = self.exponential_expansion_payload(nrows=2, ncols=3) + self.assertEqual(payload, textwrap.dedent("""\ + <?xml version="1.0"?> + <!DOCTYPE doc [ + <!ENTITY row0 "."> + <!ELEMENT doc (#PCDATA)> + <!ENTITY row1 "&row0;&row0;&row0;"> + <!ENTITY row2 "&row1;&row1;&row1;"> + ]> + <doc>&row2;</doc> + """).rstrip()) + + def assert_root_parser_failure(self, func, /, *args, **kwargs): + """Check that func(*args, **kwargs) is invalid for a sub-parser.""" + msg = "parser must be a root parser" + self.assertRaisesRegex(expat.ExpatError, msg, func, *args, **kwargs) + + @abc.abstractmethod + def assert_rejected(self, func, /, *args, **kwargs): + """Assert that func(*args, **kwargs) triggers the attack protection. + + Note: this method must ensure that the attack protection being tested + is the one that is actually triggered at runtime, e.g., by matching + the exact error message. + """ + + @abc.abstractmethod + def set_activation_threshold(self, parser, threshold): + """Set the activation threshold for the tested protection.""" + + @abc.abstractmethod + def set_maximum_amplification(self, parser, max_factor): + """Set the maximum amplification factor for the tested protection.""" + + @abc.abstractmethod + def test_set_activation_threshold__threshold_reached(self): + """Test when the activation threshold is exceeded.""" + + @abc.abstractmethod + def test_set_activation_threshold__threshold_not_reached(self): + """Test when the activation threshold is not exceeded.""" + + def test_set_activation_threshold__invalid_threshold_type(self): + parser = expat.ParserCreate() + setter = functools.partial(self.set_activation_threshold, parser) + + self.assertRaises(TypeError, setter, 1.0) + self.assertRaises(TypeError, setter, -1.5) + self.assertRaises(ValueError, setter, -5) + + def test_set_activation_threshold__invalid_threshold_range(self): + _testcapi = import_helper.import_module("_testcapi") + parser = expat.ParserCreate() + setter = functools.partial(self.set_activation_threshold, parser) + + self.assertRaises(OverflowError, setter, _testcapi.ULLONG_MAX + 1) + + def test_set_activation_threshold__fail_for_subparser(self): + parser = expat.ParserCreate() + subparser = parser.ExternalEntityParserCreate(None) + setter = functools.partial(self.set_activation_threshold, subparser) + self.assert_root_parser_failure(setter, 12345) + + @abc.abstractmethod + def test_set_maximum_amplification__amplification_exceeded(self): + """Test when the amplification factor is exceeded.""" + + @abc.abstractmethod + def test_set_maximum_amplification__amplification_not_exceeded(self): + """Test when the amplification factor is not exceeded.""" + + def test_set_maximum_amplification__infinity(self): + inf = float('inf') # an 'inf' threshold is allowed by Expat + parser = expat.ParserCreate() + self.assertIsNone(self.set_maximum_amplification(parser, inf)) + + def test_set_maximum_amplification__invalid_max_factor_type(self): + parser = expat.ParserCreate() + setter = functools.partial(self.set_maximum_amplification, parser) + + self.assertRaises(TypeError, setter, None) + self.assertRaises(TypeError, setter, 'abc') + + def test_set_maximum_amplification__invalid_max_factor_range(self): + parser = expat.ParserCreate() + setter = functools.partial(self.set_maximum_amplification, parser) + + msg = re.escape("'max_factor' must be at least 1.0") + self.assertRaisesRegex(expat.ExpatError, msg, setter, float('nan')) + self.assertRaisesRegex(expat.ExpatError, msg, setter, 0.99) + + def test_set_maximum_amplification__fail_for_subparser(self): + parser = expat.ParserCreate() + subparser = parser.ExternalEntityParserCreate(None) + setter = functools.partial(self.set_maximum_amplification, subparser) + self.assert_root_parser_failure(setter, 123.45) + + +@unittest.skipIf(expat.version_info < (2, 7, 2), "requires Expat >= 2.7.2") +class MemoryProtectionTest(AttackProtectionTestBase, unittest.TestCase): + + # NOTE: with the default Expat configuration, the billion laughs protection + # may hit before the allocation limiter if exponential_expansion_payload() + # is not carefully parametrized. As such, the payloads should be chosen so + # that either the allocation limiter is hit before other protections are + # triggered or no protection at all is triggered. + + def assert_rejected(self, func, /, *args, **kwargs): + """Check that func(*args, **kwargs) hits the allocation limit.""" + msg = r"out of memory: line \d+, column \d+" + self.assertRaisesRegex(expat.ExpatError, msg, func, *args, **kwargs) + + def set_activation_threshold(self, parser, threshold): + return parser.SetAllocTrackerActivationThreshold(threshold) + + def set_maximum_amplification(self, parser, max_factor): + return parser.SetAllocTrackerMaximumAmplification(max_factor) + + def test_set_activation_threshold__threshold_reached(self): + parser = expat.ParserCreate() + # Choose a threshold expected to be always reached. + self.set_activation_threshold(parser, 3) + # Check that the threshold is reached by choosing a small factor + # and a payload whose peak amplification factor exceeds it. + self.assertIsNone(self.set_maximum_amplification(parser, 1.0)) + payload = self.exponential_expansion_payload(ncols=10, nrows=4) + self.assert_rejected(parser.Parse, payload, True) + + def test_set_activation_threshold__threshold_not_reached(self): + parser = expat.ParserCreate() + # Choose a threshold expected to be never reached. + self.set_activation_threshold(parser, pow(10, 5)) + # Check that the threshold is reached by choosing a small factor + # and a payload whose peak amplification factor exceeds it. + self.assertIsNone(self.set_maximum_amplification(parser, 1.0)) + payload = self.exponential_expansion_payload(ncols=10, nrows=4) + self.assertIsNotNone(parser.Parse(payload, True)) + + def test_set_maximum_amplification__amplification_exceeded(self): + parser = expat.ParserCreate() + # Unconditionally enable maximum activation factor. + self.set_activation_threshold(parser, 0) + # Choose a max amplification factor expected to always be exceeded. + self.assertIsNone(self.set_maximum_amplification(parser, 1.0)) + # Craft a payload for which the peak amplification factor is > 1.0. + payload = self.exponential_expansion_payload(ncols=1, nrows=2) + self.assert_rejected(parser.Parse, payload, True) + + def test_set_maximum_amplification__amplification_not_exceeded(self): + parser = expat.ParserCreate() + # Unconditionally enable maximum activation factor. + self.set_activation_threshold(parser, 0) + # Choose a max amplification factor expected to never be exceeded. + self.assertIsNone(self.set_maximum_amplification(parser, 1e4)) + # Craft a payload for which the peak amplification factor is < 1e4. + payload = self.exponential_expansion_payload(ncols=1, nrows=2) + self.assertIsNotNone(parser.Parse(payload, True)) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst b/Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst new file mode 100644 index 00000000000000..5611f33fb8e37b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst @@ -0,0 +1,5 @@ +Add :meth:`~xml.parsers.expat.xmlparser.SetAllocTrackerActivationThreshold` +and :meth:`~xml.parsers.expat.xmlparser.SetAllocTrackerMaximumAmplification` +to :ref:`xmlparser <xmlparser-objects>` objects to prevent use of +disproportional amounts of dynamic memory from within an Expat parser. +Patch by Bénédikt Tran. diff --git a/Modules/clinic/pyexpat.c.h b/Modules/clinic/pyexpat.c.h index 13210e3be0f747..e178547060446e 100644 --- a/Modules/clinic/pyexpat.c.h +++ b/Modules/clinic/pyexpat.c.h @@ -6,6 +6,7 @@ preserve # include "pycore_gc.h" // PyGC_Head # include "pycore_runtime.h" // _Py_SINGLETON() #endif +#include "pycore_long.h" // _PyLong_UnsignedLongLong_Converter() #include "pycore_modsupport.h" // _PyArg_UnpackKeywords() PyDoc_STRVAR(pyexpat_xmlparser_SetReparseDeferralEnabled__doc__, @@ -408,6 +409,131 @@ pyexpat_xmlparser_UseForeignDTD(PyObject *self, PyTypeObject *cls, PyObject *con #endif /* (XML_COMBINED_VERSION >= 19505) */ +#if (XML_COMBINED_VERSION >= 20702) + +PyDoc_STRVAR(pyexpat_xmlparser_SetAllocTrackerActivationThreshold__doc__, +"SetAllocTrackerActivationThreshold($self, threshold, /)\n" +"--\n" +"\n" +"Sets the number of allocated bytes of dynamic memory needed to activate protection against disproportionate use of RAM.\n" +"\n" +"By default, parser objects have an allocation activation threshold of 64 MiB."); + +#define PYEXPAT_XMLPARSER_SETALLOCTRACKERACTIVATIONTHRESHOLD_METHODDEF \ + {"SetAllocTrackerActivationThreshold", _PyCFunction_CAST(pyexpat_xmlparser_SetAllocTrackerActivationThreshold), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_SetAllocTrackerActivationThreshold__doc__}, + +static PyObject * +pyexpat_xmlparser_SetAllocTrackerActivationThreshold_impl(xmlparseobject *self, + PyTypeObject *cls, + unsigned long long threshold); + +static PyObject * +pyexpat_xmlparser_SetAllocTrackerActivationThreshold(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "SetAllocTrackerActivationThreshold", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + unsigned long long threshold; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, + /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); + if (!args) { + goto exit; + } + if (!_PyLong_UnsignedLongLong_Converter(args[0], &threshold)) { + goto exit; + } + return_value = pyexpat_xmlparser_SetAllocTrackerActivationThreshold_impl((xmlparseobject *)self, cls, threshold); + +exit: + return return_value; +} + +#endif /* (XML_COMBINED_VERSION >= 20702) */ + +#if (XML_COMBINED_VERSION >= 20702) + +PyDoc_STRVAR(pyexpat_xmlparser_SetAllocTrackerMaximumAmplification__doc__, +"SetAllocTrackerMaximumAmplification($self, max_factor, /)\n" +"--\n" +"\n" +"Sets the maximum amplification factor between direct input and bytes of dynamic memory allocated.\n" +"\n" +"The amplification factor is calculated as \"allocated / direct\" while parsing,\n" +"where \"direct\" is the number of bytes read from the primary document in parsing\n" +"and \"allocated\" is the number of bytes of dynamic memory allocated in the parser\n" +"hierarchy.\n" +"\n" +"The \'max_factor\' value must be a non-NaN floating point value greater than\n" +"or equal to 1.0. Amplification factors greater than 100.0 can be observed\n" +"near the start of parsing even with benign files in practice. In particular,\n" +"the activation threshold should be carefully chosen to avoid false positives.\n" +"\n" +"By default, parser objects have a maximum amplification factor of 100.0."); + +#define PYEXPAT_XMLPARSER_SETALLOCTRACKERMAXIMUMAMPLIFICATION_METHODDEF \ + {"SetAllocTrackerMaximumAmplification", _PyCFunction_CAST(pyexpat_xmlparser_SetAllocTrackerMaximumAmplification), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_SetAllocTrackerMaximumAmplification__doc__}, + +static PyObject * +pyexpat_xmlparser_SetAllocTrackerMaximumAmplification_impl(xmlparseobject *self, + PyTypeObject *cls, + float max_factor); + +static PyObject * +pyexpat_xmlparser_SetAllocTrackerMaximumAmplification(PyObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty) + #else + # define KWTUPLE NULL + #endif + + static const char * const _keywords[] = {"", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "SetAllocTrackerMaximumAmplification", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + float max_factor; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, + /*minpos*/ 1, /*maxpos*/ 1, /*minkw*/ 0, /*varpos*/ 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_CheckExact(args[0])) { + max_factor = (float) (PyFloat_AS_DOUBLE(args[0])); + } + else + { + max_factor = (float) PyFloat_AsDouble(args[0]); + if (max_factor == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + return_value = pyexpat_xmlparser_SetAllocTrackerMaximumAmplification_impl((xmlparseobject *)self, cls, max_factor); + +exit: + return return_value; +} + +#endif /* (XML_COMBINED_VERSION >= 20702) */ + PyDoc_STRVAR(pyexpat_ParserCreate__doc__, "ParserCreate($module, /, encoding=None, namespace_separator=None,\n" " intern=<unrepresentable>)\n" @@ -552,4 +678,12 @@ pyexpat_ErrorString(PyObject *module, PyObject *arg) #ifndef PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #define PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #endif /* !defined(PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF) */ -/*[clinic end generated code: output=4dbdc959c67dc2d5 input=a9049054013a1b77]*/ + +#ifndef PYEXPAT_XMLPARSER_SETALLOCTRACKERACTIVATIONTHRESHOLD_METHODDEF + #define PYEXPAT_XMLPARSER_SETALLOCTRACKERACTIVATIONTHRESHOLD_METHODDEF +#endif /* !defined(PYEXPAT_XMLPARSER_SETALLOCTRACKERACTIVATIONTHRESHOLD_METHODDEF) */ + +#ifndef PYEXPAT_XMLPARSER_SETALLOCTRACKERMAXIMUMAMPLIFICATION_METHODDEF + #define PYEXPAT_XMLPARSER_SETALLOCTRACKERMAXIMUMAMPLIFICATION_METHODDEF +#endif /* !defined(PYEXPAT_XMLPARSER_SETALLOCTRACKERMAXIMUMAMPLIFICATION_METHODDEF) */ +/*[clinic end generated code: output=e73935658c04c83e input=a9049054013a1b77]*/ diff --git a/Modules/expat/pyexpatns.h b/Modules/expat/pyexpatns.h index 8ee03ef0792815..fc6b482d587e0d 100644 --- a/Modules/expat/pyexpatns.h +++ b/Modules/expat/pyexpatns.h @@ -82,6 +82,8 @@ #define XmlPrologStateInit PyExpat_XmlPrologStateInit #define XmlPrologStateInitExternalEntity PyExpat_XmlPrologStateInitExternalEntity #define XML_ResumeParser PyExpat_XML_ResumeParser +#define XML_SetAllocTrackerActivationThreshold PyExpat_XML_SetAllocTrackerActivationThreshold +#define XML_SetAllocTrackerMaximumAmplification PyExpat_XML_SetAllocTrackerMaximumAmplification #define XML_SetAttlistDeclHandler PyExpat_XML_SetAttlistDeclHandler #define XML_SetBase PyExpat_XML_SetBase #define XML_SetBillionLaughsAttackProtectionActivationThreshold PyExpat_XML_SetBillionLaughsAttackProtectionActivationThreshold diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index d55ad3cdeef2a8..009af9539f2f40 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -9,6 +9,8 @@ #include <stdbool.h> #include <stddef.h> // offsetof() + +#include "expat_config.h" #include "expat.h" #include "pyexpat.h" @@ -129,50 +131,89 @@ CALL_XML_HANDLER_SETTER(const struct HandlerInfo *handler_info, setter(xml_parser, xml_handler); } +static int +set_xml_error_attr_code(PyObject *err, enum XML_Error code) +{ + PyObject *v = PyLong_FromLong((long)code); + int ok = v != NULL && PyObject_SetAttr(err, &_Py_ID(code), v) != -1; + Py_XDECREF(v); + return ok; +} + /* Set an integer attribute on the error object; return true on success, * false on an exception. */ static int -set_error_attr(PyObject *err, const char *name, int value) +set_xml_error_attr_location(PyObject *err, const char *name, XML_Size value) { - PyObject *v = PyLong_FromLong(value); + PyObject *v = PyLong_FromSize_t((size_t)value); + int ok = v != NULL && PyObject_SetAttrString(err, name, v) != -1; + Py_XDECREF(v); + return ok; +} - if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) { - Py_XDECREF(v); - return 0; + +static PyObject * +set_xml_error(pyexpat_state *state, + enum XML_Error code, XML_Size lineno, XML_Size column, + const char *errmsg) +{ + PyObject *arg; + if (errmsg == NULL) { + arg = PyUnicode_FromFormat( + "%s: line %zu, column %zu", + XML_ErrorString(code), + (size_t)lineno, (size_t)column + ); } - Py_DECREF(v); - return 1; + else { + arg = PyUnicode_FromStringAndSize(errmsg, strlen(errmsg)); + } + if (arg == NULL) { + return NULL; + } + PyObject *res = PyObject_CallOneArg(state->error, arg); + Py_DECREF(arg); + if ( + res != NULL + && set_xml_error_attr_code(res, code) + && set_xml_error_attr_location(res, "lineno", lineno) + && set_xml_error_attr_location(res, "offset", column) + ) { + PyErr_SetObject(state->error, res); + } + Py_XDECREF(res); + return NULL; } +#define SET_XML_ERROR(STATE, SELF, CODE, ERRMSG) \ + do { \ + XML_Parser parser = SELF->itself; \ + assert(parser != NULL); \ + XML_Size lineno = XML_GetCurrentLineNumber(parser); \ + XML_Size column = XML_GetCurrentColumnNumber(parser); \ + (void)set_xml_error(state, CODE, lineno, column, ERRMSG); \ + } while (0) + /* Build and set an Expat exception, including positioning * information. Always returns NULL. */ static PyObject * set_error(pyexpat_state *state, xmlparseobject *self, enum XML_Error code) { - PyObject *err; - PyObject *buffer; - XML_Parser parser = self->itself; - int lineno = XML_GetErrorLineNumber(parser); - int column = XML_GetErrorColumnNumber(parser); + SET_XML_ERROR(state, self, code, NULL); + return NULL; +} - buffer = PyUnicode_FromFormat("%s: line %i, column %i", - XML_ErrorString(code), lineno, column); - if (buffer == NULL) - return NULL; - err = PyObject_CallOneArg(state->error, buffer); - Py_DECREF(buffer); - if ( err != NULL - && set_error_attr(err, "code", code) - && set_error_attr(err, "offset", column) - && set_error_attr(err, "lineno", lineno)) { - PyErr_SetObject(state->error, err); - } - Py_XDECREF(err); +static PyObject * +set_invalid_arg(pyexpat_state *state, xmlparseobject *self, const char *errmsg) +{ + SET_XML_ERROR(state, self, XML_ERROR_INVALID_ARGUMENT, errmsg); return NULL; } +#undef SET_XML_ERROR + static int have_handler(xmlparseobject *self, int type) { @@ -1143,6 +1184,112 @@ pyexpat_xmlparser_UseForeignDTD_impl(xmlparseobject *self, PyTypeObject *cls, } #endif +#if XML_COMBINED_VERSION >= 20702 +static PyObject * +set_activation_threshold(xmlparseobject *self, + PyTypeObject *cls, + unsigned long long threshold, + XML_Bool (*setter)(XML_Parser, unsigned long long)) +{ + assert(self->itself != NULL); + if (setter(self->itself, threshold) == XML_TRUE) { + Py_RETURN_NONE; + } + // The setter fails if self->itself is NULL (which is not possible here) + // or is a non-root parser, which currently only happens for parsers + // created by ExternalEntityParserCreate(). + pyexpat_state *state = PyType_GetModuleState(cls); + return set_invalid_arg(state, self, "parser must be a root parser"); +} + +static PyObject * +set_maximum_amplification(xmlparseobject *self, + PyTypeObject *cls, + float max_factor, + XML_Bool (*setter)(XML_Parser, float)) +{ + assert(self->itself != NULL); + if (setter(self->itself, max_factor) == XML_TRUE) { + Py_RETURN_NONE; + } + // The setter fails if self->itself is NULL (which is not possible here), + // is a non-root parser, which currently only happens for parsers created + // by ExternalEntityParserCreate(), or if 'max_factor' is NaN or < 1.0. + pyexpat_state *state = PyType_GetModuleState(cls); + // Note: Expat has no API to determine whether a parser is a root parser, + // and since the Expat functions for defining the various maximum allowed + // amplifcation factors fail when a bad parser or an out-of-range factor + // is given without specifying which check failed, we check whether the + // factor is out-of-range to improve the error message. See also gh-90949. + const char *message = (isnan(max_factor) || max_factor < 1.0f) + ? "'max_factor' must be at least 1.0" + : "parser must be a root parser"; + return set_invalid_arg(state, self, message); +} +#endif + +#if XML_COMBINED_VERSION >= 20702 +/*[clinic input] +pyexpat.xmlparser.SetAllocTrackerActivationThreshold + + cls: defining_class + threshold: unsigned_long_long + / + +Sets the number of allocated bytes of dynamic memory needed to activate protection against disproportionate use of RAM. + +By default, parser objects have an allocation activation threshold of 64 MiB. +[clinic start generated code]*/ + +static PyObject * +pyexpat_xmlparser_SetAllocTrackerActivationThreshold_impl(xmlparseobject *self, + PyTypeObject *cls, + unsigned long long threshold) +/*[clinic end generated code: output=bed7e93207ba08c5 input=9c706b75c18e4ea1]*/ +{ + return set_activation_threshold( + self, cls, threshold, + XML_SetAllocTrackerActivationThreshold + ); +} +#endif + +#if XML_COMBINED_VERSION >= 20702 +/*[clinic input] +pyexpat.xmlparser.SetAllocTrackerMaximumAmplification + + cls: defining_class + max_factor: float + / + +Sets the maximum amplification factor between direct input and bytes of dynamic memory allocated. + +The amplification factor is calculated as "allocated / direct" while parsing, +where "direct" is the number of bytes read from the primary document in parsing +and "allocated" is the number of bytes of dynamic memory allocated in the parser +hierarchy. + +The 'max_factor' value must be a non-NaN floating point value greater than +or equal to 1.0. Amplification factors greater than 100.0 can be observed +near the start of parsing even with benign files in practice. In particular, +the activation threshold should be carefully chosen to avoid false positives. + +By default, parser objects have a maximum amplification factor of 100.0. +[clinic start generated code]*/ + +static PyObject * +pyexpat_xmlparser_SetAllocTrackerMaximumAmplification_impl(xmlparseobject *self, + PyTypeObject *cls, + float max_factor) +/*[clinic end generated code: output=6e44bd48c9b112a0 input=918b9266b490a722]*/ +{ + return set_maximum_amplification( + self, cls, max_factor, + XML_SetAllocTrackerMaximumAmplification + ); +} +#endif + static struct PyMethodDef xmlparse_methods[] = { PYEXPAT_XMLPARSER_PARSE_METHODDEF PYEXPAT_XMLPARSER_PARSEFILE_METHODDEF @@ -1151,9 +1298,9 @@ static struct PyMethodDef xmlparse_methods[] = { PYEXPAT_XMLPARSER_GETINPUTCONTEXT_METHODDEF PYEXPAT_XMLPARSER_EXTERNALENTITYPARSERCREATE_METHODDEF PYEXPAT_XMLPARSER_SETPARAMENTITYPARSING_METHODDEF -#if XML_COMBINED_VERSION >= 19505 PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF -#endif + PYEXPAT_XMLPARSER_SETALLOCTRACKERACTIVATIONTHRESHOLD_METHODDEF + PYEXPAT_XMLPARSER_SETALLOCTRACKERMAXIMUMAMPLIFICATION_METHODDEF PYEXPAT_XMLPARSER_SETREPARSEDEFERRALENABLED_METHODDEF PYEXPAT_XMLPARSER_GETREPARSEDEFERRALENABLED_METHODDEF {NULL, NULL} /* sentinel */ @@ -2166,6 +2313,13 @@ pyexpat_exec(PyObject *mod) #else capi->SetReparseDeferralEnabled = NULL; #endif +#if XML_COMBINED_VERSION >= 20702 + capi->SetAllocTrackerActivationThreshold = XML_SetAllocTrackerActivationThreshold; + capi->SetAllocTrackerMaximumAmplification = XML_SetAllocTrackerMaximumAmplification; +#else + capi->SetAllocTrackerActivationThreshold = NULL; + capi->SetAllocTrackerMaximumAmplification = NULL; +#endif /* export using capsule */ PyObject *capi_object = PyCapsule_New(capi, PyExpat_CAPSULE_NAME, From 6ab4dfb5604475b63d32bb050120704ea45fd05b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 2 Nov 2025 14:57:26 +0100 Subject: [PATCH 1282/1674] [3.14] Docs: avoid informal formulation in `Doc/c-api/conversion.rst` (GH-140898) (#140912) Docs: avoid informal formulation in `Doc/c-api/conversion.rst` (GH-140898) (cherry picked from commit 173cc53d9fdc596d7a19102fa407c829f9c71516) Co-authored-by: RayXu <140802139+F18-Maverick@users.noreply.github.com> --- Doc/c-api/conversion.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index c92ef4c653a675..cc7a3d9d9561a3 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -41,7 +41,7 @@ The return value (*rv*) for these functions should be interpreted as follows: ``rv + 1`` bytes would have been needed to succeed. ``str[size-1]`` is ``'\0'`` in this case. -* When ``rv < 0``, "something bad happened." ``str[size-1]`` is ``'\0'`` in +* When ``rv < 0``, the output conversion failed and ``str[size-1]`` is ``'\0'`` in this case too, but the rest of *str* is undefined. The exact cause of the error depends on the underlying platform. From 7e1bac6a1aa6705c2386d80f093e575106de3340 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 2 Nov 2025 16:03:12 +0100 Subject: [PATCH 1283/1674] [3.14] gh-135307: Fix email error when policy max_line_length is set to 0 or None (GH-135367) (#140915) gh-135307: Fix email error when policy max_line_length is set to 0 or None (GH-135367) (cherry picked from commit 6d45cd8dbb07ae020ec07f2c3375dd06e52377f6) RDM: Like the change made in a earlier PR to the folder, we can/must use 'maxlen' as a stand in for 'unlimited' when computing line lengths when max_line_length is 0 or None; otherwise the computation results in a traceback. Co-authored-by: Jiucheng(Oliver) <git.jiucheng@gmail.com> --- Lib/email/contentmanager.py | 12 +++++---- Lib/test/test_email/test_message.py | 26 +++++++++++++++++++ ...-06-10-18-02-29.gh-issue-135307.fXGrcK.rst | 2 ++ 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst diff --git a/Lib/email/contentmanager.py b/Lib/email/contentmanager.py index b4f5830beada4a..11d1536db27d79 100644 --- a/Lib/email/contentmanager.py +++ b/Lib/email/contentmanager.py @@ -2,6 +2,7 @@ import email.charset import email.message import email.errors +import sys from email import quoprimime class ContentManager: @@ -142,13 +143,15 @@ def _encode_base64(data, max_line_length): def _encode_text(string, charset, cte, policy): + # If max_line_length is 0 or None, there is no limit. + maxlen = policy.max_line_length or sys.maxsize lines = string.encode(charset).splitlines() linesep = policy.linesep.encode('ascii') def embedded_body(lines): return linesep.join(lines) + linesep def normal_body(lines): return b'\n'.join(lines) + b'\n' if cte is None: # Use heuristics to decide on the "best" encoding. - if max((len(x) for x in lines), default=0) <= policy.max_line_length: + if max(map(len, lines), default=0) <= maxlen: try: return '7bit', normal_body(lines).decode('ascii') except UnicodeDecodeError: @@ -156,8 +159,7 @@ def normal_body(lines): return b'\n'.join(lines) + b'\n' if policy.cte_type == '8bit': return '8bit', normal_body(lines).decode('ascii', 'surrogateescape') sniff = embedded_body(lines[:10]) - sniff_qp = quoprimime.body_encode(sniff.decode('latin-1'), - policy.max_line_length) + sniff_qp = quoprimime.body_encode(sniff.decode('latin-1'), maxlen) sniff_base64 = binascii.b2a_base64(sniff) # This is a little unfair to qp; it includes lineseps, base64 doesn't. if len(sniff_qp) > len(sniff_base64): @@ -172,9 +174,9 @@ def normal_body(lines): return b'\n'.join(lines) + b'\n' data = normal_body(lines).decode('ascii', 'surrogateescape') elif cte == 'quoted-printable': data = quoprimime.body_encode(normal_body(lines).decode('latin-1'), - policy.max_line_length) + maxlen) elif cte == 'base64': - data = _encode_base64(embedded_body(lines), policy.max_line_length) + data = _encode_base64(embedded_body(lines), maxlen) else: raise ValueError("Unknown content transfer encoding {}".format(cte)) return cte, data diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index b4128f70f18412..56ad446694d1f8 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1004,6 +1004,32 @@ def test_folding_with_long_nospace_http_policy_1(self): parsed_msg = message_from_bytes(m.as_bytes(), policy=policy.default) self.assertEqual(parsed_msg['Message-ID'], m['Message-ID']) + def test_no_wrapping_max_line_length(self): + # Test that falsey 'max_line_length' are converted to sys.maxsize. + for n in [0, None]: + with self.subTest(max_line_length=n): + self.do_test_no_wrapping_max_line_length(n) + + def do_test_no_wrapping_max_line_length(self, falsey): + self.assertFalse(falsey) + pol = policy.default.clone(max_line_length=falsey) + subj = "S" * 100 + body = "B" * 100 + msg = EmailMessage(policy=pol) + msg["From"] = "a@ex.com" + msg["To"] = "b@ex.com" + msg["Subject"] = subj + msg.set_content(body) + + raw = msg.as_bytes() + self.assertNotIn(b"=\n", raw, + "Found fold indicator; wrapping not disabled") + + parsed = message_from_bytes(raw, policy=policy.default) + self.assertEqual(parsed["Subject"], subj) + parsed_body = parsed.get_body().get_content().rstrip('\n') + self.assertEqual(parsed_body, body) + def test_invalid_header_names(self): invalid_headers = [ ('Invalid Header', 'contains space'), diff --git a/Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst b/Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst new file mode 100644 index 00000000000000..47e1feb5cbff09 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst @@ -0,0 +1,2 @@ +:mod:`email`: Fix exception in ``set_content()`` when encoding text +and max_line_length is set to ``0`` or ``None`` (unlimited). From 23e3771045b412be19ce2d702eb7736d5df1f920 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Nov 2025 00:41:49 +0100 Subject: [PATCH 1284/1674] [3.14] gh-138425: Correctly partially evaluate global generics with undefined params in `ref.evaluate(format=Format.FORWARDREF)` (GH-138430) (#140927) gh-138425: Correctly partially evaluate global generics with undefined params in `ref.evaluate(format=Format.FORWARDREF)` (GH-138430) (cherry picked from commit e66f87ca73516efb4aec1f2f056d2a4efd73248a) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> Co-authored-by: sobolevn <mail@sobolevn.me> --- Lib/annotationlib.py | 5 +++- Lib/test/test_annotationlib.py | 26 +++++++++++++++++++ ...-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst | 2 ++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 81886a0467d001..16dbb128bc9293 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -187,8 +187,11 @@ def evaluate( except Exception: if not is_forwardref_format: raise + + # All variables, in scoping order, should be checked before + # triggering __missing__ to create a _Stringifier. new_locals = _StringifierDict( - {**builtins.__dict__, **locals}, + {**builtins.__dict__, **globals, **locals}, globals=globals, owner=owner, is_class=self.__forward_is_class__, diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 8da4ff096e7593..7b08f58bfb8ba2 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -1877,6 +1877,32 @@ def test_name_lookup_without_eval(self): self.assertEqual(exc.exception.name, "doesntexist") + def test_evaluate_undefined_generic(self): + # Test the codepath where have to eval() with undefined variables. + class C: + x: alias[int, undef] + + generic = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate( + format=Format.FORWARDREF, + globals={"alias": dict} + ) + self.assertNotIsInstance(generic, ForwardRef) + self.assertIs(generic.__origin__, dict) + self.assertEqual(len(generic.__args__), 2) + self.assertIs(generic.__args__[0], int) + self.assertIsInstance(generic.__args__[1], ForwardRef) + + generic = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate( + format=Format.FORWARDREF, + globals={"alias": Union}, + locals={"alias": dict} + ) + self.assertNotIsInstance(generic, ForwardRef) + self.assertIs(generic.__origin__, dict) + self.assertEqual(len(generic.__args__), 2) + self.assertIs(generic.__args__[0], int) + self.assertIsInstance(generic.__args__[1], ForwardRef) + def test_fwdref_invalid_syntax(self): fr = ForwardRef("if") with self.assertRaises(SyntaxError): diff --git a/Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst b/Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst new file mode 100644 index 00000000000000..328e5988cb0b51 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst @@ -0,0 +1,2 @@ +Fix partial evaluation of :class:`annotationlib.ForwardRef` objects which rely +on names defined as globals. From cdb6fe89ae3a4bfbffb91290dbf9db0c4af85cd5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Nov 2025 02:45:44 +0100 Subject: [PATCH 1285/1674] [3.14] gh-137969: Fix evaluation of `ref.evaluate(format=Format.FORWARDREF)` objects (GH-138075) (#140929) gh-137969: Fix evaluation of `ref.evaluate(format=Format.FORWARDREF)` objects (GH-138075) (cherry picked from commit 63e01d6bae9ddc9ff35aca2134945670eacef163) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> --- Lib/annotationlib.py | 14 ++++++++------ Lib/test/test_annotationlib.py | 9 +++++++++ .../2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst | 2 ++ 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 16dbb128bc9293..26e7c200248d36 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -159,12 +159,12 @@ def evaluate( type_params = getattr(owner, "__type_params__", None) # Type parameters exist in their own scope, which is logically - # between the locals and the globals. We simulate this by adding - # them to the globals. + # between the locals and the globals. + type_param_scope = {} if type_params is not None: - globals = dict(globals) for param in type_params: - globals[param.__name__] = param + type_param_scope[param.__name__] = param + if self.__extra_names__: locals = {**locals, **self.__extra_names__} @@ -172,6 +172,8 @@ def evaluate( if arg.isidentifier() and not keyword.iskeyword(arg): if arg in locals: return locals[arg] + elif arg in type_param_scope: + return type_param_scope[arg] elif arg in globals: return globals[arg] elif hasattr(builtins, arg): @@ -183,7 +185,7 @@ def evaluate( else: code = self.__forward_code__ try: - return eval(code, globals=globals, locals=locals) + return eval(code, globals=globals, locals={**type_param_scope, **locals}) except Exception: if not is_forwardref_format: raise @@ -191,7 +193,7 @@ def evaluate( # All variables, in scoping order, should be checked before # triggering __missing__ to create a _Stringifier. new_locals = _StringifierDict( - {**builtins.__dict__, **globals, **locals}, + {**builtins.__dict__, **globals, **type_param_scope, **locals}, globals=globals, owner=owner, is_class=self.__forward_is_class__, diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 7b08f58bfb8ba2..08f7161a2736e1 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -1911,6 +1911,15 @@ def test_fwdref_invalid_syntax(self): with self.assertRaises(SyntaxError): fr.evaluate() + def test_re_evaluate_generics(self): + global alias + class C: + x: alias[int] + + evaluated = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate(format=Format.FORWARDREF) + alias = list + self.assertEqual(evaluated.evaluate(), list[int]) + class TestAnnotationLib(unittest.TestCase): def test__all__(self): diff --git a/Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst b/Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst new file mode 100644 index 00000000000000..59f9e6e3d331ec --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst @@ -0,0 +1,2 @@ +Fix :meth:`annotationlib.ForwardRef.evaluate` returning :class:`annotationlib.ForwardRef` +objects which do not update in new contexts. From fa9bb9a09273c7fba8023b24069f570797de01b4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Nov 2025 06:08:47 +0100 Subject: [PATCH 1286/1674] [3.14] gh-140693: Improve `argparse` documentation about controlling color (GH-140737) (#140932) gh-140693: Improve `argparse` documentation about controlling color (GH-140737) (cherry picked from commit 31de83d5e2e17f4e9a37e08b384bab916e1da7c1) Co-authored-by: Krishna Chaitanya <141550576+XChaitanyaX@users.noreply.github.com> --- Doc/library/argparse.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index a7603ac272633d..0ee921e15260c4 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -639,6 +639,11 @@ by setting ``color`` to ``False``:: ... help='an integer for the accumulator') >>> parser.parse_args(['--help']) +Note that when ``color=True``, colored output depends on both environment +variables and terminal capabilities. However, if ``color=False``, colored +output is always disabled, even if environment variables like ``FORCE_COLOR`` +are set. + .. versionadded:: 3.14 From 1b376b82ac98517a55f13b5ec8645dc667762912 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra <jelle.zijlstra@gmail.com> Date: Mon, 3 Nov 2025 06:07:22 -0800 Subject: [PATCH 1287/1674] [3.14] Revert "gh-137969: Fix evaluation of `ref.evaluate(format=Format.FORWARDREF)` objects (GH-138075) (#140929)" (GH-140931) Revert "[3.14] gh-137969: Fix evaluation of `ref.evaluate(format=Format.FORWARDREF)` objects (GH-138075) (#140929)" This reverts commit cdb6fe89ae3a4bfbffb91290dbf9db0c4af85cd5. --- Lib/annotationlib.py | 14 ++++++-------- Lib/test/test_annotationlib.py | 9 --------- .../2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst | 2 -- 3 files changed, 6 insertions(+), 19 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 26e7c200248d36..16dbb128bc9293 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -159,12 +159,12 @@ def evaluate( type_params = getattr(owner, "__type_params__", None) # Type parameters exist in their own scope, which is logically - # between the locals and the globals. - type_param_scope = {} + # between the locals and the globals. We simulate this by adding + # them to the globals. if type_params is not None: + globals = dict(globals) for param in type_params: - type_param_scope[param.__name__] = param - + globals[param.__name__] = param if self.__extra_names__: locals = {**locals, **self.__extra_names__} @@ -172,8 +172,6 @@ def evaluate( if arg.isidentifier() and not keyword.iskeyword(arg): if arg in locals: return locals[arg] - elif arg in type_param_scope: - return type_param_scope[arg] elif arg in globals: return globals[arg] elif hasattr(builtins, arg): @@ -185,7 +183,7 @@ def evaluate( else: code = self.__forward_code__ try: - return eval(code, globals=globals, locals={**type_param_scope, **locals}) + return eval(code, globals=globals, locals=locals) except Exception: if not is_forwardref_format: raise @@ -193,7 +191,7 @@ def evaluate( # All variables, in scoping order, should be checked before # triggering __missing__ to create a _Stringifier. new_locals = _StringifierDict( - {**builtins.__dict__, **globals, **type_param_scope, **locals}, + {**builtins.__dict__, **globals, **locals}, globals=globals, owner=owner, is_class=self.__forward_is_class__, diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 08f7161a2736e1..7b08f58bfb8ba2 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -1911,15 +1911,6 @@ def test_fwdref_invalid_syntax(self): with self.assertRaises(SyntaxError): fr.evaluate() - def test_re_evaluate_generics(self): - global alias - class C: - x: alias[int] - - evaluated = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate(format=Format.FORWARDREF) - alias = list - self.assertEqual(evaluated.evaluate(), list[int]) - class TestAnnotationLib(unittest.TestCase): def test__all__(self): diff --git a/Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst b/Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst deleted file mode 100644 index 59f9e6e3d331ec..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-22-23-50-38.gh-issue-137969.Fkvis3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`annotationlib.ForwardRef.evaluate` returning :class:`annotationlib.ForwardRef` -objects which do not update in new contexts. From 788104633c8cb8a4d79f79987cf5e6f8aff1e800 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Nov 2025 16:16:03 +0100 Subject: [PATCH 1288/1674] [3.14] gh-140348: Fix using | on unusual objects plus Unions (GH-140383) (#140948) gh-140348: Fix using | on unusual objects plus Unions (GH-140383) (cherry picked from commit 7a9437d98641e3c3749ab2fd9fb54eac7614f9af) Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> --- Lib/test/test_typing.py | 9 +++++++++ ...25-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst | 3 +++ Objects/unionobject.c | 17 ++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 4b8280b647f647..b660368144b1cd 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -2277,6 +2277,15 @@ class Ints(enum.IntEnum): self.assertEqual(Union[Literal[1], Literal[Ints.B], Literal[True]].__args__, (Literal[1], Literal[Ints.B], Literal[True])) + def test_allow_non_types_in_or(self): + # gh-140348: Test that using | with a Union object allows things that are + # not allowed by is_unionable(). + U1 = Union[int, str] + self.assertEqual(U1 | float, Union[int, str, float]) + self.assertEqual(U1 | "float", Union[int, str, "float"]) + self.assertEqual(float | U1, Union[float, int, str]) + self.assertEqual("float" | U1, Union["float", int, str]) + class TupleTests(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst b/Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst new file mode 100644 index 00000000000000..16d5b2a8bf03d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst @@ -0,0 +1,3 @@ +Fix regression in Python 3.14.0 where using the ``|`` operator on a +:class:`typing.Union` object combined with an object that is not a type +would raise an error. diff --git a/Objects/unionobject.c b/Objects/unionobject.c index c4ece0fe09f018..a47d6193d70889 100644 --- a/Objects/unionobject.c +++ b/Objects/unionobject.c @@ -393,8 +393,23 @@ static PyGetSetDef union_properties[] = { {0} }; +static PyObject * +union_nb_or(PyObject *a, PyObject *b) +{ + unionbuilder ub; + if (!unionbuilder_init(&ub, true)) { + return NULL; + } + if (!unionbuilder_add_single(&ub, a) || + !unionbuilder_add_single(&ub, b)) { + unionbuilder_finalize(&ub); + return NULL; + } + return make_union(&ub); +} + static PyNumberMethods union_as_number = { - .nb_or = _Py_union_type_or, // Add __or__ function + .nb_or = union_nb_or, // Add __or__ function }; static const char* const cls_attrs[] = { From 08012a93a8f3fef1ad29f9aab048cac81dce0234 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Nov 2025 16:52:01 +0100 Subject: [PATCH 1289/1674] [3.14] gh-138151: Fix annotationlib handling of multiple nonlocals (GH-138164) (#140949) gh-138151: Fix annotationlib handling of multiple nonlocals (GH-138164) (cherry picked from commit b1027d4762435b97546c122dd94290d707b3ff39) Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> --- Lib/annotationlib.py | 40 +++++++++++++------ Lib/test/test_annotationlib.py | 15 +++++++ ...-08-26-08-17-56.gh-issue-138151.I6CdAk.rst | 3 ++ 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 16dbb128bc9293..2166dbff0ee70c 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -85,6 +85,9 @@ def __init__( # These are always set to None here but may be non-None if a ForwardRef # is created through __class__ assignment on a _Stringifier object. self.__globals__ = None + # This may be either a cell object (for a ForwardRef referring to a single name) + # or a dict mapping cell names to cell objects (for a ForwardRef containing references + # to multiple names). self.__cell__ = None self.__extra_names__ = None # These are initially None but serve as a cache and may be set to a non-None @@ -117,7 +120,7 @@ def evaluate( is_forwardref_format = True case _: raise NotImplementedError(format) - if self.__cell__ is not None: + if isinstance(self.__cell__, types.CellType): try: return self.__cell__.cell_contents except ValueError: @@ -160,11 +163,18 @@ def evaluate( # Type parameters exist in their own scope, which is logically # between the locals and the globals. We simulate this by adding - # them to the globals. - if type_params is not None: + # them to the globals. Similar reasoning applies to nonlocals stored in cells. + if type_params is not None or isinstance(self.__cell__, dict): globals = dict(globals) + if type_params is not None: for param in type_params: globals[param.__name__] = param + if isinstance(self.__cell__, dict): + for cell_name, cell_value in self.__cell__.items(): + try: + globals[cell_name] = cell_value.cell_contents + except ValueError: + pass if self.__extra_names__: locals = {**locals, **self.__extra_names__} @@ -202,7 +212,7 @@ def evaluate( except Exception: return self else: - new_locals.transmogrify() + new_locals.transmogrify(self.__cell__) return result def _evaluate(self, globalns, localns, type_params=_sentinel, *, recursive_guard): @@ -274,7 +284,7 @@ def __hash__(self): self.__forward_module__, id(self.__globals__), # dictionaries are not hashable, so hash by identity self.__forward_is_class__, - self.__cell__, + tuple(sorted(self.__cell__.items())) if isinstance(self.__cell__, dict) else self.__cell__, self.__owner__, tuple(sorted(self.__extra_names__.items())) if self.__extra_names__ else None, )) @@ -642,13 +652,15 @@ def __missing__(self, key): self.stringifiers.append(fwdref) return fwdref - def transmogrify(self): + def transmogrify(self, cell_dict): for obj in self.stringifiers: obj.__class__ = ForwardRef obj.__stringifier_dict__ = None # not needed for ForwardRef if isinstance(obj.__ast_node__, str): obj.__arg__ = obj.__ast_node__ obj.__ast_node__ = None + if cell_dict is not None and obj.__cell__ is None: + obj.__cell__ = cell_dict def create_unique_name(self): name = f"__annotationlib_name_{self.next_id}__" @@ -712,7 +724,7 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): globals = _StringifierDict({}, format=format) is_class = isinstance(owner, type) - closure = _build_closure( + closure, _ = _build_closure( annotate, owner, is_class, globals, allow_evaluation=False ) func = types.FunctionType( @@ -756,7 +768,7 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): is_class=is_class, format=format, ) - closure = _build_closure( + closure, cell_dict = _build_closure( annotate, owner, is_class, globals, allow_evaluation=True ) func = types.FunctionType( @@ -774,7 +786,7 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): except Exception: pass else: - globals.transmogrify() + globals.transmogrify(cell_dict) return result # Try again, but do not provide any globals. This allows us to return @@ -786,7 +798,7 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): is_class=is_class, format=format, ) - closure = _build_closure( + closure, cell_dict = _build_closure( annotate, owner, is_class, globals, allow_evaluation=False ) func = types.FunctionType( @@ -797,7 +809,7 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): kwdefaults=annotate.__kwdefaults__, ) result = func(Format.VALUE_WITH_FAKE_GLOBALS) - globals.transmogrify() + globals.transmogrify(cell_dict) if _is_evaluate: if isinstance(result, ForwardRef): return result.evaluate(format=Format.FORWARDREF) @@ -822,14 +834,16 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): def _build_closure(annotate, owner, is_class, stringifier_dict, *, allow_evaluation): if not annotate.__closure__: - return None + return None, None freevars = annotate.__code__.co_freevars new_closure = [] + cell_dict = {} for i, cell in enumerate(annotate.__closure__): if i < len(freevars): name = freevars[i] else: name = "__cell__" + cell_dict[name] = cell new_cell = None if allow_evaluation: try: @@ -850,7 +864,7 @@ def _build_closure(annotate, owner, is_class, stringifier_dict, *, allow_evaluat stringifier_dict.stringifiers.append(fwdref) new_cell = types.CellType(fwdref) new_closure.append(new_cell) - return tuple(new_closure) + return tuple(new_closure), cell_dict def _stringify_single(anno): diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 7b08f58bfb8ba2..fd5d43b09b9702 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -1194,6 +1194,21 @@ class RaisesAttributeError: }, ) + def test_nonlocal_in_annotation_scope(self): + class Demo: + nonlocal sequence_b + x: sequence_b + y: sequence_b[int] + + fwdrefs = get_annotations(Demo, format=Format.FORWARDREF) + + self.assertIsInstance(fwdrefs["x"], ForwardRef) + self.assertIsInstance(fwdrefs["y"], ForwardRef) + + sequence_b = list + self.assertIs(fwdrefs["x"].evaluate(), list) + self.assertEqual(fwdrefs["y"].evaluate(), list[int]) + def test_raises_error_from_value(self): # test that if VALUE is the only supported format, but raises an error # that error is propagated from get_annotations diff --git a/Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst b/Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst new file mode 100644 index 00000000000000..de29f536afc95e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst @@ -0,0 +1,3 @@ +In :mod:`annotationlib`, improve evaluation of forward references to +nonlocal variables that are not yet defined when the annotations are +initially evaluated. From 894b5287ea6f97ee5dd232a979fa200288538e6f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:51:32 +0100 Subject: [PATCH 1290/1674] [3.14] gh-133600: Run `Tools/wasm/wasi` on CI instead of deprecated `Tools/wasm/wasi.py` (GH-140907) (#140964) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/reusable-wasi.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-wasi.yml b/.github/workflows/reusable-wasi.yml index 4ad8add0bebc9e..84224ae722942c 100644 --- a/.github/workflows/reusable-wasi.yml +++ b/.github/workflows/reusable-wasi.yml @@ -60,9 +60,9 @@ jobs: 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. + # Include the hash of `Tools/wasm/wasi/__main__.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 }}-${{ env.IMAGE_OS_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi.py') }}-${{ env.pythonLocation }} + key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi/__main__.py') }}-${{ env.pythonLocation }} - name: "Configure build Python" run: python3 Tools/wasm/wasi configure-build-python -- --config-cache --with-pydebug - name: "Make build Python" @@ -72,7 +72,7 @@ jobs: with: path: ${{ env.CROSS_BUILD_WASI }}/config.cache # Should be kept in sync with the other config.cache step above. - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi.py') }}-${{ env.pythonLocation }} + key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi/__main__.py') }}-${{ env.pythonLocation }} - name: "Configure host" # `--with-pydebug` inferred from configure-build-python run: python3 Tools/wasm/wasi configure-host -- --config-cache From 09c890ec8cef7f5b2b03c1efff127db08969ad87 Mon Sep 17 00:00:00 2001 From: Ken Jin <kenjin@python.org> Date: Tue, 4 Nov 2025 03:53:10 +0800 Subject: [PATCH 1291/1674] [3.14] gh-140889: Test tailcall and JIT in CI (GH-140891) (GH-140962) --- .github/workflows/jit.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/jit.yml b/.github/workflows/jit.yml index c7baad7d68138e..122a07d4bae29a 100644 --- a/.github/workflows/jit.yml +++ b/.github/workflows/jit.yml @@ -152,3 +152,26 @@ jobs: # - name: Run tests # run: | # ./python -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + tail-call-jit: + name: JIT with tail calling interpreter + needs: interpreter + runs-on: ubuntu-24.04 + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + llvm: + - 19 + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Build with JIT and tailcall + run: | + sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ./llvm.sh ${{ matrix.llvm }} + export PATH="$(llvm-config-${{ matrix.llvm }} --bindir):$PATH" + CC=clang-${{ matrix.llvm }} ./configure --enable-experimental-jit --with-tail-call-interp --with-pydebug + make all --jobs 4 From 25a2a6037188a477bd967722b3b807150dcc4d95 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 4 Nov 2025 09:46:08 +0200 Subject: [PATCH 1292/1674] [3.14] Fix minor typos and wording in C API docs (GH-140955) (#140966) Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/c-api/cell.rst | 2 +- Doc/c-api/datetime.rst | 2 +- Doc/c-api/descriptor.rst | 2 +- Doc/c-api/init_config.rst | 2 +- Doc/c-api/mapping.rst | 4 ++-- Doc/c-api/marshal.rst | 2 +- Doc/c-api/memory.rst | 2 +- Doc/c-api/module.rst | 2 +- Doc/c-api/monitoring.rst | 2 +- Doc/c-api/object.rst | 2 +- Doc/c-api/tuple.rst | 2 +- Doc/c-api/veryhigh.rst | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Doc/c-api/cell.rst b/Doc/c-api/cell.rst index 61eb994c370946..2501ed9580df89 100644 --- a/Doc/c-api/cell.rst +++ b/Doc/c-api/cell.rst @@ -7,7 +7,7 @@ Cell Objects "Cell" objects are used to implement variables referenced by multiple scopes. For each such variable, a cell object is created to store the value; the local -variables of each stack frame that references the value contains a reference to +variables of each stack frame that references the value contain a reference to the cells from outer scopes which also use that variable. When the value is accessed, the value contained in the cell is used instead of the cell object itself. This de-referencing of the cell object requires support from the diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index d2d4d5309c7098..f311aad5f15499 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -46,7 +46,7 @@ macros. .. c:var:: PyTypeObject PyDateTime_DeltaType - This instance of :c:type:`PyTypeObject` represents Python type for + This instance of :c:type:`PyTypeObject` represents the Python type for the difference between two datetime values; it is the same object as :class:`datetime.timedelta` in the Python layer. diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index b32c113e5f0457..ff0df575279d96 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -32,7 +32,7 @@ found in the dictionary of type objects. .. c:function:: int PyDescr_IsData(PyObject *descr) - Return non-zero if the descriptor objects *descr* describes a data attribute, or + Return non-zero if the descriptor object *descr* describes a data attribute, or ``0`` if it describes a method. *descr* must be a descriptor object; there is no error checking. diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index e1931655618b1c..424d7de7089152 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -102,7 +102,7 @@ Error Handling * Set *\*err_msg* and return ``1`` if an error is set. * Set *\*err_msg* to ``NULL`` and return ``0`` otherwise. - An error message is an UTF-8 encoded string. + An error message is a UTF-8 encoded string. If *config* has an exit code, format the exit code as an error message. diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 1f55c0aa955c75..2476ebb9b69dce 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -102,7 +102,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and .. note:: - Exceptions which occur when this calls :meth:`~object.__getitem__` + Exceptions which occur when this calls the :meth:`~object.__getitem__` method are silently ignored. For proper error handling, use :c:func:`PyMapping_HasKeyWithError`, :c:func:`PyMapping_GetOptionalItem` or :c:func:`PyObject_GetItem()` instead. @@ -116,7 +116,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and .. note:: - Exceptions that occur when this calls :meth:`~object.__getitem__` + Exceptions that occur when this calls the :meth:`~object.__getitem__` method or while creating the temporary :class:`str` object are silently ignored. For proper error handling, use :c:func:`PyMapping_HasKeyStringWithError`, diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index 61218a1bf6f171..668a163b2df5a1 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -82,7 +82,7 @@ The following functions allow marshalled values to be read back in. assumes that no further objects will be read from the file, allowing it to aggressively load file data into memory so that the de-serialization can operate from data in memory rather than reading a byte at a time from the - file. Only use these variant if you are certain that you won't be reading + file. Only use this variant if you are certain that you won't be reading anything else from the file. On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError` diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index df1bb0ce370919..2395898010214d 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -102,7 +102,7 @@ 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 <default-memory-allocators>`. +table can be found at :ref:`default-memory-allocators`. 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`. diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index 1089bc34369fae..976fa4a2fa0da8 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -103,7 +103,7 @@ Module Objects created, or ``NULL`` if the module wasn't created from a definition. On error, return ``NULL`` with an exception set. - Use :c:func:`PyErr_Occurred` to tell this case apart from a mising + Use :c:func:`PyErr_Occurred` to tell this case apart from a missing :c:type:`!PyModuleDef`. diff --git a/Doc/c-api/monitoring.rst b/Doc/c-api/monitoring.rst index 7926148302af0b..b0227c2f4faf15 100644 --- a/Doc/c-api/monitoring.rst +++ b/Doc/c-api/monitoring.rst @@ -136,7 +136,7 @@ Managing the Monitoring State ----------------------------- Monitoring states can be managed with the help of monitoring scopes. A scope -would typically correspond to a python function. +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) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 1e39505588f6fd..e215027330fb43 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -73,7 +73,7 @@ Object Protocol 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 + If passed, these functions use the :func:`str` of the object instead of the :func:`repr`. diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index 815afddad19df1..be960243f76366 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -48,7 +48,7 @@ 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. + On error, return ``-1`` with an exception set. .. c:function:: Py_ssize_t PyTuple_GET_SIZE(PyObject *p) diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index ee0595a9e089c9..0b2b55b6387bd1 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -140,7 +140,7 @@ the same library that the Python runtime is using. interpreter prompt is about to become idle and wait for user input from the terminal. The return value is ignored. Overriding this hook can be used to integrate the interpreter's prompt with other - event loops, as done in the :file:`Modules/_tkinter.c` in the + event loops, as done in :file:`Modules/_tkinter.c` in the Python source code. .. versionchanged:: 3.12 From a9c964f3686adaee27c23eaadd79cfd8ffb287f5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 09:02:10 +0100 Subject: [PATCH 1293/1674] [3.14] Docs: Fix a typo in `idle.rst` (Chitespace -> Whitespace) (GH-140946) (#140953) Co-authored-by: Yongzi Li <204532581+Yzi-Li@users.noreply.github.com> --- Doc/library/idle.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index fabea611e0ebcd..e547c96b580bfd 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -204,7 +204,7 @@ New Indent Width Open a dialog to change indent width. The accepted default by the Python community is 4 spaces. -Strip Trailing Chitespace +Strip Trailing Whitespace Remove trailing space and other whitespace characters after the last non-whitespace character of a line by applying str.rstrip to each line, including lines within multiline strings. Except for Shell windows, From 331b4b868c1056370f150a6426bea9e1e5c52aff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:18:23 +0100 Subject: [PATCH 1294/1674] [3.14] gh-140815: Fix faulthandler for invalid/freed frame (GH-140921) (#140981) gh-140815: Fix faulthandler for invalid/freed frame (GH-140921) faulthandler now detects if a frame or a code object is invalid or freed. Add helper functions: * _PyCode_SafeAddr2Line() * _PyFrame_SafeGetCode() * _PyFrame_SafeGetLasti() _PyMem_IsPtrFreed() now detects pointers in [-0xff, 0xff] range as freed. (cherry picked from commit a84181c31bfc45a1d6bcb1296bd298ad612c54d0) Co-authored-by: Victor Stinner <vstinner@python.org> --- Include/internal/pycore_code.h | 9 ++- Include/internal/pycore_interpframe.h | 55 +++++++++++++++++ Include/internal/pycore_pymem.h | 10 ++-- ...-11-02-19-23-32.gh-issue-140815.McEG-T.rst | 2 + Objects/codeobject.c | 23 ++++++- Python/traceback.c | 60 ++++++++++++------- 6 files changed, 127 insertions(+), 32 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 43286774eb2c71..dc0ea9c669b731 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -274,8 +274,13 @@ extern void _PyLineTable_InitAddressRange( /** API for traversing the line number table. */ extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range); extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); -// This is used in dump_frame() in traceback.c without an attached tstate. -extern int _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addr); + +// Similar to PyCode_Addr2Line(), but return -1 if the code object is invalid +// and can be called without an attached tstate. Used by dump_frame() in +// Python/traceback.c. The function uses heuristics to detect freed memory, +// it's not 100% reliable. +extern int _PyCode_SafeAddr2Line(PyCodeObject *co, int addr); + /** API for executors */ extern void _PyCode_Clear_Executors(PyCodeObject *code); diff --git a/Include/internal/pycore_interpframe.h b/Include/internal/pycore_interpframe.h index d3fd218b27eed7..19914e8cef7ed2 100644 --- a/Include/internal/pycore_interpframe.h +++ b/Include/internal/pycore_interpframe.h @@ -24,6 +24,36 @@ static inline PyCodeObject *_PyFrame_GetCode(_PyInterpreterFrame *f) { return (PyCodeObject *)executable; } +// Similar to _PyFrame_GetCode(), but return NULL if the frame is invalid or +// freed. Used by dump_frame() in Python/traceback.c. The function uses +// heuristics to detect freed memory, it's not 100% reliable. +static inline PyCodeObject* +_PyFrame_SafeGetCode(_PyInterpreterFrame *f) +{ + // globals and builtins may be NULL on a legit frame, but it's unlikely. + // It's more likely that it's a sign of an invalid frame. + if (f->f_globals == NULL || f->f_builtins == NULL) { + return NULL; + } + + if (PyStackRef_IsNull(f->f_executable)) { + return NULL; + } + void *ptr; + memcpy(&ptr, &f->f_executable, sizeof(f->f_executable)); + if (_PyMem_IsPtrFreed(ptr)) { + return NULL; + } + PyObject *executable = PyStackRef_AsPyObjectBorrow(f->f_executable); + if (_PyObject_IsFreed(executable)) { + return NULL; + } + if (!PyCode_Check(executable)) { + return NULL; + } + return (PyCodeObject *)executable; +} + static inline _Py_CODEUNIT * _PyFrame_GetBytecode(_PyInterpreterFrame *f) { @@ -37,6 +67,31 @@ _PyFrame_GetBytecode(_PyInterpreterFrame *f) #endif } +// Similar to PyUnstable_InterpreterFrame_GetLasti(), but return NULL if the +// frame is invalid or freed. Used by dump_frame() in Python/traceback.c. The +// function uses heuristics to detect freed memory, it's not 100% reliable. +static inline int +_PyFrame_SafeGetLasti(struct _PyInterpreterFrame *f) +{ + // Code based on _PyFrame_GetBytecode() but replace _PyFrame_GetCode() + // with _PyFrame_SafeGetCode(). + PyCodeObject *co = _PyFrame_SafeGetCode(f); + if (co == NULL) { + return -1; + } + + _Py_CODEUNIT *bytecode; +#ifdef Py_GIL_DISABLED + _PyCodeArray *tlbc = _PyCode_GetTLBCArray(co); + assert(f->tlbc_index >= 0 && f->tlbc_index < tlbc->size); + bytecode = (_Py_CODEUNIT *)tlbc->entries[f->tlbc_index]; +#else + bytecode = _PyCode_CODE(co); +#endif + + return (int)(f->instr_ptr - bytecode) * sizeof(_Py_CODEUNIT); +} + static inline PyFunctionObject *_PyFrame_GetFunction(_PyInterpreterFrame *f) { PyObject *func = PyStackRef_AsPyObjectBorrow(f->f_funcobj); assert(PyFunction_Check(func)); diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 3e12084b82ab26..e27cff03daa8f9 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -54,15 +54,17 @@ static inline int _PyMem_IsPtrFreed(const void *ptr) { uintptr_t value = (uintptr_t)ptr; #if SIZEOF_VOID_P == 8 - return (value == 0 + return (value <= 0xff // NULL, 0x1, 0x2, ..., 0xff || value == (uintptr_t)0xCDCDCDCDCDCDCDCD || value == (uintptr_t)0xDDDDDDDDDDDDDDDD - || value == (uintptr_t)0xFDFDFDFDFDFDFDFD); + || value == (uintptr_t)0xFDFDFDFDFDFDFDFD + || value >= (uintptr_t)0xFFFFFFFFFFFFFF00); // -0xff, ..., -2, -1 #elif SIZEOF_VOID_P == 4 - return (value == 0 + return (value <= 0xff || value == (uintptr_t)0xCDCDCDCD || value == (uintptr_t)0xDDDDDDDD - || value == (uintptr_t)0xFDFDFDFD); + || value == (uintptr_t)0xFDFDFDFD + || value >= (uintptr_t)0xFFFFFF00); #else # error "unknown pointer size" #endif diff --git a/Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst b/Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst new file mode 100644 index 00000000000000..18c4d3836efef1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst @@ -0,0 +1,2 @@ +:mod:`faulthandler` now detects if a frame or a code object is invalid or +freed. Patch by Victor Stinner. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 1dbbb053e3fc48..287558302aa68f 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1013,8 +1013,8 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) * source location tracking (co_lines/co_positions) ******************/ -int -_PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq) +static int +_PyCode_Addr2Line(PyCodeObject *co, int addrq) { if (addrq < 0) { return co->co_firstlineno; @@ -1028,12 +1028,29 @@ _PyCode_Addr2LineNoTstate(PyCodeObject *co, int addrq) return _PyCode_CheckLineNumber(addrq, &bounds); } +int +_PyCode_SafeAddr2Line(PyCodeObject *co, int addrq) +{ + if (addrq < 0) { + return co->co_firstlineno; + } + if (co->_co_monitoring && co->_co_monitoring->lines) { + return _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); + } + if (!(addrq >= 0 && addrq < _PyCode_NBYTES(co))) { + return -1; + } + PyCodeAddressRange bounds; + _PyCode_InitAddressRange(co, &bounds); + return _PyCode_CheckLineNumber(addrq, &bounds); +} + int PyCode_Addr2Line(PyCodeObject *co, int addrq) { int lineno; Py_BEGIN_CRITICAL_SECTION(co); - lineno = _PyCode_Addr2LineNoTstate(co, addrq); + lineno = _PyCode_Addr2Line(co, addrq); Py_END_CRITICAL_SECTION(); return lineno; } diff --git a/Python/traceback.c b/Python/traceback.c index 11e52936f309ca..5efa70fb676882 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -976,14 +976,24 @@ _Py_DumpASCII(int fd, PyObject *text) /* Write a frame into the file fd: "File "xxx", line xxx in xxx". - This function is signal safe. */ + This function is signal safe. -static void + Return 0 on success. Return -1 if the frame is invalid. */ + +static int dump_frame(int fd, _PyInterpreterFrame *frame) { - assert(frame->owner < FRAME_OWNED_BY_INTERPRETER); + if (frame->owner == FRAME_OWNED_BY_INTERPRETER) { + /* Ignore trampoline frame */ + return 0; + } - PyCodeObject *code =_PyFrame_GetCode(frame); + PyCodeObject *code = _PyFrame_SafeGetCode(frame); + if (code == NULL) { + return -1; + } + + int res = 0; PUTS(fd, " File "); if (code->co_filename != NULL && PyUnicode_Check(code->co_filename)) @@ -991,29 +1001,36 @@ dump_frame(int fd, _PyInterpreterFrame *frame) PUTS(fd, "\""); _Py_DumpASCII(fd, code->co_filename); PUTS(fd, "\""); - } else { + } + else { PUTS(fd, "???"); + res = -1; } - int lasti = PyUnstable_InterpreterFrame_GetLasti(frame); - int lineno = _PyCode_Addr2LineNoTstate(code, lasti); + PUTS(fd, ", line "); + int lasti = _PyFrame_SafeGetLasti(frame); + int lineno = -1; + if (lasti >= 0) { + lineno = _PyCode_SafeAddr2Line(code, lasti); + } if (lineno >= 0) { _Py_DumpDecimal(fd, (size_t)lineno); } else { PUTS(fd, "???"); + res = -1; } - PUTS(fd, " in "); - if (code->co_name != NULL - && PyUnicode_Check(code->co_name)) { + PUTS(fd, " in "); + if (code->co_name != NULL && PyUnicode_Check(code->co_name)) { _Py_DumpASCII(fd, code->co_name); } else { PUTS(fd, "???"); + res = -1; } - PUTS(fd, "\n"); + return res; } static int @@ -1056,17 +1073,6 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) unsigned int depth = 0; while (1) { - if (frame->owner == FRAME_OWNED_BY_INTERPRETER) { - /* Trampoline frame */ - frame = frame->previous; - if (frame == NULL) { - break; - } - - /* Can't have more than one shim frame in a row */ - assert(frame->owner != FRAME_OWNED_BY_INTERPRETER); - } - if (MAX_FRAME_DEPTH <= depth) { if (MAX_FRAME_DEPTH < depth) { PUTS(fd, "plus "); @@ -1076,7 +1082,15 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) break; } - dump_frame(fd, frame); + if (_PyMem_IsPtrFreed(frame)) { + PUTS(fd, " <freed frame>\n"); + break; + } + if (dump_frame(fd, frame) < 0) { + PUTS(fd, " <invalid frame>\n"); + break; + } + frame = frame->previous; if (frame == NULL) { break; From e5266fcac83667e74793cdc2cafe1e96422c1cea Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:21:33 +0100 Subject: [PATCH 1295/1674] [3.14] gh-140797: Forbid capturing groups in re.Scanner lexicon patterns (GH-140944) (GH-140982) (cherry picked from commit fa9c3eefd475f0647a69bf3f49db8100848fb6a9) Co-authored-by: Abhishek Tiwari <Abhi210@users.noreply.github.com> --- Lib/re/__init__.py | 5 ++++- Lib/test/test_re.py | 18 ++++++++++++++++++ ...5-11-03-16-23-54.gh-issue-140797.DuFEeR.rst | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst diff --git a/Lib/re/__init__.py b/Lib/re/__init__.py index af2808a77da691..e0d6c844b4fa7c 100644 --- a/Lib/re/__init__.py +++ b/Lib/re/__init__.py @@ -399,9 +399,12 @@ def __init__(self, lexicon, flags=0): s = _parser.State() s.flags = flags for phrase, action in lexicon: + sub_pattern = _parser.parse(phrase, flags) + if sub_pattern.state.groups != 1: + raise ValueError("Cannot use capturing groups in re.Scanner") gid = s.opengroup() p.append(_parser.SubPattern(s, [ - (SUBPATTERN, (gid, 0, 0, _parser.parse(phrase, flags))), + (SUBPATTERN, (gid, 0, 0, sub_pattern)), ])) s.closegroup(gid, p[-1]) p = _parser.SubPattern(s, [(BRANCH, (None, p))]) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index f6e797b3785dbe..b7ed86849cb193 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1639,6 +1639,24 @@ def s_int(scanner, token): return int(token) (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5, 'op+', 'bar'], '')) + def test_bug_gh140797(self): + # gh140797: Capturing groups are not allowed in re.Scanner + + msg = r"Cannot use capturing groups in re\.Scanner" + # Capturing group throws an error + with self.assertRaisesRegex(ValueError, msg): + Scanner([("(a)b", None)]) + + # Named Group + with self.assertRaisesRegex(ValueError, msg): + Scanner([("(?P<name>a)", None)]) + + # Non-capturing groups should pass normally + s = Scanner([("(?:a)b", lambda scanner, token: token)]) + result, rem = s.scan("ab") + self.assertEqual(result,['ab']) + self.assertEqual(rem,'') + def test_bug_448951(self): # bug 448951 (similar to 429357, but with single char match) # (Also test greedy matches.) diff --git a/Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst b/Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst new file mode 100644 index 00000000000000..493b740261e64c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst @@ -0,0 +1,2 @@ +The undocumented :class:`!re.Scanner` class now forbids regular expressions containing capturing groups in its lexicon patterns. Patterns using capturing groups could +previously lead to crashes with segmentation fault. Use non-capturing groups (?:...) instead. From 5b88a6533cdd5b4865d3fbe77829473e20aaa208 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 14:11:08 +0100 Subject: [PATCH 1296/1674] [3.14] Fix minor typo: 'web site' -> 'website' (GH-140561) (GH-140976) (cherry picked from commit 08115d241a724a4769599993f654f77abcdebf5a) Co-authored-by: commitWithTisha <tishaa1010@gmail.com> --- Doc/library/http.cookiejar.rst | 2 +- Doc/library/urllib.robotparser.rst | 2 +- Doc/tutorial/index.rst | 2 +- Doc/tutorial/whatnow.rst | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst index 251aea891c3f98..fcb0069b760e59 100644 --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -12,7 +12,7 @@ -------------- The :mod:`http.cookiejar` module defines classes for automatic handling of HTTP -cookies. It is useful for accessing web sites that require small pieces of data +cookies. It is useful for accessing websites that require small pieces of data -- :dfn:`cookies` -- to be set on the client machine by an HTTP response from a web server, and then returned to the server in later HTTP requests. diff --git a/Doc/library/urllib.robotparser.rst b/Doc/library/urllib.robotparser.rst index 016fcdc75da67a..674f646c633bbd 100644 --- a/Doc/library/urllib.robotparser.rst +++ b/Doc/library/urllib.robotparser.rst @@ -19,7 +19,7 @@ This module provides a single class, :class:`RobotFileParser`, which answers questions about whether or not a particular user agent can fetch a URL on the -web site that published the :file:`robots.txt` file. For more details on the +website that published the :file:`robots.txt` file. For more details on the structure of :file:`robots.txt` files, see http://www.robotstxt.org/orig.html. diff --git a/Doc/tutorial/index.rst b/Doc/tutorial/index.rst index d0bf77dc40d0a1..20fe161be4acc2 100644 --- a/Doc/tutorial/index.rst +++ b/Doc/tutorial/index.rst @@ -15,7 +15,7 @@ together with its interpreted nature, make it an ideal language for scripting and rapid application development in many areas on most platforms. The Python interpreter and the extensive standard library are freely available -in source or binary form for all major platforms from the Python web site, +in source or binary form for all major platforms from the Python website, https://www.python.org/, and may be freely distributed. The same site also contains distributions of and pointers to many free third party Python modules, programs and tools, and additional documentation. diff --git a/Doc/tutorial/whatnow.rst b/Doc/tutorial/whatnow.rst index dbe2d7fc09927e..359cf80a7b2ecf 100644 --- a/Doc/tutorial/whatnow.rst +++ b/Doc/tutorial/whatnow.rst @@ -30,7 +30,7 @@ the set are: More Python resources: -* https://www.python.org: The major Python web site. It contains code, +* https://www.python.org: The major Python website. It contains code, documentation, and pointers to Python-related pages around the web. * https://docs.python.org: Fast access to Python's documentation. From c3f9702f04f64f9cf9848b9a51a4aead4a612fa1 Mon Sep 17 00:00:00 2001 From: AN Long <aisk@users.noreply.github.com> Date: Wed, 5 Nov 2025 01:14:44 +0900 Subject: [PATCH 1297/1674] [3.14] gh-140826 Remove the wrong documents about comparison behavior on winreg.HKEYType (GH-140999) --- Doc/library/winreg.rst | 3 --- PC/winreg.c | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index b3a824fb69a49f..52c6c1a82821ba 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -753,9 +753,6 @@ Handle objects provide semantics for :meth:`~object.__bool__` -- thus :: will print ``Yes`` if the handle is currently valid (has not been closed or detached). -The object also support comparison semantics, so handle objects will compare -true if they both reference the same underlying Windows handle value. - Handle objects can be converted to an integer (e.g., using the built-in :func:`int` function), in which case the underlying Windows handle value is returned. You can also use the :meth:`~PyHKEY.Detach` method to return the diff --git a/PC/winreg.c b/PC/winreg.c index c342be92b98f08..b7b26411f2b1e9 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -101,8 +101,7 @@ PyDoc_STRVAR(PyHKEY_doc, "\n" "Operations:\n" "__bool__ - Handles with an open object return true, otherwise false.\n" -"__int__ - Converting a handle to an integer returns the Win32 handle.\n" -"rich comparison - Handle objects are compared using the handle value."); +"__int__ - Converting a handle to an integer returns the Win32 handle."); From 267af2983246012f0c9bdc141dd9ef503a12d58b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 17:16:51 +0100 Subject: [PATCH 1298/1674] [3.14] gh-140979: Fix off-by-one error in the RE code validator (GH-140984) (GH-141001) It was too lenient and allowed MARK opcodes with too large value. (cherry picked from commit 1326d2a808245e5f2de9e515460bab30556e8f05) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Modules/_sre/sre.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index 694a66818f90d8..2761c76a3792f8 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -1942,7 +1942,7 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) sre_match() code is robust even if they don't, and the worst you can get is nonsensical match results. */ GET_ARG; - if (arg > 2 * (size_t)groups + 1) { + if (arg >= 2 * (size_t)groups) { VTRACE(("arg=%d, groups=%d\n", (int)arg, (int)groups)); FAIL; } From 52f18790eb75e00fbc82e4b4ae71dd9ee559aec0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 19:34:04 +0100 Subject: [PATCH 1299/1674] [3.14] Document that returning `sys.monitoring.DISABLE` in response to a global event raises `ValueError` (GH-140726) (GH-141014) Document that returning `sys.monitoring.DISABLE` in response to a global event raises `ValueError` (GH-140726) (cherry picked from commit 8a7dbb7a68b5da1f3f1805f564c028f1eea4ebc3) Co-authored-by: Brett Cannon <brett@python.org> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/sys.monitoring.rst | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/Doc/library/sys.monitoring.rst b/Doc/library/sys.monitoring.rst index 0f986aa580b3c9..303655fb128b37 100644 --- a/Doc/library/sys.monitoring.rst +++ b/Doc/library/sys.monitoring.rst @@ -216,14 +216,17 @@ by another event: 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. +:monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events will only be +seen if the corresponding :monitoring-event:`CALL` event is being monitored. + + +.. _monitoring-event-global: Other events '''''''''''' Other events are not necessarily tied to a specific location in the -program and cannot be individually disabled. +program and cannot be individually disabled via :data:`DISABLE`. The other events that can be monitored are: @@ -289,12 +292,13 @@ in Python (see :ref:`c-api-monitoring`). .. function:: get_local_events(tool_id: int, code: CodeType, /) -> int - Returns all the local events for *code* + Returns all the :ref:`local events <monitoring-event-local>` for *code* .. 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 :exc:`ValueError` if *tool_id* is not in use. + Activates all the :ref:`local events <monitoring-event-local>` for *code* + which are set in *event_set*. Raises a :exc:`ValueError` if *tool_id* is not + in use. Disabling events @@ -305,15 +309,21 @@ Disabling events 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 -: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. +:ref:`Local events <monitoring-event-local>` can be disabled for a specific code +location by returning :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 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. +If :data:`DISABLE` is returned by a callback for a +:ref:`global event <monitoring-event-global>`, :exc:`ValueError` will be raised +by the interpreter in a non-specific location (that is, no traceback will be +provided). + .. function:: restart_events() -> None Enable all the events that were disabled by :data:`sys.monitoring.DISABLE` From 4358b8417f58af118f78da86b53b6d483835c7ce Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 19:40:12 +0100 Subject: [PATCH 1300/1674] [3.14] gh-134817: Restore accidentally deleted line in documentation. (GH-141013) (GH-141016) (cherry picked from commit 66c86c65633047c0faffba85ce6b0b3a82373657) --- Doc/library/logging.handlers.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst index d74ef73ee28497..c9cfbdb4126fda 100644 --- a/Doc/library/logging.handlers.rst +++ b/Doc/library/logging.handlers.rst @@ -463,6 +463,7 @@ timed intervals. .. method:: getFilesToDelete() Returns a list of filenames which should be deleted as part of rollover. These + are the absolute paths of the oldest backup log files written by the handler. .. method:: shouldRollover(record) From d82d340096a7fe25434bf3f08678a20bae3dfd9f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 20:35:20 +0100 Subject: [PATCH 1301/1674] [3.14] Docs: Fix typo in `email.headerregistry.rst` (GH-140965) (#141020) Docs: Fix typo in `email.headerregistry.rst` (GH-140965) Fix missing 'Header' suffix on header class name in `email.headerregistry.rst` (cherry picked from commit 97d8dda980fcddf88b782be343118257f483a864) Co-authored-by: Guo Ci <zguoci@gmail.com> --- Doc/library/email.headerregistry.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index 7f8044932fae99..ff8b601fe3d1bb 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -294,7 +294,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1. ``inline`` and ``attachment`` are the only valid values in common use. -.. class:: ContentTransferEncoding +.. class:: ContentTransferEncodingHeader Handles the :mailheader:`Content-Transfer-Encoding` header. From f0eb7d4c9a2e49aafb858b0c625c2741701bbf42 Mon Sep 17 00:00:00 2001 From: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> Date: Tue, 4 Nov 2025 21:43:18 +0100 Subject: [PATCH 1302/1674] [3.14] gh-140513: Fail to compile if _Py_TAIL_CALL_INTERP is set but preserve_none and musttail do not exist (GH-140548) (#140923) gh-140513: Fail to compile if `_Py_TAIL_CALL_INTERP` is set but `preserve_none` and `musttail` do not exist. (GH-140548) (cherry picked from commit 2f60b8f02fe7cb83dd589d9664460082c13e85ef) Co-authored-by: Krishna Chaitanya <141550576+XChaitanyaX@users.noreply.github.com> --- .../Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst | 2 ++ Python/ceval_macros.h | 8 ++++++++ 2 files changed, 10 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst diff --git a/Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst b/Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst new file mode 100644 index 00000000000000..1035ebf8d781cf --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst @@ -0,0 +1,2 @@ +Generate a clear compilation error when ``_Py_TAIL_CALL_INTERP`` is enabled but +either ``preserve_none`` or ``musttail`` is not supported. diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 187ec8fdd26584..37c4b00f86df25 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -79,6 +79,14 @@ #endif #if Py_TAIL_CALL_INTERP +# if defined(__clang__) || defined(__GNUC__) +# if !_Py__has_attribute(preserve_none) || !_Py__has_attribute(musttail) +# error "This compiler does not have support for efficient tail calling." +# endif +# elif defined(_MSC_VER) +# error "Tail calling not supported for MSVC." +# endif + // Note: [[clang::musttail]] works for GCC 15, but not __attribute__((musttail)) at the moment. # define Py_MUSTTAIL [[clang::musttail]] # define Py_PRESERVE_NONE_CC __attribute__((preserve_none)) From dc76de26e5f25f14aae0470297788c6be08213f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20=C5=81ajszczak?= <filip@lajszczak.dev> Date: Tue, 4 Nov 2025 22:23:16 +0100 Subject: [PATCH 1303/1674] [3.14] gh-139434: Update selected RFC 2822 references to RFC 5322 (GH-139435) (#141025) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update selected RFC 2822 references to RFC 5322 RFC 2822 was obsoleted by RFC 5322 in 2008. This updates references to use the current standard in documentation, docstrings, and comments. It preserves RFC 2822 references in legacy API components to maintain their historical context. RFC 822 → RFC 2822 → RFC 5322 progression is explained where relevant. In some places specific sections of RFC are referenced where it seems helpful. Scout rule was applied in some places and RFC mentions format was normalized in doc strings and comments. (cherry picked from commit ce1bb85d286130f44b7e874430b0b12990d61dc1) --- Doc/library/http.client.rst | 2 +- Doc/library/http.server.rst | 2 +- Doc/library/mailbox.rst | 2 +- Doc/library/time.rst | 5 ++-- Doc/tutorial/stdlib.rst | 2 +- Lib/email/_parseaddr.py | 13 +++++++---- Lib/email/_policybase.py | 2 +- Lib/email/feedparser.py | 4 ++-- Lib/email/generator.py | 2 +- Lib/email/message.py | 2 +- Lib/email/parser.py | 10 ++++---- Lib/http/client.py | 4 ++-- Lib/smtplib.py | 6 ++--- Lib/test/test_email/data/msg_35.txt | 2 +- Lib/test/test_email/test_email.py | 36 ++++++++++++++--------------- 15 files changed, 49 insertions(+), 45 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 2835c8d0eb711e..75aa818ab9f5d7 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -125,7 +125,7 @@ This module provides the following function: Parse the headers from a file pointer *fp* representing a HTTP 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. + (i.e. not text) and must provide a valid :rfc:`5322` style header. This function returns an instance of :class:`http.client.HTTPMessage` that holds the header fields, but no payload diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 02016c789b24b4..41026e2b303645 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -154,7 +154,7 @@ instantiation, of which this module provides three different variants: variable. This instance parses and manages the headers in the HTTP request. The :func:`~http.client.parse_headers` function from :mod:`http.client` is used to parse the headers and it requires that the - HTTP request provide a valid :rfc:`2822` style header. + HTTP request provide a valid :rfc:`5322` style header. .. attribute:: rfile diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst index e8a96f29ea185e..62e289573c0c7e 100644 --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -917,7 +917,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. copied; furthermore, any format-specific information is converted insofar as 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 + or a file, it should contain an :rfc:`5322`\ -compliant message, which is read and parsed. Files should be open in binary mode, but text mode files are accepted for backward compatibility. diff --git a/Doc/library/time.rst b/Doc/library/time.rst index a990101057019b..43e402a4bf9d1b 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -570,7 +570,7 @@ Functions calculations when the day of the week and the year are specified. Here is an example, a format for dates compatible with that specified in the - :rfc:`2822` Internet email standard. [1]_ :: + :rfc:`5322` Internet email standard. [1]_ :: >>> from time import gmtime, strftime >>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) @@ -1052,4 +1052,5 @@ Timezone Constants strict reading of the original 1982 :rfc:`822` standard calls for a two-digit year (``%y`` rather than ``%Y``), but practice moved to 4-digit years long before the year 2000. After that, :rfc:`822` became obsolete and the 4-digit year has - been first recommended by :rfc:`1123` and then mandated by :rfc:`2822`. + been first recommended by :rfc:`1123` and then mandated by :rfc:`2822`, + with :rfc:`5322` continuing this requirement. diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 4b3eef313e76d7..fc98ffaadeed88 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -335,7 +335,7 @@ sophisticated and robust capabilities of its larger packages. For example: names, no direct knowledge or handling of XML is needed. * The :mod:`email` package is a library for managing email messages, including - MIME and other :rfc:`2822`-based message documents. Unlike :mod:`smtplib` and + MIME and other :rfc:`5322`-based message documents. Unlike :mod:`smtplib` and :mod:`poplib` which actually send and receive messages, the email package has a complete toolset for building or decoding complex message structures (including attachments) and for implementing internet encoding and header diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index 84917038874ba1..6a7c5fa06d20b6 100644 --- a/Lib/email/_parseaddr.py +++ b/Lib/email/_parseaddr.py @@ -146,8 +146,9 @@ def _parsedate_tz(data): return None # Check for a yy specified in two-digit format, then convert it to the # appropriate four-digit format, according to the POSIX standard. RFC 822 - # calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822) - # mandates a 4-digit yy. For more information, see the documentation for + # calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822) already + # mandated a 4-digit yy, and RFC 5322 (which obsoletes RFC 2822) continues + # this requirement. For more information, see the documentation for # the time module. if yy < 100: # The year is between 1969 and 1999 (inclusive). @@ -233,9 +234,11 @@ def __init__(self, field): self.CR = '\r\n' self.FWS = self.LWS + self.CR self.atomends = self.specials + self.LWS + self.CR - # Note that RFC 2822 now specifies '.' as obs-phrase, meaning that it - # is obsolete syntax. RFC 2822 requires that we recognize obsolete - # syntax, so allow dots in phrases. + # Note that RFC 2822 section 4.1 introduced '.' as obs-phrase to handle + # existing practice (periods in display names), even though it was not + # allowed in RFC 822. RFC 5322 section 4.1 (which obsoletes RFC 2822) + # continues this requirement. We must recognize obsolete syntax, so + # allow dots in phrases. self.phraseends = self.atomends.replace('.', '') self.field = field self.commentlist = [] diff --git a/Lib/email/_policybase.py b/Lib/email/_policybase.py index 95e79b8938bb4c..e23843df44881f 100644 --- a/Lib/email/_policybase.py +++ b/Lib/email/_policybase.py @@ -380,7 +380,7 @@ def _fold(self, name, value, sanitize): h = value if h is not None: # The Header class interprets a value of None for maxlinelen as the - # default value of 78, as recommended by RFC 2822. + # default value of 78, as recommended by RFC 5322 section 2.1.1. maxlinelen = 0 if self.max_line_length is not None: maxlinelen = self.max_line_length diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py index 9d80a5822af48d..6479b9bab7ac5b 100644 --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -32,7 +32,7 @@ NLCRE_bol = re.compile(r'(\r\n|\r|\n)') NLCRE_eol = re.compile(r'(\r\n|\r|\n)\z') NLCRE_crack = re.compile(r'(\r\n|\r|\n)') -# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character +# RFC 5322 section 3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character # except controls, SP, and ":". headerRE = re.compile(r'^(From |[\041-\071\073-\176]*:|[\t ])') EMPTYSTRING = '' @@ -294,7 +294,7 @@ def _parsegen(self): return if self._cur.get_content_maintype() == 'message': # The message claims to be a message/* type, then what follows is - # another RFC 2822 message. + # another RFC 5322 message. for retval in self._parsegen(): if retval is NeedMoreData: yield NeedMoreData diff --git a/Lib/email/generator.py b/Lib/email/generator.py index ab5bd0653e440c..03524c96559153 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -50,7 +50,7 @@ def __init__(self, outfp, mangle_from_=None, maxheaderlen=None, *, expanded to 8 spaces) than maxheaderlen, the header will split as defined in the Header class. Set maxheaderlen to zero to disable header wrapping. The default is 78, as recommended (but not required) - by RFC 2822. + by RFC 5322 section 2.1.1. The policy keyword specifies a policy object that controls a number of aspects of the generator's operation. If no policy is specified, diff --git a/Lib/email/message.py b/Lib/email/message.py index 36e4b4a9f0b773..2505d17ef15e69 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -135,7 +135,7 @@ def _decode_uu(encoded): class Message: """Basic message object. - A message object is defined as something that has a bunch of RFC 2822 + A message object is defined as something that has a bunch of RFC 5322 headers and a payload. It may optionally have an envelope header (a.k.a. Unix-From or From_ header). If the message is a container (i.e. a multipart or a message/rfc822), then the payload is a list of Message diff --git a/Lib/email/parser.py b/Lib/email/parser.py index 039f03cba74fa0..c6a51dd8e377b8 100644 --- a/Lib/email/parser.py +++ b/Lib/email/parser.py @@ -2,7 +2,7 @@ # Author: Barry Warsaw, Thomas Wouters, Anthony Baxter # Contact: email-sig@python.org -"""A parser of RFC 2822 and MIME email messages.""" +"""A parser of RFC 5322 and MIME email messages.""" __all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser', 'FeedParser', 'BytesFeedParser'] @@ -15,13 +15,13 @@ class Parser: def __init__(self, _class=None, *, policy=compat32): - """Parser of RFC 2822 and MIME email messages. + """Parser of RFC 5322 and MIME email messages. Creates an in-memory object tree representing the email message, which can then be manipulated and turned over to a Generator to return the textual representation of the message. - The string must be formatted as a block of RFC 2822 headers and header + The string must be formatted as a block of RFC 5322 headers and header continuation lines, optionally preceded by a 'Unix-from' header. The header block is terminated either by the end of the string or by a blank line. @@ -75,13 +75,13 @@ def parsestr(self, text, headersonly=True): class BytesParser: def __init__(self, *args, **kw): - """Parser of binary RFC 2822 and MIME email messages. + """Parser of binary RFC 5322 and MIME email messages. Creates an in-memory object tree representing the email message, which can then be manipulated and turned over to a Generator to return the textual representation of the message. - The input must be formatted as a block of RFC 2822 headers and header + The input must be formatted as a block of RFC 5322 headers and header continuation lines, optionally preceded by a 'Unix-from' header. The header block is terminated either by the end of the input or by a blank line. diff --git a/Lib/http/client.py b/Lib/http/client.py index 33a858d34ae1ba..cf19440f7b0b9e 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -230,7 +230,7 @@ def _read_headers(fp): def _parse_header_lines(header_lines, _class=HTTPMessage): """ - Parses only RFC2822 headers from header lines. + Parses only RFC 5322 headers from header lines. email Parser wants to see strings rather than bytes. But a TextIOWrapper around self.rfile would buffer too many bytes @@ -243,7 +243,7 @@ def _parse_header_lines(header_lines, _class=HTTPMessage): return email.parser.Parser(_class=_class).parsestr(hstring) def parse_headers(fp, _class=HTTPMessage): - """Parses only RFC2822 headers from a file pointer.""" + """Parses only RFC 5322 headers from a file pointer.""" headers = _read_headers(fp) return _parse_header_lines(headers, _class) diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 808f0fd47e8b4e..72093f7f8b0f2d 100644 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -917,7 +917,7 @@ def send_message(self, msg, from_addr=None, to_addrs=None, The arguments are as for sendmail, except that msg is an email.message.Message object. If from_addr is None or to_addrs is None, these arguments are taken from the headers of the Message as - described in RFC 2822 (a ValueError is raised if there is more than + described in RFC 5322 (a ValueError is raised if there is more than one set of 'Resent-' headers). Regardless of the values of from_addr and to_addr, any Bcc field (or Resent-Bcc field, when the Message is a resent) of the Message object won't be transmitted. The Message @@ -931,7 +931,7 @@ def send_message(self, msg, from_addr=None, to_addrs=None, policy. """ - # 'Resent-Date' is a mandatory field if the Message is resent (RFC 2822 + # 'Resent-Date' is a mandatory field if the Message is resent (RFC 5322 # Section 3.6.6). In such a case, we use the 'Resent-*' fields. However, # if there is more than one 'Resent-' block there's no way to # unambiguously determine which one is the most recent in all cases, @@ -950,7 +950,7 @@ def send_message(self, msg, from_addr=None, to_addrs=None, else: raise ValueError("message has more than one 'Resent-' header block") if from_addr is None: - # Prefer the sender field per RFC 2822:3.6.2. + # Prefer the sender field per RFC 5322 section 3.6.2. from_addr = (msg[header_prefix + 'Sender'] if (header_prefix + 'Sender') in msg else msg[header_prefix + 'From']) diff --git a/Lib/test/test_email/data/msg_35.txt b/Lib/test/test_email/data/msg_35.txt index be7d5a2f7b9d38..0e2bbcaf71816a 100644 --- a/Lib/test/test_email/data/msg_35.txt +++ b/Lib/test/test_email/data/msg_35.txt @@ -1,4 +1,4 @@ From: aperson@dom.ain To: bperson@dom.ain Subject: here's something interesting -counter to RFC 2822, there's no separating newline here +counter to RFC 5322, there's no separating newline here diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index b8116d073a2670..9f2dc1bb7e6c9a 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -2352,7 +2352,7 @@ def test_no_separating_blank_line(self): To: bperson@dom.ain Subject: here's something interesting -counter to RFC 2822, there's no separating newline here +counter to RFC 5322, there's no separating newline here """) # test_defect_handling @@ -2508,49 +2508,49 @@ def test_rfc2047_Q_invalid_digits(self): [(b'andr\xe9=zz', 'iso-8859-1')]) def test_rfc2047_rfc2047_1(self): - # 1st testcase at end of rfc2047 + # 1st testcase at end of RFC 2047 s = '(=?ISO-8859-1?Q?a?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'a', 'iso-8859-1'), (b')', None)]) def test_rfc2047_rfc2047_2(self): - # 2nd testcase at end of rfc2047 + # 2nd testcase at end of RFC 2047 s = '(=?ISO-8859-1?Q?a?= b)' self.assertEqual(decode_header(s), [(b'(', None), (b'a', 'iso-8859-1'), (b' b)', None)]) def test_rfc2047_rfc2047_3(self): - # 3rd testcase at end of rfc2047 + # 3rd testcase at end of RFC 2047 s = '(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)]) def test_rfc2047_rfc2047_4(self): - # 4th testcase at end of rfc2047 + # 4th testcase at end of RFC 2047 s = '(=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)]) def test_rfc2047_rfc2047_5a(self): - # 5th testcase at end of rfc2047 newline is \r\n + # 5th testcase at end of RFC 2047 newline is \r\n s = '(=?ISO-8859-1?Q?a?=\r\n =?ISO-8859-1?Q?b?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)]) def test_rfc2047_rfc2047_5b(self): - # 5th testcase at end of rfc2047 newline is \n + # 5th testcase at end of RFC 2047 newline is \n s = '(=?ISO-8859-1?Q?a?=\n =?ISO-8859-1?Q?b?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'ab', 'iso-8859-1'), (b')', None)]) def test_rfc2047_rfc2047_6(self): - # 6th testcase at end of rfc2047 + # 6th testcase at end of RFC 2047 s = '(=?ISO-8859-1?Q?a_b?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'a b', 'iso-8859-1'), (b')', None)]) def test_rfc2047_rfc2047_7(self): - # 7th testcase at end of rfc2047 + # 7th testcase at end of RFC 2047 s = '(=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=)' self.assertEqual(decode_header(s), [(b'(', None), (b'a', 'iso-8859-1'), (b' b', 'iso-8859-2'), @@ -3252,8 +3252,8 @@ def test_parsedate_y2k(self): """Test for parsing a date with a two-digit year. Parsing a date with a two-digit year should return the correct - four-digit year. RFC822 allows two-digit years, but RFC2822 (which - obsoletes RFC822) requires four-digit years. + four-digit year. RFC 822 allows two-digit years, but RFC 5322 (which + obsoletes RFC 2822, which obsoletes RFC 822) requires four-digit years. """ self.assertEqual(utils.parsedate_tz('25 Feb 03 13:47:26 -0800'), @@ -3304,7 +3304,7 @@ def test_escape_backslashes(self): self.assertEqual(utils.parseaddr(utils.formataddr((a, b))), (a, b)) def test_quotes_unicode_names(self): - # issue 1690608. email.utils.formataddr() should be rfc2047 aware. + # issue 1690608. email.utils.formataddr() should be RFC 2047 aware. name = "H\u00e4ns W\u00fcrst" addr = 'person@dom.ain' utf8_base64 = "=?utf-8?b?SMOkbnMgV8O8cnN0?= <person@dom.ain>" @@ -3314,7 +3314,7 @@ def test_quotes_unicode_names(self): latin1_quopri) def test_accepts_any_charset_like_object(self): - # issue 1690608. email.utils.formataddr() should be rfc2047 aware. + # issue 1690608. email.utils.formataddr() should be RFC 2047 aware. name = "H\u00e4ns W\u00fcrst" addr = 'person@dom.ain' utf8_base64 = "=?utf-8?b?SMOkbnMgV8O8cnN0?= <person@dom.ain>" @@ -3329,7 +3329,7 @@ def header_encode(self, string): utf8_base64) def test_invalid_charset_like_object_raises_error(self): - # issue 1690608. email.utils.formataddr() should be rfc2047 aware. + # issue 1690608. email.utils.formataddr() should be RFC 2047 aware. name = "H\u00e4ns W\u00fcrst" addr = 'person@dom.ain' # An object without a header_encode method: @@ -3338,7 +3338,7 @@ def test_invalid_charset_like_object_raises_error(self): bad_charset) def test_unicode_address_raises_error(self): - # issue 1690608. email.utils.formataddr() should be rfc2047 aware. + # issue 1690608. email.utils.formataddr() should be RFC 2047 aware. addr = 'pers\u00f6n@dom.in' self.assertRaises(UnicodeError, utils.formataddr, (None, addr)) self.assertRaises(UnicodeError, utils.formataddr, ("Name", addr)) @@ -3359,7 +3359,7 @@ def test_parseaddr_preserves_quoted_pairs_in_addresses(self): # string containing a quoted backslash, followed by 'example' and two # backslashes, followed by another quoted string containing a space and # the word 'example'. parseaddr copies those two backslashes - # literally. Per rfc5322 this is not technically correct since a \ may + # literally. Per RFC 5322 this is not technically correct since a \ may # not appear in an address outside of a quoted string. It is probably # a sensible Postel interpretation, though. eq = self.assertEqual @@ -3371,12 +3371,12 @@ def test_parseaddr_preserves_quoted_pairs_in_addresses(self): ('', '"\\\\"example\\\\" example"@example.com')) def test_parseaddr_preserves_spaces_in_local_part(self): - # issue 9286. A normal RFC5322 local part should not contain any + # issue 9286. A normal RFC 5322 local part should not contain any # folding white space, but legacy local parts can (they are a sequence # of atoms, not dotatoms). On the other hand we strip whitespace from # before the @ and around dots, on the assumption that the whitespace # around the punctuation is a mistake in what would otherwise be - # an RFC5322 local part. Leading whitespace is, usual, stripped as well. + # an RFC 5322 local part. Leading whitespace is, usual, stripped as well. self.assertEqual(('', "merwok wok@xample.com"), utils.parseaddr("merwok wok@xample.com")) self.assertEqual(('', "merwok wok@xample.com"), From 7ab08d2c5171e35f4a2295070f843c786c7da7d0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Nov 2025 22:33:52 +0100 Subject: [PATCH 1304/1674] [3.14] gh-141004: Document `Py_UNICODE_{HIGH, LOW}_SURROGATE` functions (GH-141019) (GH-141027) gh-141004: Document `Py_UNICODE_{HIGH, LOW}_SURROGATE` functions (GH-141019) (cherry picked from commit bfe54810c408ff066591d1af0411b1d9c10084b1) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/unicode.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index aeb86e06d99351..9fa88915c3c023 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -305,12 +305,22 @@ These APIs can be used to work with surrogates: Check if *ch* is a low surrogate (``0xDC00 <= ch <= 0xDFFF``). +.. c:function:: Py_UCS4 Py_UNICODE_HIGH_SURROGATE(Py_UCS4 ch) + + Return the high UTF-16 surrogate (``0xD800`` to ``0xDBFF``) for a Unicode + code point in the range ``[0x10000; 0x10FFFF]``. + +.. c:function:: Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch) + + Return the low UTF-16 surrogate (``0xDC00`` to ``0xDFFF``) for a Unicode + code point in the range ``[0x10000; 0x10FFFF]``. + .. c:function:: Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) 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]. + surrogate pair. *high* must be in the range ``[0xD800; 0xDBFF]`` and *low* must + be in the range ``[0xDC00; 0xDFFF]``. Creating and accessing Unicode strings From 2511fce2ef655f73cadb0b7ea66952a8517315e4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 01:11:42 +0100 Subject: [PATCH 1305/1674] [3.14] gh-141007: update string module source code link (GH-141008) (#141030) gh-141007: update string module source code link (GH-141008) In 3.14, the former string.py became `__init__.py` within a new `string` directory that also contains a new submodule file, `templatelib.py`. (cherry picked from commit fa02422918ac3251cdf88a626f90af260bf5224a) Co-authored-by: alex <30386655+alexomics@users.noreply.github.com> --- Doc/library/string.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 6336a0ec47b91e..58c836c7382330 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -4,7 +4,7 @@ .. module:: string :synopsis: Common string operations. -**Source code:** :source:`Lib/string.py` +**Source code:** :source:`Lib/string/__init__.py` -------------- From 43eaf9984abb9ebb9a617eb55b2f997fe9a41425 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 5 Nov 2025 14:24:10 +0200 Subject: [PATCH 1306/1674] [3.14] Omit `Python/perf_jit_trampoline.c` from the `**/*jit*` CODEOWNERS rule (GH-136519) (#140987) Co-authored-by: Brandt Bucher <brandtbucher@microsoft.com> --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b190d8ac1ee955..91eb0b718d3cc0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,6 +27,7 @@ Modules/Setup* @erlend-aasland **/*genobject* @markshannon **/*hamt* @1st1 **/*jit* @brandtbucher @savannahostrowski +Python/perf_jit_trampoline.c # Exclude the owners of "**/*jit*", above. Objects/set* @rhettinger Objects/dict* @methane @markshannon Objects/typevarobject.c @JelleZijlstra From 39ca786918d8fd11b4183a0503ee21a76f7feef4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 15:20:04 +0100 Subject: [PATCH 1307/1674] [3.14] gh-141004: Document missing iterator types in the C API (GH-141010) (GH-141046) gh-141004: Document missing iterator types in the C API (GH-141010) Add documentation for each of the following: - PyByteArrayIter_Type - PyBytesIter_Type - PyListIter_Type - PyListRevIter_Type - PySetIter_Type - PyTupleIter_Type - PyRangeIter_Type - PyLongRangeIter_Type - PyDictIterKey_Type - PyDictRevIterKey_Type - PyDictIterValue_Type - PyDictRevIterValue_Type - PyDictIterItem_Type - PyDictRevIterItem_Type --------- (cherry picked from commit 35528fccdcaa0890e959eb7884332d1a426819ac) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/c-api/iterator.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Doc/c-api/iterator.rst b/Doc/c-api/iterator.rst index 6b7ba8c9979163..4b94970036f543 100644 --- a/Doc/c-api/iterator.rst +++ b/Doc/c-api/iterator.rst @@ -50,3 +50,32 @@ sentinel value is returned. callable object that can be called with no parameters; each call to it should return the next item in the iteration. When *callable* returns a value equal to *sentinel*, the iteration will be terminated. + + +Other Iterator Objects +^^^^^^^^^^^^^^^^^^^^^^ + +.. c:var:: PyTypeObject PyByteArrayIter_Type +.. c:var:: PyTypeObject PyBytesIter_Type +.. c:var:: PyTypeObject PyListIter_Type +.. c:var:: PyTypeObject PyListRevIter_Type +.. c:var:: PyTypeObject PySetIter_Type +.. c:var:: PyTypeObject PyTupleIter_Type +.. c:var:: PyTypeObject PyRangeIter_Type +.. c:var:: PyTypeObject PyLongRangeIter_Type +.. c:var:: PyTypeObject PyDictIterKey_Type +.. c:var:: PyTypeObject PyDictRevIterKey_Type +.. c:var:: PyTypeObject PyDictIterValue_Type +.. c:var:: PyTypeObject PyDictRevIterValue_Type +.. c:var:: PyTypeObject PyDictIterItem_Type +.. c:var:: PyTypeObject PyDictRevIterItem_Type + + Type objects for iterators of various built-in objects. + + Do not create instances of these directly; prefer calling + :c:func:`PyObject_GetIter` instead. + + Note that there is no guarantee that a given built-in type uses a given iterator + type. For example, iterating over :class:`range` will use one of two iterator + types depending on the size of the range. Other types may start using a + similar scheme in the future, without warning. From 378912975ba101710caf282ad5ffa720db1b9c67 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:51:34 +0100 Subject: [PATCH 1308/1674] [3.14] gh-141004: Document `PyMemoryView_Type` (GH-141034) (GH-141054) gh-141004: Document `PyMemoryView_Type` (GH-141034) (cherry picked from commit 3f6aca1be49f96c5c5f52040b8e78c73c79c0a86) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/memoryview.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst index f6038032805259..e4ac8b57673407 100644 --- a/Doc/c-api/memoryview.rst +++ b/Doc/c-api/memoryview.rst @@ -13,6 +13,12 @@ A :class:`memoryview` object exposes the C level :ref:`buffer interface any other object. +.. c:var:: PyTypeObject PyMemoryView_Type + + This instance of :c:type:`PyTypeObject` represents the Python memoryview + type. This is the same object as :class:`memoryview` in the Python layer. + + .. c:function:: PyObject *PyMemoryView_FromObject(PyObject *obj) Create a memoryview object from an object that provides the buffer interface. From 19ba59369ef55de3ebea721b9c9926c53532d840 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 19:14:12 +0100 Subject: [PATCH 1309/1674] [3.14] Docs: Fix cached calls count in factorial example (gh-140882) (gh-141031) Co-authored-by: Clifford Gama <cliffygamy@gmail.com> --- Doc/library/functools.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index f8ffb3f41d1210..8028cfc34d7e26 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -42,11 +42,11 @@ The :mod:`functools` module defines the following functions: def factorial(n): return n * factorial(n-1) if n else 1 - >>> factorial(10) # no previously cached result, makes 11 recursive calls + >>> factorial(10) # no previously cached result, makes 11 recursive calls 3628800 - >>> factorial(5) # just looks up cached value result + >>> factorial(5) # no new calls, just returns the cached result 120 - >>> factorial(12) # makes two new recursive calls, the other 10 are cached + >>> factorial(12) # two new recursive calls, factorial(10) is cached 479001600 The cache is threadsafe so that the wrapped function can be used in From fa8f46412fad0705ba697e5a627fde42006a8d5f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 20:07:03 +0100 Subject: [PATCH 1310/1674] [3.14] gh-139313: Improve docs on XML security (GH-139460) (GH-141065) Clarify that: - it takes parsing for an attack - that some doors are closed by default - only Expat version 2.7.2 has all the fixes - use of the bundle depends on configuration (cherry picked from commit baa9f338971c6a13433a8232db77cd45e6b87b77) Co-authored-by: Sebastian Pipping <sebastian@pipping.org> --- Doc/library/pyexpat.rst | 9 +++++++++ Doc/library/xml.rst | 22 +++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 0b08a9b0dedef6..c00554739b82d8 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -558,6 +558,15 @@ otherwise stated. .. method:: xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId) + .. warning:: + + Implementing a handler that accesses local files and/or the network + may create a vulnerability to + `external entity attacks <https://en.wikipedia.org/wiki/XML_external_entity_attack>`_ + if :class:`xmlparser` is used with user-provided XML content. + Please reflect on your `threat model <https://en.wikipedia.org/wiki/Threat_model>`_ + before implementing this handler. + Called for references to external entities. *base* is the current base, as set by a previous call to :meth:`SetBase`. The public and system identifiers, *systemId* and *publicId*, are strings if given; if the public identifier is not diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst index 3f745573474405..acd8d399fe32fc 100644 --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -53,11 +53,22 @@ XML security An attacker can abuse XML features to carry out denial of service attacks, access local files, generate network connections to other machines, or -circumvent firewalls. - -Expat versions lower than 2.6.0 may be vulnerable to "billion laughs", -"quadratic blowup" and "large tokens". Python may be vulnerable if it uses such -older versions of Expat as a system-provided library. +circumvent firewalls when attacker-controlled XML is being parsed, +in Python or elsewhere. + +The built-in XML parsers of Python rely on the library `libexpat`_, commonly +called Expat, for parsing XML. + +By default, Expat itself does not access local files or create network +connections. + +Expat versions lower than 2.7.2 may be vulnerable to the "billion laughs", +"quadratic blowup" and "large tokens" vulnerabilities, or to disproportional +use of dynamic memory. +Python bundles a copy of Expat, and whether Python uses the bundled or a +system-wide Expat, depends on how the Python interpreter +:option:`has been configured <--with-system-expat>` in your environment. +Python may be vulnerable if it uses such older versions of Expat. Check :const:`!pyexpat.EXPAT_VERSION`. :mod:`xmlrpc` is **vulnerable** to the "decompression bomb" attack. @@ -90,5 +101,6 @@ large tokens be used to cause denial of service in the application parsing XML. The issue is known as :cve:`2023-52425`. +.. _libexpat: https://github.com/libexpat/libexpat .. _Billion Laughs: https://en.wikipedia.org/wiki/Billion_laughs .. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb From 8675f55f6a9644393100eac0bfe18863518a04be Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 20:10:32 +0100 Subject: [PATCH 1311/1674] [3.14] Fix a compiler warning in _randommodule.c (GH-141058) (#141063) Fix a compiler warning in _randommodule.c (GH-141058) The test just before the cast ensures that the cast cannot overflow. Fix the warning on 32-bit Windows: Modules\_randommodule.c(525,28): warning C4244: '=': conversion from 'uint64_t' to 'Py_ssize_t', possible loss of data (cherry picked from commit 4ac16dd10950fad2d3e58e8b0ba5f2e621af3cc1) Co-authored-by: Victor Stinner <vstinner@python.org> --- Modules/_randommodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 2f4f388ce1161a..3ffeff32c0dac1 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -522,7 +522,7 @@ _random_Random_getrandbits_impl(RandomObject *self, uint64_t k) PyErr_NoMemory(); return NULL; } - words = (k - 1u) / 32u + 1u; + words = (Py_ssize_t)((k - 1u) / 32u + 1u); wordarray = (uint32_t *)PyMem_Malloc(words * 4); if (wordarray == NULL) { PyErr_NoMemory(); From 36e9f672f29819861fb3dd150700137cf185adac Mon Sep 17 00:00:00 2001 From: Victor Stinner <vstinner@python.org> Date: Wed, 5 Nov 2025 20:49:39 +0100 Subject: [PATCH 1312/1674] [3.14] Fix compiler warnings in remote debugging (#141060) (#141067) Fix compiler warnings in remote debugging (#141060) Example of fixed warnings on 32-bit Windows: Python\remote_debugging.c(24,53): warning C4244: 'function': conversion from 'uint64_t' to 'uintptr_t', possible loss of data Modules\_remote_debugging_module.c(789,44): warning C4244: 'function': conversion from 'uint64_t' to 'size_t', possible loss of data (cherry picked from commit f458ac01ba522cc7f94c0c0ee9a00c82f1be6d69) --- Modules/_remote_debugging_module.c | 56 +++++++++++++++--------------- Python/remote_debugging.c | 14 ++++---- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index a2619de0510b59..f34f25a1338542 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -440,7 +440,7 @@ iterate_threads( if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, - unwinder->interpreter_addr + unwinder->debug_offsets.interpreter_state.threads_main, + unwinder->interpreter_addr + (uintptr_t)unwinder->debug_offsets.interpreter_state.threads_main, sizeof(void*), &thread_state_addr)) { @@ -451,7 +451,7 @@ iterate_threads( while (thread_state_addr != 0) { if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, - thread_state_addr + unwinder->debug_offsets.thread_state.native_thread_id, + thread_state_addr + (uintptr_t)unwinder->debug_offsets.thread_state.native_thread_id, sizeof(tid), &tid)) { @@ -467,7 +467,7 @@ iterate_threads( // Move to next thread if (0 > _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, - thread_state_addr + unwinder->debug_offsets.thread_state.next, + thread_state_addr + (uintptr_t)unwinder->debug_offsets.thread_state.next, sizeof(void*), &thread_state_addr)) { @@ -623,7 +623,7 @@ read_py_str( return NULL; } - size_t offset = unwinder->debug_offsets.unicode_object.asciiobject_size; + size_t offset = (size_t)unwinder->debug_offsets.unicode_object.asciiobject_size; res = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address + offset, len, buf); if (res < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read string data from remote memory"); @@ -685,7 +685,7 @@ read_py_bytes( return NULL; } - size_t offset = unwinder->debug_offsets.bytes_object.ob_sval; + size_t offset = (size_t)unwinder->debug_offsets.bytes_object.ob_sval; res = _Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, address + offset, len, buf); if (res < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read bytes data from remote memory"); @@ -723,7 +723,7 @@ read_py_long( int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, address, - unwinder->debug_offsets.long_object.size, + (size_t)unwinder->debug_offsets.long_object.size, long_obj); if (bytes_read < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read PyLongObject"); @@ -760,7 +760,7 @@ read_py_long( bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, - address + unwinder->debug_offsets.long_object.ob_digit, + address + (uintptr_t)unwinder->debug_offsets.long_object.ob_digit, sizeof(digit) * size, digits ); @@ -870,7 +870,7 @@ parse_task_name( int err = _Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, task_address, - unwinder->async_debug_offsets.asyncio_task_object.size, + (size_t)unwinder->async_debug_offsets.asyncio_task_object.size, task_obj); if (err < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read task object"); @@ -977,7 +977,7 @@ handle_yield_from_frame( uintptr_t gi_await_addr_type_addr; err = read_ptr( unwinder, - gi_await_addr + unwinder->debug_offsets.pyobject.ob_type, + gi_await_addr + (uintptr_t)unwinder->debug_offsets.pyobject.ob_type, &gi_await_addr_type_addr); if (err) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read gi_await type address"); @@ -1038,7 +1038,7 @@ parse_coro_chain( // Parse the previous frame using the gi_iframe from local copy uintptr_t prev_frame; - uintptr_t gi_iframe_addr = coro_address + unwinder->debug_offsets.gen_object.gi_iframe; + uintptr_t gi_iframe_addr = coro_address + (uintptr_t)unwinder->debug_offsets.gen_object.gi_iframe; uintptr_t address_of_code_object = 0; if (parse_frame_object(unwinder, &name, gi_iframe_addr, &address_of_code_object, &prev_frame) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to parse frame object in coro chain"); @@ -1090,7 +1090,7 @@ create_task_result( // Parse coroutine chain if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, task_address, - unwinder->async_debug_offsets.asyncio_task_object.size, + (size_t)unwinder->async_debug_offsets.asyncio_task_object.size, task_obj) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read task object for coro chain"); goto error; @@ -1143,7 +1143,7 @@ parse_task( err = read_char( unwinder, - task_address + unwinder->async_debug_offsets.asyncio_task_object.task_is_task, + task_address + (uintptr_t)unwinder->async_debug_offsets.asyncio_task_object.task_is_task, &is_task); if (err) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read is_task flag"); @@ -1291,7 +1291,7 @@ process_thread_for_awaited_by( void *context ) { PyObject *result = (PyObject *)context; - uintptr_t head_addr = thread_state_addr + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_tasks_head; + uintptr_t head_addr = thread_state_addr + (uintptr_t)unwinder->async_debug_offsets.asyncio_thread_state.asyncio_tasks_head; return append_awaited_by(unwinder, tid, head_addr, result); } @@ -1306,7 +1306,7 @@ process_task_awaited_by( // Read the entire TaskObj at once char task_obj[SIZEOF_TASK_OBJ]; if (_Py_RemoteDebug_PagedReadRemoteMemory(&unwinder->handle, task_address, - unwinder->async_debug_offsets.asyncio_task_object.size, + (size_t)unwinder->async_debug_offsets.asyncio_task_object.size, task_obj) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read task object"); return -1; @@ -1463,7 +1463,7 @@ find_running_task_in_thread( uintptr_t address_of_running_loop; int bytes_read = read_py_ptr( unwinder, - thread_state_addr + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_loop, + thread_state_addr + (uintptr_t)unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_loop, &address_of_running_loop); if (bytes_read == -1) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running loop address"); @@ -1477,7 +1477,7 @@ find_running_task_in_thread( int err = read_ptr( unwinder, - thread_state_addr + unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_task, + thread_state_addr + (uintptr_t)unwinder->async_debug_offsets.asyncio_thread_state.asyncio_running_task, running_task_addr); if (err) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running task address"); @@ -1493,7 +1493,7 @@ get_task_code_object(RemoteUnwinderObject *unwinder, uintptr_t task_addr, uintpt if(read_py_ptr( unwinder, - task_addr + unwinder->async_debug_offsets.asyncio_task_object.task_coro, + task_addr + (uintptr_t)unwinder->async_debug_offsets.asyncio_task_object.task_coro, &running_coro_addr) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Running task coro read failed"); return -1; @@ -1509,7 +1509,7 @@ get_task_code_object(RemoteUnwinderObject *unwinder, uintptr_t task_addr, uintpt // the offset leads directly to its first field: f_executable if (read_py_ptr( unwinder, - running_coro_addr + unwinder->debug_offsets.gen_object.gi_iframe, code_obj_addr) < 0) { + running_coro_addr + (uintptr_t)unwinder->debug_offsets.gen_object.gi_iframe, code_obj_addr) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read running task code object"); return -1; } @@ -1657,7 +1657,7 @@ static bool parse_linetable(const uintptr_t addrq, const char* linetable, int firstlineno, LocationInfo* info) { const uint8_t* ptr = (const uint8_t*)(linetable); - uint64_t addr = 0; + uintptr_t addr = 0; info->lineno = firstlineno; while (*ptr != '\0') { @@ -1785,7 +1785,7 @@ parse_code_object(RemoteUnwinderObject *unwinder, meta->file_name = file; meta->linetable = linetable; meta->first_lineno = GET_MEMBER(int, code_object, unwinder->debug_offsets.code_object.firstlineno); - meta->addr_code_adaptive = real_address + unwinder->debug_offsets.code_object.co_code_adaptive; + meta->addr_code_adaptive = real_address + (uintptr_t)unwinder->debug_offsets.code_object.co_code_adaptive; if (unwinder && unwinder->code_object_cache && _Py_hashtable_set(unwinder->code_object_cache, key, meta) < 0) { cached_code_metadata_destroy(meta); @@ -1952,7 +1952,7 @@ copy_stack_chunks(RemoteUnwinderObject *unwinder, size_t count = 0; size_t max_chunks = 16; - if (read_ptr(unwinder, tstate_addr + unwinder->debug_offsets.thread_state.datastack_chunk, &chunk_addr)) { + if (read_ptr(unwinder, tstate_addr + (uintptr_t)unwinder->debug_offsets.thread_state.datastack_chunk, &chunk_addr)) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read initial stack chunk address"); return -1; } @@ -2061,8 +2061,8 @@ populate_initial_state_data( uintptr_t *interpreter_state, uintptr_t *tstate ) { - uint64_t interpreter_state_list_head = - unwinder->debug_offsets.runtime_state.interpreters_head; + uintptr_t interpreter_state_list_head = + (uintptr_t)unwinder->debug_offsets.runtime_state.interpreters_head; uintptr_t address_of_interpreter_state; int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( @@ -2089,7 +2089,7 @@ populate_initial_state_data( } uintptr_t address_of_thread = address_of_interpreter_state + - unwinder->debug_offsets.interpreter_state.threads_main; + (uintptr_t)unwinder->debug_offsets.interpreter_state.threads_main; if (_Py_RemoteDebug_PagedReadRemoteMemory( &unwinder->handle, @@ -2113,7 +2113,7 @@ find_running_frame( if ((void*)address_of_thread != NULL) { int err = read_ptr( unwinder, - address_of_thread + unwinder->debug_offsets.thread_state.current_frame, + address_of_thread + (uintptr_t)unwinder->debug_offsets.thread_state.current_frame, frame); if (err) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read current frame pointer"); @@ -2285,7 +2285,7 @@ append_awaited_by_for_thread( } uintptr_t task_addr = (uintptr_t)GET_MEMBER(uintptr_t, task_node, unwinder->debug_offsets.llist_node.next) - - unwinder->async_debug_offsets.asyncio_task_object.task_node; + - (uintptr_t)unwinder->async_debug_offsets.asyncio_task_object.task_node; if (process_single_task_node(unwinder, task_addr, NULL, result) < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to process task node in awaited_by"); @@ -2428,7 +2428,7 @@ unwind_stack_for_thread( char ts[SIZEOF_THREAD_STATE]; int bytes_read = _Py_RemoteDebug_PagedReadRemoteMemory( - &unwinder->handle, *current_tstate, unwinder->debug_offsets.thread_state.size, ts); + &unwinder->handle, *current_tstate, (size_t)unwinder->debug_offsets.thread_state.size, ts); if (bytes_read < 0) { set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to read thread state"); goto error; @@ -2830,7 +2830,7 @@ _remote_debugging_RemoteUnwinder_get_all_awaited_by_impl(RemoteUnwinderObject *s } uintptr_t head_addr = self->interpreter_addr - + self->async_debug_offsets.asyncio_interpreter_state.asyncio_tasks_head; + + (uintptr_t)self->async_debug_offsets.asyncio_interpreter_state.asyncio_tasks_head; // On top of a per-thread task lists used by default by asyncio to avoid // contention, there is also a fallback per-interpreter list of tasks; diff --git a/Python/remote_debugging.c b/Python/remote_debugging.c index 7aee87ef05a407..71ffb17ed68b1d 100644 --- a/Python/remote_debugging.c +++ b/Python/remote_debugging.c @@ -19,7 +19,7 @@ cleanup_proc_handle(proc_handle_t *handle) { } static int -read_memory(proc_handle_t *handle, uint64_t remote_address, size_t len, void* dst) +read_memory(proc_handle_t *handle, uintptr_t remote_address, size_t len, void* dst) { return _Py_RemoteDebug_ReadRemoteMemory(handle, remote_address, len, dst); } @@ -235,7 +235,7 @@ send_exec_to_proc_handle(proc_handle_t *handle, int tid, const char *debugger_sc int is_remote_debugging_enabled = 0; if (0 != read_memory( handle, - interpreter_state_addr + debug_offsets.debugger_support.remote_debugging_enabled, + interpreter_state_addr + (uintptr_t)debug_offsets.debugger_support.remote_debugging_enabled, sizeof(int), &is_remote_debugging_enabled)) { @@ -255,7 +255,7 @@ send_exec_to_proc_handle(proc_handle_t *handle, int tid, const char *debugger_sc if (tid != 0) { if (0 != read_memory( handle, - interpreter_state_addr + debug_offsets.interpreter_state.threads_head, + interpreter_state_addr + (uintptr_t)debug_offsets.interpreter_state.threads_head, sizeof(void*), &thread_state_addr)) { @@ -264,7 +264,7 @@ send_exec_to_proc_handle(proc_handle_t *handle, int tid, const char *debugger_sc while (thread_state_addr != 0) { if (0 != read_memory( handle, - thread_state_addr + debug_offsets.thread_state.native_thread_id, + thread_state_addr + (uintptr_t)debug_offsets.thread_state.native_thread_id, sizeof(this_tid), &this_tid)) { @@ -277,7 +277,7 @@ send_exec_to_proc_handle(proc_handle_t *handle, int tid, const char *debugger_sc if (0 != read_memory( handle, - thread_state_addr + debug_offsets.thread_state.next, + thread_state_addr + (uintptr_t)debug_offsets.thread_state.next, sizeof(void*), &thread_state_addr)) { @@ -294,7 +294,7 @@ send_exec_to_proc_handle(proc_handle_t *handle, int tid, const char *debugger_sc } else { if (0 != read_memory( handle, - interpreter_state_addr + debug_offsets.interpreter_state.threads_main, + interpreter_state_addr + (uintptr_t)debug_offsets.interpreter_state.threads_main, sizeof(void*), &thread_state_addr)) { @@ -346,7 +346,7 @@ send_exec_to_proc_handle(proc_handle_t *handle, int tid, const char *debugger_sc uintptr_t eval_breaker; if (0 != read_memory( handle, - thread_state_addr + debug_offsets.debugger_support.eval_breaker, + thread_state_addr + (uintptr_t)debug_offsets.debugger_support.eval_breaker, sizeof(uintptr_t), &eval_breaker)) { From 52f15231f0b201fc39a8be32919c6677b7ebc4b1 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Wed, 5 Nov 2025 21:20:17 +0000 Subject: [PATCH 1313/1674] [3.14] Docs: replace an esoteric Von Neumann mention (GH-137598) (#141071) Co-authored-by: Ned Batchelder <ned@nedbatchelder.com> --- Doc/reference/datamodel.rst | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c176e7158e48bb..e5c5cc2d5ef6cb 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -16,9 +16,8 @@ Objects, values and types single: data :dfn:`Objects` are Python's abstraction for data. All data in a Python program -is represented by objects or by relations between objects. (In a sense, and in -conformance to Von Neumann's model of a "stored program computer", code is also -represented by objects.) +is represented by objects or by relations between objects. Even code is +represented by objects. .. index:: pair: built-in function; id @@ -29,9 +28,6 @@ represented by objects.) single: mutable object single: immutable object -.. XXX it *is* now possible in some cases to change an object's - type, under certain controlled conditions - 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 From 11eecde7a539206195c16a797866a6df4d8ec11b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 22:53:11 +0100 Subject: [PATCH 1314/1674] [3.14] Fix typo in Apple/__main__.py (GH-141038) (#141039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrected a typo in a return value docstring. (cherry picked from commit 335d83ec0492779b7fbf2293690f06971cc9d04a) Co-authored-by: Lê Nam Khánh <55955273+khanhkhanhlele@users.noreply.github.com> --- Apple/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apple/__main__.py b/Apple/__main__.py index 34744871f681ea..e76fc351798707 100644 --- a/Apple/__main__.py +++ b/Apple/__main__.py @@ -507,7 +507,7 @@ def lib_non_platform_files(dirname, names): def create_xcframework(platform: str) -> str: """Build an XCframework from the component parts for the platform. - :return: The version number of the Python verion that was packaged. + :return: The version number of the Python version that was packaged. """ package_path = CROSS_BUILD_DIR / platform try: From 090c0f140398fa923ac893936a95246d82d53e66 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 23:05:47 +0100 Subject: [PATCH 1315/1674] [3.14] gh-141004: Document `Py_RETURN_NAN` and `Py_RETURN_INF` (GH-141029) (GH-141074) gh-141004: Document `Py_RETURN_NAN` and `Py_RETURN_INF` (GH-141029) (cherry picked from commit 5b02c6e920aaef4b202fc19186f742d008460fd3) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> --- Doc/c-api/float.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 489676caa3a16a..1085c32a537071 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -78,6 +78,23 @@ Floating-Point Objects Return the minimum normalized positive float *DBL_MIN* as C :c:expr:`double`. +.. c:macro:: Py_RETURN_NAN + + Return :data:`math.nan` from a function. + + On most platforms, this is equivalent to ``return PyFloat_FromDouble(NAN)``. + + +.. c:macro:: Py_RETURN_INF(sign) + + Return :data:`math.inf` or :data:`-math.inf <math.inf>` from a function, + depending on the sign of *sign*. + + On most platforms, this is equivalent to the following:: + + return PyFloat_FromDouble(copysign(INFINITY, sign)); + + Pack and Unpack functions ------------------------- From f35a6e14f388bc327963f010b733a114a9333168 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 23:06:27 +0100 Subject: [PATCH 1316/1674] [3.14] gh-76007: remove curses.__version__ doc (GH-141052) (#141076) Co-authored-by: Zenith <me@arielle.codes> --- Doc/library/curses.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index fb84cf32246879..e60197ddd89adb 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -1349,7 +1349,6 @@ The :mod:`curses` module defines the following data members: .. data:: version -.. data:: __version__ A bytes object representing the current version of the module. From 556183708579a854f5a90a4563b4965789b33425 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 23:38:20 +0100 Subject: [PATCH 1317/1674] [3.14] gh-141004: Document `PyDict_GET_SIZE` (GH-141078) (GH-141082) gh-141004: Document `PyDict_GET_SIZE` (GH-141078) (cherry picked from commit f0ab07f22c5fd18058a3ece7a1e745b3922af908) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/dict.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 0abbd662dad394..246ce5391e142c 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -245,6 +245,11 @@ Dictionary Objects ``len(p)`` on a dictionary. +.. c:function:: Py_ssize_t PyDict_GET_SIZE(PyObject *p) + + Similar to :c:func:`PyDict_Size`, but without error checking. + + .. c:function:: int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue) Iterate over all key-value pairs in the dictionary *p*. The From 00087dc466e3711a2bb3b5e57cbb354302f9c60c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 23:52:22 +0100 Subject: [PATCH 1318/1674] [3.14] GH-108009: Add clarification of parser and argument defaults in argparse docs (GH-124154) (#141084) GH-108009: Add clarification of parser and argument defaults in argparse docs (GH-124154) (cherry picked from commit 95f6e1275b1c9de550d978cb2b4351cc4ed24fe4) Co-authored-by: Savannah Ostrowski <savannah@python.org> Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> --- Doc/library/argparse.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 0ee921e15260c4..2dca4a71a5361a 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -2071,7 +2071,9 @@ Parser defaults >>> parser.parse_args(['736']) Namespace(bar=42, baz='badger', foo=736) - Note that parser-level defaults always override argument-level defaults:: + Note that defaults can be set at both the parser level using :meth:`set_defaults` + and at the argument level using :meth:`add_argument`. If both are called for the + same argument, the last default set for an argument is used:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='bar') From 9878611f28fdfeecea118f133997ec9694610721 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 21:04:27 -0800 Subject: [PATCH 1319/1674] [3.14] gh-118516: clarify that subprocess are automatically killed if transport gets garbage collected (GH-140997) (#141110) gh-118516: clarify that subprocess are automatically killed if transport gets garbage collected (GH-140997) (cherry picked from commit 101c9c0a2187940900f684086cb9ba0d456fda49) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- Doc/library/asyncio-eventloop.rst | 6 ++++++ Doc/library/asyncio-subprocess.rst | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 0ccc7a2b4482ec..72f484fd1cbe77 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1631,6 +1631,9 @@ async/await code consider using the high-level conforms to the :class:`asyncio.SubprocessTransport` base class and *protocol* is an object instantiated by the *protocol_factory*. + If the transport is closed or is garbage collected, the child process + is killed if it is still running. + .. method:: loop.subprocess_shell(protocol_factory, cmd, *, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ stderr=subprocess.PIPE, **kwargs) @@ -1654,6 +1657,9 @@ async/await code consider using the high-level conforms to the :class:`SubprocessTransport` base class and *protocol* is an object instantiated by the *protocol_factory*. + If the transport is closed or is garbage collected, the child process + is killed if it is still running. + .. note:: It is the application's responsibility to ensure that all whitespace and special characters are quoted appropriately to avoid `shell injection diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index 03e76bc868905e..9416c758e51d95 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -76,6 +76,9 @@ Creating Subprocesses See the documentation of :meth:`loop.subprocess_exec` for other parameters. + If the process object is garbage collected while the process is still + running, the child process will be killed. + .. versionchanged:: 3.10 Removed the *loop* parameter. @@ -95,6 +98,9 @@ Creating Subprocesses See the documentation of :meth:`loop.subprocess_shell` for other parameters. + If the process object is garbage collected while the process is still + running, the child process will be killed. + .. important:: It is the application's responsibility to ensure that all whitespace and From 12847bfff7bb7c33f93d70bddf5542ae6965105c Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Thu, 6 Nov 2025 05:41:31 +0000 Subject: [PATCH 1320/1674] [3.14] Fix Queue.shutdown docs for condition to unblock a join (gh-137088) (#141073) (cherry picked from commit ea06ae5b5e7b335efbdff03c087fad9980a53f69) Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com> --- Doc/library/asyncio-queue.rst | 7 ++++--- Doc/library/queue.rst | 7 ++++--- Lib/asyncio/queues.py | 8 +++++--- Lib/queue.py | 8 +++++--- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index 963bc1fb82c12f..d481a1921d532b 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -120,9 +120,10 @@ Queue raise :exc:`QueueShutDown`. If *immediate* is true, the queue is terminated immediately. - The queue is drained to be completely empty. All callers of - :meth:`~Queue.join` are unblocked regardless of the number - of unfinished tasks. Blocked callers of :meth:`~Queue.get` + The queue is drained to be completely empty and the count + of unfinished tasks is reduced by the number of tasks drained. + If unfinished tasks is zero, callers of :meth:`~Queue.join` + are unblocked. Also, blocked callers of :meth:`~Queue.get` are unblocked and will raise :exc:`QueueShutDown` because the queue is empty. diff --git a/Doc/library/queue.rst b/Doc/library/queue.rst index 6dcf06aab00295..1b75582f0cf45b 100644 --- a/Doc/library/queue.rst +++ b/Doc/library/queue.rst @@ -256,9 +256,10 @@ until empty or terminated immediately with a hard shutdown. raise :exc:`ShutDown`. If *immediate* is true, the queue is terminated immediately. - The queue is drained to be completely empty. All callers of - :meth:`~Queue.join` are unblocked regardless of the number - of unfinished tasks. Blocked callers of :meth:`~Queue.get` + The queue is drained to be completely empty and the count + of unfinished tasks is reduced by the number of tasks drained. + If unfinished tasks is zero, callers of :meth:`~Queue.join` + are unblocked. Also, blocked callers of :meth:`~Queue.get` are unblocked and will raise :exc:`ShutDown` because the queue is empty. diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index e5d6f2e4b61e17..084fccaaff2ff7 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -253,9 +253,11 @@ def shutdown(self, immediate=False): 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', unblock callers of join() regardless of the - number of unfinished tasks. + All blocked callers of put() and get() will be unblocked. + + If 'immediate', the queue is drained and unfinished tasks + is reduced by the number of drained tasks. If unfinished tasks + is reduced to zero, callers of Queue.join are unblocked. """ self._is_shutdown = True if immediate: diff --git a/Lib/queue.py b/Lib/queue.py index c90de8edc76c34..c0b359876543f7 100644 --- a/Lib/queue.py +++ b/Lib/queue.py @@ -236,9 +236,11 @@ def shutdown(self, immediate=False): 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', callers of join() are unblocked regardless of - the number of unfinished tasks. + All blocked callers of put() and get() will be unblocked. + + If 'immediate', the queue is drained and unfinished tasks + is reduced by the number of drained tasks. If unfinished tasks + is reduced to zero, callers of Queue.join are unblocked. ''' with self.mutex: self.is_shutdown = True From f2353d60dbde2298c7c5c0f7c903c56739073d0a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Nov 2025 21:46:15 -0800 Subject: [PATCH 1321/1674] [3.14] gh-140569: recommend the new REPL in the asyncio REPL docs (GH-140570) (#141115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-140569: recommend the new REPL in the asyncio REPL docs (GH-140570) (cherry picked from commit 8822166200ddb4a7635337b97b626e658a443cef) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/asyncio.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index 444db01390d922..0f72e31dee5f1d 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -79,6 +79,10 @@ You can experiment with an ``asyncio`` concurrent context in the :term:`REPL`: >>> await asyncio.sleep(10, result='hello') 'hello' +This REPL provides limited compatibility with :envvar:`PYTHON_BASIC_REPL`. +It is recommended that the default REPL is used +for full functionality and the latest features. + .. audit-event:: cpython.run_stdin "" "" .. versionchanged:: 3.12.5 (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20) From 45cc56c5882bce8d7daa96ff38395760acc276ba Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:34:06 -0800 Subject: [PATCH 1322/1674] [3.14] gh-129876: Move misplaced IDLE news item (GH-141118) (#141119) gh-129876: Move misplaced IDLE news item (GH-141118) (cherry picked from commit 6a7c969d003d3ba932d5c7f14a58e2a6408f4a3d) Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu> --- Lib/idlelib/News3.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/idlelib/News3.txt b/Lib/idlelib/News3.txt index 30784578cc637f..53d83762f99ec5 100644 --- a/Lib/idlelib/News3.txt +++ b/Lib/idlelib/News3.txt @@ -4,6 +4,9 @@ Released on 2025-10-07 ========================= +gh-129873: Simplify displaying the IDLE doc by only copying the text +section of idle.html to idlelib/help.html. Patch by Stan Ulbrych. + gh-112936: IDLE - Include Shell menu in single-process mode, though with Restart Shell and View Last Restart disabled. Patch by Zhikang Yan. @@ -26,9 +29,6 @@ Released on 2024-10-07 gh-120104: Fix padding in config and search dialog windows in IDLE. -gh-129873: Simplify displaying the IDLE doc by only copying the text -section of idle.html to idlelib/help.html. Patch by Stan Ulbrych. - gh-120083: Add explicit black IDLE Hovertip foreground color needed for recent macOS. Fixes Sonoma showing unreadable white on pale yellow. Patch by John Riggles. From 47ede24d49101468cf4712606d76e3f0de59474a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:51:28 -0800 Subject: [PATCH 1323/1674] [3.14] Minor fixes to `idle.rst` and regenerate `help.html` (GH-140037) (#141121) Minor fixes to `idle.rst` and regenerate `help.html` (GH-140037) (cherry picked from commit 4e6e208be9d1c52d1b55a8bb3a83682cb078e55e) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- .gitattributes | 1 + Doc/library/idle.rst | 6 +-- Lib/idlelib/help.html | 110 ++++++++++++++++++++++++++++++------------ 3 files changed, 82 insertions(+), 35 deletions(-) diff --git a/.gitattributes b/.gitattributes index 5682b9150a36e2..16264cacb0e34e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -83,6 +83,7 @@ Include/opcode_ids.h generated Include/token.h generated Lib/_opcode_metadata.py generated Lib/keyword.py generated +Lib/idlelib/help.html generated Lib/test/certdata/*.pem generated Lib/test/certdata/*.0 generated Lib/test/levenshtein_examples.json generated diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index e547c96b580bfd..10ec7f0a6f14c9 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -13,7 +13,7 @@ IDLE --- Python editor and shell single: Integrated Development Environment .. - Remember to update Lib/idlelib/help.html with idlelib.help.copy_source() when modifying this file. + Remember to update Lib/idlelib/help.html with idlelib.help.copy_strip() when modifying this file. -------------- @@ -88,7 +88,7 @@ Save Save As... Save the current window with a Save As dialog. The file saved becomes the - new associated file for the window. (If your file namager is set to hide + new associated file for the window. (If your file manager is set to hide extensions, the current extension will be omitted in the file name box. If the new filename has no '.', '.py' and '.txt' will be added for Python and text files, except that on macOS Aqua,'.py' is added for all files.) @@ -206,7 +206,7 @@ New Indent Width Strip Trailing Whitespace Remove trailing space and other whitespace characters after the last - non-whitespace character of a line by applying str.rstrip to each line, + non-whitespace character of a line by applying :meth:`str.rstrip` to each line, including lines within multiline strings. Except for Shell windows, remove extra newlines at the end of the file. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index ebff9a309d9081..fc618ab727d1fb 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -53,7 +53,7 @@ <h3>File menu (Shell and Editor)<a class="headerlink" href="#file-menu-shell-and do Save As instead.</p> </dd> <dt>Save As…</dt><dd><p>Save the current window with a Save As dialog. The file saved becomes the -new associated file for the window. (If your file namager is set to hide +new associated file for the window. (If your file manager is set to hide extensions, the current extension will be omitted in the file name box. If the new filename has no ‘.’, ‘.py’ and ‘.txt’ will be added for Python and text files, except that on macOS Aqua,’.py’ is added for all files.)</p> @@ -143,8 +143,8 @@ <h3>Edit menu (Shell and Editor)<a class="headerlink" href="#edit-menu-shell-and <dt>New Indent Width</dt><dd><p>Open a dialog to change indent width. The accepted default by the Python community is 4 spaces.</p> </dd> -<dt>Strip Trailing Chitespace</dt><dd><p>Remove trailing space and other whitespace characters after the last -non-whitespace character of a line by applying str.rstrip to each line, +<dt>Strip Trailing Whitespace</dt><dd><p>Remove trailing space and other whitespace characters after the last +non-whitespace character of a line by applying <a class="reference internal" href="stdtypes.html#str.rstrip" title="str.rstrip"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.rstrip()</span></code></a> to each line, including lines within multiline strings. Except for Shell windows, remove extra newlines at the end of the file.</p> </dd> @@ -337,16 +337,16 @@ <h3>Key bindings<a class="headerlink" href="#key-bindings" title="Link to this h assume that the keys have not been re-bound to something else.)</p> <ul class="simple"> <li><p>Arrow keys move the cursor one character or line.</p></li> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">LeftArrow</kbd></kbd> and <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">RightArrow</kbd></kbd> moves left or right one word.</p></li> +<li><p><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">LeftArrow</kbd> and <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">RightArrow</kbd> moves left or right one word.</p></li> <li><p><kbd class="kbd docutils literal notranslate">Home</kbd> and <kbd class="kbd docutils literal notranslate">End</kbd> go to the beginning or end of the line.</p></li> <li><p><kbd class="kbd docutils literal notranslate">Page Up</kbd> and <kbd class="kbd docutils literal notranslate">Page Down</kbd> go up or down one screen.</p></li> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">Home</kbd></kbd> and <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">End</kbd></kbd> go to beginning or end of the file.</p></li> -<li><p><kbd class="kbd docutils literal notranslate">Backspace</kbd> and <kbd class="kbd docutils literal notranslate">Del</kbd> (or <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">d</kbd></kbd>) delete the previous +<li><p><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">Home</kbd> and <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">End</kbd> go to beginning or end of the file.</p></li> +<li><p><kbd class="kbd docutils literal notranslate">Backspace</kbd> and <kbd class="kbd docutils literal notranslate">Del</kbd> (or <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">d</kbd>) delete the previous or next character.</p></li> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">Backspace</kbd></kbd> and <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">Del</kbd></kbd> delete one word left or right.</p></li> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">k</kbd></kbd> deletes (‘kills’) everything to the right.</p></li> +<li><p><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">Backspace</kbd> and <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">Del</kbd> delete one word left or right.</p></li> +<li><p><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">k</kbd> deletes (‘kills’) everything to the right.</p></li> </ul> -<p>Standard keybindings (like <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">c</kbd></kbd> to copy and <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">v</kbd></kbd> to paste) +<p>Standard keybindings (like <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">c</kbd> to copy and <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">v</kbd> to paste) may work. Keybindings are selected in the Configure IDLE dialog.</p> </section> <section id="automatic-indentation"> @@ -390,7 +390,7 @@ <h3>Search and Replace<a class="headerlink" href="#search-and-replace" title="Li directory name and a separator.</p> <p>Instead of waiting, or after a box is closed, open a completion box immediately with Show Completions on the Edit menu. The default hot -key is <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">space</kbd></kbd>. If one types a prefix for the desired name +key is <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">space</kbd>. If one types a prefix for the desired name before opening the box, the first match or near miss is made visible. The result is the same as if one enters a prefix after the box is displayed. Show Completions after a quote completes @@ -473,9 +473,9 @@ <h3>Shell window<a class="headerlink" href="#shell-window" title="Link to this h <p>The editing features described in previous subsections work when entering code interactively. IDLE’s Shell window also responds to the following:</p> <ul class="simple"> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">c</kbd></kbd> attempts to interrupt statement execution (but may fail).</p></li> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">d</kbd></kbd> closes Shell if typed at a <code class="docutils literal notranslate"><span class="pre">&gt;&gt;&gt;</span></code> prompt.</p></li> -<li><p><kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">Alt</kbd>-<kbd class="kbd docutils literal notranslate">p</kbd></kbd> and <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">Alt</kbd>-<kbd class="kbd docutils literal notranslate">n</kbd></kbd> (<kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">p</kbd></kbd> and <kbd class="kbd compound docutils literal notranslate"><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">n</kbd></kbd> on macOS) +<li><p><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">c</kbd> attempts to interrupt statement execution (but may fail).</p></li> +<li><p><kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">d</kbd> closes Shell if typed at a <code class="docutils literal notranslate"><span class="pre">&gt;&gt;&gt;</span></code> prompt.</p></li> +<li><p><kbd class="kbd docutils literal notranslate">Alt</kbd>-<kbd class="kbd docutils literal notranslate">p</kbd> and <kbd class="kbd docutils literal notranslate">Alt</kbd>-<kbd class="kbd docutils literal notranslate">n</kbd> (<kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">p</kbd> and <kbd class="kbd docutils literal notranslate">C</kbd>-<kbd class="kbd docutils literal notranslate">n</kbd> on macOS) retrieve to the current prompt the previous or next previously entered statement that matches anything already typed.</p></li> <li><p><kbd class="kbd docutils literal notranslate">Return</kbd> while the cursor is on any previous statement @@ -517,27 +517,73 @@ <h2>Startup and Code Execution<a class="headerlink" href="#startup-and-code-exec functions to be used from IDLE’s Python shell.</p> <section id="command-line-usage"> <h3>Command line usage<a class="headerlink" href="#command-line-usage" title="Link to this heading">¶</a></h3> -<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>idle.py [-c command] [-d] [-e] [-h] [-i] [-r file] [-s] [-t title] [-] [arg] ... - --c command run command in the shell window --d enable debugger and open shell window --e open editor window --h print help message with legal combinations and exit --i open shell window --r file run file in shell window --s run $IDLESTARTUP or $PYTHONSTARTUP first, in shell window --t title set title of shell window -- run stdin in shell (- must be last option before args) +<p>IDLE can be invoked from the command line with various options. The general syntax is:</p> +<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>python<span class="w"> </span>-m<span class="w"> </span>idlelib<span class="w"> </span><span class="o">[</span>options<span class="o">]</span><span class="w"> </span><span class="o">[</span>file<span class="w"> </span>...<span class="o">]</span> </pre></div> </div> -<p>If there are arguments:</p> +<p>The following options are available:</p> +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-c"> +<span class="sig-name descname"><span class="pre">-c</span></span><span class="sig-prename descclassname"> <span class="pre">&lt;command&gt;</span></span><a class="headerlink" href="#cmdoption-idle-c" title="Link to this definition">¶</a></dt> +<dd><p>Run the specified Python command in the shell window. +For example, pass <code class="docutils literal notranslate"><span class="pre">-c</span> <span class="pre">&quot;print('Hello,</span> <span class="pre">World!')&quot;</span></code>. +On Windows, the outer quotes must be double quotes as shown.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-d"> +<span class="sig-name descname"><span class="pre">-d</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-idle-d" title="Link to this definition">¶</a></dt> +<dd><p>Enable the debugger and open the shell window.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-e"> +<span class="sig-name descname"><span class="pre">-e</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-idle-e" title="Link to this definition">¶</a></dt> +<dd><p>Open an editor window.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-h"> +<span class="sig-name descname"><span class="pre">-h</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-idle-h" title="Link to this definition">¶</a></dt> +<dd><p>Print a help message with legal combinations of options and exit.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-i"> +<span class="sig-name descname"><span class="pre">-i</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-idle-i" title="Link to this definition">¶</a></dt> +<dd><p>Open a shell window.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-r"> +<span class="sig-name descname"><span class="pre">-r</span></span><span class="sig-prename descclassname"> <span class="pre">&lt;file&gt;</span></span><a class="headerlink" href="#cmdoption-idle-r" title="Link to this definition">¶</a></dt> +<dd><p>Run the specified file in the shell window.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-s"> +<span class="sig-name descname"><span class="pre">-s</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-idle-s" title="Link to this definition">¶</a></dt> +<dd><p>Run the startup file (as defined by the environment variables <span class="target" id="index-7"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">IDLESTARTUP</span></code> or <span class="target" id="index-8"></span><a class="reference internal" href="../using/cmdline.html#envvar-PYTHONSTARTUP"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">PYTHONSTARTUP</span></code></a>) before opening the shell window.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-t"> +<span class="sig-name descname"><span class="pre">-t</span></span><span class="sig-prename descclassname"> <span class="pre">&lt;title&gt;</span></span><a class="headerlink" href="#cmdoption-idle-t" title="Link to this definition">¶</a></dt> +<dd><p>Set the title of the shell window.</p> +</dd></dl> + +<dl class="std option"> +<dt class="sig sig-object std" id="cmdoption-idle-0"> +<span class="sig-name descname"><span class="pre">-</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-idle-0" title="Link to this definition">¶</a></dt> +<dd><p>Read and execute standard input in the shell window. This option must be the last one before any arguments.</p> +</dd></dl> + +<p>If arguments are provided:</p> <ul class="simple"> -<li><p>If <code class="docutils literal notranslate"><span class="pre">-</span></code>, <code class="docutils literal notranslate"><span class="pre">-c</span></code>, or <code class="docutils literal notranslate"><span class="pre">r</span></code> is used, all arguments are placed in -<code class="docutils literal notranslate"><span class="pre">sys.argv[1:...]</span></code> and <code class="docutils literal notranslate"><span class="pre">sys.argv[0]</span></code> is set to <code class="docutils literal notranslate"><span class="pre">''</span></code>, <code class="docutils literal notranslate"><span class="pre">'-c'</span></code>, -or <code class="docutils literal notranslate"><span class="pre">'-r'</span></code>. No editor window is opened, even if that is the default -set in the Options dialog.</p></li> -<li><p>Otherwise, arguments are files opened for editing and -<code class="docutils literal notranslate"><span class="pre">sys.argv</span></code> reflects the arguments passed to IDLE itself.</p></li> +<li><p>If <code class="docutils literal notranslate"><span class="pre">-</span></code>, <code class="docutils literal notranslate"><span class="pre">-c</span></code>, or <code class="docutils literal notranslate"><span class="pre">-r</span></code> is used, all arguments are placed in <code class="docutils literal notranslate"><span class="pre">sys.argv[1:]</span></code>, +and <code class="docutils literal notranslate"><span class="pre">sys.argv[0]</span></code> is set to <code class="docutils literal notranslate"><span class="pre">''</span></code>, <code class="docutils literal notranslate"><span class="pre">'-c'</span></code>, or <code class="docutils literal notranslate"><span class="pre">'-r'</span></code> respectively. +No editor window is opened, even if that is the default set in the <em>Options</em> dialog.</p></li> +<li><p>Otherwise, arguments are treated as files to be opened for editing, and <code class="docutils literal notranslate"><span class="pre">sys.argv</span></code> reflects the arguments passed to IDLE itself.</p></li> </ul> </section> <section id="startup-failure"> @@ -798,7 +844,7 @@ <h3>Extensions<a class="headerlink" href="#extensions" title="Link to this headi either in idlelib or click Help =&gt; About IDLE on the IDLE menu. This file also maps IDLE menu items to the code that implements the item. Except for files listed under ‘Startup’, the idlelib code is ‘private’ in -sense that feature changes can be backported (see <span class="target" id="index-7"></span><a class="pep reference external" href="https://peps.python.org/pep-0434/"><strong>PEP 434</strong></a>).</p> +sense that feature changes can be backported (see <span class="target" id="index-9"></span><a class="pep reference external" href="https://peps.python.org/pep-0434/"><strong>PEP 434</strong></a>).</p> </section> </section> From 8f0581c077d75e0905d24129b4bc64659e052d94 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:18:46 +0200 Subject: [PATCH 1324/1674] [3.14] Add FFY00 to CODEOWNERS for generate-build-details (GH-139561) (#141080) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Filipe Laíns 🇵🇸 <lains@riseup.net> --- .github/CODEOWNERS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 91eb0b718d3cc0..b5e5bae2c9c98a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -16,6 +16,10 @@ configure* @erlend-aasland @corona10 Makefile.pre.in @erlend-aasland Modules/Setup* @erlend-aasland +# generate-build-details +Tools/build/generate-build-details.py @FFY00 +Lib/test/test_build_details.py @FFY00 + # argparse **/*argparse* @savannahostrowski From 6d5636c7c6f59ad04f2bf1374854f246b3679cc2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 02:25:50 -0800 Subject: [PATCH 1325/1674] [3.14] gh-137232: Update free-threading HOWTOs with up-to-date info for 3.14 (GH-140817) (#141129) (cherry picked from commit 86ab7bb87a3b8c7d617763bffc1992791c0e9bde) Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com> --- Doc/howto/free-threading-extensions.rst | 11 ++++++----- Doc/howto/free-threading-python.rst | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Doc/howto/free-threading-extensions.rst b/Doc/howto/free-threading-extensions.rst index 577e283bb9cb4c..fe960f90e44168 100644 --- a/Doc/howto/free-threading-extensions.rst +++ b/Doc/howto/free-threading-extensions.rst @@ -203,7 +203,7 @@ 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 +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. @@ -344,12 +344,12 @@ This means you cannot rely on nested critical sections to lock multiple objects at once, as the inner critical section may suspend the outer ones. Instead, use :c:macro:`Py_BEGIN_CRITICAL_SECTION2` to lock two objects simultaneously. -Note that the locks described above are only :c:type:`!PyMutex` based locks. +Note that the locks described above are only :c:type:`PyMutex` based locks. The critical section implementation does not know about or affect other locking mechanisms that might be in use, like POSIX mutexes. Also note that while -blocking on any :c:type:`!PyMutex` causes the critical sections to be +blocking on any :c:type:`PyMutex` causes the critical sections to be suspended, only the mutexes that are part of the critical sections are -released. If :c:type:`!PyMutex` is used without a critical section, it will +released. If :c:type:`PyMutex` is used without a critical section, it will not be released and therefore does not get the same deadlock avoidance. Important Considerations @@ -397,7 +397,8 @@ 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 + free-threaded build on Python 3.13 and 3.14. On Python 3.14, free-threaded + wheels will be built by default. On Python 3.13, you will need to set `CIBW_ENABLE to cpython-freethreading <https://cibuildwheel.pypa.io/en/stable/options/#enable>`_. Limited C API and Stable ABI diff --git a/Doc/howto/free-threading-python.rst b/Doc/howto/free-threading-python.rst index 24069617c47ae1..e4df7a787a2b17 100644 --- a/Doc/howto/free-threading-python.rst +++ b/Doc/howto/free-threading-python.rst @@ -116,12 +116,14 @@ after the main thread is running. The following objects are immortalized: * :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. +objects of these types may see increased memory usage under Python 3.13. This +has been addressed in the 3.14 release, where the aforementioned objects use +deferred reference counting to avoid reference count contention. 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. +returned by :func:`sys.intern` are also immortalized in the 3.13 release. This +behavior is part of the 3.14 release as well and it is expected to remain in +future free-threaded builds. Frame objects @@ -150,11 +152,12 @@ 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. +interpreter (:pep:`659`) is disabled in the free-threaded build. + +The specializing adaptive interpreter has been re-enabled in a thread-safe way +in the 3.14 release. The performance penalty on single-threaded code in +free-threaded mode is now roughly 5-10%, depending on the platform and C +compiler used. Behavioral changes From fd17ee026fa9b67f6288cbafe374a3e479fe03a5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Thu, 6 Nov 2025 13:03:59 +0200 Subject: [PATCH 1326/1674] [3.14] gh-125346: Add more base64 tests (GH-141061) (GH-141130) Add more tests for the altchars argument of b64decode() and for the map01 argument of b32decode(). (cherry picked from commit 13360efd385d1a7d0659beba03787ea3d063ef9b) --- Lib/test/test_base64.py | 65 +++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index ce2e3e3726fcd0..60880b73f3a21d 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -208,18 +208,6 @@ def test_b64decode(self): self.check_other_types(base64.b64decode, b"YWJj", b"abc") self.check_decode_type_errors(base64.b64decode) - # Test with arbitrary alternative characters - tests_altchars = {(b'01a*b$cd', b'*$'): b'\xd3V\xbeo\xf7\x1d', - } - for (data, altchars), res in tests_altchars.items(): - data_str = data.decode('ascii') - altchars_str = altchars.decode('ascii') - - eq(base64.b64decode(data, altchars=altchars), res) - eq(base64.b64decode(data_str, altchars=altchars), res) - eq(base64.b64decode(data, altchars=altchars_str), res) - eq(base64.b64decode(data_str, altchars=altchars_str), res) - # Test standard alphabet for data, res in tests.items(): eq(base64.standard_b64decode(data), res) @@ -240,6 +228,20 @@ def test_b64decode(self): b'\xd3V\xbeo\xf7\x1d') self.check_decode_type_errors(base64.urlsafe_b64decode) + def test_b64decode_altchars(self): + # Test with arbitrary alternative characters + eq = self.assertEqual + res = b'\xd3V\xbeo\xf7\x1d' + for altchars in b'*$', b'+/', b'/+', b'+_', b'-+', b'-/', b'/_': + data = b'01a%cb%ccd' % tuple(altchars) + data_str = data.decode('ascii') + altchars_str = altchars.decode('ascii') + + eq(base64.b64decode(data, altchars=altchars), res) + eq(base64.b64decode(data_str, altchars=altchars), res) + eq(base64.b64decode(data, altchars=altchars_str), res) + eq(base64.b64decode(data_str, altchars=altchars_str), res) + def test_b64decode_padding_error(self): self.assertRaises(binascii.Error, base64.b64decode, b'abc') self.assertRaises(binascii.Error, base64.b64decode, 'abc') @@ -272,9 +274,12 @@ def test_b64decode_invalid_chars(self): base64.b64decode(bstr.decode('ascii'), validate=True) # Normal alphabet characters not discarded when alternative given - res = b'\xFB\xEF\xBE\xFF\xFF\xFF' - self.assertEqual(base64.b64decode(b'++[[//]]', b'[]'), res) - self.assertEqual(base64.urlsafe_b64decode(b'++--//__'), res) + res = b'\xfb\xef\xff' + self.assertEqual(base64.b64decode(b'++//', validate=True), res) + self.assertEqual(base64.b64decode(b'++//', '-_', validate=True), res) + self.assertEqual(base64.b64decode(b'--__', '-_', validate=True), res) + self.assertEqual(base64.urlsafe_b64decode(b'++//'), res) + self.assertEqual(base64.urlsafe_b64decode(b'--__'), res) def test_b32encode(self): eq = self.assertEqual @@ -329,23 +334,33 @@ def test_b32decode_casefold(self): self.assertRaises(binascii.Error, base64.b32decode, b'me======') self.assertRaises(binascii.Error, base64.b32decode, 'me======') + def test_b32decode_map01(self): # Mapping zero and one - eq(base64.b32decode(b'MLO23456'), b'b\xdd\xad\xf3\xbe') - eq(base64.b32decode('MLO23456'), b'b\xdd\xad\xf3\xbe') - - map_tests = {(b'M1023456', b'L'): b'b\xdd\xad\xf3\xbe', - (b'M1023456', b'I'): b'b\x1d\xad\xf3\xbe', - } - for (data, map01), res in map_tests.items(): - data_str = data.decode('ascii') + eq = self.assertEqual + res_L = b'b\xdd\xad\xf3\xbe' + res_I = b'b\x1d\xad\xf3\xbe' + eq(base64.b32decode(b'MLO23456'), res_L) + eq(base64.b32decode('MLO23456'), res_L) + eq(base64.b32decode(b'MIO23456'), res_I) + eq(base64.b32decode('MIO23456'), res_I) + self.assertRaises(binascii.Error, base64.b32decode, b'M1023456') + self.assertRaises(binascii.Error, base64.b32decode, b'M1O23456') + self.assertRaises(binascii.Error, base64.b32decode, b'ML023456') + self.assertRaises(binascii.Error, base64.b32decode, b'MI023456') + + data = b'M1023456' + data_str = data.decode('ascii') + for map01, res in [(b'L', res_L), (b'I', res_I)]: map01_str = map01.decode('ascii') eq(base64.b32decode(data, map01=map01), res) eq(base64.b32decode(data_str, map01=map01), res) eq(base64.b32decode(data, map01=map01_str), res) eq(base64.b32decode(data_str, map01=map01_str), res) - self.assertRaises(binascii.Error, base64.b32decode, data) - self.assertRaises(binascii.Error, base64.b32decode, data_str) + + eq(base64.b32decode(b'M1O23456', map01=map01), res) + eq(base64.b32decode(b'M%c023456' % map01, map01=map01), res) + eq(base64.b32decode(b'M%cO23456' % map01, map01=map01), res) def test_b32decode_error(self): tests = [b'abc', b'ABCDEF==', b'==ABCDEF'] From 7168553c00767689376c8dbf5933a01af87da3a4 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:39:19 +0200 Subject: [PATCH 1327/1674] [3.14] gh-138189: Document type slots, and other constants, as part of Limited API (GH-138190) (GH-141131) (cherry picked from commit d81e1ef0f3a7c63f5d246e4cf918700016b72489) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/typeobj.rst | 200 ++++++++++++++++++++++++++ Doc/data/stable_abi.dat | 146 +++++++++++++++++++ Doc/tools/.nitignore | 1 - Doc/tools/extensions/c_annotations.py | 76 +++++++++- Misc/stable_abi.toml | 4 + Tools/build/stable_abi.py | 2 +- 6 files changed, 423 insertions(+), 6 deletions(-) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index d86b3ed730a3d1..3aff9e2d6a972d 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -676,6 +676,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: destructor PyTypeObject.tp_dealloc + .. corresponding-type-slot:: Py_tp_dealloc + A pointer to the instance destructor function. The function signature is:: void tp_dealloc(PyObject *self); @@ -860,6 +862,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: getattrfunc PyTypeObject.tp_getattr + .. corresponding-type-slot:: Py_tp_getattr + An optional pointer to the get-attribute-string function. This field is deprecated. When it is defined, it should point to a function @@ -877,6 +881,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: setattrfunc PyTypeObject.tp_setattr + .. corresponding-type-slot:: Py_tp_setattr + An optional pointer to the function for setting and deleting attributes. This field is deprecated. When it is defined, it should point to a function @@ -909,6 +915,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: reprfunc PyTypeObject.tp_repr + .. corresponding-type-slot:: Py_tp_repr + .. index:: pair: built-in function; repr An optional pointer to a function that implements the built-in function @@ -974,6 +982,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: hashfunc PyTypeObject.tp_hash + .. corresponding-type-slot:: Py_tp_hash + .. index:: pair: built-in function; hash An optional pointer to a function that implements the built-in function @@ -1015,6 +1025,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: ternaryfunc PyTypeObject.tp_call + .. corresponding-type-slot:: Py_tp_call + An optional pointer to a function that implements calling the object. This should be ``NULL`` if the object is not callable. The signature is the same as for :c:func:`PyObject_Call`:: @@ -1028,6 +1040,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: reprfunc PyTypeObject.tp_str + .. corresponding-type-slot:: Py_tp_str + An optional pointer to a function that implements the built-in operation :func:`str`. (Note that :class:`str` is a type now, and :func:`str` calls the constructor for that type. This constructor calls :c:func:`PyObject_Str` to do @@ -1053,6 +1067,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: getattrofunc PyTypeObject.tp_getattro + .. corresponding-type-slot:: Py_tp_getattro + An optional pointer to the get-attribute function. The signature is the same as for :c:func:`PyObject_GetAttr`:: @@ -1077,6 +1093,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: setattrofunc PyTypeObject.tp_setattro + .. corresponding-type-slot:: Py_tp_setattro + An optional pointer to the function for setting and deleting attributes. The signature is the same as for :c:func:`PyObject_SetAttr`:: @@ -1460,6 +1478,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: const char* PyTypeObject.tp_doc + .. corresponding-type-slot:: Py_tp_doc + An optional pointer to a NUL-terminated C string giving the docstring for this type object. This is exposed as the :attr:`~type.__doc__` attribute on the type and instances of the type. @@ -1471,6 +1491,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: traverseproc PyTypeObject.tp_traverse + .. corresponding-type-slot:: Py_tp_traverse + An optional pointer to a traversal function for the garbage collector. This is only used if the :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is set. The signature is:: @@ -1567,6 +1589,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: inquiry PyTypeObject.tp_clear + .. corresponding-type-slot:: Py_tp_clear + An optional pointer to a clear function. The signature is:: int tp_clear(PyObject *); @@ -1715,6 +1739,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: richcmpfunc PyTypeObject.tp_richcompare + .. corresponding-type-slot:: Py_tp_richcompare + An optional pointer to the rich comparison function, whose signature is:: PyObject *tp_richcompare(PyObject *self, PyObject *other, int op); @@ -1817,6 +1843,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: getiterfunc PyTypeObject.tp_iter + .. corresponding-type-slot:: Py_tp_iter + An optional pointer to a function that returns an :term:`iterator` for the object. Its presence normally signals that the instances of this type are :term:`iterable` (although sequences may be iterable without this function). @@ -1832,6 +1860,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: iternextfunc PyTypeObject.tp_iternext + .. corresponding-type-slot:: Py_tp_iternext + An optional pointer to a function that returns the next item in an :term:`iterator`. The signature is:: @@ -1855,6 +1885,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: struct PyMethodDef* PyTypeObject.tp_methods + .. corresponding-type-slot:: Py_tp_methods + An optional pointer to a static ``NULL``-terminated array of :c:type:`PyMethodDef` structures, declaring regular methods of this type. @@ -1869,6 +1901,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: struct PyMemberDef* PyTypeObject.tp_members + .. corresponding-type-slot:: Py_tp_members + An optional pointer to a static ``NULL``-terminated array of :c:type:`PyMemberDef` structures, declaring regular data members (fields or slots) of instances of this type. @@ -1884,6 +1918,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: struct PyGetSetDef* PyTypeObject.tp_getset + .. corresponding-type-slot:: Py_tp_getset + An optional pointer to a static ``NULL``-terminated array of :c:type:`PyGetSetDef` structures, declaring computed attributes of instances of this type. @@ -1898,6 +1934,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: PyTypeObject* PyTypeObject.tp_base + .. corresponding-type-slot:: Py_tp_base + An optional pointer to a base type from which type properties are inherited. At this level, only single inheritance is supported; multiple inheritance require dynamically creating a type object by calling the metatype. @@ -1970,6 +2008,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: descrgetfunc PyTypeObject.tp_descr_get + .. corresponding-type-slot:: Py_tp_descr_get + An optional pointer to a "descriptor get" function. The function signature is:: @@ -1985,6 +2025,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: descrsetfunc PyTypeObject.tp_descr_set + .. corresponding-type-slot:: Py_tp_descr_set + An optional pointer to a function for setting and deleting a descriptor's value. @@ -2045,6 +2087,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: initproc PyTypeObject.tp_init + .. corresponding-type-slot:: Py_tp_init + An optional pointer to an instance initialization function. This function corresponds to the :meth:`~object.__init__` method of classes. Like @@ -2080,6 +2124,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: allocfunc PyTypeObject.tp_alloc + .. corresponding-type-slot:: Py_tp_alloc + An optional pointer to an instance allocation function. The function signature is:: @@ -2103,6 +2149,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: newfunc PyTypeObject.tp_new + .. corresponding-type-slot:: Py_tp_new + An optional pointer to an instance creation function. The function signature is:: @@ -2142,6 +2190,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: freefunc PyTypeObject.tp_free + .. corresponding-type-slot:: Py_tp_free + An optional pointer to an instance deallocation function. Its signature is:: void tp_free(void *self); @@ -2171,6 +2221,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: inquiry PyTypeObject.tp_is_gc + .. corresponding-type-slot:: Py_tp_is_gc + An optional pointer to a function called by the garbage collector. The garbage collector needs to know whether a particular object is collectible @@ -2199,6 +2251,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: PyObject* PyTypeObject.tp_bases + .. corresponding-type-slot:: Py_tp_bases + Tuple of base types. This field should be set to ``NULL`` and treated as read-only. @@ -2279,6 +2333,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: destructor PyTypeObject.tp_del + .. corresponding-type-slot:: Py_tp_del + This field is deprecated. Use :c:member:`~PyTypeObject.tp_finalize` instead. @@ -2293,6 +2349,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: destructor PyTypeObject.tp_finalize + .. corresponding-type-slot:: Py_tp_finalize + An optional pointer to an instance finalization function. This is the C implementation of the :meth:`~object.__del__` special method. Its signature is:: @@ -2451,6 +2509,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: vectorcallfunc PyTypeObject.tp_vectorcall + .. corresponding-type-slot:: Py_tp_vectorcall + A :ref:`vectorcall function <vectorcall>` to use for calls of this type object (rather than instances). In other words, ``tp_vectorcall`` can be used to optimize ``type.__call__``, @@ -2616,42 +2676,148 @@ Number Object Structures Python 3.0.1. .. c:member:: binaryfunc PyNumberMethods.nb_add + + .. corresponding-type-slot:: Py_nb_add + .. c:member:: binaryfunc PyNumberMethods.nb_subtract + + .. corresponding-type-slot:: Py_nb_subtract + .. c:member:: binaryfunc PyNumberMethods.nb_multiply + + .. corresponding-type-slot:: Py_nb_multiply + .. c:member:: binaryfunc PyNumberMethods.nb_remainder + + .. corresponding-type-slot:: Py_nb_remainder + .. c:member:: binaryfunc PyNumberMethods.nb_divmod + + .. corresponding-type-slot:: Py_nb_divmod + .. c:member:: ternaryfunc PyNumberMethods.nb_power + + .. corresponding-type-slot:: Py_nb_power + .. c:member:: unaryfunc PyNumberMethods.nb_negative + + .. corresponding-type-slot:: Py_nb_negative + .. c:member:: unaryfunc PyNumberMethods.nb_positive + + .. corresponding-type-slot:: Py_nb_positive + .. c:member:: unaryfunc PyNumberMethods.nb_absolute + + .. corresponding-type-slot:: Py_nb_absolute + .. c:member:: inquiry PyNumberMethods.nb_bool + + .. corresponding-type-slot:: Py_nb_bool + .. c:member:: unaryfunc PyNumberMethods.nb_invert + + .. corresponding-type-slot:: Py_nb_invert + .. c:member:: binaryfunc PyNumberMethods.nb_lshift + + .. corresponding-type-slot:: Py_nb_lshift + .. c:member:: binaryfunc PyNumberMethods.nb_rshift + + .. corresponding-type-slot:: Py_nb_rshift + .. c:member:: binaryfunc PyNumberMethods.nb_and + + .. corresponding-type-slot:: Py_nb_and + .. c:member:: binaryfunc PyNumberMethods.nb_xor + + .. corresponding-type-slot:: Py_nb_xor + .. c:member:: binaryfunc PyNumberMethods.nb_or + + .. corresponding-type-slot:: Py_nb_or + .. c:member:: unaryfunc PyNumberMethods.nb_int + + .. corresponding-type-slot:: Py_nb_int + .. c:member:: void *PyNumberMethods.nb_reserved + .. c:member:: unaryfunc PyNumberMethods.nb_float + + .. corresponding-type-slot:: Py_nb_float + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_add + + .. corresponding-type-slot:: Py_nb_inplace_add + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_subtract + + .. corresponding-type-slot:: Py_nb_inplace_subtract + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_multiply + + .. corresponding-type-slot:: Py_nb_inplace_multiply + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_remainder + + .. corresponding-type-slot:: Py_nb_inplace_remainder + .. c:member:: ternaryfunc PyNumberMethods.nb_inplace_power + + .. corresponding-type-slot:: Py_nb_inplace_power + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_lshift + + .. corresponding-type-slot:: Py_nb_inplace_lshift + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_rshift + + .. corresponding-type-slot:: Py_nb_inplace_rshift + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_and + + .. corresponding-type-slot:: Py_nb_inplace_and + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_xor + + .. corresponding-type-slot:: Py_nb_inplace_xor + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_or + + .. corresponding-type-slot:: Py_nb_inplace_or + .. c:member:: binaryfunc PyNumberMethods.nb_floor_divide + + .. corresponding-type-slot:: Py_nb_floor_divide + .. c:member:: binaryfunc PyNumberMethods.nb_true_divide + + .. corresponding-type-slot:: Py_nb_true_divide + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_floor_divide + + .. corresponding-type-slot:: Py_nb_inplace_floor_divide + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_true_divide + + .. corresponding-type-slot:: Py_nb_inplace_true_divide + .. c:member:: unaryfunc PyNumberMethods.nb_index + + .. corresponding-type-slot:: Py_nb_index + .. c:member:: binaryfunc PyNumberMethods.nb_matrix_multiply + + .. corresponding-type-slot:: Py_nb_matrix_multiply + .. c:member:: binaryfunc PyNumberMethods.nb_inplace_matrix_multiply + .. corresponding-type-slot:: Py_nb_inplace_matrix_multiply + + .. _mapping-structs: @@ -2668,12 +2834,16 @@ Mapping Object Structures .. c:member:: lenfunc PyMappingMethods.mp_length + .. corresponding-type-slot:: Py_mp_length + This function is used by :c:func:`PyMapping_Size` and :c:func:`PyObject_Size`, and has the same signature. This slot may be set to ``NULL`` if the object has no defined length. .. c:member:: binaryfunc PyMappingMethods.mp_subscript + .. corresponding-type-slot:: Py_mp_subscript + This function is used by :c:func:`PyObject_GetItem` and :c:func:`PySequence_GetSlice`, and has the same signature as :c:func:`!PyObject_GetItem`. This slot must be filled for the @@ -2682,6 +2852,8 @@ Mapping Object Structures .. c:member:: objobjargproc PyMappingMethods.mp_ass_subscript + .. corresponding-type-slot:: Py_mp_ass_subscript + This function is used by :c:func:`PyObject_SetItem`, :c:func:`PyObject_DelItem`, :c:func:`PySequence_SetSlice` and :c:func:`PySequence_DelSlice`. It has the same signature as @@ -2705,6 +2877,8 @@ Sequence Object Structures .. c:member:: lenfunc PySequenceMethods.sq_length + .. corresponding-type-slot:: Py_sq_length + This function is used by :c:func:`PySequence_Size` and :c:func:`PyObject_Size`, and has the same signature. It is also used for handling negative indices via the :c:member:`~PySequenceMethods.sq_item` @@ -2712,18 +2886,24 @@ Sequence Object Structures .. c:member:: binaryfunc PySequenceMethods.sq_concat + .. corresponding-type-slot:: Py_sq_concat + This function is used by :c:func:`PySequence_Concat` and has the same signature. It is also used by the ``+`` operator, after trying the numeric addition via the :c:member:`~PyNumberMethods.nb_add` slot. .. c:member:: ssizeargfunc PySequenceMethods.sq_repeat + .. corresponding-type-slot:: Py_sq_repeat + This function is used by :c:func:`PySequence_Repeat` and has the same signature. It is also used by the ``*`` operator, after trying numeric multiplication via the :c:member:`~PyNumberMethods.nb_multiply` slot. .. c:member:: ssizeargfunc PySequenceMethods.sq_item + .. corresponding-type-slot:: Py_sq_item + This function is used by :c:func:`PySequence_GetItem` and has the same signature. It is also used by :c:func:`PyObject_GetItem`, after trying the subscription via the :c:member:`~PyMappingMethods.mp_subscript` slot. @@ -2737,6 +2917,8 @@ Sequence Object Structures .. c:member:: ssizeobjargproc PySequenceMethods.sq_ass_item + .. corresponding-type-slot:: Py_sq_ass_item + This function is used by :c:func:`PySequence_SetItem` and has the same signature. It is also used by :c:func:`PyObject_SetItem` and :c:func:`PyObject_DelItem`, after trying the item assignment and deletion @@ -2746,6 +2928,8 @@ Sequence Object Structures .. c:member:: objobjproc PySequenceMethods.sq_contains + .. corresponding-type-slot:: Py_sq_contains + This function may be used by :c:func:`PySequence_Contains` and has the same signature. This slot may be left to ``NULL``, in this case :c:func:`!PySequence_Contains` simply traverses the sequence until it @@ -2753,6 +2937,8 @@ Sequence Object Structures .. c:member:: binaryfunc PySequenceMethods.sq_inplace_concat + .. corresponding-type-slot:: Py_sq_inplace_concat + This function is used by :c:func:`PySequence_InPlaceConcat` and has the same signature. It should modify its first operand, and return it. This slot may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceConcat` @@ -2762,6 +2948,8 @@ Sequence Object Structures .. c:member:: ssizeargfunc PySequenceMethods.sq_inplace_repeat + .. corresponding-type-slot:: Py_sq_inplace_repeat + This function is used by :c:func:`PySequence_InPlaceRepeat` and has the same signature. It should modify its first operand, and return it. This slot may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceRepeat` @@ -2787,6 +2975,8 @@ Buffer Object Structures .. c:member:: getbufferproc PyBufferProcs.bf_getbuffer + .. corresponding-type-slot:: Py_bf_getbuffer + The signature of this function is:: int (PyObject *exporter, Py_buffer *view, int flags); @@ -2836,6 +3026,8 @@ Buffer Object Structures .. c:member:: releasebufferproc PyBufferProcs.bf_releasebuffer + .. corresponding-type-slot:: Py_bf_releasebuffer + The signature of this function is:: void (PyObject *exporter, Py_buffer *view); @@ -2890,6 +3082,8 @@ Async Object Structures .. c:member:: unaryfunc PyAsyncMethods.am_await + .. corresponding-type-slot:: Py_am_await + The signature of this function is:: PyObject *am_await(PyObject *self); @@ -2901,6 +3095,8 @@ Async Object Structures .. c:member:: unaryfunc PyAsyncMethods.am_aiter + .. corresponding-type-slot:: Py_am_aiter + The signature of this function is:: PyObject *am_aiter(PyObject *self); @@ -2913,6 +3109,8 @@ Async Object Structures .. c:member:: unaryfunc PyAsyncMethods.am_anext + .. corresponding-type-slot:: Py_am_anext + The signature of this function is:: PyObject *am_anext(PyObject *self); @@ -2923,6 +3121,8 @@ Async Object Structures .. c:member:: sendfunc PyAsyncMethods.am_send + .. corresponding-type-slot:: Py_am_send + The signature of this function is:: PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result); diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 3d68487d07baf2..86054f87e9f6ae 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -1,4 +1,12 @@ role,name,added,ifdef_note,struct_abi_kind +macro,METH_CLASS,3.2,, +macro,METH_COEXIST,3.2,, +macro,METH_FASTCALL,3.7,, +macro,METH_METHOD,3.7,, +macro,METH_NOARGS,3.2,, +macro,METH_O,3.2,, +macro,METH_STATIC,3.2,, +macro,METH_VARARGS,3.2,, macro,PY_VECTORCALL_ARGUMENTS_OFFSET,3.12,, func,PyAIter_Check,3.10,, func,PyArg_Parse,3.2,, @@ -8,6 +16,26 @@ func,PyArg_UnpackTuple,3.2,, func,PyArg_VaParse,3.2,, func,PyArg_VaParseTupleAndKeywords,3.2,, func,PyArg_ValidateKeywordArguments,3.2,, +macro,PyBUF_ANY_CONTIGUOUS,3.11,, +macro,PyBUF_CONTIG,3.11,, +macro,PyBUF_CONTIG_RO,3.11,, +macro,PyBUF_C_CONTIGUOUS,3.11,, +macro,PyBUF_FORMAT,3.11,, +macro,PyBUF_FULL,3.11,, +macro,PyBUF_FULL_RO,3.11,, +macro,PyBUF_F_CONTIGUOUS,3.11,, +macro,PyBUF_INDIRECT,3.11,, +macro,PyBUF_MAX_NDIM,3.11,, +macro,PyBUF_ND,3.11,, +macro,PyBUF_READ,3.11,, +macro,PyBUF_RECORDS,3.11,, +macro,PyBUF_RECORDS_RO,3.11,, +macro,PyBUF_SIMPLE,3.11,, +macro,PyBUF_STRIDED,3.11,, +macro,PyBUF_STRIDED_RO,3.11,, +macro,PyBUF_STRIDES,3.11,, +macro,PyBUF_WRITABLE,3.11,, +macro,PyBUF_WRITE,3.11,, data,PyBaseObject_Type,3.2,, func,PyBool_FromLong,3.2,, data,PyBool_Type,3.2,, @@ -836,6 +864,14 @@ func,PyWeakref_NewRef,3.2,, data,PyWrapperDescr_Type,3.2,, func,PyWrapper_New,3.2,, data,PyZip_Type,3.2,, +macro,Py_ASNATIVEBYTES_ALLOW_INDEX,3.14,, +macro,Py_ASNATIVEBYTES_BIG_ENDIAN,3.14,, +macro,Py_ASNATIVEBYTES_DEFAULTS,3.14,, +macro,Py_ASNATIVEBYTES_LITTLE_ENDIAN,3.14,, +macro,Py_ASNATIVEBYTES_NATIVE_ENDIAN,3.14,, +macro,Py_ASNATIVEBYTES_REJECT_NEGATIVE,3.14,, +macro,Py_ASNATIVEBYTES_UNSIGNED_BUFFER,3.14,, +macro,Py_AUDIT_READ,3.12,, func,Py_AddPendingCall,3.2,, func,Py_AtExit,3.2,, macro,Py_BEGIN_ALLOW_THREADS,3.2,, @@ -888,22 +924,132 @@ func,Py_NewInterpreter,3.2,, func,Py_NewRef,3.10,, func,Py_PACK_FULL_VERSION,3.14,, func,Py_PACK_VERSION,3.14,, +macro,Py_READONLY,3.12,, func,Py_REFCNT,3.14,, +macro,Py_RELATIVE_OFFSET,3.12,, 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,, +macro,Py_TPFLAGS_BASETYPE,3.2,, +macro,Py_TPFLAGS_DEFAULT,3.2,, +macro,Py_TPFLAGS_HAVE_GC,3.2,, +macro,Py_TPFLAGS_HAVE_VECTORCALL,3.12,, +macro,Py_TPFLAGS_ITEMS_AT_END,3.12,, +macro,Py_TPFLAGS_METHOD_DESCRIPTOR,3.8,, +macro,Py_TP_USE_SPEC,3.14,, func,Py_TYPE,3.14,, +macro,Py_T_BOOL,3.12,, +macro,Py_T_BYTE,3.12,, +macro,Py_T_CHAR,3.12,, +macro,Py_T_DOUBLE,3.12,, +macro,Py_T_FLOAT,3.12,, +macro,Py_T_INT,3.12,, +macro,Py_T_LONG,3.12,, +macro,Py_T_LONGLONG,3.12,, +macro,Py_T_OBJECT_EX,3.12,, +macro,Py_T_PYSSIZET,3.12,, +macro,Py_T_SHORT,3.12,, +macro,Py_T_STRING,3.12,, +macro,Py_T_STRING_INPLACE,3.12,, +macro,Py_T_UBYTE,3.12,, +macro,Py_T_UINT,3.12,, +macro,Py_T_ULONG,3.12,, +macro,Py_T_ULONGLONG,3.12,, +macro,Py_T_USHORT,3.12,, type,Py_UCS4,3.2,, macro,Py_UNBLOCK_THREADS,3.2,, data,Py_UTF8Mode,3.8,, func,Py_VaBuildValue,3.2,, data,Py_Version,3.11,, func,Py_XNewRef,3.10,, +macro,Py_am_aiter,3.5,, +macro,Py_am_anext,3.5,, +macro,Py_am_await,3.5,, +macro,Py_am_send,3.10,, +macro,Py_bf_getbuffer,3.11,, +macro,Py_bf_releasebuffer,3.11,, type,Py_buffer,3.11,,full-abi type,Py_intptr_t,3.2,, +macro,Py_mp_ass_subscript,3.2,, +macro,Py_mp_length,3.2,, +macro,Py_mp_subscript,3.2,, +macro,Py_nb_absolute,3.2,, +macro,Py_nb_add,3.2,, +macro,Py_nb_and,3.2,, +macro,Py_nb_bool,3.2,, +macro,Py_nb_divmod,3.2,, +macro,Py_nb_float,3.2,, +macro,Py_nb_floor_divide,3.2,, +macro,Py_nb_index,3.2,, +macro,Py_nb_inplace_add,3.2,, +macro,Py_nb_inplace_and,3.2,, +macro,Py_nb_inplace_floor_divide,3.2,, +macro,Py_nb_inplace_lshift,3.2,, +macro,Py_nb_inplace_matrix_multiply,3.5,, +macro,Py_nb_inplace_multiply,3.2,, +macro,Py_nb_inplace_or,3.2,, +macro,Py_nb_inplace_power,3.2,, +macro,Py_nb_inplace_remainder,3.2,, +macro,Py_nb_inplace_rshift,3.2,, +macro,Py_nb_inplace_subtract,3.2,, +macro,Py_nb_inplace_true_divide,3.2,, +macro,Py_nb_inplace_xor,3.2,, +macro,Py_nb_int,3.2,, +macro,Py_nb_invert,3.2,, +macro,Py_nb_lshift,3.2,, +macro,Py_nb_matrix_multiply,3.5,, +macro,Py_nb_multiply,3.2,, +macro,Py_nb_negative,3.2,, +macro,Py_nb_or,3.2,, +macro,Py_nb_positive,3.2,, +macro,Py_nb_power,3.2,, +macro,Py_nb_remainder,3.2,, +macro,Py_nb_rshift,3.2,, +macro,Py_nb_subtract,3.2,, +macro,Py_nb_true_divide,3.2,, +macro,Py_nb_xor,3.2,, +macro,Py_sq_ass_item,3.2,, +macro,Py_sq_concat,3.2,, +macro,Py_sq_contains,3.2,, +macro,Py_sq_inplace_concat,3.2,, +macro,Py_sq_inplace_repeat,3.2,, +macro,Py_sq_item,3.2,, +macro,Py_sq_length,3.2,, +macro,Py_sq_repeat,3.2,, type,Py_ssize_t,3.2,, +macro,Py_tp_alloc,3.2,, +macro,Py_tp_base,3.2,, +macro,Py_tp_bases,3.2,, +macro,Py_tp_call,3.2,, +macro,Py_tp_clear,3.2,, +macro,Py_tp_dealloc,3.2,, +macro,Py_tp_del,3.2,, +macro,Py_tp_descr_get,3.2,, +macro,Py_tp_descr_set,3.2,, +macro,Py_tp_doc,3.2,, +macro,Py_tp_finalize,3.5,, +macro,Py_tp_free,3.2,, +macro,Py_tp_getattr,3.2,, +macro,Py_tp_getattro,3.2,, +macro,Py_tp_getset,3.2,, +macro,Py_tp_hash,3.2,, +macro,Py_tp_init,3.2,, +macro,Py_tp_is_gc,3.2,, +macro,Py_tp_iter,3.2,, +macro,Py_tp_iternext,3.2,, +macro,Py_tp_members,3.2,, +macro,Py_tp_methods,3.2,, +macro,Py_tp_new,3.2,, +macro,Py_tp_repr,3.2,, +macro,Py_tp_richcompare,3.2,, +macro,Py_tp_setattr,3.2,, +macro,Py_tp_setattro,3.2,, +macro,Py_tp_str,3.2,, +macro,Py_tp_token,3.14,, +macro,Py_tp_traverse,3.2,, +macro,Py_tp_vectorcall,3.14,, type,Py_uintptr_t,3.2,, type,allocfunc,3.2,, type,binaryfunc,3.2,, diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 6fee1c192c3aff..04e8e5580fcd79 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -8,7 +8,6 @@ Doc/c-api/init_config.rst Doc/c-api/intro.rst Doc/c-api/module.rst Doc/c-api/stable.rst -Doc/c-api/type.rst Doc/c-api/typeobj.rst Doc/library/ast.rst Doc/library/asyncio-extending.rst diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index 089614a1f6c421..e04a5f144c449b 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -154,7 +154,10 @@ def add_annotations(app: Sphinx, doctree: nodes.document) -> None: node.insert(0, annotation) -def _stable_abi_annotation(record: StableABIEntry) -> nodes.emphasis: +def _stable_abi_annotation( + record: StableABIEntry, + is_corresponding_slot: bool = False, +) -> nodes.emphasis: """Create the Stable ABI annotation. These have two forms: @@ -168,9 +171,28 @@ def _stable_abi_annotation(record: StableABIEntry) -> nodes.emphasis: ... 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"]) + emph_node = nodes.emphasis('', '', classes=["stableabi"]) + if is_corresponding_slot: + # See "Type slot annotations" in add_annotations + ref_node = addnodes.pending_xref( + "slot ID", + refdomain="c", + reftarget="PyType_Slot", + reftype="type", + refexplicit="True", + ) + ref_node += nodes.Text(sphinx_gettext("slot ID")) + + message = sphinx_gettext("The corresponding") + emph_node += nodes.Text(" " + message + " ") + emph_node += ref_node + emph_node += nodes.Text(" ") + emph_node += nodes.literal(record.name, record.name) + message = sphinx_gettext("is part of the") + emph_node += nodes.Text(" " + message + " ") + else: + message = sphinx_gettext("Part of the") + emph_node += nodes.Text(" " + message + " ") ref_node = addnodes.pending_xref( "Stable ABI", refdomain="std", @@ -265,6 +287,51 @@ def run(self) -> list[nodes.Node]: return [node] +class CorrespondingTypeSlot(SphinxDirective): + """Type slot annotations + + Docs for these are with the corresponding field, for example, + "Py_tp_repr" is documented under "PyTypeObject.tp_repr", with + only a stable ABI note mentioning "Py_tp_repr" (and linking to + docs on how this works). + + If there is no corresponding field, these should be documented as normal + macros. + """ + + has_content = False + + required_arguments = 1 + optional_arguments = 0 + + def run(self) -> list[nodes.Node]: + name = self.arguments[0] + state = self.env.domaindata["c_annotations"] + stable_abi_data = state["stable_abi_data"] + + try: + record = stable_abi_data[name] + except LookupError as err: + raise LookupError( + f"{name} is not part of stable ABI. " + + "Document it as `c:macro::` rather than " + + "`corresponding-type-slot::`." + ) from err + + annotation = _stable_abi_annotation(record, is_corresponding_slot=True) + + node = nodes.paragraph() + content = [ + ".. c:namespace:: NULL", + "", + ".. c:macro:: " + name, + " :no-typesetting:", + ] + self.state.nested_parse(StringList(content), 0, node) + node.insert(0, annotation) + 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. @@ -281,6 +348,7 @@ 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.add_directive("corresponding-type-slot", CorrespondingTypeSlot) app.connect("builder-inited", init_annotations) app.connect("doctree-read", add_annotations) diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index d3e1f0db057023..27d57e695d3ae0 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -2293,6 +2293,10 @@ added = '3.11' [function.PyMemoryView_FromBuffer] added = '3.11' +[const.Py_bf_getbuffer] + added = '3.11' +[const.Py_bf_releasebuffer] + added = '3.11' # Constants for Py_buffer API added to this list in Python 3.11.1 (https://github.com/python/cpython/issues/98680) # (they were available with 3.11.0) diff --git a/Tools/build/stable_abi.py b/Tools/build/stable_abi.py index 1ddd76cdd9bf64..39115b331ba642 100644 --- a/Tools/build/stable_abi.py +++ b/Tools/build/stable_abi.py @@ -232,7 +232,7 @@ def sort_key(item): 'data': 'data', 'struct': 'type', 'macro': 'macro', - # 'const': 'const', # all undocumented + 'const': 'macro', 'typedef': 'type', } From cd5508d32235ec233d27ceeffb06f2203d35162b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 04:35:02 -0800 Subject: [PATCH 1328/1674] [3.14] gh-141004: Document built-in iterator types in the C API (GH-141006) (GH-141134) gh-141004: Document built-in iterator types in the C API (GH-141006) Adds documentation for each of the following: - PyEnum_Type - PyFilter_Type - PyMap_Type - PyReversed_Type - PyZip_Type In addition, PyRange_Type and PyRange_Check are also documented. (cherry picked from commit 1697cb5710f526d38816bb00ca3dcd4434e5e773) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/iterator.rst | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Doc/c-api/iterator.rst b/Doc/c-api/iterator.rst index 4b94970036f543..7eaf72ec55fd77 100644 --- a/Doc/c-api/iterator.rst +++ b/Doc/c-api/iterator.rst @@ -52,6 +52,45 @@ sentinel value is returned. *sentinel*, the iteration will be terminated. +Range Objects +^^^^^^^^^^^^^ + +.. c:var:: PyTypeObject PyRange_Type + + The type object for :class:`range` objects. + + +.. c:function:: int PyRange_Check(PyObject *o) + + Return true if the object *o* is an instance of a :class:`range` object. + This function always succeeds. + + +Builtin Iterator Types +^^^^^^^^^^^^^^^^^^^^^^ + +These are built-in iteration types that are included in Python's C API, but +provide no additional functions. They are here for completeness. + + +.. list-table:: + :widths: auto + :header-rows: 1 + + * * C type + * Python type + * * .. c:var:: PyTypeObject PyEnum_Type + * :py:class:`enumerate` + * * .. c:var:: PyTypeObject PyFilter_Type + * :py:class:`filter` + * * .. c:var:: PyTypeObject PyMap_Type + * :py:class:`map` + * * .. c:var:: PyTypeObject PyReversed_Type + * :py:class:`reversed` + * * .. c:var:: PyTypeObject PyZip_Type + * :py:class:`zip` + + Other Iterator Objects ^^^^^^^^^^^^^^^^^^^^^^ From eac7b9fa970c93fdfbf750fcc41e7be4d0d990f6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 05:56:41 -0800 Subject: [PATCH 1329/1674] [3.14] gh-141004: Document `Py_hexdigits` (GH-141059) (GH-141138) gh-141004: Document `Py_hexdigits` (GH-141059) (cherry picked from commit 54110e20e0ed0584e159c42d9f57516c1a3b997a) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/codec.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst index 08a99245ad6528..35ee048bd5fa9f 100644 --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -129,3 +129,13 @@ Registry API for Unicode encoding error handlers Replace the unicode encode error with ``\N{...}`` escapes. .. versionadded:: 3.5 + + +Codec utility variables +----------------------- + +.. c:var:: const char *Py_hexdigits + + A string constant containing the lowercase hexadecimal digits: ``"0123456789abcdef"``. + + .. versionadded:: 3.3 From 5d10409e332233e5a58c9f52ee89fec19fa8c894 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 06:07:56 -0800 Subject: [PATCH 1330/1674] [3.14] gh-141004: Document `PyLong_FromPid` and `PyLong_AsPid` (GH-141028) (GH-141142) gh-141004: Document `PyLong_FromPid` and `PyLong_AsPid` (GH-141028) (cherry picked from commit bcc524f82d8548707046ce90f5bc56f60018767a) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/long.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 8370dcecad3344..a905d4b23b76b0 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -161,6 +161,17 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionadded:: 3.13 +.. c:macro:: PyLong_FromPid(pid) + + Macro for creating a Python integer from a process identifier. + + This can be defined as an alias to :c:func:`PyLong_FromLong` or + :c:func:`PyLong_FromLongLong`, depending on the size of the system's + PID type. + + .. versionadded:: 3.2 + + .. c:function:: long PyLong_AsLong(PyObject *obj) .. index:: @@ -575,6 +586,17 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionadded:: 3.13 +.. c:macro:: PyLong_AsPid(pid) + + Macro for converting a Python integer into a process identifier. + + This can be defined as an alias to :c:func:`PyLong_AsLong`, + :c:func:`PyLong_FromLongLong`, or :c:func:`PyLong_AsInt`, depending on the + size of the system's PID type. + + .. versionadded:: 3.2 + + .. c:function:: int PyLong_GetSign(PyObject *obj, int *sign) Get the sign of the integer object *obj*. From ebf54596bf9deec056e1a9d5763c0d5a10b6e23a Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Thu, 6 Nov 2025 16:20:03 +0000 Subject: [PATCH 1331/1674] [3.14] gh-140939: Fix memory leak in `_PyBytes_FormatEx` error path (GH-140957) (#141154) (cherry picked from commit d6c89a2df2c8b7603125883494e9058a88348f66) --- Lib/test/test_bytes.py | 7 +++++++ .../2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst | 2 ++ Objects/bytesobject.c | 4 +++- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 5e57b6d0eee5ba..08119f5f769711 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -802,6 +802,13 @@ def __int__(self): with self.assertRaisesRegex(TypeError, msg): operator.mod(format_bytes, value) + def test_memory_leak_gh_140939(self): + # gh-140939: MemoryError is raised without leaking + _testcapi = import_helper.import_module('_testcapi') + with self.assertRaises(MemoryError): + b = self.type2test(b'%*b') + b % (_testcapi.PY_SSIZE_T_MAX, b'abc') + def test_imod(self): b = self.type2test(b'hello, %b!') orig = b diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst new file mode 100644 index 00000000000000..a2921761f75556 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst @@ -0,0 +1,2 @@ +Fix memory leak when :class:`bytearray` or :class:`bytes` is formated with the +``%*b`` format with a large width that results in a :exc:`MemoryError`. diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 5dd1a1f09c82f1..eb13f16f67295c 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -975,8 +975,10 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len, /* 2: size preallocated for %s */ if (alloc > 2) { res = _PyBytesWriter_Prepare(&writer, res, alloc - 2); - if (res == NULL) + if (res == NULL) { + Py_XDECREF(temp); goto error; + } } #ifndef NDEBUG char *before = res; From 5c2476a4c9b6879745543bf5c4513997ba2a65e1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 17:45:31 +0100 Subject: [PATCH 1332/1674] [3.14] gh-141004: Document `Py_GetRecursionLimit` and `Py_SetRecursionLimit` (GH-141151) (GH-141156) gh-141004: Document `Py_GetRecursionLimit` and `Py_SetRecursionLimit` (GH-141151) (cherry picked from commit 0b260305d302eace7d59931ca582a1953d894018) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/exceptions.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 3ff4631a8e53c4..9c75f66f683195 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -979,6 +979,27 @@ these are the C equivalent to :func:`reprlib.recursive_repr`. Ends a :c:func:`Py_ReprEnter`. Must be called once for each invocation of :c:func:`Py_ReprEnter` that returns zero. +.. c:function:: int Py_GetRecursionLimit(void) + + Get the recursion limit for the current interpreter. It can be set with + :c:func:`Py_SetRecursionLimit`. The recursion limit prevents the + Python interpreter stack from growing infinitely. + + This function cannot fail, and the caller must hold an + :term:`attached thread state`. + + .. seealso:: + :py:func:`sys.getrecursionlimit` + +.. c:function:: void Py_SetRecursionLimit(int new_limit) + + Set the recursion limit for the current interpreter. + + This function cannot fail, and the caller must hold an + :term:`attached thread state`. + + .. seealso:: + :py:func:`sys.setrecursionlimit` .. _standardexceptions: From 229846e841cb83821afed865f2dc5455fb090fe5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Nov 2025 18:19:30 +0100 Subject: [PATCH 1333/1674] [3.14] Minor documentation improvements (GH-140626) (#141160) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodrigo Girão Serrão <5621605+rodrigogiraoserrao@users.noreply.github.com> --- Doc/library/concurrent.interpreters.rst | 6 +++--- Doc/library/heapq.rst | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/concurrent.interpreters.rst b/Doc/library/concurrent.interpreters.rst index 41ea6af3b226e9..55036090e8d5b8 100644 --- a/Doc/library/concurrent.interpreters.rst +++ b/Doc/library/concurrent.interpreters.rst @@ -29,12 +29,12 @@ Actual concurrency is available separately through .. seealso:: :class:`~concurrent.futures.InterpreterPoolExecutor` - combines threads with interpreters in a familiar interface. + Combines threads with interpreters in a familiar interface. - .. XXX Add references to the upcoming HOWTO docs in the seealso block. + .. XXX Add references to the upcoming HOWTO docs in the seealso block. :ref:`isolating-extensions-howto` - how to update an extension module to support multiple interpreters + How to update an extension module to support multiple interpreters. :pep:`554` diff --git a/Doc/library/heapq.rst b/Doc/library/heapq.rst index 922ba0c8aa4214..4b3ef6df56adca 100644 --- a/Doc/library/heapq.rst +++ b/Doc/library/heapq.rst @@ -58,6 +58,11 @@ functions, respectively. The following functions are provided for min-heaps: +.. function:: heapify(x) + + Transform list *x* into a min-heap, in-place, in linear time. + + .. function:: heappush(heap, item) Push the value *item* onto the *heap*, maintaining the min-heap invariant. @@ -77,11 +82,6 @@ The following functions are provided for min-heaps: followed by a separate call to :func:`heappop`. -.. function:: heapify(x) - - Transform list *x* into a min-heap, in-place, in linear time. - - .. function:: heapreplace(heap, item) Pop and return the smallest item from the *heap*, and also push the new *item*. From a49d0ccdb8c621e73e7344eb4aac3e9d71b99da0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 01:29:25 +0100 Subject: [PATCH 1334/1674] [3.14] gh-141125: delete unused import textwrap in interpreter.py (GH-141126) (#141177) gh-141125: delete unused import textwrap in interpreter.py (GH-141126) (cherry picked from commit c77441ef1d1f3182280bd14d11516d54f38fe90b) Co-authored-by: yihong <zouzou0208@gmail.com> --- Lib/concurrent/futures/interpreter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/concurrent/futures/interpreter.py b/Lib/concurrent/futures/interpreter.py index 53c6e757ded2e3..85c1da2c722894 100644 --- a/Lib/concurrent/futures/interpreter.py +++ b/Lib/concurrent/futures/interpreter.py @@ -2,7 +2,6 @@ from concurrent import interpreters import sys -import textwrap from . import thread as _thread import traceback From cf48ead02b13baa01af9db88026c50cabee30739 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 11:27:14 +0100 Subject: [PATCH 1335/1674] [3.14] gh-140734: fix off-by-one error when comparing to `_SUN_PATH_MAX` (GH-140903) (#141181) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-140734: fix off-by-one error when comparing to `_SUN_PATH_MAX` (GH-140903) The limit includes a NULL terminator. (cherry picked from commit 9a199006733dae999f96c0f596c2035f4b9847b2) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/multiprocessing/util.py | 20 +++++++++++-------- ...-11-02-09-37-22.gh-issue-140734.f8gST9.rst | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index a1a537dd48dea7..549fb07c27549e 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -126,12 +126,14 @@ def is_abstract_socket_namespace(address): # Function returning a temp directory which will be removed on exit # -# Maximum length of a socket file path is usually between 92 and 108 [1], -# but Linux is known to use a size of 108 [2]. BSD-based systems usually -# use a size of 104 or 108 and Windows does not create AF_UNIX sockets. +# Maximum length of a NULL-terminated [1] socket file path is usually +# between 92 and 108 [2], but Linux is known to use a size of 108 [3]. +# BSD-based systems usually use a size of 104 or 108 and Windows does +# not create AF_UNIX sockets. # -# [1]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_un.h.html -# [2]: https://man7.org/linux/man-pages/man7/unix.7.html. +# [1]: https://github.com/python/cpython/issues/140734 +# [2]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_un.h.html +# [3]: https://man7.org/linux/man-pages/man7/unix.7.html if sys.platform == 'linux': _SUN_PATH_MAX = 108 @@ -171,11 +173,13 @@ def _get_base_temp_dir(tempfile): # generated by tempfile._RandomNameSequence, which, by design, # is 8 characters long. # - # Thus, the length of socket filename will be: + # Thus, the socket file path length (without NULL terminator) will be: # # len(base_tempdir + '/pymp-XXXXXXXX' + '/sock-XXXXXXXX') sun_path_len = len(base_tempdir) + 14 + 14 - if sun_path_len <= _SUN_PATH_MAX: + # Strict inequality to account for the NULL terminator. + # See https://github.com/python/cpython/issues/140734. + if sun_path_len < _SUN_PATH_MAX: return base_tempdir # Fallback to the default system-wide temporary directory. # This ignores user-defined environment variables. @@ -201,7 +205,7 @@ def _get_base_temp_dir(tempfile): return base_tempdir warn("Ignoring user-defined temporary directory: %s", base_tempdir) # at most max(map(len, dirlist)) + 14 + 14 = 36 characters - assert len(base_system_tempdir) + 14 + 14 <= _SUN_PATH_MAX + assert len(base_system_tempdir) + 14 + 14 < _SUN_PATH_MAX return base_system_tempdir def get_temp_dir(): diff --git a/Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst b/Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst new file mode 100644 index 00000000000000..46582f7fcf417c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst @@ -0,0 +1,2 @@ +:mod:`multiprocessing`: fix off-by-one error when checking the length +of a temporary socket file path. Patch by Bénédikt Tran. From cb8b2bad346996716462d1fc73c298a68dceedf9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 12:14:51 +0100 Subject: [PATCH 1336/1674] [3.14] gh-141141: Make base64.b85decode() thread safe (GH-141149) (GH-141184) (cherry picked from commit a7bf27f7f521384a8964718bdb58a5cb113bb3ec) Co-authored-by: Benel Tayar <86257734+beneltayar@users.noreply.github.com> --- Lib/base64.py | 7 +++++-- .../Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst diff --git a/Lib/base64.py b/Lib/base64.py index 5d78cc09f40cd3..cfc57626c40ba9 100644 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -462,9 +462,12 @@ def b85decode(b): # Delay the initialization of tables to not waste memory # if the function is never called if _b85dec is None: - _b85dec = [None] * 256 + # we don't assign to _b85dec directly to avoid issues when + # multiple threads call this function simultaneously + b85dec_tmp = [None] * 256 for i, c in enumerate(_b85alphabet): - _b85dec[c] = i + b85dec_tmp[c] = i + _b85dec = b85dec_tmp b = _bytes_from_decode_data(b) padding = (-len(b)) % 5 diff --git a/Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst b/Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst new file mode 100644 index 00000000000000..f59ccfb33e7669 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst @@ -0,0 +1 @@ +Fix a thread safety issue with :func:`base64.b85decode`. Contributed by Benel Tayar. From d729087c0674aaa52f4f0b98ac5f5c24b278f295 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:50:06 +0100 Subject: [PATCH 1337/1674] [3.14] gh-139246: zero-width word paste can be wrong in default repl (GH-139254) (GH-140796) gh-139246: zero-width word paste can be wrong in default repl (GH-139254) (cherry picked from commit 4e6dba0ef74523a52f66547c16b9972664b18fd4) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: grayjk <grayjk@gmail.com> --- Lib/_pyrepl/utils.py | 6 +++++ Lib/test/test_pyrepl/test_utils.py | 23 ++++++++++++++++++- ...-09-23-09-46-46.gh-issue-139246.pzfM-w.rst | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst diff --git a/Lib/_pyrepl/utils.py b/Lib/_pyrepl/utils.py index 64708e843b685b..06cddef851bb40 100644 --- a/Lib/_pyrepl/utils.py +++ b/Lib/_pyrepl/utils.py @@ -63,6 +63,12 @@ class ColorSpan(NamedTuple): def str_width(c: str) -> int: if ord(c) < 128: return 1 + # gh-139246 for zero-width joiner and combining characters + if unicodedata.combining(c): + return 0 + category = unicodedata.category(c) + if category == "Cf" and c != "\u00ad": + return 0 w = unicodedata.east_asian_width(c) if w in ("N", "Na", "H", "A"): return 1 diff --git a/Lib/test/test_pyrepl/test_utils.py b/Lib/test/test_pyrepl/test_utils.py index 05a4f329059835..656a1e441e0e47 100644 --- a/Lib/test/test_pyrepl/test_utils.py +++ b/Lib/test/test_pyrepl/test_utils.py @@ -5,10 +5,29 @@ class TestUtils(TestCase): def test_str_width(self): - characters = ['a', '1', '_', '!', '\x1a', '\u263A', '\uffb9'] + characters = [ + 'a', + '1', + '_', + '!', + '\x1a', + '\u263A', + '\uffb9', + '\N{LATIN SMALL LETTER E WITH ACUTE}', # é + '\N{LATIN SMALL LETTER E WITH CEDILLA}', # ȩ + '\u00ad', + ] for c in characters: self.assertEqual(str_width(c), 1) + zero_width_characters = [ + '\N{COMBINING ACUTE ACCENT}', + '\N{ZERO WIDTH JOINER}', + ] + for c in zero_width_characters: + with self.subTest(character=c): + self.assertEqual(str_width(c), 0) + characters = [chr(99989), chr(99999)] for c in characters: self.assertEqual(str_width(c), 2) @@ -25,6 +44,8 @@ def test_wlen(self): self.assertEqual(wlen('hello'), 5) self.assertEqual(wlen('hello' + '\x1a'), 7) + self.assertEqual(wlen('e\N{COMBINING ACUTE ACCENT}'), 1) + self.assertEqual(wlen('a\N{ZERO WIDTH JOINER}b'), 2) def test_prev_next_window(self): def gen_normal(): diff --git a/Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst b/Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst new file mode 100644 index 00000000000000..a816bda5cfe8e8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst @@ -0,0 +1 @@ +fix: paste zero-width in default repl width is wrong. From 7c3539bd0934436af03b019bccb912b4fbd93e3b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:23:29 +0100 Subject: [PATCH 1338/1674] [3.14] Clarify argument/result ownership/validity for PyModule_* functions (GH-141159) (GH-141190) (cherry picked from commit ffd64737d00277eea1c4721d278a0951168d07ca) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/module.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index 976fa4a2fa0da8..bc844582ff4377 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -13,7 +13,7 @@ Module Objects .. index:: single: ModuleType (in module types) This instance of :c:type:`PyTypeObject` represents the Python module type. This - is exposed to Python programs as ``types.ModuleType``. + is exposed to Python programs as :py:class:`types.ModuleType`. .. c:function:: int PyModule_Check(PyObject *p) @@ -71,6 +71,9 @@ Module Objects ``PyObject_*`` functions rather than directly manipulate a module's :attr:`~object.__dict__`. + The returned reference is borrowed from the module; it is valid until + the module is destroyed. + .. c:function:: PyObject* PyModule_GetNameObject(PyObject *module) @@ -90,6 +93,10 @@ Module Objects Similar to :c:func:`PyModule_GetNameObject` but return the name encoded to ``'utf-8'``. + The returned buffer is only valid until the module is renamed or destroyed. + Note that Python code may rename a module by setting its :py:attr:`~module.__name__` + attribute. + .. c:function:: void* PyModule_GetState(PyObject *module) Return the "state" of the module, that is, a pointer to the block of memory @@ -126,6 +133,9 @@ Module Objects Similar to :c:func:`PyModule_GetFilenameObject` but return the filename encoded to 'utf-8'. + The returned buffer is only valid until the module's :py:attr:`~module.__file__` attribute + is reassigned or the module is destroyed. + .. deprecated:: 3.2 :c:func:`PyModule_GetFilename` raises :exc:`UnicodeEncodeError` on unencodable filenames, use :c:func:`PyModule_GetFilenameObject` instead. @@ -649,6 +659,9 @@ or code that creates modules dynamically. :c:type:`PyMethodDef` arrays; in that case they should call this function directly. + The *functions* array must be statically allocated (or otherwise guaranteed + to outlive the module object). + .. versionadded:: 3.5 .. c:function:: int PyModule_SetDocString(PyObject *module, const char *docstring) From 28493a5a6262c66f69114f4a71528007ad9338be Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:40:59 +0100 Subject: [PATCH 1339/1674] [3.14] Update NaNs handling description in `c-api/float.rst` (GH-141179) (#141194) Update NaNs handling description in `c-api/float.rst` (GH-141179) Clarified the behavior of NaNs on IEEE platforms regarding signaling and quiet NaNs. (cherry picked from commit 920286d6b296f9971fc79e14ec22966f8f7a7b90) Co-authored-by: W. H. Wang <mattwang44@gmail.com> --- Doc/c-api/float.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 1085c32a537071..edee498a0b80f3 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -113,8 +113,8 @@ NaNs (if such things exist on the platform) isn't handled correctly, and attempting to unpack a bytes string containing an IEEE INF or NaN will raise an exception. -Note that NaNs type may not be preserved on IEEE platforms (silent NaN become -quiet), for example on x86 systems in 32-bit mode. +Note that NaNs type may not be preserved on IEEE platforms (signaling NaN become +quiet NaN), for example on x86 systems in 32-bit mode. On non-IEEE platforms with more precision, or larger dynamic range, than IEEE 754 supports, not all values can be packed; on non-IEEE platforms with less From 9f8ec95bb079c86c82a397516ea5da0b2cc1033d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:16:43 +0100 Subject: [PATCH 1340/1674] [3.14] gh-141004: Document `PyCapsule_Type` (GH-141079) (GH-141199) gh-141004: Document `PyCapsule_Type` (GH-141079) (cherry picked from commit 7af9b5354dd7633df422b9f720633989b3090199) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/capsule.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/c-api/capsule.rst b/Doc/c-api/capsule.rst index 6da020efc7f27c..03a848d68ed7ab 100644 --- a/Doc/c-api/capsule.rst +++ b/Doc/c-api/capsule.rst @@ -22,6 +22,12 @@ Refer to :ref:`using-capsules` for more information on using these objects. loaded modules. +.. c:var:: PyTypeObject PyCapsule_Type + + The type object corresponding to capsule objects. This is the same object + as :class:`types.CapsuleType` in the Python layer. + + .. c:type:: PyCapsule_Destructor The type of a destructor callback for a capsule. Defined as:: From b59832041a573615550cc0bb70cb1aebeaca34d9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 17:26:40 +0100 Subject: [PATCH 1341/1674] [3.14] gh-141004: Document `PyErr_WarnExplicitFormat` (GH-141187) (GH-141202) gh-141004: Document `PyErr_WarnExplicitFormat` (GH-141187) (cherry picked from commit 9420795b47ac88f31315a8d1041e2c66c2cd9a8b) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/exceptions.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 9c75f66f683195..b6f9399337eb86 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -394,6 +394,15 @@ an error value). .. versionadded:: 3.2 +.. c:function:: int PyErr_WarnExplicitFormat(PyObject *category, const char *filename, int lineno, const char *module, PyObject *registry, const char *format, ...) + + Similar to :c:func:`PyErr_WarnExplicit`, but uses + :c:func:`PyUnicode_FromFormat` to format the warning message. *format* is + an ASCII-encoded string. + + .. versionadded:: 3.2 + + .. 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 From b3377c3b417cb3b3162623eeba740cb366df35d5 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 7 Nov 2025 20:38:26 +0200 Subject: [PATCH 1342/1674] [3.14] gh-140826: Update winreg's docstring (GH-141050) (GH-141200) (cherry picked from commit bea0d3d12bcd122d8498b92cdd6c724822fd6505) Co-authored-by: AN Long <aisk@users.noreply.github.com> --- PC/winreg.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PC/winreg.c b/PC/winreg.c index b7b26411f2b1e9..fc649e10bac944 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -51,6 +51,7 @@ PyDoc_STRVAR(module_doc, "CreateKey() - Creates the specified key, or opens it if it already exists.\n" "DeleteKey() - Deletes the specified key.\n" "DeleteValue() - Removes a named value from the specified registry key.\n" +"DeleteTree() - Deletes the specified key and all its subkeys and values recursively.\n" "EnumKey() - Enumerates subkeys of the specified open registry key.\n" "EnumValue() - Enumerates values of the specified open registry key.\n" "ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ\n" @@ -101,7 +102,9 @@ PyDoc_STRVAR(PyHKEY_doc, "\n" "Operations:\n" "__bool__ - Handles with an open object return true, otherwise false.\n" -"__int__ - Converting a handle to an integer returns the Win32 handle."); +"__int__ - Converting a handle to an integer returns the Win32 handle.\n" +"__enter__, __exit__ - Context manager support for 'with' statement,\n" +"automatically closes handle."); From 5dc8ecc5bc8c16e783ba9c50a8077be95c42b10e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Nov 2025 19:52:45 +0100 Subject: [PATCH 1343/1674] [3.14] gh-141004: Document `PyTraceBack*` APIs (GH-141192) (GH-141210) gh-141004: Document `PyTraceBack*` APIs (GH-141192) (cherry picked from commit d13ee0ae186f4704f3b6016dd52f7727b81f9194) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/exceptions.rst | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index b6f9399337eb86..f525ee7a0461fe 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -1237,3 +1237,37 @@ Warning types .. versionadded:: 3.10 :c:data:`PyExc_EncodingWarning`. + + +Tracebacks +========== + +.. c:var:: PyTypeObject PyTraceBack_Type + + Type object for traceback objects. This is available as + :class:`types.TracebackType` in the Python layer. + + +.. c:function:: int PyTraceBack_Check(PyObject *op) + + Return true if *op* is a traceback object, false otherwise. This function + does not account for subtypes. + + +.. c:function:: int PyTraceBack_Here(PyFrameObject *f) + + Replace the :attr:`~BaseException.__traceback__` attribute on the current + exception with a new traceback prepending *f* to the existing chain. + + Calling this function without an exception set is undefined behavior. + + This function returns ``0`` on success, and returns ``-1`` with an + exception set on failure. + + +.. c:function:: int PyTraceBack_Print(PyObject *tb, PyObject *f) + + Write the traceback *tb* into the file *f*. + + This function returns ``0`` on success, and returns ``-1`` with an + exception set on failure. From de00dde9dedcf727956b4ff0f3b26230f1081583 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:19:34 +0100 Subject: [PATCH 1344/1674] [3.14] gh-141004: Document `Py_HASH_*` macros (GH-141205) (#141225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gh-141004: Document `Py_HASH_*` macros (GH-141205) (cherry picked from commit 3989e12d39bfe2587e5ba80873c37e0c2d449088) (cherry picked from commit 8cec3d3a9d827aadc7008ab4312121fcf28329c6) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/c-api/hash.rst | 54 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/hash.rst b/Doc/c-api/hash.rst index b5fe93573a1456..ecd604c81bcc02 100644 --- a/Doc/c-api/hash.rst +++ b/Doc/c-api/hash.rst @@ -11,42 +11,94 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. .. versionadded:: 3.2 + .. c:type:: Py_uhash_t Hash value type: unsigned integer. .. versionadded:: 3.2 + +.. c:macro:: Py_HASH_ALGORITHM + + A numerical value indicating the algorithm for hashing of :class:`str`, + :class:`bytes`, and :class:`memoryview`. + + The algorithm name is exposed by :data:`sys.hash_info.algorithm`. + + .. versionadded:: 3.4 + + +.. c:macro:: Py_HASH_FNV + Py_HASH_SIPHASH24 + Py_HASH_SIPHASH13 + + Numerical values to compare to :c:macro:`Py_HASH_ALGORITHM` to determine + which algorithm is used for hashing. The hash algorithm can be configured + via the configure :option:`--with-hash-algorithm` option. + + .. versionadded:: 3.4 + Add :c:macro:`!Py_HASH_FNV` and :c:macro:`!Py_HASH_SIPHASH24`. + + .. versionadded:: 3.11 + Add :c:macro:`!Py_HASH_SIPHASH13`. + + +.. c:macro:: Py_HASH_CUTOFF + + Buffers of length in range ``[1, Py_HASH_CUTOFF)`` are hashed using DJBX33A + instead of the algorithm described by :c:macro:`Py_HASH_ALGORITHM`. + + - A :c:macro:`!Py_HASH_CUTOFF` of 0 disables the optimization. + - :c:macro:`!Py_HASH_CUTOFF` must be non-negative and less or equal than 7. + + 32-bit platforms should use a cutoff smaller than 64-bit platforms because + it is easier to create colliding strings. A cutoff of 7 on 64-bit platforms + and 5 on 32-bit platforms should provide a decent safety margin. + + .. versionadded:: 3.4 + + .. c:macro:: PyHASH_MODULUS - The `Mersenne prime <https://en.wikipedia.org/wiki/Mersenne_prime>`_ ``P = 2**n -1``, used for numeric hash scheme. + The `Mersenne prime <https://en.wikipedia.org/wiki/Mersenne_prime>`_ ``P = 2**n -1``, + used for numeric hash scheme. + This corresponds to the :data:`sys.hash_info.modulus` constant. .. versionadded:: 3.13 + .. c:macro:: PyHASH_BITS The exponent ``n`` of ``P`` in :c:macro:`PyHASH_MODULUS`. + This corresponds to the :data:`sys.hash_info.hash_bits` constant. .. 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. + This corresponds to the :data:`sys.hash_info.inf` constant. .. versionadded:: 3.13 + .. c:macro:: PyHASH_IMAG The multiplier used for the imaginary part of a complex number. + This corresponds to the :data:`sys.hash_info.imag` constant. .. versionadded:: 3.13 + .. c:type:: PyHash_FuncDef Hash function definition used by :c:func:`PyHash_GetFuncDef`. From 24619962e01f54e5e2be6f170723027b2ead809a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:32:44 +0100 Subject: [PATCH 1345/1674] [3.14] gh-140793: Improve documentatation and tests for the ensure_ascii option in the json module (GH-140906) (GH-141227) * Document that ensure_ascii=True forces escaping not only non-ASCII, but also non-printable characters (the only affected ASCII character is U+007F). * Ensure that the help output for the json module does not exceed 80 columns (except one long line in an example and generated lines). * Add more tests. (cherry picked from commit 7e90bac3cc6fd68fe6696ab4bce1262751de7531) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Doc/library/json.rst | 14 +++-- Lib/json/__init__.py | 52 +++++++++++-------- Lib/json/decoder.py | 8 +-- Lib/json/encoder.py | 20 +++---- .../test_json/test_encode_basestring_ascii.py | 3 +- Lib/test/test_json/test_unicode.py | 35 +++++++++++++ 6 files changed, 89 insertions(+), 43 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 12a5a96a3c56f3..8b4217c210d5b3 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -183,8 +183,10 @@ Basic Usage :param bool ensure_ascii: If ``True`` (the default), the output is guaranteed to - have all incoming non-ASCII characters escaped. - If ``False``, these characters will be outputted as-is. + have all incoming non-ASCII and non-printable characters escaped. + If ``False``, all characters will be outputted as-is, except for + the characters that must be escaped: quotation mark, reverse solidus, + and the control characters U+0000 through U+001F. :param bool check_circular: If ``False``, the circular reference check for container types is skipped @@ -495,8 +497,10 @@ Encoders and Decoders :class:`bool` or ``None``. If *skipkeys* is true, such items are simply skipped. If *ensure_ascii* is true (the default), the output is guaranteed to - have all incoming non-ASCII characters escaped. If *ensure_ascii* is - false, these characters will be output as-is. + have all incoming non-ASCII and non-printable characters escaped. + If *ensure_ascii* is false, all characters will be output as-is, except for + the characters that must be escaped: quotation mark, reverse solidus, + and the control characters U+0000 through U+001F. If *check_circular* is true (the default), then lists, dicts, and custom encoded objects will be checked for circular references during encoding to @@ -636,7 +640,7 @@ UTF-32, with UTF-8 being the recommended default for maximum interoperability. As permitted, though not required, by the RFC, this module's serializer sets *ensure_ascii=True* by default, thus escaping the output so that the resulting -strings only contain ASCII characters. +strings only contain printable ASCII characters. Other than the *ensure_ascii* parameter, this module is defined strictly in terms of conversion between Python objects and diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py index 1d972d22ded072..9eaa4f3fbc1679 100644 --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -128,8 +128,9 @@ def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, instead of raising a ``TypeError``. If ``ensure_ascii`` is false, then the strings written to ``fp`` can - contain non-ASCII characters if they appear in strings contained in - ``obj``. Otherwise, all such characters are escaped in JSON strings. + contain non-ASCII and non-printable characters if they appear in strings + contained in ``obj``. Otherwise, all such characters are escaped in JSON + strings. If ``check_circular`` is false, then the circular reference check for container types will be skipped and a circular reference will @@ -145,10 +146,11 @@ def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, level of 0 will only insert newlines. ``None`` is the most compact representation. - If specified, ``separators`` should be an ``(item_separator, key_separator)`` - tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and - ``(',', ': ')`` otherwise. To get the most compact JSON representation, - you should specify ``(',', ':')`` to eliminate whitespace. + If specified, ``separators`` should be an ``(item_separator, + key_separator)`` tuple. The default is ``(', ', ': ')`` if *indent* is + ``None`` and ``(',', ': ')`` otherwise. To get the most compact JSON + representation, you should specify ``(',', ':')`` to eliminate + whitespace. ``default(obj)`` is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. @@ -189,9 +191,10 @@ def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, (``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped instead of raising a ``TypeError``. - If ``ensure_ascii`` is false, then the return value can contain non-ASCII - characters if they appear in strings contained in ``obj``. Otherwise, all - such characters are escaped in JSON strings. + If ``ensure_ascii`` is false, then the return value can contain + non-ASCII and non-printable characters if they appear in strings + contained in ``obj``. Otherwise, all such characters are escaped in + JSON strings. If ``check_circular`` is false, then the circular reference check for container types will be skipped and a circular reference will @@ -207,10 +210,11 @@ def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, level of 0 will only insert newlines. ``None`` is the most compact representation. - If specified, ``separators`` should be an ``(item_separator, key_separator)`` - tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and - ``(',', ': ')`` otherwise. To get the most compact JSON representation, - you should specify ``(',', ':')`` to eliminate whitespace. + If specified, ``separators`` should be an ``(item_separator, + key_separator)`` tuple. The default is ``(', ', ': ')`` if *indent* is + ``None`` and ``(',', ': ')`` otherwise. To get the most compact JSON + representation, you should specify ``(',', ':')`` to eliminate + whitespace. ``default(obj)`` is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. @@ -281,11 +285,12 @@ def load(fp, *, cls=None, object_hook=None, parse_float=None, ``object_hook`` will be used instead of the ``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 ``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 any object literal decoded with an ordered list of pairs. + The return value of ``object_pairs_hook`` will be used instead of the + ``dict``. This feature can be used to implement custom decoders. If + ``object_hook`` is also defined, the ``object_pairs_hook`` takes + priority. To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` kwarg; otherwise ``JSONDecoder`` is used. @@ -306,11 +311,12 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, ``object_hook`` will be used instead of the ``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 ``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 any object literal decoded with an ordered list of pairs. + The return value of ``object_pairs_hook`` will be used instead of the + ``dict``. This feature can be used to implement custom decoders. If + ``object_hook`` is also defined, the ``object_pairs_hook`` takes + priority. ``parse_float``, if specified, will be called with the string of every JSON float to be decoded. By default this is equivalent to diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py index ff4bfcdcc407b9..92ad6352557640 100644 --- a/Lib/json/decoder.py +++ b/Lib/json/decoder.py @@ -297,10 +297,10 @@ def __init__(self, *, object_hook=None, parse_float=None, place of the given ``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 ``dict``. - This feature can be used to implement custom decoders. + ``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 + ``dict``. This feature can be used to implement custom decoders. If ``object_hook`` is also defined, the ``object_pairs_hook`` takes priority. diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index bc446e0f377a11..5cf6d64f3eade6 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -111,9 +111,10 @@ def __init__(self, *, skipkeys=False, ensure_ascii=True, encoding of keys that are not str, int, float, bool or None. If skipkeys is True, such items are simply skipped. - If ensure_ascii is true, the output is guaranteed to be str - objects with all incoming non-ASCII characters escaped. If - ensure_ascii is false, the output can contain non-ASCII characters. + If ensure_ascii is true, the output is guaranteed to be str objects + with all incoming non-ASCII and non-printable characters escaped. + If ensure_ascii is false, the output can contain non-ASCII and + non-printable characters. If check_circular is true, then lists, dicts, and custom encoded objects will be checked for circular references during encoding to @@ -134,14 +135,15 @@ def __init__(self, *, skipkeys=False, ensure_ascii=True, indent level. An indent level of 0 will only insert newlines. None is the most compact representation. - If specified, separators should be an (item_separator, key_separator) - tuple. The default is (', ', ': ') if *indent* is ``None`` and - (',', ': ') otherwise. To get the most compact JSON representation, - you should specify (',', ':') to eliminate whitespace. + If specified, separators should be an (item_separator, + key_separator) tuple. The default is (', ', ': ') if *indent* is + ``None`` and (',', ': ') otherwise. To get the most compact JSON + representation, you should specify (',', ':') to eliminate + whitespace. If specified, default is a function that gets called for objects - that can't otherwise be serialized. It should return a JSON encodable - version of the object or raise a ``TypeError``. + that can't otherwise be serialized. It should return a JSON + encodable version of the object or raise a ``TypeError``. """ diff --git a/Lib/test/test_json/test_encode_basestring_ascii.py b/Lib/test/test_json/test_encode_basestring_ascii.py index 6a39b72a09df35..c90d3e968e5ef9 100644 --- a/Lib/test/test_json/test_encode_basestring_ascii.py +++ b/Lib/test/test_json/test_encode_basestring_ascii.py @@ -8,13 +8,12 @@ ('\u0123\u4567\u89ab\ucdef\uabcd\uef4a', '"\\u0123\\u4567\\u89ab\\ucdef\\uabcd\\uef4a"'), ('controls', '"controls"'), ('\x08\x0c\n\r\t', '"\\b\\f\\n\\r\\t"'), + ('\x00\x1f\x7f', '"\\u0000\\u001f\\u007f"'), ('{"object with 1 member":["array with 1 element"]}', '"{\\"object with 1 member\\":[\\"array with 1 element\\"]}"'), (' s p a c e d ', '" s p a c e d "'), ('\U0001d120', '"\\ud834\\udd20"'), ('\u03b1\u03a9', '"\\u03b1\\u03a9"'), ("`1~!@#$%^&*()_+-={':[,]}|;.</>?", '"`1~!@#$%^&*()_+-={\':[,]}|;.</>?"'), - ('\x08\x0c\n\r\t', '"\\b\\f\\n\\r\\t"'), - ('\u0123\u4567\u89ab\ucdef\uabcd\uef4a', '"\\u0123\\u4567\\u89ab\\ucdef\\uabcd\\uef4a"'), ] class TestEncodeBasestringAscii: diff --git a/Lib/test/test_json/test_unicode.py b/Lib/test/test_json/test_unicode.py index 68629cceeb9be9..1aa9546dc46306 100644 --- a/Lib/test/test_json/test_unicode.py +++ b/Lib/test/test_json/test_unicode.py @@ -32,6 +32,29 @@ def test_encoding7(self): j = self.dumps(u + "\n", ensure_ascii=False) self.assertEqual(j, f'"{u}\\n"') + def test_ascii_non_printable_encode(self): + u = '\b\t\n\f\r\x00\x1f\x7f' + self.assertEqual(self.dumps(u), + '"\\b\\t\\n\\f\\r\\u0000\\u001f\\u007f"') + self.assertEqual(self.dumps(u, ensure_ascii=False), + '"\\b\\t\\n\\f\\r\\u0000\\u001f\x7f"') + + def test_ascii_non_printable_decode(self): + self.assertEqual(self.loads('"\\b\\t\\n\\f\\r"'), + '\b\t\n\f\r') + s = ''.join(map(chr, range(32))) + for c in s: + self.assertRaises(self.JSONDecodeError, self.loads, f'"{c}"') + self.assertEqual(self.loads(f'"{s}"', strict=False), s) + self.assertEqual(self.loads('"\x7f"'), '\x7f') + + def test_escaped_decode(self): + self.assertEqual(self.loads('"\\b\\t\\n\\f\\r"'), '\b\t\n\f\r') + self.assertEqual(self.loads('"\\"\\\\\\/"'), '"\\/') + for c in set(map(chr, range(0x100))) - set('"\\/bfnrt'): + self.assertRaises(self.JSONDecodeError, self.loads, f'"\\{c}"') + self.assertRaises(self.JSONDecodeError, self.loads, f'"\\{c}"', strict=False) + def test_big_unicode_encode(self): u = '\U0001d120' self.assertEqual(self.dumps(u), '"\\ud834\\udd20"') @@ -48,6 +71,18 @@ def test_unicode_decode(self): s = f'"\\u{i:04x}"' self.assertEqual(self.loads(s), u) + def test_single_surrogate_encode(self): + self.assertEqual(self.dumps('\uD83D'), '"\\ud83d"') + self.assertEqual(self.dumps('\uD83D', ensure_ascii=False), '"\ud83d"') + self.assertEqual(self.dumps('\uDC0D'), '"\\udc0d"') + self.assertEqual(self.dumps('\uDC0D', ensure_ascii=False), '"\udc0d"') + + def test_single_surrogate_decode(self): + self.assertEqual(self.loads('"\uD83D"'), '\ud83d') + self.assertEqual(self.loads('"\\uD83D"'), '\ud83d') + self.assertEqual(self.loads('"\udc0d"'), '\udc0d') + self.assertEqual(self.loads('"\\udc0d"'), '\udc0d') + def test_unicode_preservation(self): self.assertEqual(type(self.loads('""')), str) self.assertEqual(type(self.loads('"a"')), str) From 1a080199aff6d98b476ab19e409d7ca4d56cb3c6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Sat, 8 Nov 2025 13:16:45 +0200 Subject: [PATCH 1346/1674] [3.14] gh-140615: Update docstrings in the fcntl module (GH-140619) (GH-141231) * Refer to bytes objects or bytes-like objects instead of strings. * Remove backticks -- they do not have effect on formatting. * Re-wrap lines to ensure the pydoc output fits in 80 columns. (cherry picked from commit 610377056bad696915d70590429e68002bee9006) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Modules/clinic/fcntlmodule.c.h | 92 ++++++++++++++++-------------- Modules/fcntlmodule.c | 100 +++++++++++++++++---------------- 2 files changed, 102 insertions(+), 90 deletions(-) diff --git a/Modules/clinic/fcntlmodule.c.h b/Modules/clinic/fcntlmodule.c.h index 00a929064ba700..85bfdefdded027 100644 --- a/Modules/clinic/fcntlmodule.c.h +++ b/Modules/clinic/fcntlmodule.c.h @@ -6,17 +6,23 @@ PyDoc_STRVAR(fcntl_fcntl__doc__, "fcntl($module, fd, cmd, arg=0, /)\n" "--\n" "\n" -"Perform the operation `cmd` on file descriptor fd.\n" +"Perform the operation cmd on file descriptor fd.\n" "\n" -"The values used for `cmd` are operating system dependent, and are available\n" -"as constants in the fcntl module, using the same names as used in\n" -"the relevant C header files. The argument arg is optional, and\n" -"defaults to 0; it may be an int or a string. If arg is given as a string,\n" -"the return value of fcntl is a string of that length, containing the\n" -"resulting value put in the arg buffer by the operating system. The length\n" -"of the arg string is not allowed to exceed 1024 bytes. If the arg given\n" -"is an integer or if none is specified, the result value is an integer\n" -"corresponding to the return value of the fcntl call in the C code."); +"The values used for cmd are operating system dependent, and are\n" +"available as constants in the fcntl module, using the same names as used\n" +"in the relevant C header files. The argument arg is optional, and\n" +"defaults to 0; it may be an integer, a bytes-like object or a string.\n" +"If arg is given as a string, it will be encoded to binary using the\n" +"UTF-8 encoding.\n" +"\n" +"If the arg given is an integer or if none is specified, the result value\n" +"is an integer corresponding to the return value of the fcntl() call in\n" +"the C code.\n" +"\n" +"If arg is given as a bytes-like object, the return value of fcntl() is a\n" +"bytes object of that length, containing the resulting value put in the\n" +"arg buffer by the operating system. The length of the arg buffer is not\n" +"allowed to exceed 1024 bytes."); #define FCNTL_FCNTL_METHODDEF \ {"fcntl", (PyCFunction)(void(*)(void))fcntl_fcntl, METH_FASTCALL, fcntl_fcntl__doc__}, @@ -63,34 +69,34 @@ PyDoc_STRVAR(fcntl_ioctl__doc__, "ioctl($module, fd, request, arg=0, mutate_flag=True, /)\n" "--\n" "\n" -"Perform the operation `request` on file descriptor `fd`.\n" +"Perform the operation request on file descriptor fd.\n" "\n" -"The values used for `request` are operating system dependent, and are available\n" -"as constants in the fcntl or termios library modules, using the same names as\n" -"used in the relevant C header files.\n" +"The values used for request are operating system dependent, and are\n" +"available as constants in the fcntl or termios library modules, using\n" +"the same names as used in the relevant C header files.\n" "\n" -"The argument `arg` is optional, and defaults to 0; it may be an int or a\n" -"buffer containing character data (most likely a string or an array).\n" +"The argument arg is optional, and defaults to 0; it may be an integer, a\n" +"bytes-like object or a string. If arg is given as a string, it will be\n" +"encoded to binary using the UTF-8 encoding.\n" "\n" -"If the argument is a mutable buffer (such as an array) and if the\n" -"mutate_flag argument (which is only allowed in this case) is true then the\n" -"buffer is (in effect) passed to the operating system and changes made by\n" -"the OS will be reflected in the contents of the buffer after the call has\n" -"returned. The return value is the integer returned by the ioctl system\n" -"call.\n" +"If the arg given is an integer or if none is specified, the result value\n" +"is an integer corresponding to the return value of the ioctl() call in\n" +"the C code.\n" "\n" -"If the argument is a mutable buffer and the mutable_flag argument is false,\n" -"the behavior is as if a string had been passed.\n" +"If the argument is a mutable buffer (such as a bytearray) and the\n" +"mutate_flag argument is true (default) then the buffer is (in effect)\n" +"passed to the operating system and changes made by the OS will be\n" +"reflected in the contents of the buffer after the call has returned.\n" +"The return value is the integer returned by the ioctl() system call.\n" "\n" -"If the argument is an immutable buffer (most likely a string) then a copy\n" -"of the buffer is passed to the operating system and the return value is a\n" -"string of the same length containing whatever the operating system put in\n" -"the buffer. The length of the arg buffer in this case is not allowed to\n" -"exceed 1024 bytes.\n" +"If the argument is a mutable buffer and the mutable_flag argument is\n" +"false, the behavior is as if an immutable buffer had been passed.\n" "\n" -"If the arg given is an integer or if none is specified, the result value is\n" -"an integer corresponding to the return value of the ioctl call in the C\n" -"code."); +"If the argument is an immutable buffer then a copy of the buffer is\n" +"passed to the operating system and the return value is a bytes object of\n" +"the same length containing whatever the operating system put in the\n" +"buffer. The length of the arg buffer in this case is not allowed to\n" +"exceed 1024 bytes."); #define FCNTL_IOCTL_METHODDEF \ {"ioctl", (PyCFunction)(void(*)(void))fcntl_ioctl, METH_FASTCALL, fcntl_ioctl__doc__}, @@ -147,7 +153,7 @@ PyDoc_STRVAR(fcntl_flock__doc__, "flock($module, fd, operation, /)\n" "--\n" "\n" -"Perform the lock operation `operation` on file descriptor `fd`.\n" +"Perform the lock operation on file descriptor fd.\n" "\n" "See the Unix manual page for flock(2) for details (On some systems, this\n" "function is emulated using fcntl())."); @@ -189,22 +195,22 @@ PyDoc_STRVAR(fcntl_lockf__doc__, "\n" "A wrapper around the fcntl() locking calls.\n" "\n" -"`fd` is the file descriptor of the file to lock or unlock, and operation is one\n" -"of the following values:\n" +"fd is the file descriptor of the file to lock or unlock, and operation\n" +"is one of the following values:\n" "\n" " LOCK_UN - unlock\n" " LOCK_SH - acquire a shared lock\n" " LOCK_EX - acquire an exclusive lock\n" "\n" "When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with\n" -"LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the\n" -"lock cannot be acquired, an OSError will be raised and the exception will\n" -"have an errno attribute set to EACCES or EAGAIN (depending on the operating\n" -"system -- for portability, check for either value).\n" +"LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and\n" +"the lock cannot be acquired, an OSError will be raised and the exception\n" +"will have an errno attribute set to EACCES or EAGAIN (depending on the\n" +"operating system -- for portability, check for either value).\n" "\n" -"`len` is the number of bytes to lock, with the default meaning to lock to\n" -"EOF. `start` is the byte offset, relative to `whence`, to that the lock\n" -"starts. `whence` is as with fileobj.seek(), specifically:\n" +"len is the number of bytes to lock, with the default meaning to lock to\n" +"EOF. start is the byte offset, relative to whence, to that the lock\n" +"starts. whence is as with fileobj.seek(), specifically:\n" "\n" " 0 - relative to the start of the file (SEEK_SET)\n" " 1 - relative to the current buffer position (SEEK_CUR)\n" @@ -264,4 +270,4 @@ fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=65a16bc64c7b4de4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a9345d258926adb7 input=a9049054013a1b77]*/ diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 220ee9ecdffc8a..690882e34a8e2c 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -41,22 +41,28 @@ fcntl.fcntl arg: object(c_default='NULL') = 0 / -Perform the operation `cmd` on file descriptor fd. - -The values used for `cmd` are operating system dependent, and are available -as constants in the fcntl module, using the same names as used in -the relevant C header files. The argument arg is optional, and -defaults to 0; it may be an int or a string. If arg is given as a string, -the return value of fcntl is a string of that length, containing the -resulting value put in the arg buffer by the operating system. The length -of the arg string is not allowed to exceed 1024 bytes. If the arg given -is an integer or if none is specified, the result value is an integer -corresponding to the return value of the fcntl call in the C code. +Perform the operation cmd on file descriptor fd. + +The values used for cmd are operating system dependent, and are +available as constants in the fcntl module, using the same names as used +in the relevant C header files. The argument arg is optional, and +defaults to 0; it may be an integer, a bytes-like object or a string. +If arg is given as a string, it will be encoded to binary using the +UTF-8 encoding. + +If the arg given is an integer or if none is specified, the result value +is an integer corresponding to the return value of the fcntl() call in +the C code. + +If arg is given as a bytes-like object, the return value of fcntl() is a +bytes object of that length, containing the resulting value put in the +arg buffer by the operating system. The length of the arg buffer is not +allowed to exceed 1024 bytes. [clinic start generated code]*/ static PyObject * fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) -/*[clinic end generated code: output=888fc93b51c295bd input=7955340198e5f334]*/ +/*[clinic end generated code: output=888fc93b51c295bd input=56c6d6196a4854df]*/ { int ret; int async_err = 0; @@ -135,40 +141,40 @@ fcntl.ioctl mutate_flag as mutate_arg: bool = True / -Perform the operation `request` on file descriptor `fd`. +Perform the operation request on file descriptor fd. -The values used for `request` are operating system dependent, and are available -as constants in the fcntl or termios library modules, using the same names as -used in the relevant C header files. +The values used for request are operating system dependent, and are +available as constants in the fcntl or termios library modules, using +the same names as used in the relevant C header files. -The argument `arg` is optional, and defaults to 0; it may be an int or a -buffer containing character data (most likely a string or an array). +The argument arg is optional, and defaults to 0; it may be an integer, a +bytes-like object or a string. If arg is given as a string, it will be +encoded to binary using the UTF-8 encoding. -If the argument is a mutable buffer (such as an array) and if the -mutate_flag argument (which is only allowed in this case) is true then the -buffer is (in effect) passed to the operating system and changes made by -the OS will be reflected in the contents of the buffer after the call has -returned. The return value is the integer returned by the ioctl system -call. +If the arg given is an integer or if none is specified, the result value +is an integer corresponding to the return value of the ioctl() call in +the C code. -If the argument is a mutable buffer and the mutable_flag argument is false, -the behavior is as if a string had been passed. +If the argument is a mutable buffer (such as a bytearray) and the +mutate_flag argument is true (default) then the buffer is (in effect) +passed to the operating system and changes made by the OS will be +reflected in the contents of the buffer after the call has returned. +The return value is the integer returned by the ioctl() system call. -If the argument is an immutable buffer (most likely a string) then a copy -of the buffer is passed to the operating system and the return value is a -string of the same length containing whatever the operating system put in -the buffer. The length of the arg buffer in this case is not allowed to -exceed 1024 bytes. +If the argument is a mutable buffer and the mutable_flag argument is +false, the behavior is as if an immutable buffer had been passed. -If the arg given is an integer or if none is specified, the result value is -an integer corresponding to the return value of the ioctl call in the C -code. +If the argument is an immutable buffer then a copy of the buffer is +passed to the operating system and the return value is a bytes object of +the same length containing whatever the operating system put in the +buffer. The length of the arg buffer in this case is not allowed to +exceed 1024 bytes. [clinic start generated code]*/ static PyObject * fcntl_ioctl_impl(PyObject *module, int fd, unsigned long code, PyObject *arg, int mutate_arg) -/*[clinic end generated code: output=f72baba2454d7a62 input=9c6cca5e2c339622]*/ +/*[clinic end generated code: output=f72baba2454d7a62 input=b69717a5588e086e]*/ { /* We use the unsigned non-checked 'I' format for the 'code' parameter because the system expects it to be a 32bit bit field value @@ -290,7 +296,7 @@ fcntl.flock operation as code: int / -Perform the lock operation `operation` on file descriptor `fd`. +Perform the lock operation on file descriptor fd. See the Unix manual page for flock(2) for details (On some systems, this function is emulated using fcntl()). @@ -298,7 +304,7 @@ function is emulated using fcntl()). static PyObject * fcntl_flock_impl(PyObject *module, int fd, int code) -/*[clinic end generated code: output=84059e2b37d2fc64 input=0bfc00f795953452]*/ +/*[clinic end generated code: output=84059e2b37d2fc64 input=ade68943e8599f0a]*/ { int ret; int async_err = 0; @@ -361,22 +367,22 @@ fcntl.lockf A wrapper around the fcntl() locking calls. -`fd` is the file descriptor of the file to lock or unlock, and operation is one -of the following values: +fd is the file descriptor of the file to lock or unlock, and operation +is one of the following values: LOCK_UN - unlock LOCK_SH - acquire a shared lock LOCK_EX - acquire an exclusive lock When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with -LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the -lock cannot be acquired, an OSError will be raised and the exception will -have an errno attribute set to EACCES or EAGAIN (depending on the operating -system -- for portability, check for either value). +LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and +the lock cannot be acquired, an OSError will be raised and the exception +will have an errno attribute set to EACCES or EAGAIN (depending on the +operating system -- for portability, check for either value). -`len` is the number of bytes to lock, with the default meaning to lock to -EOF. `start` is the byte offset, relative to `whence`, to that the lock -starts. `whence` is as with fileobj.seek(), specifically: +len is the number of bytes to lock, with the default meaning to lock to +EOF. start is the byte offset, relative to whence, to that the lock +starts. whence is as with fileobj.seek(), specifically: 0 - relative to the start of the file (SEEK_SET) 1 - relative to the current buffer position (SEEK_CUR) @@ -386,7 +392,7 @@ starts. `whence` is as with fileobj.seek(), specifically: static PyObject * fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, PyObject *startobj, int whence) -/*[clinic end generated code: output=4985e7a172e7461a input=5480479fc63a04b8]*/ +/*[clinic end generated code: output=4985e7a172e7461a input=369bef4d7a1c5ff4]*/ { int ret; int async_err = 0; From 41944be1e1ea4491c903f697a79be8369dca8c2f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 13:28:01 +0100 Subject: [PATCH 1347/1674] [3.14] gh-141004: correctly document `Py_HASH_*` and `PyHASH_*` as `hash_info` attributes (GH-141233) (#141234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141004: correctly document `Py_HASH_*` and `PyHASH_*` as `hash_info` attributes (GH-141233) (cherry picked from commit 87942d911b8bc9e83caee3c0b699f0b0ba15daa9) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/c-api/hash.rst | 12 +++++++++++- Doc/library/sys.rst | 6 +++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/hash.rst b/Doc/c-api/hash.rst index ecd604c81bcc02..1ad712b0ce4f2b 100644 --- a/Doc/c-api/hash.rst +++ b/Doc/c-api/hash.rst @@ -56,6 +56,8 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. it is easier to create colliding strings. A cutoff of 7 on 64-bit platforms and 5 on 32-bit platforms should provide a decent safety margin. + This corresponds to the :data:`sys.hash_info.cutoff` constant. + .. versionadded:: 3.4 @@ -63,6 +65,7 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. The `Mersenne prime <https://en.wikipedia.org/wiki/Mersenne_prime>`_ ``P = 2**n -1``, used for numeric hash scheme. + This corresponds to the :data:`sys.hash_info.modulus` constant. .. versionadded:: 3.13 @@ -71,7 +74,6 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. .. c:macro:: PyHASH_BITS The exponent ``n`` of ``P`` in :c:macro:`PyHASH_MODULUS`. - This corresponds to the :data:`sys.hash_info.hash_bits` constant. .. versionadded:: 3.13 @@ -86,6 +88,7 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. .. c:macro:: PyHASH_INF The hash value returned for a positive infinity. + This corresponds to the :data:`sys.hash_info.inf` constant. .. versionadded:: 3.13 @@ -94,6 +97,7 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. .. c:macro:: PyHASH_IMAG The multiplier used for the imaginary part of a complex number. + This corresponds to the :data:`sys.hash_info.imag` constant. .. versionadded:: 3.13 @@ -111,14 +115,20 @@ See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. Hash function name (UTF-8 encoded string). + This corresponds to the :data:`sys.hash_info.algorithm` constant. + .. c:member:: const int hash_bits Internal size of the hash value in bits. + This corresponds to the :data:`sys.hash_info.hash_bits` constant. + .. c:member:: const int seed_bits Size of seed input in bits. + This corresponds to the :data:`sys.hash_info.seed_bits` constant. + .. versionadded:: 3.4 diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 4c02a77489e1e4..1a25a9365a0319 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1130,10 +1130,14 @@ always available. Unless explicitly noted otherwise, all variables are read-only The size of the seed key of the hash algorithm + .. attribute:: hash_info.cutoff + + Cutoff for small string DJBX33A optimization in range ``[1, cutoff)``. + .. versionadded:: 3.2 .. versionchanged:: 3.4 - Added *algorithm*, *hash_bits* and *seed_bits* + Added *algorithm*, *hash_bits*, *seed_bits*, and *cutoff*. .. data:: hexversion From 7db06be57f1b7a7776884c3aefbc4df1b189a95f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 16:02:35 +0100 Subject: [PATCH 1348/1674] [3.14] gh-141246: Link to correct Windows docs in `time.sleep()` doc (GH-141248) (#141251) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141246: Link to correct Windows docs in `time.sleep()` doc (GH-141248) (cherry picked from commit 6545a4e8f83c27996fc771ed7c8c96ae0ce8d2e0) Co-authored-by: 莯凛 <1348292515@qq.com> --- Doc/library/time.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 43e402a4bf9d1b..a8b721b59df348 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -396,9 +396,9 @@ Functions On Windows, if *secs* is zero, the thread relinquishes the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread - continues execution. On Windows 8.1 and newer the implementation uses + continues execution. On Windows 10 and newer the implementation uses a `high-resolution timer - <https://learn.microsoft.com/windows-hardware/drivers/kernel/high-resolution-timers>`_ + <https://learn.microsoft.com/windows/win32/api/synchapi/nf-synchapi-createwaitabletimerexw>`_ which provides resolution of 100 nanoseconds. If *secs* is zero, ``Sleep(0)`` is used. .. rubric:: Unix implementation From 6c50a72efe795f403bb508ea23d43756dc4a00aa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 16:54:06 +0100 Subject: [PATCH 1349/1674] [3.14] gh-141004: Document `PyErr_ProgramTextObject` and `PyErr_ProgramText` (GH-141250) (GH-141256) gh-141004: Document `PyErr_ProgramTextObject` and `PyErr_ProgramText` (GH-141250) (cherry picked from commit be1c72a45d54cdd35e0a830e18224c4c74be808c) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/exceptions.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index f525ee7a0461fe..c58aa659e1b1b4 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -331,6 +331,23 @@ For convenience, some of these functions will always return a use. +.. c:function:: PyObject *PyErr_ProgramTextObject(PyObject *filename, int lineno) + + Get the source line in *filename* at line *lineno*. *filename* should be a + Python :class:`str` object. + + On success, this function returns a Python string object with the found line. + On failure, this function returns ``NULL`` without an exception set. + + +.. c:function:: PyObject *PyErr_ProgramText(const char *filename, int lineno) + + Similar to :c:func:`PyErr_ProgramTextObject`, but *filename* is a + :c:expr:`const char *`, which is decoded with the + :term:`filesystem encoding and error handler`, instead of a + Python object reference. + + Issuing warnings ================ From ba0b8214ea4b6ff640c6fd383de158364421634d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 18:36:00 +0100 Subject: [PATCH 1350/1674] [3.14] gh-141004: Document `PyBUF_WRITEABLE` (GH-141255) (GH-141261) gh-141004: Document `PyBUF_WRITEABLE` (GH-141255) (cherry picked from commit 5e5fc0404ed983bb37a19793a5c802d0d9852e5d) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/buffer.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index d3081894eadaf5..6bb72a2312be3b 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -261,6 +261,10 @@ readonly, format 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_WRITEABLE + + This is a :term:`soft deprecated` alias to :c:macro:`PyBUF_WRITABLE`. + .. c:macro:: PyBUF_FORMAT Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST From f98211852a419ca2038e0de7f830ea9db6b20f23 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 19:18:04 +0100 Subject: [PATCH 1351/1674] [3.14] gh-141004: Document the `PyDoc_VAR` macro (GH-141263) (GH-141264) gh-141004: Document the `PyDoc_VAR` macro (GH-141263) (cherry picked from commit 545299773b40fb589cbd5e54d1d597207d9a2a76) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/intro.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 36bb8d7438a4d7..d6512a9ef2de48 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -235,7 +235,7 @@ complete listing. .. c:macro:: PyDoc_STRVAR(name, str) - Creates a variable with name ``name`` that can be used in docstrings. + Creates a variable with name *name* that can be used in docstrings. If Python is built without docstrings, the value will be empty. Use :c:macro:`PyDoc_STRVAR` for docstrings to support building @@ -267,6 +267,15 @@ complete listing. {NULL, NULL} }; +.. c:macro:: PyDoc_VAR(name) + + Declares a static character array variable with the given name *name*. + + For example:: + + PyDoc_VAR(python_doc) = PyDoc_STR("A genus of constricting snakes in the Pythonidae family native " + "to the tropics and subtropics of the Eastern Hemisphere."); + .. _api-objects: From d8a2b8a4f8981f543df6ab32fe0015a6f5dc262a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Nov 2025 20:27:41 +0100 Subject: [PATCH 1352/1674] [3.14] gh-141004: Document `Py_BUILD_ASSERT*` macros (GH-141266) (GH-141269) gh-141004: Document `Py_BUILD_ASSERT*` macros (GH-141266) (cherry picked from commit 0ac890bea79d3e0162c8909b0999f626f1141d89) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/intro.rst | 23 +++++++++++++++++++++++ Doc/conf.py | 3 --- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index d6512a9ef2de48..096e4d34f664d9 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -233,6 +233,29 @@ complete listing. .. versionadded:: 3.4 +.. c:macro:: Py_BUILD_ASSERT(cond) + + Asserts a compile-time condition *cond*, as a statement. + The build will fail if the condition is false or cannot be evaluated at compile time. + + For example:: + + Py_BUILD_ASSERT(sizeof(PyTime_t) == sizeof(int64_t)); + + .. versionadded:: 3.3 + +.. c:macro:: Py_BUILD_ASSERT_EXPR(cond) + + Asserts a compile-time condition *cond*, as an expression that evaluates to ``0``. + The build will fail if the condition is false or cannot be evaluated at compile time. + + For example:: + + #define foo_to_char(foo) \ + ((char *)(foo) + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0)) + + .. versionadded:: 3.3 + .. c:macro:: PyDoc_STRVAR(name, str) Creates a variable with name *name* that can be used in docstrings. diff --git a/Doc/conf.py b/Doc/conf.py index f1dda10052e109..0f1412d1007dc2 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -226,9 +226,6 @@ # Temporary undocumented names. # In future this list must be empty. nitpick_ignore += [ - # 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. From 432432bfc8a2a2cc99d8037fb6a83c977d9eb663 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 11:19:09 +0100 Subject: [PATCH 1353/1674] [3.14] gh-141127: Clarify os.symlink() documentation for argument order (GH-141144) (#141278) gh-141127: Clarify os.symlink() documentation for argument order (GH-141144) (cherry picked from commit 7ae440f262c99ba9a3327237f83c9290dc963028) Co-authored-by: Chilla Kalyan <127284726+chillakalyan@users.noreply.github.com> --- Doc/library/os.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index aa102745328272..4286e94ddb6c72 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3505,6 +3505,9 @@ features: Create a symbolic link pointing to *src* named *dst*. + The *src* parameter refers to the target of the link (the file or directory being linked to), + and *dst* is the name of the link being created. + 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 From d6b4f4b10fd70f62ee22f158f1ddbca00d5fe607 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:11:43 +0100 Subject: [PATCH 1354/1674] [3.14] gh-100218: correctly set `errno` when `socket.if_{nametoindex,indextoname}` raise `OSError` (GH-140905) (#141284) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-100218: correctly set `errno` when `socket.if_{nametoindex,indextoname}` raise `OSError` (GH-140905) Previously, socket.if_nametoindex() and socket.if_indextoname() could raise an `OSError` with a `None` errno. Now, the errno from libc is propagated. (cherry picked from commit 3ce2d57b2f02030353af314d89c5f6215d2f5c96) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_socket.py | 10 ++++++++-- .../2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst | 3 +++ Modules/socketmodule.c | 5 +++-- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index cfb9619341b324..e66160c5236261 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1174,7 +1174,10 @@ def testInterfaceNameIndex(self): 'socket.if_indextoname() not available.') @support.skip_android_selinux('if_indextoname') def testInvalidInterfaceIndexToName(self): - self.assertRaises(OSError, socket.if_indextoname, 0) + with self.assertRaises(OSError) as cm: + socket.if_indextoname(0) + self.assertIsNotNone(cm.exception.errno) + self.assertRaises(ValueError, socket.if_indextoname, -1) self.assertRaises(OverflowError, socket.if_indextoname, 2**1000) self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF') @@ -1194,8 +1197,11 @@ def testInvalidInterfaceIndexToName(self): 'socket.if_nametoindex() not available.') @support.skip_android_selinux('if_nametoindex') def testInvalidInterfaceNameToIndex(self): + with self.assertRaises(OSError) as cm: + socket.if_nametoindex("_DEADBEEF") + self.assertIsNotNone(cm.exception.errno) + self.assertRaises(TypeError, socket.if_nametoindex, 0) - self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF') @unittest.skipUnless(hasattr(sys, 'getrefcount'), 'test needs sys.getrefcount()') diff --git a/Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst b/Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst new file mode 100644 index 00000000000000..2f7500d295578b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst @@ -0,0 +1,3 @@ +Correctly set :attr:`~OSError.errno` when :func:`socket.if_nametoindex` or +:func:`socket.if_indextoname` raise an :exc:`OSError`. Patch by Bénédikt +Tran. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c90b693dd2d62b..1fbd6eb9294cfa 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7277,10 +7277,10 @@ _socket_if_nametoindex_impl(PyObject *module, PyObject *oname) unsigned long index; #endif + errno = ENODEV; // in case 'if_nametoindex' does not set errno index = if_nametoindex(PyBytes_AS_STRING(oname)); if (index == 0) { - /* if_nametoindex() doesn't set errno */ - PyErr_SetString(PyExc_OSError, "no interface with this name"); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -7300,6 +7300,7 @@ static PyObject * _socket_if_indextoname_impl(PyObject *module, NET_IFINDEX index) /*[clinic end generated code: output=e48bc324993052e0 input=c93f753d0cf6d7d1]*/ { + errno = ENXIO; // in case 'if_indextoname' does not set errno char name[IF_NAMESIZE + 1]; if (if_indextoname(index, name) == NULL) { PyErr_SetFromErrno(PyExc_OSError); From 7905374d5091668f8612e825877bbc954b7f13f2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 16:12:52 +0100 Subject: [PATCH 1355/1674] [3.14] gh-141004: Document deprecated aliases for memory allocation (GH-141146) (GH-141288) gh-141004: Document deprecated aliases for memory allocation (GH-141146) (cherry picked from commit 1d738dea6364de004f8cec7c6309d6bbd3b996c7) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/allocation.rst | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/allocation.rst b/Doc/c-api/allocation.rst index 59d913a0462382..59044d2d88cc16 100644 --- a/Doc/c-api/allocation.rst +++ b/Doc/c-api/allocation.rst @@ -140,10 +140,6 @@ Allocating Objects on the Heap * :c:member:`~PyTypeObject.tp_alloc` -.. c:function:: void PyObject_Del(void *op) - - Same as :c:func:`PyObject_Free`. - .. c:var:: PyObject _Py_NoneStruct Object which is visible in Python as ``None``. This should only be accessed @@ -156,3 +152,35 @@ Allocating Objects on the Heap :ref:`moduleobjects` To allocate and create extension modules. + +Deprecated aliases +^^^^^^^^^^^^^^^^^^ + +These are :term:`soft deprecated` aliases to existing functions and macros. +They exist solely for backwards compatibility. + + +.. list-table:: + :widths: auto + :header-rows: 1 + + * * Deprecated alias + * Function + * * .. c:macro:: PyObject_NEW(type, typeobj) + * :c:macro:`PyObject_New` + * * .. c:macro:: PyObject_NEW_VAR(type, typeobj, n) + * :c:macro:`PyObject_NewVar` + * * .. c:macro:: PyObject_INIT(op, typeobj) + * :c:func:`PyObject_Init` + * * .. c:macro:: PyObject_INIT_VAR(op, typeobj, n) + * :c:func:`PyObject_InitVar` + * * .. c:macro:: PyObject_MALLOC(n) + * :c:func:`PyObject_Malloc` + * * .. c:macro:: PyObject_REALLOC(p, n) + * :c:func:`PyObject_Realloc` + * * .. c:macro:: PyObject_FREE(p) + * :c:func:`PyObject_Free` + * * .. c:macro:: PyObject_DEL(p) + * :c:func:`PyObject_Free` + * * .. c:macro:: PyObject_Del(p) + * :c:func:`PyObject_Free` From afa52a101e0f7991d4c33ca2c2d0db1818e6c21f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 16:40:20 +0100 Subject: [PATCH 1356/1674] [3.14] gh-141004: Document `PyWeakref_CheckRefExact` (GH-141279) (GH-141290) gh-141004: Document `PyWeakref_CheckRefExact` (GH-141279) (cherry picked from commit 60155329a0a83a2b9e740f0c0de41c9d44f5a053) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/weakref.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index c3c6cf413dcef5..9b263bd11d787f 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -19,7 +19,14 @@ as much as it can. .. c:function:: int PyWeakref_CheckRef(PyObject *ob) - Return non-zero if *ob* is a reference object. This function always succeeds. + Return non-zero if *ob* is a reference object or a subclass of the reference + type. This function always succeeds. + + +.. c:function:: int PyWeakref_CheckRefExact(PyObject *ob) + + Return non-zero if *ob* is a reference object, but not a subclass of the + reference type. This function always succeeds. .. c:function:: int PyWeakref_CheckProxy(PyObject *ob) From cb458715a6e52d83ddb3173ef1d7d3aa20c242d5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 16:50:21 +0100 Subject: [PATCH 1357/1674] [3.14] gh-141004: document `curses` C API (GH-141254) (#141292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141004: document `curses` C API (GH-141254) (cherry picked from commit dbe40904a78a0c8ffa25fb64e6ff1e14e6e7ba5a) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/c-api/concrete.rst | 10 ++- Doc/c-api/curses.rst | 138 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 Doc/c-api/curses.rst diff --git a/Doc/c-api/concrete.rst b/Doc/c-api/concrete.rst index 880f7b15ce68e8..a5c5a53236c9a4 100644 --- a/Doc/c-api/concrete.rst +++ b/Doc/c-api/concrete.rst @@ -115,5 +115,13 @@ Other Objects gen.rst coro.rst contextvars.rst - datetime.rst typehints.rst + + +C API for extension modules +=========================== + +.. toctree:: + + curses.rst + datetime.rst diff --git a/Doc/c-api/curses.rst b/Doc/c-api/curses.rst new file mode 100644 index 00000000000000..5a1697c43cc969 --- /dev/null +++ b/Doc/c-api/curses.rst @@ -0,0 +1,138 @@ +.. highlight:: c + +Curses C API +------------ + +:mod:`curses` exposes a small C interface for extension modules. +Consumers must include the header file :file:`py_curses.h` (which is not +included by default by :file:`Python.h`) and :c:func:`import_curses` must +be invoked, usually as part of the module initialisation function, to populate +:c:var:`PyCurses_API`. + +.. warning:: + + Neither the C API nor the pure Python :mod:`curses` module are compatible + with subinterpreters. + +.. c:macro:: import_curses() + + Import the curses C API. The macro does not need a semi-colon to be called. + + On success, populate the :c:var:`PyCurses_API` pointer. + + On failure, set :c:var:`PyCurses_API` to NULL and set an exception. + The caller must check if an error occurred via :c:func:`PyErr_Occurred`: + + .. code-block:: + + import_curses(); // semi-colon is optional but recommended + if (PyErr_Occurred()) { /* cleanup */ } + + +.. c:var:: void **PyCurses_API + + Dynamically allocated object containing the curses C API. + This variable is only available once :c:macro:`import_curses` succeeds. + + ``PyCurses_API[0]`` corresponds to :c:data:`PyCursesWindow_Type`. + + ``PyCurses_API[1]``, ``PyCurses_API[2]``, and ``PyCurses_API[3]`` + are pointers to predicate functions of type ``int (*)(void)``. + + When called, these predicates return whether :func:`curses.setupterm`, + :func:`curses.initscr`, and :func:`curses.start_color` have been called + respectively. + + See also the convenience macros :c:macro:`PyCursesSetupTermCalled`, + :c:macro:`PyCursesInitialised`, and :c:macro:`PyCursesInitialisedColor`. + + .. note:: + + The number of entries in this structure is subject to changes. + Consider using :c:macro:`PyCurses_API_pointers` to check if + new fields are available or not. + + +.. c:macro:: PyCurses_API_pointers + + The number of accessible fields (``4``) in :c:var:`PyCurses_API`. + This number is incremented whenever new fields are added. + + +.. c:var:: PyTypeObject PyCursesWindow_Type + + The :ref:`heap type <heap-types>` corresponding to :class:`curses.window`. + + +.. c:function:: int PyCursesWindow_Check(PyObject *op) + + Return true if *op* is a :class:`curses.window` instance, false otherwise. + + +The following macros are convenience macros expanding into C statements. +In particular, they can only be used as ``macro;`` or ``macro``, but not +``macro()`` or ``macro();``. + +.. c:macro:: PyCursesSetupTermCalled + + Macro checking if :func:`curses.setupterm` has been called. + + The macro expansion is roughly equivalent to: + + .. code-block:: + + { + typedef int (*predicate_t)(void); + predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1]; + if (!was_setupterm_called()) { + return NULL; + } + } + + +.. c:macro:: PyCursesInitialised + + Macro checking if :func:`curses.initscr` has been called. + + The macro expansion is roughly equivalent to: + + .. code-block:: + + { + typedef int (*predicate_t)(void); + predicate_t was_initscr_called = (predicate_t)PyCurses_API[2]; + if (!was_initscr_called()) { + return NULL; + } + } + + +.. c:macro:: PyCursesInitialisedColor + + Macro checking if :func:`curses.start_color` has been called. + + The macro expansion is roughly equivalent to: + + .. code-block:: + + { + typedef int (*predicate_t)(void); + predicate_t was_start_color_called = (predicate_t)PyCurses_API[3]; + if (!was_start_color_called()) { + return NULL; + } + } + + +Internal data +------------- + +The following objects are exposed by the C API but should be considered +internal-only. + +.. c:macro:: PyCurses_CAPSULE_NAME + + Name of the curses capsule to pass to :c:func:`PyCapsule_Import`. + + Internal usage only. Use :c:macro:`import_curses` instead. + From d7aace78e96044d83608d19fdef23f818134f300 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:04:26 +0100 Subject: [PATCH 1358/1674] [3.14] gh-140530: fix a reference leak in an error path for `raise exc from cause` (GH-140908) (#141282) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-140530: fix a reference leak in an error path for `raise exc from cause` (GH-140908) Fix a reference leak in `raise E from T` when `T` is an exception subtype for which `T.__new__` does not return an exception instance. (cherry picked from commit 0c77e7c23b5c270a3142105542c56c59b59c52a0) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_raise.py | 18 +++++++----------- ...5-11-02-12-47-38.gh-issue-140530.S934bp.rst | 2 ++ Python/ceval.c | 1 + 3 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py index dcf0753bc828f3..645ef291a58499 100644 --- a/Lib/test/test_raise.py +++ b/Lib/test/test_raise.py @@ -186,18 +186,14 @@ def test_class_cause(self): self.fail("No exception raised") def test_class_cause_nonexception_result(self): - class ConstructsNone(BaseException): - @classmethod + # See https://github.com/python/cpython/issues/140530. + class ConstructMortal(BaseException): def __new__(*args, **kwargs): - return None - try: - raise IndexError from ConstructsNone - except TypeError as e: - self.assertIn("should have returned an instance of BaseException", str(e)) - except IndexError: - self.fail("Wrong kind of exception raised") - else: - self.fail("No exception raised") + return ["mortal value"] + + msg = ".*should have returned an instance of BaseException.*" + with self.assertRaisesRegex(TypeError, msg): + raise IndexError from ConstructMortal def test_instance_cause(self): cause = KeyError() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst new file mode 100644 index 00000000000000..e3af493893afcb --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst @@ -0,0 +1,2 @@ +Fix a reference leak when ``raise exc from cause`` fails. Patch by Bénédikt +Tran. diff --git a/Python/ceval.c b/Python/ceval.c index a181d1861d0131..6ce20af62e7249 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2108,6 +2108,7 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) "calling %R should have returned an instance of " "BaseException, not %R", cause, Py_TYPE(fixed_cause)); + Py_DECREF(fixed_cause); goto raise_error; } Py_DECREF(cause); From a8b27305e8d34514219b4a7ed69b679ef1d64827 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:27:53 +0100 Subject: [PATCH 1359/1674] [3.14] gh-141004: Document `Py_func_type_input` (GH-141273) (GH-141298) gh-141004: Document `Py_func_type_input` (GH-141273) (cherry picked from commit 8dd849828636bb3989c6d5d20f8790a3fb770fc4) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/veryhigh.rst | 87 ++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 0b2b55b6387bd1..916c616dfee589 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -13,8 +13,9 @@ the interpreter. Several of these functions accept a start symbol from the grammar as a parameter. The available start symbols are :c:data:`Py_eval_input`, -:c:data:`Py_file_input`, and :c:data:`Py_single_input`. These are described -following the functions which accept them as parameters. +:c:data:`Py_file_input`, :c:data:`Py_single_input`, and +:c:data:`Py_func_type_input`. These are described following the functions +which accept them as parameters. Note also that several of these functions take :c:expr:`FILE*` parameters. One particular issue which needs to be handled carefully is that the :c:type:`FILE` @@ -183,8 +184,7 @@ the same library that the Python runtime is using. objects *globals* and *locals* with the compiler flags specified by *flags*. *globals* must be a dictionary; *locals* can be any object that implements the mapping protocol. The parameter *start* specifies - the start symbol and must one of the following: - :c:data:`Py_eval_input`, :c:data:`Py_file_input`, or :c:data:`Py_single_input`. + the start symbol and must one of the :ref:`available start symbols <start-symbols>`. Returns the result of executing the code as a Python object, or ``NULL`` if an exception was raised. @@ -233,8 +233,8 @@ the same library that the Python runtime is using. Parse and compile the Python source code in *str*, returning the resulting code object. The start symbol is given by *start*; this can be used to constrain the - code which can be compiled and should be :c:data:`Py_eval_input`, - :c:data:`Py_file_input`, or :c:data:`Py_single_input`. The filename specified by + code which can be compiled and should be :ref:`available start symbols + <start-symbols>`. The filename specified by *filename* is used to construct the code object and may appear in tracebacks or :exc:`SyntaxError` exception messages. This returns ``NULL`` if the code cannot be parsed or compiled. @@ -297,32 +297,6 @@ the same library that the Python runtime is using. true on success, false on failure. -.. c:var:: int Py_eval_input - - .. index:: single: Py_CompileString (C function) - - The start symbol from the Python grammar for isolated expressions; for use with - :c:func:`Py_CompileString`. - - -.. c:var:: int Py_file_input - - .. 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 - the symbol to use when compiling arbitrarily long Python source code. - - -.. c:var:: int Py_single_input - - .. 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 - interpreter loop. - - .. c:struct:: PyCompilerFlags This is the structure used to hold compiler flags. In cases where code is only @@ -366,3 +340,52 @@ the same library that the Python runtime is using. as :c:macro:`CO_FUTURE_ANNOTATIONS` to enable features normally selectable using :ref:`future statements <future>`. See :ref:`c_codeobject_flags` for a complete list. + + +.. _start-symbols: + +Available start symbols +^^^^^^^^^^^^^^^^^^^^^^^ + + +.. c:var:: int Py_eval_input + + .. index:: single: Py_CompileString (C function) + + The start symbol from the Python grammar for isolated expressions; for use with + :c:func:`Py_CompileString`. + + +.. c:var:: int Py_file_input + + .. 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 + the symbol to use when compiling arbitrarily long Python source code. + + +.. c:var:: int Py_single_input + + .. 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 + interpreter loop. + + +.. c:var:: int Py_func_type_input + + .. index:: single: Py_CompileString (C function) + + The start symbol from the Python grammar for a function type; for use with + :c:func:`Py_CompileString`. This is used to parse "signature type comments" + from :pep:`484`. + + This requires the :c:macro:`PyCF_ONLY_AST` flag to be set. + + .. seealso:: + * :py:class:`ast.FunctionType` + * :pep:`484` + + .. versionadded:: 3.8 From 42878e862a012398178cf3d5eaee0d3b30822b12 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 18:20:24 +0100 Subject: [PATCH 1360/1674] [3.14] gh-141004: Document `PyExceptionInstance*` APIs (GH-141301) (GH-141302) gh-141004: Document `PyExceptionInstance*` APIs (GH-141301) (cherry picked from commit b5a0c72492800c7e999b87adfcfeabaacb4ecb97) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/exceptions.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index c58aa659e1b1b4..5241533e11281f 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -788,6 +788,17 @@ Exception Classes Exception Objects ================= +.. c:function:: int PyExceptionInstance_Check(PyObject *op) + + Return true if *op* is an instance of :class:`BaseException`, false + otherwise. This function always succeeds. + + +.. c:macro:: PyExceptionInstance_Class(op) + + Equivalent to :c:func:`Py_TYPE(op) <Py_TYPE>`. + + .. c:function:: PyObject* PyException_GetTraceback(PyObject *ex) Return the traceback associated with the exception as a new reference, as From 86824651bce4526ea491ca7b1614f5f52e67bcd9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 18:55:09 +0100 Subject: [PATCH 1361/1674] [3.14] gh-141004: Document `PyFunction_SetKwDefaults` (GH-141294) (GH-141304) gh-141004: Document `PyFunction_SetKwDefaults` (GH-141294) (cherry picked from commit 18529b580b59b8d075641da6c685bef377eb0a7b) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/function.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 5fb8567ef8c95f..7908e4f8561aeb 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -102,6 +102,15 @@ There are a few functions specific to Python functions. dictionary of arguments or ``NULL``. +.. c:function:: int PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults) + + Set the keyword-only argument default values of the function object *op*. + *defaults* must be a dictionary of keyword-only arguments or ``Py_None``. + + This function returns ``0`` on success, and returns ``-1`` with an exception + set on failure. + + .. c:function:: PyObject* PyFunction_GetClosure(PyObject *op) Return the closure associated with the function object *op*. This can be ``NULL`` From 428f787d58df57e8f272584f53bdfab1b5e7beae Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 19:09:39 +0100 Subject: [PATCH 1362/1674] [3.14] gh-141004: Document `PyClassMethod*` and `PyStaticMethod*` APIs (GH-141296) (GH-141308) gh-141004: Document `PyClassMethod*` and `PyStaticMethod*` APIs (GH-141296) (cherry picked from commit 807db68ddd8572cfa825373bc13461b02691f4d9) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/descriptor.rst | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index ff0df575279d96..9a4093a7708a7c 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -38,3 +38,39 @@ found in the dictionary of type objects. .. c:function:: PyObject* PyWrapper_New(PyObject *, PyObject *) + + +Built-in descriptors +^^^^^^^^^^^^^^^^^^^^ + +.. c:var:: PyTypeObject PyClassMethod_Type + + The type of class method objects. This is the same object as + :class:`classmethod` in the Python layer. + + +.. c:function:: PyObject *PyClassMethod_New(PyObject *callable) + + Create a new :class:`classmethod` object wrapping *callable*. + *callable* must be a callable object and must not be ``NULL``. + + On success, this function returns a :term:`strong reference` to a new class + method descriptor. On failure, this function returns ``NULL`` with an + exception set. + + +.. c:var:: PyTypeObject PyStaticMethod_Type + + The type of static method objects. This is the same object as + :class:`staticmethod` in the Python layer. + + +.. c:function:: PyObject *PyStaticMethod_New(PyObject *callable) + + Create a new :class:`staticmethod` object wrapping *callable*. + *callable* must be a callable object and must not be ``NULL``. + + On success, this function returns a :term:`strong reference` to a new static + method descriptor. On failure, this function returns ``NULL`` with an + exception set. + From 86c63099edbb40fbcabac386cc5db48f8739bce9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 20:04:48 +0100 Subject: [PATCH 1363/1674] [3.14] gh-140980: document `SET_FUNCTION_ATTRIBUTE` flag for `annotate` function (GH-141306) (#141316) gh-140980: document `SET_FUNCTION_ATTRIBUTE` flag for `annotate` function (GH-141306) (cherry picked from commit 6f20ea1e2d302b7b88d64b6786abbad1747ff950) Co-authored-by: Lakshya Upadhyaya <lakshya.upadhyaya05@gmail.com> --- Doc/library/dis.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 593720f5738911..ff4681dcb0e8a7 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1673,9 +1673,13 @@ iterations of the loop. * ``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 + * ``0x10`` the :term:`annotate function` for the function object .. versionadded:: 3.13 + .. versionchanged:: 3.14 + Added ``0x10`` to indicate the annotate function for the function object. + .. opcode:: BUILD_SLICE (argc) From 6e659bf645beaaea54d20324fa06c0992a0b6a20 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Nov 2025 21:01:04 +0100 Subject: [PATCH 1364/1674] [3.14] gh-141004: Document `PySuper_Type` (GH-141315) (GH-141318) gh-141004: Document `PySuper_Type` (GH-141315) (cherry picked from commit 14c62227f9fa11fb743f9e03dcc5aab553de1098) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/descriptor.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index 9a4093a7708a7c..22c3b790cc3ec3 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -43,6 +43,12 @@ found in the dictionary of type objects. Built-in descriptors ^^^^^^^^^^^^^^^^^^^^ +.. c:var:: PyTypeObject PySuper_Type + + The type object for super objects. This is the same object as + :class:`super` in the Python layer. + + .. c:var:: PyTypeObject PyClassMethod_Type The type of class method objects. This is the same object as From 5c345ed61a5f98e8046e403e921f341f6276520b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 00:51:07 +0100 Subject: [PATCH 1365/1674] [3.14] gh-62480: De-personalize "Mocking Unbound Methods" section in `unittest.mock` examples (GH-141322) (#141324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-62480: De-personalize "Mocking Unbound Methods" section in `unittest.mock` examples (GH-141322) * Rewrite Mocking Unbound Methods paragraph to second person (cherry picked from commit ec85d3cbfe315086805c33bb64c28a8509098829) Co-authored-by: Elena O <31424287+oklena@users.noreply.github.com> Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/unittest.mock-examples.rst | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 00cc9bfc0a5f2b..e2b0322dae0407 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -743,16 +743,15 @@ exception is raised in the setUp then tearDown is not called. Mocking Unbound Methods ~~~~~~~~~~~~~~~~~~~~~~~ -Whilst writing tests today I needed to patch an *unbound method* (patching the -method on the class rather than on the instance). I needed self to be passed -in as the first argument because I want to make asserts about which objects -were calling this particular method. The issue is that you can't patch with a -mock for this, because if you replace an unbound method with a mock it doesn't -become a bound method when fetched from the instance, and so it doesn't get -self passed in. The workaround is to patch the unbound method with a real -function instead. The :func:`patch` decorator makes it so simple to -patch out methods with a mock that having to create a real function becomes a -nuisance. +Sometimes a test needs to patch an *unbound method*, which means patching the +method on the class rather than on the instance. In order to make assertions +about which objects were calling this particular method, you need to pass +``self`` as the first argument. The issue is that you can't patch with a mock for +this, because if you replace an unbound method with a mock it doesn't become +a bound method when fetched from the instance, and so it doesn't get ``self`` +passed in. The workaround is to patch the unbound method with a real function +instead. The :func:`patch` decorator makes it so simple to patch out methods +with a mock that having to create a real function becomes a nuisance. If you pass ``autospec=True`` to patch then it does the patching with a *real* function object. This function object has the same signature as the one @@ -760,8 +759,8 @@ it is replacing, but delegates to a mock under the hood. You still get your mock auto-created in exactly the same way as before. What it means though, is that if you use it to patch out an unbound method on a class the mocked function will be turned into a bound method if it is fetched from an instance. -It will have ``self`` passed in as the first argument, which is exactly what I -wanted: +It will have ``self`` passed in as the first argument, which is exactly what +was needed: >>> class Foo: ... def foo(self): From 6cbb8cb1f74db591c65ec93fa29bb1c018c58bfe Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 01:08:30 +0100 Subject: [PATCH 1366/1674] [3.14] gh-62480: De-personalize "Partial mocking" section in `unittest.mock` examples (GH-141321) (#141326) gh-62480: De-personalize "Partial mocking" section in `unittest.mock` examples (GH-141321) * Refine some wording in unittest partial mock doc Some of the descriptions were addressed in first person, but have now been changed to address the user reading the documentation instead. (cherry picked from commit b618731781c31d4b5b75d199dfc14993ffd66e37) Co-authored-by: KarnbirKhera <166065758+KarnbirKhera@users.noreply.github.com> Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> --- Doc/library/unittest.mock-examples.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index e2b0322dae0407..6af4298d44f532 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -600,13 +600,13 @@ this list of calls for us:: Partial mocking ~~~~~~~~~~~~~~~ -In some tests I wanted to mock out a call to :meth:`datetime.date.today` -to return a known date, but I didn't want to prevent the code under test from -creating new date objects. Unfortunately :class:`datetime.date` is written in C, and -so I couldn't just monkey-patch out the static :meth:`datetime.date.today` method. +For some tests, you may want to mock out a call to :meth:`datetime.date.today` +to return a known date, but don't want to prevent the code under test from +creating new date objects. Unfortunately :class:`datetime.date` is written in C, +so you cannot just monkey-patch out the static :meth:`datetime.date.today` method. -I found a simple way of doing this that involved effectively wrapping the date -class with a mock, but passing through calls to the constructor to the real +Instead, you can effectively wrap the date +class with a mock, while passing through calls to the constructor to the real class (and returning real instances). The :func:`patch decorator <patch>` is used here to From b5ae8082a6673f1fe2f40cd8b328fda8c56728c0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 01:48:48 +0100 Subject: [PATCH 1367/1674] [3.14] gh-141004: Document `Py_DTSF_*` macros (GH-141310) (GH-141329) gh-141004: Document `Py_DTSF_*` macros (GH-141310) (cherry picked from commit 9b0179fa87fee39df0f75bd84fc2dd75f1d00553) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/conversion.rst | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index cc7a3d9d9561a3..e9d866c647d9e0 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -128,18 +128,28 @@ The following functions provide locale-independent string to number conversions. must be 0 and is ignored. The ``'r'`` format code specifies the standard :func:`repr` format. - *flags* can be zero or more of the values ``Py_DTSF_SIGN``, - ``Py_DTSF_ADD_DOT_0``, or ``Py_DTSF_ALT``, or-ed together: + *flags* can be zero or more of the following values or-ed together: - * ``Py_DTSF_SIGN`` means to always precede the returned string with a sign - character, even if *val* is non-negative. + .. c:macro:: Py_DTSF_SIGN - * ``Py_DTSF_ADD_DOT_0`` means to ensure that the returned string will not look - like an integer. + Always precede the returned string with a sign + character, even if *val* is non-negative. - * ``Py_DTSF_ALT`` means to apply "alternate" formatting rules. See the - documentation for the :c:func:`PyOS_snprintf` ``'#'`` specifier for - details. + .. c:macro:: Py_DTSF_ADD_DOT_0 + + Ensure that the returned string will not look like an integer. + + .. c:macro:: Py_DTSF_ALT + + Apply "alternate" formatting rules. + See the documentation for the :c:func:`PyOS_snprintf` ``'#'`` specifier for + details. + + .. c:macro:: Py_DTSF_NO_NEG_0 + + Negative zero is converted to positive zero. + + .. versionadded:: 3.11 If *ptype* is non-``NULL``, then the value it points to will be set to one of ``Py_DTST_FINITE``, ``Py_DTST_INFINITE``, or ``Py_DTST_NAN``, signifying that From c09a65914d8232dba860080baa6692b74614d460 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:12:55 +0100 Subject: [PATCH 1368/1674] [3.14] gh-141004: Document `pyctype.h` macros (GH-141272) (GH-141340) gh-141004: Document `pyctype.h` macros (GH-141272) (cherry picked from commit df192616212f80aaa2f672b722b925943dbd3b78) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/conversion.rst | 55 ++++++++++++++++++++++++++++++++++++++++ Doc/library/locale.rst | 4 +-- Doc/whatsnew/2.7.rst | 18 ++++++------- 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index e9d866c647d9e0..533e5460da8952 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -172,3 +172,58 @@ The following functions provide locale-independent string to number conversions. Case insensitive comparison of strings. The function works almost identically to :c:func:`!strncmp` except that it ignores the case. + + +Character classification and conversion +======================================= + +The following macros provide locale-independent (unlike the C standard library +``ctype.h``) character classification and conversion. +The argument must be a signed or unsigned :c:expr:`char`. + + +.. c:macro:: Py_ISALNUM(c) + + Return true if the character *c* is an alphanumeric character. + + +.. c:macro:: Py_ISALPHA(c) + + Return true if the character *c* is an alphabetic character (``a-z`` and ``A-Z``). + + +.. c:macro:: Py_ISDIGIT(c) + + Return true if the character *c* is a decimal digit (``0-9``). + + +.. c:macro:: Py_ISLOWER(c) + + Return true if the character *c* is a lowercase ASCII letter (``a-z``). + + +.. c:macro:: Py_ISUPPER(c) + + Return true if the character *c* is an uppercase ASCII letter (``A-Z``). + + +.. c:macro:: Py_ISSPACE(c) + + Return true if the character *c* is a whitespace character (space, tab, + carriage return, newline, vertical tab, or form feed). + + +.. c:macro:: Py_ISXDIGIT(c) + + Return true if the character *c* is a hexadecimal digit (``0-9``, ``a-f``, and + ``A-F``). + + +.. c:macro:: Py_TOLOWER(c) + + Return the lowercase equivalent of the character *c*. + + +.. c:macro:: Py_TOUPPER(c) + + Return the uppercase equivalent of the character *c*. diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index d48ea04077f366..790bd3a5836423 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -517,8 +517,8 @@ The :mod:`locale` module defines the following exception and functions: SSH connections. 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`. + from ``ctype.h``. Instead, ``pyctype.h`` provides locale-independent + equivalents like :c:macro:`Py_TOLOWER`. .. data:: LC_COLLATE diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 09feb185b82ea7..7296296d144803 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2181,14 +2181,14 @@ Changes to Python's build process and to the C API include: discussed in :issue:`5753`, and fixed by Antoine Pitrou. * New macros: the Python header files now define the following macros: - :c:macro:`!Py_ISALNUM`, - :c:macro:`!Py_ISALPHA`, - :c:macro:`!Py_ISDIGIT`, - :c:macro:`!Py_ISLOWER`, - :c:macro:`!Py_ISSPACE`, - :c:macro:`!Py_ISUPPER`, - :c:macro:`!Py_ISXDIGIT`, - :c:macro:`!Py_TOLOWER`, and :c:macro:`!Py_TOUPPER`. + :c:macro:`Py_ISALNUM`, + :c:macro:`Py_ISALPHA`, + :c:macro:`Py_ISDIGIT`, + :c:macro:`Py_ISLOWER`, + :c:macro:`Py_ISSPACE`, + :c:macro:`Py_ISUPPER`, + :c:macro:`Py_ISXDIGIT`, + :c:macro:`Py_TOLOWER`, and :c:macro:`Py_TOUPPER`. All of these functions are analogous to the C standard macros for classifying characters, but ignore the current locale setting, because in @@ -2196,8 +2196,6 @@ Changes to Python's build process and to the C API include: locale-independent way. (Added by Eric Smith; :issue:`5793`.) - .. XXX these macros don't seem to be described in the c-api docs. - * Removed function: :c:func:`!PyEval_CallObject` is now only available as a macro. A function version was being kept around to preserve ABI linking compatibility, but that was in 1997; it can certainly be From 44a3d6c69b36e352fdc49b18d1556bfbf14c8d64 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 13:45:48 +0100 Subject: [PATCH 1369/1674] [3.14] gh-140500: Update download.html instructions (GH-141320) (#141347) Co-authored-by: Karina Souza <97332018+KarinaS0uza@users.noreply.github.com> Co-authored-by: Joseph Anthony Pasquale Holsten <joseph@josephholsten.com> --- Doc/tools/templates/download.html | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index f914ad862116d7..c78c650b1cb4bd 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -31,8 +31,7 @@ <h1>{% trans %}Download Python {{ dl_version }} documentation{% endtrans %}</h1> {% if last_updated %}<p><b>{% trans %}Last updated on: {{ last_updated }}.{% endtrans %}</b></p>{% endif %} -<p>{% 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 %}</p> +<p>{% trans %}Download an archive containing all the documentation for this version of Python:{% endtrans %}</p> <table class="docutils"> <tr> @@ -62,8 +61,6 @@ <h1>{% trans %}Download Python {{ dl_version }} documentation{% endtrans %}</h1> </tr> </table> -<p>{% trans %}These archives contain all the content in the documentation.{% endtrans %}</p> - <p>{% trans %} We no longer provide pre-built PDFs of the documentation. To build a PDF archive, follow the instructions in the @@ -75,7 +72,6 @@ <h1>{% trans %}Download Python {{ dl_version }} documentation{% endtrans %}</h1> See the <a href="https://docs.python.org/{{ version }}/archives/">directory listing</a> for file sizes.{% endtrans %}</p> - <h2>{% trans %}Problems{% endtrans %}</h2> {% set bugs = pathto('bugs') %} <p>{% trans bugs = bugs %}<a href="{{ bugs }}">Open an issue</a> From c12a0bef40377580e72372da202db097755fa36b Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Mon, 10 Nov 2025 14:20:00 +0000 Subject: [PATCH 1370/1674] [3.14] gh-139707: Add docs for optional modules (GH-140171) (GH-141204) (cherry picked from commit d2ce6d708a9eaac4e546744ca4da359ee6901ebc) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Emma Smith <emma@emmatyping.dev> Co-authored-by: Author: Terry Jan Reedy <tjreedy@udel.edu> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/glossary.rst | 9 ++ Doc/includes/optional-module.rst | 9 ++ Doc/library/bz2.rst | 2 + Doc/library/compression.zstd.rst | 2 + Doc/library/ctypes.rst | 2 + Doc/library/curses.rst | 2 + Doc/library/ensurepip.rst | 2 + Doc/library/gzip.rst | 2 + Doc/library/idle.rst | 4 + Doc/library/lzma.rst | 2 + Doc/library/readline.rst | 2 + Doc/library/sqlite3.rst | 4 +- Doc/library/ssl.rst | 5 +- Doc/library/tarfile.rst | 8 ++ Doc/library/tkinter.rst | 2 + Doc/library/turtle.rst | 2 + Doc/library/zipfile.rst | 10 ++ Doc/library/zlib.rst | 8 +- Doc/using/configure.rst | 208 ++++++++++++++++++++----------- Doc/using/unix.rst | 12 +- 20 files changed, 216 insertions(+), 81 deletions(-) create mode 100644 Doc/includes/optional-module.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index c0ca0be304ebe4..a4066d42927f64 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1025,6 +1025,15 @@ Glossary applied to all scopes, only those relying on a known set of local and nonlocal variable names are restricted to optimized scopes. + optional module + An :term:`extension module` that is part of the :term:`standard library`, + but may be absent in some builds of :term:`CPython`, + usually due to missing third-party libraries or because the module + is not available for a given platform. + + See :ref:`optional-module-requirements` for a list of optional modules + that require third-party libraries. + package A Python :term:`module` which can contain submodules or recursively, subpackages. Technically, a package is a Python module with a diff --git a/Doc/includes/optional-module.rst b/Doc/includes/optional-module.rst new file mode 100644 index 00000000000000..262e73f2eaa09f --- /dev/null +++ b/Doc/includes/optional-module.rst @@ -0,0 +1,9 @@ +This is an :term:`optional module`. +If it is missing from your copy of CPython, +look for documentation from your distributor (that is, +whoever provided Python to you). +If you are the distributor, see :ref:`optional-module-requirements`. + +.. Similar notes appear in the docs of the modules: + - zipfile + - tarfile diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index ebe2e43febaefa..12650861c0fb5d 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -25,6 +25,8 @@ The :mod:`bz2` module contains: * The :func:`compress` and :func:`decompress` functions for one-shot (de)compression. +.. include:: ../includes/optional-module.rst + (De)compression of files ------------------------ diff --git a/Doc/library/compression.zstd.rst b/Doc/library/compression.zstd.rst index a901403621b84f..89b6fe540f5ba7 100644 --- a/Doc/library/compression.zstd.rst +++ b/Doc/library/compression.zstd.rst @@ -33,6 +33,8 @@ The :mod:`!compression.zstd` module contains: * The :class:`CompressionParameter`, :class:`DecompressionParameter`, and :class:`Strategy` classes for setting advanced (de)compression parameters. +.. include:: ../includes/optional-module.rst + Exceptions ---------- diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index d8dac24c8ab532..9c0b246c095483 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -14,6 +14,8 @@ data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python. +.. include:: ../includes/optional-module.rst + .. _ctypes-ctypes-tutorial: diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index e60197ddd89adb..057d338edda92a 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -23,6 +23,8 @@ Linux and the BSD variants of Unix. .. include:: ../includes/wasm-mobile-notavail.rst +.. include:: ../includes/optional-module.rst + .. note:: Whenever the documentation mentions a *character* it can be specified diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index fa102c4a080103..165b9a9f823154 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -30,6 +30,8 @@ when creating a virtual environment) or after explicitly uninstalling needed to bootstrap ``pip`` are included as internal parts of the package. +.. include:: ../includes/optional-module.rst + .. seealso:: :ref:`installing-index` diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index c9d96085ef739d..bb260aee4e9eb2 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -11,6 +11,8 @@ This module provides a simple interface to compress and decompress files just like the GNU programs :program:`gzip` and :program:`gunzip` would. +.. include:: ../includes/optional-module.rst + The data compression is provided by the :mod:`zlib` module. The :mod:`gzip` module provides the :class:`GzipFile` class, as well as the diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 10ec7f0a6f14c9..52e3726a0f5af5 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -37,6 +37,10 @@ IDLE has the following features: * configuration, browsers, and other dialogs +The IDLE application is implemented in the :mod:`idlelib` package. + +.. include:: ../includes/optional-module.rst + Menus ----- diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 69f7cb8d48d7ae..8a4f68f3502521 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -23,6 +23,8 @@ module. Note that :class:`LZMAFile` and :class:`bz2.BZ2File` are *not* thread-safe, so if you need to use a single :class:`LZMAFile` instance from multiple threads, it is necessary to protect it with a lock. +.. include:: ../includes/optional-module.rst + .. exception:: LZMAError diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index f649fce5efc377..75db832c546b64 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -26,6 +26,8 @@ Readline library in general. .. include:: ../includes/wasm-mobile-notavail.rst +.. include:: ../includes/optional-module.rst + .. note:: The underlying Readline library API may be implemented by diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 55a97bc0788576..3dfac220eaf4a5 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -31,7 +31,9 @@ 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.15.2 or newer. +requires the third-party `SQLite <https://sqlite.org/>`_ library. + +.. include:: ../includes/optional-module.rst This document includes four main sections: diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 6750afb89bb0d3..7dc7840fbf77f4 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -18,8 +18,9 @@ This module provides access to Transport Layer Security (often known as "Secure Sockets Layer") encryption and peer authentication facilities for network sockets, both client-side and server-side. This module uses the OpenSSL -library. It is available on all modern Unix systems, Windows, macOS, and -probably additional platforms, as long as OpenSSL is installed on that platform. +library. + +.. include:: ../includes/optional-module.rst .. note:: diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index add9e8ac2cb587..e57a0f121c5ce8 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -21,6 +21,14 @@ Some facts and figures: * reads and writes :mod:`gzip`, :mod:`bz2`, :mod:`compression.zstd`, and :mod:`lzma` compressed archives if the respective modules are available. + .. + The following paragraph should be similar to ../includes/optional-module.rst + + If any of these :term:`optional modules <optional module>` are missing from + your copy of CPython, look for documentation from your distributor (that is, + whoever provided Python to you). + If you are the distributor, see :ref:`optional-module-requirements`. + * read/write support for the POSIX.1-1988 (ustar) format. * read/write support for the GNU tar format including *longname* and *longlink* diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 22e08c45d01ef9..81177533be84c9 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -36,6 +36,8 @@ details that are unchanged. Most documentation you will find online still uses the old API and can be woefully outdated. +.. include:: ../includes/optional-module.rst + .. seealso:: * `TkDocs <https://tkdocs.com/>`_ diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index b687231bd489cc..58b99e0d44173a 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -29,6 +29,8 @@ introduced in Logo <https://en.wikipedia.org/wiki/Turtle_ (robot)>`_, developed by Wally Feurzeig, Seymour Papert and Cynthia Solomon in 1967. +.. include:: ../includes/optional-module.rst + Get started =========== diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index f6ec33640b60d2..5a8bbc8c1aedf7 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -23,6 +23,16 @@ decryption of encrypted files in ZIP archives, but it currently cannot create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. +.. + The following paragraph should be similar to ../includes/optional-module.rst + +Handling compressed archives requires :term:`optional modules <optional module>` +such as :mod:`zlib`, :mod:`bz2`, :mod:`lzma`, and :mod:`compression.zstd`. +If any of them are missing from your copy of CPython, +look for documentation from your distributor (that is, +whoever provided Python to you). +If you are the distributor, see :ref:`optional-module-requirements`. + The module defines the following items: .. exception:: BadZipFile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index 9f507f754b63ce..8e2446544a29ed 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -8,11 +8,9 @@ -------------- For applications that require data compression, the functions in this module -allow compression and decompression, using the zlib library. The zlib library -has its own home page at https://www.zlib.net. There are known -incompatibilities between the Python module and versions of the zlib library -earlier than 1.1.3; 1.1.3 has a `security vulnerability <https://zlib.net/zlib_faq.html#faq33>`_, so we recommend using -1.1.4 or later. +allow compression and decompression, using the `zlib library <https://www.zlib.net>`_. + +.. include:: ../includes/optional-module.rst zlib's functions have many options and often need to be used in a particular order. This documentation doesn't attempt to cover all of the permutations; diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 60f50090b1d971..5c61197cec0bcf 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -4,10 +4,13 @@ Configure Python .. highlight:: sh + +.. _build-requirements: + Build Requirements ================== -Features and minimum versions required to build CPython: +To build CPython, you will need: * A `C11 <https://en.cppreference.com/w/c/11>`_ compiler. `Optional C11 features @@ -22,85 +25,136 @@ Features and minimum versions required to build CPython: * Support for threads. -To build optional modules: - -* `libbz2 <https://sourceware.org/bzip2/>`_ for the :mod:`bz2` module. - -* `libb2 <https://github.com/BLAKE2/libb2>`_ (:ref:`BLAKE2 <hashlib-blake2>`), - used by :mod:`hashlib` module. - -* `libffi <https://sourceware.org/libffi/>`_ 3.3.0 is the recommended - minimum version for the :mod:`ctypes` module. - -* ``liblzma``, for the :mod:`lzma` module. - -* `libmpdec <https://www.bytereef.org/mpdecimal/doc/libmpdec/>`_ 2.5.0 - for the :mod:`decimal` module. - -* ``libncurses`` or ``libncursesw``, - for the :mod:`curses` module. - -* ``libpanel`` or ``libpanelw``, - for the :mod:`curses.panel` module. - -* `libreadline <https://tiswww.case.edu/php/chet/readline/rltop.html>`_ or - `libedit <https://www.thrysoee.dk/editline/>`_ - for the :mod:`readline` module. - -* `libuuid <https://linux.die.net/man/3/libuuid>`_, for the :mod:`uuid` module. - -* `OpenSSL <https://www.openssl.org/>`_ 1.1.1 is the minimum version and - OpenSSL 3.0.18 is the recommended minimum version for the - :mod:`ssl` and :mod:`hashlib` extension modules. +.. versionchanged:: 3.5 + On Windows, Visual Studio 2015 or later is now required. -* `SQLite <https://sqlite.org/>`_ 3.15.2 for the :mod:`sqlite3` extension module. +.. versionchanged:: 3.6 + Selected C99 features, like ``<stdint.h>`` and ``static inline`` functions, + are now required. -* `Tcl/Tk <https://www.tcl-lang.org/>`_ 8.5.12 for the :mod:`tkinter` module. +.. versionchanged:: 3.7 + Thread support is now required. -* `zlib <https://www.zlib.net>`_ 1.1.4 is the reccomended minimum version for the - :mod:`zlib` module. +.. versionchanged:: 3.11 + C11 compiler, IEEE 754 and NaN support are now required. + On Windows, Visual Studio 2017 or later is required. -* `zstd <https://facebook.github.io/zstd/>`_ 1.4.5 is the minimum version for - the :mod:`compression.zstd` module. +See also :pep:`7` "Style Guide for C Code" and :pep:`11` "CPython platform +support". -For a full list of dependencies required to build all modules and how to install -them, see the -`devguide <https://devguide.python.org/getting-started/setup-building/#install-dependencies>`_. -* Autoconf 2.72 and aclocal 1.16.5 are required to regenerate the - :file:`configure` script. +.. _optional-module-requirements: + +Requirements for optional modules +--------------------------------- + +Some :term:`optional modules <optional module>` of the standard library +require third-party libraries installed for development +(for example, header files must be available). + +Missing requirements are reported in the ``configure`` output. +Modules that are missing due to missing dependencies are listed near the end +of the ``make`` output, +sometimes using an internal name, for example, ``_ctypes`` for :mod:`ctypes` +module. + +If you distribute a CPython interpreter without optional modules, +it's best practice to advise users, who generally expect that +standard library modules are available. + +Dependencies to build optional modules are: + +.. list-table:: + :header-rows: 1 + :align: left + + * - Dependency + - Minimum version + - Python module + * - `libbz2 <https://sourceware.org/bzip2/>`_ + - + - :mod:`bz2` + * - `libffi <https://sourceware.org/libffi/>`_ + - 3.3.0 recommended + - :mod:`ctypes` + * - `liblzma <https://tukaani.org/xz/>`_ + - + - :mod:`lzma` + * - `libmpdec <https://www.bytereef.org/mpdecimal/doc/libmpdec/>`_ + - 2.5.0 + - :mod:`decimal` [1]_ + * - `libreadline <https://tiswww.case.edu/php/chet/readline/rltop.html>`_ or + `libedit <https://www.thrysoee.dk/editline/>`_ [2]_ + - + - :mod:`readline` + * - `libuuid <https://linux.die.net/man/3/libuuid>`_ + - + - ``_uuid`` [3]_ + * - `ncurses <https://gnu.org/software/ncurses/ncurses.html>`_ [4]_ + - + - :mod:`curses` + * - `OpenSSL <https://openssl-library.org/>`_ + - | 3.0.18 recommended + | (1.1.1 minimum) + - :mod:`ssl`, :mod:`hashlib` [5]_ + * - `SQLite <https://sqlite.org/>`_ + - 3.15.2 + - :mod:`sqlite3` + * - `Tcl/Tk <https://www.tcl-lang.org/>`_ + - 8.5.12 + - :mod:`tkinter`, :ref:`IDLE <idle>`, :mod:`turtle` + * - `zlib <https://www.zlib.net>`_ + - 1.2.2.1 + - :mod:`zlib`, :mod:`gzip`, :mod:`ensurepip` + * - `zstd <https://facebook.github.io/zstd/>`_ + - 1.4.5 + - :mod:`compression.zstd` + +.. [1] If *libmpdec* is not available, the :mod:`decimal` module will use + a pure-Python implementation. + See :option:`--with-system-libmpdec` for details. +.. [2] See :option:`--with-readline` for choosing the backend for the + :mod:`readline` module. +.. [3] The :mod:`uuid` module uses ``_uuid`` to generate "safe" UUIDs. + See the module documentation for details. +.. [4] The :mod:`curses` module requires the ``libncurses`` or ``libncursesw`` + library. + The :mod:`curses.panel` module additionally requires the ``libpanel`` or + ``libpanelw`` library. +.. [5] If OpenSSL is not available, the :mod:`hashlib` module will use + bundled implementations of several hash functions. + See :option:`--with-builtin-hashlib-hashes` for *forcing* usage of OpenSSL. + +Note that the table does not include all optional modules; in particular, +platform-specific modules like :mod:`winreg` are not listed here. + +.. seealso:: + + * The `devguide <https://devguide.python.org/getting-started/setup-building/#install-dependencies>`_ + includes a full list of dependencies required to build all modules and + instructions on how to install them on common platforms. + * :option:`--with-system-expat` allows building with an external + `libexpat <https://libexpat.github.io/>`_ library. + * :ref:`configure-options-for-dependencies` .. versionchanged:: 3.1 - Tcl/Tk version 8.3.1 is now required. + Tcl/Tk version 8.3.1 is now required for :mod:`tkinter`. .. 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 ``<stdint.h>`` and ``static - inline`` functions. + Tcl/Tk version 8.4 is now required for :mod:`tkinter`. .. versionchanged:: 3.7 - Thread support and OpenSSL 1.0.2 are now required. + OpenSSL 1.0.2 is now required for :mod:`hashlib` and :mod:`ssl`. .. versionchanged:: 3.10 - OpenSSL 1.1.1 is now required. - Require SQLite 3.7.15. + OpenSSL 1.1.1 is now required for :mod:`hashlib` and :mod:`ssl`. + SQLite 3.7.15 is now required for :mod:`sqlite3`. .. 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. + Tcl/Tk version 8.5.12 is now required for :mod:`tkinter`. .. versionchanged:: 3.13 - Autoconf 2.71, aclocal 1.16.5 and SQLite 3.15.2 are now required. - -.. versionchanged:: 3.14 - Autoconf 2.72 is now required. - -See also :pep:`7` "Style Guide for C Code" and :pep:`11` "CPython platform -support". + SQLite 3.15.2 is now required for :mod:`sqlite3`. Generated files @@ -129,8 +183,19 @@ 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. +The generated files can change depending on the exact versions of the +tools used. +The container that CPython uses has +`Autoconf <https://gnu.org/software/autoconf>`_ 2.72, +``aclocal`` from `Automake <https://www.gnu.org/software/automake>`_ 1.16.5, +and `pkg-config <https://www.freedesktop.org/wiki/Software/pkg-config/>`_ 1.8.1. + +.. versionchanged:: 3.13 + Autoconf 2.71 and aclocal 1.16.5 and are now used to regenerate + :file:`configure`. + +.. versionchanged:: 3.14 + Autoconf 2.72 is now used to regenerate :file:`configure`. .. _configure-options: @@ -408,6 +473,8 @@ Linker options Name for machine-dependent library files. +.. _configure-options-for-dependencies: + Options for third-party dependencies ------------------------------------ @@ -430,12 +497,6 @@ Options for third-party dependencies C compiler and linker flags for ``gdbm``. -.. option:: LIBB2_CFLAGS -.. option:: LIBB2_LIBS - - C compiler and linker flags for ``libb2`` (:ref:`BLAKE2 <hashlib-blake2>`), - used by :mod:`hashlib` module, overriding ``pkg-config``. - .. option:: LIBEDIT_CFLAGS .. option:: LIBEDIT_LIBS @@ -901,6 +962,13 @@ Libraries options .. versionchanged:: 3.13 Default to using the installed ``mpdecimal`` library. + .. versionchanged:: 3.15 + + A bundled copy of the library will no longer be selected + implicitly if an installed ``mpdecimal`` library is not found. + In Python 3.15 only, it can still be selected explicitly using + ``--with-system-libmpdec=no`` or ``--without-system-libmpdec``. + .. deprecated-removed:: 3.13 3.16 A copy of the ``mpdecimal`` library sources will no longer be distributed with Python 3.16. diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 9ec4e3419321a4..a9950ef7525497 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -84,11 +84,17 @@ On FreeBSD and OpenBSD Building Python =============== +.. seealso:: + + If you want to contribute to CPython, refer to the + `devguide <https://devguide.python.org/getting-started/setup-building/>`_, + which includes build instructions and other tips on setting up environment. + If you want to compile CPython yourself, first thing you should do is get the `source <https://www.python.org/downloads/source/>`_. You can download either the -latest release's source or just grab a fresh `clone -<https://devguide.python.org/setup/#get-the-source-code>`_. (If you want -to contribute patches, you will need a clone.) +latest release's source or grab a fresh `clone +<https://devguide.python.org/setup/#get-the-source-code>`_. +You will also need to install the :ref:`build requirements <build-requirements>`. The build process consists of the usual commands:: From 7618754d53d0afb9f8a0a868d1a6fd6a49b70bba Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 16:01:30 +0100 Subject: [PATCH 1371/1674] [3.14] gh-141343: Fix swapped words in `sorted` doc (GH-141357) (cherry picked from commit 59b793b0dd76d37229fe6d379cd5fe76023d15f1) Co-authored-by: Yongzi Li <204532581+Yzi-Li@users.noreply.github.com> --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index d25a6efd003c8e..c66486d3908aa7 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1887,7 +1887,7 @@ are always available. They are listed here in alphabetical order. the same data with other ordering tools such as :func:`max` that rely on a different underlying method. Implementing all six comparisons also helps avoid confusion for mixed type comparisons which can call - reflected the :meth:`~object.__gt__` method. + the reflected :meth:`~object.__gt__` method. For sorting examples and a brief sorting tutorial, see :ref:`sortinghowto`. From 92210309094ca2c8617ecc9662671a2c376bae10 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 16:11:42 +0100 Subject: [PATCH 1372/1674] [3.14] gh-141174: Improve `annotationlib.get_annotations()` test coverage (GH-141286) (#141353) gh-141174: Improve `annotationlib.get_annotations()` test coverage (GH-141286) * Test `get_annotations(format=Format.VALUE)` for stringized annotations on custom objects * Test `get_annotations(format=Format.VALUE)` for stringized annotations on wrapped partial functions * Update test_stringized_annotations_with_star_unpack() to actually test stringized annotations * Test __annotate__ returning a non-dict * Test passing globals and locals to stringized `get_annotations()` (cherry picked from commit 06b62282c79dd69293a3eefb4c55f5acc6312cb2) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Lib/test/test_annotationlib.py | 70 +++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index fd5d43b09b9702..f1d32ab50cf82b 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -9,6 +9,7 @@ import pickle from string.templatelib import Template, Interpolation import typing +import sys import unittest from annotationlib import ( Format, @@ -755,6 +756,8 @@ def test_stringized_annotations_in_module(self): for kwargs in [ {"eval_str": True}, + {"eval_str": True, "globals": isa.__dict__, "locals": {}}, + {"eval_str": True, "globals": {}, "locals": isa.__dict__}, {"format": Format.VALUE, "eval_str": True}, ]: with self.subTest(**kwargs): @@ -788,7 +791,7 @@ def test_stringized_annotations_in_empty_module(self): self.assertEqual(get_annotations(isa2, eval_str=False), {}) def test_stringized_annotations_with_star_unpack(self): - def f(*args: *tuple[int, ...]): ... + def f(*args: "*tuple[int, ...]"): ... self.assertEqual(get_annotations(f, eval_str=True), {'args': (*tuple[int, ...],)[0]}) @@ -811,6 +814,44 @@ def test_stringized_annotations_on_wrapper(self): {"a": "int", "b": "str", "return": "MyClass"}, ) + def test_stringized_annotations_on_partial_wrapper(self): + isa = inspect_stringized_annotations + + def times_three_str(fn: typing.Callable[[str], isa.MyClass]): + @functools.wraps(fn) + def wrapper(b: "str") -> "MyClass": + return fn(b * 3) + + return wrapper + + wrapped = times_three_str(functools.partial(isa.function, 1)) + self.assertEqual(wrapped("x"), isa.MyClass(1, "xxx")) + self.assertIsNot(wrapped.__globals__, isa.function.__globals__) + self.assertEqual( + get_annotations(wrapped, eval_str=True), + {"b": str, "return": isa.MyClass}, + ) + self.assertEqual( + get_annotations(wrapped, eval_str=False), + {"b": "str", "return": "MyClass"}, + ) + + # If functools is not loaded, names will be evaluated in the current + # module instead of being unwrapped to the original. + functools_mod = sys.modules["functools"] + del sys.modules["functools"] + + self.assertEqual( + get_annotations(wrapped, eval_str=True), + {"b": str, "return": MyClass}, + ) + self.assertEqual( + get_annotations(wrapped, eval_str=False), + {"b": "str", "return": "MyClass"}, + ) + + sys.modules["functools"] = functools_mod + def test_stringized_annotations_on_class(self): isa = inspect_stringized_annotations # test that local namespace lookups work @@ -823,6 +864,16 @@ def test_stringized_annotations_on_class(self): {"x": int}, ) + def test_stringized_annotations_on_custom_object(self): + class HasAnnotations: + @property + def __annotations__(self): + return {"x": "int"} + + ha = HasAnnotations() + self.assertEqual(get_annotations(ha), {"x": "int"}) + self.assertEqual(get_annotations(ha, eval_str=True), {"x": int}) + def test_stringized_annotation_permutations(self): def define_class(name, has_future, has_annos, base_text, extra_names=None): lines = [] @@ -990,6 +1041,23 @@ def __annotate__(self): {"x": "int"}, ) + def test_non_dict_annotate(self): + class WeirdAnnotate: + def __annotate__(self, *args, **kwargs): + return "not a dict" + + wa = WeirdAnnotate() + for format in Format: + if format == Format.VALUE_WITH_FAKE_GLOBALS: + continue + with ( + self.subTest(format=format), + self.assertRaisesRegex( + ValueError, r".*__annotate__ returned a non-dict" + ), + ): + get_annotations(wa, format=format) + def test_no_annotations(self): class CustomClass: pass From 727cdcba8ea01a1f317f560bc9fc8fbd2912011d Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra <jelle.zijlstra@gmail.com> Date: Mon, 10 Nov 2025 07:14:32 -0800 Subject: [PATCH 1373/1674] [3.14] gh-137530: generate an __annotate__ function for dataclasses __init__ (GH-137711) (#141352) (cherry picked from commit 12837c63635559873a5abddf511d38456d69617b) Co-authored-by: David Ellis <ducksual@gmail.com> --- Lib/dataclasses.py | 94 ++++++++++-- Lib/test/test_dataclasses/__init__.py | 139 +++++++++++++++++- ...-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst | 1 + 3 files changed, 219 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index d29f1615f276d2..fb7e1701cce0a4 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -441,9 +441,11 @@ def __init__(self, globals): self.locals = {} self.overwrite_errors = {} self.unconditional_adds = {} + self.method_annotations = {} def add_fn(self, name, args, body, *, locals=None, return_type=MISSING, - overwrite_error=False, unconditional_add=False, decorator=None): + overwrite_error=False, unconditional_add=False, decorator=None, + annotation_fields=None): if locals is not None: self.locals.update(locals) @@ -464,16 +466,14 @@ def add_fn(self, name, args, body, *, locals=None, return_type=MISSING, 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 = '' + if annotation_fields is not None: + self.method_annotations[name] = (annotation_fields, return_type) + 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}') + self.src.append(f'{f' {decorator}\n' if decorator else ''} def {name}({args}):\n{body}') def add_fns_to_class(self, cls): # The source to all of the functions we're generating. @@ -509,6 +509,15 @@ def add_fns_to_class(self, cls): # 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__}" + + try: + annotation_fields, return_type = self.method_annotations[name] + except KeyError: + pass + else: + annotate_fn = _make_annotate_function(cls, name, annotation_fields, return_type) + fn.__annotate__ = annotate_fn + if self.unconditional_adds.get(name, False): setattr(cls, name, fn) else: @@ -524,6 +533,44 @@ def add_fns_to_class(self, cls): raise TypeError(error_msg) +def _make_annotate_function(__class__, method_name, annotation_fields, return_type): + # Create an __annotate__ function for a dataclass + # Try to return annotations in the same format as they would be + # from a regular __init__ function + + def __annotate__(format, /): + Format = annotationlib.Format + match format: + case Format.VALUE | Format.FORWARDREF | Format.STRING: + cls_annotations = {} + for base in reversed(__class__.__mro__): + cls_annotations.update( + annotationlib.get_annotations(base, format=format) + ) + + new_annotations = {} + for k in annotation_fields: + new_annotations[k] = cls_annotations[k] + + if return_type is not MISSING: + if format == Format.STRING: + new_annotations["return"] = annotationlib.type_repr(return_type) + else: + new_annotations["return"] = return_type + + return new_annotations + + case _: + raise NotImplementedError(format) + + # This is a flag for _add_slots to know it needs to regenerate this method + # In order to remove references to the original class when it is replaced + __annotate__.__generated_by_dataclasses__ = True + __annotate__.__qualname__ = f"{__class__.__qualname__}.{method_name}.__annotate__" + + return __annotate__ + + def _field_assign(frozen, name, value, self_name): # If we're a frozen class, then assign to our fields in __init__ # via object.__setattr__. Otherwise, just use a simple @@ -612,7 +659,7 @@ def _init_param(f): elif f.default_factory is not MISSING: # There's a factory function. Set a marker. default = '=__dataclass_HAS_DEFAULT_FACTORY__' - return f'{f.name}:__dataclass_type_{f.name}__{default}' + return f'{f.name}{default}' def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, @@ -635,11 +682,10 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, raise TypeError(f'non-default argument {f.name!r} ' f'follows default argument {seen_default.name!r}') - locals = {**{f'__dataclass_type_{f.name}__': f.type for f in fields}, - **{'__dataclass_HAS_DEFAULT_FACTORY__': _HAS_DEFAULT_FACTORY, - '__dataclass_builtins_object__': object, - } - } + annotation_fields = [f.name for f in fields if f.init] + + locals = {'__dataclass_HAS_DEFAULT_FACTORY__': _HAS_DEFAULT_FACTORY, + '__dataclass_builtins_object__': object} body_lines = [] for f in fields: @@ -670,7 +716,8 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, [self_name] + _init_params, body_lines, locals=locals, - return_type=None) + return_type=None, + annotation_fields=annotation_fields) def _frozen_get_del_attr(cls, fields, func_builder): @@ -1336,6 +1383,25 @@ def _add_slots(cls, is_frozen, weakref_slot, defined_fields): or _update_func_cell_for__class__(member.fdel, cls, newcls)): break + # Get new annotations to remove references to the original class + # in forward references + newcls_ann = annotationlib.get_annotations( + newcls, format=annotationlib.Format.FORWARDREF) + + # Fix references in dataclass Fields + for f in getattr(newcls, _FIELDS).values(): + try: + ann = newcls_ann[f.name] + except KeyError: + pass + else: + f.type = ann + + # Fix the class reference in the __annotate__ method + init_annotate = newcls.__init__.__annotate__ + if getattr(init_annotate, "__generated_by_dataclasses__", False): + _update_func_cell_for__class__(init_annotate, cls, newcls) + return newcls diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index 6bf5e5b3e5554b..513dd78c4381b4 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -2471,6 +2471,135 @@ def __init__(self, a): self.assertEqual(D(5).a, 10) +class TestInitAnnotate(unittest.TestCase): + # Tests for the generated __annotate__ function for __init__ + # See: https://github.com/python/cpython/issues/137530 + + def test_annotate_function(self): + # No forward references + @dataclass + class A: + a: int + + value_annos = annotationlib.get_annotations(A.__init__, format=annotationlib.Format.VALUE) + forwardref_annos = annotationlib.get_annotations(A.__init__, format=annotationlib.Format.FORWARDREF) + string_annos = annotationlib.get_annotations(A.__init__, format=annotationlib.Format.STRING) + + self.assertEqual(value_annos, {'a': int, 'return': None}) + self.assertEqual(forwardref_annos, {'a': int, 'return': None}) + self.assertEqual(string_annos, {'a': 'int', 'return': 'None'}) + + self.assertTrue(getattr(A.__init__.__annotate__, "__generated_by_dataclasses__")) + + def test_annotate_function_forwardref(self): + # With forward references + @dataclass + class B: + b: undefined + + # VALUE annotations should raise while unresolvable + with self.assertRaises(NameError): + _ = annotationlib.get_annotations(B.__init__, format=annotationlib.Format.VALUE) + + forwardref_annos = annotationlib.get_annotations(B.__init__, format=annotationlib.Format.FORWARDREF) + string_annos = annotationlib.get_annotations(B.__init__, format=annotationlib.Format.STRING) + + self.assertEqual(forwardref_annos, {'b': support.EqualToForwardRef('undefined', owner=B, is_class=True), 'return': None}) + self.assertEqual(string_annos, {'b': 'undefined', 'return': 'None'}) + + # Now VALUE and FORWARDREF should resolve, STRING should be unchanged + undefined = int + + value_annos = annotationlib.get_annotations(B.__init__, format=annotationlib.Format.VALUE) + forwardref_annos = annotationlib.get_annotations(B.__init__, format=annotationlib.Format.FORWARDREF) + string_annos = annotationlib.get_annotations(B.__init__, format=annotationlib.Format.STRING) + + self.assertEqual(value_annos, {'b': int, 'return': None}) + self.assertEqual(forwardref_annos, {'b': int, 'return': None}) + self.assertEqual(string_annos, {'b': 'undefined', 'return': 'None'}) + + def test_annotate_function_init_false(self): + # Check `init=False` attributes don't get into the annotations of the __init__ function + @dataclass + class C: + c: str = field(init=False) + + self.assertEqual(annotationlib.get_annotations(C.__init__), {'return': None}) + + def test_annotate_function_contains_forwardref(self): + # Check string annotations on objects containing a ForwardRef + @dataclass + class D: + d: list[undefined] + + with self.assertRaises(NameError): + annotationlib.get_annotations(D.__init__) + + self.assertEqual( + annotationlib.get_annotations(D.__init__, format=annotationlib.Format.FORWARDREF), + {"d": list[support.EqualToForwardRef("undefined", is_class=True, owner=D)], "return": None} + ) + + self.assertEqual( + annotationlib.get_annotations(D.__init__, format=annotationlib.Format.STRING), + {"d": "list[undefined]", "return": "None"} + ) + + # Now test when it is defined + undefined = str + + # VALUE should now resolve + self.assertEqual( + annotationlib.get_annotations(D.__init__), + {"d": list[str], "return": None} + ) + + self.assertEqual( + annotationlib.get_annotations(D.__init__, format=annotationlib.Format.FORWARDREF), + {"d": list[str], "return": None} + ) + + self.assertEqual( + annotationlib.get_annotations(D.__init__, format=annotationlib.Format.STRING), + {"d": "list[undefined]", "return": "None"} + ) + + def test_annotate_function_not_replaced(self): + # Check that __annotate__ is not replaced on non-generated __init__ functions + @dataclass(slots=True) + class E: + x: str + def __init__(self, x: int) -> None: + self.x = x + + self.assertEqual( + annotationlib.get_annotations(E.__init__), {"x": int, "return": None} + ) + + self.assertFalse(hasattr(E.__init__.__annotate__, "__generated_by_dataclasses__")) + + def test_init_false_forwardref(self): + # Test forward references in fields not required for __init__ annotations. + + # At the moment this raises a NameError for VALUE annotations even though the + # undefined annotation is not required for the __init__ annotations. + # Ideally this will be fixed but currently there is no good way to resolve this + + @dataclass + class F: + not_in_init: list[undefined] = field(init=False, default=None) + in_init: int + + annos = annotationlib.get_annotations(F.__init__, format=annotationlib.Format.FORWARDREF) + self.assertEqual( + annos, + {"in_init": int, "return": None}, + ) + + with self.assertRaises(NameError): + annos = annotationlib.get_annotations(F.__init__) # NameError on not_in_init + + class TestRepr(unittest.TestCase): def test_repr(self): @dataclass @@ -3831,7 +3960,15 @@ def method(self) -> int: return SlotsTest - for make in (make_simple, make_with_annotations, make_with_annotations_and_method): + def make_with_forwardref(): + @dataclass(slots=True) + class SlotsTest: + x: undefined + y: list[undefined] + + return SlotsTest + + for make in (make_simple, make_with_annotations, make_with_annotations_and_method, make_with_forwardref): with self.subTest(make=make): C = make() support.gc_collect() diff --git a/Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst b/Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst new file mode 100644 index 00000000000000..4ff55b41dea96e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst @@ -0,0 +1 @@ +:mod:`dataclasses` Fix annotations for generated ``__init__`` methods by replacing the annotations that were in-line in the generated source code with ``__annotate__`` functions attached to the methods. From 4b9ed4e642ad475e46f0496c9d98a56bed85d2ec Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 16:19:48 +0100 Subject: [PATCH 1374/1674] [3.14] gh-141174: Improve `annotationlib.call_annotate_function()` test coverage (GH-141176) (#141355) gh-141174: Improve `annotationlib.call_annotate_function()` test coverage (GH-141176) * Test passing unsupported Format values to call_annotate_function() * Test call_evaluate_function with fake globals that raise errors * Fix typo and comparison in test_fake_global_evaluation (cherry picked from commit 1110e8f6a4a767f6d09b121017442528733b380b) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Lib/test/test_annotationlib.py | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index f1d32ab50cf82b..579b01349b30c5 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -1315,6 +1315,32 @@ def evaluate(format, exc=NotImplementedError): "undefined", ) + def test_fake_global_evaluation(self): + # This will raise an AttributeError + def evaluate_union(format, exc=NotImplementedError): + if format == Format.VALUE_WITH_FAKE_GLOBALS: + # Return a ForwardRef + return builtins.undefined | list[int] + raise exc + + self.assertEqual( + annotationlib.call_evaluate_function(evaluate_union, Format.FORWARDREF), + support.EqualToForwardRef("builtins.undefined | list[int]"), + ) + + # This will raise an AttributeError + def evaluate_intermediate(format, exc=NotImplementedError): + if format == Format.VALUE_WITH_FAKE_GLOBALS: + intermediate = builtins.undefined + # Return a literal + return intermediate is None + raise exc + + self.assertIs( + annotationlib.call_evaluate_function(evaluate_intermediate, Format.FORWARDREF), + False, + ) + class TestCallAnnotateFunction(unittest.TestCase): # Tests for user defined annotate functions. @@ -1456,6 +1482,23 @@ def annotate(format, /): with self.assertRaises(NotImplementedError): annotationlib.call_annotate_function(annotate, Format.STRING) + def test_unsupported_formats(self): + def annotate(format, /): + if format == Format.FORWARDREF: + return {"x": str} + else: + raise NotImplementedError(format) + + with self.assertRaises(ValueError): + annotationlib.call_annotate_function(annotate, Format.VALUE_WITH_FAKE_GLOBALS) + + with self.assertRaises(RuntimeError): + annotationlib.call_annotate_function(annotate, Format.VALUE) + + with self.assertRaises(ValueError): + # Some non-Format value + annotationlib.call_annotate_function(annotate, 7) + def test_error_from_value_raised(self): # Test that the error from format.VALUE is raised # if all formats fail From a1889959d31b8aa4636109897348e1c180e86665 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 16:19:54 +0100 Subject: [PATCH 1375/1674] [3.14] gh-141174: Improve `ForwardRef` test coverage (GH-141175) (#141354) gh-141174: Improve `ForwardRef` test coverage (GH-141175) * Test unsupported format in ForwardRef.evaluate() * Test dict cell closure with multiple variables * Test all options in ForwardRef repr * Test ForwardRef being a final class (cherry picked from commit 19b573025e0aa569e7a34081116280133e33979a) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Lib/test/test_annotationlib.py | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 579b01349b30c5..0ae598b6839692 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -74,6 +74,30 @@ def inner(arg: x): anno = get_annotations(inner, format=Format.FORWARDREF) self.assertEqual(anno["arg"], x) + def test_multiple_closure(self): + def inner(arg: x[y]): + pass + + fwdref = get_annotations(inner, format=Format.FORWARDREF)["arg"] + self.assertIsInstance(fwdref, ForwardRef) + self.assertEqual(fwdref.__forward_arg__, "x[y]") + with self.assertRaises(NameError): + fwdref.evaluate() + + y = str + fwdref = get_annotations(inner, format=Format.FORWARDREF)["arg"] + self.assertIsInstance(fwdref, ForwardRef) + extra_name, extra_val = next(iter(fwdref.__extra_names__.items())) + self.assertEqual(fwdref.__forward_arg__.replace(extra_name, extra_val.__name__), "x[str]") + with self.assertRaises(NameError): + fwdref.evaluate() + + x = list + self.assertEqual(fwdref.evaluate(), x[y]) + + fwdref = get_annotations(inner, format=Format.FORWARDREF)["arg"] + self.assertEqual(fwdref, x[y]) + def test_function(self): def f(x: int, y: doesntexist): pass @@ -1799,6 +1823,14 @@ def test_forward_repr(self): repr(List[ForwardRef("int", module="mod")]), "typing.List[ForwardRef('int', module='mod')]", ) + self.assertEqual( + repr(List[ForwardRef("int", module="mod", is_class=True)]), + "typing.List[ForwardRef('int', module='mod', is_class=True)]", + ) + self.assertEqual( + repr(List[ForwardRef("int", owner="class")]), + "typing.List[ForwardRef('int', owner='class')]", + ) def test_forward_recursion_actually(self): def namespace1(): @@ -1904,6 +1936,19 @@ def test_evaluate_forwardref_format(self): support.EqualToForwardRef('"a" + 1'), ) + def test_evaluate_notimplemented_format(self): + class C: + x: alias + + fwdref = get_annotations(C, format=Format.FORWARDREF)["x"] + + with self.assertRaises(NotImplementedError): + fwdref.evaluate(format=Format.VALUE_WITH_FAKE_GLOBALS) + + with self.assertRaises(NotImplementedError): + # Some other unsupported value + fwdref.evaluate(format=7) + def test_evaluate_with_type_params(self): class Gen[T]: alias = int @@ -2037,6 +2082,11 @@ def test_fwdref_invalid_syntax(self): with self.assertRaises(SyntaxError): fr.evaluate() + def test_fwdref_final_class(self): + with self.assertRaises(TypeError): + class C(ForwardRef): + pass + class TestAnnotationLib(unittest.TestCase): def test__all__(self): From 63a3737ce7584020a20e91cfb1764ef3555ba394 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 17:40:46 +0100 Subject: [PATCH 1376/1674] [3.14] gh-139707: Specify `winreg`, `msvcrt` and `winsound` module availability in docs (GH-140429) (GH-141351) (cherry picked from commit 13fa313bebed71d8bc64f1cfdaf4b2f1ddd3ce5f) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/msvcrt.rst | 2 ++ Doc/library/winreg.rst | 2 ++ Doc/library/winsound.rst | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst index 327cc3602b1a77..a2c5e375d2cc4f 100644 --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -22,6 +22,8 @@ api. The normal API deals only with ASCII characters and is of limited use for internationalized applications. The wide char API should be used where ever possible. +.. availability:: Windows. + .. versionchanged:: 3.3 Operations in this module now raise :exc:`OSError` where :exc:`IOError` was raised. diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index 52c6c1a82821ba..6d1e8ecfc1741d 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -14,6 +14,8 @@ integer as the registry handle, a :ref:`handle object <handle-object>` is used to ensure that the handles are closed correctly, even if the programmer neglects to explicitly close them. +.. availability:: Windows. + .. _exception-changed: .. versionchanged:: 3.3 diff --git a/Doc/library/winsound.rst b/Doc/library/winsound.rst index 925984c3cdb0cb..93c0c025982076 100644 --- a/Doc/library/winsound.rst +++ b/Doc/library/winsound.rst @@ -13,6 +13,8 @@ The :mod:`winsound` module provides access to the basic sound-playing machinery provided by Windows platforms. It includes functions and several constants. +.. availability:: Windows. + .. function:: Beep(frequency, duration) From 9f425194318e0c11e60f1b1144d5ee902c58ba60 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 17:55:01 +0100 Subject: [PATCH 1377/1674] [3.14] GH-141212: Fix possible memory leak in gc_mark_span_push (gh-141213) (gh-141364) (cherry picked from commit f835552946e29ec20144c359b8822f9e421d4d64) Co-authored-by: Sergey Miryanov <sergey.miryanov@gmail.com> --- Python/gc_free_threading.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 5aaa68c5b51f95..94c77991f5f45b 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -675,10 +675,11 @@ gc_mark_span_push(gc_span_stack_t *ss, PyObject **start, PyObject **end) else { ss->capacity *= 2; } - ss->stack = (gc_span_t *)PyMem_Realloc(ss->stack, ss->capacity * sizeof(gc_span_t)); - if (ss->stack == NULL) { + gc_span_t *new_stack = (gc_span_t *)PyMem_Realloc(ss->stack, ss->capacity * sizeof(gc_span_t)); + if (new_stack == NULL) { return -1; } + ss->stack = new_stack; } assert(end > start); ss->stack[ss->size].start = start; From 96820d872fb2466bbc8f17baccccd71cd8a05293 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 18:52:15 +0100 Subject: [PATCH 1378/1674] [3.14] gh-141004: Document `PyType_FastSubclass` (GH-141313) (GH-141368) gh-141004: Document `PyType_FastSubclass` (GH-141313) (cherry picked from commit ed0a5fd8cacb1964111d03ff37627f6bea5e6026) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/type.rst | 12 ++++++++++++ Doc/c-api/typeobj.rst | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 5bdbff4e0ad990..479ede70b01f5d 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -133,6 +133,18 @@ Type Objects Type features are denoted by single bit flags. +.. c:function:: int PyType_FastSubclass(PyTypeObject *type, int flag) + + Return non-zero if the type object *type* sets the subclass flag *flag*. + Subclass flags are denoted by + :c:macro:`Py_TPFLAGS_*_SUBCLASS <Py_TPFLAGS_LONG_SUBCLASS>`. + This function is used by many ``_Check`` functions for common types. + + .. seealso:: + :c:func:`PyObject_TypeCheck`, which is used as a slower alternative in + ``_Check`` functions for types that don't come with subclass flags. + + .. c:function:: int PyType_IS_GC(PyTypeObject *o) Return true if the type object includes support for the cycle detector; this diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 3aff9e2d6a972d..a50b61e0468902 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1336,8 +1336,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:macro:: Py_TPFLAGS_BASE_EXC_SUBCLASS .. c:macro:: Py_TPFLAGS_TYPE_SUBCLASS - These flags are used by functions such as - :c:func:`PyLong_Check` to quickly determine if a type is a subclass + Functions such as :c:func:`PyLong_Check` will call :c:func:`PyType_FastSubclass` + with one of these flags to quickly determine if a type is a subclass of a built-in type; such specific checks are faster than a generic check, like :c:func:`PyObject_IsInstance`. Custom types that inherit from built-ins should have their :c:member:`~PyTypeObject.tp_flags` From 9a5cf6f62ce3340b8898dcf4604a5f8bdfe49d45 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:42:10 +0100 Subject: [PATCH 1379/1674] [3.14] gh-141004: Document missing frame APIs (GH-141189) (GH-141379) gh-141004: Document missing frame APIs (GH-141189) (cherry picked from commit 86513f6c2ebdd1fb692c39b84786ea41d88c84fd) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/frame.rst | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/Doc/c-api/frame.rst b/Doc/c-api/frame.rst index 1a52e146a69751..fb17cf7f1da6b2 100644 --- a/Doc/c-api/frame.rst +++ b/Doc/c-api/frame.rst @@ -29,6 +29,12 @@ See also :ref:`Reflection <reflection>`. Previously, this type was only available after including ``<frameobject.h>``. +.. c:function:: PyFrameObject *PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) + + Create a new frame object. This function returns a :term:`strong reference` + to the new frame object on success, and returns ``NULL`` with an exception + set on failure. + .. c:function:: int PyFrame_Check(PyObject *obj) Return non-zero if *obj* is a frame object. @@ -161,6 +167,57 @@ See :pep:`667` for more information. Return non-zero if *obj* is a frame :func:`locals` proxy. + +Legacy Local Variable APIs +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These APIs are :term:`soft deprecated`. As of Python 3.13, they do nothing. +They exist solely for backwards compatibility. + + +.. c:function:: void PyFrame_LocalsToFast(PyFrameObject *f, int clear) + + This function is :term:`soft deprecated` and does nothing. + + Prior to Python 3.13, this function would copy the :attr:`~frame.f_locals` + attribute of *f* to the internal "fast" array of local variables, allowing + changes in frame objects to be visible to the interpreter. If *clear* was + true, this function would process variables that were unset in the locals + dictionary. + + .. versionchanged:: 3.13 + This function now does nothing. + + +.. c:function:: void PyFrame_FastToLocals(PyFrameObject *f) + + This function is :term:`soft deprecated` and does nothing. + + Prior to Python 3.13, this function would copy the internal "fast" array + of local variables (which is used by the interpreter) to the + :attr:`~frame.f_locals` attribute of *f*, allowing changes in local + variables to be visible to frame objects. + + .. versionchanged:: 3.13 + This function now does nothing. + + +.. c:function:: int PyFrame_FastToLocalsWithError(PyFrameObject *f) + + This function is :term:`soft deprecated` and does nothing. + + Prior to Python 3.13, this function was similar to + :c:func:`PyFrame_FastToLocals`, but would return ``0`` on success, and + ``-1`` with an exception set on failure. + + .. versionchanged:: 3.13 + This function now does nothing. + + +.. seealso:: + :pep:`667` + + Internal Frames ^^^^^^^^^^^^^^^ From 462e2255ef0f86f28df6e513f3cecc084929b365 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:44:05 +0100 Subject: [PATCH 1380/1674] [3.14] gh-141174: Improve `annotationlib._Stringifier` test coverage (GH-141220) (#141358) gh-141174: Improve `annotationlib._Stringifier` test coverage (GH-141220) * Test `_Stringifier.__convert_to_ast()` for containers * Test partial evaluation of `ForwardRef`s in `_Stringifier` (cherry picked from commit 55ea13231313a2133e6f5a6112409d349081f273) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Lib/test/test_annotationlib.py | 67 ++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 0ae598b6839692..9f3275d5071484 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -119,6 +119,10 @@ def f( alpha: some | obj, beta: +some, gamma: some < obj, + delta: some | {obj: module}, + epsilon: some | {obj, module}, + zeta: some | [obj], + eta: some | (), ): pass @@ -147,6 +151,69 @@ def f( self.assertIsInstance(gamma_anno, ForwardRef) self.assertEqual(gamma_anno, support.EqualToForwardRef("some < obj", owner=f)) + delta_anno = anno["delta"] + self.assertIsInstance(delta_anno, ForwardRef) + self.assertEqual(delta_anno, support.EqualToForwardRef("some | {obj: module}", owner=f)) + + epsilon_anno = anno["epsilon"] + self.assertIsInstance(epsilon_anno, ForwardRef) + self.assertEqual(epsilon_anno, support.EqualToForwardRef("some | {obj, module}", owner=f)) + + zeta_anno = anno["zeta"] + self.assertIsInstance(zeta_anno, ForwardRef) + self.assertEqual(zeta_anno, support.EqualToForwardRef("some | [obj]", owner=f)) + + eta_anno = anno["eta"] + self.assertIsInstance(eta_anno, ForwardRef) + self.assertEqual(eta_anno, support.EqualToForwardRef("some | ()", owner=f)) + + def test_partially_nonexistent(self): + # These annotations start with a non-existent variable and then use + # global types with defined values. This partially evaluates by putting + # those globals into `fwdref.__extra_names__`. + def f( + x: obj | int, + y: container[int:obj, int], + z: dict_val | {str: int}, + alpha: set_val | {str, int}, + beta: obj | bool | int, + gamma: obj | call_func(int, kwd=bool), + ): + pass + + def func(*args, **kwargs): + return Union[*args, *(kwargs.values())] + + anno = get_annotations(f, format=Format.FORWARDREF) + globals_ = { + "obj": str, "container": list, "dict_val": {1: 2}, "set_val": {1, 2}, + "call_func": func + } + + x_anno = anno["x"] + self.assertIsInstance(x_anno, ForwardRef) + self.assertEqual(x_anno.evaluate(globals=globals_), str | int) + + y_anno = anno["y"] + self.assertIsInstance(y_anno, ForwardRef) + self.assertEqual(y_anno.evaluate(globals=globals_), list[int:str, int]) + + z_anno = anno["z"] + self.assertIsInstance(z_anno, ForwardRef) + self.assertEqual(z_anno.evaluate(globals=globals_), {1: 2} | {str: int}) + + alpha_anno = anno["alpha"] + self.assertIsInstance(alpha_anno, ForwardRef) + self.assertEqual(alpha_anno.evaluate(globals=globals_), {1, 2} | {str, int}) + + beta_anno = anno["beta"] + self.assertIsInstance(beta_anno, ForwardRef) + self.assertEqual(beta_anno.evaluate(globals=globals_), str | bool | int) + + gamma_anno = anno["gamma"] + self.assertIsInstance(gamma_anno, ForwardRef) + self.assertEqual(gamma_anno.evaluate(globals=globals_), str | func(int, kwd=bool)) + def test_partially_nonexistent_union(self): # Test unions with '|' syntax equal unions with typing.Union[] with some forwardrefs class UnionForwardrefs: From 6d31d085f0fedbbafec68ee821f1c0902ac6233f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 05:56:07 +0100 Subject: [PATCH 1381/1674] [3.14] gh-140578: Doc: Remove sencence implying that concurrent.futures.ThreadPoolExecutor does not exist (GH-140689) (#141382) gh-140578: Doc: Remove sencence implying that concurrent.futures.ThreadPoolExecutor does not exist (GH-140689) * Doc: Remove sencence implying that concurrent.futures.ThreadPoolExecutor does not exist Closes GH-140578 * Add NEWS.d entry for gh-140578 --------- (cherry picked from commit 46b58e1bb9e1e17d855588935f5a259be960a3a1) Co-authored-by: Louis <paternal@users.noreply.github.com> Co-authored-by: Louis Paternault <spalax@gresille.org> --- Doc/library/multiprocessing.rst | 7 +++++-- .../2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 85c3abad52a646..0d46a5dfc7466e 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -22,8 +22,7 @@ to this, the :mod:`multiprocessing` module allows the programmer to fully leverage multiple processors on a given machine. It runs on both POSIX and Windows. -The :mod:`multiprocessing` module also introduces APIs which do not have -analogs in the :mod:`threading` module. A prime example of this is the +The :mod:`multiprocessing` module also introduces the :class:`~multiprocessing.pool.Pool` object which offers a convenient means of parallelizing the execution of a function across multiple input values, distributing the input data across processes (data parallelism). The following @@ -44,6 +43,10 @@ will print to standard output :: [1, 4, 9] +The :mod:`multiprocessing` module also introduces APIs which do not have +analogs in the :mod:`threading` module, like the ability to :meth:`terminate +<Process.terminate>`, :meth:`interrupt <Process.interrupt>` or :meth:`kill +<Process.kill>` a running process. .. seealso:: diff --git a/Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst b/Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst new file mode 100644 index 00000000000000..702d38d4d24df6 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst @@ -0,0 +1,3 @@ +Remove outdated sencence in the documentation for :mod:`multiprocessing`, +that implied that :class:`concurrent.futures.ThreadPoolExecutor` did not +exist. From ec836f2ad65ae7c254f8de6bbc26de91c2ed6163 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 06:24:24 +0100 Subject: [PATCH 1382/1674] [3.14] gh-140485: Catch ChildProcessError in multiprocessing resource tracker (GH-141132) (#141384) gh-140485: Catch ChildProcessError in multiprocessing resource tracker (GH-141132) (cherry picked from commit 9cb8c52d5e9a83efe4fa3878db06befd9df52f54) Co-authored-by: Victor Stinner <vstinner@python.org> --- Lib/multiprocessing/resource_tracker.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index c53092f6e34b32..38fcaed48fa9fb 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -111,7 +111,12 @@ def _stop_locked( close(self._fd) self._fd = None - _, status = waitpid(self._pid, 0) + try: + _, status = waitpid(self._pid, 0) + except ChildProcessError: + self._pid = None + self._exitcode = None + return self._pid = None From a468ba0a9daaefaa159dafd585c9285641fd0e5d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 07:08:45 +0100 Subject: [PATCH 1383/1674] [3.14] gh-140379: add hyperlinks to list and set (GH-140399) (#141386) gh-140379: add hyperlinks to list and set (GH-140399) add hyperlinks to list and set (cherry picked from commit 92741c59f89e114474bdb2cb539107ef6bae0b9c) Co-authored-by: Krishna Chaitanya <141550576+XChaitanyaX@users.noreply.github.com> --- Doc/tutorial/datastructures.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 1332c53f39687e..7e02e74177c457 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -12,9 +12,8 @@ and adds some new things as well. More on Lists ============= -The list data type has some more methods. Here are all of the methods of list -objects: - +The :ref:`list <typesseq-list>` data type has some more methods. Here are all +of the methods of list objects: .. method:: list.append(x) :noindex: @@ -445,10 +444,11 @@ packing and sequence unpacking. Sets ==== -Python also includes a data type for *sets*. A set is an unordered collection -with no duplicate elements. Basic uses include membership testing and -eliminating duplicate entries. Set objects also support mathematical operations -like union, intersection, difference, and symmetric difference. +Python also includes a data type for :ref:`sets <types-set>`. A set is +an unordered collection with no duplicate elements. Basic uses include +membership testing and eliminating duplicate entries. Set objects also +support mathematical operations like union, intersection, difference, and +symmetric difference. Curly braces or the :func:`set` function can be used to create sets. Note: to create an empty set you have to use ``set()``, not ``{}``; the latter creates an From 8b9494099ace29df8619391d7449ca4b18917ce8 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev <skirpichev@gmail.com> Date: Tue, 11 Nov 2025 16:52:37 +0300 Subject: [PATCH 1384/1674] [3.14] gh-141004: document Py_INFINITY and Py_NAN macros (GH-141145) (#141399) (cherry picked from commit d69447445cbacf7537bf59c5c683a3b17060312d) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/float.rst | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index edee498a0b80f3..21e254aa6fb600 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -78,6 +78,34 @@ Floating-Point Objects Return the minimum normalized positive float *DBL_MIN* as C :c:expr:`double`. +.. c:macro:: Py_INFINITY + + This macro expands a to constant expression of type :c:expr:`double`, that + represents the positive infinity. + + On most platforms, this is equivalent to the :c:macro:`!INFINITY` macro from + the C11 standard ``<math.h>`` header. + + +.. c:macro:: Py_NAN + + This macro expands a to constant expression of type :c:expr:`double`, that + represents a quiet not-a-number (qNaN) value. + + On most platforms, this is equivalent to the :c:macro:`!NAN` macro from + the C11 standard ``<math.h>`` header. + + +.. c:macro:: Py_MATH_El + + High precision (long double) definition of :data:`~math.e` constant. + + +.. c:macro:: Py_MATH_PIl + + High precision (long double) definition of :data:`~math.pi` constant. + + .. c:macro:: Py_RETURN_NAN Return :data:`math.nan` from a function. From 068bddce88a783d7232d334fa0addd82cbcd0dad Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:28:14 +0100 Subject: [PATCH 1385/1674] [3.14] gh-141004: Document `PyType_Unwatch` (GH-141414) (GH-141418) gh-141004: Document `PyType_Unwatch` (GH-141414) (cherry picked from commit 759a048d4bea522fda2fe929be0fba1650c62b0e) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/type.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 479ede70b01f5d..29ffeb7c483dce 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -116,6 +116,20 @@ Type Objects .. versionadded:: 3.12 +.. c:function:: int PyType_Unwatch(int watcher_id, PyObject *type) + + Mark *type* as not watched. This undoes a previous call to + :c:func:`PyType_Watch`. *type* must not be ``NULL``. + + An extension should never call this function with a *watcher_id* that was + not returned to it by a previous call to :c:func:`PyType_AddWatcher`. + + On success, this function returns ``0``. On failure, this function returns + ``-1`` with an exception set. + + .. versionadded:: 3.12 + + .. c:type:: int (*PyType_WatchCallback)(PyObject *type) Type of a type-watcher callback function. From 7618a40a17402660ef3309aed1df6e54cd5ffd5a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 20:42:13 +0100 Subject: [PATCH 1386/1674] [3.14] gh-139533: fix refs to code without proper markups on turtledemo doc (GH-139534) (#141421) gh-139533: fix refs to code without proper markups on turtledemo doc (GH-139534) (cherry picked from commit c903d768322989e9f8ba79e38ee87e14c85c5430) gh-139533: fix refs to code without proper markups on turtledemo documentation Co-authored-by: Marco Barbosa <aureliobarbosa@gmail.com> --- Doc/library/turtle.rst | 124 ++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 58b99e0d44173a..95a57c57e71d56 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -2801,68 +2801,68 @@ The demo scripts are: .. tabularcolumns:: |l|L|L| -+----------------+------------------------------+-----------------------+ -| Name | Description | Features | -+================+==============================+=======================+ -| bytedesign | complex classical | :func:`tracer`, delay,| -| | turtle graphics pattern | :func:`update` | -+----------------+------------------------------+-----------------------+ -| chaos | graphs Verhulst dynamics, | world coordinates | -| | shows that computer's | | -| | computations can generate | | -| | results sometimes against the| | -| | common sense expectations | | -+----------------+------------------------------+-----------------------+ -| clock | analog clock showing time | turtles as clock's | -| | of your computer | hands, ontimer | -+----------------+------------------------------+-----------------------+ -| colormixer | experiment with r, g, b | :func:`ondrag` | -+----------------+------------------------------+-----------------------+ -| forest | 3 breadth-first trees | randomization | -+----------------+------------------------------+-----------------------+ -| fractalcurves | Hilbert & Koch curves | recursion | -+----------------+------------------------------+-----------------------+ -| lindenmayer | ethnomathematics | L-System | -| | (indian kolams) | | -+----------------+------------------------------+-----------------------+ -| minimal_hanoi | Towers of Hanoi | Rectangular Turtles | -| | | as Hanoi discs | -| | | (shape, shapesize) | -+----------------+------------------------------+-----------------------+ -| nim | play the classical nim game | turtles as nimsticks, | -| | with three heaps of sticks | event driven (mouse, | -| | against the computer. | keyboard) | -+----------------+------------------------------+-----------------------+ -| paint | super minimalistic | :func:`onclick` | -| | drawing program | | -+----------------+------------------------------+-----------------------+ -| peace | elementary | turtle: appearance | -| | | and animation | -+----------------+------------------------------+-----------------------+ -| penrose | aperiodic tiling with | :func:`stamp` | -| | kites and darts | | -+----------------+------------------------------+-----------------------+ -| planet_and_moon| simulation of | compound shapes, | -| | gravitational system | :class:`Vec2D` | -+----------------+------------------------------+-----------------------+ -| rosette | a pattern from the wikipedia | :func:`clone`, | -| | article on turtle graphics | :func:`undo` | -+----------------+------------------------------+-----------------------+ -| round_dance | dancing turtles rotating | compound shapes, clone| -| | pairwise in opposite | shapesize, tilt, | -| | direction | get_shapepoly, update | -+----------------+------------------------------+-----------------------+ -| sorting_animate| visual demonstration of | simple alignment, | -| | different sorting methods | randomization | -+----------------+------------------------------+-----------------------+ -| tree | a (graphical) breadth | :func:`clone` | -| | first tree (using generators)| | -+----------------+------------------------------+-----------------------+ -| two_canvases | simple design | turtles on two | -| | | canvases | -+----------------+------------------------------+-----------------------+ -| yinyang | another elementary example | :func:`circle` | -+----------------+------------------------------+-----------------------+ ++------------------------+------------------------------+--------------------------------------+ +| Name | Description | Features | ++========================+==============================+======================================+ +| ``bytedesign`` | complex classical | :func:`tracer`, :func:`delay`, | +| | turtle graphics pattern | :func:`update` | ++------------------------+------------------------------+--------------------------------------+ +| ``chaos`` | graphs Verhulst dynamics, | world coordinates | +| | shows that computer's | | +| | computations can generate | | +| | results sometimes against the| | +| | common sense expectations | | ++------------------------+------------------------------+--------------------------------------+ +| ``clock`` | analog clock showing time | turtles as clock's | +| | of your computer | hands, :func:`ontimer` | ++------------------------+------------------------------+--------------------------------------+ +| ``colormixer`` | experiment with r, g, b | :func:`ondrag` | ++------------------------+------------------------------+--------------------------------------+ +| ``forest`` | 3 breadth-first trees | randomization | ++------------------------+------------------------------+--------------------------------------+ +| ``fractalcurves`` | Hilbert & Koch curves | recursion | ++------------------------+------------------------------+--------------------------------------+ +| ``lindenmayer`` | ethnomathematics | L-System | +| | (indian kolams) | | ++------------------------+------------------------------+--------------------------------------+ +| ``minimal_hanoi`` | Towers of Hanoi | Rectangular Turtles | +| | | as Hanoi discs | +| | | (:func:`shape`, :func:`shapesize`) | ++------------------------+------------------------------+--------------------------------------+ +| ``nim`` | play the classical nim game | turtles as nimsticks, | +| | with three heaps of sticks | event driven (mouse, | +| | against the computer. | keyboard) | ++------------------------+------------------------------+--------------------------------------+ +| ``paint`` | super minimalistic | :func:`onclick` | +| | drawing program | | ++------------------------+------------------------------+--------------------------------------+ +| ``peace`` | elementary | turtle: appearance | +| | | and animation | ++------------------------+------------------------------+--------------------------------------+ +| ``penrose`` | aperiodic tiling with | :func:`stamp` | +| | kites and darts | | ++------------------------+------------------------------+--------------------------------------+ +| ``planet_and_moon`` | simulation of | compound shapes, | +| | gravitational system | :class:`Vec2D` | ++------------------------+------------------------------+--------------------------------------+ +| ``rosette`` | a pattern from the wikipedia | :func:`clone`, | +| | article on turtle graphics | :func:`undo` | ++------------------------+------------------------------+--------------------------------------+ +| ``round_dance`` | dancing turtles rotating | compound shapes, :func:`clone` | +| | pairwise in opposite | :func:`shapesize`, :func:`tilt`, | +| | direction | :func:`get_shapepoly`, :func:`update`| ++------------------------+------------------------------+--------------------------------------+ +| ``sorting_animate`` | visual demonstration of | simple alignment, | +| | different sorting methods | randomization | ++------------------------+------------------------------+--------------------------------------+ +| ``tree`` | a (graphical) breadth | :func:`clone` | +| | first tree (using generators)| | ++------------------------+------------------------------+--------------------------------------+ +| ``two_canvases`` | simple design | turtles on two | +| | | canvases | ++------------------------+------------------------------+--------------------------------------+ +| ``yinyang`` | another elementary example | :func:`circle` | ++------------------------+------------------------------+--------------------------------------+ Have fun! From dc00dcfe88f9d764e0ad41adc5ffeedd0e34a073 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 20:53:31 +0100 Subject: [PATCH 1387/1674] [3.14] gh-140193: Forward port test_exec_set_nomemory_hang from 3.13 (GH-140187) (#141420) gh-140193: Forward port test_exec_set_nomemory_hang from 3.13 (GH-140187) * chore: test_exec_set_nomemory_hang from 3.13 * fix: apply comments * Update Lib/test/test_exceptions.py * Update Lib/test/test_exceptions.py * fix: windows too long name 60 times is enough --------- (cherry picked from commit 0f09bda643d778fb20fb79fecdfd09f20f9d9717) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Lib/test/test_exceptions.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 273f73937183b8..4f5ffe66eaf585 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1914,6 +1914,39 @@ def test_keyerror_context(self): exc2 = None + @cpython_only + # Python built with Py_TRACE_REFS fail with a fatal error in + # _PyRefchain_Trace() on memory allocation error. + @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build') + def test_exec_set_nomemory_hang(self): + import_module("_testcapi") + # gh-134163: A MemoryError inside code that was wrapped by a try/except + # block would lead to an infinite loop. + + # The frame_lasti needs to be greater than 257 to prevent + # PyLong_FromLong() from returning cached integers, which + # don't require a memory allocation. Prepend some dummy code + # to artificially increase the instruction index. + warmup_code = "a = list(range(0, 1))\n" * 60 + user_input = warmup_code + dedent(""" + try: + import _testcapi + _testcapi.set_nomemory(0) + b = list(range(1000, 2000)) + except Exception as e: + import traceback + traceback.print_exc() + """) + with SuppressCrashReport(): + with script_helper.spawn_python('-c', user_input) as p: + p.wait() + output = p.stdout.read() + + self.assertIn(p.returncode, (0, 1)) + self.assertGreater(len(output), 0) # At minimum, should not hang + self.assertIn(b"MemoryError", output) + + class NameErrorTests(unittest.TestCase): def test_name_error_has_name(self): try: From 03fca07f839fe6c454dfbed37d91c49ee640b38d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 21:08:52 +0100 Subject: [PATCH 1388/1674] Add documentation for Python install manager's install_dir, global_dir and download_dir (GH-140223) (cherry picked from commit 336154f4b0dbcf1d9dbb461ae962d558ba60f452) Co-authored-by: Steve Dower <steve.dower@python.org> --- Doc/using/windows.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index ab0ed3fb110fac..52212c394cff2b 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -457,6 +457,25 @@ customization. - Specify the default format used by the ``py list`` command. By default, ``table``. + * - ``install_dir`` + - (none) + - Specify the root directory that runtimes will be installed into. + If you change this setting, previously installed runtimes will not be + usable unless you move them to the new location. + + * - ``global_dir`` + - (none) + - Specify the directory where global commands (such as ``python3.14.exe``) + are stored. + This directory should be added to your :envvar:`PATH` to make the + commands available from your terminal. + + * - ``download_dir`` + - (none) + - Specify the directory where downloaded files are stored. + This directory is a temporary cache, and can be cleaned up from time to + time. + Dotted names should be nested inside JSON objects, for example, ``list.format`` would be specified as ``{"list": {"format": "table"}}``. From 91f33ef3c8d3708a61d37de83fe120fd43e22a8d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Nov 2025 22:48:29 +0100 Subject: [PATCH 1389/1674] [3.14] gh-141004: Document `PyFile_OpenCode` and `PyFile_OpenCodeObject` (GH-141413) (GH-141425) gh-141004: Document `PyFile_OpenCode` and `PyFile_OpenCodeObject` (GH-141413) (cherry picked from commit 2befce86e699fdbb6610949b029bad56a0d0780f) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/file.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index e9019a0d500f7e..9d01254ddb2a11 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -93,6 +93,29 @@ the :mod:`io` APIs instead. .. versionadded:: 3.8 +.. c:function:: PyObject *PyFile_OpenCodeObject(PyObject *path) + + Open *path* with the mode ``'rb'``. *path* must be a Python :class:`str` + object. The behavior of this function may be overridden by + :c:func:`PyFile_SetOpenCodeHook` to allow for some preprocessing of the + text. + + This is analogous to :func:`io.open_code` in Python. + + On success, this function returns a :term:`strong reference` to a Python + file object. On failure, this function returns ``NULL`` with an exception + set. + + .. versionadded:: 3.8 + + +.. c:function:: PyObject *PyFile_OpenCode(const char *path) + + Similar to :c:func:`PyFile_OpenCodeObject`, but *path* is a + UTF-8 encoded :c:expr:`const char*`. + + .. versionadded:: 3.8 + .. c:function:: int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags) From 83c3eae099c8d2a64e85ba94289f561c5e6d5521 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:12:57 +0100 Subject: [PATCH 1390/1674] [3.14] gh-138775: fix handle `python -m base64` stdin correct with EOF signal (GH-138776) (#141432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-138775: fix handle `python -m base64` stdin correct with EOF signal (GH-138776) * fix: handle stdin correct with EOF single. * fix: flollow the comments when pipe stdin use buffer * Apply suggestions from code review * fix: apply review comments in Lib/base64.py * fix: address comments * Reword comment and NEWS entry. --------- (cherry picked from commit f5c2a41f9a6b3be95c5be9dbae0a4a3342d356dc) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Gregory P. Smith <greg@krypto.org> --- Lib/base64.py | 9 ++++++++- .../2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst diff --git a/Lib/base64.py b/Lib/base64.py index cfc57626c40ba9..f95132a4274051 100644 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -604,7 +604,14 @@ def main(): with open(args[0], 'rb') as f: func(f, sys.stdout.buffer) else: - func(sys.stdin.buffer, sys.stdout.buffer) + if sys.stdin.isatty(): + # gh-138775: read terminal input data all at once to detect EOF + import io + data = sys.stdin.buffer.read() + buffer = io.BytesIO(data) + else: + buffer = sys.stdin.buffer + func(buffer, sys.stdout.buffer) if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst b/Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst new file mode 100644 index 00000000000000..455c1a9925a5e1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst @@ -0,0 +1,2 @@ +Use of ``python -m`` with :mod:`base64` has been fixed to detect input from a +terminal so that it properly notices EOF. From 21c9c919aa7f217d5e7ad1d1549a556392af2143 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:13:10 +0100 Subject: [PATCH 1391/1674] [3.14] gh-137952: update `csv.Sniffer().has_header()` docs to describe the actual off-by-onish behavior (GH-137953) (#141434) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-137952: update `csv.Sniffer().has_header()` docs to describe the actual off-by-onish behavior (GH-137953) * checks 21, not 20 * Say "header" instead of "first row" to disambiguate per review. --------- (cherry picked from commit 0d7b48a8f5de5c1c6d57e1cf7194b6fb222d92e5) Co-authored-by: Maurycy Pawłowski-Wieroński <maurycy@maurycy.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/csv.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 3ea7cd210f729d..4a033d823e6a7e 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -295,8 +295,8 @@ The :mod:`csv` module defines the following classes: - 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. + Twenty-one rows after the header are sampled; if more than half of the + columns + rows meet the criteria, :const:`True` is returned. .. note:: From 947354e338428d0ec64390c258e1f74a8d3cc603 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:58:15 +0100 Subject: [PATCH 1392/1674] [3.14] gh-138621: Increase test coverage for csv.DictReader and csv.Sniffer (GH-138622) (#141436) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-138621: Increase test coverage for csv.DictReader and csv.Sniffer (GH-138622) * Increase test coverage for csv.DictReader and csv.Sniffer Previously there were no tests for the DictReader fieldnames setter, the case where a StopIteration was encountered when trying to determine the fieldnames from the content or the case where Sniffer could not find a delimiter. * Revert whitespace change to comment * Add a test that csv.Sniffer.has_header checks up to 20 rows * Replace name and age with letter and offset * Address review comment --------- (cherry picked from commit 0e88be6f55f35ab045e57f9f869b893c15dcc099) Co-authored-by: Jan-Eric Nitschke <47750513+JanEricNitschke@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/test/test_csv.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 60feab225a107c..98ee0c3cdd7a06 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -918,6 +918,14 @@ def test_dict_reader_fieldnames_accepts_list(self): reader = csv.DictReader(f, fieldnames) self.assertEqual(reader.fieldnames, fieldnames) + def test_dict_reader_set_fieldnames(self): + fieldnames = ["a", "b", "c"] + f = StringIO() + reader = csv.DictReader(f) + self.assertIsNone(reader.fieldnames) + reader.fieldnames = fieldnames + self.assertEqual(reader.fieldnames, fieldnames) + def test_dict_writer_fieldnames_rejects_iter(self): fieldnames = ["a", "b", "c"] f = StringIO() @@ -933,6 +941,7 @@ def test_dict_writer_fieldnames_accepts_list(self): def test_dict_reader_fieldnames_is_optional(self): f = StringIO() reader = csv.DictReader(f, fieldnames=None) + self.assertIsNone(reader.fieldnames) def test_read_dict_fields(self): with TemporaryFile("w+", encoding="utf-8") as fileobj: @@ -1353,6 +1362,19 @@ class TestSniffer(unittest.TestCase): ghi\0jkl """ + sample15 = "\n\n\n" + sample16 = "abc\ndef\nghi" + + sample17 = ["letter,offset"] + sample17.extend(f"{chr(ord('a') + i)},{i}" for i in range(20)) + sample17.append("v,twenty_one") # 'u' was skipped + sample17 = '\n'.join(sample17) + + sample18 = ["letter,offset"] + sample18.extend(f"{chr(ord('a') + i)},{i}" for i in range(21)) + sample18.append("v,twenty_one") # 'u' was not skipped + sample18 = '\n'.join(sample18) + def test_issue43625(self): sniffer = csv.Sniffer() self.assertTrue(sniffer.has_header(self.sample12)) @@ -1374,6 +1396,11 @@ def test_has_header_regex_special_delimiter(self): self.assertIs(sniffer.has_header(self.sample8), False) self.assertIs(sniffer.has_header(self.header2 + self.sample8), True) + def test_has_header_checks_20_rows(self): + sniffer = csv.Sniffer() + self.assertFalse(sniffer.has_header(self.sample17)) + self.assertTrue(sniffer.has_header(self.sample18)) + def test_guess_quote_and_delimiter(self): sniffer = csv.Sniffer() for header in (";'123;4';", "'123;4';", ";'123;4'", "'123;4'"): @@ -1423,6 +1450,10 @@ def test_delimiters(self): self.assertEqual(dialect.quotechar, "'") dialect = sniffer.sniff(self.sample14) self.assertEqual(dialect.delimiter, '\0') + self.assertRaisesRegex(csv.Error, "Could not determine delimiter", + sniffer.sniff, self.sample15) + self.assertRaisesRegex(csv.Error, "Could not determine delimiter", + sniffer.sniff, self.sample16) def test_doublequote(self): sniffer = csv.Sniffer() From df045716e0b4475b05a59eee69fbc077f2edc819 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 02:33:49 +0100 Subject: [PATCH 1393/1674] [3.14] GH-137618: Require Python 3.10 to Python 3.15 for PYTHON_FOR_REGEN (GH-137619) (#141437) GH-137618: Require Python 3.10 to Python 3.15 for PYTHON_FOR_REGEN (GH-137619) * Require Python 3.11 to Python 3.15 for PYTHON_FOR_REGEN * NEWS * keep allowing python 3.10 --------- (cherry picked from commit 9ce99c6c1901705238e4cb3ce81eb6f499e7b4f4) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Gregory P. Smith <greg@krypto.org> --- .../next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst | 2 ++ configure | 2 +- configure.ac | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst diff --git a/Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst b/Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst new file mode 100644 index 00000000000000..0b56c4c8f68566 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst @@ -0,0 +1,2 @@ +``PYTHON_FOR_REGEN`` now requires Python 3.10 to Python 3.15. +Patch by Adam Turner. diff --git a/configure b/configure index 2c403f4965ddfe..fb92ea2c61febd 100755 --- a/configure +++ b/configure @@ -3816,7 +3816,7 @@ fi -for ac_prog in python$PACKAGE_VERSION python3.13 python3.12 python3.11 python3.10 python3 python +for ac_prog in python$PACKAGE_VERSION python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 python3 python do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 diff --git a/configure.ac b/configure.ac index 07b005bacaf279..0742ba7f6d1498 100644 --- a/configure.ac +++ b/configure.ac @@ -205,7 +205,7 @@ AC_SUBST([FREEZE_MODULE_DEPS]) AC_SUBST([PYTHON_FOR_BUILD_DEPS]) AC_CHECK_PROGS([PYTHON_FOR_REGEN], - [python$PACKAGE_VERSION python3.13 python3.12 python3.11 python3.10 python3 python], + [python$PACKAGE_VERSION python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 python3 python], [python3]) AC_SUBST([PYTHON_FOR_REGEN]) From 604a5a6a113b5bae1c32175a3a12571dbbe70d3d Mon Sep 17 00:00:00 2001 From: Peter Bierma <zintensitydev@gmail.com> Date: Tue, 11 Nov 2025 21:06:36 -0500 Subject: [PATCH 1394/1674] [3.14] gh-141004: Document `PyBytes_Repr` and `PyBytes_DecodeEscape` (GH-141407) (GH-141440) * gh-141004: Document `PyBytes_Repr` and `PyBytes_DecodeEscape` (GH-141407) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> (cherry picked from commit 37e2762ee12c2d7fc465938d7161a9a0640bd71f) --- Doc/c-api/bytes.rst | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index d47beee68eaa33..7d8a511e100cf4 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -219,3 +219,38 @@ called with a non-bytes parameter. reallocation fails, the original bytes object at *\*bytes* is deallocated, *\*bytes* is set to ``NULL``, :exc:`MemoryError` is set, and ``-1`` is returned. + + +.. c:function:: PyObject *PyBytes_Repr(PyObject *bytes, int smartquotes) + + Get the string representation of *bytes*. This function is currently used to + implement :meth:`!bytes.__repr__` in Python. + + This function does not do type checking; it is undefined behavior to pass + *bytes* as a non-bytes object or ``NULL``. + + If *smartquotes* is true, the representation will use a double-quoted string + instead of single-quoted string when single-quotes are present in *bytes*. + For example, the byte string ``'Python'`` would be represented as + ``b"'Python'"`` when *smartquotes* is true, or ``b'\'Python\''`` when it is + false. + + On success, this function returns a :term:`strong reference` to a + :class:`str` object containing the representation. On failure, this + returns ``NULL`` with an exception set. + + +.. c:function:: PyObject *PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, Py_ssize_t unicode, const char *recode_encoding) + + Unescape a backslash-escaped string *s*. *s* must not be ``NULL``. + *len* must be the size of *s*. + + *errors* must be one of ``"strict"``, ``"replace"``, or ``"ignore"``. If + *errors* is ``NULL``, then ``"strict"`` is used by default. + + On success, this function returns a :term:`strong reference` to a Python + :class:`bytes` object containing the unescaped string. On failure, this + function returns ``NULL`` with an exception set. + + .. versionchanged:: 3.9 + *unicode* and *recode_encoding* are now unused. From b883ad17cd1d6cc9464299c951bb779e88339775 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 10:56:47 +0100 Subject: [PATCH 1395/1674] [3.14] gh-141370: document undefined behavior of Py_ABS() (GH-141439) (GH-141454) (cherry picked from commit 20f53df07d42c495a08c73a3d54b8dd9098a62f0) Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> --- Doc/c-api/intro.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 096e4d34f664d9..04c4d7284ad4fd 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -121,6 +121,10 @@ complete listing. Return the absolute value of ``x``. + If the result cannot be represented (for example, if ``x`` has + :c:macro:`!INT_MIN` value for :c:expr:`int` type), the behavior is + undefined. + .. versionadded:: 3.3 .. c:macro:: Py_ALWAYS_INLINE From 75b5157e846a7d65eace108b9d234dfd6115735f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:23:26 +0100 Subject: [PATCH 1396/1674] [3.14] gh-141311: Avoid assertion in BytesIO.readinto() (GH-141333) (GH-141457) Fix error in assertion which causes failure if pos is equal to PY_SSIZE_T_MAX. Fix undefined behavior in read() and readinto() if pos is larger that the size of the underlying buffer. (cherry picked from commit 7d54374f9c7d91e0ef90c4ad84baf10073cf1d8a) Co-authored-by: Cody Maloney <cmaloney@users.noreply.github.com> --- Lib/test/test_memoryio.py | 14 ++++++++++++++ ...025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst | 2 ++ Modules/_io/bytesio.c | 16 +++++++++++++--- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py index 63998a86c45b53..bb023735e21398 100644 --- a/Lib/test/test_memoryio.py +++ b/Lib/test/test_memoryio.py @@ -54,6 +54,12 @@ def testSeek(self): self.assertEqual(buf[3:], bytesIo.read()) self.assertRaises(TypeError, bytesIo.seek, 0.0) + self.assertEqual(sys.maxsize, bytesIo.seek(sys.maxsize)) + self.assertEqual(self.EOF, bytesIo.read(4)) + + self.assertEqual(sys.maxsize - 2, bytesIo.seek(sys.maxsize - 2)) + self.assertEqual(self.EOF, bytesIo.read(4)) + def testTell(self): buf = self.buftype("1234567890") bytesIo = self.ioclass(buf) @@ -552,6 +558,14 @@ def test_relative_seek(self): memio.seek(1, 1) self.assertEqual(memio.read(), buf[1:]) + def test_issue141311(self): + memio = self.ioclass() + # Seek allows PY_SSIZE_T_MAX, read should handle that. + # Past end of buffer read should always return 0 (EOF). + self.assertEqual(sys.maxsize, memio.seek(sys.maxsize)) + buf = bytearray(2) + self.assertEqual(0, memio.readinto(buf)) + def test_unicode(self): memio = self.ioclass() diff --git a/Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst b/Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst new file mode 100644 index 00000000000000..bb425ce5df309d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst @@ -0,0 +1,2 @@ +Fix assertion failure in :func:`!io.BytesIO.readinto` and undefined behavior +arising when read position is above capcity in :class:`io.BytesIO`. diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 72f305d8a61f77..a3b653f30dd2cf 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -436,6 +436,13 @@ read_bytes_lock_held(bytesio *self, Py_ssize_t size) return Py_NewRef(self->buf); } + /* gh-141311: Avoid undefined behavior when self->pos (limit PY_SSIZE_T_MAX) + is beyond the size of self->buf. Assert above validates size is always in + bounds. When self->pos is out of bounds calling code sets size to 0. */ + if (size == 0) { + return PyBytes_FromStringAndSize(NULL, 0); + } + output = PyBytes_AS_STRING(self->buf) + self->pos; self->pos += size; return PyBytes_FromStringAndSize(output, size); @@ -609,11 +616,14 @@ _io_BytesIO_readinto_impl(bytesio *self, Py_buffer *buffer) n = self->string_size - self->pos; if (len > n) { len = n; - if (len < 0) - len = 0; + if (len < 0) { + /* gh-141311: Avoid undefined behavior when self->pos (limit + PY_SSIZE_T_MAX) points beyond the size of self->buf. */ + return PyLong_FromSsize_t(0); + } } - assert(self->pos + len < PY_SSIZE_T_MAX); + assert(self->pos + len <= PY_SSIZE_T_MAX); assert(len >= 0); memcpy(buffer->buf, PyBytes_AS_STRING(self->buf) + self->pos, len); self->pos += len; From e9c11b749576dfb0eb2b1a40ae84f532f1526df5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:33:34 +0100 Subject: [PATCH 1397/1674] [3.14] gh-141042: fix sNaN's packing for mixed floating-point formats (GH-141107) (#141459) gh-141042: fix sNaN's packing for mixed floating-point formats (GH-141107) (cherry picked from commit 23d85a2a3fb029172ea15c6e596f64f8c2868ed3) Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> --- Lib/test/test_capi/test_float.py | 54 +++++++++++++++---- ...-11-06-06-28-14.gh-issue-141042.brOioJ.rst | 3 ++ Objects/floatobject.c | 16 ++++-- 3 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst diff --git a/Lib/test/test_capi/test_float.py b/Lib/test/test_capi/test_float.py index 983b991b4f163d..df7017e6436a69 100644 --- a/Lib/test/test_capi/test_float.py +++ b/Lib/test/test_capi/test_float.py @@ -29,6 +29,23 @@ NAN = float("nan") +def make_nan(size, sign, quiet, payload=None): + if size == 8: + payload_mask = 0x7ffffffffffff + i = (sign << 63) + (0x7ff << 52) + (quiet << 51) + elif size == 4: + payload_mask = 0x3fffff + i = (sign << 31) + (0xff << 23) + (quiet << 22) + elif size == 2: + payload_mask = 0x1ff + i = (sign << 15) + (0x1f << 10) + (quiet << 9) + else: + raise ValueError("size must be either 2, 4, or 8") + if payload is None: + payload = random.randint(not quiet, payload_mask) + return i + payload + + class CAPIFloatTest(unittest.TestCase): def test_check(self): # Test PyFloat_Check() @@ -202,16 +219,7 @@ def test_pack_unpack_roundtrip_for_nans(self): # HP PA RISC uses 0 for quiet, see: # https://en.wikipedia.org/wiki/NaN#Encoding signaling = 1 - quiet = int(not signaling) - if size == 8: - payload = random.randint(signaling, 0x7ffffffffffff) - i = (sign << 63) + (0x7ff << 52) + (quiet << 51) + payload - elif size == 4: - payload = random.randint(signaling, 0x3fffff) - i = (sign << 31) + (0xff << 23) + (quiet << 22) + payload - elif size == 2: - payload = random.randint(signaling, 0x1ff) - i = (sign << 15) + (0x1f << 10) + (quiet << 9) + payload + i = make_nan(size, sign, not signaling) data = bytes.fromhex(f'{i:x}') for endian in (BIG_ENDIAN, LITTLE_ENDIAN): with self.subTest(data=data, size=size, endian=endian): @@ -221,6 +229,32 @@ def test_pack_unpack_roundtrip_for_nans(self): self.assertTrue(math.isnan(value)) self.assertEqual(data1, data2) + @unittest.skipUnless(HAVE_IEEE_754, "requires IEEE 754") + @unittest.skipUnless(sys.maxsize != 2147483647, "requires 64-bit mode") + def test_pack_unpack_nans_for_different_formats(self): + pack = _testcapi.float_pack + unpack = _testcapi.float_unpack + + for endian in (BIG_ENDIAN, LITTLE_ENDIAN): + with self.subTest(endian=endian): + byteorder = "big" if endian == BIG_ENDIAN else "little" + + # Convert sNaN to qNaN, if payload got truncated + data = make_nan(8, 0, False, 0x80001).to_bytes(8, byteorder) + snan_low = unpack(data, endian) + qnan4 = make_nan(4, 0, True, 0).to_bytes(4, byteorder) + qnan2 = make_nan(2, 0, True, 0).to_bytes(2, byteorder) + self.assertEqual(pack(4, snan_low, endian), qnan4) + self.assertEqual(pack(2, snan_low, endian), qnan2) + + # Preserve NaN type, if payload not truncated + data = make_nan(8, 0, False, 0x80000000001).to_bytes(8, byteorder) + snan_high = unpack(data, endian) + snan4 = make_nan(4, 0, False, 16384).to_bytes(4, byteorder) + snan2 = make_nan(2, 0, False, 2).to_bytes(2, byteorder) + self.assertEqual(pack(4, snan_high, endian), snan4) + self.assertEqual(pack(2, snan_high, endian), snan2) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst b/Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst new file mode 100644 index 00000000000000..22a1aa1f405318 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst @@ -0,0 +1,3 @@ +Make qNaN in :c:func:`PyFloat_Pack2` and :c:func:`PyFloat_Pack4`, if while +conversion to a narrower precision floating-point format --- the remaining +after truncation payload will be zero. Patch by Sergey B Kirpichev. diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 93e1973d6b32fc..700b8d4cbeb9fd 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -2028,6 +2028,10 @@ PyFloat_Pack2(double x, char *data, int le) memcpy(&v, &x, sizeof(v)); v &= 0xffc0000000000ULL; bits = (unsigned short)(v >> 42); /* NaN's type & payload */ + /* set qNaN if no payload */ + if (!bits) { + bits |= (1<<9); + } } else { sign = (x < 0.0); @@ -2200,16 +2204,16 @@ PyFloat_Pack4(double x, char *data, int le) if ((v & (1ULL << 51)) == 0) { uint32_t u32; memcpy(&u32, &y, 4); - u32 &= ~(1 << 22); /* make sNaN */ + /* if have payload, make sNaN */ + if (u32 & 0x3fffff) { + u32 &= ~(1 << 22); + } memcpy(&y, &u32, 4); } #else uint32_t u32; memcpy(&u32, &y, 4); - if ((v & (1ULL << 51)) == 0) { - u32 &= ~(1 << 22); - } /* Workaround RISC-V: "If a NaN value is converted to a * different floating-point type, the result is the * canonical NaN of the new type". The canonical NaN here @@ -2220,6 +2224,10 @@ PyFloat_Pack4(double x, char *data, int le) /* add payload */ u32 -= (u32 & 0x3fffff); u32 += (uint32_t)((v & 0x7ffffffffffffULL) >> 29); + /* if have payload, make sNaN */ + if ((v & (1ULL << 51)) == 0 && (u32 & 0x3fffff)) { + u32 &= ~(1 << 22); + } memcpy(&y, &u32, 4); #endif From 92c14a91d239463c2f0ad72ab7e8a63de18ef8ca Mon Sep 17 00:00:00 2001 From: Mohsin Mehmood <55545648+mohsinm-dev@users.noreply.github.com> Date: Wed, 12 Nov 2025 15:40:02 +0500 Subject: [PATCH 1398/1674] [3.14] gh-141314: Fix TextIOWrapper.tell() assertion failure with standalone carriage return (GH-141331) (GH-141453) The assertion was checking wrong variable (skip_back vs skip_bytes). (cherry picked from commit af80fac42548719ede7241bfbab3c2c0775b4760) --- Lib/test/test_io.py | 18 ++++++++++++++++++ ...5-11-10-01-47-18.gh-issue-141314.baaa28.rst | 1 + Modules/_io/textio.c | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 2ed95530ba534a..6514af8b1253c3 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3337,6 +3337,24 @@ def test_multibyte_seek_and_tell(self): self.assertEqual(f.tell(), p1) f.close() + def test_tell_after_readline_with_cr(self): + # Test for gh-141314: TextIOWrapper.tell() assertion failure + # when dealing with standalone carriage returns + data = b'line1\r' + with self.open(os_helper.TESTFN, "wb") as f: + f.write(data) + + with self.open(os_helper.TESTFN, "r") as f: + # Read line that ends with \r + line = f.readline() + self.assertEqual(line, "line1\n") + # This should not cause an assertion failure + pos = f.tell() + # Verify we can seek back to this position + f.seek(pos) + remaining = f.read() + self.assertEqual(remaining, "") + def test_seek_with_encoder_state(self): f = self.open(os_helper.TESTFN, "w", encoding="euc_jis_2004") f.write("\u00e6\u0300") diff --git a/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst b/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst new file mode 100644 index 00000000000000..37acaabfa3eada --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst @@ -0,0 +1 @@ +Fix assertion failure in :meth:`io.TextIOWrapper.tell` when reading files with standalone carriage return (``\r``) line endings. diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 5354cf63442599..a136987fb52a4a 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2844,7 +2844,7 @@ _io_TextIOWrapper_tell_impl(textio *self) current pos */ skip_bytes = (Py_ssize_t) (self->b2cratio * chars_to_skip); skip_back = 1; - assert(skip_back <= PyBytes_GET_SIZE(next_input)); + assert(skip_bytes <= PyBytes_GET_SIZE(next_input)); input = PyBytes_AS_STRING(next_input); while (skip_bytes > 0) { /* Decode up to temptative start point */ From ba73decce140309a6058c4b27dd934ce17025659 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:49:09 +0100 Subject: [PATCH 1399/1674] [3.14] gh-132657: add regression test for `PySet_Contains` with unhashable type (GH-141411) (#141468) gh-132657: add regression test for `PySet_Contains` with unhashable type (GH-141411) (cherry picked from commit 2ac738d325a6934e39fecb097f43d4d4ed97a2b9) Co-authored-by: M Bussonnier <bussonniermatthias@gmail.com> --- Modules/_testlimitedcapi/set.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Modules/_testlimitedcapi/set.c b/Modules/_testlimitedcapi/set.c index 35da5fa5f008e1..34ed6b1d60b5a4 100644 --- a/Modules/_testlimitedcapi/set.c +++ b/Modules/_testlimitedcapi/set.c @@ -155,6 +155,51 @@ test_frozenset_add_in_capi(PyObject *self, PyObject *Py_UNUSED(obj)) return NULL; } +static PyObject * +test_set_contains_does_not_convert_unhashable_key(PyObject *self, PyObject *Py_UNUSED(obj)) +{ + // See https://docs.python.org/3/c-api/set.html#c.PySet_Contains + PyObject *outer_set = PySet_New(NULL); + + PyObject *needle = PySet_New(NULL); + if (needle == NULL) { + Py_DECREF(outer_set); + return NULL; + } + + PyObject *num = PyLong_FromLong(42); + if (num == NULL) { + Py_DECREF(outer_set); + Py_DECREF(needle); + return NULL; + } + + if (PySet_Add(needle, num) < 0) { + Py_DECREF(outer_set); + Py_DECREF(needle); + Py_DECREF(num); + return NULL; + } + + int result = PySet_Contains(outer_set, needle); + + Py_DECREF(num); + Py_DECREF(needle); + Py_DECREF(outer_set); + + if (result < 0) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Clear(); + Py_RETURN_NONE; + } + return NULL; + } + + PyErr_SetString(PyExc_AssertionError, + "PySet_Contains should have raised TypeError for unhashable key"); + return NULL; +} + static PyMethodDef test_methods[] = { {"set_check", set_check, METH_O}, {"set_checkexact", set_checkexact, METH_O}, @@ -174,6 +219,8 @@ static PyMethodDef test_methods[] = { {"set_clear", set_clear, METH_O}, {"test_frozenset_add_in_capi", test_frozenset_add_in_capi, METH_NOARGS}, + {"test_set_contains_does_not_convert_unhashable_key", + test_set_contains_does_not_convert_unhashable_key, METH_NOARGS}, {NULL}, }; From 24bf09b42cf6e9687aa77d3d6d09d3724d8c37d5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:44:17 +0100 Subject: [PATCH 1400/1674] [3.14] gh-141004: Document `PyType_SUPPORTS_WEAKREFS` (GH-141408) (GH-141470) gh-141004: Document `PyType_SUPPORTS_WEAKREFS` (GH-141408) (cherry picked from commit 9cd5427d9619b96db20d0347a136b3d331af71ae) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/type.rst | 26 ++++++++++++++++++++++++++ Doc/c-api/weakref.rst | 8 ++++++++ 2 files changed, 34 insertions(+) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 29ffeb7c483dce..b608f815160f76 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -195,12 +195,14 @@ Type Objects before initialization) and should be paired with :c:func:`PyObject_Free` in :c:member:`~PyTypeObject.tp_free`. + .. c:function:: PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) Generic handler for the :c:member:`~PyTypeObject.tp_new` slot of a type object. Creates a new instance using the type's :c:member:`~PyTypeObject.tp_alloc` slot and returns the resulting object. + .. c:function:: int PyType_Ready(PyTypeObject *type) Finalize a type object. This should be called on all type objects to finish @@ -217,6 +219,7 @@ Type Objects GC protocol itself by at least implementing the :c:member:`~PyTypeObject.tp_traverse` handle. + .. c:function:: PyObject* PyType_GetName(PyTypeObject *type) Return the type's name. Equivalent to getting the type's @@ -224,6 +227,7 @@ Type Objects .. versionadded:: 3.11 + .. c:function:: PyObject* PyType_GetQualName(PyTypeObject *type) Return the type's qualified name. Equivalent to getting the @@ -239,6 +243,7 @@ Type Objects .. versionadded:: 3.13 + .. c:function:: PyObject* PyType_GetModuleName(PyTypeObject *type) Return the type's module name. Equivalent to getting the @@ -246,6 +251,7 @@ Type Objects .. versionadded:: 3.13 + .. c:function:: void* PyType_GetSlot(PyTypeObject *type, int slot) Return the function pointer stored in the given slot. If the @@ -262,6 +268,7 @@ Type Objects :c:func:`PyType_GetSlot` can now accept all types. Previously, it was limited to :ref:`heap types <heap-types>`. + .. c:function:: PyObject* PyType_GetModule(PyTypeObject *type) Return the module object associated with the given type when the type was @@ -281,6 +288,7 @@ Type Objects .. versionadded:: 3.9 + .. c:function:: void* PyType_GetModuleState(PyTypeObject *type) Return the state of the module object associated with the given type. @@ -295,6 +303,7 @@ Type Objects .. versionadded:: 3.9 + .. c:function:: PyObject* PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def) Find the first superclass whose module was created from @@ -314,6 +323,7 @@ Type Objects .. versionadded:: 3.11 + .. c:function:: int PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result) Find the first superclass in *type*'s :term:`method resolution order` whose @@ -332,6 +342,7 @@ Type Objects .. versionadded:: 3.14 + .. c:function:: int PyUnstable_Type_AssignVersionTag(PyTypeObject *type) Attempt to assign a version tag to the given type. @@ -342,6 +353,16 @@ Type Objects .. versionadded:: 3.12 +.. c:function:: int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type) + + Return true if instances of *type* support creating weak references, false + otherwise. This function always succeeds. *type* must not be ``NULL``. + + .. seealso:: + * :ref:`weakrefobjects` + * :py:mod:`weakref` + + Creating Heap-Allocated Types ............................. @@ -390,6 +411,7 @@ The following functions and structs are used to create .. versionadded:: 3.12 + .. c:function:: PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) Equivalent to ``PyType_FromMetaclass(NULL, module, spec, bases)``. @@ -416,6 +438,7 @@ The following functions and structs are used to create Creating classes whose metaclass overrides :c:member:`~PyTypeObject.tp_new` is no longer allowed. + .. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, bases)``. @@ -437,6 +460,7 @@ The following functions and structs are used to create Creating classes whose metaclass overrides :c:member:`~PyTypeObject.tp_new` is no longer allowed. + .. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec) Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, NULL)``. @@ -457,6 +481,7 @@ The following functions and structs are used to create Creating classes whose metaclass overrides :c:member:`~PyTypeObject.tp_new` is no longer allowed. + .. c:function:: int PyType_Freeze(PyTypeObject *type) Make a type immutable: set the :c:macro:`Py_TPFLAGS_IMMUTABLETYPE` flag. @@ -628,6 +653,7 @@ The following functions and structs are used to create * :c:data:`Py_tp_token` (for clarity, prefer :c:data:`Py_TP_USE_SPEC` rather than ``NULL``) + .. c:macro:: Py_tp_token A :c:member:`~PyType_Slot.slot` that records a static memory layout ID diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index 9b263bd11d787f..45d6af1bb5a1ea 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -45,6 +45,10 @@ as much as it can. weakly referenceable object, or if *callback* is not callable, ``None``, or ``NULL``, this will return ``NULL`` and raise :exc:`TypeError`. + .. seealso:: + :c:func:`PyType_SUPPORTS_WEAKREFS` for checking if *ob* is weakly + referenceable. + .. c:function:: PyObject* PyWeakref_NewProxy(PyObject *ob, PyObject *callback) @@ -57,6 +61,10 @@ as much as it can. is not a weakly referenceable object, or if *callback* is not callable, ``None``, or ``NULL``, this will return ``NULL`` and raise :exc:`TypeError`. + .. seealso:: + :c:func:`PyType_SUPPORTS_WEAKREFS` for checking if *ob* is weakly + referenceable. + .. c:function:: int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) From fe3826cbafe4e4d6a3e18dec3a68e63a9b1d7230 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:02:38 +0100 Subject: [PATCH 1401/1674] [3.14] gh-141004: Document `Py_MATH_{E, PI, TAU}` constants (GH-141373) (#141471) gh-141004: Document `Py_MATH_{E, PI, TAU}` constants (GH-141373) (cherry picked from commit f1330b35b8eb43904dfed0656acde80c08d63176) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/float.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 21e254aa6fb600..bbd9ab3bb0d8aa 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -96,16 +96,33 @@ Floating-Point Objects the C11 standard ``<math.h>`` header. +.. c:macro:: Py_MATH_E + + The definition (accurate for a :c:expr:`double` type) of the :data:`math.e` constant. + + .. c:macro:: Py_MATH_El High precision (long double) definition of :data:`~math.e` constant. +.. c:macro:: Py_MATH_PI + + The definition (accurate for a :c:expr:`double` type) of the :data:`math.pi` constant. + + .. c:macro:: Py_MATH_PIl High precision (long double) definition of :data:`~math.pi` constant. +.. c:macro:: Py_MATH_TAU + + The definition (accurate for a :c:expr:`double` type) of the :data:`math.tau` constant. + + .. versionadded:: 3.6 + + .. c:macro:: Py_RETURN_NAN Return :data:`math.nan` from a function. From 996c00384d4a3d1157009f3f6aabe595df5a4170 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:40:20 +0100 Subject: [PATCH 1402/1674] [3.14] gh-141412: Use reliable target URL for urllib example (GH-141474) The endpoint used for demonstrating reading URLs is no longer stable. This change substitutes a target over which we have more control. (cherry picked from commit fbcac799518e0cb29fcf5f84ed1fa001010b9073) Co-authored-by: Bob Kline <bkline@users.noreply.github.com> --- Doc/tutorial/stdlib.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index fc98ffaadeed88..163f3bdebd8546 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -183,13 +183,13 @@ protocols. Two of the simplest are :mod:`urllib.request` for retrieving data from URLs and :mod:`smtplib` for sending mail:: >>> from urllib.request import urlopen - >>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response: + >>> with urlopen('https://docs.python.org/3/') as response: ... for line in response: ... line = line.decode() # Convert bytes to a str - ... if line.startswith('datetime'): + ... if 'updated' in line: ... print(line.rstrip()) # Remove trailing newline ... - datetime: 2022-01-01T01:36:47.689215+00:00 + Last updated on Nov 11, 2025 (20:11 UTC). >>> import smtplib >>> server = smtplib.SMTP('localhost') From 431618042658e753f9b2edc2a197787882c09110 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 23:15:34 +0100 Subject: [PATCH 1403/1674] [3.14] gh-141442: Add escaping to iOS testbed arguments (GH-141443) (#141479) Xcode concatenates the test argument array, losing quoting in the process. (cherry picked from commit 558936bec1f1e0f8346063a8cb2b2782d085178e) Co-authored-by: Russell Keith-Magee <russell@keith-magee.com> --- Apple/testbed/__main__.py | 3 ++- .../Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst diff --git a/Apple/testbed/__main__.py b/Apple/testbed/__main__.py index 42eb60a4c8dc02..49974cb142853c 100644 --- a/Apple/testbed/__main__.py +++ b/Apple/testbed/__main__.py @@ -2,6 +2,7 @@ import json import os import re +import shlex import shutil import subprocess import sys @@ -252,7 +253,7 @@ def update_test_plan(testbed_path, platform, args): test_plan = json.load(f) test_plan["defaultOptions"]["commandLineArgumentEntries"] = [ - {"argument": arg} for arg in args + {"argument": shlex.quote(arg)} for arg in args ] with test_plan_path.open("w", encoding="utf-8") as f: diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst b/Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst new file mode 100644 index 00000000000000..073c070413f7e0 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst @@ -0,0 +1 @@ +The iOS testbed now correctly handles test arguments that contain spaces. From 0b44bc33796075f33b45cfffea030f5e3757b9d7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 23:43:31 +0100 Subject: [PATCH 1404/1674] [3.14] gh-124111: Fix TCL 9 thread detection (GH-141482) (cherry picked from commit dc0987080ed66c662e8e0b24cdb8c179817bd697) Co-authored-by: Michael Cho <michael@michaelcho.dev> --- .../Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst | 2 ++ Modules/_tkinter.c | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst diff --git a/Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst b/Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst new file mode 100644 index 00000000000000..8436cd2415dbd6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst @@ -0,0 +1,2 @@ +Updated Tcl threading configuration in :mod:`_tkinter` to assume that +threads are always available in Tcl 9 and later. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 77695401919cb7..08fb96169da6c3 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -599,8 +599,12 @@ Tkapp_New(const char *screenName, const char *className, v->interp = Tcl_CreateInterp(); v->wantobjects = wantobjects; +#if TCL_MAJOR_VERSION >= 9 + v->threaded = 1; +#else v->threaded = Tcl_GetVar2Ex(v->interp, "tcl_platform", "threaded", TCL_GLOBAL_ONLY) != NULL; +#endif v->thread_id = Tcl_GetCurrentThread(); v->dispatching = 0; v->trace = NULL; From 42e0468209133690ba8ea59ebefd803f4fac23c5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 12 Nov 2025 23:58:52 +0100 Subject: [PATCH 1405/1674] [3.14] gh-141004: Document `PyRun_InteractiveOneObject` (GH-141405) (GH-141485) gh-141004: Document `PyRun_InteractiveOneObject` (GH-141405) (cherry picked from commit 26b7df2430cd5a9ee772bfa6ee03a73bd0b11619) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/veryhigh.rst | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 916c616dfee589..3b07b5fbed5959 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -100,18 +100,12 @@ the same library that the Python runtime is using. Otherwise, Python may not handle script file with LF line ending correctly. -.. c:function:: int PyRun_InteractiveOne(FILE *fp, const char *filename) - - This is a simplified interface to :c:func:`PyRun_InteractiveOneFlags` below, - leaving *flags* set to ``NULL``. - - -.. c:function:: int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) +.. c:function:: int PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags) Read and execute a single statement from a file associated with an interactive device according to the *flags* argument. The user will be - prompted using ``sys.ps1`` and ``sys.ps2``. *filename* is decoded from the - :term:`filesystem encoding and error handler`. + prompted using ``sys.ps1`` and ``sys.ps2``. *filename* must be a Python + :class:`str` object. Returns ``0`` when the input was executed successfully, ``-1`` if there was an exception, or an error code @@ -120,6 +114,19 @@ the same library that the Python runtime is using. :file:`Python.h`, so must be included specifically if needed.) +.. c:function:: int PyRun_InteractiveOne(FILE *fp, const char *filename) + + This is a simplified interface to :c:func:`PyRun_InteractiveOneFlags` below, + leaving *flags* set to ``NULL``. + + +.. c:function:: int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) + + Similar to :c:func:`PyRun_InteractiveOneObject`, but *filename* is a + :c:expr:`const char*`, which is decoded from the + :term:`filesystem encoding and error handler`. + + .. c:function:: int PyRun_InteractiveLoop(FILE *fp, const char *filename) This is a simplified interface to :c:func:`PyRun_InteractiveLoopFlags` below, From 7e9400c3e6e1322904204e7411494e8bc7b44237 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 12:33:04 +0100 Subject: [PATCH 1406/1674] [3.14] gh-103847: fix cancellation safety of `asyncio.create_subprocess_exec` (GH-140805) (#141446) gh-103847: fix cancellation safety of `asyncio.create_subprocess_exec` (GH-140805) (cherry picked from commit ef474cfafbdf3aa383fb1334a7ab95cef9834ced) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- Lib/asyncio/base_subprocess.py | 11 +++++ Lib/test/test_asyncio/test_subprocess.py | 40 ++++++++++++++++++- ...-10-31-13-57-55.gh-issue-103847.VM7TnW.rst | 1 + 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py index d40af422e614c1..321a4e5d5d18fb 100644 --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -26,6 +26,7 @@ def __init__(self, loop, protocol, args, shell, self._pending_calls = collections.deque() self._pipes = {} self._finished = False + self._pipes_connected = False if stdin == subprocess.PIPE: self._pipes[0] = None @@ -213,6 +214,7 @@ async def _connect_pipes(self, waiter): else: if waiter is not None and not waiter.cancelled(): waiter.set_result(None) + self._pipes_connected = True def _call(self, cb, *data): if self._pending_calls is not None: @@ -256,6 +258,15 @@ def _try_finish(self): assert not self._finished if self._returncode is None: return + if not self._pipes_connected: + # self._pipes_connected can be False if not all pipes were connected + # because either the process failed to start or the self._connect_pipes task + # got cancelled. In this broken state we consider all pipes disconnected and + # to avoid hanging forever in self._wait as otherwise _exit_waiters + # would never be woken up, we wake them up here. + for waiter in self._exit_waiters: + if not waiter.cancelled(): + waiter.set_result(self._returncode) if all(p is not None and p.disconnected for p in self._pipes.values()): self._finished = True diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 3a17c169c34f12..bf301740741ae7 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -11,7 +11,7 @@ from asyncio import subprocess from test.test_asyncio import utils as test_utils from test import support -from test.support import os_helper +from test.support import os_helper, warnings_helper, gc_collect if not support.has_subprocess_support: raise unittest.SkipTest("test module requires subprocess") @@ -879,6 +879,44 @@ async def main(): self.loop.run_until_complete(main()) + @warnings_helper.ignore_warnings(category=ResourceWarning) + def test_subprocess_read_pipe_cancelled(self): + async def main(): + loop = asyncio.get_running_loop() + loop.connect_read_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError) + with self.assertRaises(asyncio.CancelledError): + await asyncio.create_subprocess_exec(*PROGRAM_BLOCKED, stderr=asyncio.subprocess.PIPE) + + asyncio.run(main()) + gc_collect() + + @warnings_helper.ignore_warnings(category=ResourceWarning) + def test_subprocess_write_pipe_cancelled(self): + async def main(): + loop = asyncio.get_running_loop() + loop.connect_write_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError) + with self.assertRaises(asyncio.CancelledError): + await asyncio.create_subprocess_exec(*PROGRAM_BLOCKED, stdin=asyncio.subprocess.PIPE) + + asyncio.run(main()) + gc_collect() + + @warnings_helper.ignore_warnings(category=ResourceWarning) + def test_subprocess_read_write_pipe_cancelled(self): + async def main(): + loop = asyncio.get_running_loop() + loop.connect_read_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError) + loop.connect_write_pipe = mock.AsyncMock(side_effect=asyncio.CancelledError) + with self.assertRaises(asyncio.CancelledError): + await asyncio.create_subprocess_exec( + *PROGRAM_BLOCKED, + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + + asyncio.run(main()) + gc_collect() if sys.platform != 'win32': # Unix diff --git a/Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst b/Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst new file mode 100644 index 00000000000000..e14af7d97083d6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst @@ -0,0 +1 @@ +Fix hang when cancelling process created by :func:`asyncio.create_subprocess_exec` or :func:`asyncio.create_subprocess_shell`. Patch by Kumar Aditya. From 79195df23c694770b3b03ff90b90ae734f930cb7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 12:53:22 +0100 Subject: [PATCH 1407/1674] [3.14] gh-140260: fix data race in `_struct` module initialization with subinterpreters (GH-140909) (#141501) gh-140260: fix data race in `_struct` module initialization with subinterpreters (GH-140909) (cherry picked from commit 63548b36998e7f7cd5c7c28b53b348a93f836737) Co-authored-by: Shamil <ashm.tech@proton.me> --- Lib/test/test_struct.py | 17 ++++ ...-11-02-15-28-33.gh-issue-140260.JNzlGz.rst | 2 + Modules/_struct.c | 91 ++++++++++--------- Tools/c-analyzer/cpython/ignored.tsv | 1 + 4 files changed, 70 insertions(+), 41 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 75c76a36ee92f5..cceecdd526c006 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -800,6 +800,23 @@ def test_c_complex_round_trip(self): round_trip = struct.unpack(f, struct.pack(f, z))[0] self.assertComplexesAreIdentical(z, round_trip) + @unittest.skipIf( + support.is_android or support.is_apple_mobile, + "Subinterpreters are not supported on Android and iOS" + ) + def test_endian_table_init_subinterpreters(self): + # Verify that the _struct extension module can be initialized + # concurrently in subinterpreters (gh-140260). + try: + from concurrent.futures import InterpreterPoolExecutor + except ImportError: + raise unittest.SkipTest("InterpreterPoolExecutor not available") + + code = "import struct" + with InterpreterPoolExecutor(max_workers=5) as executor: + results = executor.map(exec, [code] * 5) + self.assertListEqual(list(results), [None] * 5) + class UnpackIteratorTest(unittest.TestCase): """ diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst new file mode 100644 index 00000000000000..96bf9b51e4862c --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst @@ -0,0 +1,2 @@ +Fix :mod:`struct` data race in endian table initialization with +subinterpreters. Patch by Shamil Abdulaev. diff --git a/Modules/_struct.c b/Modules/_struct.c index 3fad35a8c94ee2..dc50c167641f5e 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -9,6 +9,7 @@ #include "Python.h" #include "pycore_bytesobject.h" // _PyBytesWriter +#include "pycore_lock.h" // _PyOnceFlag_CallOnce() #include "pycore_long.h" // _PyLong_AsByteArray() #include "pycore_moduleobject.h" // _PyModule_GetState() #include "pycore_weakref.h" // FT_CLEAR_WEAKREFS() @@ -1505,6 +1506,53 @@ static formatdef lilendian_table[] = { {0} }; +/* Ensure endian table optimization happens exactly once across all interpreters */ +static _PyOnceFlag endian_tables_init_once = {0}; + +static int +init_endian_tables(void *Py_UNUSED(arg)) +{ + const formatdef *native = native_table; + formatdef *other, *ptr; +#if PY_LITTLE_ENDIAN + other = lilendian_table; +#else + other = bigendian_table; +#endif + /* Scan through the native table, find a matching + entry in the endian table and swap in the + native implementations whenever possible + (64-bit platforms may not have "standard" sizes) */ + while (native->format != '\0' && other->format != '\0') { + ptr = other; + while (ptr->format != '\0') { + if (ptr->format == native->format) { + /* Match faster when formats are + listed in the same order */ + if (ptr == other) + other++; + /* Only use the trick if the + size matches */ + if (ptr->size != native->size) + break; + /* Skip float and double, could be + "unknown" float format */ + if (ptr->format == 'd' || ptr->format == 'f') + break; + /* Skip _Bool, semantics are different for standard size */ + if (ptr->format == '?') + break; + ptr->pack = native->pack; + ptr->unpack = native->unpack; + break; + } + ptr++; + } + native++; + } + return 0; +} + static const formatdef * whichtable(const char **pfmt) @@ -2713,47 +2761,8 @@ _structmodule_exec(PyObject *m) return -1; } - /* Check endian and swap in faster functions */ - { - const formatdef *native = native_table; - formatdef *other, *ptr; -#if PY_LITTLE_ENDIAN - other = lilendian_table; -#else - other = bigendian_table; -#endif - /* Scan through the native table, find a matching - entry in the endian table and swap in the - native implementations whenever possible - (64-bit platforms may not have "standard" sizes) */ - while (native->format != '\0' && other->format != '\0') { - ptr = other; - while (ptr->format != '\0') { - if (ptr->format == native->format) { - /* Match faster when formats are - listed in the same order */ - if (ptr == other) - other++; - /* Only use the trick if the - size matches */ - if (ptr->size != native->size) - break; - /* Skip float and double, could be - "unknown" float format */ - if (ptr->format == 'd' || ptr->format == 'f') - break; - /* Skip _Bool, semantics are different for standard size */ - if (ptr->format == '?') - break; - ptr->pack = native->pack; - ptr->unpack = native->unpack; - break; - } - ptr++; - } - native++; - } - } + /* init cannot fail */ + (void)_PyOnceFlag_CallOnce(&endian_tables_init_once, init_endian_tables, NULL); /* Add some symbolic constants to the module */ state->StructError = PyErr_NewException("struct.error", NULL, NULL); diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 687871068e8bae..ba9119a06d57e2 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -24,6 +24,7 @@ Modules/posixmodule.c os_dup2_impl dup3_works - ## guards around resource init Python/thread_pthread.h PyThread__init_thread lib_initialized - +Modules/_struct.c - endian_tables_init_once - ##----------------------- ## other values (not Python-specific) From 7b8c257933f29b9c0b670afc26b6a308b14c9ef0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 13:03:09 +0100 Subject: [PATCH 1408/1674] [3.14] gh-140601: Refactor ElementTree.iterparse() tests (GH-141499) (GH-141502) Split existing tests on smaller methods and move them to separate class. Rename variable "content" to "it". Use BytesIO instead of StringIO. Add few more tests. (cherry picked from commit 2fbd39666663cb5ca1c0e3021ce2e7bc72331020) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/test/test_xml_etree.py | 430 ++++++++++++++++++++----------------- 1 file changed, 228 insertions(+), 202 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index f65baa0cfae2ad..25c084c8b9c9eb 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -574,208 +574,6 @@ def test_parseliteral(self): self.assertEqual(len(ids), 1) self.assertEqual(ids["body"].tag, 'body') - def test_iterparse(self): - # Test iterparse interface. - - iterparse = ET.iterparse - - context = iterparse(SIMPLE_XMLFILE) - self.assertIsNone(context.root) - action, elem = next(context) - self.assertIsNone(context.root) - self.assertEqual((action, elem.tag), ('end', 'element')) - self.assertEqual([(action, elem.tag) for action, elem in context], [ - ('end', 'element'), - ('end', 'empty-element'), - ('end', 'root'), - ]) - self.assertEqual(context.root.tag, 'root') - - context = iterparse(SIMPLE_NS_XMLFILE) - self.assertEqual([(action, elem.tag) for action, elem in context], [ - ('end', '{namespace}element'), - ('end', '{namespace}element'), - ('end', '{namespace}empty-element'), - ('end', '{namespace}root'), - ]) - - with open(SIMPLE_XMLFILE, 'rb') as source: - context = iterparse(source) - action, elem = next(context) - self.assertEqual((action, elem.tag), ('end', 'element')) - self.assertEqual([(action, elem.tag) for action, elem in context], [ - ('end', 'element'), - ('end', 'empty-element'), - ('end', 'root'), - ]) - self.assertEqual(context.root.tag, 'root') - - events = () - context = iterparse(SIMPLE_XMLFILE, events) - self.assertEqual([(action, elem.tag) for action, elem in context], []) - - events = () - context = iterparse(SIMPLE_XMLFILE, events=events) - self.assertEqual([(action, elem.tag) for action, elem in context], []) - - events = ("start", "end") - context = iterparse(SIMPLE_XMLFILE, events) - self.assertEqual([(action, elem.tag) for action, elem in context], [ - ('start', 'root'), - ('start', 'element'), - ('end', 'element'), - ('start', 'element'), - ('end', 'element'), - ('start', 'empty-element'), - ('end', 'empty-element'), - ('end', 'root'), - ]) - - events = ("start", "end", "start-ns", "end-ns") - context = iterparse(SIMPLE_NS_XMLFILE, events) - self.assertEqual([(action, elem.tag) if action in ("start", "end") - else (action, elem) - for action, elem in context], [ - ('start-ns', ('', 'namespace')), - ('start', '{namespace}root'), - ('start', '{namespace}element'), - ('end', '{namespace}element'), - ('start', '{namespace}element'), - ('end', '{namespace}element'), - ('start', '{namespace}empty-element'), - ('end', '{namespace}empty-element'), - ('end', '{namespace}root'), - ('end-ns', None), - ]) - - events = ('start-ns', 'end-ns') - context = iterparse(io.StringIO(r"<root xmlns=''/>"), events) - res = [action for action, elem in context] - self.assertEqual(res, ['start-ns', 'end-ns']) - - events = ("start", "end", "bogus") - with open(SIMPLE_XMLFILE, "rb") as f: - with self.assertRaises(ValueError) as cm: - iterparse(f, events) - self.assertFalse(f.closed) - self.assertEqual(str(cm.exception), "unknown event 'bogus'") - - with warnings_helper.check_no_resource_warning(self): - with self.assertRaises(ValueError) as cm: - iterparse(SIMPLE_XMLFILE, events) - self.assertEqual(str(cm.exception), "unknown event 'bogus'") - del cm - - source = io.BytesIO( - b"<?xml version='1.0' encoding='iso-8859-1'?>\n" - b"<body xmlns='http://&#233;ffbot.org/ns'\n" - b" xmlns:cl\xe9='http://effbot.org/ns'>text</body>\n") - events = ("start-ns",) - context = iterparse(source, events) - self.assertEqual([(action, elem) for action, elem in context], [ - ('start-ns', ('', 'http://\xe9ffbot.org/ns')), - ('start-ns', ('cl\xe9', 'http://effbot.org/ns')), - ]) - - source = io.StringIO("<document />junk") - it = iterparse(source) - action, elem = next(it) - self.assertEqual((action, elem.tag), ('end', 'document')) - with self.assertRaises(ET.ParseError) as cm: - next(it) - self.assertEqual(str(cm.exception), - 'junk after document element: line 1, column 12') - - self.addCleanup(os_helper.unlink, TESTFN) - with open(TESTFN, "wb") as f: - f.write(b"<document />junk") - it = iterparse(TESTFN) - action, elem = next(it) - self.assertEqual((action, elem.tag), ('end', 'document')) - with warnings_helper.check_no_resource_warning(self): - with self.assertRaises(ET.ParseError) as cm: - next(it) - self.assertEqual(str(cm.exception), - 'junk after document element: line 1, column 12') - del cm, it - - # Not exhausting the iterator still closes the resource (bpo-43292) - with warnings_helper.check_no_resource_warning(self): - it = iterparse(SIMPLE_XMLFILE) - del it - - with warnings_helper.check_no_resource_warning(self): - it = iterparse(SIMPLE_XMLFILE) - it.close() - del it - - with warnings_helper.check_no_resource_warning(self): - it = iterparse(SIMPLE_XMLFILE) - action, elem = next(it) - self.assertEqual((action, elem.tag), ('end', 'element')) - del it, elem - - with warnings_helper.check_no_resource_warning(self): - it = iterparse(SIMPLE_XMLFILE) - action, elem = next(it) - it.close() - self.assertEqual((action, elem.tag), ('end', 'element')) - del it, elem - - with self.assertRaises(FileNotFoundError): - iterparse("nonexistent") - - def test_iterparse_close(self): - iterparse = ET.iterparse - - it = iterparse(SIMPLE_XMLFILE) - it.close() - with self.assertRaises(StopIteration): - next(it) - it.close() # idempotent - - with open(SIMPLE_XMLFILE, 'rb') as source: - it = iterparse(source) - it.close() - self.assertFalse(source.closed) - with self.assertRaises(StopIteration): - next(it) - it.close() # idempotent - - it = iterparse(SIMPLE_XMLFILE) - action, elem = next(it) - self.assertEqual((action, elem.tag), ('end', 'element')) - it.close() - with self.assertRaises(StopIteration): - next(it) - it.close() # idempotent - - with open(SIMPLE_XMLFILE, 'rb') as source: - it = iterparse(source) - action, elem = next(it) - self.assertEqual((action, elem.tag), ('end', 'element')) - it.close() - self.assertFalse(source.closed) - with self.assertRaises(StopIteration): - next(it) - it.close() # idempotent - - it = iterparse(SIMPLE_XMLFILE) - list(it) - it.close() - with self.assertRaises(StopIteration): - next(it) - it.close() # idempotent - - with open(SIMPLE_XMLFILE, 'rb') as source: - it = iterparse(source) - list(it) - it.close() - self.assertFalse(source.closed) - with self.assertRaises(StopIteration): - next(it) - it.close() # idempotent - def test_writefile(self): elem = ET.Element("tag") elem.text = "text" @@ -1499,6 +1297,234 @@ def test_attlist_default(self): {'{http://www.w3.org/XML/1998/namespace}lang': 'eng'}) +class IterparseTest(unittest.TestCase): + # Test iterparse interface. + + def test_basic(self): + iterparse = ET.iterparse + + it = iterparse(SIMPLE_XMLFILE) + self.assertIsNone(it.root) + action, elem = next(it) + self.assertIsNone(it.root) + self.assertEqual((action, elem.tag), ('end', 'element')) + self.assertEqual([(action, elem.tag) for action, elem in it], [ + ('end', 'element'), + ('end', 'empty-element'), + ('end', 'root'), + ]) + self.assertEqual(it.root.tag, 'root') + it.close() + + it = iterparse(SIMPLE_NS_XMLFILE) + self.assertEqual([(action, elem.tag) for action, elem in it], [ + ('end', '{namespace}element'), + ('end', '{namespace}element'), + ('end', '{namespace}empty-element'), + ('end', '{namespace}root'), + ]) + it.close() + + def test_external_file(self): + with open(SIMPLE_XMLFILE, 'rb') as source: + it = ET.iterparse(source) + action, elem = next(it) + self.assertEqual((action, elem.tag), ('end', 'element')) + self.assertEqual([(action, elem.tag) for action, elem in it], [ + ('end', 'element'), + ('end', 'empty-element'), + ('end', 'root'), + ]) + self.assertEqual(it.root.tag, 'root') + + def test_events(self): + iterparse = ET.iterparse + + events = () + it = iterparse(SIMPLE_XMLFILE, events) + self.assertEqual([(action, elem.tag) for action, elem in it], []) + it.close() + + events = () + it = iterparse(SIMPLE_XMLFILE, events=events) + self.assertEqual([(action, elem.tag) for action, elem in it], []) + it.close() + + events = ("start", "end") + it = iterparse(SIMPLE_XMLFILE, events) + self.assertEqual([(action, elem.tag) for action, elem in it], [ + ('start', 'root'), + ('start', 'element'), + ('end', 'element'), + ('start', 'element'), + ('end', 'element'), + ('start', 'empty-element'), + ('end', 'empty-element'), + ('end', 'root'), + ]) + it.close() + + def test_namespace_events(self): + iterparse = ET.iterparse + + events = ("start", "end", "start-ns", "end-ns") + it = iterparse(SIMPLE_NS_XMLFILE, events) + self.assertEqual([(action, elem.tag) if action in ("start", "end") + else (action, elem) + for action, elem in it], [ + ('start-ns', ('', 'namespace')), + ('start', '{namespace}root'), + ('start', '{namespace}element'), + ('end', '{namespace}element'), + ('start', '{namespace}element'), + ('end', '{namespace}element'), + ('start', '{namespace}empty-element'), + ('end', '{namespace}empty-element'), + ('end', '{namespace}root'), + ('end-ns', None), + ]) + it.close() + + events = ('start-ns', 'end-ns') + it = iterparse(io.BytesIO(br"<root xmlns=''/>"), events) + res = [action for action, elem in it] + self.assertEqual(res, ['start-ns', 'end-ns']) + it.close() + + def test_unknown_events(self): + iterparse = ET.iterparse + + events = ("start", "end", "bogus") + with open(SIMPLE_XMLFILE, "rb") as f: + with self.assertRaises(ValueError) as cm: + iterparse(f, events) + self.assertFalse(f.closed) + self.assertEqual(str(cm.exception), "unknown event 'bogus'") + + with warnings_helper.check_no_resource_warning(self): + with self.assertRaises(ValueError) as cm: + iterparse(SIMPLE_XMLFILE, events) + self.assertEqual(str(cm.exception), "unknown event 'bogus'") + del cm + gc_collect() + + def test_non_utf8(self): + source = io.BytesIO( + b"<?xml version='1.0' encoding='iso-8859-1'?>\n" + b"<body xmlns='http://&#233;ffbot.org/ns'\n" + b" xmlns:cl\xe9='http://effbot.org/ns'>text</body>\n") + events = ("start-ns",) + it = ET.iterparse(source, events) + self.assertEqual([(action, elem) for action, elem in it], [ + ('start-ns', ('', 'http://\xe9ffbot.org/ns')), + ('start-ns', ('cl\xe9', 'http://effbot.org/ns')), + ]) + + def test_parsing_error(self): + source = io.BytesIO(b"<document />junk") + it = ET.iterparse(source) + action, elem = next(it) + self.assertEqual((action, elem.tag), ('end', 'document')) + with self.assertRaises(ET.ParseError) as cm: + next(it) + self.assertEqual(str(cm.exception), + 'junk after document element: line 1, column 12') + + def test_nonexistent_file(self): + with self.assertRaises(FileNotFoundError): + ET.iterparse("nonexistent") + + def test_resource_warnings_not_exhausted(self): + # Not exhausting the iterator still closes the underlying file (bpo-43292) + it = ET.iterparse(SIMPLE_XMLFILE) + with warnings_helper.check_no_resource_warning(self): + del it + gc_collect() + + it = ET.iterparse(SIMPLE_XMLFILE) + with warnings_helper.check_no_resource_warning(self): + action, elem = next(it) + self.assertEqual((action, elem.tag), ('end', 'element')) + del it, elem + gc_collect() + + def test_resource_warnings_failed_iteration(self): + self.addCleanup(os_helper.unlink, TESTFN) + with open(TESTFN, "wb") as f: + f.write(b"<document />junk") + + it = ET.iterparse(TESTFN) + action, elem = next(it) + self.assertEqual((action, elem.tag), ('end', 'document')) + with warnings_helper.check_no_resource_warning(self): + with self.assertRaises(ET.ParseError) as cm: + next(it) + self.assertEqual(str(cm.exception), + 'junk after document element: line 1, column 12') + del cm, it + gc_collect() + + def test_resource_warnings_exhausted(self): + it = ET.iterparse(SIMPLE_XMLFILE) + with warnings_helper.check_no_resource_warning(self): + list(it) + del it + gc_collect() + + def test_close_not_exhausted(self): + iterparse = ET.iterparse + + it = iterparse(SIMPLE_XMLFILE) + it.close() + with self.assertRaises(StopIteration): + next(it) + it.close() # idempotent + + with open(SIMPLE_XMLFILE, 'rb') as source: + it = iterparse(source) + it.close() + self.assertFalse(source.closed) + with self.assertRaises(StopIteration): + next(it) + it.close() # idempotent + + it = iterparse(SIMPLE_XMLFILE) + action, elem = next(it) + self.assertEqual((action, elem.tag), ('end', 'element')) + it.close() + with self.assertRaises(StopIteration): + next(it) + it.close() # idempotent + + with open(SIMPLE_XMLFILE, 'rb') as source: + it = iterparse(source) + action, elem = next(it) + self.assertEqual((action, elem.tag), ('end', 'element')) + it.close() + self.assertFalse(source.closed) + with self.assertRaises(StopIteration): + next(it) + it.close() # idempotent + + def test_close_exhausted(self): + iterparse = ET.iterparse + it = iterparse(SIMPLE_XMLFILE) + list(it) + it.close() + with self.assertRaises(StopIteration): + next(it) + it.close() # idempotent + + with open(SIMPLE_XMLFILE, 'rb') as source: + it = iterparse(source) + list(it) + it.close() + self.assertFalse(source.closed) + with self.assertRaises(StopIteration): + next(it) + it.close() # idempotent + + class XMLPullParserTest(unittest.TestCase): def _feed(self, parser, data, chunk_size=None, flush=False): From 55cf97d8dd269c45a65a4ceba082d04f16f0eafd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 13:58:37 +0100 Subject: [PATCH 1409/1674] [3.14] gh-140748: socket_helper.transient_internet: Unwrap UrlError.__cause__ (GH-140749) (GH-141505) (cherry picked from commit 75a1cbdd38b142b359849eae16a2ecc12f6b3881) Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Lib/test/support/socket_helper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py index 87941ee1791b4e..a41e487f3e4bc5 100644 --- a/Lib/test/support/socket_helper.py +++ b/Lib/test/support/socket_helper.py @@ -259,6 +259,10 @@ def filter_error(err): # raise OSError('socket error', msg) from msg elif len(a) >= 2 and isinstance(a[1], OSError): err = a[1] + # The error can also be wrapped as __cause__: + # raise URLError(f"ftp error: {exp}") from exp + elif isinstance(err, urllib.error.URLError) and err.__cause__: + err = err.__cause__ else: break filter_error(err) From f43e5955ebf52bd28975878444e7c37db064d32c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:08:35 +0100 Subject: [PATCH 1410/1674] [3.14] gh-141004: Document C APIs for dictionary keys, values, and items (GH-141009) (GH-141512) gh-141004: Document C APIs for dictionary keys, values, and items (GH-141009) (cherry picked from commit f72768f30e6ed9253eb3b6374b4395dfcaf4842a) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/c-api/dict.rst | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 246ce5391e142c..b7f201811aad6c 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -431,3 +431,49 @@ Dictionary Objects it before returning. .. versionadded:: 3.12 + + +Dictionary View Objects +^^^^^^^^^^^^^^^^^^^^^^^ + +.. c:function:: int PyDictViewSet_Check(PyObject *op) + + Return true if *op* is a view of a set inside a dictionary. This is currently + equivalent to :c:expr:`PyDictKeys_Check(op) || PyDictItems_Check(op)`. This + function always succeeds. + + +.. c:var:: PyTypeObject PyDictKeys_Type + + Type object for a view of dictionary keys. In Python, this is the type of + the object returned by :meth:`dict.keys`. + + +.. c:function:: int PyDictKeys_Check(PyObject *op) + + Return true if *op* is an instance of a dictionary keys view. This function + always succeeds. + + +.. c:var:: PyTypeObject PyDictValues_Type + + Type object for a view of dictionary values. In Python, this is the type of + the object returned by :meth:`dict.values`. + + +.. c:function:: int PyDictValues_Check(PyObject *op) + + Return true if *op* is an instance of a dictionary values view. This function + always succeeds. + + +.. c:var:: PyTypeObject PyDictItems_Type + + Type object for a view of dictionary items. In Python, this is the type of + the object returned by :meth:`dict.items`. + + +.. c:function:: int PyDictItems_Check(PyObject *op) + + Return true if *op* is an instance of a dictionary items view. This function + always succeeds. From 425e423f9f85a8f7b6bd90fc6995e9b032d37351 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:15:27 +0100 Subject: [PATCH 1411/1674] [3.14] gh-141004: Document `PyCode_Optimize` (GH-141378) (GH-141514) gh-141004: Document `PyCode_Optimize` (GH-141378) (cherry picked from commit d7862e9b1bd8f82e41c4f2c4dad31e15707d856f) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/code.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index c9741b61254b19..45f5e83adc48c6 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -211,6 +211,17 @@ bound into a function. .. versionadded:: 3.12 +.. c:function:: PyObject *PyCode_Optimize(PyObject *code, PyObject *consts, PyObject *names, PyObject *lnotab_obj) + + This is a :term:`soft deprecated` function that does nothing. + + Prior to Python 3.10, this function would perform basic optimizations to a + code object. + + .. versionchanged:: 3.10 + This function now does nothing. + + .. _c_codeobject_flags: Code Object Flags From 48b7d75aaf0206c80813c3325fd4021cd6b99e2b Mon Sep 17 00:00:00 2001 From: Mikhail Efimov <efimov.mikhail@gmail.com> Date: Thu, 13 Nov 2025 19:11:57 +0300 Subject: [PATCH 1412/1674] [3.14] gh-140936: Fix JIT assertion crash at finalization if some generator is alive (GH-140969) (GH-141494) gh-140936: Fix JIT assertion crash at finalization if some generator is alive (GH-140969) --- Lib/test/test_capi/test_opt.py | 20 ++++++++++++++++++++ Python/optimizer.c | 9 ++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index c74c8ee0eef8e2..1860325cba616d 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1972,6 +1972,26 @@ def testfunc(n): assert ex is not None """)) + def test_interpreter_finalization_with_generator_alive(self): + script_helper.assert_python_ok("-c", textwrap.dedent(""" + import sys + t = tuple(range(%d)) + def simple_for(): + for x in t: + x + + def gen(): + try: + yield + except: + simple_for() + + sys.settrace(lambda *args: None) + simple_for() + g = gen() + next(g) + """ % _testinternalcapi.SPECIALIZATION_THRESHOLD)) + def global_identity(x): return x diff --git a/Python/optimizer.c b/Python/optimizer.c index e2b6adfab595f2..6679eecd648a85 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -116,7 +116,14 @@ _PyOptimizer_Optimize( _PyExecutorObject **executor_ptr, int chain_depth) { _PyStackRef *stack_pointer = frame->stackpointer; - assert(_PyInterpreterState_GET()->jit); + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (!interp->jit) { + // gh-140936: It is possible that interp->jit will become false during + // interpreter finalization. However, the specialized JUMP_BACKWARD_JIT + // instruction may still be present. In this case, we should + // return immediately without optimization. + return 0; + } // The first executor in a chain and the MAX_CHAIN_DEPTH'th executor *must* // make progress in order to avoid infinite loops or excessively-long // side-exit chains. We can only insert the executor into the bytecode if From c5e0ce73f93b615701df06a88d0a95d5160c7b02 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 19:05:09 +0100 Subject: [PATCH 1413/1674] [3.14] gh-141004: Document `PyErr_RangedSyntaxLocationObject` (GH-141521) (#141525) gh-141004: Document `PyErr_RangedSyntaxLocationObject` (GH-141521) PyErr_RangedSyntaxLocationObject (cherry picked from commit 196f1519cd2d8134d7643536f13f2b2844bea65d) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/exceptions.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 5241533e11281f..7449935e69f721 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -309,6 +309,14 @@ For convenience, some of these functions will always return a .. versionadded:: 3.4 +.. c:function:: void PyErr_RangedSyntaxLocationObject(PyObject *filename, int lineno, int col_offset, int end_lineno, int end_col_offset) + + Similar to :c:func:`PyErr_SyntaxLocationObject`, but also sets the + *end_lineno* and *end_col_offset* information for the current exception. + + .. versionadded:: 3.10 + + .. c:function:: void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) Like :c:func:`PyErr_SyntaxLocationObject`, but *filename* is a byte string From af20b880fc14c5a397f2f160877b94cb3d69f45c Mon Sep 17 00:00:00 2001 From: Mikhail Efimov <efimov.mikhail@gmail.com> Date: Thu, 13 Nov 2025 21:47:25 +0300 Subject: [PATCH 1414/1674] [3.14] gh-140104: Set next_instr properly in the JIT during exceptions (GH-140233) (GH-141495) --- Lib/test/test_capi/test_opt.py | 21 +++++++++++++++++++ ...-10-16-21-47-00.gh-issue-140104.A8SQIm.rst | 2 ++ Python/ceval_macros.h | 8 +++++-- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 1860325cba616d..be3f8895db5d09 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1992,6 +1992,27 @@ def gen(): next(g) """ % _testinternalcapi.SPECIALIZATION_THRESHOLD)) + def test_next_instr_for_exception_handler_set(self): + # gh-140104: We just want the exception to be caught properly. + def f(): + for i in range(TIER2_THRESHOLD + 3): + try: + undefined_variable(i) + except Exception: + pass + + f() + + def test_next_instr_for_exception_handler_set_lasts_instr(self): + # gh-140104: We just want the exception to be caught properly. + def f(): + a_list = [] + for _ in range(TIER2_THRESHOLD + 3): + try: + a_list[""] = 0 + except Exception: + pass + def global_identity(x): return x diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst new file mode 100644 index 00000000000000..1c18cbc9ad0588 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst @@ -0,0 +1,2 @@ +Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported +by Daniel Diniz. diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 37c4b00f86df25..4a878d6dff4353 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -376,7 +376,9 @@ do { \ frame = tstate->current_frame; \ stack_pointer = _PyFrame_GetStackPointer(frame); \ if (next_instr == NULL) { \ - next_instr = frame->instr_ptr; \ + /* gh-140104: The exception handler expects frame->instr_ptr + to after this_instr, not this_instr! */ \ + next_instr = frame->instr_ptr + 1; \ JUMP_TO_LABEL(error); \ } \ DISPATCH(); \ @@ -404,7 +406,9 @@ do { \ stack_pointer = _PyFrame_GetStackPointer(frame); \ if (next_instr == NULL) \ { \ - next_instr = frame->instr_ptr; \ + /* gh-140104: The exception handler expects frame->instr_ptr + to after this_instr, not this_instr! */ \ + next_instr = frame->instr_ptr + 1; \ goto error; \ } \ DISPATCH(); \ From dd28db664b41961355ca7d5e1ab7fda5e908dbb5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 13 Nov 2025 22:26:58 +0100 Subject: [PATCH 1415/1674] [3.14] gh-137969: Fix double evaluation of `ForwardRef`s which rely on globals (GH-140974) (#141527) gh-137969: Fix double evaluation of `ForwardRef`s which rely on globals (GH-140974) (cherry picked from commit 209eaff68c3b241c01aece14182cb9ced51526fc) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Lib/annotationlib.py | 39 +++++++++------- Lib/test/test_annotationlib.py | 45 +++++++++++++++++++ ...-11-04-15-40-35.gh-issue-137969.9VZQVt.rst | 3 ++ 3 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 2166dbff0ee70c..33907b1fc2a53a 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -150,33 +150,42 @@ def evaluate( if globals is None: globals = {} + if type_params is None and owner is not None: + type_params = getattr(owner, "__type_params__", None) + if locals is None: locals = {} if isinstance(owner, type): locals.update(vars(owner)) + elif ( + type_params is not None + or isinstance(self.__cell__, dict) + or self.__extra_names__ + ): + # Create a new locals dict if necessary, + # to avoid mutating the argument. + locals = dict(locals) - if type_params is None and owner is not None: - # "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()` - type_params = getattr(owner, "__type_params__", None) - - # Type parameters exist in their own scope, which is logically - # between the locals and the globals. We simulate this by adding - # them to the globals. Similar reasoning applies to nonlocals stored in cells. - if type_params is not None or isinstance(self.__cell__, dict): - globals = dict(globals) + # "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 is not None: for param in type_params: - globals[param.__name__] = param + locals.setdefault(param.__name__, param) + + # Similar logic can be used for nonlocals, which should not + # override locals. if isinstance(self.__cell__, dict): - for cell_name, cell_value in self.__cell__.items(): + for cell_name, cell in self.__cell__.items(): try: - globals[cell_name] = cell_value.cell_contents + cell_value = cell.cell_contents except ValueError: pass + else: + locals.setdefault(cell_name, cell_value) + if self.__extra_names__: - locals = {**locals, **self.__extra_names__} + locals.update(self.__extra_names__) arg = self.__forward_arg__ if arg.isidentifier() and not keyword.iskeyword(arg): diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 9f3275d5071484..8208d0e9c94819 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -2149,6 +2149,51 @@ def test_fwdref_invalid_syntax(self): with self.assertRaises(SyntaxError): fr.evaluate() + def test_re_evaluate_generics(self): + global global_alias + + # If we've already run this test before, + # ensure the variable is still undefined + if "global_alias" in globals(): + del global_alias + + class C: + x: global_alias[int] + + # Evaluate the ForwardRef once + evaluated = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate( + format=Format.FORWARDREF + ) + + # Now define the global and ensure that the ForwardRef evaluates + global_alias = list + self.assertEqual(evaluated.evaluate(), list[int]) + + def test_fwdref_evaluate_argument_mutation(self): + class C[T]: + nonlocal alias + x: alias[T] + + # Mutable arguments + globals_ = globals() + globals_copy = globals_.copy() + locals_ = locals() + locals_copy = locals_.copy() + + # Evaluate the ForwardRef, ensuring we use __cell__ and type params + get_annotations(C, format=Format.FORWARDREF)["x"].evaluate( + globals=globals_, + locals=locals_, + type_params=C.__type_params__, + format=Format.FORWARDREF, + ) + + # Check if the passed in mutable arguments equal the originals + self.assertEqual(globals_, globals_copy) + self.assertEqual(locals_, locals_copy) + + alias = list + def test_fwdref_final_class(self): with self.assertRaises(TypeError): class C(ForwardRef): diff --git a/Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst b/Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst new file mode 100644 index 00000000000000..dfa582bdbc8825 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst @@ -0,0 +1,3 @@ +Fix :meth:`annotationlib.ForwardRef.evaluate` returning +:class:`~annotationlib.ForwardRef` objects which don't update with new +globals. From 72a8ea773baaf5049d06fdc3b314bfe661846b58 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 14 Nov 2025 12:26:37 +0100 Subject: [PATCH 1416/1674] [3.14] gh-141004: Document `PyOS_InterruptOccurred` (GH-141526) (GH-141549) gh-141004: Document `PyOS_InterruptOccurred` (GH-141526) (cherry picked from commit ef90261be508b97d682589aac8f00065a9585683) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/sys.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index b3c89800e386ff..3a8cfd95b03513 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -123,6 +123,24 @@ Operating System Utilities This is a thin wrapper around either :c:func:`!sigaction` or :c:func:`!signal`. Do not call those functions directly! + +.. c:function:: int PyOS_InterruptOccurred(void) + + Check if a :c:macro:`!SIGINT` signal has been received. + + Returns ``1`` if a :c:macro:`!SIGINT` has occurred and clears the signal flag, + or ``0`` otherwise. + + In most cases, you should prefer :c:func:`PyErr_CheckSignals` over this function. + :c:func:`!PyErr_CheckSignals` invokes the appropriate signal handlers + for all pending signals, allowing Python code to handle the signal properly. + This function only detects :c:macro:`!SIGINT` and does not invoke any Python + signal handlers. + + This function is async-signal-safe and this function cannot fail. + The caller must hold an :term:`attached thread state`. + + .. c:function:: wchar_t* Py_DecodeLocale(const char* arg, size_t *size) .. warning:: From dbe64ee95fd6b5dfc59ecb75d89cdb6538766a13 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:29:39 +0100 Subject: [PATCH 1417/1674] Add PyManager troubleshooting steps for direct launch of script files (GH-141530) (cherry picked from commit b101e9d36b1aed2bb4bca8aec3e1cc1d1df4f79e) Co-authored-by: Steve Dower <steve.dower@python.org> --- Doc/using/windows.rst | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 52212c394cff2b..a706280dc2d9fd 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -4,6 +4,8 @@ .. _Microsoft Store app: https://apps.microsoft.com/detail/9NQ7512CXL7T +.. _legacy launcher: https://www.python.org/ftp/python/3.14.0/win32/launcher.msi + .. _using-on-windows: ************************* @@ -543,12 +545,9 @@ configuration option. The behaviour of shebangs in the Python install manager is subtly different from the previous ``py.exe`` launcher, and the old configuration options no longer apply. If you are specifically reliant on the old behaviour or - configuration, we recommend keeping the legacy launcher. It may be - `downloaded independently <https://www.python.org/ftp/python/3.13.1/win32/launcher.msi>`_ - and installed on its own. The legacy launcher's ``py`` command will override - PyManager's one, and you will need to use ``pymanager`` commands for - installing and uninstalling. - + configuration, we recommend installing the `legacy launcher`_. The legacy + launcher's ``py`` command will override PyManager's one by default, and you + will need to use ``pymanager`` commands for installing and uninstalling. .. _Add-AppxPackage: https://learn.microsoft.com/powershell/module/appx/add-appxpackage @@ -859,6 +858,17 @@ default). These scripts are separated for each runtime, and so you may need to add multiple paths. + * - Typing ``script-name.py`` in the terminal opens in a new window. + - This is a known limitation of the operating system. Either specify ``py`` + before the script name, create a batch file containing ``@py "%~dpn0.py" %*`` + with the same name as the script, or install the `legacy launcher`_ + and select it as the association for scripts. + + * - Drag-dropping files onto a script doesn't work + - This is a known limitation of the operating system. It is supported with + the `legacy launcher`_, or with the Python install manager when installed + from the MSI. + .. _windows-embeddable: From 2f23c882431ce82b9f6558ab454156310b5b9134 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:32:05 +0100 Subject: [PATCH 1418/1674] [3.14] gh-139344: Remove pending removal notice for undeprecated importlib.resources API (GH-141507) (GH-141558) (cherry picked from commit 49e74210cb652d8bd538a4cc887f507396cfc893) Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/deprecations/pending-removal-in-3.13.rst | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Doc/deprecations/pending-removal-in-3.13.rst b/Doc/deprecations/pending-removal-in-3.13.rst index 2fd2f12cc6a2c4..d5b8c80e8f9aa0 100644 --- a/Doc/deprecations/pending-removal-in-3.13.rst +++ b/Doc/deprecations/pending-removal-in-3.13.rst @@ -38,15 +38,3 @@ APIs: * :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`) From 959578e5d1a3cbec6a515621649c75101702d64d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 14 Nov 2025 17:27:33 +0100 Subject: [PATCH 1419/1674] [3.14] gh-140691: urllib.request: Close FTP control socket if data socket can't connect (GH-140835) (GH-141555) (cherry picked from commit f2bce51b984f52db14d90f7bbd0b7df00b7c5637) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: codenamenam <bluetire27@gmail.com> --- Lib/_py_warnings.py | 3 + Lib/test/test_urllib2net.py | 59 +++++++++++++++---- Lib/urllib/request.py | 24 +++++--- ...-10-31-15-06-26.gh-issue-140691.JzHGtg.rst | 3 + 4 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst diff --git a/Lib/_py_warnings.py b/Lib/_py_warnings.py index c3583fe81ad9b0..55f8c06959180b 100644 --- a/Lib/_py_warnings.py +++ b/Lib/_py_warnings.py @@ -589,6 +589,9 @@ def __str__(self): "line : %r}" % (self.message, self._category_name, self.filename, self.lineno, self.line)) + def __repr__(self): + return f'<{type(self).__qualname__} {self}>' + class catch_warnings(object): diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index e6a18476908495..d015267cefdd64 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -1,9 +1,13 @@ +import contextlib import errno +import sysconfig import unittest +from unittest import mock from test import support from test.support import os_helper from test.support import socket_helper from test.support import ResourceDenied +from test.support.warnings_helper import check_no_resource_warning import os import socket @@ -143,6 +147,43 @@ def test_ftp(self): ] self._test_urls(urls, self._extra_handlers()) + @support.requires_resource('walltime') + @unittest.skipIf(sysconfig.get_platform() == 'linux-ppc64le', + 'leaks on PPC64LE (gh-140691)') + def test_ftp_no_leak(self): + # gh-140691: When the data connection (but not control connection) + # cannot be made established, we shouldn't leave an open socket object. + + class MockError(OSError): + pass + + orig_create_connection = socket.create_connection + def patched_create_connection(address, *args, **kwargs): + """Simulate REJECTing connections to ports other than 21""" + host, port = address + if port != 21: + raise MockError() + return orig_create_connection(address, *args, **kwargs) + + url = 'ftp://www.pythontest.net/README' + entry = url, None, urllib.error.URLError + no_cache_handlers = [urllib.request.FTPHandler()] + cache_handlers = self._extra_handlers() + with mock.patch('socket.create_connection', patched_create_connection): + with check_no_resource_warning(self): + # Try without CacheFTPHandler + self._test_urls([entry], handlers=no_cache_handlers, + retry=False) + with check_no_resource_warning(self): + # Try with CacheFTPHandler (uncached) + self._test_urls([entry], cache_handlers, retry=False) + with check_no_resource_warning(self): + # Try with CacheFTPHandler (cached) + self._test_urls([entry], cache_handlers, retry=False) + # Try without the mock: the handler should not use a closed connection + with check_no_resource_warning(self): + self._test_urls([url], cache_handlers, retry=False) + def test_file(self): TESTFN = os_helper.TESTFN f = open(TESTFN, 'w') @@ -255,18 +296,16 @@ def _test_urls(self, urls, handlers, retry=True): else: req = expected_err = None + if expected_err: + context = self.assertRaises(expected_err) + else: + context = contextlib.nullcontext() + with socket_helper.transient_internet(url): - try: + f = None + with context: f = urlopen(url, req, support.INTERNET_TIMEOUT) - # urllib.error.URLError is a subclass of OSError - except OSError as err: - if expected_err: - msg = ("Didn't get expected error(s) %s for %s %s, got %s: %s" % - (expected_err, url, req, type(err), err)) - self.assertIsInstance(err, expected_err, msg) - else: - raise - else: + if f is not None: try: with time_out, \ socket_peer_reset, \ diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index af93d4cd75dbef..566b8087aec277 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1535,6 +1535,7 @@ def ftp_open(self, req): dirs, file = dirs[:-1], dirs[-1] if dirs and not dirs[0]: dirs = dirs[1:] + fw = None try: fw = self.connect_ftp(user, passwd, host, port, dirs, req.timeout) type = file and 'I' or 'D' @@ -1552,8 +1553,12 @@ def ftp_open(self, req): headers += "Content-length: %d\n" % retrlen headers = email.message_from_string(headers) return addinfourl(fp, headers, req.full_url) - except ftplib.all_errors as exp: - raise URLError(f"ftp error: {exp}") from exp + except Exception as exp: + if fw is not None and not fw.keepalive: + fw.close() + if isinstance(exp, ftplib.all_errors): + raise URLError(f"ftp error: {exp}") from exp + raise def connect_ftp(self, user, passwd, host, port, dirs, timeout): return ftpwrapper(user, passwd, host, port, dirs, timeout, @@ -1577,14 +1582,15 @@ def setMaxConns(self, m): def connect_ftp(self, user, passwd, host, port, dirs, timeout): key = user, host, port, '/'.join(dirs), timeout - if key in self.cache: - self.timeout[key] = time.time() + self.delay - else: - self.cache[key] = ftpwrapper(user, passwd, host, port, - dirs, timeout) - self.timeout[key] = time.time() + self.delay + conn = self.cache.get(key) + if conn is None or not conn.keepalive: + if conn is not None: + conn.close() + conn = self.cache[key] = ftpwrapper(user, passwd, host, port, + dirs, timeout) + self.timeout[key] = time.time() + self.delay self.check_cache() - return self.cache[key] + return conn def check_cache(self): # first check for old ones diff --git a/Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst b/Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst new file mode 100644 index 00000000000000..84b6195c9262c8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst @@ -0,0 +1,3 @@ +In :mod:`urllib.request`, when opening a FTP URL fails because a data +connection cannot be made, the control connection's socket is now closed to +avoid a :exc:`ResourceWarning`. From 1cde019ecd04561da7a24090adb9d0c87e2c7b97 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 14 Nov 2025 19:38:30 +0100 Subject: [PATCH 1420/1674] [3.14] gh-114203: skip locking if object is already locked by two-mutex critical section (GH-141476) (#141564) gh-114203: skip locking if object is already locked by two-mutex critical section (GH-141476) (cherry picked from commit f26ed455d5582a7d66618acf2a93bc4b22a84b47) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- ...-11-14-16-25-15.gh-issue-114203.n3tlQO.rst | 1 + .../test_critical_sections.c | 101 ++++++++++++++++++ Python/critical_section.c | 23 +++- 3 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst new file mode 100644 index 00000000000000..883f9333cae880 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst @@ -0,0 +1 @@ +Skip locking if object is already locked by two-mutex critical section. diff --git a/Modules/_testinternalcapi/test_critical_sections.c b/Modules/_testinternalcapi/test_critical_sections.c index e0ba37abcdd332..e3b2fe716d48d3 100644 --- a/Modules/_testinternalcapi/test_critical_sections.c +++ b/Modules/_testinternalcapi/test_critical_sections.c @@ -284,10 +284,111 @@ test_critical_sections_gc(PyObject *self, PyObject *Py_UNUSED(args)) #endif +#ifdef Py_GIL_DISABLED + +static PyObject * +test_critical_section1_reacquisition(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyObject *a = PyDict_New(); + assert(a != NULL); + + PyCriticalSection cs1, cs2; + // First acquisition of critical section on object locks it + PyCriticalSection_Begin(&cs1, a); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert(_PyThreadState_GET()->critical_section == (uintptr_t)&cs1); + // Attempting to re-acquire critical section on same object which + // is already locked by top-most critical section is a no-op. + PyCriticalSection_Begin(&cs2, a); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert(_PyThreadState_GET()->critical_section == (uintptr_t)&cs1); + // Releasing second critical section is a no-op. + PyCriticalSection_End(&cs2); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert(_PyThreadState_GET()->critical_section == (uintptr_t)&cs1); + // Releasing first critical section unlocks the object + PyCriticalSection_End(&cs1); + assert(!PyMutex_IsLocked(&a->ob_mutex)); + + Py_DECREF(a); + Py_RETURN_NONE; +} + +static PyObject * +test_critical_section2_reacquisition(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyObject *a = PyDict_New(); + assert(a != NULL); + PyObject *b = PyDict_New(); + assert(b != NULL); + + PyCriticalSection2 cs; + // First acquisition of critical section on objects locks them + PyCriticalSection2_Begin(&cs, a, b); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(PyMutex_IsLocked(&b->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert((_PyThreadState_GET()->critical_section & + ~_Py_CRITICAL_SECTION_MASK) == (uintptr_t)&cs); + + // Attempting to re-acquire critical section on either of two + // objects already locked by top-most critical section is a no-op. + + // Check re-acquiring on first object + PyCriticalSection a_cs; + PyCriticalSection_Begin(&a_cs, a); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(PyMutex_IsLocked(&b->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert((_PyThreadState_GET()->critical_section & + ~_Py_CRITICAL_SECTION_MASK) == (uintptr_t)&cs); + // Releasing critical section on either object is a no-op. + PyCriticalSection_End(&a_cs); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(PyMutex_IsLocked(&b->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert((_PyThreadState_GET()->critical_section & + ~_Py_CRITICAL_SECTION_MASK) == (uintptr_t)&cs); + + // Check re-acquiring on second object + PyCriticalSection b_cs; + PyCriticalSection_Begin(&b_cs, b); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(PyMutex_IsLocked(&b->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert((_PyThreadState_GET()->critical_section & + ~_Py_CRITICAL_SECTION_MASK) == (uintptr_t)&cs); + // Releasing critical section on either object is a no-op. + PyCriticalSection_End(&b_cs); + assert(PyMutex_IsLocked(&a->ob_mutex)); + assert(PyMutex_IsLocked(&b->ob_mutex)); + assert(_PyCriticalSection_IsActive(PyThreadState_GET()->critical_section)); + assert((_PyThreadState_GET()->critical_section & + ~_Py_CRITICAL_SECTION_MASK) == (uintptr_t)&cs); + + // Releasing critical section on both objects unlocks them + PyCriticalSection2_End(&cs); + assert(!PyMutex_IsLocked(&a->ob_mutex)); + assert(!PyMutex_IsLocked(&b->ob_mutex)); + + Py_DECREF(a); + Py_DECREF(b); + Py_RETURN_NONE; +} + +#endif // Py_GIL_DISABLED + static PyMethodDef test_methods[] = { {"test_critical_sections", test_critical_sections, METH_NOARGS}, {"test_critical_sections_nest", test_critical_sections_nest, METH_NOARGS}, {"test_critical_sections_suspend", test_critical_sections_suspend, METH_NOARGS}, +#ifdef Py_GIL_DISABLED + {"test_critical_section1_reacquisition", test_critical_section1_reacquisition, METH_NOARGS}, + {"test_critical_section2_reacquisition", test_critical_section2_reacquisition, METH_NOARGS}, +#endif #ifdef Py_CAN_START_THREADS {"test_critical_sections_threads", test_critical_sections_threads, METH_NOARGS}, {"test_critical_sections_gc", test_critical_sections_gc, METH_NOARGS}, diff --git a/Python/critical_section.c b/Python/critical_section.c index e628ba2f6d19bc..218b580e95176d 100644 --- a/Python/critical_section.c +++ b/Python/critical_section.c @@ -24,11 +24,24 @@ _PyCriticalSection_BeginSlow(PyCriticalSection *c, PyMutex *m) // As an optimisation for locking the same object recursively, skip // locking if the mutex is currently locked by the top-most critical // section. - if (tstate->critical_section && - untag_critical_section(tstate->critical_section)->_cs_mutex == m) { - c->_cs_mutex = NULL; - c->_cs_prev = 0; - return; + // If the top-most critical section is a two-mutex critical section, + // then locking is skipped if either mutex is m. + if (tstate->critical_section) { + PyCriticalSection *prev = untag_critical_section(tstate->critical_section); + if (prev->_cs_mutex == m) { + c->_cs_mutex = NULL; + c->_cs_prev = 0; + return; + } + if (tstate->critical_section & _Py_CRITICAL_SECTION_TWO_MUTEXES) { + PyCriticalSection2 *prev2 = (PyCriticalSection2 *) + untag_critical_section(tstate->critical_section); + if (prev2->_cs_mutex2 == m) { + c->_cs_mutex = NULL; + c->_cs_prev = 0; + return; + } + } } c->_cs_mutex = NULL; c->_cs_prev = (uintptr_t)tstate->critical_section; From a2442fda6e04d2b7c34490e44000f4dd12daf962 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" <68491+gpshead@users.noreply.github.com> Date: Fri, 14 Nov 2025 11:25:33 -0800 Subject: [PATCH 1421/1674] [3.14] GH-139596: Cease caching config.cache & ccache in GH Actions (#141429) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/build.yml | 48 -------------------------- .github/workflows/reusable-context.yml | 9 ----- .github/workflows/reusable-macos.yml | 8 ----- .github/workflows/reusable-san.yml | 13 ------- .github/workflows/reusable-ubuntu.yml | 13 ------- .github/workflows/reusable-wasi.yml | 23 ------------ .gitignore | 1 - 7 files changed, 115 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d556bd02956d7a..77f7be20dcd4b3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -156,20 +156,10 @@ jobs: python-version: '3.x' - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - # Include env.pythonLocation in key to avoid changes in environment when setup-python updates Python - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ needs.build-context.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 - with: - save: false - name: Configure CPython run: | # Build Python with the libpython dynamic library @@ -262,7 +252,6 @@ jobs: free-threading: true uses: ./.github/workflows/reusable-macos.yml with: - config_hash: ${{ needs.build-context.outputs.config-hash }} free-threading: ${{ matrix.free-threading }} os: ${{ matrix.os }} @@ -294,7 +283,6 @@ jobs: bolt: true uses: ./.github/workflows/reusable-ubuntu.yml with: - config_hash: ${{ needs.build-context.outputs.config-hash }} bolt-optimizations: ${{ matrix.bolt }} free-threading: ${{ matrix.free-threading }} os: ${{ matrix.os }} @@ -325,11 +313,6 @@ jobs: persist-credentials: false - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ needs.build-context.outputs.config-hash }} - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Install dependencies @@ -351,10 +334,6 @@ jobs: - 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: false - name: Configure CPython run: ./configure CFLAGS="-fdiagnostics-format=json" --config-cache --enable-slower-safety --with-pydebug --with-openssl="$OPENSSL_DIR" - name: Build CPython @@ -414,8 +393,6 @@ jobs: needs: build-context if: needs.build-context.outputs.run-tests == 'true' uses: ./.github/workflows/reusable-wasi.yml - with: - config_hash: ${{ needs.build-context.outputs.config-hash }} test-hypothesis: name: "Hypothesis tests on Ubuntu" @@ -451,10 +428,6 @@ jobs: - 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: false - name: Setup directory envs for out-of-tree builds run: | echo "CPYTHON_RO_SRCDIR=$(realpath -m "${GITHUB_WORKSPACE}"/../cpython-ro-srcdir)" >> "$GITHUB_ENV" @@ -465,11 +438,6 @@ jobs: run: sudo mount --bind -o ro "$GITHUB_WORKSPACE" "$CPYTHON_RO_SRCDIR" - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: ${{ env.CPYTHON_BUILDDIR }}/config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ needs.build-context.outputs.config-hash }} - name: Configure CPython out-of-tree working-directory: ${{ env.CPYTHON_BUILDDIR }} run: | @@ -553,11 +521,6 @@ jobs: persist-credentials: false - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ needs.build-context.outputs.config-hash }} - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Install dependencies @@ -583,11 +546,6 @@ jobs: - 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: ./configure --config-cache --with-address-sanitizer --without-pymalloc - name: Build CPython @@ -619,7 +577,6 @@ jobs: uses: ./.github/workflows/reusable-san.yml with: sanitizer: ${{ matrix.sanitizer }} - config_hash: ${{ needs.build-context.outputs.config-hash }} free-threading: ${{ matrix.free-threading }} cross-build-linux: @@ -634,11 +591,6 @@ jobs: persist-credentials: false - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ needs.build-context.outputs.config-hash }} - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Set build dir diff --git a/.github/workflows/reusable-context.yml b/.github/workflows/reusable-context.yml index d2668ddcac1a3d..66c7cc47de03fb 100644 --- a/.github/workflows/reusable-context.yml +++ b/.github/workflows/reusable-context.yml @@ -17,9 +17,6 @@ on: # yamllint disable-line rule:truthy # || '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 }} # bool @@ -42,7 +39,6 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 outputs: - config-hash: ${{ steps.config-hash.outputs.hash }} run-ci-fuzz: ${{ steps.changes.outputs.run-ci-fuzz }} run-docs: ${{ steps.changes.outputs.run-docs }} run-tests: ${{ steps.changes.outputs.run-tests }} @@ -100,8 +96,3 @@ jobs: GITHUB_EVENT_NAME: ${{ github.event_name }} CCF_TARGET_REF: ${{ github.base_ref || github.event.repository.default_branch }} CCF_HEAD_REF: ${{ github.event.pull_request.head.sha || github.sha }} - - - name: Compute hash for config cache key - id: config-hash - run: | - echo "hash=${{ hashFiles('configure', 'configure.ac', '.github/workflows/build.yml') }}" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/reusable-macos.yml b/.github/workflows/reusable-macos.yml index 87bcd5786e7a88..4f2207c5548e4e 100644 --- a/.github/workflows/reusable-macos.yml +++ b/.github/workflows/reusable-macos.yml @@ -3,9 +3,6 @@ name: Reusable macOS on: workflow_call: inputs: - config_hash: - required: true - type: string free-threading: required: false type: boolean @@ -36,11 +33,6 @@ jobs: persist-credentials: false - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ inputs.config_hash }} - name: Install Homebrew dependencies run: | brew install pkg-config openssl@3.0 xz gdbm tcl-tk@8 make diff --git a/.github/workflows/reusable-san.yml b/.github/workflows/reusable-san.yml index e6ff02e4838ee6..c601d0b73380d4 100644 --- a/.github/workflows/reusable-san.yml +++ b/.github/workflows/reusable-san.yml @@ -6,9 +6,6 @@ on: sanitizer: required: true type: string - config_hash: - required: true - type: string free-threading: description: Whether to use free-threaded mode required: false @@ -34,11 +31,6 @@ jobs: persist-credentials: false - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ inputs.sanitizer }}-${{ inputs.config_hash }} - name: Install dependencies run: | sudo ./.github/workflows/posix-deps-apt.sh @@ -77,11 +69,6 @@ jobs: - 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: >- ./configure diff --git a/.github/workflows/reusable-ubuntu.yml b/.github/workflows/reusable-ubuntu.yml index 7f8b9fdf5d6639..0c1ebe29ae322f 100644 --- a/.github/workflows/reusable-ubuntu.yml +++ b/.github/workflows/reusable-ubuntu.yml @@ -3,9 +3,6 @@ name: Reusable Ubuntu on: workflow_call: inputs: - config_hash: - required: true - type: string bolt-optimizations: description: Whether to enable BOLT optimizations required: false @@ -64,11 +61,6 @@ jobs: - 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" @@ -79,11 +71,6 @@ jobs: run: sudo mount --bind -o ro "$GITHUB_WORKSPACE" "$CPYTHON_RO_SRCDIR" - name: Runner image version run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - name: Restore config.cache - uses: actions/cache@v4 - with: - path: ${{ env.CPYTHON_BUILDDIR }}/config.cache - key: ${{ github.job }}-${{ env.IMAGE_OS_VERSION }}-${{ inputs.config_hash }} - name: Configure CPython out-of-tree working-directory: ${{ env.CPYTHON_BUILDDIR }} # `test_unpickle_module_race` writes to the source directory, which is diff --git a/.github/workflows/reusable-wasi.yml b/.github/workflows/reusable-wasi.yml index 84224ae722942c..0f425ca269e1ba 100644 --- a/.github/workflows/reusable-wasi.yml +++ b/.github/workflows/reusable-wasi.yml @@ -2,10 +2,6 @@ name: Reusable WASI on: workflow_call: - inputs: - config_hash: - required: true - type: string env: FORCE_COLOR: 1 @@ -42,11 +38,6 @@ jobs: mkdir "${WASI_SDK_PATH}" && \ curl -s -S --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 - - 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" @@ -55,24 +46,10 @@ jobs: python-version: '3.x' - name: "Runner image version" run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" - - 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/__main__.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 }}-${{ env.IMAGE_OS_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi/__main__.py') }}-${{ env.pythonLocation }} - name: "Configure build Python" run: python3 Tools/wasm/wasi configure-build-python -- --config-cache --with-pydebug - name: "Make build Python" run: python3 Tools/wasm/wasi 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 }}-${{ env.IMAGE_OS_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi/__main__.py') }}-${{ env.pythonLocation }} - name: "Configure host" # `--with-pydebug` inferred from configure-build-python run: python3 Tools/wasm/wasi configure-host -- --config-cache diff --git a/.gitignore b/.gitignore index 89183d255b0b0e..2ba4e7da62e327 100644 --- a/.gitignore +++ b/.gitignore @@ -134,7 +134,6 @@ Tools/unicode/data/ /config.log /config.status /config.status.lineno -# hendrikmuhs/ccache-action@v1 /.ccache /cross-build/ /jit_stencils*.h From d582b6f1ab9e521b1d70e71b1f11a2f9eccde7a8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 15 Nov 2025 02:25:19 +0100 Subject: [PATCH 1422/1674] [3.14] gh-136442: Fix unittest to return exit code 5 when setUpClass raises an exception (GH-136487) (#141576) gh-136442: Fix unittest to return exit code 5 when setUpClass raises an exception (GH-136487) (cherry picked from commit 53d65c840e038ce9a5782fbd3da963c7aba90570) Co-authored-by: Takuya UESHIN <ueshin@happy-camper.st> --- Lib/test/test_unittest/test_program.py | 20 +++++++++++++++++++ Lib/unittest/main.py | 8 ++++---- ...-07-09-21-45-51.gh-issue-136442.jlbklP.rst | 1 + 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst diff --git a/Lib/test/test_unittest/test_program.py b/Lib/test/test_unittest/test_program.py index 6092ed292d8f60..8ed92373e5e984 100644 --- a/Lib/test/test_unittest/test_program.py +++ b/Lib/test/test_unittest/test_program.py @@ -75,6 +75,14 @@ def testUnexpectedSuccess(self): class Empty(unittest.TestCase): pass + class SetUpClassFailure(unittest.TestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + raise Exception + def testPass(self): + pass + class TestLoader(unittest.TestLoader): """Test loader that returns a suite containing the supplied testcase.""" @@ -191,6 +199,18 @@ def test_ExitEmptySuite(self): out = stream.getvalue() self.assertIn('\nNO TESTS RAN\n', out) + def test_ExitSetUpClassFailureSuite(self): + stream = BufferedWriter() + with self.assertRaises(SystemExit) as cm: + unittest.main( + argv=["setup_class_failure"], + testRunner=unittest.TextTestRunner(stream=stream), + testLoader=self.TestLoader(self.SetUpClassFailure)) + self.assertEqual(cm.exception.code, 1) + out = stream.getvalue() + self.assertIn("ERROR: setUpClass", out) + self.assertIn("SetUpClassFailure", out) + class InitialisableProgram(unittest.TestProgram): exit = False diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py index 6fd949581f3146..be99d93c78cca6 100644 --- a/Lib/unittest/main.py +++ b/Lib/unittest/main.py @@ -269,12 +269,12 @@ def runTests(self): testRunner = self.testRunner self.result = testRunner.run(self.test) if self.exit: - if self.result.testsRun == 0 and len(self.result.skipped) == 0: + if not self.result.wasSuccessful(): + sys.exit(1) + elif self.result.testsRun == 0 and len(self.result.skipped) == 0: sys.exit(_NO_TESTS_EXITCODE) - elif self.result.wasSuccessful(): - sys.exit(0) else: - sys.exit(1) + sys.exit(0) main = TestProgram diff --git a/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst b/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst new file mode 100644 index 00000000000000..f87fb1113cad12 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst @@ -0,0 +1 @@ +Use exitcode ``1`` instead of ``5`` if :func:`unittest.TestCase.setUpClass` raises an exception From 17e7aad5e34965cbadd45f41f5d48cfd2aca1adb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 15 Nov 2025 03:49:54 +0100 Subject: [PATCH 1423/1674] [3.14] gh-141579: Fix perf_jit backend in sys.activate_stack_trampoline() (GH-141580) (#141581) Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com> --- Lib/test/test_perf_profiler.py | 18 ++++++++++++++++++ ...5-11-15-01-21-00.gh-issue-141579.aB7cD9.rst | 2 ++ Python/sysmodule.c | 16 ++++++++-------- 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst diff --git a/Lib/test/test_perf_profiler.py b/Lib/test/test_perf_profiler.py index 0207843cc0e8f7..9f2e5899334df4 100644 --- a/Lib/test/test_perf_profiler.py +++ b/Lib/test/test_perf_profiler.py @@ -231,6 +231,24 @@ def test_sys_api_get_status(self): """ assert_python_ok("-c", code, PYTHON_JIT="0") + def test_sys_api_perf_jit_backend(self): + code = """if 1: + import sys + sys.activate_stack_trampoline("perf_jit") + assert sys.is_stack_trampoline_active() is True + sys.deactivate_stack_trampoline() + assert sys.is_stack_trampoline_active() is False + """ + assert_python_ok("-c", code, PYTHON_JIT="0") + + def test_sys_api_with_existing_perf_jit_trampoline(self): + code = """if 1: + import sys + sys.activate_stack_trampoline("perf_jit") + sys.activate_stack_trampoline("perf_jit") + """ + assert_python_ok("-c", code, PYTHON_JIT="0") + def is_unwinding_reliable_with_frame_pointers(): cflags = sysconfig.get_config_var("PY_CORE_CFLAGS") diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst new file mode 100644 index 00000000000000..8ab9979c39917b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst @@ -0,0 +1,2 @@ +Fix :func:`sys.activate_stack_trampoline` to properly support the +``perf_jit`` backend. Patch by Pablo Galindo. diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1bb3dcaea9e634..a7280c0da2e87c 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2373,14 +2373,14 @@ sys_activate_stack_trampoline_impl(PyObject *module, const char *backend) return NULL; } } - else if (strcmp(backend, "perf_jit") == 0) { - _PyPerf_Callbacks cur_cb; - _PyPerfTrampoline_GetCallbacks(&cur_cb); - if (cur_cb.write_state != _Py_perfmap_jit_callbacks.write_state) { - if (_PyPerfTrampoline_SetCallbacks(&_Py_perfmap_jit_callbacks) < 0 ) { - PyErr_SetString(PyExc_ValueError, "can't activate perf jit trampoline"); - return NULL; - } + } + else if (strcmp(backend, "perf_jit") == 0) { + _PyPerf_Callbacks cur_cb; + _PyPerfTrampoline_GetCallbacks(&cur_cb); + if (cur_cb.write_state != _Py_perfmap_jit_callbacks.write_state) { + if (_PyPerfTrampoline_SetCallbacks(&_Py_perfmap_jit_callbacks) < 0 ) { + PyErr_SetString(PyExc_ValueError, "can't activate perf jit trampoline"); + return NULL; } } } From 8a67e3c2b0fb1c15fee1c7b0fe7e73b80b5467f8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 15 Nov 2025 03:58:40 +0100 Subject: [PATCH 1424/1674] [3.14] gh-140938: Raise ValueError for infinite inputs to stdev/pstdev (GH-141531) (#141575) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-140938: Raise ValueError for infinite inputs to stdev/pstdev (GH-141531) Raise ValueError for infinite inputs to stdev/pstdev (cherry picked from commit f0a8bc737ab2f04d4196eee154cb1e17e26ad585) --- Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com> Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/statistics.py | 18 ++++++++++++++---- Lib/test/test_statistics.py | 9 ++++++++- ...5-11-13-14-51-30.gh-issue-140938.kXsHHv.rst | 2 ++ 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst diff --git a/Lib/statistics.py b/Lib/statistics.py index 3d805cb073987d..26cf925529ea60 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -619,9 +619,14 @@ def stdev(data, xbar=None): if n < 2: raise StatisticsError('stdev requires at least two data points') mss = ss / (n - 1) + try: + mss_numerator = mss.numerator + mss_denominator = mss.denominator + except AttributeError: + raise ValueError('inf or nan encountered in data') if issubclass(T, Decimal): - return _decimal_sqrt_of_frac(mss.numerator, mss.denominator) - return _float_sqrt_of_frac(mss.numerator, mss.denominator) + return _decimal_sqrt_of_frac(mss_numerator, mss_denominator) + return _float_sqrt_of_frac(mss_numerator, mss_denominator) def pstdev(data, mu=None): @@ -637,9 +642,14 @@ def pstdev(data, mu=None): if n < 1: raise StatisticsError('pstdev requires at least one data point') mss = ss / n + try: + mss_numerator = mss.numerator + mss_denominator = mss.denominator + except AttributeError: + raise ValueError('inf or nan encountered in data') if issubclass(T, Decimal): - return _decimal_sqrt_of_frac(mss.numerator, mss.denominator) - return _float_sqrt_of_frac(mss.numerator, mss.denominator) + return _decimal_sqrt_of_frac(mss_numerator, mss_denominator) + return _float_sqrt_of_frac(mss_numerator, mss_denominator) ## Statistics for relations between two inputs ############################# diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 8250b0aef09aec..677a87b51b9192 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2005,7 +2005,6 @@ def test_iter_list_same(self): expected = self.func(data) self.assertEqual(self.func(iter(data)), expected) - class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin): # Tests for population variance. def setUp(self): @@ -2113,6 +2112,14 @@ def test_center_not_at_mean(self): self.assertEqual(self.func(data), 2.5) self.assertEqual(self.func(data, mu=0.5), 6.5) + def test_gh_140938(self): + # Inputs with inf/nan should raise a ValueError + with self.assertRaises(ValueError): + self.func([1.0, math.inf]) + with self.assertRaises(ValueError): + self.func([1.0, math.nan]) + + class TestSqrtHelpers(unittest.TestCase): def test_integer_sqrt_of_frac_rto(self): diff --git a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst new file mode 100644 index 00000000000000..bd3044002a2d54 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst @@ -0,0 +1,2 @@ +The :func:`statistics.stdev` and :func:`statistics.pstdev` functions now raise a +:exc:`ValueError` when the input contains an infinity or a NaN. From 21e43d5e8343f356f12d6450a00b3c1e66f66bab Mon Sep 17 00:00:00 2001 From: Sergey Miryanov <sergey.miryanov@gmail.com> Date: Sat, 15 Nov 2025 23:56:52 +0500 Subject: [PATCH 1425/1674] [3.14] GH-141509: Fix warning about remaining subinterpreters (GH-141528) (GH-141566) (cherry picked from commit fa245df4a0848c15cf8d907c10fc92819994b866) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Lib/test/test_interpreters/test_api.py | 1 + .../2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst | 3 +++ Python/pylifecycle.c | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index c5a1743e7fdedf..e88fd399dfba38 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -431,6 +431,7 @@ def test_cleanup_in_repl(self): exit()""" stdout, stderr = repl.communicate(script) self.assertIsNone(stderr) + self.assertIn(b"Interpreter.close()", stdout) self.assertNotIn(b"Traceback", stdout) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst new file mode 100644 index 00000000000000..a51aa49522866b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst @@ -0,0 +1,3 @@ +Suggest using :meth:`concurrent.interpreters.Interpreter.close` instead of the +private ``_interpreters.destroy`` function when warning about remaining subinterpreters. +Patch by Sergey Miryanov. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 5b9ce617a48676..f5fbdeedac34ad 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2517,7 +2517,7 @@ finalize_subinterpreters(void) (void)PyErr_WarnEx( PyExc_RuntimeWarning, "remaining subinterpreters; " - "destroy them with _interpreters.destroy()", + "close them with Interpreter.close()", 0); /* Swap out the current tstate, which we know must belong From 79c136f87b20f9debb4ab846a50cfb7b7fc5153d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 15 Nov 2025 20:30:25 +0100 Subject: [PATCH 1426/1674] [3.14] GH-141312: Allow only integers to longrangeiter_setstate state (GH-141317) (GH-141559) This fixes an assertion error when the new computed start is not an integer. (cherry picked from commit 10bec7c1eb3ee27f490a067426eef452b15f78f9) Co-authored-by: Sergey Miryanov <sergey.miryanov@gmail.com> --- Lib/test/test_range.py | 10 ++++++++++ .../2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst | 2 ++ Objects/rangeobject.c | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 3870b153688b25..2c9c290e8906b7 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -470,6 +470,16 @@ def test_iterator_setstate(self): it.__setstate__(2**64 - 7) self.assertEqual(list(it), [12, 10]) + def test_iterator_invalid_setstate(self): + for invalid_value in (1.0, ""): + ranges = (('rangeiter', range(10, 100, 2)), + ('longrangeiter', range(10, 2**65, 2))) + for rng_name, rng in ranges: + with self.subTest(invalid_value=invalid_value, range=rng_name): + it = iter(rng) + with self.assertRaises(TypeError): + it.__setstate__(invalid_value) + def test_odd_bug(self): # This used to raise a "SystemError: NULL result without error" # because the range validation step was eating the exception diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst new file mode 100644 index 00000000000000..fdb136cef3f33c --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst @@ -0,0 +1,2 @@ +Fix the assertion failure in the ``__setstate__`` method of the range iterator +when a non-integer argument is passed. Patch by Sergey Miryanov. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index f8cdfe68a6435e..e93346fb27703f 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -1042,6 +1042,11 @@ longrangeiter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored)) static PyObject * longrangeiter_setstate(PyObject *op, PyObject *state) { + if (!PyLong_CheckExact(state)) { + PyErr_Format(PyExc_TypeError, "state must be an int, not %T", state); + return NULL; + } + longrangeiterobject *r = (longrangeiterobject*)op; PyObject *zero = _PyLong_GetZero(); // borrowed reference int cmp; From 10db8ee968bb7ac68361046098e113250f117ca7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 16 Nov 2025 19:56:41 +0100 Subject: [PATCH 1427/1674] [3.14] gh-141004: Document the `PyPickleBuffer_*` C API (GH-141630) (GH-141632) gh-141004: Document the `PyPickleBuffer_*` C API (GH-141630) (cherry picked from commit e33afa7ddbca3fca38f4ec4369b620c37cb092e2) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/concrete.rst | 1 + Doc/c-api/picklebuffer.rst | 59 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 Doc/c-api/picklebuffer.rst diff --git a/Doc/c-api/concrete.rst b/Doc/c-api/concrete.rst index a5c5a53236c9a4..1746fe95eaaca9 100644 --- a/Doc/c-api/concrete.rst +++ b/Doc/c-api/concrete.rst @@ -109,6 +109,7 @@ Other Objects descriptor.rst slice.rst memoryview.rst + picklebuffer.rst weakref.rst capsule.rst frame.rst diff --git a/Doc/c-api/picklebuffer.rst b/Doc/c-api/picklebuffer.rst new file mode 100644 index 00000000000000..9e2d92341b0f93 --- /dev/null +++ b/Doc/c-api/picklebuffer.rst @@ -0,0 +1,59 @@ +.. highlight:: c + +.. _picklebuffer-objects: + +.. index:: + pair: object; PickleBuffer + +Pickle buffer objects +--------------------- + +.. versionadded:: 3.8 + +A :class:`pickle.PickleBuffer` object wraps a :ref:`buffer-providing object +<bufferobjects>` for out-of-band data transfer with the :mod:`pickle` module. + + +.. c:var:: PyTypeObject PyPickleBuffer_Type + + This instance of :c:type:`PyTypeObject` represents the Python pickle buffer type. + This is the same object as :class:`pickle.PickleBuffer` in the Python layer. + + +.. c:function:: int PyPickleBuffer_Check(PyObject *op) + + Return true if *op* is a pickle buffer instance. + This function always succeeds. + + +.. c:function:: PyObject *PyPickleBuffer_FromObject(PyObject *obj) + + Create a pickle buffer from the object *obj*. + + This function will fail if *obj* doesn't support the :ref:`buffer protocol <bufferobjects>`. + + On success, return a new pickle buffer instance. + On failure, set an exception and return ``NULL``. + + Analogous to calling :class:`pickle.PickleBuffer` with *obj* in Python. + + +.. c:function:: const Py_buffer *PyPickleBuffer_GetBuffer(PyObject *picklebuf) + + Get a pointer to the underlying :c:type:`Py_buffer` that the pickle buffer wraps. + + The returned pointer is valid as long as *picklebuf* is alive and has not been + released. The caller must not modify or free the returned :c:type:`Py_buffer`. + If the pickle buffer has been released, raise :exc:`ValueError`. + + On success, return a pointer to the buffer view. + On failure, set an exception and return ``NULL``. + + +.. c:function:: int PyPickleBuffer_Release(PyObject *picklebuf) + + Release the underlying buffer held by the pickle buffer. + + Return ``0`` on success. On failure, set an exception and return ``-1``. + + Analogous to calling :meth:`pickle.PickleBuffer.release` in Python. From c9eb5cb1c0c994dd4759d21b1018242e990cba20 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 16 Nov 2025 20:31:25 +0100 Subject: [PATCH 1428/1674] [3.14] gh-141004: Document missing `PyCFunction*` and `PyCMethod*` APIs (GH-141253) (GH-141637) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141004: Document missing `PyCFunction*` and `PyCMethod*` APIs (GH-141253) (cherry picked from commit be699d6c7c8793d3eb464f2e5d3f10262fe3bc37) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/c-api/structures.rst | 93 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 58dd915e04f619..414dfdc84e61c9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -447,6 +447,25 @@ definition with the same method name. slot. This is helpful because calls to PyCFunctions are optimized more than wrapper object calls. + +.. c:var:: PyTypeObject PyCMethod_Type + + The type object corresponding to Python C method objects. This is + available as :class:`types.BuiltinMethodType` in the Python layer. + + +.. c:function:: int PyCMethod_Check(PyObject *op) + + Return true if *op* is an instance of the :c:type:`PyCMethod_Type` type + or a subtype of it. This function always succeeds. + + +.. c:function:: int PyCMethod_CheckExact(PyObject *op) + + This is the same as :c:func:`PyCMethod_Check`, but does not account for + subtypes. + + .. c:function:: PyObject * PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls) Turn *ml* into a Python :term:`callable` object. @@ -472,6 +491,24 @@ definition with the same method name. .. versionadded:: 3.9 +.. c:var:: PyTypeObject PyCFunction_Type + + The type object corresponding to Python C function objects. This is + available as :class:`types.BuiltinFunctionType` in the Python layer. + + +.. c:function:: int PyCFunction_Check(PyObject *op) + + Return true if *op* is an instance of the :c:type:`PyCFunction_Type` type + or a subtype of it. This function always succeeds. + + +.. c:function:: int PyCFunction_CheckExact(PyObject *op) + + This is the same as :c:func:`PyCFunction_Check`, but does not account for + subtypes. + + .. c:function:: PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) Equivalent to ``PyCMethod_New(ml, self, module, NULL)``. @@ -482,6 +519,62 @@ definition with the same method name. Equivalent to ``PyCMethod_New(ml, self, NULL, NULL)``. +.. c:function:: int PyCFunction_GetFlags(PyObject *func) + + Get the function's flags on *func* as they were passed to + :c:member:`~PyMethodDef.ml_flags`. + + If *func* is not a C function object, this fails with an exception. + *func* must not be ``NULL``. + + This function returns the function's flags on success, and ``-1`` with an + exception set on failure. + + +.. c:function:: int PyCFunction_GET_FLAGS(PyObject *func) + + This is the same as :c:func:`PyCFunction_GetFlags`, but without error + or type checking. + + +.. c:function:: PyCFunction PyCFunction_GetFunction(PyObject *func) + + Get the function pointer on *func* as it was passed to + :c:member:`~PyMethodDef.ml_meth`. + + If *func* is not a C function object, this fails with an exception. + *func* must not be ``NULL``. + + This function returns the function pointer on success, and ``NULL`` with an + exception set on failure. + + +.. c:function:: int PyCFunction_GET_FUNCTION(PyObject *func) + + This is the same as :c:func:`PyCFunction_GetFunction`, but without error + or type checking. + + +.. c:function:: PyObject *PyCFunction_GetSelf(PyObject *func) + + Get the "self" object on *func*. This is the object that would be passed + to the first argument of a :c:type:`PyCFunction`. For C function objects + created through a :c:type:`PyMethodDef` on a :c:type:`PyModuleDef`, this + is the resulting module object. + + If *func* is not a C function object, this fails with an exception. + *func* must not be ``NULL``. + + This function returns a :term:`borrowed reference` to the "self" object + on success, and ``NULL`` with an exception set on failure. + + +.. c:function:: PyObject *PyCFunction_GET_SELF(PyObject *func) + + This is the same as :c:func:`PyCFunction_GetSelf`, but without error or + type checking. + + Accessing attributes of extension types --------------------------------------- From 58c9d256758d7fb1caa1a5aab67445e9ddf46944 Mon Sep 17 00:00:00 2001 From: Tian Gao <gaogaotiantian@hotmail.com> Date: Sun, 16 Nov 2025 11:35:42 -0800 Subject: [PATCH 1429/1674] [3.14] gh-125115 : Refactor the pdb parsing issue so positional arguments can pass through (GH-140933) (#141635) (cherry-picked from commit 5348c200f5b26d6dd21d900b2b4cb684150d4b01) --- Lib/pdb.py | 79 ++++++++++--------- Lib/test/test_pdb.py | 5 +- ...-11-03-05-38-31.gh-issue-125115.jGS8MN.rst | 1 + 3 files changed, 48 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 14ed25ed147011..fa5b14ccb9271b 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -3543,7 +3543,15 @@ def exit_with_permission_help_text(): sys.exit(1) -def main(): +def parse_args(): + # We want pdb to be as intuitive as possible to users, so we need to do some + # heuristic parsing to deal with ambiguity. + # For example: + # "python -m pdb -m foo -p 1" should pass "-p 1" to "foo". + # "python -m pdb foo.py -m bar" should pass "-m bar" to "foo.py". + # "python -m pdb -m foo -m bar" should pass "-m bar" to "foo". + # This require some customized parsing logic to find the actual debug target. + import argparse parser = argparse.ArgumentParser( @@ -3554,58 +3562,57 @@ def main(): color=True, ) - # 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 + # Get all the commands out first. For backwards compatibility, we allow + # -c commands to be after the target. 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') - parser.add_argument('-p', '--pid', type=int, help="attach to the specified PID", default=None) - if len(sys.argv) == 1: + opts, args = parser.parse_known_args() + + if not args: # If no arguments were given (python -m pdb), print the whole help message. # Without this check, argparse would only complain about missing required arguments. + # We need to add the arguments definitions here to get a proper help message. + parser.add_argument('-m', metavar='module', dest='module') + parser.add_argument('-p', '--pid', type=int, help="attach to the specified PID", default=None) parser.print_help() sys.exit(2) + elif args[0] == '-p' or args[0] == '--pid': + # Attach to a pid + parser.add_argument('-p', '--pid', type=int, help="attach to the specified PID", default=None) + opts, args = parser.parse_known_args() + if args: + # For --pid, any extra arguments are invalid. + parser.error(f"unrecognized arguments: {' '.join(args)}") + elif args[0] == '-m': + # Debug a module, we only need the first -m module argument. + # The rest is passed to the module itself. + parser.add_argument('-m', metavar='module', dest='module') + opt_module = parser.parse_args(args[:2]) + opts.module = opt_module.module + args = args[2:] + elif args[0].startswith('-'): + # Invalid argument before the script name. + invalid_args = list(itertools.takewhile(lambda a: a.startswith('-'), args)) + parser.error(f"unrecognized arguments: {' '.join(invalid_args)}") - opts, args = parser.parse_known_args() + # Otherwise it's debugging a script and we already parsed all -c commands. + + return opts, args - if opts.pid: - # If attaching to a remote pid, unrecognized arguments are not allowed. - # This will raise an error if there are extra unrecognized arguments. - opts = parser.parse_args() - if opts.module: - parser.error("argument -m: not allowed with argument --pid") +def main(): + opts, args = parse_args() + + if getattr(opts, 'pid', None) is not None: try: attach(opts.pid, opts.commands) except PermissionError as e: exit_with_permission_help_text() return - elif 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: + elif getattr(opts, 'module', None) is not None: 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) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 9a7d855003551a..2ca689e0adf710 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -3974,7 +3974,10 @@ def test_run_module_with_args(self): commands = """ continue """ - self._run_pdb(["calendar", "-m"], commands, expected_returncode=2) + self._run_pdb(["calendar", "-m"], commands, expected_returncode=1) + + _, stderr = self._run_pdb(["-m", "calendar", "-p", "1"], commands) + self.assertIn("unrecognized arguments: -p", stderr) stdout, _ = self._run_pdb(["-m", "calendar", "1"], commands) self.assertIn("December", stdout) diff --git a/Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst b/Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst new file mode 100644 index 00000000000000..d36debec3ed6cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst @@ -0,0 +1 @@ +Refactor the :mod:`pdb` parsing issue so positional arguments can pass through intuitively. From 0d8fb0b8523769e24f249d19dab3781a10b50e8b Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" <68491+gpshead@users.noreply.github.com> Date: Sun, 16 Nov 2025 11:45:29 -0800 Subject: [PATCH 1430/1674] [3.14] gh-137109: refactor warning about threads when forking (GH-141438) (GH-141614) This splits the OS API specific functionality to get the number of threads out from the fallback Python method and warning raising code itself. This way the OS APIs can be queried before we've run `os.register_at_fork(after_in_parent=...)` registered functions which themselves may (re)start threads that would otherwise be detected. This is best effort. If the OS APIs are either unavailable or fail, the warning generating code still falls back to looking at the Python threading state after the CPython interpreter world has been restarted and the after_in_parent calls have been made. The common case for most Linux and macOS environments should work today. This also lines up with the existing TODO refactoring, we may choose to expose this API to get the number of OS threads in the `os` module in the future. Note: This is a simplified backport that maintains the void return type for warn_about_fork_with_threads() and keeps PyErr_Clear() in the warning path, as the error handling changes from fd8f42d3d1 are not needed in 3.14. --- ...-11-12-01-49-03.gh-issue-137109.D6sq2B.rst | 5 + Modules/posixmodule.c | 103 ++++++++++-------- 2 files changed, 65 insertions(+), 43 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst diff --git a/Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst b/Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst new file mode 100644 index 00000000000000..32f4e39f6d5f4c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst @@ -0,0 +1,5 @@ +The :mod:`os.fork` and related forking APIs will no longer warn in the +common case where Linux or macOS platform APIs return the number of threads +in a process and find the answer to be 1 even when a +:func:`os.register_at_fork` ``after_in_parent=`` callback (re)starts a +thread. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 9295324f6c1eeb..6e878e3de37291 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7975,53 +7975,19 @@ os_register_at_fork_impl(PyObject *module, PyObject *before, // running in the process. Best effort, silent if unable to count threads. // Constraint: Quick. Never overcounts. Never leaves an error set. // -// This should only be called from the parent process after +// This MUST only be called from the parent process after // PyOS_AfterFork_Parent(). static void -warn_about_fork_with_threads(const char* name) +warn_about_fork_with_threads( + const char* name, // Name of the API to use in the warning message. + const Py_ssize_t num_os_threads // Only trusted when >= 1. +) { // It's not safe to issue the warning while the world is stopped, because // other threads might be holding locks that we need, which would deadlock. assert(!_PyRuntime.stoptheworld.world_stopped); - // TODO: Consider making an `os` module API to return the current number - // of threads in the process. That'd presumably use this platform code but - // raise an error rather than using the inaccurate fallback. - Py_ssize_t num_python_threads = 0; -#if defined(__APPLE__) && defined(HAVE_GETPID) - mach_port_t macos_self = mach_task_self(); - mach_port_t macos_task; - if (task_for_pid(macos_self, getpid(), &macos_task) == KERN_SUCCESS) { - thread_array_t macos_threads; - mach_msg_type_number_t macos_n_threads; - if (task_threads(macos_task, &macos_threads, - &macos_n_threads) == KERN_SUCCESS) { - num_python_threads = macos_n_threads; - } - } -#elif defined(__linux__) - // Linux /proc/self/stat 20th field is the number of threads. - FILE* proc_stat = fopen("/proc/self/stat", "r"); - if (proc_stat) { - size_t n; - // Size chosen arbitrarily. ~60% more bytes than a 20th column index - // observed on the author's workstation. - char stat_line[160]; - n = fread(&stat_line, 1, 159, proc_stat); - stat_line[n] = '\0'; - fclose(proc_stat); - - char *saveptr = NULL; - char *field = strtok_r(stat_line, " ", &saveptr); - unsigned int idx; - for (idx = 19; idx && field; --idx) { - field = strtok_r(NULL, " ", &saveptr); - } - if (idx == 0 && field) { // found the 20th field - num_python_threads = atoi(field); // 0 on error - } - } -#endif + Py_ssize_t num_python_threads = num_os_threads; if (num_python_threads <= 0) { // Fall back to just the number our threading module knows about. // An incomplete view of the world, but better than nothing. @@ -8074,6 +8040,51 @@ warn_about_fork_with_threads(const char* name) PyErr_Clear(); } } + +// If this returns <= 0, we were unable to successfully use any OS APIs. +// Returns a positive number of threads otherwise. +static Py_ssize_t get_number_of_os_threads(void) +{ + // TODO: Consider making an `os` module API to return the current number + // of threads in the process. That'd presumably use this platform code but + // raise an error rather than using the inaccurate fallback. + Py_ssize_t num_python_threads = 0; +#if defined(__APPLE__) && defined(HAVE_GETPID) + mach_port_t macos_self = mach_task_self(); + mach_port_t macos_task; + if (task_for_pid(macos_self, getpid(), &macos_task) == KERN_SUCCESS) { + thread_array_t macos_threads; + mach_msg_type_number_t macos_n_threads; + if (task_threads(macos_task, &macos_threads, + &macos_n_threads) == KERN_SUCCESS) { + num_python_threads = macos_n_threads; + } + } +#elif defined(__linux__) + // Linux /proc/self/stat 20th field is the number of threads. + FILE* proc_stat = fopen("/proc/self/stat", "r"); + if (proc_stat) { + size_t n; + // Size chosen arbitrarily. ~60% more bytes than a 20th column index + // observed on the author's workstation. + char stat_line[160]; + n = fread(&stat_line, 1, 159, proc_stat); + stat_line[n] = '\0'; + fclose(proc_stat); + + char *saveptr = NULL; + char *field = strtok_r(stat_line, " ", &saveptr); + unsigned int idx; + for (idx = 19; idx && field; --idx) { + field = strtok_r(NULL, " ", &saveptr); + } + if (idx == 0 && field) { // found the 20th field + num_python_threads = atoi(field); // 0 on error + } + } +#endif + return num_python_threads; +} #endif // HAVE_FORK1 || HAVE_FORKPTY || HAVE_FORK #ifdef HAVE_FORK1 @@ -8108,10 +8119,12 @@ os_fork1_impl(PyObject *module) /* child: this clobbers and resets the import lock. */ PyOS_AfterFork_Child(); } else { + // Called before AfterFork_Parent in case those hooks start threads. + Py_ssize_t num_os_threads = get_number_of_os_threads(); /* parent: release the import lock. */ PyOS_AfterFork_Parent(); // After PyOS_AfterFork_Parent() starts the world to avoid deadlock. - warn_about_fork_with_threads("fork1"); + warn_about_fork_with_threads("fork1", num_os_threads); } if (pid == -1) { errno = saved_errno; @@ -8157,10 +8170,12 @@ os_fork_impl(PyObject *module) /* child: this clobbers and resets the import lock. */ PyOS_AfterFork_Child(); } else { + // Called before AfterFork_Parent in case those hooks start threads. + Py_ssize_t num_os_threads = get_number_of_os_threads(); /* parent: release the import lock. */ PyOS_AfterFork_Parent(); // After PyOS_AfterFork_Parent() starts the world to avoid deadlock. - warn_about_fork_with_threads("fork"); + warn_about_fork_with_threads("fork", num_os_threads); } if (pid == -1) { errno = saved_errno; @@ -9014,10 +9029,12 @@ os_forkpty_impl(PyObject *module) /* child: this clobbers and resets the import lock. */ PyOS_AfterFork_Child(); } else { + // Called before AfterFork_Parent in case those hooks start threads. + Py_ssize_t num_os_threads = get_number_of_os_threads(); /* parent: release the import lock. */ PyOS_AfterFork_Parent(); // After PyOS_AfterFork_Parent() starts the world to avoid deadlock. - warn_about_fork_with_threads("forkpty"); + warn_about_fork_with_threads("forkpty", num_os_threads); } if (pid == -1) { return posix_error(); From eead7b43bc9a7d802b99f53e99fd59b1bfbdc3ad Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:22:11 +0100 Subject: [PATCH 1431/1674] [3.14] gh-136057: Allow step and next to step over for loops (GH-136160) (#141640) gh-136057: Allow step and next to step over for loops (GH-136160) (cherry picked from commit 8be3b2f479431f670f2e81e41b52e698c0806289) Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com> --- Lib/bdb.py | 22 ++++++++++--- Lib/test/test_pdb.py | 31 +++++++++++++++++++ ...-07-01-04-57-57.gh-issue-136057.4-t596.rst | 1 + 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst diff --git a/Lib/bdb.py b/Lib/bdb.py index 4290ef22302a42..79da4bab9c9034 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -199,6 +199,8 @@ def __init__(self, skip=None, backend='settrace'): self.frame_returning = None self.trace_opcodes = False self.enterframe = None + self.cmdframe = None + self.cmdlineno = None self.code_linenos = weakref.WeakKeyDictionary() self.backend = backend if backend == 'monitoring': @@ -306,7 +308,12 @@ def dispatch_line(self, frame): self.user_line(). 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): + # GH-136057 + # For line events, we don't want to stop at the same line where + # the latest next/step command was issued. + if (self.stop_here(frame) or self.break_here(frame)) and not ( + self.cmdframe == frame and self.cmdlineno == frame.f_lineno + ): self.user_line(frame) self.restart_events() if self.quitting: raise BdbQuit @@ -535,7 +542,8 @@ def _set_trace_opcodes(self, trace_opcodes): if self.monitoring_tracer: self.monitoring_tracer.update_local_events() - def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False): + def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False, + cmdframe=None, cmdlineno=None): """Set the attributes for stopping. If stoplineno is greater than or equal to 0, then stop at line @@ -548,6 +556,10 @@ def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False): # stoplineno >= 0 means: stop at line >= the stoplineno # stoplineno -1 means: don't stop at all self.stoplineno = stoplineno + # cmdframe/cmdlineno is the frame/line number when the user issued + # step/next commands. + self.cmdframe = cmdframe + self.cmdlineno = cmdlineno self._set_trace_opcodes(opcode) def _set_caller_tracefunc(self, current_frame): @@ -573,7 +585,9 @@ def set_until(self, frame, lineno=None): def set_step(self): """Stop after one line of code.""" - self._set_stopinfo(None, None) + # set_step() could be called from signal handler so enterframe might be None + self._set_stopinfo(None, None, cmdframe=self.enterframe, + cmdlineno=getattr(self.enterframe, 'f_lineno', None)) def set_stepinstr(self): """Stop before the next instruction.""" @@ -581,7 +595,7 @@ def set_stepinstr(self): def set_next(self, frame): """Stop on the next line in or below the given frame.""" - self._set_stopinfo(frame, None) + self._set_stopinfo(frame, None, cmdframe=frame, cmdlineno=frame.f_lineno) def set_return(self, frame): """Stop when returning from the given frame.""" diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 2ca689e0adf710..9d89008756a1d3 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -3232,6 +3232,37 @@ def test_pdb_issue_gh_127321(): """ +def test_pdb_issue_gh_136057(): + """See GH-136057 + "step" and "next" commands should be able to get over list comprehensions + >>> def test_function(): + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... lst = [i for i in range(10)] + ... for i in lst: pass + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'next', + ... 'next', + ... 'step', + ... 'continue', + ... ]): + ... test_function() + > <doctest test.test_pdb.test_pdb_issue_gh_136057[0]>(2)test_function() + -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + (Pdb) next + > <doctest test.test_pdb.test_pdb_issue_gh_136057[0]>(3)test_function() + -> lst = [i for i in range(10)] + (Pdb) next + > <doctest test.test_pdb.test_pdb_issue_gh_136057[0]>(4)test_function() + -> for i in lst: pass + (Pdb) step + --Return-- + > <doctest test.test_pdb.test_pdb_issue_gh_136057[0]>(4)test_function()->None + -> for i in lst: pass + (Pdb) continue + """ + + def test_pdb_issue_gh_80731(): """See GH-80731 diff --git a/Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst b/Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst new file mode 100644 index 00000000000000..e237a0e98cc486 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst @@ -0,0 +1 @@ +Fixed the bug in :mod:`pdb` and :mod:`bdb` where ``next`` and ``step`` can't go over the line if a loop exists in the line. From eeb5fbf5f721a02e3f82078c8014bc97cb30a85a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:02:03 +0100 Subject: [PATCH 1432/1674] [3.14] gh-141650: Fix typo in `xml.sax.saxutils.unescape` documentation (GH-141652) (#141654) Co-authored-by: Tamzin Hadasa Kelly <tk.infinity@gmail.com> --- Doc/library/xml.sax.utils.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/xml.sax.utils.rst b/Doc/library/xml.sax.utils.rst index 5ee11d58c3dd26..7731f03d875efc 100644 --- a/Doc/library/xml.sax.utils.rst +++ b/Doc/library/xml.sax.utils.rst @@ -37,7 +37,7 @@ or as base classes. You can unescape other strings of data by passing a dictionary as the optional *entities* parameter. The keys and values must all be strings; each key will be - replaced with its corresponding value. ``'&amp'``, ``'&lt;'``, and ``'&gt;'`` + replaced with its corresponding value. ``'&amp;'``, ``'&lt;'``, and ``'&gt;'`` are always unescaped, even if *entities* is provided. From cf141ab1b8d8a118aba7d14bfc360bc65e5e8b8b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:38:00 +0100 Subject: [PATCH 1433/1674] [3.14] fix memory order of `_Py_atomic_store_uint_release` (GH-141562) (GH-141663) (cherry picked from commit 7800b78067162fc9d7cb6926f703fe14dee1702a) Co-authored-by: SubbaraoGarlapati <53627478+SubbaraoGarlapati@users.noreply.github.com> --- Include/cpython/pyatomic_std.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Include/cpython/pyatomic_std.h b/Include/cpython/pyatomic_std.h index 69a8b9e615ea5f..7176f667a4082c 100644 --- a/Include/cpython/pyatomic_std.h +++ b/Include/cpython/pyatomic_std.h @@ -948,14 +948,6 @@ _Py_atomic_store_ushort_relaxed(unsigned short *obj, unsigned short value) memory_order_relaxed); } -static inline void -_Py_atomic_store_uint_release(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_long_relaxed(long *obj, long value) { @@ -1031,6 +1023,14 @@ _Py_atomic_store_int_release(int *obj, int value) memory_order_release); } +static inline void +_Py_atomic_store_uint_release(unsigned int *obj, unsigned int value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(unsigned int)*)obj, value, + memory_order_release); +} + static inline void _Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value) { From cc315dc6d4f22a46505eaf8d0e1fe4371c23807e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:57:26 +0100 Subject: [PATCH 1434/1674] [3.14] gh-130160: Add anchors to CLI Usage section for `cmdline` (GH-133182) (#141664) Co-authored-by: Semyon Moroz <donbarbos@proton.me> --- Doc/library/cmdline.rst | 10 +++++----- Doc/library/ensurepip.rst | 4 +++- Doc/library/gzip.rst | 4 ++-- Doc/library/idle.rst | 4 +++- Doc/library/inspect.rst | 2 +- Doc/library/pdb.rst | 6 +++++- Doc/library/site.rst | 2 +- Doc/library/webbrowser.rst | 7 ++++++- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Doc/library/cmdline.rst b/Doc/library/cmdline.rst index 16c67ddbf7cec2..c43b10157f9aea 100644 --- a/Doc/library/cmdline.rst +++ b/Doc/library/cmdline.rst @@ -16,17 +16,17 @@ The following modules have a command-line interface. * :ref:`dis <dis-cli>` * :ref:`doctest <doctest-cli>` * :mod:`!encodings.rot_13` -* :mod:`ensurepip` +* :ref:`ensurepip <ensurepip-cli>` * :mod:`filecmp` * :mod:`fileinput` * :mod:`ftplib` * :ref:`gzip <gzip-cli>` * :ref:`http.server <http-server-cli>` -* :mod:`!idlelib` +* :ref:`idlelib <idlelib-cli>` * :ref:`inspect <inspect-module-cli>` * :ref:`json <json-commandline>` * :ref:`mimetypes <mimetypes-cli>` -* :mod:`pdb` +* :ref:`pdb <pdb-cli>` * :ref:`pickle <pickle-cli>` * :ref:`pickletools <pickletools-cli>` * :ref:`platform <platform-cli>` @@ -52,8 +52,8 @@ The following modules have a command-line interface. * :mod:`turtledemo` * :ref:`unittest <unittest-command-line-interface>` * :ref:`uuid <uuid-cli>` -* :mod:`venv` -* :mod:`webbrowser` +* :ref:`venv <venv-cli>` +* :ref:`webbrowser <webbrowser-cli>` * :ref:`zipapp <zipapp-command-line-interface>` * :ref:`zipfile <zipfile-commandline>` diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index 165b9a9f823154..32b92c01570004 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -42,7 +42,9 @@ when creating a virtual environment) or after explicitly uninstalling .. include:: ../includes/wasm-mobile-notavail.rst -Command line interface +.. _ensurepip-cli: + +Command-line interface ---------------------- .. program:: ensurepip diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index bb260aee4e9eb2..76de92b30692b3 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -269,7 +269,7 @@ Example of how to GZIP compress a binary string:: .. _gzip-cli: -Command Line Interface +Command-line interface ---------------------- The :mod:`gzip` module provides a simple command line interface to compress or @@ -282,7 +282,7 @@ Once executed the :mod:`gzip` module keeps the input file(s). Add a new command line interface with a usage. By default, when you will execute the CLI, the default compression level is 6. -Command line options +Command-line options ^^^^^^^^^^^^^^^^^^^^ .. option:: file diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 52e3726a0f5af5..a16f46ef812400 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -661,7 +661,9 @@ looked for in the user's home directory. Statements in this file will be executed in the Tk namespace, so this file is not useful for importing functions to be used from IDLE's Python shell. -Command line usage +.. _idlelib-cli: + +Command-line usage ^^^^^^^^^^^^^^^^^^ .. program:: idle diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 2b3b294ff33a64..c5af7d5de2837c 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -1776,7 +1776,7 @@ Buffer flags .. _inspect-module-cli: -Command Line Interface +Command-line interface ---------------------- The :mod:`inspect` module also provides a basic introspection capability diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 90dc6648045f27..0bbdc42535290a 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -76,6 +76,10 @@ The debugger's prompt is ``(Pdb)``, which is the indicator that you are in debug .. _pdb-cli: + +Command-line interface +---------------------- + .. program:: pdb You can also invoke :mod:`pdb` from the command line to debug other scripts. For @@ -334,7 +338,7 @@ access further features, you have to do this yourself: .. _debugger-commands: -Debugger Commands +Debugger commands ----------------- The commands recognized by the debugger are listed below. Most commands can be diff --git a/Doc/library/site.rst b/Doc/library/site.rst index e98dd83b60eb60..d93e4dc7c75f1a 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -270,7 +270,7 @@ Module contents .. _site-commandline: -Command Line Interface +Command-line interface ---------------------- .. program:: site diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index fd6abc70261019..a2103d8fdd8efe 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -49,6 +49,11 @@ 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. +.. _webbrowser-cli: + +Command-line interface +---------------------- + .. program:: webbrowser The script :program:`webbrowser` can be used as a command-line interface for the @@ -232,7 +237,7 @@ Here are some simple examples:: .. _browser-controllers: -Browser Controller Objects +Browser controller objects -------------------------- Browser controllers provide the :attr:`~controller.name` attribute, From 8db1aadd6503ac73fd02e2c8c20c31728828e344 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Mon, 17 Nov 2025 18:26:30 +0200 Subject: [PATCH 1435/1674] [3.14] gh-130693: Add more tests for tkinter.Text.search() (GH-130848) (GH-141669) --- Lib/test/test_tkinter/test_text.py | 43 ++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_tkinter/test_text.py b/Lib/test/test_tkinter/test_text.py index b26956930d3402..ed618c739019cc 100644 --- a/Lib/test/test_tkinter/test_text.py +++ b/Lib/test/test_tkinter/test_text.py @@ -34,12 +34,45 @@ def test_search(self): # Invalid text index. self.assertRaises(tkinter.TclError, text.search, '', 0) + self.assertRaises(tkinter.TclError, text.search, '', '') + self.assertRaises(tkinter.TclError, text.search, '', 'invalid') + self.assertRaises(tkinter.TclError, text.search, '', '1.0', 'invalid') - # Check if we are getting the indices as strings -- you are likely - # to get Tcl_Obj under Tk 8.5 if Tkinter doesn't convert it. - text.insert('1.0', 'hi-test') - self.assertEqual(text.search('-test', '1.0', 'end'), '1.2') - self.assertEqual(text.search('test', '1.0', 'end'), '1.3') + text.insert('1.0', + 'This is a test. This is only a test.\n' + 'Another line.\n' + 'Yet another line.\n' + '64-bit') + + self.assertEqual(text.search('test', '1.0'), '1.10') + self.assertEqual(text.search('test', '1.0', 'end'), '1.10') + self.assertEqual(text.search('test', '1.0', '1.10'), '') + self.assertEqual(text.search('test', '1.11'), '1.31') + self.assertEqual(text.search('test', '1.32', 'end'), '') + self.assertEqual(text.search('test', '1.32'), '1.10') + + self.assertEqual(text.search('', '1.0'), '1.0') # empty pattern + self.assertEqual(text.search('nonexistent', '1.0'), '') + self.assertEqual(text.search('-bit', '1.0'), '4.2') # starts with a hyphen + + self.assertEqual(text.search('line', '3.0'), '3.12') + self.assertEqual(text.search('line', '3.0', forwards=True), '3.12') + self.assertEqual(text.search('line', '3.0', backwards=True), '2.8') + self.assertEqual(text.search('line', '3.0', forwards=True, backwards=True), '2.8') + + self.assertEqual(text.search('t.', '1.0'), '1.13') + self.assertEqual(text.search('t.', '1.0', exact=True), '1.13') + self.assertEqual(text.search('t.', '1.0', regexp=True), '1.10') + self.assertEqual(text.search('t.', '1.0', exact=True, regexp=True), '1.10') + + self.assertEqual(text.search('TEST', '1.0'), '') + self.assertEqual(text.search('TEST', '1.0', nocase=True), '1.10') + + var = tkinter.Variable(self.root) + self.assertEqual(text.search('test', '1.0', count=var), '1.10') + self.assertEqual(var.get(), 4 if self.wantobjects else '4') + + # TODO: Add test for elide=True def test_count(self): text = self.text From 060118ae918937d88760f384d0b0edf3f5251876 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:56:55 +0100 Subject: [PATCH 1436/1674] [3.14] gh-141497: Make ipaddress.IP{v4,v6}Network.hosts() always returning an iterator (GH-141547) (GH-141673) (cherry picked from commit 6b1bdf6c7a6c87f12a247a125e25f8e721cc731e) Co-authored-by: Krishna Chaitanya <141550576+XChaitanyaX@users.noreply.github.com> --- Lib/ipaddress.py | 4 +-- Lib/test/test_ipaddress.py | 34 +++++++++++++++++++ ...-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst | 4 +++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 8b60b9d5c9cd51..ca732e4f2e85a8 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1545,7 +1545,7 @@ def __init__(self, address, strict=True): if self._prefixlen == (self.max_prefixlen - 1): self.hosts = self.__iter__ elif self._prefixlen == (self.max_prefixlen): - self.hosts = lambda: [IPv4Address(addr)] + self.hosts = lambda: iter((IPv4Address(addr),)) @property @functools.lru_cache() @@ -2336,7 +2336,7 @@ def __init__(self, address, strict=True): if self._prefixlen == (self.max_prefixlen - 1): self.hosts = self.__iter__ elif self._prefixlen == self.max_prefixlen: - self.hosts = lambda: [IPv6Address(addr)] + self.hosts = lambda: iter((IPv6Address(addr),)) def hosts(self): """Generate Iterator over usable hosts in a network. diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index db1c38243e2268..8af91e857d80ed 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -12,6 +12,7 @@ import pickle import ipaddress import weakref +from collections.abc import Iterator from test.support import LARGEST, SMALLEST @@ -1472,18 +1473,27 @@ def testGetSupernet4(self): self.ipv6_scoped_network.supernet(new_prefix=62)) def testHosts(self): + hosts = self.ipv4_network.hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), next(hosts)) hosts = list(self.ipv4_network.hosts()) self.assertEqual(254, len(hosts)) self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0]) self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1]) ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120') + hosts = ipv6_network.hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), next(hosts)) hosts = list(ipv6_network.hosts()) self.assertEqual(255, len(hosts)) self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120') + hosts = ipv6_scoped_network.hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual((ipaddress.IPv6Address('2001:658:22a:cafe::1')), next(hosts)) hosts = list(ipv6_scoped_network.hosts()) self.assertEqual(255, len(hosts)) self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) @@ -1494,6 +1504,12 @@ def testHosts(self): ipaddress.IPv4Address('2.0.0.1')] str_args = '2.0.0.0/31' tpl_args = ('2.0.0.0', 31) + hosts = ipaddress.ip_network(str_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) + hosts = ipaddress.ip_network(tpl_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), @@ -1503,6 +1519,12 @@ def testHosts(self): addrs = [ipaddress.IPv4Address('1.2.3.4')] str_args = '1.2.3.4/32' tpl_args = ('1.2.3.4', 32) + hosts = ipaddress.ip_network(str_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) + hosts = ipaddress.ip_network(tpl_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), @@ -1512,6 +1534,12 @@ def testHosts(self): ipaddress.IPv6Address('2001:658:22a:cafe::1')] str_args = '2001:658:22a:cafe::/127' tpl_args = ('2001:658:22a:cafe::', 127) + hosts = ipaddress.ip_network(str_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) + hosts = ipaddress.ip_network(tpl_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), @@ -1520,6 +1548,12 @@ def testHosts(self): addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ] str_args = '2001:658:22a:cafe::1/128' tpl_args = ('2001:658:22a:cafe::1', 128) + hosts = ipaddress.ip_network(str_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) + hosts = ipaddress.ip_network(tpl_args).hosts() + self.assertIsInstance(hosts, Iterator) + self.assertEqual(next(hosts), addrs[0]) self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), diff --git a/Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst b/Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst new file mode 100644 index 00000000000000..328bfe067ad96b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst @@ -0,0 +1,4 @@ +:mod:`ipaddress`: ensure that the methods +:meth:`IPv4Network.hosts() <ipaddress.IPv4Network.hosts>` and +:meth:`IPv6Network.hosts() <ipaddress.IPv6Network.hosts>` always return an +iterator. From aa887aa2a8a9dcd300e27b92637fa846c1fdd3ea Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Nov 2025 20:46:23 +0100 Subject: [PATCH 1437/1674] [3.14] gh-141004: Document `PyODict*` APIs (GH-141136) (GH-141677) gh-141004: Document `PyODict*` APIs (GH-141136) (cherry picked from commit b3626321b6ebb46dd24acee2aa806450e70febfc) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/dict.rst | 89 ++++++++++++++++++++++++++++++++++++++++++ Doc/c-api/iterator.rst | 1 + 2 files changed, 90 insertions(+) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index b7f201811aad6c..ede1699cfeb653 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -477,3 +477,92 @@ Dictionary View Objects Return true if *op* is an instance of a dictionary items view. This function always succeeds. + + +Ordered Dictionaries +^^^^^^^^^^^^^^^^^^^^ + +Python's C API provides interface for :class:`collections.OrderedDict` from C. +Since Python 3.7, dictionaries are ordered by default, so there is usually +little need for these functions; prefer ``PyDict*`` where possible. + + +.. c:var:: PyTypeObject PyODict_Type + + Type object for ordered dictionaries. This is the same object as + :class:`collections.OrderedDict` in the Python layer. + + +.. c:function:: int PyODict_Check(PyObject *od) + + Return true if *od* is an ordered dictionary object or an instance of a + subtype of the :class:`~collections.OrderedDict` type. This function + always succeeds. + + +.. c:function:: int PyODict_CheckExact(PyObject *od) + + Return true if *od* is an ordered dictionary object, but not an instance of + a subtype of the :class:`~collections.OrderedDict` type. + This function always succeeds. + + +.. c:var:: PyTypeObject PyODictKeys_Type + + Analogous to :c:type:`PyDictKeys_Type` for ordered dictionaries. + + +.. c:var:: PyTypeObject PyODictValues_Type + + Analogous to :c:type:`PyDictValues_Type` for ordered dictionaries. + + +.. c:var:: PyTypeObject PyODictItems_Type + + Analogous to :c:type:`PyDictItems_Type` for ordered dictionaries. + + +.. c:function:: PyObject *PyODict_New(void) + + Return a new empty ordered dictionary, or ``NULL`` on failure. + + This is analogous to :c:func:`PyDict_New`. + + +.. c:function:: int PyODict_SetItem(PyObject *od, PyObject *key, PyObject *value) + + Insert *value* into the ordered dictionary *od* with a key of *key*. + Return ``0`` on success or ``-1`` with an exception set on failure. + + This is analogous to :c:func:`PyDict_SetItem`. + + +.. c:function:: int PyODict_DelItem(PyObject *od, PyObject *key) + + Remove the entry in the ordered dictionary *od* with key *key*. + Return ``0`` on success or ``-1`` with an exception set on failure. + + This is analogous to :c:func:`PyDict_DelItem`. + + +These are :term:`soft deprecated` aliases to ``PyDict`` APIs: + + +.. list-table:: + :widths: auto + :header-rows: 1 + + * * ``PyODict`` + * ``PyDict`` + * * .. c:macro:: PyODict_GetItem(od, key) + * :c:func:`PyDict_GetItem` + * * .. c:macro:: PyODict_GetItemWithError(od, key) + * :c:func:`PyDict_GetItemWithError` + * * .. c:macro:: PyODict_GetItemString(od, key) + * :c:func:`PyDict_GetItemString` + * * .. c:macro:: PyODict_Contains(od, key) + * :c:func:`PyDict_Contains` + * * .. c:macro:: PyODict_Size(od) + * :c:func:`PyDict_Size` + * * .. c:macro:: PyODict_SIZE(od) + * :c:func:`PyDict_GET_SIZE` diff --git a/Doc/c-api/iterator.rst b/Doc/c-api/iterator.rst index 7eaf72ec55fd77..bfbfe3c9279980 100644 --- a/Doc/c-api/iterator.rst +++ b/Doc/c-api/iterator.rst @@ -108,6 +108,7 @@ Other Iterator Objects .. c:var:: PyTypeObject PyDictRevIterValue_Type .. c:var:: PyTypeObject PyDictIterItem_Type .. c:var:: PyTypeObject PyDictRevIterItem_Type +.. c:var:: PyTypeObject PyODictIter_Type Type objects for iterators of various built-in objects. From cf2524f2b7a41fbc1d0979e585c01166621c7ce0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 17 Nov 2025 23:57:47 +0100 Subject: [PATCH 1438/1674] [3.14] gh-141004: Document `Py_MEMCPY` (GH-141676) (GH-141685) gh-141004: Document `Py_MEMCPY` (GH-141676) (cherry picked from commit 16ea9505ce690485bab38691e5a83f467757fc03) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/intro.rst | 8 ++++++++ Misc/NEWS.d/3.14.0a1.rst | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 04c4d7284ad4fd..37c1649124ea9c 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -183,6 +183,14 @@ complete listing. .. versionadded:: 3.6 +.. c:macro:: Py_MEMCPY(dest, src, n) + + This is a :term:`soft deprecated` alias to :c:func:`!memcpy`. + Use :c:func:`!memcpy` directly instead. + + .. deprecated:: 3.14 + The macro is :term:`soft deprecated`. + .. c:macro:: Py_MIN(x, y) Return the minimum value between ``x`` and ``y``. diff --git a/Misc/NEWS.d/3.14.0a1.rst b/Misc/NEWS.d/3.14.0a1.rst index 305a0b65b98e6a..1938976fa4226a 100644 --- a/Misc/NEWS.d/3.14.0a1.rst +++ b/Misc/NEWS.d/3.14.0a1.rst @@ -6092,7 +6092,7 @@ Patch by Victor Stinner. .. nonce: qOr9GF .. section: C API -Soft deprecate the :c:macro:`!Py_MEMCPY` macro: use directly ``memcpy()`` +Soft deprecate the :c:macro:`Py_MEMCPY` macro: use directly ``memcpy()`` instead. Patch by Victor Stinner. .. From 3388413fc5a1331de64def824a660d1d0a941538 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:37:49 +0100 Subject: [PATCH 1439/1674] [3.14] Add missing backticks in os and decimal docs (GH-141699) (#141705) Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com> --- Doc/library/decimal.rst | 2 +- Doc/library/os.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 0b99a832405549..8d3223e89d96c7 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -264,7 +264,7 @@ allows the settings to be changed. This approach meets the needs of most applications. For more advanced work, it may be useful to create alternate contexts using the -Context() constructor. To make an alternate active, use the :func:`setcontext` +:meth:`Context` constructor. To make an alternate active, use the :func:`setcontext` function. In accordance with the standard, the :mod:`decimal` module provides two ready to diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4286e94ddb6c72..1e109264d3dd1d 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -561,7 +561,7 @@ process and user. .. function:: initgroups(username, gid, /) - Call the system initgroups() to initialize the group access list with all of + Call the system ``initgroups()`` to initialize the group access list with all of the groups of which the specified username is a member, plus the specified group id. From d89eb2f984032836e268d1b9af9c2400cddc474e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Tue, 18 Nov 2025 13:16:39 +0200 Subject: [PATCH 1440/1674] [3.14] gh-140873: Fix the singledispatchmethod documentation (GH-141523) It does not support non-descriptor callables yet. --- Doc/library/functools.rst | 2 +- Lib/functools.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 8028cfc34d7e26..01db54bbb86c4f 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -672,7 +672,7 @@ The :mod:`functools` module defines the following functions: dispatch>` :term:`generic function`. To define a generic method, decorate it with the ``@singledispatchmethod`` - decorator. When defining a function using ``@singledispatchmethod``, note + decorator. When defining a method using ``@singledispatchmethod``, note that the dispatch happens on the type of the first non-*self* or non-*cls* argument:: diff --git a/Lib/functools.py b/Lib/functools.py index 7f0eac3f650209..df4660eef3fe82 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -995,8 +995,7 @@ def wrapper(*args, **kw): class singledispatchmethod: """Single-dispatch generic method descriptor. - Supports wrapping existing descriptors and handles non-descriptor - callables as instance methods. + Supports wrapping existing descriptors. """ def __init__(self, func): From ed5c854c6a7ef91161b2265451a39d39bfdba1f8 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev <skirpichev@gmail.com> Date: Tue, 18 Nov 2025 16:32:44 +0300 Subject: [PATCH 1441/1674] [3.14] gh-141004: Document Py_HUGE_VAL/IS_FINITE/IS_INFINITE/IS_NAN (GH-141544) (#141698) (cherry picked from commit 630cd37bfae0fc4021d9e9461b94d36e7ce6b95c) Co-authored-by: Victor Stinner <vstinner@python.org> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/float.rst | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index bbd9ab3bb0d8aa..51540004c93db6 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -96,6 +96,14 @@ Floating-Point Objects the C11 standard ``<math.h>`` header. +.. c:macro:: Py_HUGE_VAL + + Equivalent to :c:macro:`!INFINITY`. + + .. deprecated:: 3.14 + The macro is :term:`soft deprecated`. + + .. c:macro:: Py_MATH_E The definition (accurate for a :c:expr:`double` type) of the :data:`math.e` constant. @@ -140,6 +148,34 @@ Floating-Point Objects return PyFloat_FromDouble(copysign(INFINITY, sign)); +.. c:macro:: Py_IS_FINITE(X) + + Return ``1`` if the given floating-point number *X* is finite, + that is, it is normal, subnormal or zero, but not infinite or NaN. + Return ``0`` otherwise. + + .. deprecated:: 3.14 + The macro is :term:`soft deprecated`. Use :c:macro:`!isfinite` instead. + + +.. c:macro:: Py_IS_INFINITY(X) + + Return ``1`` if the given floating-point number *X* is positive or negative + infinity. Return ``0`` otherwise. + + .. deprecated:: 3.14 + The macro is :term:`soft deprecated`. Use :c:macro:`!isinf` instead. + + +.. c:macro:: Py_IS_NAN(X) + + Return ``1`` if the given floating-point number *X* is a not-a-number (NaN) + value. Return ``0`` otherwise. + + .. deprecated:: 3.14 + The macro is :term:`soft deprecated`. Use :c:macro:`!isnan` instead. + + Pack and Unpack functions ------------------------- From 9543c2efc3af1e4eb087abc3e21be3f42ffef7ef Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 00:14:31 +0100 Subject: [PATCH 1442/1674] [3.14] gh-141691: Apply ruff rules to Apple folder. (GH-141694) (#141728) Add ruff configuration to run over the Apple build tooling and testbed script. (cherry picked from commit 17636ba48ce535fc1b1926c0bab26339da50631a) Co-authored-by: Russell Keith-Magee <russell@keith-magee.com> --- .pre-commit-config.yaml | 8 ++ Apple/.ruff.toml | 22 ++++++ Apple/__main__.py | 154 +++++++++++++++++++------------------- Apple/testbed/__main__.py | 33 ++++---- 4 files changed, 126 insertions(+), 91 deletions(-) create mode 100644 Apple/.ruff.toml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b0311f052798ad..c5767ee841eb0d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,6 +2,10 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.13.2 hooks: + - id: ruff-check + name: Run Ruff (lint) on Apple/ + args: [--exit-non-zero-on-fix, --config=Apple/.ruff.toml] + files: ^Apple/ - id: ruff-check name: Run Ruff (lint) on Doc/ args: [--exit-non-zero-on-fix] @@ -30,6 +34,10 @@ repos: name: Run Ruff (lint) on Tools/wasm/ args: [--exit-non-zero-on-fix, --config=Tools/wasm/.ruff.toml] files: ^Tools/wasm/ + - id: ruff-format + name: Run Ruff (format) on Apple/ + args: [--exit-non-zero-on-fix, --config=Apple/.ruff.toml] + files: ^Apple - id: ruff-format name: Run Ruff (format) on Doc/ args: [--check] diff --git a/Apple/.ruff.toml b/Apple/.ruff.toml new file mode 100644 index 00000000000000..4cdc39ebee4be9 --- /dev/null +++ b/Apple/.ruff.toml @@ -0,0 +1,22 @@ +extend = "../.ruff.toml" # Inherit the project-wide settings + +[format] +preview = true +docstring-code-format = true + +[lint] +select = [ + "C4", # flake8-comprehensions + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "ISC", # flake8-implicit-str-concat + "LOG", # flake8-logging + "PGH", # pygrep-hooks + "PT", # flake8-pytest-style + "PYI", # flake8-pyi + "RUF100", # Ban unused `# noqa` comments + "UP", # pyupgrade + "W", # pycodestyle + "YTT", # flake8-2020 +] diff --git a/Apple/__main__.py b/Apple/__main__.py index e76fc351798707..1c588c23d6b5d1 100644 --- a/Apple/__main__.py +++ b/Apple/__main__.py @@ -46,13 +46,12 @@ import sys import sysconfig import time -from collections.abc import Sequence +from collections.abc import Callable, Sequence from contextlib import contextmanager from datetime import datetime, timezone from os.path import basename, relpath from pathlib import Path from subprocess import CalledProcessError -from typing import Callable EnvironmentT = dict[str, str] ArgsT = Sequence[str | Path] @@ -140,17 +139,15 @@ def print_env(env: EnvironmentT) -> None: def apple_env(host: str) -> EnvironmentT: """Construct an Apple development environment for the given host.""" env = { - "PATH": ":".join( - [ - str(PYTHON_DIR / "Apple/iOS/Resources/bin"), - str(subdir(host) / "prefix"), - "/usr/bin", - "/bin", - "/usr/sbin", - "/sbin", - "/Library/Apple/usr/bin", - ] - ), + "PATH": ":".join([ + str(PYTHON_DIR / "Apple/iOS/Resources/bin"), + str(subdir(host) / "prefix"), + "/usr/bin", + "/bin", + "/usr/sbin", + "/sbin", + "/Library/Apple/usr/bin", + ]), } return env @@ -196,14 +193,10 @@ def clean(context: argparse.Namespace, target: str = "all") -> None: paths.append(target) if target in {"all", "hosts", "test"}: - paths.extend( - [ - path.name - for path in CROSS_BUILD_DIR.glob( - f"{context.platform}-testbed.*" - ) - ] - ) + paths.extend([ + path.name + for path in CROSS_BUILD_DIR.glob(f"{context.platform}-testbed.*") + ]) for path in paths: delete_path(path) @@ -352,18 +345,16 @@ def download(url: str, target_dir: Path) -> Path: out_path = target_path / basename(url) if not Path(out_path).is_file(): - run( - [ - "curl", - "-Lf", - "--retry", - "5", - "--retry-all-errors", - "-o", - out_path, - url, - ] - ) + run([ + "curl", + "-Lf", + "--retry", + "5", + "--retry-all-errors", + "-o", + out_path, + url, + ]) else: print(f"Using cached version of {basename(url)}") return out_path @@ -468,8 +459,7 @@ def package_version(prefix_path: Path) -> str: def lib_platform_files(dirname, names): - """A file filter that ignores platform-specific files in the lib directory. - """ + """A file filter that ignores platform-specific files in lib.""" path = Path(dirname) if ( path.parts[-3] == "lib" @@ -478,7 +468,7 @@ def lib_platform_files(dirname, names): ): return names elif path.parts[-2] == "lib" and path.parts[-1].startswith("python"): - ignored_names = set( + ignored_names = { name for name in names if ( @@ -486,7 +476,7 @@ def lib_platform_files(dirname, names): or name.startswith("_sysconfig_vars_") or name == "build-details.json" ) - ) + } else: ignored_names = set() @@ -499,7 +489,9 @@ def lib_non_platform_files(dirname, names): """ path = Path(dirname) if path.parts[-2] == "lib" and path.parts[-1].startswith("python"): - return set(names) - lib_platform_files(dirname, names) - {"lib-dynload"} + return ( + set(names) - lib_platform_files(dirname, names) - {"lib-dynload"} + ) else: return set() @@ -514,7 +506,8 @@ def create_xcframework(platform: str) -> str: package_path.mkdir() except FileExistsError: raise RuntimeError( - f"{platform} XCframework already exists; do you need to run with --clean?" + f"{platform} XCframework already exists; do you need to run " + "with --clean?" ) from None frameworks = [] @@ -607,7 +600,7 @@ def create_xcframework(platform: str) -> str: print(f" - {slice_name} binaries") shutil.copytree(first_path / "bin", slice_path / "bin") - # Copy the include path (this will be a symlink to the framework headers) + # Copy the include path (a symlink to the framework headers) print(f" - {slice_name} include files") shutil.copytree( first_path / "include", @@ -659,7 +652,8 @@ def create_xcframework(platform: str) -> str: # statically link those libraries into a Framework, you become # responsible for providing a privacy manifest for that framework. xcprivacy_file = { - "OpenSSL": subdir(host_triple) / "prefix/share/OpenSSL.xcprivacy" + "OpenSSL": subdir(host_triple) + / "prefix/share/OpenSSL.xcprivacy" } print(f" - {multiarch} xcprivacy files") for module, lib in [ @@ -669,7 +663,8 @@ def create_xcframework(platform: str) -> str: shutil.copy( xcprivacy_file[lib], slice_path - / f"lib-{arch}/python{version_tag}/lib-dynload/{module}.xcprivacy", + / f"lib-{arch}/python{version_tag}" + / f"lib-dynload/{module}.xcprivacy", ) print(" - build tools") @@ -692,18 +687,16 @@ def package(context: argparse.Namespace) -> None: # Clone testbed print() - run( - [ - sys.executable, - "Apple/testbed", - "clone", - "--platform", - context.platform, - "--framework", - CROSS_BUILD_DIR / context.platform / "Python.xcframework", - CROSS_BUILD_DIR / context.platform / "testbed", - ] - ) + run([ + sys.executable, + "Apple/testbed", + "clone", + "--platform", + context.platform, + "--framework", + CROSS_BUILD_DIR / context.platform / "Python.xcframework", + CROSS_BUILD_DIR / context.platform / "testbed", + ]) # Build the final archive archive_name = ( @@ -757,7 +750,7 @@ def build(context: argparse.Namespace, host: str | None = None) -> None: package(context) -def test(context: argparse.Namespace, host: str | None = None) -> None: +def test(context: argparse.Namespace, host: str | None = None) -> None: # noqa: PT028 """The implementation of the "test" command.""" if host is None: host = context.host @@ -795,18 +788,16 @@ def test(context: argparse.Namespace, host: str | None = None) -> None: / f"Frameworks/{apple_multiarch(host)}" ) - run( - [ - sys.executable, - "Apple/testbed", - "clone", - "--platform", - context.platform, - "--framework", - framework_path, - testbed_dir, - ] - ) + run([ + sys.executable, + "Apple/testbed", + "clone", + "--platform", + context.platform, + "--framework", + framework_path, + testbed_dir, + ]) run( [ @@ -840,7 +831,7 @@ def apple_sim_host(platform_name: str) -> str: """Determine the native simulator target for this platform.""" for _, slice_parts in HOSTS[platform_name].items(): for host_triple in slice_parts: - parts = host_triple.split('-') + parts = host_triple.split("-") if parts[0] == platform.machine() and parts[-1] == "simulator": return host_triple @@ -968,20 +959,29 @@ def parse_args() -> argparse.Namespace: cmd.add_argument( "--simulator", help=( - "The name of the simulator to use (eg: 'iPhone 16e'). Defaults to " - "the most recently released 'entry level' iPhone device. Device " - "architecture and OS version can also be specified; e.g., " - "`--simulator 'iPhone 16 Pro,arch=arm64,OS=26.0'` would run on " - "an ARM64 iPhone 16 Pro simulator running iOS 26.0." + "The name of the simulator to use (eg: 'iPhone 16e'). " + "Defaults to the most recently released 'entry level' " + "iPhone device. Device architecture and OS version can also " + "be specified; e.g., " + "`--simulator 'iPhone 16 Pro,arch=arm64,OS=26.0'` would " + "run on an ARM64 iPhone 16 Pro simulator running iOS 26.0." ), ) group = cmd.add_mutually_exclusive_group() group.add_argument( - "--fast-ci", action="store_const", dest="ci_mode", const="fast", - help="Add test arguments for GitHub Actions") + "--fast-ci", + action="store_const", + dest="ci_mode", + const="fast", + help="Add test arguments for GitHub Actions", + ) group.add_argument( - "--slow-ci", action="store_const", dest="ci_mode", const="slow", - help="Add test arguments for buildbots") + "--slow-ci", + action="store_const", + dest="ci_mode", + const="slow", + help="Add test arguments for buildbots", + ) for subcommand in [configure_build, configure_host, build, ci]: subcommand.add_argument( diff --git a/Apple/testbed/__main__.py b/Apple/testbed/__main__.py index 49974cb142853c..0dd77ab8b82797 100644 --- a/Apple/testbed/__main__.py +++ b/Apple/testbed/__main__.py @@ -32,15 +32,15 @@ def select_simulator_device(platform): json_data = json.loads(raw_json) if platform == "iOS": - # Any iOS device will do; we'll look for "SE" devices - but the name isn't - # consistent over time. Older Xcode versions will use "iPhone SE (Nth - # generation)"; As of 2025, they've started using "iPhone 16e". + # Any iOS device will do; we'll look for "SE" devices - but the name + # isn't consistent over time. Older Xcode versions will use "iPhone SE + # (Nth generation)"; As of 2025, they've started using "iPhone 16e". # - # When Xcode is updated after a new release, new devices will be available - # and old ones will be dropped from the set available on the latest iOS - # version. Select the one with the highest minimum runtime version - this - # is an indicator of the "newest" released device, which should always be - # supported on the "most recent" iOS version. + # When Xcode is updated after a new release, new devices will be + # available and old ones will be dropped from the set available on the + # latest iOS version. Select the one with the highest minimum runtime + # version - this is an indicator of the "newest" released device, which + # should always be supported on the "most recent" iOS version. se_simulators = sorted( (devicetype["minRuntimeVersion"], devicetype["name"]) for devicetype in json_data["devicetypes"] @@ -295,7 +295,8 @@ def main(): parser = argparse.ArgumentParser( description=( - "Manages the process of testing an Apple Python project through Xcode." + "Manages the process of testing an Apple Python project " + "through Xcode." ), ) @@ -336,7 +337,10 @@ def main(): run = subcommands.add_parser( "run", - usage="%(prog)s [-h] [--simulator SIMULATOR] -- <test arg> [<test arg> ...]", + usage=( + "%(prog)s [-h] [--simulator SIMULATOR] -- " + "<test arg> [<test arg> ...]" + ), description=( "Run a testbed project. The arguments provided after `--` will be " "passed to the running iOS process as if they were arguments to " @@ -397,9 +401,9 @@ def main(): / "bin" ).is_dir(): print( - f"Testbed does not contain a compiled Python framework. Use " - f"`python {sys.argv[0]} clone ...` to create a runnable " - f"clone of this testbed." + "Testbed does not contain a compiled Python framework. " + f"Use `python {sys.argv[0]} clone ...` to create a " + "runnable clone of this testbed." ) sys.exit(20) @@ -411,7 +415,8 @@ def main(): ) else: print( - f"Must specify test arguments (e.g., {sys.argv[0]} run -- test)" + "Must specify test arguments " + f"(e.g., {sys.argv[0]} run -- test)" ) print() parser.print_help(sys.stderr) From daff2a9c3cd6ee9bf64f530055f8acd31e02eec3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 03:25:34 +0100 Subject: [PATCH 1443/1674] [3.14] gh-141692: Add a slice-specific lib folder to iOS XCframeworks. (GH-141693) (#141733) Modifies the iOS XCframework to include a lib folder for each slice that contains a symlinked version of the libPython dynamic library. (cherry picked from commit 7b0b70867586ef7109de60ccce94d13164dbb776) Co-authored-by: Russell Keith-Magee <russell@keith-magee.com> --- Apple/__main__.py | 14 ++++++++++++++ Apple/testbed/Python.xcframework/build/utils.sh | 3 ++- Makefile.pre.in | 3 +++ .../2025-11-18-13-55-47.gh-issue-141692.tud9if.rst | 3 +++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst diff --git a/Apple/__main__.py b/Apple/__main__.py index 1c588c23d6b5d1..256966e76c2c97 100644 --- a/Apple/__main__.py +++ b/Apple/__main__.py @@ -477,6 +477,12 @@ def lib_platform_files(dirname, names): or name == "build-details.json" ) } + elif path.parts[-1] == "lib": + ignored_names = { + name + for name in names + if name.startswith("libpython") and name.endswith(".dylib") + } else: ignored_names = set() @@ -614,6 +620,12 @@ def create_xcframework(platform: str) -> str: slice_framework / "Headers/pyconfig.h", ) + print(f" - {slice_name} shared library") + # Create a simlink for the fat library + shared_lib = slice_path / f"lib/libpython{version_tag}.dylib" + shared_lib.parent.mkdir() + shared_lib.symlink_to("../Python.framework/Python") + print(f" - {slice_name} architecture-specific files") for host_triple, multiarch in slice_parts.items(): print(f" - {multiarch} standard library") @@ -625,6 +637,7 @@ def create_xcframework(platform: str) -> str: framework_path(host_triple, multiarch) / "lib", package_path / "Python.xcframework/lib", ignore=lib_platform_files, + symlinks=True, ) has_common_stdlib = True @@ -632,6 +645,7 @@ def create_xcframework(platform: str) -> str: framework_path(host_triple, multiarch) / "lib", slice_path / f"lib-{arch}", ignore=lib_non_platform_files, + symlinks=True, ) # Copy the host's pyconfig.h to an architecture-specific name. diff --git a/Apple/testbed/Python.xcframework/build/utils.sh b/Apple/testbed/Python.xcframework/build/utils.sh index 961c46d014b5f5..e7155d8b30e213 100755 --- a/Apple/testbed/Python.xcframework/build/utils.sh +++ b/Apple/testbed/Python.xcframework/build/utils.sh @@ -46,7 +46,8 @@ install_stdlib() { rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" rsync -au "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib-$ARCHS/" "$CODESIGNING_FOLDER_PATH/python/lib/" else - rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" + # A single-arch framework will have a libpython symlink; that can't be included at runtime + rsync -au --delete "$PROJECT_DIR/$PYTHON_XCFRAMEWORK_PATH/$SLICE_FOLDER/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" --exclude 'libpython*.dylib' fi } diff --git a/Makefile.pre.in b/Makefile.pre.in index 711628a4c22242..f29de054aba6ee 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -3033,6 +3033,9 @@ frameworkinstallunversionedstructure: $(LDLIBRARY) $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR) sed 's/%VERSION%/'"`$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Info.plist $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY) + $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBDIR) + $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(LDVERSION).dylib" + $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(VERSION).dylib" $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(BINDIR) for file in $(srcdir)/$(RESSRCDIR)/bin/* ; do \ $(INSTALL) -m $(EXEMODE) $$file $(DESTDIR)$(BINDIR); \ diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst b/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst new file mode 100644 index 00000000000000..d85c54db3646f6 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst @@ -0,0 +1,3 @@ +Each slice of an iOS XCframework now contains a ``lib`` folder that contains +a symlink to the libpython dylib. This allows binary modules to be compiled +for iOS using dynamic libreary linking, rather than Framework linking. From 7cb15f93fe53931aae9fc0e61e07354fd66cab9c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 09:05:01 +0100 Subject: [PATCH 1444/1674] [3.14] gh-141659: Fix bad file descriptor error in subprocess on AIX (GH-141660) (GH-141738) /proc/self does not exist on AIX. (cherry picked from commit 92c5de73b8d7526326c865b1a669b868f0d40c1e) Co-authored-by: Ayappan Perumal <ayappap2@in.ibm.com> --- .../2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst | 1 + Modules/_posixsubprocess.c | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst new file mode 100644 index 00000000000000..eeb055c6012a12 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst @@ -0,0 +1 @@ +Fix bad file descriptor errors from ``_posixsubprocess`` on AIX. diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 6ce3494e778df3..e0a95318afe988 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -514,7 +514,13 @@ _close_open_fds_maybe_unsafe(int start_fd, int *fds_to_keep, proc_fd_dir = NULL; else #endif +#if defined(_AIX) + char fd_path[PATH_MAX]; + snprintf(fd_path, sizeof(fd_path), "/proc/%ld/fd", (long)getpid()); + proc_fd_dir = opendir(fd_path); +#else proc_fd_dir = opendir(FD_DIR); +#endif if (!proc_fd_dir) { /* No way to get a list of open fds. */ _close_range_except(start_fd, -1, fds_to_keep, fds_to_keep_len, From ff8829892aa2a4a738bc0129294c9ec735daea05 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 10:30:11 +0100 Subject: [PATCH 1445/1674] [3.14] gh-138189: Link references to type slots (GH-141410) (GH-141718) (cherry picked from commit 4695ec109d07c9bfd9eb7d91d6285c974a4331a7) Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/c-api/structures.rst | 8 +++----- Doc/c-api/type.rst | 16 ++++++++-------- Doc/c-api/typeobj.rst | 2 +- Doc/howto/isolating-extensions.rst | 2 +- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 414dfdc84e61c9..b4e7cb1d77e1a3 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -698,14 +698,12 @@ The following flags can be used with :c:member:`PyMemberDef.flags`: entry indicates an offset from the subclass-specific data, rather than from ``PyObject``. - Can only be used as part of :c:member:`Py_tp_members <PyTypeObject.tp_members>` + Can only be used as part of the :c:data:`Py_tp_members` :c:type:`slot <PyType_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:`PyType_Slot`. - When setting :c:member:`~PyTypeObject.tp_members` during - class creation, Python clears it and sets + When setting :c:member:`~PyTypeObject.tp_members` from the slot during + class creation, Python clears the flag and sets :c:member:`PyMemberDef.offset` to the offset from the ``PyObject`` struct. .. index:: diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index b608f815160f76..c7946e3190f01b 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -383,8 +383,8 @@ The following functions and structs are used to create The *bases* argument can be used to specify base classes; it can either be only one class or a tuple of classes. - If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead. - If that also is ``NULL``, the *Py_tp_base* slot is used instead. + If *bases* is ``NULL``, the :c:data:`Py_tp_bases` slot is used instead. + If that also is ``NULL``, the :c:data:`Py_tp_base` slot is used instead. If that also is ``NULL``, the new type derives from :class:`object`. The *module* argument can be used to record the module in which the new @@ -590,9 +590,9 @@ The following functions and structs are used to create :c:type:`PyAsyncMethods` with an added ``Py_`` prefix. For example, use: - * ``Py_tp_dealloc`` to set :c:member:`PyTypeObject.tp_dealloc` - * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add` - * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length` + * :c:data:`Py_tp_dealloc` to set :c:member:`PyTypeObject.tp_dealloc` + * :c:data:`Py_nb_add` to set :c:member:`PyNumberMethods.nb_add` + * :c:data:`Py_sq_length` to set :c:member:`PySequenceMethods.sq_length` An additional slot is supported that does not correspond to a :c:type:`!PyTypeObject` struct field: @@ -611,7 +611,7 @@ The following functions and structs are used to create 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 <PyTypeObject.tp_members>`. + offset in :c:data:`Py_tp_members`. See :ref:`PyMemberDef documentation <pymemberdef-offsets>` for details. @@ -639,7 +639,7 @@ The following functions and structs are used to create .. versionchanged:: 3.14 The field :c:member:`~PyTypeObject.tp_vectorcall` can now set - using ``Py_tp_vectorcall``. See the field's documentation + using :c:data:`Py_tp_vectorcall`. See the field's documentation for details. .. c:member:: void *pfunc @@ -649,7 +649,7 @@ The following functions and structs are used to create *pfunc* values may not be ``NULL``, except for the following slots: - * ``Py_tp_doc`` + * :c:data:`Py_tp_doc` * :c:data:`Py_tp_token` (for clarity, prefer :c:data:`Py_TP_USE_SPEC` rather than ``NULL``) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index a50b61e0468902..b2e8626cb6e811 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -2258,7 +2258,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) This field should be set to ``NULL`` and treated as read-only. Python will fill it in when the type is :c:func:`initialized <PyType_Ready>`. - For dynamically created classes, the ``Py_tp_bases`` + For dynamically created classes, the :c:data:`Py_tp_bases` :c:type:`slot <PyType_Slot>` can be used instead of the *bases* argument of :c:func:`PyType_FromSpecWithBases`. The argument form is preferred. diff --git a/Doc/howto/isolating-extensions.rst b/Doc/howto/isolating-extensions.rst index 7da6dc8a39795e..6092c75f48fdef 100644 --- a/Doc/howto/isolating-extensions.rst +++ b/Doc/howto/isolating-extensions.rst @@ -353,7 +353,7 @@ garbage collection protocol. That is, heap types should: - Have the :c:macro:`Py_TPFLAGS_HAVE_GC` flag. -- Define a traverse function using ``Py_tp_traverse``, which +- Define a traverse function using :c:data:`Py_tp_traverse`, which visits the type (e.g. using ``Py_VISIT(Py_TYPE(self))``). Please refer to the documentation of From 36ad4be1d96281e3642ad9f89d2128cc4da0ff5b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 12:07:01 +0100 Subject: [PATCH 1446/1674] [3.14] Correct class name from PullDom to PullDOM (GH-141207) (#141743) Co-authored-by: Guo Ci <zguoci@gmail.com> --- Doc/library/xml.dom.pulldom.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/xml.dom.pulldom.rst b/Doc/library/xml.dom.pulldom.rst index 8bceeecd46393e..a21cfaa4645419 100644 --- a/Doc/library/xml.dom.pulldom.rst +++ b/Doc/library/xml.dom.pulldom.rst @@ -74,7 +74,7 @@ given point) or to make use of the :func:`DOMEventStream.expandNode` method and switch to DOM-related processing. -.. class:: PullDom(documentFactory=None) +.. class:: PullDOM(documentFactory=None) Subclass of :class:`xml.sax.handler.ContentHandler`. From 562e23f9d53077a10c363edff79a4232b052dcae Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:43:24 +0100 Subject: [PATCH 1447/1674] [3.14] gh-140875: Fix handling of unclosed charrefs before EOF in HTMLParser (GH-140904) (GH-141745) (cherry picked from commit 95296a9d40aa2d58502a09e86e2a93c03df23366) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/html/parser.py | 29 +++-- Lib/test/test_htmlparser.py | 110 ++++++++++++++---- ...-11-02-10-44-23.gh-issue-140875.wt6B37.rst | 3 + 3 files changed, 109 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst diff --git a/Lib/html/parser.py b/Lib/html/parser.py index e50620de800d63..80fb8c3f929f6b 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -24,6 +24,7 @@ entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]') +incomplete_charref = re.compile('&#(?:[0-9]|[xX][0-9a-fA-F])') attr_charref = re.compile(r'&(#[0-9]+|#[xX][0-9a-fA-F]+|[a-zA-Z][a-zA-Z0-9]*)[;=]?') starttagopen = re.compile('<[a-zA-Z]') @@ -304,10 +305,20 @@ def goahead(self, end): k = k - 1 i = self.updatepos(i, k) continue + match = incomplete_charref.match(rawdata, i) + if match: + if end: + self.handle_charref(rawdata[i+2:]) + i = self.updatepos(i, n) + break + # incomplete + break + elif i + 3 < n: # larger than "&#x" + # not the end of the buffer, and can't be confused + # with some other construct + self.handle_data("&#") + i = self.updatepos(i, i + 2) else: - if ";" in rawdata[i:]: # bail by consuming &# - self.handle_data(rawdata[i:i+2]) - i = self.updatepos(i, i+2) break elif startswith('&', i): match = entityref.match(rawdata, i) @@ -321,15 +332,13 @@ def goahead(self, end): continue match = incomplete.match(rawdata, i) if match: - # match.group() will contain at least 2 chars - if end and match.group() == rawdata[i:]: - k = match.end() - if k <= i: - k = n - i = self.updatepos(i, i + 1) + if end: + self.handle_entityref(rawdata[i+1:]) + i = self.updatepos(i, n) + break # incomplete break - elif (i + 1) < n: + elif i + 1 < n: # not the end of the buffer, and can't be confused # with some other construct self.handle_data("&") diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 19dde9362a43b6..e4eff1ea17a670 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -109,12 +109,13 @@ def get_events(self): class TestCaseBase(unittest.TestCase): - def get_collector(self): - return EventCollector(convert_charrefs=False) + def get_collector(self, convert_charrefs=False): + return EventCollector(convert_charrefs=convert_charrefs) - def _run_check(self, source, expected_events, collector=None): + def _run_check(self, source, expected_events, + *, collector=None, convert_charrefs=False): if collector is None: - collector = self.get_collector() + collector = self.get_collector(convert_charrefs=convert_charrefs) parser = collector for s in source: parser.feed(s) @@ -128,7 +129,7 @@ def _run_check(self, source, expected_events, collector=None): def _run_check_extra(self, source, events): self._run_check(source, events, - EventCollectorExtra(convert_charrefs=False)) + collector=EventCollectorExtra(convert_charrefs=False)) class HTMLParserTestCase(TestCaseBase): @@ -187,10 +188,87 @@ def test_malformatted_charref(self): ]) def test_unclosed_entityref(self): - self._run_check("&entityref foo", [ - ("entityref", "entityref"), - ("data", " foo"), - ]) + self._run_check('&gt &lt;', [('entityref', 'gt'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&gt &lt;', [('data', '> <')], convert_charrefs=True) + + self._run_check('&undefined &lt;', + [('entityref', 'undefined'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&undefined &lt;', [('data', '&undefined <')], + convert_charrefs=True) + + self._run_check('&gtundefined &lt;', + [('entityref', 'gtundefined'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&gtundefined &lt;', [('data', '>undefined <')], + convert_charrefs=True) + + self._run_check('& &lt;', [('data', '& '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('& &lt;', [('data', '& <')], convert_charrefs=True) + + def test_eof_in_entityref(self): + self._run_check('&gt', [('entityref', 'gt')], convert_charrefs=False) + self._run_check('&gt', [('data', '>')], convert_charrefs=True) + + self._run_check('&g', [('entityref', 'g')], convert_charrefs=False) + self._run_check('&g', [('data', '&g')], convert_charrefs=True) + + self._run_check('&undefined', [('entityref', 'undefined')], + convert_charrefs=False) + self._run_check('&undefined', [('data', '&undefined')], + convert_charrefs=True) + + self._run_check('&gtundefined', [('entityref', 'gtundefined')], + convert_charrefs=False) + self._run_check('&gtundefined', [('data', '>undefined')], + convert_charrefs=True) + + self._run_check('&', [('data', '&')], convert_charrefs=False) + self._run_check('&', [('data', '&')], convert_charrefs=True) + + def test_unclosed_charref(self): + self._run_check('&#123 &lt;', [('charref', '123'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&#123 &lt;', [('data', '{ <')], convert_charrefs=True) + self._run_check('&#xab &lt;', [('charref', 'xab'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&#xab &lt;', [('data', '\xab <')], convert_charrefs=True) + + self._run_check('&#123456789 &lt;', + [('charref', '123456789'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&#123456789 &lt;', [('data', '\ufffd <')], + convert_charrefs=True) + self._run_check('&#x123456789 &lt;', + [('charref', 'x123456789'), ('data', ' '), ('entityref', 'lt')], + convert_charrefs=False) + self._run_check('&#x123456789 &lt;', [('data', '\ufffd <')], + convert_charrefs=True) + + self._run_check('&# &lt;', [('data', '&# '), ('entityref', 'lt')], convert_charrefs=False) + self._run_check('&# &lt;', [('data', '&# <')], convert_charrefs=True) + self._run_check('&#x &lt;', [('data', '&#x '), ('entityref', 'lt')], convert_charrefs=False) + self._run_check('&#x &lt;', [('data', '&#x <')], convert_charrefs=True) + + def test_eof_in_charref(self): + self._run_check('&#123', [('charref', '123')], convert_charrefs=False) + self._run_check('&#123', [('data', '{')], convert_charrefs=True) + self._run_check('&#xab', [('charref', 'xab')], convert_charrefs=False) + self._run_check('&#xab', [('data', '\xab')], convert_charrefs=True) + + self._run_check('&#123456789', [('charref', '123456789')], + convert_charrefs=False) + self._run_check('&#123456789', [('data', '\ufffd')], convert_charrefs=True) + self._run_check('&#x123456789', [('charref', 'x123456789')], + convert_charrefs=False) + self._run_check('&#x123456789', [('data', '\ufffd')], convert_charrefs=True) + + self._run_check('&#', [('data', '&#')], convert_charrefs=False) + self._run_check('&#', [('data', '&#')], convert_charrefs=True) + self._run_check('&#x', [('data', '&#x')], convert_charrefs=False) + self._run_check('&#x', [('data', '&#x')], convert_charrefs=True) def test_bad_nesting(self): # Strangely, this *is* supposed to test that overlapping @@ -762,20 +840,6 @@ def test_correct_detection_of_start_tags(self): ] self._run_check(html, expected) - def test_EOF_in_charref(self): - # see #17802 - # This test checks that the UnboundLocalError reported in the issue - # is not raised, however I'm not sure the returned values are correct. - # Maybe HTMLParser should use self.unescape for these - data = [ - ('a&', [('data', 'a&')]), - ('a&b', [('data', 'ab')]), - ('a&b ', [('data', 'a'), ('entityref', 'b'), ('data', ' ')]), - ('a&b;', [('data', 'a'), ('entityref', 'b')]), - ] - for html, expected in data: - self._run_check(html, expected) - def test_eof_in_comments(self): data = [ ('<!--', [('comment', '')]), diff --git a/Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst b/Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst new file mode 100644 index 00000000000000..c08a8966d53401 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst @@ -0,0 +1,3 @@ +Fix handling of unclosed character references (named and numerical) +followed by the end of file in :class:`html.parser.HTMLParser` with +``convert_charrefs=False``. From 8c796889ff85611cc1cfcc93a2793b92579f2662 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 15:29:15 +0100 Subject: [PATCH 1448/1674] [3.14] gh-141570: can_colorize: Expect fileno() to raise OSError, as documented (GH-141716) (#141747) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141570: can_colorize: Expect fileno() to raise OSError, as documented (GH-141716) In Fedora, we've been given a slightly incomplete reproducer for a problematic Python 3.14 color-related change in argparse that leads to an exception when Python is used from mod_wsgi: https://bugzilla.redhat.com/2414940 mod_wsgi replaces sys.stdout with a custom object that raises OSError on .fileno(): https://github.com/GrahamDumpleton/mod_wsgi/blob/8460dbfcd5c7108892b3cde9fab7cbc1caa27886/src/server/wsgi_logger.c#L434-L440 This should be supported, as the documentation of fileno explicitly says: > An OSError is raised if the IO object does not use a file descriptor. https://docs.python.org/3.14/library/io.html#io.IOBase.fileno The previously expected exception inherits from OSError, so it is still expected. Fixes https://github.com/python/cpython/issues/141570 (cherry picked from commit 96f496a949b05054d0d043c3085f00cec2f83bf5) Co-authored-by: Miro Hrončok <miro@hroncok.cz> Co-authored-by: Cody Maloney <cmaloney@users.noreply.github.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Lib/_colorize.py | 3 +-- Lib/test/test__colorize.py | 11 +++++++++++ .../2025-11-18-14-39-31.gh-issue-141570.q3n984.rst | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst diff --git a/Lib/_colorize.py b/Lib/_colorize.py index 766b2d8b80b1a4..d6673f6692f761 100644 --- a/Lib/_colorize.py +++ b/Lib/_colorize.py @@ -1,4 +1,3 @@ -import io import os import sys @@ -312,7 +311,7 @@ def _safe_getenv(k: str, fallback: str | None = None) -> str | None: try: return os.isatty(file.fileno()) - except io.UnsupportedOperation: + except OSError: return hasattr(file, "isatty") and file.isatty() diff --git a/Lib/test/test__colorize.py b/Lib/test/test__colorize.py index 3ac89987f91e44..026277267e04ce 100644 --- a/Lib/test/test__colorize.py +++ b/Lib/test/test__colorize.py @@ -165,6 +165,17 @@ def test_colorized_detection_checks_for_file(self): file.isatty.return_value = False self.assertEqual(_colorize.can_colorize(file=file), False) + # The documentation for file.fileno says: + # > An OSError is raised if the IO object does not use a file descriptor. + # gh-141570: Check OSError is caught and handled + with unittest.mock.patch("os.isatty", side_effect=ZeroDivisionError): + file = unittest.mock.MagicMock() + file.fileno.side_effect = OSError + file.isatty.return_value = True + self.assertEqual(_colorize.can_colorize(file=file), True) + file.isatty.return_value = False + self.assertEqual(_colorize.can_colorize(file=file), False) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst b/Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst new file mode 100644 index 00000000000000..8f4641ce4cf8c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst @@ -0,0 +1,2 @@ +Support :term:`file-like object` raising :exc:`OSError` from :meth:`~io.IOBase.fileno` in color +detection (``_colorize.can_colorize()``). This can occur when ``sys.stdout`` is redirected. From b7c25eabd6d93e745c7216b42d026e6a36795724 Mon Sep 17 00:00:00 2001 From: Sam Gross <colesbury@gmail.com> Date: Wed, 19 Nov 2025 10:00:51 -0500 Subject: [PATCH 1449/1674] [3.14] gh-139103: fix free-threading `dataclass.__init__` perf issue (gh-141596) (gh-141750) The dataclasses `__init__` function is generated dynamically by a call to `exec()` and so doesn't have deferred reference counting enabled. Enable deferred reference counting on functions when assigned as an attribute to type objects to avoid reference count contention when creating dataclass instances. (cherry picked from commit ce791541769a41beabec0f515cd62e504d46ff1c) Co-authored-by: Edward Xu <xuxiangad@gmail.com> --- .../2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst | 1 + Objects/typeobject.c | 12 ++++++++++++ Tools/ftscalingbench/ftscalingbench.py | 12 ++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst new file mode 100644 index 00000000000000..c038dc742ccec9 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst @@ -0,0 +1 @@ +Improve multithreaded scaling of dataclasses on the free-threaded build. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 0c6c597dd8b8bf..05d12bf6bbaf5c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6181,6 +6181,18 @@ type_setattro(PyObject *self, PyObject *name, PyObject *value) assert(!_PyType_HasFeature(metatype, Py_TPFLAGS_INLINE_VALUES)); assert(!_PyType_HasFeature(metatype, Py_TPFLAGS_MANAGED_DICT)); +#ifdef Py_GIL_DISABLED + // gh-139103: Enable deferred refcounting for functions assigned + // to type objects. This is important for `dataclass.__init__`, + // which is generated dynamically. + if (value != NULL && + PyFunction_Check(value) && + !_PyObject_HasDeferredRefcount(value)) + { + PyUnstable_Object_EnableDeferredRefcount(value); + } +#endif + PyObject *old_value = NULL; PyObject *descr = _PyType_LookupRef(metatype, name); if (descr != NULL) { diff --git a/Tools/ftscalingbench/ftscalingbench.py b/Tools/ftscalingbench/ftscalingbench.py index 926bc66b944c6f..b815376b7ed56f 100644 --- a/Tools/ftscalingbench/ftscalingbench.py +++ b/Tools/ftscalingbench/ftscalingbench.py @@ -27,6 +27,7 @@ import sys import threading import time +from dataclasses import dataclass # The iterations in individual benchmarks are scaled by this factor. WORK_SCALE = 100 @@ -189,6 +190,17 @@ def thread_local_read(): _ = tmp.x +@dataclass +class MyDataClass: + x: int + y: int + z: int + +@register_benchmark +def instantiate_dataclass(): + for _ in range(1000 * WORK_SCALE): + obj = MyDataClass(x=1, y=2, z=3) + def bench_one_thread(func): t0 = time.perf_counter_ns() func() From d05be327588aeb39c69eac1585af78055981ca52 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 19:38:09 +0100 Subject: [PATCH 1450/1674] [3.14] gh-141004: Document `Py_LOCAL` and `Py_LOCAL_INLINE` (GH-141725) (GH-141761) gh-141004: Document `Py_LOCAL` and `Py_LOCAL_INLINE` (GH-141725) (cherry picked from commit 3149d64c93f02217eb01c0fd82c26a685b5281c1) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/c-api/intro.rst | 11 +++++++++++ Doc/whatsnew/2.5.rst | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 37c1649124ea9c..58409590c93b0a 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -171,6 +171,17 @@ complete listing. Like ``getenv(s)``, but returns ``NULL`` if :option:`-E` was passed on the command line (see :c:member:`PyConfig.use_environment`). +.. c:macro:: Py_LOCAL(type) + + Declare a function returning the specified *type* using a fast-calling + qualifier for functions that are local to the current file. + Semantically, this is equivalent to ``static type``. + +.. c:macro:: Py_LOCAL_INLINE(type) + + Equivalent to :c:macro:`Py_LOCAL` but additionally requests the function + be inlined. + .. c:macro:: Py_MAX(x, y) Return the maximum value between ``x`` and ``y``. diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 3430ac8668e280..e195d9d462dda9 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -2169,9 +2169,9 @@ Changes to Python's build process and to the C API include: * Two new macros can be used to indicate C functions that are local to the current file so that a faster calling convention can be used. - ``Py_LOCAL(type)`` declares the function as returning a value of the + :c:macro:`Py_LOCAL` declares the function as returning a value of the specified *type* and uses a fast-calling qualifier. - ``Py_LOCAL_INLINE(type)`` does the same thing and also requests the + :c:macro:`Py_LOCAL_INLINE` does the same thing and also requests the function be inlined. If macro :c:macro:`!PY_LOCAL_AGGRESSIVE` is defined before :file:`python.h` is included, a set of more aggressive optimizations are enabled for the module; you should benchmark the results to find out if these From 8eed63e97329407a77174f2fa2ed415136191654 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 21:17:51 +0100 Subject: [PATCH 1451/1674] [3.14] Move the NEWS entry for gh-141659 to the correct section (GH-141744) (GH-141766) (cherry picked from commit fbc31d14ffaae1f252865db52fc7f5f6311e7b1a) Co-authored-by: Ayappan Perumal <ayappap2@in.ibm.com> --- .../2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Misc/NEWS.d/next/{Core_and_Builtins => Library}/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst (100%) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst b/Misc/NEWS.d/next/Library/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst similarity index 100% rename from Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst rename to Misc/NEWS.d/next/Library/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst From f6552d2c58163fe89c38fea93099936b6d997e12 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 19 Nov 2025 21:36:24 +0100 Subject: [PATCH 1452/1674] [3.14] Remove GvR from '_stdauthor' in Doc/conf.py (GH-141765) (#141767) Co-authored-by: Guido van Rossum <guido@python.org> Co-authored-by: Guido van Rossum <gvanrossum@microsoft.com> --- Doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/conf.py b/Doc/conf.py index 0f1412d1007dc2..a4275835059efa 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -361,7 +361,7 @@ # 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' +_stdauthor = 'The Python development team' latex_documents = [ ('c-api/index', 'c-api.tex', 'The Python/C API', _stdauthor, 'manual'), ( From c05e71f61ec17a730513dc28f37814b97ad5e053 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:00:42 +0100 Subject: [PATCH 1453/1674] [3.14] gh-132657: avoid locks and refcounting in `frozenset` lookups (GH-136107) (gh-141772) gh-132657: avoid locks and refcounting in `frozenset` lookups (GH-136107) (cherry picked from commit f58a7c717584241467970623384ce61cbd776f29) Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com> --- ...-07-09-21-27-14.gh-issue-132657.kSA8R3.rst | 1 + Objects/setobject.c | 35 +++++++++++++------ 2 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst new file mode 100644 index 00000000000000..99f7a990875a0a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst @@ -0,0 +1 @@ +Improve performance of :class:`frozenset` by removing locks in the free-threading build. diff --git a/Objects/setobject.c b/Objects/setobject.c index 83004e57b66c20..9332c24ac8673b 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -86,6 +86,8 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash) int probes; int cmp; + int frozenset = PyFrozenSet_CheckExact(so); + while (1) { entry = &so->table[i]; probes = (i + LINEAR_PROBES <= mask) ? LINEAR_PROBES: 0; @@ -102,13 +104,20 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash) && unicode_eq(startkey, key)) return entry; table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) - return NULL; - if (table != so->table || entry->key != startkey) - return set_lookkey(so, key, hash); + if (frozenset) { + cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + if (cmp < 0) + return NULL; + } else { + // incref startkey because it can be removed from the set by the compare + Py_INCREF(startkey); + cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); + if (cmp < 0) + return NULL; + if (table != so->table || entry->key != startkey) + return set_lookkey(so, key, hash); + } if (cmp > 0) return entry; mask = so->mask; @@ -2234,10 +2243,16 @@ set_contains_lock_held(PySetObject *so, PyObject *key) int _PySet_Contains(PySetObject *so, PyObject *key) { + assert(so); + int rv; - Py_BEGIN_CRITICAL_SECTION(so); - rv = set_contains_lock_held(so, key); - Py_END_CRITICAL_SECTION(); + if (PyFrozenSet_CheckExact(so)) { + rv = set_contains_lock_held(so, key); + } else { + Py_BEGIN_CRITICAL_SECTION(so); + rv = set_contains_lock_held(so, key); + Py_END_CRITICAL_SECTION(); + } return rv; } From 072eeaf84cdc4cae4a7e6a72c408b3281fba2b26 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:01:49 +0100 Subject: [PATCH 1454/1674] [3.14] gh-132657: optimize `PySet_Contains` for `frozenset` (GH-141183) (gh-141773) (cherry picked from commit 7211a34fe1d9704935342af8c9b46725629f2d97) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- Objects/setobject.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index 9332c24ac8673b..ff4844b24371e8 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2746,7 +2746,9 @@ PySet_Contains(PyObject *anyset, PyObject *key) PyErr_BadInternalCall(); return -1; } - + if (PyFrozenSet_CheckExact(anyset)) { + return set_contains_key((PySetObject *)anyset, key); + } int rv; Py_BEGIN_CRITICAL_SECTION(anyset); rv = set_contains_key((PySetObject *)anyset, key); From 83cfd87568b99539cb6ce30220177101f890d6b3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 05:33:18 +0100 Subject: [PATCH 1455/1674] [3.14] gh-141489: Simplify closure/freevar iteration in `annotationlib._build_closure()` (GH-141490) (#141776) gh-141489: Simplify closure/freevar iteration in `annotationlib._build_closure()` (GH-141490) (cherry picked from commit a35c683da55e77c96828fd0421640787337cfc64) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Lib/annotationlib.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index 33907b1fc2a53a..a5788cdbfae3f5 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -844,14 +844,9 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False): def _build_closure(annotate, owner, is_class, stringifier_dict, *, allow_evaluation): if not annotate.__closure__: return None, None - freevars = annotate.__code__.co_freevars new_closure = [] cell_dict = {} - for i, cell in enumerate(annotate.__closure__): - if i < len(freevars): - name = freevars[i] - else: - name = "__cell__" + for name, cell in zip(annotate.__code__.co_freevars, annotate.__closure__, strict=True): cell_dict[name] = cell new_cell = None if allow_evaluation: From daf98fe5bd85e05c4cffd0a7d2047d8938ea8846 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 10:22:52 +0100 Subject: [PATCH 1456/1674] [3.14] gh-141757: Comply with pickle protocol in test_reduce_5tuple (GH-141759) (GH-141782) The 5th element of the __reduce__ tuple should be an iterator. (cherry picked from commit 41b9ad5b38e913194a5cc88f0e7cfc096787b664) Co-authored-by: Arseny Boykov <36469655+Bobronium@users.noreply.github.com> --- Lib/test/test_copy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 467ec09d99e462..cfef24727e8c82 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -672,7 +672,7 @@ def __eq__(self, other): def test_reduce_5tuple(self): class C(dict): def __reduce__(self): - return (C, (), self.__dict__, None, self.items()) + return (C, (), self.__dict__, None, iter(self.items())) def __eq__(self, other): return (dict(self) == dict(other) and self.__dict__ == other.__dict__) From 59fa59e381c09246fa11aed1ef51e119dfd8f044 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:48:11 +0100 Subject: [PATCH 1457/1674] [3.14] gh-141004: Document `Py_MakePendingCalls` (GH-141137) (GH-141787) gh-141004: Document `Py_MakePendingCalls` (GH-141137) (cherry picked from commit ce701032a3d5d3597466d5836ebe989db6eda2aa) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/init.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 660ab3c3cf97ac..b53fce8c727ade 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -2019,6 +2019,25 @@ pointer and a void pointer argument. This function now always schedules *func* to be run in the main interpreter. + +.. c:function:: int Py_MakePendingCalls(void) + + Execute all pending calls. This is usually executed automatically by the + interpreter. + + This function returns ``0`` on success, and returns ``-1`` with an exception + set on failure. + + If this is not called in the main thread of the main + interpreter, this function does nothing and returns ``0``. + The caller must hold an :term:`attached thread state`. + + .. versionadded:: 3.1 + + .. versionchanged:: 3.12 + This function only runs pending calls in the main interpreter. + + .. _profiling: Profiling and Tracing From fa40aab2aade5562dcc04409d07ac5e125016f39 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:52:07 +0100 Subject: [PATCH 1458/1674] [3.14] gh-141004: Document missing generator APIs (GH-141409) (GH-141789) gh-141004: Document missing generator APIs (GH-141409) (cherry picked from commit 2da7ecc680548804ea99d62ba4d228cfa5011671) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/gen.rst | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst index 0eb5922f6da75f..44f3bdbf959b9c 100644 --- a/Doc/c-api/gen.rst +++ b/Doc/c-api/gen.rst @@ -44,3 +44,41 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`. with ``__name__`` and ``__qualname__`` set to *name* and *qualname*. A reference to *frame* is stolen by this function. The *frame* argument must not be ``NULL``. + +.. c:function:: PyCodeObject* PyGen_GetCode(PyGenObject *gen) + + Return a new :term:`strong reference` to the code object wrapped by *gen*. + This function always succeeds. + + +Asynchronous Generator Objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. seealso:: + :pep:`525` + +.. c:var:: PyTypeObject PyAsyncGen_Type + + The type object corresponding to asynchronous generator objects. This is + available as :class:`types.AsyncGeneratorType` in the Python layer. + + .. versionadded:: 3.6 + +.. c:function:: PyObject *PyAsyncGen_New(PyFrameObject *frame, PyObject *name, PyObject *qualname) + + Create a new asynchronous generator wrapping *frame*, with ``__name__`` and + ``__qualname__`` set to *name* and *qualname*. *frame* is stolen by this + function and must not be ``NULL``. + + On success, this function returns a :term:`strong reference` to the + new asynchronous generator. On failure, this function returns ``NULL`` + with an exception set. + + .. versionadded:: 3.6 + +.. c:function:: int PyAsyncGen_CheckExact(PyObject *op) + + Return true if *op* is an asynchronous generator object, false otherwise. + This function always succeeds. + + .. versionadded:: 3.6 From f1bed5baf0c70aff297ca8298403ea07e32d6af7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:54:48 +0100 Subject: [PATCH 1459/1674] [3.14] gh-141004: Document missing `PyDateTime*` APIs (GH-141543) (GH-141791) gh-141004: Document missing `PyDateTime*` APIs (GH-141543) (cherry picked from commit 4273616ebfbfe2a7cfd93460a08364f5a40f89e2) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/datetime.rst | 48 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index f311aad5f15499..127d7c9c91a3d5 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -8,11 +8,42 @@ DateTime Objects Various date and time objects are supplied by the :mod:`datetime` module. Before using any of these functions, the header file :file:`datetime.h` must be included in your source (note that this is not included by :file:`Python.h`), -and the macro :c:macro:`!PyDateTime_IMPORT` must be invoked, usually as part of +and the macro :c:macro:`PyDateTime_IMPORT` must be invoked, usually as part of the module initialisation function. The macro puts a pointer to a C structure -into a static variable, :c:data:`!PyDateTimeAPI`, that is used by the following +into a static variable, :c:data:`PyDateTimeAPI`, that is used by the following macros. +.. c:macro:: PyDateTime_IMPORT() + + Import the datetime C API. + + On success, populate the :c:var:`PyDateTimeAPI` pointer. + On failure, set :c:var:`PyDateTimeAPI` to ``NULL`` and set an exception. + The caller must check if an error occurred via :c:func:`PyErr_Occurred`: + + .. code-block:: + + PyDateTime_IMPORT; + if (PyErr_Occurred()) { /* cleanup */ } + + .. warning:: + + This is not compatible with subinterpreters. + +.. c:type:: PyDateTime_CAPI + + Structure containing the fields for the datetime C API. + + The fields of this structure are private and subject to change. + + Do not use this directly; prefer ``PyDateTime_*`` APIs instead. + +.. c:var:: PyDateTime_CAPI *PyDateTimeAPI + + Dynamically allocated object containing the datetime C API. + + This variable is only available once :c:macro:`PyDateTime_IMPORT` succeeds. + .. c:type:: PyDateTime_Date This subtype of :c:type:`PyObject` represents a Python date object. @@ -325,3 +356,16 @@ Macros for the convenience of modules implementing the DB API: Create and return a new :class:`datetime.date` object given an argument tuple suitable for passing to :meth:`datetime.date.fromtimestamp`. + + +Internal data +------------- + +The following symbols are exposed by the C API but should be considered +internal-only. + +.. c:macro:: PyDateTime_CAPSULE_NAME + + Name of the datetime capsule to pass to :c:func:`PyCapsule_Import`. + + Internal usage only. Use :c:macro:`PyDateTime_IMPORT` instead. From 1253a8b2dfdacb4fba11937bd608d5b95f9ece43 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 17:23:40 +0100 Subject: [PATCH 1460/1674] [3.14] GH-137841: Open tzdata/zones file with UTF-8 encoding (GH-137872) (#141607) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Lib/zoneinfo/_tzpath.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/zoneinfo/_tzpath.py b/Lib/zoneinfo/_tzpath.py index d8ccec82059391..177d32c35eff29 100644 --- a/Lib/zoneinfo/_tzpath.py +++ b/Lib/zoneinfo/_tzpath.py @@ -131,7 +131,8 @@ def available_timezones(): # Start with loading from the tzdata package if it exists: this has a # pre-assembled list of zones that only requires opening one file. try: - with resources.files("tzdata").joinpath("zones").open("r") as f: + zones_file = resources.files("tzdata").joinpath("zones") + with zones_file.open("r", encoding="utf-8") as f: for zone in f: zone = zone.strip() if zone: From 730ff82bdfb719a932552644014e47be2d1034f2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Nov 2025 17:35:09 +0100 Subject: [PATCH 1461/1674] [3.14] Docs: Fix typo in socketserver documentation (GH-140956) (#141799) Co-authored-by: Thomas Ballard <thomasballard0503@gmail.com> --- Doc/library/socketserver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst index b048eb71ebfbfb..7545b5fb0a526a 100644 --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -544,7 +544,7 @@ The difference is that the ``readline()`` call in the second handler will call first handler had to use a ``recv()`` loop to accumulate data until a newline itself. If it had just used a single ``recv()`` without the loop it would just have returned what has been received so far from the client. -TCP is stream based: data arrives in the order it was sent, but there no +TCP is stream based: data arrives in the order it was sent, but there is no correlation between client ``send()`` or ``sendall()`` calls and the number of ``recv()`` calls on the server required to receive it. From 5398d088f454d81f6d9189f7bf657f655c8091a4 Mon Sep 17 00:00:00 2001 From: Victor Stinner <vstinner@python.org> Date: Thu, 20 Nov 2025 18:13:03 +0100 Subject: [PATCH 1462/1674] [3.14] gh-141784: Fix _remote_debugging_module.c compilation on 32-bit Linux (#141796) (#141800) gh-141784: Fix _remote_debugging_module.c compilation on 32-bit Linux (#141796) Include Python.h before system headers to make sure that _remote_debugging_module.c uses the same types (ABI) than Python. (cherry picked from commit 722f4bb8c9c6b32a7221e4813058cbb5c3989c10) --- ...-11-20-17-01-05.gh-issue-141784.LkYI2n.rst | 4 ++++ Modules/_remote_debugging_module.c | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst diff --git a/Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst b/Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst new file mode 100644 index 00000000000000..f20d84094162ac --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst @@ -0,0 +1,4 @@ +Fix ``_remote_debugging_module.c`` compilation on 32-bit Linux. Include +Python.h before system headers to make sure that +``_remote_debugging_module.c`` uses the same types (ABI) than Python. Patch +by Victor Stinner. diff --git a/Modules/_remote_debugging_module.c b/Modules/_remote_debugging_module.c index f34f25a1338542..b46538b76df16e 100644 --- a/Modules/_remote_debugging_module.c +++ b/Modules/_remote_debugging_module.c @@ -11,14 +11,6 @@ * HEADERS AND INCLUDES * ============================================================================ */ -#include <errno.h> -#include <fcntl.h> -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - #ifndef Py_BUILD_CORE_BUILTIN # define Py_BUILD_CORE_MODULE 1 #endif @@ -30,6 +22,17 @@ #include <internal/pycore_stackref.h> // Py_TAG_BITS #include "../Python/remote_debug.h" +// gh-141784: Python.h header must be included first, before system headers. +// Otherwise, some types such as ino_t can be defined differently, causing ABI +// issues. +#include <errno.h> +#include <fcntl.h> +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + #ifndef HAVE_PROCESS_VM_READV # define HAVE_PROCESS_VM_READV 0 #endif From af586d8d2601b5fe52277ba7bf5d9e1ff93ffbb6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 21 Nov 2025 17:47:13 +0100 Subject: [PATCH 1463/1674] [3.14] gh-116738: Make csv module thread-safe (gh-141365) (gh-141825) Added a critical section to protect the states of `ReaderObj` and `WriterObj` in the free-threading build. Without the critical sections, both new free-threading tests were crashing. (cherry picked from commit fb26d9c2ef739cbfdc134da5ab89470511f1f5fd) Co-authored-by: Alper <alperyoney@fb.com> --- Lib/test/test_free_threading/test_csv.py | 50 +++++++++++++++++++ ...-11-10-00-14-20.gh-issue-116738.IxliC_.rst | 2 + Modules/_csv.c | 38 ++++++++++---- 3 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 Lib/test/test_free_threading/test_csv.py create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst diff --git a/Lib/test/test_free_threading/test_csv.py b/Lib/test/test_free_threading/test_csv.py new file mode 100644 index 00000000000000..beb4510a1281b8 --- /dev/null +++ b/Lib/test/test_free_threading/test_csv.py @@ -0,0 +1,50 @@ +import csv +import io +import unittest + +from test.support import threading_helper +from test.support.threading_helper import run_concurrently + + +NTHREADS = 10 + + +@threading_helper.requires_working_threading() +class TestCSV(unittest.TestCase): + def test_concurrent_reader_next(self): + input_rows = [f"{i},{i},{i}" for i in range(50)] + input_stream = io.StringIO("\n".join(input_rows)) + reader = csv.reader(input_stream) + output_rows = [] + + def read_row(): + for row in reader: + self.assertEqual(len(row), 3) + output_rows.append(",".join(row)) + + run_concurrently(worker_func=read_row, nthreads=NTHREADS) + self.assertSetEqual(set(input_rows), set(output_rows)) + + def test_concurrent_writer_writerow(self): + output_stream = io.StringIO() + writer = csv.writer(output_stream) + row_per_thread = 10 + expected_rows = [] + + def write_row(): + for i in range(row_per_thread): + writer.writerow([i, i, i]) + expected_rows.append(f"{i},{i},{i}") + + run_concurrently(worker_func=write_row, nthreads=NTHREADS) + + # Rewind to the start of the stream and parse the rows + output_stream.seek(0) + output_rows = [line.strip() for line in output_stream.readlines()] + + self.assertEqual(len(output_rows), NTHREADS * row_per_thread) + self.assertListEqual(sorted(output_rows), sorted(expected_rows)) + + +if __name__ == "__main__": + unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst new file mode 100644 index 00000000000000..8b08bccafd73eb --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst @@ -0,0 +1,2 @@ +Make csv module thread-safe on the :term:`free threaded <free threading>` +build. diff --git a/Modules/_csv.c b/Modules/_csv.c index 87be7a8f1fb136..1f41976e95fdb1 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -918,7 +918,7 @@ parse_reset(ReaderObj *self) } static PyObject * -Reader_iternext(PyObject *op) +Reader_iternext_lock_held(PyObject *op) { ReaderObj *self = _ReaderObj_CAST(op); @@ -985,6 +985,16 @@ Reader_iternext(PyObject *op) return fields; } +static PyObject * +Reader_iternext(PyObject *op) +{ + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); + result = Reader_iternext_lock_held(op); + Py_END_CRITICAL_SECTION(); + return result; +} + static void Reader_dealloc(PyObject *op) { @@ -1303,15 +1313,8 @@ join_append_lineterminator(WriterObj *self) return 1; } -PyDoc_STRVAR(csv_writerow_doc, -"writerow($self, row, /)\n" -"--\n\n" -"Construct and write a CSV record from an iterable of fields.\n" -"\n" -"Non-string elements will be converted to string."); - static PyObject * -csv_writerow(PyObject *op, PyObject *seq) +csv_writerow_lock_held(PyObject *op, PyObject *seq) { WriterObj *self = _WriterObj_CAST(op); DialectObj *dialect = self->dialect; @@ -1414,6 +1417,23 @@ csv_writerow(PyObject *op, PyObject *seq) return result; } +PyDoc_STRVAR(csv_writerow_doc, +"writerow($self, row, /)\n" +"--\n\n" +"Construct and write a CSV record from an iterable of fields.\n" +"\n" +"Non-string elements will be converted to string."); + +static PyObject * +csv_writerow(PyObject *op, PyObject *seq) +{ + PyObject *result; + Py_BEGIN_CRITICAL_SECTION(op); + result = csv_writerow_lock_held(op, seq); + Py_END_CRITICAL_SECTION(); + return result; +} + PyDoc_STRVAR(csv_writerows_doc, "writerows($self, rows, /)\n" "--\n\n" From 5bca7f4d7ab685802a79e50e6746173c5cd7a00a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 21 Nov 2025 19:57:30 +0100 Subject: [PATCH 1464/1674] [3.14] gh-137422: Fix race condition in PyImport_AddModuleRef (gh-141822) (gh-141830) (cherry picked from commit 2d50dd242e04b94f86cb23c4972c1b423c670175) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Lib/test/test_free_threading/test_capi.py | 47 +++++++++++++++++++ ...-11-21-10-34-00.gh-issue-137422.tzZKLi.rst | 4 ++ Python/import.c | 23 ++++++--- 3 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 Lib/test/test_free_threading/test_capi.py create mode 100644 Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst diff --git a/Lib/test/test_free_threading/test_capi.py b/Lib/test/test_free_threading/test_capi.py new file mode 100644 index 00000000000000..146d7cfc97adb7 --- /dev/null +++ b/Lib/test/test_free_threading/test_capi.py @@ -0,0 +1,47 @@ +import ctypes +import sys +import unittest + +from test.support import threading_helper +from test.support.threading_helper import run_concurrently + + +_PyImport_AddModuleRef = ctypes.pythonapi.PyImport_AddModuleRef +_PyImport_AddModuleRef.argtypes = (ctypes.c_char_p,) +_PyImport_AddModuleRef.restype = ctypes.py_object + + +@threading_helper.requires_working_threading() +class TestImportCAPI(unittest.TestCase): + def test_pyimport_addmoduleref_thread_safe(self): + # gh-137422: Concurrent calls to PyImport_AddModuleRef with the same + # module name must return the same module object. + + NUM_ITERS = 10 + NTHREADS = 4 + + module_name = f"test_free_threading_addmoduleref_{id(self)}" + module_name_bytes = module_name.encode() + sys.modules.pop(module_name, None) + results = [] + + def worker(): + module = _PyImport_AddModuleRef(module_name_bytes) + results.append(module) + + for _ in range(NUM_ITERS): + try: + run_concurrently(worker_func=worker, nthreads=NTHREADS) + self.assertEqual(len(results), NTHREADS) + reference = results[0] + for module in results[1:]: + self.assertIs(module, reference) + self.assertIn(module_name, sys.modules) + self.assertIs(sys.modules[module_name], reference) + finally: + results.clear() + sys.modules.pop(module_name, None) + + +if __name__ == "__main__": + unittest.main() diff --git a/Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst b/Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst new file mode 100644 index 00000000000000..656289663cfebb --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst @@ -0,0 +1,4 @@ +Fix :term:`free threading` race condition in +:c:func:`PyImport_AddModuleRef`. It was previously possible for two calls to +the function return two different objects, only one of which was stored in +:data:`sys.modules`. diff --git a/Python/import.c b/Python/import.c index add78534606bf0..0158709ad91947 100644 --- a/Python/import.c +++ b/Python/import.c @@ -3,6 +3,7 @@ #include "Python.h" #include "pycore_audit.h" // _PySys_Audit() #include "pycore_ceval.h" +#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION() #include "pycore_hashtable.h" // _Py_hashtable_new_full() #include "pycore_import.h" // _PyImport_BootstrapImp() #include "pycore_initconfig.h" // _PyStatus_OK() @@ -309,13 +310,8 @@ PyImport_GetModule(PyObject *name) if not, create a new one and insert it in the modules dictionary. */ static PyObject * -import_add_module(PyThreadState *tstate, PyObject *name) +import_add_module_lock_held(PyObject *modules, PyObject *name) { - PyObject *modules = get_modules_dict(tstate, false); - if (modules == NULL) { - return NULL; - } - PyObject *m; if (PyMapping_GetOptionalItem(modules, name, &m) < 0) { return NULL; @@ -335,6 +331,21 @@ import_add_module(PyThreadState *tstate, PyObject *name) return m; } +static PyObject * +import_add_module(PyThreadState *tstate, PyObject *name) +{ + PyObject *modules = get_modules_dict(tstate, false); + if (modules == NULL) { + return NULL; + } + + PyObject *m; + Py_BEGIN_CRITICAL_SECTION(modules); + m = import_add_module_lock_held(modules, name); + Py_END_CRITICAL_SECTION(); + return m; +} + PyObject * PyImport_AddModuleRef(const char *name) { From 8d5cf98e456a048fa4b0072623b1101f381af5bd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 21 Nov 2025 21:14:43 +0100 Subject: [PATCH 1465/1674] [3.14] gh-141729: Doc PyTypeObject.tp_vectorcall grammar fix (GH-141730) (#141815) gh-141729: Doc PyTypeObject.tp_vectorcall grammar fix (GH-141730) [3.14] Doc PyTypeObject.tp_vectorcall grammar fix (cherry picked from commit 20b69aac0d19a5e5358362410d9710887762f0e7) Co-authored-by: Michael Kiper <77862413+michaelkiper@users.noreply.github.com> Co-authored-by: makiper <michael.kiper@jpl.nasa.gov> --- Doc/c-api/type.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index c7946e3190f01b..2f2060d0582251 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -638,7 +638,7 @@ The following functions and structs are used to create under the :ref:`limited API <limited-c-api>`. .. versionchanged:: 3.14 - The field :c:member:`~PyTypeObject.tp_vectorcall` can now set + The field :c:member:`~PyTypeObject.tp_vectorcall` can now be set using :c:data:`Py_tp_vectorcall`. See the field's documentation for details. From cfcf7652f6ae9be84e1973f2d3b1acb40b04ca53 Mon Sep 17 00:00:00 2001 From: Cody Maloney <cmaloney@users.noreply.github.com> Date: Fri, 21 Nov 2025 20:11:20 -0800 Subject: [PATCH 1466/1674] [3.14] gh-129559: add `bytearray.resize` thread safety test for free-threading (GH-141739) (#141835) [3.14] gh-129559: add `bytearray.resize` thread safety test for free-threading (GH-141739) (cherry picked from commit 019c315a8e52978da67a3108e441ed5ee376f504) --- Lib/test/test_bytes.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 08119f5f769711..1257715586913c 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -2564,6 +2564,10 @@ def zfill(b, a): c = a.zfill(0x400000) assert not c or c[-1] not in (0xdd, 0xcd) + def resize(b, a): # MODIFIES! + b.wait() + a.resize(10) + def check(funcs, a=None, *args): if a is None: a = bytearray(b'0' * 0x400000) @@ -2625,6 +2629,8 @@ def check(funcs, a=None, *args): check([clear] + [startswith] * 10) check([clear] + [strip] * 10) + check([clear] + [resize] * 10) + check([clear] + [contains] * 10) check([clear] + [subscript] * 10) check([clear2] + [ass_subscript2] * 10, None, bytearray(b'0' * 0x400000)) From 43d8b7f1ac419de06fdcd7b12455e28a17303770 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:38:52 +0100 Subject: [PATCH 1467/1674] [3.14] gh-141612: improve `test_trampoline_works_with_forks` coverage (GH-141613) (#141824) gh-141612: improve `test_trampoline_works_with_forks` coverage (GH-141613) (cherry picked from commit f15f6d0ba3715c67643e58959459b0e84a67b183) Co-authored-by: Paresh Joshi <rahulj9223@gmail.com> --- Lib/test/test_perf_profiler.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Lib/test/test_perf_profiler.py b/Lib/test/test_perf_profiler.py index 9f2e5899334df4..1e1b0522787ff3 100644 --- a/Lib/test/test_perf_profiler.py +++ b/Lib/test/test_perf_profiler.py @@ -160,6 +160,16 @@ def baz(): self.assertIn(f"py::bar_fork:{script}", child_perf_file_contents) self.assertIn(f"py::baz_fork:{script}", child_perf_file_contents) + # The parent's map should not contain the child's symbols. + self.assertNotIn(f"py::foo_fork:{script}", perf_file_contents) + self.assertNotIn(f"py::bar_fork:{script}", perf_file_contents) + self.assertNotIn(f"py::baz_fork:{script}", perf_file_contents) + + # The child's map should not contain the parent's symbols. + self.assertNotIn(f"py::foo:{script}", child_perf_file_contents) + self.assertNotIn(f"py::bar:{script}", child_perf_file_contents) + self.assertNotIn(f"py::baz:{script}", child_perf_file_contents) + @unittest.skipIf(support.check_bolt_optimized(), "fails on BOLT instrumented binaries") def test_sys_api(self): code = """if 1: From c9a4a3d502cdd9706de6d3e9c7d21a09cdc81f19 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 22 Nov 2025 19:47:47 +0100 Subject: [PATCH 1468/1674] [3.14] gh-141600: Fix musl version detection on Void Linux (GH-141850) (cherry picked from commit 08477dbf300020cc67006c180917c02ee8a5cec8) Co-authored-by: Andrew J. Hesford <ajh@sideband.org> --- Lib/platform.py | 4 ++-- Lib/test/test_platform.py | 6 ++++++ Lib/test/test_support.py | 4 ++-- .../Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst diff --git a/Lib/platform.py b/Lib/platform.py index 784b6b749b7524..b017b841311be3 100644 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -199,7 +199,7 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384): | (GLIBC_([0-9.]+)) | (libc(_\w+)?\.so(?:\.(\d[0-9.]*))?) | (musl-([0-9.]+)) - | (libc.musl(?:-\w+)?.so(?:\.(\d[0-9.]*))?) + | ((?:libc\.|ld-)musl(?:-\w+)?.so(?:\.(\d[0-9.]*))?) """, re.ASCII | re.VERBOSE) @@ -238,7 +238,7 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384): elif V(glibcversion) > V(ver): ver = glibcversion elif so: - if lib != 'glibc': + if lib not in ('glibc', 'musl'): lib = 'libc' if soversion and (not ver or V(soversion) > V(ver)): ver = soversion diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 187a3d54809105..e879e48571f3f7 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -562,6 +562,8 @@ def test_libc_ver(self): (b'/aports/main/musl/src/musl-1.2.5.7', ('musl', '1.2.5.7')), (b'libc.musl.so.1', ('musl', '1')), (b'libc.musl-x86_64.so.1.2.5', ('musl', '1.2.5')), + (b'ld-musl.so.1', ('musl', '1')), + (b'ld-musl-x86_64.so.1.2.5', ('musl', '1.2.5')), (b'', ('', '')), ): with open(filename, 'wb') as fp: @@ -584,6 +586,10 @@ def test_libc_ver(self): b'libc.musl-x86_64.so.1.4.1\0libc.musl-x86_64.so.2.1.1\0libc.musl-x86_64.so.2.0.1', ('musl', '2.1.1'), ), + ( + b'ld-musl-x86_64.so.1.4.1\0ld-musl-x86_64.so.2.1.1\0ld-musl-x86_64.so.2.0.1', + ('musl', '2.1.1'), + ), (b'no match here, so defaults are used', ('test', '100.1.0')), ): with open(filename, 'wb') as f: diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index e8d5e0d72e79c8..dba1dbf2c5a8e6 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -788,10 +788,10 @@ def test_linked_to_musl(self): self.assertTrue(linked) # The value is cached, so make sure it returns the same value again. self.assertIs(linked, support.linked_to_musl()) - # The unlike libc, the musl version is a triple. + # The musl version is either triple or just a major version number. if linked: self.assertIsInstance(linked, tuple) - self.assertEqual(3, len(linked)) + self.assertIn(len(linked), (1, 3)) for v in linked: self.assertIsInstance(v, int) diff --git a/Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst b/Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst new file mode 100644 index 00000000000000..8071246f130ace --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst @@ -0,0 +1 @@ +Fix musl version detection on Void Linux. From 972aa93692b2004b16c1499ff3c61894dcdbab95 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 22 Nov 2025 19:53:06 +0100 Subject: [PATCH 1469/1674] [3.14] gh-141801: Use accessors for ASN1_STRING fields in libssl (GH-141802) (#141847) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141801: Use accessors for ASN1_STRING fields in libssl (GH-141802) * gh-141801: Use accessors for ASN1_STRING fields While ASN1_STRING is currently exposed, it is better to use the accessors. See https://github.com/openssl/openssl/issues/29117 where, if the type were opaque, OpenSSL's X509 objects could be much more memory-efficient. * Update Modules/_ssl.c * Update Modules/_ssl.c --------- (cherry picked from commit c41fce08a5d7aae8fd9e3fa25e0ba521600e097c) Co-authored-by: David Benjamin <davidben@davidben.net> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Modules/_ssl.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 051efce4cfaa99..417d5ca593158f 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1410,14 +1410,14 @@ _get_peer_alt_names (_sslmodulestate *state, X509 *certificate) { } PyTuple_SET_ITEM(t, 0, v); - if (name->d.ip->length == 4) { - unsigned char *p = name->d.ip->data; + if (ASN1_STRING_length(name->d.ip) == 4) { + const unsigned char *p = ASN1_STRING_get0_data(name->d.ip); v = PyUnicode_FromFormat( "%d.%d.%d.%d", p[0], p[1], p[2], p[3] ); - } else if (name->d.ip->length == 16) { - unsigned char *p = name->d.ip->data; + } else if (ASN1_STRING_length(name->d.ip) == 16) { + const unsigned char *p = ASN1_STRING_get0_data(name->d.ip); v = PyUnicode_FromFormat( "%X:%X:%X:%X:%X:%X:%X:%X", p[0] << 8 | p[1], @@ -1548,8 +1548,9 @@ _get_aia_uri(X509 *certificate, int nid) { continue; } uri = ad->location->d.uniformResourceIdentifier; - ostr = PyUnicode_FromStringAndSize((char *)uri->data, - uri->length); + ostr = PyUnicode_FromStringAndSize( + (const char *)ASN1_STRING_get0_data(uri), + ASN1_STRING_length(uri)); if (ostr == NULL) { goto fail; } @@ -1615,8 +1616,9 @@ _get_crl_dp(X509 *certificate) { continue; } uri = gn->d.uniformResourceIdentifier; - ouri = PyUnicode_FromStringAndSize((char *)uri->data, - uri->length); + ouri = PyUnicode_FromStringAndSize( + (const char *)ASN1_STRING_get0_data(uri), + ASN1_STRING_length(uri)); if (ouri == NULL) goto done; From 5755ce0a879337f5743db514923fffdd5ed3bcac Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 22 Nov 2025 20:23:59 +0100 Subject: [PATCH 1470/1674] [3.14] gh-101100: Fix sphinx warnings in `library/unittest.rst` (GH-140109) (#141853) Co-authored-by: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/unittest.rst | 50 ++++++++++++++++++++-------------------- Doc/tools/.nitignore | 1 - 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 08d2afdaa9a065..d2ac5eedbbc047 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -438,7 +438,7 @@ run whether the test method succeeded or not. Such a working environment for the testing code is called a :dfn:`test fixture`. A new TestCase instance is created as a unique test fixture used to execute each individual test method. Thus -:meth:`~TestCase.setUp`, :meth:`~TestCase.tearDown`, and :meth:`~TestCase.__init__` +:meth:`~TestCase.setUp`, :meth:`~TestCase.tearDown`, and :meth:`!TestCase.__init__` will be called once per test. It is recommended that you use TestCase implementations to group tests together @@ -518,7 +518,7 @@ set-up and tear-down methods:: subclasses will make future test refactorings infinitely easier. In some cases, the existing tests may have been written using the :mod:`doctest` -module. If so, :mod:`doctest` provides a :class:`DocTestSuite` class that can +module. If so, :mod:`doctest` provides a :class:`~doctest.DocTestSuite` class that can automatically build :class:`unittest.TestSuite` instances from the existing :mod:`doctest`\ -based tests. @@ -1023,7 +1023,7 @@ Test cases additional keyword argument *msg*. The context manager will store the caught exception object in its - :attr:`exception` attribute. This can be useful if the intention + :attr:`!exception` attribute. This can be useful if the intention is to perform additional checks on the exception raised:: with self.assertRaises(SomeException) as cm: @@ -1036,7 +1036,7 @@ Test cases Added the ability to use :meth:`assertRaises` as a context manager. .. versionchanged:: 3.2 - Added the :attr:`exception` attribute. + Added the :attr:`!exception` attribute. .. versionchanged:: 3.3 Added the *msg* keyword argument when used as a context manager. @@ -1089,8 +1089,8 @@ Test cases additional keyword argument *msg*. The context manager will store the caught warning object in its - :attr:`warning` attribute, and the source line which triggered the - warnings in the :attr:`filename` and :attr:`lineno` attributes. + :attr:`!warning` attribute, and the source line which triggered the + warnings in the :attr:`!filename` and :attr:`!lineno` attributes. This can be useful if the intention is to perform additional checks on the warning caught:: @@ -1430,7 +1430,7 @@ Test cases that lists the differences between the sets. This method is used by default when comparing sets or frozensets with :meth:`assertEqual`. - Fails if either of *first* or *second* does not have a :meth:`set.difference` + Fails if either of *first* or *second* does not have a :meth:`~frozenset.difference` method. .. versionadded:: 3.1 @@ -1638,7 +1638,7 @@ Test cases .. method:: asyncSetUp() :async: - Method called to prepare the test fixture. This is called after :meth:`setUp`. + Method called to prepare the test fixture. This is called after :meth:`TestCase.setUp`. This is called immediately before calling the test method; other than :exc:`AssertionError` or :exc:`SkipTest`, any exception raised by this method will be considered an error rather than a test failure. The default implementation @@ -1648,7 +1648,7 @@ Test cases :async: Method called immediately after the test method has been called and the - result recorded. This is called before :meth:`tearDown`. This is called even if + result recorded. This is called before :meth:`~TestCase.tearDown`. This is called even if the test method raised an exception, so the implementation in subclasses may need to be particularly careful about checking internal state. Any exception, other than :exc:`AssertionError` or :exc:`SkipTest`, raised by this method will be @@ -1677,7 +1677,7 @@ Test cases Sets up a new event loop to run the test, collecting the result into the :class:`TestResult` object passed as *result*. If *result* is omitted or ``None``, a temporary result object is created (by calling - the :meth:`defaultTestResult` method) and used. The result object is + the :meth:`~TestCase.defaultTestResult` method) and used. The result object is returned to :meth:`run`'s caller. At the end of the test all the tasks in the event loop are cancelled. @@ -1798,7 +1798,7 @@ Grouping tests returned by repeated iterations before :meth:`TestSuite.run` must be the same for each call iteration. After :meth:`TestSuite.run`, callers should not rely on the tests returned by this method unless the caller uses a - subclass that overrides :meth:`TestSuite._removeTestAtIndex` to preserve + subclass that overrides :meth:`!TestSuite._removeTestAtIndex` to preserve test references. .. versionchanged:: 3.2 @@ -1809,10 +1809,10 @@ Grouping tests .. versionchanged:: 3.4 In earlier versions the :class:`TestSuite` held references to each :class:`TestCase` after :meth:`TestSuite.run`. Subclasses can restore - that behavior by overriding :meth:`TestSuite._removeTestAtIndex`. + that behavior by overriding :meth:`!TestSuite._removeTestAtIndex`. In the typical usage of a :class:`TestSuite` object, the :meth:`run` method - is invoked by a :class:`TestRunner` rather than by the end-user test harness. + is invoked by a :class:`!TestRunner` rather than by the end-user test harness. Loading and running tests @@ -1846,12 +1846,12 @@ Loading and running tests .. method:: loadTestsFromTestCase(testCaseClass) Return a suite of all test cases contained in the :class:`TestCase`\ -derived - :class:`testCaseClass`. + :class:`!testCaseClass`. A test case instance is created for each method named by :meth:`getTestCaseNames`. By default these are the method names beginning with ``test``. If :meth:`getTestCaseNames` returns no - methods, but the :meth:`runTest` method is implemented, a single test + methods, but the :meth:`!runTest` method is implemented, a single test case is created for that method instead. @@ -1898,13 +1898,13 @@ Loading and running tests case class will be picked up as "a test method within a test case class", rather than "a callable object". - For example, if you have a module :mod:`SampleTests` containing a - :class:`TestCase`\ -derived class :class:`SampleTestCase` with three test - methods (:meth:`test_one`, :meth:`test_two`, and :meth:`test_three`), the + For example, if you have a module :mod:`!SampleTests` containing a + :class:`TestCase`\ -derived class :class:`!SampleTestCase` with three test + methods (:meth:`!test_one`, :meth:`!test_two`, and :meth:`!test_three`), the specifier ``'SampleTests.SampleTestCase'`` would cause this method to return a suite which will run all three test methods. Using the specifier ``'SampleTests.SampleTestCase.test_two'`` would cause it to return a test - suite which will run only the :meth:`test_two` test method. The specifier + suite which will run only the :meth:`!test_two` test method. The specifier can refer to modules and packages which have not been imported; they will be imported as a side-effect. @@ -2051,7 +2051,7 @@ Loading and running tests Testing frameworks built on top of :mod:`unittest` may want access to the :class:`TestResult` object generated by running a set of tests for reporting purposes; a :class:`TestResult` instance is returned by the - :meth:`TestRunner.run` method for this purpose. + :meth:`!TestRunner.run` method for this purpose. :class:`TestResult` instances have the following attributes that will be of interest when inspecting the results of running a set of tests: @@ -2137,12 +2137,12 @@ Loading and running tests This method can be called to signal that the set of tests being run should be aborted by setting the :attr:`shouldStop` attribute to ``True``. - :class:`TestRunner` objects should respect this flag and return without + :class:`!TestRunner` objects should respect this flag and return without running any additional tests. For example, this feature is used by the :class:`TextTestRunner` class to stop the test framework when the user signals an interrupt from the - keyboard. Interactive tools which provide :class:`TestRunner` + keyboard. Interactive tools which provide :class:`!TestRunner` implementations can use this in a similar manner. The following methods of the :class:`TestResult` class are used to maintain @@ -2462,9 +2462,9 @@ Class and Module Fixtures ------------------------- Class and module level fixtures are implemented in :class:`TestSuite`. When -the test suite encounters a test from a new class then :meth:`tearDownClass` -from the previous class (if there is one) is called, followed by -:meth:`setUpClass` from the new class. +the test suite encounters a test from a new class then +:meth:`~TestCase.tearDownClass` from the previous class (if there is one) +is called, followed by :meth:`~TestCase.setUpClass` from the new class. Similarly if a test is from a different module from the previous test then ``tearDownModule`` from the previous module is run, followed by diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 04e8e5580fcd79..a431e0b32ad621 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -36,7 +36,6 @@ Doc/library/tkinter.rst Doc/library/tkinter.scrolledtext.rst Doc/library/tkinter.ttk.rst Doc/library/unittest.mock.rst -Doc/library/unittest.rst Doc/library/urllib.parse.rst Doc/library/urllib.request.rst Doc/library/wsgiref.rst From adc2cc21eb561ec73ecafbba048c2ec8a11b795f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 22 Nov 2025 20:33:09 +0100 Subject: [PATCH 1471/1674] [3.14] GH-101100: Resolve reference warnings in library/stdtypes.rst (GH-138420) (#141855) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/stdtypes.rst | 11 ++++++----- Doc/tools/.nitignore | 1 - 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index f8397b861d9a8b..2820ef8a1188cd 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4731,11 +4731,12 @@ other sequence-like behavior. There are currently two built-in set types, :class:`set` and :class:`frozenset`. The :class:`set` type is mutable --- the contents can be changed using methods -like :meth:`~set.add` and :meth:`~set.remove`. Since it is mutable, it has no -hash value and cannot be used as either a dictionary key or as an element of -another set. The :class:`frozenset` type is immutable and :term:`hashable` --- -its contents cannot be altered after it is created; it can therefore be used as -a dictionary key or as an element of another set. +like :meth:`add <frozenset.add>` and :meth:`remove <frozenset.add>`. +Since it is mutable, it has no hash value and cannot be used as +either a dictionary key or as an element of another set. +The :class:`frozenset` type is immutable and :term:`hashable` --- +its contents cannot be altered after it is created; +it can therefore be used as a dictionary key or as an element of another set. Non-empty sets (not frozensets) can be created by placing a comma-separated list of elements within braces, for example: ``{'jack', 'sjoerd'}``, in addition to the diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index a431e0b32ad621..520e64f5fe13b9 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -29,7 +29,6 @@ Doc/library/pyexpat.rst Doc/library/select.rst Doc/library/socket.rst Doc/library/ssl.rst -Doc/library/stdtypes.rst Doc/library/termios.rst Doc/library/test.rst Doc/library/tkinter.rst From 061965c584810b97458f229a6ac5b3b79286e743 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 22 Nov 2025 21:23:22 +0100 Subject: [PATCH 1472/1674] [3.14] gh-98552: flush std streams in the multiprocessing forkserver before fork (GH-141849) (#141851) gh-98552: flush std streams in the multiprocessing forkserver before fork (GH-141849) * flush std streams in the multiprocessing forkserver before fork * NEWS (cherry picked from commit 58badb1711e12b6e8b5240ab96cdd01b95012de7) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/multiprocessing/forkserver.py | 1 + .../Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index cc8947c5e04fb1..8a4e8d835b0c91 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -326,6 +326,7 @@ def sigchld_handler(*_unused): len(fds))) child_r, child_w, *fds = fds s.close() + util._flush_std_streams() pid = os.fork() if pid == 0: # Child diff --git a/Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst b/Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst new file mode 100644 index 00000000000000..37a71ac1fff3f3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst @@ -0,0 +1,4 @@ +The :mod:`multiprocessing` forkserver process now flushes stdout and stderr +before it forks to avoid the confusion children inheriting any buffered but +not yet written output data. Normally there is none, but when using +:func:`multiprocessing.set_forkserver_preload` there *could* be. From 59ab1edb0046addf7ff621cc293d2b19bf275cf5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 23 Nov 2025 11:17:20 +0100 Subject: [PATCH 1473/1674] [3.14] gh-98552: Revert (unneeded, already done elsewhere) "flush std streams in the multiprocessing forkserver before fork (GH-141849)" (GH-141871) (#141872) gh-98552: Revert (unneeded, already done elsewhere) "flush std streams in the multiprocessing forkserver before fork (GH-141849)" (GH-141871) Revert (unneeded, already done elsewhere) "gh-98552: flush std streams in the multiprocessing forkserver before fork (GH-141849)" This reverts commit 58badb1711e12b6e8b5240ab96cdd01b95012de7. (cherry picked from commit 614a28b3da1c898f29c34c14f59bf2d496dbd31d) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/multiprocessing/forkserver.py | 1 - .../Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst | 4 ---- 2 files changed, 5 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 8a4e8d835b0c91..cc8947c5e04fb1 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -326,7 +326,6 @@ def sigchld_handler(*_unused): len(fds))) child_r, child_w, *fds = fds s.close() - util._flush_std_streams() pid = os.fork() if pid == 0: # Child diff --git a/Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst b/Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst deleted file mode 100644 index 37a71ac1fff3f3..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-22-18-00-38.gh-issue-98552.d5KNy-.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :mod:`multiprocessing` forkserver process now flushes stdout and stderr -before it forks to avoid the confusion children inheriting any buffered but -not yet written output data. Normally there is none, but when using -:func:`multiprocessing.set_forkserver_preload` there *could* be. From 1a798d30d8cb5ac3ff8b0b6ff9e458eb46e768aa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 23 Nov 2025 16:31:56 +0100 Subject: [PATCH 1474/1674] [3.14] gh-120158: Fix inconsistent monitoring state when setting events too frequently (gh-141845) (gh-141879) If we overflowed the global version counter (i.e., after 2*24 calls to `_PyMonitoring_SetEvents`), we bailed out after setting global monitoring events but before instrumenting code objects, which led to assertion errors later on. Also add a `time.sleep()` to `test_free_threading.test_monitoring` to avoid overflowing the global version counter. (cherry picked from commit e457d60daafe66534283e0f79c81517634408e57) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Lib/test/test_free_threading/test_monitoring.py | 3 +++ .../2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst | 2 ++ Python/instrumentation.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst diff --git a/Lib/test/test_free_threading/test_monitoring.py b/Lib/test/test_free_threading/test_monitoring.py index 407bf7cbdee917..4fbd3f3415cb32 100644 --- a/Lib/test/test_free_threading/test_monitoring.py +++ b/Lib/test/test_free_threading/test_monitoring.py @@ -73,6 +73,9 @@ def test_instrumentation(self): break self.during_threads() + # Sleep to avoid setting monitoring events too rapidly and + # overflowing the global version counter + time.sleep(0.0001) self.after_test() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst new file mode 100644 index 00000000000000..b3b5f252ac07cb --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst @@ -0,0 +1,2 @@ +Fix inconsistent state when enabling or disabling monitoring events too many +times. diff --git a/Python/instrumentation.c b/Python/instrumentation.c index c0cccadde0c094..32d6a204182892 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -2019,12 +2019,12 @@ _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events) if (existing_events == events) { return 0; } - set_events(&interp->monitors, tool_id, events); uint32_t new_version = global_version(interp) + MONITORING_VERSION_INCREMENT; if (new_version == 0) { PyErr_Format(PyExc_OverflowError, "events set too many times"); return -1; } + set_events(&interp->monitors, tool_id, events); set_global_version(tstate, new_version); #ifdef _Py_TIER2 _Py_Executors_InvalidateAll(interp, 1); From 73c9870366b3be12417a9bd49e0a102e7a13038b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 23 Nov 2025 18:34:01 +0100 Subject: [PATCH 1475/1674] [3.14] gh-141865: Fix translation of strings in `changes.py` extension (GH-141882) (#141883) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/tools/templates/dummy.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/tools/templates/dummy.html b/Doc/tools/templates/dummy.html index 0fdbe2a58017ff..75f6607d8f3698 100644 --- a/Doc/tools/templates/dummy.html +++ b/Doc/tools/templates/dummy.html @@ -27,8 +27,8 @@ In extensions/changes.py: -{% trans %}Deprecated since version {deprecated}, will be removed in version {removed}{% endtrans %} -{% trans %}Deprecated since version {deprecated}, removed in version {removed}{% endtrans %} +{% trans %}Deprecated since version %s, will be removed in version %s{% endtrans %} +{% trans %}Deprecated since version %s, removed in version %s{% endtrans %} In docsbuild-scripts, when rewriting indexsidebar.html with actual versions: From 394db662a5274202555ca2976bfbb70cad7b5717 Mon Sep 17 00:00:00 2001 From: Stefano Rivera <stefano@rivera.za.net> Date: Sun, 23 Nov 2025 15:55:33 -0800 Subject: [PATCH 1476/1674] [3.14] GH-139914: Handle stack growth direction on HPPA (GH-140028) (#141404) * [3.14] GH-139914: Handle stack growth direction on HPPA (GH-140028) Adapted from a patch for Python 3.14 submitted to the Debian BTS by John David Anglin https://bugs.debian.org/1105111#20 * Forgot to update test_call * WTF typo --- Include/internal/pycore_ceval.h | 8 ++++ Include/internal/pycore_pystate.h | 4 ++ Include/pyport.h | 6 +++ Lib/test/test_call.py | 9 +++- ...-10-13-13-54-19.gh-issue-139914.M-y_3E.rst | 1 + Modules/_testcapimodule.c | 4 ++ Python/ceval.c | 46 ++++++++++++++++--- configure | 13 ++++++ configure.ac | 8 ++++ pyconfig.h.in | 3 ++ 10 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index a3d9e7bf87a7ba..905cc0cf0509b8 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -201,7 +201,11 @@ extern void _PyEval_DeactivateOpCache(void); static inline int _Py_MakeRecCheck(PyThreadState *tstate) { uintptr_t here_addr = _Py_get_machine_stack_pointer(); _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; +#if _Py_STACK_GROWS_DOWN return here_addr < _tstate->c_stack_soft_limit; +#else + return here_addr > _tstate->c_stack_soft_limit; +#endif } // Export for '_json' shared extension, used via _Py_EnterRecursiveCall() @@ -233,7 +237,11 @@ static inline int _Py_ReachedRecursionLimit(PyThreadState *tstate) { uintptr_t here_addr = _Py_get_machine_stack_pointer(); _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; assert(_tstate->c_stack_hard_limit != 0); +#if _Py_STACK_GROWS_DOWN return here_addr <= _tstate->c_stack_soft_limit; +#else + return here_addr >= _tstate->c_stack_soft_limit; +#endif } static inline void _Py_LeaveRecursiveCall(void) { diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index ea3dfbd2eef9c1..7f1b0b7523b20d 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -326,7 +326,11 @@ _Py_RecursionLimit_GetMargin(PyThreadState *tstate) _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; assert(_tstate->c_stack_hard_limit != 0); intptr_t here_addr = _Py_get_machine_stack_pointer(); +#if _Py_STACK_GROWS_DOWN return Py_ARITHMETIC_RIGHT_SHIFT(intptr_t, here_addr - (intptr_t)_tstate->c_stack_soft_limit, _PyOS_STACK_MARGIN_SHIFT); +#else + return Py_ARITHMETIC_RIGHT_SHIFT(intptr_t, (intptr_t)_tstate->c_stack_soft_limit - here_addr, _PyOS_STACK_MARGIN_SHIFT); +#endif } #ifdef __cplusplus diff --git a/Include/pyport.h b/Include/pyport.h index 44894419f6231d..2c8567f2554d9b 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -701,4 +701,10 @@ extern "C" { #endif +// Assume the stack grows down unless specified otherwise +#ifndef _Py_STACK_GROWS_DOWN +# define _Py_STACK_GROWS_DOWN 1 +#endif + + #endif /* Py_PYPORT_H */ diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index fcbef1ae86bed5..b18f16a6efcf84 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -1048,9 +1048,14 @@ def get_sp(): this_sp = _testinternalcapi.get_stack_pointer() lower_sp = _testcapi.pyobject_vectorcall(get_sp, (), ()) - self.assertLess(lower_sp, this_sp) + if _testcapi._Py_STACK_GROWS_DOWN: + self.assertLess(lower_sp, this_sp) + safe_margin = this_sp - lower_sp + else: + self.assertLess(this_sp, lower_sp) + safe_margin = lower_sp - this_sp # Add an (arbitrary) extra 20% for safety - safe_margin = (this_sp - lower_sp) * 6 / 5 + safe_margin *= 6 / 5 self.assertLess(safe_margin, _testinternalcapi.get_stack_margin()) @skip_on_s390x diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst new file mode 100644 index 00000000000000..7529108d5d4772 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst @@ -0,0 +1 @@ +Restore support for HP PA-RISC, which has an upwards-growing stack. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 2572df9719a703..228fe4eff5812b 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3337,6 +3337,10 @@ PyInit__testcapi(void) PyModule_AddObject(m, "INT64_MAX", PyLong_FromInt64(INT64_MAX)); PyModule_AddObject(m, "UINT64_MAX", PyLong_FromUInt64(UINT64_MAX)); + if (PyModule_AddIntMacro(m, _Py_STACK_GROWS_DOWN)) { + return NULL; + } + if (PyModule_AddIntMacro(m, Py_single_input)) { return NULL; } diff --git a/Python/ceval.c b/Python/ceval.c index 6ce20af62e7249..d37a98df418322 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -333,13 +333,21 @@ _Py_ReachedRecursionLimitWithMargin(PyThreadState *tstate, int margin_count) { uintptr_t here_addr = _Py_get_machine_stack_pointer(); _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; +#if _Py_STACK_GROWS_DOWN if (here_addr > _tstate->c_stack_soft_limit + margin_count * _PyOS_STACK_MARGIN_BYTES) { +#else + if (here_addr <= _tstate->c_stack_soft_limit - margin_count * _PyOS_STACK_MARGIN_BYTES) { +#endif return 0; } if (_tstate->c_stack_hard_limit == 0) { _Py_InitializeRecursionLimits(tstate); } +#if _Py_STACK_GROWS_DOWN return here_addr <= _tstate->c_stack_soft_limit + margin_count * _PyOS_STACK_MARGIN_BYTES; +#else + return here_addr > _tstate->c_stack_soft_limit - margin_count * _PyOS_STACK_MARGIN_BYTES; +#endif } void @@ -347,7 +355,11 @@ _Py_EnterRecursiveCallUnchecked(PyThreadState *tstate) { uintptr_t here_addr = _Py_get_machine_stack_pointer(); _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; +#if _Py_STACK_GROWS_DOWN if (here_addr < _tstate->c_stack_hard_limit) { +#else + if (here_addr > _tstate->c_stack_hard_limit) { +#endif Py_FatalError("Unchecked stack overflow."); } } @@ -455,16 +467,28 @@ _Py_InitializeRecursionLimits(PyThreadState *tstate) } if (err == 0) { uintptr_t base = ((uintptr_t)stack_addr) + guard_size; - _tstate->c_stack_top = base + stack_size; -#ifdef _Py_THREAD_SANITIZER + uintptr_t top = base + stack_size; +# ifdef _Py_THREAD_SANITIZER // Thread sanitizer crashes if we use a bit more than half the stack. - _tstate->c_stack_soft_limit = base + (stack_size / 2); -#else - _tstate->c_stack_soft_limit = base + _PyOS_STACK_MARGIN_BYTES * 2; -#endif +# if _Py_STACK_GROWS_DOWN + base += stack_size / 2; +# else + top -= stack_size / 2; +# endif +# endif +# if _Py_STACK_GROWS_DOWN + _tstate->c_stack_top = top; _tstate->c_stack_hard_limit = base + _PyOS_STACK_MARGIN_BYTES; + _tstate->c_stack_soft_limit = base + _PyOS_STACK_MARGIN_BYTES * 2; assert(_tstate->c_stack_soft_limit < here_addr); assert(here_addr < _tstate->c_stack_top); +# else + _tstate->c_stack_top = base; + _tstate->c_stack_hard_limit = top - _PyOS_STACK_MARGIN_BYTES; + _tstate->c_stack_soft_limit = top - _PyOS_STACK_MARGIN_BYTES * 2; + assert(here_addr > base); + assert(here_addr < _tstate->c_stack_soft_limit); +# endif return; } # endif @@ -483,9 +507,15 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) uintptr_t here_addr = _Py_get_machine_stack_pointer(); assert(_tstate->c_stack_soft_limit != 0); assert(_tstate->c_stack_hard_limit != 0); +#if _Py_STACK_GROWS_DOWN if (here_addr < _tstate->c_stack_hard_limit) { /* Overflowing while handling an overflow. Give up. */ int kbytes_used = (int)(_tstate->c_stack_top - here_addr)/1024; +#else + if (here_addr > _tstate->c_stack_hard_limit) { + /* Overflowing while handling an overflow. Give up. */ + int kbytes_used = (int)(here_addr - _tstate->c_stack_top)/1024; +#endif char buffer[80]; snprintf(buffer, 80, "Unrecoverable stack overflow (used %d kB)%s", kbytes_used, where); Py_FatalError(buffer); @@ -494,7 +524,11 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) return 0; } else { +#if _Py_STACK_GROWS_DOWN int kbytes_used = (int)(_tstate->c_stack_top - here_addr)/1024; +#else + int kbytes_used = (int)(here_addr - _tstate->c_stack_top)/1024; +#endif tstate->recursion_headroom++; _PyErr_Format(tstate, PyExc_RecursionError, "Stack overflow (used %d kB)%s", diff --git a/configure b/configure index fb92ea2c61febd..46eb0665bf4795 100755 --- a/configure +++ b/configure @@ -965,6 +965,7 @@ LDLIBRARY LIBRARY BUILDEXEEXT NO_AS_NEEDED +_Py_STACK_GROWS_DOWN MULTIARCH_CPPFLAGS PLATFORM_TRIPLET MULTIARCH @@ -7211,6 +7212,18 @@ if test x$MULTIARCH != x; then fi +# Guess C stack direction +case $host in #( + hppa*) : + _Py_STACK_GROWS_DOWN=0 ;; #( + *) : + _Py_STACK_GROWS_DOWN=1 ;; +esac + +printf "%s\n" "#define _Py_STACK_GROWS_DOWN $_Py_STACK_GROWS_DOWN" >>confdefs.h + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PEP 11 support tier" >&5 printf %s "checking for PEP 11 support tier... " >&6; } case $host/$ac_cv_cc_name in #( diff --git a/configure.ac b/configure.ac index 0742ba7f6d1498..bd4446e9488f7b 100644 --- a/configure.ac +++ b/configure.ac @@ -1202,6 +1202,14 @@ if test x$MULTIARCH != x; then fi AC_SUBST([MULTIARCH_CPPFLAGS]) +# Guess C stack direction +AS_CASE([$host], + [hppa*], [_Py_STACK_GROWS_DOWN=0], + [_Py_STACK_GROWS_DOWN=1]) +AC_DEFINE_UNQUOTED([_Py_STACK_GROWS_DOWN], [$_Py_STACK_GROWS_DOWN], + [Define to 1 if the machine stack grows down (default); 0 if it grows up.]) +AC_SUBST([_Py_STACK_GROWS_DOWN]) + dnl Support tiers according to https://peps.python.org/pep-0011/ dnl dnl NOTE: Windows support tiers are defined in PC/pyconfig.h. diff --git a/pyconfig.h.in b/pyconfig.h.in index 0d6ad4465c0e93..9502fcebf5d780 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -2023,6 +2023,9 @@ /* HACL* library can compile SIMD256 implementations */ #undef _Py_HACL_CAN_COMPILE_VEC256 +/* Define to 1 if the machine stack grows down (default); 0 if it grows up. */ +#undef _Py_STACK_GROWS_DOWN + /* Define to force use of thread-safe errno, h_errno, and other functions */ #undef _REENTRANT From 40fd66bab84790868f3efe255bb9791d1e8ecf98 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 04:09:34 +0100 Subject: [PATCH 1477/1674] [3.14] gh-135335: Simplify preload regression test using __main__ (GH-138686) (#141886) gh-135335: Simplify preload regression test using __main__ (GH-138686) Simplify preload regression test using `__main__` With the fix for gh-126631 `__main__` modules can be preloaded and the regression test for gh-135335 can be simplified to just use a self-contained script rather than requiring a module. Note this assumes and implicitly tests that `__main__` is preloaded by default. (cherry picked from commit 425f24e4fad672c211307a9f0018c8d39c4db9de) Co-authored-by: Duane Griffin <duaneg@dghda.com> --- Lib/test/_test_multiprocessing.py | 21 +++------------------ Lib/test/mp_preload_flush.py | 8 ++------ 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 047d17aed41d50..03114f1701e0ce 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -6812,28 +6812,13 @@ def test_std_streams_flushed_after_preload(self): if multiprocessing.get_start_method() != "forkserver": self.skipTest("forkserver specific test") - # Create a test module in the temporary directory on the child's path - # TODO: This can all be simplified once gh-126631 is fixed and we can - # use __main__ instead of a module. - dirname = os.path.join(self._temp_dir, 'preloaded_module') - init_name = os.path.join(dirname, '__init__.py') - os.mkdir(dirname) - with open(init_name, "w") as f: - cmd = '''if 1: - import sys - print('stderr', end='', file=sys.stderr) - print('stdout', end='', file=sys.stdout) - ''' - f.write(cmd) - name = os.path.join(os.path.dirname(__file__), 'mp_preload_flush.py') - env = {'PYTHONPATH': self._temp_dir} - _, out, err = test.support.script_helper.assert_python_ok(name, **env) + _, out, err = test.support.script_helper.assert_python_ok(name) # Check stderr first, as it is more likely to be useful to see in the # event of a failure. - self.assertEqual(err.decode().rstrip(), 'stderr') - self.assertEqual(out.decode().rstrip(), 'stdout') + self.assertEqual(err.decode().rstrip(), '__main____mp_main__') + self.assertEqual(out.decode().rstrip(), '__main____mp_main__') class MiscTestCase(unittest.TestCase): diff --git a/Lib/test/mp_preload_flush.py b/Lib/test/mp_preload_flush.py index 3501554d366a21..c195a9ef6b26fe 100644 --- a/Lib/test/mp_preload_flush.py +++ b/Lib/test/mp_preload_flush.py @@ -1,15 +1,11 @@ import multiprocessing import sys -modname = 'preloaded_module' +print(__name__, end='', file=sys.stderr) +print(__name__, end='', file=sys.stdout) if __name__ == '__main__': - if modname in sys.modules: - raise AssertionError(f'{modname!r} is not in sys.modules') multiprocessing.set_start_method('forkserver') - multiprocessing.set_forkserver_preload([modname]) for _ in range(2): p = multiprocessing.Process() p.start() p.join() -elif modname not in sys.modules: - raise AssertionError(f'{modname!r} is not in sys.modules') From 6511eb0f06f2e49d4ff96da5271b394b022d2c91 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:20:02 +0100 Subject: [PATCH 1478/1674] [3.14] gh-106318: Add example for str.isdecimal() (GH-137559) (#141893) Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/stdtypes.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 2820ef8a1188cd..87dcf8fe977347 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2073,9 +2073,18 @@ expression support in the :mod:`re` module). Return ``True`` if all characters in the string are decimal characters and there is at least one character, ``False`` otherwise. Decimal characters are those that can be used to form - numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT + numbers in base 10, such as U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character is a character in the Unicode - General Category "Nd". + General Category "Nd". For example: + + .. doctest:: + + >>> '0123456789'.isdecimal() + True + >>> '٠١٢٣٤٥٦٧٨٩'.isdecimal() # Arabic-Indic digits zero to nine + True + >>> 'alphabetic'.isdecimal() + False .. method:: str.isdigit() From 17c5d6d58dcb7c94757fdedac500d6e7ac1ce40e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:40:01 +0100 Subject: [PATCH 1479/1674] [3.14] gh-141004: Document `Py_ARRAY_LENGTH` (GH-141601) (GH-141895) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141004: Document `Py_ARRAY_LENGTH` (GH-141601) (cherry picked from commit e0773eacb7e660b4fd6bd702b0a119e25ab3b012) Co-authored-by: Yashraj <yashrajpala8@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Doc/c-api/intro.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 58409590c93b0a..3a0c4c8e96068b 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -322,6 +322,19 @@ complete listing. PyDoc_VAR(python_doc) = PyDoc_STR("A genus of constricting snakes in the Pythonidae family native " "to the tropics and subtropics of the Eastern Hemisphere."); +.. c:macro:: Py_ARRAY_LENGTH(array) + + Compute the length of a statically allocated C array at compile time. + + The *array* argument must be a C array with a size known at compile time. + Passing an array with an unknown size, such as a heap-allocated array, + will result in a compilation error on some compilers, or otherwise produce + incorrect results. + + This is roughly equivalent to:: + + sizeof(array) / sizeof((array)[0]) + .. _api-objects: From a47ed2e9048c9f3744ca75434427e9938027ec63 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:07:58 +0100 Subject: [PATCH 1480/1674] [3.14] gh-106318: Add example for str.isascii() (GH-137558) (#141898) Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/stdtypes.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 87dcf8fe977347..9b1c6a3a744fdc 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2063,7 +2063,14 @@ expression support in the :mod:`re` module). Return ``True`` if the string is empty or all characters in the string are ASCII, ``False`` otherwise. - ASCII characters have code points in the range U+0000-U+007F. + ASCII characters have code points in the range U+0000-U+007F. For example: + + .. doctest:: + + >>> 'ASCII characters'.isascii() + True + >>> 'µ'.isascii() + False .. versionadded:: 3.7 From 9e46e1b05c91c663422d634ca5a2d29fb4b520eb Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:28:49 +0200 Subject: [PATCH 1481/1674] [3.14] gh-106318: Add example for str.isalpha() (GH-137557) (#141901) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> Co-authored-by: Éric <merwok@netwok.org> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/howto/unicode.rst | 2 ++ Doc/library/stdtypes.rst | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index 254fe729355353..243cc27bac7025 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -352,6 +352,8 @@ If you don't include such a comment, the default encoding used will be UTF-8 as already mentioned. See also :pep:`263` for more information. +.. _unicode-properties: + Unicode Properties ------------------ diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 9b1c6a3a744fdc..7b9f5a69d4067d 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2057,6 +2057,18 @@ expression support in the :mod:`re` module). from the `Alphabetic property defined in the section 4.10 'Letters, Alphabetic, and Ideographic' of the Unicode Standard <https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-4/#G91002>`_. + For example: + + .. doctest:: + + >>> 'Letters and spaces'.isalpha() + False + >>> 'LettersOnly'.isalpha() + True + >>> 'µ'.isalpha() # non-ASCII characters can be considered alphabetical too + True + + See :ref:`unicode-properties`. .. method:: str.isascii() From 3edc944ec4211ff7e22015d5b9b7f49eced3803e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:56:59 +0100 Subject: [PATCH 1482/1674] [3.14] gh-106318: Add example for str.format() (GH-137018) (#141904) Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> --- Doc/library/stdtypes.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 7b9f5a69d4067d..617e609b71062b 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1994,10 +1994,16 @@ expression support in the :mod:`re` module). ``{}``. Each replacement field contains either the numeric index of a positional argument, or the name of a keyword argument. Returns a copy of the string where each replacement field is replaced with the string value of - the corresponding argument. + the corresponding argument. For example: + + .. doctest:: >>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3' + >>> "The sum of {a} + {b} is {answer}".format(answer=1+2, a=1, b=2) + 'The sum of 1 + 2 is 3' + >>> "{1} expects the {0} Inquisition!".format("Spanish", "Nobody") + 'Nobody expects the Spanish Inquisition!' See :ref:`formatstrings` for a description of the various formatting options that can be specified in format strings. From 7b8fb9072d8382a395b8ad66f891ab4ace2a54b3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:59:22 +0100 Subject: [PATCH 1483/1674] [3.14] gh-106318: Add examples for str.join() (GH-140315) (#141906) Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/stdtypes.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 617e609b71062b..a8b9575dea02d0 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2228,7 +2228,16 @@ expression support in the :mod:`re` module). Return a string which is the concatenation of the strings in *iterable*. A :exc:`TypeError` will be raised if there are any non-string values in *iterable*, including :class:`bytes` objects. The separator between - elements is the string providing this method. + elements is the string providing this method. For example: + + .. doctest:: + + >>> ', '.join(['spam', 'spam', 'spam']) + 'spam, spam, spam' + >>> '-'.join('Python') + 'P-y-t-h-o-n' + + See also :meth:`split`. .. method:: str.ljust(width, fillchar=' ', /) @@ -2442,6 +2451,8 @@ expression support in the :mod:`re` module). >>> " foo ".split(maxsplit=0) ['foo '] + See also :meth:`join`. + .. index:: single: universal newlines; str.splitlines method From cabaa47668a4ad83d6a1af1886b7da38785bfe95 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:10:59 +0100 Subject: [PATCH 1484/1674] [3.14] gh-116749: Fix code comment for _PyConfig_GIL_DEFAULT (gh-141804) (gh-141911) (cherry picked from commit c490ffb7ac43e7132f866103cefd872afa067a6a) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Include/internal/pycore_initconfig.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 368dafb90635d7..183b2d45c5ede1 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -153,10 +153,8 @@ typedef enum { } _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 re-enabled by loading an incompatible extension module." */ + /* In free threaded builds, this means that the GIL is disabled at startup, + but may be enabled 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. */ From f8b0c902084be40edb1cbdf67f4624b2d2e4444d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:44:54 +0100 Subject: [PATCH 1485/1674] [3.14] gh-129441: Fix some flakiness in test_instrumentation (gh-141881) (gh-141913) Most of the `self.assertTrue(self.called)` checks are flaky because the worker threads may sometimes finish before the main thread calls `self.during_threads()`. (cherry picked from commit 71126ab19c76d8227fc3b9c7c59b957ca82af4dd) Co-authored-by: Sam Gross <colesbury@gmail.com> --- .../test_free_threading/test_monitoring.py | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/Lib/test/test_free_threading/test_monitoring.py b/Lib/test/test_free_threading/test_monitoring.py index 4fbd3f3415cb32..2cd6e7b035ecb4 100644 --- a/Lib/test/test_free_threading/test_monitoring.py +++ b/Lib/test/test_free_threading/test_monitoring.py @@ -35,10 +35,10 @@ def work(self, n, funcs): return n return self.work(n - 1, funcs) + self.work(n - 2, funcs) - def start_work(self, n, funcs): + def start_work(self, n, funcs, barrier): # With the GIL builds we need to make sure that the hooks have # a chance to run as it's possible to run w/o releasing the GIL. - time.sleep(0.1) + barrier.wait() self.work(n, funcs) def after_test(self): @@ -53,14 +53,16 @@ def test_instrumentation(self): exec("def f(): pass", x) funcs.append(x["f"]) + barrier = Barrier(self.thread_count + 1) threads = [] for i in range(self.thread_count): # Each thread gets a copy of the func list to avoid contention - t = Thread(target=self.start_work, args=(self.fib, list(funcs))) + t = Thread(target=self.start_work, args=(self.fib, list(funcs), barrier)) t.start() threads.append(t) self.after_threads() + barrier.wait() while True: any_alive = False @@ -120,7 +122,6 @@ class MonitoringMultiThreaded( def setUp(self): super().setUp() self.set = False - self.called = False monitoring.register_callback( self.tool_id, monitoring.events.LINE, self.callback ) @@ -130,10 +131,7 @@ def tearDown(self): super().tearDown() def callback(self, *args): - self.called = True - - def after_test(self): - self.assertTrue(self.called) + pass def during_threads(self): if self.set: @@ -151,16 +149,11 @@ class SetTraceMultiThreaded(InstrumentationMultiThreadedMixin, TestCase): def setUp(self): self.set = False - self.called = False - - def after_test(self): - self.assertTrue(self.called) def tearDown(self): sys.settrace(None) def trace_func(self, frame, event, arg): - self.called = True return self.trace_func def during_threads(self): @@ -177,16 +170,11 @@ class SetProfileMultiThreaded(InstrumentationMultiThreadedMixin, TestCase): def setUp(self): self.set = False - self.called = False - - def after_test(self): - self.assertTrue(self.called) def tearDown(self): sys.setprofile(None) def trace_func(self, frame, event, arg): - self.called = True return self.trace_func def during_threads(self): @@ -203,16 +191,11 @@ class SetProfileAllThreadsMultiThreaded(InstrumentationMultiThreadedMixin, TestC def setUp(self): self.set = False - self.called = False - - def after_test(self): - self.assertTrue(self.called) def tearDown(self): threading.setprofile_all_threads(None) def trace_func(self, frame, event, arg): - self.called = True return self.trace_func def during_threads(self): From 9e309c140fec1b53a5630ca9d954426e437c130a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 18:16:31 +0100 Subject: [PATCH 1486/1674] [3.14] gh-141004: Document `PyImport_Inittab` (GH-141844) (GH-141915) gh-141004: Document `PyImport_Inittab` (GH-141844) (cherry picked from commit 5f35702bb641230131c400500bb8bbacde7465b2) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Stan Ulbrych <stan@ulbrych.org> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/import.rst | 7 +++++++ Doc/extending/extending.rst | 2 +- Misc/NEWS.d/3.11.0a1.rst | 2 +- Misc/NEWS.d/3.12.0a2.rst | 4 ++-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 1cab3ce3061ec9..369e95dd02251b 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -327,6 +327,13 @@ Importing Modules initialization. +.. c:var:: struct _inittab *PyImport_Inittab + + The table of built-in modules used by Python initialization. Do not use this directly; + use :c:func:`PyImport_AppendInittab` and :c:func:`PyImport_ExtendInittab` + instead. + + .. c:function:: PyObject* PyImport_ImportModuleAttr(PyObject *mod_name, PyObject *attr_name) Import the module *mod_name* and get its attribute *attr_name*. diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst index dee92312169a27..f9b65643dfe888 100644 --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -426,7 +426,7 @@ A pointer to the module definition must be returned via :c:func:`PyModuleDef_Ini so that the import machinery can create the module and store it in ``sys.modules``. When embedding Python, the :c:func:`!PyInit_spam` function is not called -automatically unless there's an entry in the :c:data:`!PyImport_Inittab` table. +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:: diff --git a/Misc/NEWS.d/3.11.0a1.rst b/Misc/NEWS.d/3.11.0a1.rst index f58d6b657e9b95..ab998ca73abf40 100644 --- a/Misc/NEWS.d/3.11.0a1.rst +++ b/Misc/NEWS.d/3.11.0a1.rst @@ -4931,7 +4931,7 @@ Patch by Gabriele N. Tornetta .. nonce: 3p14JB .. section: C API -:c:func:`Py_RunMain` now resets :c:data:`!PyImport_Inittab` to its initial +:c:func:`Py_RunMain` now resets :c:data:`PyImport_Inittab` to its initial value at exit. It must be possible to call :c:func:`PyImport_AppendInittab` or :c:func:`PyImport_ExtendInittab` at each Python initialization. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/3.12.0a2.rst b/Misc/NEWS.d/3.12.0a2.rst index bc028f30636bf7..20e27c0d92f05f 100644 --- a/Misc/NEWS.d/3.12.0a2.rst +++ b/Misc/NEWS.d/3.12.0a2.rst @@ -35,11 +35,11 @@ Update bundled libexpat to 2.5.0 .. nonce: ik4iOv .. section: Core and Builtins -The docs clearly say that ``PyImport_Inittab``, +The docs clearly say that :c:data:`PyImport_Inittab`, :c:func:`PyImport_AppendInittab`, and :c:func:`PyImport_ExtendInittab` should not be used after :c:func:`Py_Initialize` has been called. We now enforce this for the two functions. Additionally, the runtime now uses an -internal copy of ``PyImport_Inittab``, to guard against modification. +internal copy of :c:data:`PyImport_Inittab`, to guard against modification. .. From 0f2f4c0e607246ba7e1f34e591dddfe033458cff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 18:24:41 +0100 Subject: [PATCH 1487/1674] [3.14] gh-141004: Document stack effect C APIs (GH-141843) (GH-141916) gh-141004: Document stack effect C APIs (GH-141843) (cherry picked from commit e1f1df4082e2bc6cdb46be9984124c88a7b2ff0f) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/veryhigh.rst | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 3b07b5fbed5959..7eb9f0b54abd4e 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -396,3 +396,43 @@ Available start symbols * :pep:`484` .. versionadded:: 3.8 + + +Stack Effects +^^^^^^^^^^^^^ + +.. seealso:: + :py:func:`dis.stack_effect` + + +.. c:macro:: PY_INVALID_STACK_EFFECT + + Sentinel value representing an invalid stack effect. + + This is currently equivalent to ``INT_MAX``. + + .. versionadded:: 3.8 + + +.. c:function:: int PyCompile_OpcodeStackEffect(int opcode, int oparg) + + Compute the stack effect of *opcode* with argument *oparg*. + + On success, this function returns the stack effect; on failure, this + returns :c:macro:`PY_INVALID_STACK_EFFECT`. + + .. versionadded:: 3.4 + + +.. c:function:: int PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump) + + Similar to :c:func:`PyCompile_OpcodeStackEffect`, but don't include the + stack effect of jumping if *jump* is zero. + + If *jump* is ``0``, this will not include the stack effect of jumping, but + if *jump* is ``1`` or ``-1``, this will include it. + + On success, this function returns the stack effect; on failure, this + returns :c:macro:`PY_INVALID_STACK_EFFECT`. + + .. versionadded:: 3.8 From 7ccdbbd04e0076b2f50a9c47cae7185fb59e3e87 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 24 Nov 2025 21:19:20 +0100 Subject: [PATCH 1488/1674] [3.14] Fix implicit import in `test_monitoring.py` (gh-141795) (gh-141920) (cherry picked from commit 369ce2b139a5b76c9c093cba1cee287cb6ffeec1) Co-authored-by: SubbaraoGarlapati <53627478+SubbaraoGarlapati@users.noreply.github.com> --- Lib/test/test_monitoring.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 28895d16c5707c..98276a8ccaa610 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -12,10 +12,10 @@ import unittest import test.support -from test.support import requires_specialization_ft, script_helper +from test.support import import_helper, requires_specialization_ft, script_helper -_testcapi = test.support.import_helper.import_module("_testcapi") -_testinternalcapi = test.support.import_helper.import_module("_testinternalcapi") +_testcapi = import_helper.import_module("_testcapi") +_testinternalcapi = import_helper.import_module("_testinternalcapi") PAIR = (0,1) From add73fdda01a518840f5cfc32e0fc57d847c8419 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 25 Nov 2025 02:20:35 +0100 Subject: [PATCH 1489/1674] [3.14] gh-141907: Better handle support for SHA3 for test_hashlib (GH-141908) (#141918) gh-141907: Better handle support for SHA3 for test_hashlib (GH-141908) * test_hashlib: better handle support for SHA3 It's possible that the SSL library supports only SHA3 algo and doesn't have SHAKE one. The current test wrongly detect this and set both HASH and HASHXOF to None expecting to have the extra SHA3 attributes present but this should only be true for SHAKE algo. To better handle this, move the HASH condition to a dedicated try-expect condition and check if HASHXOF is None in the relevant code effectively checking if SHA3 is supported by the SSL library but SHAKE algo needs to use the sha3module one. --------- (cherry picked from commit fee778265064c290ae1852916ff47fcc0ab4a29d) Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> Co-authored-by: Christian Marangi <ansuelsmth@gmail.com> Co-authored-by: Gregory P. Smith <greg@krypto.org> --- Lib/test/test_hashlib.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py index 0fecc95fec40fc..14a79a1c698ffb 100644 --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -41,12 +41,15 @@ openssl_hashlib = import_fresh_module('hashlib', fresh=['_hashlib']) try: - from _hashlib import HASH, HASHXOF, openssl_md_meth_names, get_fips_mode + import _hashlib except ImportError: - HASH = None - HASHXOF = None - openssl_md_meth_names = frozenset() - + _hashlib = None +# The extension module may exist but only define some of these. gh-141907 +HASH = getattr(_hashlib, 'HASH', None) +HASHXOF = getattr(_hashlib, 'HASHXOF', None) +openssl_md_meth_names = getattr(_hashlib, 'openssl_md_meth_names', frozenset()) +get_fips_mode = getattr(_hashlib, 'get_fips_mode', None) +if not get_fips_mode: def get_fips_mode(): return 0 @@ -566,9 +569,14 @@ def check_sha3(self, name, capacity, rate, suffix): constructors = self.constructors_to_test[name] for hash_object_constructor in constructors: m = hash_object_constructor() - if HASH is not None and isinstance(m, HASH): - # _hashopenssl's variant does not have extra SHA3 attributes - continue + if name.startswith('shake_'): + if HASHXOF is not None and isinstance(m, HASHXOF): + # _hashopenssl's variant does not have extra SHA3 attributes + continue + else: + if HASH is not None and isinstance(m, HASH): + # _hashopenssl's variant does not have extra SHA3 attributes + continue self.assertEqual(capacity + rate, 1600) self.assertEqual(m._capacity_bits, capacity) self.assertEqual(m._rate_bits, rate) @@ -1070,7 +1078,8 @@ def test_disallow_instantiation(self): def test_hash_disallow_instantiation(self): # internal types like _hashlib.HASH are not constructable support.check_disallow_instantiation(self, HASH) - support.check_disallow_instantiation(self, HASHXOF) + if HASHXOF is not None: + support.check_disallow_instantiation(self, HASHXOF) def test_readonly_types(self): for algorithm, constructors in self.constructors_to_test.items(): From 11e3fc963627981c0506d23463aca694fdc5af32 Mon Sep 17 00:00:00 2001 From: Alexander Nordin <alexander.f.nordin@gmail.com> Date: Tue, 25 Nov 2025 03:52:47 -0800 Subject: [PATCH 1490/1674] [3.14] gh-138199: Address potential confusion re: threading (GH-138200) (GH-141928) gh-138199: Address potential confusion regarding threading in the `asyncio` HOWTO (GH-138200) (cherry picked from commit a4f422521337d3310b71bb081c195e64c2035bbb) --- Doc/howto/a-conceptual-overview-of-asyncio.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/howto/a-conceptual-overview-of-asyncio.rst b/Doc/howto/a-conceptual-overview-of-asyncio.rst index af1e39480cc1f6..926e781dbdc658 100644 --- a/Doc/howto/a-conceptual-overview-of-asyncio.rst +++ b/Doc/howto/a-conceptual-overview-of-asyncio.rst @@ -175,9 +175,12 @@ The recommended way to create tasks is via :func:`asyncio.create_task`. Creating a task automatically schedules it for execution (by adding a callback to run it in the event loop's to-do list, that is, collection of jobs). -Since there's only one event loop (in each thread), :mod:`!asyncio` takes care of -associating the task with the event loop for you. As such, there's no need -to specify the event loop. +:mod:`!asyncio` automatically associates tasks with the event loop for you. +This automatic association was purposely designed into :mod:`!asyncio` for +the sake of simplicity. +Without it, you'd have to keep track of the event loop object and pass it to +any coroutine function that wants to create tasks, adding redundant clutter +to your code. :: From 32a38a25235243ac9fd9962370446acb540d0bac Mon Sep 17 00:00:00 2001 From: Petr Viktorin <encukou@gmail.com> Date: Tue, 25 Nov 2025 14:21:53 +0100 Subject: [PATCH 1491/1674] [3.14] gh-139653: Add PyUnstable_ThreadState_SetStackProtection() (GH-139668) (#141661) Co-authored-by: Rok Mandeljc <rok.mandeljc@gmail.com> Co-authored-by: Mark Shannon <mark@hotpy.org> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/exceptions.rst | 3 + Doc/c-api/init.rst | 57 + Doc/data/python3.14.abi | 18729 ++++++++-------- Doc/whatsnew/3.14.rst | 10 + Include/cpython/pystate.h | 12 + Include/internal/pycore_pythonrun.h | 6 + Include/internal/pycore_tstate.h | 4 + ...-10-06-22-17-47.gh-issue-139653.6-1MOd.rst | 4 + Modules/_testinternalcapi.c | 54 + Python/ceval.c | 144 +- Python/pystate.c | 3 + 11 files changed, 9668 insertions(+), 9358 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 7449935e69f721..d7fe9e2c9ec9b4 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -984,6 +984,9 @@ because the :ref:`call protocol <call>` takes care of recursion handling. be concatenated to the :exc:`RecursionError` message caused by the recursion depth limit. + .. seealso:: + The :c:func:`PyUnstable_ThreadState_SetStackProtection` function. + .. versionchanged:: 3.9 This function is now also available in the :ref:`limited API <limited-c-api>`. diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index b53fce8c727ade..573dd05c812534 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1531,6 +1531,63 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. versionadded:: 3.11 +.. c:function:: int PyUnstable_ThreadState_SetStackProtection(PyThreadState *tstate, void *stack_start_addr, size_t stack_size) + + Set the stack protection start address and stack protection size + of a Python thread state. + + On success, return ``0``. + On failure, set an exception and return ``-1``. + + CPython implements :ref:`recursion control <recursion>` for C code by raising + :py:exc:`RecursionError` when it notices that the machine execution stack is close + to overflow. See for example the :c:func:`Py_EnterRecursiveCall` function. + For this, it needs to know the location of the current thread's stack, which it + normally gets from the operating system. + When the stack is changed, for example using context switching techniques like the + Boost library's ``boost::context``, you must call + :c:func:`~PyUnstable_ThreadState_SetStackProtection` to inform CPython of the change. + + Call :c:func:`~PyUnstable_ThreadState_SetStackProtection` either before + or after changing the stack. + Do not call any other Python C API between the call and the stack + change. + + See :c:func:`PyUnstable_ThreadState_ResetStackProtection` for undoing this operation. + + .. versionadded:: next + + .. warning:: + + This function was added in a bugfix release, and + extensions that use it will be incompatible with Python 3.14.0. + Most packaging tools for Python are not able to handle this + incompatibility automatically, and will need explicit configuration. + When using PyPA standards (wheels and source distributions), + specify ``Requires-Python: != 3.14.0.*`` in + `core metadata <https://packaging.python.org/en/latest/specifications/core-metadata/#requires-python>`_. + + +.. c:function:: void PyUnstable_ThreadState_ResetStackProtection(PyThreadState *tstate) + + Reset the stack protection start address and stack protection size + of a Python thread state to the operating system defaults. + + See :c:func:`PyUnstable_ThreadState_SetStackProtection` for an explanation. + + .. versionadded:: next + + .. warning:: + + This function was added in a bugfix release, and + extensions that use it will be incompatible with Python 3.14.0. + Most packaging tools for Python are not able to handle this + incompatibility automatically, and will need explicit configuration. + When using PyPA standards (wheels and source distributions), + specify ``Requires-Python: != 3.14.0.*`` in + `core metadata <https://packaging.python.org/en/latest/specifications/core-metadata/#requires-python>`_. + + .. c:function:: PyInterpreterState* PyInterpreterState_Get(void) Get the current interpreter. diff --git a/Doc/data/python3.14.abi b/Doc/data/python3.14.abi index e2cb3cbe30da47..372c35f3713e2b 100644 --- a/Doc/data/python3.14.abi +++ b/Doc/data/python3.14.abi @@ -128,8 +128,10 @@ <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_BeginMutex' 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_BeginMutex' 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'/> @@ -364,6 +366,7 @@ <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__contextvars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__datetime' 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'/> @@ -532,6 +535,7 @@ <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_IsLocked' 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'/> @@ -1015,6 +1019,8 @@ <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_ThreadState_ResetStackProtection' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_ThreadState_SetStackProtection' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='PyUnstable_TryIncRef' 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'/> @@ -1553,6 +1559,7 @@ <elf-symbol name='_Py_HandlePending' 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_InitDumpStack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='_Py_InitializeRecursionLimits' 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'/> @@ -1807,7 +1814,7 @@ <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='560' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRuntime' size='316536' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRuntime' size='316552' 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'/> @@ -1881,19 +1888,25 @@ <return type-id='type-id-6'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='./Modules/_functoolsmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyDict_Clear_LockHeld' filepath='./Include/internal/pycore_dict.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-6'/> - <return type-id='type-id-3'/> + <abi-instr address-size='64' path='./Modules/_datetimemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-9' const='yes' id='type-id-10'/> + <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-11'/> + <qualified-type-def type-id='type-id-11' restrict='yes' id='type-id-12'/> + <function-decl name='strftime' filepath='/usr/include/time.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-12'/> + <return type-id='type-id-14'/> </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'/> + <var-decl name='_PyIO_Module' type-id='type-id-16' 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'> + <typedef-decl name='_PyIO_State' type-id='type-id-17' filepath='./Modules/_io/_iomodule.h' line='35' column='1' id='type-id-18'/> + <typedef-decl name='Py_off_t' type-id='type-id-19' filepath='./Modules/_io/_iomodule.h' line='109' column='1' id='type-id-20'/> + <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-17'> <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> @@ -1943,27 +1956,27 @@ <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'/> + <typedef-decl name='off_t' type-id='type-id-21' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='87' column='1' id='type-id-19'/> + <pointer-type-def type-id='type-id-18' size-in-bits='64' id='type-id-22'/> + <var-decl name='bufferediobase_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='12' column='1'/> + <var-decl name='bufferedrandom_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='13' column='1'/> + <var-decl name='bufferedreader_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='14' column='1'/> + <var-decl name='bufferedrwpair_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='15' column='1'/> + <var-decl name='bufferedwriter_spec' type-id='type-id-23' 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-22'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-22'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-22'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> @@ -1975,15 +1988,15 @@ <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-6'/> <parameter type-id='type-id-6'/> - <return type-id='type-id-13'/> + <return type-id='type-id-20'/> </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'/> + <var-decl name='bytesio_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='17' column='1'/> + <var-decl name='bytesiobuf_spec' type-id='type-id-23' 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'/> + <var-decl name='fileio_spec' type-id='type-id-23' 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-6'/> <return type-id='type-id-5'/> @@ -1995,14 +2008,14 @@ </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'/> + <var-decl name='iobase_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='20' column='1'/> + <var-decl name='rawiobase_spec' type-id='type-id-23' 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'/> + <var-decl name='stringio_spec' type-id='type-id-23' 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-6'/> <parameter type-id='type-id-6'/> @@ -2039,9 +2052,9 @@ <function-decl name='_Py_GetLocaleEncodingObject' filepath='./Include/internal/pycore_fileutils.h' line='238' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> </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'/> + <var-decl name='nldecoder_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='21' column='1'/> + <var-decl name='textiobase_spec' type-id='type-id-23' visibility='default' filepath='./Modules/_io/_iomodule.h' line='24' column='1'/> + <var-decl name='textiowrapper_spec' type-id='type-id-23' 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-6'/> <parameter type-id='type-id-6'/> @@ -2051,51 +2064,51 @@ <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-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-25'/> <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'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-14'/> </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'/> + <qualified-type-def type-id='type-id-28' const='yes' id='type-id-29'/> + <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-30'/> + <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-31'/> <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'/> + <return type-id='type-id-31'/> </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'/> @@ -2105,32 +2118,32 @@ <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'/> + <type-decl name='unsigned short int' size-in-bits='16' id='type-id-28'/> </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='70' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-26'/> + <function-decl name='_PyMutex_TryUnlock' filepath='./Include/internal/pycore_lock.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-32'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyRecursiveMutex_LockTimed' filepath='./Include/internal/pycore_lock.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-27'/> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-29'/> - <return type-id='type-id-30'/> + <function-decl name='_PyRecursiveMutex_LockTimed' filepath='./Include/internal/pycore_lock.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-33'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-35'/> + <return type-id='type-id-36'/> </function-decl> - <function-decl name='_PyErr_Display' filepath='./Include/internal/pycore_pylifecycle.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyThreadState_DeleteCurrent' filepath='./Include/internal/pycore_pylifecycle.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <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-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='pthread_setname_np' filepath='/usr/include/pthread.h' line='463' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-32'/> + <parameter type-id='type-id-38'/> <parameter type-id='type-id-4'/> <return type-id='type-id-5'/> </function-decl> @@ -2156,7 +2169,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTraceMalloc_GetMemory' filepath='./Include/internal/pycore_tracemalloc.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-21'/> + <return type-id='type-id-14'/> </function-decl> <function-decl name='_PyTraceMalloc_GetTracedMemory' filepath='./Include/internal/pycore_tracemalloc.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> @@ -2173,15 +2186,15 @@ </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-33' name='interp' filepath='./Modules/atexitmodule.c' line='27' column='1'/> - <parameter type-id='type-id-34' name='func' filepath='./Modules/atexitmodule.c' line='28' column='1'/> - <parameter type-id='type-id-35' name='data' filepath='./Modules/atexitmodule.c' line='28' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='./Modules/atexitmodule.c' line='27' column='1'/> + <parameter type-id='type-id-40' name='func' filepath='./Modules/atexitmodule.c' line='28' column='1'/> + <parameter type-id='type-id-41' 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-36'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='__rlimit_resource' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='31' column='1' id='type-id-42'> + <underlying-type type-id='type-id-43'/> <enumerator name='RLIMIT_CPU' value='0'/> <enumerator name='RLIMIT_FSIZE' value='1'/> <enumerator name='RLIMIT_DATA' value='2'/> @@ -2202,38 +2215,38 @@ <enumerator name='__RLIMIT_NLIMITS' value='16'/> <enumerator name='__RLIM_NLIMITS' value='16'/> </enum-decl> - <typedef-decl name='rlim_t' type-id='type-id-38' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='133' column='1' id='type-id-39'/> - <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-40'> + <typedef-decl name='rlim_t' type-id='type-id-44' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='133' column='1' id='type-id-45'/> + <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-46'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='rlim_cur' type-id='type-id-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='142' column='1'/> + <var-decl name='rlim_cur' type-id='type-id-45' 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-39' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='144' column='1'/> + <var-decl name='rlim_max' type-id='type-id-45' 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-38'/> - <typedef-decl name='__rlimit_resource_t' type-id='type-id-36' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='38' column='1' id='type-id-41'/> - <pointer-type-def type-id='type-id-42' size-in-bits='64' id='type-id-43'/> - <qualified-type-def type-id='type-id-43' restrict='yes' id='type-id-44'/> - <qualified-type-def type-id='type-id-42' const='yes' id='type-id-45'/> - <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/> - <qualified-type-def type-id='type-id-46' restrict='yes' id='type-id-47'/> - <qualified-type-def type-id='type-id-40' const='yes' id='type-id-48'/> + <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-44'/> + <typedef-decl name='__rlimit_resource_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='38' column='1' id='type-id-47'/> <pointer-type-def type-id='type-id-48' size-in-bits='64' id='type-id-49'/> - <qualified-type-def type-id='type-id-50' const='yes' id='type-id-51'/> + <qualified-type-def type-id='type-id-49' restrict='yes' id='type-id-50'/> + <qualified-type-def type-id='type-id-48' const='yes' id='type-id-51'/> <pointer-type-def type-id='type-id-51' size-in-bits='64' id='type-id-52'/> <qualified-type-def type-id='type-id-52' restrict='yes' id='type-id-53'/> - <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-54'/> - <pointer-type-def type-id='type-id-50' size-in-bits='64' id='type-id-55'/> - <qualified-type-def type-id='type-id-55' restrict='yes' id='type-id-56'/> + <qualified-type-def type-id='type-id-46' const='yes' id='type-id-54'/> + <pointer-type-def type-id='type-id-54' size-in-bits='64' id='type-id-55'/> + <qualified-type-def type-id='type-id-56' const='yes' id='type-id-57'/> + <pointer-type-def type-id='type-id-57' size-in-bits='64' id='type-id-58'/> + <qualified-type-def type-id='type-id-58' restrict='yes' id='type-id-59'/> + <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-60'/> + <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-61'/> + <qualified-type-def type-id='type-id-61' restrict='yes' id='type-id-62'/> <function-decl name='_Py_DumpExtensionModules' filepath='./Include/internal/pycore_pyerrors.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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-31'/> + <parameter type-id='type-id-37'/> <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'> @@ -2241,12 +2254,12 @@ <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-57'/> + <parameter type-id='type-id-63'/> <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-53'/> - <parameter type-id='type-id-56'/> + <parameter type-id='type-id-59'/> + <parameter type-id='type-id-62'/> <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'> @@ -2255,8 +2268,8 @@ </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-47'/> - <parameter type-id='type-id-44'/> + <parameter type-id='type-id-53'/> + <parameter type-id='type-id-50'/> <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'> @@ -2265,17 +2278,17 @@ </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-58'/> + <type-decl name='char' size-in-bits='8' id='type-id-64'/> <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-59'/> - <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-58' size-in-bits='64' id='type-id-17'/> - <qualified-type-def type-id='type-id-58' const='yes' id='type-id-60'/> - <pointer-type-def type-id='type-id-60' size-in-bits='64' id='type-id-4'/> + <type-decl name='variadic parameter type' id='type-id-65'/> + <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-14'/> + <pointer-type-def type-id='type-id-64' size-in-bits='64' id='type-id-24'/> + <qualified-type-def type-id='type-id-64' const='yes' id='type-id-66'/> + <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-4'/> <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-24'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> @@ -2291,92 +2304,92 @@ </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='114' 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-61'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-25'/> + <return type-id='type-id-67'/> </function-decl> <function-decl name='_Py_DecodeUTF8_surrogateescape' filepath='./Include/internal/pycore_fileutils.h' line='211' 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-62'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-68'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_Py_wstat' filepath='./Include/internal/pycore_fileutils.h' line='217' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-64'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-70'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_join_relfile' filepath='./Include/internal/pycore_fileutils.h' line='257' 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-63'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-25'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_Py_add_relfile' filepath='./Include/internal/pycore_fileutils.h' line='259' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-63'/> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-69'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-14'/> <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-65'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-71'/> + <return type-id='type-id-72'/> </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'/> + <return type-id='type-id-25'/> </function-decl> <function-decl name='_Py_Get_Getpath_CodeObject' mangled-name='_Py_Get_Getpath_CodeObject' filepath='./Modules/getpath.c' line='833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Get_Getpath_CodeObject'> <return type-id='type-id-6'/> </function-decl> <function-decl name='dladdr' filepath='/usr/include/dlfcn.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-67'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-73'/> <return type-id='type-id-5'/> </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-68' size-in-bits='1024' id='type-id-69'> - <subrange length='16' type-id='type-id-2' id='type-id-70'/> + <array-type-def dimensions='1' type-id='type-id-74' size-in-bits='1024' id='type-id-75'> + <subrange length='16' type-id='type-id-2' id='type-id-76'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-71' size-in-bits='256' id='type-id-72'> - <subrange length='32' type-id='type-id-2' id='type-id-73'/> + <array-type-def dimensions='1' type-id='type-id-77' size-in-bits='256' id='type-id-78'> + <subrange length='32' type-id='type-id-2' id='type-id-79'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='2048' id='type-id-74'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='2048' id='type-id-80'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='520' id='type-id-76'> - <subrange length='65' type-id='type-id-2' id='type-id-77'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='520' id='type-id-82'> + <subrange length='65' type-id='type-id-2' id='type-id-83'/> </array-type-def> - <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/> - <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-79'/> - <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='512' id='type-id-80'> - <subrange length='16' type-id='type-id-2' id='type-id-70'/> + <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-84'/> + <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-85'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='512' id='type-id-86'> + <subrange length='16' type-id='type-id-2' id='type-id-76'/> </array-type-def> - <typedef-decl name='DIR' type-id='type-id-78' filepath='/usr/include/dirent.h' line='127' column='1' id='type-id-81'/> - <class-decl name='posix_spawnattr_t' size-in-bits='2688' is-struct='yes' naming-typedef-id='type-id-82' visibility='default' filepath='/usr/include/spawn.h' line='29' column='1' id='type-id-83'> + <typedef-decl name='DIR' type-id='type-id-84' filepath='/usr/include/dirent.h' line='127' column='1' id='type-id-87'/> + <class-decl name='posix_spawnattr_t' size-in-bits='2688' is-struct='yes' naming-typedef-id='type-id-88' visibility='default' filepath='/usr/include/spawn.h' line='29' column='1' id='type-id-89'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__flags' type-id='type-id-84' visibility='default' filepath='/usr/include/spawn.h' line='31' column='1'/> + <var-decl name='__flags' type-id='type-id-90' 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-85' visibility='default' filepath='/usr/include/spawn.h' line='32' column='1'/> + <var-decl name='__pgrp' type-id='type-id-91' 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-86' visibility='default' filepath='/usr/include/spawn.h' line='33' column='1'/> + <var-decl name='__sd' type-id='type-id-92' 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-86' visibility='default' filepath='/usr/include/spawn.h' line='34' column='1'/> + <var-decl name='__ss' type-id='type-id-92' 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-87' visibility='default' filepath='/usr/include/spawn.h' line='35' column='1'/> + <var-decl name='__sp' type-id='type-id-93' 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-80' visibility='default' filepath='/usr/include/spawn.h' line='37' column='1'/> + <var-decl name='__pad' type-id='type-id-86' 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-83' filepath='/usr/include/spawn.h' line='38' column='1' id='type-id-82'/> - <class-decl name='posix_spawn_file_actions_t' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-88' visibility='default' filepath='/usr/include/spawn.h' line='43' column='1' id='type-id-89'> + <typedef-decl name='posix_spawnattr_t' type-id='type-id-89' filepath='/usr/include/spawn.h' line='38' column='1' id='type-id-88'/> + <class-decl name='posix_spawn_file_actions_t' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-94' visibility='default' filepath='/usr/include/spawn.h' line='43' column='1' id='type-id-95'> <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> @@ -2384,58 +2397,58 @@ <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-90' visibility='default' filepath='/usr/include/spawn.h' line='47' column='1'/> + <var-decl name='__actions' type-id='type-id-96' 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-80' visibility='default' filepath='/usr/include/spawn.h' line='48' column='1'/> + <var-decl name='__pad' type-id='type-id-86' 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-89' filepath='/usr/include/spawn.h' line='49' column='1' id='type-id-88'/> - <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-68'/> - <class-decl name='cpu_set_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-91' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='39' column='1' id='type-id-92'> + <typedef-decl name='posix_spawn_file_actions_t' type-id='type-id-95' filepath='/usr/include/spawn.h' line='49' column='1' id='type-id-94'/> + <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-74'/> + <class-decl name='cpu_set_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-97' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='39' column='1' id='type-id-98'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__bits' type-id='type-id-69' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='41' column='1'/> + <var-decl name='__bits' type-id='type-id-75' 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-92' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='42' column='1' id='type-id-91'/> - <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-93'> + <typedef-decl name='cpu_set_t' type-id='type-id-98' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='42' column='1' id='type-id-97'/> + <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-99'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='d_ino' type-id='type-id-94' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='28' column='1'/> + <var-decl name='d_ino' type-id='type-id-100' 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'/> + <var-decl name='d_off' type-id='type-id-21' 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'/> + <var-decl name='d_reclen' type-id='type-id-28' 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-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='32' column='1'/> + <var-decl name='d_type' type-id='type-id-101' 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-74' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='33' column='1'/> + <var-decl name='d_name' type-id='type-id-80' 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-96'> + <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-102'> <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'/> + <var-decl name='ws_row' type-id='type-id-28' 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'/> + <var-decl name='ws_col' type-id='type-id-28' 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'/> + <var-decl name='ws_xpixel' type-id='type-id-28' 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'/> + <var-decl name='ws_ypixel' type-id='type-id-28' 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-97'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='__priority_which' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='187' column='1' id='type-id-103'> + <underlying-type type-id='type-id-43'/> <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-98'> + <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-104'> <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> @@ -2443,22 +2456,22 @@ <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-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='41' column='1'/> + <var-decl name='f_blocks' type-id='type-id-105' 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-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='42' column='1'/> + <var-decl name='f_bfree' type-id='type-id-105' 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-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='43' column='1'/> + <var-decl name='f_bavail' type-id='type-id-105' 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-100' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='44' column='1'/> + <var-decl name='f_files' type-id='type-id-106' 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-100' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='45' column='1'/> + <var-decl name='f_ffree' type-id='type-id-106' 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-100' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='46' column='1'/> + <var-decl name='f_favail' type-id='type-id-106' 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'/> @@ -2470,155 +2483,155 @@ <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-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='54' column='1'/> + <var-decl name='__f_spare' type-id='type-id-107' 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-102'> + <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-108'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='c_iflag' type-id='type-id-103' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='26' column='1'/> + <var-decl name='c_iflag' type-id='type-id-109' 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-103' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='27' column='1'/> + <var-decl name='c_oflag' type-id='type-id-109' 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-103' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='28' column='1'/> + <var-decl name='c_cflag' type-id='type-id-109' 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-103' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='29' column='1'/> + <var-decl name='c_lflag' type-id='type-id-109' 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-71' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='30' column='1'/> + <var-decl name='c_line' type-id='type-id-77' 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-72' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='31' column='1'/> + <var-decl name='c_cc' type-id='type-id-78' 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-104' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='32' column='1'/> + <var-decl name='c_ispeed' type-id='type-id-110' 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-104' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='33' column='1'/> + <var-decl name='c_ospeed' type-id='type-id-110' 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-95' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='23' column='1' id='type-id-71'/> - <typedef-decl name='speed_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='24' column='1' id='type-id-104'/> - <typedef-decl name='tcflag_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='25' column='1' id='type-id-103'/> - <typedef-decl name='__id_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='159' column='1' id='type-id-106'/> - <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-99'/> - <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-100'/> - <typedef-decl name='clock_t' type-id='type-id-107' filepath='/usr/include/x86_64-linux-gnu/bits/types/clock_t.h' line='7' column='1' id='type-id-108'/> - <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-109'> + <typedef-decl name='cc_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='23' column='1' id='type-id-77'/> + <typedef-decl name='speed_t' type-id='type-id-111' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='24' column='1' id='type-id-110'/> + <typedef-decl name='tcflag_t' type-id='type-id-111' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='25' column='1' id='type-id-109'/> + <typedef-decl name='__id_t' type-id='type-id-111' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='159' column='1' id='type-id-112'/> + <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-105'/> + <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-106'/> + <typedef-decl name='clock_t' type-id='type-id-113' filepath='/usr/include/x86_64-linux-gnu/bits/types/clock_t.h' line='7' column='1' id='type-id-114'/> + <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-115'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='it_interval' type-id='type-id-110' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h' line='10' column='1'/> + <var-decl name='it_interval' type-id='type-id-116' 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-110' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h' line='11' column='1'/> + <var-decl name='it_value' type-id='type-id-116' 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-87'> + <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-93'> <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-111' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='27' column='1' id='type-id-112'/> - <typedef-decl name='__priority_which_t' type-id='type-id-97' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='40' column='1' id='type-id-113'/> - <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-114'> + <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-103' 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-108' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='34' column='1'/> + <var-decl name='tms_utime' type-id='type-id-114' 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-108' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='35' column='1'/> + <var-decl name='tms_stime' type-id='type-id-114' 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-108' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='37' column='1'/> + <var-decl name='tms_cutime' type-id='type-id-114' 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-108' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='38' column='1'/> + <var-decl name='tms_cstime' type-id='type-id-114' 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-115' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='64' column='1' id='type-id-116'/> - <typedef-decl name='mode_t' type-id='type-id-117' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='69' column='1' id='type-id-118'/> - <typedef-decl name='uid_t' type-id='type-id-119' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='79' column='1' id='type-id-120'/> - <typedef-decl name='id_t' type-id='type-id-106' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='103' column='1' id='type-id-121'/> - <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-122'> + <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='id_t' type-id='type-id-112' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='103' column='1' id='type-id-127'/> + <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-128'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sysname' type-id='type-id-76' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='51' column='1'/> + <var-decl name='sysname' type-id='type-id-82' 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-76' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='54' column='1'/> + <var-decl name='nodename' type-id='type-id-82' 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-76' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='57' column='1'/> + <var-decl name='release' type-id='type-id-82' 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-76' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='59' column='1'/> + <var-decl name='version' type-id='type-id-82' 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-76' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='62' column='1'/> + <var-decl name='machine' type-id='type-id-82' 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-76' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='67' column='1'/> + <var-decl name='domainname' type-id='type-id-82' 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-123' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='75' column='1' id='type-id-124'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='idtype_t' naming-typedef-id='type-id-129' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='75' column='1' id='type-id-130'> + <underlying-type type-id='type-id-43'/> <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-124' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='79' column='1' id='type-id-123'/> - <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-125'/> - <pointer-type-def type-id='type-id-115' size-in-bits='64' id='type-id-126'/> - <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-127'/> - <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-90'/> - <pointer-type-def type-id='type-id-119' size-in-bits='64' id='type-id-128'/> - <qualified-type-def type-id='type-id-129' restrict='yes' id='type-id-130'/> - <qualified-type-def type-id='type-id-115' 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-91' 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-109' 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-88' const='yes' id='type-id-137'/> + <typedef-decl name='idtype_t' type-id='type-id-130' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='79' column='1' id='type-id-129'/> + <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-131'/> + <pointer-type-def type-id='type-id-121' size-in-bits='64' id='type-id-132'/> + <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-133'/> + <pointer-type-def type-id='type-id-85' size-in-bits='64' id='type-id-96'/> + <pointer-type-def type-id='type-id-125' size-in-bits='64' id='type-id-134'/> + <qualified-type-def type-id='type-id-135' restrict='yes' id='type-id-136'/> + <qualified-type-def type-id='type-id-121' 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-82' 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-87' const='yes' id='type-id-143'/> + <qualified-type-def type-id='type-id-97' const='yes' id='type-id-139'/> + <pointer-type-def type-id='type-id-139' size-in-bits='64' id='type-id-140'/> + <qualified-type-def type-id='type-id-115' const='yes' id='type-id-141'/> + <pointer-type-def type-id='type-id-141' size-in-bits='64' id='type-id-142'/> + <qualified-type-def type-id='type-id-94' 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-86' const='yes' id='type-id-146'/> + <qualified-type-def type-id='type-id-88' 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-102' const='yes' id='type-id-149'/> + <qualified-type-def type-id='type-id-93' 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-96' 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-91' size-in-bits='64' id='type-id-153'/> - <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-154'/> - <pointer-type-def type-id='type-id-112' size-in-bits='64' id='type-id-155'/> - <pointer-type-def type-id='type-id-116' size-in-bits='64' id='type-id-156'/> - <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-157'/> - <pointer-type-def type-id='type-id-85' 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-88' 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-82' 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-87' size-in-bits='64' id='type-id-164'/> - <pointer-type-def type-id='type-id-98' 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-114' size-in-bits='64' id='type-id-167'/> - <pointer-type-def type-id='type-id-120' size-in-bits='64' id='type-id-168'/> - <pointer-type-def type-id='type-id-122' size-in-bits='64' id='type-id-169'/> - <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/> - <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-79'/> - <function-decl name='_PyEval_ReInitThreads' filepath='./Include/internal/pycore_ceval.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <return type-id='type-id-66'/> - </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-66'/> + <qualified-type-def type-id='type-id-150' restrict='yes' id='type-id-151'/> + <qualified-type-def type-id='type-id-92' const='yes' id='type-id-152'/> + <pointer-type-def type-id='type-id-152' size-in-bits='64' id='type-id-153'/> + <qualified-type-def type-id='type-id-153' restrict='yes' id='type-id-154'/> + <qualified-type-def type-id='type-id-108' const='yes' id='type-id-155'/> + <pointer-type-def type-id='type-id-155' size-in-bits='64' id='type-id-156'/> + <qualified-type-def type-id='type-id-102' const='yes' id='type-id-157'/> + <pointer-type-def type-id='type-id-157' size-in-bits='64' id='type-id-158'/> + <pointer-type-def type-id='type-id-97' size-in-bits='64' id='type-id-159'/> + <pointer-type-def type-id='type-id-99' size-in-bits='64' id='type-id-160'/> + <pointer-type-def type-id='type-id-118' size-in-bits='64' id='type-id-161'/> + <pointer-type-def type-id='type-id-122' size-in-bits='64' id='type-id-162'/> + <pointer-type-def type-id='type-id-115' size-in-bits='64' id='type-id-163'/> + <pointer-type-def type-id='type-id-91' 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-94' 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-88' 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-93' size-in-bits='64' id='type-id-170'/> + <pointer-type-def type-id='type-id-104' size-in-bits='64' id='type-id-171'/> + <qualified-type-def type-id='type-id-171' restrict='yes' id='type-id-172'/> + <pointer-type-def type-id='type-id-120' size-in-bits='64' id='type-id-173'/> + <pointer-type-def type-id='type-id-126' size-in-bits='64' id='type-id-174'/> + <pointer-type-def type-id='type-id-128' size-in-bits='64' id='type-id-175'/> + <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-84'/> + <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-85'/> + <function-decl name='_PyEval_ReInitThreads' filepath='./Include/internal/pycore_ceval.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> + <return type-id='type-id-72'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_AfterFork_Child' filepath='./Include/internal/pycore_ceval.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_Py_device_encoding' filepath='./Include/internal/pycore_fileutils.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> @@ -2638,68 +2651,68 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_normpath_and_size' filepath='./Include/internal/pycore_fileutils.h' line='267' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-63'/> + <parameter type-id='type-id-69'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-8'/> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_Py_skiproot' filepath='./Include/internal/pycore_fileutils.h' line='278' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> + <parameter type-id='type-id-25'/> <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='311' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-170'/> + <parameter type-id='type-id-176'/> <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-33'/> + <parameter type-id='type-id-39'/> <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-33'/> + <parameter type-id='type-id-39'/> <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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyOS_URandom' filepath='./Include/internal/pycore_pylifecycle.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-35'/> + <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-41'/> <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='77' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyInterpreterState_DeleteExceptMain' 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-66'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PySignal_AfterFork' filepath='./Include/internal/pycore_pystate.h' line='248' 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='25' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyTime_FromSecondsDouble' filepath='./Include/internal/pycore_time.h' line='136' 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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-180'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_FromTimespec' filepath='./Include/internal/pycore_time.h' line='227' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-174'/> - <parameter type-id='type-id-175'/> + <parameter type-id='type-id-180'/> + <parameter type-id='type-id-181'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyType_AddMethod' filepath='./Include/internal/pycore_typeobject.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-1'/> - <parameter type-id='type-id-176'/> + <parameter type-id='type-id-182'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyOS_BeforeFork' mangled-name='PyOS_BeforeFork' filepath='./Modules/posixmodule.c' line='663' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_BeforeFork'> @@ -2708,92 +2721,92 @@ <function-decl name='PyOS_AfterFork_Parent' mangled-name='PyOS_AfterFork_Parent' filepath='./Modules/posixmodule.c' line='674' 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='694' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork_Child'> + <function-decl name='PyOS_AfterFork_Child' mangled-name='PyOS_AfterFork_Child' filepath='./Modules/posixmodule.c' line='702' 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='776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork'> + <function-decl name='PyOS_AfterFork' mangled-name='PyOS_AfterFork' filepath='./Modules/posixmodule.c' line='786' 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='805' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromGid'> - <parameter type-id='type-id-116' name='gid' filepath='./Modules/posixmodule.c' line='805' column='1'/> + <function-decl name='_PyLong_FromGid' mangled-name='_PyLong_FromGid' filepath='./Modules/posixmodule.c' line='815' 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='815' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_Py_Uid_Converter' mangled-name='_Py_Uid_Converter' filepath='./Modules/posixmodule.c' line='813' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Uid_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='./Modules/posixmodule.c' line='813' column='1'/> - <parameter type-id='type-id-168' name='p' filepath='./Modules/posixmodule.c' line='813' column='1'/> + <function-decl name='_Py_Uid_Converter' mangled-name='_Py_Uid_Converter' filepath='./Modules/posixmodule.c' line='823' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Uid_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='./Modules/posixmodule.c' line='823' column='1'/> + <parameter type-id='type-id-174' name='p' filepath='./Modules/posixmodule.c' line='823' 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='919' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Gid_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='./Modules/posixmodule.c' line='919' column='1'/> - <parameter type-id='type-id-156' name='p' filepath='./Modules/posixmodule.c' line='919' column='1'/> + <function-decl name='_Py_Gid_Converter' mangled-name='_Py_Gid_Converter' filepath='./Modules/posixmodule.c' line='929' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Gid_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='./Modules/posixmodule.c' line='929' column='1'/> + <parameter type-id='type-id-162' name='p' filepath='./Modules/posixmodule.c' line='929' 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-4'/> - <return type-id='type-id-125'/> + <return type-id='type-id-131'/> </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-125'/> + <return type-id='type-id-131'/> </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-125'/> + <parameter type-id='type-id-131'/> <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-125'/> + <parameter type-id='type-id-131'/> <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-132'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-138'/> <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-4'/> - <parameter type-id='type-id-115'/> - <parameter type-id='type-id-126'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-121'/> + <parameter type-id='type-id-132'/> + <parameter type-id='type-id-183'/> <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-4'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-121'/> <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'/> + <parameter type-id='type-id-183'/> + <parameter type-id='type-id-183'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-156'/> + <parameter type-id='type-id-158'/> <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'/> + <parameter type-id='type-id-183'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-156'/> + <parameter type-id='type-id-158'/> <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-178'/> - <parameter type-id='type-id-144'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-150'/> <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-178'/> - <parameter type-id='type-id-164'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-170'/> <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-178'/> + <parameter type-id='type-id-184'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-144'/> + <parameter type-id='type-id-150'/> <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-178'/> + <parameter type-id='type-id-184'/> <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'> @@ -2805,117 +2818,117 @@ <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-178'/> - <parameter type-id='type-id-179'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-185'/> <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-178'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-134'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-140'/> <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-178'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-153'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-159'/> <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-178'/> + <parameter type-id='type-id-184'/> <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-57'/> + <parameter type-id='type-id-63'/> <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-180'/> - <parameter type-id='type-id-139'/> - <parameter type-id='type-id-142'/> - <parameter type-id='type-id-130'/> - <parameter type-id='type-id-130'/> + <parameter type-id='type-id-165'/> + <parameter type-id='type-id-15'/> + <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-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-164'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-138'/> - <parameter type-id='type-id-141'/> - <parameter type-id='type-id-129'/> - <parameter type-id='type-id-129'/> + <parameter type-id='type-id-144'/> + <parameter type-id='type-id-147'/> + <parameter type-id='type-id-135'/> + <parameter type-id='type-id-135'/> <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'/> + <parameter type-id='type-id-168'/> <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'/> + <parameter type-id='type-id-168'/> <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'/> + <parameter type-id='type-id-169'/> + <parameter type-id='type-id-154'/> <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'/> + <parameter type-id='type-id-169'/> + <parameter type-id='type-id-154'/> <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-84'/> + <parameter type-id='type-id-168'/> + <parameter type-id='type-id-90'/> <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-85'/> + <parameter type-id='type-id-168'/> + <parameter type-id='type-id-91'/> <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-168'/> <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'/> + <parameter type-id='type-id-169'/> + <parameter type-id='type-id-151'/> <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'/> + <parameter type-id='type-id-166'/> <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'/> + <parameter type-id='type-id-166'/> <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-167'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-180'/> + <parameter type-id='type-id-15'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-118'/> + <parameter type-id='type-id-124'/> <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-166'/> <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-166'/> <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-166'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> @@ -2932,8 +2945,8 @@ <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'/> + <parameter type-id='type-id-24'/> + <return type-id='type-id-24'/> </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-4'/> @@ -2961,24 +2974,24 @@ </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'/> + <return type-id='type-id-24'/> </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'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> <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-181'/> + <parameter type-id='type-id-186'/> <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-182'/> - <parameter type-id='type-id-180'/> - <parameter type-id='type-id-183'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-187'/> + <return type-id='type-id-24'/> </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'/> @@ -2988,37 +3001,37 @@ <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'/> + <parameter type-id='type-id-183'/> <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-183'/> <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-4'/> - <parameter type-id='type-id-119'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-121'/> <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-119'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-121'/> <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-4'/> - <parameter type-id='type-id-119'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-121'/> <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-4'/> - <parameter type-id='type-id-119'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-121'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> @@ -3043,19 +3056,19 @@ </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-4'/> - <parameter type-id='type-id-129'/> - <parameter type-id='type-id-129'/> + <parameter type-id='type-id-135'/> + <parameter type-id='type-id-135'/> <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-129'/> - <parameter type-id='type-id-129'/> + <parameter type-id='type-id-135'/> + <parameter type-id='type-id-135'/> <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-4'/> - <parameter type-id='type-id-129'/> + <parameter type-id='type-id-135'/> <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'> @@ -3065,109 +3078,109 @@ <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-4'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </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-184'/> + <return type-id='type-id-188'/> </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-178'/> + <return type-id='type-id-184'/> </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-178'/> - <return type-id='type-id-178'/> + <parameter type-id='type-id-184'/> + <return type-id='type-id-184'/> </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-178'/> - <parameter type-id='type-id-178'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-184'/> <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-178'/> + <return type-id='type-id-184'/> </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-178'/> - <return type-id='type-id-178'/> + <parameter type-id='type-id-184'/> + <return type-id='type-id-184'/> </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-119'/> + <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-119'/> + <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-115'/> + <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-115'/> + <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-5'/> - <parameter type-id='type-id-126'/> + <parameter type-id='type-id-132'/> <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-119'/> + <parameter type-id='type-id-125'/> <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-119'/> - <parameter type-id='type-id-119'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-125'/> <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-119'/> + <parameter type-id='type-id-125'/> <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-115'/> + <parameter type-id='type-id-121'/> <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-115'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-121'/> + <parameter type-id='type-id-121'/> <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-115'/> + <parameter type-id='type-id-121'/> <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-128'/> - <parameter type-id='type-id-128'/> - <parameter type-id='type-id-128'/> + <parameter type-id='type-id-134'/> + <parameter type-id='type-id-134'/> + <parameter type-id='type-id-134'/> <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-126'/> - <parameter type-id='type-id-126'/> - <parameter type-id='type-id-126'/> + <parameter type-id='type-id-132'/> + <parameter type-id='type-id-132'/> + <parameter type-id='type-id-132'/> <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-119'/> - <parameter type-id='type-id-119'/> - <parameter type-id='type-id-119'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-125'/> <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-115'/> - <parameter type-id='type-id-115'/> - <parameter type-id='type-id-115'/> + <parameter type-id='type-id-121'/> + <parameter type-id='type-id-121'/> + <parameter type-id='type-id-121'/> <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-178'/> + <return type-id='type-id-184'/> </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'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> <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'> @@ -3191,10 +3204,10 @@ </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-180'/> - <parameter type-id='type-id-182'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-4'/> @@ -3212,16 +3225,16 @@ </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-178'/> + <return type-id='type-id-184'/> </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-178'/> + <parameter type-id='type-id-184'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='getlogin_r' filepath='/usr/include/unistd.h' line='889' 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-24'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='chroot' filepath='/usr/include/unistd.h' line='977' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -3237,12 +3250,12 @@ </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-127'/> + <parameter type-id='type-id-133'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-105'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-133'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-111'/> + <return type-id='type-id-189'/> </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'/> @@ -3253,30 +3266,30 @@ <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-134'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-140'/> <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'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-159'/> </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'/> + <parameter type-id='type-id-159'/> <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-127'/> + <parameter type-id='type-id-133'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-105'/> - <return type-id='type-id-186'/> + <parameter type-id='type-id-133'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-111'/> + <return type-id='type-id-190'/> </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-4'/> - <parameter type-id='type-id-105'/> + <parameter type-id='type-id-111'/> <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'> @@ -3289,241 +3302,241 @@ <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-105'/> + <parameter type-id='type-id-111'/> <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'/> + <parameter type-id='type-id-161'/> <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-112'/> + <parameter type-id='type-id-118'/> <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-113'/> - <parameter type-id='type-id-121'/> + <parameter type-id='type-id-119'/> + <parameter type-id='type-id-127'/> <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-113'/> - <parameter type-id='type-id-121'/> + <parameter type-id='type-id-119'/> + <parameter type-id='type-id-127'/> <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-4'/> - <parameter type-id='type-id-117'/> + <parameter type-id='type-id-123'/> <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-117'/> + <parameter type-id='type-id-123'/> <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-4'/> - <parameter type-id='type-id-117'/> + <parameter type-id='type-id-123'/> <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-117'/> - <return type-id='type-id-117'/> + <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-4'/> - <parameter type-id='type-id-117'/> + <parameter type-id='type-id-123'/> <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-4'/> - <parameter type-id='type-id-117'/> + <parameter type-id='type-id-123'/> <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-4'/> - <parameter type-id='type-id-117'/> - <parameter type-id='type-id-187'/> + <parameter type-id='type-id-123'/> + <parameter type-id='type-id-191'/> <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-4'/> - <parameter type-id='type-id-117'/> - <parameter type-id='type-id-187'/> + <parameter type-id='type-id-123'/> + <parameter type-id='type-id-191'/> <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-4'/> - <parameter type-id='type-id-117'/> + <parameter type-id='type-id-123'/> <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-4'/> - <parameter type-id='type-id-117'/> + <parameter type-id='type-id-123'/> <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-4'/> - <parameter type-id='type-id-175'/> + <parameter type-id='type-id-181'/> <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'/> + <parameter type-id='type-id-181'/> <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-187'/> - <return type-id='type-id-105'/> + <parameter type-id='type-id-191'/> + <return type-id='type-id-111'/> </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-105'/> + <parameter type-id='type-id-191'/> + <return type-id='type-id-111'/> </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-105'/> - <parameter type-id='type-id-105'/> - <return type-id='type-id-187'/> + <parameter type-id='type-id-111'/> + <parameter type-id='type-id-111'/> + <return type-id='type-id-191'/> </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-188'/> + <parameter type-id='type-id-192'/> <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'/> + <parameter type-id='type-id-142'/> + <parameter type-id='type-id-163'/> <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'/> + <parameter type-id='type-id-163'/> <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-108'/> + <parameter type-id='type-id-173'/> + <return type-id='type-id-114'/> </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-189'/> + <parameter type-id='type-id-193'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-185'/> + <return type-id='type-id-189'/> </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-189'/> + <parameter type-id='type-id-193'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-185'/> + <return type-id='type-id-189'/> </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'/> + <parameter type-id='type-id-175'/> <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-178'/> + <parameter type-id='type-id-183'/> + <return type-id='type-id-184'/> </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-178'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-178'/> + <return type-id='type-id-184'/> </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-123'/> - <parameter type-id='type-id-106'/> - <parameter type-id='type-id-190'/> + <parameter type-id='type-id-129'/> + <parameter type-id='type-id-112'/> + <parameter type-id='type-id-194'/> <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-183'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-191'/> - <return type-id='type-id-178'/> + <parameter type-id='type-id-195'/> + <return type-id='type-id-184'/> </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-178'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-184'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-191'/> - <return type-id='type-id-178'/> + <parameter type-id='type-id-195'/> + <return type-id='type-id-184'/> </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-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-4'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-4'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-4'/> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-4'/> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-185'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-4'/> @@ -3542,33 +3555,33 @@ </function-decl> </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-192'> + <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-196'> <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'/> + <var-decl name='pw_name' type-id='type-id-24' 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'/> + <var-decl name='pw_passwd' type-id='type-id-24' 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-119' visibility='default' filepath='/usr/include/pwd.h' line='54' column='1'/> + <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-115' visibility='default' filepath='/usr/include/pwd.h' line='55' column='1'/> + <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-17' visibility='default' filepath='/usr/include/pwd.h' line='56' column='1'/> + <var-decl name='pw_gecos' type-id='type-id-24' 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'/> + <var-decl name='pw_dir' type-id='type-id-24' 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'/> + <var-decl name='pw_shell' type-id='type-id-24' visibility='default' filepath='/usr/include/pwd.h' line='58' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-192' size-in-bits='64' id='type-id-193'/> - <qualified-type-def type-id='type-id-193' restrict='yes' id='type-id-194'/> - <pointer-type-def type-id='type-id-193' size-in-bits='64' id='type-id-195'/> - <qualified-type-def type-id='type-id-195' restrict='yes' id='type-id-196'/> + <pointer-type-def type-id='type-id-196' size-in-bits='64' id='type-id-197'/> + <qualified-type-def type-id='type-id-197' restrict='yes' id='type-id-198'/> + <pointer-type-def type-id='type-id-197' size-in-bits='64' id='type-id-199'/> + <qualified-type-def type-id='type-id-199' restrict='yes' id='type-id-200'/> <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> @@ -3576,107 +3589,107 @@ <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-193'/> + <return type-id='type-id-197'/> </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-119'/> - <parameter type-id='type-id-194'/> - <parameter type-id='type-id-182'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-196'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-198'/> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-200'/> <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-180'/> - <parameter type-id='type-id-194'/> - <parameter type-id='type-id-182'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-196'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-198'/> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-200'/> <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-197'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='__itimer_which' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='114' column='1' id='type-id-201'> + <underlying-type type-id='type-id-43'/> <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-198'> + <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-202'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='it_interval' type-id='type-id-199' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='133' column='1'/> + <var-decl name='it_interval' type-id='type-id-203' 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-199' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='135' column='1'/> + <var-decl name='it_value' type-id='type-id-203' 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-197' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='141' column='1' id='type-id-200'/> - <qualified-type-def type-id='type-id-198' const='yes' id='type-id-201'/> - <pointer-type-def type-id='type-id-201' size-in-bits='64' id='type-id-202'/> - <qualified-type-def type-id='type-id-202' restrict='yes' id='type-id-203'/> - <qualified-type-def type-id='type-id-177' restrict='yes' id='type-id-204'/> - <pointer-type-def type-id='type-id-198' size-in-bits='64' id='type-id-205'/> - <qualified-type-def type-id='type-id-205' restrict='yes' id='type-id-206'/> - <qualified-type-def type-id='type-id-190' restrict='yes' id='type-id-207'/> - <function-decl name='_PyEval_SignalReceived' filepath='./Include/internal/pycore_ceval.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <typedef-decl name='__itimer_which_t' type-id='type-id-201' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='141' column='1' id='type-id-204'/> + <qualified-type-def type-id='type-id-202' const='yes' id='type-id-205'/> + <pointer-type-def type-id='type-id-205' size-in-bits='64' id='type-id-206'/> + <qualified-type-def type-id='type-id-206' restrict='yes' id='type-id-207'/> + <qualified-type-def type-id='type-id-183' restrict='yes' id='type-id-208'/> + <pointer-type-def type-id='type-id-202' size-in-bits='64' id='type-id-209'/> + <qualified-type-def type-id='type-id-209' restrict='yes' id='type-id-210'/> + <qualified-type-def type-id='type-id-194' restrict='yes' id='type-id-211'/> + <function-decl name='_PyEval_SignalReceived' filepath='./Include/internal/pycore_ceval.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyRunRemoteDebugger' filepath='./Include/internal/pycore_ceval.h' line='363' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyRunRemoteDebugger' filepath='./Include/internal/pycore_ceval.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <return type-id='type-id-5'/> </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-120'/> + <parameter type-id='type-id-126'/> <return type-id='type-id-6'/> </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-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PySignal_SetWakeupFd' mangled-name='PySignal_SetWakeupFd' filepath='./Modules/signalmodule.c' line='835' 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='835' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyErr_SetInterruptEx' mangled-name='PyErr_SetInterruptEx' filepath='./Modules/signalmodule.c' line='1895' 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='1895' column='1'/> + <function-decl name='PyErr_SetInterruptEx' mangled-name='PyErr_SetInterruptEx' filepath='./Modules/signalmodule.c' line='1901' 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='1901' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyErr_SetInterrupt' mangled-name='PyErr_SetInterrupt' filepath='./Modules/signalmodule.c' line='1911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetInterrupt'> + <function-decl name='PyErr_SetInterrupt' mangled-name='PyErr_SetInterrupt' filepath='./Modules/signalmodule.c' line='1917' 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='1949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_RestoreSignals'> + <function-decl name='_Py_RestoreSignals' mangled-name='_Py_RestoreSignals' filepath='./Modules/signalmodule.c' line='1955' 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='2021' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_InterruptOccurred'> + <function-decl name='PyOS_InterruptOccurred' mangled-name='PyOS_InterruptOccurred' filepath='./Modules/signalmodule.c' line='2027' 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='2054' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_IsMainThread'> + <function-decl name='_PyOS_IsMainThread' mangled-name='_PyOS_IsMainThread' filepath='./Modules/signalmodule.c' line='2060' 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-153'/> <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-57'/> + <parameter type-id='type-id-63'/> <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-204'/> + <parameter type-id='type-id-154'/> + <parameter type-id='type-id-208'/> <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-207'/> + <parameter type-id='type-id-154'/> + <parameter type-id='type-id-211'/> <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-207'/> - <parameter type-id='type-id-208'/> + <parameter type-id='type-id-154'/> + <parameter type-id='type-id-211'/> + <parameter type-id='type-id-212'/> <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'> @@ -3687,26 +3700,26 @@ </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'/> + <return type-id='type-id-24'/> </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-105'/> - <return type-id='type-id-105'/> + <parameter type-id='type-id-111'/> + <return type-id='type-id-111'/> </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-32'/> + <parameter type-id='type-id-38'/> <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-200'/> - <parameter type-id='type-id-205'/> + <parameter type-id='type-id-204'/> + <parameter type-id='type-id-209'/> <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-200'/> - <parameter type-id='type-id-203'/> - <parameter type-id='type-id-206'/> + <parameter type-id='type-id-204'/> + <parameter type-id='type-id-207'/> + <parameter type-id='type-id-210'/> <return type-id='type-id-5'/> </function-decl> </abi-instr> @@ -3715,64 +3728,61 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> - <return type-id='type-id-210'/> + <parameter type-id='type-id-213'/> + <return type-id='type-id-214'/> </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_runtime_structs.h' line='89' column='1' id='type-id-212'> + <class-decl name='_PyTimeFraction' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-215' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='89' column='1' id='type-id-216'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='numer' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='90' column='1'/> + <var-decl name='numer' type-id='type-id-34' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='90' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='denom' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='91' column='1'/> + <var-decl name='denom' type-id='type-id-34' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='91' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyTimeFraction' type-id='type-id-212' filepath='./Include/internal/pycore_runtime_structs.h' line='92' column='1' id='type-id-211'/> - <pointer-type-def type-id='type-id-211' size-in-bits='64' id='type-id-213'/> - <pointer-type-def type-id='type-id-188' size-in-bits='64' id='type-id-214'/> - <qualified-type-def type-id='type-id-211' 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-217' const='yes' id='type-id-218'/> - <pointer-type-def type-id='type-id-218' size-in-bits='64' id='type-id-219'/> - <qualified-type-def type-id='type-id-219' restrict='yes' id='type-id-220'/> + <typedef-decl name='_PyTimeFraction' type-id='type-id-216' filepath='./Include/internal/pycore_runtime_structs.h' line='92' column='1' id='type-id-215'/> + <pointer-type-def type-id='type-id-215' size-in-bits='64' id='type-id-217'/> + <pointer-type-def type-id='type-id-192' size-in-bits='64' id='type-id-218'/> + <qualified-type-def type-id='type-id-215' const='yes' id='type-id-219'/> + <pointer-type-def type-id='type-id-219' size-in-bits='64' id='type-id-220'/> <function-decl name='_PyTime_FromTimeval' filepath='./Include/internal/pycore_time.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-174'/> + <parameter type-id='type-id-180'/> <parameter type-id='type-id-221'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_TimeWithInfo' filepath='./Include/internal/pycore_time.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-174'/> + <parameter type-id='type-id-180'/> <parameter type-id='type-id-222'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_PerfCounterWithInfo' filepath='./Include/internal/pycore_time.h' line='291' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-174'/> + <parameter type-id='type-id-180'/> <parameter type-id='type-id-222'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTimeFraction_Set' filepath='./Include/internal/pycore_time.h' line='314' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-213'/> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-28'/> + <parameter type-id='type-id-217'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-34'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTimeFraction_Mul' filepath='./Include/internal/pycore_time.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-216'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-220'/> + <return type-id='type-id-34'/> </function-decl> <function-decl name='_PyTimeFraction_Resolution' filepath='./Include/internal/pycore_time.h' line='326' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-216'/> - <return type-id='type-id-172'/> + <parameter type-id='type-id-220'/> + <return type-id='type-id-178'/> </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-32'/> - <parameter type-id='type-id-214'/> + <parameter type-id='type-id-38'/> + <parameter type-id='type-id-218'/> <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-108'/> + <return type-id='type-id-114'/> </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-223'/> @@ -3787,22 +3797,22 @@ </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-226'/> - <parameter type-id='type-id-175'/> + <parameter type-id='type-id-181'/> <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-226'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-175'/> - <parameter type-id='type-id-179'/> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-185'/> <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-220'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-12'/> + <return type-id='type-id-14'/> </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'> @@ -3816,15 +3826,15 @@ <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-4'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </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-231'/> - <parameter type-id='type-id-180'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-15'/> + <return type-id='type-id-41'/> </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'/> + <return type-id='type-id-24'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='./Python/getplatform.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> @@ -3842,7 +3852,7 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-233'/> </function-decl> <function-type size-in-bits='64' id='type-id-234'> @@ -3852,57 +3862,57 @@ <abi-instr address-size='64' path='./Python/sysmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> <typedef-decl name='Py_AuditHookFunction' type-id='type-id-235' filepath='./Include/cpython/audit.h' line='6' column='1' id='type-id-236'/> <pointer-type-def type-id='type-id-237' size-in-bits='64' id='type-id-235'/> - <function-decl name='_PyEval_SetSwitchInterval' filepath='./Include/internal/pycore_ceval.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_SetSwitchInterval' filepath='./Include/internal/pycore_ceval.h' line='38' 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='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_GetSwitchInterval' filepath='./Include/internal/pycore_ceval.h' line='39' 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='70' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_CallTracing' filepath='./Include/internal/pycore_ceval.h' line='72' 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-6'/> </function-decl> - <function-decl name='_PyEval_GetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_GetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_GetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_GetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_SetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_SetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='79' 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='_PyEval_SetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_SetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='80' 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='_PyEval_GetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_GetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='84' 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='83' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_SetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='85' 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'> + <function-decl name='_PyPerfTrampoline_GetCallbacks' filepath='./Include/internal/pycore_ceval.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-238'/> <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'> + <function-decl name='_PyIsPerfTrampolineActive' filepath='./Include/internal/pycore_ceval.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_GetDLOpenFlags' filepath='./Include/internal/pycore_import.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_SetDLOpenFlags' filepath='./Include/internal/pycore_import.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyImport_GetBuiltinModuleNames' filepath='./Include/internal/pycore_import.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -3917,14 +3927,14 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyObject_DebugTypeStats' filepath='./Include/internal/pycore_object.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <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='_PyDumpExecutors' filepath='./Include/internal/pycore_optimizer.h' line='310' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-5'/> </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'> @@ -3936,23 +3946,23 @@ <parameter type-id='type-id-242'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_Py_GetStdlibDir' filepath='./Include/internal/pycore_pylifecycle.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-63'/> + <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-69'/> </function-decl> - <function-decl name='_PyErr_WriteUnraisableDefaultHook' filepath='./Include/internal/pycore_pylifecycle.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_Py_gitidentifier' filepath='./Include/internal/pycore_pylifecycle.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-4'/> </function-decl> - <function-decl name='_Py_gitversion' filepath='./Include/internal/pycore_pylifecycle.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-4'/> </function-decl> - <function-decl name='_PyMem_DefaultRawCalloc' filepath='./Include/internal/pycore_pymem.h' line='82' 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-35'/> + <function-decl name='_PyMem_DefaultRawCalloc' filepath='./Include/internal/pycore_pymem.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_PyThread_CurrentExceptions' filepath='./Include/internal/pycore_pystate.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> @@ -3999,75 +4009,75 @@ </function-decl> <function-decl name='PySys_AddAuditHook' mangled-name='PySys_AddAuditHook' filepath='./Python/sysmodule.c' line='468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddAuditHook'> <parameter type-id='type-id-236' name='hook' filepath='./Python/sysmodule.c' line='468' column='1'/> - <parameter type-id='type-id-35' name='userData' filepath='./Python/sysmodule.c' line='468' column='1'/> + <parameter type-id='type-id-41' name='userData' filepath='./Python/sysmodule.c' line='468' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PySys_GetSizeOf' mangled-name='_PySys_GetSizeOf' filepath='./Python/sysmodule.c' line='1922' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetSizeOf'> - <parameter type-id='type-id-6' name='o' filepath='./Python/sysmodule.c' line='1922' column='1'/> - <return type-id='type-id-21'/> + <function-decl name='_PySys_GetSizeOf' mangled-name='_PySys_GetSizeOf' filepath='./Python/sysmodule.c' line='1925' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetSizeOf'> + <parameter type-id='type-id-6' name='o' filepath='./Python/sysmodule.c' line='1925' column='1'/> + <return type-id='type-id-14'/> </function-decl> - <function-decl name='PyUnstable_PerfMapState_Init' mangled-name='PyUnstable_PerfMapState_Init' filepath='./Python/sysmodule.c' line='2665' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfMapState_Init'> + <function-decl name='PyUnstable_PerfMapState_Init' mangled-name='PyUnstable_PerfMapState_Init' filepath='./Python/sysmodule.c' line='2709' 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='2696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_WritePerfMapEntry'> - <parameter type-id='type-id-35' name='code_addr' filepath='./Python/sysmodule.c' line='2697' column='1'/> - <parameter type-id='type-id-105' name='code_size' filepath='./Python/sysmodule.c' line='2698' column='1'/> - <parameter type-id='type-id-4' name='entry_name' filepath='./Python/sysmodule.c' line='2699' column='1'/> + <function-decl name='PyUnstable_WritePerfMapEntry' mangled-name='PyUnstable_WritePerfMapEntry' filepath='./Python/sysmodule.c' line='2740' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_WritePerfMapEntry'> + <parameter type-id='type-id-41' name='code_addr' filepath='./Python/sysmodule.c' line='2741' column='1'/> + <parameter type-id='type-id-111' name='code_size' filepath='./Python/sysmodule.c' line='2742' column='1'/> + <parameter type-id='type-id-4' name='entry_name' filepath='./Python/sysmodule.c' line='2743' 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='2716' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfMapState_Fini'> + <function-decl name='PyUnstable_PerfMapState_Fini' mangled-name='PyUnstable_PerfMapState_Fini' filepath='./Python/sysmodule.c' line='2760' 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='2731' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_CopyPerfMapFile'> - <parameter type-id='type-id-4' name='parent_filename' filepath='./Python/sysmodule.c' line='2731' column='1'/> + <function-decl name='PyUnstable_CopyPerfMapFile' mangled-name='PyUnstable_CopyPerfMapFile' filepath='./Python/sysmodule.c' line='2775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_CopyPerfMapFile'> + <parameter type-id='type-id-4' name='parent_filename' filepath='./Python/sysmodule.c' line='2775' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PySys_ResetWarnOptions' mangled-name='PySys_ResetWarnOptions' filepath='./Python/sysmodule.c' line='3040' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_ResetWarnOptions'> + <function-decl name='PySys_ResetWarnOptions' mangled-name='PySys_ResetWarnOptions' filepath='./Python/sysmodule.c' line='3085' 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='3077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOptionUnicode'> - <parameter type-id='type-id-6' name='option' filepath='./Python/sysmodule.c' line='3077' column='1'/> + <function-decl name='PySys_AddWarnOptionUnicode' mangled-name='PySys_AddWarnOptionUnicode' filepath='./Python/sysmodule.c' line='3122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOptionUnicode'> + <parameter type-id='type-id-6' name='option' filepath='./Python/sysmodule.c' line='3122' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PySys_AddWarnOption' mangled-name='PySys_AddWarnOption' filepath='./Python/sysmodule.c' line='3090' 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='3090' column='1'/> + <function-decl name='PySys_AddWarnOption' mangled-name='PySys_AddWarnOption' filepath='./Python/sysmodule.c' line='3135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOption'> + <parameter type-id='type-id-25' name='s' filepath='./Python/sysmodule.c' line='3135' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PySys_HasWarnOptions' mangled-name='PySys_HasWarnOptions' filepath='./Python/sysmodule.c' line='3110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_HasWarnOptions'> + <function-decl name='PySys_HasWarnOptions' mangled-name='PySys_HasWarnOptions' filepath='./Python/sysmodule.c' line='3155' 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='3200' 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='3200' column='1'/> + <function-decl name='PySys_AddXOption' mangled-name='PySys_AddXOption' filepath='./Python/sysmodule.c' line='3245' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddXOption'> + <parameter type-id='type-id-25' name='s' filepath='./Python/sysmodule.c' line='3245' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PySys_GetXOptions' mangled-name='PySys_GetXOptions' filepath='./Python/sysmodule.c' line='3214' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_GetXOptions'> + <function-decl name='PySys_GetXOptions' mangled-name='PySys_GetXOptions' filepath='./Python/sysmodule.c' line='3259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_GetXOptions'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_Py_CreateMonitoringObject' filepath='./Python/sysmodule.c' line='4005' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_Py_CreateMonitoringObject' filepath='./Python/sysmodule.c' line='4050' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PySys_SetPath' mangled-name='PySys_SetPath' filepath='./Python/sysmodule.c' line='4206' 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='4206' column='1'/> + <function-decl name='PySys_SetPath' mangled-name='PySys_SetPath' filepath='./Python/sysmodule.c' line='4251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetPath'> + <parameter type-id='type-id-25' name='path' filepath='./Python/sysmodule.c' line='4251' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PySys_SetArgvEx' mangled-name='PySys_SetArgvEx' filepath='./Python/sysmodule.c' line='4238' 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='4238' column='1'/> - <parameter type-id='type-id-244' name='argv' filepath='./Python/sysmodule.c' line='4238' column='1'/> - <parameter type-id='type-id-5' name='updatepath' filepath='./Python/sysmodule.c' line='4238' column='1'/> + <function-decl name='PySys_SetArgvEx' mangled-name='PySys_SetArgvEx' filepath='./Python/sysmodule.c' line='4283' 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='4283' column='1'/> + <parameter type-id='type-id-244' name='argv' filepath='./Python/sysmodule.c' line='4283' column='1'/> + <parameter type-id='type-id-5' name='updatepath' filepath='./Python/sysmodule.c' line='4283' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PySys_SetArgv' mangled-name='PySys_SetArgv' filepath='./Python/sysmodule.c' line='4285' 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='4285' column='1'/> - <parameter type-id='type-id-244' name='argv' filepath='./Python/sysmodule.c' line='4285' column='1'/> + <function-decl name='PySys_SetArgv' mangled-name='PySys_SetArgv' filepath='./Python/sysmodule.c' line='4330' 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='4330' column='1'/> + <parameter type-id='type-id-244' name='argv' filepath='./Python/sysmodule.c' line='4330' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PySys_WriteStdout' mangled-name='PySys_WriteStdout' filepath='./Python/sysmodule.c' line='4381' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_WriteStdout'> - <parameter type-id='type-id-4' name='format' filepath='./Python/sysmodule.c' line='4381' column='1'/> + <function-decl name='PySys_WriteStdout' mangled-name='PySys_WriteStdout' filepath='./Python/sysmodule.c' line='4426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_WriteStdout'> + <parameter type-id='type-id-4' name='format' filepath='./Python/sysmodule.c' line='4426' 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='4424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_FormatStdout'> - <parameter type-id='type-id-4' name='format' filepath='./Python/sysmodule.c' line='4424' column='1'/> + <function-decl name='PySys_FormatStdout' mangled-name='PySys_FormatStdout' filepath='./Python/sysmodule.c' line='4469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_FormatStdout'> + <parameter type-id='type-id-4' name='format' filepath='./Python/sysmodule.c' line='4469' column='1'/> <parameter is-variadic='yes'/> <return type-id='type-id-3'/> </function-decl> @@ -4077,12 +4087,12 @@ <return type-id='type-id-5'/> </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-178'/> + <return type-id='type-id-184'/> </function-decl> <function-type size-in-bits='64' id='type-id-237'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-type> </abi-instr> @@ -4105,103 +4115,106 @@ <function-decl name='PyInit__suggestions' mangled-name='PyInit__suggestions' filepath='Modules/config.c' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__suggestions'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__codecs' mangled-name='PyInit__codecs' filepath='Modules/config.c' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__codecs'> + <function-decl name='PyInit__datetime' mangled-name='PyInit__datetime' filepath='Modules/config.c' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__datetime'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__collections' mangled-name='PyInit__collections' filepath='Modules/config.c' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__collections'> + <function-decl name='PyInit__codecs' mangled-name='PyInit__codecs' filepath='Modules/config.c' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__codecs'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit_errno' mangled-name='PyInit_errno' filepath='Modules/config.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_errno'> + <function-decl name='PyInit__collections' mangled-name='PyInit__collections' filepath='Modules/config.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__collections'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__io' mangled-name='PyInit__io' filepath='Modules/config.c' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__io'> + <function-decl name='PyInit_errno' mangled-name='PyInit_errno' filepath='Modules/config.c' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_errno'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit_itertools' mangled-name='PyInit_itertools' filepath='Modules/config.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_itertools'> + <function-decl name='PyInit__io' mangled-name='PyInit__io' filepath='Modules/config.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__io'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__sre' mangled-name='PyInit__sre' filepath='Modules/config.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sre'> + <function-decl name='PyInit_itertools' mangled-name='PyInit_itertools' filepath='Modules/config.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_itertools'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__sysconfig' mangled-name='PyInit__sysconfig' filepath='Modules/config.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sysconfig'> + <function-decl name='PyInit__sre' mangled-name='PyInit__sre' filepath='Modules/config.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sre'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__thread' mangled-name='PyInit__thread' filepath='Modules/config.c' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__thread'> + <function-decl name='PyInit__sysconfig' mangled-name='PyInit__sysconfig' filepath='Modules/config.c' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sysconfig'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit_time' mangled-name='PyInit_time' filepath='Modules/config.c' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_time'> + <function-decl name='PyInit__thread' mangled-name='PyInit__thread' filepath='Modules/config.c' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__thread'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__types' mangled-name='PyInit__types' filepath='Modules/config.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__types'> + <function-decl name='PyInit_time' mangled-name='PyInit_time' filepath='Modules/config.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_time'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__typing' mangled-name='PyInit__typing' filepath='Modules/config.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__typing'> + <function-decl name='PyInit__types' mangled-name='PyInit__types' filepath='Modules/config.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__types'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__weakref' mangled-name='PyInit__weakref' filepath='Modules/config.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__weakref'> + <function-decl name='PyInit__typing' mangled-name='PyInit__typing' filepath='Modules/config.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__typing'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__abc' mangled-name='PyInit__abc' filepath='Modules/config.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__abc'> + <function-decl name='PyInit__weakref' mangled-name='PyInit__weakref' filepath='Modules/config.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__weakref'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__functools' mangled-name='PyInit__functools' filepath='Modules/config.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__functools'> + <function-decl name='PyInit__abc' mangled-name='PyInit__abc' filepath='Modules/config.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__abc'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__locale' mangled-name='PyInit__locale' filepath='Modules/config.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__locale'> + <function-decl name='PyInit__functools' mangled-name='PyInit__functools' filepath='Modules/config.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__functools'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__opcode' mangled-name='PyInit__opcode' filepath='Modules/config.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__opcode'> + <function-decl name='PyInit__locale' mangled-name='PyInit__locale' filepath='Modules/config.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__locale'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__operator' mangled-name='PyInit__operator' filepath='Modules/config.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__operator'> + <function-decl name='PyInit__opcode' mangled-name='PyInit__opcode' filepath='Modules/config.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__opcode'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__stat' mangled-name='PyInit__stat' filepath='Modules/config.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__stat'> + <function-decl name='PyInit__operator' mangled-name='PyInit__operator' filepath='Modules/config.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__operator'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit__symtable' mangled-name='PyInit__symtable' filepath='Modules/config.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__symtable'> + <function-decl name='PyInit__stat' mangled-name='PyInit__stat' filepath='Modules/config.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__stat'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit_pwd' mangled-name='PyInit_pwd' filepath='Modules/config.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_pwd'> + <function-decl name='PyInit__symtable' mangled-name='PyInit__symtable' filepath='Modules/config.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__symtable'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInit_gc' mangled-name='PyInit_gc' filepath='Modules/config.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_gc'> + <function-decl name='PyInit_pwd' mangled-name='PyInit_pwd' filepath='Modules/config.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_pwd'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyInit_gc' mangled-name='PyInit_gc' filepath='Modules/config.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_gc'> <return type-id='type-id-6'/> </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-245' filepath='./Include/internal/pycore_gc.h' line='148' column='1' id='type-id-246'> - <underlying-type type-id='type-id-37'/> + <underlying-type type-id='type-id-43'/> <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-246' filepath='./Include/internal/pycore_gc.h' line='157' column='1' id='type-id-245'/> - <function-decl name='_PyGC_Collect' filepath='./Include/internal/pycore_gc.h' line='331' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyGC_Collect' filepath='./Include/internal/pycore_gc.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-245'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyGC_Freeze' filepath='./Include/internal/pycore_gc.h' line='335' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <function-decl name='_PyGC_Freeze' filepath='./Include/internal/pycore_gc.h' line='351' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGC_Unfreeze' filepath='./Include/internal/pycore_gc.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <function-decl name='_PyGC_Unfreeze' filepath='./Include/internal/pycore_gc.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGC_GetFreezeCount' filepath='./Include/internal/pycore_gc.h' line='339' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <function-decl name='_PyGC_GetFreezeCount' filepath='./Include/internal/pycore_gc.h' line='355' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyGC_GetObjects' filepath='./Include/internal/pycore_gc.h' line='341' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <function-decl name='_PyGC_GetObjects' filepath='./Include/internal/pycore_gc.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyGC_GetReferrers' filepath='./Include/internal/pycore_gc.h' line='342' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <function-decl name='_PyGC_GetReferrers' filepath='./Include/internal/pycore_gc.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> @@ -4215,33 +4228,33 @@ <function-decl name='_Py_ClearArgcArgv' filepath='./Include/internal/pycore_initconfig.h' line='96' 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='68' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-250'/> <parameter type-id='type-id-249'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_Py_HandleSystemExitAndKeyboardInterrupt' filepath='./Include/internal/pycore_pylifecycle.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> + <function-decl name='_Py_HandleSystemExitAndKeyboardInterrupt' filepath='./Include/internal/pycore_pylifecycle.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-183'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyRun_SimpleStringFlagsWithName' filepath='./Include/internal/pycore_pylifecycle.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <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-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <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-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyRuntime_Finalize' filepath='./Include/internal/pycore_runtime.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -4252,7 +4265,7 @@ <return type-id='type-id-6'/> </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-178'/> + <parameter type-id='type-id-184'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> @@ -4298,7 +4311,7 @@ <function-decl name='PyObject_VectorcallMethod' mangled-name='PyObject_VectorcallMethod' filepath='./Include/abstract.h' line='297' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VectorcallMethod'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-265'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> @@ -4348,21 +4361,21 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_Py_CheckRecursiveCall' mangled-name='_Py_CheckRecursiveCall' filepath='./Include/internal/pycore_ceval.h' line='207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckRecursiveCall'> - <parameter type-id='type-id-31'/> + <function-decl name='_Py_CheckRecursiveCall' mangled-name='_Py_CheckRecursiveCall' filepath='./Include/internal/pycore_ceval.h' line='209' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckRecursiveCall'> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-4'/> <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-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-256'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <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-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-256'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyGen_FetchStopIterationValue' mangled-name='_PyGen_FetchStopIterationValue' filepath='./Include/internal/pycore_genobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_FetchStopIterationValue'> @@ -4404,22 +4417,22 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyErr_ExceptionMatches' mangled-name='_PyErr_ExceptionMatches' filepath='./Include/internal/pycore_pyerrors.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ExceptionMatches'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyErr_Clear' mangled-name='_PyErr_Clear' filepath='./Include/internal/pycore_pyerrors.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Clear'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_SetString' mangled-name='_PyErr_SetString' filepath='./Include/internal/pycore_pyerrors.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetString'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_Format' mangled-name='_PyErr_Format' filepath='./Include/internal/pycore_pyerrors.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Format'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> @@ -4456,7 +4469,7 @@ </function-decl> <function-decl name='PyLong_AsDouble' mangled-name='PyLong_AsDouble' filepath='./Include/longobject.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsDouble'> <parameter type-id='type-id-6'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='PyObject_RichCompareBool' mangled-name='PyObject_RichCompareBool' filepath='./Include/object.h' line='446' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_RichCompareBool'> <parameter type-id='type-id-6'/> @@ -4474,11 +4487,6 @@ <parameter type-id='type-id-6'/> <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-6'/> - <parameter type-id='type-id-6'/> - <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'/> @@ -4569,13 +4577,13 @@ </function-decl> <function-decl name='PyBuffer_IsContiguous' mangled-name='PyBuffer_IsContiguous' filepath='Objects/abstract.c' line='518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_IsContiguous'> <parameter type-id='type-id-262' name='view' filepath='Objects/abstract.c' line='518' column='1'/> - <parameter type-id='type-id-58' name='order' filepath='Objects/abstract.c' line='518' column='1'/> + <parameter type-id='type-id-64' name='order' filepath='Objects/abstract.c' line='518' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyBuffer_GetPointer' mangled-name='PyBuffer_GetPointer' filepath='Objects/abstract.c' line='534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_GetPointer'> <parameter type-id='type-id-262' name='view' filepath='Objects/abstract.c' line='534' column='1'/> <parameter type-id='type-id-264' name='indices' filepath='Objects/abstract.c' line='534' column='1'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='PyBuffer_SizeFromFormat' mangled-name='PyBuffer_SizeFromFormat' filepath='Objects/abstract.c' line='582' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_SizeFromFormat'> <parameter type-id='type-id-4' name='format' filepath='Objects/abstract.c' line='582' column='1'/> @@ -4583,9 +4591,9 @@ </function-decl> <function-decl name='PyBuffer_FromContiguous' mangled-name='PyBuffer_FromContiguous' filepath='Objects/abstract.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FromContiguous'> <parameter type-id='type-id-262' name='view' filepath='Objects/abstract.c' line='617' column='1'/> - <parameter type-id='type-id-35' name='buf' filepath='Objects/abstract.c' line='617' column='1'/> + <parameter type-id='type-id-41' name='buf' filepath='Objects/abstract.c' line='617' column='1'/> <parameter type-id='type-id-7' name='len' filepath='Objects/abstract.c' line='617' column='1'/> - <parameter type-id='type-id-58' name='fort' filepath='Objects/abstract.c' line='617' column='1'/> + <parameter type-id='type-id-64' name='fort' filepath='Objects/abstract.c' line='617' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyObject_CopyData' mangled-name='PyObject_CopyData' filepath='Objects/abstract.c' line='669' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CopyData'> @@ -4598,13 +4606,13 @@ <parameter type-id='type-id-8' name='shape' filepath='Objects/abstract.c' line='740' column='1'/> <parameter type-id='type-id-8' name='strides' filepath='Objects/abstract.c' line='741' column='1'/> <parameter type-id='type-id-5' name='itemsize' filepath='Objects/abstract.c' line='741' column='1'/> - <parameter type-id='type-id-58' name='fort' filepath='Objects/abstract.c' line='742' column='1'/> + <parameter type-id='type-id-64' name='fort' filepath='Objects/abstract.c' line='742' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyBuffer_FillInfo' mangled-name='PyBuffer_FillInfo' filepath='Objects/abstract.c' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FillInfo'> <parameter type-id='type-id-268' name='view' filepath='Objects/abstract.c' line='764' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Objects/abstract.c' line='764' column='1'/> - <parameter type-id='type-id-35' name='buf' filepath='Objects/abstract.c' line='764' column='1'/> + <parameter type-id='type-id-41' name='buf' filepath='Objects/abstract.c' line='764' column='1'/> <parameter type-id='type-id-7' name='len' filepath='Objects/abstract.c' line='764' column='1'/> <parameter type-id='type-id-5' name='readonly' filepath='Objects/abstract.c' line='765' column='1'/> <parameter type-id='type-id-5' name='flags' filepath='Objects/abstract.c' line='765' column='1'/> @@ -4615,12 +4623,12 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyBuffer_ReleaseInInterpreter' mangled-name='_PyBuffer_ReleaseInInterpreter' filepath='Objects/abstract.c' line='829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBuffer_ReleaseInInterpreter'> - <parameter type-id='type-id-33' name='interp' filepath='Objects/abstract.c' line='829' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Objects/abstract.c' line='829' column='1'/> <parameter type-id='type-id-268' name='view' filepath='Objects/abstract.c' line='830' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyBuffer_ReleaseInInterpreterAndRawFree' mangled-name='_PyBuffer_ReleaseInInterpreterAndRawFree' filepath='Objects/abstract.c' line='836' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBuffer_ReleaseInInterpreterAndRawFree'> - <parameter type-id='type-id-33' name='interp' filepath='Objects/abstract.c' line='836' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Objects/abstract.c' line='836' column='1'/> <parameter type-id='type-id-268' name='view' filepath='Objects/abstract.c' line='837' column='1'/> <return type-id='type-id-5'/> </function-decl> @@ -5018,9 +5026,9 @@ <parameter type-id='type-id-241' name='result' filepath='Objects/abstract.c' line='2925' column='1'/> <return type-id='type-id-269'/> </function-decl> - <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-267'/> + <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-267'/> <function-type size-in-bits='64' id='type-id-270'> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-type> </abi-instr> @@ -5064,17 +5072,18 @@ <return type-id='type-id-5'/> </function-decl> <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-184' name='ok' filepath='Objects/boolobject.c' line='21' column='1'/> + <parameter type-id='type-id-188' name='ok' filepath='Objects/boolobject.c' line='21' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/bytearrayobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <qualified-type-def type-id='type-id-272' const='yes' id='type-id-273'/> - <pointer-type-def type-id='type-id-273' size-in-bits='64' id='type-id-240'/> - <qualified-type-def type-id='type-id-5' const='yes' id='type-id-274'/> + <pointer-type-def type-id='type-id-272' size-in-bits='64' id='type-id-273'/> + <qualified-type-def type-id='type-id-274' const='yes' id='type-id-275'/> + <pointer-type-def type-id='type-id-275' size-in-bits='64' id='type-id-240'/> + <qualified-type-def type-id='type-id-5' const='yes' id='type-id-276'/> <var-decl name='PyByteArray_Type' type-id='type-id-271' 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-271' 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-275' mangled-name='_PyByteArray_empty_string' visibility='default' filepath='./Include/cpython/bytearrayobject.h' line='14' column='1' elf-symbol-id='_PyByteArray_empty_string'/> + <var-decl name='_PyByteArray_empty_string' type-id='type-id-277' 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-6'/> <parameter type-id='type-id-8'/> @@ -5121,31 +5130,31 @@ <return type-id='type-id-6'/> </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-24'/> <parameter type-id='type-id-4'/> <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-24'/> <parameter type-id='type-id-4'/> <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-24'/> <parameter type-id='type-id-4'/> <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-24'/> <parameter type-id='type-id-4'/> <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-24'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-7'/> <return type-id='type-id-3'/> @@ -5230,16 +5239,20 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyBytes_Repeat' mangled-name='_PyBytes_Repeat' filepath='./Include/internal/pycore_bytesobject.h' line='60' 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-24'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-4'/> <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='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetBuiltin'> + <function-decl name='_PyEval_GetBuiltin' mangled-name='_PyEval_GetBuiltin' filepath='./Include/internal/pycore_ceval.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetBuiltin'> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> + <function-decl name='_Py_TriggerGC' filepath='./Include/internal/pycore_gc.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-273'/> + <return type-id='type-id-3'/> + </function-decl> <function-decl name='_PyArg_BadArgument' mangled-name='_PyArg_BadArgument' filepath='./Include/internal/pycore_modsupport.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_BadArgument'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> @@ -5252,7 +5265,7 @@ <parameter type-id='type-id-7'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-276'/> + <parameter type-id='type-id-278'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> @@ -5271,7 +5284,7 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-263'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-274'/> + <parameter type-id='type-id-276'/> <return type-id='type-id-6'/> </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'> @@ -5284,13 +5297,13 @@ <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'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-6'/> </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-6'/> - <parameter type-id='type-id-177'/> - <return type-id='type-id-184'/> + <parameter type-id='type-id-183'/> + <return type-id='type-id-188'/> </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-6'/> @@ -5317,7 +5330,7 @@ <return type-id='type-id-6'/> </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-35'/> + <parameter type-id='type-id-41'/> <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'> @@ -5329,14 +5342,14 @@ <return type-id='type-id-6'/> </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-35'/> + <parameter type-id='type-id-41'/> <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-35'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-262'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-58'/> + <parameter type-id='type-id-64'/> <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'> @@ -5387,16 +5400,16 @@ <return type-id='type-id-6'/> </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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='PyByteArray_FromObject' mangled-name='PyByteArray_FromObject' filepath='Objects/bytearrayobject.c' line='101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_FromObject'> <parameter type-id='type-id-6' name='input' filepath='Objects/bytearrayobject.c' line='101' column='1'/> @@ -5413,7 +5426,7 @@ </function-decl> <function-decl name='PyByteArray_AsString' mangled-name='PyByteArray_AsString' filepath='Objects/bytearrayobject.c' line='180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_AsString'> <parameter type-id='type-id-6' name='self' filepath='Objects/bytearrayobject.c' line='180' column='1'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='PyByteArray_Resize' mangled-name='PyByteArray_Resize' filepath='Objects/bytearrayobject.c' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Resize'> <parameter type-id='type-id-6' name='self' filepath='Objects/bytearrayobject.c' line='274' column='1'/> @@ -5427,65 +5440,65 @@ </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-60' size-in-bits='984' id='type-id-277'> - <subrange length='123' type-id='type-id-2' id='type-id-278'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='984' id='type-id-279'> + <subrange length='123' type-id='type-id-2' id='type-id-280'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='992' id='type-id-279'> - <subrange length='124' type-id='type-id-2' id='type-id-280'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='992' id='type-id-281'> + <subrange length='124' type-id='type-id-2' id='type-id-282'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='1008' id='type-id-281'> - <subrange length='126' type-id='type-id-2' id='type-id-282'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='1008' id='type-id-283'> + <subrange length='126' type-id='type-id-2' id='type-id-284'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='1040' id='type-id-283'> - <subrange length='130' type-id='type-id-2' id='type-id-284'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='1040' id='type-id-285'> + <subrange length='130' type-id='type-id-2' id='type-id-286'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='1056' id='type-id-285'> - <subrange length='132' type-id='type-id-2' id='type-id-286'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='1056' id='type-id-287'> + <subrange length='132' type-id='type-id-2' id='type-id-288'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='1128' id='type-id-287'> - <subrange length='141' type-id='type-id-2' id='type-id-288'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='1128' id='type-id-289'> + <subrange length='141' type-id='type-id-2' id='type-id-290'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='1240' id='type-id-289'> - <subrange length='155' type-id='type-id-2' id='type-id-290'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='1240' id='type-id-291'> + <subrange length='155' type-id='type-id-2' id='type-id-292'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='1840' id='type-id-291'> - <subrange length='230' type-id='type-id-2' id='type-id-292'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='1840' id='type-id-293'> + <subrange length='230' type-id='type-id-2' id='type-id-294'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='2328' id='type-id-293'> - <subrange length='291' type-id='type-id-2' id='type-id-294'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='2328' id='type-id-295'> + <subrange length='291' type-id='type-id-2' id='type-id-296'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='744' id='type-id-295'> - <subrange length='93' type-id='type-id-2' id='type-id-296'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='744' id='type-id-297'> + <subrange length='93' type-id='type-id-2' id='type-id-298'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='784' id='type-id-297'> - <subrange length='98' type-id='type-id-2' id='type-id-298'/> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='784' id='type-id-299'> + <subrange length='98' type-id='type-id-2' id='type-id-300'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-60' size-in-bits='infinite' id='type-id-299'> + <array-type-def dimensions='1' type-id='type-id-66' size-in-bits='infinite' id='type-id-301'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <var-decl name='_Py_isspace__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='51' column='1'/> - <var-decl name='_Py_isalpha__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='52' column='1'/> - <var-decl name='_Py_isalnum__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='53' column='1'/> - <var-decl name='_Py_isascii__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='54' column='1'/> - <var-decl name='_Py_isdigit__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='55' column='1'/> - <var-decl name='_Py_islower__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='56' column='1'/> - <var-decl name='_Py_isupper__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='57' column='1'/> - <var-decl name='_Py_istitle__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='58' column='1'/> - <var-decl name='_Py_lower__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='59' column='1'/> - <var-decl name='_Py_upper__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='60' column='1'/> - <var-decl name='_Py_title__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='61' column='1'/> - <var-decl name='_Py_capitalize__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='62' column='1'/> - <var-decl name='_Py_swapcase__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='63' column='1'/> - <var-decl name='_Py_maketrans__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='71' column='1'/> + <var-decl name='_Py_isspace__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='51' column='1'/> + <var-decl name='_Py_isalpha__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='52' column='1'/> + <var-decl name='_Py_isalnum__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='53' column='1'/> + <var-decl name='_Py_isascii__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='54' column='1'/> + <var-decl name='_Py_isdigit__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='55' column='1'/> + <var-decl name='_Py_islower__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='56' column='1'/> + <var-decl name='_Py_isupper__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='57' column='1'/> + <var-decl name='_Py_istitle__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='58' column='1'/> + <var-decl name='_Py_lower__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='59' column='1'/> + <var-decl name='_Py_upper__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='60' column='1'/> + <var-decl name='_Py_title__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='61' column='1'/> + <var-decl name='_Py_capitalize__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='62' column='1'/> + <var-decl name='_Py_swapcase__doc__' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='63' column='1'/> + <var-decl name='_Py_maketrans__doc__' type-id='type-id-301' 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-35'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/bytesobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_PyBytesWriter' size-in-bits='4416' is-struct='yes' naming-typedef-id='type-id-300' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='68' column='1' id='type-id-301'> + <class-decl name='_PyBytesWriter' size-in-bits='4416' is-struct='yes' naming-typedef-id='type-id-302' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='68' column='1' id='type-id-303'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='buffer' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='70' column='1'/> </data-member> @@ -5505,11 +5518,11 @@ <var-decl name='use_small_buffer' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='87' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='small_buffer' type-id='type-id-302' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='88' column='1'/> + <var-decl name='small_buffer' type-id='type-id-304' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='88' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyBytesWriter' type-id='type-id-301' filepath='./Include/internal/pycore_bytesobject.h' line='89' column='1' id='type-id-300'/> - <pointer-type-def type-id='type-id-300' size-in-bits='64' id='type-id-303'/> + <typedef-decl name='_PyBytesWriter' type-id='type-id-303' filepath='./Include/internal/pycore_bytesobject.h' line='89' column='1' id='type-id-302'/> + <pointer-type-def type-id='type-id-302' size-in-bits='64' id='type-id-305'/> <var-decl name='PyBytes_Type' type-id='type-id-271' 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-271' 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'> @@ -5521,26 +5534,26 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='Py_HashBuffer' mangled-name='Py_HashBuffer' filepath='./Include/cpython/pyhash.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_HashBuffer'> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-7'/> - <return type-id='type-id-304'/> + <return type-id='type-id-306'/> </function-decl> <function-decl name='PyUnicode_New' mangled-name='PyUnicode_New' filepath='./Include/cpython/unicodeobject.h' line='405' 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-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-6'/> </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-6'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='_PyLong_FormatBytesWriter' filepath='./Include/internal/pycore_long.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-303'/> - <parameter type-id='type-id-17'/> + <parameter type-id='type-id-305'/> + <parameter type-id='type-id-24'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_PyUnicode_FormatLong' filepath='./Include/internal/pycore_unicodeobject.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> @@ -5554,29 +5567,29 @@ <return type-id='type-id-6'/> </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-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-58'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-64'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-177'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-183'/> + <return type-id='type-id-24'/> </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-6'/> @@ -5589,7 +5602,7 @@ </function-decl> <function-decl name='PyBytes_FromFormatV' mangled-name='PyBytes_FromFormatV' filepath='Objects/bytesobject.c' line='199' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromFormatV'> <parameter type-id='type-id-4' name='format' filepath='Objects/bytesobject.c' line='199' column='1'/> - <parameter type-id='type-id-306' name='vargs' filepath='Objects/bytesobject.c' line='199' column='1'/> + <parameter type-id='type-id-308' name='vargs' filepath='Objects/bytesobject.c' line='199' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyBytes_FromFormat' mangled-name='PyBytes_FromFormat' filepath='Objects/bytesobject.c' line='390' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromFormat'> @@ -5597,94 +5610,94 @@ <parameter is-variadic='yes'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyBytes_DecodeEscape' mangled-name='PyBytes_DecodeEscape' filepath='Objects/bytesobject.c' line='1196' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_DecodeEscape'> - <parameter type-id='type-id-4' name='s' filepath='Objects/bytesobject.c' line='1196' column='1'/> - <parameter type-id='type-id-7' name='len' filepath='Objects/bytesobject.c' line='1197' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/bytesobject.c' line='1198' column='1'/> - <parameter type-id='type-id-7' name='_unused_unicode' filepath='Objects/bytesobject.c' line='1199' column='1'/> - <parameter type-id='type-id-4' name='_unused_recode_encoding' filepath='Objects/bytesobject.c' line='1200' column='1'/> + <function-decl name='PyBytes_DecodeEscape' mangled-name='PyBytes_DecodeEscape' filepath='Objects/bytesobject.c' line='1198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_DecodeEscape'> + <parameter type-id='type-id-4' name='s' filepath='Objects/bytesobject.c' line='1198' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/bytesobject.c' line='1199' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/bytesobject.c' line='1200' column='1'/> + <parameter type-id='type-id-7' name='_unused_unicode' filepath='Objects/bytesobject.c' line='1201' column='1'/> + <parameter type-id='type-id-4' name='_unused_recode_encoding' filepath='Objects/bytesobject.c' line='1202' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyBytes_Find' mangled-name='_PyBytes_Find' filepath='Objects/bytesobject.c' line='1306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Find'> - <parameter type-id='type-id-4' name='haystack' filepath='Objects/bytesobject.c' line='1306' column='1'/> - <parameter type-id='type-id-7' name='len_haystack' filepath='Objects/bytesobject.c' line='1306' column='1'/> - <parameter type-id='type-id-4' name='needle' filepath='Objects/bytesobject.c' line='1307' column='1'/> - <parameter type-id='type-id-7' name='len_needle' filepath='Objects/bytesobject.c' line='1307' column='1'/> - <parameter type-id='type-id-7' name='offset' filepath='Objects/bytesobject.c' line='1308' column='1'/> + <function-decl name='_PyBytes_Find' mangled-name='_PyBytes_Find' filepath='Objects/bytesobject.c' line='1308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Find'> + <parameter type-id='type-id-4' name='haystack' filepath='Objects/bytesobject.c' line='1308' column='1'/> + <parameter type-id='type-id-7' name='len_haystack' filepath='Objects/bytesobject.c' line='1308' column='1'/> + <parameter type-id='type-id-4' name='needle' filepath='Objects/bytesobject.c' line='1309' column='1'/> + <parameter type-id='type-id-7' name='len_needle' filepath='Objects/bytesobject.c' line='1309' column='1'/> + <parameter type-id='type-id-7' name='offset' filepath='Objects/bytesobject.c' line='1310' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyBytes_ReverseFind' mangled-name='_PyBytes_ReverseFind' filepath='Objects/bytesobject.c' line='1332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_ReverseFind'> - <parameter type-id='type-id-4' name='haystack' filepath='Objects/bytesobject.c' line='1332' column='1'/> - <parameter type-id='type-id-7' name='len_haystack' filepath='Objects/bytesobject.c' line='1332' column='1'/> - <parameter type-id='type-id-4' name='needle' filepath='Objects/bytesobject.c' line='1333' column='1'/> - <parameter type-id='type-id-7' name='len_needle' filepath='Objects/bytesobject.c' line='1333' column='1'/> - <parameter type-id='type-id-7' name='offset' filepath='Objects/bytesobject.c' line='1334' column='1'/> + <function-decl name='_PyBytes_ReverseFind' mangled-name='_PyBytes_ReverseFind' filepath='Objects/bytesobject.c' line='1334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_ReverseFind'> + <parameter type-id='type-id-4' name='haystack' filepath='Objects/bytesobject.c' line='1334' column='1'/> + <parameter type-id='type-id-7' name='len_haystack' filepath='Objects/bytesobject.c' line='1334' column='1'/> + <parameter type-id='type-id-4' name='needle' filepath='Objects/bytesobject.c' line='1335' column='1'/> + <parameter type-id='type-id-7' name='len_needle' filepath='Objects/bytesobject.c' line='1335' column='1'/> + <parameter type-id='type-id-7' name='offset' filepath='Objects/bytesobject.c' line='1336' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyBytes_Repr' mangled-name='PyBytes_Repr' filepath='Objects/bytesobject.c' line='1341' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Repr'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/bytesobject.c' line='1341' column='1'/> - <parameter type-id='type-id-5' name='smartquotes' filepath='Objects/bytesobject.c' line='1341' column='1'/> + <function-decl name='PyBytes_Repr' mangled-name='PyBytes_Repr' filepath='Objects/bytesobject.c' line='1343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Repr'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/bytesobject.c' line='1343' column='1'/> + <parameter type-id='type-id-5' name='smartquotes' filepath='Objects/bytesobject.c' line='1343' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyBytes_Join' mangled-name='PyBytes_Join' filepath='Objects/bytesobject.c' line='1897' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Join'> - <parameter type-id='type-id-6' name='sep' filepath='Objects/bytesobject.c' line='1897' column='1'/> - <parameter type-id='type-id-6' name='iterable' filepath='Objects/bytesobject.c' line='1897' column='1'/> + <function-decl name='PyBytes_Join' mangled-name='PyBytes_Join' filepath='Objects/bytesobject.c' line='1899' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Join'> + <parameter type-id='type-id-6' name='sep' filepath='Objects/bytesobject.c' line='1899' column='1'/> + <parameter type-id='type-id-6' name='iterable' filepath='Objects/bytesobject.c' line='1899' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyBytes_FromObject' mangled-name='PyBytes_FromObject' filepath='Objects/bytesobject.c' line='3003' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromObject'> - <parameter type-id='type-id-6' name='x' filepath='Objects/bytesobject.c' line='3003' column='1'/> + <function-decl name='PyBytes_FromObject' mangled-name='PyBytes_FromObject' filepath='Objects/bytesobject.c' line='3005' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromObject'> + <parameter type-id='type-id-6' name='x' filepath='Objects/bytesobject.c' line='3005' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyBytes_ConcatAndDel' mangled-name='PyBytes_ConcatAndDel' filepath='Objects/bytesobject.c' line='3189' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_ConcatAndDel'> - <parameter type-id='type-id-241' name='pv' filepath='Objects/bytesobject.c' line='3189' column='1'/> - <parameter type-id='type-id-6' name='w' filepath='Objects/bytesobject.c' line='3189' column='1'/> + <function-decl name='PyBytes_ConcatAndDel' mangled-name='PyBytes_ConcatAndDel' filepath='Objects/bytesobject.c' line='3191' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_ConcatAndDel'> + <parameter type-id='type-id-241' name='pv' filepath='Objects/bytesobject.c' line='3191' column='1'/> + <parameter type-id='type-id-6' name='w' filepath='Objects/bytesobject.c' line='3191' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyBytes_Resize' mangled-name='_PyBytes_Resize' filepath='Objects/bytesobject.c' line='3209' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Resize'> - <parameter type-id='type-id-241' name='pv' filepath='Objects/bytesobject.c' line='3209' column='1'/> - <parameter type-id='type-id-7' name='newsize' filepath='Objects/bytesobject.c' line='3209' column='1'/> + <function-decl name='_PyBytes_Resize' mangled-name='_PyBytes_Resize' filepath='Objects/bytesobject.c' line='3211' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Resize'> + <parameter type-id='type-id-241' name='pv' filepath='Objects/bytesobject.c' line='3211' column='1'/> + <parameter type-id='type-id-7' name='newsize' filepath='Objects/bytesobject.c' line='3211' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyBytesWriter_Init' mangled-name='_PyBytesWriter_Init' filepath='Objects/bytesobject.c' line='3441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Init'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3441' column='1'/> + <function-decl name='_PyBytesWriter_Init' mangled-name='_PyBytesWriter_Init' filepath='Objects/bytesobject.c' line='3443' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Init'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3443' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyBytesWriter_Dealloc' mangled-name='_PyBytesWriter_Dealloc' filepath='Objects/bytesobject.c' line='3452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Dealloc'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3452' column='1'/> + <function-decl name='_PyBytesWriter_Dealloc' mangled-name='_PyBytesWriter_Dealloc' filepath='Objects/bytesobject.c' line='3454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Dealloc'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3454' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyBytesWriter_Resize' mangled-name='_PyBytesWriter_Resize' filepath='Objects/bytesobject.c' line='3522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Resize'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3522' column='1'/> - <parameter type-id='type-id-35' name='str' filepath='Objects/bytesobject.c' line='3522' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3522' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='_PyBytesWriter_Resize' mangled-name='_PyBytesWriter_Resize' filepath='Objects/bytesobject.c' line='3524' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Resize'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3524' column='1'/> + <parameter type-id='type-id-41' name='str' filepath='Objects/bytesobject.c' line='3524' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3524' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyBytesWriter_Prepare' mangled-name='_PyBytesWriter_Prepare' filepath='Objects/bytesobject.c' line='3592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Prepare'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3592' column='1'/> - <parameter type-id='type-id-35' name='str' filepath='Objects/bytesobject.c' line='3592' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3592' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='_PyBytesWriter_Prepare' mangled-name='_PyBytesWriter_Prepare' filepath='Objects/bytesobject.c' line='3594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Prepare'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3594' column='1'/> + <parameter type-id='type-id-41' name='str' filepath='Objects/bytesobject.c' line='3594' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3594' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyBytesWriter_Alloc' mangled-name='_PyBytesWriter_Alloc' filepath='Objects/bytesobject.c' line='3622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Alloc'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3622' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3622' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='_PyBytesWriter_Alloc' mangled-name='_PyBytesWriter_Alloc' filepath='Objects/bytesobject.c' line='3624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Alloc'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3624' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3624' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyBytesWriter_Finish' mangled-name='_PyBytesWriter_Finish' filepath='Objects/bytesobject.c' line='3652' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Finish'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3652' column='1'/> - <parameter type-id='type-id-35' name='str' filepath='Objects/bytesobject.c' line='3652' column='1'/> + <function-decl name='_PyBytesWriter_Finish' mangled-name='_PyBytesWriter_Finish' filepath='Objects/bytesobject.c' line='3654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Finish'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3654' column='1'/> + <parameter type-id='type-id-41' name='str' filepath='Objects/bytesobject.c' line='3654' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyBytesWriter_WriteBytes' mangled-name='_PyBytesWriter_WriteBytes' filepath='Objects/bytesobject.c' line='3696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_WriteBytes'> - <parameter type-id='type-id-303' name='writer' filepath='Objects/bytesobject.c' line='3696' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/bytesobject.c' line='3696' column='1'/> - <parameter type-id='type-id-35' name='bytes' filepath='Objects/bytesobject.c' line='3697' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3697' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='_PyBytesWriter_WriteBytes' mangled-name='_PyBytesWriter_WriteBytes' filepath='Objects/bytesobject.c' line='3698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_WriteBytes'> + <parameter type-id='type-id-305' name='writer' filepath='Objects/bytesobject.c' line='3698' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/bytesobject.c' line='3698' column='1'/> + <parameter type-id='type-id-41' name='bytes' filepath='Objects/bytesobject.c' line='3699' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3699' column='1'/> + <return type-id='type-id-41'/> </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='39' column='1' id='type-id-307'> + <class-decl name='_Py_Identifier' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='39' column='1' id='type-id-309'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='string' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='40' column='1'/> </data-member> @@ -5692,23 +5705,23 @@ <var-decl name='index' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='43' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mutex' type-id='type-id-308' visibility='default' filepath='./Include/cpython/object.h' line='47' column='1'/> + <var-decl name='mutex' type-id='type-id-310' visibility='default' filepath='./Include/cpython/object.h' line='47' 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='45' column='1' id='type-id-308'> + <class-decl name='__anonymous_struct__' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/object.h' line='45' column='1' id='type-id-310'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='type-id-309' visibility='default' filepath='./Include/cpython/object.h' line='46' column='1'/> + <var-decl name='v' type-id='type-id-311' 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='48' column='1' id='type-id-310'/> - <pointer-type-def type-id='type-id-310' size-in-bits='64' id='type-id-311'/> + <typedef-decl name='_Py_Identifier' type-id='type-id-309' filepath='./Include/cpython/object.h' line='48' column='1' id='type-id-312'/> + <pointer-type-def type-id='type-id-312' size-in-bits='64' id='type-id-313'/> <function-decl name='_PyObject_GetAttrId' mangled-name='_PyObject_GetAttrId' filepath='./Include/cpython/object.h' line='300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetAttrId'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-311'/> + <parameter type-id='type-id-313'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyUnicode_FromId' mangled-name='_PyUnicode_FromId' filepath='./Include/cpython/unicodeobject.h' line='773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FromId'> - <parameter type-id='type-id-311'/> + <parameter type-id='type-id-313'/> <return type-id='type-id-6'/> </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'> @@ -5718,16 +5731,16 @@ <parameter type-id='type-id-241'/> <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-31'/> - <parameter type-id='type-id-312'/> + <function-decl name='_PyEval_Vector' filepath='./Include/internal/pycore_ceval.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-314'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-265'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_FromItems' mangled-name='_PyDict_FromItems' filepath='./Include/internal/pycore_dict.h' line='290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_FromItems'> + <function-decl name='_PyDict_FromItems' mangled-name='_PyDict_FromItems' filepath='./Include/internal/pycore_dict.h' line='296' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_FromItems'> <parameter type-id='type-id-265'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-265'/> @@ -5739,7 +5752,7 @@ <parameter type-id='type-id-241'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-306'/> + <parameter type-id='type-id-308'/> <parameter type-id='type-id-8'/> <return type-id='type-id-241'/> </function-decl> @@ -5756,11 +5769,11 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_NoMemory' filepath='./Include/internal/pycore_pyerrors.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyErr_FormatFromCauseTstate' filepath='./Include/internal/pycore_pyerrors.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> @@ -5787,13 +5800,13 @@ <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-6' name='callable' filepath='Objects/call.c' line='155' column='1'/> <parameter type-id='type-id-265' 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-14' name='nargsf' filepath='Objects/call.c' line='156' column='1'/> <parameter type-id='type-id-6' name='kwargs' filepath='Objects/call.c' line='156' column='1'/> <return type-id='type-id-6'/> </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-6' name='callable' filepath='Objects/call.c' line='257' column='1'/> - <return type-id='type-id-313'/> + <return type-id='type-id-315'/> </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-6' name='callable' filepath='Objects/call.c' line='294' column='1'/> @@ -5859,7 +5872,7 @@ </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-6' name='obj' filepath='Objects/call.c' line='703' column='1'/> - <parameter type-id='type-id-311' name='name' filepath='Objects/call.c' line='703' column='1'/> + <parameter type-id='type-id-313' name='name' filepath='Objects/call.c' line='703' column='1'/> <parameter type-id='type-id-4' name='format' filepath='Objects/call.c' line='704' column='1'/> <parameter is-variadic='yes'/> <return type-id='type-id-6'/> @@ -5883,25 +5896,25 @@ <return type-id='type-id-6'/> </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'/> + <parameter type-id='type-id-14' 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-314' filepath='./Include/pycapsule.h' line='23' column='1' id='type-id-315'/> + <typedef-decl name='PyCapsule_Destructor' type-id='type-id-316' filepath='./Include/pycapsule.h' line='23' column='1' id='type-id-317'/> <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-4'/> <return type-id='type-id-6'/> </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-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-decl> <var-decl name='PyCapsule_Type' type-id='type-id-271' 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='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_New'> - <parameter type-id='type-id-35' name='pointer' filepath='Objects/capsule.c' line='60' column='1'/> + <parameter type-id='type-id-41' name='pointer' filepath='Objects/capsule.c' line='60' column='1'/> <parameter type-id='type-id-4' name='name' filepath='Objects/capsule.c' line='60' column='1'/> - <parameter type-id='type-id-315' name='destructor' filepath='Objects/capsule.c' line='60' column='1'/> + <parameter type-id='type-id-317' name='destructor' filepath='Objects/capsule.c' line='60' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyCapsule_IsValid' mangled-name='PyCapsule_IsValid' filepath='Objects/capsule.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_IsValid'> @@ -5912,7 +5925,7 @@ <function-decl name='PyCapsule_GetPointer' mangled-name='PyCapsule_GetPointer' filepath='Objects/capsule.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetPointer'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='99' column='1'/> <parameter type-id='type-id-4' name='name' filepath='Objects/capsule.c' line='99' column='1'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='PyCapsule_GetName' mangled-name='PyCapsule_GetName' filepath='Objects/capsule.c' line='116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetName'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='116' column='1'/> @@ -5920,15 +5933,15 @@ </function-decl> <function-decl name='PyCapsule_GetDestructor' mangled-name='PyCapsule_GetDestructor' filepath='Objects/capsule.c' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetDestructor'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='127' column='1'/> - <return type-id='type-id-315'/> + <return type-id='type-id-317'/> </function-decl> <function-decl name='PyCapsule_GetContext' mangled-name='PyCapsule_GetContext' filepath='Objects/capsule.c' line='138' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetContext'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='138' column='1'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='PyCapsule_SetPointer' mangled-name='PyCapsule_SetPointer' filepath='Objects/capsule.c' line='149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetPointer'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='149' column='1'/> - <parameter type-id='type-id-35' name='pointer' filepath='Objects/capsule.c' line='149' column='1'/> + <parameter type-id='type-id-41' name='pointer' filepath='Objects/capsule.c' line='149' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyCapsule_SetName' mangled-name='PyCapsule_SetName' filepath='Objects/capsule.c' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetName'> @@ -5938,26 +5951,26 @@ </function-decl> <function-decl name='PyCapsule_SetDestructor' mangled-name='PyCapsule_SetDestructor' filepath='Objects/capsule.c' line='180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetDestructor'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='180' column='1'/> - <parameter type-id='type-id-315' name='destructor' filepath='Objects/capsule.c' line='180' column='1'/> + <parameter type-id='type-id-317' name='destructor' filepath='Objects/capsule.c' line='180' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyCapsule_SetContext' mangled-name='PyCapsule_SetContext' filepath='Objects/capsule.c' line='193' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetContext'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='193' column='1'/> - <parameter type-id='type-id-35' name='context' filepath='Objects/capsule.c' line='193' column='1'/> + <parameter type-id='type-id-41' name='context' filepath='Objects/capsule.c' line='193' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCapsule_SetTraverse' mangled-name='_PyCapsule_SetTraverse' filepath='Objects/capsule.c' line='206' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCapsule_SetTraverse'> <parameter type-id='type-id-6' name='op' filepath='Objects/capsule.c' line='206' column='1'/> - <parameter type-id='type-id-316' name='traverse_func' filepath='Objects/capsule.c' line='206' column='1'/> - <parameter type-id='type-id-317' name='clear_func' filepath='Objects/capsule.c' line='206' column='1'/> + <parameter type-id='type-id-318' name='traverse_func' filepath='Objects/capsule.c' line='206' column='1'/> + <parameter type-id='type-id-319' name='clear_func' filepath='Objects/capsule.c' line='206' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyCapsule_Import' mangled-name='PyCapsule_Import' filepath='Objects/capsule.c' line='230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_Import'> <parameter type-id='type-id-4' name='name' filepath='Objects/capsule.c' line='230' column='1'/> <parameter type-id='type-id-5' name='no_block' filepath='Objects/capsule.c' line='230' column='1'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> - <function-type size-in-bits='64' id='type-id-318'> + <function-type size-in-bits='64' id='type-id-320'> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-type> @@ -5994,7 +6007,7 @@ </function-decl> <function-decl name='PyObject_GenericHash' mangled-name='PyObject_GenericHash' filepath='./Include/cpython/pyhash.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericHash'> <parameter type-id='type-id-6'/> - <return type-id='type-id-304'/> + <return type-id='type-id-306'/> </function-decl> <function-decl name='_PyType_GetDict' mangled-name='_PyType_GetDict' filepath='./Include/internal/pycore_typeobject.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetDict'> <parameter type-id='type-id-1'/> @@ -6012,7 +6025,7 @@ </function-decl> <function-decl name='PyObject_Hash' mangled-name='PyObject_Hash' filepath='./Include/object.h' line='469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Hash'> <parameter type-id='type-id-6'/> - <return type-id='type-id-304'/> + <return type-id='type-id-306'/> </function-decl> <function-decl name='PyObject_ClearWeakRefs' mangled-name='PyObject_ClearWeakRefs' filepath='./Include/object.h' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ClearWeakRefs'> <parameter type-id='type-id-6'/> @@ -6041,24 +6054,24 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/codeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-319' size-in-bits='128' id='type-id-320'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-321' size-in-bits='128' id='type-id-322'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-322' size-in-bits='256' id='type-id-323'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-324' size-in-bits='256' id='type-id-325'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <class-decl name='_opaque' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='267' column='1' id='type-id-325'> + <class-decl name='_opaque' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='267' column='1' id='type-id-327'> <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='268' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='lo_next' type-id='type-id-326' visibility='default' filepath='./Include/cpython/code.h' line='269' column='1'/> + <var-decl name='lo_next' type-id='type-id-328' visibility='default' filepath='./Include/cpython/code.h' line='269' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='limit' type-id='type-id-326' visibility='default' filepath='./Include/cpython/code.h' line='270' column='1'/> + <var-decl name='limit' type-id='type-id-328' visibility='default' filepath='./Include/cpython/code.h' line='270' 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='273' column='1' id='type-id-327'> + <class-decl name='_line_offsets' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='273' column='1' id='type-id-329'> <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='274' column='1'/> </data-member> @@ -6069,221 +6082,221 @@ <var-decl name='ar_line' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='276' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='opaque' type-id='type-id-325' visibility='default' filepath='./Include/cpython/code.h' line='277' column='1'/> + <var-decl name='opaque' type-id='type-id-327' visibility='default' filepath='./Include/cpython/code.h' line='277' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyCodeAddressRange' type-id='type-id-327' filepath='./Include/cpython/code.h' line='278' column='1' id='type-id-328'/> - <class-decl name='_PyCode_var_counts_t' size-in-bits='736' is-struct='yes' naming-typedef-id='type-id-329' visibility='default' filepath='./Include/internal/pycore_code.h' line='566' column='1' id='type-id-330'> + <typedef-decl name='PyCodeAddressRange' type-id='type-id-329' filepath='./Include/cpython/code.h' line='278' column='1' id='type-id-330'/> + <class-decl name='_PyCode_var_counts_t' size-in-bits='736' is-struct='yes' naming-typedef-id='type-id-331' visibility='default' filepath='./Include/internal/pycore_code.h' line='573' column='1' id='type-id-332'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='567' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='574' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='locals' type-id='type-id-331' visibility='default' filepath='./Include/internal/pycore_code.h' line='590' column='1'/> + <var-decl name='locals' type-id='type-id-333' visibility='default' filepath='./Include/internal/pycore_code.h' line='597' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='591' column='1'/> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='598' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='unbound' type-id='type-id-332' visibility='default' filepath='./Include/internal/pycore_code.h' line='602' column='1'/> + <var-decl name='unbound' type-id='type-id-334' visibility='default' filepath='./Include/internal/pycore_code.h' line='609' column='1'/> </data-member> </class-decl> - <class-decl name='co_locals_counts' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='568' column='1' id='type-id-331'> + <class-decl name='co_locals_counts' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='575' column='1' id='type-id-333'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='569' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='576' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='args' type-id='type-id-333' visibility='default' filepath='./Include/internal/pycore_code.h' line='577' column='1'/> + <var-decl name='args' type-id='type-id-335' visibility='default' filepath='./Include/internal/pycore_code.h' line='584' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='numpure' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='578' column='1'/> + <var-decl name='numpure' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='585' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='cells' type-id='type-id-334' visibility='default' filepath='./Include/internal/pycore_code.h' line='584' column='1'/> + <var-decl name='cells' type-id='type-id-336' visibility='default' filepath='./Include/internal/pycore_code.h' line='591' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='hidden' type-id='type-id-335' visibility='default' filepath='./Include/internal/pycore_code.h' line='589' column='1'/> + <var-decl name='hidden' type-id='type-id-337' visibility='default' filepath='./Include/internal/pycore_code.h' line='596' 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_code.h' line='570' column='1' id='type-id-333'> + <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='577' column='1' id='type-id-335'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='571' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='578' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='numposonly' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='572' column='1'/> + <var-decl name='numposonly' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='579' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='numposorkw' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='573' column='1'/> + <var-decl name='numposorkw' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='580' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='numkwonly' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='574' column='1'/> + <var-decl name='numkwonly' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='581' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='varargs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='575' column='1'/> + <var-decl name='varargs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='582' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='varkwargs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='576' column='1'/> + <var-decl name='varkwargs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='583' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__3' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='579' column='1' id='type-id-334'> + <class-decl name='__anonymous_struct__3' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='586' column='1' id='type-id-336'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='580' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='587' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='numargs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='582' column='1'/> + <var-decl name='numargs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='589' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='numothers' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='583' column='1'/> + <var-decl name='numothers' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='590' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__4' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='585' column='1' id='type-id-335'> + <class-decl name='__anonymous_struct__4' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='592' column='1' id='type-id-337'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='586' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='593' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='numpure' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='587' column='1'/> + <var-decl name='numpure' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='594' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='numcells' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='588' column='1'/> + <var-decl name='numcells' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='595' column='1'/> </data-member> </class-decl> - <class-decl name='co_unbound_counts' size-in-bits='224' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='592' column='1' id='type-id-332'> + <class-decl name='co_unbound_counts' size-in-bits='224' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='599' column='1' id='type-id-334'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='593' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='600' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='globals' type-id='type-id-336' visibility='default' filepath='./Include/internal/pycore_code.h' line='599' column='1'/> + <var-decl name='globals' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_code.h' line='606' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='numattrs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='600' column='1'/> + <var-decl name='numattrs' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='607' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='numunknown' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='601' column='1'/> + <var-decl name='numunknown' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='608' 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_code.h' line='594' column='1' id='type-id-336'> + <class-decl name='__anonymous_struct__5' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='601' column='1' id='type-id-338'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='595' column='1'/> + <var-decl name='total' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='602' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='numglobal' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='596' column='1'/> + <var-decl name='numglobal' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='603' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='numbuiltin' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='597' column='1'/> + <var-decl name='numbuiltin' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='604' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='numunknown' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='598' column='1'/> + <var-decl name='numunknown' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='605' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyCode_var_counts_t' type-id='type-id-330' filepath='./Include/internal/pycore_code.h' line='603' column='1' id='type-id-329'/> - <class-decl name='_PyExecutorLinkListNode' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='16' column='1' id='type-id-337'> + <typedef-decl name='_PyCode_var_counts_t' type-id='type-id-332' filepath='./Include/internal/pycore_code.h' line='610' column='1' id='type-id-331'/> + <class-decl name='_PyExecutorLinkListNode' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='16' column='1' id='type-id-339'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='17' column='1'/> + <var-decl name='next' type-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='17' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='18' column='1'/> + <var-decl name='previous' type-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='18' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyExecutorLinkListNode' type-id='type-id-337' filepath='./Include/internal/pycore_optimizer.h' line='19' column='1' id='type-id-339'/> - <class-decl name='_PyBloomFilter' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='26' column='1' id='type-id-341'> + <typedef-decl name='_PyExecutorLinkListNode' type-id='type-id-339' filepath='./Include/internal/pycore_optimizer.h' line='19' column='1' id='type-id-341'/> + <class-decl name='_PyBloomFilter' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-342' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='26' column='1' id='type-id-343'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='bits' type-id='type-id-323' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='27' column='1'/> + <var-decl name='bits' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='27' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyBloomFilter' type-id='type-id-341' filepath='./Include/internal/pycore_optimizer.h' line='28' column='1' id='type-id-340'/> - <class-decl name='_PyVMData' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-342' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='30' column='1' id='type-id-343'> + <typedef-decl name='_PyBloomFilter' type-id='type-id-343' filepath='./Include/internal/pycore_optimizer.h' line='28' column='1' id='type-id-342'/> + <class-decl name='_PyVMData' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='30' column='1' id='type-id-345'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='opcode' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='31' column='1'/> + <var-decl name='opcode' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='31' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='oparg' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='32' column='1'/> + <var-decl name='oparg' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='32' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='valid' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='33' column='1'/> + <var-decl name='valid' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='17'> - <var-decl name='linked' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='34' column='1'/> + <var-decl name='linked' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='34' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18'> - <var-decl name='chain_depth' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='35' column='1'/> + <var-decl name='chain_depth' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='35' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24'> - <var-decl name='warm' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='36' column='1'/> + <var-decl name='warm' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='36' 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='37' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bloom' type-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='38' column='1'/> + <var-decl name='bloom' type-id='type-id-342' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='links' type-id='type-id-339' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='39' column='1'/> + <var-decl name='links' type-id='type-id-341' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='39' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='code' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='40' column='1'/> + <var-decl name='code' type-id='type-id-347' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='40' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyVMData' type-id='type-id-343' filepath='./Include/internal/pycore_optimizer.h' line='41' column='1' id='type-id-342'/> - <class-decl name='_PyUOpInstruction' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='51' column='1' id='type-id-347'> + <typedef-decl name='_PyVMData' type-id='type-id-345' filepath='./Include/internal/pycore_optimizer.h' line='41' column='1' id='type-id-344'/> + <class-decl name='_PyUOpInstruction' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='51' column='1' id='type-id-349'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='opcode' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='52' column='1'/> + <var-decl name='opcode' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='52' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='15'> - <var-decl name='format' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='53' column='1'/> + <var-decl name='format' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='53' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='oparg' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='54' column='1'/> + <var-decl name='oparg' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='54' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='' type-id='type-id-349' visibility='default'/> + <var-decl name='' type-id='type-id-351' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='operand0' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='62' column='1'/> + <var-decl name='operand0' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='62' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='operand1' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='63' column='1'/> + <var-decl name='operand1' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='63' column='1'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='55' column='1' id='type-id-349'> + <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='55' column='1' id='type-id-351'> <data-member access='public'> - <var-decl name='target' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='56' column='1'/> + <var-decl name='target' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='56' column='1'/> </data-member> <data-member access='public'> - <var-decl name='' type-id='type-id-350' visibility='default'/> + <var-decl name='' type-id='type-id-352' visibility='default'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='57' column='1' id='type-id-350'> + <class-decl name='__anonymous_struct__2' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='57' column='1' id='type-id-352'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='jump_target' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='58' column='1'/> + <var-decl name='jump_target' type-id='type-id-350' 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='error_target' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='59' column='1'/> + <var-decl name='error_target' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='59' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyUOpInstruction' type-id='type-id-347' filepath='./Include/internal/pycore_optimizer.h' line='67' column='1' id='type-id-346'/> - <class-decl name='_PyExitData' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-319' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='69' column='1' id='type-id-351'> + <typedef-decl name='_PyUOpInstruction' type-id='type-id-349' filepath='./Include/internal/pycore_optimizer.h' line='67' column='1' id='type-id-348'/> + <class-decl name='_PyExitData' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-321' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='69' column='1' id='type-id-353'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='70' column='1'/> + <var-decl name='target' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='temperature' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='71' column='1'/> + <var-decl name='temperature' type-id='type-id-354' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='executor' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='72' column='1'/> + <var-decl name='executor' type-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='72' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyExitData' type-id='type-id-351' filepath='./Include/internal/pycore_optimizer.h' line='73' column='1' id='type-id-319'/> - <pointer-type-def type-id='type-id-328' size-in-bits='64' id='type-id-353'/> - <pointer-type-def type-id='type-id-254' size-in-bits='64' id='type-id-354'/> - <pointer-type-def type-id='type-id-304' size-in-bits='64' id='type-id-355'/> - <pointer-type-def type-id='type-id-329' size-in-bits='64' id='type-id-356'/> - <qualified-type-def type-id='type-id-346' const='yes' id='type-id-357'/> - <pointer-type-def type-id='type-id-357' size-in-bits='64' id='type-id-358'/> - <qualified-type-def type-id='type-id-309' const='yes' id='type-id-359'/> - <pointer-type-def type-id='type-id-359' size-in-bits='64' id='type-id-326'/> + <typedef-decl name='_PyExitData' type-id='type-id-353' filepath='./Include/internal/pycore_optimizer.h' line='73' column='1' id='type-id-321'/> + <pointer-type-def type-id='type-id-330' size-in-bits='64' id='type-id-355'/> + <pointer-type-def type-id='type-id-254' size-in-bits='64' id='type-id-356'/> + <pointer-type-def type-id='type-id-306' size-in-bits='64' id='type-id-357'/> + <pointer-type-def type-id='type-id-331' size-in-bits='64' id='type-id-358'/> + <qualified-type-def type-id='type-id-348' const='yes' id='type-id-359'/> + <pointer-type-def type-id='type-id-359' size-in-bits='64' id='type-id-360'/> + <qualified-type-def type-id='type-id-311' const='yes' id='type-id-361'/> + <pointer-type-def type-id='type-id-361' size-in-bits='64' id='type-id-328'/> <var-decl name='PyCode_Type' type-id='type-id-271' mangled-name='PyCode_Type' visibility='default' filepath='./Include/cpython/code.h' line='162' 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-6'/> - <return type-id='type-id-360'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_PyTuple_Resize' mangled-name='_PyTuple_Resize' filepath='./Include/cpython/tupleobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_Resize'> <parameter type-id='type-id-241'/> @@ -6295,26 +6308,26 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_GetBaseCodeUnit' filepath='./Include/internal/pycore_code.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <function-decl name='_Py_GetBaseCodeUnit' filepath='./Include/internal/pycore_code.h' line='521' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-347'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-361'/> + <return type-id='type-id-363'/> </function-decl> - <function-decl name='_PyInstruction_GetLength' filepath='./Include/internal/pycore_code.h' line='516' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <function-decl name='_PyInstruction_GetLength' filepath='./Include/internal/pycore_code.h' line='523' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-347'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyInstrumentation_BranchesIterator' filepath='./Include/internal/pycore_code.h' line='518' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <function-decl name='_PyInstrumentation_BranchesIterator' filepath='./Include/internal/pycore_code.h' line='525' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-347'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyFunction_ClearCodeByVersion' filepath='./Include/internal/pycore_function.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-322'/> + <parameter type-id='type-id-324'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_Instrumentation_GetLine' filepath='./Include/internal/pycore_instruments.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-347'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> @@ -6322,7 +6335,7 @@ <parameter type-id='type-id-6'/> <parameter type-id='type-id-8'/> <parameter type-id='type-id-241'/> - <parameter type-id='type-id-355'/> + <parameter type-id='type-id-357'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_Copy' mangled-name='_PyUnicode_Copy' filepath='./Include/internal/pycore_unicodeobject.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_Copy'> @@ -6330,18 +6343,18 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyUnicode_InternMortal' mangled-name='_PyUnicode_InternMortal' filepath='./Include/internal/pycore_unicodeobject.h' line='289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternMortal'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-241'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyLong_FromVoidPtr' mangled-name='PyLong_FromVoidPtr' filepath='./Include/longobject.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromVoidPtr'> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-6'/> </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-354'/> + <return type-id='type-id-356'/> </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-6'/> @@ -6381,12 +6394,12 @@ <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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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-362' name='callback' filepath='Objects/codeobject.c' line='66' column='1'/> + <parameter type-id='type-id-364' name='callback' filepath='Objects/codeobject.c' line='66' column='1'/> <return type-id='type-id-5'/> </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'> @@ -6394,7 +6407,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCode_Quicken' filepath='Objects/codeobject.c' line='504' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-5'/> <return type-id='type-id-3'/> @@ -6418,7 +6431,7 @@ <parameter type-id='type-id-5' name='firstlineno' filepath='Objects/codeobject.c' line='773' column='1'/> <parameter type-id='type-id-6' name='linetable' filepath='Objects/codeobject.c' line='774' column='1'/> <parameter type-id='type-id-6' name='exceptiontable' filepath='Objects/codeobject.c' line='775' column='1'/> - <return type-id='type-id-345'/> + <return type-id='type-id-347'/> </function-decl> <function-decl name='PyUnstable_Code_New' mangled-name='PyUnstable_Code_New' filepath='Objects/codeobject.c' line='921' 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='921' column='1'/> @@ -6438,142 +6451,142 @@ <parameter type-id='type-id-5' name='firstlineno' filepath='Objects/codeobject.c' line='926' column='1'/> <parameter type-id='type-id-6' name='linetable' filepath='Objects/codeobject.c' line='927' column='1'/> <parameter type-id='type-id-6' name='exceptiontable' filepath='Objects/codeobject.c' line='928' column='1'/> - <return type-id='type-id-345'/> + <return type-id='type-id-347'/> </function-decl> <function-decl name='PyCode_NewEmpty' mangled-name='PyCode_NewEmpty' filepath='Objects/codeobject.c' line='955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_NewEmpty'> <parameter type-id='type-id-4' name='filename' filepath='Objects/codeobject.c' line='955' column='1'/> <parameter type-id='type-id-4' name='funcname' filepath='Objects/codeobject.c' line='955' column='1'/> <parameter type-id='type-id-5' name='firstlineno' filepath='Objects/codeobject.c' line='955' column='1'/> - <return type-id='type-id-345'/> + <return type-id='type-id-347'/> </function-decl> - <function-decl name='PyCode_Addr2Line' mangled-name='PyCode_Addr2Line' filepath='Objects/codeobject.c' line='1017' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Line'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='1017' column='1'/> - <parameter type-id='type-id-5' name='addrq' filepath='Objects/codeobject.c' line='1017' column='1'/> + <function-decl name='PyCode_Addr2Line' mangled-name='PyCode_Addr2Line' filepath='Objects/codeobject.c' line='1049' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Line'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='1049' column='1'/> + <parameter type-id='type-id-5' name='addrq' filepath='Objects/codeobject.c' line='1049' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCode_CheckLineNumber' mangled-name='_PyCode_CheckLineNumber' filepath='Objects/codeobject.c' line='1055' 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='1055' column='1'/> - <parameter type-id='type-id-353' name='bounds' filepath='Objects/codeobject.c' line='1055' column='1'/> + <function-decl name='_PyCode_CheckLineNumber' mangled-name='_PyCode_CheckLineNumber' filepath='Objects/codeobject.c' line='1082' 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='1082' column='1'/> + <parameter type-id='type-id-355' name='bounds' filepath='Objects/codeobject.c' line='1082' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyCode_Addr2Location' mangled-name='PyCode_Addr2Location' filepath='Objects/codeobject.c' line='1232' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Location'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='1232' column='1'/> - <parameter type-id='type-id-5' name='addrq' filepath='Objects/codeobject.c' line='1232' column='1'/> - <parameter type-id='type-id-177' name='start_line' filepath='Objects/codeobject.c' line='1233' column='1'/> - <parameter type-id='type-id-177' name='start_column' filepath='Objects/codeobject.c' line='1233' column='1'/> - <parameter type-id='type-id-177' name='end_line' filepath='Objects/codeobject.c' line='1234' column='1'/> - <parameter type-id='type-id-177' name='end_column' filepath='Objects/codeobject.c' line='1234' column='1'/> + <function-decl name='PyCode_Addr2Location' mangled-name='PyCode_Addr2Location' filepath='Objects/codeobject.c' line='1259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Location'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='1259' column='1'/> + <parameter type-id='type-id-5' name='addrq' filepath='Objects/codeobject.c' line='1259' column='1'/> + <parameter type-id='type-id-183' name='start_line' filepath='Objects/codeobject.c' line='1260' column='1'/> + <parameter type-id='type-id-183' name='start_column' filepath='Objects/codeobject.c' line='1260' column='1'/> + <parameter type-id='type-id-183' name='end_line' filepath='Objects/codeobject.c' line='1261' column='1'/> + <parameter type-id='type-id-183' name='end_column' filepath='Objects/codeobject.c' line='1261' 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='1559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_GetExtra'> - <parameter type-id='type-id-6' name='code' filepath='Objects/codeobject.c' line='1559' column='1'/> - <parameter type-id='type-id-7' name='index' filepath='Objects/codeobject.c' line='1559' column='1'/> - <parameter type-id='type-id-267' name='extra' filepath='Objects/codeobject.c' line='1559' column='1'/> + <function-decl name='PyUnstable_Code_GetExtra' mangled-name='PyUnstable_Code_GetExtra' filepath='Objects/codeobject.c' line='1586' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_GetExtra'> + <parameter type-id='type-id-6' name='code' filepath='Objects/codeobject.c' line='1586' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/codeobject.c' line='1586' column='1'/> + <parameter type-id='type-id-267' name='extra' filepath='Objects/codeobject.c' line='1586' 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='1580' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_SetExtra'> - <parameter type-id='type-id-6' name='code' filepath='Objects/codeobject.c' line='1580' column='1'/> - <parameter type-id='type-id-7' name='index' filepath='Objects/codeobject.c' line='1580' column='1'/> - <parameter type-id='type-id-35' name='extra' filepath='Objects/codeobject.c' line='1580' column='1'/> + <function-decl name='PyUnstable_Code_SetExtra' mangled-name='PyUnstable_Code_SetExtra' filepath='Objects/codeobject.c' line='1607' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_SetExtra'> + <parameter type-id='type-id-6' name='code' filepath='Objects/codeobject.c' line='1607' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/codeobject.c' line='1607' column='1'/> + <parameter type-id='type-id-41' name='extra' filepath='Objects/codeobject.c' line='1607' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyCode_GetVarnames' mangled-name='PyCode_GetVarnames' filepath='Objects/codeobject.c' line='1658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetVarnames'> - <parameter type-id='type-id-345' name='code' filepath='Objects/codeobject.c' line='1658' column='1'/> + <function-decl name='PyCode_GetVarnames' mangled-name='PyCode_GetVarnames' filepath='Objects/codeobject.c' line='1685' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetVarnames'> + <parameter type-id='type-id-347' name='code' filepath='Objects/codeobject.c' line='1685' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyCode_GetCellvars' mangled-name='PyCode_GetCellvars' filepath='Objects/codeobject.c' line='1673' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCellvars'> - <parameter type-id='type-id-345' name='code' filepath='Objects/codeobject.c' line='1673' column='1'/> + <function-decl name='PyCode_GetCellvars' mangled-name='PyCode_GetCellvars' filepath='Objects/codeobject.c' line='1700' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCellvars'> + <parameter type-id='type-id-347' name='code' filepath='Objects/codeobject.c' line='1700' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyCode_GetFreevars' mangled-name='PyCode_GetFreevars' filepath='Objects/codeobject.c' line='1688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetFreevars'> - <parameter type-id='type-id-345' name='code' filepath='Objects/codeobject.c' line='1688' column='1'/> + <function-decl name='PyCode_GetFreevars' mangled-name='PyCode_GetFreevars' filepath='Objects/codeobject.c' line='1715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetFreevars'> + <parameter type-id='type-id-347' name='code' filepath='Objects/codeobject.c' line='1715' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCode_GetVarCounts' mangled-name='_PyCode_GetVarCounts' filepath='Objects/codeobject.c' line='1808' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_GetVarCounts'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='1808' column='1'/> - <parameter type-id='type-id-356' name='counts' filepath='Objects/codeobject.c' line='1808' column='1'/> + <function-decl name='_PyCode_GetVarCounts' mangled-name='_PyCode_GetVarCounts' filepath='Objects/codeobject.c' line='1835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_GetVarCounts'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='1835' column='1'/> + <parameter type-id='type-id-358' name='counts' filepath='Objects/codeobject.c' line='1835' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyCode_SetUnboundVarCounts' mangled-name='_PyCode_SetUnboundVarCounts' filepath='Objects/codeobject.c' line='1915' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_SetUnboundVarCounts'> - <parameter type-id='type-id-31' name='tstate' filepath='Objects/codeobject.c' line='1915' column='1'/> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='1916' column='1'/> - <parameter type-id='type-id-356' name='counts' filepath='Objects/codeobject.c' line='1916' column='1'/> - <parameter type-id='type-id-6' name='globalnames' filepath='Objects/codeobject.c' line='1917' column='1'/> - <parameter type-id='type-id-6' name='attrnames' filepath='Objects/codeobject.c' line='1917' column='1'/> - <parameter type-id='type-id-6' name='globalsns' filepath='Objects/codeobject.c' line='1918' column='1'/> - <parameter type-id='type-id-6' name='builtinsns' filepath='Objects/codeobject.c' line='1918' column='1'/> + <function-decl name='_PyCode_SetUnboundVarCounts' mangled-name='_PyCode_SetUnboundVarCounts' filepath='Objects/codeobject.c' line='1942' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_SetUnboundVarCounts'> + <parameter type-id='type-id-37' name='tstate' filepath='Objects/codeobject.c' line='1942' column='1'/> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='1943' column='1'/> + <parameter type-id='type-id-358' name='counts' filepath='Objects/codeobject.c' line='1943' column='1'/> + <parameter type-id='type-id-6' name='globalnames' filepath='Objects/codeobject.c' line='1944' column='1'/> + <parameter type-id='type-id-6' name='attrnames' filepath='Objects/codeobject.c' line='1944' column='1'/> + <parameter type-id='type-id-6' name='globalsns' filepath='Objects/codeobject.c' line='1945' column='1'/> + <parameter type-id='type-id-6' name='builtinsns' filepath='Objects/codeobject.c' line='1945' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCode_CheckNoInternalState' mangled-name='_PyCode_CheckNoInternalState' filepath='Objects/codeobject.c' line='1980' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckNoInternalState'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='1980' column='1'/> - <parameter type-id='type-id-266' name='p_errmsg' filepath='Objects/codeobject.c' line='1980' column='1'/> + <function-decl name='_PyCode_CheckNoInternalState' mangled-name='_PyCode_CheckNoInternalState' filepath='Objects/codeobject.c' line='2007' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckNoInternalState'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='2007' column='1'/> + <parameter type-id='type-id-266' name='p_errmsg' filepath='Objects/codeobject.c' line='2007' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCode_CheckNoExternalState' mangled-name='_PyCode_CheckNoExternalState' filepath='Objects/codeobject.c' line='1999' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckNoExternalState'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='1999' column='1'/> - <parameter type-id='type-id-356' name='counts' filepath='Objects/codeobject.c' line='1999' column='1'/> - <parameter type-id='type-id-266' name='p_errmsg' filepath='Objects/codeobject.c' line='2000' column='1'/> + <function-decl name='_PyCode_CheckNoExternalState' mangled-name='_PyCode_CheckNoExternalState' filepath='Objects/codeobject.c' line='2026' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckNoExternalState'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='2026' column='1'/> + <parameter type-id='type-id-358' name='counts' filepath='Objects/codeobject.c' line='2026' column='1'/> + <parameter type-id='type-id-266' name='p_errmsg' filepath='Objects/codeobject.c' line='2027' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCode_VerifyStateless' mangled-name='_PyCode_VerifyStateless' filepath='Objects/codeobject.c' line='2027' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_VerifyStateless'> - <parameter type-id='type-id-31' name='tstate' filepath='Objects/codeobject.c' line='2027' column='1'/> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='2028' column='1'/> - <parameter type-id='type-id-6' name='globalnames' filepath='Objects/codeobject.c' line='2028' column='1'/> - <parameter type-id='type-id-6' name='globalsns' filepath='Objects/codeobject.c' line='2029' column='1'/> - <parameter type-id='type-id-6' name='builtinsns' filepath='Objects/codeobject.c' line='2029' column='1'/> + <function-decl name='_PyCode_VerifyStateless' mangled-name='_PyCode_VerifyStateless' filepath='Objects/codeobject.c' line='2054' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_VerifyStateless'> + <parameter type-id='type-id-37' name='tstate' filepath='Objects/codeobject.c' line='2054' column='1'/> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='2055' column='1'/> + <parameter type-id='type-id-6' name='globalnames' filepath='Objects/codeobject.c' line='2055' column='1'/> + <parameter type-id='type-id-6' name='globalsns' filepath='Objects/codeobject.c' line='2056' column='1'/> + <parameter type-id='type-id-6' name='builtinsns' filepath='Objects/codeobject.c' line='2056' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCode_CheckPureFunction' mangled-name='_PyCode_CheckPureFunction' filepath='Objects/codeobject.c' line='2061' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckPureFunction'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='2061' column='1'/> - <parameter type-id='type-id-266' name='p_errmsg' filepath='Objects/codeobject.c' line='2061' column='1'/> + <function-decl name='_PyCode_CheckPureFunction' mangled-name='_PyCode_CheckPureFunction' filepath='Objects/codeobject.c' line='2088' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckPureFunction'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='2088' column='1'/> + <parameter type-id='type-id-266' name='p_errmsg' filepath='Objects/codeobject.c' line='2088' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCode_ReturnsOnlyNone' mangled-name='_PyCode_ReturnsOnlyNone' filepath='Objects/codeobject.c' line='2154' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_ReturnsOnlyNone'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='2154' column='1'/> + <function-decl name='_PyCode_ReturnsOnlyNone' mangled-name='_PyCode_ReturnsOnlyNone' filepath='Objects/codeobject.c' line='2181' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_ReturnsOnlyNone'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='2181' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyCode_GetCode' mangled-name='PyCode_GetCode' filepath='Objects/codeobject.c' line='2233' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCode'> - <parameter type-id='type-id-345' name='co' filepath='Objects/codeobject.c' line='2233' column='1'/> + <function-decl name='PyCode_GetCode' mangled-name='PyCode_GetCode' filepath='Objects/codeobject.c' line='2260' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCode'> + <parameter type-id='type-id-347' name='co' filepath='Objects/codeobject.c' line='2260' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCode_ConstantKey' mangled-name='_PyCode_ConstantKey' filepath='Objects/codeobject.c' line='2930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_ConstantKey'> - <parameter type-id='type-id-6' name='op' filepath='Objects/codeobject.c' line='2930' column='1'/> + <function-decl name='_PyCode_ConstantKey' mangled-name='_PyCode_ConstantKey' filepath='Objects/codeobject.c' line='2957' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_ConstantKey'> + <parameter type-id='type-id-6' name='op' filepath='Objects/codeobject.c' line='2957' column='1'/> <return type-id='type-id-6'/> </function-decl> - <pointer-type-def type-id='type-id-364' size-in-bits='64' id='type-id-345'/> - <pointer-type-def type-id='type-id-365' size-in-bits='64' id='type-id-338'/> - <type-decl name='bool' size-in-bits='8' id='type-id-344'/> - <class-decl name='_PyExecutorObject' size-in-bits='1152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='75' column='1' id='type-id-365'> + <pointer-type-def type-id='type-id-366' size-in-bits='64' id='type-id-347'/> + <pointer-type-def type-id='type-id-367' size-in-bits='64' id='type-id-340'/> + <type-decl name='bool' size-in-bits='8' id='type-id-346'/> + <class-decl name='_PyExecutorObject' size-in-bits='1152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='75' column='1' id='type-id-367'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='trace' type-id='type-id-358' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='77' column='1'/> + <var-decl name='trace' type-id='type-id-360' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='77' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='vm_data' type-id='type-id-342' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='78' column='1'/> + <var-decl name='vm_data' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='exit_count' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='79' column='1'/> + <var-decl name='exit_count' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='79' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='800'> - <var-decl name='code_size' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='80' column='1'/> + <var-decl name='code_size' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='80' 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='81' column='1'/> + <var-decl name='jit_size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='81' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='jit_code' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='82' column='1'/> + <var-decl name='jit_code' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='82' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='jit_side_entry' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='83' column='1'/> + <var-decl name='jit_side_entry' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='exits' type-id='type-id-320' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='84' column='1'/> + <var-decl name='exits' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='84' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyCodeObject' type-id='type-id-366' filepath='./Include/pytypedefs.h' line='21' column='1' id='type-id-364'/> - <class-decl name='PyCodeObject' size-in-bits='1728' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1' id='type-id-366'> + <typedef-decl name='PyCodeObject' type-id='type-id-368' filepath='./Include/pytypedefs.h' line='21' column='1' id='type-id-366'/> + <class-decl name='PyCodeObject' size-in-bits='1728' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1' id='type-id-368'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> @@ -6620,7 +6633,7 @@ <var-decl name='co_nfreevars' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='co_version' type-id='type-id-322' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_version' type-id='type-id-324' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> <var-decl name='co_localsplusnames' type-id='type-id-6' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> @@ -6644,16 +6657,16 @@ <var-decl name='co_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='co_executors' type-id='type-id-367' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_executors' type-id='type-id-369' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_co_cached' type-id='type-id-368' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='_co_cached' type-id='type-id-370' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_co_instrumentation_version' type-id='type-id-369' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='_co_instrumentation_version' type-id='type-id-371' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_co_monitoring' type-id='type-id-370' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='_co_monitoring' type-id='type-id-372' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1472'> <var-decl name='_co_unique_id' type-id='type-id-7' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> @@ -6662,15 +6675,15 @@ <var-decl name='_co_firsttraceable' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='co_extra' type-id='type-id-35' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_extra' type-id='type-id-41' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='co_code_adaptive' type-id='type-id-371' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_code_adaptive' type-id='type-id-373' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-372' size-in-bits='64' id='type-id-367'/> - <typedef-decl name='_PyExecutorArray' type-id='type-id-373' filepath='./Include/cpython/code.h' line='22' column='1' id='type-id-372'/> - <class-decl name='_PyExecutorArray' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-372' visibility='default' filepath='./Include/cpython/code.h' line='18' column='1' id='type-id-373'> + <pointer-type-def type-id='type-id-374' size-in-bits='64' id='type-id-369'/> + <typedef-decl name='_PyExecutorArray' type-id='type-id-375' filepath='./Include/cpython/code.h' line='22' column='1' id='type-id-374'/> + <class-decl name='_PyExecutorArray' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-374' visibility='default' filepath='./Include/cpython/code.h' line='18' column='1' id='type-id-375'> <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='19' column='1'/> </data-member> @@ -6678,26 +6691,26 @@ <var-decl name='capacity' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='20' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='executors' type-id='type-id-374' visibility='default' filepath='./Include/cpython/code.h' line='21' column='1'/> + <var-decl name='executors' type-id='type-id-376' visibility='default' filepath='./Include/cpython/code.h' line='21' column='1'/> </data-member> </class-decl> - <array-type-def dimensions='1' type-id='type-id-338' size-in-bits='64' id='type-id-374'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-340' size-in-bits='64' id='type-id-376'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> </abi-instr> <abi-instr address-size='64' path='Objects/complexobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_PyUnicodeWriter' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-375' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='519' column='1' id='type-id-376'> + <class-decl name='_PyUnicodeWriter' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-377' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='519' column='1' id='type-id-378'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='buffer' type-id='type-id-6' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='520' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='data' type-id='type-id-35' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='521' column='1'/> + <var-decl name='data' type-id='type-id-41' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='521' 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='522' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='maxchar' type-id='type-id-305' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='523' column='1'/> + <var-decl name='maxchar' type-id='type-id-307' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='523' 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='524' column='1'/> @@ -6709,38 +6722,38 @@ <var-decl name='min_length' type-id='type-id-7' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='528' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='min_char' type-id='type-id-305' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='531' column='1'/> + <var-decl name='min_char' type-id='type-id-307' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='531' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='overallocate' type-id='type-id-95' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='534' column='1'/> + <var-decl name='overallocate' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='534' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='424'> - <var-decl name='readonly' type-id='type-id-95' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='538' column='1'/> + <var-decl name='readonly' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='538' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyUnicodeWriter' type-id='type-id-376' filepath='./Include/cpython/unicodeobject.h' line='539' column='1' id='type-id-375'/> - <pointer-type-def type-id='type-id-377' size-in-bits='64' id='type-id-378'/> - <pointer-type-def type-id='type-id-375' size-in-bits='64' id='type-id-379'/> + <typedef-decl name='_PyUnicodeWriter' type-id='type-id-378' filepath='./Include/cpython/unicodeobject.h' line='539' column='1' id='type-id-377'/> + <pointer-type-def type-id='type-id-379' size-in-bits='64' id='type-id-380'/> + <pointer-type-def type-id='type-id-377' size-in-bits='64' id='type-id-381'/> <var-decl name='PyComplex_Type' type-id='type-id-271' 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-6'/> - <parameter type-id='type-id-172'/> - <return type-id='type-id-304'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-306'/> </function-decl> <function-decl name='_PyUnicodeWriter_Init' mangled-name='_PyUnicodeWriter_Init' filepath='./Include/cpython/unicodeobject.h' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Init'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicodeWriter_Finish' mangled-name='_PyUnicodeWriter_Finish' filepath='./Include/cpython/unicodeobject.h' line='621' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Finish'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyUnicodeWriter_Dealloc' mangled-name='_PyUnicodeWriter_Dealloc' filepath='./Include/cpython/unicodeobject.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Dealloc'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <return type-id='type-id-3'/> </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-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> @@ -6752,13 +6765,13 @@ <parameter type-id='type-id-7'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-378'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-380'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_Py_convert_int_to_double' filepath='./Include/internal/pycore_floatobject.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-241'/> - <parameter type-id='type-id-181'/> + <parameter type-id='type-id-186'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_TransformDecimalAndSpaceToASCII' mangled-name='_PyUnicode_TransformDecimalAndSpaceToASCII' filepath='./Include/internal/pycore_unicodeobject.h' line='203' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_TransformDecimalAndSpaceToASCII'> @@ -6766,132 +6779,132 @@ <return type-id='type-id-6'/> </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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='_Py_c_sum' mangled-name='_Py_c_sum' filepath='Objects/complexobject.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_sum'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='32' column='1'/> - <parameter type-id='type-id-360' name='b' filepath='Objects/complexobject.c' line='32' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='32' column='1'/> + <parameter type-id='type-id-362' name='b' filepath='Objects/complexobject.c' line='32' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_cr_sum' mangled-name='_Py_cr_sum' filepath='Objects/complexobject.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_cr_sum'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='41' column='1'/> - <parameter type-id='type-id-172' name='b' filepath='Objects/complexobject.c' line='41' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='41' column='1'/> + <parameter type-id='type-id-178' name='b' filepath='Objects/complexobject.c' line='41' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_c_diff' mangled-name='_Py_c_diff' filepath='Objects/complexobject.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_diff'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='55' column='1'/> - <parameter type-id='type-id-360' name='b' filepath='Objects/complexobject.c' line='55' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='55' column='1'/> + <parameter type-id='type-id-362' name='b' filepath='Objects/complexobject.c' line='55' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_cr_diff' mangled-name='_Py_cr_diff' filepath='Objects/complexobject.c' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_cr_diff'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='64' column='1'/> - <parameter type-id='type-id-172' name='b' filepath='Objects/complexobject.c' line='64' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='64' column='1'/> + <parameter type-id='type-id-178' name='b' filepath='Objects/complexobject.c' line='64' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_rc_diff' mangled-name='_Py_rc_diff' filepath='Objects/complexobject.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_rc_diff'> - <parameter type-id='type-id-172' name='a' filepath='Objects/complexobject.c' line='72' column='1'/> - <parameter type-id='type-id-360' name='b' filepath='Objects/complexobject.c' line='72' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-178' name='a' filepath='Objects/complexobject.c' line='72' column='1'/> + <parameter type-id='type-id-362' name='b' filepath='Objects/complexobject.c' line='72' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_c_neg' mangled-name='_Py_c_neg' filepath='Objects/complexobject.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_neg'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='81' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='81' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_c_prod' mangled-name='_Py_c_prod' filepath='Objects/complexobject.c' line='90' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_prod'> - <parameter type-id='type-id-360' name='z' filepath='Objects/complexobject.c' line='90' column='1'/> - <parameter type-id='type-id-360' name='w' filepath='Objects/complexobject.c' line='90' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='z' filepath='Objects/complexobject.c' line='90' column='1'/> + <parameter type-id='type-id-362' name='w' filepath='Objects/complexobject.c' line='90' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_cr_prod' mangled-name='_Py_cr_prod' filepath='Objects/complexobject.c' line='151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_cr_prod'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='151' column='1'/> - <parameter type-id='type-id-172' name='b' filepath='Objects/complexobject.c' line='151' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='151' column='1'/> + <parameter type-id='type-id-178' name='b' filepath='Objects/complexobject.c' line='151' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_c_quot' mangled-name='_Py_c_quot' filepath='Objects/complexobject.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_quot'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='170' column='1'/> - <parameter type-id='type-id-360' name='b' filepath='Objects/complexobject.c' line='170' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='170' column='1'/> + <parameter type-id='type-id-362' name='b' filepath='Objects/complexobject.c' line='170' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_cr_quot' mangled-name='_Py_cr_quot' filepath='Objects/complexobject.c' line='249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_cr_quot'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='249' column='1'/> - <parameter type-id='type-id-172' name='b' filepath='Objects/complexobject.c' line='249' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='249' column='1'/> + <parameter type-id='type-id-178' name='b' filepath='Objects/complexobject.c' line='249' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_rc_quot' mangled-name='_Py_rc_quot' filepath='Objects/complexobject.c' line='265' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_rc_quot'> - <parameter type-id='type-id-172' name='a' filepath='Objects/complexobject.c' line='265' column='1'/> - <parameter type-id='type-id-360' name='b' filepath='Objects/complexobject.c' line='265' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-178' name='a' filepath='Objects/complexobject.c' line='265' column='1'/> + <parameter type-id='type-id-362' name='b' filepath='Objects/complexobject.c' line='265' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_c_pow' mangled-name='_Py_c_pow' filepath='Objects/complexobject.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_pow'> - <parameter type-id='type-id-360' name='a' filepath='Objects/complexobject.c' line='310' column='1'/> - <parameter type-id='type-id-360' name='b' filepath='Objects/complexobject.c' line='310' column='1'/> - <return type-id='type-id-360'/> + <parameter type-id='type-id-362' name='a' filepath='Objects/complexobject.c' line='310' column='1'/> + <parameter type-id='type-id-362' name='b' filepath='Objects/complexobject.c' line='310' column='1'/> + <return type-id='type-id-362'/> </function-decl> <function-decl name='_Py_c_abs' mangled-name='_Py_c_abs' filepath='Objects/complexobject.c' line='368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_abs'> - <parameter type-id='type-id-360' name='z' filepath='Objects/complexobject.c' line='368' column='1'/> - <return type-id='type-id-172'/> + <parameter type-id='type-id-362' name='z' filepath='Objects/complexobject.c' line='368' column='1'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='PyComplex_FromDoubles' mangled-name='PyComplex_FromDoubles' filepath='Objects/complexobject.c' line='433' 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='433' column='1'/> - <parameter type-id='type-id-172' name='imag' filepath='Objects/complexobject.c' line='433' column='1'/> + <parameter type-id='type-id-178' name='real' filepath='Objects/complexobject.c' line='433' column='1'/> + <parameter type-id='type-id-178' name='imag' filepath='Objects/complexobject.c' line='433' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyComplex_RealAsDouble' mangled-name='PyComplex_RealAsDouble' filepath='Objects/complexobject.c' line='444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_RealAsDouble'> <parameter type-id='type-id-6' name='op' filepath='Objects/complexobject.c' line='444' column='1'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='PyComplex_ImagAsDouble' mangled-name='PyComplex_ImagAsDouble' filepath='Objects/complexobject.c' line='465' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_ImagAsDouble'> <parameter type-id='type-id-6' name='op' filepath='Objects/complexobject.c' line='465' column='1'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> - <function-type size-in-bits='64' id='type-id-377'> + <function-type size-in-bits='64' id='type-id-379'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-6'/> </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-380' size-in-bits='64' id='type-id-381'/> + <pointer-type-def type-id='type-id-382' size-in-bits='64' id='type-id-383'/> <function-decl name='_PyObject_FunctionStr' mangled-name='_PyObject_FunctionStr' filepath='./Include/cpython/object.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_FunctionStr'> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='Py_HashPointer' mangled-name='Py_HashPointer' filepath='./Include/cpython/pyhash.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_HashPointer'> - <parameter type-id='type-id-35'/> - <return type-id='type-id-304'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-306'/> </function-decl> <var-decl name='PyClassMethodDescr_Type' type-id='type-id-271' 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-271' mangled-name='PyGetSetDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='20' column='1' elf-symbol-id='PyGetSetDescr_Type'/> @@ -6902,12 +6915,12 @@ <var-decl name='PyProperty_Type' type-id='type-id-271' 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-4'/> - <parameter type-id='type-id-382'/> + <parameter type-id='type-id-384'/> <return type-id='type-id-6'/> </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-382'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-384'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> @@ -6946,7 +6959,7 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyCMethod_New' mangled-name='PyCMethod_New' filepath='./Include/methodobject.h' line='88' 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-182'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-1'/> @@ -6956,12 +6969,6 @@ <parameter type-id='type-id-1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyObject_SetAttr' mangled-name='PyObject_SetAttr' filepath='./Include/object.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetAttr'> - <parameter type-id='type-id-6'/> - <parameter type-id='type-id-6'/> - <parameter type-id='type-id-6'/> - <return type-id='type-id-5'/> - </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-6'/> <parameter type-id='type-id-7'/> @@ -6970,28 +6977,28 @@ </function-decl> <function-decl name='PyDescr_NewMethod' mangled-name='PyDescr_NewMethod' filepath='Objects/descrobject.c' line='927' 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='927' column='1'/> - <parameter type-id='type-id-176' name='method' filepath='Objects/descrobject.c' line='927' column='1'/> + <parameter type-id='type-id-182' name='method' filepath='Objects/descrobject.c' line='927' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyDescr_NewClassMethod' mangled-name='PyDescr_NewClassMethod' filepath='Objects/descrobject.c' line='973' 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='973' column='1'/> - <parameter type-id='type-id-176' name='method' filepath='Objects/descrobject.c' line='973' column='1'/> + <parameter type-id='type-id-182' name='method' filepath='Objects/descrobject.c' line='973' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyDescr_NewMember' mangled-name='PyDescr_NewMember' filepath='Objects/descrobject.c' line='985' 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='985' column='1'/> - <parameter type-id='type-id-382' name='member' filepath='Objects/descrobject.c' line='985' column='1'/> + <parameter type-id='type-id-384' name='member' filepath='Objects/descrobject.c' line='985' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyDescr_NewGetSet' mangled-name='PyDescr_NewGetSet' filepath='Objects/descrobject.c' line='1003' 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='1003' column='1'/> - <parameter type-id='type-id-383' name='getset' filepath='Objects/descrobject.c' line='1003' column='1'/> + <parameter type-id='type-id-385' name='getset' filepath='Objects/descrobject.c' line='1003' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyDescr_NewWrapper' mangled-name='PyDescr_NewWrapper' filepath='Objects/descrobject.c' line='1015' 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='1015' column='1'/> - <parameter type-id='type-id-381' name='base' filepath='Objects/descrobject.c' line='1015' column='1'/> - <parameter type-id='type-id-35' name='wrapped' filepath='Objects/descrobject.c' line='1015' column='1'/> + <parameter type-id='type-id-383' name='base' filepath='Objects/descrobject.c' line='1015' column='1'/> + <parameter type-id='type-id-41' name='wrapped' filepath='Objects/descrobject.c' line='1015' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyDescr_IsData' mangled-name='PyDescr_IsData' filepath='Objects/descrobject.c' line='1029' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_IsData'> @@ -7009,72 +7016,72 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/dictobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='PyDictKeysObject' type-id='type-id-384' filepath='./Include/cpython/dictobject.h' line='5' column='1' id='type-id-385'/> - <typedef-decl name='PyDictValues' type-id='type-id-386' filepath='./Include/cpython/dictobject.h' line='6' column='1' id='type-id-387'/> - <class-decl name='PyDictObject' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-388' visibility='default' filepath='./Include/cpython/dictobject.h' line='11' column='1' id='type-id-389'> + <typedef-decl name='PyDictKeysObject' type-id='type-id-386' filepath='./Include/cpython/dictobject.h' line='5' column='1' id='type-id-387'/> + <typedef-decl name='PyDictValues' type-id='type-id-388' filepath='./Include/cpython/dictobject.h' line='6' column='1' id='type-id-389'/> + <class-decl name='PyDictObject' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-390' visibility='default' filepath='./Include/cpython/dictobject.h' line='11' column='1' id='type-id-391'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/dictobject.h' line='12' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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_watcher_tag' type-id='type-id-111' visibility='default' filepath='./Include/cpython/dictobject.h' line='23' column='1'/> + <var-decl name='_ma_watcher_tag' type-id='type-id-117' 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-391' visibility='default' filepath='./Include/cpython/dictobject.h' line='25' column='1'/> + <var-decl name='ma_keys' type-id='type-id-393' 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-392' visibility='default' filepath='./Include/cpython/dictobject.h' line='32' column='1'/> + <var-decl name='ma_values' type-id='type-id-394' visibility='default' filepath='./Include/cpython/dictobject.h' line='32' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyDictObject' type-id='type-id-389' filepath='./Include/cpython/dictobject.h' line='33' column='1' id='type-id-388'/> - <class-decl name='_dictkeysobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='171' column='1' id='type-id-384'> + <typedef-decl name='PyDictObject' type-id='type-id-391' filepath='./Include/cpython/dictobject.h' line='33' column='1' id='type-id-390'/> + <class-decl name='_dictkeysobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='177' column='1' id='type-id-386'> <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='172' column='1'/> + <var-decl name='dk_refcnt' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='178' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dk_log2_size' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='175' column='1'/> + <var-decl name='dk_log2_size' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='181' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='72'> - <var-decl name='dk_log2_index_bytes' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='178' column='1'/> + <var-decl name='dk_log2_index_bytes' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='184' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='dk_kind' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='181' column='1'/> + <var-decl name='dk_kind' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='187' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='dk_version' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_dict.h' line='189' column='1'/> + <var-decl name='dk_version' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_dict.h' line='195' 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='192' column='1'/> + <var-decl name='dk_usable' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='198' 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='195' column='1'/> + <var-decl name='dk_nentries' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='201' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='dk_indices' type-id='type-id-275' visibility='default' filepath='./Include/internal/pycore_dict.h' line='211' column='1'/> + <var-decl name='dk_indices' type-id='type-id-277' visibility='default' filepath='./Include/internal/pycore_dict.h' line='217' 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='227' column='1' id='type-id-386'> + <class-decl name='_dictvalues' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='233' column='1' id='type-id-388'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='capacity' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='228' column='1'/> + <var-decl name='capacity' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='234' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='size' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='229' column='1'/> + <var-decl name='size' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='235' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='embedded' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='230' column='1'/> + <var-decl name='embedded' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='236' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24'> - <var-decl name='valid' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_dict.h' line='231' column='1'/> + <var-decl name='valid' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_dict.h' line='237' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='values' type-id='type-id-393' visibility='default' filepath='./Include/internal/pycore_dict.h' line='232' column='1'/> + <var-decl name='values' type-id='type-id-395' visibility='default' filepath='./Include/internal/pycore_dict.h' line='238' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-385' size-in-bits='64' id='type-id-391'/> - <pointer-type-def type-id='type-id-388' size-in-bits='64' id='type-id-394'/> - <pointer-type-def type-id='type-id-387' size-in-bits='64' id='type-id-392'/> + <pointer-type-def type-id='type-id-387' size-in-bits='64' id='type-id-393'/> + <pointer-type-def type-id='type-id-390' size-in-bits='64' id='type-id-396'/> + <pointer-type-def type-id='type-id-389' size-in-bits='64' id='type-id-394'/> <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-6'/> </function-decl> @@ -7107,7 +7114,7 @@ <return type-id='type-id-241'/> </function-decl> <function-decl name='_PyErr_GetRaisedException' mangled-name='_PyErr_GetRaisedException' filepath='./Include/internal/pycore_pyerrors.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_GetRaisedException'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyErr_FormatNote' mangled-name='_PyErr_FormatNote' filepath='./Include/internal/pycore_pyerrors.h' line='190' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_FormatNote'> @@ -7125,197 +7132,197 @@ <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-33'/> + <return type-id='type-id-39'/> </function-decl> - <function-decl name='_PyDict_NewPresized' mangled-name='_PyDict_NewPresized' filepath='Objects/dictobject.c' line='2172' 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='2172' column='1'/> + <function-decl name='_PyDict_NewPresized' mangled-name='_PyDict_NewPresized' filepath='Objects/dictobject.c' line='2173' 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='2173' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyDict_GetItem' mangled-name='PyDict_GetItem' filepath='Objects/dictobject.c' line='2272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItem'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2272' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2272' column='1'/> + <function-decl name='PyDict_GetItem' mangled-name='PyDict_GetItem' filepath='Objects/dictobject.c' line='2273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItem'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2273' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2273' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_GetItem_KnownHash' mangled-name='_PyDict_GetItem_KnownHash' filepath='Objects/dictobject.c' line='2317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItem_KnownHash'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2317' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2317' column='1'/> - <parameter type-id='type-id-304' name='hash' filepath='Objects/dictobject.c' line='2317' column='1'/> + <function-decl name='_PyDict_GetItem_KnownHash' mangled-name='_PyDict_GetItem_KnownHash' filepath='Objects/dictobject.c' line='2318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItem_KnownHash'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2318' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2318' column='1'/> + <parameter type-id='type-id-306' name='hash' filepath='Objects/dictobject.c' line='2318' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_GetItemRef_KnownHash_LockHeld' mangled-name='_PyDict_GetItemRef_KnownHash_LockHeld' filepath='Objects/dictobject.c' line='2343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemRef_KnownHash_LockHeld'> - <parameter type-id='type-id-394' name='op' filepath='Objects/dictobject.c' line='2343' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2343' column='1'/> - <parameter type-id='type-id-304' name='hash' filepath='Objects/dictobject.c' line='2344' column='1'/> - <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='2344' column='1'/> + <function-decl name='_PyDict_GetItemRef_KnownHash_LockHeld' mangled-name='_PyDict_GetItemRef_KnownHash_LockHeld' filepath='Objects/dictobject.c' line='2344' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemRef_KnownHash_LockHeld'> + <parameter type-id='type-id-396' name='op' filepath='Objects/dictobject.c' line='2344' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2344' column='1'/> + <parameter type-id='type-id-306' name='hash' filepath='Objects/dictobject.c' line='2345' column='1'/> + <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='2345' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_GetItemStringWithError' mangled-name='_PyDict_GetItemStringWithError' filepath='Objects/dictobject.c' line='2494' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemStringWithError'> - <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='2494' column='1'/> - <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2494' column='1'/> + <function-decl name='_PyDict_GetItemStringWithError' mangled-name='_PyDict_GetItemStringWithError' filepath='Objects/dictobject.c' line='2495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemStringWithError'> + <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='2495' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2495' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_LoadGlobal' mangled-name='_PyDict_LoadGlobal' filepath='Objects/dictobject.c' line='2519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_LoadGlobal'> - <parameter type-id='type-id-394' name='globals' filepath='Objects/dictobject.c' line='2519' column='1'/> - <parameter type-id='type-id-394' name='builtins' filepath='Objects/dictobject.c' line='2519' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2519' column='1'/> + <function-decl name='_PyDict_LoadGlobal' mangled-name='_PyDict_LoadGlobal' filepath='Objects/dictobject.c' line='2520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_LoadGlobal'> + <parameter type-id='type-id-396' name='globals' filepath='Objects/dictobject.c' line='2520' column='1'/> + <parameter type-id='type-id-396' name='builtins' filepath='Objects/dictobject.c' line='2520' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2520' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_LoadGlobalStackRef' mangled-name='_PyDict_LoadGlobalStackRef' filepath='Objects/dictobject.c' line='2544' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_LoadGlobalStackRef'> - <parameter type-id='type-id-394' name='globals' filepath='Objects/dictobject.c' line='2544' column='1'/> - <parameter type-id='type-id-394' name='builtins' filepath='Objects/dictobject.c' line='2544' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2544' column='1'/> - <parameter type-id='type-id-395' name='res' filepath='Objects/dictobject.c' line='2544' column='1'/> + <function-decl name='_PyDict_LoadGlobalStackRef' mangled-name='_PyDict_LoadGlobalStackRef' filepath='Objects/dictobject.c' line='2545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_LoadGlobalStackRef'> + <parameter type-id='type-id-396' name='globals' filepath='Objects/dictobject.c' line='2545' column='1'/> + <parameter type-id='type-id-396' name='builtins' filepath='Objects/dictobject.c' line='2545' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2545' column='1'/> + <parameter type-id='type-id-397' name='res' filepath='Objects/dictobject.c' line='2545' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyDict_SetItem_Take2' mangled-name='_PyDict_SetItem_Take2' filepath='Objects/dictobject.c' line='2630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_Take2'> - <parameter type-id='type-id-394' name='mp' filepath='Objects/dictobject.c' line='2630' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2630' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='2630' column='1'/> + <function-decl name='_PyDict_SetItem_Take2' mangled-name='_PyDict_SetItem_Take2' filepath='Objects/dictobject.c' line='2631' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_Take2'> + <parameter type-id='type-id-396' name='mp' filepath='Objects/dictobject.c' line='2631' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2631' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='2631' 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='2669' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash_LockHeld'> - <parameter type-id='type-id-394' name='mp' filepath='Objects/dictobject.c' line='2669' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2669' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='2669' column='1'/> - <parameter type-id='type-id-304' name='hash' filepath='Objects/dictobject.c' line='2670' column='1'/> + <function-decl name='_PyDict_SetItem_KnownHash_LockHeld' mangled-name='_PyDict_SetItem_KnownHash_LockHeld' filepath='Objects/dictobject.c' line='2670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash_LockHeld'> + <parameter type-id='type-id-396' name='mp' filepath='Objects/dictobject.c' line='2670' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2670' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='2670' column='1'/> + <parameter type-id='type-id-306' name='hash' filepath='Objects/dictobject.c' line='2671' 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='2681' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2681' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2681' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='2681' column='1'/> - <parameter type-id='type-id-304' name='hash' filepath='Objects/dictobject.c' line='2682' column='1'/> + <function-decl name='_PyDict_SetItem_KnownHash' mangled-name='_PyDict_SetItem_KnownHash' filepath='Objects/dictobject.c' line='2682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2682' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2682' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='2682' column='1'/> + <parameter type-id='type-id-306' name='hash' filepath='Objects/dictobject.c' line='2683' 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='2805' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItem_KnownHash'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2805' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2805' column='1'/> - <parameter type-id='type-id-304' name='hash' filepath='Objects/dictobject.c' line='2805' column='1'/> + <function-decl name='_PyDict_DelItem_KnownHash' mangled-name='_PyDict_DelItem_KnownHash' filepath='Objects/dictobject.c' line='2806' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItem_KnownHash'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2806' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2806' column='1'/> + <parameter type-id='type-id-306' name='hash' filepath='Objects/dictobject.c' line='2806' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_DelItemIf' mangled-name='_PyDict_DelItemIf' filepath='Objects/dictobject.c' line='2859' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItemIf'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2859' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2859' column='1'/> - <parameter type-id='type-id-396' name='predicate' filepath='Objects/dictobject.c' line='2860' column='1'/> - <parameter type-id='type-id-35' name='arg' filepath='Objects/dictobject.c' line='2861' column='1'/> + <function-decl name='_PyDict_DelItemIf' mangled-name='_PyDict_DelItemIf' filepath='Objects/dictobject.c' line='2860' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItemIf'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2860' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2860' column='1'/> + <parameter type-id='type-id-398' name='predicate' filepath='Objects/dictobject.c' line='2861' column='1'/> + <parameter type-id='type-id-41' name='arg' filepath='Objects/dictobject.c' line='2862' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_Clear' mangled-name='PyDict_Clear' filepath='Objects/dictobject.c' line='2924' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Clear'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2924' column='1'/> + <function-decl name='PyDict_Clear' mangled-name='PyDict_Clear' filepath='Objects/dictobject.c' line='2925' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Clear'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='2925' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyDict_PopString' mangled-name='PyDict_PopString' filepath='Objects/dictobject.c' line='3116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_PopString'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='3116' column='1'/> - <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='3116' column='1'/> - <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='3116' column='1'/> + <function-decl name='PyDict_PopString' mangled-name='PyDict_PopString' filepath='Objects/dictobject.c' line='3117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_PopString'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='3117' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='3117' column='1'/> + <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='3117' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_Pop' mangled-name='_PyDict_Pop' filepath='Objects/dictobject.c' line='3147' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_Pop'> - <parameter type-id='type-id-6' name='dict' filepath='Objects/dictobject.c' line='3147' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='3147' column='1'/> - <parameter type-id='type-id-6' name='default_value' filepath='Objects/dictobject.c' line='3147' column='1'/> + <function-decl name='_PyDict_Pop' mangled-name='_PyDict_Pop' filepath='Objects/dictobject.c' line='3148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_Pop'> + <parameter type-id='type-id-6' name='dict' filepath='Objects/dictobject.c' line='3148' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='3148' column='1'/> + <parameter type-id='type-id-6' name='default_value' filepath='Objects/dictobject.c' line='3148' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyDict_MergeFromSeq2' mangled-name='PyDict_MergeFromSeq2' filepath='Objects/dictobject.c' line='3795' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_MergeFromSeq2'> - <parameter type-id='type-id-6' name='d' filepath='Objects/dictobject.c' line='3795' column='1'/> - <parameter type-id='type-id-6' name='seq2' filepath='Objects/dictobject.c' line='3795' column='1'/> - <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='3795' column='1'/> + <function-decl name='PyDict_MergeFromSeq2' mangled-name='PyDict_MergeFromSeq2' filepath='Objects/dictobject.c' line='3796' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_MergeFromSeq2'> + <parameter type-id='type-id-6' name='d' filepath='Objects/dictobject.c' line='3796' column='1'/> + <parameter type-id='type-id-6' name='seq2' filepath='Objects/dictobject.c' line='3796' column='1'/> + <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='3796' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_Merge' mangled-name='PyDict_Merge' filepath='Objects/dictobject.c' line='4012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Merge'> - <parameter type-id='type-id-6' name='a' filepath='Objects/dictobject.c' line='4012' column='1'/> - <parameter type-id='type-id-6' name='b' filepath='Objects/dictobject.c' line='4012' column='1'/> - <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='4012' column='1'/> + <function-decl name='PyDict_Merge' mangled-name='PyDict_Merge' filepath='Objects/dictobject.c' line='4013' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Merge'> + <parameter type-id='type-id-6' name='a' filepath='Objects/dictobject.c' line='4013' column='1'/> + <parameter type-id='type-id-6' name='b' filepath='Objects/dictobject.c' line='4013' column='1'/> + <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='4013' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_MergeEx' mangled-name='_PyDict_MergeEx' filepath='Objects/dictobject.c' line='4020' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_MergeEx'> - <parameter type-id='type-id-6' name='a' filepath='Objects/dictobject.c' line='4020' column='1'/> - <parameter type-id='type-id-6' name='b' filepath='Objects/dictobject.c' line='4020' column='1'/> - <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='4020' column='1'/> + <function-decl name='_PyDict_MergeEx' mangled-name='_PyDict_MergeEx' filepath='Objects/dictobject.c' line='4021' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_MergeEx'> + <parameter type-id='type-id-6' name='a' filepath='Objects/dictobject.c' line='4021' column='1'/> + <parameter type-id='type-id-6' name='b' filepath='Objects/dictobject.c' line='4021' column='1'/> + <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='4021' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_SetDefaultRef' mangled-name='PyDict_SetDefaultRef' filepath='Objects/dictobject.c' line='4441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefaultRef'> - <parameter type-id='type-id-6' name='d' filepath='Objects/dictobject.c' line='4441' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4441' column='1'/> - <parameter type-id='type-id-6' name='default_value' filepath='Objects/dictobject.c' line='4441' column='1'/> - <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='4442' column='1'/> + <function-decl name='PyDict_SetDefaultRef' mangled-name='PyDict_SetDefaultRef' filepath='Objects/dictobject.c' line='4423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefaultRef'> + <parameter type-id='type-id-6' name='d' filepath='Objects/dictobject.c' line='4423' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4423' column='1'/> + <parameter type-id='type-id-6' name='default_value' filepath='Objects/dictobject.c' line='4423' column='1'/> + <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='4424' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_SetDefault' mangled-name='PyDict_SetDefault' filepath='Objects/dictobject.c' line='4452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefault'> - <parameter type-id='type-id-6' name='d' filepath='Objects/dictobject.c' line='4452' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4452' column='1'/> - <parameter type-id='type-id-6' name='defaultobj' filepath='Objects/dictobject.c' line='4452' column='1'/> + <function-decl name='PyDict_SetDefault' mangled-name='PyDict_SetDefault' filepath='Objects/dictobject.c' line='4434' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefault'> + <parameter type-id='type-id-6' name='d' filepath='Objects/dictobject.c' line='4434' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4434' column='1'/> + <parameter type-id='type-id-6' name='defaultobj' filepath='Objects/dictobject.c' line='4434' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_SizeOf' mangled-name='_PyDict_SizeOf' filepath='Objects/dictobject.c' line='4674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SizeOf'> - <parameter type-id='type-id-394' name='mp' filepath='Objects/dictobject.c' line='4674' column='1'/> + <function-decl name='_PyDict_SizeOf' mangled-name='_PyDict_SizeOf' filepath='Objects/dictobject.c' line='4658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SizeOf'> + <parameter type-id='type-id-396' name='mp' filepath='Objects/dictobject.c' line='4658' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyDict_ContainsString' mangled-name='PyDict_ContainsString' filepath='Objects/dictobject.c' line='4781' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_ContainsString'> - <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='4781' column='1'/> - <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4781' column='1'/> + <function-decl name='PyDict_ContainsString' mangled-name='PyDict_ContainsString' filepath='Objects/dictobject.c' line='4765' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_ContainsString'> + <parameter type-id='type-id-6' name='op' filepath='Objects/dictobject.c' line='4765' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4765' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_GetItemString' mangled-name='PyDict_GetItemString' filepath='Objects/dictobject.c' line='4976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemString'> - <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='4976' column='1'/> - <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4976' column='1'/> + <function-decl name='PyDict_GetItemString' mangled-name='PyDict_GetItemString' filepath='Objects/dictobject.c' line='4960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemString'> + <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='4960' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4960' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyDict_GetItemStringRef' mangled-name='PyDict_GetItemStringRef' filepath='Objects/dictobject.c' line='4994' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemStringRef'> - <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='4994' column='1'/> - <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4994' column='1'/> - <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='4994' column='1'/> + <function-decl name='PyDict_GetItemStringRef' mangled-name='PyDict_GetItemStringRef' filepath='Objects/dictobject.c' line='4978' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemStringRef'> + <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='4978' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4978' column='1'/> + <parameter type-id='type-id-241' name='result' filepath='Objects/dictobject.c' line='4978' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_DelItemString' mangled-name='PyDict_DelItemString' filepath='Objects/dictobject.c' line='5041' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_DelItemString'> - <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='5041' column='1'/> - <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='5041' column='1'/> + <function-decl name='PyDict_DelItemString' mangled-name='PyDict_DelItemString' filepath='Objects/dictobject.c' line='5025' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_DelItemString'> + <parameter type-id='type-id-6' name='v' filepath='Objects/dictobject.c' line='5025' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='5025' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyObject_VisitManagedDict' mangled-name='PyObject_VisitManagedDict' filepath='Objects/dictobject.c' line='7188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VisitManagedDict'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/dictobject.c' line='7188' column='1'/> - <parameter type-id='type-id-397' name='visit' filepath='Objects/dictobject.c' line='7188' column='1'/> - <parameter type-id='type-id-35' name='arg' filepath='Objects/dictobject.c' line='7188' column='1'/> + <function-decl name='PyObject_VisitManagedDict' mangled-name='PyObject_VisitManagedDict' filepath='Objects/dictobject.c' line='7163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VisitManagedDict'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/dictobject.c' line='7163' column='1'/> + <parameter type-id='type-id-399' name='visit' filepath='Objects/dictobject.c' line='7163' column='1'/> + <parameter type-id='type-id-41' name='arg' filepath='Objects/dictobject.c' line='7163' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyObject_SetManagedDict' mangled-name='_PyObject_SetManagedDict' filepath='Objects/dictobject.c' line='7307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_SetManagedDict'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/dictobject.c' line='7307' column='1'/> - <parameter type-id='type-id-6' name='new_dict' filepath='Objects/dictobject.c' line='7307' column='1'/> + <function-decl name='_PyObject_SetManagedDict' mangled-name='_PyObject_SetManagedDict' filepath='Objects/dictobject.c' line='7282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_SetManagedDict'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/dictobject.c' line='7282' column='1'/> + <parameter type-id='type-id-6' name='new_dict' filepath='Objects/dictobject.c' line='7282' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyObject_ClearManagedDict' mangled-name='PyObject_ClearManagedDict' filepath='Objects/dictobject.c' line='7422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ClearManagedDict'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/dictobject.c' line='7422' column='1'/> + <function-decl name='PyObject_ClearManagedDict' mangled-name='PyObject_ClearManagedDict' filepath='Objects/dictobject.c' line='7397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ClearManagedDict'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/dictobject.c' line='7397' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyDict_Watch' mangled-name='PyDict_Watch' filepath='Objects/dictobject.c' line='7648' 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='7648' column='1'/> - <parameter type-id='type-id-6' name='dict' filepath='Objects/dictobject.c' line='7648' column='1'/> + <function-decl name='PyDict_Watch' mangled-name='PyDict_Watch' filepath='Objects/dictobject.c' line='7623' 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='7623' column='1'/> + <parameter type-id='type-id-6' name='dict' filepath='Objects/dictobject.c' line='7623' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_Unwatch' mangled-name='PyDict_Unwatch' filepath='Objects/dictobject.c' line='7663' 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='7663' column='1'/> - <parameter type-id='type-id-6' name='dict' filepath='Objects/dictobject.c' line='7663' column='1'/> + <function-decl name='PyDict_Unwatch' mangled-name='PyDict_Unwatch' filepath='Objects/dictobject.c' line='7638' 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='7638' column='1'/> + <parameter type-id='type-id-6' name='dict' filepath='Objects/dictobject.c' line='7638' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_AddWatcher' mangled-name='PyDict_AddWatcher' filepath='Objects/dictobject.c' line='7678' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_AddWatcher'> - <parameter type-id='type-id-398' name='callback' filepath='Objects/dictobject.c' line='7678' column='1'/> + <function-decl name='PyDict_AddWatcher' mangled-name='PyDict_AddWatcher' filepath='Objects/dictobject.c' line='7653' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_AddWatcher'> + <parameter type-id='type-id-400' name='callback' filepath='Objects/dictobject.c' line='7653' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyDict_ClearWatcher' mangled-name='PyDict_ClearWatcher' filepath='Objects/dictobject.c' line='7695' 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='7695' column='1'/> + <function-decl name='PyDict_ClearWatcher' mangled-name='PyDict_ClearWatcher' filepath='Objects/dictobject.c' line='7670' 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='7670' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_SendEvent' mangled-name='_PyDict_SendEvent' filepath='Objects/dictobject.c' line='7718' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SendEvent'> - <parameter type-id='type-id-5' name='watcher_bits' filepath='Objects/dictobject.c' line='7718' column='1'/> - <parameter type-id='type-id-399' name='event' filepath='Objects/dictobject.c' line='7719' column='1'/> - <parameter type-id='type-id-394' name='mp' filepath='Objects/dictobject.c' line='7720' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='7721' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='7722' column='1'/> + <function-decl name='_PyDict_SendEvent' mangled-name='_PyDict_SendEvent' filepath='Objects/dictobject.c' line='7693' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SendEvent'> + <parameter type-id='type-id-5' name='watcher_bits' filepath='Objects/dictobject.c' line='7693' column='1'/> + <parameter type-id='type-id-401' name='event' filepath='Objects/dictobject.c' line='7694' column='1'/> + <parameter type-id='type-id-396' name='mp' filepath='Objects/dictobject.c' line='7695' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='7696' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Objects/dictobject.c' line='7697' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-type size-in-bits='64' id='type-id-400'> + <function-type size-in-bits='64' id='type-id-402'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-type> </abi-instr> @@ -7324,8 +7331,8 @@ <var-decl name='PyReversed_Type' type-id='type-id-271' 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'> - <qualified-type-def type-id='type-id-17' const='yes' id='type-id-401'/> - <pointer-type-def type-id='type-id-401' size-in-bits='64' id='type-id-129'/> + <qualified-type-def type-id='type-id-24' const='yes' id='type-id-403'/> + <pointer-type-def type-id='type-id-403' size-in-bits='64' id='type-id-135'/> <var-decl name='PyExc_PythonFinalizationError' type-id='type-id-6' mangled-name='PyExc_PythonFinalizationError' visibility='default' filepath='./Include/cpython/pyerrors.h' line='130' 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-6'/> @@ -7353,22 +7360,22 @@ </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-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyErr_SetRaisedException' mangled-name='_PyErr_SetRaisedException' filepath='./Include/internal/pycore_pyerrors.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetRaisedException'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> <var-decl name='_PyExc_IncompleteInputError' type-id='type-id-271' mangled-name='_PyExc_IncompleteInputError' visibility='default' filepath='./Include/internal/pycore_pyerrors.h' line='198' column='1' elf-symbol-id='_PyExc_IncompleteInputError'/> <function-decl name='_PyStaticType_InitBuiltin' filepath='./Include/internal/pycore_typeobject.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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='54' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-1'/> <return type-id='type-id-3'/> </function-decl> @@ -7387,7 +7394,7 @@ <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-129'/> + <parameter type-id='type-id-135'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> @@ -7402,7 +7409,7 @@ <function-decl name='PyObject_GenericSetDict' mangled-name='PyObject_GenericSetDict' filepath='./Include/object.h' line='467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericSetDict'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <var-decl name='PyExc_BaseException' type-id='type-id-6' mangled-name='PyExc_BaseException' visibility='default' filepath='./Include/pyerrors.h' line='76' column='1' elf-symbol-id='PyExc_BaseException'/> @@ -7482,7 +7489,7 @@ <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-6'/> <parameter type-id='type-id-7'/> - <return type-id='type-id-305'/> + <return type-id='type-id-307'/> </function-decl> <function-decl name='PyException_GetTraceback' mangled-name='PyException_GetTraceback' filepath='Objects/exceptions.c' line='519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetTraceback'> <parameter type-id='type-id-6' name='self' filepath='Objects/exceptions.c' line='519' column='1'/> @@ -7650,8 +7657,8 @@ <var-decl name='PyStdPrinter_Type' type-id='type-id-271' 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='124' 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-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-7'/> </function-decl> <function-decl name='_PyUnicode_AsUTF8String' mangled-name='_PyUnicode_AsUTF8String' filepath='./Include/internal/pycore_unicodeobject.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsUTF8String'> @@ -7663,15 +7670,15 @@ <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-61'/> + <parameter type-id='type-id-67'/> <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-61'/> + <parameter type-id='type-id-67'/> <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-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyFile_FromFd' mangled-name='PyFile_FromFd' filepath='Objects/fileobject.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_FromFd'> @@ -7707,23 +7714,23 @@ </function-decl> <function-decl name='_PyLong_FileDescriptor_Converter' mangled-name='_PyLong_FileDescriptor_Converter' filepath='Objects/fileobject.c' line='220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FileDescriptor_Converter'> <parameter type-id='type-id-6' name='o' filepath='Objects/fileobject.c' line='220' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/fileobject.c' line='220' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/fileobject.c' line='220' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='Py_UniversalNewlineFgets' mangled-name='Py_UniversalNewlineFgets' filepath='Objects/fileobject.c' line='274' 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='274' column='1'/> + <parameter type-id='type-id-24' name='buf' filepath='Objects/fileobject.c' line='274' column='1'/> <parameter type-id='type-id-5' name='n' filepath='Objects/fileobject.c' line='274' column='1'/> - <parameter type-id='type-id-61' name='stream' filepath='Objects/fileobject.c' line='274' column='1'/> + <parameter type-id='type-id-67' name='stream' filepath='Objects/fileobject.c' line='274' column='1'/> <parameter type-id='type-id-6' name='fobj' filepath='Objects/fileobject.c' line='274' column='1'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='PyFile_NewStdPrinter' mangled-name='PyFile_NewStdPrinter' filepath='Objects/fileobject.c' line='290' 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='290' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyFile_SetOpenCodeHook' mangled-name='PyFile_SetOpenCodeHook' filepath='Objects/fileobject.c' line='481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_SetOpenCodeHook'> - <parameter type-id='type-id-402' name='hook' filepath='Objects/fileobject.c' line='481' column='1'/> - <parameter type-id='type-id-35' name='userData' filepath='Objects/fileobject.c' line='481' column='1'/> + <parameter type-id='type-id-404' name='hook' filepath='Objects/fileobject.c' line='481' column='1'/> + <parameter type-id='type-id-41' name='userData' filepath='Objects/fileobject.c' line='481' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyFile_OpenCodeObject' mangled-name='PyFile_OpenCodeObject' filepath='Objects/fileobject.c' line='501' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_OpenCodeObject'> @@ -7736,7 +7743,7 @@ </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-403'> + <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-405'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/structseq.h' line='11' column='1'/> </data-member> @@ -7744,8 +7751,8 @@ <var-decl name='doc' type-id='type-id-4' visibility='default' filepath='./Include/structseq.h' line='12' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyStructSequence_Field' type-id='type-id-403' filepath='./Include/structseq.h' line='13' column='1' id='type-id-404'/> - <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-405'> + <typedef-decl name='PyStructSequence_Field' type-id='type-id-405' filepath='./Include/structseq.h' line='13' column='1' id='type-id-406'/> + <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-407'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/structseq.h' line='16' column='1'/> </data-member> @@ -7753,47 +7760,47 @@ <var-decl name='doc' type-id='type-id-4' 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-406' visibility='default' filepath='./Include/structseq.h' line='18' column='1'/> + <var-decl name='fields' type-id='type-id-408' 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-405' filepath='./Include/structseq.h' line='20' column='1' id='type-id-407'/> - <pointer-type-def type-id='type-id-407' size-in-bits='64' id='type-id-408'/> - <pointer-type-def type-id='type-id-404' size-in-bits='64' id='type-id-406'/> - <qualified-type-def type-id='type-id-251' restrict='yes' id='type-id-183'/> - <qualified-type-def type-id='type-id-4' restrict='yes' id='type-id-180'/> + <typedef-decl name='PyStructSequence_Desc' type-id='type-id-407' filepath='./Include/structseq.h' line='20' column='1' id='type-id-409'/> + <pointer-type-def type-id='type-id-409' size-in-bits='64' id='type-id-410'/> + <pointer-type-def type-id='type-id-406' size-in-bits='64' id='type-id-408'/> + <qualified-type-def type-id='type-id-251' restrict='yes' id='type-id-187'/> + <qualified-type-def type-id='type-id-4' restrict='yes' id='type-id-15'/> <function-decl name='PyLong_GetSign' mangled-name='PyLong_GetSign' filepath='./Include/cpython/longobject.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetSign'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-183'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyLong_NumBits' mangled-name='_PyLong_NumBits' filepath='./Include/cpython/longobject.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_NumBits'> <parameter type-id='type-id-6'/> - <return type-id='type-id-409'/> + <return type-id='type-id-411'/> </function-decl> <var-decl name='PyFloat_Type' type-id='type-id-271' 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='27' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-251'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='_Py_dg_dtoa' filepath='./Include/internal/pycore_dtoa.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-172'/> + <parameter type-id='type-id-178'/> <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-183'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-251'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_Py_dg_freedtoa' filepath='./Include/internal/pycore_dtoa.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> + <parameter type-id='type-id-24'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyFloat_FormatAdvancedWriter' filepath='./Include/internal/pycore_floatobject.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> @@ -7803,36 +7810,36 @@ <function-decl name='_Py_parse_inf_or_nan' filepath='./Include/internal/pycore_floatobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-251'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='_PyLong_Lshift' mangled-name='_PyLong_Lshift' filepath='./Include/internal/pycore_long.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Lshift'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-409'/> + <parameter type-id='type-id-411'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyDebugAllocatorStats' filepath='./Include/internal/pycore_object.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <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'/> + <return type-id='type-id-28'/> </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'/> + <parameter type-id='type-id-28'/> <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-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-1'/> - <parameter type-id='type-id-408'/> + <parameter type-id='type-id-410'/> <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-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-1'/> <return type-id='type-id-3'/> </function-decl> @@ -7842,7 +7849,7 @@ <return type-id='type-id-6'/> </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'/> + <parameter type-id='type-id-178'/> <return type-id='type-id-6'/> </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'> @@ -7860,44 +7867,44 @@ <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-180'/> - <parameter type-id='type-id-183'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-187'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-183'/> + <return type-id='type-id-178'/> </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-178'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </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-181'/> - <return type-id='type-id-172'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-186'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </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'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='PyFloat_GetMax' mangled-name='PyFloat_GetMax' filepath='Objects/floatobject.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetMax'> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='PyFloat_GetMin' mangled-name='PyFloat_GetMin' filepath='Objects/floatobject.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetMin'> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> <function-decl name='PyFloat_GetInfo' mangled-name='PyFloat_GetInfo' filepath='Objects/floatobject.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetInfo'> <return type-id='type-id-6'/> @@ -7907,41 +7914,41 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyFloat_Pack2' mangled-name='PyFloat_Pack2' filepath='Objects/floatobject.c' line='2004' 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='2004' column='1'/> - <parameter type-id='type-id-17' name='data' filepath='Objects/floatobject.c' line='2004' column='1'/> + <parameter type-id='type-id-178' name='x' filepath='Objects/floatobject.c' line='2004' column='1'/> + <parameter type-id='type-id-24' name='data' filepath='Objects/floatobject.c' line='2004' column='1'/> <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2004' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFloat_Pack4' mangled-name='PyFloat_Pack4' filepath='Objects/floatobject.c' line='2108' 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='2108' column='1'/> - <parameter type-id='type-id-17' name='data' filepath='Objects/floatobject.c' line='2108' column='1'/> - <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2108' column='1'/> + <function-decl name='PyFloat_Pack4' mangled-name='PyFloat_Pack4' filepath='Objects/floatobject.c' line='2112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack4'> + <parameter type-id='type-id-178' name='x' filepath='Objects/floatobject.c' line='2112' column='1'/> + <parameter type-id='type-id-24' name='data' filepath='Objects/floatobject.c' line='2112' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2112' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFloat_Pack8' mangled-name='PyFloat_Pack8' filepath='Objects/floatobject.c' line='2250' 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='2250' column='1'/> - <parameter type-id='type-id-17' name='data' filepath='Objects/floatobject.c' line='2250' column='1'/> - <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2250' column='1'/> + <function-decl name='PyFloat_Pack8' mangled-name='PyFloat_Pack8' filepath='Objects/floatobject.c' line='2258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack8'> + <parameter type-id='type-id-178' name='x' filepath='Objects/floatobject.c' line='2258' column='1'/> + <parameter type-id='type-id-24' name='data' filepath='Objects/floatobject.c' line='2258' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2258' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFloat_Unpack2' mangled-name='PyFloat_Unpack2' filepath='Objects/floatobject.c' line='2382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack2'> - <parameter type-id='type-id-4' name='data' filepath='Objects/floatobject.c' line='2382' column='1'/> - <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2382' column='1'/> - <return type-id='type-id-172'/> + <function-decl name='PyFloat_Unpack2' mangled-name='PyFloat_Unpack2' filepath='Objects/floatobject.c' line='2390' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack2'> + <parameter type-id='type-id-4' name='data' filepath='Objects/floatobject.c' line='2390' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2390' column='1'/> + <return type-id='type-id-178'/> </function-decl> - <function-decl name='PyFloat_Unpack4' mangled-name='PyFloat_Unpack4' filepath='Objects/floatobject.c' line='2438' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack4'> - <parameter type-id='type-id-4' name='data' filepath='Objects/floatobject.c' line='2438' column='1'/> - <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2438' column='1'/> - <return type-id='type-id-172'/> + <function-decl name='PyFloat_Unpack4' mangled-name='PyFloat_Unpack4' filepath='Objects/floatobject.c' line='2446' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack4'> + <parameter type-id='type-id-4' name='data' filepath='Objects/floatobject.c' line='2446' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2446' column='1'/> + <return type-id='type-id-178'/> </function-decl> - <function-decl name='PyFloat_Unpack8' mangled-name='PyFloat_Unpack8' filepath='Objects/floatobject.c' line='2552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack8'> - <parameter type-id='type-id-4' name='data' filepath='Objects/floatobject.c' line='2552' column='1'/> - <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2552' column='1'/> - <return type-id='type-id-172'/> + <function-decl name='PyFloat_Unpack8' mangled-name='PyFloat_Unpack8' filepath='Objects/floatobject.c' line='2560' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack8'> + <parameter type-id='type-id-4' name='data' filepath='Objects/floatobject.c' line='2560' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2560' column='1'/> + <return type-id='type-id-178'/> </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-410' visibility='default' filepath='./Include/cpython/funcobject.h' line='21' column='1' id='type-id-411'> + <class-decl name='PyFrameConstructor' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-412' visibility='default' filepath='./Include/cpython/funcobject.h' line='21' column='1' id='type-id-413'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='fc_globals' type-id='type-id-6' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> </data-member> @@ -7967,8 +7974,8 @@ <var-decl name='fc_closure' type-id='type-id-6' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyFrameConstructor' type-id='type-id-411' filepath='./Include/cpython/funcobject.h' line='23' column='1' id='type-id-410'/> - <pointer-type-def type-id='type-id-410' size-in-bits='64' id='type-id-412'/> + <typedef-decl name='PyFrameConstructor' type-id='type-id-413' filepath='./Include/cpython/funcobject.h' line='23' column='1' id='type-id-412'/> + <pointer-type-def type-id='type-id-412' size-in-bits='64' id='type-id-414'/> <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'/> @@ -7996,31 +8003,31 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_SetOpcodeTrace' filepath='./Include/internal/pycore_ceval.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-413'/> - <parameter type-id='type-id-344'/> + <function-decl name='_PyEval_SetOpcodeTrace' filepath='./Include/internal/pycore_ceval.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-415'/> + <parameter type-id='type-id-346'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCode_GetCode' filepath='./Include/internal/pycore_code.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-347'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyCode_InitAddressRange' filepath='./Include/internal/pycore_code.h' line='265' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> - <parameter type-id='type-id-353'/> + <parameter type-id='type-id-347'/> + <parameter type-id='type-id-355'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyLineTable_NextAddressRange' filepath='./Include/internal/pycore_code.h' line='275' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-353'/> + <parameter type-id='type-id-355'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_LoadBuiltinsFromGlobals' filepath='./Include/internal/pycore_dict.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyDict_LoadBuiltinsFromGlobals' filepath='./Include/internal/pycore_dict.h' line='139' 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='_PyFunction_FromConstructor' filepath='./Include/internal/pycore_function.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-412'/> - <return type-id='type-id-312'/> + <parameter type-id='type-id-414'/> + <return type-id='type-id-314'/> </function-decl> <function-decl name='_PyGen_Finalize' filepath='./Include/internal/pycore_genobject.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> @@ -8044,69 +8051,69 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyFrame_GetLineNumber' mangled-name='PyFrame_GetLineNumber' filepath='Objects/frameobject.c' line='989' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLineNumber'> - <parameter type-id='type-id-413' name='f' filepath='Objects/frameobject.c' line='989' column='1'/> + <parameter type-id='type-id-415' name='f' filepath='Objects/frameobject.c' line='989' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFrame_New' mangled-name='PyFrame_New' filepath='Objects/frameobject.c' line='2125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_New'> - <parameter type-id='type-id-31' name='tstate' filepath='Objects/frameobject.c' line='2125' column='1'/> - <parameter type-id='type-id-345' name='code' filepath='Objects/frameobject.c' line='2125' column='1'/> - <parameter type-id='type-id-6' name='globals' filepath='Objects/frameobject.c' line='2126' column='1'/> - <parameter type-id='type-id-6' name='locals' filepath='Objects/frameobject.c' line='2126' column='1'/> - <return type-id='type-id-413'/> + <function-decl name='PyFrame_New' mangled-name='PyFrame_New' filepath='Objects/frameobject.c' line='2127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_New'> + <parameter type-id='type-id-37' name='tstate' filepath='Objects/frameobject.c' line='2127' column='1'/> + <parameter type-id='type-id-347' name='code' filepath='Objects/frameobject.c' line='2127' column='1'/> + <parameter type-id='type-id-6' name='globals' filepath='Objects/frameobject.c' line='2128' column='1'/> + <parameter type-id='type-id-6' name='locals' filepath='Objects/frameobject.c' line='2128' column='1'/> + <return type-id='type-id-415'/> </function-decl> - <function-decl name='PyFrame_GetVar' mangled-name='PyFrame_GetVar' filepath='Objects/frameobject.c' line='2291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVar'> - <parameter type-id='type-id-413' name='frame_obj' filepath='Objects/frameobject.c' line='2291' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Objects/frameobject.c' line='2291' column='1'/> + <function-decl name='PyFrame_GetVar' mangled-name='PyFrame_GetVar' filepath='Objects/frameobject.c' line='2293' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVar'> + <parameter type-id='type-id-415' name='frame_obj' filepath='Objects/frameobject.c' line='2293' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/frameobject.c' line='2293' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyFrame_GetVarString' mangled-name='PyFrame_GetVarString' filepath='Objects/frameobject.c' line='2325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVarString'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2325' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Objects/frameobject.c' line='2325' column='1'/> + <function-decl name='PyFrame_GetVarString' mangled-name='PyFrame_GetVarString' filepath='Objects/frameobject.c' line='2327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVarString'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2327' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/frameobject.c' line='2327' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyFrame_FastToLocalsWithError' mangled-name='PyFrame_FastToLocalsWithError' filepath='Objects/frameobject.c' line='2338' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocalsWithError'> - <parameter type-id='type-id-413' name='f' filepath='Objects/frameobject.c' line='2338' column='1'/> + <function-decl name='PyFrame_FastToLocalsWithError' mangled-name='PyFrame_FastToLocalsWithError' filepath='Objects/frameobject.c' line='2340' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocalsWithError'> + <parameter type-id='type-id-415' name='f' filepath='Objects/frameobject.c' line='2340' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFrame_FastToLocals' mangled-name='PyFrame_FastToLocals' filepath='Objects/frameobject.c' line='2346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocals'> - <parameter type-id='type-id-413' name='f' filepath='Objects/frameobject.c' line='2346' column='1'/> + <function-decl name='PyFrame_FastToLocals' mangled-name='PyFrame_FastToLocals' filepath='Objects/frameobject.c' line='2348' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocals'> + <parameter type-id='type-id-415' name='f' filepath='Objects/frameobject.c' line='2348' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyFrame_LocalsToFast' mangled-name='PyFrame_LocalsToFast' filepath='Objects/frameobject.c' line='2354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_LocalsToFast'> - <parameter type-id='type-id-413' name='f' filepath='Objects/frameobject.c' line='2354' column='1'/> - <parameter type-id='type-id-5' name='clear' filepath='Objects/frameobject.c' line='2354' column='1'/> + <function-decl name='PyFrame_LocalsToFast' mangled-name='PyFrame_LocalsToFast' filepath='Objects/frameobject.c' line='2356' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_LocalsToFast'> + <parameter type-id='type-id-415' name='f' filepath='Objects/frameobject.c' line='2356' column='1'/> + <parameter type-id='type-id-5' name='clear' filepath='Objects/frameobject.c' line='2356' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyFrame_IsEntryFrame' mangled-name='_PyFrame_IsEntryFrame' filepath='Objects/frameobject.c' line='2362' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFrame_IsEntryFrame'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2362' column='1'/> + <function-decl name='_PyFrame_IsEntryFrame' mangled-name='_PyFrame_IsEntryFrame' filepath='Objects/frameobject.c' line='2364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFrame_IsEntryFrame'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2364' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFrame_GetCode' mangled-name='PyFrame_GetCode' filepath='Objects/frameobject.c' line='2371' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetCode'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2371' column='1'/> - <return type-id='type-id-345'/> + <function-decl name='PyFrame_GetCode' mangled-name='PyFrame_GetCode' filepath='Objects/frameobject.c' line='2373' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetCode'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2373' column='1'/> + <return type-id='type-id-347'/> </function-decl> - <function-decl name='PyFrame_GetBack' mangled-name='PyFrame_GetBack' filepath='Objects/frameobject.c' line='2384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBack'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2384' column='1'/> - <return type-id='type-id-413'/> + <function-decl name='PyFrame_GetBack' mangled-name='PyFrame_GetBack' filepath='Objects/frameobject.c' line='2386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBack'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2386' column='1'/> + <return type-id='type-id-415'/> </function-decl> - <function-decl name='PyFrame_GetLocals' mangled-name='PyFrame_GetLocals' filepath='Objects/frameobject.c' line='2400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLocals'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2400' column='1'/> + <function-decl name='PyFrame_GetLocals' mangled-name='PyFrame_GetLocals' filepath='Objects/frameobject.c' line='2402' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLocals'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2402' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyFrame_GetGlobals' mangled-name='PyFrame_GetGlobals' filepath='Objects/frameobject.c' line='2407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGlobals'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2407' column='1'/> + <function-decl name='PyFrame_GetGlobals' mangled-name='PyFrame_GetGlobals' filepath='Objects/frameobject.c' line='2409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGlobals'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2409' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyFrame_GetBuiltins' mangled-name='PyFrame_GetBuiltins' filepath='Objects/frameobject.c' line='2414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBuiltins'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2414' column='1'/> + <function-decl name='PyFrame_GetBuiltins' mangled-name='PyFrame_GetBuiltins' filepath='Objects/frameobject.c' line='2416' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBuiltins'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2416' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyFrame_GetLasti' mangled-name='PyFrame_GetLasti' filepath='Objects/frameobject.c' line='2421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLasti'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2421' column='1'/> + <function-decl name='PyFrame_GetLasti' mangled-name='PyFrame_GetLasti' filepath='Objects/frameobject.c' line='2423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLasti'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2423' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyFrame_GetGenerator' mangled-name='PyFrame_GetGenerator' filepath='Objects/frameobject.c' line='2433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGenerator'> - <parameter type-id='type-id-413' name='frame' filepath='Objects/frameobject.c' line='2433' column='1'/> + <function-decl name='PyFrame_GetGenerator' mangled-name='PyFrame_GetGenerator' filepath='Objects/frameobject.c' line='2435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGenerator'> + <parameter type-id='type-id-415' name='frame' filepath='Objects/frameobject.c' line='2435' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> @@ -8117,20 +8124,20 @@ <function-decl name='_PyFunction_Vectorcall' filepath='./Include/internal/pycore_function.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-265'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyEval_StopTheWorld' mangled-name='_PyEval_StopTheWorld' filepath='./Include/internal/pycore_pystate.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_StopTheWorld'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyEval_StartTheWorld' mangled-name='_PyEval_StartTheWorld' filepath='./Include/internal/pycore_pystate.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_StartTheWorld'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </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-414' name='callback' filepath='Objects/funcobject.c' line='73' column='1'/> + <parameter type-id='type-id-416' name='callback' filepath='Objects/funcobject.c' line='73' column='1'/> <return type-id='type-id-5'/> </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'> @@ -8144,8 +8151,8 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyFunction_SetVersion' mangled-name='_PyFunction_SetVersion' filepath='Objects/funcobject.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFunction_SetVersion'> - <parameter type-id='type-id-312' name='func' filepath='Objects/funcobject.c' line='310' column='1'/> - <parameter type-id='type-id-322' name='version' filepath='Objects/funcobject.c' line='310' column='1'/> + <parameter type-id='type-id-314' name='func' filepath='Objects/funcobject.c' line='310' column='1'/> + <parameter type-id='type-id-324' name='version' filepath='Objects/funcobject.c' line='310' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyFunction_New' mangled-name='PyFunction_New' filepath='Objects/funcobject.c' line='407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_New'> @@ -8175,8 +8182,8 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='PyFunction_SetVectorcall' mangled-name='PyFunction_SetVectorcall' filepath='Objects/funcobject.c' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetVectorcall'> - <parameter type-id='type-id-312' name='func' filepath='Objects/funcobject.c' line='476' column='1'/> - <parameter type-id='type-id-313' name='vectorcall' filepath='Objects/funcobject.c' line='476' column='1'/> + <parameter type-id='type-id-314' name='func' filepath='Objects/funcobject.c' line='476' column='1'/> + <parameter type-id='type-id-315' name='vectorcall' filepath='Objects/funcobject.c' line='476' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyFunction_GetKwDefaults' mangled-name='PyFunction_GetKwDefaults' filepath='Objects/funcobject.c' line='484' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetKwDefaults'> @@ -8207,7 +8214,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyFunction_VerifyStateless' mangled-name='_PyFunction_VerifyStateless' filepath='Objects/funcobject.c' line='1245' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFunction_VerifyStateless'> - <parameter type-id='type-id-31' name='tstate' filepath='Objects/funcobject.c' line='1245' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Objects/funcobject.c' line='1245' column='1'/> <parameter type-id='type-id-6' name='func' filepath='Objects/funcobject.c' line='1245' column='1'/> <return type-id='type-id-5'/> </function-decl> @@ -8222,19 +8229,19 @@ </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_WriteChar' mangled-name='PyUnicodeWriter_WriteChar' filepath='./Include/cpython/unicodeobject.h' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteChar'> - <parameter type-id='type-id-415'/> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-417'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyUnicodeWriter_WriteASCII' mangled-name='PyUnicodeWriter_WriteASCII' filepath='./Include/cpython/unicodeobject.h' line='481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteASCII'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-7'/> <return type-id='type-id-5'/> </function-decl> <var-decl name='Py_GenericAliasType' type-id='type-id-271' mangled-name='Py_GenericAliasType' visibility='default' filepath='./Include/genericaliasobject.h' line='9' column='1' elf-symbol-id='Py_GenericAliasType'/> <function-decl name='_Py_typing_type_repr' filepath='./Include/internal/pycore_typevarobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> @@ -8260,16 +8267,16 @@ <return type-id='type-id-6'/> </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-35'/> + <parameter type-id='type-id-41'/> <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'> - <typedef-decl name='PyGenObject' type-id='type-id-416' filepath='./Include/cpython/genobject.h' line='12' column='1' id='type-id-417'/> - <typedef-decl name='PyAsyncGenObject' type-id='type-id-418' filepath='./Include/cpython/genobject.h' line='38' column='1' id='type-id-419'/> - <class-decl name='_PyGenObject' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='76' column='1' id='type-id-416'> + <typedef-decl name='PyGenObject' type-id='type-id-418' filepath='./Include/cpython/genobject.h' line='12' column='1' id='type-id-419'/> + <typedef-decl name='PyAsyncGenObject' type-id='type-id-420' filepath='./Include/cpython/genobject.h' line='38' column='1' id='type-id-421'/> + <class-decl name='_PyGenObject' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='76' column='1' id='type-id-418'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='gi_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> @@ -8281,30 +8288,30 @@ <var-decl name='gi_qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='gi_exc_state' type-id='type-id-420' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='gi_exc_state' type-id='type-id-422' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> <var-decl name='gi_origin_or_finalizer' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='gi_hooks_inited' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='gi_hooks_inited' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='520'> - <var-decl name='gi_closed' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='gi_closed' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='528'> - <var-decl name='gi_running_async' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='gi_running_async' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='536'> - <var-decl name='gi_frame_state' type-id='type-id-421' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='gi_frame_state' type-id='type-id-423' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='gi_iframe' type-id='type-id-422' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> + <var-decl name='gi_iframe' type-id='type-id-424' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='78' column='1'/> </data-member> </class-decl> - <class-decl name='_PyAsyncGenObject' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='85' column='1' id='type-id-418'> + <class-decl name='_PyAsyncGenObject' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='85' column='1' id='type-id-420'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='ag_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> @@ -8316,37 +8323,37 @@ <var-decl name='ag_qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ag_exc_state' type-id='type-id-420' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ag_exc_state' type-id='type-id-422' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> <var-decl name='ag_origin_or_finalizer' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='ag_hooks_inited' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ag_hooks_inited' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='520'> - <var-decl name='ag_closed' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ag_closed' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='528'> - <var-decl name='ag_running_async' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ag_running_async' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='536'> - <var-decl name='ag_frame_state' type-id='type-id-421' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ag_frame_state' type-id='type-id-423' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='ag_iframe' type-id='type-id-422' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> + <var-decl name='ag_iframe' type-id='type-id-424' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='86' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyInterpreterFrame' type-id='type-id-423' filepath='./Include/internal/pycore_typedefs.h' line='12' column='1' id='type-id-422'/> - <typedef-decl name='int8_t' type-id='type-id-424' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='24' column='1' id='type-id-421'/> - <typedef-decl name='__int8_t' type-id='type-id-425' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='37' column='1' id='type-id-424'/> - <pointer-type-def type-id='type-id-419' size-in-bits='64' id='type-id-426'/> - <pointer-type-def type-id='type-id-417' size-in-bits='64' id='type-id-427'/> - <pointer-type-def type-id='type-id-422' size-in-bits='64' id='type-id-428'/> - <pointer-type-def type-id='type-id-429' size-in-bits='64' id='type-id-430'/> + <typedef-decl name='_PyInterpreterFrame' type-id='type-id-425' filepath='./Include/internal/pycore_typedefs.h' line='12' column='1' id='type-id-424'/> + <typedef-decl name='int8_t' type-id='type-id-426' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='24' column='1' id='type-id-423'/> + <typedef-decl name='__int8_t' type-id='type-id-427' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='37' column='1' id='type-id-426'/> + <pointer-type-def type-id='type-id-421' size-in-bits='64' id='type-id-428'/> + <pointer-type-def type-id='type-id-419' size-in-bits='64' id='type-id-429'/> + <pointer-type-def type-id='type-id-424' size-in-bits='64' id='type-id-430'/> + <pointer-type-def type-id='type-id-431' size-in-bits='64' id='type-id-432'/> <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-31'/> - <parameter type-id='type-id-431'/> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-433'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-decl> @@ -8359,33 +8366,33 @@ <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-431'/> + <parameter type-id='type-id-433'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_GetFrame' filepath='./Include/internal/pycore_ceval.h' line='240' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-428'/> + <function-decl name='_PyEval_GetFrame' filepath='./Include/internal/pycore_ceval.h' line='242' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-430'/> </function-decl> - <function-decl name='_PyGC_VisitStackRef' filepath='./Include/internal/pycore_gc.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-430'/> - <parameter type-id='type-id-397'/> - <parameter type-id='type-id-35'/> + <function-decl name='_PyGC_VisitStackRef' filepath='./Include/internal/pycore_gc.h' line='368' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-432'/> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <var-decl name='_PyCoroWrapper_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='36' column='1'/> <var-decl name='_PyAsyncGenWrappedValue_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='37' column='1'/> <var-decl name='_PyAsyncGenAThrow_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='38' column='1'/> - <function-decl name='_PyFrame_MakeAndSetFrameObject' filepath='./Include/internal/pycore_interpframe.h' line='228' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-428'/> - <return type-id='type-id-413'/> + <function-decl name='_PyFrame_MakeAndSetFrameObject' filepath='./Include/internal/pycore_interpframe.h' line='283' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-430'/> + <return type-id='type-id-415'/> </function-decl> - <function-decl name='_PyFrame_ClearExceptCode' filepath='./Include/internal/pycore_interpframe.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-428'/> + <function-decl name='_PyFrame_ClearExceptCode' filepath='./Include/internal/pycore_interpframe.h' line='313' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-430'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyFrame_Traverse' filepath='./Include/internal/pycore_interpframe.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-397'/> - <parameter type-id='type-id-35'/> + <function-decl name='_PyFrame_Traverse' filepath='./Include/internal/pycore_interpframe.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyErr_ChainStackItem' filepath='./Include/internal/pycore_pyerrors.h' line='116' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -8396,14 +8403,14 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_WarnUnawaitedAgenMethod' filepath='./Include/internal/pycore_warnings.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-426'/> + <parameter type-id='type-id-428'/> <parameter type-id='type-id-6'/> <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-354'/> + <return type-id='type-id-356'/> </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-241'/> @@ -8412,57 +8419,57 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyGen_GetCode' mangled-name='PyGen_GetCode' filepath='Objects/genobject.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_GetCode'> - <parameter type-id='type-id-427' name='gen' filepath='Objects/genobject.c' line='53' column='1'/> - <return type-id='type-id-345'/> + <parameter type-id='type-id-429' name='gen' filepath='Objects/genobject.c' line='53' column='1'/> + <return type-id='type-id-347'/> </function-decl> <function-decl name='_PyGen_yf' mangled-name='_PyGen_yf' filepath='Objects/genobject.c' line='374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_yf'> - <parameter type-id='type-id-427' name='gen' filepath='Objects/genobject.c' line='374' column='1'/> + <parameter type-id='type-id-429' name='gen' filepath='Objects/genobject.c' line='374' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyGen_SetStopIterationValue' mangled-name='_PyGen_SetStopIterationValue' filepath='Objects/genobject.c' line='650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_SetStopIterationValue'> <parameter type-id='type-id-6' name='value' filepath='Objects/genobject.c' line='650' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_MakeCoro' mangled-name='_Py_MakeCoro' filepath='Objects/genobject.c' line='937' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_MakeCoro'> - <parameter type-id='type-id-312' name='func' filepath='Objects/genobject.c' line='937' column='1'/> + <function-decl name='_Py_MakeCoro' mangled-name='_Py_MakeCoro' filepath='Objects/genobject.c' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_MakeCoro'> + <parameter type-id='type-id-314' name='func' filepath='Objects/genobject.c' line='938' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyGen_NewWithQualName' mangled-name='PyGen_NewWithQualName' filepath='Objects/genobject.c' line='1021' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_NewWithQualName'> - <parameter type-id='type-id-413' name='f' filepath='Objects/genobject.c' line='1021' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Objects/genobject.c' line='1021' column='1'/> - <parameter type-id='type-id-6' name='qualname' filepath='Objects/genobject.c' line='1021' column='1'/> + <function-decl name='PyGen_NewWithQualName' mangled-name='PyGen_NewWithQualName' filepath='Objects/genobject.c' line='1022' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_NewWithQualName'> + <parameter type-id='type-id-415' name='f' filepath='Objects/genobject.c' line='1022' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/genobject.c' line='1022' column='1'/> + <parameter type-id='type-id-6' name='qualname' filepath='Objects/genobject.c' line='1022' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyGen_New' mangled-name='PyGen_New' filepath='Objects/genobject.c' line='1027' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_New'> - <parameter type-id='type-id-413' name='f' filepath='Objects/genobject.c' line='1027' column='1'/> + <function-decl name='PyGen_New' mangled-name='PyGen_New' filepath='Objects/genobject.c' line='1028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_New'> + <parameter type-id='type-id-415' name='f' filepath='Objects/genobject.c' line='1028' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCoro_GetAwaitableIter' mangled-name='_PyCoro_GetAwaitableIter' filepath='Objects/genobject.c' line='1065' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCoro_GetAwaitableIter'> - <parameter type-id='type-id-6' name='o' filepath='Objects/genobject.c' line='1065' column='1'/> + <function-decl name='_PyCoro_GetAwaitableIter' mangled-name='_PyCoro_GetAwaitableIter' filepath='Objects/genobject.c' line='1066' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCoro_GetAwaitableIter'> + <parameter type-id='type-id-6' name='o' filepath='Objects/genobject.c' line='1066' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyCoro_New' mangled-name='PyCoro_New' filepath='Objects/genobject.c' line='1398' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCoro_New'> - <parameter type-id='type-id-413' name='f' filepath='Objects/genobject.c' line='1398' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Objects/genobject.c' line='1398' column='1'/> - <parameter type-id='type-id-6' name='qualname' filepath='Objects/genobject.c' line='1398' column='1'/> + <function-decl name='PyCoro_New' mangled-name='PyCoro_New' filepath='Objects/genobject.c' line='1399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCoro_New'> + <parameter type-id='type-id-415' name='f' filepath='Objects/genobject.c' line='1399' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/genobject.c' line='1399' column='1'/> + <parameter type-id='type-id-6' name='qualname' filepath='Objects/genobject.c' line='1399' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyAsyncGen_New' mangled-name='PyAsyncGen_New' filepath='Objects/genobject.c' line='1706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyAsyncGen_New'> - <parameter type-id='type-id-413' name='f' filepath='Objects/genobject.c' line='1706' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Objects/genobject.c' line='1706' column='1'/> - <parameter type-id='type-id-6' name='qualname' filepath='Objects/genobject.c' line='1706' column='1'/> + <function-decl name='PyAsyncGen_New' mangled-name='PyAsyncGen_New' filepath='Objects/genobject.c' line='1707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyAsyncGen_New'> + <parameter type-id='type-id-415' name='f' filepath='Objects/genobject.c' line='1707' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/genobject.c' line='1707' column='1'/> + <parameter type-id='type-id-6' name='qualname' filepath='Objects/genobject.c' line='1707' column='1'/> <return type-id='type-id-6'/> </function-decl> - <pointer-type-def type-id='type-id-432' size-in-bits='64' id='type-id-413'/> - <class-decl name='_PyInterpreterFrame' size-in-bits='704' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='30' column='1' id='type-id-423'> + <pointer-type-def type-id='type-id-434' size-in-bits='64' id='type-id-415'/> + <class-decl name='_PyInterpreterFrame' size-in-bits='704' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='30' column='1' id='type-id-425'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='f_executable' type-id='type-id-433' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='31' column='1'/> + <var-decl name='f_executable' type-id='type-id-435' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='31' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous' type-id='type-id-431' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='32' column='1'/> + <var-decl name='previous' type-id='type-id-433' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='32' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_funcobj' type-id='type-id-433' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='33' column='1'/> + <var-decl name='f_funcobj' type-id='type-id-435' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> <var-decl name='f_globals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='34' column='1'/> @@ -8474,37 +8481,37 @@ <var-decl name='f_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='frame_obj' type-id='type-id-413' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='37' column='1'/> + <var-decl name='frame_obj' type-id='type-id-415' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='37' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='instr_ptr' type-id='type-id-363' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='38' column='1'/> + <var-decl name='instr_ptr' type-id='type-id-365' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='stackpointer' type-id='type-id-395' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='39' column='1'/> + <var-decl name='stackpointer' type-id='type-id-397' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='39' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='return_offset' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='44' column='1'/> + <var-decl name='return_offset' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='44' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='592'> - <var-decl name='owner' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='45' column='1'/> + <var-decl name='owner' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='45' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='600'> - <var-decl name='visited' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='50' column='1'/> + <var-decl name='visited' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='50' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='localsplus' type-id='type-id-434' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='53' column='1'/> + <var-decl name='localsplus' type-id='type-id-436' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='53' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyFrameObject' type-id='type-id-435' filepath='./Include/pytypedefs.h' line='22' column='1' id='type-id-432'/> - <class-decl name='_frame' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='18' column='1' id='type-id-435'> + <typedef-decl name='PyFrameObject' type-id='type-id-437' filepath='./Include/pytypedefs.h' line='22' column='1' id='type-id-434'/> + <class-decl name='_frame' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='18' column='1' id='type-id-437'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_frame.h' line='19' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_frame.h' line='19' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_back' type-id='type-id-413' visibility='default' filepath='./Include/internal/pycore_frame.h' line='20' column='1'/> + <var-decl name='f_back' type-id='type-id-415' visibility='default' filepath='./Include/internal/pycore_frame.h' line='20' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='f_frame' type-id='type-id-428' visibility='default' filepath='./Include/internal/pycore_frame.h' line='21' column='1'/> + <var-decl name='f_frame' type-id='type-id-430' visibility='default' filepath='./Include/internal/pycore_frame.h' line='21' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='f_trace' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_frame.h' line='22' column='1'/> @@ -8513,10 +8520,10 @@ <var-decl name='f_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_frame.h' line='23' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='f_trace_lines' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_frame.h' line='24' column='1'/> + <var-decl name='f_trace_lines' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_frame.h' line='24' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='360'> - <var-decl name='f_trace_opcodes' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_frame.h' line='25' column='1'/> + <var-decl name='f_trace_opcodes' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_frame.h' line='25' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> <var-decl name='f_extra_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_frame.h' line='26' column='1'/> @@ -8528,7 +8535,7 @@ <var-decl name='f_overwritten_fast_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_frame.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_f_frame_data' type-id='type-id-393' visibility='default' filepath='./Include/internal/pycore_frame.h' line='38' column='1'/> + <var-decl name='_f_frame_data' type-id='type-id-395' visibility='default' filepath='./Include/internal/pycore_frame.h' line='38' column='1'/> </data-member> </class-decl> </abi-instr> @@ -8556,31 +8563,31 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/listobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <qualified-type-def type-id='type-id-433' const='yes' id='type-id-436'/> - <pointer-type-def type-id='type-id-436' size-in-bits='64' id='type-id-437'/> + <qualified-type-def type-id='type-id-435' const='yes' id='type-id-438'/> + <pointer-type-def type-id='type-id-438' size-in-bits='64' id='type-id-439'/> <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-6'/> <parameter type-id='type-id-8'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyUnicodeWriter_WriteRepr' mangled-name='PyUnicodeWriter_WriteRepr' filepath='./Include/cpython/unicodeobject.h' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteRepr'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <parameter type-id='type-id-6'/> <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'> + <function-decl name='_PyDict_Next' filepath='./Include/internal/pycore_dict.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-8'/> <parameter type-id='type-id-241'/> <parameter type-id='type-id-241'/> - <parameter type-id='type-id-355'/> + <parameter type-id='type-id-357'/> <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-6'/> <parameter type-id='type-id-8'/> <parameter type-id='type-id-241'/> - <parameter type-id='type-id-355'/> + <parameter type-id='type-id-357'/> <return type-id='type-id-5'/> </function-decl> <var-decl name='PyList_Type' type-id='type-id-271' mangled-name='PyList_Type' visibility='default' filepath='./Include/listobject.h' line='20' column='1' elf-symbol-id='PyList_Type'/> @@ -8588,7 +8595,7 @@ <var-decl name='PyListRevIter_Type' type-id='type-id-271' 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='470' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HashNotImplemented'> <parameter type-id='type-id-6'/> - <return type-id='type-id-304'/> + <return type-id='type-id-306'/> </function-decl> <function-decl name='PyList_Size' mangled-name='PyList_Size' filepath='Objects/listobject.c' line='303' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Size'> <parameter type-id='type-id-6' name='op' filepath='Objects/listobject.c' line='303' column='1'/> @@ -8631,7 +8638,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyList_FromStackRefStealOnSuccess' mangled-name='_PyList_FromStackRefStealOnSuccess' filepath='Objects/listobject.c' line='3250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyList_FromStackRefStealOnSuccess'> - <parameter type-id='type-id-437' name='src' filepath='Objects/listobject.c' line='3250' column='1'/> + <parameter type-id='type-id-439' name='src' filepath='Objects/listobject.c' line='3250' column='1'/> <parameter type-id='type-id-7' name='n' filepath='Objects/listobject.c' line='3250' column='1'/> <return type-id='type-id-6'/> </function-decl> @@ -8642,74 +8649,74 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/longobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyLongWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-438'/> - <array-type-def dimensions='1' type-id='type-id-95' size-in-bits='2048' id='type-id-439'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <class-decl name='PyLongWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-440'/> + <array-type-def dimensions='1' type-id='type-id-101' size-in-bits='2048' id='type-id-441'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <class-decl name='PyLongLayout' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='144' column='1' id='type-id-440'> + <class-decl name='PyLongLayout' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='144' column='1' id='type-id-442'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='bits_per_digit' type-id='type-id-309' visibility='default' filepath='./Include/cpython/longintrepr.h' line='145' column='1'/> + <var-decl name='bits_per_digit' type-id='type-id-311' visibility='default' filepath='./Include/cpython/longintrepr.h' line='145' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='digit_size' type-id='type-id-309' visibility='default' filepath='./Include/cpython/longintrepr.h' line='146' column='1'/> + <var-decl name='digit_size' type-id='type-id-311' visibility='default' filepath='./Include/cpython/longintrepr.h' line='146' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='digits_order' type-id='type-id-421' visibility='default' filepath='./Include/cpython/longintrepr.h' line='147' column='1'/> + <var-decl name='digits_order' type-id='type-id-423' visibility='default' filepath='./Include/cpython/longintrepr.h' line='147' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24'> - <var-decl name='digit_endianness' type-id='type-id-421' visibility='default' filepath='./Include/cpython/longintrepr.h' line='148' column='1'/> + <var-decl name='digit_endianness' type-id='type-id-423' visibility='default' filepath='./Include/cpython/longintrepr.h' line='148' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyLongLayout' type-id='type-id-440' filepath='./Include/cpython/longintrepr.h' line='149' column='1' id='type-id-441'/> - <class-decl name='PyLongExport' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='153' column='1' id='type-id-442'> + <typedef-decl name='PyLongLayout' type-id='type-id-442' filepath='./Include/cpython/longintrepr.h' line='149' column='1' id='type-id-443'/> + <class-decl name='PyLongExport' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='153' column='1' id='type-id-444'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-409' visibility='default' filepath='./Include/cpython/longintrepr.h' line='154' column='1'/> + <var-decl name='value' type-id='type-id-411' visibility='default' filepath='./Include/cpython/longintrepr.h' line='154' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='negative' type-id='type-id-309' visibility='default' filepath='./Include/cpython/longintrepr.h' line='155' column='1'/> + <var-decl name='negative' type-id='type-id-311' visibility='default' filepath='./Include/cpython/longintrepr.h' line='155' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='ndigits' type-id='type-id-7' visibility='default' filepath='./Include/cpython/longintrepr.h' line='156' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='digits' type-id='type-id-35' visibility='default' filepath='./Include/cpython/longintrepr.h' line='157' column='1'/> + <var-decl name='digits' type-id='type-id-41' visibility='default' filepath='./Include/cpython/longintrepr.h' line='157' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_reserved' type-id='type-id-443' visibility='default' filepath='./Include/cpython/longintrepr.h' line='159' column='1'/> + <var-decl name='_reserved' type-id='type-id-445' visibility='default' filepath='./Include/cpython/longintrepr.h' line='159' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyLongExport' type-id='type-id-442' filepath='./Include/cpython/longintrepr.h' line='160' column='1' id='type-id-444'/> - <typedef-decl name='PyLongWriter' type-id='type-id-438' filepath='./Include/cpython/longintrepr.h' line='171' column='1' id='type-id-445'/> - <typedef-decl name='Py_uintptr_t' type-id='type-id-369' filepath='./Include/pyport.h' line='144' column='1' id='type-id-443'/> - <pointer-type-def type-id='type-id-444' size-in-bits='64' id='type-id-446'/> - <pointer-type-def type-id='type-id-445' size-in-bits='64' id='type-id-447'/> - <qualified-type-def type-id='type-id-441' const='yes' id='type-id-448'/> - <pointer-type-def type-id='type-id-448' size-in-bits='64' id='type-id-449'/> - <qualified-type-def type-id='type-id-258' const='yes' id='type-id-450'/> + <typedef-decl name='PyLongExport' type-id='type-id-444' filepath='./Include/cpython/longintrepr.h' line='160' column='1' id='type-id-446'/> + <typedef-decl name='PyLongWriter' type-id='type-id-440' filepath='./Include/cpython/longintrepr.h' line='171' column='1' id='type-id-447'/> + <typedef-decl name='Py_uintptr_t' type-id='type-id-371' filepath='./Include/pyport.h' line='145' column='1' id='type-id-445'/> + <pointer-type-def type-id='type-id-446' size-in-bits='64' id='type-id-448'/> + <pointer-type-def type-id='type-id-447' size-in-bits='64' id='type-id-449'/> + <qualified-type-def type-id='type-id-443' const='yes' id='type-id-450'/> <pointer-type-def type-id='type-id-450' size-in-bits='64' id='type-id-451'/> - <qualified-type-def type-id='type-id-95' const='yes' id='type-id-452'/> + <qualified-type-def type-id='type-id-258' const='yes' id='type-id-452'/> <pointer-type-def type-id='type-id-452' size-in-bits='64' id='type-id-453'/> + <qualified-type-def type-id='type-id-101' const='yes' id='type-id-454'/> <pointer-type-def type-id='type-id-454' size-in-bits='64' id='type-id-455'/> <pointer-type-def type-id='type-id-456' size-in-bits='64' id='type-id-457'/> - <pointer-type-def type-id='type-id-409' size-in-bits='64' id='type-id-458'/> - <pointer-type-def type-id='type-id-322' size-in-bits='64' id='type-id-459'/> - <pointer-type-def type-id='type-id-111' size-in-bits='64' id='type-id-460'/> - <pointer-type-def type-id='type-id-95' size-in-bits='64' id='type-id-461'/> - <class-decl name='PyLongWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-438'/> + <pointer-type-def type-id='type-id-458' size-in-bits='64' id='type-id-459'/> + <pointer-type-def type-id='type-id-411' size-in-bits='64' id='type-id-460'/> + <pointer-type-def type-id='type-id-324' size-in-bits='64' id='type-id-461'/> + <pointer-type-def type-id='type-id-117' size-in-bits='64' id='type-id-462'/> + <pointer-type-def type-id='type-id-101' size-in-bits='64' id='type-id-463'/> + <class-decl name='PyLongWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-440'/> <function-decl name='_PyUnicodeWriter_PrepareInternal' mangled-name='_PyUnicodeWriter_PrepareInternal' filepath='./Include/cpython/unicodeobject.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareInternal'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicodeWriter_WriteStr' mangled-name='_PyUnicodeWriter_WriteStr' filepath='./Include/cpython/unicodeobject.h' line='592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteStr'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <var-decl name='_PyLong_DigitValue' type-id='type-id-439' mangled-name='_PyLong_DigitValue' visibility='default' filepath='./Include/internal/pycore_long.h' line='120' column='1' elf-symbol-id='_PyLong_DigitValue'/> + <var-decl name='_PyLong_DigitValue' type-id='type-id-441' mangled-name='_PyLong_DigitValue' visibility='default' filepath='./Include/internal/pycore_long.h' line='120' column='1' elf-symbol-id='_PyLong_DigitValue'/> <function-decl name='_PyLong_FormatAdvancedWriter' filepath='./Include/internal/pycore_long.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> @@ -8728,7 +8735,7 @@ <function-decl name='_PyLong_FromDigits' mangled-name='_PyLong_FromDigits' filepath='Objects/longobject.c' line='201' 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='201' column='1'/> <parameter type-id='type-id-7' name='digit_count' filepath='Objects/longobject.c' line='201' column='1'/> - <parameter type-id='type-id-455' name='digits' filepath='Objects/longobject.c' line='201' column='1'/> + <parameter type-id='type-id-457' name='digits' filepath='Objects/longobject.c' line='201' column='1'/> <return type-id='type-id-259'/> </function-decl> <function-decl name='PyLong_FromUnsignedLong' mangled-name='PyLong_FromUnsignedLong' filepath='Objects/longobject.c' line='411' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedLong'> @@ -8736,12 +8743,12 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyLong_FromUnsignedLongLong' mangled-name='PyLong_FromUnsignedLongLong' filepath='Objects/longobject.c' line='419' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedLongLong'> - <parameter type-id='type-id-462' name='ival' filepath='Objects/longobject.c' line='419' column='1'/> + <parameter type-id='type-id-464' name='ival' filepath='Objects/longobject.c' line='419' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyLong_AsLong' mangled-name='PyLong_AsLong' filepath='Objects/longobject.c' line='593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLong'> <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='593' column='1'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </function-decl> <function-decl name='PyLong_AsUnsignedLong' mangled-name='PyLong_AsUnsignedLong' filepath='Objects/longobject.c' line='677' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLong'> <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='677' column='1'/> @@ -8749,7 +8756,7 @@ </function-decl> <function-decl name='PyLong_AsSize_t' mangled-name='PyLong_AsSize_t' filepath='Objects/longobject.c' line='731' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsSize_t'> <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='731' column='1'/> - <return type-id='type-id-21'/> + <return type-id='type-id-14'/> </function-decl> <function-decl name='PyLong_AsUnsignedLongMask' mangled-name='PyLong_AsUnsignedLongMask' filepath='Objects/longobject.c' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongMask'> <parameter type-id='type-id-6' name='op' filepath='Objects/longobject.c' line='801' column='1'/> @@ -8772,220 +8779,220 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyLong_FromByteArray' mangled-name='_PyLong_FromByteArray' filepath='Objects/longobject.c' line='923' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromByteArray'> - <parameter type-id='type-id-453' name='bytes' filepath='Objects/longobject.c' line='923' column='1'/> - <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='923' column='1'/> + <parameter type-id='type-id-455' name='bytes' filepath='Objects/longobject.c' line='923' column='1'/> + <parameter type-id='type-id-14' name='n' filepath='Objects/longobject.c' line='923' column='1'/> <parameter type-id='type-id-5' name='little_endian' filepath='Objects/longobject.c' line='924' column='1'/> <parameter type-id='type-id-5' name='is_signed' filepath='Objects/longobject.c' line='924' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyLong_AsByteArray' mangled-name='_PyLong_AsByteArray' filepath='Objects/longobject.c' line='1031' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsByteArray'> <parameter type-id='type-id-259' name='v' filepath='Objects/longobject.c' line='1031' column='1'/> - <parameter type-id='type-id-461' name='bytes' filepath='Objects/longobject.c' line='1032' column='1'/> - <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='1032' column='1'/> + <parameter type-id='type-id-463' name='bytes' filepath='Objects/longobject.c' line='1032' column='1'/> + <parameter type-id='type-id-14' name='n' filepath='Objects/longobject.c' line='1032' column='1'/> <parameter type-id='type-id-5' name='little_endian' filepath='Objects/longobject.c' line='1033' column='1'/> <parameter type-id='type-id-5' name='is_signed' filepath='Objects/longobject.c' line='1033' column='1'/> <parameter type-id='type-id-5' name='with_exceptions' filepath='Objects/longobject.c' line='1034' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyLong_AsNativeBytes' mangled-name='PyLong_AsNativeBytes' filepath='Objects/longobject.c' line='1198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsNativeBytes'> - <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1198' column='1'/> - <parameter type-id='type-id-35' name='buffer' filepath='Objects/longobject.c' line='1198' column='1'/> - <parameter type-id='type-id-7' name='n' filepath='Objects/longobject.c' line='1198' column='1'/> - <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1198' column='1'/> + <function-decl name='PyLong_AsNativeBytes' mangled-name='PyLong_AsNativeBytes' filepath='Objects/longobject.c' line='1204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsNativeBytes'> + <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1204' column='1'/> + <parameter type-id='type-id-41' name='buffer' filepath='Objects/longobject.c' line='1204' column='1'/> + <parameter type-id='type-id-7' name='n' filepath='Objects/longobject.c' line='1204' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1204' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyLong_FromNativeBytes' mangled-name='PyLong_FromNativeBytes' filepath='Objects/longobject.c' line='1383' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromNativeBytes'> - <parameter type-id='type-id-35' name='buffer' filepath='Objects/longobject.c' line='1383' column='1'/> - <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='1383' column='1'/> - <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1383' column='1'/> + <function-decl name='PyLong_FromNativeBytes' mangled-name='PyLong_FromNativeBytes' filepath='Objects/longobject.c' line='1389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromNativeBytes'> + <parameter type-id='type-id-41' name='buffer' filepath='Objects/longobject.c' line='1389' column='1'/> + <parameter type-id='type-id-14' name='n' filepath='Objects/longobject.c' line='1389' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1389' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_FromUnsignedNativeBytes' mangled-name='PyLong_FromUnsignedNativeBytes' filepath='Objects/longobject.c' line='1405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedNativeBytes'> - <parameter type-id='type-id-35' name='buffer' filepath='Objects/longobject.c' line='1405' column='1'/> - <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='1405' column='1'/> - <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1405' column='1'/> + <function-decl name='PyLong_FromUnsignedNativeBytes' mangled-name='PyLong_FromUnsignedNativeBytes' filepath='Objects/longobject.c' line='1411' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedNativeBytes'> + <parameter type-id='type-id-41' name='buffer' filepath='Objects/longobject.c' line='1411' column='1'/> + <parameter type-id='type-id-14' name='n' filepath='Objects/longobject.c' line='1411' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1411' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_AsVoidPtr' mangled-name='PyLong_AsVoidPtr' filepath='Objects/longobject.c' line='1441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsVoidPtr'> - <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1441' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='PyLong_AsVoidPtr' mangled-name='PyLong_AsVoidPtr' filepath='Objects/longobject.c' line='1447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsVoidPtr'> + <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1447' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='PyLong_FromLongLong' mangled-name='PyLong_FromLongLong' filepath='Objects/longobject.c' line='1482' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromLongLong'> - <parameter type-id='type-id-463' name='ival' filepath='Objects/longobject.c' line='1482' column='1'/> + <function-decl name='PyLong_FromLongLong' mangled-name='PyLong_FromLongLong' filepath='Objects/longobject.c' line='1488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromLongLong'> + <parameter type-id='type-id-465' name='ival' filepath='Objects/longobject.c' line='1488' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_AsLongLong' mangled-name='PyLong_AsLongLong' filepath='Objects/longobject.c' line='1499' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLong'> - <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1499' column='1'/> - <return type-id='type-id-463'/> + <function-decl name='PyLong_AsLongLong' mangled-name='PyLong_AsLongLong' filepath='Objects/longobject.c' line='1505' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLong'> + <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1505' column='1'/> + <return type-id='type-id-465'/> </function-decl> - <function-decl name='PyLong_AsUnsignedLongLong' mangled-name='PyLong_AsUnsignedLongLong' filepath='Objects/longobject.c' line='1544' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLong'> - <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1544' column='1'/> - <return type-id='type-id-462'/> + <function-decl name='PyLong_AsUnsignedLongLong' mangled-name='PyLong_AsUnsignedLongLong' filepath='Objects/longobject.c' line='1550' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLong'> + <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1550' column='1'/> + <return type-id='type-id-464'/> </function-decl> - <function-decl name='PyLong_AsUnsignedLongLongMask' mangled-name='PyLong_AsUnsignedLongLongMask' filepath='Objects/longobject.c' line='1620' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLongMask'> - <parameter type-id='type-id-6' name='op' filepath='Objects/longobject.c' line='1620' column='1'/> - <return type-id='type-id-462'/> + <function-decl name='PyLong_AsUnsignedLongLongMask' mangled-name='PyLong_AsUnsignedLongLongMask' filepath='Objects/longobject.c' line='1626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLongMask'> + <parameter type-id='type-id-6' name='op' filepath='Objects/longobject.c' line='1626' column='1'/> + <return type-id='type-id-464'/> </function-decl> - <function-decl name='PyLong_AsLongLongAndOverflow' mangled-name='PyLong_AsLongLongAndOverflow' filepath='Objects/longobject.c' line='1654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLongAndOverflow'> - <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1654' column='1'/> - <parameter type-id='type-id-177' name='overflow' filepath='Objects/longobject.c' line='1654' column='1'/> - <return type-id='type-id-463'/> + <function-decl name='PyLong_AsLongLongAndOverflow' mangled-name='PyLong_AsLongLongAndOverflow' filepath='Objects/longobject.c' line='1660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLongAndOverflow'> + <parameter type-id='type-id-6' name='vv' filepath='Objects/longobject.c' line='1660' column='1'/> + <parameter type-id='type-id-183' name='overflow' filepath='Objects/longobject.c' line='1660' column='1'/> + <return type-id='type-id-465'/> </function-decl> - <function-decl name='_PyLong_UnsignedShort_Converter' mangled-name='_PyLong_UnsignedShort_Converter' filepath='Objects/longobject.c' line='1751' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedShort_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1751' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1751' column='1'/> + <function-decl name='_PyLong_UnsignedShort_Converter' mangled-name='_PyLong_UnsignedShort_Converter' filepath='Objects/longobject.c' line='1757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedShort_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1757' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1757' 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='1752' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedInt_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1752' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1752' column='1'/> + <function-decl name='_PyLong_UnsignedInt_Converter' mangled-name='_PyLong_UnsignedInt_Converter' filepath='Objects/longobject.c' line='1758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedInt_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1758' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1758' 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='1753' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLong_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1753' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1753' column='1'/> + <function-decl name='_PyLong_UnsignedLong_Converter' mangled-name='_PyLong_UnsignedLong_Converter' filepath='Objects/longobject.c' line='1759' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLong_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1759' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1759' 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='1754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLongLong_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1754' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1754' column='1'/> + <function-decl name='_PyLong_UnsignedLongLong_Converter' mangled-name='_PyLong_UnsignedLongLong_Converter' filepath='Objects/longobject.c' line='1760' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLongLong_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1760' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1760' 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='1755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Size_t_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1755' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1755' column='1'/> + <function-decl name='_PyLong_Size_t_Converter' mangled-name='_PyLong_Size_t_Converter' filepath='Objects/longobject.c' line='1761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Size_t_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1761' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1761' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyLong_UInt8_Converter' mangled-name='_PyLong_UInt8_Converter' filepath='Objects/longobject.c' line='1756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt8_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1756' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1756' column='1'/> + <function-decl name='_PyLong_UInt8_Converter' mangled-name='_PyLong_UInt8_Converter' filepath='Objects/longobject.c' line='1762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt8_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1762' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1762' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyLong_UInt16_Converter' mangled-name='_PyLong_UInt16_Converter' filepath='Objects/longobject.c' line='1757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt16_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1757' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1757' column='1'/> + <function-decl name='_PyLong_UInt16_Converter' mangled-name='_PyLong_UInt16_Converter' filepath='Objects/longobject.c' line='1763' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt16_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1763' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1763' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyLong_UInt32_Converter' mangled-name='_PyLong_UInt32_Converter' filepath='Objects/longobject.c' line='1758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt32_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1758' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1758' column='1'/> + <function-decl name='_PyLong_UInt32_Converter' mangled-name='_PyLong_UInt32_Converter' filepath='Objects/longobject.c' line='1764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt32_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1764' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1764' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyLong_UInt64_Converter' mangled-name='_PyLong_UInt64_Converter' filepath='Objects/longobject.c' line='1759' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt64_Converter'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1759' column='1'/> - <parameter type-id='type-id-35' name='ptr' filepath='Objects/longobject.c' line='1759' column='1'/> + <function-decl name='_PyLong_UInt64_Converter' mangled-name='_PyLong_UInt64_Converter' filepath='Objects/longobject.c' line='1765' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UInt64_Converter'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='1765' column='1'/> + <parameter type-id='type-id-41' name='ptr' filepath='Objects/longobject.c' line='1765' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyLong_Frexp' mangled-name='_PyLong_Frexp' filepath='Objects/longobject.c' line='3379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Frexp'> - <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='3379' column='1'/> - <parameter type-id='type-id-458' name='e' filepath='Objects/longobject.c' line='3379' column='1'/> - <return type-id='type-id-172'/> + <function-decl name='_PyLong_Frexp' mangled-name='_PyLong_Frexp' filepath='Objects/longobject.c' line='3385' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Frexp'> + <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='3385' column='1'/> + <parameter type-id='type-id-460' name='e' filepath='Objects/longobject.c' line='3385' column='1'/> + <return type-id='type-id-178'/> </function-decl> - <function-decl name='_PyLong_ExactDealloc' mangled-name='_PyLong_ExactDealloc' filepath='Objects/longobject.c' line='3559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_ExactDealloc'> - <parameter type-id='type-id-6' name='self' filepath='Objects/longobject.c' line='3559' column='1'/> + <function-decl name='_PyLong_ExactDealloc' mangled-name='_PyLong_ExactDealloc' filepath='Objects/longobject.c' line='3565' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_ExactDealloc'> + <parameter type-id='type-id-6' name='self' filepath='Objects/longobject.c' line='3565' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyLong_Add' mangled-name='_PyLong_Add' filepath='Objects/longobject.c' line='3775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Add'> - <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='3775' column='1'/> - <parameter type-id='type-id-259' name='b' filepath='Objects/longobject.c' line='3775' column='1'/> + <function-decl name='_PyLong_Add' mangled-name='_PyLong_Add' filepath='Objects/longobject.c' line='3781' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Add'> + <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='3781' column='1'/> + <parameter type-id='type-id-259' name='b' filepath='Objects/longobject.c' line='3781' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyLong_Subtract' mangled-name='_PyLong_Subtract' filepath='Objects/longobject.c' line='3818' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Subtract'> - <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='3818' column='1'/> - <parameter type-id='type-id-259' name='b' filepath='Objects/longobject.c' line='3818' column='1'/> + <function-decl name='_PyLong_Subtract' mangled-name='_PyLong_Subtract' filepath='Objects/longobject.c' line='3824' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Subtract'> + <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='3824' column='1'/> + <parameter type-id='type-id-259' name='b' filepath='Objects/longobject.c' line='3824' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyLong_Multiply' mangled-name='_PyLong_Multiply' filepath='Objects/longobject.c' line='4265' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Multiply'> - <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='4265' column='1'/> - <parameter type-id='type-id-259' name='b' filepath='Objects/longobject.c' line='4265' column='1'/> + <function-decl name='_PyLong_Multiply' mangled-name='_PyLong_Multiply' filepath='Objects/longobject.c' line='4271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Multiply'> + <parameter type-id='type-id-259' name='a' filepath='Objects/longobject.c' line='4271' column='1'/> + <parameter type-id='type-id-259' name='b' filepath='Objects/longobject.c' line='4271' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyLong_Rshift' mangled-name='_PyLong_Rshift' filepath='Objects/longobject.c' line='5342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Rshift'> - <parameter type-id='type-id-6' name='a' filepath='Objects/longobject.c' line='5342' column='1'/> - <parameter type-id='type-id-409' name='shiftby' filepath='Objects/longobject.c' line='5342' column='1'/> + <function-decl name='_PyLong_Rshift' mangled-name='_PyLong_Rshift' filepath='Objects/longobject.c' line='5348' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Rshift'> + <parameter type-id='type-id-6' name='a' filepath='Objects/longobject.c' line='5348' column='1'/> + <parameter type-id='type-id-411' name='shiftby' filepath='Objects/longobject.c' line='5348' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyLong_GCD' mangled-name='_PyLong_GCD' filepath='Objects/longobject.c' line='5651' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_GCD'> - <parameter type-id='type-id-6' name='aarg' filepath='Objects/longobject.c' line='5651' column='1'/> - <parameter type-id='type-id-6' name='barg' filepath='Objects/longobject.c' line='5651' column='1'/> + <function-decl name='_PyLong_GCD' mangled-name='_PyLong_GCD' filepath='Objects/longobject.c' line='5657' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_GCD'> + <parameter type-id='type-id-6' name='aarg' filepath='Objects/longobject.c' line='5657' column='1'/> + <parameter type-id='type-id-6' name='barg' filepath='Objects/longobject.c' line='5657' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyLong_DivmodNear' mangled-name='_PyLong_DivmodNear' filepath='Objects/longobject.c' line='6017' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_DivmodNear'> - <parameter type-id='type-id-6' name='a' filepath='Objects/longobject.c' line='6017' column='1'/> - <parameter type-id='type-id-6' name='b' filepath='Objects/longobject.c' line='6017' column='1'/> + <function-decl name='_PyLong_DivmodNear' mangled-name='_PyLong_DivmodNear' filepath='Objects/longobject.c' line='6024' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_DivmodNear'> + <parameter type-id='type-id-6' name='a' filepath='Objects/longobject.c' line='6024' column='1'/> + <parameter type-id='type-id-6' name='b' filepath='Objects/longobject.c' line='6024' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_GetInfo' mangled-name='PyLong_GetInfo' filepath='Objects/longobject.c' line='6612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetInfo'> + <function-decl name='PyLong_GetInfo' mangled-name='PyLong_GetInfo' filepath='Objects/longobject.c' line='6619' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetInfo'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnstable_Long_IsCompact' mangled-name='PyUnstable_Long_IsCompact' filepath='Objects/longobject.c' line='6667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_IsCompact'> - <parameter type-id='type-id-451' name='op' filepath='Objects/longobject.c' line='6667' column='1'/> + <function-decl name='PyUnstable_Long_IsCompact' mangled-name='PyUnstable_Long_IsCompact' filepath='Objects/longobject.c' line='6674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_IsCompact'> + <parameter type-id='type-id-453' name='op' filepath='Objects/longobject.c' line='6674' 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='6674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_CompactValue'> - <parameter type-id='type-id-451' name='op' filepath='Objects/longobject.c' line='6674' column='1'/> + <function-decl name='PyUnstable_Long_CompactValue' mangled-name='PyUnstable_Long_CompactValue' filepath='Objects/longobject.c' line='6681' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_CompactValue'> + <parameter type-id='type-id-453' name='op' filepath='Objects/longobject.c' line='6681' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyLong_FromInt32' mangled-name='PyLong_FromInt32' filepath='Objects/longobject.c' line='6679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromInt32'> - <parameter type-id='type-id-456' name='value' filepath='Objects/longobject.c' line='6679' column='1'/> + <function-decl name='PyLong_FromInt32' mangled-name='PyLong_FromInt32' filepath='Objects/longobject.c' line='6686' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromInt32'> + <parameter type-id='type-id-458' name='value' filepath='Objects/longobject.c' line='6686' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_FromUInt32' mangled-name='PyLong_FromUInt32' filepath='Objects/longobject.c' line='6684' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUInt32'> - <parameter type-id='type-id-322' name='value' filepath='Objects/longobject.c' line='6684' column='1'/> + <function-decl name='PyLong_FromUInt32' mangled-name='PyLong_FromUInt32' filepath='Objects/longobject.c' line='6691' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUInt32'> + <parameter type-id='type-id-324' name='value' filepath='Objects/longobject.c' line='6691' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_FromInt64' mangled-name='PyLong_FromInt64' filepath='Objects/longobject.c' line='6689' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromInt64'> - <parameter type-id='type-id-409' name='value' filepath='Objects/longobject.c' line='6689' column='1'/> + <function-decl name='PyLong_FromInt64' mangled-name='PyLong_FromInt64' filepath='Objects/longobject.c' line='6696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromInt64'> + <parameter type-id='type-id-411' name='value' filepath='Objects/longobject.c' line='6696' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_FromUInt64' mangled-name='PyLong_FromUInt64' filepath='Objects/longobject.c' line='6694' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUInt64'> - <parameter type-id='type-id-111' name='value' filepath='Objects/longobject.c' line='6694' column='1'/> + <function-decl name='PyLong_FromUInt64' mangled-name='PyLong_FromUInt64' filepath='Objects/longobject.c' line='6701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUInt64'> + <parameter type-id='type-id-117' name='value' filepath='Objects/longobject.c' line='6701' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyLong_AsInt32' mangled-name='PyLong_AsInt32' filepath='Objects/longobject.c' line='6715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsInt32'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6715' column='1'/> - <parameter type-id='type-id-457' name='value' filepath='Objects/longobject.c' line='6715' column='1'/> + <function-decl name='PyLong_AsInt32' mangled-name='PyLong_AsInt32' filepath='Objects/longobject.c' line='6722' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsInt32'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6722' column='1'/> + <parameter type-id='type-id-459' name='value' filepath='Objects/longobject.c' line='6722' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyLong_AsInt64' mangled-name='PyLong_AsInt64' filepath='Objects/longobject.c' line='6720' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsInt64'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6720' column='1'/> - <parameter type-id='type-id-458' name='value' filepath='Objects/longobject.c' line='6720' column='1'/> + <function-decl name='PyLong_AsInt64' mangled-name='PyLong_AsInt64' filepath='Objects/longobject.c' line='6727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsInt64'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6727' column='1'/> + <parameter type-id='type-id-460' name='value' filepath='Objects/longobject.c' line='6727' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyLong_AsUInt32' mangled-name='PyLong_AsUInt32' filepath='Objects/longobject.c' line='6743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUInt32'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6743' column='1'/> - <parameter type-id='type-id-459' name='value' filepath='Objects/longobject.c' line='6743' column='1'/> + <function-decl name='PyLong_AsUInt32' mangled-name='PyLong_AsUInt32' filepath='Objects/longobject.c' line='6750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUInt32'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6750' column='1'/> + <parameter type-id='type-id-461' name='value' filepath='Objects/longobject.c' line='6750' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyLong_AsUInt64' mangled-name='PyLong_AsUInt64' filepath='Objects/longobject.c' line='6748' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUInt64'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6748' column='1'/> - <parameter type-id='type-id-460' name='value' filepath='Objects/longobject.c' line='6748' column='1'/> + <function-decl name='PyLong_AsUInt64' mangled-name='PyLong_AsUInt64' filepath='Objects/longobject.c' line='6755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUInt64'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6755' column='1'/> + <parameter type-id='type-id-462' name='value' filepath='Objects/longobject.c' line='6755' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyLong_GetNativeLayout' mangled-name='PyLong_GetNativeLayout' filepath='Objects/longobject.c' line='6763' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetNativeLayout'> - <return type-id='type-id-449'/> + <function-decl name='PyLong_GetNativeLayout' mangled-name='PyLong_GetNativeLayout' filepath='Objects/longobject.c' line='6770' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetNativeLayout'> + <return type-id='type-id-451'/> </function-decl> - <function-decl name='PyLong_Export' mangled-name='PyLong_Export' filepath='Objects/longobject.c' line='6770' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_Export'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6770' column='1'/> - <parameter type-id='type-id-446' name='export_long' filepath='Objects/longobject.c' line='6770' column='1'/> + <function-decl name='PyLong_Export' mangled-name='PyLong_Export' filepath='Objects/longobject.c' line='6777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_Export'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/longobject.c' line='6777' column='1'/> + <parameter type-id='type-id-448' name='export_long' filepath='Objects/longobject.c' line='6777' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyLong_FreeExport' mangled-name='PyLong_FreeExport' filepath='Objects/longobject.c' line='6813' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FreeExport'> - <parameter type-id='type-id-446' name='export_long' filepath='Objects/longobject.c' line='6813' column='1'/> + <function-decl name='PyLong_FreeExport' mangled-name='PyLong_FreeExport' filepath='Objects/longobject.c' line='6820' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FreeExport'> + <parameter type-id='type-id-448' name='export_long' filepath='Objects/longobject.c' line='6820' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyLongWriter_Create' mangled-name='PyLongWriter_Create' filepath='Objects/longobject.c' line='6826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLongWriter_Create'> - <parameter type-id='type-id-5' name='negative' filepath='Objects/longobject.c' line='6826' column='1'/> - <parameter type-id='type-id-7' name='ndigits' filepath='Objects/longobject.c' line='6826' column='1'/> - <parameter type-id='type-id-267' name='digits' filepath='Objects/longobject.c' line='6826' column='1'/> - <return type-id='type-id-447'/> + <function-decl name='PyLongWriter_Create' mangled-name='PyLongWriter_Create' filepath='Objects/longobject.c' line='6833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLongWriter_Create'> + <parameter type-id='type-id-5' name='negative' filepath='Objects/longobject.c' line='6833' column='1'/> + <parameter type-id='type-id-7' name='ndigits' filepath='Objects/longobject.c' line='6833' column='1'/> + <parameter type-id='type-id-267' name='digits' filepath='Objects/longobject.c' line='6833' column='1'/> + <return type-id='type-id-449'/> </function-decl> - <function-decl name='PyLongWriter_Discard' mangled-name='PyLongWriter_Discard' filepath='Objects/longobject.c' line='6852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLongWriter_Discard'> - <parameter type-id='type-id-447' name='writer' filepath='Objects/longobject.c' line='6852' column='1'/> + <function-decl name='PyLongWriter_Discard' mangled-name='PyLongWriter_Discard' filepath='Objects/longobject.c' line='6859' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLongWriter_Discard'> + <parameter type-id='type-id-449' name='writer' filepath='Objects/longobject.c' line='6859' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyLongWriter_Finish' mangled-name='PyLongWriter_Finish' filepath='Objects/longobject.c' line='6865' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLongWriter_Finish'> - <parameter type-id='type-id-447' name='writer' filepath='Objects/longobject.c' line='6865' column='1'/> + <function-decl name='PyLongWriter_Finish' mangled-name='PyLongWriter_Finish' filepath='Objects/longobject.c' line='6872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLongWriter_Finish'> + <parameter type-id='type-id-449' name='writer' filepath='Objects/longobject.c' line='6872' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> @@ -8997,7 +9004,7 @@ <return type-id='type-id-6'/> </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-24' 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-6'/> @@ -9013,7 +9020,7 @@ <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-6' 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-58' name='order' filepath='Objects/memoryobject.c' line='966' column='1'/> + <parameter type-id='type-id-64' name='order' filepath='Objects/memoryobject.c' line='966' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> @@ -9021,19 +9028,19 @@ <var-decl name='PyCMethod_Type' type-id='type-id-271' 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-271' 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='35' 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='35' column='1'/> + <parameter type-id='type-id-182' name='ml' filepath='Objects/methodobject.c' line='35' column='1'/> <parameter type-id='type-id-6' name='self' filepath='Objects/methodobject.c' line='35' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyCFunction_NewEx' mangled-name='PyCFunction_NewEx' filepath='Objects/methodobject.c' line='41' 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='41' column='1'/> + <parameter type-id='type-id-182' name='ml' filepath='Objects/methodobject.c' line='41' column='1'/> <parameter type-id='type-id-6' name='self' filepath='Objects/methodobject.c' line='41' column='1'/> <parameter type-id='type-id-6' name='module' filepath='Objects/methodobject.c' line='41' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyCFunction_GetFunction' mangled-name='PyCFunction_GetFunction' filepath='Objects/methodobject.c' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetFunction'> <parameter type-id='type-id-6' name='op' filepath='Objects/methodobject.c' line='125' column='1'/> - <return type-id='type-id-464'/> + <return type-id='type-id-466'/> </function-decl> <function-decl name='PyCFunction_GetSelf' mangled-name='PyCFunction_GetSelf' filepath='Objects/methodobject.c' line='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetSelf'> <parameter type-id='type-id-6' name='op' filepath='Objects/methodobject.c' line='135' column='1'/> @@ -9045,12 +9052,12 @@ </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-465'> + <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-467'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/moduleobject.h' line='40' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-466' visibility='default' filepath='./Include/moduleobject.h' line='47' column='1'/> + <var-decl name='m_init' type-id='type-id-468' 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'/> @@ -9059,18 +9066,18 @@ <var-decl name='m_copy' type-id='type-id-6' visibility='default' filepath='./Include/moduleobject.h' line='57' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyModuleDef_Base' type-id='type-id-465' filepath='./Include/moduleobject.h' line='58' column='1' id='type-id-467'/> - <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-468'> + <typedef-decl name='PyModuleDef_Base' type-id='type-id-467' filepath='./Include/moduleobject.h' line='58' column='1' id='type-id-469'/> + <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-470'> <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-35' visibility='default' filepath='./Include/moduleobject.h' line='71' column='1'/> + <var-decl name='value' type-id='type-id-41' 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-469'> + <class-decl name='PyModuleDef' size-in-bits='832' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='107' column='1' id='type-id-471'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='m_base' type-id='type-id-467' visibility='default' filepath='./Include/moduleobject.h' line='108' column='1'/> + <var-decl name='m_base' type-id='type-id-469' 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-4' visibility='default' filepath='./Include/moduleobject.h' line='109' column='1'/> @@ -9082,27 +9089,27 @@ <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'/> + <var-decl name='m_methods' type-id='type-id-182' 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-470' visibility='default' filepath='./Include/moduleobject.h' line='113' column='1'/> + <var-decl name='m_slots' type-id='type-id-472' 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-316' visibility='default' filepath='./Include/moduleobject.h' line='114' column='1'/> + <var-decl name='m_traverse' type-id='type-id-318' 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-317' visibility='default' filepath='./Include/moduleobject.h' line='115' column='1'/> + <var-decl name='m_clear' type-id='type-id-319' 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-471' visibility='default' filepath='./Include/moduleobject.h' line='116' column='1'/> + <var-decl name='m_free' type-id='type-id-473' visibility='default' filepath='./Include/moduleobject.h' line='116' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyModuleDef' type-id='type-id-469' filepath='./Include/pytypedefs.h' line='12' column='1' id='type-id-9'/> - <typedef-decl name='PyModuleDef_Slot' type-id='type-id-468' filepath='./Include/pytypedefs.h' line='13' column='1' id='type-id-472'/> - <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-473'/> - <pointer-type-def type-id='type-id-472' size-in-bits='64' id='type-id-470'/> - <qualified-type-def type-id='type-id-474' const='yes' id='type-id-475'/> - <pointer-type-def type-id='type-id-475' size-in-bits='64' id='type-id-18'/> + <typedef-decl name='PyModuleDef' type-id='type-id-471' filepath='./Include/pytypedefs.h' line='12' column='1' id='type-id-16'/> + <typedef-decl name='PyModuleDef_Slot' type-id='type-id-470' filepath='./Include/pytypedefs.h' line='13' column='1' id='type-id-474'/> + <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-475'/> + <pointer-type-def type-id='type-id-474' size-in-bits='64' id='type-id-472'/> + <qualified-type-def type-id='type-id-476' const='yes' id='type-id-477'/> + <pointer-type-def type-id='type-id-477' size-in-bits='64' id='type-id-25'/> <function-decl name='_PyObject_GenericGetAttrWithDict' mangled-name='_PyObject_GenericGetAttrWithDict' filepath='./Include/cpython/object.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GenericGetAttrWithDict'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> @@ -9110,17 +9117,17 @@ <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_EnablePerThreadRefcounting' filepath='./Include/internal/pycore_dict.h' line='343' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyDict_EnablePerThreadRefcounting' filepath='./Include/internal/pycore_dict.h' line='349' 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='_Py_wgetcwd' filepath='./Include/internal/pycore_fileutils.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-63'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-69'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-69'/> </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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_GetNextModuleIndex' filepath='./Include/internal/pycore_import.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -9131,7 +9138,7 @@ <return type-id='type-id-4'/> </function-decl> <function-decl name='_PyImport_ImportlibModuleRepr' filepath='./Include/internal/pycore_import.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> @@ -9165,22 +9172,22 @@ </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-6'/> - <parameter type-id='type-id-63'/> + <parameter type-id='type-id-69'/> <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'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-25'/> <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-474'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-476'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='PyModuleDef_Init' mangled-name='PyModuleDef_Init' filepath='Objects/moduleobject.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModuleDef_Init'> - <parameter type-id='type-id-473' name='def' filepath='Objects/moduleobject.c' line='54' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Objects/moduleobject.c' line='54' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyModule_NewObject' mangled-name='PyModule_NewObject' filepath='Objects/moduleobject.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_NewObject'> @@ -9192,24 +9199,24 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyModule_Create2' mangled-name='PyModule_Create2' filepath='Objects/moduleobject.c' line='205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_Create2'> - <parameter type-id='type-id-473' name='module' filepath='Objects/moduleobject.c' line='205' column='1'/> + <parameter type-id='type-id-475' name='module' filepath='Objects/moduleobject.c' line='205' column='1'/> <parameter type-id='type-id-5' name='module_api_version' filepath='Objects/moduleobject.c' line='205' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyModule_FromDefAndSpec2' mangled-name='PyModule_FromDefAndSpec2' filepath='Objects/moduleobject.c' line='269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_FromDefAndSpec2'> - <parameter type-id='type-id-473' name='def' filepath='Objects/moduleobject.c' line='269' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Objects/moduleobject.c' line='269' column='1'/> <parameter type-id='type-id-6' name='spec' filepath='Objects/moduleobject.c' line='269' column='1'/> <parameter type-id='type-id-5' name='module_api_version' filepath='Objects/moduleobject.c' line='269' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyModule_ExecDef' mangled-name='PyModule_ExecDef' filepath='Objects/moduleobject.c' line='463' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_ExecDef'> <parameter type-id='type-id-6' name='module' filepath='Objects/moduleobject.c' line='463' column='1'/> - <parameter type-id='type-id-473' name='def' filepath='Objects/moduleobject.c' line='463' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Objects/moduleobject.c' line='463' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyModule_AddFunctions' mangled-name='PyModule_AddFunctions' filepath='Objects/moduleobject.c' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddFunctions'> <parameter type-id='type-id-6' name='m' filepath='Objects/moduleobject.c' line='532' column='1'/> - <parameter type-id='type-id-176' name='functions' filepath='Objects/moduleobject.c' line='532' column='1'/> + <parameter type-id='type-id-182' name='functions' filepath='Objects/moduleobject.c' line='532' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyModule_SetDocString' mangled-name='PyModule_SetDocString' filepath='Objects/moduleobject.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_SetDocString'> @@ -9231,13 +9238,13 @@ </function-decl> <function-decl name='PyModule_GetDef' mangled-name='PyModule_GetDef' filepath='Objects/moduleobject.c' line='703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetDef'> <parameter type-id='type-id-6' name='m' filepath='Objects/moduleobject.c' line='703' column='1'/> - <return type-id='type-id-473'/> + <return type-id='type-id-475'/> </function-decl> <function-decl name='PyModule_GetState' mangled-name='PyModule_GetState' filepath='Objects/moduleobject.c' line='713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetState'> <parameter type-id='type-id-6' name='m' filepath='Objects/moduleobject.c' line='713' column='1'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> - <function-type size-in-bits='64' id='type-id-476'> + <function-type size-in-bits='64' id='type-id-478'> <return type-id='type-id-6'/> </function-type> </abi-instr> @@ -9259,24 +9266,24 @@ </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-101'> - <subrange length='6' type-id='type-id-2' id='type-id-477'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='192' id='type-id-107'> + <subrange length='6' type-id='type-id-2' id='type-id-479'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='infinite' id='type-id-478'> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='infinite' id='type-id-480'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <class-decl name='PyModuleObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-479' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='19' column='1' id='type-id-480'> + <class-decl name='PyModuleObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-481' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='19' column='1' id='type-id-482'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='20' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-6' 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-473' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='22' column='1'/> + <var-decl name='md_def' type-id='type-id-475' 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-35' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='23' column='1'/> + <var-decl name='md_state' type-id='type-id-41' 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-6' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='24' column='1'/> @@ -9285,32 +9292,32 @@ <var-decl name='md_name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='26' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyModuleObject' type-id='type-id-480' filepath='./Include/internal/pycore_moduleobject.h' line='30' column='1' id='type-id-479'/> - <enum-decl name='PyGILState_STATE' naming-typedef-id='type-id-481' filepath='./Include/pystate.h' line='77' column='1' id='type-id-482'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='PyModuleObject' type-id='type-id-482' filepath='./Include/internal/pycore_moduleobject.h' line='30' column='1' id='type-id-481'/> + <enum-decl name='PyGILState_STATE' naming-typedef-id='type-id-483' filepath='./Include/pystate.h' line='77' column='1' id='type-id-484'> + <underlying-type type-id='type-id-43'/> <enumerator name='PyGILState_LOCKED' value='0'/> <enumerator name='PyGILState_UNLOCKED' value='1'/> </enum-decl> - <typedef-decl name='PyGILState_STATE' type-id='type-id-482' filepath='./Include/pystate.h' line='78' column='1' id='type-id-481'/> - <pointer-type-def type-id='type-id-479' size-in-bits='64' id='type-id-483'/> - <pointer-type-def type-id='type-id-484' size-in-bits='64' id='type-id-485'/> - <qualified-type-def type-id='type-id-35' restrict='yes' id='type-id-231'/> + <typedef-decl name='PyGILState_STATE' type-id='type-id-484' filepath='./Include/pystate.h' line='78' column='1' id='type-id-483'/> + <pointer-type-def type-id='type-id-481' size-in-bits='64' id='type-id-485'/> + <pointer-type-def type-id='type-id-486' size-in-bits='64' id='type-id-487'/> + <qualified-type-def type-id='type-id-41' restrict='yes' id='type-id-231'/> <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-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_GetGlobalsFromRunningMain' filepath='./Include/internal/pycore_ceval.h' line='242' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyEval_GetGlobalsFromRunningMain' filepath='./Include/internal/pycore_ceval.h' line='244' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_GetFrameLocals' filepath='./Include/internal/pycore_ceval.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_GetFrameLocals' filepath='./Include/internal/pycore_ceval.h' line='260' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_DebugMallocStats' filepath='./Include/internal/pycore_dict.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <function-decl name='_PyDict_DebugMallocStats' filepath='./Include/internal/pycore_dict.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-67'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyObjectDict_SetItem' filepath='./Include/internal/pycore_dict.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyObjectDict_SetItem' filepath='./Include/internal/pycore_dict.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-1'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> @@ -9318,20 +9325,20 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyObject_MaterializeManagedDict' filepath='./Include/internal/pycore_dict.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyObject_MaterializeManagedDict' filepath='./Include/internal/pycore_dict.h' line='294' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> - <return type-id='type-id-394'/> + <return type-id='type-id-396'/> </function-decl> <function-decl name='_PyFloat_DebugMallocStats' filepath='./Include/internal/pycore_floatobject.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyList_DebugMallocStats' filepath='./Include/internal/pycore_list.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_module_getattro_impl' filepath='./Include/internal/pycore_moduleobject.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-483'/> + <parameter type-id='type-id-485'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> @@ -9360,35 +9367,35 @@ <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> - <return type-id='type-id-344'/> + <return type-id='type-id-346'/> </function-decl> <function-decl name='_PyType_LookupStackRefAndVersion' filepath='./Include/internal/pycore_object.h' line='898' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-1'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-395'/> - <return type-id='type-id-105'/> + <parameter type-id='type-id-397'/> + <return type-id='type-id-111'/> </function-decl> <var-decl name='_PyNone_Type' type-id='type-id-271' mangled-name='_PyNone_Type' visibility='default' filepath='./Include/internal/pycore_object.h' line='994' column='1' elf-symbol-id='_PyNone_Type'/> <var-decl name='_PyNotImplemented_Type' type-id='type-id-271' mangled-name='_PyNotImplemented_Type' visibility='default' filepath='./Include/internal/pycore_object.h' line='995' column='1' elf-symbol-id='_PyNotImplemented_Type'/> - <var-decl name='_Py_SwappedOp' type-id='type-id-478' mangled-name='_Py_SwappedOp' visibility='default' filepath='./Include/internal/pycore_object.h' line='999' column='1' elf-symbol-id='_Py_SwappedOp'/> + <var-decl name='_Py_SwappedOp' type-id='type-id-480' mangled-name='_Py_SwappedOp' visibility='default' filepath='./Include/internal/pycore_object.h' line='999' column='1' elf-symbol-id='_Py_SwappedOp'/> <function-decl name='_PyObject_SetDict' filepath='./Include/internal/pycore_object.h' line='1010' 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='_PyTuple_DebugMallocStats' filepath='./Include/internal/pycore_tuple.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyStaticType_GetState' filepath='./Include/internal/pycore_typeobject.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-1'/> - <return type-id='type-id-485'/> + <return type-id='type-id-487'/> </function-decl> <function-decl name='_Py_type_getattro_impl' filepath='./Include/internal/pycore_typeobject.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-1'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-183'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_Py_type_getattro' filepath='./Include/internal/pycore_typeobject.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -9403,7 +9410,7 @@ <return type-id='type-id-6'/> </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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_CheckConsistency' mangled-name='_PyUnicode_CheckConsistency' filepath='./Include/internal/pycore_unicodeobject.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_CheckConsistency'> @@ -9416,16 +9423,16 @@ <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </function-decl> - <var-decl name='_Py_NoneStruct' type-id='type-id-390' mangled-name='_Py_NoneStruct' visibility='default' filepath='./Include/object.h' line='645' column='1' elf-symbol-id='_Py_NoneStruct'/> - <var-decl name='_Py_NotImplementedStruct' type-id='type-id-390' mangled-name='_Py_NotImplementedStruct' visibility='default' filepath='./Include/object.h' line='669' column='1' elf-symbol-id='_Py_NotImplementedStruct'/> + <var-decl name='_Py_NoneStruct' type-id='type-id-392' mangled-name='_Py_NoneStruct' visibility='default' filepath='./Include/object.h' line='645' column='1' elf-symbol-id='_Py_NoneStruct'/> + <var-decl name='_Py_NotImplementedStruct' type-id='type-id-392' mangled-name='_Py_NotImplementedStruct' visibility='default' filepath='./Include/object.h' line='669' 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-6'/> </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-481'/> + <return type-id='type-id-483'/> </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-481'/> + <parameter type-id='type-id-483'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyUnicode_DecodeASCII' mangled-name='PyUnicode_DecodeASCII' filepath='./Include/unicodeobject.h' line='629' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeASCII'> @@ -9435,25 +9442,25 @@ <return type-id='type-id-6'/> </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-486'/> - <parameter type-id='type-id-180'/> + <parameter type-id='type-id-488'/> + <parameter type-id='type-id-15'/> <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-231'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-486'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-488'/> + <return type-id='type-id-14'/> </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-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyMem_DumpTraceback' filepath='Objects/object.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='Py_IncRef' mangled-name='Py_IncRef' filepath='Objects/object.c' line='334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IncRef'> @@ -9478,10 +9485,10 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyObject_InitVar' mangled-name='PyObject_InitVar' filepath='Objects/object.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_InitVar'> - <parameter type-id='type-id-354' name='op' filepath='Objects/object.c' line='540' column='1'/> + <parameter type-id='type-id-356' name='op' filepath='Objects/object.c' line='540' column='1'/> <parameter type-id='type-id-1' name='tp' filepath='Objects/object.c' line='540' column='1'/> <parameter type-id='type-id-7' name='size' filepath='Objects/object.c' line='540' column='1'/> - <return type-id='type-id-354'/> + <return type-id='type-id-356'/> </function-decl> <function-decl name='PyObject_CallFinalizer' mangled-name='PyObject_CallFinalizer' filepath='Objects/object.c' line='575' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFinalizer'> <parameter type-id='type-id-6' name='self' filepath='Objects/object.c' line='575' column='1'/> @@ -9489,7 +9496,7 @@ </function-decl> <function-decl name='PyObject_Print' mangled-name='PyObject_Print' filepath='Objects/object.c' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Print'> <parameter type-id='type-id-6' name='op' filepath='Objects/object.c' line='630' column='1'/> - <parameter type-id='type-id-61' name='fp' filepath='Objects/object.c' line='630' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Objects/object.c' line='630' column='1'/> <parameter type-id='type-id-5' name='flags' filepath='Objects/object.c' line='630' column='1'/> <return type-id='type-id-5'/> </function-decl> @@ -9579,12 +9586,12 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTrash_thread_deposit_object' mangled-name='_PyTrash_thread_deposit_object' filepath='Objects/object.c' line='2931' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_thread_deposit_object'> - <parameter type-id='type-id-31' name='tstate' filepath='Objects/object.c' line='2931' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Objects/object.c' line='2931' column='1'/> <parameter type-id='type-id-6' name='op' filepath='Objects/object.c' line='2931' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTrash_thread_destroy_chain' mangled-name='_PyTrash_thread_destroy_chain' filepath='Objects/object.c' line='2955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_thread_destroy_chain'> - <parameter type-id='type-id-31' name='tstate' filepath='Objects/object.c' line='2955' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Objects/object.c' line='2955' 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='3103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GET_WEAKREFS_LISTPTR'> @@ -9622,16 +9629,16 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyRefTracer_SetTracer' mangled-name='PyRefTracer_SetTracer' filepath='Objects/object.c' line='3160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRefTracer_SetTracer'> - <parameter type-id='type-id-487' name='tracer' filepath='Objects/object.c' line='3160' column='1'/> - <parameter type-id='type-id-35' name='data' filepath='Objects/object.c' line='3160' column='1'/> + <parameter type-id='type-id-489' name='tracer' filepath='Objects/object.c' line='3160' column='1'/> + <parameter type-id='type-id-41' name='data' filepath='Objects/object.c' line='3160' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyRefTracer_GetTracer' mangled-name='PyRefTracer_GetTracer' filepath='Objects/object.c' line='3167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRefTracer_GetTracer'> <parameter type-id='type-id-267' name='data' filepath='Objects/object.c' line='3167' column='1'/> - <return type-id='type-id-487'/> + <return type-id='type-id-489'/> </function-decl> <function-decl name='Py_GetConstantBorrowed' mangled-name='Py_GetConstantBorrowed' filepath='Objects/object.c' line='3220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetConstantBorrowed'> - <parameter type-id='type-id-105' name='constant_id' filepath='Objects/object.c' line='3220' column='1'/> + <parameter type-id='type-id-111' name='constant_id' filepath='Objects/object.c' line='3220' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='Py_TYPE' mangled-name='Py_TYPE' filepath='Objects/object.c' line='3230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_TYPE'> @@ -9652,682 +9659,682 @@ </function-decl> </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-488' size-in-bits='14400' id='type-id-489'> - <subrange length='75' type-id='type-id-2' id='type-id-490'/> + <array-type-def dimensions='1' type-id='type-id-490' size-in-bits='14400' id='type-id-491'> + <subrange length='75' type-id='type-id-2' id='type-id-492'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-491' size-in-bits='8256' id='type-id-492'> - <subrange length='129' type-id='type-id-2' id='type-id-493'/> + <array-type-def dimensions='1' type-id='type-id-493' size-in-bits='8256' id='type-id-494'> + <subrange length='129' type-id='type-id-2' id='type-id-495'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-494' size-in-bits='6912' id='type-id-495'> - <subrange length='36' type-id='type-id-2' id='type-id-496'/> + <array-type-def dimensions='1' type-id='type-id-496' size-in-bits='6912' id='type-id-497'> + <subrange length='36' type-id='type-id-2' id='type-id-498'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-322' size-in-bits='512' id='type-id-497'> - <subrange length='16' type-id='type-id-2' id='type-id-70'/> + <array-type-def dimensions='1' type-id='type-id-324' size-in-bits='512' id='type-id-499'> + <subrange length='16' type-id='type-id-2' id='type-id-76'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-369' size-in-bits='64' id='type-id-498'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-371' size-in-bits='64' id='type-id-500'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-369' size-in-bits='128' id='type-id-499'> - <subrange length='2' type-id='type-id-2' id='type-id-500'/> + <array-type-def dimensions='1' type-id='type-id-371' size-in-bits='128' id='type-id-501'> + <subrange length='2' type-id='type-id-2' id='type-id-502'/> </array-type-def> - <enum-decl name='PyMemAllocatorDomain' naming-typedef-id='type-id-501' filepath='./Include/cpython/pymem.h' line='5' column='1' id='type-id-502'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='PyMemAllocatorDomain' naming-typedef-id='type-id-503' filepath='./Include/cpython/pymem.h' line='5' column='1' id='type-id-504'> + <underlying-type type-id='type-id-43'/> <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-502' filepath='./Include/cpython/pymem.h' line='14' column='1' id='type-id-501'/> - <typedef-decl name='mi_heap_t' type-id='type-id-503' filepath='./Include/internal/mimalloc/mimalloc.h' line='188' column='1' id='type-id-504'/> - <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-505'/> - <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-506'/> - <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-507'/> - <typedef-decl name='mi_block_t' type-id='type-id-507' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='239' column='1' id='type-id-508'/> - <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-509'> + <typedef-decl name='PyMemAllocatorDomain' type-id='type-id-504' filepath='./Include/cpython/pymem.h' line='14' column='1' id='type-id-503'/> + <typedef-decl name='mi_heap_t' type-id='type-id-505' filepath='./Include/internal/mimalloc/mimalloc.h' line='188' column='1' id='type-id-506'/> + <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-507'/> + <typedef-decl name='mi_threadid_t' type-id='type-id-14' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='234' column='1' id='type-id-508'/> + <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-509'/> + <typedef-decl name='mi_block_t' type-id='type-id-509' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='239' column='1' id='type-id-510'/> + <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-511'> <data-member access='public'> - <var-decl name='full_aligned' type-id='type-id-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='255' column='1'/> + <var-decl name='full_aligned' type-id='type-id-311' 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-510' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='259' column='1'/> + <var-decl name='x' type-id='type-id-512' 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-510'> + <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-512'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='in_full' type-id='type-id-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='257' column='1'/> + <var-decl name='in_full' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='258' column='1'/> + <var-decl name='has_aligned' type-id='type-id-311' 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-509' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='260' column='1' id='type-id-511'/> - <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-512'> + <typedef-decl name='mi_page_flags_t' type-id='type-id-511' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='260' column='1' id='type-id-513'/> + <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-514'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='slice_count' type-id='type-id-322' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='310' column='1'/> + <var-decl name='slice_count' type-id='type-id-324' 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-322' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='311' column='1'/> + <var-decl name='slice_offset' type-id='type-id-324' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='312' column='1'/> + <var-decl name='is_committed' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='313' column='1'/> + <var-decl name='is_zero_init' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='314' column='1'/> + <var-decl name='use_qsbr' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='315' column='1'/> + <var-decl name='tag' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='316' column='1'/> + <var-decl name='debug_offset' type-id='type-id-311' 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-348' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='319' column='1'/> + <var-decl name='capacity' type-id='type-id-350' 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-348' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='320' column='1'/> + <var-decl name='reserved' type-id='type-id-350' 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-511' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='321' column='1'/> + <var-decl name='flags' type-id='type-id-513' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='322' column='1'/> + <var-decl name='free_is_zero' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='323' column='1'/> + <var-decl name='retire_expire' type-id='type-id-311' 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-513' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='325' column='1'/> + <var-decl name='free' type-id='type-id-515' 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-322' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='326' column='1'/> + <var-decl name='used' type-id='type-id-324' 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-322' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='327' column='1'/> + <var-decl name='xblock_size' type-id='type-id-324' 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-513' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='328' column='1'/> + <var-decl name='local_free' type-id='type-id-515' 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-514' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='337' column='1'/> + <var-decl name='next' type-id='type-id-516' 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-514' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='338' column='1'/> + <var-decl name='prev' type-id='type-id-516' 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-498' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='347' column='1'/> + <var-decl name='padding' type-id='type-id-500' 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-512' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='349' column='1' id='type-id-515'/> - <typedef-decl name='mi_slice_t' type-id='type-id-515' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='395' column='1' id='type-id-516'/> - <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-517'/> - <typedef-decl name='mi_abandoned_pool_t' type-id='type-id-517' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='493' column='1' id='type-id-518'/> - <typedef-decl name='mi_tld_t' type-id='type-id-519' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='510' column='1' id='type-id-520'/> - <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-521'> + <typedef-decl name='mi_page_t' type-id='type-id-514' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='349' column='1' id='type-id-517'/> + <typedef-decl name='mi_slice_t' type-id='type-id-517' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='395' column='1' id='type-id-518'/> + <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-519'/> + <typedef-decl name='mi_abandoned_pool_t' type-id='type-id-519' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='493' column='1' id='type-id-520'/> + <typedef-decl name='mi_tld_t' type-id='type-id-521' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='510' column='1' id='type-id-522'/> + <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-523'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='first' type-id='type-id-491' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='514' column='1'/> + <var-decl name='first' type-id='type-id-493' 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-491' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='515' column='1'/> + <var-decl name='last' type-id='type-id-493' 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'/> + <var-decl name='block_size' type-id='type-id-14' 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-521' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='517' column='1' id='type-id-488'/> - <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-522'> + <typedef-decl name='mi_page_queue_t' type-id='type-id-523' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='517' column='1' id='type-id-490'/> + <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-524'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='input' type-id='type-id-497' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='523' column='1'/> + <var-decl name='input' type-id='type-id-499' 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-497' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='524' column='1'/> + <var-decl name='output' type-id='type-id-499' 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-344' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='526' column='1'/> + <var-decl name='weak' type-id='type-id-346' 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-522' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='527' column='1' id='type-id-523'/> - <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-503'> + <typedef-decl name='mi_random_ctx_t' type-id='type-id-524' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='527' column='1' id='type-id-525'/> + <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-505'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tld' type-id='type-id-524' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='548' column='1'/> + <var-decl name='tld' type-id='type-id-526' 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-492' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='549' column='1'/> + <var-decl name='pages_free_direct' type-id='type-id-494' 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-489' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='550' column='1'/> + <var-decl name='pages' type-id='type-id-491' 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-506' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='552' column='1'/> + <var-decl name='thread_id' type-id='type-id-508' 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-505' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='553' column='1'/> + <var-decl name='arena_id' type-id='type-id-507' 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-369' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='554' column='1'/> + <var-decl name='cookie' type-id='type-id-371' 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-499' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='555' column='1'/> + <var-decl name='keys' type-id='type-id-501' 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-523' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='556' column='1'/> + <var-decl name='random' type-id='type-id-525' 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'/> + <var-decl name='page_count' type-id='type-id-14' 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'/> + <var-decl name='page_retired_min' type-id='type-id-14' 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'/> + <var-decl name='page_retired_max' type-id='type-id-14' 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-525' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='560' column='1'/> + <var-decl name='next' type-id='type-id-527' 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-344' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='561' column='1'/> + <var-decl name='no_reclaim' type-id='type-id-346' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='562' column='1'/> + <var-decl name='tag' type-id='type-id-311' 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-309' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='563' column='1'/> + <var-decl name='debug_offset' type-id='type-id-311' 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-344' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='564' column='1'/> + <var-decl name='page_use_qsbr' type-id='type-id-346' 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-526'> + <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-528'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='allocated' type-id='type-id-409' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='616' column='1'/> + <var-decl name='allocated' type-id='type-id-411' 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-409' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='617' column='1'/> + <var-decl name='freed' type-id='type-id-411' 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-409' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='618' column='1'/> + <var-decl name='peak' type-id='type-id-411' 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-409' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='619' column='1'/> + <var-decl name='current' type-id='type-id-411' 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-526' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='620' column='1' id='type-id-527'/> - <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-528'> + <typedef-decl name='mi_stat_count_t' type-id='type-id-528' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='620' column='1' id='type-id-529'/> + <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-530'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='total' type-id='type-id-409' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='623' column='1'/> + <var-decl name='total' type-id='type-id-411' 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-409' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='624' column='1'/> + <var-decl name='count' type-id='type-id-411' 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-528' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='625' column='1' id='type-id-529'/> - <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-530'> + <typedef-decl name='mi_stat_counter_t' type-id='type-id-530' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='625' column='1' id='type-id-531'/> + <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-532'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='segments' type-id='type-id-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='628' column='1'/> + <var-decl name='segments' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='629' column='1'/> + <var-decl name='pages' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='630' column='1'/> + <var-decl name='reserved' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='631' column='1'/> + <var-decl name='committed' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='632' column='1'/> + <var-decl name='reset' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='633' column='1'/> + <var-decl name='purged' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='634' column='1'/> + <var-decl name='page_committed' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='635' column='1'/> + <var-decl name='segments_abandoned' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='636' column='1'/> + <var-decl name='pages_abandoned' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='637' column='1'/> + <var-decl name='threads' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='638' column='1'/> + <var-decl name='normal' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='639' column='1'/> + <var-decl name='huge' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='640' column='1'/> + <var-decl name='large' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='641' column='1'/> + <var-decl name='malloc' type-id='type-id-529' 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-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='642' column='1'/> + <var-decl name='segments_cache' type-id='type-id-529' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='643' column='1'/> + <var-decl name='pages_extended' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='644' column='1'/> + <var-decl name='mmap_calls' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='645' column='1'/> + <var-decl name='commit_calls' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='646' column='1'/> + <var-decl name='reset_calls' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='647' column='1'/> + <var-decl name='purge_calls' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='648' column='1'/> + <var-decl name='page_no_retire' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='649' column='1'/> + <var-decl name='searches' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='650' column='1'/> + <var-decl name='normal_count' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='651' column='1'/> + <var-decl name='huge_count' type-id='type-id-531' 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-529' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='652' column='1'/> + <var-decl name='large_count' type-id='type-id-531' 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-530' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='656' column='1' id='type-id-531'/> - <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-532'> + <typedef-decl name='mi_stats_t' type-id='type-id-532' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='656' column='1' id='type-id-533'/> + <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-534'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='first' type-id='type-id-533' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='684' column='1'/> + <var-decl name='first' type-id='type-id-535' 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-533' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='685' column='1'/> + <var-decl name='last' type-id='type-id-535' 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'/> + <var-decl name='slice_count' type-id='type-id-14' 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-532' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='687' column='1' id='type-id-494'/> - <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-534'> + <typedef-decl name='mi_span_queue_t' type-id='type-id-534' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='687' column='1' id='type-id-496'/> + <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-536'> <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'/> + <var-decl name='region_idx' type-id='type-id-14' 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-535' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='694' column='1'/> + <var-decl name='stats' type-id='type-id-537' 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-534' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='695' column='1' id='type-id-536'/> - <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-537'> + <typedef-decl name='mi_os_tld_t' type-id='type-id-536' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='695' column='1' id='type-id-538'/> + <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-539'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='spans' type-id='type-id-495' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='700' column='1'/> + <var-decl name='spans' type-id='type-id-497' 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'/> + <var-decl name='count' type-id='type-id-14' 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'/> + <var-decl name='peak_count' type-id='type-id-14' 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'/> + <var-decl name='current_size' type-id='type-id-14' 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'/> + <var-decl name='peak_size' type-id='type-id-14' 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-535' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='705' column='1'/> + <var-decl name='stats' type-id='type-id-537' 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-538' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='706' column='1'/> + <var-decl name='os' type-id='type-id-540' 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-539' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='707' column='1'/> + <var-decl name='abandoned' type-id='type-id-541' 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-537' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='708' column='1' id='type-id-540'/> - <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-519'> + <typedef-decl name='mi_segments_tld_t' type-id='type-id-539' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='708' column='1' id='type-id-542'/> + <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-521'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='heartbeat' type-id='type-id-462' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='712' column='1'/> + <var-decl name='heartbeat' type-id='type-id-464' 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-344' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='713' column='1'/> + <var-decl name='recurse' type-id='type-id-346' 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-525' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='714' column='1'/> + <var-decl name='heap_backing' type-id='type-id-527' 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-525' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='715' column='1'/> + <var-decl name='heaps' type-id='type-id-527' 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-540' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='716' column='1'/> + <var-decl name='segments' type-id='type-id-542' 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-536' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='717' column='1'/> + <var-decl name='os' type-id='type-id-538' 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-531' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='718' column='1'/> + <var-decl name='stats' type-id='type-id-533' 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='42' column='1' id='type-id-541'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_PyLockFlags' filepath='./Include/internal/pycore_lock.h' line='35' column='1' id='type-id-543'> + <underlying-type type-id='type-id-43'/> <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-541' filepath='./Include/internal/pycore_lock.h' line='51' column='1' id='type-id-29'/> - <enum-decl name='PyLockStatus' filepath='./Include/pythread.h' line='12' column='1' id='type-id-542'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='_PyLockFlags' type-id='type-id-543' filepath='./Include/internal/pycore_lock.h' line='44' column='1' id='type-id-35'/> + <enum-decl name='PyLockStatus' filepath='./Include/pythread.h' line='12' column='1' id='type-id-544'> + <underlying-type type-id='type-id-43'/> <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-542' filepath='./Include/pythread.h' line='16' column='1' id='type-id-30'/> - <enum-decl name='__rusage_who' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='158' column='1' id='type-id-543'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='PyLockStatus' type-id='type-id-544' filepath='./Include/pythread.h' line='16' column='1' id='type-id-36'/> + <enum-decl name='__rusage_who' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='158' column='1' id='type-id-545'> + <underlying-type type-id='type-id-43'/> <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-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='160' column='1' id='type-id-544'/> - <typedef-decl name='__suseconds_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='162' column='1' id='type-id-545'/> - <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-188'/> - <typedef-decl name='__syscall_slong_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='197' column='1' id='type-id-546'/> - <typedef-decl name='clockid_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h' line='7' column='1' id='type-id-226'/> - <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-547'> + <typedef-decl name='__time_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='160' column='1' id='type-id-546'/> + <typedef-decl name='__suseconds_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='162' column='1' id='type-id-547'/> + <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-192'/> + <typedef-decl name='__syscall_slong_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='197' column='1' id='type-id-548'/> + <typedef-decl name='clockid_t' type-id='type-id-192' filepath='/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h' line='7' column='1' id='type-id-226'/> + <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-549'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ru_utime' type-id='type-id-199' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='36' column='1'/> + <var-decl name='ru_utime' type-id='type-id-203' 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-199' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='38' column='1'/> + <var-decl name='ru_stime' type-id='type-id-203' 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-548' visibility='default'/> + <var-decl name='' type-id='type-id-550' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='' type-id='type-id-549' visibility='default'/> + <var-decl name='' type-id='type-id-551' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='' type-id='type-id-550' visibility='default'/> + <var-decl name='' type-id='type-id-552' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='' type-id='type-id-551' visibility='default'/> + <var-decl name='' type-id='type-id-553' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='' type-id='type-id-552' visibility='default'/> + <var-decl name='' type-id='type-id-554' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='' type-id='type-id-553' visibility='default'/> + <var-decl name='' type-id='type-id-555' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='' type-id='type-id-554' visibility='default'/> + <var-decl name='' type-id='type-id-556' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='' type-id='type-id-555' visibility='default'/> + <var-decl name='' type-id='type-id-557' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='' type-id='type-id-556' visibility='default'/> + <var-decl name='' type-id='type-id-558' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='' type-id='type-id-557' visibility='default'/> + <var-decl name='' type-id='type-id-559' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='' type-id='type-id-558' visibility='default'/> + <var-decl name='' type-id='type-id-560' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='' type-id='type-id-559' visibility='default'/> + <var-decl name='' type-id='type-id-561' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='' type-id='type-id-560' visibility='default'/> + <var-decl name='' type-id='type-id-562' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='' type-id='type-id-561' visibility='default'/> + <var-decl name='' type-id='type-id-563' 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-548'> + <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-550'> <data-member access='public'> - <var-decl name='ru_maxrss' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='42' column='1'/> + <var-decl name='ru_maxrss' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='43' column='1'/> + <var-decl name='__ru_maxrss_word' type-id='type-id-548' 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-549'> + <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-551'> <data-member access='public'> - <var-decl name='ru_ixrss' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='49' column='1'/> + <var-decl name='ru_ixrss' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='50' column='1'/> + <var-decl name='__ru_ixrss_word' type-id='type-id-548' 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-550'> + <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-552'> <data-member access='public'> - <var-decl name='ru_idrss' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='55' column='1'/> + <var-decl name='ru_idrss' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='56' column='1'/> + <var-decl name='__ru_idrss_word' type-id='type-id-548' 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-551'> + <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-553'> <data-member access='public'> - <var-decl name='ru_isrss' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='61' column='1'/> + <var-decl name='ru_isrss' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='62' column='1'/> + <var-decl name='__ru_isrss_word' type-id='type-id-548' 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-552'> + <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-554'> <data-member access='public'> - <var-decl name='ru_minflt' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='68' column='1'/> + <var-decl name='ru_minflt' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='69' column='1'/> + <var-decl name='__ru_minflt_word' type-id='type-id-548' 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-553'> + <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-555'> <data-member access='public'> - <var-decl name='ru_majflt' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='74' column='1'/> + <var-decl name='ru_majflt' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='75' column='1'/> + <var-decl name='__ru_majflt_word' type-id='type-id-548' 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-554'> + <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-556'> <data-member access='public'> - <var-decl name='ru_nswap' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='80' column='1'/> + <var-decl name='ru_nswap' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='81' column='1'/> + <var-decl name='__ru_nswap_word' type-id='type-id-548' 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-555'> + <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-557'> <data-member access='public'> - <var-decl name='ru_inblock' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='87' column='1'/> + <var-decl name='ru_inblock' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='88' column='1'/> + <var-decl name='__ru_inblock_word' type-id='type-id-548' 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-556'> + <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-558'> <data-member access='public'> - <var-decl name='ru_oublock' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='93' column='1'/> + <var-decl name='ru_oublock' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='94' column='1'/> + <var-decl name='__ru_oublock_word' type-id='type-id-548' 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-557'> + <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-559'> <data-member access='public'> - <var-decl name='ru_msgsnd' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='99' column='1'/> + <var-decl name='ru_msgsnd' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='100' column='1'/> + <var-decl name='__ru_msgsnd_word' type-id='type-id-548' 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-558'> + <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-560'> <data-member access='public'> - <var-decl name='ru_msgrcv' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='105' column='1'/> + <var-decl name='ru_msgrcv' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='106' column='1'/> + <var-decl name='__ru_msgrcv_word' type-id='type-id-548' 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-559'> + <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-561'> <data-member access='public'> - <var-decl name='ru_nsignals' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='111' column='1'/> + <var-decl name='ru_nsignals' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='112' column='1'/> + <var-decl name='__ru_nsignals_word' type-id='type-id-548' 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-560'> + <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-562'> <data-member access='public'> - <var-decl name='ru_nvcsw' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='119' column='1'/> + <var-decl name='ru_nvcsw' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='120' column='1'/> + <var-decl name='__ru_nvcsw_word' type-id='type-id-548' 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-561'> + <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-563'> <data-member access='public'> - <var-decl name='ru_nivcsw' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='126' column='1'/> + <var-decl name='ru_nivcsw' type-id='type-id-188' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='127' column='1'/> + <var-decl name='__ru_nivcsw_word' type-id='type-id-548' 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-110'> + <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-116'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tv_sec' type-id='type-id-544' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='16' column='1'/> + <var-decl name='tv_sec' type-id='type-id-546' 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-546' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='21' column='1'/> + <var-decl name='tv_nsec' type-id='type-id-548' 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-199'> + <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-203'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tv_sec' type-id='type-id-544' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='14' column='1'/> + <var-decl name='tv_sec' type-id='type-id-546' 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-545' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='15' column='1'/> + <var-decl name='tv_usec' type-id='type-id-547' 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-543' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='39' column='1' id='type-id-562'/> - <pointer-type-def type-id='type-id-563' size-in-bits='64' id='type-id-564'/> + <typedef-decl name='__rusage_who_t' type-id='type-id-545' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='39' column='1' id='type-id-564'/> <pointer-type-def type-id='type-id-565' size-in-bits='64' id='type-id-566'/> - <qualified-type-def type-id='type-id-504' const='yes' id='type-id-567'/> - <qualified-type-def type-id='type-id-515' const='yes' id='type-id-568'/> - <pointer-type-def type-id='type-id-518' size-in-bits='64' id='type-id-539'/> - <pointer-type-def type-id='type-id-508' size-in-bits='64' id='type-id-513'/> - <pointer-type-def type-id='type-id-504' size-in-bits='64' id='type-id-525'/> - <pointer-type-def type-id='type-id-536' size-in-bits='64' id='type-id-538'/> - <pointer-type-def type-id='type-id-512' size-in-bits='64' id='type-id-514'/> - <pointer-type-def type-id='type-id-515' size-in-bits='64' id='type-id-491'/> - <pointer-type-def type-id='type-id-516' size-in-bits='64' id='type-id-533'/> - <pointer-type-def type-id='type-id-531' size-in-bits='64' id='type-id-535'/> - <pointer-type-def type-id='type-id-520' size-in-bits='64' id='type-id-524'/> - <pointer-type-def type-id='type-id-569' size-in-bits='64' id='type-id-570'/> - <pointer-type-def type-id='type-id-547' size-in-bits='64' id='type-id-191'/> - <pointer-type-def type-id='type-id-110' size-in-bits='64' id='type-id-179'/> + <pointer-type-def type-id='type-id-567' size-in-bits='64' id='type-id-568'/> + <qualified-type-def type-id='type-id-506' const='yes' id='type-id-569'/> + <qualified-type-def type-id='type-id-517' const='yes' id='type-id-570'/> + <pointer-type-def type-id='type-id-520' size-in-bits='64' id='type-id-541'/> + <pointer-type-def type-id='type-id-510' size-in-bits='64' id='type-id-515'/> + <pointer-type-def type-id='type-id-506' size-in-bits='64' id='type-id-527'/> + <pointer-type-def type-id='type-id-538' size-in-bits='64' id='type-id-540'/> + <pointer-type-def type-id='type-id-514' size-in-bits='64' id='type-id-516'/> + <pointer-type-def type-id='type-id-517' size-in-bits='64' id='type-id-493'/> + <pointer-type-def type-id='type-id-518' size-in-bits='64' id='type-id-535'/> + <pointer-type-def type-id='type-id-533' size-in-bits='64' id='type-id-537'/> + <pointer-type-def type-id='type-id-522' size-in-bits='64' id='type-id-526'/> + <pointer-type-def type-id='type-id-571' size-in-bits='64' id='type-id-572'/> + <pointer-type-def type-id='type-id-549' size-in-bits='64' id='type-id-195'/> + <pointer-type-def type-id='type-id-116' size-in-bits='64' id='type-id-185'/> <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-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> - <function-decl name='PyInterpreterState_Head' mangled-name='PyInterpreterState_Head' filepath='./Include/cpython/pystate.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Head'> - <return type-id='type-id-33'/> + <function-decl name='PyInterpreterState_Head' mangled-name='PyInterpreterState_Head' filepath='./Include/cpython/pystate.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Head'> + <return type-id='type-id-39'/> </function-decl> - <function-decl name='PyInterpreterState_Next' mangled-name='PyInterpreterState_Next' filepath='./Include/cpython/pystate.h' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Next'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-33'/> - </function-decl> - <var-decl name='_mi_stats_main' type-id='type-id-531' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='62' column='1'/> - <var-decl name='_mi_page_empty' type-id='type-id-568' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='63' column='1'/> - <var-decl name='_mi_abandoned_default' type-id='type-id-518' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='117' column='1'/> - <var-decl name='_mi_heap_empty' type-id='type-id-567' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='368' column='1'/> - <var-decl name='_mi_heap_default' type-id='type-id-525' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/prim.h' line='129' column='1'/> - <var-decl name='_mi_process_is_initialized' type-id='type-id-344' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/prim.h' line='130' column='1'/> + <function-decl name='PyInterpreterState_Next' mangled-name='PyInterpreterState_Next' filepath='./Include/cpython/pystate.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Next'> + <parameter type-id='type-id-39'/> + <return type-id='type-id-39'/> + </function-decl> + <var-decl name='_mi_stats_main' type-id='type-id-533' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='62' column='1'/> + <var-decl name='_mi_page_empty' type-id='type-id-570' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='63' column='1'/> + <var-decl name='_mi_abandoned_default' type-id='type-id-520' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='117' column='1'/> + <var-decl name='_mi_heap_empty' type-id='type-id-569' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='368' column='1'/> + <var-decl name='_mi_heap_default' type-id='type-id-527' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/prim.h' line='129' column='1'/> + <var-decl name='_mi_process_is_initialized' type-id='type-id-346' 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='96' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-2'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMutex_LockTimed' mangled-name='_PyMutex_LockTimed' filepath='./Include/internal/pycore_lock.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMutex_LockTimed'> - <parameter type-id='type-id-26'/> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-29'/> - <return type-id='type-id-30'/> + <function-decl name='_PyMutex_LockTimed' mangled-name='_PyMutex_LockTimed' filepath='./Include/internal/pycore_lock.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMutex_LockTimed'> + <parameter type-id='type-id-32'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-35'/> + <return type-id='type-id-36'/> </function-decl> <function-decl name='_Py_IsMainInterpreterFinalizing' filepath='./Include/internal/pycore_pystate.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyEval_StopTheWorldAll' filepath='./Include/internal/pycore_pystate.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> + <parameter type-id='type-id-177'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyEval_StartTheWorldAll' filepath='./Include/internal/pycore_pystate.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> + <parameter type-id='type-id-177'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_qsbr_poll' filepath='./Include/internal/pycore_qsbr.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-571'/> - <parameter type-id='type-id-111'/> - <return type-id='type-id-344'/> + <parameter type-id='type-id-573'/> + <parameter type-id='type-id-117'/> + <return type-id='type-id-346'/> </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-570'/> <parameter type-id='type-id-572'/> + <parameter type-id='type-id-574'/> <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-569'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-571'/> + <parameter type-id='type-id-41'/> <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-24'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-4'/> <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-24'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-306'/> + <parameter type-id='type-id-308'/> <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-61'/> + <parameter type-id='type-id-67'/> <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-180'/> - <parameter type-id='type-id-486'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-488'/> <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-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-41'/> <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'> @@ -10339,59 +10346,59 @@ </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-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-180'/> - <parameter type-id='type-id-182'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-13'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-226'/> - <parameter type-id='type-id-179'/> + <parameter type-id='type-id-185'/> <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-184'/> + <return type-id='type-id-188'/> </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-184'/> + <parameter type-id='type-id-188'/> <parameter is-variadic='yes'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </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'/> + <parameter type-id='type-id-25'/> + <return type-id='type-id-14'/> </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-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-562'/> - <parameter type-id='type-id-191'/> + <parameter type-id='type-id-564'/> + <parameter type-id='type-id-195'/> <return type-id='type-id-5'/> </function-decl> - <var-decl name='_mi_heap_main' type-id='type-id-504' visibility='default' filepath='Objects/mimalloc/init.c' line='128' column='1'/> + <var-decl name='_mi_heap_main' type-id='type-id-506' 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='780' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_GetCurrentAllocatorName'> <return type-id='type-id-4'/> </function-decl> @@ -10399,42 +10406,42 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyMem_GetAllocator' mangled-name='PyMem_GetAllocator' filepath='Objects/obmalloc.c' line='922' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_GetAllocator'> - <parameter type-id='type-id-501' name='domain' filepath='Objects/obmalloc.c' line='922' column='1'/> - <parameter type-id='type-id-564' name='allocator' filepath='Objects/obmalloc.c' line='922' column='1'/> + <parameter type-id='type-id-503' name='domain' filepath='Objects/obmalloc.c' line='922' column='1'/> + <parameter type-id='type-id-566' name='allocator' filepath='Objects/obmalloc.c' line='922' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyMem_SetAllocator' mangled-name='PyMem_SetAllocator' filepath='Objects/obmalloc.c' line='930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_SetAllocator'> - <parameter type-id='type-id-501' name='domain' filepath='Objects/obmalloc.c' line='930' column='1'/> - <parameter type-id='type-id-564' name='allocator' filepath='Objects/obmalloc.c' line='930' column='1'/> + <parameter type-id='type-id-503' name='domain' filepath='Objects/obmalloc.c' line='930' column='1'/> + <parameter type-id='type-id-566' name='allocator' filepath='Objects/obmalloc.c' line='930' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyObject_GetArenaAllocator' mangled-name='PyObject_GetArenaAllocator' filepath='Objects/obmalloc.c' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetArenaAllocator'> - <parameter type-id='type-id-566' name='allocator' filepath='Objects/obmalloc.c' line='938' column='1'/> + <parameter type-id='type-id-568' name='allocator' filepath='Objects/obmalloc.c' line='938' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyObject_SetArenaAllocator' mangled-name='PyObject_SetArenaAllocator' filepath='Objects/obmalloc.c' line='946' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetArenaAllocator'> - <parameter type-id='type-id-566' name='allocator' filepath='Objects/obmalloc.c' line='946' column='1'/> + <parameter type-id='type-id-568' name='allocator' filepath='Objects/obmalloc.c' line='946' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyMem_RawMalloc' mangled-name='PyMem_RawMalloc' filepath='Objects/obmalloc.c' line='990' 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='990' column='1'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-14' name='size' filepath='Objects/obmalloc.c' line='990' column='1'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='PyMem_RawCalloc' mangled-name='PyMem_RawCalloc' filepath='Objects/obmalloc.c' line='1004' 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='1004' column='1'/> - <parameter type-id='type-id-21' name='elsize' filepath='Objects/obmalloc.c' line='1004' column='1'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-14' name='nelem' filepath='Objects/obmalloc.c' line='1004' column='1'/> + <parameter type-id='type-id-14' name='elsize' filepath='Objects/obmalloc.c' line='1004' column='1'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_PyMem_Strdup' mangled-name='_PyMem_Strdup' filepath='Objects/obmalloc.c' line='1112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_Strdup'> <parameter type-id='type-id-4' name='str' filepath='Objects/obmalloc.c' line='1112' column='1'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_PyObject_DebugMallocStats' mangled-name='_PyObject_DebugMallocStats' filepath='Objects/obmalloc.c' line='3625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_DebugMallocStats'> - <parameter type-id='type-id-61' name='out' filepath='Objects/obmalloc.c' line='3625' column='1'/> + <parameter type-id='type-id-67' name='out' filepath='Objects/obmalloc.c' line='3625' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-type size-in-bits='64' id='type-id-573'> - <parameter type-id='type-id-35'/> + <function-type size-in-bits='64' id='type-id-575'> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-type> </abi-instr> @@ -10448,43 +10455,57 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyDictView_New' filepath='./Include/internal/pycore_dict.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyDict_DelItem_KnownHash_LockHeld' filepath='./Include/internal/pycore_dict.h' line='34' 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-306'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_SizeOf_LockHeld' filepath='./Include/internal/pycore_dict.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyDictView_New' filepath='./Include/internal/pycore_dict.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyDict_FromKeys' filepath='./Include/internal/pycore_dict.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyDict_FromKeys' filepath='./Include/internal/pycore_dict.h' line='93' 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'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_Py_dict_lookup' filepath='./Include/internal/pycore_dict.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_Py_dict_lookup' filepath='./Include/internal/pycore_dict.h' line='118' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-304'/> + <parameter type-id='type-id-306'/> <parameter type-id='type-id-241'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyDict_Pop_KnownHash' filepath='./Include/internal/pycore_dict.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_PyDict_Pop_KnownHash' filepath='./Include/internal/pycore_dict.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-304'/> + <parameter type-id='type-id-306'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyODict_New' mangled-name='PyODict_New' filepath='Objects/odictobject.c' line='1585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_New'> + <function-decl name='_PyDict_Clear_LockHeld' filepath='./Include/internal/pycore_dict.h' line='159' 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='PyODict_New' mangled-name='PyODict_New' filepath='Objects/odictobject.c' line='1614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_New'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyODict_SetItem' mangled-name='PyODict_SetItem' filepath='Objects/odictobject.c' line='1608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_SetItem'> - <parameter type-id='type-id-6' name='od' filepath='Objects/odictobject.c' line='1608' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/odictobject.c' line='1608' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Objects/odictobject.c' line='1608' column='1'/> + <function-decl name='PyODict_SetItem' mangled-name='PyODict_SetItem' filepath='Objects/odictobject.c' line='1650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_SetItem'> + <parameter type-id='type-id-6' name='od' filepath='Objects/odictobject.c' line='1650' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/odictobject.c' line='1650' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Objects/odictobject.c' line='1650' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyODict_DelItem' mangled-name='PyODict_DelItem' filepath='Objects/odictobject.c' line='1617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_DelItem'> - <parameter type-id='type-id-6' name='od' filepath='Objects/odictobject.c' line='1617' column='1'/> - <parameter type-id='type-id-6' name='key' filepath='Objects/odictobject.c' line='1617' column='1'/> + <function-decl name='PyODict_DelItem' mangled-name='PyODict_DelItem' filepath='Objects/odictobject.c' line='1674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_DelItem'> + <parameter type-id='type-id-6' name='od' filepath='Objects/odictobject.c' line='1674' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/odictobject.c' line='1674' column='1'/> <return type-id='type-id-5'/> </function-decl> </abi-instr> @@ -10504,9 +10525,9 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/rangeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PySliceObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-574' visibility='default' filepath='./Include/sliceobject.h' line='26' column='1' id='type-id-575'> + <class-decl name='PySliceObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-576' visibility='default' filepath='./Include/sliceobject.h' line='26' column='1' id='type-id-577'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/sliceobject.h' line='27' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-6' visibility='default' filepath='./Include/sliceobject.h' line='28' column='1'/> @@ -10518,8 +10539,8 @@ <var-decl name='step' type-id='type-id-6' visibility='default' filepath='./Include/sliceobject.h' line='28' column='1'/> </data-member> </class-decl> - <typedef-decl name='PySliceObject' type-id='type-id-575' filepath='./Include/sliceobject.h' line='29' column='1' id='type-id-574'/> - <pointer-type-def type-id='type-id-574' size-in-bits='64' id='type-id-576'/> + <typedef-decl name='PySliceObject' type-id='type-id-577' filepath='./Include/sliceobject.h' line='29' column='1' id='type-id-576'/> + <pointer-type-def type-id='type-id-576' size-in-bits='64' id='type-id-578'/> <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-6'/> <parameter type-id='type-id-6'/> @@ -10530,7 +10551,7 @@ <var-decl name='PyRangeIter_Type' type-id='type-id-271' 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-271' 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-576'/> + <parameter type-id='type-id-578'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <parameter type-id='type-id-241'/> @@ -10539,21 +10560,21 @@ </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-577' size-in-bits='1024' id='type-id-578'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-579' size-in-bits='1024' id='type-id-580'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <class-decl name='setentry' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-577' visibility='default' filepath='./Include/cpython/setobject.h' line='20' column='1' id='type-id-579'> + <class-decl name='setentry' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-579' visibility='default' filepath='./Include/cpython/setobject.h' line='20' column='1' id='type-id-581'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='key' type-id='type-id-6' 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-304' visibility='default' filepath='./Include/cpython/setobject.h' line='22' column='1'/> + <var-decl name='hash' type-id='type-id-306' visibility='default' filepath='./Include/cpython/setobject.h' line='22' column='1'/> </data-member> </class-decl> - <typedef-decl name='setentry' type-id='type-id-579' filepath='./Include/cpython/setobject.h' line='23' column='1' id='type-id-577'/> - <class-decl name='PySetObject' size-in-bits='1600' is-struct='yes' naming-typedef-id='type-id-580' visibility='default' filepath='./Include/cpython/setobject.h' line='36' column='1' id='type-id-581'> + <typedef-decl name='setentry' type-id='type-id-581' filepath='./Include/cpython/setobject.h' line='23' column='1' id='type-id-579'/> + <class-decl name='PySetObject' size-in-bits='1600' is-struct='yes' naming-typedef-id='type-id-582' visibility='default' filepath='./Include/cpython/setobject.h' line='36' column='1' id='type-id-583'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/setobject.h' line='37' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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'/> @@ -10565,28 +10586,28 @@ <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-582' visibility='default' filepath='./Include/cpython/setobject.h' line='53' column='1'/> + <var-decl name='table' type-id='type-id-584' 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-304' visibility='default' filepath='./Include/cpython/setobject.h' line='54' column='1'/> + <var-decl name='hash' type-id='type-id-306' 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-578' visibility='default' filepath='./Include/cpython/setobject.h' line='57' column='1'/> + <var-decl name='smalltable' type-id='type-id-580' 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-6' visibility='default' filepath='./Include/cpython/setobject.h' line='58' column='1'/> </data-member> </class-decl> - <typedef-decl name='PySetObject' type-id='type-id-581' filepath='./Include/cpython/setobject.h' line='59' column='1' id='type-id-580'/> - <pointer-type-def type-id='type-id-580' size-in-bits='64' id='type-id-583'/> - <pointer-type-def type-id='type-id-577' size-in-bits='64' id='type-id-582'/> - <function-decl name='_PyDict_Contains_KnownHash' filepath='./Include/internal/pycore_dict.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <typedef-decl name='PySetObject' type-id='type-id-583' filepath='./Include/cpython/setobject.h' line='59' column='1' id='type-id-582'/> + <pointer-type-def type-id='type-id-582' size-in-bits='64' id='type-id-585'/> + <pointer-type-def type-id='type-id-579' size-in-bits='64' id='type-id-584'/> + <function-decl name='_PyDict_Contains_KnownHash' filepath='./Include/internal/pycore_dict.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'/> - <parameter type-id='type-id-304'/> + <parameter type-id='type-id-306'/> <return type-id='type-id-5'/> </function-decl> <var-decl name='_PySet_Dummy' type-id='type-id-6' mangled-name='_PySet_Dummy' visibility='default' filepath='./Include/internal/pycore_setobject.h' line='29' column='1' elf-symbol-id='_PySet_Dummy'/> @@ -10594,12 +10615,12 @@ <var-decl name='PyFrozenSet_Type' type-id='type-id-271' 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-271' mangled-name='PySetIter_Type' visibility='default' filepath='./Include/setobject.h' line='11' column='1' elf-symbol-id='PySetIter_Type'/> <function-decl name='_PySet_AddTakeRef' mangled-name='_PySet_AddTakeRef' filepath='Objects/setobject.c' line='232' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_AddTakeRef'> - <parameter type-id='type-id-583' name='so' filepath='Objects/setobject.c' line='232' column='1'/> + <parameter type-id='type-id-585' name='so' filepath='Objects/setobject.c' line='232' column='1'/> <parameter type-id='type-id-6' name='key' filepath='Objects/setobject.c' line='232' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PySet_Contains' mangled-name='_PySet_Contains' filepath='Objects/setobject.c' line='2235' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_Contains'> - <parameter type-id='type-id-583' name='so' filepath='Objects/setobject.c' line='2235' column='1'/> + <parameter type-id='type-id-585' name='so' filepath='Objects/setobject.c' line='2235' column='1'/> <parameter type-id='type-id-6' name='key' filepath='Objects/setobject.c' line='2235' column='1'/> <return type-id='type-id-5'/> </function-decl> @@ -10622,7 +10643,7 @@ </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-390' mangled-name='_Py_EllipsisObject' visibility='default' filepath='./Include/sliceobject.h' line='9' column='1' elf-symbol-id='_Py_EllipsisObject'/> + <var-decl name='_Py_EllipsisObject' type-id='type-id-392' 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-271' 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-271' mangled-name='PyEllipsis_Type' visibility='default' filepath='./Include/sliceobject.h' line='33' column='1' elf-symbol-id='PyEllipsis_Type'/> <function-decl name='PySlice_GetIndices' mangled-name='PySlice_GetIndices' filepath='Objects/sliceobject.c' line='186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_GetIndices'> @@ -10644,16 +10665,16 @@ </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-584' visibility='default' filepath='./Include/object.h' line='374' column='1' id='type-id-585'> + <class-decl name='PyType_Slot' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-586' visibility='default' filepath='./Include/object.h' line='374' column='1' id='type-id-587'> <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='375' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pfunc' type-id='type-id-35' visibility='default' filepath='./Include/object.h' line='376' column='1'/> + <var-decl name='pfunc' type-id='type-id-41' visibility='default' filepath='./Include/object.h' line='376' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyType_Slot' type-id='type-id-585' filepath='./Include/object.h' line='377' column='1' id='type-id-584'/> - <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='379' column='1' id='type-id-586'> + <typedef-decl name='PyType_Slot' type-id='type-id-587' filepath='./Include/object.h' line='377' column='1' id='type-id-586'/> + <class-decl name='PyType_Spec' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-23' visibility='default' filepath='./Include/object.h' line='379' column='1' id='type-id-588'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/object.h' line='380' column='1'/> </data-member> @@ -10664,17 +10685,17 @@ <var-decl name='itemsize' type-id='type-id-5' visibility='default' filepath='./Include/object.h' line='382' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='flags' type-id='type-id-105' visibility='default' filepath='./Include/object.h' line='383' column='1'/> + <var-decl name='flags' type-id='type-id-111' visibility='default' filepath='./Include/object.h' line='383' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='slots' type-id='type-id-587' visibility='default' filepath='./Include/object.h' line='384' column='1'/> + <var-decl name='slots' type-id='type-id-589' visibility='default' filepath='./Include/object.h' line='384' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyType_Spec' type-id='type-id-586' filepath='./Include/object.h' line='385' column='1' id='type-id-16'/> - <pointer-type-def type-id='type-id-584' size-in-bits='64' id='type-id-587'/> - <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-588'/> + <typedef-decl name='PyType_Spec' type-id='type-id-588' filepath='./Include/object.h' line='385' column='1' id='type-id-23'/> + <pointer-type-def type-id='type-id-586' size-in-bits='64' id='type-id-589'/> + <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-590'/> <function-decl name='PyUnicodeWriter_WriteUTF8' mangled-name='PyUnicodeWriter_WriteUTF8' filepath='./Include/cpython/unicodeobject.h' line='477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteUTF8'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-7'/> <return type-id='type-id-5'/> @@ -10684,11 +10705,11 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='PyType_FromSpecWithBases' mangled-name='PyType_FromSpecWithBases' filepath='./Include/object.h' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpecWithBases'> - <parameter type-id='type-id-588'/> + <parameter type-id='type-id-590'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <var-decl name='PyStructSequence_UnnamedField' type-id='type-id-589' mangled-name='PyStructSequence_UnnamedField' visibility='default' filepath='./Include/structseq.h' line='22' column='1' elf-symbol-id='PyStructSequence_UnnamedField'/> + <var-decl name='PyStructSequence_UnnamedField' type-id='type-id-591' 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='100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_GetItem'> <parameter type-id='type-id-6' name='op' filepath='Objects/structseq.c' line='100' column='1'/> <parameter type-id='type-id-7' name='index' filepath='Objects/structseq.c' line='100' column='1'/> @@ -10696,21 +10717,21 @@ </function-decl> <function-decl name='PyStructSequence_InitType2' mangled-name='PyStructSequence_InitType2' filepath='Objects/structseq.c' line='667' 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='667' column='1'/> - <parameter type-id='type-id-408' name='desc' filepath='Objects/structseq.c' line='667' column='1'/> + <parameter type-id='type-id-410' name='desc' filepath='Objects/structseq.c' line='667' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyStructSequence_InitType' mangled-name='PyStructSequence_InitType' filepath='Objects/structseq.c' line='701' 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='701' column='1'/> - <parameter type-id='type-id-408' name='desc' filepath='Objects/structseq.c' line='701' column='1'/> + <parameter type-id='type-id-410' name='desc' filepath='Objects/structseq.c' line='701' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyStructSequence_NewType' mangled-name='_PyStructSequence_NewType' filepath='Objects/structseq.c' line='739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStructSequence_NewType'> - <parameter type-id='type-id-408' name='desc' filepath='Objects/structseq.c' line='739' column='1'/> + <parameter type-id='type-id-410' name='desc' filepath='Objects/structseq.c' line='739' column='1'/> <parameter type-id='type-id-2' name='tp_flags' filepath='Objects/structseq.c' line='739' column='1'/> <return type-id='type-id-1'/> </function-decl> <function-decl name='PyStructSequence_NewType' mangled-name='PyStructSequence_NewType' filepath='Objects/structseq.c' line='791' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_NewType'> - <parameter type-id='type-id-408' name='desc' filepath='Objects/structseq.c' line='791' column='1'/> + <parameter type-id='type-id-410' name='desc' filepath='Objects/structseq.c' line='791' column='1'/> <return type-id='type-id-1'/> </function-decl> </abi-instr> @@ -10726,17 +10747,17 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyTemplate_Build' mangled-name='_PyTemplate_Build' filepath='Objects/templateobject.c' line='477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTemplate_Build'> - <parameter type-id='type-id-6' name='strings' filepath='Objects/templateobject.c' line='477' column='1'/> - <parameter type-id='type-id-6' name='interpolations' filepath='Objects/templateobject.c' line='477' column='1'/> + <function-decl name='_PyTemplate_Build' mangled-name='_PyTemplate_Build' filepath='Objects/templateobject.c' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTemplate_Build'> + <parameter type-id='type-id-6' name='strings' filepath='Objects/templateobject.c' line='400' column='1'/> + <parameter type-id='type-id-6' name='interpolations' filepath='Objects/templateobject.c' line='400' column='1'/> <return type-id='type-id-6'/> </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-354'/> + <parameter type-id='type-id-356'/> <parameter type-id='type-id-7'/> - <return type-id='type-id-354'/> + <return type-id='type-id-356'/> </function-decl> <var-decl name='PyTuple_Type' type-id='type-id-271' 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-271' mangled-name='PyTupleIter_Type' visibility='default' filepath='./Include/tupleobject.h' line='24' column='1' elf-symbol-id='PyTupleIter_Type'/> @@ -10746,42 +10767,42 @@ <parameter type-id='type-id-6' name='newitem' filepath='Objects/tupleobject.c' line='118' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyTuple_FromStackRefStealOnSuccess' mangled-name='_PyTuple_FromStackRefStealOnSuccess' filepath='Objects/tupleobject.c' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_FromStackRefStealOnSuccess'> - <parameter type-id='type-id-437' name='src' filepath='Objects/tupleobject.c' line='389' column='1'/> - <parameter type-id='type-id-7' name='n' filepath='Objects/tupleobject.c' line='389' column='1'/> + <function-decl name='_PyTuple_FromStackRefStealOnSuccess' mangled-name='_PyTuple_FromStackRefStealOnSuccess' filepath='Objects/tupleobject.c' line='413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_FromStackRefStealOnSuccess'> + <parameter type-id='type-id-439' name='src' filepath='Objects/tupleobject.c' line='413' column='1'/> + <parameter type-id='type-id-7' name='n' filepath='Objects/tupleobject.c' line='413' column='1'/> <return type-id='type-id-6'/> </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='_specialization_cache' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='249' column='1' id='type-id-590'> + <class-decl name='_specialization_cache' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='249' column='1' id='type-id-592'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='getitem' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='260' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='getitem_version' type-id='type-id-322' visibility='default' filepath='./Include/cpython/object.h' line='261' column='1'/> + <var-decl name='getitem_version' type-id='type-id-324' visibility='default' filepath='./Include/cpython/object.h' line='261' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='init' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='262' column='1'/> </data-member> </class-decl> - <class-decl name='_heaptypeobject' size-in-bits='7488' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='266' column='1' id='type-id-591'> + <class-decl name='_heaptypeobject' size-in-bits='7488' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='266' column='1' id='type-id-593'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ht_type' type-id='type-id-271' visibility='default' filepath='./Include/cpython/object.h' line='269' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='as_async' type-id='type-id-592' visibility='default' filepath='./Include/cpython/object.h' line='270' column='1'/> + <var-decl name='as_async' type-id='type-id-594' visibility='default' filepath='./Include/cpython/object.h' line='270' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3584'> - <var-decl name='as_number' type-id='type-id-593' visibility='default' filepath='./Include/cpython/object.h' line='271' column='1'/> + <var-decl name='as_number' type-id='type-id-595' visibility='default' filepath='./Include/cpython/object.h' line='271' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5888'> - <var-decl name='as_mapping' type-id='type-id-594' visibility='default' filepath='./Include/cpython/object.h' line='272' column='1'/> + <var-decl name='as_mapping' type-id='type-id-596' visibility='default' filepath='./Include/cpython/object.h' line='272' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6080'> - <var-decl name='as_sequence' type-id='type-id-595' visibility='default' filepath='./Include/cpython/object.h' line='273' column='1'/> + <var-decl name='as_sequence' type-id='type-id-597' visibility='default' filepath='./Include/cpython/object.h' line='273' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6720'> - <var-decl name='as_buffer' type-id='type-id-596' visibility='default' filepath='./Include/cpython/object.h' line='278' column='1'/> + <var-decl name='as_buffer' type-id='type-id-598' visibility='default' filepath='./Include/cpython/object.h' line='278' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6848'> <var-decl name='ht_name' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='279' column='1'/> @@ -10793,25 +10814,25 @@ <var-decl name='ht_qualname' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='279' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7040'> - <var-decl name='ht_cached_keys' type-id='type-id-597' visibility='default' filepath='./Include/cpython/object.h' line='280' column='1'/> + <var-decl name='ht_cached_keys' type-id='type-id-599' visibility='default' filepath='./Include/cpython/object.h' line='280' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7104'> <var-decl name='ht_module' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='281' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7168'> - <var-decl name='_ht_tpname' type-id='type-id-17' visibility='default' filepath='./Include/cpython/object.h' line='282' column='1'/> + <var-decl name='_ht_tpname' type-id='type-id-24' visibility='default' filepath='./Include/cpython/object.h' line='282' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7232'> - <var-decl name='ht_token' type-id='type-id-35' visibility='default' filepath='./Include/cpython/object.h' line='283' column='1'/> + <var-decl name='ht_token' type-id='type-id-41' visibility='default' filepath='./Include/cpython/object.h' line='283' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7296'> - <var-decl name='_spec_cache' type-id='type-id-590' visibility='default' filepath='./Include/cpython/object.h' line='284' column='1'/> + <var-decl name='_spec_cache' type-id='type-id-592' visibility='default' filepath='./Include/cpython/object.h' line='284' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyHeapTypeObject' type-id='type-id-591' filepath='./Include/cpython/object.h' line='289' column='1' id='type-id-598'/> - <pointer-type-def type-id='type-id-598' size-in-bits='64' id='type-id-599'/> - <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-600'/> - <pointer-type-def type-id='type-id-384' size-in-bits='64' id='type-id-597'/> + <typedef-decl name='PyHeapTypeObject' type-id='type-id-593' filepath='./Include/cpython/object.h' line='289' column='1' id='type-id-600'/> + <pointer-type-def type-id='type-id-600' size-in-bits='64' id='type-id-601'/> + <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-602'/> + <pointer-type-def type-id='type-id-386' size-in-bits='64' id='type-id-599'/> <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-6'/> </function-decl> @@ -10829,7 +10850,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyObject_Call_Prepend' filepath='./Include/internal/pycore_call.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> @@ -10837,64 +10858,64 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyObject_Call' filepath='./Include/internal/pycore_call.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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'> + <function-decl name='_PyDict_HasOnlyStringKeys' filepath='./Include/internal/pycore_dict.h' line='49' 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='_PyDict_NewKeysForClass' filepath='./Include/internal/pycore_dict.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-599'/> - <return type-id='type-id-391'/> + <function-decl name='_PyDict_NewKeysForClass' filepath='./Include/internal/pycore_dict.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-601'/> + <return type-id='type-id-393'/> </function-decl> - <function-decl name='_PyDict_KeysSize' filepath='./Include/internal/pycore_dict.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-391'/> - <return type-id='type-id-21'/> + <function-decl name='_PyDict_KeysSize' filepath='./Include/internal/pycore_dict.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-393'/> + <return type-id='type-id-14'/> </function-decl> - <function-decl name='_PyDictKeys_DecRef' filepath='./Include/internal/pycore_dict.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-391'/> + <function-decl name='_PyDictKeys_DecRef' filepath='./Include/internal/pycore_dict.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-393'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyDict_SetItem_LockHeld' filepath='./Include/internal/pycore_dict.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_PyDict_SetItem_LockHeld' filepath='./Include/internal/pycore_dict.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_GetItemRef_KnownHash' filepath='./Include/internal/pycore_dict.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_PyDict_GetItemRef_KnownHash' filepath='./Include/internal/pycore_dict.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-304'/> + <parameter type-id='type-id-306'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_GetItemRef_Unicode_LockHeld' filepath='./Include/internal/pycore_dict.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_PyDict_GetItemRef_Unicode_LockHeld' filepath='./Include/internal/pycore_dict.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyDict_DetachFromObject' filepath='./Include/internal/pycore_dict.h' line='340' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_PyDict_DetachFromObject' filepath='./Include/internal/pycore_dict.h' line='346' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyObject_MaterializeManagedDict_LockHeld' filepath='./Include/internal/pycore_dict.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyObject_MaterializeManagedDict_LockHeld' filepath='./Include/internal/pycore_dict.h' line='351' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> - <return type-id='type-id-394'/> + <return type-id='type-id-396'/> </function-decl> <function-decl name='_PyFunction_GetVersionForCurrentState' filepath='./Include/internal/pycore_function.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-312'/> - <return type-id='type-id-322'/> + <parameter type-id='type-id-314'/> + <return type-id='type-id-324'/> </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-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-601'/> + <parameter type-id='type-id-603'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyObject_GC_Link' filepath='./Include/internal/pycore_object.h' line='865' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -10921,7 +10942,7 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyStaticType_ClearWeakRefs' filepath='./Include/internal/pycore_typeobject.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-1'/> <return type-id='type-id-3'/> </function-decl> @@ -10945,7 +10966,7 @@ <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-4'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_PyStaticType_GetBuiltins' mangled-name='_PyStaticType_GetBuiltins' filepath='Objects/typeobject.c' line='320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStaticType_GetBuiltins'> <return type-id='type-id-6'/> @@ -10955,10 +10976,10 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyType_ClearCache' mangled-name='PyType_ClearCache' filepath='Objects/typeobject.c' line='921' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_ClearCache'> - <return type-id='type-id-105'/> + <return type-id='type-id-111'/> </function-decl> <function-decl name='PyType_AddWatcher' mangled-name='PyType_AddWatcher' filepath='Objects/typeobject.c' line='947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_AddWatcher'> - <parameter type-id='type-id-602' name='callback' filepath='Objects/typeobject.c' line='947' column='1'/> + <parameter type-id='type-id-604' name='callback' filepath='Objects/typeobject.c' line='947' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyType_ClearWatcher' mangled-name='PyType_ClearWatcher' filepath='Objects/typeobject.c' line='978' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_ClearWatcher'> @@ -10981,136 +11002,136 @@ </function-decl> <function-decl name='_PyType_SetVersion' mangled-name='_PyType_SetVersion' filepath='Objects/typeobject.c' line='1223' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_SetVersion'> <parameter type-id='type-id-1' name='tp' filepath='Objects/typeobject.c' line='1223' column='1'/> - <parameter type-id='type-id-105' name='version' filepath='Objects/typeobject.c' line='1223' column='1'/> + <parameter type-id='type-id-111' name='version' filepath='Objects/typeobject.c' line='1223' 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='1323' 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='1323' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyType_GetFullyQualifiedName' mangled-name='PyType_GetFullyQualifiedName' filepath='Objects/typeobject.c' line='1548' 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='1548' column='1'/> + <function-decl name='PyType_GetFullyQualifiedName' mangled-name='PyType_GetFullyQualifiedName' filepath='Objects/typeobject.c' line='1552' 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='1552' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyType_NewManagedObject' mangled-name='_PyType_NewManagedObject' filepath='Objects/typeobject.c' line='2329' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_NewManagedObject'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='2329' column='1'/> + <function-decl name='_PyType_NewManagedObject' mangled-name='_PyType_NewManagedObject' filepath='Objects/typeobject.c' line='2334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_NewManagedObject'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='2334' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyObject_LookupSpecialMethod' mangled-name='_PyObject_LookupSpecialMethod' filepath='Objects/typeobject.c' line='2802' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupSpecialMethod'> - <parameter type-id='type-id-6' name='attr' filepath='Objects/typeobject.c' line='2802' column='1'/> - <parameter type-id='type-id-395' name='method_and_self' filepath='Objects/typeobject.c' line='2802' column='1'/> + <function-decl name='_PyObject_LookupSpecialMethod' mangled-name='_PyObject_LookupSpecialMethod' filepath='Objects/typeobject.c' line='2807' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupSpecialMethod'> + <parameter type-id='type-id-6' name='attr' filepath='Objects/typeobject.c' line='2807' column='1'/> + <parameter type-id='type-id-397' name='method_and_self' filepath='Objects/typeobject.c' line='2807' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyObject_MaybeCallSpecialNoArgs' mangled-name='_PyObject_MaybeCallSpecialNoArgs' filepath='Objects/typeobject.c' line='3038' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MaybeCallSpecialNoArgs'> - <parameter type-id='type-id-6' name='self' filepath='Objects/typeobject.c' line='3038' column='1'/> - <parameter type-id='type-id-6' name='attr' filepath='Objects/typeobject.c' line='3038' column='1'/> + <function-decl name='_PyObject_MaybeCallSpecialNoArgs' mangled-name='_PyObject_MaybeCallSpecialNoArgs' filepath='Objects/typeobject.c' line='3043' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MaybeCallSpecialNoArgs'> + <parameter type-id='type-id-6' name='self' filepath='Objects/typeobject.c' line='3043' column='1'/> + <parameter type-id='type-id-6' name='attr' filepath='Objects/typeobject.c' line='3043' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyObject_MaybeCallSpecialOneArg' mangled-name='_PyObject_MaybeCallSpecialOneArg' filepath='Objects/typeobject.c' line='3044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MaybeCallSpecialOneArg'> - <parameter type-id='type-id-6' name='self' filepath='Objects/typeobject.c' line='3044' column='1'/> - <parameter type-id='type-id-6' name='attr' filepath='Objects/typeobject.c' line='3044' column='1'/> - <parameter type-id='type-id-6' name='arg' filepath='Objects/typeobject.c' line='3044' column='1'/> + <function-decl name='_PyObject_MaybeCallSpecialOneArg' mangled-name='_PyObject_MaybeCallSpecialOneArg' filepath='Objects/typeobject.c' line='3049' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MaybeCallSpecialOneArg'> + <parameter type-id='type-id-6' name='self' filepath='Objects/typeobject.c' line='3049' column='1'/> + <parameter type-id='type-id-6' name='attr' filepath='Objects/typeobject.c' line='3049' column='1'/> + <parameter type-id='type-id-6' name='arg' filepath='Objects/typeobject.c' line='3049' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_GetFlags' mangled-name='PyType_GetFlags' filepath='Objects/typeobject.c' line='3834' 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='3834' column='1'/> + <function-decl name='PyType_GetFlags' mangled-name='PyType_GetFlags' filepath='Objects/typeobject.c' line='3843' 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='3843' 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='3841' 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='3841' column='1'/> + <function-decl name='PyType_SUPPORTS_WEAKREFS' mangled-name='PyType_SUPPORTS_WEAKREFS' filepath='Objects/typeobject.c' line='3850' 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='3850' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyType_FromMetaclass' mangled-name='PyType_FromMetaclass' filepath='Objects/typeobject.c' line='4916' 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='4917' column='1'/> - <parameter type-id='type-id-6' name='module' filepath='Objects/typeobject.c' line='4917' column='1'/> - <parameter type-id='type-id-588' name='spec' filepath='Objects/typeobject.c' line='4918' column='1'/> - <parameter type-id='type-id-6' name='bases_in' filepath='Objects/typeobject.c' line='4918' column='1'/> + <function-decl name='PyType_FromMetaclass' mangled-name='PyType_FromMetaclass' filepath='Objects/typeobject.c' line='4925' 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='4926' column='1'/> + <parameter type-id='type-id-6' name='module' filepath='Objects/typeobject.c' line='4926' column='1'/> + <parameter type-id='type-id-590' name='spec' filepath='Objects/typeobject.c' line='4927' column='1'/> + <parameter type-id='type-id-6' name='bases_in' filepath='Objects/typeobject.c' line='4927' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_FromModuleAndSpec' mangled-name='PyType_FromModuleAndSpec' filepath='Objects/typeobject.c' line='5340' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromModuleAndSpec'> - <parameter type-id='type-id-6' name='module' filepath='Objects/typeobject.c' line='5340' column='1'/> - <parameter type-id='type-id-588' name='spec' filepath='Objects/typeobject.c' line='5340' column='1'/> - <parameter type-id='type-id-6' name='bases' filepath='Objects/typeobject.c' line='5340' column='1'/> + <function-decl name='PyType_FromModuleAndSpec' mangled-name='PyType_FromModuleAndSpec' filepath='Objects/typeobject.c' line='5349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromModuleAndSpec'> + <parameter type-id='type-id-6' name='module' filepath='Objects/typeobject.c' line='5349' column='1'/> + <parameter type-id='type-id-590' name='spec' filepath='Objects/typeobject.c' line='5349' column='1'/> + <parameter type-id='type-id-6' name='bases' filepath='Objects/typeobject.c' line='5349' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_FromSpec' mangled-name='PyType_FromSpec' filepath='Objects/typeobject.c' line='5352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpec'> - <parameter type-id='type-id-588' name='spec' filepath='Objects/typeobject.c' line='5352' column='1'/> + <function-decl name='PyType_FromSpec' mangled-name='PyType_FromSpec' filepath='Objects/typeobject.c' line='5361' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpec'> + <parameter type-id='type-id-590' name='spec' filepath='Objects/typeobject.c' line='5361' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_GetName' mangled-name='PyType_GetName' filepath='Objects/typeobject.c' line='5358' 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='5358' column='1'/> + <function-decl name='PyType_GetName' mangled-name='PyType_GetName' filepath='Objects/typeobject.c' line='5367' 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='5367' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_GetModuleName' mangled-name='PyType_GetModuleName' filepath='Objects/typeobject.c' line='5370' 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='5370' column='1'/> + <function-decl name='PyType_GetModuleName' mangled-name='PyType_GetModuleName' filepath='Objects/typeobject.c' line='5379' 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='5379' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_GetSlot' mangled-name='PyType_GetSlot' filepath='Objects/typeobject.c' line='5376' 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='5376' column='1'/> - <parameter type-id='type-id-5' name='slot' filepath='Objects/typeobject.c' line='5376' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='PyType_GetSlot' mangled-name='PyType_GetSlot' filepath='Objects/typeobject.c' line='5385' 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='5385' column='1'/> + <parameter type-id='type-id-5' name='slot' filepath='Objects/typeobject.c' line='5385' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='PyType_GetModule' mangled-name='PyType_GetModule' filepath='Objects/typeobject.c' line='5405' 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='5405' column='1'/> + <function-decl name='PyType_GetModule' mangled-name='PyType_GetModule' filepath='Objects/typeobject.c' line='5414' 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='5414' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_GetModuleState' mangled-name='PyType_GetModuleState' filepath='Objects/typeobject.c' line='5429' 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='5429' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='PyType_GetModuleState' mangled-name='PyType_GetModuleState' filepath='Objects/typeobject.c' line='5438' 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='5438' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='PyType_GetModuleByDef' mangled-name='PyType_GetModuleByDef' filepath='Objects/typeobject.c' line='5443' 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='5443' column='1'/> - <parameter type-id='type-id-473' name='def' filepath='Objects/typeobject.c' line='5443' column='1'/> + <function-decl name='PyType_GetModuleByDef' mangled-name='PyType_GetModuleByDef' filepath='Objects/typeobject.c' line='5452' 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='5452' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Objects/typeobject.c' line='5452' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_GetBaseByToken' mangled-name='PyType_GetBaseByToken' filepath='Objects/typeobject.c' line='5527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetBaseByToken'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='5527' column='1'/> - <parameter type-id='type-id-35' name='token' filepath='Objects/typeobject.c' line='5527' column='1'/> - <parameter type-id='type-id-600' name='result' filepath='Objects/typeobject.c' line='5527' column='1'/> + <function-decl name='PyType_GetBaseByToken' mangled-name='PyType_GetBaseByToken' filepath='Objects/typeobject.c' line='5536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetBaseByToken'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='5536' column='1'/> + <parameter type-id='type-id-41' name='token' filepath='Objects/typeobject.c' line='5536' column='1'/> + <parameter type-id='type-id-602' name='result' filepath='Objects/typeobject.c' line='5536' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyObject_GetTypeData' mangled-name='PyObject_GetTypeData' filepath='Objects/typeobject.c' line='5588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetTypeData'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/typeobject.c' line='5588' column='1'/> - <parameter type-id='type-id-1' name='cls' filepath='Objects/typeobject.c' line='5588' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='PyObject_GetTypeData' mangled-name='PyObject_GetTypeData' filepath='Objects/typeobject.c' line='5597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetTypeData'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/typeobject.c' line='5597' column='1'/> + <parameter type-id='type-id-1' name='cls' filepath='Objects/typeobject.c' line='5597' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='PyType_GetTypeDataSize' mangled-name='PyType_GetTypeDataSize' filepath='Objects/typeobject.c' line='5595' 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='5595' column='1'/> + <function-decl name='PyType_GetTypeDataSize' mangled-name='PyType_GetTypeDataSize' filepath='Objects/typeobject.c' line='5604' 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='5604' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyObject_GetItemData' mangled-name='PyObject_GetItemData' filepath='Objects/typeobject.c' line='5605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetItemData'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/typeobject.c' line='5605' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='PyObject_GetItemData' mangled-name='PyObject_GetItemData' filepath='Objects/typeobject.c' line='5614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetItemData'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/typeobject.c' line='5614' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyType_Lookup' mangled-name='_PyType_Lookup' filepath='Objects/typeobject.c' line='5877' 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='5877' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Objects/typeobject.c' line='5877' column='1'/> + <function-decl name='_PyType_Lookup' mangled-name='_PyType_Lookup' filepath='Objects/typeobject.c' line='5886' 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='5886' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/typeobject.c' line='5886' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyStaticType_InitForExtension' mangled-name='_PyStaticType_InitForExtension' filepath='Objects/typeobject.c' line='8967' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStaticType_InitForExtension'> - <parameter type-id='type-id-33' name='interp' filepath='Objects/typeobject.c' line='8967' column='1'/> - <parameter type-id='type-id-1' name='self' filepath='Objects/typeobject.c' line='8967' column='1'/> + <function-decl name='_PyStaticType_InitForExtension' mangled-name='_PyStaticType_InitForExtension' filepath='Objects/typeobject.c' line='8977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStaticType_InitForExtension'> + <parameter type-id='type-id-39' name='interp' filepath='Objects/typeobject.c' line='8977' column='1'/> + <parameter type-id='type-id-1' name='self' filepath='Objects/typeobject.c' line='8977' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyType_GetSlotWrapperNames' mangled-name='_PyType_GetSlotWrapperNames' filepath='Objects/typeobject.c' line='11389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetSlotWrapperNames'> + <function-decl name='_PyType_GetSlotWrapperNames' mangled-name='_PyType_GetSlotWrapperNames' filepath='Objects/typeobject.c' line='11405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetSlotWrapperNames'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyType_Freeze' mangled-name='PyType_Freeze' filepath='Objects/typeobject.c' line='11639' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Freeze'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='11639' column='1'/> + <function-decl name='PyType_Freeze' mangled-name='PyType_Freeze' filepath='Objects/typeobject.c' line='11655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Freeze'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='11655' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PySuper_Lookup' mangled-name='_PySuper_Lookup' filepath='Objects/typeobject.c' line='11901' 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='11901' column='1'/> - <parameter type-id='type-id-6' name='su_obj' filepath='Objects/typeobject.c' line='11901' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Objects/typeobject.c' line='11901' column='1'/> - <parameter type-id='type-id-177' name='method' filepath='Objects/typeobject.c' line='11901' column='1'/> + <function-decl name='_PySuper_Lookup' mangled-name='_PySuper_Lookup' filepath='Objects/typeobject.c' line='11917' 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='11917' column='1'/> + <parameter type-id='type-id-6' name='su_obj' filepath='Objects/typeobject.c' line='11917' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/typeobject.c' line='11917' column='1'/> + <parameter type-id='type-id-183' name='method' filepath='Objects/typeobject.c' line='11917' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Objects/typevarobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> <var-decl name='_PyTypeAlias_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='21' column='1'/> <var-decl name='_PyNoDefault_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='22' column='1'/> - <var-decl name='_Py_NoDefaultStruct' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='23' column='1'/> + <var-decl name='_Py_NoDefaultStruct' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='23' column='1'/> <function-decl name='_Py_union_from_tuple' filepath='./Include/internal/pycore_unionobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> @@ -11118,36 +11139,36 @@ </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-305' name='ch' filepath='Objects/unicodectype.c' line='62' column='1'/> - <return type-id='type-id-305'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodectype.c' line='62' column='1'/> + <return type-id='type-id-307'/> </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-305' name='ch' filepath='Objects/unicodectype.c' line='121' column='1'/> + <parameter type-id='type-id-307' 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='180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToUppercase'> - <parameter type-id='type-id-305' name='ch' filepath='Objects/unicodectype.c' line='180' column='1'/> - <return type-id='type-id-305'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodectype.c' line='180' column='1'/> + <return type-id='type-id-307'/> </function-decl> <function-decl name='_PyUnicode_ToLowercase' mangled-name='_PyUnicode_ToLowercase' filepath='Objects/unicodectype.c' line='192' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToLowercase'> - <parameter type-id='type-id-305' name='ch' filepath='Objects/unicodectype.c' line='192' column='1'/> - <return type-id='type-id-305'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodectype.c' line='192' column='1'/> + <return type-id='type-id-307'/> </function-decl> <function-decl name='_PyUnicode_ToNumeric' mangled-name='_PyUnicode_ToNumeric' filepath='Objects/unicodetype_db.h' line='4513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToNumeric'> - <parameter type-id='type-id-305' name='ch' filepath='Objects/unicodetype_db.h' line='4513' column='1'/> - <return type-id='type-id-172'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodetype_db.h' line='4513' column='1'/> + <return type-id='type-id-178'/> </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-452' size-in-bits='1024' id='type-id-603'> - <subrange length='128' type-id='type-id-2' id='type-id-604'/> + <array-type-def dimensions='1' type-id='type-id-454' size-in-bits='1024' id='type-id-605'> + <subrange length='128' type-id='type-id-2' id='type-id-606'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-452' size-in-bits='infinite' id='type-id-605'> + <array-type-def dimensions='1' type-id='type-id-454' size-in-bits='infinite' id='type-id-607'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <class-decl name='PyStatus' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-66' visibility='default' filepath='./Include/cpython/initconfig.h' line='10' column='1' id='type-id-606'> + <class-decl name='PyStatus' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-72' visibility='default' filepath='./Include/cpython/initconfig.h' line='10' column='1' id='type-id-608'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_type' type-id='type-id-607' visibility='default' filepath='./Include/cpython/initconfig.h' line='15' column='1'/> + <var-decl name='_type' type-id='type-id-609' 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-4' visibility='default' filepath='./Include/cpython/initconfig.h' line='16' column='1'/> @@ -11159,10 +11180,10 @@ <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-606' filepath='./Include/cpython/initconfig.h' line='19' column='1' id='type-id-66'/> - <pointer-type-def type-id='type-id-608' size-in-bits='64' id='type-id-609'/> - <qualified-type-def type-id='type-id-610' const='yes' id='type-id-611'/> - <pointer-type-def type-id='type-id-611' size-in-bits='64' id='type-id-612'/> + <typedef-decl name='PyStatus' type-id='type-id-608' filepath='./Include/cpython/initconfig.h' line='19' column='1' id='type-id-72'/> + <pointer-type-def type-id='type-id-610' size-in-bits='64' id='type-id-611'/> + <qualified-type-def type-id='type-id-612' const='yes' id='type-id-613'/> + <pointer-type-def type-id='type-id-613' size-in-bits='64' id='type-id-614'/> <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-6'/> <parameter type-id='type-id-4'/> @@ -11184,45 +11205,45 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyUnicode_IsLowercase' mangled-name='_PyUnicode_IsLowercase' filepath='./Include/cpython/unicodeobject.h' line='663' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsLowercase'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsUppercase' mangled-name='_PyUnicode_IsUppercase' filepath='./Include/cpython/unicodeobject.h' line='667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsUppercase'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsTitlecase' mangled-name='_PyUnicode_IsTitlecase' filepath='./Include/cpython/unicodeobject.h' line='671' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsTitlecase'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsLinebreak' mangled-name='_PyUnicode_IsLinebreak' filepath='./Include/cpython/unicodeobject.h' line='679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsLinebreak'> - <parameter type-id='type-id-613'/> + <parameter type-id='type-id-615'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_ToDecimalDigit' mangled-name='_PyUnicode_ToDecimalDigit' filepath='./Include/cpython/unicodeobject.h' line='695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToDecimalDigit'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsDecimalDigit' mangled-name='_PyUnicode_IsDecimalDigit' filepath='./Include/cpython/unicodeobject.h' line='707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsDecimalDigit'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsDigit' mangled-name='_PyUnicode_IsDigit' filepath='./Include/cpython/unicodeobject.h' line='711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsDigit'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsNumeric' mangled-name='_PyUnicode_IsNumeric' filepath='./Include/cpython/unicodeobject.h' line='715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsNumeric'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsAlpha' mangled-name='_PyUnicode_IsAlpha' filepath='./Include/cpython/unicodeobject.h' line='723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsAlpha'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> - <var-decl name='_Py_ascii_whitespace' type-id='type-id-605' mangled-name='_Py_ascii_whitespace' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='728' column='1' elf-symbol-id='_Py_ascii_whitespace'/> + <var-decl name='_Py_ascii_whitespace' type-id='type-id-607' mangled-name='_Py_ascii_whitespace' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='728' 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-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </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-4'/> @@ -11243,58 +11264,58 @@ <function-decl name='_Py_DecodeLocaleEx' mangled-name='_Py_DecodeLocaleEx' filepath='./Include/internal/pycore_fileutils.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecodeLocaleEx'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-244'/> - <parameter type-id='type-id-62'/> + <parameter type-id='type-id-68'/> <parameter type-id='type-id-266'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-614'/> + <parameter type-id='type-id-616'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_EncodeLocaleEx' mangled-name='_Py_EncodeLocaleEx' filepath='./Include/internal/pycore_fileutils.h' line='36' 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-25'/> <parameter type-id='type-id-251'/> - <parameter type-id='type-id-62'/> + <parameter type-id='type-id-68'/> <parameter type-id='type-id-266'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-614'/> + <parameter type-id='type-id-616'/> <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-615'/> - <parameter type-id='type-id-616'/> <parameter type-id='type-id-617'/> - <parameter type-id='type-id-617'/> - <parameter type-id='type-id-609'/> - <return type-id='type-id-618'/> + <parameter type-id='type-id-618'/> + <parameter type-id='type-id-619'/> + <parameter type-id='type-id-619'/> + <parameter type-id='type-id-611'/> + <return type-id='type-id-620'/> </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-618'/> + <parameter type-id='type-id-620'/> <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-612'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-614'/> + <return type-id='type-id-14'/> </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-618'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-620'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> <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-618'/> - <parameter type-id='type-id-35'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-620'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_Py_DumpPathConfig' filepath='./Include/internal/pycore_initconfig.h' line='185' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyInterpreterState_GetConfig' filepath='./Include/internal/pycore_interp.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-240'/> </function-decl> <function-decl name='_PyLong_FormatWriter' filepath='./Include/internal/pycore_long.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> @@ -11313,57 +11334,52 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyMem_RawWcsdup' filepath='./Include/internal/pycore_pymem.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> - <return type-id='type-id-63'/> - </function-decl> - <function-decl name='_PyTemplate_Concat' filepath='./Include/internal/pycore_template.h' line='18' 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-6'/> + <parameter type-id='type-id-25'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_PyType_GetFullyQualifiedName' filepath='./Include/internal/pycore_typeobject.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-1'/> - <parameter type-id='type-id-58'/> + <parameter type-id='type-id-64'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyUnicode_IsXidStart' filepath='./Include/internal/pycore_unicodeobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsXidContinue' filepath='./Include/internal/pycore_unicodeobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_ToLowerFull' filepath='./Include/internal/pycore_unicodeobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-619'/> + <parameter type-id='type-id-307'/> + <parameter type-id='type-id-621'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_ToTitleFull' filepath='./Include/internal/pycore_unicodeobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-619'/> + <parameter type-id='type-id-307'/> + <parameter type-id='type-id-621'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_ToUpperFull' filepath='./Include/internal/pycore_unicodeobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-619'/> + <parameter type-id='type-id-307'/> + <parameter type-id='type-id-621'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_ToFoldedFull' filepath='./Include/internal/pycore_unicodeobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-619'/> + <parameter type-id='type-id-307'/> + <parameter type-id='type-id-621'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsCaseIgnorable' filepath='./Include/internal/pycore_unicodeobject.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsCased' filepath='./Include/internal/pycore_unicodeobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_FormatAdvancedWriter' filepath='./Include/internal/pycore_unicodeobject.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> @@ -11378,467 +11394,467 @@ <var-decl name='PyUnicode_Type' type-id='type-id-271' 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-271' 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-474'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-476'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-69'/> </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'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_GetErrorHandler' mangled-name='_Py_GetErrorHandler' filepath='Objects/unicodeobject.c' line='560' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetErrorHandler'> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='560' column='1'/> - <return type-id='type-id-614'/> + <function-decl name='_Py_GetErrorHandler' mangled-name='_Py_GetErrorHandler' filepath='Objects/unicodeobject.c' line='559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetErrorHandler'> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='559' column='1'/> + <return type-id='type-id-616'/> </function-decl> - <function-decl name='PyUnicode_CopyCharacters' mangled-name='PyUnicode_CopyCharacters' filepath='Objects/unicodeobject.c' line='1621' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_CopyCharacters'> - <parameter type-id='type-id-6' name='to' filepath='Objects/unicodeobject.c' line='1621' column='1'/> - <parameter type-id='type-id-7' name='to_start' filepath='Objects/unicodeobject.c' line='1621' column='1'/> - <parameter type-id='type-id-6' name='from' filepath='Objects/unicodeobject.c' line='1622' column='1'/> - <parameter type-id='type-id-7' name='from_start' filepath='Objects/unicodeobject.c' line='1622' column='1'/> - <parameter type-id='type-id-7' name='how_many' filepath='Objects/unicodeobject.c' line='1623' column='1'/> + <function-decl name='PyUnicode_CopyCharacters' mangled-name='PyUnicode_CopyCharacters' filepath='Objects/unicodeobject.c' line='1620' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_CopyCharacters'> + <parameter type-id='type-id-6' name='to' filepath='Objects/unicodeobject.c' line='1620' column='1'/> + <parameter type-id='type-id-7' name='to_start' filepath='Objects/unicodeobject.c' line='1620' column='1'/> + <parameter type-id='type-id-6' name='from' filepath='Objects/unicodeobject.c' line='1621' column='1'/> + <parameter type-id='type-id-7' name='from_start' filepath='Objects/unicodeobject.c' line='1621' column='1'/> + <parameter type-id='type-id-7' name='how_many' filepath='Objects/unicodeobject.c' line='1622' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_Resize' mangled-name='PyUnicode_Resize' filepath='Objects/unicodeobject.c' line='1884' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Resize'> - <parameter type-id='type-id-241' name='p_unicode' filepath='Objects/unicodeobject.c' line='1884' column='1'/> - <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='1884' column='1'/> + <function-decl name='PyUnicode_Resize' mangled-name='PyUnicode_Resize' filepath='Objects/unicodeobject.c' line='1883' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Resize'> + <parameter type-id='type-id-241' name='p_unicode' filepath='Objects/unicodeobject.c' line='1883' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='1883' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_FromWideChar' mangled-name='PyUnicode_FromWideChar' filepath='Objects/unicodeobject.c' line='2042' 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='2042' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2042' column='1'/> + <function-decl name='PyUnicode_FromWideChar' mangled-name='PyUnicode_FromWideChar' filepath='Objects/unicodeobject.c' line='2041' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromWideChar'> + <parameter type-id='type-id-25' name='u' filepath='Objects/unicodeobject.c' line='2041' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2041' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicodeWriter_WriteWideChar' mangled-name='PyUnicodeWriter_WriteWideChar' filepath='Objects/unicodeobject.c' line='2101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteWideChar'> - <parameter type-id='type-id-415' name='pub_writer' filepath='Objects/unicodeobject.c' line='2101' column='1'/> - <parameter type-id='type-id-18' name='str' filepath='Objects/unicodeobject.c' line='2102' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2103' column='1'/> + <function-decl name='PyUnicodeWriter_WriteWideChar' mangled-name='PyUnicodeWriter_WriteWideChar' filepath='Objects/unicodeobject.c' line='2100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteWideChar'> + <parameter type-id='type-id-417' name='pub_writer' filepath='Objects/unicodeobject.c' line='2100' column='1'/> + <parameter type-id='type-id-25' name='str' filepath='Objects/unicodeobject.c' line='2101' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2102' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicodeWriter_WriteUCS4' mangled-name='PyUnicodeWriter_WriteUCS4' filepath='Objects/unicodeobject.c' line='2377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteUCS4'> - <parameter type-id='type-id-415' name='pub_writer' filepath='Objects/unicodeobject.c' line='2377' column='1'/> - <parameter type-id='type-id-619' name='str' filepath='Objects/unicodeobject.c' line='2378' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2379' column='1'/> + <function-decl name='PyUnicodeWriter_WriteUCS4' mangled-name='PyUnicodeWriter_WriteUCS4' filepath='Objects/unicodeobject.c' line='2376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteUCS4'> + <parameter type-id='type-id-417' name='pub_writer' filepath='Objects/unicodeobject.c' line='2376' column='1'/> + <parameter type-id='type-id-621' name='str' filepath='Objects/unicodeobject.c' line='2377' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2378' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_FromKindAndData' mangled-name='PyUnicode_FromKindAndData' filepath='Objects/unicodeobject.c' line='2421' 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='2421' column='1'/> - <parameter type-id='type-id-35' name='buffer' filepath='Objects/unicodeobject.c' line='2421' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2421' column='1'/> + <function-decl name='PyUnicode_FromKindAndData' mangled-name='PyUnicode_FromKindAndData' filepath='Objects/unicodeobject.c' line='2420' 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='2420' column='1'/> + <parameter type-id='type-id-41' name='buffer' filepath='Objects/unicodeobject.c' line='2420' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2420' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsUCS4' mangled-name='PyUnicode_AsUCS4' filepath='Objects/unicodeobject.c' line='2641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4'> - <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='2641' column='1'/> - <parameter type-id='type-id-619' name='target' filepath='Objects/unicodeobject.c' line='2641' column='1'/> - <parameter type-id='type-id-7' name='targetsize' filepath='Objects/unicodeobject.c' line='2641' column='1'/> - <parameter type-id='type-id-5' name='copy_null' filepath='Objects/unicodeobject.c' line='2642' column='1'/> - <return type-id='type-id-619'/> + <function-decl name='PyUnicode_AsUCS4' mangled-name='PyUnicode_AsUCS4' filepath='Objects/unicodeobject.c' line='2640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4'> + <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='2640' column='1'/> + <parameter type-id='type-id-621' name='target' filepath='Objects/unicodeobject.c' line='2640' column='1'/> + <parameter type-id='type-id-7' name='targetsize' filepath='Objects/unicodeobject.c' line='2640' column='1'/> + <parameter type-id='type-id-5' name='copy_null' filepath='Objects/unicodeobject.c' line='2641' column='1'/> + <return type-id='type-id-621'/> </function-decl> - <function-decl name='PyUnicode_AsUCS4Copy' mangled-name='PyUnicode_AsUCS4Copy' filepath='Objects/unicodeobject.c' line='2652' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4Copy'> - <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='2652' column='1'/> - <return type-id='type-id-619'/> + <function-decl name='PyUnicode_AsUCS4Copy' mangled-name='PyUnicode_AsUCS4Copy' filepath='Objects/unicodeobject.c' line='2651' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4Copy'> + <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='2651' column='1'/> + <return type-id='type-id-621'/> </function-decl> - <function-decl name='PyUnicodeWriter_Format' mangled-name='PyUnicodeWriter_Format' filepath='Objects/unicodeobject.c' line='3278' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_Format'> - <parameter type-id='type-id-415' name='writer' filepath='Objects/unicodeobject.c' line='3278' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Objects/unicodeobject.c' line='3278' column='1'/> + <function-decl name='PyUnicodeWriter_Format' mangled-name='PyUnicodeWriter_Format' filepath='Objects/unicodeobject.c' line='3277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_Format'> + <parameter type-id='type-id-417' name='writer' filepath='Objects/unicodeobject.c' line='3277' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Objects/unicodeobject.c' line='3277' column='1'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_AsWideCharString' mangled-name='PyUnicode_AsWideCharString' filepath='Objects/unicodeobject.c' line='3415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsWideCharString'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3415' column='1'/> - <parameter type-id='type-id-8' name='size' filepath='Objects/unicodeobject.c' line='3416' column='1'/> - <return type-id='type-id-63'/> + <function-decl name='PyUnicode_AsWideCharString' mangled-name='PyUnicode_AsWideCharString' filepath='Objects/unicodeobject.c' line='3414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsWideCharString'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3414' column='1'/> + <parameter type-id='type-id-8' name='size' filepath='Objects/unicodeobject.c' line='3415' column='1'/> + <return type-id='type-id-69'/> </function-decl> - <function-decl name='PyUnicode_FromOrdinal' mangled-name='PyUnicode_FromOrdinal' filepath='Objects/unicodeobject.c' line='3511' 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='3511' column='1'/> + <function-decl name='PyUnicode_FromOrdinal' mangled-name='PyUnicode_FromOrdinal' filepath='Objects/unicodeobject.c' line='3510' 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='3510' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_FromObject' mangled-name='PyUnicode_FromObject' filepath='Objects/unicodeobject.c' line='3523' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromObject'> - <parameter type-id='type-id-6' name='obj' filepath='Objects/unicodeobject.c' line='3523' column='1'/> + <function-decl name='PyUnicode_FromObject' mangled-name='PyUnicode_FromObject' filepath='Objects/unicodeobject.c' line='3522' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromObject'> + <parameter type-id='type-id-6' name='obj' filepath='Objects/unicodeobject.c' line='3522' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsDecodedObject' mangled-name='PyUnicode_AsDecodedObject' filepath='Objects/unicodeobject.c' line='3734' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedObject'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3734' column='1'/> - <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='3735' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3736' column='1'/> + <function-decl name='PyUnicode_AsDecodedObject' mangled-name='PyUnicode_AsDecodedObject' filepath='Objects/unicodeobject.c' line='3733' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedObject'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3733' column='1'/> + <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='3734' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3735' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsDecodedUnicode' mangled-name='PyUnicode_AsDecodedUnicode' filepath='Objects/unicodeobject.c' line='3757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedUnicode'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3757' column='1'/> - <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='3758' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3759' column='1'/> + <function-decl name='PyUnicode_AsDecodedUnicode' mangled-name='PyUnicode_AsDecodedUnicode' filepath='Objects/unicodeobject.c' line='3756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedUnicode'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3756' column='1'/> + <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='3757' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3758' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsEncodedObject' mangled-name='PyUnicode_AsEncodedObject' filepath='Objects/unicodeobject.c' line='3797' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedObject'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3797' column='1'/> - <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='3798' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3799' column='1'/> + <function-decl name='PyUnicode_AsEncodedObject' mangled-name='PyUnicode_AsEncodedObject' filepath='Objects/unicodeobject.c' line='3796' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedObject'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3796' column='1'/> + <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='3797' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3798' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_EncodeLocale' mangled-name='PyUnicode_EncodeLocale' filepath='Objects/unicodeobject.c' line='3880' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeLocale'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3880' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3880' column='1'/> + <function-decl name='PyUnicode_EncodeLocale' mangled-name='PyUnicode_EncodeLocale' filepath='Objects/unicodeobject.c' line='3879' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeLocale'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3879' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='3879' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_EncodeFSDefault' mangled-name='PyUnicode_EncodeFSDefault' filepath='Objects/unicodeobject.c' line='3887' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeFSDefault'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3887' column='1'/> + <function-decl name='PyUnicode_EncodeFSDefault' mangled-name='PyUnicode_EncodeFSDefault' filepath='Objects/unicodeobject.c' line='3886' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeFSDefault'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='3886' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsEncodedUnicode' mangled-name='PyUnicode_AsEncodedUnicode' filepath='Objects/unicodeobject.c' line='4021' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedUnicode'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4021' column='1'/> - <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='4022' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4023' column='1'/> + <function-decl name='PyUnicode_AsEncodedUnicode' mangled-name='PyUnicode_AsEncodedUnicode' filepath='Objects/unicodeobject.c' line='4020' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedUnicode'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4020' column='1'/> + <parameter type-id='type-id-4' name='encoding' filepath='Objects/unicodeobject.c' line='4021' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4022' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeLocaleAndSize' mangled-name='PyUnicode_DecodeLocaleAndSize' filepath='Objects/unicodeobject.c' line='4102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocaleAndSize'> - <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='4102' column='1'/> - <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='4102' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4103' column='1'/> + <function-decl name='PyUnicode_DecodeLocaleAndSize' mangled-name='PyUnicode_DecodeLocaleAndSize' filepath='Objects/unicodeobject.c' line='4101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocaleAndSize'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='4101' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='4101' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4102' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeLocale' mangled-name='PyUnicode_DecodeLocale' filepath='Objects/unicodeobject.c' line='4110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocale'> - <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='4110' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4110' column='1'/> + <function-decl name='PyUnicode_DecodeLocale' mangled-name='PyUnicode_DecodeLocale' filepath='Objects/unicodeobject.c' line='4109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocale'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='4109' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4109' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeFSDefaultAndSize' mangled-name='PyUnicode_DecodeFSDefaultAndSize' filepath='Objects/unicodeobject.c' line='4125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeFSDefaultAndSize'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='4125' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4125' column='1'/> + <function-decl name='PyUnicode_DecodeFSDefaultAndSize' mangled-name='PyUnicode_DecodeFSDefaultAndSize' filepath='Objects/unicodeobject.c' line='4124' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeFSDefaultAndSize'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='4124' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4124' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_FSConverter' mangled-name='PyUnicode_FSConverter' filepath='Objects/unicodeobject.c' line='4161' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSConverter'> - <parameter type-id='type-id-6' name='arg' filepath='Objects/unicodeobject.c' line='4161' column='1'/> - <parameter type-id='type-id-35' name='addr' filepath='Objects/unicodeobject.c' line='4161' column='1'/> + <function-decl name='PyUnicode_FSConverter' mangled-name='PyUnicode_FSConverter' filepath='Objects/unicodeobject.c' line='4160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSConverter'> + <parameter type-id='type-id-6' name='arg' filepath='Objects/unicodeobject.c' line='4160' column='1'/> + <parameter type-id='type-id-41' name='addr' filepath='Objects/unicodeobject.c' line='4160' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_FSDecoder' mangled-name='PyUnicode_FSDecoder' filepath='Objects/unicodeobject.c' line='4201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSDecoder'> - <parameter type-id='type-id-6' name='arg' filepath='Objects/unicodeobject.c' line='4201' column='1'/> - <parameter type-id='type-id-35' name='addr' filepath='Objects/unicodeobject.c' line='4201' column='1'/> + <function-decl name='PyUnicode_FSDecoder' mangled-name='PyUnicode_FSDecoder' filepath='Objects/unicodeobject.c' line='4200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSDecoder'> + <parameter type-id='type-id-6' name='arg' filepath='Objects/unicodeobject.c' line='4200' column='1'/> + <parameter type-id='type-id-41' name='addr' filepath='Objects/unicodeobject.c' line='4200' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyUnicode_AsUTF8NoNUL' mangled-name='_PyUnicode_AsUTF8NoNUL' filepath='Objects/unicodeobject.c' line='4293' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsUTF8NoNUL'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4293' column='1'/> + <function-decl name='_PyUnicode_AsUTF8NoNUL' mangled-name='_PyUnicode_AsUTF8NoNUL' filepath='Objects/unicodeobject.c' line='4292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsUTF8NoNUL'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4292' column='1'/> <return type-id='type-id-4'/> </function-decl> - <function-decl name='PyUnicode_GetSize' mangled-name='PyUnicode_GetSize' filepath='Objects/unicodeobject.c' line='4313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetSize'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4313' column='1'/> + <function-decl name='PyUnicode_GetSize' mangled-name='PyUnicode_GetSize' filepath='Objects/unicodeobject.c' line='4312' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetSize'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4312' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_GetLength' mangled-name='PyUnicode_GetLength' filepath='Objects/unicodeobject.c' line='4321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetLength'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4321' column='1'/> + <function-decl name='PyUnicode_GetLength' mangled-name='PyUnicode_GetLength' filepath='Objects/unicodeobject.c' line='4320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetLength'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4320' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_WriteChar' mangled-name='PyUnicode_WriteChar' filepath='Objects/unicodeobject.c' line='4350' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_WriteChar'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4350' column='1'/> - <parameter type-id='type-id-7' name='index' filepath='Objects/unicodeobject.c' line='4350' column='1'/> - <parameter type-id='type-id-305' name='ch' filepath='Objects/unicodeobject.c' line='4350' column='1'/> + <function-decl name='PyUnicode_WriteChar' mangled-name='PyUnicode_WriteChar' filepath='Objects/unicodeobject.c' line='4349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_WriteChar'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='4349' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/unicodeobject.c' line='4349' column='1'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodeobject.c' line='4349' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_DecodeUTF7' mangled-name='PyUnicode_DecodeUTF7' filepath='Objects/unicodeobject.c' line='4712' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='4712' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4713' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4714' column='1'/> + <function-decl name='PyUnicode_DecodeUTF7' mangled-name='PyUnicode_DecodeUTF7' filepath='Objects/unicodeobject.c' line='4711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='4711' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4712' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4713' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeUTF7Stateful' mangled-name='PyUnicode_DecodeUTF7Stateful' filepath='Objects/unicodeobject.c' line='4727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7Stateful'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='4727' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4728' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4729' column='1'/> - <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='4730' column='1'/> + <function-decl name='PyUnicode_DecodeUTF7Stateful' mangled-name='PyUnicode_DecodeUTF7Stateful' filepath='Objects/unicodeobject.c' line='4726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7Stateful'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='4726' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4727' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='4728' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='4729' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeUTF32' mangled-name='PyUnicode_DecodeUTF32' filepath='Objects/unicodeobject.c' line='5964' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='5964' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5965' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='5966' column='1'/> - <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='5967' column='1'/> + <function-decl name='PyUnicode_DecodeUTF32' mangled-name='PyUnicode_DecodeUTF32' filepath='Objects/unicodeobject.c' line='5961' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='5961' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5962' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='5963' column='1'/> + <parameter type-id='type-id-183' name='byteorder' filepath='Objects/unicodeobject.c' line='5964' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeUTF32Stateful' mangled-name='PyUnicode_DecodeUTF32Stateful' filepath='Objects/unicodeobject.c' line='5973' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32Stateful'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='5973' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5974' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='5975' column='1'/> - <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='5976' column='1'/> - <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='5977' column='1'/> + <function-decl name='PyUnicode_DecodeUTF32Stateful' mangled-name='PyUnicode_DecodeUTF32Stateful' filepath='Objects/unicodeobject.c' line='5970' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32Stateful'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='5970' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5971' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='5972' column='1'/> + <parameter type-id='type-id-183' name='byteorder' filepath='Objects/unicodeobject.c' line='5973' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='5974' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyUnicode_EncodeUTF32' mangled-name='_PyUnicode_EncodeUTF32' filepath='Objects/unicodeobject.c' line='6118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF32'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='6118' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6119' column='1'/> - <parameter type-id='type-id-5' name='byteorder' filepath='Objects/unicodeobject.c' line='6120' column='1'/> + <function-decl name='_PyUnicode_EncodeUTF32' mangled-name='_PyUnicode_EncodeUTF32' filepath='Objects/unicodeobject.c' line='6115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF32'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='6115' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6116' column='1'/> + <parameter type-id='type-id-5' name='byteorder' filepath='Objects/unicodeobject.c' line='6117' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsUTF32String' mangled-name='PyUnicode_AsUTF32String' filepath='Objects/unicodeobject.c' line='6263' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF32String'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='6263' column='1'/> + <function-decl name='PyUnicode_AsUTF32String' mangled-name='PyUnicode_AsUTF32String' filepath='Objects/unicodeobject.c' line='6260' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF32String'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='6260' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeUTF16' mangled-name='PyUnicode_DecodeUTF16' filepath='Objects/unicodeobject.c' line='6271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='6271' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6272' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6273' column='1'/> - <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='6274' column='1'/> + <function-decl name='PyUnicode_DecodeUTF16' mangled-name='PyUnicode_DecodeUTF16' filepath='Objects/unicodeobject.c' line='6268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='6268' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6269' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6270' column='1'/> + <parameter type-id='type-id-183' name='byteorder' filepath='Objects/unicodeobject.c' line='6271' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeUTF16Stateful' mangled-name='PyUnicode_DecodeUTF16Stateful' filepath='Objects/unicodeobject.c' line='6280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16Stateful'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='6280' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6281' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6282' column='1'/> - <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='6283' column='1'/> - <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='6284' column='1'/> + <function-decl name='PyUnicode_DecodeUTF16Stateful' mangled-name='PyUnicode_DecodeUTF16Stateful' filepath='Objects/unicodeobject.c' line='6277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16Stateful'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='6277' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6278' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6279' column='1'/> + <parameter type-id='type-id-183' name='byteorder' filepath='Objects/unicodeobject.c' line='6280' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='6281' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyUnicode_EncodeUTF16' mangled-name='_PyUnicode_EncodeUTF16' filepath='Objects/unicodeobject.c' line='6435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF16'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='6435' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6436' column='1'/> - <parameter type-id='type-id-5' name='byteorder' filepath='Objects/unicodeobject.c' line='6437' column='1'/> + <function-decl name='_PyUnicode_EncodeUTF16' mangled-name='_PyUnicode_EncodeUTF16' filepath='Objects/unicodeobject.c' line='6432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF16'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='6432' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6433' column='1'/> + <parameter type-id='type-id-5' name='byteorder' filepath='Objects/unicodeobject.c' line='6434' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsUTF16String' mangled-name='PyUnicode_AsUTF16String' filepath='Objects/unicodeobject.c' line='6599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF16String'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='6599' column='1'/> + <function-decl name='PyUnicode_AsUTF16String' mangled-name='PyUnicode_AsUTF16String' filepath='Objects/unicodeobject.c' line='6596' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF16String'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='6596' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeUnicodeEscape' mangled-name='PyUnicode_DecodeUnicodeEscape' filepath='Objects/unicodeobject.c' line='6913' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUnicodeEscape'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='6913' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6914' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6915' column='1'/> + <function-decl name='PyUnicode_DecodeUnicodeEscape' mangled-name='PyUnicode_DecodeUnicodeEscape' filepath='Objects/unicodeobject.c' line='6910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUnicodeEscape'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='6910' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6911' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='6912' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsUnicodeEscapeString' mangled-name='PyUnicode_AsUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='6923' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUnicodeEscapeString'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='6923' column='1'/> + <function-decl name='PyUnicode_AsUnicodeEscapeString' mangled-name='PyUnicode_AsUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='6920' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUnicodeEscapeString'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='6920' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeRawUnicodeEscape' mangled-name='PyUnicode_DecodeRawUnicodeEscape' filepath='Objects/unicodeobject.c' line='7176' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeRawUnicodeEscape'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='7176' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='7177' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='7178' column='1'/> + <function-decl name='PyUnicode_DecodeRawUnicodeEscape' mangled-name='PyUnicode_DecodeRawUnicodeEscape' filepath='Objects/unicodeobject.c' line='7173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeRawUnicodeEscape'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='7173' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='7174' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='7175' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsRawUnicodeEscapeString' mangled-name='PyUnicode_AsRawUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='7185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsRawUnicodeEscapeString'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='7185' column='1'/> + <function-decl name='PyUnicode_AsRawUnicodeEscapeString' mangled-name='PyUnicode_AsRawUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='7182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsRawUnicodeEscapeString'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='7182' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsLatin1String' mangled-name='PyUnicode_AsLatin1String' filepath='Objects/unicodeobject.c' line='7566' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsLatin1String'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='7566' column='1'/> + <function-decl name='PyUnicode_AsLatin1String' mangled-name='PyUnicode_AsLatin1String' filepath='Objects/unicodeobject.c' line='7563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsLatin1String'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='7563' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_DecodeCharmap' mangled-name='PyUnicode_DecodeCharmap' filepath='Objects/unicodeobject.c' line='8619' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeCharmap'> - <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='8619' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='8620' column='1'/> - <parameter type-id='type-id-6' name='mapping' filepath='Objects/unicodeobject.c' line='8621' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='8622' column='1'/> + <function-decl name='PyUnicode_DecodeCharmap' mangled-name='PyUnicode_DecodeCharmap' filepath='Objects/unicodeobject.c' line='8612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeCharmap'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='8612' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='8613' column='1'/> + <parameter type-id='type-id-6' name='mapping' filepath='Objects/unicodeobject.c' line='8614' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='8615' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_BuildEncodingMap' mangled-name='PyUnicode_BuildEncodingMap' filepath='Objects/unicodeobject.c' line='8695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_BuildEncodingMap'> - <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='8695' column='1'/> + <function-decl name='PyUnicode_BuildEncodingMap' mangled-name='PyUnicode_BuildEncodingMap' filepath='Objects/unicodeobject.c' line='8688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_BuildEncodingMap'> + <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='8688' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_AsCharmapString' mangled-name='PyUnicode_AsCharmapString' filepath='Objects/unicodeobject.c' line='9184' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsCharmapString'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='9184' column='1'/> - <parameter type-id='type-id-6' name='mapping' filepath='Objects/unicodeobject.c' line='9185' column='1'/> + <function-decl name='PyUnicode_AsCharmapString' mangled-name='PyUnicode_AsCharmapString' filepath='Objects/unicodeobject.c' line='9177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsCharmapString'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='9177' column='1'/> + <parameter type-id='type-id-6' name='mapping' filepath='Objects/unicodeobject.c' line='9178' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Translate' mangled-name='PyUnicode_Translate' filepath='Objects/unicodeobject.c' line='9603' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Translate'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9603' column='1'/> - <parameter type-id='type-id-6' name='mapping' filepath='Objects/unicodeobject.c' line='9604' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='9605' column='1'/> + <function-decl name='PyUnicode_Translate' mangled-name='PyUnicode_Translate' filepath='Objects/unicodeobject.c' line='9596' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Translate'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9596' column='1'/> + <parameter type-id='type-id-6' name='mapping' filepath='Objects/unicodeobject.c' line='9597' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='9598' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Count' mangled-name='PyUnicode_Count' filepath='Objects/unicodeobject.c' line='9901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Count'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9901' column='1'/> - <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='9902' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9903' column='1'/> - <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9904' column='1'/> + <function-decl name='PyUnicode_Count' mangled-name='PyUnicode_Count' filepath='Objects/unicodeobject.c' line='9894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Count'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9894' column='1'/> + <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='9895' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9896' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9897' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_Find' mangled-name='PyUnicode_Find' filepath='Objects/unicodeobject.c' line='9913' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Find'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9913' column='1'/> - <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='9914' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9915' column='1'/> - <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9916' column='1'/> - <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9917' column='1'/> + <function-decl name='PyUnicode_Find' mangled-name='PyUnicode_Find' filepath='Objects/unicodeobject.c' line='9906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Find'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9906' column='1'/> + <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='9907' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9908' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9909' column='1'/> + <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9910' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_FindChar' mangled-name='PyUnicode_FindChar' filepath='Objects/unicodeobject.c' line='9926' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FindChar'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9926' column='1'/> - <parameter type-id='type-id-305' name='ch' filepath='Objects/unicodeobject.c' line='9926' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9927' column='1'/> - <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9927' column='1'/> - <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9928' column='1'/> + <function-decl name='PyUnicode_FindChar' mangled-name='PyUnicode_FindChar' filepath='Objects/unicodeobject.c' line='9919' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FindChar'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='9919' column='1'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodeobject.c' line='9919' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9920' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9920' column='1'/> + <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9921' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_Tailmatch' mangled-name='PyUnicode_Tailmatch' filepath='Objects/unicodeobject.c' line='10009' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Tailmatch'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='10009' column='1'/> - <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='10010' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='10011' column='1'/> - <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='10012' column='1'/> - <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='10013' column='1'/> + <function-decl name='PyUnicode_Tailmatch' mangled-name='PyUnicode_Tailmatch' filepath='Objects/unicodeobject.c' line='10002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Tailmatch'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='10002' column='1'/> + <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='10003' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='10004' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='10005' column='1'/> + <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='10006' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyUnicode_JoinArray' mangled-name='_PyUnicode_JoinArray' filepath='Objects/unicodeobject.c' line='10279' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_JoinArray'> - <parameter type-id='type-id-6' name='separator' filepath='Objects/unicodeobject.c' line='10279' column='1'/> - <parameter type-id='type-id-265' name='items' filepath='Objects/unicodeobject.c' line='10279' column='1'/> - <parameter type-id='type-id-7' name='seqlen' filepath='Objects/unicodeobject.c' line='10279' column='1'/> + <function-decl name='_PyUnicode_JoinArray' mangled-name='_PyUnicode_JoinArray' filepath='Objects/unicodeobject.c' line='10272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_JoinArray'> + <parameter type-id='type-id-6' name='separator' filepath='Objects/unicodeobject.c' line='10272' column='1'/> + <parameter type-id='type-id-265' name='items' filepath='Objects/unicodeobject.c' line='10272' column='1'/> + <parameter type-id='type-id-7' name='seqlen' filepath='Objects/unicodeobject.c' line='10272' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Fill' mangled-name='PyUnicode_Fill' filepath='Objects/unicodeobject.c' line='10459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Fill'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='10459' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='10459' column='1'/> - <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='10459' column='1'/> - <parameter type-id='type-id-305' name='fill_char' filepath='Objects/unicodeobject.c' line='10460' column='1'/> + <function-decl name='PyUnicode_Fill' mangled-name='PyUnicode_Fill' filepath='Objects/unicodeobject.c' line='10452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Fill'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='10452' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='10452' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='10452' column='1'/> + <parameter type-id='type-id-307' name='fill_char' filepath='Objects/unicodeobject.c' line='10453' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='PyUnicode_Splitlines' mangled-name='PyUnicode_Splitlines' filepath='Objects/unicodeobject.c' line='10533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Splitlines'> - <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='10533' column='1'/> - <parameter type-id='type-id-5' name='keepends' filepath='Objects/unicodeobject.c' line='10533' column='1'/> + <function-decl name='PyUnicode_Splitlines' mangled-name='PyUnicode_Splitlines' filepath='Objects/unicodeobject.c' line='10526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Splitlines'> + <parameter type-id='type-id-6' name='string' filepath='Objects/unicodeobject.c' line='10526' column='1'/> + <parameter type-id='type-id-5' name='keepends' filepath='Objects/unicodeobject.c' line='10526' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Equal' mangled-name='PyUnicode_Equal' filepath='Objects/unicodeobject.c' line='11321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Equal'> - <parameter type-id='type-id-6' name='str1' filepath='Objects/unicodeobject.c' line='11321' column='1'/> - <parameter type-id='type-id-6' name='str2' filepath='Objects/unicodeobject.c' line='11321' column='1'/> + <function-decl name='PyUnicode_Equal' mangled-name='PyUnicode_Equal' filepath='Objects/unicodeobject.c' line='11314' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Equal'> + <parameter type-id='type-id-6' name='str1' filepath='Objects/unicodeobject.c' line='11314' column='1'/> + <parameter type-id='type-id-6' name='str2' filepath='Objects/unicodeobject.c' line='11314' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_EqualToUTF8' mangled-name='PyUnicode_EqualToUTF8' filepath='Objects/unicodeobject.c' line='11401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EqualToUTF8'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='11401' column='1'/> - <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='11401' column='1'/> + <function-decl name='PyUnicode_EqualToUTF8' mangled-name='PyUnicode_EqualToUTF8' filepath='Objects/unicodeobject.c' line='11394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EqualToUTF8'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='11394' column='1'/> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='11394' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_EqualToUTF8AndSize' mangled-name='PyUnicode_EqualToUTF8AndSize' filepath='Objects/unicodeobject.c' line='11407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EqualToUTF8AndSize'> - <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='11407' column='1'/> - <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='11407' column='1'/> - <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='11407' column='1'/> + <function-decl name='PyUnicode_EqualToUTF8AndSize' mangled-name='PyUnicode_EqualToUTF8AndSize' filepath='Objects/unicodeobject.c' line='11400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EqualToUTF8AndSize'> + <parameter type-id='type-id-6' name='unicode' filepath='Objects/unicodeobject.c' line='11400' column='1'/> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='11400' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='11400' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_RichCompare' mangled-name='PyUnicode_RichCompare' filepath='Objects/unicodeobject.c' line='11536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RichCompare'> - <parameter type-id='type-id-6' name='left' filepath='Objects/unicodeobject.c' line='11536' column='1'/> - <parameter type-id='type-id-6' name='right' filepath='Objects/unicodeobject.c' line='11536' column='1'/> - <parameter type-id='type-id-5' name='op' filepath='Objects/unicodeobject.c' line='11536' column='1'/> + <function-decl name='PyUnicode_RichCompare' mangled-name='PyUnicode_RichCompare' filepath='Objects/unicodeobject.c' line='11529' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RichCompare'> + <parameter type-id='type-id-6' name='left' filepath='Objects/unicodeobject.c' line='11529' column='1'/> + <parameter type-id='type-id-6' name='right' filepath='Objects/unicodeobject.c' line='11529' column='1'/> + <parameter type-id='type-id-5' name='op' filepath='Objects/unicodeobject.c' line='11529' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Contains' mangled-name='PyUnicode_Contains' filepath='Objects/unicodeobject.c' line='11571' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Contains'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='11571' column='1'/> - <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='11571' column='1'/> + <function-decl name='PyUnicode_Contains' mangled-name='PyUnicode_Contains' filepath='Objects/unicodeobject.c' line='11564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Contains'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='11564' column='1'/> + <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='11564' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_Append' mangled-name='PyUnicode_Append' filepath='Objects/unicodeobject.c' line='11687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Append'> - <parameter type-id='type-id-241' name='p_left' filepath='Objects/unicodeobject.c' line='11687' column='1'/> - <parameter type-id='type-id-6' name='right' filepath='Objects/unicodeobject.c' line='11687' column='1'/> + <function-decl name='PyUnicode_Append' mangled-name='PyUnicode_Append' filepath='Objects/unicodeobject.c' line='11674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Append'> + <parameter type-id='type-id-241' name='p_left' filepath='Objects/unicodeobject.c' line='11674' column='1'/> + <parameter type-id='type-id-6' name='right' filepath='Objects/unicodeobject.c' line='11674' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyUnicode_AppendAndDel' mangled-name='PyUnicode_AppendAndDel' filepath='Objects/unicodeobject.c' line='11764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AppendAndDel'> - <parameter type-id='type-id-241' name='pleft' filepath='Objects/unicodeobject.c' line='11764' column='1'/> - <parameter type-id='type-id-6' name='right' filepath='Objects/unicodeobject.c' line='11764' column='1'/> + <function-decl name='PyUnicode_AppendAndDel' mangled-name='PyUnicode_AppendAndDel' filepath='Objects/unicodeobject.c' line='11751' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AppendAndDel'> + <parameter type-id='type-id-241' name='pleft' filepath='Objects/unicodeobject.c' line='11751' column='1'/> + <parameter type-id='type-id-6' name='right' filepath='Objects/unicodeobject.c' line='11751' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyUnicode_Replace' mangled-name='PyUnicode_Replace' filepath='Objects/unicodeobject.c' line='12872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Replace'> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='12872' column='1'/> - <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='12873' column='1'/> - <parameter type-id='type-id-6' name='replstr' filepath='Objects/unicodeobject.c' line='12874' column='1'/> - <parameter type-id='type-id-7' name='maxcount' filepath='Objects/unicodeobject.c' line='12875' column='1'/> + <function-decl name='PyUnicode_Replace' mangled-name='PyUnicode_Replace' filepath='Objects/unicodeobject.c' line='12859' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Replace'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='12859' column='1'/> + <parameter type-id='type-id-6' name='substr' filepath='Objects/unicodeobject.c' line='12860' column='1'/> + <parameter type-id='type-id-6' name='replstr' filepath='Objects/unicodeobject.c' line='12861' column='1'/> + <parameter type-id='type-id-7' name='maxcount' filepath='Objects/unicodeobject.c' line='12862' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Split' mangled-name='PyUnicode_Split' filepath='Objects/unicodeobject.c' line='13121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Split'> - <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='13121' column='1'/> - <parameter type-id='type-id-6' name='sep' filepath='Objects/unicodeobject.c' line='13121' column='1'/> - <parameter type-id='type-id-7' name='maxsplit' filepath='Objects/unicodeobject.c' line='13121' column='1'/> + <function-decl name='PyUnicode_Split' mangled-name='PyUnicode_Split' filepath='Objects/unicodeobject.c' line='13108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Split'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='13108' column='1'/> + <parameter type-id='type-id-6' name='sep' filepath='Objects/unicodeobject.c' line='13108' column='1'/> + <parameter type-id='type-id-7' name='maxsplit' filepath='Objects/unicodeobject.c' line='13108' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_Partition' mangled-name='PyUnicode_Partition' filepath='Objects/unicodeobject.c' line='13168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Partition'> - <parameter type-id='type-id-6' name='str_obj' filepath='Objects/unicodeobject.c' line='13168' column='1'/> - <parameter type-id='type-id-6' name='sep_obj' filepath='Objects/unicodeobject.c' line='13168' column='1'/> + <function-decl name='PyUnicode_Partition' mangled-name='PyUnicode_Partition' filepath='Objects/unicodeobject.c' line='13155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Partition'> + <parameter type-id='type-id-6' name='str_obj' filepath='Objects/unicodeobject.c' line='13155' column='1'/> + <parameter type-id='type-id-6' name='sep_obj' filepath='Objects/unicodeobject.c' line='13155' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_RPartition' mangled-name='PyUnicode_RPartition' filepath='Objects/unicodeobject.c' line='13220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RPartition'> - <parameter type-id='type-id-6' name='str_obj' filepath='Objects/unicodeobject.c' line='13220' column='1'/> - <parameter type-id='type-id-6' name='sep_obj' filepath='Objects/unicodeobject.c' line='13220' column='1'/> + <function-decl name='PyUnicode_RPartition' mangled-name='PyUnicode_RPartition' filepath='Objects/unicodeobject.c' line='13207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RPartition'> + <parameter type-id='type-id-6' name='str_obj' filepath='Objects/unicodeobject.c' line='13207' column='1'/> + <parameter type-id='type-id-6' name='sep_obj' filepath='Objects/unicodeobject.c' line='13207' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_RSplit' mangled-name='PyUnicode_RSplit' filepath='Objects/unicodeobject.c' line='13314' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RSplit'> - <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='13314' column='1'/> - <parameter type-id='type-id-6' name='sep' filepath='Objects/unicodeobject.c' line='13314' column='1'/> - <parameter type-id='type-id-7' name='maxsplit' filepath='Objects/unicodeobject.c' line='13314' column='1'/> + <function-decl name='PyUnicode_RSplit' mangled-name='PyUnicode_RSplit' filepath='Objects/unicodeobject.c' line='13301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RSplit'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='13301' column='1'/> + <parameter type-id='type-id-6' name='sep' filepath='Objects/unicodeobject.c' line='13301' column='1'/> + <parameter type-id='type-id-7' name='maxsplit' filepath='Objects/unicodeobject.c' line='13301' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyUnicodeWriter_PrepareKindInternal' mangled-name='_PyUnicodeWriter_PrepareKindInternal' filepath='Objects/unicodeobject.c' line='13875' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareKindInternal'> - <parameter type-id='type-id-379' name='writer' filepath='Objects/unicodeobject.c' line='13875' column='1'/> - <parameter type-id='type-id-5' name='kind' filepath='Objects/unicodeobject.c' line='13876' column='1'/> + <function-decl name='_PyUnicodeWriter_PrepareKindInternal' mangled-name='_PyUnicodeWriter_PrepareKindInternal' filepath='Objects/unicodeobject.c' line='13862' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareKindInternal'> + <parameter type-id='type-id-381' name='writer' filepath='Objects/unicodeobject.c' line='13862' column='1'/> + <parameter type-id='type-id-5' name='kind' filepath='Objects/unicodeobject.c' line='13863' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyUnicodeWriter_WriteChar' mangled-name='_PyUnicodeWriter_WriteChar' filepath='Objects/unicodeobject.c' line='13907' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteChar'> - <parameter type-id='type-id-379' name='writer' filepath='Objects/unicodeobject.c' line='13907' column='1'/> - <parameter type-id='type-id-305' name='ch' filepath='Objects/unicodeobject.c' line='13907' column='1'/> + <function-decl name='_PyUnicodeWriter_WriteChar' mangled-name='_PyUnicodeWriter_WriteChar' filepath='Objects/unicodeobject.c' line='13894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteChar'> + <parameter type-id='type-id-381' name='writer' filepath='Objects/unicodeobject.c' line='13894' column='1'/> + <parameter type-id='type-id-307' name='ch' filepath='Objects/unicodeobject.c' line='13894' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyUnicodeWriter_WriteSubstring' mangled-name='_PyUnicodeWriter_WriteSubstring' filepath='Objects/unicodeobject.c' line='13996' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteSubstring'> - <parameter type-id='type-id-379' name='writer' filepath='Objects/unicodeobject.c' line='13996' column='1'/> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='13996' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='13997' column='1'/> - <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='13997' column='1'/> + <function-decl name='_PyUnicodeWriter_WriteSubstring' mangled-name='_PyUnicodeWriter_WriteSubstring' filepath='Objects/unicodeobject.c' line='13983' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteSubstring'> + <parameter type-id='type-id-381' name='writer' filepath='Objects/unicodeobject.c' line='13983' column='1'/> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='13983' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='13984' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='13984' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicodeWriter_WriteSubstring' mangled-name='PyUnicodeWriter_WriteSubstring' filepath='Objects/unicodeobject.c' line='14030' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteSubstring'> - <parameter type-id='type-id-415' name='writer' filepath='Objects/unicodeobject.c' line='14030' column='1'/> - <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='14030' column='1'/> - <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='14031' column='1'/> - <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='14031' column='1'/> + <function-decl name='PyUnicodeWriter_WriteSubstring' mangled-name='PyUnicodeWriter_WriteSubstring' filepath='Objects/unicodeobject.c' line='14017' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteSubstring'> + <parameter type-id='type-id-417' name='writer' filepath='Objects/unicodeobject.c' line='14017' column='1'/> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='14017' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='14018' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='14018' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyUnicodeWriter_WriteASCIIString' mangled-name='_PyUnicodeWriter_WriteASCIIString' filepath='Objects/unicodeobject.c' line='14052' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteASCIIString'> - <parameter type-id='type-id-379' name='writer' filepath='Objects/unicodeobject.c' line='14052' column='1'/> - <parameter type-id='type-id-4' name='ascii' filepath='Objects/unicodeobject.c' line='14053' column='1'/> - <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='14053' column='1'/> + <function-decl name='_PyUnicodeWriter_WriteASCIIString' mangled-name='_PyUnicodeWriter_WriteASCIIString' filepath='Objects/unicodeobject.c' line='14039' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteASCIIString'> + <parameter type-id='type-id-381' name='writer' filepath='Objects/unicodeobject.c' line='14039' column='1'/> + <parameter type-id='type-id-4' name='ascii' filepath='Objects/unicodeobject.c' line='14040' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='14040' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicodeWriter_DecodeUTF8Stateful' mangled-name='PyUnicodeWriter_DecodeUTF8Stateful' filepath='Objects/unicodeobject.c' line='14146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_DecodeUTF8Stateful'> - <parameter type-id='type-id-415' name='writer' filepath='Objects/unicodeobject.c' line='14146' column='1'/> - <parameter type-id='type-id-4' name='string' filepath='Objects/unicodeobject.c' line='14147' column='1'/> - <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='14148' column='1'/> - <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='14149' column='1'/> - <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='14150' column='1'/> + <function-decl name='PyUnicodeWriter_DecodeUTF8Stateful' mangled-name='PyUnicodeWriter_DecodeUTF8Stateful' filepath='Objects/unicodeobject.c' line='14133' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_DecodeUTF8Stateful'> + <parameter type-id='type-id-417' name='writer' filepath='Objects/unicodeobject.c' line='14133' column='1'/> + <parameter type-id='type-id-4' name='string' filepath='Objects/unicodeobject.c' line='14134' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='14135' column='1'/> + <parameter type-id='type-id-4' name='errors' filepath='Objects/unicodeobject.c' line='14136' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='14137' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyUnicodeWriter_WriteLatin1String' mangled-name='_PyUnicodeWriter_WriteLatin1String' filepath='Objects/unicodeobject.c' line='14171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteLatin1String'> - <parameter type-id='type-id-379' name='writer' filepath='Objects/unicodeobject.c' line='14171' column='1'/> - <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='14172' column='1'/> - <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='14172' column='1'/> + <function-decl name='_PyUnicodeWriter_WriteLatin1String' mangled-name='_PyUnicodeWriter_WriteLatin1String' filepath='Objects/unicodeobject.c' line='14158' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteLatin1String'> + <parameter type-id='type-id-381' name='writer' filepath='Objects/unicodeobject.c' line='14158' column='1'/> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='14159' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='14159' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_Format' mangled-name='PyUnicode_Format' filepath='Objects/unicodeobject.c' line='15493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Format'> - <parameter type-id='type-id-6' name='format' filepath='Objects/unicodeobject.c' line='15493' column='1'/> - <parameter type-id='type-id-6' name='args' filepath='Objects/unicodeobject.c' line='15493' column='1'/> + <function-decl name='PyUnicode_Format' mangled-name='PyUnicode_Format' filepath='Objects/unicodeobject.c' line='15480' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Format'> + <parameter type-id='type-id-6' name='format' filepath='Objects/unicodeobject.c' line='15480' column='1'/> + <parameter type-id='type-id-6' name='args' filepath='Objects/unicodeobject.c' line='15480' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyUnicode_ExactDealloc' mangled-name='_PyUnicode_ExactDealloc' filepath='Objects/unicodeobject.c' line='15747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ExactDealloc'> - <parameter type-id='type-id-6' name='op' filepath='Objects/unicodeobject.c' line='15747' column='1'/> + <function-decl name='_PyUnicode_ExactDealloc' mangled-name='_PyUnicode_ExactDealloc' filepath='Objects/unicodeobject.c' line='15734' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ExactDealloc'> + <parameter type-id='type-id-6' name='op' filepath='Objects/unicodeobject.c' line='15734' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyUnicode_InternInPlace' mangled-name='_PyUnicode_InternInPlace' filepath='Objects/unicodeobject.c' line='16101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternInPlace'> - <parameter type-id='type-id-33' name='interp' filepath='Objects/unicodeobject.c' line='16101' column='1'/> - <parameter type-id='type-id-241' name='p' filepath='Objects/unicodeobject.c' line='16101' column='1'/> + <function-decl name='_PyUnicode_InternInPlace' mangled-name='_PyUnicode_InternInPlace' filepath='Objects/unicodeobject.c' line='16088' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternInPlace'> + <parameter type-id='type-id-39' name='interp' filepath='Objects/unicodeobject.c' line='16088' column='1'/> + <parameter type-id='type-id-241' name='p' filepath='Objects/unicodeobject.c' line='16088' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyUnicode_InternInPlace' mangled-name='PyUnicode_InternInPlace' filepath='Objects/unicodeobject.c' line='16108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternInPlace'> - <parameter type-id='type-id-241' name='p' filepath='Objects/unicodeobject.c' line='16108' column='1'/> + <function-decl name='PyUnicode_InternInPlace' mangled-name='PyUnicode_InternInPlace' filepath='Objects/unicodeobject.c' line='16095' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternInPlace'> + <parameter type-id='type-id-241' name='p' filepath='Objects/unicodeobject.c' line='16095' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyUnicode_InternImmortal' mangled-name='PyUnicode_InternImmortal' filepath='Objects/unicodeobject.c' line='16117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternImmortal'> - <parameter type-id='type-id-241' name='p' filepath='Objects/unicodeobject.c' line='16117' column='1'/> + <function-decl name='PyUnicode_InternImmortal' mangled-name='PyUnicode_InternImmortal' filepath='Objects/unicodeobject.c' line='16104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternImmortal'> + <parameter type-id='type-id-241' name='p' filepath='Objects/unicodeobject.c' line='16104' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyInit__string' mangled-name='PyInit__string' filepath='Objects/unicodeobject.c' line='16704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__string'> + <function-decl name='PyInit__string' mangled-name='PyInit__string' filepath='Objects/unicodeobject.c' line='16691' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__string'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyUnicode_KIND' mangled-name='PyUnicode_KIND' filepath='Objects/unicodeobject.c' line='16711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_KIND'> - <parameter type-id='type-id-6' name='op' filepath='Objects/unicodeobject.c' line='16711' column='1'/> + <function-decl name='PyUnicode_KIND' mangled-name='PyUnicode_KIND' filepath='Objects/unicodeobject.c' line='16698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_KIND'> + <parameter type-id='type-id-6' name='op' filepath='Objects/unicodeobject.c' line='16698' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyUnicode_DATA' mangled-name='PyUnicode_DATA' filepath='Objects/unicodeobject.c' line='16721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DATA'> - <parameter type-id='type-id-6' name='op' filepath='Objects/unicodeobject.c' line='16721' column='1'/> - <return type-id='type-id-35'/> + <function-decl name='PyUnicode_DATA' mangled-name='PyUnicode_DATA' filepath='Objects/unicodeobject.c' line='16708' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DATA'> + <parameter type-id='type-id-6' name='op' filepath='Objects/unicodeobject.c' line='16708' column='1'/> + <return type-id='type-id-41'/> </function-decl> - <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/cpython/initconfig.h' line='11' column='1' id='type-id-607'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/cpython/initconfig.h' line='11' column='1' id='type-id-609'> + <underlying-type type-id='type-id-43'/> <enumerator name='_PyStatus_TYPE_OK' value='0'/> <enumerator name='_PyStatus_TYPE_ERROR' value='1'/> <enumerator name='_PyStatus_TYPE_EXIT' value='2'/> @@ -11859,9 +11875,9 @@ </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-620'> + <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-622'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='9' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-6' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='15' column='1'/> @@ -11870,25 +11886,25 @@ <var-decl name='wr_callback' type-id='type-id-6' 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-304' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='23' column='1'/> + <var-decl name='hash' type-id='type-id-306' 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-621' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='30' column='1'/> + <var-decl name='wr_prev' type-id='type-id-623' 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-621' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='31' column='1'/> + <var-decl name='wr_next' type-id='type-id-623' 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-313' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='32' column='1'/> + <var-decl name='vectorcall' type-id='type-id-315' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='32' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyWeakReference' type-id='type-id-620' filepath='./Include/weakrefobject.h' line='9' column='1' id='type-id-622'/> - <pointer-type-def type-id='type-id-622' size-in-bits='64' id='type-id-621'/> + <typedef-decl name='PyWeakReference' type-id='type-id-622' filepath='./Include/weakrefobject.h' line='9' column='1' id='type-id-624'/> + <pointer-type-def type-id='type-id-624' size-in-bits='64' id='type-id-623'/> <var-decl name='_PyWeakref_RefType' type-id='type-id-271' 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-271' 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-271' 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='133' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWeakref_ClearRef'> - <parameter type-id='type-id-621' name='self' filepath='Objects/weakrefobject.c' line='133' column='1'/> + <parameter type-id='type-id-623' name='self' filepath='Objects/weakrefobject.c' line='133' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyWeakref_NewProxy' mangled-name='PyWeakref_NewProxy' filepath='Objects/weakrefobject.c' line='926' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_NewProxy'> @@ -11919,36 +11935,36 @@ </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-623' size-in-bits='64' id='type-id-624'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> - </array-type-def> - <class-decl name='PyUnicodeWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-625'/> - <array-type-def dimensions='1' type-id='type-id-626' size-in-bits='64' id='type-id-627'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-625' size-in-bits='64' id='type-id-626'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> + <class-decl name='PyUnicodeWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-627'/> <array-type-def dimensions='1' type-id='type-id-628' size-in-bits='64' id='type-id-629'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> <array-type-def dimensions='1' type-id='type-id-630' size-in-bits='64' id='type-id-631'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> <array-type-def dimensions='1' type-id='type-id-632' size-in-bits='64' id='type-id-633'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> <array-type-def dimensions='1' type-id='type-id-634' size-in-bits='64' id='type-id-635'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> <array-type-def dimensions='1' type-id='type-id-636' size-in-bits='64' id='type-id-637'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-35' size-in-bits='64' id='type-id-638'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-638' size-in-bits='64' id='type-id-639'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-639' size-in-bits='64' id='type-id-640'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-41' size-in-bits='64' id='type-id-640'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <typedef-decl name='PyUnicodeWriter' type-id='type-id-625' filepath='./Include/cpython/unicodeobject.h' line='468' column='1' id='type-id-641'/> - <class-decl name='asdl_generic_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-642' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='32' column='1' id='type-id-643'> + <array-type-def dimensions='1' type-id='type-id-641' size-in-bits='64' id='type-id-642'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> + </array-type-def> + <typedef-decl name='PyUnicodeWriter' type-id='type-id-627' filepath='./Include/cpython/unicodeobject.h' line='468' column='1' id='type-id-643'/> + <class-decl name='asdl_generic_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-644' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='32' column='1' id='type-id-645'> <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> @@ -11956,11 +11972,11 @@ <var-decl name='elements' type-id='type-id-267' 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-638' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='34' column='1'/> + <var-decl name='typed_elements' type-id='type-id-640' 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-643' filepath='./Include/internal/pycore_asdl.h' line='35' column='1' id='type-id-642'/> - <class-decl name='asdl_identifier_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-644' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='37' column='1' id='type-id-645'> + <typedef-decl name='asdl_generic_seq' type-id='type-id-645' filepath='./Include/internal/pycore_asdl.h' line='35' column='1' id='type-id-644'/> + <class-decl name='asdl_identifier_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-646' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='37' column='1' id='type-id-647'> <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> @@ -11968,20 +11984,20 @@ <var-decl name='elements' type-id='type-id-267' 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-393' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='39' column='1'/> + <var-decl name='typed_elements' type-id='type-id-395' 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-645' filepath='./Include/internal/pycore_asdl.h' line='40' column='1' id='type-id-644'/> - <typedef-decl name='mod_ty' type-id='type-id-646' filepath='./Include/internal/pycore_ast.h' line='15' column='1' id='type-id-647'/> - <typedef-decl name='stmt_ty' type-id='type-id-648' filepath='./Include/internal/pycore_ast.h' line='17' column='1' id='type-id-632'/> - <typedef-decl name='excepthandler_ty' type-id='type-id-649' filepath='./Include/internal/pycore_ast.h' line='36' column='1' id='type-id-626'/> - <typedef-decl name='alias_ty' type-id='type-id-650' filepath='./Include/internal/pycore_ast.h' line='44' column='1' id='type-id-623'/> - <typedef-decl name='withitem_ty' type-id='type-id-651' filepath='./Include/internal/pycore_ast.h' line='46' column='1' id='type-id-639'/> - <typedef-decl name='match_case_ty' type-id='type-id-652' filepath='./Include/internal/pycore_ast.h' line='48' column='1' id='type-id-628'/> - <typedef-decl name='pattern_ty' type-id='type-id-653' filepath='./Include/internal/pycore_ast.h' line='50' column='1' id='type-id-630'/> - <typedef-decl name='type_ignore_ty' type-id='type-id-654' filepath='./Include/internal/pycore_ast.h' line='52' column='1' id='type-id-634'/> - <typedef-decl name='type_param_ty' type-id='type-id-655' filepath='./Include/internal/pycore_ast.h' line='54' column='1' id='type-id-636'/> - <class-decl name='asdl_stmt_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-656' visibility='default' filepath='./Include/internal/pycore_ast.h' line='64' column='1' id='type-id-657'> + <typedef-decl name='asdl_identifier_seq' type-id='type-id-647' filepath='./Include/internal/pycore_asdl.h' line='40' column='1' id='type-id-646'/> + <typedef-decl name='mod_ty' type-id='type-id-648' filepath='./Include/internal/pycore_ast.h' line='15' column='1' id='type-id-649'/> + <typedef-decl name='stmt_ty' type-id='type-id-650' filepath='./Include/internal/pycore_ast.h' line='17' column='1' id='type-id-634'/> + <typedef-decl name='excepthandler_ty' type-id='type-id-651' filepath='./Include/internal/pycore_ast.h' line='36' column='1' id='type-id-628'/> + <typedef-decl name='alias_ty' type-id='type-id-652' filepath='./Include/internal/pycore_ast.h' line='44' column='1' id='type-id-625'/> + <typedef-decl name='withitem_ty' type-id='type-id-653' filepath='./Include/internal/pycore_ast.h' line='46' column='1' id='type-id-641'/> + <typedef-decl name='match_case_ty' type-id='type-id-654' filepath='./Include/internal/pycore_ast.h' line='48' column='1' id='type-id-630'/> + <typedef-decl name='pattern_ty' type-id='type-id-655' filepath='./Include/internal/pycore_ast.h' line='50' column='1' id='type-id-632'/> + <typedef-decl name='type_ignore_ty' type-id='type-id-656' filepath='./Include/internal/pycore_ast.h' line='52' column='1' id='type-id-636'/> + <typedef-decl name='type_param_ty' type-id='type-id-657' filepath='./Include/internal/pycore_ast.h' line='54' column='1' id='type-id-638'/> + <class-decl name='asdl_stmt_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-658' visibility='default' filepath='./Include/internal/pycore_ast.h' line='64' column='1' id='type-id-659'> <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> @@ -11989,11 +12005,11 @@ <var-decl name='elements' type-id='type-id-267' 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-633' visibility='default' filepath='./Include/internal/pycore_ast.h' line='66' column='1'/> + <var-decl name='typed_elements' type-id='type-id-635' 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-657' filepath='./Include/internal/pycore_ast.h' line='67' column='1' id='type-id-656'/> - <class-decl name='asdl_excepthandler_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-658' visibility='default' filepath='./Include/internal/pycore_ast.h' line='86' column='1' id='type-id-659'> + <typedef-decl name='asdl_stmt_seq' type-id='type-id-659' filepath='./Include/internal/pycore_ast.h' line='67' column='1' id='type-id-658'/> + <class-decl name='asdl_excepthandler_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-660' visibility='default' filepath='./Include/internal/pycore_ast.h' line='86' column='1' id='type-id-661'> <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> @@ -12001,11 +12017,11 @@ <var-decl name='elements' type-id='type-id-267' 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-627' visibility='default' filepath='./Include/internal/pycore_ast.h' line='88' column='1'/> + <var-decl name='typed_elements' type-id='type-id-629' 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-659' filepath='./Include/internal/pycore_ast.h' line='89' column='1' id='type-id-658'/> - <class-decl name='asdl_alias_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-660' visibility='default' filepath='./Include/internal/pycore_ast.h' line='115' column='1' id='type-id-661'> + <typedef-decl name='asdl_excepthandler_seq' type-id='type-id-661' filepath='./Include/internal/pycore_ast.h' line='89' column='1' id='type-id-660'/> + <class-decl name='asdl_alias_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-662' visibility='default' filepath='./Include/internal/pycore_ast.h' line='115' column='1' id='type-id-663'> <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> @@ -12013,11 +12029,11 @@ <var-decl name='elements' type-id='type-id-267' 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-624' visibility='default' filepath='./Include/internal/pycore_ast.h' line='117' column='1'/> + <var-decl name='typed_elements' type-id='type-id-626' 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-661' filepath='./Include/internal/pycore_ast.h' line='118' column='1' id='type-id-660'/> - <class-decl name='asdl_withitem_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-662' visibility='default' filepath='./Include/internal/pycore_ast.h' line='122' column='1' id='type-id-663'> + <typedef-decl name='asdl_alias_seq' type-id='type-id-663' filepath='./Include/internal/pycore_ast.h' line='118' column='1' id='type-id-662'/> + <class-decl name='asdl_withitem_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-664' visibility='default' filepath='./Include/internal/pycore_ast.h' line='122' column='1' id='type-id-665'> <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> @@ -12025,11 +12041,11 @@ <var-decl name='elements' type-id='type-id-267' 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-640' visibility='default' filepath='./Include/internal/pycore_ast.h' line='124' column='1'/> + <var-decl name='typed_elements' type-id='type-id-642' 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-663' filepath='./Include/internal/pycore_ast.h' line='125' column='1' id='type-id-662'/> - <class-decl name='asdl_match_case_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-664' visibility='default' filepath='./Include/internal/pycore_ast.h' line='129' column='1' id='type-id-665'> + <typedef-decl name='asdl_withitem_seq' type-id='type-id-665' filepath='./Include/internal/pycore_ast.h' line='125' column='1' id='type-id-664'/> + <class-decl name='asdl_match_case_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-666' visibility='default' filepath='./Include/internal/pycore_ast.h' line='129' column='1' id='type-id-667'> <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> @@ -12037,11 +12053,11 @@ <var-decl name='elements' type-id='type-id-267' 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-629' visibility='default' filepath='./Include/internal/pycore_ast.h' line='131' column='1'/> + <var-decl name='typed_elements' type-id='type-id-631' 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-665' filepath='./Include/internal/pycore_ast.h' line='132' column='1' id='type-id-664'/> - <class-decl name='asdl_pattern_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-666' visibility='default' filepath='./Include/internal/pycore_ast.h' line='137' column='1' id='type-id-667'> + <typedef-decl name='asdl_match_case_seq' type-id='type-id-667' filepath='./Include/internal/pycore_ast.h' line='132' column='1' id='type-id-666'/> + <class-decl name='asdl_pattern_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-668' visibility='default' filepath='./Include/internal/pycore_ast.h' line='137' column='1' id='type-id-669'> <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> @@ -12049,11 +12065,11 @@ <var-decl name='elements' type-id='type-id-267' 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-631' visibility='default' filepath='./Include/internal/pycore_ast.h' line='139' column='1'/> + <var-decl name='typed_elements' type-id='type-id-633' 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-667' filepath='./Include/internal/pycore_ast.h' line='140' column='1' id='type-id-666'/> - <class-decl name='asdl_type_ignore_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-668' visibility='default' filepath='./Include/internal/pycore_ast.h' line='144' column='1' id='type-id-669'> + <typedef-decl name='asdl_pattern_seq' type-id='type-id-669' filepath='./Include/internal/pycore_ast.h' line='140' column='1' id='type-id-668'/> + <class-decl name='asdl_type_ignore_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-670' visibility='default' filepath='./Include/internal/pycore_ast.h' line='144' column='1' id='type-id-671'> <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> @@ -12061,11 +12077,11 @@ <var-decl name='elements' type-id='type-id-267' 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-635' visibility='default' filepath='./Include/internal/pycore_ast.h' line='146' column='1'/> + <var-decl name='typed_elements' type-id='type-id-637' 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-669' filepath='./Include/internal/pycore_ast.h' line='147' column='1' id='type-id-668'/> - <class-decl name='asdl_type_param_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-670' visibility='default' filepath='./Include/internal/pycore_ast.h' line='152' column='1' id='type-id-671'> + <typedef-decl name='asdl_type_ignore_seq' type-id='type-id-671' filepath='./Include/internal/pycore_ast.h' line='147' column='1' id='type-id-670'/> + <class-decl name='asdl_type_param_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-672' visibility='default' filepath='./Include/internal/pycore_ast.h' line='152' column='1' id='type-id-673'> <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> @@ -12073,67 +12089,67 @@ <var-decl name='elements' type-id='type-id-267' 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-637' visibility='default' filepath='./Include/internal/pycore_ast.h' line='154' column='1'/> + <var-decl name='typed_elements' type-id='type-id-639' 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-671' filepath='./Include/internal/pycore_ast.h' line='155' column='1' id='type-id-670'/> - <enum-decl name='_mod_kind' filepath='./Include/internal/pycore_ast.h' line='161' column='1' id='type-id-672'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='asdl_type_param_seq' type-id='type-id-673' filepath='./Include/internal/pycore_ast.h' line='155' column='1' id='type-id-672'/> + <enum-decl name='_mod_kind' filepath='./Include/internal/pycore_ast.h' line='161' column='1' id='type-id-674'> + <underlying-type type-id='type-id-43'/> <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-673'> + <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-675'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-672' visibility='default' filepath='./Include/internal/pycore_ast.h' line='164' column='1'/> + <var-decl name='kind' type-id='type-id-674' 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-674' visibility='default' filepath='./Include/internal/pycore_ast.h' line='184' column='1'/> + <var-decl name='v' type-id='type-id-676' visibility='default' filepath='./Include/internal/pycore_ast.h' line='184' column='1'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__4' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='165' column='1' id='type-id-674'> + <union-decl name='__anonymous_union__4' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='165' column='1' id='type-id-676'> <data-member access='public'> - <var-decl name='Module' type-id='type-id-675' visibility='default' filepath='./Include/internal/pycore_ast.h' line='169' column='1'/> + <var-decl name='Module' type-id='type-id-677' 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-676' visibility='default' filepath='./Include/internal/pycore_ast.h' line='173' column='1'/> + <var-decl name='Interactive' type-id='type-id-678' 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-677' visibility='default' filepath='./Include/internal/pycore_ast.h' line='177' column='1'/> + <var-decl name='Expression' type-id='type-id-679' 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-678' visibility='default' filepath='./Include/internal/pycore_ast.h' line='182' column='1'/> + <var-decl name='FunctionType' type-id='type-id-680' visibility='default' filepath='./Include/internal/pycore_ast.h' line='182' column='1'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__37' 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-675'> + <class-decl name='__anonymous_struct__37' 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-677'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='167' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-680' visibility='default' filepath='./Include/internal/pycore_ast.h' line='168' column='1'/> + <var-decl name='type_ignores' type-id='type-id-682' 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-676'> + <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-678'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='172' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-677'> + <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-679'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='176' column='1'/> + <var-decl name='body' type-id='type-id-683' 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-678'> + <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-680'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='argtypes' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='180' column='1'/> + <var-decl name='argtypes' type-id='type-id-684' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='181' column='1'/> + <var-decl name='returns' type-id='type-id-683' 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-683'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_stmt_kind' filepath='./Include/internal/pycore_ast.h' line='187' column='1' id='type-id-685'> + <underlying-type type-id='type-id-43'/> <enumerator name='FunctionDef_kind' value='1'/> <enumerator name='AsyncFunctionDef_kind' value='2'/> <enumerator name='ClassDef_kind' value='3'/> @@ -12163,12 +12179,12 @@ <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-684'> + <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-686'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='197' column='1'/> + <var-decl name='kind' type-id='type-id-685' 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-685' visibility='default' filepath='./Include/internal/pycore_ast.h' line='352' column='1'/> + <var-decl name='v' type-id='type-id-687' 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'/> @@ -12183,286 +12199,286 @@ <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__' size-in-bits='448' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='198' column='1' id='type-id-685'> + <union-decl name='__anonymous_union__' size-in-bits='448' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='198' column='1' id='type-id-687'> <data-member access='public'> - <var-decl name='FunctionDef' type-id='type-id-686' visibility='default' filepath='./Include/internal/pycore_ast.h' line='207' column='1'/> + <var-decl name='FunctionDef' type-id='type-id-688' 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-686' visibility='default' filepath='./Include/internal/pycore_ast.h' line='217' column='1'/> + <var-decl name='AsyncFunctionDef' type-id='type-id-688' 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-687' visibility='default' filepath='./Include/internal/pycore_ast.h' line='226' column='1'/> + <var-decl name='ClassDef' type-id='type-id-689' 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-688' visibility='default' filepath='./Include/internal/pycore_ast.h' line='230' column='1'/> + <var-decl name='Return' type-id='type-id-690' 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-689' visibility='default' filepath='./Include/internal/pycore_ast.h' line='234' column='1'/> + <var-decl name='Delete' type-id='type-id-691' 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-690' visibility='default' filepath='./Include/internal/pycore_ast.h' line='240' column='1'/> + <var-decl name='Assign' type-id='type-id-692' 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-691' visibility='default' filepath='./Include/internal/pycore_ast.h' line='246' column='1'/> + <var-decl name='TypeAlias' type-id='type-id-693' 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-692' visibility='default' filepath='./Include/internal/pycore_ast.h' line='252' column='1'/> + <var-decl name='AugAssign' type-id='type-id-694' 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-693' visibility='default' filepath='./Include/internal/pycore_ast.h' line='259' column='1'/> + <var-decl name='AnnAssign' type-id='type-id-695' 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-694' visibility='default' filepath='./Include/internal/pycore_ast.h' line='267' column='1'/> + <var-decl name='For' type-id='type-id-696' 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-694' visibility='default' filepath='./Include/internal/pycore_ast.h' line='275' column='1'/> + <var-decl name='AsyncFor' type-id='type-id-696' 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-695' visibility='default' filepath='./Include/internal/pycore_ast.h' line='281' column='1'/> + <var-decl name='While' type-id='type-id-697' 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-695' visibility='default' filepath='./Include/internal/pycore_ast.h' line='287' column='1'/> + <var-decl name='If' type-id='type-id-697' 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-696' visibility='default' filepath='./Include/internal/pycore_ast.h' line='293' column='1'/> + <var-decl name='With' type-id='type-id-698' 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-696' visibility='default' filepath='./Include/internal/pycore_ast.h' line='299' column='1'/> + <var-decl name='AsyncWith' type-id='type-id-698' 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-697' visibility='default' filepath='./Include/internal/pycore_ast.h' line='304' column='1'/> + <var-decl name='Match' type-id='type-id-699' 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-698' visibility='default' filepath='./Include/internal/pycore_ast.h' line='309' column='1'/> + <var-decl name='Raise' type-id='type-id-700' 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-699' visibility='default' filepath='./Include/internal/pycore_ast.h' line='316' column='1'/> + <var-decl name='Try' type-id='type-id-701' 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-699' visibility='default' filepath='./Include/internal/pycore_ast.h' line='323' column='1'/> + <var-decl name='TryStar' type-id='type-id-701' 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-700' visibility='default' filepath='./Include/internal/pycore_ast.h' line='328' column='1'/> + <var-decl name='Assert' type-id='type-id-702' 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-701' visibility='default' filepath='./Include/internal/pycore_ast.h' line='332' column='1'/> + <var-decl name='Import' type-id='type-id-703' 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-702' visibility='default' filepath='./Include/internal/pycore_ast.h' line='338' column='1'/> + <var-decl name='ImportFrom' type-id='type-id-704' 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-703' visibility='default' filepath='./Include/internal/pycore_ast.h' line='342' column='1'/> + <var-decl name='Global' type-id='type-id-705' 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-703' visibility='default' filepath='./Include/internal/pycore_ast.h' line='346' column='1'/> + <var-decl name='Nonlocal' type-id='type-id-705' 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-688' visibility='default' filepath='./Include/internal/pycore_ast.h' line='350' column='1'/> + <var-decl name='Expr' type-id='type-id-690' visibility='default' filepath='./Include/internal/pycore_ast.h' line='350' column='1'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__' 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-686'> + <class-decl name='__anonymous_struct__' 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-688'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='200' column='1'/> + <var-decl name='name' type-id='type-id-706' 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-705' visibility='default' filepath='./Include/internal/pycore_ast.h' line='201' column='1'/> + <var-decl name='args' type-id='type-id-707' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='202' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='203' column='1'/> + <var-decl name='decorator_list' type-id='type-id-684' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='204' column='1'/> + <var-decl name='returns' type-id='type-id-683' 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-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='205' column='1'/> + <var-decl name='type_comment' type-id='type-id-708' 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-707' visibility='default' filepath='./Include/internal/pycore_ast.h' line='206' column='1'/> + <var-decl name='type_params' type-id='type-id-709' visibility='default' filepath='./Include/internal/pycore_ast.h' line='206' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__5' 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-687'> + <class-decl name='__anonymous_struct__5' 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-689'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='220' column='1'/> + <var-decl name='name' type-id='type-id-706' 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-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='221' column='1'/> + <var-decl name='bases' type-id='type-id-684' 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-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='222' column='1'/> + <var-decl name='keywords' type-id='type-id-710' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='223' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='224' column='1'/> + <var-decl name='decorator_list' type-id='type-id-684' 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-707' visibility='default' filepath='./Include/internal/pycore_ast.h' line='225' column='1'/> + <var-decl name='type_params' type-id='type-id-709' visibility='default' filepath='./Include/internal/pycore_ast.h' line='225' column='1'/> </data-member> </class-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='232' column='1' id='type-id-689'> + <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='232' column='1' id='type-id-691'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='targets' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='233' column='1'/> + <var-decl name='targets' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='233' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__8' 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-690'> + <class-decl name='__anonymous_struct__8' 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-692'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='targets' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='237' column='1'/> + <var-decl name='targets' type-id='type-id-684' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='238' column='1'/> + <var-decl name='value' type-id='type-id-683' 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-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='239' column='1'/> + <var-decl name='type_comment' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='239' 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='242' column='1' id='type-id-691'> + <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='242' column='1' id='type-id-693'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='243' column='1'/> + <var-decl name='name' type-id='type-id-683' 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-707' visibility='default' filepath='./Include/internal/pycore_ast.h' line='244' column='1'/> + <var-decl name='type_params' type-id='type-id-709' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='245' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='245' 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='248' column='1' id='type-id-692'> + <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='248' column='1' id='type-id-694'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='249' column='1'/> + <var-decl name='target' type-id='type-id-683' 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-709' visibility='default' filepath='./Include/internal/pycore_ast.h' line='250' column='1'/> + <var-decl name='op' type-id='type-id-711' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='251' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='251' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__11' 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-693'> + <class-decl name='__anonymous_struct__11' 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-695'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='255' column='1'/> + <var-decl name='target' type-id='type-id-683' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='256' column='1'/> + <var-decl name='annotation' type-id='type-id-683' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='257' column='1'/> + <var-decl name='value' type-id='type-id-683' 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__12' 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-694'> + <class-decl name='__anonymous_struct__12' 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-696'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='262' column='1'/> + <var-decl name='target' type-id='type-id-683' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='263' column='1'/> + <var-decl name='iter' type-id='type-id-683' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='264' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='265' column='1'/> + <var-decl name='orelse' type-id='type-id-681' 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-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='266' column='1'/> + <var-decl name='type_comment' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='266' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__14' 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-695'> + <class-decl name='__anonymous_struct__14' 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-697'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='test' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='278' column='1'/> + <var-decl name='test' type-id='type-id-683' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='279' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='280' column='1'/> + <var-decl name='orelse' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='280' 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='289' column='1' id='type-id-696'> + <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='289' column='1' id='type-id-698'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='items' type-id='type-id-710' visibility='default' filepath='./Include/internal/pycore_ast.h' line='290' column='1'/> + <var-decl name='items' type-id='type-id-712' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='291' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='292' column='1'/> + <var-decl name='type_comment' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='292' 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='./Include/internal/pycore_ast.h' line='301' column='1' id='type-id-697'> + <class-decl name='__anonymous_struct__18' 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-699'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='subject' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='302' column='1'/> + <var-decl name='subject' type-id='type-id-683' 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-711' visibility='default' filepath='./Include/internal/pycore_ast.h' line='303' column='1'/> + <var-decl name='cases' type-id='type-id-713' visibility='default' filepath='./Include/internal/pycore_ast.h' line='303' 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='306' column='1' id='type-id-698'> + <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='306' column='1' id='type-id-700'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='exc' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='307' column='1'/> + <var-decl name='exc' type-id='type-id-683' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='308' column='1'/> + <var-decl name='cause' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='308' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__28' 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-699'> + <class-decl name='__anonymous_struct__28' 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-701'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='312' column='1'/> + <var-decl name='body' type-id='type-id-681' 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-712' visibility='default' filepath='./Include/internal/pycore_ast.h' line='313' column='1'/> + <var-decl name='handlers' type-id='type-id-714' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='314' column='1'/> + <var-decl name='orelse' type-id='type-id-681' 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-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='315' column='1'/> + <var-decl name='finalbody' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='315' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__31' 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-700'> + <class-decl name='__anonymous_struct__31' 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-702'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='test' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='326' column='1'/> + <var-decl name='test' type-id='type-id-683' 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-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='327' column='1'/> + <var-decl name='msg' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='327' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__32' 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-701'> + <class-decl name='__anonymous_struct__32' 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-703'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='names' type-id='type-id-713' visibility='default' filepath='./Include/internal/pycore_ast.h' line='331' column='1'/> + <var-decl name='names' type-id='type-id-715' visibility='default' filepath='./Include/internal/pycore_ast.h' line='331' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__33' 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-702'> + <class-decl name='__anonymous_struct__33' 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-704'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='module' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='335' column='1'/> + <var-decl name='module' type-id='type-id-706' 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-713' visibility='default' filepath='./Include/internal/pycore_ast.h' line='336' column='1'/> + <var-decl name='names' type-id='type-id-715' 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__34' 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-703'> + <class-decl name='__anonymous_struct__34' 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-705'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='names' type-id='type-id-714' visibility='default' filepath='./Include/internal/pycore_ast.h' line='341' column='1'/> + <var-decl name='names' type-id='type-id-716' 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='535' column='1' id='type-id-715'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_excepthandler_kind' filepath='./Include/internal/pycore_ast.h' line='535' column='1' id='type-id-717'> + <underlying-type type-id='type-id-43'/> <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='536' column='1' id='type-id-716'> + <class-decl name='_excepthandler' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='536' column='1' id='type-id-718'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-715' visibility='default' filepath='./Include/internal/pycore_ast.h' line='537' column='1'/> + <var-decl name='kind' type-id='type-id-717' visibility='default' filepath='./Include/internal/pycore_ast.h' line='537' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-717' visibility='default' filepath='./Include/internal/pycore_ast.h' line='545' column='1'/> + <var-decl name='v' type-id='type-id-719' visibility='default' filepath='./Include/internal/pycore_ast.h' line='545' 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='546' column='1'/> @@ -12477,28 +12493,28 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='549' column='1'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__3' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='538' column='1' id='type-id-717'> + <union-decl name='__anonymous_union__3' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='538' column='1' id='type-id-719'> <data-member access='public'> - <var-decl name='ExceptHandler' type-id='type-id-718' visibility='default' filepath='./Include/internal/pycore_ast.h' line='543' column='1'/> + <var-decl name='ExceptHandler' type-id='type-id-720' visibility='default' filepath='./Include/internal/pycore_ast.h' line='543' column='1'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__30' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='539' column='1' id='type-id-718'> + <class-decl name='__anonymous_struct__30' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='539' column='1' id='type-id-720'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='type' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='540' column='1'/> + <var-decl name='type' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='540' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='541' column='1'/> + <var-decl name='name' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='541' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='body' type-id='type-id-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='542' column='1'/> + <var-decl name='body' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='542' 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='581' column='1' id='type-id-719'> + <class-decl name='_alias' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='581' column='1' id='type-id-721'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='582' column='1'/> + <var-decl name='name' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='582' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='asname' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='583' column='1'/> + <var-decl name='asname' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='583' 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='584' column='1'/> @@ -12513,27 +12529,27 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='587' 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='590' column='1' id='type-id-720'> + <class-decl name='_withitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='590' column='1' id='type-id-722'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='context_expr' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='591' column='1'/> + <var-decl name='context_expr' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='591' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='optional_vars' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='592' column='1'/> + <var-decl name='optional_vars' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='592' 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='595' column='1' id='type-id-721'> + <class-decl name='_match_case' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='595' column='1' id='type-id-723'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pattern' type-id='type-id-630' visibility='default' filepath='./Include/internal/pycore_ast.h' line='596' column='1'/> + <var-decl name='pattern' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='596' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='guard' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='597' column='1'/> + <var-decl name='guard' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='597' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='body' type-id='type-id-679' visibility='default' filepath='./Include/internal/pycore_ast.h' line='598' column='1'/> + <var-decl name='body' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='598' column='1'/> </data-member> </class-decl> - <enum-decl name='_pattern_kind' filepath='./Include/internal/pycore_ast.h' line='601' column='1' id='type-id-722'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_pattern_kind' filepath='./Include/internal/pycore_ast.h' line='601' column='1' id='type-id-724'> + <underlying-type type-id='type-id-43'/> <enumerator name='MatchValue_kind' value='1'/> <enumerator name='MatchSingleton_kind' value='2'/> <enumerator name='MatchSequence_kind' value='3'/> @@ -12543,12 +12559,12 @@ <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='605' column='1' id='type-id-723'> + <class-decl name='_pattern' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='605' column='1' id='type-id-725'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-722' visibility='default' filepath='./Include/internal/pycore_ast.h' line='606' column='1'/> + <var-decl name='kind' type-id='type-id-724' visibility='default' filepath='./Include/internal/pycore_ast.h' line='606' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-724' visibility='default' filepath='./Include/internal/pycore_ast.h' line='646' column='1'/> + <var-decl name='v' type-id='type-id-726' visibility='default' filepath='./Include/internal/pycore_ast.h' line='646' 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='647' column='1'/> @@ -12563,117 +12579,117 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='650' column='1'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__2' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='607' column='1' id='type-id-724'> + <union-decl name='__anonymous_union__2' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='607' column='1' id='type-id-726'> <data-member access='public'> - <var-decl name='MatchValue' type-id='type-id-688' visibility='default' filepath='./Include/internal/pycore_ast.h' line='610' column='1'/> + <var-decl name='MatchValue' type-id='type-id-690' visibility='default' filepath='./Include/internal/pycore_ast.h' line='610' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchSingleton' type-id='type-id-725' visibility='default' filepath='./Include/internal/pycore_ast.h' line='614' column='1'/> + <var-decl name='MatchSingleton' type-id='type-id-727' visibility='default' filepath='./Include/internal/pycore_ast.h' line='614' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchSequence' type-id='type-id-726' visibility='default' filepath='./Include/internal/pycore_ast.h' line='618' column='1'/> + <var-decl name='MatchSequence' type-id='type-id-728' visibility='default' filepath='./Include/internal/pycore_ast.h' line='618' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchMapping' type-id='type-id-727' visibility='default' filepath='./Include/internal/pycore_ast.h' line='624' column='1'/> + <var-decl name='MatchMapping' type-id='type-id-729' visibility='default' filepath='./Include/internal/pycore_ast.h' line='624' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchClass' type-id='type-id-728' visibility='default' filepath='./Include/internal/pycore_ast.h' line='631' column='1'/> + <var-decl name='MatchClass' type-id='type-id-730' visibility='default' filepath='./Include/internal/pycore_ast.h' line='631' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchStar' type-id='type-id-729' visibility='default' filepath='./Include/internal/pycore_ast.h' line='635' column='1'/> + <var-decl name='MatchStar' type-id='type-id-731' visibility='default' filepath='./Include/internal/pycore_ast.h' line='635' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchAs' type-id='type-id-730' visibility='default' filepath='./Include/internal/pycore_ast.h' line='640' column='1'/> + <var-decl name='MatchAs' type-id='type-id-732' visibility='default' filepath='./Include/internal/pycore_ast.h' line='640' column='1'/> </data-member> <data-member access='public'> - <var-decl name='MatchOr' type-id='type-id-726' visibility='default' filepath='./Include/internal/pycore_ast.h' line='644' column='1'/> + <var-decl name='MatchOr' type-id='type-id-728' visibility='default' filepath='./Include/internal/pycore_ast.h' line='644' column='1'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__21' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='612' column='1' id='type-id-725'> + <class-decl name='__anonymous_struct__21' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='612' column='1' id='type-id-727'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-731' visibility='default' filepath='./Include/internal/pycore_ast.h' line='613' column='1'/> + <var-decl name='value' type-id='type-id-733' visibility='default' filepath='./Include/internal/pycore_ast.h' line='613' column='1'/> </data-member> </class-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='616' column='1' id='type-id-726'> + <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='616' column='1' id='type-id-728'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='patterns' type-id='type-id-732' visibility='default' filepath='./Include/internal/pycore_ast.h' line='617' column='1'/> + <var-decl name='patterns' type-id='type-id-734' visibility='default' filepath='./Include/internal/pycore_ast.h' line='617' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__23' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='620' column='1' id='type-id-727'> + <class-decl name='__anonymous_struct__23' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='620' column='1' id='type-id-729'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='keys' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='621' column='1'/> + <var-decl name='keys' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='621' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='patterns' type-id='type-id-732' visibility='default' filepath='./Include/internal/pycore_ast.h' line='622' column='1'/> + <var-decl name='patterns' type-id='type-id-734' visibility='default' filepath='./Include/internal/pycore_ast.h' line='622' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='rest' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='623' column='1'/> + <var-decl name='rest' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='623' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__24' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='626' column='1' id='type-id-728'> + <class-decl name='__anonymous_struct__24' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='626' column='1' id='type-id-730'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cls' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='627' column='1'/> + <var-decl name='cls' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='627' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='patterns' type-id='type-id-732' visibility='default' filepath='./Include/internal/pycore_ast.h' line='628' column='1'/> + <var-decl name='patterns' type-id='type-id-734' visibility='default' filepath='./Include/internal/pycore_ast.h' line='628' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kwd_attrs' type-id='type-id-714' visibility='default' filepath='./Include/internal/pycore_ast.h' line='629' column='1'/> + <var-decl name='kwd_attrs' type-id='type-id-716' visibility='default' filepath='./Include/internal/pycore_ast.h' line='629' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='kwd_patterns' type-id='type-id-732' visibility='default' filepath='./Include/internal/pycore_ast.h' line='630' column='1'/> + <var-decl name='kwd_patterns' type-id='type-id-734' visibility='default' filepath='./Include/internal/pycore_ast.h' line='630' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__25' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='633' column='1' id='type-id-729'> + <class-decl name='__anonymous_struct__25' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='633' column='1' id='type-id-731'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='634' column='1'/> + <var-decl name='name' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='634' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__26' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='637' column='1' id='type-id-730'> + <class-decl name='__anonymous_struct__26' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='637' column='1' id='type-id-732'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pattern' type-id='type-id-630' visibility='default' filepath='./Include/internal/pycore_ast.h' line='638' column='1'/> + <var-decl name='pattern' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='638' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='639' column='1'/> + <var-decl name='name' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='639' column='1'/> </data-member> </class-decl> - <enum-decl name='_type_ignore_kind' filepath='./Include/internal/pycore_ast.h' line='653' column='1' id='type-id-733'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_type_ignore_kind' filepath='./Include/internal/pycore_ast.h' line='653' column='1' id='type-id-735'> + <underlying-type type-id='type-id-43'/> <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='654' column='1' id='type-id-734'> + <class-decl name='_type_ignore' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='654' column='1' id='type-id-736'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-733' visibility='default' filepath='./Include/internal/pycore_ast.h' line='655' column='1'/> + <var-decl name='kind' type-id='type-id-735' 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-735' visibility='default' filepath='./Include/internal/pycore_ast.h' line='662' column='1'/> + <var-decl name='v' type-id='type-id-737' visibility='default' filepath='./Include/internal/pycore_ast.h' line='662' 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='656' column='1' id='type-id-735'> + <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='656' column='1' id='type-id-737'> <data-member access='public'> - <var-decl name='TypeIgnore' type-id='type-id-736' visibility='default' filepath='./Include/internal/pycore_ast.h' line='660' column='1'/> + <var-decl name='TypeIgnore' type-id='type-id-738' visibility='default' filepath='./Include/internal/pycore_ast.h' line='660' 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='657' column='1' id='type-id-736'> + <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='657' column='1' id='type-id-738'> <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='658' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tag' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='659' column='1'/> + <var-decl name='tag' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='659' column='1'/> </data-member> </class-decl> - <enum-decl name='_type_param_kind' filepath='./Include/internal/pycore_ast.h' line='665' column='1' id='type-id-737'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_type_param_kind' filepath='./Include/internal/pycore_ast.h' line='665' column='1' id='type-id-739'> + <underlying-type type-id='type-id-43'/> <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='666' column='1' id='type-id-738'> + <class-decl name='_type_param' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='666' column='1' id='type-id-740'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-737' visibility='default' filepath='./Include/internal/pycore_ast.h' line='667' column='1'/> + <var-decl name='kind' type-id='type-id-739' visibility='default' filepath='./Include/internal/pycore_ast.h' line='667' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-739' visibility='default' filepath='./Include/internal/pycore_ast.h' line='685' column='1'/> + <var-decl name='v' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_ast.h' line='685' 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='686' column='1'/> @@ -12688,58 +12704,58 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='689' 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='668' column='1' id='type-id-739'> + <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='668' column='1' id='type-id-741'> <data-member access='public'> - <var-decl name='TypeVar' type-id='type-id-740' visibility='default' filepath='./Include/internal/pycore_ast.h' line='673' column='1'/> + <var-decl name='TypeVar' type-id='type-id-742' visibility='default' filepath='./Include/internal/pycore_ast.h' line='673' column='1'/> </data-member> <data-member access='public'> - <var-decl name='ParamSpec' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_ast.h' line='678' column='1'/> + <var-decl name='ParamSpec' type-id='type-id-743' visibility='default' filepath='./Include/internal/pycore_ast.h' line='678' column='1'/> </data-member> <data-member access='public'> - <var-decl name='TypeVarTuple' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_ast.h' line='683' column='1'/> + <var-decl name='TypeVarTuple' type-id='type-id-743' visibility='default' filepath='./Include/internal/pycore_ast.h' line='683' column='1'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='669' column='1' id='type-id-740'> + <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='669' column='1' id='type-id-742'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='670' column='1'/> + <var-decl name='name' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='670' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bound' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='671' column='1'/> + <var-decl name='bound' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='671' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='default_value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='672' column='1'/> + <var-decl name='default_value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='672' 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_ast.h' line='675' column='1' id='type-id-741'> + <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='675' column='1' id='type-id-743'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='676' column='1'/> + <var-decl name='name' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='676' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='default_value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='677' column='1'/> + <var-decl name='default_value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='677' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-641' size-in-bits='64' id='type-id-415'/> - <pointer-type-def type-id='type-id-719' size-in-bits='64' id='type-id-650'/> - <pointer-type-def type-id='type-id-716' size-in-bits='64' id='type-id-649'/> + <pointer-type-def type-id='type-id-643' size-in-bits='64' id='type-id-417'/> <pointer-type-def type-id='type-id-721' size-in-bits='64' id='type-id-652'/> - <pointer-type-def type-id='type-id-673' size-in-bits='64' id='type-id-646'/> - <pointer-type-def type-id='type-id-723' size-in-bits='64' id='type-id-653'/> - <pointer-type-def type-id='type-id-684' size-in-bits='64' id='type-id-648'/> - <pointer-type-def type-id='type-id-734' size-in-bits='64' id='type-id-654'/> - <pointer-type-def type-id='type-id-738' size-in-bits='64' id='type-id-655'/> - <pointer-type-def type-id='type-id-720' size-in-bits='64' id='type-id-651'/> - <pointer-type-def type-id='type-id-660' size-in-bits='64' id='type-id-713'/> - <pointer-type-def type-id='type-id-658' size-in-bits='64' id='type-id-712'/> - <pointer-type-def type-id='type-id-642' size-in-bits='64' id='type-id-742'/> - <pointer-type-def type-id='type-id-644' size-in-bits='64' id='type-id-714'/> - <pointer-type-def type-id='type-id-664' size-in-bits='64' id='type-id-711'/> - <pointer-type-def type-id='type-id-666' size-in-bits='64' id='type-id-732'/> - <pointer-type-def type-id='type-id-656' size-in-bits='64' id='type-id-679'/> - <pointer-type-def type-id='type-id-668' size-in-bits='64' id='type-id-680'/> - <pointer-type-def type-id='type-id-670' size-in-bits='64' id='type-id-707'/> - <pointer-type-def type-id='type-id-662' size-in-bits='64' id='type-id-710'/> - <qualified-type-def type-id='type-id-305' const='yes' id='type-id-613'/> - <class-decl name='PyUnicodeWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-625'/> + <pointer-type-def type-id='type-id-718' size-in-bits='64' id='type-id-651'/> + <pointer-type-def type-id='type-id-723' size-in-bits='64' id='type-id-654'/> + <pointer-type-def type-id='type-id-675' size-in-bits='64' id='type-id-648'/> + <pointer-type-def type-id='type-id-725' size-in-bits='64' id='type-id-655'/> + <pointer-type-def type-id='type-id-686' size-in-bits='64' id='type-id-650'/> + <pointer-type-def type-id='type-id-736' size-in-bits='64' id='type-id-656'/> + <pointer-type-def type-id='type-id-740' size-in-bits='64' id='type-id-657'/> + <pointer-type-def type-id='type-id-722' size-in-bits='64' id='type-id-653'/> + <pointer-type-def type-id='type-id-662' size-in-bits='64' id='type-id-715'/> + <pointer-type-def type-id='type-id-660' size-in-bits='64' id='type-id-714'/> + <pointer-type-def type-id='type-id-644' size-in-bits='64' id='type-id-744'/> + <pointer-type-def type-id='type-id-646' size-in-bits='64' id='type-id-716'/> + <pointer-type-def type-id='type-id-666' size-in-bits='64' id='type-id-713'/> + <pointer-type-def type-id='type-id-668' size-in-bits='64' id='type-id-734'/> + <pointer-type-def type-id='type-id-658' size-in-bits='64' id='type-id-681'/> + <pointer-type-def type-id='type-id-670' size-in-bits='64' id='type-id-682'/> + <pointer-type-def type-id='type-id-672' size-in-bits='64' id='type-id-709'/> + <pointer-type-def type-id='type-id-664' size-in-bits='64' id='type-id-712'/> + <qualified-type-def type-id='type-id-307' const='yes' id='type-id-615'/> + <class-decl name='PyUnicodeWriter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-627'/> <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-241'/> <parameter type-id='type-id-6'/> @@ -12747,267 +12763,267 @@ </function-decl> <function-decl name='PyUnicodeWriter_Create' mangled-name='PyUnicodeWriter_Create' filepath='./Include/cpython/unicodeobject.h' line='470' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_Create'> <parameter type-id='type-id-7'/> - <return type-id='type-id-415'/> + <return type-id='type-id-417'/> </function-decl> <function-decl name='PyUnicodeWriter_Discard' mangled-name='PyUnicodeWriter_Discard' filepath='./Include/cpython/unicodeobject.h' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_Discard'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyUnicodeWriter_Finish' mangled-name='PyUnicodeWriter_Finish' filepath='./Include/cpython/unicodeobject.h' line='472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_Finish'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyUnicodeWriter_WriteStr' mangled-name='PyUnicodeWriter_WriteStr' filepath='./Include/cpython/unicodeobject.h' line='494' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeWriter_WriteStr'> - <parameter type-id='type-id-415'/> + <parameter type-id='type-id-417'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_IsWhitespace' mangled-name='_PyUnicode_IsWhitespace' filepath='./Include/cpython/unicodeobject.h' line='675' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsWhitespace'> - <parameter type-id='type-id-613'/> + <parameter type-id='type-id-615'/> <return type-id='type-id-5'/> </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-743'/> - <return type-id='type-id-742'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-744'/> </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-743'/> - <return type-id='type-id-714'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-716'/> </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-743'/> - <return type-id='type-id-744'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-746'/> </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-743'/> - <return type-id='type-id-682'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-684'/> </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-743'/> - <return type-id='type-id-745'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-747'/> </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-743'/> - <return type-id='type-id-708'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-710'/> </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-743'/> - <return type-id='type-id-732'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-734'/> </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-743'/> - <return type-id='type-id-680'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-682'/> </function-decl> <function-decl name='_PyAST_Module' filepath='./Include/internal/pycore_ast.h' line='694' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-680'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-649'/> </function-decl> <function-decl name='_PyAST_FunctionDef' filepath='./Include/internal/pycore_ast.h' line='700' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-705'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-681'/> <parameter type-id='type-id-706'/> <parameter type-id='type-id-707'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-708'/> + <parameter type-id='type-id-709'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_AsyncFunctionDef' filepath='./Include/internal/pycore_ast.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-705'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-681'/> <parameter type-id='type-id-706'/> <parameter type-id='type-id-707'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-708'/> + <parameter type-id='type-id-709'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_ClassDef' filepath='./Include/internal/pycore_ast.h' line='711' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-708'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-707'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-710'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-709'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_ImportFrom' filepath='./Include/internal/pycore_ast.h' line='769' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-713'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-715'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Call' filepath='./Include/internal/pycore_ast.h' line='829' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-708'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-710'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_FormattedValue' filepath='./Include/internal/pycore_ast.h' line='832' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Interpolation' filepath='./Include/internal/pycore_ast.h' line='835' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-731'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-733'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_JoinedStr' filepath='./Include/internal/pycore_ast.h' line='839' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_TemplateStr' filepath='./Include/internal/pycore_ast.h' line='841' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Attribute' filepath='./Include/internal/pycore_ast.h' line='846' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-746'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-748'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Subscript' filepath='./Include/internal/pycore_ast.h' line='849' 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-746'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-748'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Starred' filepath='./Include/internal/pycore_ast.h' line='852' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-746'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-748'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_List' filepath='./Include/internal/pycore_ast.h' line='858' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-746'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-748'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Tuple' filepath='./Include/internal/pycore_ast.h' line='861' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-746'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-748'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_arguments' filepath='./Include/internal/pycore_ast.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-745'/> - <parameter type-id='type-id-745'/> <parameter type-id='type-id-747'/> - <parameter type-id='type-id-745'/> - <parameter type-id='type-id-682'/> <parameter type-id='type-id-747'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-705'/> + <parameter type-id='type-id-749'/> + <parameter type-id='type-id-747'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-749'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-707'/> </function-decl> <function-decl name='_PyAST_arg' filepath='./Include/internal/pycore_ast.h' line='878' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-681'/> <parameter type-id='type-id-706'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-747'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-749'/> </function-decl> <function-decl name='_PyAST_alias' filepath='./Include/internal/pycore_ast.h' line='884' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-704'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-706'/> <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-743'/> - <return type-id='type-id-623'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-625'/> </function-decl> <function-decl name='_PyAST_TypeIgnore' filepath='./Include/internal/pycore_ast.h' line='915' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-706'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-634'/> + <parameter type-id='type-id-708'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-636'/> </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-6'/> @@ -13023,29 +13039,29 @@ <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-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_PyPegen_new_identifier' filepath='Parser/pegen.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </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-748'/> - <parameter type-id='type-id-749'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> <return type-id='type-id-6'/> </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-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-749'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-751'/> <return type-id='type-id-6'/> </function-decl> - <class-decl name='__anonymous_struct__6' 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-688'> + <class-decl name='__anonymous_struct__6' 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-690'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='229' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='229' column='1'/> </data-member> </class-decl> </abi-instr> @@ -13056,7 +13072,7 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicode_IsPrintable' mangled-name='_PyUnicode_IsPrintable' filepath='./Include/cpython/unicodeobject.h' line='719' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsPrintable'> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_ScanIdentifier' mangled-name='_PyUnicode_ScanIdentifier' filepath='./Include/internal/pycore_unicodeobject.h' line='272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ScanIdentifier'> @@ -13068,25 +13084,25 @@ <return type-id='type-id-6'/> </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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-35'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-750'/> + <parameter type-id='type-id-752'/> <parameter type-id='type-id-4'/> <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-750'/> + <parameter type-id='type-id-752'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> @@ -13094,24 +13110,24 @@ <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-750'/> + <parameter type-id='type-id-752'/> <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-750'/> + <parameter type-id='type-id-752'/> <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-750'/> + <parameter type-id='type-id-752'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <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='139' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-750'/> - <parameter type-id='type-id-751'/> + <function-decl name='_PyLexer_type_comment_token_setup' filepath='Parser/lexer/state.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-752'/> + <parameter type-id='type-id-753'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> @@ -13119,9 +13135,9 @@ <parameter type-id='type-id-4'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyLexer_token_setup' filepath='Parser/lexer/state.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-750'/> - <parameter type-id='type-id-751'/> + <function-decl name='_PyLexer_token_setup' filepath='Parser/lexer/state.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-752'/> + <parameter type-id='type-id-753'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> @@ -13129,82 +13145,82 @@ </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-61' restrict='yes' id='type-id-486'/> - <pointer-type-def type-id='type-id-752' size-in-bits='64' id='type-id-26'/> - <pointer-type-def type-id='type-id-753' size-in-bits='64' id='type-id-754'/> - <qualified-type-def type-id='type-id-17' restrict='yes' id='type-id-182'/> + <qualified-type-def type-id='type-id-67' restrict='yes' id='type-id-488'/> + <pointer-type-def type-id='type-id-754' size-in-bits='64' id='type-id-32'/> <pointer-type-def type-id='type-id-755' size-in-bits='64' id='type-id-756'/> + <qualified-type-def type-id='type-id-24' restrict='yes' id='type-id-13'/> + <pointer-type-def type-id='type-id-757' size-in-bits='64' id='type-id-758'/> <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-31'/> + <return type-id='type-id-37'/> </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-31'/> + <parameter type-id='type-id-37'/> <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'/> + <parameter type-id='type-id-32'/> <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'/> + <parameter type-id='type-id-32'/> <return type-id='type-id-3'/> </function-decl> - <var-decl name='PyOS_ReadlineFunctionPointer' type-id='type-id-754' mangled-name='PyOS_ReadlineFunctionPointer' visibility='default' filepath='./Include/cpython/pythonrun.h' line='96' column='1' elf-symbol-id='PyOS_ReadlineFunctionPointer'/> + <var-decl name='PyOS_ReadlineFunctionPointer' type-id='type-id-756' mangled-name='PyOS_ReadlineFunctionPointer' visibility='default' filepath='./Include/cpython/pythonrun.h' line='96' column='1' elf-symbol-id='PyOS_ReadlineFunctionPointer'/> <function-decl name='_PyInterpreterState_Main' mangled-name='_PyInterpreterState_Main' filepath='./Include/internal/pycore_pystate.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_Main'> - <return type-id='type-id-33'/> + <return type-id='type-id-39'/> </function-decl> <function-decl name='_PyOS_InterruptOccurred' filepath='./Include/internal/pycore_pystate.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-decl> - <var-decl name='PyOS_InputHook' type-id='type-id-756' mangled-name='PyOS_InputHook' visibility='default' filepath='./Include/pythonrun.h' line='22' column='1' elf-symbol-id='PyOS_InputHook'/> + <var-decl name='PyOS_InputHook' type-id='type-id-758' 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-61'/> + <parameter type-id='type-id-67'/> <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-182'/> + <parameter type-id='type-id-13'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-486'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-488'/> + <return type-id='type-id-24'/> </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-61'/> + <parameter type-id='type-id-67'/> <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-61'/> + <parameter type-id='type-id-67'/> <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-31' mangled-name='_PyOS_ReadlineTState' visibility='default' filepath='Parser/myreadline.c' line='30' column='1' elf-symbol-id='_PyOS_ReadlineTState'/> - <function-type size-in-bits='64' id='type-id-753'> - <parameter type-id='type-id-61'/> - <parameter type-id='type-id-61'/> + <var-decl name='_PyOS_ReadlineTState' type-id='type-id-37' mangled-name='_PyOS_ReadlineTState' visibility='default' filepath='Parser/myreadline.c' line='30' column='1' elf-symbol-id='_PyOS_ReadlineTState'/> + <function-type size-in-bits='64' id='type-id-755'> + <parameter type-id='type-id-67'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-type> - <function-type size-in-bits='64' id='type-id-755'> + <function-type size-in-bits='64' id='type-id-757'> <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-757' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='28' column='1' id='type-id-758'> + <class-decl name='asdl_seq' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-759' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='28' column='1' id='type-id-760'> <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> @@ -13212,9 +13228,9 @@ <var-decl name='elements' type-id='type-id-267' 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-758' filepath='./Include/internal/pycore_asdl.h' line='30' column='1' id='type-id-757'/> - <enum-decl name='_cmpop' filepath='./Include/internal/pycore_ast.h' line='31' column='1' id='type-id-759'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='asdl_seq' type-id='type-id-760' filepath='./Include/internal/pycore_asdl.h' line='30' column='1' id='type-id-759'/> + <enum-decl name='_cmpop' filepath='./Include/internal/pycore_ast.h' line='31' column='1' id='type-id-761'> + <underlying-type type-id='type-id-43'/> <enumerator name='Eq' value='1'/> <enumerator name='NotEq' value='2'/> <enumerator name='Lt' value='3'/> @@ -13226,1170 +13242,1180 @@ <enumerator name='In' value='9'/> <enumerator name='NotIn' value='10'/> </enum-decl> - <typedef-decl name='cmpop_ty' type-id='type-id-759' filepath='./Include/internal/pycore_ast.h' line='32' column='1' id='type-id-760'/> - <class-decl name='CmpopExprPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-761' visibility='default' filepath='Parser/pegen.h' line='96' column='1' id='type-id-762'> + <typedef-decl name='cmpop_ty' type-id='type-id-761' filepath='./Include/internal/pycore_ast.h' line='32' column='1' id='type-id-762'/> + <class-decl name='CmpopExprPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-763' visibility='default' filepath='Parser/pegen.h' line='96' column='1' id='type-id-764'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cmpop' type-id='type-id-760' visibility='default' filepath='Parser/pegen.h' line='97' column='1'/> + <var-decl name='cmpop' type-id='type-id-762' visibility='default' filepath='Parser/pegen.h' line='97' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='expr' type-id='type-id-681' visibility='default' filepath='Parser/pegen.h' line='98' column='1'/> + <var-decl name='expr' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='98' column='1'/> </data-member> </class-decl> - <typedef-decl name='CmpopExprPair' type-id='type-id-762' filepath='Parser/pegen.h' line='99' column='1' id='type-id-761'/> - <class-decl name='KeyValuePair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-763' visibility='default' filepath='Parser/pegen.h' line='101' column='1' id='type-id-764'> + <typedef-decl name='CmpopExprPair' type-id='type-id-764' filepath='Parser/pegen.h' line='99' column='1' id='type-id-763'/> + <class-decl name='KeyValuePair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-765' visibility='default' filepath='Parser/pegen.h' line='101' column='1' id='type-id-766'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='key' type-id='type-id-681' visibility='default' filepath='Parser/pegen.h' line='102' column='1'/> + <var-decl name='key' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='102' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='Parser/pegen.h' line='103' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='103' column='1'/> </data-member> </class-decl> - <typedef-decl name='KeyValuePair' type-id='type-id-764' filepath='Parser/pegen.h' line='104' column='1' id='type-id-763'/> - <class-decl name='KeyPatternPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-765' visibility='default' filepath='Parser/pegen.h' line='106' column='1' id='type-id-766'> + <typedef-decl name='KeyValuePair' type-id='type-id-766' filepath='Parser/pegen.h' line='104' column='1' id='type-id-765'/> + <class-decl name='KeyPatternPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-767' visibility='default' filepath='Parser/pegen.h' line='106' column='1' id='type-id-768'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='key' type-id='type-id-681' visibility='default' filepath='Parser/pegen.h' line='107' column='1'/> + <var-decl name='key' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='107' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pattern' type-id='type-id-630' visibility='default' filepath='Parser/pegen.h' line='108' column='1'/> + <var-decl name='pattern' type-id='type-id-632' visibility='default' filepath='Parser/pegen.h' line='108' column='1'/> </data-member> </class-decl> - <typedef-decl name='KeyPatternPair' type-id='type-id-766' filepath='Parser/pegen.h' line='109' column='1' id='type-id-765'/> - <class-decl name='NameDefaultPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-767' visibility='default' filepath='Parser/pegen.h' line='111' column='1' id='type-id-768'> + <typedef-decl name='KeyPatternPair' type-id='type-id-768' filepath='Parser/pegen.h' line='109' column='1' id='type-id-767'/> + <class-decl name='NameDefaultPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-769' visibility='default' filepath='Parser/pegen.h' line='111' column='1' id='type-id-770'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arg' type-id='type-id-747' visibility='default' filepath='Parser/pegen.h' line='112' column='1'/> + <var-decl name='arg' type-id='type-id-749' visibility='default' filepath='Parser/pegen.h' line='112' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='Parser/pegen.h' line='113' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='113' column='1'/> </data-member> </class-decl> - <typedef-decl name='NameDefaultPair' type-id='type-id-768' filepath='Parser/pegen.h' line='114' column='1' id='type-id-767'/> - <class-decl name='SlashWithDefault' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-769' visibility='default' filepath='Parser/pegen.h' line='116' column='1' id='type-id-770'> + <typedef-decl name='NameDefaultPair' type-id='type-id-770' filepath='Parser/pegen.h' line='114' column='1' id='type-id-769'/> + <class-decl name='SlashWithDefault' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-771' visibility='default' filepath='Parser/pegen.h' line='116' column='1' id='type-id-772'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='plain_names' type-id='type-id-745' visibility='default' filepath='Parser/pegen.h' line='117' column='1'/> + <var-decl name='plain_names' type-id='type-id-747' visibility='default' filepath='Parser/pegen.h' line='117' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='names_with_defaults' type-id='type-id-771' visibility='default' filepath='Parser/pegen.h' line='118' column='1'/> + <var-decl name='names_with_defaults' type-id='type-id-773' visibility='default' filepath='Parser/pegen.h' line='118' column='1'/> </data-member> </class-decl> - <typedef-decl name='SlashWithDefault' type-id='type-id-770' filepath='Parser/pegen.h' line='119' column='1' id='type-id-769'/> - <class-decl name='StarEtc' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-772' visibility='default' filepath='Parser/pegen.h' line='121' column='1' id='type-id-773'> + <typedef-decl name='SlashWithDefault' type-id='type-id-772' filepath='Parser/pegen.h' line='119' column='1' id='type-id-771'/> + <class-decl name='StarEtc' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-774' visibility='default' filepath='Parser/pegen.h' line='121' column='1' id='type-id-775'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='vararg' type-id='type-id-747' visibility='default' filepath='Parser/pegen.h' line='122' column='1'/> + <var-decl name='vararg' type-id='type-id-749' visibility='default' filepath='Parser/pegen.h' line='122' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='kwonlyargs' type-id='type-id-771' visibility='default' filepath='Parser/pegen.h' line='123' column='1'/> + <var-decl name='kwonlyargs' type-id='type-id-773' visibility='default' filepath='Parser/pegen.h' line='123' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kwarg' type-id='type-id-747' visibility='default' filepath='Parser/pegen.h' line='124' column='1'/> + <var-decl name='kwarg' type-id='type-id-749' visibility='default' filepath='Parser/pegen.h' line='124' column='1'/> </data-member> </class-decl> - <typedef-decl name='StarEtc' type-id='type-id-773' filepath='Parser/pegen.h' line='125' column='1' id='type-id-772'/> - <class-decl name='AugOperator' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-774' visibility='default' filepath='Parser/pegen.h' line='127' column='1' id='type-id-775'> + <typedef-decl name='StarEtc' type-id='type-id-775' filepath='Parser/pegen.h' line='125' column='1' id='type-id-774'/> + <class-decl name='AugOperator' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-776' visibility='default' filepath='Parser/pegen.h' line='127' column='1' id='type-id-777'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-709' visibility='default' filepath='Parser/pegen.h' line='127' column='1'/> + <var-decl name='kind' type-id='type-id-711' visibility='default' filepath='Parser/pegen.h' line='127' column='1'/> </data-member> </class-decl> - <typedef-decl name='AugOperator' type-id='type-id-775' filepath='Parser/pegen.h' line='127' column='1' id='type-id-774'/> - <class-decl name='KeywordOrStarred' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-776' visibility='default' filepath='Parser/pegen.h' line='128' column='1' id='type-id-777'> + <typedef-decl name='AugOperator' type-id='type-id-777' filepath='Parser/pegen.h' line='127' column='1' id='type-id-776'/> + <class-decl name='KeywordOrStarred' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-778' visibility='default' filepath='Parser/pegen.h' line='128' column='1' id='type-id-779'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='element' type-id='type-id-35' visibility='default' filepath='Parser/pegen.h' line='129' column='1'/> + <var-decl name='element' type-id='type-id-41' visibility='default' filepath='Parser/pegen.h' line='129' 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='130' column='1'/> </data-member> </class-decl> - <typedef-decl name='KeywordOrStarred' type-id='type-id-777' filepath='Parser/pegen.h' line='131' column='1' id='type-id-776'/> - <class-decl name='ResultTokenWithMetadata' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-778' visibility='default' filepath='Parser/pegen.h' line='133' column='1' id='type-id-779'> + <typedef-decl name='KeywordOrStarred' type-id='type-id-779' filepath='Parser/pegen.h' line='131' column='1' id='type-id-778'/> + <class-decl name='ResultTokenWithMetadata' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-780' visibility='default' filepath='Parser/pegen.h' line='133' column='1' id='type-id-781'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='result' type-id='type-id-35' visibility='default' filepath='Parser/pegen.h' line='134' column='1'/> + <var-decl name='result' type-id='type-id-41' visibility='default' filepath='Parser/pegen.h' line='134' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='metadata' type-id='type-id-6' visibility='default' filepath='Parser/pegen.h' line='135' column='1'/> </data-member> </class-decl> - <typedef-decl name='ResultTokenWithMetadata' type-id='type-id-779' filepath='Parser/pegen.h' line='136' column='1' id='type-id-778'/> - <enum-decl name='TARGETS_TYPE' naming-typedef-id='type-id-780' filepath='Parser/pegen.h' line='171' column='1' id='type-id-781'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='ResultTokenWithMetadata' type-id='type-id-781' filepath='Parser/pegen.h' line='136' column='1' id='type-id-780'/> + <enum-decl name='TARGETS_TYPE' naming-typedef-id='type-id-782' filepath='Parser/pegen.h' line='171' column='1' id='type-id-783'> + <underlying-type type-id='type-id-43'/> <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-781' filepath='Parser/pegen.h' line='175' column='1' id='type-id-780'/> - <pointer-type-def type-id='type-id-774' size-in-bits='64' id='type-id-782'/> - <pointer-type-def type-id='type-id-761' size-in-bits='64' id='type-id-783'/> - <pointer-type-def type-id='type-id-765' size-in-bits='64' id='type-id-784'/> + <typedef-decl name='TARGETS_TYPE' type-id='type-id-783' filepath='Parser/pegen.h' line='175' column='1' id='type-id-782'/> + <pointer-type-def type-id='type-id-776' size-in-bits='64' id='type-id-784'/> <pointer-type-def type-id='type-id-763' size-in-bits='64' id='type-id-785'/> - <pointer-type-def type-id='type-id-776' size-in-bits='64' id='type-id-786'/> - <pointer-type-def type-id='type-id-767' size-in-bits='64' id='type-id-787'/> + <pointer-type-def type-id='type-id-767' size-in-bits='64' id='type-id-786'/> + <pointer-type-def type-id='type-id-765' size-in-bits='64' id='type-id-787'/> <pointer-type-def type-id='type-id-778' size-in-bits='64' id='type-id-788'/> <pointer-type-def type-id='type-id-769' size-in-bits='64' id='type-id-789'/> - <pointer-type-def type-id='type-id-772' size-in-bits='64' id='type-id-790'/> - <pointer-type-def type-id='type-id-791' size-in-bits='64' id='type-id-792'/> - <pointer-type-def type-id='type-id-757' size-in-bits='64' id='type-id-771'/> + <pointer-type-def type-id='type-id-780' size-in-bits='64' id='type-id-790'/> + <pointer-type-def type-id='type-id-771' size-in-bits='64' id='type-id-791'/> + <pointer-type-def type-id='type-id-774' size-in-bits='64' id='type-id-792'/> <pointer-type-def type-id='type-id-793' size-in-bits='64' id='type-id-794'/> + <pointer-type-def type-id='type-id-759' size-in-bits='64' id='type-id-773'/> <pointer-type-def type-id='type-id-795' size-in-bits='64' id='type-id-796'/> <pointer-type-def type-id='type-id-797' size-in-bits='64' id='type-id-798'/> + <pointer-type-def type-id='type-id-799' size-in-bits='64' id='type-id-800'/> <function-decl name='_Py_ReachedRecursionLimitWithMargin' mangled-name='_Py_ReachedRecursionLimitWithMargin' filepath='./Include/cpython/object.h' line='435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_ReachedRecursionLimitWithMargin'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyAST_Interactive' filepath='./Include/internal/pycore_ast.h' line='696' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-649'/> </function-decl> <function-decl name='_PyAST_Expression' filepath='./Include/internal/pycore_ast.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-649'/> </function-decl> <function-decl name='_PyAST_FunctionType' filepath='./Include/internal/pycore_ast.h' line='698' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-649'/> </function-decl> <function-decl name='_PyAST_Return' filepath='./Include/internal/pycore_ast.h' line='716' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Delete' filepath='./Include/internal/pycore_ast.h' line='718' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> + <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Assign' filepath='./Include/internal/pycore_ast.h' line='720' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-706'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_TypeAlias' filepath='./Include/internal/pycore_ast.h' line='723' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-707'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-709'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_AugAssign' filepath='./Include/internal/pycore_ast.h' line='726' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-709'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-711'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_AnnAssign' filepath='./Include/internal/pycore_ast.h' line='729' 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-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_For' filepath='./Include/internal/pycore_ast.h' line='732' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> <parameter type-id='type-id-681'/> <parameter type-id='type-id-681'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-706'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_AsyncFor' filepath='./Include/internal/pycore_ast.h' line='736' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> <parameter type-id='type-id-681'/> <parameter type-id='type-id-681'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-706'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_While' filepath='./Include/internal/pycore_ast.h' line='740' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-681'/> <parameter type-id='type-id-681'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-679'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_If' filepath='./Include/internal/pycore_ast.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-681'/> <parameter type-id='type-id-681'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-679'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_With' filepath='./Include/internal/pycore_ast.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-710'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-706'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_AsyncWith' filepath='./Include/internal/pycore_ast.h' line='749' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-710'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-706'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Match' filepath='./Include/internal/pycore_ast.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-711'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-713'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Raise' filepath='./Include/internal/pycore_ast.h' line='755' 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-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Try' filepath='./Include/internal/pycore_ast.h' line='757' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-712'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-679'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-714'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-681'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_TryStar' filepath='./Include/internal/pycore_ast.h' line='761' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-712'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-679'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-714'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-681'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Assert' filepath='./Include/internal/pycore_ast.h' line='765' 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-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Import' filepath='./Include/internal/pycore_ast.h' line='767' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-713'/> + <parameter type-id='type-id-715'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Global' filepath='./Include/internal/pycore_ast.h' line='772' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-714'/> + <parameter type-id='type-id-716'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Nonlocal' filepath='./Include/internal/pycore_ast.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-714'/> + <parameter type-id='type-id-716'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Expr' filepath='./Include/internal/pycore_ast.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Pass' filepath='./Include/internal/pycore_ast.h' line='779' 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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Break' filepath='./Include/internal/pycore_ast.h' line='781' 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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_Continue' filepath='./Include/internal/pycore_ast.h' line='783' 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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyAST_BoolOp' filepath='./Include/internal/pycore_ast.h' line='785' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-799'/> - <parameter type-id='type-id-682'/> + <parameter type-id='type-id-801'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_NamedExpr' filepath='./Include/internal/pycore_ast.h' line='788' 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-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_BinOp' filepath='./Include/internal/pycore_ast.h' line='791' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-709'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-711'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_UnaryOp' filepath='./Include/internal/pycore_ast.h' line='794' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-800'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-802'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Lambda' filepath='./Include/internal/pycore_ast.h' line='797' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-705'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-707'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_IfExp' filepath='./Include/internal/pycore_ast.h' line='800' 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-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Dict' filepath='./Include/internal/pycore_ast.h' line='803' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-682'/> + <parameter type-id='type-id-684'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Set' filepath='./Include/internal/pycore_ast.h' line='806' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_ListComp' filepath='./Include/internal/pycore_ast.h' line='808' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-801'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-803'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_SetComp' filepath='./Include/internal/pycore_ast.h' line='811' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-801'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-803'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_DictComp' filepath='./Include/internal/pycore_ast.h' line='814' 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-801'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-803'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_GeneratorExp' filepath='./Include/internal/pycore_ast.h' line='817' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-801'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-803'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Await' filepath='./Include/internal/pycore_ast.h' line='820' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Yield' filepath='./Include/internal/pycore_ast.h' line='822' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_YieldFrom' filepath='./Include/internal/pycore_ast.h' line='824' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Compare' filepath='./Include/internal/pycore_ast.h' line='826' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-744'/> - <parameter type-id='type-id-682'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-746'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Slice' filepath='./Include/internal/pycore_ast.h' line='864' 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-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_comprehension' filepath='./Include/internal/pycore_ast.h' line='867' 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-682'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-684'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-802'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-804'/> </function-decl> <function-decl name='_PyAST_ExceptHandler' filepath='./Include/internal/pycore_ast.h' line='870' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-706'/> <parameter type-id='type-id-681'/> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-679'/> <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-743'/> - <return type-id='type-id-626'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-628'/> </function-decl> <function-decl name='_PyAST_keyword' filepath='./Include/internal/pycore_ast.h' line='881' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-803'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-805'/> </function-decl> <function-decl name='_PyAST_withitem' filepath='./Include/internal/pycore_ast.h' line='887' 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-743'/> - <return type-id='type-id-639'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-641'/> </function-decl> <function-decl name='_PyAST_match_case' filepath='./Include/internal/pycore_ast.h' line='889' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-630'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-683'/> <parameter type-id='type-id-681'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-628'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-630'/> </function-decl> <function-decl name='_PyAST_MatchValue' filepath='./Include/internal/pycore_ast.h' line='891' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchSingleton' filepath='./Include/internal/pycore_ast.h' line='893' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-731'/> + <parameter type-id='type-id-733'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchSequence' filepath='./Include/internal/pycore_ast.h' line='896' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-732'/> + <parameter type-id='type-id-734'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchMapping' filepath='./Include/internal/pycore_ast.h' line='899' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-732'/> - <parameter type-id='type-id-704'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-734'/> + <parameter type-id='type-id-706'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchClass' filepath='./Include/internal/pycore_ast.h' line='903' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-732'/> - <parameter type-id='type-id-714'/> - <parameter type-id='type-id-732'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-734'/> + <parameter type-id='type-id-716'/> + <parameter type-id='type-id-734'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchStar' filepath='./Include/internal/pycore_ast.h' line='907' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> + <parameter type-id='type-id-706'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchAs' filepath='./Include/internal/pycore_ast.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-630'/> - <parameter type-id='type-id-704'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-706'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_MatchOr' filepath='./Include/internal/pycore_ast.h' line='912' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-732'/> + <parameter type-id='type-id-734'/> <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-743'/> - <return type-id='type-id-630'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-632'/> </function-decl> <function-decl name='_PyAST_TypeVar' filepath='./Include/internal/pycore_ast.h' line='916' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-636'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-638'/> </function-decl> <function-decl name='_PyAST_ParamSpec' filepath='./Include/internal/pycore_ast.h' line='919' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-636'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-638'/> </function-decl> <function-decl name='_PyAST_TypeVarTuple' filepath='./Include/internal/pycore_ast.h' line='922' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-683'/> <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-743'/> - <return type-id='type-id-636'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-638'/> </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-31'/> + <return type-id='type-id-37'/> </function-decl> <function-decl name='_PyPegen_insert_memo' filepath='Parser/pegen.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_update_memo' filepath='Parser/pegen.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_is_memoized' filepath='Parser/pegen.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_lookahead' filepath='Parser/pegen.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-798'/> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-800'/> + <parameter type-id='type-id-750'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_lookahead_for_expr' filepath='Parser/pegen.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-794'/> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-796'/> + <parameter type-id='type-id-750'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_lookahead_with_int' filepath='Parser/pegen.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-792'/> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-794'/> + <parameter type-id='type-id-750'/> <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='152' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-796'/> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-798'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-4'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_expect_token' filepath='Parser/pegen.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-749'/> + <return type-id='type-id-751'/> </function-decl> <function-decl name='_PyPegen_expect_forced_token' filepath='Parser/pegen.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-749'/> + <return type-id='type-id-751'/> </function-decl> <function-decl name='_PyPegen_expect_soft_keyword' filepath='Parser/pegen.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-681'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_soft_keyword_token' filepath='Parser/pegen.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_get_last_nonnwhitespace_token' filepath='Parser/pegen.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-749'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-751'/> </function-decl> <function-decl name='_PyPegen_name_token' filepath='Parser/pegen.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_number_token' filepath='Parser/pegen.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_string_token' filepath='Parser/pegen.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_Pypegen_stack_overflow' filepath='Parser/pegen.h' line='186' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyPegen_get_invalid_target' filepath='Parser/pegen.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-780'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-782'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_get_expr_name' filepath='Parser/pegen.h' line='238' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <return type-id='type-id-4'/> </function-decl> <function-decl name='_PyPegen_dummy_name' filepath='Parser/pegen.h' line='263' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter is-variadic='yes'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_PyPegen_seq_last_item' filepath='Parser/pegen.h' line='264' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-771'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_PyPegen_seq_first_item' filepath='Parser/pegen.h' line='266' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-771'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_PyPegen_new_type_comment' filepath='Parser/pegen.h' line='271' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyPegen_add_type_comment_to_arg' filepath='Parser/pegen.h' line='310' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-747'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-749'/> - <return type-id='type-id-747'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-749'/> </function-decl> <function-decl name='_PyPegen_singleton_seq' filepath='Parser/pegen.h' line='312' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-35'/> - <return type-id='type-id-771'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-773'/> </function-decl> <function-decl name='_PyPegen_seq_insert_in_front' filepath='Parser/pegen.h' line='313' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-771'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-773'/> </function-decl> <function-decl name='_PyPegen_seq_append_to_end' filepath='Parser/pegen.h' line='314' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <parameter type-id='type-id-35'/> - <return type-id='type-id-771'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-773'/> </function-decl> <function-decl name='_PyPegen_seq_flatten' filepath='Parser/pegen.h' line='315' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-771'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-773'/> </function-decl> <function-decl name='_PyPegen_join_names_with_dot' filepath='Parser/pegen.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-681'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_seq_count_dots' filepath='Parser/pegen.h' line='317' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-771'/> + <parameter type-id='type-id-773'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_alias_for_star' filepath='Parser/pegen.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <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-743'/> - <return type-id='type-id-623'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-625'/> </function-decl> <function-decl name='_PyPegen_map_names_to_ids' filepath='Parser/pegen.h' line='319' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-682'/> - <return type-id='type-id-714'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-684'/> + <return type-id='type-id-716'/> </function-decl> <function-decl name='_PyPegen_cmpop_expr_pair' filepath='Parser/pegen.h' line='320' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-760'/> - <parameter type-id='type-id-681'/> - <return type-id='type-id-783'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-762'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-785'/> </function-decl> <function-decl name='_PyPegen_get_cmpops' filepath='Parser/pegen.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-744'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-746'/> </function-decl> <function-decl name='_PyPegen_get_exprs' filepath='Parser/pegen.h' line='322' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-682'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-684'/> </function-decl> <function-decl name='_PyPegen_set_expr_context' filepath='Parser/pegen.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-746'/> - <return type-id='type-id-681'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_key_value_pair' filepath='Parser/pegen.h' line='324' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-681'/> - <return type-id='type-id-785'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-787'/> </function-decl> <function-decl name='_PyPegen_get_keys' filepath='Parser/pegen.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-682'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-684'/> </function-decl> <function-decl name='_PyPegen_get_values' filepath='Parser/pegen.h' line='326' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-682'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-684'/> </function-decl> <function-decl name='_PyPegen_key_pattern_pair' filepath='Parser/pegen.h' line='327' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-630'/> - <return type-id='type-id-784'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-632'/> + <return type-id='type-id-786'/> </function-decl> <function-decl name='_PyPegen_get_pattern_keys' filepath='Parser/pegen.h' line='328' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-682'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-684'/> </function-decl> <function-decl name='_PyPegen_get_patterns' filepath='Parser/pegen.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-732'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-734'/> </function-decl> <function-decl name='_PyPegen_name_default_pair' filepath='Parser/pegen.h' line='330' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-747'/> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-749'/> - <return type-id='type-id-787'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-789'/> </function-decl> <function-decl name='_PyPegen_slash_with_default' filepath='Parser/pegen.h' line='331' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-745'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-789'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-747'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-791'/> </function-decl> <function-decl name='_PyPegen_star_etc' filepath='Parser/pegen.h' line='332' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-747'/> - <parameter type-id='type-id-771'/> - <parameter type-id='type-id-747'/> - <return type-id='type-id-790'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-749'/> + <parameter type-id='type-id-773'/> + <parameter type-id='type-id-749'/> + <return type-id='type-id-792'/> </function-decl> - <function-decl name='_PyPegen_make_arguments' filepath='Parser/pegen.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-745'/> - <parameter type-id='type-id-789'/> - <parameter type-id='type-id-745'/> - <parameter type-id='type-id-771'/> - <parameter type-id='type-id-790'/> - <return type-id='type-id-705'/> + <function-decl name='_PyPegen_make_arguments' filepath='Parser/pegen.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-747'/> + <parameter type-id='type-id-791'/> + <parameter type-id='type-id-747'/> + <parameter type-id='type-id-773'/> + <parameter type-id='type-id-792'/> + <return type-id='type-id-707'/> </function-decl> <function-decl name='_PyPegen_empty_arguments' filepath='Parser/pegen.h' line='335' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-705'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-707'/> </function-decl> <function-decl name='_PyPegen_template_str' filepath='Parser/pegen.h' line='336' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-749'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_joined_str' filepath='Parser/pegen.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-749'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_interpolation' filepath='Parser/pegen.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-788'/> - <parameter type-id='type-id-788'/> - <parameter type-id='type-id-749'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-751'/> + <parameter type-id='type-id-790'/> + <parameter type-id='type-id-790'/> + <parameter type-id='type-id-751'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_formatted_value' filepath='Parser/pegen.h' line='340' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-788'/> - <parameter type-id='type-id-788'/> - <parameter type-id='type-id-749'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-751'/> + <parameter type-id='type-id-790'/> + <parameter type-id='type-id-790'/> + <parameter type-id='type-id-751'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_augoperator' filepath='Parser/pegen.h' line='342' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-709'/> - <return type-id='type-id-782'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-711'/> + <return type-id='type-id-784'/> </function-decl> <function-decl name='_PyPegen_function_def_decorators' filepath='Parser/pegen.h' line='343' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-632'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-634'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyPegen_class_def_decorators' filepath='Parser/pegen.h' line='344' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-632'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-634'/> + <return type-id='type-id-634'/> </function-decl> <function-decl name='_PyPegen_keyword_or_starred' filepath='Parser/pegen.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-786'/> + <return type-id='type-id-788'/> </function-decl> <function-decl name='_PyPegen_seq_extract_starred_exprs' filepath='Parser/pegen.h' line='346' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-682'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-684'/> </function-decl> <function-decl name='_PyPegen_seq_delete_starred_exprs' filepath='Parser/pegen.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-708'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-710'/> </function-decl> <function-decl name='_PyPegen_collect_call_seqs' filepath='Parser/pegen.h' line='348' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-682'/> - <parameter type-id='type-id-771'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-773'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_constant_from_token' filepath='Parser/pegen.h' line='351' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_decoded_constant_from_token' filepath='Parser/pegen.h' line='352' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyPegen_constant_from_string' filepath='Parser/pegen.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <return type-id='type-id-683'/> </function-decl> - <function-decl name='_PyPegen_concatenate_strings' filepath='Parser/pegen.h' line='354' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-682'/> + <function-decl name='_PyPegen_concatenate_tstrings' filepath='Parser/pegen.h' line='354' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> - <function-decl name='_PyPegen_ensure_imaginary' filepath='Parser/pegen.h' line='356' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <return type-id='type-id-681'/> + <function-decl name='_PyPegen_concatenate_strings' filepath='Parser/pegen.h' line='355' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <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-745'/> + <return type-id='type-id-683'/> </function-decl> - <function-decl name='_PyPegen_ensure_real' filepath='Parser/pegen.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <return type-id='type-id-681'/> + <function-decl name='_PyPegen_ensure_imaginary' filepath='Parser/pegen.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-683'/> </function-decl> - <function-decl name='_PyPegen_join_sequences' filepath='Parser/pegen.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-771'/> - <parameter type-id='type-id-771'/> - <return type-id='type-id-771'/> + <function-decl name='_PyPegen_ensure_real' filepath='Parser/pegen.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-683'/> </function-decl> - <function-decl name='_PyPegen_check_barry_as_flufl' filepath='Parser/pegen.h' line='359' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> + <function-decl name='_PyPegen_join_sequences' filepath='Parser/pegen.h' line='359' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-773'/> + <parameter type-id='type-id-773'/> + <return type-id='type-id-773'/> + </function-decl> + <function-decl name='_PyPegen_check_barry_as_flufl' filepath='Parser/pegen.h' line='360' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyPegen_check_legacy_stmt' filepath='Parser/pegen.h' line='360' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> + <function-decl name='_PyPegen_check_legacy_stmt' filepath='Parser/pegen.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyPegen_check_fstring_conversion' filepath='Parser/pegen.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-681'/> - <return type-id='type-id-788'/> + <function-decl name='_PyPegen_check_fstring_conversion' filepath='Parser/pegen.h' line='362' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-790'/> </function-decl> - <function-decl name='_PyPegen_setup_full_format_spec' filepath='Parser/pegen.h' line='362' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-682'/> + <function-decl name='_PyPegen_setup_full_format_spec' filepath='Parser/pegen.h' line='363' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> + <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-743'/> - <return type-id='type-id-788'/> - </function-decl> - <function-decl name='_PyPegen_make_module' filepath='Parser/pegen.h' line='364' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-679'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-790'/> </function-decl> - <function-decl name='_PyPegen_arguments_parsing_error' filepath='Parser/pegen.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <function-decl name='_PyPegen_make_module' filepath='Parser/pegen.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-681'/> - <return type-id='type-id-35'/> + <return type-id='type-id-649'/> </function-decl> - <function-decl name='_PyPegen_get_last_comprehension_item' filepath='Parser/pegen.h' line='366' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-802'/> - <return type-id='type-id-681'/> + <function-decl name='_PyPegen_arguments_parsing_error' filepath='Parser/pegen.h' line='366' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyPegen_nonparen_genexp_in_call' filepath='Parser/pegen.h' line='367' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-681'/> - <parameter type-id='type-id-801'/> - <return type-id='type-id-35'/> + <function-decl name='_PyPegen_get_last_comprehension_item' filepath='Parser/pegen.h' line='367' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-804'/> + <return type-id='type-id-683'/> </function-decl> - <function-decl name='_PyPegen_checked_future_import' filepath='Parser/pegen.h' line='368' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-713'/> + <function-decl name='_PyPegen_nonparen_genexp_in_call' filepath='Parser/pegen.h' line='368' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-803'/> + <return type-id='type-id-41'/> + </function-decl> + <function-decl name='_PyPegen_checked_future_import' filepath='Parser/pegen.h' line='369' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-715'/> <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-743'/> - <return type-id='type-id-632'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-634'/> </function-decl> - <function-decl name='_PyPegen_register_stmts' filepath='Parser/pegen.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-679'/> - <return type-id='type-id-679'/> + <function-decl name='_PyPegen_register_stmts' filepath='Parser/pegen.h' line='371' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-681'/> + <return type-id='type-id-681'/> </function-decl> - <function-decl name='_PyPegen_interactive_exit' filepath='Parser/pegen.h' line='382' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-679'/> + <function-decl name='_PyPegen_interactive_exit' filepath='Parser/pegen.h' line='383' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <return type-id='type-id-681'/> </function-decl> - <function-type size-in-bits='64' id='type-id-791'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-5'/> - <return type-id='type-id-749'/> - </function-type> <function-type size-in-bits='64' id='type-id-793'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-751'/> </function-type> <function-type size-in-bits='64' id='type-id-795'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-4'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-750'/> + <return type-id='type-id-683'/> </function-type> <function-type size-in-bits='64' id='type-id-797'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-683'/> + </function-type> + <function-type size-in-bits='64' id='type-id-799'> + <parameter type-id='type-id-750'/> + <return type-id='type-id-41'/> </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-804' visibility='default' filepath='./Include/cpython/compile.h' line='27' column='1' id='type-id-805'> + <class-decl name='PyCompilerFlags' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-806' visibility='default' filepath='./Include/cpython/compile.h' line='27' column='1' id='type-id-807'> <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> @@ -14397,207 +14423,207 @@ <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-805' filepath='./Include/cpython/compile.h' line='30' column='1' id='type-id-804'/> - <pointer-type-def type-id='type-id-804' size-in-bits='64' id='type-id-209'/> + <typedef-decl name='PyCompilerFlags' type-id='type-id-807' filepath='./Include/cpython/compile.h' line='30' column='1' id='type-id-806'/> + <pointer-type-def type-id='type-id-806' size-in-bits='64' id='type-id-213'/> <function-decl name='PySys_Audit' mangled-name='PySys_Audit' filepath='./Include/audit.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_Audit'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> <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='377' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <function-decl name='_PyPegen_run_parser_from_file_pointer' filepath='Parser/pegen.h' line='378' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-209'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-241'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-649'/> </function-decl> - <function-decl name='_PyPegen_run_parser_from_string' filepath='Parser/pegen.h' line='381' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyPegen_run_parser_from_string' filepath='Parser/pegen.h' line='382' 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-6'/> - <parameter type-id='type-id-209'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-647'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-649'/> </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-806' size-in-bits='512' id='type-id-807'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-808' size-in-bits='512' id='type-id-809'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-362' size-in-bits='512' id='type-id-808'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-364' size-in-bits='512' id='type-id-810'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-809' size-in-bits='512' id='type-id-810'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-811' size-in-bits='512' id='type-id-812'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-398' size-in-bits='512' id='type-id-811'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-400' size-in-bits='512' id='type-id-813'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-414' size-in-bits='512' id='type-id-812'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-416' size-in-bits='512' id='type-id-814'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-258' size-in-bits='67072' id='type-id-813'> - <subrange length='262' type-id='type-id-2' id='type-id-814'/> + <array-type-def dimensions='1' type-id='type-id-258' size-in-bits='67072' id='type-id-815'> + <subrange length='262' type-id='type-id-2' id='type-id-816'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='64' id='type-id-393'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='64' id='type-id-395'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='320' id='type-id-815'> - <subrange length='5' type-id='type-id-2' id='type-id-816'/> + <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='320' id='type-id-817'> + <subrange length='5' type-id='type-id-2' id='type-id-818'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='512' id='type-id-817'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='512' id='type-id-819'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='2' type-id='type-id-6' size-in-bits='9728' id='type-id-818'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> - <subrange length='19' type-id='type-id-2' id='type-id-819'/> + <array-type-def dimensions='2' type-id='type-id-6' size-in-bits='9728' id='type-id-820'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> + <subrange length='19' type-id='type-id-2' id='type-id-821'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='262144' id='type-id-820'> - <subrange length='4096' type-id='type-id-2' id='type-id-821'/> + <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='262144' id='type-id-822'> + <subrange length='4096' type-id='type-id-2' id='type-id-823'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-602' size-in-bits='512' id='type-id-822'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-604' size-in-bits='512' id='type-id-824'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-338' size-in-bits='64' id='type-id-374'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-340' size-in-bits='64' id='type-id-376'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-433' size-in-bits='64' id='type-id-434'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-435' size-in-bits='64' id='type-id-436'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-823' size-in-bits='2560' id='type-id-824'> - <subrange length='20' type-id='type-id-2' id='type-id-825'/> + <array-type-def dimensions='1' type-id='type-id-825' size-in-bits='2560' id='type-id-826'> + <subrange length='20' type-id='type-id-2' id='type-id-827'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-826' size-in-bits='49152' id='type-id-827'> - <subrange length='128' type-id='type-id-2' id='type-id-604'/> + <array-type-def dimensions='1' type-id='type-id-828' size-in-bits='49152' id='type-id-829'> + <subrange length='128' type-id='type-id-2' id='type-id-606'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-828' size-in-bits='65536' id='type-id-829'> - <subrange length='128' type-id='type-id-2' id='type-id-604'/> + <array-type-def dimensions='1' type-id='type-id-830' size-in-bits='65536' id='type-id-831'> + <subrange length='128' type-id='type-id-2' id='type-id-606'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-830' size-in-bits='26880' id='type-id-831'> - <subrange length='210' type-id='type-id-2' id='type-id-832'/> + <array-type-def dimensions='1' type-id='type-id-832' size-in-bits='26880' id='type-id-833'> + <subrange length='210' type-id='type-id-2' id='type-id-834'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-833' size-in-bits='98304' id='type-id-834'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <array-type-def dimensions='1' type-id='type-id-835' size-in-bits='98304' id='type-id-836'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-835' size-in-bits='8320' id='type-id-836'> - <subrange length='65' type-id='type-id-2' id='type-id-77'/> + <array-type-def dimensions='1' type-id='type-id-837' size-in-bits='8320' id='type-id-838'> + <subrange length='65' type-id='type-id-2' id='type-id-83'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-837' size-in-bits='524288' id='type-id-838'> - <subrange length='4096' type-id='type-id-2' id='type-id-821'/> + <array-type-def dimensions='1' type-id='type-id-839' size-in-bits='524288' id='type-id-840'> + <subrange length='4096' type-id='type-id-2' id='type-id-823'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-839' size-in-bits='57600' id='type-id-840'> - <subrange length='300' type-id='type-id-2' id='type-id-841'/> + <array-type-def dimensions='1' type-id='type-id-841' size-in-bits='57600' id='type-id-842'> + <subrange length='300' type-id='type-id-2' id='type-id-843'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-842' size-in-bits='1048576' id='type-id-843'> - <subrange length='16384' type-id='type-id-2' id='type-id-844'/> + <array-type-def dimensions='1' type-id='type-id-844' size-in-bits='1048576' id='type-id-845'> + <subrange length='16384' type-id='type-id-2' id='type-id-846'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-845' size-in-bits='2097152' id='type-id-846'> - <subrange length='32768' type-id='type-id-2' id='type-id-847'/> + <array-type-def dimensions='1' type-id='type-id-847' size-in-bits='2097152' id='type-id-848'> + <subrange length='32768' type-id='type-id-2' id='type-id-849'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-848' size-in-bits='2097152' id='type-id-849'> - <subrange length='32768' type-id='type-id-2' id='type-id-847'/> + <array-type-def dimensions='1' type-id='type-id-850' size-in-bits='2097152' id='type-id-851'> + <subrange length='32768' type-id='type-id-2' id='type-id-849'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-850' size-in-bits='4160' id='type-id-851'> - <subrange length='65' type-id='type-id-2' id='type-id-77'/> + <array-type-def dimensions='1' type-id='type-id-852' size-in-bits='4160' id='type-id-853'> + <subrange length='65' type-id='type-id-2' id='type-id-83'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-747' size-in-bits='64' id='type-id-852'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-749' size-in-bits='64' id='type-id-854'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-853' size-in-bits='2048' id='type-id-854'> - <subrange length='32' type-id='type-id-2' id='type-id-73'/> + <array-type-def dimensions='1' type-id='type-id-855' size-in-bits='2048' id='type-id-856'> + <subrange length='32' type-id='type-id-2' id='type-id-79'/> </array-type-def> - <type-decl name='bool' size-in-bits='8' id='type-id-344'/> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='8' id='type-id-371'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <type-decl name='bool' size-in-bits='8' id='type-id-346'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='8' id='type-id-373'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='1600' id='type-id-855'> - <subrange length='200' type-id='type-id-2' id='type-id-856'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='1600' id='type-id-857'> + <subrange length='200' type-id='type-id-2' id='type-id-858'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='160' id='type-id-857'> - <subrange length='20' type-id='type-id-2' id='type-id-825'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='160' id='type-id-859'> + <subrange length='20' type-id='type-id-2' id='type-id-827'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='320' id='type-id-858'> - <subrange length='40' type-id='type-id-2' id='type-id-859'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='320' id='type-id-860'> + <subrange length='40' type-id='type-id-2' id='type-id-861'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='384' id='type-id-860'> - <subrange length='48' type-id='type-id-2' id='type-id-861'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='384' id='type-id-862'> + <subrange length='48' type-id='type-id-2' id='type-id-863'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='32' id='type-id-862'> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='32' id='type-id-864'> <subrange length='4' type-id='type-id-2' id='type-id-228'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='4096' id='type-id-302'> - <subrange length='512' type-id='type-id-2' id='type-id-863'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='4096' id='type-id-304'> + <subrange length='512' type-id='type-id-2' id='type-id-865'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='64' id='type-id-864'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='64' id='type-id-866'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='infinite' id='type-id-275'> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='infinite' id='type-id-277'> <subrange length='infinite' type-id='type-id-2' id='type-id-230'/> </array-type-def> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-865'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-866'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-867'/> - <class-decl name='_PyExecutorObject' size-in-bits='1152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='75' column='1' id='type-id-365'> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-867'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-868'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-869'/> + <class-decl name='_PyExecutorObject' size-in-bits='1152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='75' column='1' id='type-id-367'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='trace' type-id='type-id-358' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='77' column='1'/> + <var-decl name='trace' type-id='type-id-360' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='77' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='vm_data' type-id='type-id-342' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='78' column='1'/> + <var-decl name='vm_data' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='exit_count' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='79' column='1'/> + <var-decl name='exit_count' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='79' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='800'> - <var-decl name='code_size' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='80' column='1'/> + <var-decl name='code_size' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='80' 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='81' column='1'/> + <var-decl name='jit_size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='81' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='jit_code' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='82' column='1'/> + <var-decl name='jit_code' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='82' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='jit_side_entry' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='83' column='1'/> + <var-decl name='jit_side_entry' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='exits' type-id='type-id-320' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='84' column='1'/> + <var-decl name='exits' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='84' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_AuditHookEntry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-868'/> - <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-869'> + <class-decl name='_Py_AuditHookEntry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-870'/> + <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-871'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='gp_offset' type-id='type-id-105' visibility='default'/> + <var-decl name='gp_offset' type-id='type-id-111' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='fp_offset' type-id='type-id-105' visibility='default'/> + <var-decl name='fp_offset' type-id='type-id-111' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='overflow_arg_area' type-id='type-id-35' visibility='default'/> + <var-decl name='overflow_arg_area' type-id='type-id-41' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='reg_save_area' type-id='type-id-35' visibility='default'/> + <var-decl name='reg_save_area' type-id='type-id-41' visibility='default'/> </data-member> </class-decl> - <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-870'/> - <class-decl name='_frame' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='18' column='1' id='type-id-435'> + <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-872'/> + <class-decl name='_frame' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='18' column='1' id='type-id-437'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_frame.h' line='19' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_frame.h' line='19' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_back' type-id='type-id-413' visibility='default' filepath='./Include/internal/pycore_frame.h' line='20' column='1'/> + <var-decl name='f_back' type-id='type-id-415' visibility='default' filepath='./Include/internal/pycore_frame.h' line='20' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='f_frame' type-id='type-id-428' visibility='default' filepath='./Include/internal/pycore_frame.h' line='21' column='1'/> + <var-decl name='f_frame' type-id='type-id-430' visibility='default' filepath='./Include/internal/pycore_frame.h' line='21' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='f_trace' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_frame.h' line='22' column='1'/> @@ -14606,10 +14632,10 @@ <var-decl name='f_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_frame.h' line='23' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='f_trace_lines' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_frame.h' line='24' column='1'/> + <var-decl name='f_trace_lines' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_frame.h' line='24' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='360'> - <var-decl name='f_trace_opcodes' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_frame.h' line='25' column='1'/> + <var-decl name='f_trace_opcodes' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_frame.h' line='25' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> <var-decl name='f_extra_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_frame.h' line='26' column='1'/> @@ -14621,190 +14647,190 @@ <var-decl name='f_overwritten_fast_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_frame.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_f_frame_data' type-id='type-id-393' visibility='default' filepath='./Include/internal/pycore_frame.h' line='38' column='1'/> + <var-decl name='_f_frame_data' type-id='type-id-395' visibility='default' filepath='./Include/internal/pycore_frame.h' line='38' column='1'/> </data-member> </class-decl> - <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-871'/> - <array-type-def dimensions='1' type-id='type-id-802' size-in-bits='64' id='type-id-872'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-873'/> + <array-type-def dimensions='1' type-id='type-id-804' size-in-bits='64' id='type-id-874'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-454' size-in-bits='32' id='type-id-873'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-456' size-in-bits='32' id='type-id-875'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </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-874'> - <subrange length='288' type-id='type-id-2' id='type-id-875'/> + <type-decl name='double' size-in-bits='64' id='type-id-178'/> + <array-type-def dimensions='1' type-id='type-id-178' size-in-bits='18432' id='type-id-876'> + <subrange length='288' type-id='type-id-2' id='type-id-877'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-681' size-in-bits='64' id='type-id-876'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-683' size-in-bits='64' id='type-id-878'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-471' size-in-bits='16320' id='type-id-877'> - <subrange length='255' type-id='type-id-2' id='type-id-878'/> + <array-type-def dimensions='1' type-id='type-id-473' size-in-bits='16320' id='type-id-879'> + <subrange length='255' type-id='type-id-2' id='type-id-880'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-879' size-in-bits='384' id='type-id-880'> - <subrange length='2' type-id='type-id-2' id='type-id-500'/> + <array-type-def dimensions='1' type-id='type-id-881' size-in-bits='384' id='type-id-882'> + <subrange length='2' type-id='type-id-2' id='type-id-502'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-881' size-in-bits='576' id='type-id-882'> - <subrange length='3' type-id='type-id-2' id='type-id-883'/> + <array-type-def dimensions='1' type-id='type-id-883' size-in-bits='576' id='type-id-884'> + <subrange length='3' type-id='type-id-2' id='type-id-885'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='3200' id='type-id-884'> - <subrange length='100' type-id='type-id-2' id='type-id-885'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='3200' id='type-id-886'> + <subrange length='100' type-id='type-id-2' id='type-id-887'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='32' id='type-id-886'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='32' id='type-id-888'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='6400' id='type-id-887'> - <subrange length='200' type-id='type-id-2' id='type-id-856'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='6400' id='type-id-889'> + <subrange length='200' type-id='type-id-2' id='type-id-858'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='896' id='type-id-888'> - <subrange length='28' type-id='type-id-2' id='type-id-889'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='896' id='type-id-890'> + <subrange length='28' type-id='type-id-2' id='type-id-891'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-803' size-in-bits='64' id='type-id-890'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-805' size-in-bits='64' id='type-id-892'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <type-decl name='long int' size-in-bits='64' id='type-id-184'/> - <type-decl name='long long int' size-in-bits='64' id='type-id-463'/> - <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-462'/> - <array-type-def dimensions='1' type-id='type-id-484' size-in-bits='3840' id='type-id-891'> - <subrange length='10' type-id='type-id-2' id='type-id-892'/> + <type-decl name='long int' size-in-bits='64' id='type-id-188'/> + <type-decl name='long long int' size-in-bits='64' id='type-id-465'/> + <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-464'/> + <array-type-def dimensions='1' type-id='type-id-486' size-in-bits='3840' id='type-id-893'> + <subrange length='10' type-id='type-id-2' id='type-id-894'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-484' size-in-bits='76800' id='type-id-893'> - <subrange length='200' type-id='type-id-2' id='type-id-856'/> + <array-type-def dimensions='1' type-id='type-id-486' size-in-bits='76800' id='type-id-895'> + <subrange length='200' type-id='type-id-2' id='type-id-858'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-894' size-in-bits='4096' id='type-id-895'> - <subrange length='64' type-id='type-id-2' id='type-id-896'/> + <array-type-def dimensions='1' type-id='type-id-896' size-in-bits='4096' id='type-id-897'> + <subrange length='64' type-id='type-id-2' id='type-id-898'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-897' size-in-bits='640' id='type-id-898'> - <subrange length='10' type-id='type-id-2' id='type-id-892'/> + <array-type-def dimensions='1' type-id='type-id-899' size-in-bits='640' id='type-id-900'> + <subrange length='10' type-id='type-id-2' id='type-id-894'/> </array-type-def> - <type-decl name='short int' size-in-bits='16' id='type-id-84'/> - <type-decl name='signed char' size-in-bits='8' id='type-id-425'/> - <array-type-def dimensions='1' type-id='type-id-899' size-in-bits='124800' id='type-id-900'> - <subrange length='150' type-id='type-id-2' id='type-id-901'/> + <type-decl name='short int' size-in-bits='16' id='type-id-90'/> + <type-decl name='signed char' size-in-bits='8' id='type-id-427'/> + <array-type-def dimensions='1' type-id='type-id-901' size-in-bits='124800' id='type-id-902'> + <subrange length='150' type-id='type-id-2' id='type-id-903'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-902' size-in-bits='96' id='type-id-903'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-904' size-in-bits='96' id='type-id-905'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-904' size-in-bits='786432' id='type-id-905'> - <subrange length='4096' type-id='type-id-2' id='type-id-821'/> + <array-type-def dimensions='1' type-id='type-id-906' size-in-bits='786432' id='type-id-907'> + <subrange length='4096' type-id='type-id-2' id='type-id-823'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-322' size-in-bits='32' id='type-id-906'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-324' size-in-bits='32' id='type-id-908'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='80' id='type-id-907'> - <subrange length='10' type-id='type-id-2' id='type-id-892'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='80' id='type-id-909'> + <subrange length='10' type-id='type-id-2' id='type-id-894'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='88' id='type-id-908'> - <subrange length='11' type-id='type-id-2' id='type-id-909'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='88' id='type-id-910'> + <subrange length='11' type-id='type-id-2' id='type-id-911'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='96' id='type-id-910'> - <subrange length='12' type-id='type-id-2' id='type-id-911'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='96' id='type-id-912'> + <subrange length='12' type-id='type-id-2' id='type-id-913'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='104' id='type-id-912'> - <subrange length='13' type-id='type-id-2' id='type-id-913'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='104' id='type-id-914'> + <subrange length='13' type-id='type-id-2' id='type-id-915'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='112' id='type-id-914'> - <subrange length='14' type-id='type-id-2' id='type-id-915'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='112' id='type-id-916'> + <subrange length='14' type-id='type-id-2' id='type-id-917'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='120' id='type-id-916'> - <subrange length='15' type-id='type-id-2' id='type-id-917'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='120' id='type-id-918'> + <subrange length='15' type-id='type-id-2' id='type-id-919'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='128' id='type-id-918'> - <subrange length='16' type-id='type-id-2' id='type-id-70'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='128' id='type-id-920'> + <subrange length='16' type-id='type-id-2' id='type-id-76'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='136' id='type-id-919'> - <subrange length='17' type-id='type-id-2' id='type-id-920'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='136' id='type-id-921'> + <subrange length='17' type-id='type-id-2' id='type-id-922'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='144' id='type-id-921'> - <subrange length='18' type-id='type-id-2' id='type-id-922'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='144' id='type-id-923'> + <subrange length='18' type-id='type-id-2' id='type-id-924'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='152' id='type-id-923'> - <subrange length='19' type-id='type-id-2' id='type-id-819'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='152' id='type-id-925'> + <subrange length='19' type-id='type-id-2' id='type-id-821'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='8' id='type-id-924'> - <subrange length='1' type-id='type-id-2' id='type-id-321'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='8' id='type-id-926'> + <subrange length='1' type-id='type-id-2' id='type-id-323'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='160' id='type-id-925'> - <subrange length='20' type-id='type-id-2' id='type-id-825'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='160' id='type-id-927'> + <subrange length='20' type-id='type-id-2' id='type-id-827'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='168' id='type-id-926'> - <subrange length='21' type-id='type-id-2' id='type-id-927'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='168' id='type-id-928'> + <subrange length='21' type-id='type-id-2' id='type-id-929'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='176' id='type-id-928'> - <subrange length='22' type-id='type-id-2' id='type-id-929'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='176' id='type-id-930'> + <subrange length='22' type-id='type-id-2' id='type-id-931'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='184' id='type-id-930'> - <subrange length='23' type-id='type-id-2' id='type-id-931'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='184' id='type-id-932'> + <subrange length='23' type-id='type-id-2' id='type-id-933'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='192' id='type-id-932'> - <subrange length='24' type-id='type-id-2' id='type-id-933'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='192' id='type-id-934'> + <subrange length='24' type-id='type-id-2' id='type-id-935'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='200' id='type-id-934'> - <subrange length='25' type-id='type-id-2' id='type-id-935'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='200' id='type-id-936'> + <subrange length='25' type-id='type-id-2' id='type-id-937'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='208' id='type-id-936'> - <subrange length='26' type-id='type-id-2' id='type-id-937'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='208' id='type-id-938'> + <subrange length='26' type-id='type-id-2' id='type-id-939'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='224' id='type-id-938'> - <subrange length='28' type-id='type-id-2' id='type-id-889'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='224' id='type-id-940'> + <subrange length='28' type-id='type-id-2' id='type-id-891'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='16' id='type-id-939'> - <subrange length='2' type-id='type-id-2' id='type-id-500'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='16' id='type-id-941'> + <subrange length='2' type-id='type-id-2' id='type-id-502'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='248' id='type-id-940'> - <subrange length='31' type-id='type-id-2' id='type-id-941'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='248' id='type-id-942'> + <subrange length='31' type-id='type-id-2' id='type-id-943'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='288' id='type-id-942'> - <subrange length='36' type-id='type-id-2' id='type-id-496'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='288' id='type-id-944'> + <subrange length='36' type-id='type-id-2' id='type-id-498'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='24' id='type-id-943'> - <subrange length='3' type-id='type-id-2' id='type-id-883'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='24' id='type-id-945'> + <subrange length='3' type-id='type-id-2' id='type-id-885'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='32' id='type-id-944'> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='32' id='type-id-946'> <subrange length='4' type-id='type-id-2' id='type-id-228'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='40' id='type-id-945'> - <subrange length='5' type-id='type-id-2' id='type-id-816'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='40' id='type-id-947'> + <subrange length='5' type-id='type-id-2' id='type-id-818'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='48' id='type-id-946'> - <subrange length='6' type-id='type-id-2' id='type-id-477'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='48' id='type-id-948'> + <subrange length='6' type-id='type-id-2' id='type-id-479'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='56' id='type-id-947'> - <subrange length='7' type-id='type-id-2' id='type-id-948'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='56' id='type-id-949'> + <subrange length='7' type-id='type-id-2' id='type-id-950'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='64' id='type-id-949'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='64' id='type-id-951'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-309' size-in-bits='72' id='type-id-950'> - <subrange length='9' type-id='type-id-2' id='type-id-951'/> + <array-type-def dimensions='1' type-id='type-id-311' size-in-bits='72' id='type-id-952'> + <subrange length='9' type-id='type-id-2' id='type-id-953'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-369' size-in-bits='512' id='type-id-952'> - <subrange length='8' type-id='type-id-2' id='type-id-324'/> + <array-type-def dimensions='1' type-id='type-id-371' size-in-bits='512' id='type-id-954'> + <subrange length='8' type-id='type-id-2' id='type-id-326'/> </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-37'/> - <type-decl name='unsigned char' size-in-bits='8' id='type-id-95'/> - <type-decl name='unsigned int' size-in-bits='32' id='type-id-105'/> - <array-type-def dimensions='1' type-id='type-id-105' size-in-bits='64' id='type-id-953'> - <subrange length='2' type-id='type-id-2' id='type-id-500'/> + <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-43'/> + <type-decl name='unsigned char' size-in-bits='8' id='type-id-101'/> + <type-decl name='unsigned int' size-in-bits='32' id='type-id-111'/> + <array-type-def dimensions='1' type-id='type-id-111' size-in-bits='64' id='type-id-955'> + <subrange length='2' type-id='type-id-2' id='type-id-502'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='1024' id='type-id-954'> - <subrange length='16' type-id='type-id-2' id='type-id-70'/> + <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='1024' id='type-id-956'> + <subrange length='16' type-id='type-id-2' id='type-id-76'/> </array-type-def> - <type-decl name='unsigned short int' size-in-bits='16' id='type-id-22'/> + <type-decl name='unsigned short int' size-in-bits='16' id='type-id-28'/> <type-decl name='void' id='type-id-3'/> - <class-decl name='PyBytesObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-955' visibility='default' filepath='./Include/cpython/bytesobject.h' line='5' column='1' id='type-id-956'> + <class-decl name='PyBytesObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-957' visibility='default' filepath='./Include/cpython/bytesobject.h' line='5' column='1' id='type-id-958'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' 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-304' visibility='default' filepath='./Include/cpython/bytesobject.h' line='7' column='1'/> + <var-decl name='ob_shash' type-id='type-id-306' 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-371' visibility='default' filepath='./Include/cpython/bytesobject.h' line='8' column='1'/> + <var-decl name='ob_sval' type-id='type-id-373' visibility='default' filepath='./Include/cpython/bytesobject.h' line='8' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyBytesObject' type-id='type-id-956' filepath='./Include/cpython/bytesobject.h' line='15' column='1' id='type-id-955'/> - <class-decl name='_PyCoCached' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-957' visibility='default' filepath='./Include/cpython/code.h' line='11' column='1' id='type-id-958'> + <typedef-decl name='PyBytesObject' type-id='type-id-958' filepath='./Include/cpython/bytesobject.h' line='15' column='1' id='type-id-957'/> + <class-decl name='_PyCoCached' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-959' visibility='default' filepath='./Include/cpython/code.h' line='11' column='1' id='type-id-960'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='_co_code' type-id='type-id-6' visibility='default' filepath='./Include/cpython/code.h' line='12' column='1'/> </data-member> @@ -14818,8 +14844,8 @@ <var-decl name='_co_freevars' type-id='type-id-6' visibility='default' filepath='./Include/cpython/code.h' line='15' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyCoCached' type-id='type-id-958' filepath='./Include/cpython/code.h' line='16' column='1' id='type-id-957'/> - <class-decl name='_PyExecutorArray' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-372' visibility='default' filepath='./Include/cpython/code.h' line='18' column='1' id='type-id-373'> + <typedef-decl name='_PyCoCached' type-id='type-id-960' filepath='./Include/cpython/code.h' line='16' column='1' id='type-id-959'/> + <class-decl name='_PyExecutorArray' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-374' visibility='default' filepath='./Include/cpython/code.h' line='18' column='1' id='type-id-375'> <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='19' column='1'/> </data-member> @@ -14827,11 +14853,11 @@ <var-decl name='capacity' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='20' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='executors' type-id='type-id-374' visibility='default' filepath='./Include/cpython/code.h' line='21' column='1'/> + <var-decl name='executors' type-id='type-id-376' visibility='default' filepath='./Include/cpython/code.h' line='21' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyExecutorArray' type-id='type-id-373' filepath='./Include/cpython/code.h' line='22' column='1' id='type-id-372'/> - <class-decl name='PyCodeObject' size-in-bits='1728' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1' id='type-id-366'> + <typedef-decl name='_PyExecutorArray' type-id='type-id-375' filepath='./Include/cpython/code.h' line='22' column='1' id='type-id-374'/> + <class-decl name='PyCodeObject' size-in-bits='1728' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1' id='type-id-368'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> @@ -14878,7 +14904,7 @@ <var-decl name='co_nfreevars' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='co_version' type-id='type-id-322' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_version' type-id='type-id-324' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> <var-decl name='co_localsplusnames' type-id='type-id-6' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> @@ -14902,16 +14928,16 @@ <var-decl name='co_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='co_executors' type-id='type-id-367' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_executors' type-id='type-id-369' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_co_cached' type-id='type-id-368' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='_co_cached' type-id='type-id-370' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_co_instrumentation_version' type-id='type-id-369' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='_co_instrumentation_version' type-id='type-id-371' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_co_monitoring' type-id='type-id-370' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='_co_monitoring' type-id='type-id-372' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1472'> <var-decl name='_co_unique_id' type-id='type-id-7' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> @@ -14920,36 +14946,36 @@ <var-decl name='_co_firsttraceable' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='co_extra' type-id='type-id-35' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_extra' type-id='type-id-41' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='co_code_adaptive' type-id='type-id-371' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> + <var-decl name='co_code_adaptive' type-id='type-id-373' visibility='default' filepath='./Include/cpython/code.h' line='115' column='1'/> </data-member> </class-decl> - <enum-decl name='PyCodeEvent' naming-typedef-id='type-id-959' filepath='./Include/cpython/code.h' line='230' column='1' id='type-id-960'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='PyCodeEvent' naming-typedef-id='type-id-961' filepath='./Include/cpython/code.h' line='230' column='1' id='type-id-962'> + <underlying-type type-id='type-id-43'/> <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-960' filepath='./Include/cpython/code.h' line='234' column='1' id='type-id-959'/> - <typedef-decl name='PyCode_WatchCallback' type-id='type-id-961' filepath='./Include/cpython/code.h' line='246' column='1' id='type-id-362'/> - <class-decl name='Py_complex' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-360' visibility='default' filepath='./Include/cpython/complexobject.h' line='5' column='1' id='type-id-962'> + <typedef-decl name='PyCodeEvent' type-id='type-id-962' filepath='./Include/cpython/code.h' line='234' column='1' id='type-id-961'/> + <typedef-decl name='PyCode_WatchCallback' type-id='type-id-963' filepath='./Include/cpython/code.h' line='246' column='1' id='type-id-364'/> + <class-decl name='Py_complex' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-362' visibility='default' filepath='./Include/cpython/complexobject.h' line='5' column='1' id='type-id-964'> <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'/> + <var-decl name='real' type-id='type-id-178' 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'/> + <var-decl name='imag' type-id='type-id-178' visibility='default' filepath='./Include/cpython/complexobject.h' line='7' column='1'/> </data-member> </class-decl> - <typedef-decl name='Py_complex' type-id='type-id-962' filepath='./Include/cpython/complexobject.h' line='8' column='1' id='type-id-360'/> - <enum-decl name='PyContextEvent' naming-typedef-id='type-id-963' filepath='./Include/cpython/context.h' line='30' column='1' id='type-id-964'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='Py_complex' type-id='type-id-964' filepath='./Include/cpython/complexobject.h' line='8' column='1' id='type-id-362'/> + <enum-decl name='PyContextEvent' naming-typedef-id='type-id-965' filepath='./Include/cpython/context.h' line='30' column='1' id='type-id-966'> + <underlying-type type-id='type-id-43'/> <enumerator name='Py_CONTEXT_SWITCHED' value='1'/> </enum-decl> - <typedef-decl name='PyContextEvent' type-id='type-id-964' filepath='./Include/cpython/context.h' line='37' column='1' id='type-id-963'/> - <typedef-decl name='PyContext_WatchCallback' type-id='type-id-965' filepath='./Include/cpython/context.h' line='46' column='1' id='type-id-809'/> - <typedef-decl name='wrapperfunc' type-id='type-id-966' filepath='./Include/cpython/descrobject.h' line='5' column='1' id='type-id-967'/> - <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-380'> + <typedef-decl name='PyContextEvent' type-id='type-id-966' filepath='./Include/cpython/context.h' line='37' column='1' id='type-id-965'/> + <typedef-decl name='PyContext_WatchCallback' type-id='type-id-967' filepath='./Include/cpython/context.h' line='46' column='1' id='type-id-811'/> + <typedef-decl name='wrapperfunc' type-id='type-id-968' filepath='./Include/cpython/descrobject.h' line='5' column='1' id='type-id-969'/> + <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-382'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/descrobject.h' line='12' column='1'/> </data-member> @@ -14957,10 +14983,10 @@ <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-35' visibility='default' filepath='./Include/cpython/descrobject.h' line='14' column='1'/> + <var-decl name='function' type-id='type-id-41' 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-967' visibility='default' filepath='./Include/cpython/descrobject.h' line='15' column='1'/> + <var-decl name='wrapper' type-id='type-id-969' 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-4' visibility='default' filepath='./Include/cpython/descrobject.h' line='16' column='1'/> @@ -14972,8 +14998,8 @@ <var-decl name='name_strobj' type-id='type-id-6' visibility='default' filepath='./Include/cpython/descrobject.h' line='18' column='1'/> </data-member> </class-decl> - <enum-decl name='PyDict_WatchEvent' naming-typedef-id='type-id-399' filepath='./Include/cpython/dictobject.h' line='88' column='1' id='type-id-968'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='PyDict_WatchEvent' naming-typedef-id='type-id-401' filepath='./Include/cpython/dictobject.h' line='88' column='1' id='type-id-970'> + <underlying-type type-id='type-id-43'/> <enumerator name='PyDict_EVENT_ADDED' value='0'/> <enumerator name='PyDict_EVENT_MODIFIED' value='1'/> <enumerator name='PyDict_EVENT_DELETED' value='2'/> @@ -14981,12 +15007,12 @@ <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-968' filepath='./Include/cpython/dictobject.h' line='92' column='1' id='type-id-399'/> - <typedef-decl name='PyDict_WatchCallback' type-id='type-id-969' filepath='./Include/cpython/dictobject.h' line='97' column='1' id='type-id-398'/> - <typedef-decl name='Py_OpenCodeHookFunction' type-id='type-id-970' filepath='./Include/cpython/fileobject.h' line='12' column='1' id='type-id-402'/> - <class-decl name='PyFunctionObject' size-in-bits='1216' is-struct='yes' naming-typedef-id='type-id-971' visibility='default' filepath='./Include/cpython/funcobject.h' line='36' column='1' id='type-id-972'> + <typedef-decl name='PyDict_WatchEvent' type-id='type-id-970' filepath='./Include/cpython/dictobject.h' line='92' column='1' id='type-id-401'/> + <typedef-decl name='PyDict_WatchCallback' type-id='type-id-971' filepath='./Include/cpython/dictobject.h' line='97' column='1' id='type-id-400'/> + <typedef-decl name='Py_OpenCodeHookFunction' type-id='type-id-972' filepath='./Include/cpython/fileobject.h' line='12' column='1' id='type-id-404'/> + <class-decl name='PyFunctionObject' size-in-bits='1216' is-struct='yes' naming-typedef-id='type-id-973' visibility='default' filepath='./Include/cpython/funcobject.h' line='36' column='1' id='type-id-974'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/funcobject.h' line='37' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-6' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> @@ -15034,32 +15060,32 @@ <var-decl name='func_typeparams' type-id='type-id-6' 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='vectorcall' type-id='type-id-313' visibility='default' filepath='./Include/cpython/funcobject.h' line='46' column='1'/> + <var-decl name='vectorcall' type-id='type-id-315' visibility='default' filepath='./Include/cpython/funcobject.h' line='46' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='func_version' type-id='type-id-322' visibility='default' filepath='./Include/cpython/funcobject.h' line='55' column='1'/> + <var-decl name='func_version' type-id='type-id-324' visibility='default' filepath='./Include/cpython/funcobject.h' line='55' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyFunctionObject' type-id='type-id-972' filepath='./Include/cpython/funcobject.h' line='62' column='1' id='type-id-971'/> - <enum-decl name='PyFunction_WatchEvent' naming-typedef-id='type-id-973' filepath='./Include/cpython/funcobject.h' line='139' column='1' id='type-id-974'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='PyFunctionObject' type-id='type-id-974' filepath='./Include/cpython/funcobject.h' line='62' column='1' id='type-id-973'/> + <enum-decl name='PyFunction_WatchEvent' naming-typedef-id='type-id-975' filepath='./Include/cpython/funcobject.h' line='139' column='1' id='type-id-976'> + <underlying-type type-id='type-id-43'/> <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-974' filepath='./Include/cpython/funcobject.h' line='143' column='1' id='type-id-973'/> - <typedef-decl name='PyFunction_WatchCallback' type-id='type-id-975' filepath='./Include/cpython/funcobject.h' line='160' column='1' id='type-id-414'/> - <class-decl name='_inittab' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='5' column='1' id='type-id-976'> + <typedef-decl name='PyFunction_WatchEvent' type-id='type-id-976' filepath='./Include/cpython/funcobject.h' line='143' column='1' id='type-id-975'/> + <typedef-decl name='PyFunction_WatchCallback' type-id='type-id-977' filepath='./Include/cpython/funcobject.h' line='160' column='1' id='type-id-416'/> + <class-decl name='_inittab' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='5' column='1' id='type-id-978'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/import.h' line='6' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='initfunc' type-id='type-id-466' visibility='default' filepath='./Include/cpython/import.h' line='7' column='1'/> + <var-decl name='initfunc' type-id='type-id-468' visibility='default' filepath='./Include/cpython/import.h' line='7' column='1'/> </data-member> </class-decl> - <class-decl name='PyWideStringList' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-977' visibility='default' filepath='./Include/cpython/initconfig.h' line='31' column='1' id='type-id-978'> + <class-decl name='PyWideStringList' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-979' visibility='default' filepath='./Include/cpython/initconfig.h' line='31' column='1' id='type-id-980'> <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> @@ -15067,8 +15093,8 @@ <var-decl name='items' type-id='type-id-244' visibility='default' filepath='./Include/cpython/initconfig.h' line='35' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyWideStringList' type-id='type-id-978' filepath='./Include/cpython/initconfig.h' line='36' column='1' id='type-id-977'/> - <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-979'> + <typedef-decl name='PyWideStringList' type-id='type-id-980' filepath='./Include/cpython/initconfig.h' line='36' column='1' id='type-id-979'/> + <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-981'> <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> @@ -15100,8 +15126,8 @@ <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-979' filepath='./Include/cpython/initconfig.h' line='125' column='1' id='type-id-980'/> - <class-decl name='PyConfig' size-in-bits='3648' is-struct='yes' visibility='default' filepath='./Include/cpython/initconfig.h' line='134' column='1' id='type-id-981'> + <typedef-decl name='PyPreConfig' type-id='type-id-981' filepath='./Include/cpython/initconfig.h' line='125' column='1' id='type-id-982'/> + <class-decl name='PyConfig' size-in-bits='3648' is-struct='yes' visibility='default' filepath='./Include/cpython/initconfig.h' line='134' column='1' id='type-id-983'> <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> @@ -15148,34 +15174,34 @@ <var-decl name='dump_refs' type-id='type-id-5' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='151' column='1'/> + <var-decl name='dump_refs_file' type-id='type-id-69' 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-5' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='153' column='1'/> + <var-decl name='filesystem_encoding' type-id='type-id-69' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='154' column='1'/> + <var-decl name='filesystem_errors' type-id='type-id-69' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='155' column='1'/> + <var-decl name='pycache_prefix' type-id='type-id-69' 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-5' 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-977' visibility='default' filepath='./Include/cpython/initconfig.h' line='157' column='1'/> + <var-decl name='orig_argv' type-id='type-id-979' 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-977' visibility='default' filepath='./Include/cpython/initconfig.h' line='158' column='1'/> + <var-decl name='argv' type-id='type-id-979' 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-977' visibility='default' filepath='./Include/cpython/initconfig.h' line='159' column='1'/> + <var-decl name='xoptions' type-id='type-id-979' 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-977' visibility='default' filepath='./Include/cpython/initconfig.h' line='160' column='1'/> + <var-decl name='warnoptions' type-id='type-id-979' 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-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='161' column='1'/> @@ -15217,13 +15243,13 @@ <var-decl name='buffered_stdio' type-id='type-id-5' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='174' column='1'/> + <var-decl name='stdio_encoding' type-id='type-id-69' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='175' column='1'/> + <var-decl name='stdio_errors' type-id='type-id-69' 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-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='179' column='1'/> + <var-decl name='check_hash_pycs_mode' type-id='type-id-69' 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-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='180' column='1'/> @@ -15247,58 +15273,58 @@ <var-decl name='pathconfig_warnings' 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='2304'> - <var-decl name='program_name' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='197' column='1'/> + <var-decl name='program_name' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='197' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='pythonpath_env' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='198' column='1'/> + <var-decl name='pythonpath_env' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='198' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='home' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='199' column='1'/> + <var-decl name='home' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='199' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='platlibdir' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='200' column='1'/> + <var-decl name='platlibdir' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='200' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2560'> <var-decl name='module_search_paths_set' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='203' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='module_search_paths' type-id='type-id-977' visibility='default' filepath='./Include/cpython/initconfig.h' line='204' column='1'/> + <var-decl name='module_search_paths' type-id='type-id-979' visibility='default' filepath='./Include/cpython/initconfig.h' line='204' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2752'> - <var-decl name='stdlib_dir' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='205' column='1'/> + <var-decl name='stdlib_dir' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='205' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2816'> - <var-decl name='executable' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='206' column='1'/> + <var-decl name='executable' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='206' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2880'> - <var-decl name='base_executable' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='207' column='1'/> + <var-decl name='base_executable' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='207' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='prefix' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='208' column='1'/> + <var-decl name='prefix' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='208' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3008'> - <var-decl name='base_prefix' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='209' column='1'/> + <var-decl name='base_prefix' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='209' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='exec_prefix' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='210' column='1'/> + <var-decl name='exec_prefix' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='210' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3136'> - <var-decl name='base_exec_prefix' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='211' column='1'/> + <var-decl name='base_exec_prefix' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='211' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3200'> <var-decl name='skip_source_first_line' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='214' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3264'> - <var-decl name='run_command' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='215' column='1'/> + <var-decl name='run_command' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='215' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='run_module' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='216' column='1'/> + <var-decl name='run_module' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='216' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3392'> - <var-decl name='run_filename' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='217' column='1'/> + <var-decl name='run_filename' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='217' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3456'> - <var-decl name='sys_path_0' type-id='type-id-63' visibility='default' filepath='./Include/cpython/initconfig.h' line='220' column='1'/> + <var-decl name='sys_path_0' type-id='type-id-69' visibility='default' filepath='./Include/cpython/initconfig.h' line='220' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3520'> <var-decl name='_install_importlib' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='226' column='1'/> @@ -15310,43 +15336,43 @@ <var-decl name='_is_python_build' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='232' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyConfig' type-id='type-id-981' filepath='./Include/cpython/initconfig.h' line='244' column='1' id='type-id-272'/> - <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-982'> + <typedef-decl name='PyConfig' type-id='type-id-983' filepath='./Include/cpython/initconfig.h' line='244' column='1' id='type-id-274'/> + <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-984'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_bits' type-id='type-id-309' visibility='default' filepath='./Include/cpython/lock.h' line='30' column='1'/> + <var-decl name='_bits' type-id='type-id-311' visibility='default' filepath='./Include/cpython/lock.h' line='30' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyMutex' type-id='type-id-982' filepath='./Include/cpython/lock.h' line='31' column='1' id='type-id-752'/> - <typedef-decl name='digit' type-id='type-id-322' filepath='./Include/cpython/longintrepr.h' line='43' column='1' id='type-id-454'/> - <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-983'> + <typedef-decl name='PyMutex' type-id='type-id-984' filepath='./Include/cpython/lock.h' line='31' column='1' id='type-id-754'/> + <typedef-decl name='digit' type-id='type-id-324' filepath='./Include/cpython/longintrepr.h' line='43' column='1' id='type-id-456'/> + <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-985'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lv_tag' type-id='type-id-369' visibility='default' filepath='./Include/cpython/longintrepr.h' line='94' column='1'/> + <var-decl name='lv_tag' type-id='type-id-371' 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-873' visibility='default' filepath='./Include/cpython/longintrepr.h' line='95' column='1'/> + <var-decl name='ob_digit' type-id='type-id-875' visibility='default' filepath='./Include/cpython/longintrepr.h' line='95' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyLongValue' type-id='type-id-983' filepath='./Include/cpython/longintrepr.h' line='96' column='1' id='type-id-984'/> - <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-985'> + <typedef-decl name='_PyLongValue' type-id='type-id-985' filepath='./Include/cpython/longintrepr.h' line='96' column='1' id='type-id-986'/> + <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-987'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/longintrepr.h' line='99' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-984' visibility='default' filepath='./Include/cpython/longintrepr.h' line='100' column='1'/> + <var-decl name='long_value' type-id='type-id-986' 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-986' visibility='default' filepath='./Include/cpython/modsupport.h' line='7' column='1' id='type-id-987'> + <class-decl name='_PyOnceFlag' size-in-bits='8' is-struct='yes' naming-typedef-id='type-id-988' visibility='default' filepath='./Include/cpython/modsupport.h' line='7' column='1' id='type-id-989'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='type-id-309' visibility='default' filepath='./Include/cpython/modsupport.h' line='8' column='1'/> + <var-decl name='v' type-id='type-id-311' visibility='default' filepath='./Include/cpython/modsupport.h' line='8' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyOnceFlag' type-id='type-id-987' filepath='./Include/cpython/modsupport.h' line='9' column='1' id='type-id-986'/> - <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-988'> + <typedef-decl name='_PyOnceFlag' type-id='type-id-989' filepath='./Include/cpython/modsupport.h' line='9' column='1' id='type-id-988'/> + <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-990'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='format' type-id='type-id-4' 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-989' visibility='default' filepath='./Include/cpython/modsupport.h' line='13' column='1'/> + <var-decl name='keywords' type-id='type-id-991' 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-4' visibility='default' filepath='./Include/cpython/modsupport.h' line='14' column='1'/> @@ -15355,7 +15381,7 @@ <var-decl name='custom_msg' type-id='type-id-4' 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-986' visibility='default' filepath='./Include/cpython/modsupport.h' line='16' column='1'/> + <var-decl name='once' type-id='type-id-988' 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'/> @@ -15373,191 +15399,191 @@ <var-decl name='kwtuple' type-id='type-id-6' 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-276' visibility='default' filepath='./Include/cpython/modsupport.h' line='22' column='1'/> + <var-decl name='next' type-id='type-id-278' 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-593' visibility='default' filepath='./Include/cpython/object.h' line='61' column='1' id='type-id-990'> + <class-decl name='PyNumberMethods' size-in-bits='2304' is-struct='yes' naming-typedef-id='type-id-595' visibility='default' filepath='./Include/cpython/object.h' line='61' column='1' id='type-id-992'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='nb_add' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='66' column='1'/> + <var-decl name='nb_add' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='nb_subtract' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='67' column='1'/> + <var-decl name='nb_subtract' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='67' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='nb_multiply' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='68' column='1'/> + <var-decl name='nb_multiply' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='nb_remainder' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='69' column='1'/> + <var-decl name='nb_remainder' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='69' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='nb_divmod' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='70' column='1'/> + <var-decl name='nb_divmod' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='nb_power' type-id='type-id-992' visibility='default' filepath='./Include/cpython/object.h' line='71' column='1'/> + <var-decl name='nb_power' type-id='type-id-994' visibility='default' filepath='./Include/cpython/object.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='nb_negative' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='72' column='1'/> + <var-decl name='nb_negative' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='72' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='nb_positive' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='73' column='1'/> + <var-decl name='nb_positive' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='73' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='nb_absolute' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='74' column='1'/> + <var-decl name='nb_absolute' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='74' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='nb_bool' type-id='type-id-317' visibility='default' filepath='./Include/cpython/object.h' line='75' column='1'/> + <var-decl name='nb_bool' type-id='type-id-319' visibility='default' filepath='./Include/cpython/object.h' line='75' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='nb_invert' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='76' column='1'/> + <var-decl name='nb_invert' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='nb_lshift' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='77' column='1'/> + <var-decl name='nb_lshift' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='77' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='nb_rshift' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='78' column='1'/> + <var-decl name='nb_rshift' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='nb_and' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='79' column='1'/> + <var-decl name='nb_and' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='79' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='nb_xor' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='80' column='1'/> + <var-decl name='nb_xor' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='80' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='nb_or' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='81' column='1'/> + <var-decl name='nb_or' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='81' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='nb_int' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='82' column='1'/> + <var-decl name='nb_int' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='82' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='nb_reserved' type-id='type-id-35' visibility='default' filepath='./Include/cpython/object.h' line='83' column='1'/> + <var-decl name='nb_reserved' type-id='type-id-41' visibility='default' filepath='./Include/cpython/object.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='nb_float' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='84' column='1'/> + <var-decl name='nb_float' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='84' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='nb_inplace_add' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='86' column='1'/> + <var-decl name='nb_inplace_add' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='nb_inplace_subtract' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='87' column='1'/> + <var-decl name='nb_inplace_subtract' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='87' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='nb_inplace_multiply' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='88' column='1'/> + <var-decl name='nb_inplace_multiply' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='88' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='nb_inplace_remainder' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='89' column='1'/> + <var-decl name='nb_inplace_remainder' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='89' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='nb_inplace_power' type-id='type-id-992' visibility='default' filepath='./Include/cpython/object.h' line='90' column='1'/> + <var-decl name='nb_inplace_power' type-id='type-id-994' visibility='default' filepath='./Include/cpython/object.h' line='90' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='nb_inplace_lshift' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='91' column='1'/> + <var-decl name='nb_inplace_lshift' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='91' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='nb_inplace_rshift' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='92' column='1'/> + <var-decl name='nb_inplace_rshift' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='nb_inplace_and' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='93' column='1'/> + <var-decl name='nb_inplace_and' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='nb_inplace_xor' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='94' column='1'/> + <var-decl name='nb_inplace_xor' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='94' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='nb_inplace_or' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='95' column='1'/> + <var-decl name='nb_inplace_or' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='95' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='nb_floor_divide' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='97' column='1'/> + <var-decl name='nb_floor_divide' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='97' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='nb_true_divide' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='98' column='1'/> + <var-decl name='nb_true_divide' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='98' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='nb_inplace_floor_divide' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='99' column='1'/> + <var-decl name='nb_inplace_floor_divide' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='99' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='nb_inplace_true_divide' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='100' column='1'/> + <var-decl name='nb_inplace_true_divide' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='100' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='nb_index' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='102' column='1'/> + <var-decl name='nb_index' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='102' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='nb_matrix_multiply' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='104' column='1'/> + <var-decl name='nb_matrix_multiply' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='104' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='nb_inplace_matrix_multiply' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='105' column='1'/> + <var-decl name='nb_inplace_matrix_multiply' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='105' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyNumberMethods' type-id='type-id-990' filepath='./Include/cpython/object.h' line='106' column='1' id='type-id-593'/> - <class-decl name='PySequenceMethods' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-595' visibility='default' filepath='./Include/cpython/object.h' line='108' column='1' id='type-id-994'> + <typedef-decl name='PyNumberMethods' type-id='type-id-992' filepath='./Include/cpython/object.h' line='106' column='1' id='type-id-595'/> + <class-decl name='PySequenceMethods' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-597' visibility='default' filepath='./Include/cpython/object.h' line='108' column='1' id='type-id-996'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sq_length' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='109' column='1'/> + <var-decl name='sq_length' type-id='type-id-997' visibility='default' filepath='./Include/cpython/object.h' line='109' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='sq_concat' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='110' column='1'/> + <var-decl name='sq_concat' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='110' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='sq_repeat' type-id='type-id-996' visibility='default' filepath='./Include/cpython/object.h' line='111' column='1'/> + <var-decl name='sq_repeat' type-id='type-id-998' visibility='default' filepath='./Include/cpython/object.h' line='111' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='sq_item' type-id='type-id-996' visibility='default' filepath='./Include/cpython/object.h' line='112' column='1'/> + <var-decl name='sq_item' type-id='type-id-998' visibility='default' filepath='./Include/cpython/object.h' line='112' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='was_sq_slice' type-id='type-id-35' visibility='default' filepath='./Include/cpython/object.h' line='113' column='1'/> + <var-decl name='was_sq_slice' type-id='type-id-41' visibility='default' filepath='./Include/cpython/object.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='sq_ass_item' type-id='type-id-997' visibility='default' filepath='./Include/cpython/object.h' line='114' column='1'/> + <var-decl name='sq_ass_item' type-id='type-id-999' visibility='default' filepath='./Include/cpython/object.h' line='114' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='was_sq_ass_slice' type-id='type-id-35' visibility='default' filepath='./Include/cpython/object.h' line='115' column='1'/> + <var-decl name='was_sq_ass_slice' type-id='type-id-41' visibility='default' filepath='./Include/cpython/object.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='sq_contains' type-id='type-id-998' visibility='default' filepath='./Include/cpython/object.h' line='116' column='1'/> + <var-decl name='sq_contains' type-id='type-id-1000' visibility='default' filepath='./Include/cpython/object.h' line='116' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='sq_inplace_concat' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='118' column='1'/> + <var-decl name='sq_inplace_concat' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='118' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='sq_inplace_repeat' type-id='type-id-996' visibility='default' filepath='./Include/cpython/object.h' line='119' column='1'/> + <var-decl name='sq_inplace_repeat' type-id='type-id-998' visibility='default' filepath='./Include/cpython/object.h' line='119' column='1'/> </data-member> </class-decl> - <typedef-decl name='PySequenceMethods' type-id='type-id-994' filepath='./Include/cpython/object.h' line='120' column='1' id='type-id-595'/> - <class-decl name='PyMappingMethods' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-594' visibility='default' filepath='./Include/cpython/object.h' line='122' column='1' id='type-id-999'> + <typedef-decl name='PySequenceMethods' type-id='type-id-996' filepath='./Include/cpython/object.h' line='120' column='1' id='type-id-597'/> + <class-decl name='PyMappingMethods' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-596' visibility='default' filepath='./Include/cpython/object.h' line='122' column='1' id='type-id-1001'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mp_length' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='123' column='1'/> + <var-decl name='mp_length' type-id='type-id-997' visibility='default' filepath='./Include/cpython/object.h' line='123' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mp_subscript' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='124' column='1'/> + <var-decl name='mp_subscript' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='124' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mp_ass_subscript' type-id='type-id-1000' visibility='default' filepath='./Include/cpython/object.h' line='125' column='1'/> + <var-decl name='mp_ass_subscript' type-id='type-id-1002' visibility='default' filepath='./Include/cpython/object.h' line='125' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyMappingMethods' type-id='type-id-999' filepath='./Include/cpython/object.h' line='126' column='1' id='type-id-594'/> - <typedef-decl name='sendfunc' type-id='type-id-1001' filepath='./Include/cpython/object.h' line='128' column='1' id='type-id-1002'/> - <class-decl name='PyAsyncMethods' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-592' visibility='default' filepath='./Include/cpython/object.h' line='130' column='1' id='type-id-1003'> + <typedef-decl name='PyMappingMethods' type-id='type-id-1001' filepath='./Include/cpython/object.h' line='126' column='1' id='type-id-596'/> + <typedef-decl name='sendfunc' type-id='type-id-1003' filepath='./Include/cpython/object.h' line='128' column='1' id='type-id-1004'/> + <class-decl name='PyAsyncMethods' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-594' visibility='default' filepath='./Include/cpython/object.h' line='130' column='1' id='type-id-1005'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='am_await' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='131' column='1'/> + <var-decl name='am_await' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='am_aiter' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='132' column='1'/> + <var-decl name='am_aiter' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='am_anext' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='133' column='1'/> + <var-decl name='am_anext' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='133' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='am_send' type-id='type-id-1002' visibility='default' filepath='./Include/cpython/object.h' line='134' column='1'/> + <var-decl name='am_send' type-id='type-id-1004' visibility='default' filepath='./Include/cpython/object.h' line='134' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyAsyncMethods' type-id='type-id-1003' filepath='./Include/cpython/object.h' line='135' column='1' id='type-id-592'/> - <class-decl name='PyBufferProcs' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-596' visibility='default' filepath='./Include/cpython/object.h' line='137' column='1' id='type-id-1004'> + <typedef-decl name='PyAsyncMethods' type-id='type-id-1005' filepath='./Include/cpython/object.h' line='135' column='1' id='type-id-594'/> + <class-decl name='PyBufferProcs' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-598' visibility='default' filepath='./Include/cpython/object.h' line='137' column='1' id='type-id-1006'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='bf_getbuffer' type-id='type-id-601' visibility='default' filepath='./Include/cpython/object.h' line='138' column='1'/> + <var-decl name='bf_getbuffer' type-id='type-id-603' visibility='default' filepath='./Include/cpython/object.h' line='138' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bf_releasebuffer' type-id='type-id-1005' visibility='default' filepath='./Include/cpython/object.h' line='139' column='1'/> + <var-decl name='bf_releasebuffer' type-id='type-id-1007' visibility='default' filepath='./Include/cpython/object.h' line='139' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyBufferProcs' type-id='type-id-1004' filepath='./Include/cpython/object.h' line='140' column='1' id='type-id-596'/> - <class-decl name='_typeobject' size-in-bits='3328' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='148' column='1' id='type-id-1006'> + <typedef-decl name='PyBufferProcs' type-id='type-id-1006' filepath='./Include/cpython/object.h' line='140' column='1' id='type-id-598'/> + <class-decl name='_typeobject' size-in-bits='3328' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='148' column='1' id='type-id-1008'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/cpython/object.h' line='149' column='1'/> </data-member> @@ -15571,49 +15597,49 @@ <var-decl name='tp_itemsize' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='151' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='tp_dealloc' type-id='type-id-1007' visibility='default' filepath='./Include/cpython/object.h' line='155' column='1'/> + <var-decl name='tp_dealloc' type-id='type-id-1009' visibility='default' filepath='./Include/cpython/object.h' line='155' 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='156' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='tp_getattr' type-id='type-id-1008' visibility='default' filepath='./Include/cpython/object.h' line='157' column='1'/> + <var-decl name='tp_getattr' type-id='type-id-1010' visibility='default' filepath='./Include/cpython/object.h' line='157' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='tp_setattr' type-id='type-id-1009' visibility='default' filepath='./Include/cpython/object.h' line='158' column='1'/> + <var-decl name='tp_setattr' type-id='type-id-1011' visibility='default' filepath='./Include/cpython/object.h' line='158' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='tp_as_async' type-id='type-id-1010' visibility='default' filepath='./Include/cpython/object.h' line='159' column='1'/> + <var-decl name='tp_as_async' type-id='type-id-1012' visibility='default' filepath='./Include/cpython/object.h' line='159' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='tp_repr' type-id='type-id-1011' visibility='default' filepath='./Include/cpython/object.h' line='161' column='1'/> + <var-decl name='tp_repr' type-id='type-id-1013' visibility='default' filepath='./Include/cpython/object.h' line='161' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='tp_as_number' type-id='type-id-1012' visibility='default' filepath='./Include/cpython/object.h' line='165' column='1'/> + <var-decl name='tp_as_number' type-id='type-id-1014' visibility='default' filepath='./Include/cpython/object.h' line='165' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='tp_as_sequence' type-id='type-id-1013' visibility='default' filepath='./Include/cpython/object.h' line='166' column='1'/> + <var-decl name='tp_as_sequence' type-id='type-id-1015' visibility='default' filepath='./Include/cpython/object.h' line='166' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='tp_as_mapping' type-id='type-id-1014' visibility='default' filepath='./Include/cpython/object.h' line='167' column='1'/> + <var-decl name='tp_as_mapping' type-id='type-id-1016' visibility='default' filepath='./Include/cpython/object.h' line='167' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='tp_hash' type-id='type-id-1015' visibility='default' filepath='./Include/cpython/object.h' line='171' column='1'/> + <var-decl name='tp_hash' type-id='type-id-1017' visibility='default' filepath='./Include/cpython/object.h' line='171' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='tp_call' type-id='type-id-992' visibility='default' filepath='./Include/cpython/object.h' line='172' column='1'/> + <var-decl name='tp_call' type-id='type-id-994' visibility='default' filepath='./Include/cpython/object.h' line='172' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='tp_str' type-id='type-id-1011' visibility='default' filepath='./Include/cpython/object.h' line='173' column='1'/> + <var-decl name='tp_str' type-id='type-id-1013' visibility='default' filepath='./Include/cpython/object.h' line='173' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='tp_getattro' type-id='type-id-1016' visibility='default' filepath='./Include/cpython/object.h' line='174' column='1'/> + <var-decl name='tp_getattro' type-id='type-id-1018' visibility='default' filepath='./Include/cpython/object.h' line='174' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='tp_setattro' type-id='type-id-1017' visibility='default' filepath='./Include/cpython/object.h' line='175' column='1'/> + <var-decl name='tp_setattro' type-id='type-id-1019' visibility='default' filepath='./Include/cpython/object.h' line='175' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='tp_as_buffer' type-id='type-id-1018' visibility='default' filepath='./Include/cpython/object.h' line='178' column='1'/> + <var-decl name='tp_as_buffer' type-id='type-id-1020' visibility='default' filepath='./Include/cpython/object.h' line='178' 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='181' column='1'/> @@ -15622,31 +15648,31 @@ <var-decl name='tp_doc' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='183' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='tp_traverse' type-id='type-id-316' visibility='default' filepath='./Include/cpython/object.h' line='187' column='1'/> + <var-decl name='tp_traverse' type-id='type-id-318' visibility='default' filepath='./Include/cpython/object.h' line='187' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='tp_clear' type-id='type-id-317' visibility='default' filepath='./Include/cpython/object.h' line='190' column='1'/> + <var-decl name='tp_clear' type-id='type-id-319' visibility='default' filepath='./Include/cpython/object.h' line='190' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='tp_richcompare' type-id='type-id-1019' visibility='default' filepath='./Include/cpython/object.h' line='194' column='1'/> + <var-decl name='tp_richcompare' type-id='type-id-1021' visibility='default' filepath='./Include/cpython/object.h' line='194' 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='197' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='tp_iter' type-id='type-id-1020' visibility='default' filepath='./Include/cpython/object.h' line='200' column='1'/> + <var-decl name='tp_iter' type-id='type-id-1022' visibility='default' filepath='./Include/cpython/object.h' line='200' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='tp_iternext' type-id='type-id-1021' visibility='default' filepath='./Include/cpython/object.h' line='201' column='1'/> + <var-decl name='tp_iternext' type-id='type-id-1023' visibility='default' filepath='./Include/cpython/object.h' line='201' 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='204' column='1'/> + <var-decl name='tp_methods' type-id='type-id-182' visibility='default' filepath='./Include/cpython/object.h' line='204' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='tp_members' type-id='type-id-382' visibility='default' filepath='./Include/cpython/object.h' line='205' column='1'/> + <var-decl name='tp_members' type-id='type-id-384' visibility='default' filepath='./Include/cpython/object.h' line='205' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='tp_getset' type-id='type-id-383' visibility='default' filepath='./Include/cpython/object.h' line='206' column='1'/> + <var-decl name='tp_getset' type-id='type-id-385' visibility='default' filepath='./Include/cpython/object.h' line='206' 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='208' column='1'/> @@ -15655,28 +15681,28 @@ <var-decl name='tp_dict' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='209' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='tp_descr_get' type-id='type-id-1022' visibility='default' filepath='./Include/cpython/object.h' line='210' column='1'/> + <var-decl name='tp_descr_get' type-id='type-id-1024' visibility='default' filepath='./Include/cpython/object.h' line='210' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='tp_descr_set' type-id='type-id-1023' visibility='default' filepath='./Include/cpython/object.h' line='211' column='1'/> + <var-decl name='tp_descr_set' type-id='type-id-1025' visibility='default' filepath='./Include/cpython/object.h' line='211' 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='212' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='tp_init' type-id='type-id-1024' visibility='default' filepath='./Include/cpython/object.h' line='213' column='1'/> + <var-decl name='tp_init' type-id='type-id-1026' visibility='default' filepath='./Include/cpython/object.h' line='213' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='tp_alloc' type-id='type-id-1025' visibility='default' filepath='./Include/cpython/object.h' line='214' column='1'/> + <var-decl name='tp_alloc' type-id='type-id-1027' visibility='default' filepath='./Include/cpython/object.h' line='214' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='tp_new' type-id='type-id-1026' visibility='default' filepath='./Include/cpython/object.h' line='215' column='1'/> + <var-decl name='tp_new' type-id='type-id-1028' visibility='default' filepath='./Include/cpython/object.h' line='215' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2560'> - <var-decl name='tp_free' type-id='type-id-471' visibility='default' filepath='./Include/cpython/object.h' line='216' column='1'/> + <var-decl name='tp_free' type-id='type-id-473' visibility='default' filepath='./Include/cpython/object.h' line='216' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='tp_is_gc' type-id='type-id-317' visibility='default' filepath='./Include/cpython/object.h' line='217' column='1'/> + <var-decl name='tp_is_gc' type-id='type-id-319' visibility='default' filepath='./Include/cpython/object.h' line='217' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2688'> <var-decl name='tp_bases' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='218' column='1'/> @@ -15688,53 +15714,53 @@ <var-decl name='tp_cache' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='220' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2880'> - <var-decl name='tp_subclasses' type-id='type-id-35' visibility='default' filepath='./Include/cpython/object.h' line='221' column='1'/> + <var-decl name='tp_subclasses' type-id='type-id-41' visibility='default' filepath='./Include/cpython/object.h' line='221' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2944'> <var-decl name='tp_weaklist' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='222' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3008'> - <var-decl name='tp_del' type-id='type-id-1007' visibility='default' filepath='./Include/cpython/object.h' line='223' column='1'/> + <var-decl name='tp_del' type-id='type-id-1009' visibility='default' filepath='./Include/cpython/object.h' line='223' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='tp_version_tag' type-id='type-id-105' visibility='default' filepath='./Include/cpython/object.h' line='228' column='1'/> + <var-decl name='tp_version_tag' type-id='type-id-111' visibility='default' filepath='./Include/cpython/object.h' line='228' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3136'> - <var-decl name='tp_finalize' type-id='type-id-1007' visibility='default' filepath='./Include/cpython/object.h' line='230' column='1'/> + <var-decl name='tp_finalize' type-id='type-id-1009' visibility='default' filepath='./Include/cpython/object.h' line='230' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='tp_vectorcall' type-id='type-id-313' visibility='default' filepath='./Include/cpython/object.h' line='231' column='1'/> + <var-decl name='tp_vectorcall' type-id='type-id-315' visibility='default' filepath='./Include/cpython/object.h' line='231' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3264'> - <var-decl name='tp_watched' type-id='type-id-95' visibility='default' filepath='./Include/cpython/object.h' line='234' column='1'/> + <var-decl name='tp_watched' type-id='type-id-101' visibility='default' filepath='./Include/cpython/object.h' line='234' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3280'> - <var-decl name='tp_versions_used' type-id='type-id-348' visibility='default' filepath='./Include/cpython/object.h' line='241' column='1'/> + <var-decl name='tp_versions_used' type-id='type-id-350' visibility='default' filepath='./Include/cpython/object.h' line='241' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyType_WatchCallback' type-id='type-id-1027' filepath='./Include/cpython/object.h' line='449' column='1' id='type-id-602'/> - <enum-decl name='PyRefTracerEvent' naming-typedef-id='type-id-1028' filepath='./Include/cpython/object.h' line='463' column='1' id='type-id-1029'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='PyType_WatchCallback' type-id='type-id-1029' filepath='./Include/cpython/object.h' line='449' column='1' id='type-id-604'/> + <enum-decl name='PyRefTracerEvent' naming-typedef-id='type-id-1030' filepath='./Include/cpython/object.h' line='463' column='1' id='type-id-1031'> + <underlying-type type-id='type-id-43'/> <enumerator name='PyRefTracer_CREATE' value='0'/> <enumerator name='PyRefTracer_DESTROY' value='1'/> </enum-decl> - <typedef-decl name='PyRefTracerEvent' type-id='type-id-1029' filepath='./Include/cpython/object.h' line='466' column='1' id='type-id-1028'/> - <typedef-decl name='PyRefTracer' type-id='type-id-1030' filepath='./Include/cpython/object.h' line='468' column='1' id='type-id-487'/> - <class-decl name='PyObjectArenaAllocator' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-565' visibility='default' filepath='./Include/cpython/objimpl.h' line='59' column='1' id='type-id-1031'> + <typedef-decl name='PyRefTracerEvent' type-id='type-id-1031' filepath='./Include/cpython/object.h' line='466' column='1' id='type-id-1030'/> + <typedef-decl name='PyRefTracer' type-id='type-id-1032' filepath='./Include/cpython/object.h' line='468' column='1' id='type-id-489'/> + <class-decl name='PyObjectArenaAllocator' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-567' visibility='default' filepath='./Include/cpython/objimpl.h' line='59' column='1' id='type-id-1033'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ctx' type-id='type-id-35' visibility='default' filepath='./Include/cpython/objimpl.h' line='61' column='1'/> + <var-decl name='ctx' type-id='type-id-41' 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-1032' visibility='default' filepath='./Include/cpython/objimpl.h' line='64' column='1'/> + <var-decl name='alloc' type-id='type-id-1034' 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-1033' visibility='default' filepath='./Include/cpython/objimpl.h' line='67' column='1'/> + <var-decl name='free' type-id='type-id-1035' visibility='default' filepath='./Include/cpython/objimpl.h' line='67' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyObjectArenaAllocator' type-id='type-id-1031' filepath='./Include/cpython/objimpl.h' line='68' column='1' id='type-id-565'/> - <class-decl name='PyBaseExceptionObject' size-in-bits='576' is-struct='yes' naming-typedef-id='type-id-1034' visibility='default' filepath='./Include/cpython/pyerrors.h' line='13' column='1' id='type-id-1035'> + <typedef-decl name='PyObjectArenaAllocator' type-id='type-id-1033' filepath='./Include/cpython/objimpl.h' line='68' column='1' id='type-id-567'/> + <class-decl name='PyBaseExceptionObject' size-in-bits='576' is-struct='yes' naming-typedef-id='type-id-1036' visibility='default' filepath='./Include/cpython/pyerrors.h' line='13' column='1' id='type-id-1037'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-6' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> @@ -15755,78 +15781,78 @@ <var-decl name='cause' type-id='type-id-6' 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-58' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + <var-decl name='suppress_context' type-id='type-id-64' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyBaseExceptionObject' type-id='type-id-1035' filepath='./Include/cpython/pyerrors.h' line='15' column='1' id='type-id-1034'/> - <typedef-decl name='atexit_datacallbackfunc' type-id='type-id-572' filepath='./Include/cpython/pylifecycle.h' line='87' column='1' id='type-id-34'/> - <class-decl name='PyMemAllocatorEx' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-563' visibility='default' filepath='./Include/cpython/pymem.h' line='33' column='1' id='type-id-1036'> + <typedef-decl name='PyBaseExceptionObject' type-id='type-id-1037' filepath='./Include/cpython/pyerrors.h' line='15' column='1' id='type-id-1036'/> + <typedef-decl name='atexit_datacallbackfunc' type-id='type-id-574' filepath='./Include/cpython/pylifecycle.h' line='87' column='1' id='type-id-40'/> + <class-decl name='PyMemAllocatorEx' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-565' visibility='default' filepath='./Include/cpython/pymem.h' line='33' column='1' id='type-id-1038'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ctx' type-id='type-id-35' visibility='default' filepath='./Include/cpython/pymem.h' line='35' column='1'/> + <var-decl name='ctx' type-id='type-id-41' 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-1032' visibility='default' filepath='./Include/cpython/pymem.h' line='38' column='1'/> + <var-decl name='malloc' type-id='type-id-1034' 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-1037' visibility='default' filepath='./Include/cpython/pymem.h' line='41' column='1'/> + <var-decl name='calloc' type-id='type-id-1039' 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-1038' visibility='default' filepath='./Include/cpython/pymem.h' line='44' column='1'/> + <var-decl name='realloc' type-id='type-id-1040' 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-1039' visibility='default' filepath='./Include/cpython/pymem.h' line='47' column='1'/> + <var-decl name='free' type-id='type-id-1041' visibility='default' filepath='./Include/cpython/pymem.h' line='47' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyMemAllocatorEx' type-id='type-id-1036' filepath='./Include/cpython/pymem.h' line='48' column='1' id='type-id-563'/> - <typedef-decl name='Py_tracefunc' type-id='type-id-1040' filepath='./Include/cpython/pystate.h' line='14' column='1' id='type-id-1041'/> - <class-decl name='_PyRemoteDebuggerSupport' size-in-bits='4128' is-struct='yes' naming-typedef-id='type-id-1042' visibility='default' filepath='./Include/cpython/pystate.h' line='32' column='1' id='type-id-1043'> + <typedef-decl name='PyMemAllocatorEx' type-id='type-id-1038' filepath='./Include/cpython/pymem.h' line='48' column='1' id='type-id-565'/> + <typedef-decl name='Py_tracefunc' type-id='type-id-1042' filepath='./Include/cpython/pystate.h' line='14' column='1' id='type-id-1043'/> + <class-decl name='_PyRemoteDebuggerSupport' size-in-bits='4128' is-struct='yes' naming-typedef-id='type-id-1044' visibility='default' filepath='./Include/cpython/pystate.h' line='32' column='1' id='type-id-1045'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='debugger_pending_call' type-id='type-id-456' visibility='default' filepath='./Include/cpython/pystate.h' line='33' column='1'/> + <var-decl name='debugger_pending_call' type-id='type-id-458' visibility='default' filepath='./Include/cpython/pystate.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='debugger_script_path' type-id='type-id-302' visibility='default' filepath='./Include/cpython/pystate.h' line='34' column='1'/> + <var-decl name='debugger_script_path' type-id='type-id-304' visibility='default' filepath='./Include/cpython/pystate.h' line='34' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyRemoteDebuggerSupport' type-id='type-id-1043' filepath='./Include/cpython/pystate.h' line='35' column='1' id='type-id-1042'/> - <class-decl name='_err_stackitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='37' column='1' id='type-id-1044'> + <typedef-decl name='_PyRemoteDebuggerSupport' type-id='type-id-1045' filepath='./Include/cpython/pystate.h' line='35' column='1' id='type-id-1044'/> + <class-decl name='_err_stackitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='37' column='1' id='type-id-1046'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='exc_value' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='51' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous_item' type-id='type-id-1045' visibility='default' filepath='./Include/cpython/pystate.h' line='53' column='1'/> + <var-decl name='previous_item' type-id='type-id-1047' visibility='default' filepath='./Include/cpython/pystate.h' line='53' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyErr_StackItem' type-id='type-id-1044' filepath='./Include/cpython/pystate.h' line='55' column='1' id='type-id-420'/> - <class-decl name='_stack_chunk' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='57' column='1' id='type-id-1046'> + <typedef-decl name='_PyErr_StackItem' type-id='type-id-1046' filepath='./Include/cpython/pystate.h' line='55' column='1' id='type-id-422'/> + <class-decl name='_stack_chunk' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='57' column='1' id='type-id-1048'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='previous' type-id='type-id-1047' visibility='default' filepath='./Include/cpython/pystate.h' line='58' column='1'/> + <var-decl name='previous' type-id='type-id-1049' visibility='default' filepath='./Include/cpython/pystate.h' line='58' 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='59' column='1'/> + <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/cpython/pystate.h' line='59' 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='60' column='1'/> + <var-decl name='top' type-id='type-id-14' visibility='default' filepath='./Include/cpython/pystate.h' line='60' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='data' type-id='type-id-393' visibility='default' filepath='./Include/cpython/pystate.h' line='61' column='1'/> + <var-decl name='data' type-id='type-id-395' visibility='default' filepath='./Include/cpython/pystate.h' line='61' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyStackChunk' type-id='type-id-1046' filepath='./Include/cpython/pystate.h' line='62' column='1' id='type-id-1048'/> - <class-decl name='_ts' size-in-bits='6592' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='66' column='1' id='type-id-1049'> + <typedef-decl name='_PyStackChunk' type-id='type-id-1048' filepath='./Include/cpython/pystate.h' line='62' column='1' id='type-id-1050'/> + <class-decl name='_ts' size-in-bits='6592' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='66' column='1' id='type-id-1051'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='prev' type-id='type-id-31' visibility='default' filepath='./Include/cpython/pystate.h' line='69' column='1'/> + <var-decl name='prev' type-id='type-id-37' visibility='default' filepath='./Include/cpython/pystate.h' line='69' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='next' type-id='type-id-31' visibility='default' filepath='./Include/cpython/pystate.h' line='70' column='1'/> + <var-decl name='next' type-id='type-id-37' visibility='default' filepath='./Include/cpython/pystate.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='interp' type-id='type-id-33' visibility='default' filepath='./Include/cpython/pystate.h' line='71' column='1'/> + <var-decl name='interp' type-id='type-id-39' visibility='default' filepath='./Include/cpython/pystate.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='eval_breaker' type-id='type-id-369' visibility='default' filepath='./Include/cpython/pystate.h' line='76' column='1'/> + <var-decl name='eval_breaker' type-id='type-id-371' visibility='default' filepath='./Include/cpython/pystate.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_status' type-id='type-id-1050' visibility='default' filepath='./Include/cpython/pystate.h' line='101' column='1'/> + <var-decl name='_status' type-id='type-id-1052' visibility='default' filepath='./Include/cpython/pystate.h' line='101' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='288'> <var-decl name='holds_gil' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='113' column='1'/> @@ -15853,13 +15879,13 @@ <var-decl name='what_event' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='129' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='current_frame' type-id='type-id-431' visibility='default' filepath='./Include/cpython/pystate.h' line='132' column='1'/> + <var-decl name='current_frame' type-id='type-id-433' visibility='default' filepath='./Include/cpython/pystate.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='c_profilefunc' type-id='type-id-1041' visibility='default' filepath='./Include/cpython/pystate.h' line='134' column='1'/> + <var-decl name='c_profilefunc' type-id='type-id-1043' visibility='default' filepath='./Include/cpython/pystate.h' line='134' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='c_tracefunc' type-id='type-id-1041' visibility='default' filepath='./Include/cpython/pystate.h' line='135' column='1'/> + <var-decl name='c_tracefunc' type-id='type-id-1043' visibility='default' filepath='./Include/cpython/pystate.h' line='135' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> <var-decl name='c_profileobj' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='136' column='1'/> @@ -15892,7 +15918,7 @@ <var-decl name='delete_later' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='160' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='critical_section' type-id='type-id-369' visibility='default' filepath='./Include/cpython/pystate.h' line='167' column='1'/> + <var-decl name='critical_section' type-id='type-id-371' visibility='default' filepath='./Include/cpython/pystate.h' line='167' 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='169' column='1'/> @@ -15907,13 +15933,13 @@ <var-decl name='context' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='174' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='context_ver' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='175' column='1'/> + <var-decl name='context_ver' type-id='type-id-117' visibility='default' filepath='./Include/cpython/pystate.h' line='175' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='id' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='178' column='1'/> + <var-decl name='id' type-id='type-id-117' visibility='default' filepath='./Include/cpython/pystate.h' line='178' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='datastack_chunk' type-id='type-id-1051' visibility='default' filepath='./Include/cpython/pystate.h' line='180' column='1'/> + <var-decl name='datastack_chunk' type-id='type-id-1053' visibility='default' filepath='./Include/cpython/pystate.h' line='180' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1920'> <var-decl name='datastack_top' type-id='type-id-241' visibility='default' filepath='./Include/cpython/pystate.h' line='181' column='1'/> @@ -15922,13 +15948,13 @@ <var-decl name='datastack_limit' type-id='type-id-241' visibility='default' filepath='./Include/cpython/pystate.h' line='182' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='exc_state' type-id='type-id-420' visibility='default' filepath='./Include/cpython/pystate.h' line='197' column='1'/> + <var-decl name='exc_state' type-id='type-id-422' visibility='default' filepath='./Include/cpython/pystate.h' line='197' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2176'> <var-decl name='current_executor' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='199' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='dict_global_version' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='201' column='1'/> + <var-decl name='dict_global_version' type-id='type-id-117' visibility='default' filepath='./Include/cpython/pystate.h' line='201' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2304'> <var-decl name='threading_local_key' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='204' column='1'/> @@ -15937,121 +15963,121 @@ <var-decl name='threading_local_sentinel' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pystate.h' line='209' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='remote_debugger_support' type-id='type-id-1042' visibility='default' filepath='./Include/cpython/pystate.h' line='210' column='1'/> + <var-decl name='remote_debugger_support' type-id='type-id-1044' visibility='default' filepath='./Include/cpython/pystate.h' line='210' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__31' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='78' column='1' id='type-id-1050'> + <class-decl name='__anonymous_struct__31' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='78' column='1' id='type-id-1052'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='83' column='1'/> + <var-decl name='initialized' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1'> - <var-decl name='bound' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='86' column='1'/> + <var-decl name='bound' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2'> - <var-decl name='unbound' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='88' column='1'/> + <var-decl name='unbound' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='88' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3'> - <var-decl name='bound_gilstate' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='90' column='1'/> + <var-decl name='bound_gilstate' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='90' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4'> - <var-decl name='active' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='92' column='1'/> + <var-decl name='active' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5'> - <var-decl name='finalizing' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='95' column='1'/> + <var-decl name='finalizing' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='95' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6'> - <var-decl name='cleared' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='96' column='1'/> + <var-decl name='cleared' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='96' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7'> - <var-decl name='finalized' type-id='type-id-105' visibility='default' filepath='./Include/cpython/pystate.h' line='97' column='1'/> + <var-decl name='finalized' type-id='type-id-111' visibility='default' filepath='./Include/cpython/pystate.h' line='97' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyFrameEvalFunction' type-id='type-id-1052' filepath='./Include/cpython/pystate.h' line='257' column='1' id='type-id-1053'/> - <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-1054'> + <typedef-decl name='_PyFrameEvalFunction' type-id='type-id-1054' filepath='./Include/cpython/pystate.h' line='269' column='1' id='type-id-1055'/> + <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-1056'> <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-569' visibility='default' filepath='./Include/cpython/pythread.h' line='37' column='1'/> + <var-decl name='_key' type-id='type-id-571' visibility='default' filepath='./Include/cpython/pythread.h' line='37' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyTime_t' type-id='type-id-409' filepath='./Include/cpython/pytime.h' line='10' column='1' id='type-id-28'/> - <class-decl name='PyTupleObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1055' visibility='default' filepath='./Include/cpython/tupleobject.h' line='5' column='1' id='type-id-1056'> + <typedef-decl name='PyTime_t' type-id='type-id-411' filepath='./Include/cpython/pytime.h' line='10' column='1' id='type-id-34'/> + <class-decl name='PyTupleObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1057' visibility='default' filepath='./Include/cpython/tupleobject.h' line='5' column='1' id='type-id-1058'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' 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_hash' type-id='type-id-304' visibility='default' filepath='./Include/cpython/tupleobject.h' line='8' column='1'/> + <var-decl name='ob_hash' type-id='type-id-306' visibility='default' filepath='./Include/cpython/tupleobject.h' line='8' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ob_item' type-id='type-id-393' visibility='default' filepath='./Include/cpython/tupleobject.h' line='12' column='1'/> + <var-decl name='ob_item' type-id='type-id-395' visibility='default' filepath='./Include/cpython/tupleobject.h' line='12' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyTupleObject' type-id='type-id-1056' filepath='./Include/cpython/tupleobject.h' line='13' column='1' id='type-id-1055'/> - <class-decl name='PyASCIIObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1057' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='54' column='1' id='type-id-1058'> + <typedef-decl name='PyTupleObject' type-id='type-id-1058' filepath='./Include/cpython/tupleobject.h' line='13' column='1' id='type-id-1057'/> + <class-decl name='PyASCIIObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1059' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='54' column='1' id='type-id-1060'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='99' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-304' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='101' column='1'/> + <var-decl name='hash' type-id='type-id-306' 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-1059' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='162' column='1'/> + <var-decl name='state' type-id='type-id-1061' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='162' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__61' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='107' column='1' id='type-id-1059'> + <class-decl name='__anonymous_struct__61' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='107' column='1' id='type-id-1061'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='interned' type-id='type-id-105' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='121' column='1'/> + <var-decl name='interned' type-id='type-id-111' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='121' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2'> - <var-decl name='kind' type-id='type-id-105' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='145' column='1'/> + <var-decl name='kind' type-id='type-id-111' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='145' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5'> - <var-decl name='compact' type-id='type-id-105' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='150' column='1'/> + <var-decl name='compact' type-id='type-id-111' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='150' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6'> - <var-decl name='ascii' type-id='type-id-105' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='154' column='1'/> + <var-decl name='ascii' type-id='type-id-111' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='154' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7'> - <var-decl name='statically_allocated' type-id='type-id-105' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='156' column='1'/> + <var-decl name='statically_allocated' type-id='type-id-111' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='156' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyASCIIObject' type-id='type-id-1058' filepath='./Include/cpython/unicodeobject.h' line='163' column='1' id='type-id-1057'/> - <class-decl name='PyCompactUnicodeObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1060' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='168' column='1' id='type-id-1061'> + <typedef-decl name='PyASCIIObject' type-id='type-id-1060' filepath='./Include/cpython/unicodeobject.h' line='163' column='1' id='type-id-1059'/> + <class-decl name='PyCompactUnicodeObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1062' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='168' column='1' id='type-id-1063'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_base' type-id='type-id-1057' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='169' column='1'/> + <var-decl name='_base' type-id='type-id-1059' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='169' 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='170' 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='172' column='1'/> + <var-decl name='utf8' type-id='type-id-24' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='172' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyCompactUnicodeObject' type-id='type-id-1061' filepath='./Include/cpython/unicodeobject.h' line='173' column='1' id='type-id-1060'/> - <typedef-decl name='getter' type-id='type-id-970' filepath='./Include/descrobject.h' line='8' column='1' id='type-id-1062'/> - <typedef-decl name='setter' type-id='type-id-1063' filepath='./Include/descrobject.h' line='9' column='1' id='type-id-1064'/> - <class-decl name='PyGetSetDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='11' column='1' id='type-id-1065'> + <typedef-decl name='PyCompactUnicodeObject' type-id='type-id-1063' filepath='./Include/cpython/unicodeobject.h' line='173' column='1' id='type-id-1062'/> + <typedef-decl name='getter' type-id='type-id-972' filepath='./Include/descrobject.h' line='8' column='1' id='type-id-1064'/> + <typedef-decl name='setter' type-id='type-id-1065' filepath='./Include/descrobject.h' line='9' column='1' id='type-id-1066'/> + <class-decl name='PyGetSetDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='11' column='1' id='type-id-1067'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' 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-1062' visibility='default' filepath='./Include/descrobject.h' line='13' column='1'/> + <var-decl name='get' type-id='type-id-1064' 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-1064' visibility='default' filepath='./Include/descrobject.h' line='14' column='1'/> + <var-decl name='set' type-id='type-id-1066' 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-4' 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-35' visibility='default' filepath='./Include/descrobject.h' line='16' column='1'/> + <var-decl name='closure' type-id='type-id-41' 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-1066'> + <class-decl name='PyMemberDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='41' column='1' id='type-id-1068'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/descrobject.h' line='42' column='1'/> </data-member> @@ -16068,10 +16094,10 @@ <var-decl name='doc' type-id='type-id-4' visibility='default' filepath='./Include/descrobject.h' line='46' column='1'/> </data-member> </class-decl> - <typedef-decl name='identifier' type-id='type-id-6' filepath='./Include/internal/pycore_asdl.h' line='13' column='1' id='type-id-704'/> - <typedef-decl name='string' type-id='type-id-6' filepath='./Include/internal/pycore_asdl.h' line='14' column='1' id='type-id-706'/> - <typedef-decl name='constant' type-id='type-id-6' filepath='./Include/internal/pycore_asdl.h' line='16' column='1' id='type-id-731'/> - <class-decl name='asdl_int_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1067' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='42' column='1' id='type-id-1068'> + <typedef-decl name='identifier' type-id='type-id-6' filepath='./Include/internal/pycore_asdl.h' line='13' column='1' id='type-id-706'/> + <typedef-decl name='string' type-id='type-id-6' filepath='./Include/internal/pycore_asdl.h' line='14' column='1' id='type-id-708'/> + <typedef-decl name='constant' type-id='type-id-6' filepath='./Include/internal/pycore_asdl.h' line='16' column='1' id='type-id-733'/> + <class-decl name='asdl_int_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1069' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='42' column='1' id='type-id-1070'> <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> @@ -16079,26 +16105,26 @@ <var-decl name='elements' type-id='type-id-267' 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-886' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='44' column='1'/> + <var-decl name='typed_elements' type-id='type-id-888' 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-1068' filepath='./Include/internal/pycore_asdl.h' line='45' column='1' id='type-id-1067'/> - <typedef-decl name='expr_ty' type-id='type-id-1069' filepath='./Include/internal/pycore_ast.h' line='19' column='1' id='type-id-681'/> - <enum-decl name='_expr_context' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-1070'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='asdl_int_seq' type-id='type-id-1070' filepath='./Include/internal/pycore_asdl.h' line='45' column='1' id='type-id-1069'/> + <typedef-decl name='expr_ty' type-id='type-id-1071' filepath='./Include/internal/pycore_ast.h' line='19' column='1' id='type-id-683'/> + <enum-decl name='_expr_context' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-1072'> + <underlying-type type-id='type-id-43'/> <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-1070' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-746'/> - <enum-decl name='_boolop' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-1071'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='expr_context_ty' type-id='type-id-1072' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-748'/> + <enum-decl name='_boolop' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-1073'> + <underlying-type type-id='type-id-43'/> <enumerator name='And' value='1'/> <enumerator name='Or' value='2'/> </enum-decl> - <typedef-decl name='boolop_ty' type-id='type-id-1071' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-799'/> - <enum-decl name='_operator' filepath='./Include/internal/pycore_ast.h' line='25' column='1' id='type-id-1072'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='boolop_ty' type-id='type-id-1073' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-801'/> + <enum-decl name='_operator' filepath='./Include/internal/pycore_ast.h' line='25' column='1' id='type-id-1074'> + <underlying-type type-id='type-id-43'/> <enumerator name='Add' value='1'/> <enumerator name='Sub' value='2'/> <enumerator name='Mult' value='3'/> @@ -16113,20 +16139,20 @@ <enumerator name='BitAnd' value='12'/> <enumerator name='FloorDiv' value='13'/> </enum-decl> - <typedef-decl name='operator_ty' type-id='type-id-1072' filepath='./Include/internal/pycore_ast.h' line='27' column='1' id='type-id-709'/> - <enum-decl name='_unaryop' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-1073'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='operator_ty' type-id='type-id-1074' filepath='./Include/internal/pycore_ast.h' line='27' column='1' id='type-id-711'/> + <enum-decl name='_unaryop' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-1075'> + <underlying-type type-id='type-id-43'/> <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-1073' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-800'/> - <typedef-decl name='comprehension_ty' type-id='type-id-1074' filepath='./Include/internal/pycore_ast.h' line='34' column='1' id='type-id-802'/> - <typedef-decl name='arguments_ty' type-id='type-id-1075' filepath='./Include/internal/pycore_ast.h' line='38' column='1' id='type-id-705'/> - <typedef-decl name='arg_ty' type-id='type-id-1076' filepath='./Include/internal/pycore_ast.h' line='40' column='1' id='type-id-747'/> - <typedef-decl name='keyword_ty' type-id='type-id-1077' filepath='./Include/internal/pycore_ast.h' line='42' column='1' id='type-id-803'/> - <class-decl name='asdl_expr_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1078' visibility='default' filepath='./Include/internal/pycore_ast.h' line='71' column='1' id='type-id-1079'> + <typedef-decl name='unaryop_ty' type-id='type-id-1075' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-802'/> + <typedef-decl name='comprehension_ty' type-id='type-id-1076' filepath='./Include/internal/pycore_ast.h' line='34' column='1' id='type-id-804'/> + <typedef-decl name='arguments_ty' type-id='type-id-1077' filepath='./Include/internal/pycore_ast.h' line='38' column='1' id='type-id-707'/> + <typedef-decl name='arg_ty' type-id='type-id-1078' filepath='./Include/internal/pycore_ast.h' line='40' column='1' id='type-id-749'/> + <typedef-decl name='keyword_ty' type-id='type-id-1079' filepath='./Include/internal/pycore_ast.h' line='42' column='1' id='type-id-805'/> + <class-decl name='asdl_expr_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1080' visibility='default' filepath='./Include/internal/pycore_ast.h' line='71' column='1' id='type-id-1081'> <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> @@ -16134,11 +16160,11 @@ <var-decl name='elements' type-id='type-id-267' 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-876' visibility='default' filepath='./Include/internal/pycore_ast.h' line='73' column='1'/> + <var-decl name='typed_elements' type-id='type-id-878' 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-1079' filepath='./Include/internal/pycore_ast.h' line='74' column='1' id='type-id-1078'/> - <class-decl name='asdl_comprehension_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1080' visibility='default' filepath='./Include/internal/pycore_ast.h' line='78' column='1' id='type-id-1081'> + <typedef-decl name='asdl_expr_seq' type-id='type-id-1081' filepath='./Include/internal/pycore_ast.h' line='74' column='1' id='type-id-1080'/> + <class-decl name='asdl_comprehension_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1082' visibility='default' filepath='./Include/internal/pycore_ast.h' line='78' column='1' id='type-id-1083'> <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> @@ -16146,11 +16172,11 @@ <var-decl name='elements' type-id='type-id-267' 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-872' visibility='default' filepath='./Include/internal/pycore_ast.h' line='80' column='1'/> + <var-decl name='typed_elements' type-id='type-id-874' 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-1081' filepath='./Include/internal/pycore_ast.h' line='81' column='1' id='type-id-1080'/> - <class-decl name='asdl_arg_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1082' visibility='default' filepath='./Include/internal/pycore_ast.h' line='101' column='1' id='type-id-1083'> + <typedef-decl name='asdl_comprehension_seq' type-id='type-id-1083' filepath='./Include/internal/pycore_ast.h' line='81' column='1' id='type-id-1082'/> + <class-decl name='asdl_arg_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1084' visibility='default' filepath='./Include/internal/pycore_ast.h' line='101' column='1' id='type-id-1085'> <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> @@ -16158,11 +16184,11 @@ <var-decl name='elements' type-id='type-id-267' 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-852' visibility='default' filepath='./Include/internal/pycore_ast.h' line='103' column='1'/> + <var-decl name='typed_elements' type-id='type-id-854' 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-1083' filepath='./Include/internal/pycore_ast.h' line='104' column='1' id='type-id-1082'/> - <class-decl name='asdl_keyword_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1084' visibility='default' filepath='./Include/internal/pycore_ast.h' line='108' column='1' id='type-id-1085'> + <typedef-decl name='asdl_arg_seq' type-id='type-id-1085' filepath='./Include/internal/pycore_ast.h' line='104' column='1' id='type-id-1084'/> + <class-decl name='asdl_keyword_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1086' visibility='default' filepath='./Include/internal/pycore_ast.h' line='108' column='1' id='type-id-1087'> <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> @@ -16170,12 +16196,12 @@ <var-decl name='elements' type-id='type-id-267' 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-890' visibility='default' filepath='./Include/internal/pycore_ast.h' line='110' column='1'/> + <var-decl name='typed_elements' type-id='type-id-892' 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-1085' filepath='./Include/internal/pycore_ast.h' line='111' column='1' id='type-id-1084'/> - <enum-decl name='_expr_kind' filepath='./Include/internal/pycore_ast.h' line='359' column='1' id='type-id-1086'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='asdl_keyword_seq' type-id='type-id-1087' filepath='./Include/internal/pycore_ast.h' line='111' column='1' id='type-id-1086'/> + <enum-decl name='_expr_kind' filepath='./Include/internal/pycore_ast.h' line='359' column='1' id='type-id-1088'> + <underlying-type type-id='type-id-43'/> <enumerator name='BoolOp_kind' value='1'/> <enumerator name='NamedExpr_kind' value='2'/> <enumerator name='BinOp_kind' value='3'/> @@ -16206,12 +16232,12 @@ <enumerator name='Tuple_kind' value='28'/> <enumerator name='Slice_kind' value='29'/> </enum-decl> - <class-decl name='_expr' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='368' column='1' id='type-id-1087'> + <class-decl name='_expr' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='368' column='1' id='type-id-1089'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-1086' visibility='default' filepath='./Include/internal/pycore_ast.h' line='369' column='1'/> + <var-decl name='kind' type-id='type-id-1088' visibility='default' filepath='./Include/internal/pycore_ast.h' line='369' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-1088' visibility='default' filepath='./Include/internal/pycore_ast.h' line='521' column='1'/> + <var-decl name='v' type-id='type-id-1090' visibility='default' filepath='./Include/internal/pycore_ast.h' line='521' 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='522' column='1'/> @@ -16226,349 +16252,349 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='525' column='1'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__1' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='370' column='1' id='type-id-1088'> + <union-decl name='__anonymous_union__1' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='370' column='1' id='type-id-1090'> <data-member access='public'> - <var-decl name='BoolOp' type-id='type-id-1089' visibility='default' filepath='./Include/internal/pycore_ast.h' line='374' column='1'/> + <var-decl name='BoolOp' type-id='type-id-1091' visibility='default' filepath='./Include/internal/pycore_ast.h' line='374' column='1'/> </data-member> <data-member access='public'> - <var-decl name='NamedExpr' type-id='type-id-1090' visibility='default' filepath='./Include/internal/pycore_ast.h' line='379' column='1'/> + <var-decl name='NamedExpr' type-id='type-id-1092' visibility='default' filepath='./Include/internal/pycore_ast.h' line='379' column='1'/> </data-member> <data-member access='public'> - <var-decl name='BinOp' type-id='type-id-1091' visibility='default' filepath='./Include/internal/pycore_ast.h' line='385' column='1'/> + <var-decl name='BinOp' type-id='type-id-1093' visibility='default' filepath='./Include/internal/pycore_ast.h' line='385' column='1'/> </data-member> <data-member access='public'> - <var-decl name='UnaryOp' type-id='type-id-1092' visibility='default' filepath='./Include/internal/pycore_ast.h' line='390' column='1'/> + <var-decl name='UnaryOp' type-id='type-id-1094' visibility='default' filepath='./Include/internal/pycore_ast.h' line='390' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Lambda' type-id='type-id-1093' visibility='default' filepath='./Include/internal/pycore_ast.h' line='395' column='1'/> + <var-decl name='Lambda' type-id='type-id-1095' visibility='default' filepath='./Include/internal/pycore_ast.h' line='395' column='1'/> </data-member> <data-member access='public'> - <var-decl name='IfExp' type-id='type-id-1094' visibility='default' filepath='./Include/internal/pycore_ast.h' line='401' column='1'/> + <var-decl name='IfExp' type-id='type-id-1096' visibility='default' filepath='./Include/internal/pycore_ast.h' line='401' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Dict' type-id='type-id-1095' visibility='default' filepath='./Include/internal/pycore_ast.h' line='406' column='1'/> + <var-decl name='Dict' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_ast.h' line='406' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Set' type-id='type-id-1096' visibility='default' filepath='./Include/internal/pycore_ast.h' line='410' column='1'/> + <var-decl name='Set' type-id='type-id-1098' visibility='default' filepath='./Include/internal/pycore_ast.h' line='410' column='1'/> </data-member> <data-member access='public'> - <var-decl name='ListComp' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_ast.h' line='415' column='1'/> + <var-decl name='ListComp' type-id='type-id-1099' visibility='default' filepath='./Include/internal/pycore_ast.h' line='415' column='1'/> </data-member> <data-member access='public'> - <var-decl name='SetComp' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_ast.h' line='420' column='1'/> + <var-decl name='SetComp' type-id='type-id-1099' visibility='default' filepath='./Include/internal/pycore_ast.h' line='420' column='1'/> </data-member> <data-member access='public'> - <var-decl name='DictComp' type-id='type-id-1098' visibility='default' filepath='./Include/internal/pycore_ast.h' line='426' column='1'/> + <var-decl name='DictComp' type-id='type-id-1100' visibility='default' filepath='./Include/internal/pycore_ast.h' line='426' column='1'/> </data-member> <data-member access='public'> - <var-decl name='GeneratorExp' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_ast.h' line='431' column='1'/> + <var-decl name='GeneratorExp' type-id='type-id-1099' visibility='default' filepath='./Include/internal/pycore_ast.h' line='431' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Await' type-id='type-id-688' visibility='default' filepath='./Include/internal/pycore_ast.h' line='435' column='1'/> + <var-decl name='Await' type-id='type-id-690' visibility='default' filepath='./Include/internal/pycore_ast.h' line='435' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Yield' type-id='type-id-688' visibility='default' filepath='./Include/internal/pycore_ast.h' line='439' column='1'/> + <var-decl name='Yield' type-id='type-id-690' visibility='default' filepath='./Include/internal/pycore_ast.h' line='439' column='1'/> </data-member> <data-member access='public'> - <var-decl name='YieldFrom' type-id='type-id-688' visibility='default' filepath='./Include/internal/pycore_ast.h' line='443' column='1'/> + <var-decl name='YieldFrom' type-id='type-id-690' visibility='default' filepath='./Include/internal/pycore_ast.h' line='443' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Compare' type-id='type-id-1099' visibility='default' filepath='./Include/internal/pycore_ast.h' line='449' column='1'/> + <var-decl name='Compare' type-id='type-id-1101' visibility='default' filepath='./Include/internal/pycore_ast.h' line='449' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Call' type-id='type-id-1100' visibility='default' filepath='./Include/internal/pycore_ast.h' line='455' column='1'/> + <var-decl name='Call' type-id='type-id-1102' visibility='default' filepath='./Include/internal/pycore_ast.h' line='455' column='1'/> </data-member> <data-member access='public'> - <var-decl name='FormattedValue' type-id='type-id-1101' visibility='default' filepath='./Include/internal/pycore_ast.h' line='461' column='1'/> + <var-decl name='FormattedValue' type-id='type-id-1103' visibility='default' filepath='./Include/internal/pycore_ast.h' line='461' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Interpolation' type-id='type-id-1102' visibility='default' filepath='./Include/internal/pycore_ast.h' line='468' column='1'/> + <var-decl name='Interpolation' type-id='type-id-1104' visibility='default' filepath='./Include/internal/pycore_ast.h' line='468' column='1'/> </data-member> <data-member access='public'> - <var-decl name='JoinedStr' type-id='type-id-1103' visibility='default' filepath='./Include/internal/pycore_ast.h' line='472' column='1'/> + <var-decl name='JoinedStr' type-id='type-id-1105' visibility='default' filepath='./Include/internal/pycore_ast.h' line='472' column='1'/> </data-member> <data-member access='public'> - <var-decl name='TemplateStr' type-id='type-id-1103' visibility='default' filepath='./Include/internal/pycore_ast.h' line='476' column='1'/> + <var-decl name='TemplateStr' type-id='type-id-1105' visibility='default' filepath='./Include/internal/pycore_ast.h' line='476' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Constant' type-id='type-id-1104' visibility='default' filepath='./Include/internal/pycore_ast.h' line='481' column='1'/> + <var-decl name='Constant' type-id='type-id-1106' visibility='default' filepath='./Include/internal/pycore_ast.h' line='481' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Attribute' type-id='type-id-1105' visibility='default' filepath='./Include/internal/pycore_ast.h' line='487' column='1'/> + <var-decl name='Attribute' type-id='type-id-1107' visibility='default' filepath='./Include/internal/pycore_ast.h' line='487' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Subscript' type-id='type-id-1106' visibility='default' filepath='./Include/internal/pycore_ast.h' line='493' column='1'/> + <var-decl name='Subscript' type-id='type-id-1108' visibility='default' filepath='./Include/internal/pycore_ast.h' line='493' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Starred' type-id='type-id-1107' visibility='default' filepath='./Include/internal/pycore_ast.h' line='498' column='1'/> + <var-decl name='Starred' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_ast.h' line='498' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Name' type-id='type-id-1108' visibility='default' filepath='./Include/internal/pycore_ast.h' line='503' column='1'/> + <var-decl name='Name' type-id='type-id-1110' visibility='default' filepath='./Include/internal/pycore_ast.h' line='503' column='1'/> </data-member> <data-member access='public'> - <var-decl name='List' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_ast.h' line='508' column='1'/> + <var-decl name='List' type-id='type-id-1111' visibility='default' filepath='./Include/internal/pycore_ast.h' line='508' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Tuple' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_ast.h' line='513' column='1'/> + <var-decl name='Tuple' type-id='type-id-1111' visibility='default' filepath='./Include/internal/pycore_ast.h' line='513' column='1'/> </data-member> <data-member access='public'> - <var-decl name='Slice' type-id='type-id-1110' visibility='default' filepath='./Include/internal/pycore_ast.h' line='519' column='1'/> + <var-decl name='Slice' type-id='type-id-1112' visibility='default' filepath='./Include/internal/pycore_ast.h' line='519' column='1'/> </data-member> </union-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='371' column='1' id='type-id-1089'> + <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='371' column='1' id='type-id-1091'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='op' type-id='type-id-799' visibility='default' filepath='./Include/internal/pycore_ast.h' line='372' column='1'/> + <var-decl name='op' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_ast.h' line='372' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='values' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='373' column='1'/> + <var-decl name='values' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='373' 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_ast.h' line='376' column='1' id='type-id-1090'> + <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='376' column='1' id='type-id-1092'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='377' column='1'/> + <var-decl name='target' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='377' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='378' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='378' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__4' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='381' column='1' id='type-id-1091'> + <class-decl name='__anonymous_struct__4' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='381' column='1' id='type-id-1093'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='left' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='382' column='1'/> + <var-decl name='left' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='382' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='op' type-id='type-id-709' visibility='default' filepath='./Include/internal/pycore_ast.h' line='383' column='1'/> + <var-decl name='op' type-id='type-id-711' visibility='default' filepath='./Include/internal/pycore_ast.h' line='383' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='right' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='384' column='1'/> + <var-decl name='right' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='384' 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='387' column='1' id='type-id-1092'> + <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='387' column='1' id='type-id-1094'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='op' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_ast.h' line='388' column='1'/> + <var-decl name='op' type-id='type-id-802' visibility='default' filepath='./Include/internal/pycore_ast.h' line='388' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='operand' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='389' column='1'/> + <var-decl name='operand' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='389' 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_ast.h' line='392' column='1' id='type-id-1093'> + <class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='392' column='1' id='type-id-1095'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='args' type-id='type-id-705' visibility='default' filepath='./Include/internal/pycore_ast.h' line='393' column='1'/> + <var-decl name='args' type-id='type-id-707' visibility='default' filepath='./Include/internal/pycore_ast.h' line='393' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='body' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='394' column='1'/> + <var-decl name='body' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='394' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__7' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='397' column='1' id='type-id-1094'> + <class-decl name='__anonymous_struct__7' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='397' column='1' id='type-id-1096'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='test' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='398' column='1'/> + <var-decl name='test' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='398' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='body' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='399' column='1'/> + <var-decl name='body' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='399' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='orelse' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='400' column='1'/> + <var-decl name='orelse' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='400' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='403' column='1' id='type-id-1095'> + <class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='403' column='1' id='type-id-1097'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='keys' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='404' column='1'/> + <var-decl name='keys' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='404' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='values' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='405' column='1'/> + <var-decl name='values' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='405' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__9' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='408' column='1' id='type-id-1096'> + <class-decl name='__anonymous_struct__9' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='408' column='1' id='type-id-1098'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='elts' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='409' column='1'/> + <var-decl name='elts' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='409' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__10' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='412' column='1' id='type-id-1097'> + <class-decl name='__anonymous_struct__10' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='412' column='1' id='type-id-1099'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='elt' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='413' column='1'/> + <var-decl name='elt' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='413' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='generators' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_ast.h' line='414' column='1'/> + <var-decl name='generators' type-id='type-id-803' visibility='default' filepath='./Include/internal/pycore_ast.h' line='414' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__12' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='422' column='1' id='type-id-1098'> + <class-decl name='__anonymous_struct__12' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='422' column='1' id='type-id-1100'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='key' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='423' column='1'/> + <var-decl name='key' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='423' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='424' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='424' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='generators' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_ast.h' line='425' column='1'/> + <var-decl name='generators' type-id='type-id-803' visibility='default' filepath='./Include/internal/pycore_ast.h' line='425' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__14' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='433' column='1' id='type-id-688'> + <class-decl name='__anonymous_struct__14' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='433' column='1' id='type-id-690'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='434' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='434' 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='445' column='1' id='type-id-1099'> + <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='445' column='1' id='type-id-1101'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='left' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='446' column='1'/> + <var-decl name='left' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='446' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ops' type-id='type-id-744' visibility='default' filepath='./Include/internal/pycore_ast.h' line='447' column='1'/> + <var-decl name='ops' type-id='type-id-746' visibility='default' filepath='./Include/internal/pycore_ast.h' line='447' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='comparators' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='448' column='1'/> + <var-decl name='comparators' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='448' 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='451' column='1' id='type-id-1100'> + <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='451' column='1' id='type-id-1102'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='452' column='1'/> + <var-decl name='func' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='452' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='args' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='453' column='1'/> + <var-decl name='args' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='453' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='keywords' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='454' column='1'/> + <var-decl name='keywords' type-id='type-id-710' visibility='default' filepath='./Include/internal/pycore_ast.h' line='454' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__19' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='457' column='1' id='type-id-1101'> + <class-decl name='__anonymous_struct__19' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='457' column='1' id='type-id-1103'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='458' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='458' 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='459' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='format_spec' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='460' column='1'/> + <var-decl name='format_spec' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='460' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__20' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='463' column='1' id='type-id-1102'> + <class-decl name='__anonymous_struct__20' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='463' column='1' id='type-id-1104'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='464' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='464' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='str' type-id='type-id-731' visibility='default' filepath='./Include/internal/pycore_ast.h' line='465' column='1'/> + <var-decl name='str' type-id='type-id-733' visibility='default' filepath='./Include/internal/pycore_ast.h' line='465' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='conversion' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='466' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='format_spec' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='467' column='1'/> + <var-decl name='format_spec' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='467' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__21' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='470' column='1' id='type-id-1103'> + <class-decl name='__anonymous_struct__21' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='470' column='1' id='type-id-1105'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='values' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='471' column='1'/> + <var-decl name='values' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='471' 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='478' column='1' id='type-id-1104'> + <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='478' column='1' id='type-id-1106'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-731' visibility='default' filepath='./Include/internal/pycore_ast.h' line='479' column='1'/> + <var-decl name='value' type-id='type-id-733' visibility='default' filepath='./Include/internal/pycore_ast.h' line='479' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='kind' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='480' column='1'/> + <var-decl name='kind' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='480' 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='483' column='1' id='type-id-1105'> + <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='483' column='1' id='type-id-1107'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='484' column='1'/> + <var-decl name='value' type-id='type-id-683' 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='attr' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='485' column='1'/> + <var-decl name='attr' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='485' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ctx' type-id='type-id-746' visibility='default' filepath='./Include/internal/pycore_ast.h' line='486' column='1'/> + <var-decl name='ctx' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_ast.h' line='486' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__25' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='489' column='1' id='type-id-1106'> + <class-decl name='__anonymous_struct__25' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='489' column='1' id='type-id-1108'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='490' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='490' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='slice' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='491' column='1'/> + <var-decl name='slice' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='491' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ctx' type-id='type-id-746' visibility='default' filepath='./Include/internal/pycore_ast.h' line='492' column='1'/> + <var-decl name='ctx' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_ast.h' line='492' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__26' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='495' column='1' id='type-id-1107'> + <class-decl name='__anonymous_struct__26' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='495' column='1' id='type-id-1109'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='496' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='496' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ctx' type-id='type-id-746' visibility='default' filepath='./Include/internal/pycore_ast.h' line='497' column='1'/> + <var-decl name='ctx' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_ast.h' line='497' 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='500' column='1' id='type-id-1108'> + <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='500' column='1' id='type-id-1110'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='id' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='501' column='1'/> + <var-decl name='id' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='501' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ctx' type-id='type-id-746' visibility='default' filepath='./Include/internal/pycore_ast.h' line='502' column='1'/> + <var-decl name='ctx' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_ast.h' line='502' 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='505' column='1' id='type-id-1109'> + <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='505' column='1' id='type-id-1111'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='elts' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='506' column='1'/> + <var-decl name='elts' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='506' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ctx' type-id='type-id-746' visibility='default' filepath='./Include/internal/pycore_ast.h' line='507' column='1'/> + <var-decl name='ctx' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_ast.h' line='507' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__30' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='515' column='1' id='type-id-1110'> + <class-decl name='__anonymous_struct__30' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='515' column='1' id='type-id-1112'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lower' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='516' column='1'/> + <var-decl name='lower' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='516' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='upper' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='517' column='1'/> + <var-decl name='upper' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='517' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='step' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='518' column='1'/> + <var-decl name='step' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='518' 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='528' column='1' id='type-id-1111'> + <class-decl name='_comprehension' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='528' column='1' id='type-id-1113'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='529' column='1'/> + <var-decl name='target' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='529' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='iter' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='530' column='1'/> + <var-decl name='iter' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='530' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ifs' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='531' column='1'/> + <var-decl name='ifs' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='531' 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='532' 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='552' column='1' id='type-id-1112'> + <class-decl name='_arguments' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='552' column='1' id='type-id-1114'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='posonlyargs' type-id='type-id-745' visibility='default' filepath='./Include/internal/pycore_ast.h' line='553' column='1'/> + <var-decl name='posonlyargs' type-id='type-id-747' visibility='default' filepath='./Include/internal/pycore_ast.h' line='553' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='args' type-id='type-id-745' visibility='default' filepath='./Include/internal/pycore_ast.h' line='554' column='1'/> + <var-decl name='args' type-id='type-id-747' visibility='default' filepath='./Include/internal/pycore_ast.h' line='554' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='vararg' type-id='type-id-747' visibility='default' filepath='./Include/internal/pycore_ast.h' line='555' column='1'/> + <var-decl name='vararg' type-id='type-id-749' visibility='default' filepath='./Include/internal/pycore_ast.h' line='555' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='kwonlyargs' type-id='type-id-745' visibility='default' filepath='./Include/internal/pycore_ast.h' line='556' column='1'/> + <var-decl name='kwonlyargs' type-id='type-id-747' visibility='default' filepath='./Include/internal/pycore_ast.h' line='556' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='kw_defaults' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='557' column='1'/> + <var-decl name='kw_defaults' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='557' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='kwarg' type-id='type-id-747' visibility='default' filepath='./Include/internal/pycore_ast.h' line='558' column='1'/> + <var-decl name='kwarg' type-id='type-id-749' visibility='default' filepath='./Include/internal/pycore_ast.h' line='558' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='defaults' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='559' column='1'/> + <var-decl name='defaults' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_ast.h' line='559' 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='562' column='1' id='type-id-1113'> + <class-decl name='_arg' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='562' column='1' id='type-id-1115'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arg' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='563' column='1'/> + <var-decl name='arg' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='563' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='annotation' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='564' column='1'/> + <var-decl name='annotation' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='564' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='type_comment' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='565' column='1'/> + <var-decl name='type_comment' type-id='type-id-708' visibility='default' filepath='./Include/internal/pycore_ast.h' line='565' 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='566' column='1'/> @@ -16583,12 +16609,12 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='569' 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='572' column='1' id='type-id-1114'> + <class-decl name='_keyword' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='572' column='1' id='type-id-1116'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arg' type-id='type-id-704' visibility='default' filepath='./Include/internal/pycore_ast.h' line='573' column='1'/> + <var-decl name='arg' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_ast.h' line='573' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='574' column='1'/> + <var-decl name='value' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='574' 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='575' column='1'/> @@ -16603,9 +16629,9 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='578' column='1'/> </data-member> </class-decl> - <class-decl name='ast_state' size-in-bits='15808' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='16' column='1' id='type-id-1115'> + <class-decl name='ast_state' size-in-bits='15808' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='16' column='1' id='type-id-1117'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='once' type-id='type-id-986' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='17' column='1'/> + <var-decl name='once' type-id='type-id-988' 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'/> @@ -17349,60 +17375,60 @@ <var-decl name='withitem_type' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='264' column='1'/> </data-member> </class-decl> - <class-decl name='_PyContextTokenMissing' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1116' visibility='default' filepath='./Include/internal/pycore_context.h' line='19' column='1' id='type-id-1117'> + <class-decl name='_PyContextTokenMissing' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1118' visibility='default' filepath='./Include/internal/pycore_context.h' line='19' column='1' id='type-id-1119'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_context.h' line='20' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_context.h' line='20' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyContextTokenMissing' type-id='type-id-1117' filepath='./Include/internal/pycore_context.h' line='21' column='1' id='type-id-1116'/> - <typedef-decl name='_PyXIData_t' type-id='type-id-1118' filepath='./Include/internal/pycore_crossinterp.h' line='41' column='1' id='type-id-1119'/> - <typedef-decl name='xid_newobjfunc' type-id='type-id-1120' filepath='./Include/internal/pycore_crossinterp.h' line='42' column='1' id='type-id-1121'/> - <typedef-decl name='xid_freefunc' type-id='type-id-572' filepath='./Include/internal/pycore_crossinterp.h' line='43' column='1' id='type-id-1122'/> - <class-decl name='_xidata' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='48' column='1' id='type-id-1118'> + <typedef-decl name='_PyContextTokenMissing' type-id='type-id-1119' filepath='./Include/internal/pycore_context.h' line='21' column='1' id='type-id-1118'/> + <typedef-decl name='_PyXIData_t' type-id='type-id-1120' filepath='./Include/internal/pycore_crossinterp.h' line='41' column='1' id='type-id-1121'/> + <typedef-decl name='xid_newobjfunc' type-id='type-id-1122' filepath='./Include/internal/pycore_crossinterp.h' line='42' column='1' id='type-id-1123'/> + <typedef-decl name='xid_freefunc' type-id='type-id-574' filepath='./Include/internal/pycore_crossinterp.h' line='43' column='1' id='type-id-1124'/> + <class-decl name='_xidata' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='48' column='1' id='type-id-1120'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='data' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='52' column='1'/> + <var-decl name='data' type-id='type-id-41' 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-6' 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-409' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='69' column='1'/> + <var-decl name='interpid' type-id='type-id-411' 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-1121' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='74' column='1'/> + <var-decl name='new_object' type-id='type-id-1123' 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-1122' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='84' column='1'/> + <var-decl name='free' type-id='type-id-1124' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='84' column='1'/> </data-member> </class-decl> - <typedef-decl name='xidata_fallback_t' type-id='type-id-5' filepath='./Include/internal/pycore_crossinterp.h' line='134' column='1' id='type-id-1123'/> - <typedef-decl name='xidatafunc' type-id='type-id-1124' filepath='./Include/internal/pycore_crossinterp.h' line='144' column='1' id='type-id-1125'/> - <typedef-decl name='xidatafbfunc' type-id='type-id-1126' filepath='./Include/internal/pycore_crossinterp.h' line='145' column='1' id='type-id-1127'/> - <class-decl name='_PyXIData_getdata_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1128' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='147' column='1' id='type-id-1129'> + <typedef-decl name='xidata_fallback_t' type-id='type-id-5' filepath='./Include/internal/pycore_crossinterp.h' line='134' column='1' id='type-id-1125'/> + <typedef-decl name='xidatafunc' type-id='type-id-1126' filepath='./Include/internal/pycore_crossinterp.h' line='144' column='1' id='type-id-1127'/> + <typedef-decl name='xidatafbfunc' type-id='type-id-1128' filepath='./Include/internal/pycore_crossinterp.h' line='145' column='1' id='type-id-1129'/> + <class-decl name='_PyXIData_getdata_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1130' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='147' column='1' id='type-id-1131'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='basic' type-id='type-id-1125' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='148' column='1'/> + <var-decl name='basic' type-id='type-id-1127' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='148' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='fallback' type-id='type-id-1127' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='149' column='1'/> + <var-decl name='fallback' type-id='type-id-1129' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='149' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXIData_getdata_t' type-id='type-id-1129' filepath='./Include/internal/pycore_crossinterp.h' line='150' column='1' id='type-id-1128'/> - <typedef-decl name='_PyXIData_lookup_t' type-id='type-id-1130' filepath='./Include/internal/pycore_crossinterp.h' line='250' column='1' id='type-id-1131'/> - <class-decl name='_PyXI_global_state_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1132' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='252' column='1' id='type-id-1133'> + <typedef-decl name='_PyXIData_getdata_t' type-id='type-id-1131' filepath='./Include/internal/pycore_crossinterp.h' line='150' column='1' id='type-id-1130'/> + <typedef-decl name='_PyXIData_lookup_t' type-id='type-id-1132' filepath='./Include/internal/pycore_crossinterp.h' line='250' column='1' id='type-id-1133'/> + <class-decl name='_PyXI_global_state_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1134' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='252' column='1' id='type-id-1135'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='data_lookup' type-id='type-id-1131' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='254' column='1'/> + <var-decl name='data_lookup' type-id='type-id-1133' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='254' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXI_global_state_t' type-id='type-id-1133' filepath='./Include/internal/pycore_crossinterp.h' line='255' column='1' id='type-id-1132'/> - <class-decl name='_PyXI_state_t' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1134' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='257' column='1' id='type-id-1135'> + <typedef-decl name='_PyXI_global_state_t' type-id='type-id-1135' filepath='./Include/internal/pycore_crossinterp.h' line='255' column='1' id='type-id-1134'/> + <class-decl name='_PyXI_state_t' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1136' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='257' column='1' id='type-id-1137'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='data_lookup' type-id='type-id-1131' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='259' column='1'/> + <var-decl name='data_lookup' type-id='type-id-1133' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='259' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='exceptions' type-id='type-id-1136' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='267' column='1'/> + <var-decl name='exceptions' type-id='type-id-1138' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='267' column='1'/> </data-member> </class-decl> - <class-decl name='xi_exceptions' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='261' column='1' id='type-id-1136'> + <class-decl name='xi_exceptions' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='261' column='1' id='type-id-1138'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='PyExc_InterpreterError' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='263' column='1'/> </data-member> @@ -17413,13 +17439,13 @@ <var-decl name='PyExc_NotShareableError' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='266' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXI_state_t' type-id='type-id-1135' filepath='./Include/internal/pycore_crossinterp.h' line='268' column='1' id='type-id-1134'/> - <class-decl name='_xid_regitem' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='12' column='1' id='type-id-1137'> + <typedef-decl name='_PyXI_state_t' type-id='type-id-1137' filepath='./Include/internal/pycore_crossinterp.h' line='268' column='1' id='type-id-1136'/> + <class-decl name='_xid_regitem' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='12' column='1' id='type-id-1139'> <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_data_registry.h' line='13' column='1'/> + <var-decl name='prev' type-id='type-id-1140' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='13' 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_data_registry.h' line='14' column='1'/> + <var-decl name='next' type-id='type-id-1140' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='14' 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_data_registry.h' line='16' column='1'/> @@ -17428,14 +17454,14 @@ <var-decl name='weakref' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='18' 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_data_registry.h' line='19' column='1'/> + <var-decl name='refcount' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='19' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='getdata' type-id='type-id-1128' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='20' column='1'/> + <var-decl name='getdata' type-id='type-id-1130' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='20' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXIData_regitem_t' type-id='type-id-1137' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='21' column='1' id='type-id-1139'/> - <class-decl name='_PyXIData_registry_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1140' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='23' column='1' id='type-id-1141'> + <typedef-decl name='_PyXIData_regitem_t' type-id='type-id-1139' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='21' column='1' id='type-id-1141'/> + <class-decl name='_PyXIData_registry_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1142' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='23' column='1' id='type-id-1143'> <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_data_registry.h' line='24' column='1'/> </data-member> @@ -17443,415 +17469,415 @@ <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='25' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='26' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='26' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='head' type-id='type-id-1142' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='27' column='1'/> + <var-decl name='head' type-id='type-id-1144' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='27' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXIData_registry_t' type-id='type-id-1141' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='28' column='1' id='type-id-1140'/> - <class-decl name='_xid_lookup_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='38' column='1' id='type-id-1130'> + <typedef-decl name='_PyXIData_registry_t' type-id='type-id-1143' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='28' column='1' id='type-id-1142'/> + <class-decl name='_xid_lookup_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='38' column='1' id='type-id-1132'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='registry' type-id='type-id-1140' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='40' column='1'/> + <var-decl name='registry' type-id='type-id-1142' visibility='default' filepath='./Include/internal/pycore_crossinterp_data_registry.h' line='40' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_DebugOffsets' size-in-bits='6080' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='67' column='1' id='type-id-1143'> + <class-decl name='_Py_DebugOffsets' size-in-bits='6080' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='67' column='1' id='type-id-1145'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cookie' type-id='type-id-864' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='68' column='1'/> + <var-decl name='cookie' type-id='type-id-866' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='version' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='69' column='1'/> + <var-decl name='version' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='69' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='free_threaded' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='70' column='1'/> + <var-decl name='free_threaded' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='runtime_state' type-id='type-id-1144' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='76' column='1'/> + <var-decl name='runtime_state' type-id='type-id-1146' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='interpreter_state' type-id='type-id-1145' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='96' column='1'/> + <var-decl name='interpreter_state' type-id='type-id-1147' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='96' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='thread_state' type-id='type-id-1146' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='109' column='1'/> + <var-decl name='thread_state' type-id='type-id-1148' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='109' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='interpreter_frame' type-id='type-id-1147' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='121' column='1'/> + <var-decl name='interpreter_frame' type-id='type-id-1149' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='121' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='code_object' type-id='type-id-1148' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='136' column='1'/> + <var-decl name='code_object' type-id='type-id-1150' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='136' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='pyobject' type-id='type-id-1149' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='142' column='1'/> + <var-decl name='pyobject' type-id='type-id-1151' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='142' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='type_object' type-id='type-id-1150' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='150' column='1'/> + <var-decl name='type_object' type-id='type-id-1152' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='150' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3584'> - <var-decl name='tuple_object' type-id='type-id-1151' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='157' column='1'/> + <var-decl name='tuple_object' type-id='type-id-1153' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='157' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3776'> - <var-decl name='list_object' type-id='type-id-1152' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='164' column='1'/> + <var-decl name='list_object' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='164' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='set_object' type-id='type-id-1153' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='172' column='1'/> + <var-decl name='set_object' type-id='type-id-1155' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='172' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4224'> - <var-decl name='dict_object' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='179' column='1'/> + <var-decl name='dict_object' type-id='type-id-1156' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='179' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4416'> - <var-decl name='float_object' type-id='type-id-1155' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='185' column='1'/> + <var-decl name='float_object' type-id='type-id-1157' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='185' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4544'> - <var-decl name='long_object' type-id='type-id-1156' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='192' column='1'/> + <var-decl name='long_object' type-id='type-id-1158' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='192' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4736'> - <var-decl name='bytes_object' type-id='type-id-1157' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='199' column='1'/> + <var-decl name='bytes_object' type-id='type-id-1159' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='199' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4928'> - <var-decl name='unicode_object' type-id='type-id-1158' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='207' column='1'/> + <var-decl name='unicode_object' type-id='type-id-1160' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='207' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5184'> - <var-decl name='gc' type-id='type-id-1159' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='213' column='1'/> + <var-decl name='gc' type-id='type-id-1161' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='213' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5312'> - <var-decl name='gen_object' type-id='type-id-1160' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='221' column='1'/> + <var-decl name='gen_object' type-id='type-id-1162' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='221' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5568'> - <var-decl name='llist_node' type-id='type-id-1161' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='226' column='1'/> + <var-decl name='llist_node' type-id='type-id-1163' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='226' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5696'> - <var-decl name='debugger_support' type-id='type-id-1162' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='235' column='1'/> + <var-decl name='debugger_support' type-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='235' column='1'/> </data-member> </class-decl> - <class-decl name='_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='72' column='1' id='type-id-1144'> + <class-decl name='_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='72' column='1' id='type-id-1146'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='73' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='73' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='finalizing' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='74' column='1'/> + <var-decl name='finalizing' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='74' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='interpreters_head' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='75' column='1'/> + <var-decl name='interpreters_head' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='75' column='1'/> </data-member> </class-decl> - <class-decl name='_interpreter_state' size-in-bits='1024' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='79' column='1' id='type-id-1145'> + <class-decl name='_interpreter_state' size-in-bits='1024' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='79' column='1' id='type-id-1147'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='80' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='80' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='id' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='81' column='1'/> + <var-decl name='id' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='81' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='next' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='82' column='1'/> + <var-decl name='next' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='82' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='threads_head' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='83' column='1'/> + <var-decl name='threads_head' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='threads_main' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='84' column='1'/> + <var-decl name='threads_main' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='84' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='gc' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='85' column='1'/> + <var-decl name='gc' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='85' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='imports_modules' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='86' column='1'/> + <var-decl name='imports_modules' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='sysdict' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='87' column='1'/> + <var-decl name='sysdict' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='87' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='builtins' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='88' column='1'/> + <var-decl name='builtins' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='88' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='ceval_gil' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='89' column='1'/> + <var-decl name='ceval_gil' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='89' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='gil_runtime_state' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='90' column='1'/> + <var-decl name='gil_runtime_state' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='90' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='gil_runtime_state_enabled' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='91' column='1'/> + <var-decl name='gil_runtime_state_enabled' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='91' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='gil_runtime_state_locked' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='92' column='1'/> + <var-decl name='gil_runtime_state_locked' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='gil_runtime_state_holder' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='93' column='1'/> + <var-decl name='gil_runtime_state_holder' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='code_object_generation' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='94' column='1'/> + <var-decl name='code_object_generation' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='94' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='tlbc_generation' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='95' column='1'/> + <var-decl name='tlbc_generation' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='95' column='1'/> </data-member> </class-decl> - <class-decl name='_thread_state' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='99' column='1' id='type-id-1146'> + <class-decl name='_thread_state' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='99' column='1' id='type-id-1148'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='100' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='100' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='prev' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='101' column='1'/> + <var-decl name='prev' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='101' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='next' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='102' column='1'/> + <var-decl name='next' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='102' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='interp' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='103' column='1'/> + <var-decl name='interp' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='103' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='current_frame' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='104' column='1'/> + <var-decl name='current_frame' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='104' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='thread_id' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='105' column='1'/> + <var-decl name='thread_id' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='105' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='native_thread_id' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='106' column='1'/> + <var-decl name='native_thread_id' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='106' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='datastack_chunk' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='107' column='1'/> + <var-decl name='datastack_chunk' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='107' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='status' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='108' column='1'/> + <var-decl name='status' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='108' column='1'/> </data-member> </class-decl> - <class-decl name='_interpreter_frame' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='112' column='1' id='type-id-1147'> + <class-decl name='_interpreter_frame' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='112' column='1' id='type-id-1149'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='113' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='114' column='1'/> + <var-decl name='previous' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='114' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='executable' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='115' column='1'/> + <var-decl name='executable' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='instr_ptr' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='116' column='1'/> + <var-decl name='instr_ptr' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='116' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='localsplus' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='117' column='1'/> + <var-decl name='localsplus' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='117' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='owner' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='118' column='1'/> + <var-decl name='owner' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='118' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='stackpointer' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='119' column='1'/> + <var-decl name='stackpointer' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='119' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='tlbc_index' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='120' column='1'/> + <var-decl name='tlbc_index' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='120' column='1'/> </data-member> </class-decl> - <class-decl name='_code_object' size-in-bits='704' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='124' column='1' id='type-id-1148'> + <class-decl name='_code_object' size-in-bits='704' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='124' column='1' id='type-id-1150'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='125' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='125' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='filename' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='126' column='1'/> + <var-decl name='filename' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='126' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='name' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='127' column='1'/> + <var-decl name='name' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='127' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='qualname' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='128' column='1'/> + <var-decl name='qualname' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='128' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='linetable' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='129' column='1'/> + <var-decl name='linetable' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='129' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='firstlineno' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='130' column='1'/> + <var-decl name='firstlineno' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='130' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='argcount' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='131' column='1'/> + <var-decl name='argcount' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='localsplusnames' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='132' column='1'/> + <var-decl name='localsplusnames' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='localspluskinds' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='133' column='1'/> + <var-decl name='localspluskinds' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='133' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='co_code_adaptive' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='134' column='1'/> + <var-decl name='co_code_adaptive' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='134' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='co_tlbc' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='135' column='1'/> + <var-decl name='co_tlbc' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='135' column='1'/> </data-member> </class-decl> - <class-decl name='_pyobject' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='139' column='1' id='type-id-1149'> + <class-decl name='_pyobject' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='139' column='1' id='type-id-1151'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='140' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='140' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_type' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='141' column='1'/> + <var-decl name='ob_type' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='141' column='1'/> </data-member> </class-decl> - <class-decl name='_type_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='145' column='1' id='type-id-1150'> + <class-decl name='_type_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='145' column='1' id='type-id-1152'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='146' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='146' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tp_name' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='147' column='1'/> + <var-decl name='tp_name' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='147' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tp_repr' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='148' column='1'/> + <var-decl name='tp_repr' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='148' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tp_flags' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='149' column='1'/> + <var-decl name='tp_flags' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='149' column='1'/> </data-member> </class-decl> - <class-decl name='_tuple_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='153' column='1' id='type-id-1151'> + <class-decl name='_tuple_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='153' column='1' id='type-id-1153'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='154' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='154' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_item' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='155' column='1'/> + <var-decl name='ob_item' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='155' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ob_size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='156' column='1'/> + <var-decl name='ob_size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='156' column='1'/> </data-member> </class-decl> - <class-decl name='_list_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='160' column='1' id='type-id-1152'> + <class-decl name='_list_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='160' column='1' id='type-id-1154'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='161' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='161' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_item' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='162' column='1'/> + <var-decl name='ob_item' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='162' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ob_size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='163' column='1'/> + <var-decl name='ob_size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='163' column='1'/> </data-member> </class-decl> - <class-decl name='_set_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='167' column='1' id='type-id-1153'> + <class-decl name='_set_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='167' column='1' id='type-id-1155'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='168' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='168' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='used' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='169' column='1'/> + <var-decl name='used' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='169' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='table' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='170' column='1'/> + <var-decl name='table' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='170' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='mask' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='171' column='1'/> + <var-decl name='mask' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='171' column='1'/> </data-member> </class-decl> - <class-decl name='_dict_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='175' column='1' id='type-id-1154'> + <class-decl name='_dict_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='175' column='1' id='type-id-1156'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='176' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='176' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ma_keys' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='177' column='1'/> + <var-decl name='ma_keys' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='177' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ma_values' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='178' column='1'/> + <var-decl name='ma_values' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='178' column='1'/> </data-member> </class-decl> - <class-decl name='_float_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='182' column='1' id='type-id-1155'> + <class-decl name='_float_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='182' column='1' id='type-id-1157'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='183' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='183' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_fval' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='184' column='1'/> + <var-decl name='ob_fval' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='184' column='1'/> </data-member> </class-decl> - <class-decl name='_long_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='188' column='1' id='type-id-1156'> + <class-decl name='_long_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='188' column='1' id='type-id-1158'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='189' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='189' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='lv_tag' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='190' column='1'/> + <var-decl name='lv_tag' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='190' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ob_digit' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='191' column='1'/> + <var-decl name='ob_digit' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='191' column='1'/> </data-member> </class-decl> - <class-decl name='_bytes_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='195' column='1' id='type-id-1157'> + <class-decl name='_bytes_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='195' column='1' id='type-id-1159'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='196' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='196' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='197' column='1'/> + <var-decl name='ob_size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='197' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ob_sval' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='198' column='1'/> + <var-decl name='ob_sval' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='198' column='1'/> </data-member> </class-decl> - <class-decl name='_unicode_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='202' column='1' id='type-id-1158'> + <class-decl name='_unicode_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='202' column='1' id='type-id-1160'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='203' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='203' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='state' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='204' column='1'/> + <var-decl name='state' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='204' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='length' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='205' column='1'/> + <var-decl name='length' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='205' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='asciiobject_size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='206' column='1'/> + <var-decl name='asciiobject_size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='206' column='1'/> </data-member> </class-decl> - <class-decl name='_gc' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='210' column='1' id='type-id-1159'> + <class-decl name='_gc' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='210' column='1' id='type-id-1161'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='211' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='211' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='collecting' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='212' column='1'/> + <var-decl name='collecting' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='212' column='1'/> </data-member> </class-decl> - <class-decl name='_gen_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='216' column='1' id='type-id-1160'> + <class-decl name='_gen_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='216' column='1' id='type-id-1162'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='217' column='1'/> + <var-decl name='size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='217' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='gi_name' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='218' column='1'/> + <var-decl name='gi_name' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='218' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='gi_iframe' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='219' column='1'/> + <var-decl name='gi_iframe' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='219' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='gi_frame_state' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='220' column='1'/> + <var-decl name='gi_frame_state' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='220' column='1'/> </data-member> </class-decl> - <class-decl name='_llist_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='223' column='1' id='type-id-1161'> + <class-decl name='_llist_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='223' column='1' id='type-id-1163'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='224' column='1'/> + <var-decl name='next' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='224' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='prev' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='225' column='1'/> + <var-decl name='prev' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='225' column='1'/> </data-member> </class-decl> - <class-decl name='_debugger_support' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='228' column='1' id='type-id-1162'> + <class-decl name='_debugger_support' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='228' column='1' id='type-id-1164'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='eval_breaker' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='229' column='1'/> + <var-decl name='eval_breaker' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='229' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='remote_debugger_support' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='230' column='1'/> + <var-decl name='remote_debugger_support' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='230' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='remote_debugging_enabled' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='231' column='1'/> + <var-decl name='remote_debugging_enabled' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='231' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='debugger_pending_call' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='232' column='1'/> + <var-decl name='debugger_pending_call' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='232' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='debugger_script_path' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='233' column='1'/> + <var-decl name='debugger_script_path' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='233' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='debugger_script_path_size' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='234' column='1'/> + <var-decl name='debugger_script_path_size' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_debug_offsets.h' line='234' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_DebugOffsets' type-id='type-id-1143' filepath='./Include/internal/pycore_debug_offsets.h' line='236' column='1' id='type-id-1163'/> - <class-decl name='_Py_dict_state' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='14' column='1' id='type-id-1164'> + <typedef-decl name='_Py_DebugOffsets' type-id='type-id-1145' filepath='./Include/internal/pycore_debug_offsets.h' line='236' column='1' id='type-id-1165'/> + <class-decl name='_Py_dict_state' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='14' column='1' id='type-id-1166'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_keys_version' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='15' column='1'/> + <var-decl name='next_keys_version' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='15' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='watchers' type-id='type-id-811' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='16' column='1'/> + <var-decl name='watchers' type-id='type-id-813' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='16' 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-1165'> + <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-1167'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='errnomap' type-id='type-id-6' 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-1166' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='25' column='1'/> + <var-decl name='memerrors_freelist' type-id='type-id-1168' 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'/> @@ -17860,8 +17886,8 @@ <var-decl name='PyExc_ExceptionGroup' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='31' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_sighandler_t' type-id='type-id-1167' filepath='./Include/internal/pycore_faulthandler.h' line='30' column='1' id='type-id-1168'/> - <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-1169'> + <typedef-decl name='_Py_sighandler_t' type-id='type-id-1169' filepath='./Include/internal/pycore_faulthandler.h' line='30' column='1' id='type-id-1170'/> + <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-1171'> <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> @@ -17878,30 +17904,30 @@ <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-1168' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='43' column='1'/> + <var-decl name='previous' type-id='type-id-1170' 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-33' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='44' column='1'/> + <var-decl name='interp' type-id='type-id-39' 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='1408' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='49' column='1' id='type-id-1170'> + <class-decl name='_faulthandler_runtime_state' size-in-bits='1408' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='49' column='1' id='type-id-1172'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fatal_error' type-id='type-id-1171' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='60' column='1'/> + <var-decl name='fatal_error' type-id='type-id-1173' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='60' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='thread' type-id='type-id-1172' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='77' column='1'/> + <var-decl name='thread' type-id='type-id-1174' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='77' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='user_signals' type-id='type-id-1173' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='80' column='1'/> + <var-decl name='user_signals' type-id='type-id-1175' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='80' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='stack' type-id='type-id-50' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='84' column='1'/> + <var-decl name='stack' type-id='type-id-56' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='84' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='old_stack' type-id='type-id-50' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='85' column='1'/> + <var-decl name='old_stack' type-id='type-id-56' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='85' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__42' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='50' column='1' id='type-id-1171'> + <class-decl name='__anonymous_struct__42' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='50' column='1' id='type-id-1173'> <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> @@ -17915,13 +17941,13 @@ <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-33' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='55' column='1'/> + <var-decl name='interp' type-id='type-id-39' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='55' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='c_stack' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='59' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__43' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='62' column='1' id='type-id-1172'> + <class-decl name='__anonymous_struct__43' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='62' column='1' id='type-id-1174'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='file' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='63' column='1'/> </data-member> @@ -17929,22 +17955,22 @@ <var-decl name='fd' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='64' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='timeout_us' type-id='type-id-463' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='65' column='1'/> + <var-decl name='timeout_us' type-id='type-id-465' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='65' 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='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='interp' type-id='type-id-33' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='67' column='1'/> + <var-decl name='interp' type-id='type-id-39' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='67' 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='68' 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='69' column='1'/> + <var-decl name='header' type-id='type-id-24' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='69' 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='70' column='1'/> + <var-decl name='header_len' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> <var-decl name='cancel_event' type-id='type-id-243' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='74' column='1'/> @@ -17953,82 +17979,82 @@ <var-decl name='running' type-id='type-id-243' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='76' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_freelist' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='34' column='1' id='type-id-823'> + <class-decl name='_Py_freelist' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='34' column='1' id='type-id-825'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='freelist' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='38' column='1'/> + <var-decl name='freelist' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='41' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_freelists' size-in-bits='4992' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='44' column='1' id='type-id-1174'> + <class-decl name='_Py_freelists' size-in-bits='4992' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='44' column='1' id='type-id-1176'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='floats' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='45' column='1'/> + <var-decl name='floats' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='45' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ints' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='46' column='1'/> + <var-decl name='ints' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='46' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tuples' type-id='type-id-824' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='47' column='1'/> + <var-decl name='tuples' type-id='type-id-826' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='47' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2816'> - <var-decl name='lists' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='48' column='1'/> + <var-decl name='lists' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='48' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='list_iters' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='49' column='1'/> + <var-decl name='list_iters' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='49' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='tuple_iters' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='50' column='1'/> + <var-decl name='tuple_iters' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='50' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='dicts' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='51' column='1'/> + <var-decl name='dicts' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='51' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='dictkeys' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='52' column='1'/> + <var-decl name='dictkeys' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='52' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3456'> - <var-decl name='slices' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='53' column='1'/> + <var-decl name='slices' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='53' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3584'> - <var-decl name='ranges' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='54' column='1'/> + <var-decl name='ranges' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='54' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3712'> - <var-decl name='range_iters' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='55' column='1'/> + <var-decl name='range_iters' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='55' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3840'> - <var-decl name='contexts' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='56' column='1'/> + <var-decl name='contexts' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='56' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='async_gens' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='57' column='1'/> + <var-decl name='async_gens' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='57' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4096'> - <var-decl name='async_gen_asends' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='58' column='1'/> + <var-decl name='async_gen_asends' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='58' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4224'> - <var-decl name='futureiters' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='59' column='1'/> + <var-decl name='futureiters' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='59' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4352'> - <var-decl name='object_stack_chunks' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='60' column='1'/> + <var-decl name='object_stack_chunks' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='60' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4480'> - <var-decl name='unicode_writers' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='61' column='1'/> + <var-decl name='unicode_writers' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='61' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4608'> - <var-decl name='pycfunctionobject' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='62' column='1'/> + <var-decl name='pycfunctionobject' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='62' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4736'> - <var-decl name='pycmethodobject' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='63' column='1'/> + <var-decl name='pycmethodobject' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='63' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4864'> - <var-decl name='pymethodobjects' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='64' column='1'/> + <var-decl name='pymethodobjects' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_freelist_state.h' line='64' 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-1175'> + <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-1177'> <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-31' visibility='default' filepath='./Include/internal/pycore_gil.h' line='44' column='1'/> + <var-decl name='last_holder' type-id='type-id-37' 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'/> @@ -18037,2757 +18063,2757 @@ <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-1176' visibility='default' filepath='./Include/internal/pycore_gil.h' line='53' column='1'/> + <var-decl name='cond' type-id='type-id-1178' 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-1177' visibility='default' filepath='./Include/internal/pycore_gil.h' line='54' column='1'/> + <var-decl name='mutex' type-id='type-id-1179' 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-1176' visibility='default' filepath='./Include/internal/pycore_gil.h' line='58' column='1'/> + <var-decl name='switch_cond' type-id='type-id-1178' 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-1177' visibility='default' filepath='./Include/internal/pycore_gil.h' line='59' column='1'/> + <var-decl name='switch_mutex' type-id='type-id-1179' visibility='default' filepath='./Include/internal/pycore_gil.h' line='59' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_global_strings' size-in-bits='446784' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1' id='type-id-1178'> + <class-decl name='_Py_global_strings' size-in-bits='446784' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1' id='type-id-1180'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='literals' type-id='type-id-1179' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1'/> + <var-decl name='literals' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9856'> - <var-decl name='identifiers' type-id='type-id-1180' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='814' column='1'/> + <var-decl name='identifiers' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='814' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='332096'> - <var-decl name='ascii' type-id='type-id-827' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='818' column='1'/> + <var-decl name='ascii' type-id='type-id-829' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='818' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='381248'> - <var-decl name='latin1' type-id='type-id-829' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='822' column='1'/> + <var-decl name='latin1' type-id='type-id-831' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='822' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__58' size-in-bits='9856' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1' id='type-id-1179'> + <class-decl name='__anonymous_struct__58' size-in-bits='9856' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1' id='type-id-1181'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_py_anon_dictcomp' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> + <var-decl name='_py_anon_dictcomp' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_py_anon_genexpr' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> + <var-decl name='_py_anon_genexpr' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_py_anon_lambda' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> + <var-decl name='_py_anon_lambda' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_py_anon_listcomp' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1'/> + <var-decl name='_py_anon_listcomp' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='_py_anon_module' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='37' column='1'/> + <var-decl name='_py_anon_module' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='37' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='_py_anon_null' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> + <var-decl name='_py_anon_null' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='_py_anon_setcomp' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1'/> + <var-decl name='_py_anon_setcomp' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='_py_anon_string' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> + <var-decl name='_py_anon_string' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3520'> - <var-decl name='_py_anon_unknown' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='41' column='1'/> + <var-decl name='_py_anon_unknown' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='41' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='_py_dbl_close_br' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> + <var-decl name='_py_dbl_close_br' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4352'> - <var-decl name='_py_dbl_open_br' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='43' column='1'/> + <var-decl name='_py_dbl_open_br' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='43' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4736'> - <var-decl name='_py_dbl_percent' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='44' column='1'/> + <var-decl name='_py_dbl_percent' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='44' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5120'> - <var-decl name='_py_defaults' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1'/> + <var-decl name='_py_defaults' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5568'> - <var-decl name='_py_dot_locals' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> + <var-decl name='_py_dot_locals' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6016'> - <var-decl name='_py_empty' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> + <var-decl name='_py_empty' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6400'> - <var-decl name='_py_format' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> + <var-decl name='_py_format' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6784'> - <var-decl name='_py_generic_base' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> + <var-decl name='_py_generic_base' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7232'> - <var-decl name='_py_json_decoder' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> + <var-decl name='_py_json_decoder' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7680'> - <var-decl name='_py_kwdefaults' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> + <var-decl name='_py_kwdefaults' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8128'> - <var-decl name='_py_list_err' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> + <var-decl name='_py_list_err' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8640'> - <var-decl name='_py_str_replace_inf' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> + <var-decl name='_py_str_replace_inf' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9024'> - <var-decl name='_py_type_params' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='54' column='1'/> + <var-decl name='_py_type_params' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='54' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9472'> - <var-decl name='_py_utf_8' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='55' column='1'/> + <var-decl name='_py_utf_8' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='55' 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='33' column='1' id='type-id-1181'> + <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='33' column='1' id='type-id-1183'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-908' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> + <var-decl name='_data' type-id='type-id-910' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' 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='34' column='1' id='type-id-1182'> + <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='34' column='1' id='type-id-1184'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-907' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> + <var-decl name='_data' type-id='type-id-909' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__62' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1' id='type-id-1183'> + <class-decl name='__anonymous_struct__62' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1' id='type-id-1185'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-950' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> + <var-decl name='_data' type-id='type-id-952' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__65' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1' id='type-id-1184'> + <class-decl name='__anonymous_struct__65' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1' id='type-id-1186'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-947' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> + <var-decl name='_data' type-id='type-id-949' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__69' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1' id='type-id-1185'> + <class-decl name='__anonymous_struct__69' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1' id='type-id-1187'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-943' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> + <var-decl name='_data' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__74' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1' id='type-id-1186'> + <class-decl name='__anonymous_struct__74' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1' id='type-id-1188'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-924' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> + <var-decl name='_data' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__75' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1' id='type-id-1187'> + <class-decl name='__anonymous_struct__75' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1' id='type-id-1189'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-949' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> + <var-decl name='_data' type-id='type-id-951' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' 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='49' column='1' id='type-id-1188'> + <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='49' column='1' id='type-id-1190'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-914' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> + <var-decl name='_data' type-id='type-id-916' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__77' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1' id='type-id-1189'> + <class-decl name='__anonymous_struct__77' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1' id='type-id-1191'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-912' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> + <var-decl name='_data' type-id='type-id-914' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__78' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1' id='type-id-1190'> + <class-decl name='__anonymous_struct__78' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1' id='type-id-1192'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-910' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> + <var-decl name='_data' type-id='type-id-912' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__79' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1' id='type-id-1191'> + <class-decl name='__anonymous_struct__79' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1' id='type-id-1193'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-932' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> + <var-decl name='_data' type-id='type-id-934' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__80' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1' id='type-id-1192'> + <class-decl name='__anonymous_struct__80' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1' id='type-id-1194'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-946' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> + <var-decl name='_data' type-id='type-id-948' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__83' size-in-bits='322240' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='58' column='1' id='type-id-1180'> + <class-decl name='__anonymous_struct__83' size-in-bits='322240' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='58' column='1' id='type-id-1182'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_py_CANCELLED' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1'/> + <var-decl name='_py_CANCELLED' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_py_FINISHED' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' column='1'/> + <var-decl name='_py_FINISHED' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' 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='61' column='1'/> + <var-decl name='_py_False' 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='1280'> - <var-decl name='_py_JSONDecodeError' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> + <var-decl name='_py_JSONDecodeError' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='_py_PENDING' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> + <var-decl name='_py_PENDING' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='_py_Py_Repr' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> + <var-decl name='_py_Py_Repr' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' 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='65' column='1'/> + <var-decl name='_py_TextIOWrapper' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='65' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='_py_True' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> + <var-decl name='_py_True' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='_py_WarningMessage' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> + <var-decl name='_py_WarningMessage' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3776'> - <var-decl name='_py__WindowsConsoleIO' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> + <var-decl name='_py__WindowsConsoleIO' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' 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='69' column='1'/> + <var-decl name='_py___IOBase_closed' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='69' 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='70' column='1'/> + <var-decl name='_py___abc_tpflags__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5184'> - <var-decl name='_py___abs__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='71' column='1'/> + <var-decl name='_py___abs__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5568'> - <var-decl name='_py___abstractmethods__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> + <var-decl name='_py___abstractmethods__' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6080'> - <var-decl name='_py___add__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='73' column='1'/> + <var-decl name='_py___add__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='73' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6464'> - <var-decl name='_py___aenter__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1'/> + <var-decl name='_py___aenter__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6912'> - <var-decl name='_py___aexit__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='75' column='1'/> + <var-decl name='_py___aexit__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='75' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7360'> - <var-decl name='_py___aiter__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='76' column='1'/> + <var-decl name='_py___aiter__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7808'> - <var-decl name='_py___all__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='77' column='1'/> + <var-decl name='_py___all__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='77' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8192'> - <var-decl name='_py___and__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='78' column='1'/> + <var-decl name='_py___and__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='78' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8576'> - <var-decl name='_py___anext__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='79' column='1'/> + <var-decl name='_py___anext__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='79' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9024'> - <var-decl name='_py___annotate__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='80' column='1'/> + <var-decl name='_py___annotate__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='80' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9472'> - <var-decl name='_py___annotate_func__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='81' column='1'/> + <var-decl name='_py___annotate_func__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='81' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9984'> - <var-decl name='_py___annotations__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='82' column='1'/> + <var-decl name='_py___annotations__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='82' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='10432'> - <var-decl name='_py___annotations_cache__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> + <var-decl name='_py___annotations_cache__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='10944'> - <var-decl name='_py___args__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1'/> + <var-decl name='_py___args__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='11392'> - <var-decl name='_py___await__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='85' column='1'/> + <var-decl name='_py___await__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='85' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='11840'> - <var-decl name='_py___bases__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='86' column='1'/> + <var-decl name='_py___bases__' 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='12288'> - <var-decl name='_py___bool__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='87' column='1'/> + <var-decl name='_py___bool__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='87' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='12736'> - <var-decl name='_py___buffer__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='88' column='1'/> + <var-decl name='_py___buffer__' 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='13184'> - <var-decl name='_py___build_class__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='89' column='1'/> + <var-decl name='_py___build_class__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='89' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='13632'> - <var-decl name='_py___builtins__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='90' column='1'/> + <var-decl name='_py___builtins__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='90' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='14080'> - <var-decl name='_py___bytes__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='91' column='1'/> + <var-decl name='_py___bytes__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='91' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='14528'> - <var-decl name='_py___call__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='92' column='1'/> + <var-decl name='_py___call__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='14976'> - <var-decl name='_py___cantrace__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='93' column='1'/> + <var-decl name='_py___cantrace__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='15424'> - <var-decl name='_py___ceil__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='94' column='1'/> + <var-decl name='_py___ceil__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='94' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='15872'> - <var-decl name='_py___class__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='95' column='1'/> + <var-decl name='_py___class__' 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='16320'> - <var-decl name='_py___class_getitem__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1'/> + <var-decl name='_py___class_getitem__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16832'> - <var-decl name='_py___classcell__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='97' column='1'/> + <var-decl name='_py___classcell__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='97' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='17280'> - <var-decl name='_py___classdict__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='98' column='1'/> + <var-decl name='_py___classdict__' 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='17728'> - <var-decl name='_py___classdictcell__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='99' column='1'/> + <var-decl name='_py___classdictcell__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='99' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18240'> - <var-decl name='_py___complex__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='100' column='1'/> + <var-decl name='_py___complex__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='100' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18688'> - <var-decl name='_py___conditional_annotations__' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> + <var-decl name='_py___conditional_annotations__' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='19264'> - <var-decl name='_py___contains__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1'/> + <var-decl name='_py___contains__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='19712'> - <var-decl name='_py___ctypes_from_outparam__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> + <var-decl name='_py___ctypes_from_outparam__' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='20288'> - <var-decl name='_py___del__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='104' column='1'/> + <var-decl name='_py___del__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='104' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='20672'> - <var-decl name='_py___delattr__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='105' column='1'/> + <var-decl name='_py___delattr__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='105' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='21120'> - <var-decl name='_py___delete__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='106' column='1'/> + <var-decl name='_py___delete__' 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='21568'> - <var-decl name='_py___delitem__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='107' column='1'/> + <var-decl name='_py___delitem__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='107' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22016'> - <var-decl name='_py___dict__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='108' column='1'/> + <var-decl name='_py___dict__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='108' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22464'> - <var-decl name='_py___dictoffset__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='109' column='1'/> + <var-decl name='_py___dictoffset__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='109' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22912'> - <var-decl name='_py___dir__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='110' column='1'/> + <var-decl name='_py___dir__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='110' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='23296'> - <var-decl name='_py___divmod__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='111' column='1'/> + <var-decl name='_py___divmod__' 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='23744'> - <var-decl name='_py___doc__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='112' column='1'/> + <var-decl name='_py___doc__' 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='24128'> - <var-decl name='_py___enter__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='113' column='1'/> + <var-decl name='_py___enter__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24576'> - <var-decl name='_py___eq__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='114' column='1'/> + <var-decl name='_py___eq__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='114' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24960'> - <var-decl name='_py___exit__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='115' column='1'/> + <var-decl name='_py___exit__' 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='25408'> - <var-decl name='_py___file__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='116' column='1'/> + <var-decl name='_py___file__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='116' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='25856'> - <var-decl name='_py___firstlineno__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='117' column='1'/> + <var-decl name='_py___firstlineno__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='117' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='26304'> - <var-decl name='_py___float__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1'/> + <var-decl name='_py___float__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='26752'> - <var-decl name='_py___floor__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='119' column='1'/> + <var-decl name='_py___floor__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='119' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='27200'> - <var-decl name='_py___floordiv__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='120' column='1'/> + <var-decl name='_py___floordiv__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='120' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='27648'> - <var-decl name='_py___format__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='121' column='1'/> + <var-decl name='_py___format__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='121' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='28096'> - <var-decl name='_py___fspath__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='122' column='1'/> + <var-decl name='_py___fspath__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='122' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='28544'> - <var-decl name='_py___ge__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1'/> + <var-decl name='_py___ge__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='28928'> - <var-decl name='_py___get__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='124' column='1'/> + <var-decl name='_py___get__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='124' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='29312'> - <var-decl name='_py___getattr__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='125' column='1'/> + <var-decl name='_py___getattr__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='125' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='29760'> - <var-decl name='_py___getattribute__' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> + <var-decl name='_py___getattribute__' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='30272'> - <var-decl name='_py___getinitargs__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='127' column='1'/> + <var-decl name='_py___getinitargs__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='127' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='30720'> - <var-decl name='_py___getitem__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='128' column='1'/> + <var-decl name='_py___getitem__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='128' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='31168'> - <var-decl name='_py___getnewargs__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='129' column='1'/> + <var-decl name='_py___getnewargs__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='129' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='31616'> - <var-decl name='_py___getnewargs_ex__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='130' column='1'/> + <var-decl name='_py___getnewargs_ex__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='130' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32128'> - <var-decl name='_py___getstate__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='131' column='1'/> + <var-decl name='_py___getstate__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32576'> - <var-decl name='_py___gt__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='132' column='1'/> + <var-decl name='_py___gt__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32960'> - <var-decl name='_py___hash__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='133' column='1'/> + <var-decl name='_py___hash__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='133' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='33408'> - <var-decl name='_py___iadd__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='134' column='1'/> + <var-decl name='_py___iadd__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='134' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='33856'> - <var-decl name='_py___iand__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='135' column='1'/> + <var-decl name='_py___iand__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='135' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='34304'> - <var-decl name='_py___ifloordiv__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='136' column='1'/> + <var-decl name='_py___ifloordiv__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='136' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='34752'> - <var-decl name='_py___ilshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='137' column='1'/> + <var-decl name='_py___ilshift__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='137' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='35200'> - <var-decl name='_py___imatmul__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='138' column='1'/> + <var-decl name='_py___imatmul__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='138' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='35648'> - <var-decl name='_py___imod__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='139' column='1'/> + <var-decl name='_py___imod__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='139' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='36096'> - <var-decl name='_py___import__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='140' column='1'/> + <var-decl name='_py___import__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='140' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='36544'> - <var-decl name='_py___imul__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='141' column='1'/> + <var-decl name='_py___imul__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='141' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='36992'> - <var-decl name='_py___index__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='142' column='1'/> + <var-decl name='_py___index__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='142' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='37440'> - <var-decl name='_py___init__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1'/> + <var-decl name='_py___init__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='37888'> - <var-decl name='_py___init_subclass__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='144' column='1'/> + <var-decl name='_py___init_subclass__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='144' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='38400'> - <var-decl name='_py___instancecheck__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='145' column='1'/> + <var-decl name='_py___instancecheck__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='145' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='38912'> - <var-decl name='_py___int__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='146' column='1'/> + <var-decl name='_py___int__' 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='39296'> - <var-decl name='_py___invert__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='147' column='1'/> + <var-decl name='_py___invert__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='147' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='39744'> - <var-decl name='_py___ior__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1'/> + <var-decl name='_py___ior__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='40128'> - <var-decl name='_py___ipow__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='149' column='1'/> + <var-decl name='_py___ipow__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='149' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='40576'> - <var-decl name='_py___irshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='150' column='1'/> + <var-decl name='_py___irshift__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='150' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='41024'> - <var-decl name='_py___isabstractmethod__' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> + <var-decl name='_py___isabstractmethod__' type-id='type-id-1204' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='41536'> - <var-decl name='_py___isub__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='152' column='1'/> + <var-decl name='_py___isub__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='152' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='41984'> - <var-decl name='_py___iter__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='153' column='1'/> + <var-decl name='_py___iter__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='153' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='42432'> - <var-decl name='_py___itruediv__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='154' column='1'/> + <var-decl name='_py___itruediv__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='154' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='42880'> - <var-decl name='_py___ixor__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='155' column='1'/> + <var-decl name='_py___ixor__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='155' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='43328'> - <var-decl name='_py___le__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='156' column='1'/> + <var-decl name='_py___le__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='156' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='43712'> - <var-decl name='_py___len__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='157' column='1'/> + <var-decl name='_py___len__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='157' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='44096'> - <var-decl name='_py___length_hint__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='158' column='1'/> + <var-decl name='_py___length_hint__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='158' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='44544'> - <var-decl name='_py___lltrace__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='159' column='1'/> + <var-decl name='_py___lltrace__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='159' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='44992'> - <var-decl name='_py___loader__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='160' column='1'/> + <var-decl name='_py___loader__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='160' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='45440'> - <var-decl name='_py___lshift__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='161' column='1'/> + <var-decl name='_py___lshift__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='161' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='45888'> - <var-decl name='_py___lt__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='162' column='1'/> + <var-decl name='_py___lt__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='162' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='46272'> - <var-decl name='_py___main__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='163' column='1'/> + <var-decl name='_py___main__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='163' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='46720'> - <var-decl name='_py___match_args__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='164' column='1'/> + <var-decl name='_py___match_args__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='164' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='47168'> - <var-decl name='_py___matmul__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='165' column='1'/> + <var-decl name='_py___matmul__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='165' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='47616'> - <var-decl name='_py___missing__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='166' column='1'/> + <var-decl name='_py___missing__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='166' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='48064'> - <var-decl name='_py___mod__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='167' column='1'/> + <var-decl name='_py___mod__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='167' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='48448'> - <var-decl name='_py___module__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='168' column='1'/> + <var-decl name='_py___module__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='168' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='48896'> - <var-decl name='_py___mro_entries__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='169' column='1'/> + <var-decl name='_py___mro_entries__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='169' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='49344'> - <var-decl name='_py___mul__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='170' column='1'/> + <var-decl name='_py___mul__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='170' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='49728'> - <var-decl name='_py___name__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='171' column='1'/> + <var-decl name='_py___name__' 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='50176'> - <var-decl name='_py___ne__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='172' column='1'/> + <var-decl name='_py___ne__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='172' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='50560'> - <var-decl name='_py___neg__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='173' column='1'/> + <var-decl name='_py___neg__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='173' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='50944'> - <var-decl name='_py___new__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='174' column='1'/> + <var-decl name='_py___new__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='174' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='51328'> - <var-decl name='_py___newobj__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='175' column='1'/> + <var-decl name='_py___newobj__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='175' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='51776'> - <var-decl name='_py___newobj_ex__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='176' column='1'/> + <var-decl name='_py___newobj_ex__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='176' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='52224'> - <var-decl name='_py___next__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='177' column='1'/> + <var-decl name='_py___next__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='177' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='52672'> - <var-decl name='_py___notes__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='178' column='1'/> + <var-decl name='_py___notes__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='178' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='53120'> - <var-decl name='_py___or__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='179' column='1'/> + <var-decl name='_py___or__' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='179' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='53504'> - <var-decl name='_py___orig_class__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='180' column='1'/> + <var-decl name='_py___orig_class__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='180' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='53952'> - <var-decl name='_py___origin__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='181' column='1'/> + <var-decl name='_py___origin__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='181' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='54400'> - <var-decl name='_py___package__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='182' column='1'/> + <var-decl name='_py___package__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='182' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='54848'> - <var-decl name='_py___parameters__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='183' column='1'/> + <var-decl name='_py___parameters__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='183' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='55296'> - <var-decl name='_py___path__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='184' column='1'/> + <var-decl name='_py___path__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='184' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='55744'> - <var-decl name='_py___pos__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='185' column='1'/> + <var-decl name='_py___pos__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='185' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='56128'> - <var-decl name='_py___pow__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1'/> + <var-decl name='_py___pow__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='56512'> - <var-decl name='_py___prepare__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='187' column='1'/> + <var-decl name='_py___prepare__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='187' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='56960'> - <var-decl name='_py___qualname__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='188' column='1'/> + <var-decl name='_py___qualname__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='188' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='57408'> - <var-decl name='_py___radd__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='189' column='1'/> + <var-decl name='_py___radd__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='189' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='57856'> - <var-decl name='_py___rand__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1'/> + <var-decl name='_py___rand__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58304'> - <var-decl name='_py___rdivmod__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='191' column='1'/> + <var-decl name='_py___rdivmod__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='191' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58752'> - <var-decl name='_py___reduce__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='192' column='1'/> + <var-decl name='_py___reduce__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='192' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='59200'> - <var-decl name='_py___reduce_ex__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='193' column='1'/> + <var-decl name='_py___reduce_ex__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='193' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='59648'> - <var-decl name='_py___release_buffer__' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> + <var-decl name='_py___release_buffer__' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='60160'> - <var-decl name='_py___repr__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='195' column='1'/> + <var-decl name='_py___repr__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='195' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='60608'> - <var-decl name='_py___reversed__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='196' column='1'/> + <var-decl name='_py___reversed__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='196' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='61056'> - <var-decl name='_py___rfloordiv__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='197' column='1'/> + <var-decl name='_py___rfloordiv__' 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='61504'> - <var-decl name='_py___rlshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='198' column='1'/> + <var-decl name='_py___rlshift__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='198' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='61952'> - <var-decl name='_py___rmatmul__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='199' column='1'/> + <var-decl name='_py___rmatmul__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='199' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='62400'> - <var-decl name='_py___rmod__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='200' column='1'/> + <var-decl name='_py___rmod__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='200' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='62848'> - <var-decl name='_py___rmul__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='201' column='1'/> + <var-decl name='_py___rmul__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='201' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='63296'> - <var-decl name='_py___ror__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='202' column='1'/> + <var-decl name='_py___ror__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='202' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='63680'> - <var-decl name='_py___round__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='203' column='1'/> + <var-decl name='_py___round__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='203' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64128'> - <var-decl name='_py___rpow__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='204' column='1'/> + <var-decl name='_py___rpow__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='204' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64576'> - <var-decl name='_py___rrshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='205' column='1'/> + <var-decl name='_py___rrshift__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='205' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='65024'> - <var-decl name='_py___rshift__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='206' column='1'/> + <var-decl name='_py___rshift__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='206' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='65472'> - <var-decl name='_py___rsub__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='207' column='1'/> + <var-decl name='_py___rsub__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='207' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='65920'> - <var-decl name='_py___rtruediv__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='208' column='1'/> + <var-decl name='_py___rtruediv__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='208' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='66368'> - <var-decl name='_py___rxor__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='209' column='1'/> + <var-decl name='_py___rxor__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='209' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='66816'> - <var-decl name='_py___set__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='210' column='1'/> + <var-decl name='_py___set__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='210' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67200'> - <var-decl name='_py___set_name__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1'/> + <var-decl name='_py___set_name__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67648'> - <var-decl name='_py___setattr__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='212' column='1'/> + <var-decl name='_py___setattr__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='212' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68096'> - <var-decl name='_py___setitem__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='213' column='1'/> + <var-decl name='_py___setitem__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='213' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68544'> - <var-decl name='_py___setstate__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='214' column='1'/> + <var-decl name='_py___setstate__' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='214' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68992'> - <var-decl name='_py___sizeof__' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='215' column='1'/> + <var-decl name='_py___sizeof__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='215' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='69440'> - <var-decl name='_py___slotnames__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='216' column='1'/> + <var-decl name='_py___slotnames__' 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='69888'> - <var-decl name='_py___slots__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='217' column='1'/> + <var-decl name='_py___slots__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='217' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='70336'> - <var-decl name='_py___spec__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='218' column='1'/> + <var-decl name='_py___spec__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='218' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='70784'> - <var-decl name='_py___static_attributes__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1'/> + <var-decl name='_py___static_attributes__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='71296'> - <var-decl name='_py___str__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='220' column='1'/> + <var-decl name='_py___str__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='220' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='71680'> - <var-decl name='_py___sub__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='221' column='1'/> + <var-decl name='_py___sub__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='221' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='72064'> - <var-decl name='_py___subclasscheck__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> + <var-decl name='_py___subclasscheck__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='72576'> - <var-decl name='_py___subclasshook__' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='223' column='1'/> + <var-decl name='_py___subclasshook__' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='223' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='73088'> - <var-decl name='_py___truediv__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='224' column='1'/> + <var-decl name='_py___truediv__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='224' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='73536'> - <var-decl name='_py___trunc__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='225' column='1'/> + <var-decl name='_py___trunc__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='225' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='73984'> - <var-decl name='_py___type_params__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='226' column='1'/> + <var-decl name='_py___type_params__' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='226' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='74432'> - <var-decl name='_py___typing_is_unpacked_typevartuple__' type-id='type-id-1204' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> + <var-decl name='_py___typing_is_unpacked_typevartuple__' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='75072'> - <var-decl name='_py___typing_prepare_subst__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='228' column='1'/> + <var-decl name='_py___typing_prepare_subst__' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='228' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='75648'> - <var-decl name='_py___typing_subst__' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='229' column='1'/> + <var-decl name='_py___typing_subst__' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='229' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='76160'> - <var-decl name='_py___typing_unpacked_tuple_args__' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> + <var-decl name='_py___typing_unpacked_tuple_args__' type-id='type-id-1207' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='76736'> - <var-decl name='_py___warningregistry__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='231' column='1'/> + <var-decl name='_py___warningregistry__' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='231' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='77248'> - <var-decl name='_py___weaklistoffset__' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='232' column='1'/> + <var-decl name='_py___weaklistoffset__' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='232' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='77760'> - <var-decl name='_py___weakref__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='233' column='1'/> + <var-decl name='_py___weakref__' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='233' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='78208'> - <var-decl name='_py___xor__' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='234' column='1'/> + <var-decl name='_py___xor__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='234' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='78592'> - <var-decl name='_py__abc_impl' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='235' column='1'/> + <var-decl name='_py__abc_impl' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='235' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='79040'> - <var-decl name='_py__abstract_' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='236' column='1'/> + <var-decl name='_py__abstract_' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='236' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='79488'> - <var-decl name='_py__active' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='237' column='1'/> + <var-decl name='_py__active' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='237' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='79872'> - <var-decl name='_py__anonymous_' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='238' column='1'/> + <var-decl name='_py__anonymous_' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='238' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80320'> - <var-decl name='_py__argtypes_' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='239' column='1'/> + <var-decl name='_py__argtypes_' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='239' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80768'> - <var-decl name='_py__as_parameter_' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='240' column='1'/> + <var-decl name='_py__as_parameter_' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='240' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='81216'> - <var-decl name='_py__asyncio_future_blocking' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='241' column='1'/> + <var-decl name='_py__asyncio_future_blocking' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='241' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='81792'> - <var-decl name='_py__blksize' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='242' column='1'/> + <var-decl name='_py__blksize' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='242' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='82240'> - <var-decl name='_py__bootstrap' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='243' column='1'/> + <var-decl name='_py__bootstrap' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='243' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='82688'> - <var-decl name='_py__check_retval_' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='244' column='1'/> + <var-decl name='_py__check_retval_' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='244' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='83136'> - <var-decl name='_py__dealloc_warn' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='245' column='1'/> + <var-decl name='_py__dealloc_warn' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='245' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='83584'> - <var-decl name='_py__feature_version' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='246' column='1'/> + <var-decl name='_py__feature_version' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='246' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84096'> - <var-decl name='_py__field_types' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='247' column='1'/> + <var-decl name='_py__field_types' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='247' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84544'> - <var-decl name='_py__fields_' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='248' column='1'/> + <var-decl name='_py__fields_' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='248' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84992'> - <var-decl name='_py__filters' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='249' column='1'/> + <var-decl name='_py__filters' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='249' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85440'> - <var-decl name='_py__finalizing' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1'/> + <var-decl name='_py__finalizing' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85888'> - <var-decl name='_py__find_and_load' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='251' column='1'/> + <var-decl name='_py__find_and_load' 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='86336'> - <var-decl name='_py__fix_up_module' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='252' column='1'/> + <var-decl name='_py__fix_up_module' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='252' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86784'> - <var-decl name='_py__flags_' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='253' column='1'/> + <var-decl name='_py__flags_' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='253' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='87168'> - <var-decl name='_py__get_sourcefile' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='254' column='1'/> + <var-decl name='_py__get_sourcefile' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='254' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='87616'> - <var-decl name='_py__handle_fromlist' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='255' column='1'/> + <var-decl name='_py__handle_fromlist' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='255' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88128'> - <var-decl name='_py__initializing' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='256' column='1'/> + <var-decl name='_py__initializing' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='256' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88576'> - <var-decl name='_py__internal_use' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='257' column='1'/> + <var-decl name='_py__internal_use' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='257' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='89024'> - <var-decl name='_py__io' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> + <var-decl name='_py__io' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='89408'> - <var-decl name='_py__is_text_encoding' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='259' column='1'/> + <var-decl name='_py__is_text_encoding' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='259' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='89920'> - <var-decl name='_py__isatty_open_only' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='260' column='1'/> + <var-decl name='_py__isatty_open_only' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='260' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='90432'> - <var-decl name='_py__length_' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='261' column='1'/> + <var-decl name='_py__length_' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='261' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='90880'> - <var-decl name='_py__limbo' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='262' column='1'/> + <var-decl name='_py__limbo' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='262' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='91264'> - <var-decl name='_py__lock_unlock_module' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='263' column='1'/> + <var-decl name='_py__lock_unlock_module' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='263' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='91776'> - <var-decl name='_py__loop' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='264' column='1'/> + <var-decl name='_py__loop' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='264' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='92160'> - <var-decl name='_py__needs_com_addref_' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='265' column='1'/> + <var-decl name='_py__needs_com_addref_' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='265' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='92672'> - <var-decl name='_py__only_immortal' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1'/> + <var-decl name='_py__only_immortal' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='93120'> - <var-decl name='_py__restype_' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1'/> + <var-decl name='_py__restype_' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='93568'> - <var-decl name='_py__showwarnmsg' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='268' column='1'/> + <var-decl name='_py__showwarnmsg' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='268' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='94016'> - <var-decl name='_py__shutdown' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='269' column='1'/> + <var-decl name='_py__shutdown' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='269' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='94464'> - <var-decl name='_py__slotnames' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='270' column='1'/> + <var-decl name='_py__slotnames' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='270' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='94912'> - <var-decl name='_py__strptime' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='271' column='1'/> + <var-decl name='_py__strptime' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='271' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='95360'> - <var-decl name='_py__strptime_datetime_date' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='272' column='1'/> + <var-decl name='_py__strptime_datetime_date' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='272' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='95872'> - <var-decl name='_py__strptime_datetime_datetime' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='273' column='1'/> + <var-decl name='_py__strptime_datetime_datetime' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='273' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96448'> - <var-decl name='_py__strptime_datetime_time' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='274' column='1'/> + <var-decl name='_py__strptime_datetime_time' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='274' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96960'> - <var-decl name='_py__type_' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='275' column='1'/> + <var-decl name='_py__type_' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='275' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='97344'> - <var-decl name='_py__uninitialized_submodules' type-id='type-id-1207' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> + <var-decl name='_py__uninitialized_submodules' type-id='type-id-1209' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='97920'> - <var-decl name='_py__warn_unawaited_coroutine' type-id='type-id-1207' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='277' column='1'/> + <var-decl name='_py__warn_unawaited_coroutine' type-id='type-id-1209' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='277' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='98496'> - <var-decl name='_py__xoptions' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='278' column='1'/> + <var-decl name='_py__xoptions' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='278' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='98944'> - <var-decl name='_py_abs_tol' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='279' column='1'/> + <var-decl name='_py_abs_tol' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='279' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='99328'> - <var-decl name='_py_access' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='280' column='1'/> + <var-decl name='_py_access' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='280' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='99712'> - <var-decl name='_py_aclose' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='281' column='1'/> + <var-decl name='_py_aclose' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='281' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='100096'> - <var-decl name='_py_add' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='282' column='1'/> + <var-decl name='_py_add' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='282' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='100480'> - <var-decl name='_py_add_done_callback' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='283' column='1'/> + <var-decl name='_py_add_done_callback' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='283' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='100992'> - <var-decl name='_py_after_in_child' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='284' column='1'/> + <var-decl name='_py_after_in_child' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='284' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='101440'> - <var-decl name='_py_after_in_parent' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='285' column='1'/> + <var-decl name='_py_after_in_parent' 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='101888'> - <var-decl name='_py_aggregate_class' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='286' column='1'/> + <var-decl name='_py_aggregate_class' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='286' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='102336'> - <var-decl name='_py_alias' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='287' column='1'/> + <var-decl name='_py_alias' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='287' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='102720'> - <var-decl name='_py_align' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='288' column='1'/> + <var-decl name='_py_align' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='288' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='103104'> - <var-decl name='_py_all' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='289' column='1'/> + <var-decl name='_py_all' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='289' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='103488'> - <var-decl name='_py_all_threads' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='290' column='1'/> + <var-decl name='_py_all_threads' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='290' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='103936'> - <var-decl name='_py_allow_code' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='291' column='1'/> + <var-decl name='_py_allow_code' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='291' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='104384'> - <var-decl name='_py_any' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='292' column='1'/> + <var-decl name='_py_any' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='292' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='104768'> - <var-decl name='_py_append' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='293' column='1'/> + <var-decl name='_py_append' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='293' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='105152'> - <var-decl name='_py_arg' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='294' column='1'/> + <var-decl name='_py_arg' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='294' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='105536'> - <var-decl name='_py_argdefs' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='295' column='1'/> + <var-decl name='_py_argdefs' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='295' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='105920'> - <var-decl name='_py_args' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='296' column='1'/> + <var-decl name='_py_args' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='296' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='106304'> - <var-decl name='_py_arguments' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='297' column='1'/> + <var-decl name='_py_arguments' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='297' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='106752'> - <var-decl name='_py_argv' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='298' column='1'/> + <var-decl name='_py_argv' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='298' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='107136'> - <var-decl name='_py_as_integer_ratio' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='299' column='1'/> + <var-decl name='_py_as_integer_ratio' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='299' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='107648'> - <var-decl name='_py_asend' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='300' column='1'/> + <var-decl name='_py_asend' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='300' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='108032'> - <var-decl name='_py_ast' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='301' column='1'/> + <var-decl name='_py_ast' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='301' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='108416'> - <var-decl name='_py_athrow' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='302' column='1'/> + <var-decl name='_py_athrow' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='302' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='108800'> - <var-decl name='_py_attribute' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='303' column='1'/> + <var-decl name='_py_attribute' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='303' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='109248'> - <var-decl name='_py_authorizer_callback' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='304' column='1'/> + <var-decl name='_py_authorizer_callback' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='304' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='109760'> - <var-decl name='_py_autocommit' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='305' column='1'/> + <var-decl name='_py_autocommit' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='305' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='110208'> - <var-decl name='_py_backtick' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='306' column='1'/> + <var-decl name='_py_backtick' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='306' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='110656'> - <var-decl name='_py_base' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='307' column='1'/> + <var-decl name='_py_base' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='307' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='111040'> - <var-decl name='_py_before' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='308' column='1'/> + <var-decl name='_py_before' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='308' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='111424'> - <var-decl name='_py_big' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='309' column='1'/> + <var-decl name='_py_big' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='309' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='111808'> - <var-decl name='_py_binary_form' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='310' column='1'/> + <var-decl name='_py_binary_form' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='310' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='112256'> - <var-decl name='_py_bit_offset' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='311' column='1'/> + <var-decl name='_py_bit_offset' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='311' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='112704'> - <var-decl name='_py_bit_size' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='312' column='1'/> + <var-decl name='_py_bit_size' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='312' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='113152'> - <var-decl name='_py_block' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1'/> + <var-decl name='_py_block' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='113536'> - <var-decl name='_py_bound' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='314' column='1'/> + <var-decl name='_py_bound' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='314' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='113920'> - <var-decl name='_py_buffer' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1'/> + <var-decl name='_py_buffer' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='114304'> - <var-decl name='_py_buffer_callback' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='316' column='1'/> + <var-decl name='_py_buffer_callback' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='316' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='114752'> - <var-decl name='_py_buffer_size' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='317' column='1'/> + <var-decl name='_py_buffer_size' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='317' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='115200'> - <var-decl name='_py_buffering' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='318' column='1'/> + <var-decl name='_py_buffering' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='318' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='115648'> - <var-decl name='_py_buffers' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='319' column='1'/> + <var-decl name='_py_buffers' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='319' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='116032'> - <var-decl name='_py_bufsize' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='320' column='1'/> + <var-decl name='_py_bufsize' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='320' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='116416'> - <var-decl name='_py_builtins' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='321' column='1'/> + <var-decl name='_py_builtins' 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='116864'> - <var-decl name='_py_byte_offset' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='322' column='1'/> + <var-decl name='_py_byte_offset' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='322' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='117312'> - <var-decl name='_py_byte_size' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='323' column='1'/> + <var-decl name='_py_byte_size' 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='117760'> - <var-decl name='_py_byteorder' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='324' column='1'/> + <var-decl name='_py_byteorder' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='324' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='118208'> - <var-decl name='_py_bytes' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='325' column='1'/> + <var-decl name='_py_bytes' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='325' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='118592'> - <var-decl name='_py_bytes_per_sep' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='326' column='1'/> + <var-decl name='_py_bytes_per_sep' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='326' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='119040'> - <var-decl name='_py_c_call' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='327' column='1'/> + <var-decl name='_py_c_call' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='327' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='119424'> - <var-decl name='_py_c_exception' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='328' column='1'/> + <var-decl name='_py_c_exception' 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='119872'> - <var-decl name='_py_c_parameter_type' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='329' column='1'/> + <var-decl name='_py_c_parameter_type' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='329' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='120384'> - <var-decl name='_py_c_return' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='330' column='1'/> + <var-decl name='_py_c_return' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='330' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='120832'> - <var-decl name='_py_cached_datetime_module' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> + <var-decl name='_py_cached_datetime_module' type-id='type-id-1210' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='121344'> - <var-decl name='_py_cached_statements' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='332' column='1'/> + <var-decl name='_py_cached_statements' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='332' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='121856'> - <var-decl name='_py_cadata' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='333' column='1'/> + <var-decl name='_py_cadata' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='333' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='122240'> - <var-decl name='_py_cafile' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='334' column='1'/> + <var-decl name='_py_cafile' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='334' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='122624'> - <var-decl name='_py_call' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='335' column='1'/> + <var-decl name='_py_call' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='335' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='123008'> - <var-decl name='_py_call_exception_handler' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='336' column='1'/> + <var-decl name='_py_call_exception_handler' type-id='type-id-1210' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='336' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='123520'> - <var-decl name='_py_call_soon' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='337' column='1'/> + <var-decl name='_py_call_soon' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='337' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='123968'> - <var-decl name='_py_callback' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='338' column='1'/> + <var-decl name='_py_callback' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='338' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='124416'> - <var-decl name='_py_cancel' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='339' column='1'/> + <var-decl name='_py_cancel' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='339' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='124800'> - <var-decl name='_py_capath' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='340' column='1'/> + <var-decl name='_py_capath' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='340' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='125184'> - <var-decl name='_py_category' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='341' column='1'/> + <var-decl name='_py_category' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='341' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='125632'> - <var-decl name='_py_cb_type' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='342' column='1'/> + <var-decl name='_py_cb_type' 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='126016'> - <var-decl name='_py_certfile' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='343' column='1'/> + <var-decl name='_py_certfile' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='343' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='126464'> - <var-decl name='_py_check_same_thread' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='344' column='1'/> + <var-decl name='_py_check_same_thread' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='344' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='126976'> - <var-decl name='_py_clear' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='345' column='1'/> + <var-decl name='_py_clear' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='345' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='127360'> - <var-decl name='_py_close' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='346' column='1'/> + <var-decl name='_py_close' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='346' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='127744'> - <var-decl name='_py_closed' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='347' column='1'/> + <var-decl name='_py_closed' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='347' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128128'> - <var-decl name='_py_closefd' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='348' column='1'/> + <var-decl name='_py_closefd' 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='128512'> - <var-decl name='_py_closure' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='349' column='1'/> + <var-decl name='_py_closure' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='349' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128896'> - <var-decl name='_py_co_argcount' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='350' column='1'/> + <var-decl name='_py_co_argcount' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='350' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='129344'> - <var-decl name='_py_co_cellvars' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='351' column='1'/> + <var-decl name='_py_co_cellvars' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='351' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='129792'> - <var-decl name='_py_co_code' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='352' column='1'/> + <var-decl name='_py_co_code' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='352' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='130176'> - <var-decl name='_py_co_consts' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='353' column='1'/> + <var-decl name='_py_co_consts' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='353' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='130624'> - <var-decl name='_py_co_exceptiontable' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='354' column='1'/> + <var-decl name='_py_co_exceptiontable' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='354' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='131136'> - <var-decl name='_py_co_filename' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='355' column='1'/> + <var-decl name='_py_co_filename' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='355' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='131584'> - <var-decl name='_py_co_firstlineno' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='356' column='1'/> + <var-decl name='_py_co_firstlineno' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='356' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='132032'> - <var-decl name='_py_co_flags' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='357' column='1'/> + <var-decl name='_py_co_flags' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='357' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='132480'> - <var-decl name='_py_co_freevars' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='358' column='1'/> + <var-decl name='_py_co_freevars' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='358' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='132928'> - <var-decl name='_py_co_kwonlyargcount' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='359' column='1'/> + <var-decl name='_py_co_kwonlyargcount' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='359' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='133440'> - <var-decl name='_py_co_linetable' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='360' column='1'/> + <var-decl name='_py_co_linetable' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='360' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='133888'> - <var-decl name='_py_co_name' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='361' column='1'/> + <var-decl name='_py_co_name' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='361' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='134272'> - <var-decl name='_py_co_names' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='362' column='1'/> + <var-decl name='_py_co_names' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='362' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='134720'> - <var-decl name='_py_co_nlocals' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='363' column='1'/> + <var-decl name='_py_co_nlocals' 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='135168'> - <var-decl name='_py_co_posonlyargcount' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='364' column='1'/> + <var-decl name='_py_co_posonlyargcount' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='364' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='135680'> - <var-decl name='_py_co_qualname' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='365' column='1'/> + <var-decl name='_py_co_qualname' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='365' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='136128'> - <var-decl name='_py_co_stacksize' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='366' column='1'/> + <var-decl name='_py_co_stacksize' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='366' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='136576'> - <var-decl name='_py_co_varnames' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='367' column='1'/> + <var-decl name='_py_co_varnames' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='367' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='137024'> - <var-decl name='_py_code' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='368' column='1'/> + <var-decl name='_py_code' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='368' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='137408'> - <var-decl name='_py_col_offset' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='369' column='1'/> + <var-decl name='_py_col_offset' type-id='type-id-1183' 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_command' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='370' column='1'/> + <var-decl name='_py_command' type-id='type-id-1189' 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_comment_factory' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='371' column='1'/> + <var-decl name='_py_comment_factory' type-id='type-id-1195' 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_compile_mode' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='372' column='1'/> + <var-decl name='_py_compile_mode' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='372' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='139136'> - <var-decl name='_py_consts' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='373' column='1'/> + <var-decl name='_py_consts' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='373' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='139520'> - <var-decl name='_py_context' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='374' column='1'/> + <var-decl name='_py_context' type-id='type-id-1189' 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_contravariant' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='375' column='1'/> + <var-decl name='_py_contravariant' type-id='type-id-1190' 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_conversion' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='376' column='1'/> + <var-decl name='_py_conversion' type-id='type-id-1183' 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_cookie' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='377' column='1'/> + <var-decl name='_py_cookie' type-id='type-id-1186' 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_copy' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='378' column='1'/> + <var-decl name='_py_copy' type-id='type-id-1196' 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_copyreg' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='379' column='1'/> + <var-decl name='_py_copyreg' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='379' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='141952'> - <var-decl name='_py_coro' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='380' column='1'/> + <var-decl name='_py_coro' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='380' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='142336'> - <var-decl name='_py_count' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='381' column='1'/> + <var-decl name='_py_count' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='381' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='142720'> - <var-decl name='_py_covariant' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='382' column='1'/> + <var-decl name='_py_covariant' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='382' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='143168'> - <var-decl name='_py_cwd' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='383' column='1'/> + <var-decl name='_py_cwd' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='383' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='143552'> - <var-decl name='_py_d_parameter_type' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='384' column='1'/> + <var-decl name='_py_d_parameter_type' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='384' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='144064'> - <var-decl name='_py_data' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='385' column='1'/> + <var-decl name='_py_data' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='385' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='144448'> - <var-decl name='_py_database' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='386' column='1'/> + <var-decl name='_py_database' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='386' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='144896'> - <var-decl name='_py_day' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='387' column='1'/> + <var-decl name='_py_day' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='387' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='145280'> - <var-decl name='_py_debug' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='388' column='1'/> + <var-decl name='_py_debug' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='388' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='145664'> - <var-decl name='_py_decode' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='389' column='1'/> + <var-decl name='_py_decode' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='389' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='146048'> - <var-decl name='_py_decoder' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='390' column='1'/> + <var-decl name='_py_decoder' 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='146432'> - <var-decl name='_py_default' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='391' column='1'/> + <var-decl name='_py_default' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='391' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='146816'> - <var-decl name='_py_defaultaction' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='392' column='1'/> + <var-decl name='_py_defaultaction' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='392' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='147264'> - <var-decl name='_py_delete' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='393' column='1'/> + <var-decl name='_py_delete' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='393' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='147648'> - <var-decl name='_py_depth' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='394' column='1'/> + <var-decl name='_py_depth' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='394' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='148032'> - <var-decl name='_py_desired_access' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='395' column='1'/> + <var-decl name='_py_desired_access' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='395' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='148480'> - <var-decl name='_py_detect_types' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='396' column='1'/> + <var-decl name='_py_detect_types' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='396' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='148928'> - <var-decl name='_py_deterministic' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='397' column='1'/> + <var-decl name='_py_deterministic' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='397' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='149376'> - <var-decl name='_py_device' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='398' column='1'/> + <var-decl name='_py_device' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='398' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='149760'> - <var-decl name='_py_dict' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='399' column='1'/> + <var-decl name='_py_dict' 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='150144'> - <var-decl name='_py_dictcomp' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='400' column='1'/> + <var-decl name='_py_dictcomp' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='400' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='150592'> - <var-decl name='_py_difference_update' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='401' column='1'/> + <var-decl name='_py_difference_update' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='401' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='151104'> - <var-decl name='_py_digest' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='402' column='1'/> + <var-decl name='_py_digest' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='402' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='151488'> - <var-decl name='_py_digest_size' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='403' column='1'/> + <var-decl name='_py_digest_size' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='403' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='151936'> - <var-decl name='_py_digestmod' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='404' column='1'/> + <var-decl name='_py_digestmod' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='404' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='152384'> - <var-decl name='_py_dir_fd' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='405' column='1'/> + <var-decl name='_py_dir_fd' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='405' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='152768'> - <var-decl name='_py_discard' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='406' column='1'/> + <var-decl name='_py_discard' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='406' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='153152'> - <var-decl name='_py_dispatch_table' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='407' column='1'/> + <var-decl name='_py_dispatch_table' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='407' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='153600'> - <var-decl name='_py_displayhook' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='408' column='1'/> + <var-decl name='_py_displayhook' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='408' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='154048'> - <var-decl name='_py_dklen' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='409' column='1'/> + <var-decl name='_py_dklen' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='409' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='154432'> - <var-decl name='_py_doc' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='410' column='1'/> + <var-decl name='_py_doc' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='410' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='154816'> - <var-decl name='_py_done' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='411' column='1'/> + <var-decl name='_py_done' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='411' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='155200'> - <var-decl name='_py_dont_inherit' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='412' column='1'/> + <var-decl name='_py_dont_inherit' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='412' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='155648'> - <var-decl name='_py_dst' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='413' column='1'/> + <var-decl name='_py_dst' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='413' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='156032'> - <var-decl name='_py_dst_dir_fd' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='414' column='1'/> + <var-decl name='_py_dst_dir_fd' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='414' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='156480'> - <var-decl name='_py_eager_start' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='415' column='1'/> + <var-decl name='_py_eager_start' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='415' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='156928'> - <var-decl name='_py_effective_ids' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='416' column='1'/> + <var-decl name='_py_effective_ids' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='416' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='157376'> - <var-decl name='_py_element_factory' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='417' column='1'/> + <var-decl name='_py_element_factory' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='417' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='157824'> - <var-decl name='_py_encode' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='418' column='1'/> + <var-decl name='_py_encode' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='418' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='158208'> - <var-decl name='_py_encoding' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='419' column='1'/> + <var-decl name='_py_encoding' 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='158656'> - <var-decl name='_py_end' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='420' column='1'/> + <var-decl name='_py_end' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='420' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='159040'> - <var-decl name='_py_end_col_offset' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='421' column='1'/> + <var-decl name='_py_end_col_offset' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='421' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='159488'> - <var-decl name='_py_end_lineno' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='422' column='1'/> + <var-decl name='_py_end_lineno' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='422' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='159936'> - <var-decl name='_py_end_offset' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='423' column='1'/> + <var-decl name='_py_end_offset' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='423' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160384'> - <var-decl name='_py_endpos' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='424' column='1'/> + <var-decl name='_py_endpos' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='424' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160768'> - <var-decl name='_py_entrypoint' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='425' column='1'/> + <var-decl name='_py_entrypoint' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='425' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='161216'> - <var-decl name='_py_env' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='426' column='1'/> + <var-decl name='_py_env' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='426' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='161600'> - <var-decl name='_py_errors' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='427' column='1'/> + <var-decl name='_py_errors' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='427' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='161984'> - <var-decl name='_py_event' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='428' column='1'/> + <var-decl name='_py_event' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='428' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='162368'> - <var-decl name='_py_eventmask' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='429' column='1'/> + <var-decl name='_py_eventmask' 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='162816'> - <var-decl name='_py_exc_type' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='430' column='1'/> + <var-decl name='_py_exc_type' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='430' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='163264'> - <var-decl name='_py_exc_value' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='431' column='1'/> + <var-decl name='_py_exc_value' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='431' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='163712'> - <var-decl name='_py_excepthook' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='432' column='1'/> + <var-decl name='_py_excepthook' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='432' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='164160'> - <var-decl name='_py_exception' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='433' column='1'/> + <var-decl name='_py_exception' type-id='type-id-1184' 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_existing_file_name' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='434' column='1'/> + <var-decl name='_py_existing_file_name' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='434' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='165120'> - <var-decl name='_py_exp' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='435' column='1'/> + <var-decl name='_py_exp' type-id='type-id-1208' 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_expression' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='436' column='1'/> + <var-decl name='_py_expression' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='436' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='165952'> - <var-decl name='_py_extend' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='437' column='1'/> + <var-decl name='_py_extend' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='437' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='166336'> - <var-decl name='_py_extra_tokens' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='438' column='1'/> + <var-decl name='_py_extra_tokens' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='438' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='166784'> - <var-decl name='_py_facility' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='439' column='1'/> + <var-decl name='_py_facility' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='439' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='167232'> - <var-decl name='_py_factory' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='440' column='1'/> + <var-decl name='_py_factory' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='440' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='167616'> - <var-decl name='_py_false' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='441' column='1'/> + <var-decl name='_py_false' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='441' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='168000'> - <var-decl name='_py_family' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='442' column='1'/> + <var-decl name='_py_family' type-id='type-id-1186' 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_fanout' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='443' column='1'/> + <var-decl name='_py_fanout' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='443' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='168768'> - <var-decl name='_py_fd' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='444' column='1'/> + <var-decl name='_py_fd' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='444' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='169152'> - <var-decl name='_py_fd2' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='445' column='1'/> + <var-decl name='_py_fd2' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='445' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='169536'> - <var-decl name='_py_fdel' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='446' column='1'/> + <var-decl name='_py_fdel' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='446' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='169920'> - <var-decl name='_py_fget' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='447' column='1'/> + <var-decl name='_py_fget' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='447' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='170304'> - <var-decl name='_py_fields' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='448' column='1'/> + <var-decl name='_py_fields' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='448' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='170688'> - <var-decl name='_py_file' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='449' column='1'/> + <var-decl name='_py_file' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='449' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='171072'> - <var-decl name='_py_file_actions' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='450' column='1'/> + <var-decl name='_py_file_actions' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='450' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='171520'> - <var-decl name='_py_filename' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='451' column='1'/> + <var-decl name='_py_filename' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='451' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='171968'> - <var-decl name='_py_fileno' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='452' column='1'/> + <var-decl name='_py_fileno' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='452' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='172352'> - <var-decl name='_py_filepath' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='453' column='1'/> + <var-decl name='_py_filepath' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='453' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='172800'> - <var-decl name='_py_fillvalue' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='454' column='1'/> + <var-decl name='_py_fillvalue' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='454' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='173248'> - <var-decl name='_py_filter' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='455' column='1'/> + <var-decl name='_py_filter' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='455' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='173632'> - <var-decl name='_py_filters' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='456' column='1'/> + <var-decl name='_py_filters' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='456' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='174016'> - <var-decl name='_py_final' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='457' column='1'/> + <var-decl name='_py_final' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='457' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='174400'> - <var-decl name='_py_find_class' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='458' column='1'/> + <var-decl name='_py_find_class' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='458' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='174848'> - <var-decl name='_py_fix_imports' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='459' column='1'/> + <var-decl name='_py_fix_imports' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='459' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='175296'> - <var-decl name='_py_flags' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='460' column='1'/> + <var-decl name='_py_flags' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='460' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='175680'> - <var-decl name='_py_flush' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='461' column='1'/> + <var-decl name='_py_flush' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='461' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='176064'> - <var-decl name='_py_fold' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='462' column='1'/> + <var-decl name='_py_fold' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='462' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='176448'> - <var-decl name='_py_follow_symlinks' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='463' column='1'/> + <var-decl name='_py_follow_symlinks' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='463' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='176896'> - <var-decl name='_py_format' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='464' column='1'/> + <var-decl name='_py_format' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='464' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='177280'> - <var-decl name='_py_format_spec' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='465' column='1'/> + <var-decl name='_py_format_spec' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='465' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='177728'> - <var-decl name='_py_frame_buffer' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='466' column='1'/> + <var-decl name='_py_frame_buffer' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='466' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='178176'> - <var-decl name='_py_from_param' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='467' column='1'/> + <var-decl name='_py_from_param' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='467' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='178624'> - <var-decl name='_py_fromlist' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='468' column='1'/> + <var-decl name='_py_fromlist' type-id='type-id-1185' 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_fromtimestamp' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='469' column='1'/> + <var-decl name='_py_fromtimestamp' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='469' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='179520'> - <var-decl name='_py_fromutc' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='470' column='1'/> + <var-decl name='_py_fromutc' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='470' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='179904'> - <var-decl name='_py_fset' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='471' column='1'/> + <var-decl name='_py_fset' type-id='type-id-1196' 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_func' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='472' column='1'/> + <var-decl name='_py_func' type-id='type-id-1196' 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_future' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='473' column='1'/> + <var-decl name='_py_future' type-id='type-id-1186' 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_generation' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='474' column='1'/> + <var-decl name='_py_generation' 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_genexpr' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='475' column='1'/> + <var-decl name='_py_genexpr' type-id='type-id-1189' 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_get' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='476' column='1'/> + <var-decl name='_py_get' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='476' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='182272'> - <var-decl name='_py_get_debug' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='477' column='1'/> + <var-decl name='_py_get_debug' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='477' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='182720'> - <var-decl name='_py_get_event_loop' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='478' column='1'/> + <var-decl name='_py_get_event_loop' type-id='type-id-1197' 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_get_loop' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='479' column='1'/> + <var-decl name='_py_get_loop' type-id='type-id-1185' 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_get_source' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='480' column='1'/> + <var-decl name='_py_get_source' type-id='type-id-1183' 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_getattr' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='481' column='1'/> + <var-decl name='_py_getattr' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='481' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='184448'> - <var-decl name='_py_getstate' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='482' column='1'/> + <var-decl name='_py_getstate' type-id='type-id-1185' 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_gid' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='483' column='1'/> + <var-decl name='_py_gid' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='483' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='185280'> - <var-decl name='_py_globals' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='484' column='1'/> + <var-decl name='_py_globals' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='484' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='185664'> - <var-decl name='_py_groupindex' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='485' column='1'/> + <var-decl name='_py_groupindex' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='485' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='186112'> - <var-decl name='_py_groups' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='486' column='1'/> + <var-decl name='_py_groups' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='486' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='186496'> - <var-decl name='_py_handle' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='487' column='1'/> + <var-decl name='_py_handle' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='487' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='186880'> - <var-decl name='_py_handle_seq' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='488' column='1'/> + <var-decl name='_py_handle_seq' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='488' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='187328'> - <var-decl name='_py_has_location' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='489' column='1'/> + <var-decl name='_py_has_location' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='489' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='187776'> - <var-decl name='_py_hash_name' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='490' column='1'/> + <var-decl name='_py_hash_name' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='490' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='188224'> - <var-decl name='_py_header' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='491' column='1'/> + <var-decl name='_py_header' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='491' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='188608'> - <var-decl name='_py_headers' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='492' column='1'/> + <var-decl name='_py_headers' 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='188992'> - <var-decl name='_py_hi' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='493' column='1'/> + <var-decl name='_py_hi' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='493' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='189376'> - <var-decl name='_py_hook' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='494' column='1'/> + <var-decl name='_py_hook' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='494' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='189760'> - <var-decl name='_py_hour' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='495' column='1'/> + <var-decl name='_py_hour' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='495' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='190144'> - <var-decl name='_py_id' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='496' column='1'/> + <var-decl name='_py_id' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='496' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='190528'> - <var-decl name='_py_ident' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='497' column='1'/> + <var-decl name='_py_ident' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='497' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='190912'> - <var-decl name='_py_identity_hint' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='498' column='1'/> + <var-decl name='_py_identity_hint' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='498' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='191360'> - <var-decl name='_py_ignore' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='499' column='1'/> + <var-decl name='_py_ignore' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='499' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='191744'> - <var-decl name='_py_imag' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='500' column='1'/> + <var-decl name='_py_imag' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='500' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192128'> - <var-decl name='_py_importlib' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='501' column='1'/> + <var-decl name='_py_importlib' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='501' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192576'> - <var-decl name='_py_in_fd' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='502' column='1'/> + <var-decl name='_py_in_fd' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='502' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192960'> - <var-decl name='_py_incoming' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='503' column='1'/> + <var-decl name='_py_incoming' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='503' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='193408'> - <var-decl name='_py_index' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='504' column='1'/> + <var-decl name='_py_index' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='504' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='193792'> - <var-decl name='_py_indexgroup' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='505' column='1'/> + <var-decl name='_py_indexgroup' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='505' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='194240'> - <var-decl name='_py_inf' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='506' column='1'/> + <var-decl name='_py_inf' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='506' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='194624'> - <var-decl name='_py_infer_variance' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='507' column='1'/> + <var-decl name='_py_infer_variance' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='507' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='195072'> - <var-decl name='_py_inherit_handle' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='508' column='1'/> + <var-decl name='_py_inherit_handle' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='508' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='195520'> - <var-decl name='_py_inheritable' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='509' column='1'/> + <var-decl name='_py_inheritable' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='509' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='195968'> - <var-decl name='_py_initial' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='510' column='1'/> + <var-decl name='_py_initial' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='510' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='196352'> - <var-decl name='_py_initial_bytes' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='511' column='1'/> + <var-decl name='_py_initial_bytes' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='511' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='196800'> - <var-decl name='_py_initial_owner' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='512' column='1'/> + <var-decl name='_py_initial_owner' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='512' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='197248'> - <var-decl name='_py_initial_state' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='513' column='1'/> + <var-decl name='_py_initial_state' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='513' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='197696'> - <var-decl name='_py_initial_value' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='514' column='1'/> + <var-decl name='_py_initial_value' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='514' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='198144'> - <var-decl name='_py_initval' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='515' column='1'/> + <var-decl name='_py_initval' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='515' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='198528'> - <var-decl name='_py_inner_size' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='516' column='1'/> + <var-decl name='_py_inner_size' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='516' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='198976'> - <var-decl name='_py_input' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='517' column='1'/> + <var-decl name='_py_input' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='517' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='199360'> - <var-decl name='_py_insert_comments' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='518' column='1'/> + <var-decl name='_py_insert_comments' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='518' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='199808'> - <var-decl name='_py_insert_pis' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='519' column='1'/> + <var-decl name='_py_insert_pis' type-id='type-id-1183' 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_instructions' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='520' column='1'/> + <var-decl name='_py_instructions' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='520' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='200704'> - <var-decl name='_py_intern' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='521' column='1'/> + <var-decl name='_py_intern' type-id='type-id-1186' 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_intersection' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='522' column='1'/> + <var-decl name='_py_intersection' type-id='type-id-1191' 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_interval' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='523' column='1'/> + <var-decl name='_py_interval' type-id='type-id-1185' 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_io' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='524' column='1'/> + <var-decl name='_py_io' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='524' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='202368'> - <var-decl name='_py_is_compress' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='525' column='1'/> + <var-decl name='_py_is_compress' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='525' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='202816'> - <var-decl name='_py_is_raw' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='526' column='1'/> + <var-decl name='_py_is_raw' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='526' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='203200'> - <var-decl name='_py_is_running' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='527' column='1'/> + <var-decl name='_py_is_running' 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='203648'> - <var-decl name='_py_is_struct' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='528' column='1'/> + <var-decl name='_py_is_struct' type-id='type-id-1184' 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_isatty' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='529' column='1'/> + <var-decl name='_py_isatty' type-id='type-id-1186' 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_isinstance' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='530' column='1'/> + <var-decl name='_py_isinstance' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='530' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='204928'> - <var-decl name='_py_isoformat' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='531' column='1'/> + <var-decl name='_py_isoformat' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='531' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='205376'> - <var-decl name='_py_isolation_level' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='532' column='1'/> + <var-decl name='_py_isolation_level' 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='205824'> - <var-decl name='_py_istext' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='533' column='1'/> + <var-decl name='_py_istext' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='533' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='206208'> - <var-decl name='_py_item' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='534' column='1'/> + <var-decl name='_py_item' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='534' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='206592'> - <var-decl name='_py_items' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='535' column='1'/> + <var-decl name='_py_items' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='535' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='206976'> - <var-decl name='_py_iter' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='536' column='1'/> + <var-decl name='_py_iter' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='536' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='207360'> - <var-decl name='_py_iterable' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='537' column='1'/> + <var-decl name='_py_iterable' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='537' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='207808'> - <var-decl name='_py_iterations' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='538' column='1'/> + <var-decl name='_py_iterations' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='538' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='208256'> - <var-decl name='_py_join' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='539' column='1'/> + <var-decl name='_py_join' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='539' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='208640'> - <var-decl name='_py_jump' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='540' column='1'/> + <var-decl name='_py_jump' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='540' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='209024'> - <var-decl name='_py_keepends' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='541' column='1'/> + <var-decl name='_py_keepends' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='541' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='209472'> - <var-decl name='_py_key' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='542' column='1'/> + <var-decl name='_py_key' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='542' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='209856'> - <var-decl name='_py_keyfile' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='543' column='1'/> + <var-decl name='_py_keyfile' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='543' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='210240'> - <var-decl name='_py_keys' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='544' column='1'/> + <var-decl name='_py_keys' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='544' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='210624'> - <var-decl name='_py_kind' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='545' column='1'/> + <var-decl name='_py_kind' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='545' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='211008'> - <var-decl name='_py_kw' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='546' column='1'/> + <var-decl name='_py_kw' type-id='type-id-1187' 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_kw1' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='547' column='1'/> + <var-decl name='_py_kw1' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='547' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='211776'> - <var-decl name='_py_kw2' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='548' column='1'/> + <var-decl name='_py_kw2' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='548' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='212160'> - <var-decl name='_py_kwdefaults' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='549' column='1'/> + <var-decl name='_py_kwdefaults' type-id='type-id-1183' 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_label' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='550' column='1'/> + <var-decl name='_py_label' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='550' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='212992'> - <var-decl name='_py_lambda' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='551' column='1'/> + <var-decl name='_py_lambda' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='551' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='213376'> - <var-decl name='_py_last' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='552' column='1'/> + <var-decl name='_py_last' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='552' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='213760'> - <var-decl name='_py_last_exc' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='553' column='1'/> + <var-decl name='_py_last_exc' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='553' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='214208'> - <var-decl name='_py_last_node' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='554' column='1'/> + <var-decl name='_py_last_node' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='554' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='214656'> - <var-decl name='_py_last_traceback' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='555' column='1'/> + <var-decl name='_py_last_traceback' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='555' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='215104'> - <var-decl name='_py_last_type' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='556' column='1'/> + <var-decl name='_py_last_type' 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='215552'> - <var-decl name='_py_last_value' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='557' column='1'/> + <var-decl name='_py_last_value' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='557' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='216000'> - <var-decl name='_py_latin1' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='558' column='1'/> + <var-decl name='_py_latin1' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='558' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='216384'> - <var-decl name='_py_leaf_size' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='559' column='1'/> + <var-decl name='_py_leaf_size' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='559' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='216832'> - <var-decl name='_py_len' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='560' column='1'/> + <var-decl name='_py_len' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='560' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='217216'> - <var-decl name='_py_length' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='561' column='1'/> + <var-decl name='_py_length' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='561' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='217600'> - <var-decl name='_py_level' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='562' column='1'/> + <var-decl name='_py_level' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='562' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='217984'> - <var-decl name='_py_limit' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='563' column='1'/> + <var-decl name='_py_limit' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='563' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='218368'> - <var-decl name='_py_line' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='564' column='1'/> + <var-decl name='_py_line' 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='218752'> - <var-decl name='_py_line_buffering' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='565' column='1'/> + <var-decl name='_py_line_buffering' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='565' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='219200'> - <var-decl name='_py_lineno' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='566' column='1'/> + <var-decl name='_py_lineno' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='566' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='219584'> - <var-decl name='_py_listcomp' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='567' column='1'/> + <var-decl name='_py_listcomp' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='567' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='220032'> - <var-decl name='_py_little' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='568' column='1'/> + <var-decl name='_py_little' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='568' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='220416'> - <var-decl name='_py_lo' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='569' column='1'/> + <var-decl name='_py_lo' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='569' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='220800'> - <var-decl name='_py_locale' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='570' column='1'/> + <var-decl name='_py_locale' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='570' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='221184'> - <var-decl name='_py_locals' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='571' column='1'/> + <var-decl name='_py_locals' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='571' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='221568'> - <var-decl name='_py_logoption' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='572' column='1'/> + <var-decl name='_py_logoption' 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='222016'> - <var-decl name='_py_loop' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='573' column='1'/> + <var-decl name='_py_loop' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='573' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='222400'> - <var-decl name='_py_manual_reset' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='574' column='1'/> + <var-decl name='_py_manual_reset' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='574' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='222848'> - <var-decl name='_py_mapping' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='575' column='1'/> + <var-decl name='_py_mapping' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='575' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='223232'> - <var-decl name='_py_match' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='576' column='1'/> + <var-decl name='_py_match' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='576' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='223616'> - <var-decl name='_py_max_length' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='577' column='1'/> + <var-decl name='_py_max_length' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='577' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='224064'> - <var-decl name='_py_maxdigits' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='578' column='1'/> + <var-decl name='_py_maxdigits' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='578' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='224512'> - <var-decl name='_py_maxevents' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='579' column='1'/> + <var-decl name='_py_maxevents' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='579' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='224960'> - <var-decl name='_py_maxlen' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='580' column='1'/> + <var-decl name='_py_maxlen' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='580' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='225344'> - <var-decl name='_py_maxmem' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='581' column='1'/> + <var-decl name='_py_maxmem' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='581' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='225728'> - <var-decl name='_py_maxsplit' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='582' column='1'/> + <var-decl name='_py_maxsplit' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='582' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='226176'> - <var-decl name='_py_maxvalue' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='583' column='1'/> + <var-decl name='_py_maxvalue' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='583' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='226624'> - <var-decl name='_py_memLevel' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='584' column='1'/> + <var-decl name='_py_memLevel' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='584' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='227072'> - <var-decl name='_py_memlimit' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='585' column='1'/> + <var-decl name='_py_memlimit' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='585' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='227520'> - <var-decl name='_py_message' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='586' column='1'/> + <var-decl name='_py_message' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='586' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='227904'> - <var-decl name='_py_metaclass' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='587' column='1'/> + <var-decl name='_py_metaclass' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='587' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='228352'> - <var-decl name='_py_metadata' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='588' column='1'/> + <var-decl name='_py_metadata' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='588' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='228800'> - <var-decl name='_py_method' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='589' column='1'/> + <var-decl name='_py_method' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='589' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='229184'> - <var-decl name='_py_microsecond' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='590' column='1'/> + <var-decl name='_py_microsecond' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='590' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='229632'> - <var-decl name='_py_milliseconds' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='591' column='1'/> + <var-decl name='_py_milliseconds' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='591' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='230080'> - <var-decl name='_py_minute' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='592' column='1'/> + <var-decl name='_py_minute' 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='230464'> - <var-decl name='_py_mod' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='593' column='1'/> + <var-decl name='_py_mod' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='593' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='230848'> - <var-decl name='_py_mode' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='594' column='1'/> + <var-decl name='_py_mode' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='594' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='231232'> - <var-decl name='_py_module' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='595' column='1'/> + <var-decl name='_py_module' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='595' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='231616'> - <var-decl name='_py_module_globals' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='596' column='1'/> + <var-decl name='_py_module_globals' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='596' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='232064'> - <var-decl name='_py_modules' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='597' column='1'/> + <var-decl name='_py_modules' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='597' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='232448'> - <var-decl name='_py_month' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='598' column='1'/> + <var-decl name='_py_month' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='598' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='232832'> - <var-decl name='_py_mro' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='599' column='1'/> + <var-decl name='_py_mro' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='599' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='233216'> - <var-decl name='_py_msg' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='600' column='1'/> + <var-decl name='_py_msg' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='600' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='233600'> - <var-decl name='_py_mutex' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='601' column='1'/> + <var-decl name='_py_mutex' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='601' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='233984'> - <var-decl name='_py_mycmp' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='602' column='1'/> + <var-decl name='_py_mycmp' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='602' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='234368'> - <var-decl name='_py_n_arg' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='603' column='1'/> + <var-decl name='_py_n_arg' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='603' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='234752'> - <var-decl name='_py_n_fields' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='604' column='1'/> + <var-decl name='_py_n_fields' 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='235200'> - <var-decl name='_py_n_sequence_fields' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='605' column='1'/> + <var-decl name='_py_n_sequence_fields' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='605' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='235712'> - <var-decl name='_py_n_unnamed_fields' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='606' column='1'/> + <var-decl name='_py_n_unnamed_fields' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='606' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='236224'> - <var-decl name='_py_name' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='607' column='1'/> + <var-decl name='_py_name' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='607' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='236608'> - <var-decl name='_py_name_from' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='608' column='1'/> + <var-decl name='_py_name_from' 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='237056'> - <var-decl name='_py_namespace_separator' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='609' column='1'/> + <var-decl name='_py_namespace_separator' type-id='type-id-1199' 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_namespaces' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='610' column='1'/> + <var-decl name='_py_namespaces' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='610' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='238016'> - <var-decl name='_py_narg' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='611' column='1'/> + <var-decl name='_py_narg' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='611' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='238400'> - <var-decl name='_py_ndigits' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='612' column='1'/> + <var-decl name='_py_ndigits' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='612' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='238784'> - <var-decl name='_py_nested' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='613' column='1'/> + <var-decl name='_py_nested' type-id='type-id-1186' 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_new_file_name' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='614' column='1'/> + <var-decl name='_py_new_file_name' type-id='type-id-1190' 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_new_limit' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='615' column='1'/> + <var-decl name='_py_new_limit' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='615' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='240064'> - <var-decl name='_py_newline' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='616' column='1'/> + <var-decl name='_py_newline' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='616' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='240448'> - <var-decl name='_py_newlines' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='617' column='1'/> + <var-decl name='_py_newlines' 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='240896'> - <var-decl name='_py_next' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='618' column='1'/> + <var-decl name='_py_next' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='618' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='241280'> - <var-decl name='_py_nlocals' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='619' column='1'/> + <var-decl name='_py_nlocals' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='619' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='241664'> - <var-decl name='_py_node_depth' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='620' column='1'/> + <var-decl name='_py_node_depth' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='620' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='242112'> - <var-decl name='_py_node_offset' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='621' column='1'/> + <var-decl name='_py_node_offset' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='621' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='242560'> - <var-decl name='_py_ns' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='622' column='1'/> + <var-decl name='_py_ns' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='622' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='242944'> - <var-decl name='_py_nstype' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='623' column='1'/> + <var-decl name='_py_nstype' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='623' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='243328'> - <var-decl name='_py_nt' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='624' column='1'/> + <var-decl name='_py_nt' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='624' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='243712'> - <var-decl name='_py_null' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='625' column='1'/> + <var-decl name='_py_null' type-id='type-id-1196' 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_number' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='626' column='1'/> + <var-decl name='_py_number' type-id='type-id-1186' 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_obj' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='627' column='1'/> + <var-decl name='_py_obj' type-id='type-id-1208' 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_object' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='628' column='1'/> + <var-decl name='_py_object' type-id='type-id-1186' 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_offset' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='629' column='1'/> + <var-decl name='_py_offset' type-id='type-id-1186' 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_offset_dst' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='630' column='1'/> + <var-decl name='_py_offset_dst' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='630' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='246080'> - <var-decl name='_py_offset_src' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='631' column='1'/> + <var-decl name='_py_offset_src' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='631' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='246528'> - <var-decl name='_py_on_type_read' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='632' column='1'/> + <var-decl name='_py_on_type_read' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='632' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='246976'> - <var-decl name='_py_onceregistry' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='633' column='1'/> + <var-decl name='_py_onceregistry' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='633' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='247424'> - <var-decl name='_py_only_active_thread' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='634' column='1'/> + <var-decl name='_py_only_active_thread' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='634' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='247936'> - <var-decl name='_py_only_keys' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='635' column='1'/> + <var-decl name='_py_only_keys' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='635' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='248384'> - <var-decl name='_py_oparg' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='636' column='1'/> + <var-decl name='_py_oparg' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='636' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='248768'> - <var-decl name='_py_opcode' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='637' column='1'/> + <var-decl name='_py_opcode' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='637' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='249152'> - <var-decl name='_py_open' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='638' column='1'/> + <var-decl name='_py_open' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='638' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='249536'> - <var-decl name='_py_opener' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='639' column='1'/> + <var-decl name='_py_opener' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='639' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='249920'> - <var-decl name='_py_operation' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='640' column='1'/> + <var-decl name='_py_operation' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='640' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='250368'> - <var-decl name='_py_optimize' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='641' column='1'/> + <var-decl name='_py_optimize' type-id='type-id-1185' 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_options' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='642' column='1'/> + <var-decl name='_py_options' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='642' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='251200'> - <var-decl name='_py_order' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='643' column='1'/> + <var-decl name='_py_order' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='643' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='251584'> - <var-decl name='_py_origin' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='644' column='1'/> + <var-decl name='_py_origin' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='644' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='251968'> - <var-decl name='_py_out_fd' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='645' column='1'/> + <var-decl name='_py_out_fd' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='645' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='252352'> - <var-decl name='_py_outgoing' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='646' column='1'/> + <var-decl name='_py_outgoing' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='646' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='252800'> - <var-decl name='_py_outpath' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='647' column='1'/> + <var-decl name='_py_outpath' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='647' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='253184'> - <var-decl name='_py_overlapped' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='648' column='1'/> + <var-decl name='_py_overlapped' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='648' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='253632'> - <var-decl name='_py_owner' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='649' column='1'/> + <var-decl name='_py_owner' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='649' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='254016'> - <var-decl name='_py_pages' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='650' column='1'/> + <var-decl name='_py_pages' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='650' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='254400'> - <var-decl name='_py_parameter' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='651' column='1'/> + <var-decl name='_py_parameter' 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='254848'> - <var-decl name='_py_parent' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='652' column='1'/> + <var-decl name='_py_parent' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='652' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='255232'> - <var-decl name='_py_password' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='653' column='1'/> + <var-decl name='_py_password' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='653' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='255680'> - <var-decl name='_py_path' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='654' column='1'/> + <var-decl name='_py_path' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='654' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256064'> - <var-decl name='_py_pattern' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='655' column='1'/> + <var-decl name='_py_pattern' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='655' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256448'> - <var-decl name='_py_peek' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='656' column='1'/> + <var-decl name='_py_peek' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='656' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256832'> - <var-decl name='_py_persistent_id' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='657' column='1'/> + <var-decl name='_py_persistent_id' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='657' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='257280'> - <var-decl name='_py_persistent_load' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='658' column='1'/> + <var-decl name='_py_persistent_load' 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='257728'> - <var-decl name='_py_person' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='659' column='1'/> + <var-decl name='_py_person' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='659' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='258112'> - <var-decl name='_py_pi_factory' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='660' column='1'/> + <var-decl name='_py_pi_factory' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='660' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='258560'> - <var-decl name='_py_pid' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='661' column='1'/> + <var-decl name='_py_pid' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='661' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='258944'> - <var-decl name='_py_policy' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='662' column='1'/> + <var-decl name='_py_policy' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='662' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='259328'> - <var-decl name='_py_pos' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='663' column='1'/> + <var-decl name='_py_pos' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='663' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='259712'> - <var-decl name='_py_pos1' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='664' column='1'/> + <var-decl name='_py_pos1' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='664' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='260096'> - <var-decl name='_py_pos2' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='665' column='1'/> + <var-decl name='_py_pos2' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='665' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='260480'> - <var-decl name='_py_posix' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='666' column='1'/> + <var-decl name='_py_posix' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='666' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='260864'> - <var-decl name='_py_print_file_and_line' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='667' column='1'/> + <var-decl name='_py_print_file_and_line' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='667' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='261376'> - <var-decl name='_py_priority' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='668' column='1'/> + <var-decl name='_py_priority' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='668' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='261824'> - <var-decl name='_py_progress' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='669' column='1'/> + <var-decl name='_py_progress' 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='262272'> - <var-decl name='_py_progress_handler' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='670' column='1'/> + <var-decl name='_py_progress_handler' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='670' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='262784'> - <var-decl name='_py_progress_routine' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='671' column='1'/> + <var-decl name='_py_progress_routine' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='671' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='263296'> - <var-decl name='_py_proto' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='672' column='1'/> + <var-decl name='_py_proto' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='672' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='263680'> - <var-decl name='_py_protocol' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='673' column='1'/> + <var-decl name='_py_protocol' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='673' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='264128'> - <var-decl name='_py_ps1' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='674' column='1'/> + <var-decl name='_py_ps1' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='674' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='264512'> - <var-decl name='_py_ps2' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='675' column='1'/> + <var-decl name='_py_ps2' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='675' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='264896'> - <var-decl name='_py_query' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='676' column='1'/> + <var-decl name='_py_query' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='676' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='265280'> - <var-decl name='_py_quotetabs' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='677' column='1'/> + <var-decl name='_py_quotetabs' 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='265728'> - <var-decl name='_py_raw' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='678' column='1'/> + <var-decl name='_py_raw' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='678' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='266112'> - <var-decl name='_py_read' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='679' column='1'/> + <var-decl name='_py_read' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='679' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='266496'> - <var-decl name='_py_read1' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='680' column='1'/> + <var-decl name='_py_read1' 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='266880'> - <var-decl name='_py_readable' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='681' column='1'/> + <var-decl name='_py_readable' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='681' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='267328'> - <var-decl name='_py_readall' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='682' column='1'/> + <var-decl name='_py_readall' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='682' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='267712'> - <var-decl name='_py_readinto' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='683' column='1'/> + <var-decl name='_py_readinto' 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='268160'> - <var-decl name='_py_readinto1' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='684' column='1'/> + <var-decl name='_py_readinto1' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='684' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='268608'> - <var-decl name='_py_readline' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='685' column='1'/> + <var-decl name='_py_readline' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='685' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='269056'> - <var-decl name='_py_readonly' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='686' column='1'/> + <var-decl name='_py_readonly' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='686' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='269504'> - <var-decl name='_py_real' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='687' column='1'/> + <var-decl name='_py_real' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='687' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='269888'> - <var-decl name='_py_reducer_override' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='688' column='1'/> + <var-decl name='_py_reducer_override' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='688' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='270400'> - <var-decl name='_py_registry' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='689' column='1'/> + <var-decl name='_py_registry' 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='270848'> - <var-decl name='_py_rel_tol' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='690' column='1'/> + <var-decl name='_py_rel_tol' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='690' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='271232'> - <var-decl name='_py_release' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='691' column='1'/> + <var-decl name='_py_release' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='691' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='271616'> - <var-decl name='_py_reload' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='692' column='1'/> + <var-decl name='_py_reload' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='692' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='272000'> - <var-decl name='_py_repl' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='693' column='1'/> + <var-decl name='_py_repl' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='693' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='272384'> - <var-decl name='_py_replace' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='694' column='1'/> + <var-decl name='_py_replace' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='694' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='272768'> - <var-decl name='_py_reserved' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='695' column='1'/> + <var-decl name='_py_reserved' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='695' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='273216'> - <var-decl name='_py_reset' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1'/> + <var-decl name='_py_reset' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='273600'> - <var-decl name='_py_resetids' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='697' column='1'/> + <var-decl name='_py_resetids' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='697' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='274048'> - <var-decl name='_py_return' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='698' column='1'/> + <var-decl name='_py_return' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='698' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='274432'> - <var-decl name='_py_reverse' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='699' column='1'/> + <var-decl name='_py_reverse' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='699' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='274816'> - <var-decl name='_py_reversed' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='700' column='1'/> + <var-decl name='_py_reversed' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='700' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='275264'> - <var-decl name='_py_salt' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='701' column='1'/> + <var-decl name='_py_salt' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='701' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='275648'> - <var-decl name='_py_sched_priority' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='702' column='1'/> + <var-decl name='_py_sched_priority' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='702' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='276096'> - <var-decl name='_py_scheduler' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='703' column='1'/> + <var-decl name='_py_scheduler' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='703' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='276544'> - <var-decl name='_py_script' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='704' column='1'/> + <var-decl name='_py_script' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='704' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='276928'> - <var-decl name='_py_second' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='705' column='1'/> + <var-decl name='_py_second' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='705' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='277312'> - <var-decl name='_py_security_attributes' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='706' column='1'/> + <var-decl name='_py_security_attributes' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='706' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='277824'> - <var-decl name='_py_seek' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='707' column='1'/> + <var-decl name='_py_seek' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='707' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='278208'> - <var-decl name='_py_seekable' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='708' column='1'/> + <var-decl name='_py_seekable' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='708' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='278656'> - <var-decl name='_py_selectors' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='709' column='1'/> + <var-decl name='_py_selectors' type-id='type-id-1184' 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_self' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='710' column='1'/> + <var-decl name='_py_self' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='710' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='279488'> - <var-decl name='_py_send' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='711' column='1'/> + <var-decl name='_py_send' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='711' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='279872'> - <var-decl name='_py_sep' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='712' column='1'/> + <var-decl name='_py_sep' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='712' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='280256'> - <var-decl name='_py_sequence' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='713' column='1'/> + <var-decl name='_py_sequence' 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='280704'> - <var-decl name='_py_server_hostname' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='714' column='1'/> + <var-decl name='_py_server_hostname' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='714' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='281152'> - <var-decl name='_py_server_side' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='715' column='1'/> + <var-decl name='_py_server_side' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='715' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='281600'> - <var-decl name='_py_session' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='716' column='1'/> + <var-decl name='_py_session' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='716' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='281984'> - <var-decl name='_py_setcomp' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1'/> + <var-decl name='_py_setcomp' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='282368'> - <var-decl name='_py_setpgroup' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='718' column='1'/> + <var-decl name='_py_setpgroup' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='718' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='282816'> - <var-decl name='_py_setsid' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='719' column='1'/> + <var-decl name='_py_setsid' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='719' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='283200'> - <var-decl name='_py_setsigdef' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='720' column='1'/> + <var-decl name='_py_setsigdef' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='720' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='283648'> - <var-decl name='_py_setsigmask' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='721' column='1'/> + <var-decl name='_py_setsigmask' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='721' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='284096'> - <var-decl name='_py_setstate' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='722' column='1'/> + <var-decl name='_py_setstate' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='722' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='284544'> - <var-decl name='_py_shape' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='723' column='1'/> + <var-decl name='_py_shape' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='723' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='284928'> - <var-decl name='_py_show_cmd' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='724' column='1'/> + <var-decl name='_py_show_cmd' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='724' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='285376'> - <var-decl name='_py_signed' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='725' column='1'/> + <var-decl name='_py_signed' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='725' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='285760'> - <var-decl name='_py_size' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='726' column='1'/> + <var-decl name='_py_size' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='726' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='286144'> - <var-decl name='_py_sizehint' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='727' column='1'/> + <var-decl name='_py_sizehint' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='727' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='286592'> - <var-decl name='_py_skip_file_prefixes' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='728' column='1'/> + <var-decl name='_py_skip_file_prefixes' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='728' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='287104'> - <var-decl name='_py_sleep' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='729' column='1'/> + <var-decl name='_py_sleep' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='729' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='287488'> - <var-decl name='_py_sock' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='730' column='1'/> + <var-decl name='_py_sock' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='730' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='287872'> - <var-decl name='_py_sort' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='731' column='1'/> + <var-decl name='_py_sort' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='731' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='288256'> - <var-decl name='_py_source' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='732' column='1'/> + <var-decl name='_py_source' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='732' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='288640'> - <var-decl name='_py_source_traceback' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='733' column='1'/> + <var-decl name='_py_source_traceback' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='733' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='289152'> - <var-decl name='_py_spam' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='734' column='1'/> + <var-decl name='_py_spam' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='734' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='289536'> - <var-decl name='_py_src' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='735' column='1'/> + <var-decl name='_py_src' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='735' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='289920'> - <var-decl name='_py_src_dir_fd' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='736' column='1'/> + <var-decl name='_py_src_dir_fd' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='736' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='290368'> - <var-decl name='_py_stacklevel' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='737' column='1'/> + <var-decl name='_py_stacklevel' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='737' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='290816'> - <var-decl name='_py_start' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='738' column='1'/> + <var-decl name='_py_start' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='738' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='291200'> - <var-decl name='_py_statement' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='739' column='1'/> + <var-decl name='_py_statement' 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='291648'> - <var-decl name='_py_status' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='740' column='1'/> + <var-decl name='_py_status' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='740' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='292032'> - <var-decl name='_py_stderr' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='741' column='1'/> + <var-decl name='_py_stderr' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='741' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='292416'> - <var-decl name='_py_stdin' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='742' column='1'/> + <var-decl name='_py_stdin' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='742' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='292800'> - <var-decl name='_py_stdout' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='743' column='1'/> + <var-decl name='_py_stdout' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='743' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='293184'> - <var-decl name='_py_step' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='744' column='1'/> + <var-decl name='_py_step' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='744' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='293568'> - <var-decl name='_py_steps' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='745' column='1'/> + <var-decl name='_py_steps' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='745' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='293952'> - <var-decl name='_py_store_name' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='746' column='1'/> + <var-decl name='_py_store_name' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='746' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='294400'> - <var-decl name='_py_strategy' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='747' column='1'/> + <var-decl name='_py_strategy' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='747' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='294848'> - <var-decl name='_py_strftime' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='748' column='1'/> + <var-decl name='_py_strftime' 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='295296'> - <var-decl name='_py_strict' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='749' column='1'/> + <var-decl name='_py_strict' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='749' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='295680'> - <var-decl name='_py_strict_mode' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='750' column='1'/> + <var-decl name='_py_strict_mode' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='750' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='296128'> - <var-decl name='_py_string' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='751' column='1'/> + <var-decl name='_py_string' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='751' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='296512'> - <var-decl name='_py_sub_key' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='752' column='1'/> + <var-decl name='_py_sub_key' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='752' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='296896'> - <var-decl name='_py_subcalls' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='753' column='1'/> + <var-decl name='_py_subcalls' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='753' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='297344'> - <var-decl name='_py_symmetric_difference_update' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='754' column='1'/> + <var-decl name='_py_symmetric_difference_update' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='754' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='297920'> - <var-decl name='_py_tabsize' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='755' column='1'/> + <var-decl name='_py_tabsize' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='755' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='298304'> - <var-decl name='_py_tag' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='756' column='1'/> + <var-decl name='_py_tag' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='756' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='298688'> - <var-decl name='_py_target' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='757' column='1'/> + <var-decl name='_py_target' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='757' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='299072'> - <var-decl name='_py_target_is_directory' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='758' column='1'/> + <var-decl name='_py_target_is_directory' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='758' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='299584'> - <var-decl name='_py_task' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='759' column='1'/> + <var-decl name='_py_task' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='759' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='299968'> - <var-decl name='_py_tb_frame' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='760' column='1'/> + <var-decl name='_py_tb_frame' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='760' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='300416'> - <var-decl name='_py_tb_lasti' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='761' column='1'/> + <var-decl name='_py_tb_lasti' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='761' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='300864'> - <var-decl name='_py_tb_lineno' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='762' column='1'/> + <var-decl name='_py_tb_lineno' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='762' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='301312'> - <var-decl name='_py_tb_next' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='763' column='1'/> + <var-decl name='_py_tb_next' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='763' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='301696'> - <var-decl name='_py_tell' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='764' column='1'/> + <var-decl name='_py_tell' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='764' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='302080'> - <var-decl name='_py_template' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='765' column='1'/> + <var-decl name='_py_template' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='765' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='302528'> - <var-decl name='_py_term' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='766' column='1'/> + <var-decl name='_py_term' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='766' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='302912'> - <var-decl name='_py_text' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='767' column='1'/> + <var-decl name='_py_text' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='767' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='303296'> - <var-decl name='_py_threading' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='768' column='1'/> + <var-decl name='_py_threading' 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='303744'> - <var-decl name='_py_throw' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='769' column='1'/> + <var-decl name='_py_throw' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='769' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='304128'> - <var-decl name='_py_timeout' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='770' column='1'/> + <var-decl name='_py_timeout' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='770' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='304512'> - <var-decl name='_py_timer' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='771' column='1'/> + <var-decl name='_py_timer' type-id='type-id-1194' 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_times' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='772' column='1'/> + <var-decl name='_py_times' type-id='type-id-1194' 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_timetuple' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='773' column='1'/> + <var-decl name='_py_timetuple' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='773' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='305728'> - <var-decl name='_py_timeunit' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='774' column='1'/> + <var-decl name='_py_timeunit' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='774' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='306176'> - <var-decl name='_py_top' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='775' column='1'/> + <var-decl name='_py_top' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='775' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='306560'> - <var-decl name='_py_trace_callback' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='776' column='1'/> + <var-decl name='_py_trace_callback' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='776' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='307008'> - <var-decl name='_py_traceback' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='777' column='1'/> + <var-decl name='_py_traceback' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='777' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='307456'> - <var-decl name='_py_trailers' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='778' column='1'/> + <var-decl name='_py_trailers' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='778' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='307904'> - <var-decl name='_py_translate' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='779' column='1'/> + <var-decl name='_py_translate' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='779' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='308352'> - <var-decl name='_py_true' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='780' column='1'/> + <var-decl name='_py_true' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='780' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='308736'> - <var-decl name='_py_truncate' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='781' column='1'/> + <var-decl name='_py_truncate' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='781' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='309184'> - <var-decl name='_py_twice' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='782' column='1'/> + <var-decl name='_py_twice' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='782' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='309568'> - <var-decl name='_py_txt' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='783' column='1'/> + <var-decl name='_py_txt' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='783' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='309952'> - <var-decl name='_py_type' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='784' column='1'/> + <var-decl name='_py_type' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='784' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='310336'> - <var-decl name='_py_type_params' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='785' column='1'/> + <var-decl name='_py_type_params' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='785' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='310784'> - <var-decl name='_py_tz' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='786' column='1'/> + <var-decl name='_py_tz' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='786' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='311168'> - <var-decl name='_py_tzinfo' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='787' column='1'/> + <var-decl name='_py_tzinfo' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='787' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='311552'> - <var-decl name='_py_tzname' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='788' column='1'/> + <var-decl name='_py_tzname' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='788' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='311936'> - <var-decl name='_py_uid' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='789' column='1'/> + <var-decl name='_py_uid' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='789' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='312320'> - <var-decl name='_py_unlink' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='790' column='1'/> + <var-decl name='_py_unlink' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='790' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='312704'> - <var-decl name='_py_unraisablehook' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='791' column='1'/> + <var-decl name='_py_unraisablehook' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='791' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='313152'> - <var-decl name='_py_uri' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='792' column='1'/> + <var-decl name='_py_uri' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='792' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='313536'> - <var-decl name='_py_usedforsecurity' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='793' column='1'/> + <var-decl name='_py_usedforsecurity' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='793' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='313984'> - <var-decl name='_py_value' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='794' column='1'/> + <var-decl name='_py_value' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='794' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='314368'> - <var-decl name='_py_values' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='795' column='1'/> + <var-decl name='_py_values' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='795' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='314752'> - <var-decl name='_py_version' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='796' column='1'/> + <var-decl name='_py_version' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='796' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='315136'> - <var-decl name='_py_volume' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='797' column='1'/> + <var-decl name='_py_volume' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='797' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='315520'> - <var-decl name='_py_wait_all' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='798' column='1'/> + <var-decl name='_py_wait_all' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='798' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='315968'> - <var-decl name='_py_warn_on_full_buffer' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='799' column='1'/> + <var-decl name='_py_warn_on_full_buffer' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='799' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='316480'> - <var-decl name='_py_warnings' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='800' column='1'/> + <var-decl name='_py_warnings' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='800' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='316928'> - <var-decl name='_py_warnoptions' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='801' column='1'/> + <var-decl name='_py_warnoptions' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='801' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='317376'> - <var-decl name='_py_wbits' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='802' column='1'/> + <var-decl name='_py_wbits' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='802' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='317760'> - <var-decl name='_py_week' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='803' column='1'/> + <var-decl name='_py_week' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='803' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='318144'> - <var-decl name='_py_weekday' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='804' column='1'/> + <var-decl name='_py_weekday' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='804' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='318528'> - <var-decl name='_py_which' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='805' column='1'/> + <var-decl name='_py_which' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='805' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='318912'> - <var-decl name='_py_who' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='806' column='1'/> + <var-decl name='_py_who' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='806' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='319296'> - <var-decl name='_py_withdata' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='807' column='1'/> + <var-decl name='_py_withdata' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='807' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='319744'> - <var-decl name='_py_writable' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='808' column='1'/> + <var-decl name='_py_writable' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='808' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320192'> - <var-decl name='_py_write' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='809' column='1'/> + <var-decl name='_py_write' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='809' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320576'> - <var-decl name='_py_write_through' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='810' column='1'/> + <var-decl name='_py_write_through' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='810' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='321024'> - <var-decl name='_py_year' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='811' column='1'/> + <var-decl name='_py_year' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='811' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='321408'> - <var-decl name='_py_zdict' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='812' column='1'/> + <var-decl name='_py_zdict' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='812' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='321792'> - <var-decl name='_py_zstd_dict' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='813' column='1'/> + <var-decl name='_py_zstd_dict' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='813' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__87' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1' id='type-id-1193'> + <class-decl name='__anonymous_struct__87' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1' id='type-id-1195'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-918' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> + <var-decl name='_data' type-id='type-id-920' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__91' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1' id='type-id-1194'> + <class-decl name='__anonymous_struct__91' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1' id='type-id-1196'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> + <var-decl name='_data' type-id='type-id-947' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__92' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1' id='type-id-1195'> + <class-decl name='__anonymous_struct__92' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1' id='type-id-1197'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-916' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> + <var-decl name='_data' type-id='type-id-918' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__93' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1' id='type-id-1196'> + <class-decl name='__anonymous_struct__93' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1' id='type-id-1198'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' 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-921' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> + <var-decl name='_data' type-id='type-id-923' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__97' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1' id='type-id-1197'> + <class-decl name='__anonymous_struct__97' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1' id='type-id-1199'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-925' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> + <var-decl name='_data' type-id='type-id-927' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__108' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1' id='type-id-1198'> + <class-decl name='__anonymous_struct__108' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1' id='type-id-1200'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-928' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> + <var-decl name='_data' type-id='type-id-930' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__126' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1' id='type-id-1199'> + <class-decl name='__anonymous_struct__126' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1' id='type-id-1201'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-938' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> + <var-decl name='_data' type-id='type-id-940' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__128' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1' id='type-id-1200'> + <class-decl name='__anonymous_struct__128' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1' id='type-id-1202'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-934' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> + <var-decl name='_data' type-id='type-id-936' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__151' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1' id='type-id-1201'> + <class-decl name='__anonymous_struct__151' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1' id='type-id-1203'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-919' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> + <var-decl name='_data' type-id='type-id-921' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__176' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1' id='type-id-1202'> + <class-decl name='__anonymous_struct__176' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1' id='type-id-1204'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> + <var-decl name='_data' type-id='type-id-928' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__219' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1' id='type-id-1203'> + <class-decl name='__anonymous_struct__219' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1' id='type-id-1205'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-923' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> + <var-decl name='_data' type-id='type-id-925' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__252' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1' id='type-id-1204'> + <class-decl name='__anonymous_struct__252' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1' id='type-id-1206'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-942' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> + <var-decl name='_data' type-id='type-id-944' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__255' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1' id='type-id-1205'> + <class-decl name='__anonymous_struct__255' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1' id='type-id-1207'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-940' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> + <var-decl name='_data' type-id='type-id-942' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__283' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1' id='type-id-1206'> + <class-decl name='__anonymous_struct__283' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1' id='type-id-1208'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-944' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> + <var-decl name='_data' type-id='type-id-946' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__301' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1' id='type-id-1207'> + <class-decl name='__anonymous_struct__301' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1' id='type-id-1209'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-936' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> + <var-decl name='_data' type-id='type-id-938' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__356' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1' id='type-id-1208'> + <class-decl name='__anonymous_struct__356' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1' id='type-id-1210'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-930' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> + <var-decl name='_data' type-id='type-id-932' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__839' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='815' column='1' id='type-id-826'> + <class-decl name='__anonymous_struct__839' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='815' column='1' id='type-id-828'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='816' column='1'/> + <var-decl name='_ascii' type-id='type-id-1059' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='816' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-939' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='817' column='1'/> + <var-decl name='_data' type-id='type-id-941' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='817' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__840' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='819' column='1' id='type-id-828'> + <class-decl name='__anonymous_struct__840' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='819' column='1' id='type-id-830'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_latin1' type-id='type-id-1060' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='820' column='1'/> + <var-decl name='_latin1' type-id='type-id-1062' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='820' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_data' type-id='type-id-939' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='821' column='1'/> + <var-decl name='_data' type-id='type-id-941' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='821' column='1'/> </data-member> </class-decl> - <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-1209'> + <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-1211'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-1210' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='14' column='1'/> + <var-decl name='next' type-id='type-id-1212' 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-1209' filepath='./Include/internal/pycore_hashtable.h' line='15' column='1' id='type-id-1211'/> - <class-decl name='_Py_slist_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1212' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='17' column='1' id='type-id-1213'> + <typedef-decl name='_Py_slist_item_t' type-id='type-id-1211' filepath='./Include/internal/pycore_hashtable.h' line='15' column='1' id='type-id-1213'/> + <class-decl name='_Py_slist_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1214' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='17' column='1' id='type-id-1215'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='head' type-id='type-id-1214' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='18' column='1'/> + <var-decl name='head' type-id='type-id-1216' 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-1213' filepath='./Include/internal/pycore_hashtable.h' line='19' column='1' id='type-id-1212'/> - <class-decl name='_Py_hashtable_entry_t' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1215' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='28' column='1' id='type-id-1216'> + <typedef-decl name='_Py_slist_t' type-id='type-id-1215' filepath='./Include/internal/pycore_hashtable.h' line='19' column='1' id='type-id-1214'/> + <class-decl name='_Py_hashtable_entry_t' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1217' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='28' column='1' id='type-id-1218'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_Py_slist_item' type-id='type-id-1211' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='30' column='1'/> + <var-decl name='_Py_slist_item' type-id='type-id-1213' 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-1217' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='32' column='1'/> + <var-decl name='key_hash' type-id='type-id-1219' 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-35' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='33' column='1'/> + <var-decl name='key' type-id='type-id-41' 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-35' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='34' column='1'/> + <var-decl name='value' type-id='type-id-41' 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-1216' filepath='./Include/internal/pycore_hashtable.h' line='35' column='1' id='type-id-1215'/> - <typedef-decl name='_Py_hashtable_t' type-id='type-id-1218' filepath='./Include/internal/pycore_hashtable.h' line='42' column='1' id='type-id-610'/> - <typedef-decl name='_Py_hashtable_hash_func' type-id='type-id-1219' filepath='./Include/internal/pycore_hashtable.h' line='44' column='1' id='type-id-615'/> - <typedef-decl name='_Py_hashtable_compare_func' type-id='type-id-1220' filepath='./Include/internal/pycore_hashtable.h' line='45' column='1' id='type-id-616'/> - <typedef-decl name='_Py_hashtable_destroy_func' type-id='type-id-572' filepath='./Include/internal/pycore_hashtable.h' line='46' column='1' id='type-id-617'/> - <typedef-decl name='_Py_hashtable_get_entry_func' type-id='type-id-1221' filepath='./Include/internal/pycore_hashtable.h' line='47' column='1' id='type-id-1222'/> - <class-decl name='_Py_hashtable_allocator_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-608' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='50' column='1' id='type-id-1223'> + <typedef-decl name='_Py_hashtable_entry_t' type-id='type-id-1218' filepath='./Include/internal/pycore_hashtable.h' line='35' column='1' id='type-id-1217'/> + <typedef-decl name='_Py_hashtable_t' type-id='type-id-1220' filepath='./Include/internal/pycore_hashtable.h' line='42' column='1' id='type-id-612'/> + <typedef-decl name='_Py_hashtable_hash_func' type-id='type-id-1221' filepath='./Include/internal/pycore_hashtable.h' line='44' column='1' id='type-id-617'/> + <typedef-decl name='_Py_hashtable_compare_func' type-id='type-id-1222' filepath='./Include/internal/pycore_hashtable.h' line='45' column='1' id='type-id-618'/> + <typedef-decl name='_Py_hashtable_destroy_func' type-id='type-id-574' filepath='./Include/internal/pycore_hashtable.h' line='46' column='1' id='type-id-619'/> + <typedef-decl name='_Py_hashtable_get_entry_func' type-id='type-id-1223' filepath='./Include/internal/pycore_hashtable.h' line='47' column='1' id='type-id-1224'/> + <class-decl name='_Py_hashtable_allocator_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='50' column='1' id='type-id-1225'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='malloc' type-id='type-id-1224' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='52' column='1'/> + <var-decl name='malloc' type-id='type-id-1226' 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-572' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='55' column='1'/> + <var-decl name='free' type-id='type-id-574' 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-1223' filepath='./Include/internal/pycore_hashtable.h' line='56' column='1' id='type-id-608'/> - <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-1218'> + <typedef-decl name='_Py_hashtable_allocator_t' type-id='type-id-1225' filepath='./Include/internal/pycore_hashtable.h' line='56' column='1' id='type-id-610'/> + <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-1220'> <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'/> + <var-decl name='nentries' type-id='type-id-14' 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'/> + <var-decl name='nbuckets' type-id='type-id-14' 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-1225' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='63' column='1'/> + <var-decl name='buckets' type-id='type-id-1227' 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-1222' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='65' column='1'/> + <var-decl name='get_entry_func' type-id='type-id-1224' 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-615' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='66' column='1'/> + <var-decl name='hash_func' type-id='type-id-617' 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-616' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='67' column='1'/> + <var-decl name='compare_func' type-id='type-id-618' 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-617' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='68' column='1'/> + <var-decl name='key_destroy_func' type-id='type-id-619' 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-617' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='69' column='1'/> + <var-decl name='value_destroy_func' type-id='type-id-619' 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-608' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='70' column='1'/> + <var-decl name='alloc' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='70' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_LocalMonitors' size-in-bits='88' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='82' column='1' id='type-id-1226'> + <class-decl name='_Py_LocalMonitors' size-in-bits='88' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='82' column='1' id='type-id-1228'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tools' type-id='type-id-908' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='83' column='1'/> + <var-decl name='tools' type-id='type-id-910' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='83' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_LocalMonitors' type-id='type-id-1226' filepath='./Include/internal/pycore_instruments.h' line='84' column='1' id='type-id-1227'/> - <class-decl name='_Py_GlobalMonitors' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='86' column='1' id='type-id-1228'> + <typedef-decl name='_Py_LocalMonitors' type-id='type-id-1228' filepath='./Include/internal/pycore_instruments.h' line='84' column='1' id='type-id-1229'/> + <class-decl name='_Py_GlobalMonitors' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='86' column='1' id='type-id-1230'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tools' type-id='type-id-918' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='87' column='1'/> + <var-decl name='tools' type-id='type-id-920' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='87' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_GlobalMonitors' type-id='type-id-1228' filepath='./Include/internal/pycore_instruments.h' line='88' column='1' id='type-id-1229'/> - <class-decl name='_PyCoLineInstrumentationData' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-1230' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='94' column='1' id='type-id-1231'> + <typedef-decl name='_Py_GlobalMonitors' type-id='type-id-1230' filepath='./Include/internal/pycore_instruments.h' line='88' column='1' id='type-id-1231'/> + <class-decl name='_PyCoLineInstrumentationData' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-1232' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='94' column='1' id='type-id-1233'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='bytes_per_entry' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='95' column='1'/> + <var-decl name='bytes_per_entry' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='95' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='data' type-id='type-id-924' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='96' column='1'/> + <var-decl name='data' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='96' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyCoLineInstrumentationData' type-id='type-id-1231' filepath='./Include/internal/pycore_instruments.h' line='97' column='1' id='type-id-1230'/> - <class-decl name='_PyCoMonitoringData' size-in-bits='1024' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='103' column='1' id='type-id-1232'> + <typedef-decl name='_PyCoLineInstrumentationData' type-id='type-id-1233' filepath='./Include/internal/pycore_instruments.h' line='97' column='1' id='type-id-1232'/> + <class-decl name='_PyCoMonitoringData' size-in-bits='1024' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='103' column='1' id='type-id-1234'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='local_monitors' type-id='type-id-1227' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='105' column='1'/> + <var-decl name='local_monitors' type-id='type-id-1229' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='105' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88'> - <var-decl name='active_monitors' type-id='type-id-1227' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='107' column='1'/> + <var-decl name='active_monitors' type-id='type-id-1229' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='107' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tools' type-id='type-id-1233' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='109' column='1'/> + <var-decl name='tools' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='109' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tool_versions' type-id='type-id-952' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='111' column='1'/> + <var-decl name='tool_versions' type-id='type-id-954' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='111' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='lines' type-id='type-id-1234' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='113' column='1'/> + <var-decl name='lines' type-id='type-id-1236' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='line_tools' type-id='type-id-1233' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='115' column='1'/> + <var-decl name='line_tools' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='per_instruction_opcodes' type-id='type-id-1233' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='118' column='1'/> + <var-decl name='per_instruction_opcodes' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='118' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='per_instruction_tools' type-id='type-id-1233' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='120' column='1'/> + <var-decl name='per_instruction_tools' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='120' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_pending_call_func' type-id='type-id-255' filepath='./Include/internal/pycore_interp_structs.h' line='31' column='1' id='type-id-1235'/> - <class-decl name='_pending_call' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='33' column='1' id='type-id-839'> + <typedef-decl name='_Py_pending_call_func' type-id='type-id-255' filepath='./Include/internal/pycore_interp_structs.h' line='31' column='1' id='type-id-1237'/> + <class-decl name='_pending_call' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='33' column='1' id='type-id-841'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='34' column='1'/> + <var-decl name='func' type-id='type-id-1237' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='34' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='arg' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='35' column='1'/> + <var-decl name='arg' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='35' 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_interp_structs.h' line='36' column='1'/> </data-member> </class-decl> - <class-decl name='_pending_calls' size-in-bits='57856' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='41' column='1' id='type-id-1236'> + <class-decl name='_pending_calls' size-in-bits='57856' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='41' column='1' id='type-id-1238'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='handling_thread' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='42' column='1'/> + <var-decl name='handling_thread' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='42' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='43' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='43' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='npending' type-id='type-id-456' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='45' column='1'/> + <var-decl name='npending' type-id='type-id-458' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='45' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='max' type-id='type-id-456' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='49' column='1'/> + <var-decl name='max' type-id='type-id-458' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='49' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='maxloop' type-id='type-id-456' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='54' column='1'/> + <var-decl name='maxloop' type-id='type-id-458' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='54' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='calls' type-id='type-id-840' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='55' column='1'/> + <var-decl name='calls' type-id='type-id-842' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='55' 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_interp_structs.h' line='56' column='1'/> @@ -20796,44 +20822,44 @@ <var-decl name='next' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='57' column='1'/> </data-member> </class-decl> - <enum-decl name='perf_status_t' naming-typedef-id='type-id-1237' filepath='./Include/internal/pycore_interp_structs.h' line='60' column='1' id='type-id-1238'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='perf_status_t' naming-typedef-id='type-id-1239' filepath='./Include/internal/pycore_interp_structs.h' line='60' column='1' id='type-id-1240'> + <underlying-type type-id='type-id-43'/> <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-1238' filepath='./Include/internal/pycore_interp_structs.h' line='64' column='1' id='type-id-1237'/> - <class-decl name='trampoline_api_st' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='69' column='1' id='type-id-1239'> + <typedef-decl name='perf_status_t' type-id='type-id-1240' filepath='./Include/internal/pycore_interp_structs.h' line='64' column='1' id='type-id-1239'/> + <class-decl name='trampoline_api_st' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='69' column='1' id='type-id-1241'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='init_state' type-id='type-id-1240' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='70' column='1'/> + <var-decl name='init_state' type-id='type-id-1242' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='write_state' type-id='type-id-1241' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='71' column='1'/> + <var-decl name='write_state' type-id='type-id-1243' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='free_state' type-id='type-id-255' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='73' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='state' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='74' column='1'/> + <var-decl name='state' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='74' 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_interp_structs.h' line='75' 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_interp_structs.h' line='80' column='1' id='type-id-1242'> + <class-decl name='_ceval_runtime_state' size-in-bits='58560' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='80' column='1' id='type-id-1244'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='perf' type-id='type-id-1243' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='93' column='1'/> + <var-decl name='perf' type-id='type-id-1245' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='pending_mainthread' type-id='type-id-1236' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='99' column='1'/> + <var-decl name='pending_mainthread' type-id='type-id-1238' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='99' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58496'> - <var-decl name='sys_trace_profile_mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='100' column='1'/> + <var-decl name='unused_sys_trace_profile_mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='100' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__41' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='81' column='1' id='type-id-1243'> + <class-decl name='__anonymous_struct__41' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='81' column='1' id='type-id-1245'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='status' type-id='type-id-1237' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='83' column='1'/> + <var-decl name='status' type-id='type-id-1239' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='83' 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_interp_structs.h' line='84' column='1'/> @@ -20842,79 +20868,79 @@ <var-decl name='extra_code_index' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='85' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='code_arena' type-id='type-id-1244' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='86' column='1'/> + <var-decl name='code_arena' type-id='type-id-1246' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='trampoline_api' type-id='type-id-1239' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='87' column='1'/> + <var-decl name='trampoline_api' type-id='type-id-1241' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='87' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='map_file' type-id='type-id-61' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='88' column='1'/> + <var-decl name='map_file' type-id='type-id-67' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='88' 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_interp_structs.h' line='89' column='1'/> </data-member> </class-decl> - <class-decl name='_ceval_state' size-in-bits='58112' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='104' column='1' id='type-id-1245'> + <class-decl name='_ceval_state' size-in-bits='58112' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='104' column='1' id='type-id-1247'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='instrumentation_version' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='108' column='1'/> + <var-decl name='instrumentation_version' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='108' 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_interp_structs.h' line='109' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='gil' type-id='type-id-1246' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='110' column='1'/> + <var-decl name='gil' type-id='type-id-1248' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='110' 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_interp_structs.h' line='111' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='pending' type-id='type-id-1236' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='112' column='1'/> + <var-decl name='pending' type-id='type-id-1238' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='112' column='1'/> </data-member> </class-decl> - <typedef-decl name='atexit_callbackfunc' type-id='type-id-232' filepath='./Include/internal/pycore_interp_structs.h' line='119' column='1' id='type-id-853'/> - <class-decl name='_atexit_runtime_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='121' column='1' id='type-id-1247'> + <typedef-decl name='atexit_callbackfunc' type-id='type-id-232' filepath='./Include/internal/pycore_interp_structs.h' line='119' column='1' id='type-id-855'/> + <class-decl name='_atexit_runtime_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='121' column='1' id='type-id-1249'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='122' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='122' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='callbacks' type-id='type-id-854' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='124' column='1'/> + <var-decl name='callbacks' type-id='type-id-856' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='124' 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_interp_structs.h' line='125' column='1'/> </data-member> </class-decl> - <class-decl name='atexit_callback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='134' column='1' id='type-id-1248'> + <class-decl name='atexit_callback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='134' column='1' id='type-id-1250'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-34' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='135' column='1'/> + <var-decl name='func' type-id='type-id-40' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='135' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='data' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='136' column='1'/> + <var-decl name='data' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='136' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='next' type-id='type-id-1249' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='137' column='1'/> + <var-decl name='next' type-id='type-id-1251' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='137' column='1'/> </data-member> </class-decl> - <typedef-decl name='atexit_callback' type-id='type-id-1248' filepath='./Include/internal/pycore_interp_structs.h' line='138' column='1' id='type-id-1250'/> - <class-decl name='atexit_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='140' column='1' id='type-id-1251'> + <typedef-decl name='atexit_callback' type-id='type-id-1250' filepath='./Include/internal/pycore_interp_structs.h' line='138' column='1' id='type-id-1252'/> + <class-decl name='atexit_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='140' column='1' id='type-id-1253'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ll_callbacks' type-id='type-id-1249' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='144' column='1'/> + <var-decl name='ll_callbacks' type-id='type-id-1251' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='144' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='callbacks' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='152' column='1'/> </data-member> </class-decl> - <class-decl name='PyGC_Head' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1252' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='159' column='1' id='type-id-1253'> + <class-decl name='PyGC_Head' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='159' column='1' id='type-id-1255'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_gc_next' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='162' column='1'/> + <var-decl name='_gc_next' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='162' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_gc_prev' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='166' column='1'/> + <var-decl name='_gc_prev' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='166' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyGC_Head' type-id='type-id-1253' filepath='./Include/internal/pycore_interp_structs.h' line='167' column='1' id='type-id-1252'/> - <class-decl name='gc_generation' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='171' column='1' id='type-id-879'> + <typedef-decl name='PyGC_Head' type-id='type-id-1255' filepath='./Include/internal/pycore_interp_structs.h' line='167' column='1' id='type-id-1254'/> + <class-decl name='gc_generation' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='171' column='1' id='type-id-881'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='head' type-id='type-id-1252' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='172' column='1'/> + <var-decl name='head' type-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='172' 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_interp_structs.h' line='173' column='1'/> @@ -20923,7 +20949,7 @@ <var-decl name='count' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='174' 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_interp_structs.h' line='186' column='1' id='type-id-881'> + <class-decl name='gc_generation_stats' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='186' column='1' id='type-id-883'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='collections' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='188' column='1'/> </data-member> @@ -20934,7 +20960,7 @@ <var-decl name='uncollectable' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='192' 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_interp_structs.h' line='204' column='1' id='type-id-1254'> + <class-decl name='_gc_runtime_state' size-in-bits='1920' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='204' column='1' id='type-id-272'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='trash_delete_later' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='207' column='1'/> </data-member> @@ -20948,16 +20974,16 @@ <var-decl name='debug' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='213' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='young' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='215' column='1'/> + <var-decl name='young' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='215' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='old' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='216' column='1'/> + <var-decl name='old' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='216' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='permanent_generation' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='218' column='1'/> + <var-decl name='permanent_generation' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='218' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='generation_stats' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='219' column='1'/> + <var-decl name='generation_stats' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='219' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1536'> <var-decl name='collecting' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='221' column='1'/> @@ -20981,29 +21007,29 @@ <var-decl name='phase' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='231' 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_interp_structs.h' line='265' column='1' id='type-id-1255'> + <class-decl name='_import_runtime_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='265' column='1' id='type-id-1256'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='inittab' type-id='type-id-1256' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='267' column='1'/> + <var-decl name='inittab' type-id='type-id-1257' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='267' 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_interp_structs.h' line='272' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='extensions' type-id='type-id-1257' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='283' column='1'/> + <var-decl name='extensions' type-id='type-id-1258' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='283' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='pkgcontext' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='285' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__40' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='273' column='1' id='type-id-1257'> + <class-decl name='__anonymous_struct__40' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='273' column='1' id='type-id-1258'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='275' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='275' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='hashtable' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='282' column='1'/> + <var-decl name='hashtable' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='282' column='1'/> </data-member> </class-decl> - <class-decl name='_import_state' size-in-bits='768' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='288' column='1' id='type-id-1258'> + <class-decl name='_import_state' size-in-bits='768' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='288' column='1' id='type-id-1259'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='modules' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='290' column='1'/> </data-member> @@ -21026,29 +21052,29 @@ <var-decl name='import_func' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='320' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='lock' type-id='type-id-1259' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='322' column='1'/> + <var-decl name='lock' type-id='type-id-1260' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='322' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='find_and_load' type-id='type-id-1260' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='328' column='1'/> + <var-decl name='find_and_load' type-id='type-id-1261' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='328' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__841' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='324' column='1' id='type-id-1260'> + <class-decl name='__anonymous_struct__841' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='324' column='1' id='type-id-1261'> <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_interp_structs.h' line='325' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='accumulated' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='326' column='1'/> + <var-decl name='accumulated' type-id='type-id-34' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='326' 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_interp_structs.h' line='327' 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_structs.h' line='339' column='1' id='type-id-1261'> + <class-decl name='_Py_long_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='339' column='1' id='type-id-1262'> <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_structs.h' line='340' column='1'/> </data-member> </class-decl> - <class-decl name='codecs_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='343' column='1' id='type-id-1262'> + <class-decl name='codecs_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='343' column='1' id='type-id-1263'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='search_path' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='345' column='1'/> </data-member> @@ -21062,50 +21088,50 @@ <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='360' 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_structs.h' line='365' column='1' id='type-id-1263'> + <class-decl name='_stoptheworld_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='365' column='1' id='type-id-1264'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='366' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='366' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='requested' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='370' column='1'/> + <var-decl name='requested' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='370' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='world_stopped' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='371' column='1'/> + <var-decl name='world_stopped' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='371' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24'> - <var-decl name='is_global' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='372' column='1'/> + <var-decl name='is_global' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='372' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='stop_event' type-id='type-id-1264' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='374' column='1'/> + <var-decl name='stop_event' type-id='type-id-1265' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='374' 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_structs.h' line='375' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='requester' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='377' column='1'/> + <var-decl name='requester' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='377' 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_structs.h' line='382' column='1' id='type-id-1265'> + <class-decl name='_rare_events' size-in-bits='40' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='382' column='1' id='type-id-1266'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='set_class' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='384' column='1'/> + <var-decl name='set_class' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='384' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='set_bases' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='386' column='1'/> + <var-decl name='set_bases' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='386' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='set_eval_frame_func' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='388' column='1'/> + <var-decl name='set_eval_frame_func' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='388' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24'> - <var-decl name='builtin_dict' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='390' column='1'/> + <var-decl name='builtin_dict' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='390' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='func_modification' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='392' column='1'/> + <var-decl name='func_modification' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='392' column='1'/> </data-member> </class-decl> - <typedef-decl name='_rare_events' type-id='type-id-1265' filepath='./Include/internal/pycore_interp_structs.h' line='393' column='1' id='type-id-1266'/> - <class-decl name='Bigint' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='396' column='1' id='type-id-1267'> + <typedef-decl name='_rare_events' type-id='type-id-1266' filepath='./Include/internal/pycore_interp_structs.h' line='393' column='1' id='type-id-1267'/> + <class-decl name='Bigint' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='396' column='1' id='type-id-1268'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-806' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='397' column='1'/> + <var-decl name='next' type-id='type-id-808' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='397' 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_interp_structs.h' line='398' column='1'/> @@ -21120,71 +21146,71 @@ <var-decl name='wds' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='398' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='x' type-id='type-id-906' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='399' column='1'/> + <var-decl name='x' type-id='type-id-908' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='399' column='1'/> </data-member> </class-decl> - <class-decl name='_dtoa_state' size-in-bits='19520' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='422' column='1' id='type-id-1268'> + <class-decl name='_dtoa_state' size-in-bits='19520' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='422' column='1' id='type-id-1269'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='p5s' type-id='type-id-807' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='425' column='1'/> + <var-decl name='p5s' type-id='type-id-809' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='425' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='freelist' type-id='type-id-807' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='427' column='1'/> + <var-decl name='freelist' type-id='type-id-809' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='427' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='preallocated' type-id='type-id-874' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='428' column='1'/> + <var-decl name='preallocated' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='428' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='19456'> - <var-decl name='preallocated_next' type-id='type-id-181' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='429' column='1'/> + <var-decl name='preallocated_next' type-id='type-id-186' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='429' column='1'/> </data-member> </class-decl> - <class-decl name='_py_code_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='434' column='1' id='type-id-1269'> + <class-decl name='_py_code_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='434' column='1' id='type-id-1270'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='435' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='435' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='constants' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='437' column='1'/> + <var-decl name='constants' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='437' 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_interp_structs.h' line='442' column='1' id='type-id-837'> + <class-decl name='_func_version_cache_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='442' column='1' id='type-id-839'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-312' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='443' column='1'/> + <var-decl name='func' type-id='type-id-314' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='443' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='code' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='444' 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_interp_structs.h' line='447' column='1' id='type-id-1270'> + <class-decl name='_py_func_state' size-in-bits='524352' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='447' column='1' id='type-id-1271'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_version' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='453' column='1'/> + <var-decl name='next_version' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='453' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='func_version_cache' type-id='type-id-838' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='458' column='1'/> + <var-decl name='func_version_cache' type-id='type-id-840' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='458' column='1'/> </data-member> </class-decl> - <class-decl name='_types_runtime_state' size-in-bits='26944' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='474' column='1' id='type-id-1271'> + <class-decl name='_types_runtime_state' size-in-bits='26944' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='474' column='1' id='type-id-1272'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_version_tag' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='478' column='1'/> + <var-decl name='next_version_tag' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='478' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='managed_static' type-id='type-id-1272' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='485' column='1'/> + <var-decl name='managed_static' type-id='type-id-1273' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='485' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__54' size-in-bits='26880' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='480' column='1' id='type-id-1272'> + <class-decl name='__anonymous_struct__54' size-in-bits='26880' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='480' column='1' id='type-id-1273'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='types' type-id='type-id-831' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='484' column='1'/> + <var-decl name='types' type-id='type-id-833' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='484' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__55' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='481' column='1' id='type-id-830'> + <class-decl name='__anonymous_struct__55' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='481' column='1' id='type-id-832'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='482' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='interp_count' type-id='type-id-409' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='483' column='1'/> + <var-decl name='interp_count' type-id='type-id-411' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='483' 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_interp_structs.h' line='491' column='1' id='type-id-904'> + <class-decl name='type_cache_entry' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='491' column='1' id='type-id-906'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='version' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='492' column='1'/> + <var-decl name='version' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='492' 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_interp_structs.h' line='496' column='1'/> @@ -21193,12 +21219,12 @@ <var-decl name='value' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='497' column='1'/> </data-member> </class-decl> - <class-decl name='type_cache' size-in-bits='786432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='502' column='1' id='type-id-1273'> + <class-decl name='type_cache' size-in-bits='786432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='502' column='1' id='type-id-1274'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='hashtable' type-id='type-id-905' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='503' column='1'/> + <var-decl name='hashtable' type-id='type-id-907' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='503' 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-484' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='506' column='1' id='type-id-1274'> + <class-decl name='managed_static_type_state' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-486' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='506' column='1' id='type-id-1275'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='507' column='1'/> </data-member> @@ -21221,47 +21247,47 @@ <var-decl name='tp_weaklist' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='519' column='1'/> </data-member> </class-decl> - <typedef-decl name='managed_static_type_state' type-id='type-id-1274' filepath='./Include/internal/pycore_interp_structs.h' line='520' column='1' id='type-id-484'/> - <class-decl name='types_state' size-in-bits='1129536' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='524' column='1' id='type-id-1275'> + <typedef-decl name='managed_static_type_state' type-id='type-id-1275' filepath='./Include/internal/pycore_interp_structs.h' line='520' column='1' id='type-id-486'/> + <class-decl name='types_state' size-in-bits='1129536' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='524' column='1' id='type-id-1276'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_version_tag' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='528' column='1'/> + <var-decl name='next_version_tag' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='528' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='type_cache' type-id='type-id-1273' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='530' column='1'/> + <var-decl name='type_cache' type-id='type-id-1274' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='530' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='786496'> - <var-decl name='builtins' type-id='type-id-1276' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='571' column='1'/> + <var-decl name='builtins' type-id='type-id-1277' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='571' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='863360'> - <var-decl name='for_extensions' type-id='type-id-1277' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='577' column='1'/> + <var-decl name='for_extensions' type-id='type-id-1278' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='577' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='867328'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='578' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='578' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='867392'> - <var-decl name='type_version_cache' type-id='type-id-820' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='584' column='1'/> + <var-decl name='type_version_cache' type-id='type-id-822' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='584' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__842' size-in-bits='76864' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='568' column='1' id='type-id-1276'> + <class-decl name='__anonymous_struct__842' size-in-bits='76864' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='568' column='1' id='type-id-1277'> <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_interp_structs.h' line='569' column='1'/> + <var-decl name='num_initialized' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='569' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='initialized' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='570' column='1'/> + <var-decl name='initialized' type-id='type-id-895' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='570' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__843' size-in-bits='3968' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='573' column='1' id='type-id-1277'> + <class-decl name='__anonymous_struct__843' size-in-bits='3968' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='573' column='1' id='type-id-1278'> <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_interp_structs.h' line='574' column='1'/> + <var-decl name='num_initialized' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='574' 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_interp_structs.h' line='575' column='1'/> + <var-decl name='next_index' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='575' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='initialized' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='576' column='1'/> + <var-decl name='initialized' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='576' column='1'/> </data-member> </class-decl> - <class-decl name='_warnings_runtime_state' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='587' column='1' id='type-id-1278'> + <class-decl name='_warnings_runtime_state' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='587' column='1' id='type-id-1279'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='filters' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='590' column='1'/> </data-member> @@ -21272,28 +21298,28 @@ <var-decl name='default_action' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='592' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='lock' type-id='type-id-1259' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='593' column='1'/> + <var-decl name='lock' type-id='type-id-1260' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='593' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='filters_version' type-id='type-id-184' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='594' column='1'/> + <var-decl name='filters_version' type-id='type-id-188' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='594' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> <var-decl name='context' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='595' 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_interp_structs.h' line='598' column='1' id='type-id-1279'> + <class-decl name='_Py_mem_interp_free_queue' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='598' column='1' id='type-id-1280'> <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_interp_structs.h' line='599' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='600' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='600' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-1280' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='601' column='1'/> + <var-decl name='head' type-id='type-id-1281' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='601' column='1'/> </data-member> </class-decl> - <enum-decl name='_Py_error_handler' naming-typedef-id='type-id-614' filepath='./Include/internal/pycore_interp_structs.h' line='607' column='1' id='type-id-1281'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_Py_error_handler' naming-typedef-id='type-id-616' filepath='./Include/internal/pycore_interp_structs.h' line='607' column='1' id='type-id-1282'> + <underlying-type type-id='type-id-43'/> <enumerator name='_Py_ERROR_UNKNOWN' value='0'/> <enumerator name='_Py_ERROR_STRICT' value='1'/> <enumerator name='_Py_ERROR_SURROGATEESCAPE' value='2'/> @@ -21304,35 +21330,35 @@ <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-1281' filepath='./Include/internal/pycore_interp_structs.h' line='617' column='1' id='type-id-614'/> - <class-decl name='_Py_unicode_runtime_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='619' column='1' id='type-id-1282'> + <typedef-decl name='_Py_error_handler' type-id='type-id-1282' filepath='./Include/internal/pycore_interp_structs.h' line='617' column='1' id='type-id-616'/> + <class-decl name='_Py_unicode_runtime_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='619' column='1' id='type-id-1283'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='620' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='620' 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_interp_structs.h' line='623' 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_interp_structs.h' line='626' column='1' id='type-id-1283'> + <class-decl name='_Py_unicode_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='626' column='1' id='type-id-1284'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ids' type-id='type-id-1282' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='627' column='1'/> + <var-decl name='ids' type-id='type-id-1283' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='627' 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_interp_structs.h' line='632' column='1' id='type-id-1284'> + <class-decl name='_Py_unicode_fs_codec' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='632' column='1' id='type-id-1285'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='encoding' type-id='type-id-17' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='633' column='1'/> + <var-decl name='encoding' type-id='type-id-24' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='633' 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_interp_structs.h' line='634' 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_interp_structs.h' line='635' column='1'/> + <var-decl name='errors' type-id='type-id-24' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='635' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='error_handler' type-id='type-id-614' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='636' column='1'/> + <var-decl name='error_handler' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='636' 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_interp_structs.h' line='639' column='1' id='type-id-1285'> + <class-decl name='_Py_unicode_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='639' column='1' id='type-id-1286'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='640' column='1'/> </data-member> @@ -21340,18 +21366,18 @@ <var-decl name='array' type-id='type-id-241' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='641' 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_interp_structs.h' line='646' column='1' id='type-id-1286'> + <class-decl name='_Py_unicode_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='646' column='1' id='type-id-1287'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fs_codec' type-id='type-id-1284' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='647' column='1'/> + <var-decl name='fs_codec' type-id='type-id-1285' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='647' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ucnhash_capi' type-id='type-id-1287' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='649' column='1'/> + <var-decl name='ucnhash_capi' type-id='type-id-1288' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='649' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ids' type-id='type-id-1285' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='652' column='1'/> + <var-decl name='ids' type-id='type-id-1286' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='652' column='1'/> </data-member> </class-decl> - <class-decl name='callable_cache' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='656' column='1' id='type-id-1288'> + <class-decl name='callable_cache' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='656' column='1' id='type-id-1289'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='isinstance' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='657' column='1'/> </data-member> @@ -21365,8 +21391,8 @@ <var-decl name='object__getattribute__' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='660' column='1'/> </data-member> </class-decl> - <typedef-decl name='pytype_slotdef' type-id='type-id-380' filepath='./Include/internal/pycore_interp_structs.h' line='669' column='1' id='type-id-1289'/> - <class-decl name='_Py_interp_cached_objects' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='672' column='1' id='type-id-1290'> + <typedef-decl name='pytype_slotdef' type-id='type-id-382' filepath='./Include/internal/pycore_interp_structs.h' line='669' column='1' id='type-id-1290'/> + <class-decl name='_Py_interp_cached_objects' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='672' column='1' id='type-id-1291'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='interned_strings' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='676' column='1'/> </data-member> @@ -21377,7 +21403,7 @@ <var-decl name='type_slots_pname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='680' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='type_slots_ptrs' type-id='type-id-898' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='681' column='1'/> + <var-decl name='type_slots_ptrs' type-id='type-id-900' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='681' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> <var-decl name='generic_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='684' column='1'/> @@ -21401,299 +21427,299 @@ <var-decl name='constevaluator_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='690' 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_interp_structs.h' line='693' column='1' id='type-id-1291'> + <class-decl name='_Py_interp_static_objects' size-in-bits='1088' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='693' column='1' id='type-id-1292'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='singletons' type-id='type-id-1292' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='700' column='1'/> + <var-decl name='singletons' type-id='type-id-1293' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='700' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__844' size-in-bits='1088' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='694' column='1' id='type-id-1292'> + <class-decl name='__anonymous_struct__844' size-in-bits='1088' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='694' column='1' id='type-id-1293'> <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_interp_structs.h' line='695' 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-1252' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='697' column='1'/> + <var-decl name='_hamt_empty_gc_not_used' type-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='697' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='hamt_empty' type-id='type-id-1293' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='698' column='1'/> + <var-decl name='hamt_empty' type-id='type-id-1294' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='698' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='last_resort_memory_error' type-id='type-id-1034' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='699' column='1'/> + <var-decl name='last_resort_memory_error' type-id='type-id-1036' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='699' column='1'/> </data-member> </class-decl> - <class-decl name='_is' size-in-bits='1806464' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='764' column='1' id='type-id-1294'> + <class-decl name='_is' size-in-bits='1806592' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='764' column='1' id='type-id-1295'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ceval' type-id='type-id-1245' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='769' column='1'/> + <var-decl name='ceval' type-id='type-id-1247' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='769' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58112'> - <var-decl name='_malloced' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='775' column='1'/> + <var-decl name='_malloced' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='772' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58176'> - <var-decl name='next' type-id='type-id-33' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='777' column='1'/> + <var-decl name='next' type-id='type-id-39' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='774' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58240'> - <var-decl name='id' type-id='type-id-409' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='779' column='1'/> + <var-decl name='id' type-id='type-id-411' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='776' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58304'> - <var-decl name='id_refcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='780' column='1'/> + <var-decl name='id_refcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='777' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58368'> - <var-decl name='requires_idref' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='781' column='1'/> + <var-decl name='requires_idref' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='778' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58432'> - <var-decl name='_whence' type-id='type-id-184' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='783' column='1'/> + <var-decl name='_whence' type-id='type-id-188' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='780' 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_structs.h' line='789' column='1'/> + <var-decl name='_initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='786' 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_structs.h' line='791' column='1'/> + <var-decl name='_ready' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='788' 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_structs.h' line='792' column='1'/> + <var-decl name='finalizing' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='789' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58624'> - <var-decl name='last_restart_version' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='794' column='1'/> + <var-decl name='last_restart_version' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='791' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='58688'> - <var-decl name='threads' type-id='type-id-1295' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='809' column='1'/> + <var-decl name='threads' type-id='type-id-1296' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='806' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='59072'> - <var-decl name='runtime' type-id='type-id-171' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='814' column='1'/> + <var-decl name='runtime' type-id='type-id-177' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='811' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='59136'> - <var-decl name='_finalizing' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='821' column='1'/> + <var-decl name='_finalizing' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='818' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='59200'> - <var-decl name='_finalizing_id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='823' column='1'/> + <var-decl name='_finalizing_id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='820' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='59264'> - <var-decl name='gc' type-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='825' column='1'/> + <var-decl name='gc' type-id='type-id-272' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='822' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='61184'> - <var-decl name='sysdict' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='840' column='1'/> + <var-decl name='sysdict' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='837' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='61248'> - <var-decl name='builtins' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='843' column='1'/> + <var-decl name='builtins' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='840' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='61312'> - <var-decl name='imports' type-id='type-id-1258' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='845' column='1'/> + <var-decl name='imports' type-id='type-id-1259' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='842' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='62080'> - <var-decl name='_gil' type-id='type-id-1175' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='848' column='1'/> + <var-decl name='_gil' type-id='type-id-1177' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='845' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='63744'> - <var-decl name='_code_object_generation' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='850' column='1'/> + <var-decl name='_code_object_generation' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='847' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='63808'> - <var-decl name='codecs' type-id='type-id-1262' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='857' column='1'/> + <var-decl name='codecs' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='854' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64064'> - <var-decl name='config' type-id='type-id-272' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='859' column='1'/> + <var-decl name='config' type-id='type-id-274' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='856' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67712'> - <var-decl name='feature_flags' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='860' column='1'/> + <var-decl name='feature_flags' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='857' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67776'> - <var-decl name='dict' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='862' column='1'/> + <var-decl name='dict' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='859' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67840'> - <var-decl name='sysdict_copy' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='864' column='1'/> + <var-decl name='sysdict_copy' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='861' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67904'> - <var-decl name='builtins_copy' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='865' column='1'/> + <var-decl name='builtins_copy' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='862' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67968'> - <var-decl name='eval_frame' type-id='type-id-1053' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='867' column='1'/> + <var-decl name='eval_frame' type-id='type-id-1055' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='864' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68032'> - <var-decl name='func_watchers' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='869' column='1'/> + <var-decl name='func_watchers' type-id='type-id-814' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='866' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68544'> - <var-decl name='active_func_watchers' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='871' column='1'/> + <var-decl name='active_func_watchers' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='868' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68608'> - <var-decl name='co_extra_user_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='873' column='1'/> + <var-decl name='co_extra_user_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='870' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='68672'> - <var-decl name='co_extra_freefuncs' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='874' column='1'/> + <var-decl name='co_extra_freefuncs' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='871' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84992'> - <var-decl name='xi' type-id='type-id-1134' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='877' column='1'/> + <var-decl name='xi' type-id='type-id-1136' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='874' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85376'> - <var-decl name='before_forkers' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='880' column='1'/> + <var-decl name='before_forkers' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='877' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85440'> - <var-decl name='after_forkers_parent' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='881' column='1'/> + <var-decl name='after_forkers_parent' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='878' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85504'> - <var-decl name='after_forkers_child' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='882' column='1'/> + <var-decl name='after_forkers_child' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='879' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85568'> - <var-decl name='warnings' type-id='type-id-1278' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='885' column='1'/> + <var-decl name='warnings' type-id='type-id-1279' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='882' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86080'> - <var-decl name='atexit' type-id='type-id-1251' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='886' column='1'/> + <var-decl name='atexit' type-id='type-id-1253' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='883' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86208'> - <var-decl name='stoptheworld' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='887' column='1'/> + <var-decl name='stoptheworld' type-id='type-id-1264' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='884' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86400'> - <var-decl name='qsbr' type-id='type-id-1296' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='888' column='1'/> + <var-decl name='qsbr' type-id='type-id-1297' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='885' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86784'> - <var-decl name='asyncio_tasks_head' type-id='type-id-1280' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='900' column='1'/> + <var-decl name='asyncio_tasks_head' type-id='type-id-1281' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='897' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86912'> - <var-decl name='asyncio_tasks_lock' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='903' column='1'/> + <var-decl name='asyncio_tasks_lock' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='900' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='86976'> - <var-decl name='obmalloc' type-id='type-id-1297' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='915' column='1'/> + <var-decl name='obmalloc' type-id='type-id-1298' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='912' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='87040'> - <var-decl name='audit_hooks' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='917' column='1'/> + <var-decl name='audit_hooks' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='914' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='87104'> - <var-decl name='type_watchers' type-id='type-id-822' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='918' column='1'/> + <var-decl name='type_watchers' type-id='type-id-824' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='915' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='87616'> - <var-decl name='code_watchers' type-id='type-id-808' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='919' column='1'/> + <var-decl name='code_watchers' type-id='type-id-810' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='916' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88128'> - <var-decl name='context_watchers' type-id='type-id-810' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='920' column='1'/> + <var-decl name='context_watchers' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='917' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88640'> - <var-decl name='active_code_watchers' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='922' column='1'/> + <var-decl name='active_code_watchers' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='919' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88648'> - <var-decl name='active_context_watchers' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='923' column='1'/> + <var-decl name='active_context_watchers' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='920' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='88704'> - <var-decl name='object_state' type-id='type-id-1298' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='925' column='1'/> + <var-decl name='object_state' type-id='type-id-1299' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='922' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='93760'> - <var-decl name='unicode' type-id='type-id-1286' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='926' column='1'/> + <var-decl name='unicode' type-id='type-id-1287' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='923' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='94208'> - <var-decl name='long_state' type-id='type-id-1261' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='927' column='1'/> + <var-decl name='long_state' type-id='type-id-1262' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='924' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='94272'> - <var-decl name='dtoa' type-id='type-id-1268' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='928' column='1'/> + <var-decl name='dtoa' type-id='type-id-1269' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='925' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='113792'> - <var-decl name='func_state' type-id='type-id-1270' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='929' column='1'/> + <var-decl name='func_state' type-id='type-id-1271' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='926' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='638144'> - <var-decl name='code_state' type-id='type-id-1269' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='930' column='1'/> + <var-decl name='code_state' type-id='type-id-1270' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='927' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='638272'> - <var-decl name='dict_state' type-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='932' column='1'/> + <var-decl name='dict_state' type-id='type-id-1166' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='929' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='638848'> - <var-decl name='exc_state' type-id='type-id-1165' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='933' column='1'/> + <var-decl name='exc_state' type-id='type-id-1167' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='930' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='639104'> - <var-decl name='mem_free_queue' type-id='type-id-1279' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='934' column='1'/> + <var-decl name='mem_free_queue' type-id='type-id-1280' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='931' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='639296'> - <var-decl name='ast' type-id='type-id-1115' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='936' column='1'/> + <var-decl name='ast' type-id='type-id-1117' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='933' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='655104'> - <var-decl name='types' type-id='type-id-1275' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='937' column='1'/> + <var-decl name='types' type-id='type-id-1276' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='934' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1784640'> - <var-decl name='callable_cache' type-id='type-id-1288' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='938' column='1'/> + <var-decl name='callable_cache' type-id='type-id-1289' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='935' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1784896'> - <var-decl name='common_consts' type-id='type-id-815' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='939' column='1'/> + <var-decl name='common_consts' type-id='type-id-817' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='936' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785216'> - <var-decl name='jit' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='940' column='1'/> + <var-decl name='jit' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='937' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785280'> - <var-decl name='executor_list_head' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='941' column='1'/> + <var-decl name='executor_list_head' type-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='938' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785344'> - <var-decl name='executor_deletion_list_head' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='942' column='1'/> + <var-decl name='executor_deletion_list_head' type-id='type-id-340' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='939' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785408'> - <var-decl name='executor_deletion_list_remaining_capacity' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='943' column='1'/> + <var-decl name='executor_deletion_list_remaining_capacity' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='940' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785472'> - <var-decl name='trace_run_counter' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='944' column='1'/> + <var-decl name='trace_run_counter' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='941' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785536'> - <var-decl name='rare_events' type-id='type-id-1266' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='945' column='1'/> + <var-decl name='rare_events' type-id='type-id-1267' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='942' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785600'> - <var-decl name='builtins_dict_watcher' type-id='type-id-398' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='946' column='1'/> + <var-decl name='builtins_dict_watcher' type-id='type-id-400' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='943' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785664'> - <var-decl name='monitors' type-id='type-id-1229' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='948' column='1'/> + <var-decl name='monitors' type-id='type-id-1231' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='945' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785792'> - <var-decl name='sys_profile_initialized' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='949' column='1'/> + <var-decl name='sys_profile_once_flag' type-id='type-id-988' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='946' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785800'> - <var-decl name='sys_trace_initialized' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='950' column='1'/> + <var-decl name='sys_trace_once_flag' type-id='type-id-988' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='947' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785856'> - <var-decl name='sys_profiling_threads' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='951' column='1'/> + <var-decl name='sys_profiling_threads' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='948' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785920'> - <var-decl name='sys_tracing_threads' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='952' column='1'/> + <var-decl name='sys_tracing_threads' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='949' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1785984'> - <var-decl name='monitoring_callables' type-id='type-id-818' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='953' column='1'/> + <var-decl name='monitoring_callables' type-id='type-id-820' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='950' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1795712'> - <var-decl name='monitoring_tool_names' type-id='type-id-817' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='954' column='1'/> + <var-decl name='monitoring_tool_names' type-id='type-id-819' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='951' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1796224'> - <var-decl name='monitoring_tool_versions' type-id='type-id-952' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='955' column='1'/> + <var-decl name='monitoring_tool_versions' type-id='type-id-954' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='952' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1796736'> - <var-decl name='cached_objects' type-id='type-id-1290' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='957' column='1'/> + <var-decl name='cached_objects' type-id='type-id-1291' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='954' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1798016'> - <var-decl name='static_objects' type-id='type-id-1291' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='958' column='1'/> + <var-decl name='static_objects' type-id='type-id-1292' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='955' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1799104'> - <var-decl name='_interactive_src_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='960' column='1'/> + <var-decl name='_interactive_src_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='957' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1799168'> - <var-decl name='_initial_thread' type-id='type-id-1299' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='971' column='1'/> + <var-decl name='_initial_thread' type-id='type-id-1300' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='968' column='1'/> </data-member> </class-decl> - <class-decl name='pythreads' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='795' column='1' id='type-id-1295'> + <class-decl name='pythreads' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='792' column='1' id='type-id-1296'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_unique_id' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='796' column='1'/> + <var-decl name='next_unique_id' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='793' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='798' column='1'/> + <var-decl name='head' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='795' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='preallocated' type-id='type-id-1300' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='799' column='1'/> + <var-decl name='preallocated' type-id='type-id-1301' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='796' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='main' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='801' column='1'/> + <var-decl name='main' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='798' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='803' column='1'/> + <var-decl name='count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='800' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='stacksize' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='808' column='1'/> + <var-decl name='stacksize' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp_structs.h' line='805' column='1'/> </data-member> </class-decl> - <class-decl name='_PyInterpreterFrame' size-in-bits='704' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='30' column='1' id='type-id-423'> + <class-decl name='_PyInterpreterFrame' size-in-bits='704' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='30' column='1' id='type-id-425'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='f_executable' type-id='type-id-433' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='31' column='1'/> + <var-decl name='f_executable' type-id='type-id-435' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='31' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous' type-id='type-id-431' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='32' column='1'/> + <var-decl name='previous' type-id='type-id-433' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='32' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_funcobj' type-id='type-id-433' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='33' column='1'/> + <var-decl name='f_funcobj' type-id='type-id-435' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> <var-decl name='f_globals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='34' column='1'/> @@ -21705,202 +21731,202 @@ <var-decl name='f_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='frame_obj' type-id='type-id-413' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='37' column='1'/> + <var-decl name='frame_obj' type-id='type-id-415' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='37' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='instr_ptr' type-id='type-id-363' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='38' column='1'/> + <var-decl name='instr_ptr' type-id='type-id-365' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='stackpointer' type-id='type-id-395' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='39' column='1'/> + <var-decl name='stackpointer' type-id='type-id-397' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='39' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='return_offset' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='44' column='1'/> + <var-decl name='return_offset' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='44' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='592'> - <var-decl name='owner' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='45' column='1'/> + <var-decl name='owner' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='45' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='600'> - <var-decl name='visited' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='50' column='1'/> + <var-decl name='visited' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='50' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='localsplus' type-id='type-id-434' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='53' column='1'/> + <var-decl name='localsplus' type-id='type-id-436' visibility='default' filepath='./Include/internal/pycore_interpframe_structs.h' line='53' 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-1280'> + <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-1281'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-1301' visibility='default' filepath='./Include/internal/pycore_llist.h' line='35' column='1'/> + <var-decl name='next' type-id='type-id-1302' 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-1301' visibility='default' filepath='./Include/internal/pycore_llist.h' line='36' column='1'/> + <var-decl name='prev' type-id='type-id-1302' 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-1264' visibility='default' filepath='./Include/internal/pycore_lock.h' line='74' column='1' id='type-id-1302'> + <class-decl name='PyEvent' size-in-bits='8' is-struct='yes' naming-typedef-id='type-id-1265' visibility='default' filepath='./Include/internal/pycore_lock.h' line='67' column='1' id='type-id-1303'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_lock.h' line='75' column='1'/> + <var-decl name='v' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_lock.h' line='68' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyEvent' type-id='type-id-1302' filepath='./Include/internal/pycore_lock.h' line='76' column='1' id='type-id-1264'/> - <class-decl name='_PyRecursiveMutex' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1259' visibility='default' filepath='./Include/internal/pycore_lock.h' line='156' column='1' id='type-id-1303'> + <typedef-decl name='PyEvent' type-id='type-id-1303' filepath='./Include/internal/pycore_lock.h' line='69' column='1' id='type-id-1265'/> + <class-decl name='_PyRecursiveMutex' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1260' visibility='default' filepath='./Include/internal/pycore_lock.h' line='149' column='1' id='type-id-1304'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_lock.h' line='157' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_lock.h' line='150' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='thread' type-id='type-id-462' visibility='default' filepath='./Include/internal/pycore_lock.h' line='158' column='1'/> + <var-decl name='thread' type-id='type-id-464' visibility='default' filepath='./Include/internal/pycore_lock.h' line='151' 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='159' column='1'/> + <var-decl name='level' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_lock.h' line='152' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyRecursiveMutex' type-id='type-id-1303' filepath='./Include/internal/pycore_lock.h' line='160' column='1' id='type-id-1259'/> - <class-decl name='_PyRWMutex' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1304' visibility='default' filepath='./Include/internal/pycore_lock.h' line='194' column='1' id='type-id-1305'> + <typedef-decl name='_PyRecursiveMutex' type-id='type-id-1304' filepath='./Include/internal/pycore_lock.h' line='153' column='1' id='type-id-1260'/> + <class-decl name='_PyRWMutex' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1305' visibility='default' filepath='./Include/internal/pycore_lock.h' line='187' column='1' id='type-id-1306'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='bits' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_lock.h' line='195' column='1'/> + <var-decl name='bits' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_lock.h' line='188' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyRWMutex' type-id='type-id-1305' filepath='./Include/internal/pycore_lock.h' line='196' column='1' id='type-id-1304'/> - <class-decl name='_reftracer_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='16' column='1' id='type-id-1306'> + <typedef-decl name='_PyRWMutex' type-id='type-id-1306' filepath='./Include/internal/pycore_lock.h' line='189' column='1' id='type-id-1305'/> + <class-decl name='_reftracer_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='16' column='1' id='type-id-1307'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tracer_func' type-id='type-id-487' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='17' column='1'/> + <var-decl name='tracer_func' type-id='type-id-489' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='17' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tracer_data' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='18' column='1'/> + <var-decl name='tracer_data' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='18' 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='22' column='1' id='type-id-1307'> + <class-decl name='_py_object_runtime_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='22' column='1' id='type-id-1308'> <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='26' column='1'/> </data-member> </class-decl> - <class-decl name='_py_object_state' size-in-bits='5056' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='29' column='1' id='type-id-1298'> + <class-decl name='_py_object_state' size-in-bits='5056' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='29' column='1' id='type-id-1299'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='freelists' type-id='type-id-1174' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='31' column='1'/> + <var-decl name='freelists' type-id='type-id-1176' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='31' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4992'> <var-decl name='_not_used' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='42' column='1'/> </data-member> </class-decl> - <typedef-decl name='pymem_uint' type-id='type-id-105' filepath='./Include/internal/pycore_obmalloc.h' line='12' column='1' id='type-id-1308'/> - <typedef-decl name='pymem_block' type-id='type-id-309' filepath='./Include/internal/pycore_obmalloc.h' line='251' column='1' id='type-id-1309'/> - <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-1310'> + <typedef-decl name='pymem_uint' type-id='type-id-111' filepath='./Include/internal/pycore_obmalloc.h' line='12' column='1' id='type-id-1309'/> + <typedef-decl name='pymem_block' type-id='type-id-311' filepath='./Include/internal/pycore_obmalloc.h' line='251' column='1' id='type-id-1310'/> + <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-1311'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ref' type-id='type-id-1311' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> + <var-decl name='ref' type-id='type-id-1312' 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-1312' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='257' column='1'/> + <var-decl name='freeblock' type-id='type-id-1313' 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-1313' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='258' column='1'/> + <var-decl name='nextpool' type-id='type-id-1314' 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-1313' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='259' column='1'/> + <var-decl name='prevpool' type-id='type-id-1314' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='260' column='1'/> + <var-decl name='arenaindex' type-id='type-id-1309' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='261' column='1'/> + <var-decl name='szidx' type-id='type-id-1309' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='262' column='1'/> + <var-decl name='nextoffset' type-id='type-id-1309' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='263' column='1'/> + <var-decl name='maxnextoffset' type-id='type-id-1309' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='263' column='1'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1' id='type-id-1311'> + <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1' id='type-id-1312'> <data-member access='public'> - <var-decl name='_padding' type-id='type-id-1312' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1'/> + <var-decl name='_padding' type-id='type-id-1313' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> + <var-decl name='count' type-id='type-id-1309' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> </data-member> </union-decl> - <typedef-decl name='poolp' type-id='type-id-1313' filepath='./Include/internal/pycore_obmalloc.h' line='266' column='1' id='type-id-894'/> - <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-1314'> + <typedef-decl name='poolp' type-id='type-id-1314' filepath='./Include/internal/pycore_obmalloc.h' line='266' column='1' id='type-id-896'/> + <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-1315'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='address' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='275' column='1'/> + <var-decl name='address' type-id='type-id-371' 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-1312' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='278' column='1'/> + <var-decl name='pool_address' type-id='type-id-1313' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='283' column='1'/> + <var-decl name='nfreepools' type-id='type-id-1309' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='286' column='1'/> + <var-decl name='ntotalpools' type-id='type-id-1309' 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-1313' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='289' column='1'/> + <var-decl name='freepools' type-id='type-id-1314' 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-850' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='305' column='1'/> + <var-decl name='nextarena' type-id='type-id-852' 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-850' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='306' column='1'/> + <var-decl name='prevarena' type-id='type-id-852' 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-1315'> + <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-1316'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='used' type-id='type-id-895' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='420' column='1'/> + <var-decl name='used' type-id='type-id-897' 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-1316'> + <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-1317'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arenas' type-id='type-id-850' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='479' column='1'/> + <var-decl name='arenas' type-id='type-id-852' 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-1308' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='481' column='1'/> + <var-decl name='maxarenas' type-id='type-id-1309' 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-850' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='486' column='1'/> + <var-decl name='unused_arena_objects' type-id='type-id-852' 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-850' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='491' column='1'/> + <var-decl name='usable_arenas' type-id='type-id-852' 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-851' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='494' column='1'/> + <var-decl name='nfp2lasta' type-id='type-id-853' 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'/> + <var-decl name='narenas_currently_allocated' type-id='type-id-14' 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'/> + <var-decl name='ntimes_arena_allocated' type-id='type-id-14' 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'/> + <var-decl name='narenas_highwater' type-id='type-id-14' 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-842' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='619' column='1' id='type-id-1317'> + <class-decl name='arena_coverage_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-844' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='619' column='1' id='type-id-1318'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tail_hi' type-id='type-id-456' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='620' column='1'/> + <var-decl name='tail_hi' type-id='type-id-458' 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-456' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='621' column='1'/> + <var-decl name='tail_lo' type-id='type-id-458' 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-1317' filepath='./Include/internal/pycore_obmalloc.h' line='622' column='1' id='type-id-842'/> - <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-1318'> + <typedef-decl name='arena_coverage_t' type-id='type-id-1318' filepath='./Include/internal/pycore_obmalloc.h' line='622' column='1' id='type-id-844'/> + <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-1319'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arenas' type-id='type-id-843' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='629' column='1'/> + <var-decl name='arenas' type-id='type-id-845' 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-1319'> + <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-1320'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ptrs' type-id='type-id-846' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='634' column='1'/> + <var-decl name='ptrs' type-id='type-id-848' 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-1320'> + <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-1321'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ptrs' type-id='type-id-849' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='638' column='1'/> + <var-decl name='ptrs' type-id='type-id-851' 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-1320' filepath='./Include/internal/pycore_obmalloc.h' line='639' column='1' id='type-id-1321'/> - <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-1322'> + <typedef-decl name='arena_map_top_t' type-id='type-id-1321' filepath='./Include/internal/pycore_obmalloc.h' line='639' column='1' id='type-id-1322'/> + <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-1323'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arena_map_root' type-id='type-id-1321' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='648' column='1'/> + <var-decl name='arena_map_root' type-id='type-id-1322' 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'/> @@ -21909,7 +21935,7 @@ <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-1323'> + <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-1324'> <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> @@ -21917,240 +21943,240 @@ <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-1324'> + <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-1325'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pools' type-id='type-id-1315' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='666' column='1'/> + <var-decl name='pools' type-id='type-id-1316' 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-1316' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='667' column='1'/> + <var-decl name='mgmt' type-id='type-id-1317' 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-1322' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='669' column='1'/> + <var-decl name='usage' type-id='type-id-1323' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='669' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyArena' type-id='type-id-870' filepath='./Include/internal/pycore_pyarena.h' line='13' column='1' id='type-id-1325'/> - <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-1326'> + <typedef-decl name='PyArena' type-id='type-id-872' filepath='./Include/internal/pycore_pyarena.h' line='13' column='1' id='type-id-1326'/> + <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-1327'> <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-1327' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='71' column='1'/> + <var-decl name='_condattr_monotonic' type-id='type-id-1328' 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-1280' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='82' column='1'/> + <var-decl name='handles' type-id='type-id-1281' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='82' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__37' 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-1327'> + <class-decl name='__anonymous_struct__37' 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-1328'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ptr' type-id='type-id-1328' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='66' column='1'/> + <var-decl name='ptr' type-id='type-id-1329' 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-1329' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='69' column='1'/> + <var-decl name='val' type-id='type-id-1330' 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='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='41' column='1' id='type-id-1330'> + <class-decl name='_qsbr_thread_state' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='41' column='1' id='type-id-1331'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='seq' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='43' column='1'/> + <var-decl name='seq' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='43' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='shared' type-id='type-id-1331' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='46' column='1'/> + <var-decl name='shared' type-id='type-id-1332' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='46' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tstate' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='49' column='1'/> + <var-decl name='tstate' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='49' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> <var-decl name='deferred_count' 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='256'> - <var-decl name='deferred_memory' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='57' column='1'/> + <var-decl name='deferred_memory' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='57' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='deferred_page_memory' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='62' column='1'/> + <var-decl name='deferred_page_memory' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='62' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='should_process' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='65' column='1'/> + <var-decl name='should_process' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='65' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='392'> - <var-decl name='allocated' type-id='type-id-344' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='68' column='1'/> + <var-decl name='allocated' type-id='type-id-346' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='freelist_next' type-id='type-id-571' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='69' column='1'/> + <var-decl name='freelist_next' type-id='type-id-573' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='69' 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='73' column='1' id='type-id-1332'> + <class-decl name='_qsbr_pad' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='73' column='1' id='type-id-1333'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='qsbr' type-id='type-id-1330' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='74' column='1'/> + <var-decl name='qsbr' type-id='type-id-1331' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='74' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='__padding' type-id='type-id-275' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='75' column='1'/> + <var-decl name='__padding' type-id='type-id-277' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='75' 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='79' column='1' id='type-id-1296'> + <class-decl name='_qsbr_shared' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='79' column='1' id='type-id-1297'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='wr_seq' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='81' column='1'/> + <var-decl name='wr_seq' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='81' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='rd_seq' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='84' column='1'/> + <var-decl name='rd_seq' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='84' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='array' type-id='type-id-1333' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='87' column='1'/> + <var-decl name='array' type-id='type-id-1334' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='87' 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='88' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='91' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='91' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='freelist' type-id='type-id-571' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='92' column='1'/> + <var-decl name='freelist' type-id='type-id-573' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='92' 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-1334' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='15' column='1' id='type-id-1335'> + <class-decl name='debug_alloc_api_t' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1335' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='15' column='1' id='type-id-1336'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='api_id' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='17' column='1'/> + <var-decl name='api_id' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='17' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='alloc' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='18' column='1'/> + <var-decl name='alloc' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='18' column='1'/> </data-member> </class-decl> - <typedef-decl name='debug_alloc_api_t' type-id='type-id-1335' filepath='./Include/internal/pycore_runtime_structs.h' line='19' column='1' id='type-id-1334'/> - <class-decl name='_pymem_allocators' size-in-bits='2432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='21' column='1' id='type-id-1336'> + <typedef-decl name='debug_alloc_api_t' type-id='type-id-1336' filepath='./Include/internal/pycore_runtime_structs.h' line='19' column='1' id='type-id-1335'/> + <class-decl name='_pymem_allocators' size-in-bits='2432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='21' column='1' id='type-id-1337'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='22' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='22' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='standard' type-id='type-id-1337' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='27' column='1'/> + <var-decl name='standard' type-id='type-id-1338' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='27' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='debug' type-id='type-id-1338' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='32' column='1'/> + <var-decl name='debug' type-id='type-id-1339' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='32' 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_runtime_structs.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='obj_arena' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='34' column='1'/> + <var-decl name='obj_arena' type-id='type-id-567' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='34' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__34' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='23' column='1' id='type-id-1337'> + <class-decl name='__anonymous_struct__34' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='23' column='1' id='type-id-1338'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='raw' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='24' column='1'/> + <var-decl name='raw' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='24' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='mem' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='25' column='1'/> + <var-decl name='mem' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='25' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='obj' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='26' column='1'/> + <var-decl name='obj' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='26' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__35' size-in-bits='1152' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='28' column='1' id='type-id-1338'> + <class-decl name='__anonymous_struct__35' size-in-bits='1152' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='28' column='1' id='type-id-1339'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='raw' type-id='type-id-1334' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='29' column='1'/> + <var-decl name='raw' type-id='type-id-1335' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='29' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='mem' type-id='type-id-1334' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='30' column='1'/> + <var-decl name='mem' type-id='type-id-1335' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='30' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='obj' type-id='type-id-1334' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='31' column='1'/> + <var-decl name='obj' type-id='type-id-1335' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='31' column='1'/> </data-member> </class-decl> - <enum-decl name='_py_float_format_type' filepath='./Include/internal/pycore_runtime_structs.h' line='37' column='1' id='type-id-1339'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_py_float_format_type' filepath='./Include/internal/pycore_runtime_structs.h' line='37' column='1' id='type-id-1340'> + <underlying-type type-id='type-id-43'/> <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_runtime_structs.h' line='43' column='1' id='type-id-1340'> + <class-decl name='_Py_float_runtime_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='43' column='1' id='type-id-1341'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='float_format' type-id='type-id-1339' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='44' column='1'/> + <var-decl name='float_format' type-id='type-id-1340' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='44' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='double_format' type-id='type-id-1339' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='45' column='1'/> + <var-decl name='double_format' type-id='type-id-1340' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='45' 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_runtime_structs.h' line='48' column='1' id='type-id-1341'> + <class-decl name='pyhash_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='48' column='1' id='type-id-1342'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='urandom_cache' type-id='type-id-1342' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='58' column='1'/> + <var-decl name='urandom_cache' type-id='type-id-1343' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='58' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__36' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='49' column='1' id='type-id-1342'> + <class-decl name='__anonymous_struct__36' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='49' column='1' id='type-id-1343'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='fd' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='51' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_dev' type-id='type-id-1343' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='52' column='1'/> + <var-decl name='st_dev' type-id='type-id-1344' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='52' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_ino' type-id='type-id-1344' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='53' column='1'/> + <var-decl name='st_ino' type-id='type-id-1345' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='53' column='1'/> </data-member> </class-decl> - <class-decl name='_fileutils_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='63' column='1' id='type-id-1345'> + <class-decl name='_fileutils_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='63' column='1' id='type-id-1346'> <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_runtime_structs.h' line='64' column='1'/> </data-member> </class-decl> - <class-decl name='_parser_runtime_state' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='77' column='1' id='type-id-1346'> + <class-decl name='_parser_runtime_state' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='77' column='1' id='type-id-1347'> <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_runtime_structs.h' line='84' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dummy_name' type-id='type-id-1087' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='86' column='1'/> + <var-decl name='dummy_name' type-id='type-id-1089' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='86' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_time_runtime_state' size-in-bits='8' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='94' column='1' id='type-id-1347'> + <class-decl name='_Py_time_runtime_state' size-in-bits='8' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='94' column='1' id='type-id-1348'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_unused' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='98' column='1'/> + <var-decl name='_unused' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='98' 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_runtime_structs.h' line='103' column='1' id='type-id-1348'> + <class-decl name='_Py_cached_objects' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='103' column='1' id='type-id-1349'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='interned_strings' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='105' column='1'/> + <var-decl name='interned_strings' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='105' column='1'/> </data-member> </class-decl> - <class-decl name='_Py_static_objects' size-in-bits='613504' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='114' column='1' id='type-id-1349'> + <class-decl name='_Py_static_objects' size-in-bits='613504' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='114' column='1' id='type-id-1350'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='singletons' type-id='type-id-1350' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='137' column='1'/> + <var-decl name='singletons' type-id='type-id-1351' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='137' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__56' size-in-bits='613504' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='115' column='1' id='type-id-1350'> + <class-decl name='__anonymous_struct__56' size-in-bits='613504' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='115' column='1' id='type-id-1351'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='small_ints' type-id='type-id-813' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='121' column='1'/> + <var-decl name='small_ints' type-id='type-id-815' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='121' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67072'> - <var-decl name='bytes_empty' type-id='type-id-955' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='123' column='1'/> + <var-decl name='bytes_empty' type-id='type-id-957' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='123' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='67392'> - <var-decl name='bytes_characters' type-id='type-id-834' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='127' column='1'/> + <var-decl name='bytes_characters' type-id='type-id-836' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='127' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='165696'> - <var-decl name='strings' type-id='type-id-1178' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='129' column='1'/> + <var-decl name='strings' type-id='type-id-1180' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='129' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='612480'> - <var-decl name='_tuple_empty_gc_not_used' type-id='type-id-1252' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='131' column='1'/> + <var-decl name='_tuple_empty_gc_not_used' type-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='612608'> - <var-decl name='tuple_empty' type-id='type-id-1055' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='132' column='1'/> + <var-decl name='tuple_empty' type-id='type-id-1057' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='612928'> - <var-decl name='_hamt_bitmap_node_empty_gc_not_used' type-id='type-id-1252' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='134' column='1'/> + <var-decl name='_hamt_bitmap_node_empty_gc_not_used' type-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='134' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='613056'> - <var-decl name='hamt_bitmap_node_empty' type-id='type-id-1351' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='135' column='1'/> + <var-decl name='hamt_bitmap_node_empty' type-id='type-id-1352' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='135' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='613376'> - <var-decl name='context_token_missing' type-id='type-id-1116' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='136' column='1'/> + <var-decl name='context_token_missing' type-id='type-id-1118' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='136' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__57' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='124' column='1' id='type-id-833'> + <class-decl name='__anonymous_struct__57' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='124' column='1' id='type-id-835'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob' type-id='type-id-955' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='125' column='1'/> + <var-decl name='ob' type-id='type-id-957' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='125' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='eos' type-id='type-id-58' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='126' column='1'/> + <var-decl name='eos' type-id='type-id-64' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='126' column='1'/> </data-member> </class-decl> - <class-decl name='pyruntimestate' size-in-bits='2532288' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='146' column='1' id='type-id-1352'> + <class-decl name='pyruntimestate' size-in-bits='2532416' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='146' column='1' id='type-id-1353'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='debug_offsets' type-id='type-id-1163' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='159' column='1'/> + <var-decl name='debug_offsets' type-id='type-id-1165' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='159' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6080'> <var-decl name='_initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='165' column='1'/> @@ -22168,161 +22194,161 @@ <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='177' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6272'> - <var-decl name='_finalizing' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='184' column='1'/> + <var-decl name='_finalizing' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='184' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6336'> <var-decl name='_finalizing_id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='186' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6400'> - <var-decl name='interpreters' type-id='type-id-1353' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='205' column='1'/> + <var-decl name='interpreters' type-id='type-id-1354' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='205' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6656'> <var-decl name='main_thread' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='209' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6720'> - <var-decl name='main_tstate' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='210' column='1'/> + <var-decl name='main_tstate' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='210' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6784'> - <var-decl name='xi' type-id='type-id-1132' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='218' column='1'/> + <var-decl name='xi' type-id='type-id-1134' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='218' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6976'> - <var-decl name='allocators' type-id='type-id-1336' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='220' column='1'/> + <var-decl name='allocators' type-id='type-id-1337' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='220' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9408'> - <var-decl name='obmalloc' type-id='type-id-1323' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='221' column='1'/> + <var-decl name='obmalloc' type-id='type-id-1324' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='221' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9536'> - <var-decl name='pyhash_state' type-id='type-id-1341' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='222' column='1'/> + <var-decl name='pyhash_state' type-id='type-id-1342' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='222' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='9728'> - <var-decl name='threads' type-id='type-id-1326' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='223' column='1'/> + <var-decl name='threads' type-id='type-id-1327' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='223' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='10048'> - <var-decl name='signals' type-id='type-id-1354' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='224' column='1'/> + <var-decl name='signals' type-id='type-id-1355' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='224' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18688'> - <var-decl name='autoTSSkey' type-id='type-id-1355' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='227' column='1'/> + <var-decl name='autoTSSkey' type-id='type-id-1356' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='227' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18752'> - <var-decl name='trashTSSkey' type-id='type-id-1355' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='230' column='1'/> + <var-decl name='trashTSSkey' type-id='type-id-1356' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='230' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18816'> - <var-decl name='orig_argv' type-id='type-id-977' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='232' column='1'/> + <var-decl name='orig_argv' type-id='type-id-979' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='232' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18944'> - <var-decl name='parser' type-id='type-id-1346' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='234' column='1'/> + <var-decl name='parser' type-id='type-id-1347' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='234' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='19456'> - <var-decl name='atexit' type-id='type-id-1247' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='236' column='1'/> + <var-decl name='atexit' type-id='type-id-1249' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='236' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='21632'> - <var-decl name='imports' type-id='type-id-1255' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='238' column='1'/> + <var-decl name='imports' type-id='type-id-1256' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='238' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='21952'> - <var-decl name='ceval' type-id='type-id-1242' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='239' column='1'/> + <var-decl name='ceval' type-id='type-id-1244' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='239' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80512'> - <var-decl name='gilstate' type-id='type-id-1356' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='249' column='1'/> + <var-decl name='gilstate' type-id='type-id-1357' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='249' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80640'> - <var-decl name='getargs' type-id='type-id-1357' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='252' column='1'/> + <var-decl name='getargs' type-id='type-id-1358' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='252' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80704'> - <var-decl name='fileutils' type-id='type-id-1345' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='253' column='1'/> + <var-decl name='fileutils' type-id='type-id-1346' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='253' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80768'> - <var-decl name='faulthandler' type-id='type-id-1170' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='254' column='1'/> + <var-decl name='faulthandler' type-id='type-id-1172' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='254' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='82176'> - <var-decl name='tracemalloc' type-id='type-id-1358' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='255' column='1'/> + <var-decl name='tracemalloc' type-id='type-id-1359' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='255' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84032'> - <var-decl name='ref_tracer' type-id='type-id-1306' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='256' column='1'/> + <var-decl name='ref_tracer' type-id='type-id-1307' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='256' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84160'> - <var-decl name='stoptheworld_mutex' type-id='type-id-1304' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='262' column='1'/> + <var-decl name='stoptheworld_mutex' type-id='type-id-1305' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='262' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84224'> - <var-decl name='stoptheworld' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='263' column='1'/> + <var-decl name='stoptheworld' type-id='type-id-1264' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='263' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84416'> - <var-decl name='preconfig' type-id='type-id-980' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='265' column='1'/> + <var-decl name='preconfig' type-id='type-id-982' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='265' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84736'> - <var-decl name='open_code_hook' type-id='type-id-402' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='269' column='1'/> + <var-decl name='open_code_hook' type-id='type-id-404' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='269' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84800'> - <var-decl name='open_code_userdata' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='270' column='1'/> + <var-decl name='open_code_userdata' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='270' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84864'> - <var-decl name='audit_hooks' type-id='type-id-1359' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='274' column='1'/> + <var-decl name='audit_hooks' type-id='type-id-1360' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='274' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='84992'> - <var-decl name='object_state' type-id='type-id-1307' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='276' column='1'/> + <var-decl name='object_state' type-id='type-id-1308' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='276' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85024'> - <var-decl name='float_state' type-id='type-id-1340' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='277' column='1'/> + <var-decl name='float_state' type-id='type-id-1341' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='277' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85120'> - <var-decl name='unicode_state' type-id='type-id-1283' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='278' column='1'/> + <var-decl name='unicode_state' type-id='type-id-1284' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='278' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='85248'> - <var-decl name='types' type-id='type-id-1271' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='279' column='1'/> + <var-decl name='types' type-id='type-id-1272' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='279' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='112192'> - <var-decl name='time' type-id='type-id-1347' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='280' column='1'/> + <var-decl name='time' type-id='type-id-1348' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='280' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='112256'> - <var-decl name='cached_objects' type-id='type-id-1348' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='289' column='1'/> + <var-decl name='cached_objects' type-id='type-id-1349' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='283' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='112320'> - <var-decl name='static_objects' type-id='type-id-1349' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='290' column='1'/> + <var-decl name='static_objects' type-id='type-id-1350' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='284' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='725824'> - <var-decl name='_main_interpreter' type-id='type-id-1360' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='307' column='1'/> + <var-decl name='_main_interpreter' type-id='type-id-1361' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='301' column='1'/> </data-member> </class-decl> - <class-decl name='pyinterpreters' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='188' column='1' id='type-id-1353'> + <class-decl name='pyinterpreters' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='188' column='1' id='type-id-1354'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='189' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='189' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-33' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='191' column='1'/> + <var-decl name='head' type-id='type-id-39' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='191' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='main' type-id='type-id-33' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='195' column='1'/> + <var-decl name='main' type-id='type-id-39' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='195' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='next_id' type-id='type-id-409' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='204' column='1'/> + <var-decl name='next_id' type-id='type-id-411' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='204' 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_structs.h' line='240' column='1' id='type-id-1356'> + <class-decl name='_gilstate_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='240' column='1' id='type-id-1357'> <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_structs.h' line='243' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='autoInterpreterState' type-id='type-id-33' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='248' column='1'/> + <var-decl name='autoInterpreterState' type-id='type-id-39' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='248' 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_structs.h' line='250' column='1' id='type-id-1357'> + <class-decl name='_getargs_runtime_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='250' column='1' id='type-id-1358'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='static_parsers' type-id='type-id-276' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='251' column='1'/> + <var-decl name='static_parsers' type-id='type-id-278' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='251' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__53' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='271' column='1' id='type-id-1359'> + <class-decl name='__anonymous_struct__53' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='271' column='1' id='type-id-1360'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='272' column='1'/> + <var-decl name='mutex' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='272' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-1361' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='273' column='1'/> + <var-decl name='head' type-id='type-id-1362' visibility='default' filepath='./Include/internal/pycore_runtime_structs.h' line='273' 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-1354'> + <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-1355'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='handlers' type-id='type-id-836' visibility='default' filepath='./Include/internal/pycore_signal.h' line='44' column='1'/> + <var-decl name='handlers' type-id='type-id-838' 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-1362' visibility='default' filepath='./Include/internal/pycore_signal.h' line='61' column='1'/> + <var-decl name='wakeup' type-id='type-id-1363' 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'/> @@ -22337,7 +22363,7 @@ <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__38' 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-835'> + <class-decl name='__anonymous_struct__38' 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-837'> <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> @@ -22345,52 +22371,52 @@ <var-decl name='func' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_signal.h' line='43' 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_signal.h' line='46' column='1' id='type-id-1363'> + <class-decl name='__anonymous_struct__39' 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-1364'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fd' type-id='type-id-1364' visibility='default' filepath='./Include/internal/pycore_signal.h' line='54' column='1'/> + <var-decl name='fd' type-id='type-id-1365' 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='_Py_BackoffCounter' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_structs.h' line='13' column='1' id='type-id-1365'> + <class-decl name='_Py_BackoffCounter' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-354' visibility='default' filepath='./Include/internal/pycore_structs.h' line='13' column='1' id='type-id-1366'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value_and_backoff' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_structs.h' line='14' column='1'/> + <var-decl name='value_and_backoff' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_structs.h' line='14' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_BackoffCounter' type-id='type-id-1365' filepath='./Include/internal/pycore_structs.h' line='15' column='1' id='type-id-352'/> - <union-decl name='_Py_CODEUNIT' size-in-bits='16' naming-typedef-id='type-id-361' visibility='default' filepath='./Include/internal/pycore_structs.h' line='25' column='1' id='type-id-1366'> + <typedef-decl name='_Py_BackoffCounter' type-id='type-id-1366' filepath='./Include/internal/pycore_structs.h' line='15' column='1' id='type-id-354'/> + <union-decl name='_Py_CODEUNIT' size-in-bits='16' naming-typedef-id='type-id-363' visibility='default' filepath='./Include/internal/pycore_structs.h' line='25' column='1' id='type-id-1367'> <data-member access='public'> - <var-decl name='cache' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_structs.h' line='26' column='1'/> + <var-decl name='cache' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_structs.h' line='26' column='1'/> </data-member> <data-member access='public'> - <var-decl name='op' type-id='type-id-1367' visibility='default' filepath='./Include/internal/pycore_structs.h' line='30' column='1'/> + <var-decl name='op' type-id='type-id-1368' visibility='default' filepath='./Include/internal/pycore_structs.h' line='30' column='1'/> </data-member> <data-member access='public'> - <var-decl name='counter' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_structs.h' line='31' column='1'/> + <var-decl name='counter' type-id='type-id-354' visibility='default' filepath='./Include/internal/pycore_structs.h' line='31' column='1'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__32' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_structs.h' line='27' column='1' id='type-id-1367'> + <class-decl name='__anonymous_struct__32' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_structs.h' line='27' column='1' id='type-id-1368'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='code' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_structs.h' line='28' column='1'/> + <var-decl name='code' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_structs.h' line='28' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='arg' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_structs.h' line='29' column='1'/> + <var-decl name='arg' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_structs.h' line='29' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_CODEUNIT' type-id='type-id-1366' filepath='./Include/internal/pycore_structs.h' line='32' column='1' id='type-id-361'/> - <class-decl name='PyHamtNode' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1368' visibility='default' filepath='./Include/internal/pycore_structs.h' line='36' column='1' id='type-id-1369'> + <typedef-decl name='_Py_CODEUNIT' type-id='type-id-1367' filepath='./Include/internal/pycore_structs.h' line='32' column='1' id='type-id-363'/> + <class-decl name='PyHamtNode' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1369' visibility='default' filepath='./Include/internal/pycore_structs.h' line='36' column='1' id='type-id-1370'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_structs.h' line='37' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_structs.h' line='37' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyHamtNode' type-id='type-id-1369' filepath='./Include/internal/pycore_structs.h' line='38' column='1' id='type-id-1368'/> - <class-decl name='PyHamtObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1293' visibility='default' filepath='./Include/internal/pycore_structs.h' line='42' column='1' id='type-id-1370'> + <typedef-decl name='PyHamtNode' type-id='type-id-1370' filepath='./Include/internal/pycore_structs.h' line='38' column='1' id='type-id-1369'/> + <class-decl name='PyHamtObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1294' visibility='default' filepath='./Include/internal/pycore_structs.h' line='42' column='1' id='type-id-1371'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_structs.h' line='43' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_structs.h' line='43' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='h_root' type-id='type-id-1371' visibility='default' filepath='./Include/internal/pycore_structs.h' line='44' column='1'/> + <var-decl name='h_root' type-id='type-id-1372' visibility='default' filepath='./Include/internal/pycore_structs.h' line='44' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> <var-decl name='h_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_structs.h' line='45' column='1'/> @@ -22399,28 +22425,28 @@ <var-decl name='h_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_structs.h' line='46' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyHamtObject' type-id='type-id-1370' filepath='./Include/internal/pycore_structs.h' line='47' column='1' id='type-id-1293'/> - <class-decl name='PyHamtNode_Bitmap' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1351' visibility='default' filepath='./Include/internal/pycore_structs.h' line='49' column='1' id='type-id-1372'> + <typedef-decl name='PyHamtObject' type-id='type-id-1371' filepath='./Include/internal/pycore_structs.h' line='47' column='1' id='type-id-1294'/> + <class-decl name='PyHamtNode_Bitmap' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1352' visibility='default' filepath='./Include/internal/pycore_structs.h' line='49' column='1' id='type-id-1373'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/internal/pycore_structs.h' line='50' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='b_bitmap' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_structs.h' line='51' column='1'/> + <var-decl name='b_bitmap' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_structs.h' line='51' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='b_array' type-id='type-id-393' visibility='default' filepath='./Include/internal/pycore_structs.h' line='52' column='1'/> + <var-decl name='b_array' type-id='type-id-395' visibility='default' filepath='./Include/internal/pycore_structs.h' line='52' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyHamtNode_Bitmap' type-id='type-id-1372' filepath='./Include/internal/pycore_structs.h' line='53' column='1' id='type-id-1351'/> - <union-decl name='_PyStackRef' size-in-bits='64' visibility='default' filepath='./Include/internal/pycore_structs.h' line='66' column='1' id='type-id-429'> + <typedef-decl name='PyHamtNode_Bitmap' type-id='type-id-1373' filepath='./Include/internal/pycore_structs.h' line='53' column='1' id='type-id-1352'/> + <union-decl name='_PyStackRef' size-in-bits='64' visibility='default' filepath='./Include/internal/pycore_structs.h' line='66' column='1' id='type-id-431'> <data-member access='public'> - <var-decl name='bits' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_structs.h' line='70' column='1'/> + <var-decl name='bits' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_structs.h' line='70' column='1'/> </data-member> </union-decl> - <typedef-decl name='_PyStackRef' type-id='type-id-429' filepath='./Include/internal/pycore_structs.h' line='72' column='1' id='type-id-433'/> - <class-decl name='_PyTraceMalloc_Config' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='14' column='1' id='type-id-1373'> + <typedef-decl name='_PyStackRef' type-id='type-id-431' filepath='./Include/internal/pycore_structs.h' line='72' column='1' id='type-id-435'/> + <class-decl name='_PyTraceMalloc_Config' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='14' column='1' id='type-id-1374'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='21' column='1'/> + <var-decl name='initialized' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='21' 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='25' column='1'/> @@ -22429,98 +22455,98 @@ <var-decl name='max_nframe' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='29' column='1'/> </data-member> </class-decl> - <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/internal/pycore_tracemalloc.h' line='17' column='1' id='type-id-607'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/internal/pycore_tracemalloc.h' line='17' column='1' id='type-id-609'> + <underlying-type type-id='type-id-43'/> <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='43' column='1' id='type-id-902'> + <class-decl name='tracemalloc_frame' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='43' column='1' id='type-id-904'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='filename' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='46' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='lineno' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='47' column='1'/> + <var-decl name='lineno' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='47' 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='53' column='1' id='type-id-1374'> + <class-decl name='tracemalloc_traceback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='53' column='1' id='type-id-1375'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='hash' type-id='type-id-1217' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='54' column='1'/> + <var-decl name='hash' type-id='type-id-1219' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='54' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='nframe' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='56' column='1'/> + <var-decl name='nframe' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='56' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='total_nframe' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='58' column='1'/> + <var-decl name='total_nframe' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='58' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='frames' type-id='type-id-903' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='59' column='1'/> + <var-decl name='frames' type-id='type-id-905' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='59' 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='63' column='1' id='type-id-1358'> + <class-decl name='_tracemalloc_runtime_state' size-in-bits='1856' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='63' column='1' id='type-id-1359'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='config' type-id='type-id-1373' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='64' column='1'/> + <var-decl name='config' type-id='type-id-1374' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='64' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='allocators' type-id='type-id-1375' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='71' column='1'/> + <var-decl name='allocators' type-id='type-id-1376' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='tables_lock' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='73' column='1'/> + <var-decl name='tables_lock' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='73' 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='76' column='1'/> + <var-decl name='traced_memory' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='76' 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='79' column='1'/> + <var-decl name='peak_traced_memory' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='79' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='filenames' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='83' column='1'/> + <var-decl name='filenames' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='traceback' type-id='type-id-1376' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='86' column='1'/> + <var-decl name='traceback' type-id='type-id-1377' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='86' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='tracebacks' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='90' column='1'/> + <var-decl name='tracebacks' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='90' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='traces' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='93' column='1'/> + <var-decl name='traces' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='domains' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='96' column='1'/> + <var-decl name='domains' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='96' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='empty_traceback' type-id='type-id-1374' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='98' column='1'/> + <var-decl name='empty_traceback' type-id='type-id-1375' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='98' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='reentrant_key' type-id='type-id-1355' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='100' column='1'/> + <var-decl name='reentrant_key' type-id='type-id-1356' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='100' column='1'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__52' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='67' column='1' id='type-id-1375'> + <class-decl name='__anonymous_struct__52' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='67' column='1' id='type-id-1376'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mem' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='68' column='1'/> + <var-decl name='mem' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='raw' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='69' column='1'/> + <var-decl name='raw' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='69' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='obj' type-id='type-id-563' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='70' column='1'/> + <var-decl name='obj' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='70' column='1'/> </data-member> </class-decl> - <class-decl name='_PyThreadStateImpl' size-in-bits='7296' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='27' column='1' id='type-id-1377'> + <class-decl name='_PyThreadStateImpl' size-in-bits='7424' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='27' column='1' id='type-id-1378'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='base' type-id='type-id-1378' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='29' column='1'/> + <var-decl name='base' type-id='type-id-1379' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='29' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6592'> <var-decl name='refcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6656'> - <var-decl name='c_stack_top' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='36' column='1'/> + <var-decl name='c_stack_top' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6720'> - <var-decl name='c_stack_soft_limit' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='37' column='1'/> + <var-decl name='c_stack_soft_limit' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='37' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6784'> - <var-decl name='c_stack_hard_limit' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='38' column='1'/> + <var-decl name='c_stack_hard_limit' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='38' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6848'> <var-decl name='asyncio_running_loop' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='40' column='1'/> @@ -22529,33 +22555,39 @@ <var-decl name='asyncio_running_task' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='41' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='6976'> - <var-decl name='asyncio_tasks_head' type-id='type-id-1280' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='46' column='1'/> + <var-decl name='asyncio_tasks_head' type-id='type-id-1281' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='46' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7104'> - <var-decl name='qsbr' type-id='type-id-571' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='47' column='1'/> + <var-decl name='qsbr' type-id='type-id-573' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='47' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7168'> - <var-decl name='mem_free_queue' type-id='type-id-1280' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='48' column='1'/> + <var-decl name='mem_free_queue' type-id='type-id-1281' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7296'> + <var-decl name='c_stack_init_base' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7360'> + <var-decl name='c_stack_init_top' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='81' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyThreadStateImpl' type-id='type-id-1377' filepath='./Include/internal/pycore_tstate.h' line='79' column='1' id='type-id-1299'/> - <typedef-decl name='_PyRuntimeState' type-id='type-id-1352' filepath='./Include/internal/pycore_typedefs.h' line='13' column='1' id='type-id-1379'/> - <class-decl name='_PyUnicode_Name_CAPI' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1380' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='16' column='1' id='type-id-1381'> + <typedef-decl name='_PyThreadStateImpl' type-id='type-id-1378' filepath='./Include/internal/pycore_tstate.h' line='83' column='1' id='type-id-1300'/> + <typedef-decl name='_PyRuntimeState' type-id='type-id-1353' filepath='./Include/internal/pycore_typedefs.h' line='13' column='1' id='type-id-1380'/> + <class-decl name='_PyUnicode_Name_CAPI' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1381' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='16' column='1' id='type-id-1382'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='getname' type-id='type-id-1382' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='21' column='1'/> + <var-decl name='getname' type-id='type-id-1383' 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-1383' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='26' column='1'/> + <var-decl name='getcode' type-id='type-id-1384' 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-1381' filepath='./Include/internal/pycore_ucnhash.h' line='29' column='1' id='type-id-1380'/> - <typedef-decl name='PyCFunction' type-id='type-id-1384' filepath='./Include/methodobject.h' line='19' column='1' id='type-id-464'/> - <class-decl name='PyMethodDef' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/methodobject.h' line='68' column='1' id='type-id-1385'> + <typedef-decl name='_PyUnicode_Name_CAPI' type-id='type-id-1382' filepath='./Include/internal/pycore_ucnhash.h' line='29' column='1' id='type-id-1381'/> + <typedef-decl name='PyCFunction' type-id='type-id-1385' filepath='./Include/methodobject.h' line='19' column='1' id='type-id-466'/> + <class-decl name='PyMethodDef' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/methodobject.h' line='68' column='1' id='type-id-1386'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ml_name' type-id='type-id-4' visibility='default' filepath='./Include/methodobject.h' line='69' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ml_meth' type-id='type-id-464' visibility='default' filepath='./Include/methodobject.h' line='70' column='1'/> + <var-decl name='ml_meth' type-id='type-id-466' visibility='default' filepath='./Include/methodobject.h' line='70' 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='71' column='1'/> @@ -22564,80 +22596,80 @@ <var-decl name='ml_doc' type-id='type-id-4' visibility='default' filepath='./Include/methodobject.h' line='73' column='1'/> </data-member> </class-decl> - <class-decl name='_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/object.h' line='110' column='1' id='type-id-1386'> + <class-decl name='_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/object.h' line='110' column='1' id='type-id-1387'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='' type-id='type-id-1387' visibility='default'/> + <var-decl name='' type-id='type-id-1388' 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='144' 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='122' column='1' id='type-id-1387'> + <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/object.h' line='122' column='1' id='type-id-1388'> <data-member access='public'> - <var-decl name='ob_refcnt_full' type-id='type-id-409' visibility='default' filepath='./Include/object.h' line='124' column='1'/> + <var-decl name='ob_refcnt_full' type-id='type-id-411' visibility='default' filepath='./Include/object.h' line='124' column='1'/> </data-member> <data-member access='public'> - <var-decl name='' type-id='type-id-1388' visibility='default'/> + <var-decl name='' type-id='type-id-1389' visibility='default'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/object.h' line='125' column='1' id='type-id-1388'> + <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/object.h' line='125' column='1' id='type-id-1389'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_refcnt' type-id='type-id-322' visibility='default' filepath='./Include/object.h' line='131' column='1'/> + <var-decl name='ob_refcnt' type-id='type-id-324' visibility='default' filepath='./Include/object.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ob_overflow' type-id='type-id-348' visibility='default' filepath='./Include/object.h' line='132' column='1'/> + <var-decl name='ob_overflow' type-id='type-id-350' visibility='default' filepath='./Include/object.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='48'> - <var-decl name='ob_flags' type-id='type-id-348' visibility='default' filepath='./Include/object.h' line='133' column='1'/> + <var-decl name='ob_flags' type-id='type-id-350' visibility='default' filepath='./Include/object.h' line='133' column='1'/> </data-member> </class-decl> - <class-decl name='PyVarObject' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-254' visibility='default' filepath='./Include/object.h' line='169' column='1' id='type-id-1389'> + <class-decl name='PyVarObject' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-254' visibility='default' filepath='./Include/object.h' line='169' column='1' id='type-id-1390'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/object.h' line='170' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' visibility='default' filepath='./Include/object.h' line='170' 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='171' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyVarObject' type-id='type-id-1389' filepath='./Include/object.h' line='172' column='1' id='type-id-254'/> - <typedef-decl name='unaryfunc' type-id='type-id-1390' filepath='./Include/object.h' line='336' column='1' id='type-id-993'/> - <typedef-decl name='binaryfunc' type-id='type-id-1384' filepath='./Include/object.h' line='337' column='1' id='type-id-991'/> - <typedef-decl name='ternaryfunc' type-id='type-id-1391' filepath='./Include/object.h' line='338' column='1' id='type-id-992'/> - <typedef-decl name='inquiry' type-id='type-id-1392' filepath='./Include/object.h' line='339' column='1' id='type-id-317'/> - <typedef-decl name='lenfunc' type-id='type-id-1393' filepath='./Include/object.h' line='340' column='1' id='type-id-995'/> - <typedef-decl name='ssizeargfunc' type-id='type-id-1394' filepath='./Include/object.h' line='341' column='1' id='type-id-996'/> - <typedef-decl name='ssizeobjargproc' type-id='type-id-1395' filepath='./Include/object.h' line='343' column='1' id='type-id-997'/> - <typedef-decl name='objobjargproc' type-id='type-id-1396' filepath='./Include/object.h' line='345' column='1' id='type-id-1000'/> - <typedef-decl name='objobjproc' type-id='type-id-1397' filepath='./Include/object.h' line='347' column='1' id='type-id-998'/> - <typedef-decl name='visitproc' type-id='type-id-396' filepath='./Include/object.h' line='348' column='1' id='type-id-397'/> - <typedef-decl name='traverseproc' type-id='type-id-1398' filepath='./Include/object.h' line='349' column='1' id='type-id-316'/> - <typedef-decl name='freefunc' type-id='type-id-572' filepath='./Include/object.h' line='352' column='1' id='type-id-471'/> - <typedef-decl name='destructor' type-id='type-id-314' filepath='./Include/object.h' line='353' column='1' id='type-id-1007'/> - <typedef-decl name='getattrfunc' type-id='type-id-1399' filepath='./Include/object.h' line='354' column='1' id='type-id-1008'/> - <typedef-decl name='getattrofunc' type-id='type-id-1384' filepath='./Include/object.h' line='355' column='1' id='type-id-1016'/> - <typedef-decl name='setattrfunc' type-id='type-id-1400' filepath='./Include/object.h' line='356' column='1' id='type-id-1009'/> - <typedef-decl name='setattrofunc' type-id='type-id-1396' filepath='./Include/object.h' line='357' column='1' id='type-id-1017'/> - <typedef-decl name='reprfunc' type-id='type-id-1390' filepath='./Include/object.h' line='358' column='1' id='type-id-1011'/> - <typedef-decl name='hashfunc' type-id='type-id-1401' filepath='./Include/object.h' line='359' column='1' id='type-id-1015'/> - <typedef-decl name='richcmpfunc' type-id='type-id-1402' filepath='./Include/object.h' line='360' column='1' id='type-id-1019'/> - <typedef-decl name='getiterfunc' type-id='type-id-1390' filepath='./Include/object.h' line='361' column='1' id='type-id-1020'/> - <typedef-decl name='iternextfunc' type-id='type-id-1390' filepath='./Include/object.h' line='362' column='1' id='type-id-1021'/> - <typedef-decl name='descrgetfunc' type-id='type-id-1391' filepath='./Include/object.h' line='363' column='1' id='type-id-1022'/> - <typedef-decl name='descrsetfunc' type-id='type-id-1396' filepath='./Include/object.h' line='364' column='1' id='type-id-1023'/> - <typedef-decl name='initproc' type-id='type-id-1396' filepath='./Include/object.h' line='365' column='1' id='type-id-1024'/> - <typedef-decl name='newfunc' type-id='type-id-1403' filepath='./Include/object.h' line='366' column='1' id='type-id-1026'/> - <typedef-decl name='allocfunc' type-id='type-id-1404' filepath='./Include/object.h' line='367' column='1' id='type-id-1025'/> - <typedef-decl name='vectorcallfunc' type-id='type-id-1405' filepath='./Include/object.h' line='370' column='1' id='type-id-313'/> - <enum-decl name='PySendResult' naming-typedef-id='type-id-269' filepath='./Include/object.h' line='690' column='1' id='type-id-1406'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='PyVarObject' type-id='type-id-1390' filepath='./Include/object.h' line='172' column='1' id='type-id-254'/> + <typedef-decl name='unaryfunc' type-id='type-id-1391' filepath='./Include/object.h' line='336' column='1' id='type-id-995'/> + <typedef-decl name='binaryfunc' type-id='type-id-1385' filepath='./Include/object.h' line='337' column='1' id='type-id-993'/> + <typedef-decl name='ternaryfunc' type-id='type-id-1392' filepath='./Include/object.h' line='338' column='1' id='type-id-994'/> + <typedef-decl name='inquiry' type-id='type-id-1393' filepath='./Include/object.h' line='339' column='1' id='type-id-319'/> + <typedef-decl name='lenfunc' type-id='type-id-1394' filepath='./Include/object.h' line='340' column='1' id='type-id-997'/> + <typedef-decl name='ssizeargfunc' type-id='type-id-1395' filepath='./Include/object.h' line='341' column='1' id='type-id-998'/> + <typedef-decl name='ssizeobjargproc' type-id='type-id-1396' filepath='./Include/object.h' line='343' column='1' id='type-id-999'/> + <typedef-decl name='objobjargproc' type-id='type-id-1397' filepath='./Include/object.h' line='345' column='1' id='type-id-1002'/> + <typedef-decl name='objobjproc' type-id='type-id-1398' filepath='./Include/object.h' line='347' column='1' id='type-id-1000'/> + <typedef-decl name='visitproc' type-id='type-id-398' filepath='./Include/object.h' line='348' column='1' id='type-id-399'/> + <typedef-decl name='traverseproc' type-id='type-id-1399' filepath='./Include/object.h' line='349' column='1' id='type-id-318'/> + <typedef-decl name='freefunc' type-id='type-id-574' filepath='./Include/object.h' line='352' column='1' id='type-id-473'/> + <typedef-decl name='destructor' type-id='type-id-316' filepath='./Include/object.h' line='353' column='1' id='type-id-1009'/> + <typedef-decl name='getattrfunc' type-id='type-id-1400' filepath='./Include/object.h' line='354' column='1' id='type-id-1010'/> + <typedef-decl name='getattrofunc' type-id='type-id-1385' filepath='./Include/object.h' line='355' column='1' id='type-id-1018'/> + <typedef-decl name='setattrfunc' type-id='type-id-1401' filepath='./Include/object.h' line='356' column='1' id='type-id-1011'/> + <typedef-decl name='setattrofunc' type-id='type-id-1397' filepath='./Include/object.h' line='357' column='1' id='type-id-1019'/> + <typedef-decl name='reprfunc' type-id='type-id-1391' filepath='./Include/object.h' line='358' column='1' id='type-id-1013'/> + <typedef-decl name='hashfunc' type-id='type-id-1402' filepath='./Include/object.h' line='359' column='1' id='type-id-1017'/> + <typedef-decl name='richcmpfunc' type-id='type-id-1403' filepath='./Include/object.h' line='360' column='1' id='type-id-1021'/> + <typedef-decl name='getiterfunc' type-id='type-id-1391' filepath='./Include/object.h' line='361' column='1' id='type-id-1022'/> + <typedef-decl name='iternextfunc' type-id='type-id-1391' filepath='./Include/object.h' line='362' column='1' id='type-id-1023'/> + <typedef-decl name='descrgetfunc' type-id='type-id-1392' filepath='./Include/object.h' line='363' column='1' id='type-id-1024'/> + <typedef-decl name='descrsetfunc' type-id='type-id-1397' filepath='./Include/object.h' line='364' column='1' id='type-id-1025'/> + <typedef-decl name='initproc' type-id='type-id-1397' filepath='./Include/object.h' line='365' column='1' id='type-id-1026'/> + <typedef-decl name='newfunc' type-id='type-id-1404' filepath='./Include/object.h' line='366' column='1' id='type-id-1028'/> + <typedef-decl name='allocfunc' type-id='type-id-1405' filepath='./Include/object.h' line='367' column='1' id='type-id-1027'/> + <typedef-decl name='vectorcallfunc' type-id='type-id-1406' filepath='./Include/object.h' line='370' column='1' id='type-id-315'/> + <enum-decl name='PySendResult' naming-typedef-id='type-id-269' filepath='./Include/object.h' line='695' column='1' id='type-id-1407'> + <underlying-type type-id='type-id-43'/> <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-1406' filepath='./Include/object.h' line='694' column='1' id='type-id-269'/> - <class-decl name='Py_buffer' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-260' visibility='default' filepath='./Include/pybuffer.h' line='20' column='1' id='type-id-1407'> + <typedef-decl name='PySendResult' type-id='type-id-1407' filepath='./Include/object.h' line='699' column='1' id='type-id-269'/> + <class-decl name='Py_buffer' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-260' visibility='default' filepath='./Include/pybuffer.h' line='20' column='1' id='type-id-1408'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buf' type-id='type-id-35' visibility='default' filepath='./Include/pybuffer.h' line='21' column='1'/> + <var-decl name='buf' type-id='type-id-41' 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-6' visibility='default' filepath='./Include/pybuffer.h' line='22' column='1'/> @@ -22655,7 +22687,7 @@ <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'/> + <var-decl name='format' type-id='type-id-24' 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'/> @@ -22667,87 +22699,87 @@ <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-35' visibility='default' filepath='./Include/pybuffer.h' line='32' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Py_buffer' type-id='type-id-1407' filepath='./Include/pybuffer.h' line='33' column='1' id='type-id-260'/> - <typedef-decl name='getbufferproc' type-id='type-id-1408' filepath='./Include/pybuffer.h' line='35' column='1' id='type-id-601'/> - <typedef-decl name='releasebufferproc' type-id='type-id-1409' filepath='./Include/pybuffer.h' line='36' column='1' id='type-id-1005'/> - <typedef-decl name='Py_ssize_t' type-id='type-id-185' filepath='./Include/pyport.h' line='155' column='1' id='type-id-7'/> - <typedef-decl name='Py_hash_t' type-id='type-id-7' filepath='./Include/pyport.h' line='169' column='1' id='type-id-304'/> - <typedef-decl name='Py_uhash_t' type-id='type-id-21' filepath='./Include/pyport.h' line='172' column='1' id='type-id-1217'/> - <typedef-decl name='PyThread_type_lock' type-id='type-id-35' filepath='./Include/pythread.h' line='4' column='1' id='type-id-243'/> - <typedef-decl name='Py_tss_t' type-id='type-id-1054' filepath='./Include/pythread.h' line='109' column='1' id='type-id-1355'/> - <typedef-decl name='PyMethodDef' type-id='type-id-1385' filepath='./Include/pytypedefs.h' line='14' column='1' id='type-id-1410'/> - <typedef-decl name='PyGetSetDef' type-id='type-id-1065' filepath='./Include/pytypedefs.h' line='15' column='1' id='type-id-1411'/> - <typedef-decl name='PyMemberDef' type-id='type-id-1066' filepath='./Include/pytypedefs.h' line='16' column='1' id='type-id-1412'/> - <typedef-decl name='PyObject' type-id='type-id-1386' filepath='./Include/pytypedefs.h' line='18' column='1' id='type-id-390'/> - <typedef-decl name='PyLongObject' type-id='type-id-985' filepath='./Include/pytypedefs.h' line='19' column='1' id='type-id-258'/> - <typedef-decl name='PyTypeObject' type-id='type-id-1006' filepath='./Include/pytypedefs.h' line='20' column='1' id='type-id-271'/> - <typedef-decl name='PyCodeObject' type-id='type-id-366' filepath='./Include/pytypedefs.h' line='21' column='1' id='type-id-364'/> - <typedef-decl name='PyFrameObject' type-id='type-id-435' filepath='./Include/pytypedefs.h' line='22' column='1' id='type-id-432'/> - <typedef-decl name='PyThreadState' type-id='type-id-1049' filepath='./Include/pytypedefs.h' line='24' column='1' id='type-id-1378'/> - <typedef-decl name='PyInterpreterState' type-id='type-id-1294' filepath='./Include/pytypedefs.h' line='25' column='1' id='type-id-1360'/> - <typedef-decl name='Py_UCS4' type-id='type-id-322' filepath='./Include/unicodeobject.h' line='94' column='1' id='type-id-305'/> - <typedef-decl name='__sighandler_t' type-id='type-id-1413' filepath='/usr/include/signal.h' line='72' column='1' id='type-id-1414'/> - <typedef-decl name='uintptr_t' type-id='type-id-2' filepath='/usr/include/stdint.h' line='90' column='1' id='type-id-369'/> - <union-decl name='__atomic_wide_counter' size-in-bits='64' naming-typedef-id='type-id-1415' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='25' column='1' id='type-id-1416'> + <var-decl name='internal' type-id='type-id-41' visibility='default' filepath='./Include/pybuffer.h' line='32' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Py_buffer' type-id='type-id-1408' filepath='./Include/pybuffer.h' line='33' column='1' id='type-id-260'/> + <typedef-decl name='getbufferproc' type-id='type-id-1409' filepath='./Include/pybuffer.h' line='35' column='1' id='type-id-603'/> + <typedef-decl name='releasebufferproc' type-id='type-id-1410' filepath='./Include/pybuffer.h' line='36' column='1' id='type-id-1007'/> + <typedef-decl name='Py_ssize_t' type-id='type-id-189' filepath='./Include/pyport.h' line='156' column='1' id='type-id-7'/> + <typedef-decl name='Py_hash_t' type-id='type-id-7' filepath='./Include/pyport.h' line='170' column='1' id='type-id-306'/> + <typedef-decl name='Py_uhash_t' type-id='type-id-14' filepath='./Include/pyport.h' line='173' column='1' id='type-id-1219'/> + <typedef-decl name='PyThread_type_lock' type-id='type-id-41' filepath='./Include/pythread.h' line='4' column='1' id='type-id-243'/> + <typedef-decl name='Py_tss_t' type-id='type-id-1056' filepath='./Include/pythread.h' line='109' column='1' id='type-id-1356'/> + <typedef-decl name='PyMethodDef' type-id='type-id-1386' filepath='./Include/pytypedefs.h' line='14' column='1' id='type-id-1411'/> + <typedef-decl name='PyGetSetDef' type-id='type-id-1067' filepath='./Include/pytypedefs.h' line='15' column='1' id='type-id-1412'/> + <typedef-decl name='PyMemberDef' type-id='type-id-1068' filepath='./Include/pytypedefs.h' line='16' column='1' id='type-id-1413'/> + <typedef-decl name='PyObject' type-id='type-id-1387' filepath='./Include/pytypedefs.h' line='18' column='1' id='type-id-392'/> + <typedef-decl name='PyLongObject' type-id='type-id-987' filepath='./Include/pytypedefs.h' line='19' column='1' id='type-id-258'/> + <typedef-decl name='PyTypeObject' type-id='type-id-1008' filepath='./Include/pytypedefs.h' line='20' column='1' id='type-id-271'/> + <typedef-decl name='PyCodeObject' type-id='type-id-368' filepath='./Include/pytypedefs.h' line='21' column='1' id='type-id-366'/> + <typedef-decl name='PyFrameObject' type-id='type-id-437' filepath='./Include/pytypedefs.h' line='22' column='1' id='type-id-434'/> + <typedef-decl name='PyThreadState' type-id='type-id-1051' filepath='./Include/pytypedefs.h' line='24' column='1' id='type-id-1379'/> + <typedef-decl name='PyInterpreterState' type-id='type-id-1295' filepath='./Include/pytypedefs.h' line='25' column='1' id='type-id-1361'/> + <typedef-decl name='Py_UCS4' type-id='type-id-324' filepath='./Include/unicodeobject.h' line='94' column='1' id='type-id-307'/> + <typedef-decl name='__sighandler_t' type-id='type-id-1414' filepath='/usr/include/signal.h' line='72' column='1' id='type-id-1415'/> + <typedef-decl name='uintptr_t' type-id='type-id-2' filepath='/usr/include/stdint.h' line='90' column='1' id='type-id-371'/> + <union-decl name='__atomic_wide_counter' size-in-bits='64' naming-typedef-id='type-id-1416' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='25' column='1' id='type-id-1417'> <data-member access='public'> - <var-decl name='__value64' type-id='type-id-462' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='27' column='1'/> + <var-decl name='__value64' type-id='type-id-464' 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-1417' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='32' column='1'/> + <var-decl name='__value32' type-id='type-id-1418' 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__33' 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-1417'> + <class-decl name='__anonymous_struct__33' 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-1418'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__low' type-id='type-id-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='30' column='1'/> + <var-decl name='__low' type-id='type-id-111' 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-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='31' column='1'/> + <var-decl name='__high' type-id='type-id-111' 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-1416' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='33' column='1' id='type-id-1415'/> - <union-decl name='pthread_condattr_t' size-in-bits='32' naming-typedef-id='type-id-1329' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='41' column='1' id='type-id-1418'> + <typedef-decl name='__atomic_wide_counter' type-id='type-id-1417' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='33' column='1' id='type-id-1416'/> + <union-decl name='pthread_condattr_t' size-in-bits='32' naming-typedef-id='type-id-1330' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='41' column='1' id='type-id-1419'> <data-member access='public'> - <var-decl name='__size' type-id='type-id-862' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='43' column='1'/> + <var-decl name='__size' type-id='type-id-864' 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-1418' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='45' column='1' id='type-id-1329'/> - <typedef-decl name='pthread_key_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='49' column='1' id='type-id-569'/> - <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='type-id-1177' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-1419'> + <typedef-decl name='pthread_condattr_t' type-id='type-id-1419' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='45' column='1' id='type-id-1330'/> + <typedef-decl name='pthread_key_t' type-id='type-id-111' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='49' column='1' id='type-id-571'/> + <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='type-id-1179' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-1420'> <data-member access='public'> - <var-decl name='__data' type-id='type-id-1420' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/> + <var-decl name='__data' type-id='type-id-1421' 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-858' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/> + <var-decl name='__size' type-id='type-id-860' 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-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/> + <var-decl name='__align' type-id='type-id-188' 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-1419' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-1177'/> - <union-decl name='pthread_cond_t' size-in-bits='384' naming-typedef-id='type-id-1176' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-1421'> + <typedef-decl name='pthread_mutex_t' type-id='type-id-1420' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-1179'/> + <union-decl name='pthread_cond_t' size-in-bits='384' naming-typedef-id='type-id-1178' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-1422'> <data-member access='public'> - <var-decl name='__data' type-id='type-id-1422' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/> + <var-decl name='__data' type-id='type-id-1423' 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-860' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/> + <var-decl name='__size' type-id='type-id-862' 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-463' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/> + <var-decl name='__align' type-id='type-id-465' 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-1421' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-1176'/> - <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-1167'> + <typedef-decl name='pthread_cond_t' type-id='type-id-1422' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-1178'/> + <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-1169'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__sigaction_handler' type-id='type-id-1423' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='38' column='1'/> + <var-decl name='__sigaction_handler' type-id='type-id-1424' 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-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='46' column='1'/> + <var-decl name='sa_mask' type-id='type-id-48' 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'/> @@ -22756,111 +22788,111 @@ <var-decl name='sa_restorer' type-id='type-id-232' 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__2' 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-1423'> + <union-decl name='__anonymous_union__2' 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-1424'> <data-member access='public'> - <var-decl name='sa_handler' type-id='type-id-1414' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='34' column='1'/> + <var-decl name='sa_handler' type-id='type-id-1415' 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-1424' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='36' column='1'/> + <var-decl name='sa_sigaction' type-id='type-id-1425' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='36' column='1'/> </data-member> </union-decl> - <typedef-decl name='int32_t' type-id='type-id-1425' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-456'/> - <typedef-decl name='int64_t' type-id='type-id-1426' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='27' column='1' id='type-id-409'/> - <typedef-decl name='uint8_t' type-id='type-id-1427' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='24' column='1' id='type-id-309'/> - <typedef-decl name='uint16_t' type-id='type-id-1428' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='25' column='1' id='type-id-348'/> - <typedef-decl name='uint32_t' type-id='type-id-1429' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='26' column='1' id='type-id-322'/> - <typedef-decl name='uint64_t' type-id='type-id-1430' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='27' column='1' id='type-id-111'/> - <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-1420'> + <typedef-decl name='int32_t' type-id='type-id-1426' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-458'/> + <typedef-decl name='int64_t' type-id='type-id-1427' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='27' column='1' id='type-id-411'/> + <typedef-decl name='uint8_t' type-id='type-id-1428' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='24' column='1' id='type-id-311'/> + <typedef-decl name='uint16_t' type-id='type-id-1429' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='25' column='1' id='type-id-350'/> + <typedef-decl name='uint32_t' type-id='type-id-1430' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='26' column='1' id='type-id-324'/> + <typedef-decl name='uint64_t' type-id='type-id-1431' 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-1421'> <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-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='25' column='1'/> + <var-decl name='__count' type-id='type-id-111' 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-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='28' column='1'/> + <var-decl name='__nusers' type-id='type-id-111' 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-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='34' column='1'/> + <var-decl name='__spins' type-id='type-id-90' 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-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='35' column='1'/> + <var-decl name='__elision' type-id='type-id-90' 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-1431' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='36' column='1'/> + <var-decl name='__list' type-id='type-id-1432' 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-1432'> + <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-1433'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__prev' type-id='type-id-1433' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='53' column='1'/> + <var-decl name='__prev' type-id='type-id-1434' 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-1433' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='54' column='1'/> + <var-decl name='__next' type-id='type-id-1434' 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-1432' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='55' column='1' id='type-id-1431'/> - <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-1422'> + <typedef-decl name='__pthread_list_t' type-id='type-id-1433' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='55' column='1' id='type-id-1432'/> + <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-1423'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__wseq' type-id='type-id-1415' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='96' column='1'/> + <var-decl name='__wseq' type-id='type-id-1416' 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-1415' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='97' column='1'/> + <var-decl name='__g1_start' type-id='type-id-1416' 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-953' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='98' column='1'/> + <var-decl name='__g_refs' type-id='type-id-955' 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-953' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='99' column='1'/> + <var-decl name='__g_size' type-id='type-id-955' 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-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='100' column='1'/> + <var-decl name='__g1_orig_size' type-id='type-id-111' 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-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='101' column='1'/> + <var-decl name='__wrefs' type-id='type-id-111' 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-953' 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='__uint8_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='38' column='1' id='type-id-1427'/> - <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-1428'/> - <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-1425'/> - <typedef-decl name='__uint32_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='42' column='1' id='type-id-1429'/> - <typedef-decl name='__int64_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='44' column='1' id='type-id-1426'/> - <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-1430'/> - <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-187'/> - <typedef-decl name='__uid_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='146' column='1' id='type-id-119'/> - <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-94'/> - <typedef-decl name='__off_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='152' column='1' id='type-id-1434'/> - <typedef-decl name='__off64_t' type-id='type-id-184' 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-178'/> - <typedef-decl name='__clock_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='156' column='1' id='type-id-107'/> - <typedef-decl name='__ssize_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='194' column='1' id='type-id-186'/> - <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-1435'/> - <typedef-decl name='FILE' type-id='type-id-1436' filepath='/usr/include/x86_64-linux-gnu/bits/types/FILE.h' line='7' column='1' id='type-id-1437'/> - <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-42' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='5' column='1' id='type-id-1438'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__val' type-id='type-id-954' 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-1438' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='8' column='1' id='type-id-42'/> - <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-1439'> + <var-decl name='__g_signals' type-id='type-id-955' 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='__uint8_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='38' column='1' id='type-id-1428'/> + <typedef-decl name='__uint16_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-1429'/> + <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-1426'/> + <typedef-decl name='__uint32_t' type-id='type-id-111' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='42' column='1' id='type-id-1430'/> + <typedef-decl name='__int64_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='44' column='1' id='type-id-1427'/> + <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-1431'/> + <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-191'/> + <typedef-decl name='__uid_t' type-id='type-id-111' 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-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='149' column='1' id='type-id-100'/> + <typedef-decl name='__off_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='152' column='1' id='type-id-1435'/> + <typedef-decl name='__off64_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='153' column='1' id='type-id-21'/> + <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-184'/> + <typedef-decl name='__clock_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='156' column='1' id='type-id-113'/> + <typedef-decl name='__ssize_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='194' column='1' id='type-id-190'/> + <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-1436'/> + <typedef-decl name='FILE' type-id='type-id-1437' filepath='/usr/include/x86_64-linux-gnu/bits/types/FILE.h' line='7' column='1' id='type-id-1438'/> + <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-48' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='5' column='1' id='type-id-1439'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='type-id-956' 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-1439' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='8' column='1' id='type-id-48'/> + <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-1440'> <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-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='27' column='1'/> + <var-decl name='sival_ptr' type-id='type-id-41' 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-1439' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='30' column='1' id='type-id-1440'/> - <typedef-decl name='sig_atomic_t' type-id='type-id-1435' filepath='/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h' line='8' column='1' id='type-id-1364'/> - <class-decl name='siginfo_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-1441' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='36' column='1' id='type-id-1442'> + <typedef-decl name='__sigval_t' type-id='type-id-1440' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='30' column='1' id='type-id-1441'/> + <typedef-decl name='sig_atomic_t' type-id='type-id-1436' filepath='/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h' line='8' column='1' id='type-id-1365'/> + <class-decl name='siginfo_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-1442' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='36' column='1' id='type-id-1443'> <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> @@ -22874,44 +22906,44 @@ <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-1443' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='123' column='1'/> + <var-decl name='_sifields' type-id='type-id-1444' 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__3' 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-1443'> + <union-decl name='__anonymous_union__3' 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-1444'> <data-member access='public'> - <var-decl name='_pad' type-id='type-id-888' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='53' column='1'/> + <var-decl name='_pad' type-id='type-id-890' 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-1444' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='60' column='1'/> + <var-decl name='_kill' type-id='type-id-1445' 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-1445' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='68' column='1'/> + <var-decl name='_timer' type-id='type-id-1446' 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-1446' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='76' column='1'/> + <var-decl name='_rt' type-id='type-id-1447' 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-1447' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='86' column='1'/> + <var-decl name='_sigchld' type-id='type-id-1448' 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-1448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='105' column='1'/> + <var-decl name='_sigfault' type-id='type-id-1449' 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-1449' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='112' column='1'/> + <var-decl name='_sigpoll' type-id='type-id-1450' 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-1450' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='121' column='1'/> + <var-decl name='_sigsys' type-id='type-id-1451' 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__45' 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-1444'> + <class-decl name='__anonymous_struct__45' 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-1445'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_pid' type-id='type-id-178' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='58' column='1'/> + <var-decl name='si_pid' type-id='type-id-184' 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-119' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='59' column='1'/> + <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__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='63' column='1' id='type-id-1445'> + <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='63' column='1' id='type-id-1446'> <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> @@ -22919,139 +22951,139 @@ <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-1440' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='67' column='1'/> + <var-decl name='si_sigval' type-id='type-id-1441' 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__47' 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-1446'> + <class-decl name='__anonymous_struct__47' 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-1447'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_pid' type-id='type-id-178' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='73' column='1'/> + <var-decl name='si_pid' type-id='type-id-184' 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-119' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='74' column='1'/> + <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-1440' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='75' column='1'/> + <var-decl name='si_sigval' type-id='type-id-1441' 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__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='79' column='1' id='type-id-1447'> + <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='79' column='1' id='type-id-1448'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_pid' type-id='type-id-178' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='81' column='1'/> + <var-decl name='si_pid' type-id='type-id-184' 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-119' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='82' column='1'/> + <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-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-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='84' column='1'/> + <var-decl name='si_utime' type-id='type-id-113' 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-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='85' column='1'/> + <var-decl name='si_stime' type-id='type-id-113' 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__49' 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-1448'> + <class-decl name='__anonymous_struct__49' 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-1449'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_addr' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='91' column='1'/> + <var-decl name='si_addr' type-id='type-id-41' 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-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='93' column='1'/> + <var-decl name='si_addr_lsb' type-id='type-id-90' 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-1451' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='104' column='1'/> + <var-decl name='_bounds' type-id='type-id-1452' 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__4' 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-1451'> + <union-decl name='__anonymous_union__4' 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-1452'> <data-member access='public'> - <var-decl name='_addr_bnd' type-id='type-id-1452' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='101' column='1'/> + <var-decl name='_addr_bnd' type-id='type-id-1453' 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-1429' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='103' column='1'/> + <var-decl name='_pkey' type-id='type-id-1430' 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__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='97' column='1' id='type-id-1452'> + <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='97' column='1' id='type-id-1453'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_lower' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='99' column='1'/> + <var-decl name='_lower' type-id='type-id-41' 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-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='100' column='1'/> + <var-decl name='_upper' type-id='type-id-41' 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__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='108' column='1' id='type-id-1449'> + <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='108' column='1' id='type-id-1450'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_band' type-id='type-id-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='110' column='1'/> + <var-decl name='si_band' type-id='type-id-188' 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__52' 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-1450'> + <class-decl name='__anonymous_struct__52' 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-1451'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_call_addr' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='118' column='1'/> + <var-decl name='_call_addr' type-id='type-id-41' 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-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='120' column='1'/> + <var-decl name='_arch' type-id='type-id-111' 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-1442' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='124' column='1' id='type-id-1441'/> - <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-50' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='26' column='1' id='type-id-1453'> + <typedef-decl name='siginfo_t' type-id='type-id-1443' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='124' column='1' id='type-id-1442'/> + <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='26' column='1' id='type-id-1454'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ss_sp' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='28' column='1'/> + <var-decl name='ss_sp' type-id='type-id-41' 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'/> + <var-decl name='ss_size' type-id='type-id-14' 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-1453' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='31' column='1' id='type-id-50'/> - <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-1454'/> - <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-1436'> + <typedef-decl name='stack_t' type-id='type-id-1454' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='31' column='1' id='type-id-56'/> + <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-1455'/> + <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-1437'> <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'/> + <var-decl name='_IO_read_ptr' type-id='type-id-24' 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'/> + <var-decl name='_IO_read_end' type-id='type-id-24' 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'/> + <var-decl name='_IO_read_base' type-id='type-id-24' 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'/> + <var-decl name='_IO_write_base' type-id='type-id-24' 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'/> + <var-decl name='_IO_write_ptr' type-id='type-id-24' 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'/> + <var-decl name='_IO_write_end' type-id='type-id-24' 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'/> + <var-decl name='_IO_buf_base' type-id='type-id-24' 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'/> + <var-decl name='_IO_buf_end' type-id='type-id-24' 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'/> + <var-decl name='_IO_save_base' type-id='type-id-24' 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'/> + <var-decl name='_IO_backup_base' type-id='type-id-24' 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'/> + <var-decl name='_IO_save_end' type-id='type-id-24' 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-1455' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='68' column='1'/> + <var-decl name='_markers' type-id='type-id-1456' 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-1456' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='70' column='1'/> + <var-decl name='_chain' type-id='type-id-1457' 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'/> @@ -23060,312 +23092,312 @@ <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-1434' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='74' column='1'/> + <var-decl name='_old_offset' type-id='type-id-1435' 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'/> + <var-decl name='_cur_column' type-id='type-id-28' 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-425' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='78' column='1'/> + <var-decl name='_vtable_offset' type-id='type-id-427' 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-371' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='79' column='1'/> + <var-decl name='_shortbuf' type-id='type-id-373' 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-1457' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='81' column='1'/> + <var-decl name='_lock' type-id='type-id-1458' 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'/> + <var-decl name='_offset' type-id='type-id-21' 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-1458' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='91' column='1'/> + <var-decl name='_codecvt' type-id='type-id-1459' 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-1459' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='92' column='1'/> + <var-decl name='_wide_data' type-id='type-id-1460' 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-1456' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='93' column='1'/> + <var-decl name='_freeres_list' type-id='type-id-1457' 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-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='94' column='1'/> + <var-decl name='_freeres_buf' type-id='type-id-41' 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'/> + <var-decl name='__pad5' type-id='type-id-14' 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-857' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='98' column='1'/> + <var-decl name='_unused2' type-id='type-id-859' 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-94' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='49' column='1' id='type-id-1344'/> - <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-1343'/> - <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'/> - <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-474'/> - <enum-decl name='decoding_state' filepath='Parser/lexer/state.h' line='13' column='1' id='type-id-1460'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='ino_t' type-id='type-id-100' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='49' column='1' id='type-id-1345'/> + <typedef-decl name='dev_t' type-id='type-id-191' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='59' column='1' id='type-id-1344'/> + <typedef-decl name='ssize_t' type-id='type-id-190' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='108' column='1' id='type-id-189'/> + <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-476'/> + <enum-decl name='decoding_state' filepath='Parser/lexer/state.h' line='15' column='1' id='type-id-1461'> + <underlying-type type-id='type-id-43'/> <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-1461'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='interactive_underflow_t' filepath='Parser/lexer/state.h' line='21' column='1' id='type-id-1462'> + <underlying-type type-id='type-id-43'/> <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-1462'> + <class-decl name='token' size-in-bits='384' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='29' column='1' id='type-id-1463'> <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'/> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='30' 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'/> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='31' 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'/> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='31' 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'/> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='31' 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'/> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='31' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='30' column='1'/> + <var-decl name='start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='32' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='end' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='30' column='1'/> + <var-decl name='end' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='32' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='metadata' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='31' column='1'/> + <var-decl name='metadata' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='33' 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-1463'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='tokenizer_mode_kind_t' filepath='Parser/lexer/state.h' line='36' column='1' id='type-id-1464'> + <underlying-type type-id='type-id-43'/> <enumerator name='TOK_REGULAR_MODE' value='0'/> <enumerator name='TOK_FSTRING_MODE' value='1'/> </enum-decl> - <enum-decl name='string_kind_t' filepath='Parser/lexer/state.h' line='39' column='1' id='type-id-1464'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='string_kind_t' filepath='Parser/lexer/state.h' line='41' column='1' id='type-id-1465'> + <underlying-type type-id='type-id-43'/> <enumerator name='FSTRING' value='0'/> <enumerator name='TSTRING' value='1'/> </enum-decl> - <class-decl name='_tokenizer_mode' size-in-bits='832' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='46' column='1' id='type-id-1465'> + <class-decl name='_tokenizer_mode' size-in-bits='832' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='48' column='1' id='type-id-1466'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-1463' visibility='default' filepath='Parser/lexer/state.h' line='47' column='1'/> + <var-decl name='kind' type-id='type-id-1464' visibility='default' filepath='Parser/lexer/state.h' line='49' 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='49' column='1'/> + <var-decl name='curly_bracket_depth' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='51' 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='50' column='1'/> + <var-decl name='curly_bracket_expr_start_depth' 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='96'> - <var-decl name='quote' type-id='type-id-58' visibility='default' filepath='Parser/lexer/state.h' line='52' column='1'/> + <var-decl name='quote' type-id='type-id-64' visibility='default' filepath='Parser/lexer/state.h' line='54' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='quote_size' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='53' column='1'/> + <var-decl name='quote_size' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='55' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='raw' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='54' column='1'/> + <var-decl name='raw' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='56' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='55' column='1'/> + <var-decl name='start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='57' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='multi_line_start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='56' column='1'/> + <var-decl name='multi_line_start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='58' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='first_line' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='57' column='1'/> + <var-decl name='first_line' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='59' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='start_offset' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='59' column='1'/> + <var-decl name='start_offset' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='61' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='multi_line_start_offset' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='60' column='1'/> + <var-decl name='multi_line_start_offset' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='62' 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='62' column='1'/> + <var-decl name='last_expr_size' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='64' 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='63' column='1'/> + <var-decl name='last_expr_end' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='65' 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='64' column='1'/> + <var-decl name='last_expr_buffer' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='in_debug' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='65' column='1'/> + <var-decl name='in_debug' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='67' 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='66' column='1'/> + <var-decl name='in_format_spec' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='string_kind' type-id='type-id-1464' visibility='default' filepath='Parser/lexer/state.h' line='68' column='1'/> + <var-decl name='string_kind' type-id='type-id-1465' visibility='default' filepath='Parser/lexer/state.h' line='70' column='1'/> </data-member> </class-decl> - <typedef-decl name='tokenizer_mode' type-id='type-id-1465' filepath='Parser/lexer/state.h' line='69' column='1' id='type-id-899'/> - <class-decl name='tok_state' size-in-bits='147776' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='72' column='1' id='type-id-1466'> + <typedef-decl name='tokenizer_mode' type-id='type-id-1466' filepath='Parser/lexer/state.h' line='71' column='1' id='type-id-901'/> + <class-decl name='tok_state' size-in-bits='147776' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='74' column='1' id='type-id-1467'> <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='75' column='1'/> + <var-decl name='buf' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='77' 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='76' column='1'/> + <var-decl name='cur' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='78' 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='77' column='1'/> + <var-decl name='inp' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='79' 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='78' column='1'/> + <var-decl name='fp_interactive' 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='256'> - <var-decl name='interactive_src_start' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='79' column='1'/> + <var-decl name='interactive_src_start' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='81' 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='80' column='1'/> + <var-decl name='interactive_src_end' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='82' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='end' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='81' column='1'/> + <var-decl name='end' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='82' column='1'/> + <var-decl name='start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='84' 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='83' column='1'/> + <var-decl name='done' 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='576'> - <var-decl name='fp' type-id='type-id-61' visibility='default' filepath='Parser/lexer/state.h' line='85' column='1'/> + <var-decl name='fp' type-id='type-id-67' visibility='default' filepath='Parser/lexer/state.h' line='87' 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='86' column='1'/> + <var-decl name='tabsize' 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='672'> - <var-decl name='indent' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='87' column='1'/> + <var-decl name='indent' 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='704'> - <var-decl name='indstack' type-id='type-id-884' visibility='default' filepath='Parser/lexer/state.h' line='88' column='1'/> + <var-decl name='indstack' type-id='type-id-886' visibility='default' filepath='Parser/lexer/state.h' line='90' 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='89' column='1'/> + <var-decl name='atbol' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='91' 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='90' column='1'/> + <var-decl name='pendin' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='prompt' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='91' column='1'/> + <var-decl name='prompt' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4032'> - <var-decl name='nextprompt' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='91' column='1'/> + <var-decl name='nextprompt' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='93' 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='92' column='1'/> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='94' 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='93' column='1'/> + <var-decl name='first_lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='95' 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='95' column='1'/> + <var-decl name='starting_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='97' 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='96' column='1'/> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='98' 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='97' column='1'/> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='99' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4256'> - <var-decl name='parenstack' type-id='type-id-855' visibility='default' filepath='Parser/lexer/state.h' line='99' column='1'/> + <var-decl name='parenstack' type-id='type-id-857' visibility='default' filepath='Parser/lexer/state.h' line='101' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='5856'> - <var-decl name='parenlinenostack' type-id='type-id-887' visibility='default' filepath='Parser/lexer/state.h' line='100' column='1'/> + <var-decl name='parenlinenostack' type-id='type-id-889' visibility='default' filepath='Parser/lexer/state.h' line='102' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='12256'> - <var-decl name='parencolstack' type-id='type-id-887' visibility='default' filepath='Parser/lexer/state.h' line='101' column='1'/> + <var-decl name='parencolstack' type-id='type-id-889' visibility='default' filepath='Parser/lexer/state.h' line='103' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='18688'> - <var-decl name='filename' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='102' column='1'/> + <var-decl name='filename' 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='18752'> - <var-decl name='altindstack' type-id='type-id-884' visibility='default' filepath='Parser/lexer/state.h' line='104' column='1'/> + <var-decl name='altindstack' type-id='type-id-886' visibility='default' filepath='Parser/lexer/state.h' line='106' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='21952'> - <var-decl name='decoding_state' type-id='type-id-1460' visibility='default' filepath='Parser/lexer/state.h' line='106' column='1'/> + <var-decl name='decoding_state' type-id='type-id-1461' visibility='default' filepath='Parser/lexer/state.h' line='108' 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='107' column='1'/> + <var-decl name='decoding_erred' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='109' 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='108' column='1'/> + <var-decl name='encoding' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='110' 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='109' column='1'/> + <var-decl name='cont_line' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='111' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22144'> - <var-decl name='line_start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='110' column='1'/> + <var-decl name='line_start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='112' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22208'> - <var-decl name='multi_line_start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='111' column='1'/> + <var-decl name='multi_line_start' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22272'> - <var-decl name='decoding_readline' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='114' column='1'/> + <var-decl name='decoding_readline' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='116' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22336'> - <var-decl name='decoding_buffer' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='115' column='1'/> + <var-decl name='decoding_buffer' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='117' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22400'> - <var-decl name='readline' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='116' column='1'/> + <var-decl name='readline' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='118' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22464'> - <var-decl name='enc' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='117' column='1'/> + <var-decl name='enc' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='119' 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='118' column='1'/> + <var-decl name='str' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='120' 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='119' column='1'/> + <var-decl name='input' type-id='type-id-24' visibility='default' filepath='Parser/lexer/state.h' line='121' 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='121' column='1'/> + <var-decl name='type_comments' 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='22688'> - <var-decl name='interactive_underflow' type-id='type-id-1461' visibility='default' filepath='Parser/lexer/state.h' line='124' column='1'/> + <var-decl name='interactive_underflow' type-id='type-id-1462' visibility='default' filepath='Parser/lexer/state.h' line='126' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22720'> - <var-decl name='underflow' type-id='type-id-1467' visibility='default' filepath='Parser/lexer/state.h' line='125' column='1'/> + <var-decl name='underflow' type-id='type-id-1468' visibility='default' filepath='Parser/lexer/state.h' line='127' 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='127' column='1'/> + <var-decl name='report_warnings' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='129' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='22848'> - <var-decl name='tok_mode_stack' type-id='type-id-900' visibility='default' filepath='Parser/lexer/state.h' line='129' column='1'/> + <var-decl name='tok_mode_stack' type-id='type-id-902' visibility='default' filepath='Parser/lexer/state.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='147648'> - <var-decl name='tok_mode_stack_index' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='130' column='1'/> + <var-decl name='tok_mode_stack_index' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='132' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='147680'> - <var-decl name='tok_extra_tokens' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='131' column='1'/> + <var-decl name='tok_extra_tokens' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='133' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='147712'> - <var-decl name='comment_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='132' column='1'/> + <var-decl name='comment_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='134' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='147744'> - <var-decl name='implicit_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='133' column='1'/> + <var-decl name='implicit_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='135' column='1'/> </data-member> </class-decl> - <class-decl name='_memo' size-in-bits='256' is-struct='yes' visibility='default' filepath='Parser/pegen.h' line='32' column='1' id='type-id-1468'> + <class-decl name='_memo' size-in-bits='256' is-struct='yes' visibility='default' filepath='Parser/pegen.h' line='32' column='1' id='type-id-1469'> <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='33' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='node' type-id='type-id-35' visibility='default' filepath='Parser/pegen.h' line='34' column='1'/> + <var-decl name='node' type-id='type-id-41' visibility='default' filepath='Parser/pegen.h' line='34' 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='35' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='next' type-id='type-id-1469' visibility='default' filepath='Parser/pegen.h' line='36' column='1'/> + <var-decl name='next' type-id='type-id-1470' visibility='default' filepath='Parser/pegen.h' line='36' column='1'/> </data-member> </class-decl> - <typedef-decl name='Memo' type-id='type-id-1468' filepath='Parser/pegen.h' line='37' column='1' id='type-id-1470'/> - <class-decl name='Token' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1471' visibility='default' filepath='Parser/pegen.h' line='39' column='1' id='type-id-1472'> + <typedef-decl name='Memo' type-id='type-id-1469' filepath='Parser/pegen.h' line='37' column='1' id='type-id-1471'/> + <class-decl name='Token' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1472' visibility='default' filepath='Parser/pegen.h' line='39' column='1' id='type-id-1473'> <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='40' column='1'/> </data-member> @@ -23388,14 +23420,14 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='43' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='memo' type-id='type-id-1473' visibility='default' filepath='Parser/pegen.h' line='44' column='1'/> + <var-decl name='memo' type-id='type-id-1474' visibility='default' filepath='Parser/pegen.h' line='44' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> <var-decl name='metadata' type-id='type-id-6' visibility='default' filepath='Parser/pegen.h' line='45' column='1'/> </data-member> </class-decl> - <typedef-decl name='Token' type-id='type-id-1472' filepath='Parser/pegen.h' line='46' column='1' id='type-id-1471'/> - <class-decl name='KeywordToken' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1474' visibility='default' filepath='Parser/pegen.h' line='48' column='1' id='type-id-1475'> + <typedef-decl name='Token' type-id='type-id-1473' filepath='Parser/pegen.h' line='46' column='1' id='type-id-1472'/> + <class-decl name='KeywordToken' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1475' visibility='default' filepath='Parser/pegen.h' line='48' column='1' id='type-id-1476'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='str' type-id='type-id-4' visibility='default' filepath='Parser/pegen.h' line='49' column='1'/> </data-member> @@ -23403,28 +23435,28 @@ <var-decl name='type' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='50' column='1'/> </data-member> </class-decl> - <typedef-decl name='KeywordToken' type-id='type-id-1475' filepath='Parser/pegen.h' line='51' column='1' id='type-id-1474'/> - <class-decl name='growable_comment_array' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1476' visibility='default' filepath='Parser/pegen.h' line='54' column='1' id='type-id-1477'> + <typedef-decl name='KeywordToken' type-id='type-id-1476' filepath='Parser/pegen.h' line='51' column='1' id='type-id-1475'/> + <class-decl name='growable_comment_array' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1477' visibility='default' filepath='Parser/pegen.h' line='54' column='1' id='type-id-1478'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='items' type-id='type-id-1478' visibility='default' filepath='Parser/pegen.h' line='58' column='1'/> + <var-decl name='items' type-id='type-id-1479' visibility='default' filepath='Parser/pegen.h' line='58' 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='59' column='1'/> + <var-decl name='size' type-id='type-id-14' visibility='default' filepath='Parser/pegen.h' line='59' 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='60' column='1'/> + <var-decl name='num_items' type-id='type-id-14' visibility='default' filepath='Parser/pegen.h' line='60' 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='Parser/pegen.h' line='55' column='1' id='type-id-1479'> + <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='Parser/pegen.h' line='55' column='1' id='type-id-1480'> <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='56' 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='57' column='1'/> + <var-decl name='comment' type-id='type-id-24' visibility='default' filepath='Parser/pegen.h' line='57' column='1'/> </data-member> </class-decl> - <typedef-decl name='growable_comment_array' type-id='type-id-1477' filepath='Parser/pegen.h' line='61' column='1' id='type-id-1476'/> - <class-decl name='location' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1480' visibility='default' filepath='Parser/pegen.h' line='63' column='1' id='type-id-1481'> + <typedef-decl name='growable_comment_array' type-id='type-id-1478' filepath='Parser/pegen.h' line='61' column='1' id='type-id-1477'/> + <class-decl name='location' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1481' visibility='default' filepath='Parser/pegen.h' line='63' column='1' id='type-id-1482'> <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='64' column='1'/> </data-member> @@ -23438,13 +23470,13 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='67' column='1'/> </data-member> </class-decl> - <typedef-decl name='location' type-id='type-id-1481' filepath='Parser/pegen.h' line='68' column='1' id='type-id-1480'/> - <class-decl name='Parser' size-in-bits='1408' is-struct='yes' naming-typedef-id='type-id-1482' visibility='default' filepath='Parser/pegen.h' line='70' column='1' id='type-id-1483'> + <typedef-decl name='location' type-id='type-id-1482' filepath='Parser/pegen.h' line='68' column='1' id='type-id-1481'/> + <class-decl name='Parser' size-in-bits='1408' is-struct='yes' naming-typedef-id='type-id-1483' visibility='default' filepath='Parser/pegen.h' line='70' column='1' id='type-id-1484'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tok' type-id='type-id-750' visibility='default' filepath='Parser/pegen.h' line='71' column='1'/> + <var-decl name='tok' type-id='type-id-752' visibility='default' filepath='Parser/pegen.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tokens' type-id='type-id-1484' visibility='default' filepath='Parser/pegen.h' line='72' column='1'/> + <var-decl name='tokens' type-id='type-id-1485' visibility='default' filepath='Parser/pegen.h' line='72' 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='73' column='1'/> @@ -23456,10 +23488,10 @@ <var-decl name='size' 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='256'> - <var-decl name='arena' type-id='type-id-743' visibility='default' filepath='Parser/pegen.h' line='75' column='1'/> + <var-decl name='arena' type-id='type-id-745' visibility='default' filepath='Parser/pegen.h' line='75' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='keywords' type-id='type-id-1485' visibility='default' filepath='Parser/pegen.h' line='76' column='1'/> + <var-decl name='keywords' type-id='type-id-1486' visibility='default' filepath='Parser/pegen.h' line='76' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> <var-decl name='soft_keywords' type-id='type-id-251' visibility='default' filepath='Parser/pegen.h' line='77' column='1'/> @@ -23471,7 +23503,7 @@ <var-decl name='start_rule' 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='512'> - <var-decl name='errcode' type-id='type-id-177' visibility='default' filepath='Parser/pegen.h' line='80' column='1'/> + <var-decl name='errcode' type-id='type-id-183' visibility='default' filepath='Parser/pegen.h' line='80' 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='81' column='1'/> @@ -23495,10 +23527,10 @@ <var-decl name='feature_version' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='87' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='type_ignore_comments' type-id='type-id-1476' visibility='default' filepath='Parser/pegen.h' line='88' column='1'/> + <var-decl name='type_ignore_comments' type-id='type-id-1477' visibility='default' filepath='Parser/pegen.h' line='88' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='known_err_token' type-id='type-id-749' visibility='default' filepath='Parser/pegen.h' line='89' column='1'/> + <var-decl name='known_err_token' type-id='type-id-751' visibility='default' filepath='Parser/pegen.h' line='89' 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='90' column='1'/> @@ -23510,183 +23542,183 @@ <var-decl name='debug' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1248'> - <var-decl name='last_stmt_location' type-id='type-id-1480' visibility='default' filepath='Parser/pegen.h' line='93' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Parser' type-id='type-id-1483' filepath='Parser/pegen.h' line='94' column='1' id='type-id-1482'/> - <pointer-type-def type-id='type-id-1267' size-in-bits='64' id='type-id-806'/> - <pointer-type-def type-id='type-id-1437' size-in-bits='64' id='type-id-61'/> - <pointer-type-def type-id='type-id-1474' size-in-bits='64' id='type-id-1486'/> - <pointer-type-def type-id='type-id-1486' size-in-bits='64' id='type-id-1485'/> - <pointer-type-def type-id='type-id-1470' size-in-bits='64' id='type-id-1473'/> - <pointer-type-def type-id='type-id-1482' size-in-bits='64' id='type-id-748'/> - <pointer-type-def type-id='type-id-1325' size-in-bits='64' id='type-id-743'/> - <pointer-type-def type-id='type-id-592' size-in-bits='64' id='type-id-1010'/> - <pointer-type-def type-id='type-id-1034' size-in-bits='64' id='type-id-1166'/> - <pointer-type-def type-id='type-id-596' size-in-bits='64' id='type-id-1018'/> - <pointer-type-def type-id='type-id-364' size-in-bits='64' id='type-id-345'/> - <pointer-type-def type-id='type-id-432' size-in-bits='64' id='type-id-413'/> - <pointer-type-def type-id='type-id-971' size-in-bits='64' id='type-id-312'/> - <pointer-type-def type-id='type-id-1411' size-in-bits='64' id='type-id-383'/> - <pointer-type-def type-id='type-id-1368' size-in-bits='64' id='type-id-1371'/> - <pointer-type-def type-id='type-id-1360' size-in-bits='64' id='type-id-33'/> - <pointer-type-def type-id='type-id-594' size-in-bits='64' id='type-id-1014'/> - <pointer-type-def type-id='type-id-1412' size-in-bits='64' id='type-id-382'/> - <pointer-type-def type-id='type-id-1410' size-in-bits='64' id='type-id-176'/> - <pointer-type-def type-id='type-id-593' size-in-bits='64' id='type-id-1012'/> - <pointer-type-def type-id='type-id-390' size-in-bits='64' id='type-id-6'/> - <pointer-type-def type-id='type-id-476' size-in-bits='64' id='type-id-466'/> - <pointer-type-def type-id='type-id-1487' size-in-bits='64' id='type-id-1390'/> - <pointer-type-def type-id='type-id-1488' size-in-bits='64' id='type-id-1405'/> - <pointer-type-def type-id='type-id-1489' size-in-bits='64' id='type-id-1384'/> - <pointer-type-def type-id='type-id-1490' size-in-bits='64' id='type-id-1391'/> - <pointer-type-def type-id='type-id-1491' size-in-bits='64' id='type-id-1402'/> - <pointer-type-def type-id='type-id-1492' size-in-bits='64' id='type-id-966'/> - <pointer-type-def type-id='type-id-1493' size-in-bits='64' id='type-id-1399'/> - <pointer-type-def type-id='type-id-1494' size-in-bits='64' id='type-id-1394'/> - <pointer-type-def type-id='type-id-1495' size-in-bits='64' id='type-id-970'/> - <pointer-type-def type-id='type-id-1496' size-in-bits='64' id='type-id-1052'/> - <pointer-type-def type-id='type-id-1497' size-in-bits='64' id='type-id-1403'/> + <var-decl name='last_stmt_location' type-id='type-id-1481' visibility='default' filepath='Parser/pegen.h' line='93' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Parser' type-id='type-id-1484' filepath='Parser/pegen.h' line='94' column='1' id='type-id-1483'/> + <pointer-type-def type-id='type-id-1268' size-in-bits='64' id='type-id-808'/> + <pointer-type-def type-id='type-id-1438' size-in-bits='64' id='type-id-67'/> + <pointer-type-def type-id='type-id-1475' size-in-bits='64' id='type-id-1487'/> + <pointer-type-def type-id='type-id-1487' size-in-bits='64' id='type-id-1486'/> + <pointer-type-def type-id='type-id-1471' size-in-bits='64' id='type-id-1474'/> + <pointer-type-def type-id='type-id-1483' size-in-bits='64' id='type-id-750'/> + <pointer-type-def type-id='type-id-1326' size-in-bits='64' id='type-id-745'/> + <pointer-type-def type-id='type-id-594' size-in-bits='64' id='type-id-1012'/> + <pointer-type-def type-id='type-id-1036' size-in-bits='64' id='type-id-1168'/> + <pointer-type-def type-id='type-id-598' size-in-bits='64' id='type-id-1020'/> + <pointer-type-def type-id='type-id-366' size-in-bits='64' id='type-id-347'/> + <pointer-type-def type-id='type-id-434' size-in-bits='64' id='type-id-415'/> + <pointer-type-def type-id='type-id-973' size-in-bits='64' id='type-id-314'/> + <pointer-type-def type-id='type-id-1412' size-in-bits='64' id='type-id-385'/> + <pointer-type-def type-id='type-id-1369' size-in-bits='64' id='type-id-1372'/> + <pointer-type-def type-id='type-id-1361' size-in-bits='64' id='type-id-39'/> + <pointer-type-def type-id='type-id-596' size-in-bits='64' id='type-id-1016'/> + <pointer-type-def type-id='type-id-1413' size-in-bits='64' id='type-id-384'/> + <pointer-type-def type-id='type-id-1411' size-in-bits='64' id='type-id-182'/> + <pointer-type-def type-id='type-id-595' size-in-bits='64' id='type-id-1014'/> + <pointer-type-def type-id='type-id-392' size-in-bits='64' id='type-id-6'/> + <pointer-type-def type-id='type-id-478' size-in-bits='64' id='type-id-468'/> + <pointer-type-def type-id='type-id-1488' size-in-bits='64' id='type-id-1391'/> + <pointer-type-def type-id='type-id-1489' size-in-bits='64' id='type-id-1406'/> + <pointer-type-def type-id='type-id-1490' size-in-bits='64' id='type-id-1385'/> + <pointer-type-def type-id='type-id-1491' size-in-bits='64' id='type-id-1392'/> + <pointer-type-def type-id='type-id-1492' size-in-bits='64' id='type-id-1403'/> + <pointer-type-def type-id='type-id-1493' size-in-bits='64' id='type-id-968'/> + <pointer-type-def type-id='type-id-1494' size-in-bits='64' id='type-id-1400'/> + <pointer-type-def type-id='type-id-1495' size-in-bits='64' id='type-id-1395'/> + <pointer-type-def type-id='type-id-1496' size-in-bits='64' id='type-id-972'/> + <pointer-type-def type-id='type-id-1497' size-in-bits='64' id='type-id-1054'/> <pointer-type-def type-id='type-id-1498' size-in-bits='64' id='type-id-1404'/> - <pointer-type-def type-id='type-id-1499' size-in-bits='64' id='type-id-1120'/> - <qualified-type-def type-id='type-id-6' const='yes' id='type-id-1500'/> - <pointer-type-def type-id='type-id-1500' size-in-bits='64' id='type-id-265'/> + <pointer-type-def type-id='type-id-1499' size-in-bits='64' id='type-id-1405'/> + <pointer-type-def type-id='type-id-1500' size-in-bits='64' id='type-id-1122'/> + <qualified-type-def type-id='type-id-6' const='yes' id='type-id-1501'/> + <pointer-type-def type-id='type-id-1501' size-in-bits='64' id='type-id-265'/> <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-241'/> - <pointer-type-def type-id='type-id-595' size-in-bits='64' id='type-id-1013'/> - <pointer-type-def type-id='type-id-1378' size-in-bits='64' id='type-id-31'/> + <pointer-type-def type-id='type-id-597' size-in-bits='64' id='type-id-1015'/> + <pointer-type-def type-id='type-id-1379' size-in-bits='64' id='type-id-37'/> <pointer-type-def type-id='type-id-271' size-in-bits='64' id='type-id-1'/> - <pointer-type-def type-id='type-id-305' size-in-bits='64' id='type-id-619'/> + <pointer-type-def type-id='type-id-307' size-in-bits='64' id='type-id-621'/> <pointer-type-def type-id='type-id-260' size-in-bits='64' id='type-id-268'/> <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-8'/> - <pointer-type-def type-id='type-id-1471' size-in-bits='64' id='type-id-749'/> - <pointer-type-def type-id='type-id-749' size-in-bits='64' id='type-id-1484'/> - <pointer-type-def type-id='type-id-1436' size-in-bits='64' id='type-id-1456'/> - <pointer-type-def type-id='type-id-865' size-in-bits='64' id='type-id-1458'/> - <pointer-type-def type-id='type-id-1454' size-in-bits='64' id='type-id-1457'/> - <pointer-type-def type-id='type-id-866' size-in-bits='64' id='type-id-1455'/> + <pointer-type-def type-id='type-id-1472' size-in-bits='64' id='type-id-751'/> + <pointer-type-def type-id='type-id-751' size-in-bits='64' id='type-id-1485'/> + <pointer-type-def type-id='type-id-1437' size-in-bits='64' id='type-id-1457'/> <pointer-type-def type-id='type-id-867' size-in-bits='64' id='type-id-1459'/> - <pointer-type-def type-id='type-id-988' size-in-bits='64' id='type-id-276'/> - <pointer-type-def type-id='type-id-957' size-in-bits='64' id='type-id-368'/> - <pointer-type-def type-id='type-id-1230' size-in-bits='64' id='type-id-1234'/> - <pointer-type-def type-id='type-id-1232' size-in-bits='64' id='type-id-370'/> - <pointer-type-def type-id='type-id-420' size-in-bits='64' id='type-id-242'/> - <pointer-type-def type-id='type-id-372' size-in-bits='64' id='type-id-367'/> - <pointer-type-def type-id='type-id-365' size-in-bits='64' id='type-id-338'/> - <pointer-type-def type-id='type-id-423' size-in-bits='64' id='type-id-431'/> - <pointer-type-def type-id='type-id-1379' size-in-bits='64' id='type-id-171'/> - <pointer-type-def type-id='type-id-1048' size-in-bits='64' id='type-id-1051'/> - <pointer-type-def type-id='type-id-433' size-in-bits='64' id='type-id-395'/> - <pointer-type-def type-id='type-id-1299' size-in-bits='64' id='type-id-1300'/> - <pointer-type-def type-id='type-id-1380' size-in-bits='64' id='type-id-1287'/> - <pointer-type-def type-id='type-id-1139' size-in-bits='64' id='type-id-1142'/> - <pointer-type-def type-id='type-id-1119' size-in-bits='64' id='type-id-1501'/> - <pointer-type-def type-id='type-id-868' size-in-bits='64' id='type-id-1361'/> - <pointer-type-def type-id='type-id-361' size-in-bits='64' id='type-id-363'/> - <pointer-type-def type-id='type-id-1215' size-in-bits='64' id='type-id-1502'/> - <pointer-type-def type-id='type-id-1503' size-in-bits='64' id='type-id-1221'/> - <pointer-type-def type-id='type-id-610' size-in-bits='64' id='type-id-618'/> - <pointer-type-def type-id='type-id-1209' size-in-bits='64' id='type-id-1210'/> - <pointer-type-def type-id='type-id-1211' size-in-bits='64' id='type-id-1214'/> - <pointer-type-def type-id='type-id-1212' size-in-bits='64' id='type-id-1225'/> - <pointer-type-def type-id='type-id-1479' size-in-bits='64' id='type-id-1478'/> - <pointer-type-def type-id='type-id-1432' size-in-bits='64' id='type-id-1433'/> - <pointer-type-def type-id='type-id-869' size-in-bits='64' id='type-id-306'/> - <pointer-type-def type-id='type-id-1113' size-in-bits='64' id='type-id-1076'/> - <pointer-type-def type-id='type-id-1112' size-in-bits='64' id='type-id-1075'/> - <pointer-type-def type-id='type-id-1111' size-in-bits='64' id='type-id-1074'/> - <pointer-type-def type-id='type-id-1044' size-in-bits='64' id='type-id-1045'/> - <pointer-type-def type-id='type-id-1087' size-in-bits='64' id='type-id-1069'/> - <pointer-type-def type-id='type-id-1175' size-in-bits='64' id='type-id-1246'/> - <pointer-type-def type-id='type-id-976' size-in-bits='64' id='type-id-1256'/> + <pointer-type-def type-id='type-id-1455' size-in-bits='64' id='type-id-1458'/> + <pointer-type-def type-id='type-id-868' size-in-bits='64' id='type-id-1456'/> + <pointer-type-def type-id='type-id-869' size-in-bits='64' id='type-id-1460'/> + <pointer-type-def type-id='type-id-990' size-in-bits='64' id='type-id-278'/> + <pointer-type-def type-id='type-id-959' size-in-bits='64' id='type-id-370'/> + <pointer-type-def type-id='type-id-1232' size-in-bits='64' id='type-id-1236'/> + <pointer-type-def type-id='type-id-1234' size-in-bits='64' id='type-id-372'/> + <pointer-type-def type-id='type-id-422' size-in-bits='64' id='type-id-242'/> + <pointer-type-def type-id='type-id-374' size-in-bits='64' id='type-id-369'/> + <pointer-type-def type-id='type-id-367' size-in-bits='64' id='type-id-340'/> + <pointer-type-def type-id='type-id-425' size-in-bits='64' id='type-id-433'/> + <pointer-type-def type-id='type-id-1380' size-in-bits='64' id='type-id-177'/> + <pointer-type-def type-id='type-id-1050' size-in-bits='64' id='type-id-1053'/> + <pointer-type-def type-id='type-id-435' size-in-bits='64' id='type-id-397'/> + <pointer-type-def type-id='type-id-1300' size-in-bits='64' id='type-id-1301'/> + <pointer-type-def type-id='type-id-1381' size-in-bits='64' id='type-id-1288'/> + <pointer-type-def type-id='type-id-1141' size-in-bits='64' id='type-id-1144'/> + <pointer-type-def type-id='type-id-1121' size-in-bits='64' id='type-id-1502'/> + <pointer-type-def type-id='type-id-870' size-in-bits='64' id='type-id-1362'/> + <pointer-type-def type-id='type-id-363' size-in-bits='64' id='type-id-365'/> + <pointer-type-def type-id='type-id-1217' size-in-bits='64' id='type-id-1503'/> + <pointer-type-def type-id='type-id-1504' size-in-bits='64' id='type-id-1223'/> + <pointer-type-def type-id='type-id-612' size-in-bits='64' id='type-id-620'/> + <pointer-type-def type-id='type-id-1211' size-in-bits='64' id='type-id-1212'/> + <pointer-type-def type-id='type-id-1213' size-in-bits='64' id='type-id-1216'/> + <pointer-type-def type-id='type-id-1214' size-in-bits='64' id='type-id-1227'/> + <pointer-type-def type-id='type-id-1480' size-in-bits='64' id='type-id-1479'/> + <pointer-type-def type-id='type-id-1433' size-in-bits='64' id='type-id-1434'/> + <pointer-type-def type-id='type-id-871' size-in-bits='64' id='type-id-308'/> + <pointer-type-def type-id='type-id-1115' size-in-bits='64' id='type-id-1078'/> <pointer-type-def type-id='type-id-1114' size-in-bits='64' id='type-id-1077'/> - <pointer-type-def type-id='type-id-1468' size-in-bits='64' id='type-id-1469'/> - <pointer-type-def type-id='type-id-1324' size-in-bits='64' id='type-id-1297'/> - <pointer-type-def type-id='type-id-1332' size-in-bits='64' id='type-id-1333'/> - <pointer-type-def type-id='type-id-1296' size-in-bits='64' id='type-id-1331'/> - <pointer-type-def type-id='type-id-1330' size-in-bits='64' id='type-id-571'/> + <pointer-type-def type-id='type-id-1113' size-in-bits='64' id='type-id-1076'/> <pointer-type-def type-id='type-id-1046' size-in-bits='64' id='type-id-1047'/> - <pointer-type-def type-id='type-id-1137' size-in-bits='64' id='type-id-1138'/> - <pointer-type-def type-id='type-id-1318' size-in-bits='64' id='type-id-845'/> - <pointer-type-def type-id='type-id-1319' size-in-bits='64' id='type-id-848'/> - <pointer-type-def type-id='type-id-1314' size-in-bits='64' id='type-id-850'/> - <pointer-type-def type-id='type-id-1082' size-in-bits='64' id='type-id-745'/> - <pointer-type-def type-id='type-id-1080' size-in-bits='64' id='type-id-801'/> - <pointer-type-def type-id='type-id-1078' size-in-bits='64' id='type-id-682'/> - <pointer-type-def type-id='type-id-1067' size-in-bits='64' id='type-id-744'/> - <pointer-type-def type-id='type-id-1084' size-in-bits='64' id='type-id-708'/> - <pointer-type-def type-id='type-id-1248' size-in-bits='64' id='type-id-1249'/> - <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-251'/> - <pointer-type-def type-id='type-id-871' size-in-bits='64' id='type-id-1244'/> - <pointer-type-def type-id='type-id-589' size-in-bits='64' id='type-id-989'/> - <pointer-type-def type-id='type-id-172' size-in-bits='64' id='type-id-181'/> - <pointer-type-def type-id='type-id-1169' size-in-bits='64' id='type-id-1173'/> - <pointer-type-def type-id='type-id-1504' size-in-bits='64' id='type-id-1392'/> - <pointer-type-def type-id='type-id-1505' size-in-bits='64' id='type-id-1040'/> - <pointer-type-def type-id='type-id-1506' size-in-bits='64' id='type-id-1397'/> - <pointer-type-def type-id='type-id-1507' size-in-bits='64' id='type-id-1396'/> - <pointer-type-def type-id='type-id-1508' size-in-bits='64' id='type-id-1063'/> - <pointer-type-def type-id='type-id-1509' size-in-bits='64' id='type-id-1408'/> - <pointer-type-def type-id='type-id-1510' size-in-bits='64' id='type-id-1400'/> - <pointer-type-def type-id='type-id-1511' size-in-bits='64' id='type-id-1030'/> - <pointer-type-def type-id='type-id-1512' size-in-bits='64' id='type-id-1395'/> - <pointer-type-def type-id='type-id-1513' size-in-bits='64' id='type-id-1398'/> - <pointer-type-def type-id='type-id-400' size-in-bits='64' id='type-id-396'/> - <pointer-type-def type-id='type-id-1514' size-in-bits='64' id='type-id-1124'/> + <pointer-type-def type-id='type-id-1089' size-in-bits='64' id='type-id-1071'/> + <pointer-type-def type-id='type-id-1177' size-in-bits='64' id='type-id-1248'/> + <pointer-type-def type-id='type-id-978' size-in-bits='64' id='type-id-1257'/> + <pointer-type-def type-id='type-id-1116' size-in-bits='64' id='type-id-1079'/> + <pointer-type-def type-id='type-id-1469' size-in-bits='64' id='type-id-1470'/> + <pointer-type-def type-id='type-id-1325' size-in-bits='64' id='type-id-1298'/> + <pointer-type-def type-id='type-id-1333' size-in-bits='64' id='type-id-1334'/> + <pointer-type-def type-id='type-id-1297' size-in-bits='64' id='type-id-1332'/> + <pointer-type-def type-id='type-id-1331' size-in-bits='64' id='type-id-573'/> + <pointer-type-def type-id='type-id-1048' size-in-bits='64' id='type-id-1049'/> + <pointer-type-def type-id='type-id-1139' size-in-bits='64' id='type-id-1140'/> + <pointer-type-def type-id='type-id-1319' size-in-bits='64' id='type-id-847'/> + <pointer-type-def type-id='type-id-1320' size-in-bits='64' id='type-id-850'/> + <pointer-type-def type-id='type-id-1315' size-in-bits='64' id='type-id-852'/> + <pointer-type-def type-id='type-id-1084' size-in-bits='64' id='type-id-747'/> + <pointer-type-def type-id='type-id-1082' size-in-bits='64' id='type-id-803'/> + <pointer-type-def type-id='type-id-1080' size-in-bits='64' id='type-id-684'/> + <pointer-type-def type-id='type-id-1069' size-in-bits='64' id='type-id-746'/> + <pointer-type-def type-id='type-id-1086' size-in-bits='64' id='type-id-710'/> + <pointer-type-def type-id='type-id-1250' size-in-bits='64' id='type-id-1251'/> + <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-251'/> + <pointer-type-def type-id='type-id-873' size-in-bits='64' id='type-id-1246'/> + <pointer-type-def type-id='type-id-591' size-in-bits='64' id='type-id-991'/> + <pointer-type-def type-id='type-id-178' size-in-bits='64' id='type-id-186'/> + <pointer-type-def type-id='type-id-1171' size-in-bits='64' id='type-id-1175'/> + <pointer-type-def type-id='type-id-1505' size-in-bits='64' id='type-id-1393'/> + <pointer-type-def type-id='type-id-1506' size-in-bits='64' id='type-id-1042'/> + <pointer-type-def type-id='type-id-1507' size-in-bits='64' id='type-id-1398'/> + <pointer-type-def type-id='type-id-1508' size-in-bits='64' id='type-id-1397'/> + <pointer-type-def type-id='type-id-1509' size-in-bits='64' id='type-id-1065'/> + <pointer-type-def type-id='type-id-1510' size-in-bits='64' id='type-id-1409'/> + <pointer-type-def type-id='type-id-1511' size-in-bits='64' id='type-id-1401'/> + <pointer-type-def type-id='type-id-1512' size-in-bits='64' id='type-id-1032'/> + <pointer-type-def type-id='type-id-1513' size-in-bits='64' id='type-id-1396'/> + <pointer-type-def type-id='type-id-1514' size-in-bits='64' id='type-id-1399'/> + <pointer-type-def type-id='type-id-402' size-in-bits='64' id='type-id-398'/> <pointer-type-def type-id='type-id-1515' size-in-bits='64' id='type-id-1126'/> - <pointer-type-def type-id='type-id-1516' size-in-bits='64' id='type-id-1027'/> - <pointer-type-def type-id='type-id-1517' size-in-bits='64' id='type-id-1383'/> - <pointer-type-def type-id='type-id-1518' size-in-bits='64' id='type-id-1467'/> - <pointer-type-def type-id='type-id-1519' size-in-bits='64' id='type-id-961'/> - <pointer-type-def type-id='type-id-1520' size-in-bits='64' id='type-id-965'/> - <pointer-type-def type-id='type-id-1521' size-in-bits='64' id='type-id-969'/> - <pointer-type-def type-id='type-id-1522' size-in-bits='64' id='type-id-975'/> - <pointer-type-def type-id='type-id-1523' size-in-bits='64' id='type-id-1382'/> + <pointer-type-def type-id='type-id-1516' size-in-bits='64' id='type-id-1128'/> + <pointer-type-def type-id='type-id-1517' size-in-bits='64' id='type-id-1029'/> + <pointer-type-def type-id='type-id-1518' size-in-bits='64' id='type-id-1384'/> + <pointer-type-def type-id='type-id-1519' size-in-bits='64' id='type-id-1468'/> + <pointer-type-def type-id='type-id-1520' size-in-bits='64' id='type-id-963'/> + <pointer-type-def type-id='type-id-1521' size-in-bits='64' id='type-id-967'/> + <pointer-type-def type-id='type-id-1522' size-in-bits='64' id='type-id-971'/> + <pointer-type-def type-id='type-id-1523' size-in-bits='64' id='type-id-977'/> + <pointer-type-def type-id='type-id-1524' size-in-bits='64' id='type-id-1383'/> <pointer-type-def type-id='type-id-270' size-in-bits='64' id='type-id-255'/> - <pointer-type-def type-id='type-id-1524' size-in-bits='64' id='type-id-1220'/> - <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-177'/> - <pointer-type-def type-id='type-id-1280' size-in-bits='64' id='type-id-1301'/> + <pointer-type-def type-id='type-id-1525' size-in-bits='64' id='type-id-1222'/> + <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-183'/> + <pointer-type-def type-id='type-id-1281' size-in-bits='64' id='type-id-1302'/> + <pointer-type-def type-id='type-id-1311' size-in-bits='64' id='type-id-1314'/> + <pointer-type-def type-id='type-id-1330' size-in-bits='64' id='type-id-1329'/> <pointer-type-def type-id='type-id-1310' size-in-bits='64' id='type-id-1313'/> - <pointer-type-def type-id='type-id-1329' size-in-bits='64' id='type-id-1328'/> - <pointer-type-def type-id='type-id-1309' size-in-bits='64' id='type-id-1312'/> - <pointer-type-def type-id='type-id-1289' size-in-bits='64' id='type-id-897'/> - <pointer-type-def type-id='type-id-1441' size-in-bits='64' id='type-id-190'/> - <pointer-type-def type-id='type-id-1466' size-in-bits='64' id='type-id-750'/> - <pointer-type-def type-id='type-id-1462' size-in-bits='64' id='type-id-751'/> - <pointer-type-def type-id='type-id-1374' size-in-bits='64' id='type-id-1376'/> - <pointer-type-def type-id='type-id-1525' size-in-bits='64' id='type-id-1001'/> - <pointer-type-def type-id='type-id-1526' size-in-bits='64' id='type-id-1401'/> - <pointer-type-def type-id='type-id-1527' size-in-bits='64' id='type-id-1393'/> - <pointer-type-def type-id='type-id-1528' size-in-bits='64' id='type-id-1219'/> - <pointer-type-def type-id='type-id-309' size-in-bits='64' id='type-id-1233'/> + <pointer-type-def type-id='type-id-1290' size-in-bits='64' id='type-id-899'/> + <pointer-type-def type-id='type-id-1442' size-in-bits='64' id='type-id-194'/> + <pointer-type-def type-id='type-id-1467' size-in-bits='64' id='type-id-752'/> + <pointer-type-def type-id='type-id-1463' size-in-bits='64' id='type-id-753'/> + <pointer-type-def type-id='type-id-1375' size-in-bits='64' id='type-id-1377'/> + <pointer-type-def type-id='type-id-1526' size-in-bits='64' id='type-id-1003'/> + <pointer-type-def type-id='type-id-1527' size-in-bits='64' id='type-id-1402'/> + <pointer-type-def type-id='type-id-1528' size-in-bits='64' id='type-id-1394'/> + <pointer-type-def type-id='type-id-1529' size-in-bits='64' id='type-id-1221'/> + <pointer-type-def type-id='type-id-311' size-in-bits='64' id='type-id-1235'/> <pointer-type-def type-id='type-id-234' size-in-bits='64' id='type-id-232'/> - <pointer-type-def type-id='type-id-318' size-in-bits='64' id='type-id-314'/> - <pointer-type-def type-id='type-id-1529' size-in-bits='64' id='type-id-1409'/> - <pointer-type-def type-id='type-id-1530' size-in-bits='64' id='type-id-1413'/> - <pointer-type-def type-id='type-id-1531' size-in-bits='64' id='type-id-1424'/> - <pointer-type-def type-id='type-id-573' size-in-bits='64' id='type-id-572'/> - <pointer-type-def type-id='type-id-1532' size-in-bits='64' id='type-id-1039'/> - <pointer-type-def type-id='type-id-1533' size-in-bits='64' id='type-id-1033'/> - <pointer-type-def type-id='type-id-1534' size-in-bits='64' id='type-id-1241'/> - <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-35'/> - <pointer-type-def type-id='type-id-1535' size-in-bits='64' id='type-id-1240'/> - <pointer-type-def type-id='type-id-1536' size-in-bits='64' id='type-id-1224'/> - <pointer-type-def type-id='type-id-1537' size-in-bits='64' id='type-id-1032'/> - <pointer-type-def type-id='type-id-1538' size-in-bits='64' id='type-id-1037'/> - <pointer-type-def type-id='type-id-1539' size-in-bits='64' id='type-id-1038'/> - <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-267'/> - <qualified-type-def type-id='type-id-1363' volatile='yes' id='type-id-1362'/> - <pointer-type-def type-id='type-id-474' size-in-bits='64' id='type-id-63'/> - <pointer-type-def type-id='type-id-63' size-in-bits='64' id='type-id-244'/> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-865'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-866'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-867'/> - <class-decl name='_Py_AuditHookEntry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-868'/> - <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-870'/> - <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-871'/> + <pointer-type-def type-id='type-id-320' size-in-bits='64' id='type-id-316'/> + <pointer-type-def type-id='type-id-1530' size-in-bits='64' id='type-id-1410'/> + <pointer-type-def type-id='type-id-1531' size-in-bits='64' id='type-id-1414'/> + <pointer-type-def type-id='type-id-1532' size-in-bits='64' id='type-id-1425'/> + <pointer-type-def type-id='type-id-575' size-in-bits='64' id='type-id-574'/> + <pointer-type-def type-id='type-id-1533' size-in-bits='64' id='type-id-1041'/> + <pointer-type-def type-id='type-id-1534' size-in-bits='64' id='type-id-1035'/> + <pointer-type-def type-id='type-id-1535' size-in-bits='64' id='type-id-1243'/> + <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-41'/> + <pointer-type-def type-id='type-id-1536' size-in-bits='64' id='type-id-1242'/> + <pointer-type-def type-id='type-id-1537' size-in-bits='64' id='type-id-1226'/> + <pointer-type-def type-id='type-id-1538' size-in-bits='64' id='type-id-1034'/> + <pointer-type-def type-id='type-id-1539' size-in-bits='64' id='type-id-1039'/> + <pointer-type-def type-id='type-id-1540' size-in-bits='64' id='type-id-1040'/> + <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-267'/> + <qualified-type-def type-id='type-id-1364' volatile='yes' id='type-id-1363'/> + <pointer-type-def type-id='type-id-476' size-in-bits='64' id='type-id-69'/> + <pointer-type-def type-id='type-id-69' size-in-bits='64' id='type-id-244'/> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-867'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-868'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-869'/> + <class-decl name='_Py_AuditHookEntry' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-870'/> + <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-872'/> + <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-873'/> <function-decl name='PyObject_Vectorcall' mangled-name='PyObject_Vectorcall' filepath='./Include/abstract.h' line='290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Vectorcall'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-265'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> @@ -23697,7 +23729,7 @@ </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-6'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-6'/> @@ -23706,7 +23738,7 @@ <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-360'/> + <parameter type-id='type-id-362'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyImport_ImportModuleAttrString' mangled-name='PyImport_ImportModuleAttrString' filepath='./Include/cpython/import.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleAttrString'> @@ -23723,36 +23755,36 @@ <return type-id='type-id-4'/> </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'/> + <parameter type-id='type-id-178'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyAST_Constant' filepath='./Include/internal/pycore_ast.h' line='843' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-731'/> - <parameter type-id='type-id-706'/> + <parameter type-id='type-id-733'/> + <parameter type-id='type-id-708'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </function-decl> <function-decl name='_PyAST_Name' filepath='./Include/internal/pycore_ast.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-704'/> - <parameter type-id='type-id-746'/> + <parameter type-id='type-id-706'/> + <parameter type-id='type-id-748'/> <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-743'/> - <return type-id='type-id-681'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-683'/> </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-743'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-745'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-743'/> + <parameter type-id='type-id-745'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> @@ -23762,12 +23794,12 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyUnicode_InternImmortal' mangled-name='_PyUnicode_InternImmortal' filepath='./Include/internal/pycore_unicodeobject.h' line='290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternImmortal'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-241'/> <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-184'/> + <parameter type-id='type-id-188'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyLong_FromString' mangled-name='PyLong_FromString' filepath='./Include/longobject.h' line='161' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromString'> @@ -23786,7 +23818,7 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-251'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </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-4'/> @@ -23830,30 +23862,30 @@ <return type-id='type-id-6'/> </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-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> + <parameter type-id='type-id-41'/> <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-4'/> <parameter type-id='type-id-251'/> <parameter type-id='type-id-6'/> - <return type-id='type-id-172'/> + <return type-id='type-id-178'/> </function-decl> - <function-decl name='_Py_Dealloc' mangled-name='_Py_Dealloc' filepath='./Include/refcount.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Dealloc'> + <function-decl name='_Py_Dealloc' mangled-name='_Py_Dealloc' filepath='./Include/refcount.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Dealloc'> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> @@ -23884,48 +23916,48 @@ <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'/> + <return type-id='type-id-183'/> </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-24'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <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-4'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-4'/> - <return type-id='type-id-21'/> + <return type-id='type-id-14'/> </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-750'/> - <parameter type-id='type-id-751'/> + <parameter type-id='type-id-752'/> + <parameter type-id='type-id-753'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyTokenizer_Free' filepath='Parser/lexer/state.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-750'/> + <function-decl name='_PyTokenizer_Free' filepath='Parser/lexer/state.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-752'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyToken_Free' filepath='Parser/lexer/state.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-751'/> + <function-decl name='_PyToken_Free' filepath='Parser/lexer/state.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-753'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyToken_Init' filepath='Parser/lexer/state.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-751'/> + <function-decl name='_PyToken_Init' filepath='Parser/lexer/state.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-753'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Pypegen_raise_decode_error' filepath='Parser/pegen.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_raise_tokenizer_init_error' filepath='Parser/pegen.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -23933,74 +23965,68 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_Pypegen_tokenizer_error' filepath='Parser/pegen.h' line='179' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_raise_error' filepath='Parser/pegen.h' line='180' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_PyPegen_raise_error_known_location' filepath='Parser/pegen.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <parameter type-id='type-id-6'/> <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-4'/> - <parameter type-id='type-id-306'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-308'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='_Pypegen_set_syntax_error' filepath='Parser/pegen.h' line='185' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <parameter type-id='type-id-749'/> + <parameter type-id='type-id-750'/> + <parameter type-id='type-id-751'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyPegen_parse' filepath='Parser/pegen.h' line='385' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> - <return type-id='type-id-35'/> + <function-decl name='_PyPegen_parse' filepath='Parser/pegen.h' line='386' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-750'/> + <return type-id='type-id-41'/> </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-4'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-750'/> + <return type-id='type-id-752'/> </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-4'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-750'/> + <return type-id='type-id-752'/> </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-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-750'/> + <return type-id='type-id-752'/> </function-decl> - <function-type size-in-bits='64' id='type-id-1487'> - <parameter type-id='type-id-6'/> - <return type-id='type-id-6'/> - </function-type> <function-type size-in-bits='64' id='type-id-1488'> - <parameter type-id='type-id-6'/> - <parameter type-id='type-id-265'/> - <parameter type-id='type-id-21'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1489'> <parameter type-id='type-id-6'/> + <parameter type-id='type-id-265'/> + <parameter type-id='type-id-14'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1490'> - <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> @@ -24008,74 +24034,74 @@ <function-type size-in-bits='64' id='type-id-1491'> <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-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1492'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1493'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1494'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-7'/> + <parameter type-id='type-id-24'/> <return type-id='type-id-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1495'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-7'/> <return type-id='type-id-6'/> </function-type> <function-type size-in-bits='64' id='type-id-1496'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-431'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-6'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1497'> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-433'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-type> - <function-type size-in-bits='64' id='type-id-1497'> + <function-type size-in-bits='64' id='type-id-1498'> <parameter type-id='type-id-1'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-type> - <function-type size-in-bits='64' id='type-id-1498'> + <function-type size-in-bits='64' id='type-id-1499'> <parameter type-id='type-id-1'/> <parameter type-id='type-id-7'/> <return type-id='type-id-6'/> </function-type> - <function-type size-in-bits='64' id='type-id-1499'> - <parameter type-id='type-id-1501'/> + <function-type size-in-bits='64' id='type-id-1500'> + <parameter type-id='type-id-1502'/> <return type-id='type-id-6'/> </function-type> - <function-type size-in-bits='64' id='type-id-1503'> - <parameter type-id='type-id-618'/> - <parameter type-id='type-id-35'/> - <return type-id='type-id-1502'/> - </function-type> <function-type size-in-bits='64' id='type-id-1504'> - <parameter type-id='type-id-6'/> - <return type-id='type-id-5'/> + <parameter type-id='type-id-620'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-1503'/> </function-type> <function-type size-in-bits='64' id='type-id-1505'> - <parameter type-id='type-id-6'/> - <parameter type-id='type-id-413'/> - <parameter type-id='type-id-5'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1506'> <parameter type-id='type-id-6'/> + <parameter type-id='type-id-415'/> + <parameter type-id='type-id-5'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1507'> - <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> @@ -24083,176 +24109,182 @@ <function-type size-in-bits='64' id='type-id-1508'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1509'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-268'/> - <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1510'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-6'/> + <parameter type-id='type-id-268'/> + <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1511'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-1028'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1512'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-7'/> - <parameter type-id='type-id-6'/> + <parameter type-id='type-id-1030'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1513'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-397'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1514'> - <parameter type-id='type-id-31'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-1501'/> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1515'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-1123'/> - <parameter type-id='type-id-1501'/> + <parameter type-id='type-id-1502'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1516'> - <parameter type-id='type-id-1'/> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-1125'/> + <parameter type-id='type-id-1502'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1517'> - <parameter type-id='type-id-4'/> - <parameter type-id='type-id-5'/> - <parameter type-id='type-id-619'/> - <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1518'> - <parameter type-id='type-id-750'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-621'/> + <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1519'> - <parameter type-id='type-id-959'/> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-752'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1520'> - <parameter type-id='type-id-963'/> - <parameter type-id='type-id-6'/> + <parameter type-id='type-id-961'/> + <parameter type-id='type-id-347'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1521'> - <parameter type-id='type-id-399'/> - <parameter type-id='type-id-6'/> - <parameter type-id='type-id-6'/> + <parameter type-id='type-id-965'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1522'> - <parameter type-id='type-id-973'/> - <parameter type-id='type-id-312'/> + <parameter type-id='type-id-401'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1523'> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-5'/> - <parameter type-id='type-id-5'/> + <parameter type-id='type-id-975'/> + <parameter type-id='type-id-314'/> + <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-type> <function-type size-in-bits='64' id='type-id-1524'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-307'/> + <parameter type-id='type-id-24'/> + <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-1525'> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1526'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <return type-id='type-id-269'/> </function-type> - <function-type size-in-bits='64' id='type-id-1526'> - <parameter type-id='type-id-6'/> - <return type-id='type-id-304'/> - </function-type> <function-type size-in-bits='64' id='type-id-1527'> <parameter type-id='type-id-6'/> - <return type-id='type-id-7'/> + <return type-id='type-id-306'/> </function-type> <function-type size-in-bits='64' id='type-id-1528'> - <parameter type-id='type-id-35'/> - <return type-id='type-id-1217'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-7'/> </function-type> <function-type size-in-bits='64' id='type-id-1529'> - <parameter type-id='type-id-6'/> - <parameter type-id='type-id-268'/> - <return type-id='type-id-3'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-1219'/> </function-type> <function-type size-in-bits='64' id='type-id-1530'> - <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-268'/> <return type-id='type-id-3'/> </function-type> <function-type size-in-bits='64' id='type-id-1531'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-190'/> - <parameter type-id='type-id-35'/> <return type-id='type-id-3'/> </function-type> <function-type size-in-bits='64' id='type-id-1532'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-194'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-type> <function-type size-in-bits='64' id='type-id-1533'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-type> <function-type size-in-bits='64' id='type-id-1534'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-105'/> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-3'/> </function-type> <function-type size-in-bits='64' id='type-id-1535'> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-111'/> + <parameter type-id='type-id-347'/> + <return type-id='type-id-3'/> </function-type> <function-type size-in-bits='64' id='type-id-1536'> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-type> <function-type size-in-bits='64' id='type-id-1537'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-type> <function-type size-in-bits='64' id='type-id-1538'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-type> <function-type size-in-bits='64' id='type-id-1539'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1540'> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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'> @@ -24266,8 +24298,14 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> + <function-decl name='PyObject_SetAttr' mangled-name='PyObject_SetAttr' filepath='./Include/object.h' line='456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetAttr'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> <function-decl name='Py_GetConstant' mangled-name='Py_GetConstant' filepath='./Include/object.h' line='636' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetConstant'> - <parameter type-id='type-id-105'/> + <parameter type-id='type-id-111'/> <return type-id='type-id-6'/> </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'> @@ -24291,6 +24329,11 @@ <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </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-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </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'/> @@ -24298,11 +24341,11 @@ </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-4'/> - <parameter type-id='type-id-306'/> + <parameter type-id='type-id-308'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyPegen_fill_token' filepath='Parser/pegen.h' line='161' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-748'/> + <parameter type-id='type-id-750'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPegen_byte_offset_to_character_offset' filepath='Parser/pegen.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -24330,7 +24373,7 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-266'/> <return type-id='type-id-6'/> </function-decl> @@ -24339,7 +24382,7 @@ <parameter type-id='type-id-7'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-8'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-266'/> <return type-id='type-id-6'/> </function-decl> @@ -24356,21 +24399,21 @@ <return type-id='type-id-6'/> </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-24'/> <parameter type-id='type-id-4'/> <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-589' size-in-bits='4480' id='type-id-1540'> - <subrange length='70' type-id='type-id-2' id='type-id-1541'/> + <array-type-def dimensions='1' type-id='type-id-591' size-in-bits='4480' id='type-id-1541'> + <subrange length='70' type-id='type-id-2' id='type-id-1542'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-589' size-in-bits='infinite' id='type-id-1542'> + <array-type-def dimensions='1' type-id='type-id-591' size-in-bits='infinite' id='type-id-1543'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <qualified-type-def type-id='type-id-4' const='yes' id='type-id-589'/> - <var-decl name='_PyParser_TokenNames' type-id='type-id-1542' mangled-name='_PyParser_TokenNames' visibility='default' filepath='./Include/internal/pycore_token.h' line='102' column='1' elf-symbol-id='_PyParser_TokenNames'/> + <qualified-type-def type-id='type-id-4' const='yes' id='type-id-591'/> + <var-decl name='_PyParser_TokenNames' type-id='type-id-1543' mangled-name='_PyParser_TokenNames' visibility='default' filepath='./Include/internal/pycore_token.h' line='102' column='1' elf-symbol-id='_PyParser_TokenNames'/> <function-decl name='_PyToken_OneChar' mangled-name='_PyToken_OneChar' filepath='Parser/token.c' line='84' 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='84' column='1'/> <return type-id='type-id-5'/> @@ -24388,9 +24431,9 @@ </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-1543' size-in-bits='64' id='type-id-1544'/> - <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-62'/> - <pointer-type-def type-id='type-id-1545' size-in-bits='64' id='type-id-1546'/> + <pointer-type-def type-id='type-id-1544' size-in-bits='64' id='type-id-1545'/> + <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-68'/> + <pointer-type-def type-id='type-id-1546' size-in-bits='64' id='type-id-1547'/> <function-decl name='PyObject_CallNoArgs' mangled-name='PyObject_CallNoArgs' filepath='./Include/abstract.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallNoArgs'> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> @@ -24402,20 +24445,20 @@ <return type-id='type-id-6'/> </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-61'/> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_Py_CheckFunctionResult' mangled-name='_Py_CheckFunctionResult' filepath='./Include/internal/pycore_call.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckFunctionResult'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyObject_MakeTpCall' mangled-name='_PyObject_MakeTpCall' filepath='./Include/internal/pycore_call.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MakeTpCall'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-265'/> <parameter type-id='type-id-7'/> @@ -24427,12 +24470,12 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_UniversalNewlineFgetsWithSize' mangled-name='_Py_UniversalNewlineFgetsWithSize' filepath='./Include/internal/pycore_fileutils.h' line='306' 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-24'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-62'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-68'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='PyObject_GetAttr' mangled-name='PyObject_GetAttr' filepath='./Include/object.h' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAttr'> <parameter type-id='type-id-6'/> @@ -24455,79 +24498,79 @@ <return type-id='type-id-4'/> </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-61'/> + <parameter type-id='type-id-67'/> <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-4'/> - <return type-id='type-id-61'/> + <return type-id='type-id-67'/> </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-61'/> + <parameter type-id='type-id-67'/> <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-61'/> + <parameter type-id='type-id-67'/> <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-61'/> - <return type-id='type-id-184'/> + <parameter type-id='type-id-67'/> + <return type-id='type-id-188'/> </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-61'/> + <parameter type-id='type-id-67'/> <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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-24'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-750'/> + <parameter type-id='type-id-752'/> <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-750'/> + <parameter type-id='type-id-752'/> <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-750'/> + <parameter type-id='type-id-752'/> <parameter type-id='type-id-7'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyLexer_update_ftstring_expr' filepath='Parser/tokenizer/../lexer/lexer.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-750'/> - <parameter type-id='type-id-58'/> + <parameter type-id='type-id-752'/> + <parameter type-id='type-id-64'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyTokenizer_tok_new' filepath='Parser/tokenizer/../lexer/state.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-750'/> + <function-decl name='_PyTokenizer_tok_new' filepath='Parser/tokenizer/../lexer/state.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-752'/> </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-750'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-752'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-750'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-752'/> + <return type-id='type-id-24'/> </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-4'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-750'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-752'/> + <return type-id='type-id-24'/> </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-4'/> @@ -24535,32 +24578,33 @@ <return type-id='type-id-6'/> </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-1467'/> - <parameter type-id='type-id-1546'/> - <parameter type-id='type-id-1544'/> - <parameter type-id='type-id-750'/> + <parameter type-id='type-id-1468'/> + <parameter type-id='type-id-1547'/> + <parameter type-id='type-id-1545'/> + <parameter type-id='type-id-752'/> <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-4'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-750'/> - <parameter type-id='type-id-1544'/> + <parameter type-id='type-id-752'/> + <parameter type-id='type-id-1545'/> <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-750'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-752'/> + <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> - <function-type size-in-bits='64' id='type-id-1543'> - <parameter type-id='type-id-750'/> + <function-type size-in-bits='64' id='type-id-1544'> + <parameter type-id='type-id-752'/> <parameter type-id='type-id-4'/> <return type-id='type-id-5'/> </function-type> - <function-type size-in-bits='64' id='type-id-1545'> + <function-type size-in-bits='64' id='type-id-1546'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-750'/> + <parameter type-id='type-id-752'/> <return type-id='type-id-3'/> </function-type> </abi-instr> @@ -24568,13 +24612,13 @@ <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-4'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-21'/> + <return type-id='type-id-14'/> </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-270' filepath='./Include/internal/pycore_lock.h' line='134' column='1' id='type-id-1547'/> - <pointer-type-def type-id='type-id-986' size-in-bits='64' id='type-id-1548'/> - <pointer-type-def type-id='type-id-1547' size-in-bits='64' id='type-id-1549'/> + <typedef-decl name='_Py_once_fn_t' type-id='type-id-270' filepath='./Include/internal/pycore_lock.h' line='127' column='1' id='type-id-1548'/> + <pointer-type-def type-id='type-id-988' size-in-bits='64' id='type-id-1549'/> + <pointer-type-def type-id='type-id-1548' size-in-bits='64' id='type-id-1550'/> <function-decl name='Py_EnterRecursiveCall' mangled-name='Py_EnterRecursiveCall' filepath='./Include/ceval.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EnterRecursiveCall'> <parameter type-id='type-id-4'/> <return type-id='type-id-5'/> @@ -24582,16 +24626,16 @@ <function-decl name='Py_LeaveRecursiveCall' mangled-name='Py_LeaveRecursiveCall' filepath='./Include/ceval.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_LeaveRecursiveCall'> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyOnceFlag_CallOnceSlow' mangled-name='_PyOnceFlag_CallOnceSlow' filepath='./Include/internal/pycore_lock.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOnceFlag_CallOnceSlow'> - <parameter type-id='type-id-1548'/> + <function-decl name='_PyOnceFlag_CallOnceSlow' mangled-name='_PyOnceFlag_CallOnceSlow' filepath='./Include/internal/pycore_lock.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOnceFlag_CallOnceSlow'> <parameter type-id='type-id-1549'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-1550'/> + <parameter type-id='type-id-41'/> <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-6'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-184'/> + <parameter type-id='type-id-188'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyInit__ast' mangled-name='PyInit__ast' filepath='Python/Python-ast.c' line='18409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__ast'> @@ -24621,7 +24665,7 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-750'/> + <return type-id='type-id-752'/> </function-decl> <function-decl name='PyInit__tokenize' mangled-name='PyInit__tokenize' filepath='Python/Python-tokenize.c' line='442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__tokenize'> <return type-id='type-id-6'/> @@ -24641,7 +24685,7 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/_warnings.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-1259' size-in-bits='64' id='type-id-27'/> + <pointer-type-def type-id='type-id-1260' size-in-bits='64' id='type-id-33'/> <function-decl name='PyContextVar_New' mangled-name='PyContextVar_New' filepath='./Include/cpython/context.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_New'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> @@ -24654,24 +24698,24 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_GetModules' filepath='./Include/internal/pycore_import.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyImport_BlessMyLoader' filepath='./Include/internal/pycore_import.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyRecursiveMutex_Lock' mangled-name='_PyRecursiveMutex_Lock' filepath='./Include/internal/pycore_lock.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_Lock'> - <parameter type-id='type-id-27'/> + <function-decl name='_PyRecursiveMutex_Lock' mangled-name='_PyRecursiveMutex_Lock' filepath='./Include/internal/pycore_lock.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_Lock'> + <parameter type-id='type-id-33'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyRecursiveMutex_TryUnlock' filepath='./Include/internal/pycore_lock.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-27'/> + <function-decl name='_PyRecursiveMutex_TryUnlock' filepath='./Include/internal/pycore_lock.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-33'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_IsInterpreterFinalizing' mangled-name='_Py_IsInterpreterFinalizing' filepath='./Include/internal/pycore_pylifecycle.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsInterpreterFinalizing'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PySys_GetOptionalAttr' mangled-name='_PySys_GetOptionalAttr' filepath='./Include/internal/pycore_sysmodule.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetOptionalAttr'> @@ -24684,7 +24728,7 @@ <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> @@ -24695,8 +24739,8 @@ <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-31'/> - <return type-id='type-id-413'/> + <parameter type-id='type-id-37'/> + <return type-id='type-id-415'/> </function-decl> <function-decl name='PyErr_ResourceWarning' mangled-name='PyErr_ResourceWarning' filepath='Python/_warnings.c' line='1421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ResourceWarning'> <parameter type-id='type-id-6' name='source' filepath='Python/_warnings.c' line='1421' column='1'/> @@ -24705,31 +24749,31 @@ <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='1505' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicit'> - <parameter type-id='type-id-6' name='category' filepath='Python/_warnings.c' line='1505' column='1'/> - <parameter type-id='type-id-4' name='text' filepath='Python/_warnings.c' line='1505' column='1'/> - <parameter type-id='type-id-4' name='filename_str' filepath='Python/_warnings.c' line='1506' column='1'/> - <parameter type-id='type-id-5' name='lineno' filepath='Python/_warnings.c' line='1506' column='1'/> - <parameter type-id='type-id-4' name='module_str' filepath='Python/_warnings.c' line='1507' column='1'/> - <parameter type-id='type-id-6' name='registry' filepath='Python/_warnings.c' line='1507' column='1'/> + <function-decl name='PyErr_WarnExplicit' mangled-name='PyErr_WarnExplicit' filepath='Python/_warnings.c' line='1483' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicit'> + <parameter type-id='type-id-6' name='category' filepath='Python/_warnings.c' line='1483' column='1'/> + <parameter type-id='type-id-4' name='text' filepath='Python/_warnings.c' line='1483' column='1'/> + <parameter type-id='type-id-4' name='filename_str' filepath='Python/_warnings.c' line='1484' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/_warnings.c' line='1484' column='1'/> + <parameter type-id='type-id-4' name='module_str' filepath='Python/_warnings.c' line='1485' column='1'/> + <parameter type-id='type-id-6' name='registry' filepath='Python/_warnings.c' line='1485' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyErr_WarnExplicitFormat' mangled-name='PyErr_WarnExplicitFormat' filepath='Python/_warnings.c' line='1537' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicitFormat'> - <parameter type-id='type-id-6' name='category' filepath='Python/_warnings.c' line='1537' column='1'/> - <parameter type-id='type-id-4' name='filename_str' filepath='Python/_warnings.c' line='1538' column='1'/> - <parameter type-id='type-id-5' name='lineno' filepath='Python/_warnings.c' line='1538' column='1'/> - <parameter type-id='type-id-4' name='module_str' filepath='Python/_warnings.c' line='1539' column='1'/> - <parameter type-id='type-id-6' name='registry' filepath='Python/_warnings.c' line='1539' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/_warnings.c' line='1540' column='1'/> + <function-decl name='PyErr_WarnExplicitFormat' mangled-name='PyErr_WarnExplicitFormat' filepath='Python/_warnings.c' line='1515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicitFormat'> + <parameter type-id='type-id-6' name='category' filepath='Python/_warnings.c' line='1515' column='1'/> + <parameter type-id='type-id-4' name='filename_str' filepath='Python/_warnings.c' line='1516' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/_warnings.c' line='1516' column='1'/> + <parameter type-id='type-id-4' name='module_str' filepath='Python/_warnings.c' line='1517' column='1'/> + <parameter type-id='type-id-6' name='registry' filepath='Python/_warnings.c' line='1517' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/_warnings.c' line='1518' 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='1703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWarnings_Init'> + <function-decl name='_PyWarnings_Init' mangled-name='_PyWarnings_Init' filepath='Python/_warnings.c' line='1681' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWarnings_Init'> <return type-id='type-id-6'/> </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='210' column='1' id='type-id-1550'> + <class-decl name='_PyCodeConstructor' size-in-bits='896' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='210' column='1' id='type-id-1551'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='filename' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='212' column='1'/> </data-member> @@ -24779,7 +24823,7 @@ <var-decl name='exceptiontable' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='240' column='1'/> </data-member> </class-decl> - <class-decl name='_PyExceptHandlerInfo' size-in-bits='96' is-struct='yes' naming-typedef-id='type-id-1551' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='15' column='1' id='type-id-1552'> + <class-decl name='_PyExceptHandlerInfo' size-in-bits='96' is-struct='yes' naming-typedef-id='type-id-1552' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='15' column='1' id='type-id-1553'> <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> @@ -24790,8 +24834,8 @@ <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-1552' filepath='./Include/internal/pycore_instruction_sequence.h' line='19' column='1' id='type-id-1551'/> - <class-decl name='_PyInstruction' size-in-bits='352' is-struct='yes' naming-typedef-id='type-id-1553' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='21' column='1' id='type-id-1554'> + <typedef-decl name='_PyExceptHandlerInfo' type-id='type-id-1553' filepath='./Include/internal/pycore_instruction_sequence.h' line='19' column='1' id='type-id-1552'/> + <class-decl name='_PyInstruction' size-in-bits='352' is-struct='yes' naming-typedef-id='type-id-1554' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='21' column='1' id='type-id-1555'> <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> @@ -24799,10 +24843,10 @@ <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-1555' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='24' column='1'/> + <var-decl name='i_loc' type-id='type-id-1556' 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-1551' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='25' column='1'/> + <var-decl name='i_except_handler_info' type-id='type-id-1552' 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'/> @@ -24811,13 +24855,13 @@ <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-1554' filepath='./Include/internal/pycore_instruction_sequence.h' line='30' column='1' id='type-id-1553'/> - <class-decl name='instruction_sequence' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='32' column='1' id='type-id-1556'> + <typedef-decl name='_PyInstruction' type-id='type-id-1555' filepath='./Include/internal/pycore_instruction_sequence.h' line='30' column='1' id='type-id-1554'/> + <class-decl name='instruction_sequence' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='32' column='1' id='type-id-1557'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='33' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-1557' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='34' column='1'/> + <var-decl name='s_instrs' type-id='type-id-1558' 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'/> @@ -24829,7 +24873,7 @@ <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'/> + <var-decl name='s_labelmap' type-id='type-id-183' 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'/> @@ -24838,11 +24882,11 @@ <var-decl name='s_nested' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='47' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='s_annotations_code' type-id='type-id-1558' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='50' column='1'/> + <var-decl name='s_annotations_code' type-id='type-id-1559' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='50' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyInstructionSequence' type-id='type-id-1556' filepath='./Include/internal/pycore_instruction_sequence.h' line='51' column='1' id='type-id-1559'/> - <class-decl name='_Py_SourceLocation' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1555' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='46' column='1' id='type-id-1560'> + <typedef-decl name='_PyInstructionSequence' type-id='type-id-1557' filepath='./Include/internal/pycore_instruction_sequence.h' line='51' column='1' id='type-id-1560'/> + <class-decl name='_Py_SourceLocation' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1556' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='46' column='1' id='type-id-1561'> <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='47' column='1'/> </data-member> @@ -24856,70 +24900,70 @@ <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='50' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_SourceLocation' type-id='type-id-1560' filepath='./Include/internal/pycore_symtable.h' line='51' column='1' id='type-id-1555'/> - <pointer-type-def type-id='type-id-1550' size-in-bits='64' id='type-id-1561'/> - <pointer-type-def type-id='type-id-1553' size-in-bits='64' id='type-id-1557'/> - <pointer-type-def type-id='type-id-1559' size-in-bits='64' id='type-id-1562'/> - <pointer-type-def type-id='type-id-1556' size-in-bits='64' id='type-id-1558'/> + <typedef-decl name='_Py_SourceLocation' type-id='type-id-1561' filepath='./Include/internal/pycore_symtable.h' line='51' column='1' id='type-id-1556'/> + <pointer-type-def type-id='type-id-1551' size-in-bits='64' id='type-id-1562'/> + <pointer-type-def type-id='type-id-1554' size-in-bits='64' id='type-id-1558'/> + <pointer-type-def type-id='type-id-1560' size-in-bits='64' id='type-id-1563'/> + <pointer-type-def type-id='type-id-1557' size-in-bits='64' id='type-id-1559'/> <function-decl name='_PyCode_Validate' filepath='./Include/internal/pycore_code.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1561'/> + <parameter type-id='type-id-1562'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCode_New' filepath='./Include/internal/pycore_code.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1561'/> - <return type-id='type-id-345'/> + <parameter type-id='type-id-1562'/> + <return type-id='type-id-347'/> </function-decl> - <function-decl name='_PyCompile_ConstCacheMergeOne' filepath='./Include/internal/pycore_compile.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyCompile_ConstCacheMergeOne' filepath='./Include/internal/pycore_compile.h' line='197' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInstructionSequence_ApplyLabelMap' filepath='./Include/internal/pycore_instruction_sequence.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_set_localsplus_info' filepath='Python/assemble.c' line='480' 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-95'/> + <parameter type-id='type-id-101'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/ast_preprocess.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_Py_c_array_t' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1563' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='15' column='1' id='type-id-1564'> + <class-decl name='_Py_c_array_t' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1564' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='15' column='1' id='type-id-1565'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='array' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='16' column='1'/> + <var-decl name='array' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='16' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='allocated_entries' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='17' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='item_size' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='18' column='1'/> + <var-decl name='item_size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='18' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> <var-decl name='initial_num_entries' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_c_array.h' line='19' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_c_array_t' type-id='type-id-1564' filepath='./Include/internal/pycore_c_array.h' line='20' column='1' id='type-id-1563'/> - <pointer-type-def type-id='type-id-1563' size-in-bits='64' id='type-id-1565'/> + <typedef-decl name='_Py_c_array_t' type-id='type-id-1565' filepath='./Include/internal/pycore_c_array.h' line='20' column='1' id='type-id-1564'/> + <pointer-type-def type-id='type-id-1564' size-in-bits='64' id='type-id-1566'/> <function-decl name='_PyAST_GetDocString' filepath='./Include/internal/pycore_ast.h' line='940' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-679'/> + <parameter type-id='type-id-681'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_Py_CArray_Init' filepath='./Include/internal/pycore_c_array.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1565'/> + <parameter type-id='type-id-1566'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_CArray_Fini' filepath='./Include/internal/pycore_c_array.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1565'/> + <parameter type-id='type-id-1566'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_CArray_EnsureCapacity' filepath='./Include/internal/pycore_c_array.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1565'/> + <parameter type-id='type-id-1566'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> @@ -24933,17 +24977,8 @@ <return type-id='type-id-5'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='Python/ast_unparse.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <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-743'/> - </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-743'/> - <return type-id='type-id-3'/> - </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-870' size-in-bits='64' id='type-id-1566'/> + <pointer-type-def type-id='type-id-872' size-in-bits='64' id='type-id-1567'/> <var-decl name='PyFilter_Type' type-id='type-id-271' 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-271' 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-271' mangled-name='PyZip_Type' visibility='default' filepath='./Include/bltinmodule.h' line='9' column='1' elf-symbol-id='PyZip_Type'/> @@ -24968,7 +25003,7 @@ <return type-id='type-id-6'/> </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'/> + <parameter type-id='type-id-213'/> <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'> @@ -24976,14 +25011,14 @@ <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-213'/> <return type-id='type-id-6'/> </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-4'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-decl> @@ -24996,43 +25031,43 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyAST_mod2obj' filepath='./Include/internal/pycore_ast.h' line='927' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-647'/> + <parameter type-id='type-id-649'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyAST_obj2mod' filepath='./Include/internal/pycore_ast.h' line='929' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-743'/> + <parameter type-id='type-id-745'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-647'/> + <return type-id='type-id-649'/> </function-decl> <function-decl name='PyAST_Check' filepath='./Include/internal/pycore_ast.h' line='930' 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='_PyAST_Validate' filepath='./Include/internal/pycore_ast.h' line='932' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-647'/> + <parameter type-id='type-id-649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_EnsureBuiltins' filepath='./Include/internal/pycore_ceval.h' line='243' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyEval_EnsureBuiltins' filepath='./Include/internal/pycore_ceval.h' line='245' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyAST_Compile' mangled-name='_PyAST_Compile' filepath='./Include/internal/pycore_compile.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyAST_Compile'> - <parameter type-id='type-id-646'/> + <parameter type-id='type-id-648'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1566'/> - <return type-id='type-id-345'/> + <parameter type-id='type-id-1567'/> + <return type-id='type-id-347'/> </function-decl> <function-decl name='_PyCompile_AstPreprocess' filepath='./Include/internal/pycore_compile.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-646'/> + <parameter type-id='type-id-648'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1566'/> + <parameter type-id='type-id-1567'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> @@ -25041,7 +25076,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyModule_CreateInitialized' filepath='./Include/internal/pycore_modsupport.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-473'/> + <parameter type-id='type-id-475'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-decl> @@ -25049,7 +25084,7 @@ <parameter type-id='type-id-265'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-276'/> + <parameter type-id='type-id-278'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> @@ -25058,11 +25093,18 @@ <parameter type-id='type-id-6'/> <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-745'/> + </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-745'/> + <return type-id='type-id-3'/> + </function-decl> <function-decl name='_Py_SourceAsString' filepath='./Include/internal/pycore_pythonrun.h' line='29' 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-4'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <parameter type-id='type-id-241'/> <return type-id='type-id-4'/> </function-decl> @@ -25074,7 +25116,7 @@ <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyAnextAwaitable_New' filepath='Python/bltinmodule.c' line='1845' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='PyAnextAwaitable_New' filepath='Python/bltinmodule.c' line='1850' 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-6'/> @@ -25083,7 +25125,7 @@ <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='90' 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-64'/> + <parameter type-id='type-id-70'/> <return type-id='type-id-5'/> </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'> @@ -25098,8 +25140,8 @@ </function-decl> <function-decl name='_Py_read' filepath='./Include/internal/pycore_fileutils.h' line='118' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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'> @@ -25108,91 +25150,83 @@ </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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-35'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-105'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-111'/> + <return type-id='type-id-189'/> </function-decl> <function-decl name='_PyOS_URandomNonblock' mangled-name='_PyOS_URandomNonblock' filepath='Python/bootstrap_hash.c' line='546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_URandomNonblock'> - <parameter type-id='type-id-35' name='buffer' filepath='Python/bootstrap_hash.c' line='546' column='1'/> + <parameter type-id='type-id-41' name='buffer' filepath='Python/bootstrap_hash.c' line='546' column='1'/> <parameter type-id='type-id-7' name='size' filepath='Python/bootstrap_hash.c' line='546' 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-58' size-in-bits='448' id='type-id-1567'> - <subrange length='56' type-id='type-id-2' id='type-id-1568'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='448' id='type-id-1568'> + <subrange length='56' type-id='type-id-2' id='type-id-1569'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1569' size-in-bits='768' id='type-id-1570'> + <array-type-def dimensions='1' type-id='type-id-1570' size-in-bits='768' id='type-id-1571'> <subrange length='4' type-id='type-id-2' id='type-id-228'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1569' size-in-bits='infinite' id='type-id-1571'> + <array-type-def dimensions='1' type-id='type-id-1570' size-in-bits='infinite' id='type-id-1572'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1572' size-in-bits='1728' id='type-id-1573'> - <subrange length='27' type-id='type-id-2' id='type-id-1574'/> + <array-type-def dimensions='1' type-id='type-id-1573' size-in-bits='1728' id='type-id-1574'> + <subrange length='27' type-id='type-id-2' id='type-id-1575'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1572' size-in-bits='infinite' id='type-id-1575'> + <array-type-def dimensions='1' type-id='type-id-1573' size-in-bits='infinite' id='type-id-1576'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1576' size-in-bits='256' id='type-id-1577'> + <array-type-def dimensions='1' type-id='type-id-1577' size-in-bits='256' id='type-id-1578'> <subrange length='4' type-id='type-id-2' id='type-id-228'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1576' size-in-bits='infinite' id='type-id-1578'> + <array-type-def dimensions='1' type-id='type-id-1577' size-in-bits='infinite' id='type-id-1579'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1579' size-in-bits='1088' id='type-id-1580'> - <subrange length='17' type-id='type-id-2' id='type-id-920'/> + <array-type-def dimensions='1' type-id='type-id-1580' size-in-bits='1088' id='type-id-1581'> + <subrange length='17' type-id='type-id-2' id='type-id-922'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1579' size-in-bits='infinite' id='type-id-1581'> + <array-type-def dimensions='1' type-id='type-id-1580' size-in-bits='infinite' id='type-id-1582'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <typedef-decl name='conversion_func' type-id='type-id-1390' filepath='./Include/internal/pycore_ceval.h' line='260' column='1' id='type-id-1582'/> - <class-decl name='_special_method' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='265' column='1' id='type-id-1583'> + <typedef-decl name='conversion_func' type-id='type-id-1391' filepath='./Include/internal/pycore_ceval.h' line='262' column='1' id='type-id-1583'/> + <class-decl name='_special_method' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='267' column='1' id='type-id-1584'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='266' column='1'/> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='268' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='error' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='267' column='1'/> + <var-decl name='error' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='269' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='error_suggestion' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='268' column='1'/> + <var-decl name='error_suggestion' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='270' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_SpecialMethod' type-id='type-id-1583' filepath='./Include/internal/pycore_ceval.h' line='269' column='1' id='type-id-1584'/> - <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-32'/> - <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-1585'> + <typedef-decl name='_Py_SpecialMethod' type-id='type-id-1584' filepath='./Include/internal/pycore_ceval.h' line='271' column='1' id='type-id-1585'/> + <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-38'/> + <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-1586'> <data-member access='public'> - <var-decl name='__size' type-id='type-id-1567' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/> + <var-decl name='__size' type-id='type-id-1568' 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-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/> + <var-decl name='__align' type-id='type-id-188' 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-1585' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-1586'/> - <qualified-type-def type-id='type-id-1584' const='yes' id='type-id-1569'/> - <qualified-type-def type-id='type-id-991' const='yes' id='type-id-1572'/> - <qualified-type-def type-id='type-id-1582' const='yes' id='type-id-1576'/> - <qualified-type-def type-id='type-id-1586' const='yes' id='type-id-1587'/> - <pointer-type-def type-id='type-id-1587' size-in-bits='64' id='type-id-1588'/> - <qualified-type-def type-id='type-id-1588' restrict='yes' id='type-id-1589'/> - <qualified-type-def type-id='type-id-21' const='yes' id='type-id-1579'/> - <pointer-type-def type-id='type-id-1586' size-in-bits='64' id='type-id-1590'/> - <qualified-type-def type-id='type-id-62' restrict='yes' id='type-id-1591'/> - <qualified-type-def type-id='type-id-267' restrict='yes' id='type-id-1592'/> - <function-decl name='PyInterpreterState_ThreadHead' mangled-name='PyInterpreterState_ThreadHead' filepath='./Include/cpython/pystate.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_ThreadHead'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-31'/> - </function-decl> - <function-decl name='PyThreadState_Next' mangled-name='PyThreadState_Next' filepath='./Include/cpython/pystate.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Next'> - <parameter type-id='type-id-31'/> - <return type-id='type-id-31'/> - </function-decl> + <typedef-decl name='pthread_attr_t' type-id='type-id-1586' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-1587'/> + <qualified-type-def type-id='type-id-1585' const='yes' id='type-id-1570'/> + <qualified-type-def type-id='type-id-993' const='yes' id='type-id-1573'/> + <qualified-type-def type-id='type-id-1583' const='yes' id='type-id-1577'/> + <qualified-type-def type-id='type-id-1587' const='yes' id='type-id-1588'/> + <pointer-type-def type-id='type-id-1588' size-in-bits='64' id='type-id-1589'/> + <qualified-type-def type-id='type-id-1589' restrict='yes' id='type-id-1590'/> + <qualified-type-def type-id='type-id-14' const='yes' id='type-id-1580'/> + <pointer-type-def type-id='type-id-1587' size-in-bits='64' id='type-id-1591'/> + <qualified-type-def type-id='type-id-68' restrict='yes' id='type-id-1592'/> + <qualified-type-def type-id='type-id-267' restrict='yes' id='type-id-1593'/> <function-decl name='PyImport_ImportModuleLevel' mangled-name='PyImport_ImportModuleLevel' filepath='./Include/import.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleLevel'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> @@ -25212,14 +25246,14 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PySys_Audit' filepath='./Include/internal/pycore_audit.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyStack_UnpackDict' filepath='./Include/internal/pycore_call.h' line='190' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-265'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-6'/> @@ -25232,194 +25266,206 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyEval_SetProfile' mangled-name='_PyEval_SetProfile' filepath='./Include/internal/pycore_ceval.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SetProfile'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-1041'/> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-1043'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_SetTrace' filepath='./Include/internal/pycore_ceval.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-1041'/> + <function-decl name='_PyEval_SetProfileAllThreads' filepath='./Include/internal/pycore_ceval.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-1043'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_HandlePending' mangled-name='_Py_HandlePending' filepath='./Include/internal/pycore_ceval.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HandlePending'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyEval_SetTrace' filepath='./Include/internal/pycore_ceval.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-1043'/> + <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <var-decl name='_PyEval_BinaryOps' type-id='type-id-1575' mangled-name='_PyEval_BinaryOps' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='262' column='1' elf-symbol-id='_PyEval_BinaryOps'/> - <var-decl name='_PyEval_ConversionFuncs' type-id='type-id-1578' mangled-name='_PyEval_ConversionFuncs' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='263' column='1' elf-symbol-id='_PyEval_ConversionFuncs'/> - <var-decl name='_Py_SpecialMethods' type-id='type-id-1571' mangled-name='_Py_SpecialMethods' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='271' column='1' elf-symbol-id='_Py_SpecialMethods'/> - <var-decl name='_Py_FunctionAttributeOffsets' type-id='type-id-1581' mangled-name='_Py_FunctionAttributeOffsets' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='272' column='1' elf-symbol-id='_Py_FunctionAttributeOffsets'/> - <function-decl name='_PyFloat_FromDouble_ConsumeInputs' filepath='./Include/internal/pycore_ceval.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-172'/> - <return type-id='type-id-433'/> + <function-decl name='_PyEval_SetTraceAllThreads' filepath='./Include/internal/pycore_ceval.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-1043'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_Specialize_LoadSuperAttr' filepath='./Include/internal/pycore_code.h' line='296' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_HandlePending' mangled-name='_Py_HandlePending' filepath='./Include/internal/pycore_ceval.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HandlePending'> + <parameter type-id='type-id-37'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyEval_BinaryOps' type-id='type-id-1576' mangled-name='_PyEval_BinaryOps' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='264' column='1' elf-symbol-id='_PyEval_BinaryOps'/> + <var-decl name='_PyEval_ConversionFuncs' type-id='type-id-1579' mangled-name='_PyEval_ConversionFuncs' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='265' column='1' elf-symbol-id='_PyEval_ConversionFuncs'/> + <var-decl name='_Py_SpecialMethods' type-id='type-id-1572' mangled-name='_Py_SpecialMethods' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='273' column='1' elf-symbol-id='_Py_SpecialMethods'/> + <var-decl name='_Py_FunctionAttributeOffsets' type-id='type-id-1582' mangled-name='_Py_FunctionAttributeOffsets' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='274' column='1' elf-symbol-id='_Py_FunctionAttributeOffsets'/> + <function-decl name='_PyFloat_FromDouble_ConsumeInputs' filepath='./Include/internal/pycore_ceval.h' line='349' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-435'/> + </function-decl> + <function-decl name='_Py_Specialize_LoadSuperAttr' filepath='./Include/internal/pycore_code.h' line='303' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <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='298' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_LoadAttr' filepath='./Include/internal/pycore_code.h' line='305' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_StoreAttr' filepath='./Include/internal/pycore_code.h' line='300' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_StoreAttr' filepath='./Include/internal/pycore_code.h' line='307' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_LoadGlobal' filepath='./Include/internal/pycore_code.h' line='302' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_Py_Specialize_LoadGlobal' filepath='./Include/internal/pycore_code.h' line='309' 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-363'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_StoreSubscr' filepath='./Include/internal/pycore_code.h' line='304' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_StoreSubscr' filepath='./Include/internal/pycore_code.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_Call' filepath='./Include/internal/pycore_code.h' line='306' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_Call' filepath='./Include/internal/pycore_code.h' line='313' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-5'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_CallKw' filepath='./Include/internal/pycore_code.h' line='308' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_CallKw' filepath='./Include/internal/pycore_code.h' line='315' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <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='310' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_BinaryOp' filepath='./Include/internal/pycore_code.h' line='317' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-395'/> + <parameter type-id='type-id-397'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_CompareOp' filepath='./Include/internal/pycore_code.h' line='312' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_CompareOp' filepath='./Include/internal/pycore_code.h' line='319' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <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='314' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_UnpackSequence' filepath='./Include/internal/pycore_code.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <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='316' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_ForIter' filepath='./Include/internal/pycore_code.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <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='317' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_Send' filepath='./Include/internal/pycore_code.h' line='324' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_ToBool' filepath='./Include/internal/pycore_code.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_ToBool' filepath='./Include/internal/pycore_code.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Specialize_ContainsOp' filepath='./Include/internal/pycore_code.h' line='319' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-433'/> - <parameter type-id='type-id-363'/> + <function-decl name='_Py_Specialize_ContainsOp' filepath='./Include/internal/pycore_code.h' line='326' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-435'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_Instrument' filepath='./Include/internal/pycore_code.h' line='512' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> - <parameter type-id='type-id-33'/> + <function-decl name='_Py_Instrument' filepath='./Include/internal/pycore_code.h' line='519' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-347'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_IsDefaultImportFunc' filepath='./Include/internal/pycore_import.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_call_instrumentation' filepath='./Include/internal/pycore_instruments.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_call_instrumentation_line' filepath='./Include/internal/pycore_instruments.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_call_instrumentation_instruction' filepath='./Include/internal/pycore_instruments.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_call_instrumentation_jump' filepath='./Include/internal/pycore_instruments.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-363'/> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-365'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> - <parameter type-id='type-id-363'/> - <return type-id='type-id-363'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> + <parameter type-id='type-id-365'/> + <return type-id='type-id-365'/> </function-decl> <function-decl name='_Py_call_instrumentation_arg' filepath='./Include/internal/pycore_instruments.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_call_instrumentation_2args' filepath='./Include/internal/pycore_instruments.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_call_instrumentation_exc2' filepath='./Include/internal/pycore_instruments.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-363'/> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-365'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyFrame_GetLocals' filepath='./Include/internal/pycore_interpframe.h' line='267' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-428'/> + <function-decl name='_PyFrame_GetLocals' filepath='./Include/internal/pycore_interpframe.h' line='322' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-430'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyThreadState_PushFrame' filepath='./Include/internal/pycore_interpframe.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-428'/> + <function-decl name='_PyThreadState_PushFrame' filepath='./Include/internal/pycore_interpframe.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-430'/> </function-decl> - <function-decl name='_PyThreadState_PopFrame' mangled-name='_PyThreadState_PopFrame' filepath='./Include/internal/pycore_interpframe.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_PopFrame'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-428'/> + <function-decl name='_PyThreadState_PopFrame' mangled-name='_PyThreadState_PopFrame' filepath='./Include/internal/pycore_interpframe.h' line='339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_PopFrame'> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-430'/> <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'> @@ -25436,7 +25482,7 @@ <return type-id='type-id-5'/> </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-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-242'/> </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'> @@ -25447,7 +25493,7 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyErr_SetObject' filepath='./Include/internal/pycore_pyerrors.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> @@ -25463,11 +25509,11 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyInterpreterState_IsRunningMain' mangled-name='_PyInterpreterState_IsRunningMain' filepath='./Include/internal/pycore_pystate.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IsRunningMain'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_GetMainModule' filepath='./Include/internal/pycore_pystate.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_Py_CheckMainModule' filepath='./Include/internal/pycore_pystate.h' line='289' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -25481,7 +25527,7 @@ </function-decl> <function-decl name='_PyTraceBack_FromFrame' filepath='./Include/internal/pycore_traceback.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-413'/> + <parameter type-id='type-id-415'/> <return type-id='type-id-6'/> </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'> @@ -25489,30 +25535,30 @@ <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-413'/> + <parameter type-id='type-id-415'/> <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-32'/> + <return type-id='type-id-38'/> </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-1590'/> + <parameter type-id='type-id-1591'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='pthread_attr_getguardsize' filepath='/usr/include/pthread.h' line='303' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1588'/> - <parameter type-id='type-id-62'/> + <parameter type-id='type-id-1589'/> + <parameter type-id='type-id-68'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='pthread_attr_getstack' filepath='/usr/include/pthread.h' line='379' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1589'/> + <parameter type-id='type-id-1590'/> + <parameter type-id='type-id-1593'/> <parameter type-id='type-id-1592'/> - <parameter type-id='type-id-1591'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='pthread_getattr_np' filepath='/usr/include/pthread.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-32'/> - <parameter type-id='type-id-1590'/> + <function-decl name='pthread_getattr_np' filepath='/usr/include/pthread.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-38'/> + <parameter type-id='type-id-1591'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='Py_GetRecursionLimit' mangled-name='Py_GetRecursionLimit' filepath='Python/ceval.c' line='310' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetRecursionLimit'> @@ -25522,315 +25568,325 @@ <parameter type-id='type-id-5' name='new_limit' filepath='Python/ceval.c' line='317' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_InitializeRecursionLimits' mangled-name='_Py_InitializeRecursionLimits' filepath='Python/ceval.c' line='429' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_InitializeRecursionLimits'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='429' column='1'/> + <function-decl name='_Py_InitializeRecursionLimits' mangled-name='_Py_InitializeRecursionLimits' filepath='Python/ceval.c' line='498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_InitializeRecursionLimits'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='498' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnstable_ThreadState_SetStackProtection' mangled-name='PyUnstable_ThreadState_SetStackProtection' filepath='Python/ceval.c' line='512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_ThreadState_SetStackProtection'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='512' column='1'/> + <parameter type-id='type-id-41' name='stack_start_addr' filepath='Python/ceval.c' line='513' column='1'/> + <parameter type-id='type-id-14' name='stack_size' filepath='Python/ceval.c' line='513' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_ThreadState_ResetStackProtection' mangled-name='PyUnstable_ThreadState_ResetStackProtection' filepath='Python/ceval.c' line='530' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_ThreadState_ResetStackProtection'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='530' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_MatchKeys' mangled-name='_PyEval_MatchKeys' filepath='Python/ceval.c' line='606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MatchKeys'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='606' column='1'/> - <parameter type-id='type-id-6' name='map' filepath='Python/ceval.c' line='606' column='1'/> - <parameter type-id='type-id-6' name='keys' filepath='Python/ceval.c' line='606' column='1'/> + <function-decl name='_PyEval_MatchKeys' mangled-name='_PyEval_MatchKeys' filepath='Python/ceval.c' line='677' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MatchKeys'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='677' column='1'/> + <parameter type-id='type-id-6' name='map' filepath='Python/ceval.c' line='677' column='1'/> + <parameter type-id='type-id-6' name='keys' filepath='Python/ceval.c' line='677' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_MatchClass' mangled-name='_PyEval_MatchClass' filepath='Python/ceval.c' line='710' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MatchClass'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='710' column='1'/> - <parameter type-id='type-id-6' name='subject' filepath='Python/ceval.c' line='710' column='1'/> - <parameter type-id='type-id-6' name='type' filepath='Python/ceval.c' line='710' column='1'/> - <parameter type-id='type-id-7' name='nargs' filepath='Python/ceval.c' line='711' column='1'/> - <parameter type-id='type-id-6' name='kwargs' filepath='Python/ceval.c' line='711' column='1'/> + <function-decl name='_PyEval_MatchClass' mangled-name='_PyEval_MatchClass' filepath='Python/ceval.c' line='781' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MatchClass'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='781' column='1'/> + <parameter type-id='type-id-6' name='subject' filepath='Python/ceval.c' line='781' column='1'/> + <parameter type-id='type-id-6' name='type' filepath='Python/ceval.c' line='781' column='1'/> + <parameter type-id='type-id-7' name='nargs' filepath='Python/ceval.c' line='782' column='1'/> + <parameter type-id='type-id-6' name='kwargs' filepath='Python/ceval.c' line='782' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyEval_EvalFrame' mangled-name='PyEval_EvalFrame' filepath='Python/ceval.c' line='862' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrame'> - <parameter type-id='type-id-413' name='f' filepath='Python/ceval.c' line='862' column='1'/> + <function-decl name='PyEval_EvalFrame' mangled-name='PyEval_EvalFrame' filepath='Python/ceval.c' line='933' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrame'> + <parameter type-id='type-id-415' name='f' filepath='Python/ceval.c' line='933' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyEval_EvalFrameEx' mangled-name='PyEval_EvalFrameEx' filepath='Python/ceval.c' line='870' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrameEx'> - <parameter type-id='type-id-413' name='f' filepath='Python/ceval.c' line='870' column='1'/> - <parameter type-id='type-id-5' name='throwflag' filepath='Python/ceval.c' line='870' column='1'/> + <function-decl name='PyEval_EvalFrameEx' mangled-name='PyEval_EvalFrameEx' filepath='Python/ceval.c' line='941' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrameEx'> + <parameter type-id='type-id-415' name='f' filepath='Python/ceval.c' line='941' column='1'/> + <parameter type-id='type-id-5' name='throwflag' filepath='Python/ceval.c' line='941' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyObjectArray_FromStackRefArray' mangled-name='_PyObjectArray_FromStackRefArray' filepath='Python/ceval.c' line='928' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObjectArray_FromStackRefArray'> - <parameter type-id='type-id-395' name='input' filepath='Python/ceval.c' line='928' column='1'/> - <parameter type-id='type-id-7' name='nargs' filepath='Python/ceval.c' line='928' column='1'/> - <parameter type-id='type-id-241' name='scratch' filepath='Python/ceval.c' line='928' column='1'/> + <function-decl name='_PyObjectArray_FromStackRefArray' mangled-name='_PyObjectArray_FromStackRefArray' filepath='Python/ceval.c' line='999' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObjectArray_FromStackRefArray'> + <parameter type-id='type-id-397' name='input' filepath='Python/ceval.c' line='999' column='1'/> + <parameter type-id='type-id-7' name='nargs' filepath='Python/ceval.c' line='999' column='1'/> + <parameter type-id='type-id-241' name='scratch' filepath='Python/ceval.c' line='999' column='1'/> <return type-id='type-id-241'/> </function-decl> - <function-decl name='_PyObjectArray_Free' mangled-name='_PyObjectArray_Free' filepath='Python/ceval.c' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObjectArray_Free'> - <parameter type-id='type-id-241' name='array' filepath='Python/ceval.c' line='949' column='1'/> - <parameter type-id='type-id-241' name='scratch' filepath='Python/ceval.c' line='949' column='1'/> + <function-decl name='_PyObjectArray_Free' mangled-name='_PyObjectArray_Free' filepath='Python/ceval.c' line='1020' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObjectArray_Free'> + <parameter type-id='type-id-241' name='array' filepath='Python/ceval.c' line='1020' column='1'/> + <parameter type-id='type-id-241' name='scratch' filepath='Python/ceval.c' line='1020' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_FrameClearAndPop' mangled-name='_PyEval_FrameClearAndPop' filepath='Python/ceval.c' line='1807' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FrameClearAndPop'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='1807' column='1'/> - <parameter type-id='type-id-428' name='frame' filepath='Python/ceval.c' line='1807' column='1'/> + <function-decl name='_PyEval_FrameClearAndPop' mangled-name='_PyEval_FrameClearAndPop' filepath='Python/ceval.c' line='1878' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FrameClearAndPop'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='1878' column='1'/> + <parameter type-id='type-id-430' name='frame' filepath='Python/ceval.c' line='1878' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEvalFramePushAndInit' mangled-name='_PyEvalFramePushAndInit' filepath='Python/ceval.c' line='1819' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvalFramePushAndInit'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='1819' column='1'/> - <parameter type-id='type-id-433' name='func' filepath='Python/ceval.c' line='1819' column='1'/> - <parameter type-id='type-id-6' name='locals' filepath='Python/ceval.c' line='1820' column='1'/> - <parameter type-id='type-id-437' name='args' filepath='Python/ceval.c' line='1820' column='1'/> - <parameter type-id='type-id-21' name='argcount' filepath='Python/ceval.c' line='1821' column='1'/> - <parameter type-id='type-id-6' name='kwnames' filepath='Python/ceval.c' line='1821' column='1'/> - <parameter type-id='type-id-428' name='previous' filepath='Python/ceval.c' line='1821' column='1'/> - <return type-id='type-id-428'/> + <function-decl name='_PyEvalFramePushAndInit' mangled-name='_PyEvalFramePushAndInit' filepath='Python/ceval.c' line='1890' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvalFramePushAndInit'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='1890' column='1'/> + <parameter type-id='type-id-435' name='func' filepath='Python/ceval.c' line='1890' column='1'/> + <parameter type-id='type-id-6' name='locals' filepath='Python/ceval.c' line='1891' column='1'/> + <parameter type-id='type-id-439' name='args' filepath='Python/ceval.c' line='1891' column='1'/> + <parameter type-id='type-id-14' name='argcount' filepath='Python/ceval.c' line='1892' column='1'/> + <parameter type-id='type-id-6' name='kwnames' filepath='Python/ceval.c' line='1892' column='1'/> + <parameter type-id='type-id-430' name='previous' filepath='Python/ceval.c' line='1892' column='1'/> + <return type-id='type-id-430'/> </function-decl> - <function-decl name='_PyEval_ExceptionGroupMatch' mangled-name='_PyEval_ExceptionGroupMatch' filepath='Python/ceval.c' line='2145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ExceptionGroupMatch'> - <parameter type-id='type-id-428' name='frame' filepath='Python/ceval.c' line='2145' column='1'/> - <parameter type-id='type-id-6' name='exc_value' filepath='Python/ceval.c' line='2145' column='1'/> - <parameter type-id='type-id-6' name='match_type' filepath='Python/ceval.c' line='2146' column='1'/> - <parameter type-id='type-id-241' name='match' filepath='Python/ceval.c' line='2146' column='1'/> - <parameter type-id='type-id-241' name='rest' filepath='Python/ceval.c' line='2146' column='1'/> + <function-decl name='_PyEval_ExceptionGroupMatch' mangled-name='_PyEval_ExceptionGroupMatch' filepath='Python/ceval.c' line='2217' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ExceptionGroupMatch'> + <parameter type-id='type-id-430' name='frame' filepath='Python/ceval.c' line='2217' column='1'/> + <parameter type-id='type-id-6' name='exc_value' filepath='Python/ceval.c' line='2217' column='1'/> + <parameter type-id='type-id-6' name='match_type' filepath='Python/ceval.c' line='2218' column='1'/> + <parameter type-id='type-id-241' name='match' filepath='Python/ceval.c' line='2218' column='1'/> + <parameter type-id='type-id-241' name='rest' filepath='Python/ceval.c' line='2218' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_UnpackIterableStackRef' mangled-name='_PyEval_UnpackIterableStackRef' filepath='Python/ceval.c' line='2234' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_UnpackIterableStackRef'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='2234' column='1'/> - <parameter type-id='type-id-6' name='v' filepath='Python/ceval.c' line='2234' column='1'/> - <parameter type-id='type-id-5' name='argcnt' filepath='Python/ceval.c' line='2235' column='1'/> - <parameter type-id='type-id-5' name='argcntafter' filepath='Python/ceval.c' line='2235' column='1'/> - <parameter type-id='type-id-395' name='sp' filepath='Python/ceval.c' line='2235' column='1'/> + <function-decl name='_PyEval_UnpackIterableStackRef' mangled-name='_PyEval_UnpackIterableStackRef' filepath='Python/ceval.c' line='2306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_UnpackIterableStackRef'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='2306' column='1'/> + <parameter type-id='type-id-6' name='v' filepath='Python/ceval.c' line='2306' column='1'/> + <parameter type-id='type-id-5' name='argcnt' filepath='Python/ceval.c' line='2307' column='1'/> + <parameter type-id='type-id-5' name='argcntafter' filepath='Python/ceval.c' line='2307' column='1'/> + <parameter type-id='type-id-397' name='sp' filepath='Python/ceval.c' line='2307' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_MonitorRaise' mangled-name='_PyEval_MonitorRaise' filepath='Python/ceval.c' line='2378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MonitorRaise'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='2378' column='1'/> - <parameter type-id='type-id-428' name='frame' filepath='Python/ceval.c' line='2378' column='1'/> - <parameter type-id='type-id-363' name='instr' filepath='Python/ceval.c' line='2379' column='1'/> + <function-decl name='_PyEval_MonitorRaise' mangled-name='_PyEval_MonitorRaise' filepath='Python/ceval.c' line='2450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MonitorRaise'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='2450' column='1'/> + <parameter type-id='type-id-430' name='frame' filepath='Python/ceval.c' line='2450' column='1'/> + <parameter type-id='type-id-365' name='instr' filepath='Python/ceval.c' line='2451' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyThreadState_EnterTracing' mangled-name='PyThreadState_EnterTracing' filepath='Python/ceval.c' line='2449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_EnterTracing'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='2449' column='1'/> + <function-decl name='PyThreadState_EnterTracing' mangled-name='PyThreadState_EnterTracing' filepath='Python/ceval.c' line='2521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_EnterTracing'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='2521' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyThreadState_LeaveTracing' mangled-name='PyThreadState_LeaveTracing' filepath='Python/ceval.c' line='2456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_LeaveTracing'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='2456' column='1'/> + <function-decl name='PyThreadState_LeaveTracing' mangled-name='PyThreadState_LeaveTracing' filepath='Python/ceval.c' line='2528' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_LeaveTracing'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='2528' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyEval_SetProfile' mangled-name='PyEval_SetProfile' filepath='Python/ceval.c' line='2480' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfile'> - <parameter type-id='type-id-1041' name='func' filepath='Python/ceval.c' line='2480' column='1'/> - <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2480' column='1'/> + <function-decl name='PyEval_SetProfile' mangled-name='PyEval_SetProfile' filepath='Python/ceval.c' line='2552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfile'> + <parameter type-id='type-id-1043' name='func' filepath='Python/ceval.c' line='2552' column='1'/> + <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2552' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyEval_SetProfileAllThreads' mangled-name='PyEval_SetProfileAllThreads' filepath='Python/ceval.c' line='2490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfileAllThreads'> - <parameter type-id='type-id-1041' name='func' filepath='Python/ceval.c' line='2490' column='1'/> - <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2490' column='1'/> + <function-decl name='PyEval_SetProfileAllThreads' mangled-name='PyEval_SetProfileAllThreads' filepath='Python/ceval.c' line='2562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfileAllThreads'> + <parameter type-id='type-id-1043' name='func' filepath='Python/ceval.c' line='2562' column='1'/> + <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2562' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyEval_SetTrace' mangled-name='PyEval_SetTrace' filepath='Python/ceval.c' line='2511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTrace'> - <parameter type-id='type-id-1041' name='func' filepath='Python/ceval.c' line='2511' column='1'/> - <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2511' column='1'/> + <function-decl name='PyEval_SetTrace' mangled-name='PyEval_SetTrace' filepath='Python/ceval.c' line='2572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTrace'> + <parameter type-id='type-id-1043' name='func' filepath='Python/ceval.c' line='2572' column='1'/> + <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2572' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyEval_SetTraceAllThreads' mangled-name='PyEval_SetTraceAllThreads' filepath='Python/ceval.c' line='2521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTraceAllThreads'> - <parameter type-id='type-id-1041' name='func' filepath='Python/ceval.c' line='2521' column='1'/> - <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2521' column='1'/> + <function-decl name='PyEval_SetTraceAllThreads' mangled-name='PyEval_SetTraceAllThreads' filepath='Python/ceval.c' line='2582' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTraceAllThreads'> + <parameter type-id='type-id-1043' name='func' filepath='Python/ceval.c' line='2582' column='1'/> + <parameter type-id='type-id-6' name='arg' filepath='Python/ceval.c' line='2582' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyEval_GetFrame' mangled-name='PyEval_GetFrame' filepath='Python/ceval.c' line='2609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrame'> - <return type-id='type-id-413'/> + <function-decl name='PyEval_GetFrame' mangled-name='PyEval_GetFrame' filepath='Python/ceval.c' line='2659' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrame'> + <return type-id='type-id-415'/> </function-decl> - <function-decl name='PyEval_GetLocals' mangled-name='PyEval_GetLocals' filepath='Python/ceval.c' line='2657' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetLocals'> + <function-decl name='PyEval_GetLocals' mangled-name='PyEval_GetLocals' filepath='Python/ceval.c' line='2707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetLocals'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyEval_GetFrameLocals' mangled-name='PyEval_GetFrameLocals' filepath='Python/ceval.c' line='2860' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameLocals'> + <function-decl name='PyEval_GetFrameLocals' mangled-name='PyEval_GetFrameLocals' filepath='Python/ceval.c' line='2910' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameLocals'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyEval_GetFrameGlobals' mangled-name='PyEval_GetFrameGlobals' filepath='Python/ceval.c' line='2865' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameGlobals'> + <function-decl name='PyEval_GetFrameGlobals' mangled-name='PyEval_GetFrameGlobals' filepath='Python/ceval.c' line='2915' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameGlobals'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyEval_GetFrameBuiltins' mangled-name='PyEval_GetFrameBuiltins' filepath='Python/ceval.c' line='2875' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameBuiltins'> + <function-decl name='PyEval_GetFrameBuiltins' mangled-name='PyEval_GetFrameBuiltins' filepath='Python/ceval.c' line='2925' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameBuiltins'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyEval_GetFuncName' mangled-name='PyEval_GetFuncName' filepath='Python/ceval.c' line='2901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncName'> - <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='2901' column='1'/> + <function-decl name='PyEval_GetFuncName' mangled-name='PyEval_GetFuncName' filepath='Python/ceval.c' line='2951' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncName'> + <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='2951' column='1'/> <return type-id='type-id-4'/> </function-decl> - <function-decl name='PyEval_GetFuncDesc' mangled-name='PyEval_GetFuncDesc' filepath='Python/ceval.c' line='2914' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncDesc'> - <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='2914' column='1'/> + <function-decl name='PyEval_GetFuncDesc' mangled-name='PyEval_GetFuncDesc' filepath='Python/ceval.c' line='2964' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncDesc'> + <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='2964' column='1'/> <return type-id='type-id-4'/> </function-decl> - <function-decl name='_PyEval_ImportName' mangled-name='_PyEval_ImportName' filepath='Python/ceval.c' line='2975' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ImportName'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='2975' column='1'/> - <parameter type-id='type-id-428' name='frame' filepath='Python/ceval.c' line='2975' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='2976' column='1'/> - <parameter type-id='type-id-6' name='fromlist' filepath='Python/ceval.c' line='2976' column='1'/> - <parameter type-id='type-id-6' name='level' filepath='Python/ceval.c' line='2976' column='1'/> + <function-decl name='_PyEval_ImportName' mangled-name='_PyEval_ImportName' filepath='Python/ceval.c' line='3025' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ImportName'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3025' column='1'/> + <parameter type-id='type-id-430' name='frame' filepath='Python/ceval.c' line='3025' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3026' column='1'/> + <parameter type-id='type-id-6' name='fromlist' filepath='Python/ceval.c' line='3026' column='1'/> + <parameter type-id='type-id-6' name='level' filepath='Python/ceval.c' line='3026' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_ImportFrom' mangled-name='_PyEval_ImportFrom' filepath='Python/ceval.c' line='3014' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ImportFrom'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3014' column='1'/> - <parameter type-id='type-id-6' name='v' filepath='Python/ceval.c' line='3014' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3014' column='1'/> + <function-decl name='_PyEval_ImportFrom' mangled-name='_PyEval_ImportFrom' filepath='Python/ceval.c' line='3064' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ImportFrom'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3064' column='1'/> + <parameter type-id='type-id-6' name='v' filepath='Python/ceval.c' line='3064' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3064' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_CheckExceptTypeValid' mangled-name='_PyEval_CheckExceptTypeValid' filepath='Python/ceval.c' line='3188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_CheckExceptTypeValid'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3188' column='1'/> - <parameter type-id='type-id-6' name='right' filepath='Python/ceval.c' line='3188' column='1'/> + <function-decl name='_PyEval_CheckExceptTypeValid' mangled-name='_PyEval_CheckExceptTypeValid' filepath='Python/ceval.c' line='3238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_CheckExceptTypeValid'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3238' column='1'/> + <parameter type-id='type-id-6' name='right' filepath='Python/ceval.c' line='3238' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_CheckExceptStarTypeValid' mangled-name='_PyEval_CheckExceptStarTypeValid' filepath='Python/ceval.c' line='3213' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_CheckExceptStarTypeValid'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3213' column='1'/> - <parameter type-id='type-id-6' name='right' filepath='Python/ceval.c' line='3213' column='1'/> + <function-decl name='_PyEval_CheckExceptStarTypeValid' mangled-name='_PyEval_CheckExceptStarTypeValid' filepath='Python/ceval.c' line='3263' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_CheckExceptStarTypeValid'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3263' column='1'/> + <parameter type-id='type-id-6' name='right' filepath='Python/ceval.c' line='3263' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_Py_Check_ArgsIterable' mangled-name='_Py_Check_ArgsIterable' filepath='Python/ceval.c' line='3250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Check_ArgsIterable'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3250' column='1'/> - <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='3250' column='1'/> - <parameter type-id='type-id-6' name='args' filepath='Python/ceval.c' line='3250' column='1'/> + <function-decl name='_Py_Check_ArgsIterable' mangled-name='_Py_Check_ArgsIterable' filepath='Python/ceval.c' line='3300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Check_ArgsIterable'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3300' column='1'/> + <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='3300' column='1'/> + <parameter type-id='type-id-6' name='args' filepath='Python/ceval.c' line='3300' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyEval_FormatKwargsError' mangled-name='_PyEval_FormatKwargsError' filepath='Python/ceval.c' line='3270' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatKwargsError'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3270' column='1'/> - <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='3270' column='1'/> - <parameter type-id='type-id-6' name='kwargs' filepath='Python/ceval.c' line='3270' column='1'/> + <function-decl name='_PyEval_FormatKwargsError' mangled-name='_PyEval_FormatKwargsError' filepath='Python/ceval.c' line='3320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatKwargsError'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3320' column='1'/> + <parameter type-id='type-id-6' name='func' filepath='Python/ceval.c' line='3320' column='1'/> + <parameter type-id='type-id-6' name='kwargs' filepath='Python/ceval.c' line='3320' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_FormatExcCheckArg' mangled-name='_PyEval_FormatExcCheckArg' filepath='Python/ceval.c' line='3313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatExcCheckArg'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3313' column='1'/> - <parameter type-id='type-id-6' name='exc' filepath='Python/ceval.c' line='3313' column='1'/> - <parameter type-id='type-id-4' name='format_str' filepath='Python/ceval.c' line='3314' column='1'/> - <parameter type-id='type-id-6' name='obj' filepath='Python/ceval.c' line='3314' column='1'/> + <function-decl name='_PyEval_FormatExcCheckArg' mangled-name='_PyEval_FormatExcCheckArg' filepath='Python/ceval.c' line='3363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatExcCheckArg'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3363' column='1'/> + <parameter type-id='type-id-6' name='exc' filepath='Python/ceval.c' line='3363' column='1'/> + <parameter type-id='type-id-4' name='format_str' filepath='Python/ceval.c' line='3364' column='1'/> + <parameter type-id='type-id-6' name='obj' filepath='Python/ceval.c' line='3364' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_FormatExcUnbound' mangled-name='_PyEval_FormatExcUnbound' filepath='Python/ceval.c' line='3342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatExcUnbound'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3342' column='1'/> - <parameter type-id='type-id-345' name='co' filepath='Python/ceval.c' line='3342' column='1'/> - <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3342' column='1'/> + <function-decl name='_PyEval_FormatExcUnbound' mangled-name='_PyEval_FormatExcUnbound' filepath='Python/ceval.c' line='3392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatExcUnbound'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3392' column='1'/> + <parameter type-id='type-id-347' name='co' filepath='Python/ceval.c' line='3392' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3392' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_FormatAwaitableError' mangled-name='_PyEval_FormatAwaitableError' filepath='Python/ceval.c' line='3359' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatAwaitableError'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3359' column='1'/> - <parameter type-id='type-id-1' name='type' filepath='Python/ceval.c' line='3359' column='1'/> - <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3359' column='1'/> + <function-decl name='_PyEval_FormatAwaitableError' mangled-name='_PyEval_FormatAwaitableError' filepath='Python/ceval.c' line='3409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatAwaitableError'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3409' column='1'/> + <parameter type-id='type-id-1' name='type' filepath='Python/ceval.c' line='3409' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3409' 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='3379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Eval_RequestCodeExtraIndex'> - <parameter type-id='type-id-471' name='free' filepath='Python/ceval.c' line='3379' column='1'/> + <function-decl name='PyUnstable_Eval_RequestCodeExtraIndex' mangled-name='PyUnstable_Eval_RequestCodeExtraIndex' filepath='Python/ceval.c' line='3429' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Eval_RequestCodeExtraIndex'> + <parameter type-id='type-id-473' name='free' filepath='Python/ceval.c' line='3429' column='1'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyEval_GetANext' mangled-name='_PyEval_GetANext' filepath='Python/ceval.c' line='3406' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetANext'> - <parameter type-id='type-id-6' name='aiter' filepath='Python/ceval.c' line='3406' column='1'/> + <function-decl name='_PyEval_GetANext' mangled-name='_PyEval_GetANext' filepath='Python/ceval.c' line='3456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetANext'> + <parameter type-id='type-id-6' name='aiter' filepath='Python/ceval.c' line='3456' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_LoadGlobalStackRef' mangled-name='_PyEval_LoadGlobalStackRef' filepath='Python/ceval.c' line='3445' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_LoadGlobalStackRef'> - <parameter type-id='type-id-6' name='globals' filepath='Python/ceval.c' line='3445' column='1'/> - <parameter type-id='type-id-6' name='builtins' filepath='Python/ceval.c' line='3445' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3445' column='1'/> - <parameter type-id='type-id-395' name='writeto' filepath='Python/ceval.c' line='3445' column='1'/> + <function-decl name='_PyEval_LoadGlobalStackRef' mangled-name='_PyEval_LoadGlobalStackRef' filepath='Python/ceval.c' line='3495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_LoadGlobalStackRef'> + <parameter type-id='type-id-6' name='globals' filepath='Python/ceval.c' line='3495' column='1'/> + <parameter type-id='type-id-6' name='builtins' filepath='Python/ceval.c' line='3495' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3495' column='1'/> + <parameter type-id='type-id-397' name='writeto' filepath='Python/ceval.c' line='3495' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_GetAwaitable' mangled-name='_PyEval_GetAwaitable' filepath='Python/ceval.c' line='3485' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetAwaitable'> - <parameter type-id='type-id-6' name='iterable' filepath='Python/ceval.c' line='3485' column='1'/> - <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3485' column='1'/> + <function-decl name='_PyEval_GetAwaitable' mangled-name='_PyEval_GetAwaitable' filepath='Python/ceval.c' line='3535' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetAwaitable'> + <parameter type-id='type-id-6' name='iterable' filepath='Python/ceval.c' line='3535' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3535' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_LoadName' mangled-name='_PyEval_LoadName' filepath='Python/ceval.c' line='3509' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_LoadName'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval.c' line='3509' column='1'/> - <parameter type-id='type-id-428' name='frame' filepath='Python/ceval.c' line='3509' column='1'/> - <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3509' column='1'/> + <function-decl name='_PyEval_LoadName' mangled-name='_PyEval_LoadName' filepath='Python/ceval.c' line='3559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_LoadName'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval.c' line='3559' column='1'/> + <parameter type-id='type-id-430' name='frame' filepath='Python/ceval.c' line='3559' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/ceval.c' line='3559' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_SpecialMethodCanSuggest' mangled-name='_PyEval_SpecialMethodCanSuggest' filepath='Python/ceval.c' line='3552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SpecialMethodCanSuggest'> - <parameter type-id='type-id-6' name='self' filepath='Python/ceval.c' line='3552' column='1'/> - <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3552' column='1'/> + <function-decl name='_PyEval_SpecialMethodCanSuggest' mangled-name='_PyEval_SpecialMethodCanSuggest' filepath='Python/ceval.c' line='3602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SpecialMethodCanSuggest'> + <parameter type-id='type-id-6' name='self' filepath='Python/ceval.c' line='3602' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3602' column='1'/> <return type-id='type-id-5'/> </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-1593' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='32' column='1' id='type-id-1594'> + <union-decl name='pthread_mutexattr_t' size-in-bits='32' naming-typedef-id='type-id-1594' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='32' column='1' id='type-id-1595'> <data-member access='public'> - <var-decl name='__size' type-id='type-id-862' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='34' column='1'/> + <var-decl name='__size' type-id='type-id-864' 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-1594' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='36' column='1' id='type-id-1593'/> - <qualified-type-def type-id='type-id-1593' const='yes' id='type-id-1595'/> - <pointer-type-def type-id='type-id-1595' size-in-bits='64' id='type-id-1596'/> - <qualified-type-def type-id='type-id-110' const='yes' id='type-id-1597'/> - <pointer-type-def type-id='type-id-1597' size-in-bits='64' id='type-id-175'/> - <qualified-type-def type-id='type-id-175' restrict='yes' id='type-id-208'/> - <pointer-type-def type-id='type-id-1176' size-in-bits='64' id='type-id-1598'/> - <qualified-type-def type-id='type-id-1598' restrict='yes' id='type-id-1599'/> - <pointer-type-def type-id='type-id-1177' size-in-bits='64' id='type-id-1600'/> - <qualified-type-def type-id='type-id-1600' restrict='yes' id='type-id-1601'/> - <function-decl name='_Py_RunGC' filepath='./Include/internal/pycore_gc.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <typedef-decl name='pthread_mutexattr_t' type-id='type-id-1595' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='36' column='1' id='type-id-1594'/> + <qualified-type-def type-id='type-id-1594' const='yes' id='type-id-1596'/> + <pointer-type-def type-id='type-id-1596' size-in-bits='64' id='type-id-1597'/> + <qualified-type-def type-id='type-id-116' const='yes' id='type-id-1598'/> + <pointer-type-def type-id='type-id-1598' size-in-bits='64' id='type-id-181'/> + <qualified-type-def type-id='type-id-181' restrict='yes' id='type-id-212'/> + <pointer-type-def type-id='type-id-1178' size-in-bits='64' id='type-id-1599'/> + <qualified-type-def type-id='type-id-1599' restrict='yes' id='type-id-1600'/> + <pointer-type-def type-id='type-id-1179' size-in-bits='64' id='type-id-1601'/> + <qualified-type-def type-id='type-id-1601' restrict='yes' id='type-id-1602'/> + <function-decl name='_Py_RunGC' filepath='./Include/internal/pycore_gc.h' line='362' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_SetNone' filepath='./Include/internal/pycore_pyerrors.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_CheckSignalsTstate' filepath='./Include/internal/pycore_pyerrors.h' line='179' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyErr_Print' filepath='./Include/internal/pycore_pylifecycle.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <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-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_IsMainThread' filepath='./Include/internal/pycore_pystate.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyThreadState_MustExit' filepath='./Include/internal/pycore_pystate.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyThreadState_HangThread' filepath='./Include/internal/pycore_pystate.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_Attach' filepath='./Include/internal/pycore_pystate.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_Detach' filepath='./Include/internal/pycore_pystate.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_Suspend' filepath='./Include/internal/pycore_pystate.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <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='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-1600'/> - <parameter type-id='type-id-1596'/> + <parameter type-id='type-id-1601'/> + <parameter type-id='type-id-1597'/> <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-1600'/> + <parameter type-id='type-id-1601'/> <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-1600'/> + <parameter type-id='type-id-1601'/> <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-1600'/> + <parameter type-id='type-id-1601'/> <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-1598'/> + <parameter type-id='type-id-1599'/> <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-1598'/> + <parameter type-id='type-id-1599'/> <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-1599'/> - <parameter type-id='type-id-1601'/> + <parameter type-id='type-id-1600'/> + <parameter type-id='type-id-1602'/> <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-1599'/> - <parameter type-id='type-id-1601'/> - <parameter type-id='type-id-208'/> + <parameter type-id='type-id-1600'/> + <parameter type-id='type-id-1602'/> + <parameter type-id='type-id-212'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyEval_ThreadsInitialized' mangled-name='PyEval_ThreadsInitialized' filepath='Python/ceval_gil.c' line='453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ThreadsInitialized'> @@ -25846,46 +25902,46 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyEval_AcquireThread' mangled-name='PyEval_AcquireThread' filepath='Python/ceval_gil.c' line='602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_AcquireThread'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval_gil.c' line='602' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval_gil.c' line='602' 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='609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ReleaseThread'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval_gil.c' line='609' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval_gil.c' line='609' 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='807' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AddPendingCall'> - <parameter type-id='type-id-1235' name='func' filepath='Python/ceval_gil.c' line='807' column='1'/> - <parameter type-id='type-id-35' name='arg' filepath='Python/ceval_gil.c' line='807' column='1'/> + <parameter type-id='type-id-1237' name='func' filepath='Python/ceval_gil.c' line='807' column='1'/> + <parameter type-id='type-id-41' name='arg' filepath='Python/ceval_gil.c' line='807' 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='1034' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MakePendingCalls'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/ceval_gil.c' line='1034' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/ceval_gil.c' line='1034' 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='1059' 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-1598'/> + <parameter type-id='type-id-1599'/> <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-463'/> - <parameter type-id='type-id-179'/> + <parameter type-id='type-id-465'/> + <parameter type-id='type-id-185'/> <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-4' 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-66'/> + <return type-id='type-id-72'/> </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-4'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </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-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyUnicodeError_GetParams' filepath='./Include/internal/pycore_pyerrors.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> @@ -25898,7 +25954,7 @@ <return type-id='type-id-5'/> </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-1287'/> + <return type-id='type-id-1288'/> </function-decl> <function-decl name='PyCodec_Register' mangled-name='PyCodec_Register' filepath='Python/codecs.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Register'> <parameter type-id='type-id-6' name='search_function' filepath='Python/codecs.c' line='31' column='1'/> @@ -25910,8 +25966,8 @@ </function-decl> <function-decl name='_Py_normalize_encoding' filepath='Python/codecs.c' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyCodec_KnownEncoding' mangled-name='PyCodec_KnownEncoding' filepath='Python/codecs.c' line='230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_KnownEncoding'> @@ -25975,21 +26031,21 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/codegen.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-1602' size-in-bits='320' id='type-id-1603'> - <subrange length='10' type-id='type-id-2' id='type-id-892'/> + <array-type-def dimensions='1' type-id='type-id-1603' size-in-bits='320' id='type-id-1604'> + <subrange length='10' type-id='type-id-2' id='type-id-894'/> </array-type-def> - <class-decl name='_PyCompiler' size-in-bits='704' is-struct='yes' visibility='default' filepath='Python/compile.c' line='90' column='1' id='type-id-1604'> + <class-decl name='_PyCompiler' size-in-bits='704' is-struct='yes' visibility='default' filepath='Python/compile.c' line='90' column='1' id='type-id-1605'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='c_filename' type-id='type-id-6' visibility='default' filepath='Python/compile.c' line='91' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='c_st' type-id='type-id-210' visibility='default' filepath='Python/compile.c' line='92' column='1'/> + <var-decl name='c_st' type-id='type-id-214' visibility='default' filepath='Python/compile.c' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='c_future' type-id='type-id-1605' visibility='default' filepath='Python/compile.c' line='93' column='1'/> + <var-decl name='c_future' type-id='type-id-1606' visibility='default' filepath='Python/compile.c' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='c_flags' type-id='type-id-804' visibility='default' filepath='Python/compile.c' line='94' column='1'/> + <var-decl name='c_flags' type-id='type-id-806' visibility='default' filepath='Python/compile.c' line='94' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='352'> <var-decl name='c_optimize' type-id='type-id-5' visibility='default' filepath='Python/compile.c' line='96' column='1'/> @@ -26001,79 +26057,82 @@ <var-decl name='c_const_cache' type-id='type-id-6' visibility='default' filepath='Python/compile.c' line='98' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='u' type-id='type-id-1606' visibility='default' filepath='Python/compile.c' line='100' column='1'/> + <var-decl name='u' type-id='type-id-1607' visibility='default' filepath='Python/compile.c' line='100' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> <var-decl name='c_stack' type-id='type-id-6' visibility='default' filepath='Python/compile.c' line='101' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='c_save_nested_seqs' type-id='type-id-344' visibility='default' filepath='Python/compile.c' line='103' column='1'/> + <var-decl name='c_save_nested_seqs' type-id='type-id-346' visibility='default' filepath='Python/compile.c' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='672'> + <var-decl name='c_disable_warning' type-id='type-id-5' visibility='default' filepath='Python/compile.c' line='106' column='1'/> </data-member> </class-decl> - <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='17088' id='type-id-1607'> - <subrange length='267' type-id='type-id-2' id='type-id-1608'/> + <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='17088' id='type-id-1608'> + <subrange length='267' type-id='type-id-2' id='type-id-1609'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1609' size-in-bits='90112' id='type-id-1610'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <array-type-def dimensions='1' type-id='type-id-1610' size-in-bits='90112' id='type-id-1611'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1611' size-in-bits='8544' id='type-id-1612'> - <subrange length='267' type-id='type-id-2' id='type-id-1608'/> + <array-type-def dimensions='1' type-id='type-id-1612' size-in-bits='8544' id='type-id-1613'> + <subrange length='267' type-id='type-id-2' id='type-id-1609'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1613' size-in-bits='440' id='type-id-1614'> - <subrange length='11' type-id='type-id-2' id='type-id-909'/> + <array-type-def dimensions='1' type-id='type-id-1614' size-in-bits='440' id='type-id-1615'> + <subrange length='11' type-id='type-id-2' id='type-id-911'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-359' size-in-bits='2048' id='type-id-1615'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <array-type-def dimensions='1' type-id='type-id-361' size-in-bits='2048' id='type-id-1616'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <class-decl name='_PyCompile_CodeUnitMetadata' size-in-bits='768' is-struct='yes' naming-typedef-id='type-id-1616' visibility='default' filepath='./Include/internal/pycore_compile.h' line='55' column='1' id='type-id-1617'> + <class-decl name='_PyCompile_CodeUnitMetadata' size-in-bits='768' is-struct='yes' naming-typedef-id='type-id-1617' visibility='default' filepath='./Include/internal/pycore_compile.h' line='56' column='1' id='type-id-1618'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='u_name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='56' column='1'/> + <var-decl name='u_name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='57' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='u_qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='57' column='1'/> + <var-decl name='u_qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='58' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='u_consts' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='63' column='1'/> + <var-decl name='u_consts' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='64' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='u_names' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='64' column='1'/> + <var-decl name='u_names' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='65' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='u_varnames' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='65' column='1'/> + <var-decl name='u_varnames' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='u_cellvars' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='66' column='1'/> + <var-decl name='u_cellvars' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='67' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='u_freevars' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='67' column='1'/> + <var-decl name='u_freevars' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='u_fasthidden' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='68' column='1'/> + <var-decl name='u_fasthidden' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='69' 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='72' column='1'/> + <var-decl name='u_argcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_compile.h' line='73' 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='73' column='1'/> + <var-decl name='u_posonlyargcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_compile.h' line='74' 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='74' column='1'/> + <var-decl name='u_kwonlyargcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_compile.h' line='75' 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='76' column='1'/> + <var-decl name='u_firstlineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_compile.h' line='77' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyCompile_CodeUnitMetadata' type-id='type-id-1617' filepath='./Include/internal/pycore_compile.h' line='77' column='1' id='type-id-1616'/> - <enum-decl name='_PyCompile_optype' naming-typedef-id='type-id-1618' filepath='./Include/internal/pycore_compile.h' line='81' column='1' id='type-id-1619'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='_PyCompile_CodeUnitMetadata' type-id='type-id-1618' filepath='./Include/internal/pycore_compile.h' line='78' column='1' id='type-id-1617'/> + <enum-decl name='_PyCompile_optype' naming-typedef-id='type-id-1619' filepath='./Include/internal/pycore_compile.h' line='82' column='1' id='type-id-1620'> + <underlying-type type-id='type-id-43'/> <enumerator name='COMPILE_OP_FAST' value='0'/> <enumerator name='COMPILE_OP_GLOBAL' value='1'/> <enumerator name='COMPILE_OP_DEREF' value='2'/> <enumerator name='COMPILE_OP_NAME' value='3'/> </enum-decl> - <typedef-decl name='_PyCompile_optype' type-id='type-id-1619' filepath='./Include/internal/pycore_compile.h' line='86' column='1' id='type-id-1618'/> - <enum-decl name='_PyCompile_FBlockType' filepath='./Include/internal/pycore_compile.h' line='95' column='1' id='type-id-1620'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='_PyCompile_optype' type-id='type-id-1620' filepath='./Include/internal/pycore_compile.h' line='87' column='1' id='type-id-1619'/> + <enum-decl name='_PyCompile_FBlockType' filepath='./Include/internal/pycore_compile.h' line='96' column='1' id='type-id-1621'> + <underlying-type type-id='type-id-43'/> <enumerator name='COMPILE_FBLOCK_WHILE_LOOP' value='0'/> <enumerator name='COMPILE_FBLOCK_FOR_LOOP' value='1'/> <enumerator name='COMPILE_FBLOCK_TRY_EXCEPT' value='2'/> @@ -26088,85 +26147,85 @@ <enumerator name='COMPILE_FBLOCK_ASYNC_COMPREHENSION_GENERATOR' value='11'/> <enumerator name='COMPILE_FBLOCK_STOP_ITERATION' value='12'/> </enum-decl> - <class-decl name='_PyCompile_FBlockInfo' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1621' visibility='default' filepath='./Include/internal/pycore_compile.h' line='111' column='1' id='type-id-1622'> + <class-decl name='_PyCompile_FBlockInfo' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1622' visibility='default' filepath='./Include/internal/pycore_compile.h' line='112' column='1' id='type-id-1623'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fb_type' type-id='type-id-1620' visibility='default' filepath='./Include/internal/pycore_compile.h' line='112' column='1'/> + <var-decl name='fb_type' type-id='type-id-1621' visibility='default' filepath='./Include/internal/pycore_compile.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='fb_block' type-id='type-id-1623' visibility='default' filepath='./Include/internal/pycore_compile.h' line='113' column='1'/> + <var-decl name='fb_block' type-id='type-id-1624' visibility='default' filepath='./Include/internal/pycore_compile.h' line='114' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='fb_loc' type-id='type-id-1555' visibility='default' filepath='./Include/internal/pycore_compile.h' line='114' column='1'/> + <var-decl name='fb_loc' type-id='type-id-1556' visibility='default' filepath='./Include/internal/pycore_compile.h' line='115' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='fb_exit' type-id='type-id-1623' visibility='default' filepath='./Include/internal/pycore_compile.h' line='116' column='1'/> + <var-decl name='fb_exit' type-id='type-id-1624' visibility='default' filepath='./Include/internal/pycore_compile.h' line='117' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='fb_datum' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_compile.h' line='118' column='1'/> + <var-decl name='fb_datum' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_compile.h' line='119' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyCompile_FBlockInfo' type-id='type-id-1622' filepath='./Include/internal/pycore_compile.h' line='119' column='1' id='type-id-1621'/> - <class-decl name='_PyCompile_InlinedComprehensionState' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1624' visibility='default' filepath='./Include/internal/pycore_compile.h' line='173' column='1' id='type-id-1625'> + <typedef-decl name='_PyCompile_FBlockInfo' type-id='type-id-1623' filepath='./Include/internal/pycore_compile.h' line='120' column='1' id='type-id-1622'/> + <class-decl name='_PyCompile_InlinedComprehensionState' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1625' visibility='default' filepath='./Include/internal/pycore_compile.h' line='174' column='1' id='type-id-1626'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pushed_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='174' column='1'/> + <var-decl name='pushed_locals' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='175' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='temp_symbols' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='175' column='1'/> + <var-decl name='temp_symbols' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='176' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='fast_hidden' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='176' column='1'/> + <var-decl name='fast_hidden' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_compile.h' line='177' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='cleanup' type-id='type-id-1623' visibility='default' filepath='./Include/internal/pycore_compile.h' line='177' column='1'/> + <var-decl name='cleanup' type-id='type-id-1624' visibility='default' filepath='./Include/internal/pycore_compile.h' line='178' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyCompile_InlinedComprehensionState' type-id='type-id-1625' filepath='./Include/internal/pycore_compile.h' line='178' column='1' id='type-id-1624'/> - <class-decl name='_PyJumpTargetLabel' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1623' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='53' column='1' id='type-id-1626'> + <typedef-decl name='_PyCompile_InlinedComprehensionState' type-id='type-id-1626' filepath='./Include/internal/pycore_compile.h' line='179' column='1' id='type-id-1625'/> + <class-decl name='_PyJumpTargetLabel' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1624' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='53' column='1' id='type-id-1627'> <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='54' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyJumpTargetLabel' type-id='type-id-1626' filepath='./Include/internal/pycore_instruction_sequence.h' line='55' column='1' id='type-id-1623'/> - <class-decl name='opcode_metadata' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1072' column='1' id='type-id-1627'> + <typedef-decl name='_PyJumpTargetLabel' type-id='type-id-1627' filepath='./Include/internal/pycore_instruction_sequence.h' line='55' column='1' id='type-id-1624'/> + <class-decl name='opcode_metadata' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1072' column='1' id='type-id-1628'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='valid_entry' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1073' column='1'/> + <var-decl name='valid_entry' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1073' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='instr_format' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1074' column='1'/> + <var-decl name='instr_format' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1074' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='flags' type-id='type-id-348' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1075' column='1'/> + <var-decl name='flags' type-id='type-id-350' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1075' column='1'/> </data-member> </class-decl> - <class-decl name='opcode_macro_expansion' size-in-bits='352' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1323' column='1' id='type-id-1628'> + <class-decl name='opcode_macro_expansion' size-in-bits='352' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1323' column='1' id='type-id-1629'> <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='1324' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='uops' type-id='type-id-1603' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> + <var-decl name='uops' type-id='type-id-1604' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' 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='1325' column='1' id='type-id-1602'> + <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='1325' column='1' id='type-id-1603'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uop' type-id='type-id-1629' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> + <var-decl name='uop' type-id='type-id-1630' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='size' type-id='type-id-421' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> + <var-decl name='size' type-id='type-id-423' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='24'> - <var-decl name='offset' type-id='type-id-421' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> + <var-decl name='offset' type-id='type-id-423' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1325' column='1'/> </data-member> </class-decl> - <class-decl name='pseudo_targets' size-in-bits='40' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2081' column='1' id='type-id-1630'> + <class-decl name='pseudo_targets' size-in-bits='40' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2081' column='1' id='type-id-1631'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='as_sequence' type-id='type-id-309' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2082' column='1'/> + <var-decl name='as_sequence' type-id='type-id-311' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2082' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='targets' type-id='type-id-944' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2083' column='1'/> + <var-decl name='targets' type-id='type-id-946' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2083' column='1'/> </data-member> </class-decl> - <enum-decl name='_block_type' filepath='./Include/internal/pycore_symtable.h' line='13' column='1' id='type-id-1631'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_block_type' filepath='./Include/internal/pycore_symtable.h' line='13' column='1' id='type-id-1632'> + <underlying-type type-id='type-id-43'/> <enumerator name='FunctionBlock' value='0'/> <enumerator name='ClassBlock' value='1'/> <enumerator name='ModuleBlock' value='2'/> @@ -26175,34 +26234,34 @@ <enumerator name='TypeParametersBlock' value='5'/> <enumerator name='TypeVariableBlock' value='6'/> </enum-decl> - <typedef-decl name='_Py_block_ty' type-id='type-id-1631' filepath='./Include/internal/pycore_symtable.h' line='36' column='1' id='type-id-1632'/> - <enum-decl name='_comprehension_type' filepath='./Include/internal/pycore_symtable.h' line='38' column='1' id='type-id-1633'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='_Py_block_ty' type-id='type-id-1632' filepath='./Include/internal/pycore_symtable.h' line='36' column='1' id='type-id-1633'/> + <enum-decl name='_comprehension_type' filepath='./Include/internal/pycore_symtable.h' line='38' column='1' id='type-id-1634'> + <underlying-type type-id='type-id-43'/> <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-1633' filepath='./Include/internal/pycore_symtable.h' line='43' column='1' id='type-id-1634'/> - <class-decl name='_PyFutureFeatures' size-in-bits='160' is-struct='yes' naming-typedef-id='type-id-1605' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='64' column='1' id='type-id-1635'> + <typedef-decl name='_Py_comprehension_ty' type-id='type-id-1634' filepath='./Include/internal/pycore_symtable.h' line='43' column='1' id='type-id-1635'/> + <class-decl name='_PyFutureFeatures' size-in-bits='160' is-struct='yes' naming-typedef-id='type-id-1606' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='64' column='1' id='type-id-1636'> <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='65' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ff_location' type-id='type-id-1555' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='66' column='1'/> + <var-decl name='ff_location' type-id='type-id-1556' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='66' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyFutureFeatures' type-id='type-id-1635' filepath='./Include/internal/pycore_symtable.h' line='67' column='1' id='type-id-1605'/> - <class-decl name='symtable' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='71' column='1' id='type-id-1636'> + <typedef-decl name='_PyFutureFeatures' type-id='type-id-1636' filepath='./Include/internal/pycore_symtable.h' line='67' column='1' id='type-id-1606'/> + <class-decl name='symtable' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='71' column='1' id='type-id-1637'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='st_filename' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='72' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_cur' type-id='type-id-1637' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='74' column='1'/> + <var-decl name='st_cur' type-id='type-id-1638' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='74' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_top' type-id='type-id-1637' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='75' column='1'/> + <var-decl name='st_top' type-id='type-id-1638' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='75' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> <var-decl name='st_blocks' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='76' column='1'/> @@ -26220,12 +26279,12 @@ <var-decl name='st_private' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='83' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='st_future' type-id='type-id-1638' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='84' column='1'/> + <var-decl name='st_future' type-id='type-id-1639' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='84' 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-1639'> + <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-1640'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='89' column='1'/> + <var-decl name='ob_base' type-id='type-id-392' 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-6' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='90' column='1'/> @@ -26249,7 +26308,7 @@ <var-decl name='ste_mangled_names' type-id='type-id-6' 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-1632' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='98' column='1'/> + <var-decl name='ste_type' type-id='type-id-1633' 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-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='105' column='1'/> @@ -26258,345 +26317,345 @@ <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_generator' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='108' column='1'/> + <var-decl name='ste_generator' type-id='type-id-111' 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_coroutine' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='109' column='1'/> + <var-decl name='ste_coroutine' type-id='type-id-111' 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_annotations_used' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='110' column='1'/> + <var-decl name='ste_annotations_used' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='110' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='ste_comprehension' type-id='type-id-1634' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='111' column='1'/> + <var-decl name='ste_comprehension' type-id='type-id-1635' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='111' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='800'> - <var-decl name='ste_varargs' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='112' column='1'/> + <var-decl name='ste_varargs' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='112' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='801'> - <var-decl name='ste_varkeywords' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='113' column='1'/> + <var-decl name='ste_varkeywords' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='113' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='802'> - <var-decl name='ste_returns_value' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='114' column='1'/> + <var-decl name='ste_returns_value' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='114' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='803'> - <var-decl name='ste_needs_class_closure' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='116' column='1'/> + <var-decl name='ste_needs_class_closure' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='116' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='804'> - <var-decl name='ste_needs_classdict' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='119' column='1'/> + <var-decl name='ste_needs_classdict' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='119' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='805'> - <var-decl name='ste_comp_inlined' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='121' column='1'/> + <var-decl name='ste_comp_inlined' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='121' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='806'> - <var-decl name='ste_comp_iter_target' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='122' column='1'/> + <var-decl name='ste_comp_iter_target' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='122' 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-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='123' column='1'/> + <var-decl name='ste_can_see_class_scope' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='123' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='808'> - <var-decl name='ste_has_docstring' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='125' column='1'/> + <var-decl name='ste_has_docstring' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='125' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='809'> - <var-decl name='ste_method' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='126' column='1'/> + <var-decl name='ste_method' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='126' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='810'> - <var-decl name='ste_has_conditional_annotations' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='127' column='1'/> + <var-decl name='ste_has_conditional_annotations' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='127' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='811'> - <var-decl name='ste_in_conditional_block' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='128' column='1'/> + <var-decl name='ste_in_conditional_block' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='128' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='812'> - <var-decl name='ste_in_unevaluated_annotation' type-id='type-id-105' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='129' column='1'/> + <var-decl name='ste_in_unevaluated_annotation' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='129' 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='130' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='864'> - <var-decl name='ste_loc' type-id='type-id-1555' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='131' column='1'/> + <var-decl name='ste_loc' type-id='type-id-1556' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='131' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='ste_annotation_block' type-id='type-id-1637' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='132' column='1'/> + <var-decl name='ste_annotation_block' type-id='type-id-1638' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='132' 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='133' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PySTEntryObject' type-id='type-id-1639' filepath='./Include/internal/pycore_symtable.h' line='134' column='1' id='type-id-1640'/> - <typedef-decl name='int16_t' type-id='type-id-1641' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='25' column='1' id='type-id-1629'/> - <typedef-decl name='__int16_t' type-id='type-id-84' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='39' column='1' id='type-id-1641'/> - <pointer-type-def type-id='type-id-1640' size-in-bits='64' id='type-id-1642'/> - <pointer-type-def type-id='type-id-1642' size-in-bits='64' id='type-id-1643'/> - <pointer-type-def type-id='type-id-1616' size-in-bits='64' id='type-id-1644'/> - <pointer-type-def type-id='type-id-1621' size-in-bits='64' id='type-id-1645'/> - <pointer-type-def type-id='type-id-1624' size-in-bits='64' id='type-id-1646'/> - <pointer-type-def type-id='type-id-1618' size-in-bits='64' id='type-id-1647'/> - <pointer-type-def type-id='type-id-1604' size-in-bits='64' id='type-id-1648'/> - <pointer-type-def type-id='type-id-1605' size-in-bits='64' id='type-id-1638'/> - <pointer-type-def type-id='type-id-1639' size-in-bits='64' id='type-id-1637'/> - <qualified-type-def type-id='type-id-1628' const='yes' id='type-id-1609'/> - <qualified-type-def type-id='type-id-1627' const='yes' id='type-id-1611'/> - <qualified-type-def type-id='type-id-1630' const='yes' id='type-id-1613'/> - <pointer-type-def type-id='type-id-1636' size-in-bits='64' id='type-id-210'/> + <var-decl name='ste_table' type-id='type-id-214' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='133' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PySTEntryObject' type-id='type-id-1640' filepath='./Include/internal/pycore_symtable.h' line='134' column='1' id='type-id-1641'/> + <typedef-decl name='int16_t' type-id='type-id-1642' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='25' column='1' id='type-id-1630'/> + <typedef-decl name='__int16_t' type-id='type-id-90' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='39' column='1' id='type-id-1642'/> + <pointer-type-def type-id='type-id-1641' size-in-bits='64' id='type-id-1643'/> + <pointer-type-def type-id='type-id-1643' size-in-bits='64' id='type-id-1644'/> + <pointer-type-def type-id='type-id-1617' size-in-bits='64' id='type-id-1645'/> + <pointer-type-def type-id='type-id-1622' size-in-bits='64' id='type-id-1646'/> + <pointer-type-def type-id='type-id-1625' size-in-bits='64' id='type-id-1647'/> + <pointer-type-def type-id='type-id-1619' size-in-bits='64' id='type-id-1648'/> + <pointer-type-def type-id='type-id-1605' size-in-bits='64' id='type-id-1649'/> + <pointer-type-def type-id='type-id-1606' size-in-bits='64' id='type-id-1639'/> + <pointer-type-def type-id='type-id-1640' size-in-bits='64' id='type-id-1638'/> + <qualified-type-def type-id='type-id-1629' const='yes' id='type-id-1610'/> + <qualified-type-def type-id='type-id-1628' const='yes' id='type-id-1612'/> + <qualified-type-def type-id='type-id-1631' const='yes' id='type-id-1614'/> + <pointer-type-def type-id='type-id-1637' size-in-bits='64' id='type-id-214'/> <function-decl name='_PyAST_ExprAsUnicode' filepath='./Include/internal/pycore_ast.h' line='935' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCompile_PushFBlock' filepath='./Include/internal/pycore_compile.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1555'/> - <parameter type-id='type-id-1620'/> - <parameter type-id='type-id-1623'/> - <parameter type-id='type-id-1623'/> - <parameter type-id='type-id-35'/> + <function-decl name='_PyCompile_PushFBlock' filepath='./Include/internal/pycore_compile.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1556'/> + <parameter type-id='type-id-1621'/> + <parameter type-id='type-id-1624'/> + <parameter type-id='type-id-1624'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_PopFBlock' filepath='./Include/internal/pycore_compile.h' line='126' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1620'/> - <parameter type-id='type-id-1623'/> + <function-decl name='_PyCompile_PopFBlock' filepath='./Include/internal/pycore_compile.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1621'/> + <parameter type-id='type-id-1624'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyCompile_TopFBlock' filepath='./Include/internal/pycore_compile.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <return type-id='type-id-1645'/> + <function-decl name='_PyCompile_TopFBlock' filepath='./Include/internal/pycore_compile.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <return type-id='type-id-1646'/> </function-decl> - <function-decl name='_PyCompile_EnterScope' filepath='./Include/internal/pycore_compile.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-704'/> + <function-decl name='_PyCompile_EnterScope' filepath='./Include/internal/pycore_compile.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-706'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-1644'/> + <parameter type-id='type-id-1645'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_ExitScope' filepath='./Include/internal/pycore_compile.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_ExitScope' filepath='./Include/internal/pycore_compile.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyCompile_AddConst' filepath='./Include/internal/pycore_compile.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_AddConst' filepath='./Include/internal/pycore_compile.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-6'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyCompile_InstrSequence' filepath='./Include/internal/pycore_compile.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <return type-id='type-id-1562'/> + <function-decl name='_PyCompile_InstrSequence' filepath='./Include/internal/pycore_compile.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <return type-id='type-id-1563'/> </function-decl> - <function-decl name='_PyCompile_StartAnnotationSetup' filepath='./Include/internal/pycore_compile.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_StartAnnotationSetup' filepath='./Include/internal/pycore_compile.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_EndAnnotationSetup' filepath='./Include/internal/pycore_compile.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_EndAnnotationSetup' filepath='./Include/internal/pycore_compile.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_FutureFeatures' filepath='./Include/internal/pycore_compile.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_FutureFeatures' filepath='./Include/internal/pycore_compile.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_DeferredAnnotations' filepath='./Include/internal/pycore_compile.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_DeferredAnnotations' filepath='./Include/internal/pycore_compile.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-241'/> <parameter type-id='type-id-241'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyCompile_Mangle' filepath='./Include/internal/pycore_compile.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_Mangle' filepath='./Include/internal/pycore_compile.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCompile_MaybeMangle' filepath='./Include/internal/pycore_compile.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_MaybeMangle' filepath='./Include/internal/pycore_compile.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCompile_MaybeAddStaticAttributeToClass' filepath='./Include/internal/pycore_compile.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-681'/> + <function-decl name='_PyCompile_MaybeAddStaticAttributeToClass' filepath='./Include/internal/pycore_compile.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-683'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_GetRefType' filepath='./Include/internal/pycore_compile.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_GetRefType' filepath='./Include/internal/pycore_compile.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_LookupCellvar' filepath='./Include/internal/pycore_compile.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_LookupCellvar' filepath='./Include/internal/pycore_compile.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_ResolveNameop' filepath='./Include/internal/pycore_compile.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_ResolveNameop' filepath='./Include/internal/pycore_compile.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1647'/> + <parameter type-id='type-id-1648'/> <parameter type-id='type-id-8'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_IsInteractiveTopLevel' filepath='./Include/internal/pycore_compile.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_IsInteractiveTopLevel' filepath='./Include/internal/pycore_compile.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_IsInInlinedComp' filepath='./Include/internal/pycore_compile.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_IsInInlinedComp' filepath='./Include/internal/pycore_compile.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_ScopeType' filepath='./Include/internal/pycore_compile.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_ScopeType' filepath='./Include/internal/pycore_compile.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_OptimizationLevel' filepath='./Include/internal/pycore_compile.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_OptimizationLevel' filepath='./Include/internal/pycore_compile.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_LookupArg' filepath='./Include/internal/pycore_compile.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-345'/> + <function-decl name='_PyCompile_LookupArg' filepath='./Include/internal/pycore_compile.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-347'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_Qualname' filepath='./Include/internal/pycore_compile.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_Qualname' filepath='./Include/internal/pycore_compile.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCompile_Metadata' filepath='./Include/internal/pycore_compile.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <return type-id='type-id-1644'/> + <function-decl name='_PyCompile_Metadata' filepath='./Include/internal/pycore_compile.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <return type-id='type-id-1645'/> </function-decl> - <function-decl name='_PyCompile_StaticAttributesAsTuple' filepath='./Include/internal/pycore_compile.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_StaticAttributesAsTuple' filepath='./Include/internal/pycore_compile.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCompile_Symtable' filepath='./Include/internal/pycore_compile.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <return type-id='type-id-210'/> + <function-decl name='_PyCompile_Symtable' filepath='./Include/internal/pycore_compile.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <return type-id='type-id-214'/> </function-decl> - <function-decl name='_PyCompile_SymtableEntry' filepath='./Include/internal/pycore_compile.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <return type-id='type-id-1642'/> + <function-decl name='_PyCompile_SymtableEntry' filepath='./Include/internal/pycore_compile.h' line='161' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <return type-id='type-id-1643'/> </function-decl> - <function-decl name='_PyCompile_TweakInlinedComprehensionScopes' filepath='./Include/internal/pycore_compile.h' line='180' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1555'/> - <parameter type-id='type-id-1642'/> - <parameter type-id='type-id-1646'/> + <function-decl name='_PyCompile_TweakInlinedComprehensionScopes' filepath='./Include/internal/pycore_compile.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1556'/> + <parameter type-id='type-id-1643'/> + <parameter type-id='type-id-1647'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_RevertInlinedComprehensionScopes' filepath='./Include/internal/pycore_compile.h' line='183' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1555'/> - <parameter type-id='type-id-1646'/> + <function-decl name='_PyCompile_RevertInlinedComprehensionScopes' filepath='./Include/internal/pycore_compile.h' line='184' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1556'/> + <parameter type-id='type-id-1647'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_AddDeferredAnnotation' filepath='./Include/internal/pycore_compile.h' line='185' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-632'/> + <function-decl name='_PyCompile_AddDeferredAnnotation' filepath='./Include/internal/pycore_compile.h' line='186' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-634'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_EnterConditionalBlock' filepath='./Include/internal/pycore_compile.h' line='187' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_EnterConditionalBlock' filepath='./Include/internal/pycore_compile.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyCompile_LeaveConditionalBlock' filepath='./Include/internal/pycore_compile.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_LeaveConditionalBlock' filepath='./Include/internal/pycore_compile.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyCompile_OptimizeAndAssemble' filepath='./Include/internal/pycore_compile.h' line='198' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCompile_OptimizeAndAssemble' filepath='./Include/internal/pycore_compile.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-345'/> + <return type-id='type-id-347'/> </function-decl> - <function-decl name='_PyCompile_DictAddObj' filepath='./Include/internal/pycore_compile.h' line='200' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyCompile_DictAddObj' filepath='./Include/internal/pycore_compile.h' line='201' 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-7'/> </function-decl> - <function-decl name='_PyCompile_Error' filepath='./Include/internal/pycore_compile.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1555'/> + <function-decl name='_PyCompile_Error' filepath='./Include/internal/pycore_compile.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1556'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_Warn' filepath='./Include/internal/pycore_compile.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1555'/> + <function-decl name='_PyCompile_Warn' filepath='./Include/internal/pycore_compile.h' line='203' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1556'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_CleanDoc' mangled-name='_PyCompile_CleanDoc' filepath='./Include/internal/pycore_compile.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CleanDoc'> + <function-decl name='_PyCompile_CleanDoc' mangled-name='_PyCompile_CleanDoc' filepath='./Include/internal/pycore_compile.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CleanDoc'> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyInstructionSequence_UseLabel' filepath='./Include/internal/pycore_instruction_sequence.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> <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='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1555'/> + <parameter type-id='type-id-1556'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInstructionSequence_NewLabel' filepath='./Include/internal/pycore_instruction_sequence.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> - <return type-id='type-id-1623'/> + <parameter type-id='type-id-1563'/> + <return type-id='type-id-1624'/> </function-decl> <function-decl name='_PyInstructionSequence_InsertInstruction' filepath='./Include/internal/pycore_instruction_sequence.h' line='70' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1555'/> + <parameter type-id='type-id-1556'/> <return type-id='type-id-5'/> </function-decl> - <var-decl name='_PyOpcode_opcode_metadata' type-id='type-id-1612' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1078' column='1'/> - <var-decl name='_PyOpcode_macro_expansion' type-id='type-id-1610' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1327' column='1'/> - <var-decl name='_PyOpcode_OpName' type-id='type-id-1607' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1518' column='1'/> - <var-decl name='_PyOpcode_Caches' type-id='type-id-1615' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1762' column='1'/> - <var-decl name='_PyOpcode_Deopt' type-id='type-id-1615' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1787' column='1'/> - <var-decl name='_PyOpcode_PseudoTargets' type-id='type-id-1614' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2085' column='1'/> + <var-decl name='_PyOpcode_opcode_metadata' type-id='type-id-1613' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1078' column='1'/> + <var-decl name='_PyOpcode_macro_expansion' type-id='type-id-1611' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1327' column='1'/> + <var-decl name='_PyOpcode_OpName' type-id='type-id-1608' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1518' column='1'/> + <var-decl name='_PyOpcode_Caches' type-id='type-id-1616' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1762' column='1'/> + <var-decl name='_PyOpcode_Deopt' type-id='type-id-1616' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1787' column='1'/> + <var-decl name='_PyOpcode_PseudoTargets' type-id='type-id-1615' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='2085' column='1'/> <function-decl name='_PyST_GetSymbol' filepath='./Include/internal/pycore_symtable.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1642'/> + <parameter type-id='type-id-1643'/> <parameter type-id='type-id-6'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </function-decl> <function-decl name='_PyST_GetScope' filepath='./Include/internal/pycore_symtable.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1642'/> + <parameter type-id='type-id-1643'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyST_IsFunctionLike' filepath='./Include/internal/pycore_symtable.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1642'/> + <parameter type-id='type-id-1643'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PySymtable_Lookup' filepath='./Include/internal/pycore_symtable.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-210'/> - <parameter type-id='type-id-35'/> - <return type-id='type-id-1642'/> + <parameter type-id='type-id-214'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-1643'/> </function-decl> <function-decl name='_PySymtable_LookupOptional' 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-35'/> - <parameter type-id='type-id-1643'/> + <parameter type-id='type-id-214'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-1644'/> <return type-id='type-id-5'/> </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-1621' size-in-bits='6720' id='type-id-1649'> - <subrange length='21' type-id='type-id-2' id='type-id-927'/> + <array-type-def dimensions='1' type-id='type-id-1622' size-in-bits='6720' id='type-id-1650'> + <subrange length='21' type-id='type-id-2' id='type-id-929'/> </array-type-def> - <class-decl name='_PyCfgBuilder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1650'/> - <typedef-decl name='instr_sequence' type-id='type-id-1559' filepath='Python/compile.c' line='47' column='1' id='type-id-1651'/> - <typedef-decl name='cfg_builder' type-id='type-id-1650' filepath='Python/compile.c' line='48' column='1' id='type-id-1652'/> - <class-decl name='compiler_unit' size-in-bits='8192' is-struct='yes' visibility='default' filepath='Python/compile.c' line='55' column='1' id='type-id-1653'> + <class-decl name='_PyCfgBuilder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1651'/> + <typedef-decl name='instr_sequence' type-id='type-id-1560' filepath='Python/compile.c' line='47' column='1' id='type-id-1652'/> + <typedef-decl name='cfg_builder' type-id='type-id-1651' filepath='Python/compile.c' line='48' column='1' id='type-id-1653'/> + <class-decl name='compiler_unit' size-in-bits='8192' is-struct='yes' visibility='default' filepath='Python/compile.c' line='55' column='1' id='type-id-1654'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='u_ste' type-id='type-id-1642' visibility='default' filepath='Python/compile.c' line='56' column='1'/> + <var-decl name='u_ste' type-id='type-id-1643' visibility='default' filepath='Python/compile.c' line='56' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='u_scope_type' type-id='type-id-5' visibility='default' filepath='Python/compile.c' line='58' column='1'/> @@ -26614,13 +26673,13 @@ <var-decl name='u_conditional_annotation_indices' type-id='type-id-6' visibility='default' filepath='Python/compile.c' line='63' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='u_next_conditional_annotation_index' type-id='type-id-184' visibility='default' filepath='Python/compile.c' line='64' column='1'/> + <var-decl name='u_next_conditional_annotation_index' type-id='type-id-188' visibility='default' filepath='Python/compile.c' line='64' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='u_instr_sequence' type-id='type-id-1654' visibility='default' filepath='Python/compile.c' line='66' column='1'/> + <var-decl name='u_instr_sequence' type-id='type-id-1655' visibility='default' filepath='Python/compile.c' line='66' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='u_stashed_instr_sequence' type-id='type-id-1654' visibility='default' filepath='Python/compile.c' line='67' column='1'/> + <var-decl name='u_stashed_instr_sequence' type-id='type-id-1655' visibility='default' filepath='Python/compile.c' line='67' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> <var-decl name='u_nfblocks' type-id='type-id-5' visibility='default' filepath='Python/compile.c' line='69' column='1'/> @@ -26632,58 +26691,59 @@ <var-decl name='u_in_conditional_block' type-id='type-id-5' visibility='default' filepath='Python/compile.c' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='u_fblock' type-id='type-id-1649' visibility='default' filepath='Python/compile.c' line='73' column='1'/> + <var-decl name='u_fblock' type-id='type-id-1650' visibility='default' filepath='Python/compile.c' line='73' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='7424'> - <var-decl name='u_metadata' type-id='type-id-1616' visibility='default' filepath='Python/compile.c' line='75' column='1'/> + <var-decl name='u_metadata' type-id='type-id-1617' visibility='default' filepath='Python/compile.c' line='75' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-1650' size-in-bits='64' id='type-id-1655'/> - <pointer-type-def type-id='type-id-1652' size-in-bits='64' id='type-id-1656'/> - <pointer-type-def type-id='type-id-1653' size-in-bits='64' id='type-id-1606'/> - <pointer-type-def type-id='type-id-1651' size-in-bits='64' id='type-id-1654'/> - <class-decl name='_PyCfgBuilder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1650'/> + <pointer-type-def type-id='type-id-1651' size-in-bits='64' id='type-id-1656'/> + <pointer-type-def type-id='type-id-1653' size-in-bits='64' id='type-id-1657'/> + <pointer-type-def type-id='type-id-1654' size-in-bits='64' id='type-id-1607'/> + <pointer-type-def type-id='type-id-1652' size-in-bits='64' id='type-id-1655'/> + <class-decl name='_PyCfgBuilder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1651'/> <function-decl name='_PyCode_GetFreevars' filepath='./Include/internal/pycore_code.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-347'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyAST_Preprocess' filepath='./Include/internal/pycore_compile.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-646'/> - <parameter type-id='type-id-1566'/> + <parameter type-id='type-id-648'/> + <parameter type-id='type-id-1567'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> <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='_PyCodegen_AddReturnAtEnd' filepath='./Include/internal/pycore_compile.h' line='190' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> + <function-decl name='_PyCodegen_AddReturnAtEnd' filepath='./Include/internal/pycore_compile.h' line='191' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCodegen_EnterAnonymousScope' filepath='./Include/internal/pycore_compile.h' line='191' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-647'/> + <function-decl name='_PyCodegen_EnterAnonymousScope' filepath='./Include/internal/pycore_compile.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-649'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCodegen_Expression' filepath='./Include/internal/pycore_compile.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-681'/> + <function-decl name='_PyCodegen_Expression' filepath='./Include/internal/pycore_compile.h' line='193' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-683'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCodegen_Module' filepath='./Include/internal/pycore_compile.h' line='193' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1648'/> - <parameter type-id='type-id-1555'/> - <parameter type-id='type-id-679'/> - <parameter type-id='type-id-344'/> + <function-decl name='_PyCodegen_Module' filepath='./Include/internal/pycore_compile.h' line='194' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1649'/> + <parameter type-id='type-id-1556'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-346'/> <return type-id='type-id-5'/> </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-1655'/> + <parameter type-id='type-id-1656'/> <return type-id='type-id-3'/> </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-1655'/> + <parameter type-id='type-id-1656'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> @@ -26692,44 +26752,44 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCfg_FromInstructionSequence' filepath='./Include/internal/pycore_flowgraph.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> - <return type-id='type-id-1655'/> + <parameter type-id='type-id-1563'/> + <return type-id='type-id-1656'/> </function-decl> <function-decl name='_PyCfg_OptimizedCfgToInstructionSequence' filepath='./Include/internal/pycore_flowgraph.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1655'/> - <parameter type-id='type-id-1644'/> + <parameter type-id='type-id-1656'/> + <parameter type-id='type-id-1645'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-183'/> + <parameter type-id='type-id-183'/> + <parameter type-id='type-id-1563'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyAssemble_MakeCodeObject' filepath='./Include/internal/pycore_flowgraph.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1644'/> + <parameter type-id='type-id-1645'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-6'/> - <return type-id='type-id-345'/> + <return type-id='type-id-347'/> </function-decl> <function-decl name='_PyInstructionSequence_New' mangled-name='_PyInstructionSequence_New' filepath='./Include/internal/pycore_instruction_sequence.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInstructionSequence_New'> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyInstructionSequence_SetAnnotationsCode' filepath='./Include/internal/pycore_instruction_sequence.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> + <parameter type-id='type-id-1563'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInstructionSequence_AddNested' filepath='./Include/internal/pycore_instruction_sequence.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> + <parameter type-id='type-id-1563'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyInstructionSequence_Fini' filepath='./Include/internal/pycore_instruction_sequence.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-1563'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_RaiseSyntaxError' filepath='./Include/internal/pycore_pyerrors.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -26742,98 +26802,98 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySymtable_Build' filepath='./Include/internal/pycore_symtable.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-646'/> + <parameter type-id='type-id-648'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-1638'/> - <return type-id='type-id-210'/> + <parameter type-id='type-id-1639'/> + <return type-id='type-id-214'/> </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'/> + <parameter type-id='type-id-214'/> <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-6'/> - <parameter type-id='type-id-1642'/> + <parameter type-id='type-id-1643'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyFuture_FromAST' filepath='./Include/internal/pycore_symtable.h' line='193' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-646'/> + <parameter type-id='type-id-648'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-1638'/> + <parameter type-id='type-id-1639'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_CodeGen' mangled-name='_PyCompile_CodeGen' filepath='Python/compile.c' line='1598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CodeGen'> - <parameter type-id='type-id-6' name='ast' filepath='Python/compile.c' line='1598' column='1'/> - <parameter type-id='type-id-6' name='filename' filepath='Python/compile.c' line='1598' column='1'/> - <parameter type-id='type-id-209' name='pflags' filepath='Python/compile.c' line='1598' column='1'/> - <parameter type-id='type-id-5' name='optimize' filepath='Python/compile.c' line='1599' column='1'/> - <parameter type-id='type-id-5' name='compile_mode' filepath='Python/compile.c' line='1599' column='1'/> + <function-decl name='_PyCompile_CodeGen' mangled-name='_PyCompile_CodeGen' filepath='Python/compile.c' line='1608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CodeGen'> + <parameter type-id='type-id-6' name='ast' filepath='Python/compile.c' line='1608' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/compile.c' line='1608' column='1'/> + <parameter type-id='type-id-213' name='pflags' filepath='Python/compile.c' line='1608' column='1'/> + <parameter type-id='type-id-5' name='optimize' filepath='Python/compile.c' line='1609' column='1'/> + <parameter type-id='type-id-5' name='compile_mode' filepath='Python/compile.c' line='1609' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyCfg_JumpLabelsToTargets' filepath='Python/compile.c' line='1670' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1656'/> + <function-decl name='_PyCfg_JumpLabelsToTargets' filepath='Python/compile.c' line='1680' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1657'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_Assemble' mangled-name='_PyCompile_Assemble' filepath='Python/compile.c' line='1673' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_Assemble'> - <parameter type-id='type-id-1644' name='umd' filepath='Python/compile.c' line='1673' column='1'/> - <parameter type-id='type-id-6' name='filename' filepath='Python/compile.c' line='1673' column='1'/> - <parameter type-id='type-id-6' name='seq' filepath='Python/compile.c' line='1674' column='1'/> - <return type-id='type-id-345'/> + <function-decl name='_PyCompile_Assemble' mangled-name='_PyCompile_Assemble' filepath='Python/compile.c' line='1683' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_Assemble'> + <parameter type-id='type-id-1645' name='umd' filepath='Python/compile.c' line='1683' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/compile.c' line='1683' column='1'/> + <parameter type-id='type-id-6' name='seq' filepath='Python/compile.c' line='1684' column='1'/> + <return type-id='type-id-347'/> </function-decl> - <function-decl name='PyCode_Optimize' mangled-name='PyCode_Optimize' filepath='Python/compile.c' line='1727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Optimize'> - <parameter type-id='type-id-6' name='code' filepath='Python/compile.c' line='1727' column='1'/> - <parameter type-id='type-id-6' name='_unused_consts' filepath='Python/compile.c' line='1727' column='1'/> - <parameter type-id='type-id-6' name='_unused_names' filepath='Python/compile.c' line='1728' column='1'/> - <parameter type-id='type-id-6' name='_unused_lnotab_obj' filepath='Python/compile.c' line='1728' column='1'/> + <function-decl name='PyCode_Optimize' mangled-name='PyCode_Optimize' filepath='Python/compile.c' line='1737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Optimize'> + <parameter type-id='type-id-6' name='code' filepath='Python/compile.c' line='1737' column='1'/> + <parameter type-id='type-id-6' name='_unused_consts' filepath='Python/compile.c' line='1737' column='1'/> + <parameter type-id='type-id-6' name='_unused_names' filepath='Python/compile.c' line='1738' column='1'/> + <parameter type-id='type-id-6' name='_unused_lnotab_obj' filepath='Python/compile.c' line='1738' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/context.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-1293' size-in-bits='64' id='type-id-1657'/> + <pointer-type-def type-id='type-id-1294' size-in-bits='64' id='type-id-1658'/> <var-decl name='PyContext_Type' type-id='type-id-271' 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-271' 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-271' 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-271' visibility='default' filepath='./Include/internal/pycore_context.h' line='10' column='1'/> <function-decl name='_PyHamt_New' filepath='./Include/internal/pycore_hamt.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-1657'/> + <return type-id='type-id-1658'/> </function-decl> <function-decl name='_PyHamt_Assoc' filepath='./Include/internal/pycore_hamt.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> - <return type-id='type-id-1657'/> + <return type-id='type-id-1658'/> </function-decl> <function-decl name='_PyHamt_Without' filepath='./Include/internal/pycore_hamt.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <parameter type-id='type-id-6'/> - <return type-id='type-id-1657'/> + <return type-id='type-id-1658'/> </function-decl> <function-decl name='_PyHamt_Find' filepath='./Include/internal/pycore_hamt.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyHamt_Eq' filepath='./Include/internal/pycore_hamt.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> + <parameter type-id='type-id-1658'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyHamt_Len' filepath='./Include/internal/pycore_hamt.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <return type-id='type-id-7'/> </function-decl> <function-decl name='_PyHamt_NewIterKeys' filepath='./Include/internal/pycore_hamt.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyHamt_NewIterValues' filepath='./Include/internal/pycore_hamt.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyHamt_NewIterItems' filepath='./Include/internal/pycore_hamt.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1657'/> + <parameter type-id='type-id-1658'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyContext_NewHamtForTests' mangled-name='_PyContext_NewHamtForTests' filepath='Python/context.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyContext_NewHamtForTests'> @@ -26847,7 +26907,7 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyContext_AddWatcher' mangled-name='PyContext_AddWatcher' filepath='Python/context.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_AddWatcher'> - <parameter type-id='type-id-809' name='callback' filepath='Python/context.c' line='146' column='1'/> + <parameter type-id='type-id-811' name='callback' filepath='Python/context.c' line='146' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyContext_ClearWatcher' mangled-name='PyContext_ClearWatcher' filepath='Python/context.c' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_ClearWatcher'> @@ -26874,56 +26934,67 @@ </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-1658'/> - <class-decl name='PyCriticalSection2' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1659'/> - <typedef-decl name='PyCriticalSection' type-id='type-id-1658' filepath='./Include/cpython/critical_section.h' line='70' column='1' id='type-id-1660'/> - <typedef-decl name='PyCriticalSection2' type-id='type-id-1659' filepath='./Include/cpython/critical_section.h' line='71' column='1' id='type-id-1661'/> - <pointer-type-def type-id='type-id-1660' size-in-bits='64' id='type-id-1662'/> + <class-decl name='PyCriticalSection' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1659'/> + <class-decl name='PyCriticalSection2' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1660'/> + <typedef-decl name='PyCriticalSection' type-id='type-id-1659' filepath='./Include/cpython/critical_section.h' line='70' column='1' id='type-id-1661'/> + <typedef-decl name='PyCriticalSection2' type-id='type-id-1660' filepath='./Include/cpython/critical_section.h' line='71' column='1' id='type-id-1662'/> <pointer-type-def type-id='type-id-1661' size-in-bits='64' id='type-id-1663'/> - <class-decl name='PyCriticalSection' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1658'/> - <class-decl name='PyCriticalSection2' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1659'/> + <pointer-type-def type-id='type-id-1662' size-in-bits='64' id='type-id-1664'/> + <class-decl name='PyCriticalSection' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1659'/> + <class-decl name='PyCriticalSection2' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1660'/> <function-decl name='_PyCriticalSection_BeginSlow' mangled-name='_PyCriticalSection_BeginSlow' filepath='Python/critical_section.c' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_BeginSlow'> - <parameter type-id='type-id-1662' name='c' filepath='Python/critical_section.c' line='20' column='1'/> - <parameter type-id='type-id-26' name='m' filepath='Python/critical_section.c' line='20' column='1'/> + <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='20' column='1'/> + <parameter type-id='type-id-32' name='m' filepath='Python/critical_section.c' line='20' 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='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection2_BeginSlow'> + <parameter type-id='type-id-1664' name='c' filepath='Python/critical_section.c' line='56' column='1'/> + <parameter type-id='type-id-32' name='m1' filepath='Python/critical_section.c' line='56' column='1'/> + <parameter type-id='type-id-32' name='m2' filepath='Python/critical_section.c' line='56' column='1'/> + <parameter type-id='type-id-5' name='is_m1_locked' filepath='Python/critical_section.c' line='57' 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='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_SuspendAll'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/critical_section.c' line='79' 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='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection2_BeginSlow'> - <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='43' column='1'/> - <parameter type-id='type-id-26' name='m1' filepath='Python/critical_section.c' line='43' column='1'/> - <parameter type-id='type-id-26' name='m2' filepath='Python/critical_section.c' line='43' column='1'/> - <parameter type-id='type-id-5' name='is_m1_locked' filepath='Python/critical_section.c' line='44' column='1'/> + <function-decl name='_PyCriticalSection_Resume' mangled-name='_PyCriticalSection_Resume' filepath='Python/critical_section.c' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_Resume'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/critical_section.c' line='103' 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='66' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_SuspendAll'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/critical_section.c' line='66' column='1'/> + <function-decl name='PyCriticalSection_Begin' mangled-name='PyCriticalSection_Begin' filepath='Python/critical_section.c' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_Begin'> + <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='139' column='1'/> + <parameter type-id='type-id-6' name='op' filepath='Python/critical_section.c' line='139' 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='90' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_Resume'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/critical_section.c' line='90' column='1'/> + <function-decl name='PyCriticalSection_BeginMutex' mangled-name='PyCriticalSection_BeginMutex' filepath='Python/critical_section.c' line='148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_BeginMutex'> + <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='148' column='1'/> + <parameter type-id='type-id-32' name='m' filepath='Python/critical_section.c' line='148' 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='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_Begin'> - <parameter type-id='type-id-1662' name='c' filepath='Python/critical_section.c' line='126' column='1'/> - <parameter type-id='type-id-6' name='op' filepath='Python/critical_section.c' line='126' column='1'/> + <function-decl name='PyCriticalSection_End' mangled-name='PyCriticalSection_End' filepath='Python/critical_section.c' line='157' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_End'> + <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='157' 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='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_End'> - <parameter type-id='type-id-1662' name='c' filepath='Python/critical_section.c' line='135' column='1'/> + <function-decl name='PyCriticalSection2_Begin' mangled-name='PyCriticalSection2_Begin' filepath='Python/critical_section.c' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_Begin'> + <parameter type-id='type-id-1664' name='c' filepath='Python/critical_section.c' line='166' column='1'/> + <parameter type-id='type-id-6' name='a' filepath='Python/critical_section.c' line='166' column='1'/> + <parameter type-id='type-id-6' name='b' filepath='Python/critical_section.c' line='166' 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='144' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_Begin'> - <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='144' column='1'/> - <parameter type-id='type-id-6' name='a' filepath='Python/critical_section.c' line='144' column='1'/> - <parameter type-id='type-id-6' name='b' filepath='Python/critical_section.c' line='144' column='1'/> + <function-decl name='PyCriticalSection2_BeginMutex' mangled-name='PyCriticalSection2_BeginMutex' filepath='Python/critical_section.c' line='175' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_BeginMutex'> + <parameter type-id='type-id-1664' name='c' filepath='Python/critical_section.c' line='175' column='1'/> + <parameter type-id='type-id-32' name='m1' filepath='Python/critical_section.c' line='175' column='1'/> + <parameter type-id='type-id-32' name='m2' filepath='Python/critical_section.c' line='175' 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='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_End'> - <parameter type-id='type-id-1663' name='c' filepath='Python/critical_section.c' line='153' column='1'/> + <function-decl name='PyCriticalSection2_End' mangled-name='PyCriticalSection2_End' filepath='Python/critical_section.c' line='184' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_End'> + <parameter type-id='type-id-1664' name='c' filepath='Python/critical_section.c' line='184' 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-1664' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='41' column='1' id='type-id-1665'> + <class-decl name='PyInterpreterConfig' size-in-bits='224' is-struct='yes' naming-typedef-id='type-id-1665' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='41' column='1' id='type-id-1666'> <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='43' column='1'/> </data-member> @@ -26946,9 +27017,9 @@ <var-decl name='gil' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='49' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyInterpreterConfig' type-id='type-id-1665' filepath='./Include/cpython/pylifecycle.h' line='50' column='1' id='type-id-1664'/> - <typedef-decl name='_Py_add_pending_call_result' type-id='type-id-5' filepath='./Include/internal/pycore_ceval.h' line='54' column='1' id='type-id-1666'/> - <class-decl name='_PyBytes_data_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1667' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='177' column='1' id='type-id-1668'> + <typedef-decl name='PyInterpreterConfig' type-id='type-id-1666' filepath='./Include/cpython/pylifecycle.h' line='50' column='1' id='type-id-1665'/> + <typedef-decl name='_Py_add_pending_call_result' type-id='type-id-5' filepath='./Include/internal/pycore_ceval.h' line='56' column='1' id='type-id-1667'/> + <class-decl name='_PyBytes_data_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1668' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='177' column='1' id='type-id-1669'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='bytes' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='178' column='1'/> </data-member> @@ -26956,10 +27027,10 @@ <var-decl name='len' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='179' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyBytes_data_t' type-id='type-id-1668' filepath='./Include/internal/pycore_crossinterp.h' line='180' column='1' id='type-id-1667'/> - <class-decl name='_excinfo' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='295' column='1' id='type-id-1669'> + <typedef-decl name='_PyBytes_data_t' type-id='type-id-1669' filepath='./Include/internal/pycore_crossinterp.h' line='180' column='1' id='type-id-1668'/> + <class-decl name='_excinfo' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='295' column='1' id='type-id-1670'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='type' type-id='type-id-1670' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='301' column='1'/> + <var-decl name='type' type-id='type-id-1671' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='301' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='msg' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='302' column='1'/> @@ -26968,7 +27039,7 @@ <var-decl name='errdisplay' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='303' 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='296' column='1' id='type-id-1670'> + <class-decl name='_excinfo_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='296' column='1' id='type-id-1671'> <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='297' column='1'/> </data-member> @@ -26982,9 +27053,9 @@ <var-decl name='module' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='300' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXI_excinfo' type-id='type-id-1669' filepath='./Include/internal/pycore_crossinterp.h' line='304' column='1' id='type-id-1671'/> - <enum-decl name='error_code' filepath='./Include/internal/pycore_crossinterp.h' line='312' column='1' id='type-id-1672'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='_PyXI_excinfo' type-id='type-id-1670' filepath='./Include/internal/pycore_crossinterp.h' line='304' column='1' id='type-id-1672'/> + <enum-decl name='error_code' filepath='./Include/internal/pycore_crossinterp.h' line='312' column='1' id='type-id-1673'> + <underlying-type type-id='type-id-43'/> <enumerator name='_PyXI_ERR_NO_ERROR' value='0'/> <enumerator name='_PyXI_ERR_UNCAUGHT_EXCEPTION' value='-1'/> <enumerator name='_PyXI_ERR_OTHER' value='-2'/> @@ -26996,10 +27067,10 @@ <enumerator name='_PyXI_ERR_EXC_PROPAGATION_FAILURE' value='-8'/> <enumerator name='_PyXI_ERR_NOT_SHAREABLE' value='-9'/> </enum-decl> - <typedef-decl name='_PyXI_errcode' type-id='type-id-1672' filepath='./Include/internal/pycore_crossinterp.h' line='323' column='1' id='type-id-1673'/> - <typedef-decl name='_PyXI_failure' type-id='type-id-1674' filepath='./Include/internal/pycore_crossinterp.h' line='325' column='1' id='type-id-1675'/> - <typedef-decl name='_PyXI_session' type-id='type-id-1676' filepath='./Include/internal/pycore_crossinterp.h' line='351' column='1' id='type-id-1677'/> - <class-decl name='_PyXI_session_result' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1678' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='356' column='1' id='type-id-1679'> + <typedef-decl name='_PyXI_errcode' type-id='type-id-1673' filepath='./Include/internal/pycore_crossinterp.h' line='323' column='1' id='type-id-1674'/> + <typedef-decl name='_PyXI_failure' type-id='type-id-1675' filepath='./Include/internal/pycore_crossinterp.h' line='325' column='1' id='type-id-1676'/> + <typedef-decl name='_PyXI_session' type-id='type-id-1677' filepath='./Include/internal/pycore_crossinterp.h' line='351' column='1' id='type-id-1678'/> + <class-decl name='_PyXI_session_result' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1679' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='356' column='1' id='type-id-1680'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='preserved' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='357' column='1'/> </data-member> @@ -27007,13 +27078,13 @@ <var-decl name='excinfo' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='358' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='errcode' type-id='type-id-1673' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='359' column='1'/> + <var-decl name='errcode' type-id='type-id-1674' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='359' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyXI_session_result' type-id='type-id-1679' filepath='./Include/internal/pycore_crossinterp.h' line='360' column='1' id='type-id-1678'/> - <class-decl name='xi_failure' size-in-bits='192' is-struct='yes' visibility='default' filepath='Python/crossinterp.c' line='1740' column='1' id='type-id-1674'> + <typedef-decl name='_PyXI_session_result' type-id='type-id-1680' filepath='./Include/internal/pycore_crossinterp.h' line='360' column='1' id='type-id-1679'/> + <class-decl name='xi_failure' size-in-bits='192' is-struct='yes' visibility='default' filepath='Python/crossinterp.c' line='1740' column='1' id='type-id-1675'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='code' type-id='type-id-1673' visibility='default' filepath='Python/crossinterp.c' line='1742' column='1'/> + <var-decl name='code' type-id='type-id-1674' visibility='default' filepath='Python/crossinterp.c' line='1742' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='msg' type-id='type-id-4' visibility='default' filepath='Python/crossinterp.c' line='1744' column='1'/> @@ -27022,68 +27093,68 @@ <var-decl name='msg_owned' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='1745' column='1'/> </data-member> </class-decl> - <class-decl name='xi_session' size-in-bits='384' is-struct='yes' visibility='default' filepath='Python/crossinterp.c' line='2454' column='1' id='type-id-1676'> + <class-decl name='xi_session' size-in-bits='384' is-struct='yes' visibility='default' filepath='Python/crossinterp.c' line='2463' column='1' id='type-id-1677'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='status' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2457' column='1'/> + <var-decl name='status' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2466' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='switched' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2458' column='1'/> + <var-decl name='switched' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2467' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='prev_tstate' type-id='type-id-31' visibility='default' filepath='Python/crossinterp.c' line='2464' column='1'/> + <var-decl name='prev_tstate' type-id='type-id-37' visibility='default' filepath='Python/crossinterp.c' line='2473' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='init_tstate' type-id='type-id-31' visibility='default' filepath='Python/crossinterp.c' line='2467' column='1'/> + <var-decl name='init_tstate' type-id='type-id-37' visibility='default' filepath='Python/crossinterp.c' line='2476' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='own_init_tstate' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2469' column='1'/> + <var-decl name='own_init_tstate' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2478' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='running' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2476' column='1'/> + <var-decl name='running' type-id='type-id-5' visibility='default' filepath='Python/crossinterp.c' line='2485' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='main_ns' type-id='type-id-6' visibility='default' filepath='Python/crossinterp.c' line='2480' column='1'/> + <var-decl name='main_ns' type-id='type-id-6' visibility='default' filepath='Python/crossinterp.c' line='2489' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_preserved' type-id='type-id-6' visibility='default' filepath='Python/crossinterp.c' line='2485' column='1'/> + <var-decl name='_preserved' type-id='type-id-6' visibility='default' filepath='Python/crossinterp.c' line='2494' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-1664' size-in-bits='64' id='type-id-1680'/> - <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-1681'/> - <pointer-type-def type-id='type-id-1667' size-in-bits='64' id='type-id-1682'/> - <pointer-type-def type-id='type-id-1671' size-in-bits='64' id='type-id-1683'/> - <pointer-type-def type-id='type-id-1675' size-in-bits='64' id='type-id-1684'/> - <pointer-type-def type-id='type-id-1677' size-in-bits='64' id='type-id-1685'/> + <pointer-type-def type-id='type-id-1665' size-in-bits='64' id='type-id-1681'/> + <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-1682'/> + <pointer-type-def type-id='type-id-1668' size-in-bits='64' id='type-id-1683'/> + <pointer-type-def type-id='type-id-1672' size-in-bits='64' id='type-id-1684'/> + <pointer-type-def type-id='type-id-1676' size-in-bits='64' id='type-id-1685'/> <pointer-type-def type-id='type-id-1678' size-in-bits='64' id='type-id-1686'/> - <qualified-type-def type-id='type-id-1664' const='yes' id='type-id-1687'/> - <pointer-type-def type-id='type-id-1687' size-in-bits='64' id='type-id-1688'/> - <pointer-type-def type-id='type-id-184' size-in-bits='64' id='type-id-170'/> + <pointer-type-def type-id='type-id-1679' size-in-bits='64' id='type-id-1687'/> + <qualified-type-def type-id='type-id-1665' const='yes' id='type-id-1688'/> + <pointer-type-def type-id='type-id-1688' size-in-bits='64' id='type-id-1689'/> + <pointer-type-def type-id='type-id-188' size-in-bits='64' id='type-id-176'/> <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-66'/> + <parameter type-id='type-id-72'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='Py_NewInterpreterFromConfig' mangled-name='Py_NewInterpreterFromConfig' filepath='./Include/cpython/pylifecycle.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreterFromConfig'> - <parameter type-id='type-id-1681'/> - <parameter type-id='type-id-1688'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1682'/> + <parameter type-id='type-id-1689'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='Py_CompileStringExFlags' mangled-name='Py_CompileStringExFlags' filepath='./Include/cpython/pythonrun.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringExFlags'> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <parameter type-id='type-id-5'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyEval_AddPendingCall' mangled-name='_PyEval_AddPendingCall' filepath='./Include/internal/pycore_ceval.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_AddPendingCall'> - <parameter type-id='type-id-33'/> - <parameter type-id='type-id-1235'/> - <parameter type-id='type-id-35'/> + <function-decl name='_PyEval_AddPendingCall' mangled-name='_PyEval_AddPendingCall' filepath='./Include/internal/pycore_ceval.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_AddPendingCall'> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-1237'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-1666'/> + <return type-id='type-id-1667'/> </function-decl> - <function-decl name='_PyEval_GetBuiltins' filepath='./Include/internal/pycore_ceval.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyEval_GetBuiltins' filepath='./Include/internal/pycore_ceval.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <return type-id='type-id-6'/> </function-decl> <var-decl name='PyExc_InterpreterError' type-id='type-id-6' mangled-name='PyExc_InterpreterError' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='18' column='1' elf-symbol-id='PyExc_InterpreterError'/> @@ -27094,48 +27165,48 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyErr_SetFromPyStatus' mangled-name='_PyErr_SetFromPyStatus' filepath='./Include/internal/pycore_initconfig.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetFromPyStatus'> - <parameter type-id='type-id-66'/> + <parameter type-id='type-id-72'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyInterpreterState_LookUpID' mangled-name='_PyInterpreterState_LookUpID' filepath='./Include/internal/pycore_interp.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_LookUpID'> - <parameter type-id='type-id-409'/> - <return type-id='type-id-33'/> + <parameter type-id='type-id-411'/> + <return type-id='type-id-39'/> </function-decl> <function-decl name='_PyInterpreterState_IsReady' mangled-name='_PyInterpreterState_IsReady' filepath='./Include/internal/pycore_interp.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IsReady'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInterpreterState_SetWhence' filepath='./Include/internal/pycore_interp.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <parameter type-id='type-id-184'/> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-188'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyModule_GetFilenameUTF8' filepath='./Include/internal/pycore_moduleobject.h' line='51' 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-24'/> <parameter type-id='type-id-7'/> <return type-id='type-id-7'/> </function-decl> <function-decl name='_PyErr_ChainExceptions1Tstate' filepath='./Include/internal/pycore_pyerrors.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyInterpreterState_SetRunningMain' mangled-name='_PyInterpreterState_SetRunningMain' filepath='./Include/internal/pycore_pystate.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetRunningMain'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInterpreterState_SetNotRunningMain' mangled-name='_PyInterpreterState_SetNotRunningMain' filepath='./Include/internal/pycore_pystate.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetNotRunningMain'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_SetInterpreterAlreadyRunning' mangled-name='_PyErr_SetInterpreterAlreadyRunning' filepath='./Include/internal/pycore_pystate.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetInterpreterAlreadyRunning'> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_NewBound' mangled-name='_PyThreadState_NewBound' filepath='./Include/internal/pycore_pystate.h' line='222' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_NewBound'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-31'/> + <return type-id='type-id-37'/> </function-decl> <function-decl name='_PyObject_SupportedAsScript' filepath='./Include/internal/pycore_pythonrun.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> @@ -27152,305 +27223,305 @@ <return type-id='type-id-6'/> </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-31'/> + <parameter type-id='type-id-37'/> <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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyInterpreterState_GetDict' mangled-name='PyInterpreterState_GetDict' filepath='./Include/pystate.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_GetDict'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-6'/> </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-33'/> - <return type-id='type-id-409'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-411'/> </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-31'/> + <parameter type-id='type-id-37'/> <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-31'/> + <parameter type-id='type-id-37'/> <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-31'/> - <return type-id='type-id-31'/> + <parameter type-id='type-id-37'/> + <return type-id='type-id-37'/> </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-31'/> - <return type-id='type-id-33'/> + <parameter type-id='type-id-37'/> + <return type-id='type-id-39'/> </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='_PyXIData_New' mangled-name='_PyXIData_New' filepath='Python/crossinterp.c' line='307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_New'> - <return type-id='type-id-1501'/> + <return type-id='type-id-1502'/> </function-decl> <function-decl name='_PyXIData_Free' mangled-name='_PyXIData_Free' filepath='Python/crossinterp.c' line='317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_Free'> - <parameter type-id='type-id-1501' name='xid' filepath='Python/crossinterp.c' line='317' column='1'/> + <parameter type-id='type-id-1502' name='xid' filepath='Python/crossinterp.c' line='317' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXIData_Init' mangled-name='_PyXIData_Init' filepath='Python/crossinterp.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_Init'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='355' column='1'/> - <parameter type-id='type-id-33' name='interp' filepath='Python/crossinterp.c' line='356' column='1'/> - <parameter type-id='type-id-35' name='shared' filepath='Python/crossinterp.c' line='357' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='355' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Python/crossinterp.c' line='356' column='1'/> + <parameter type-id='type-id-41' name='shared' filepath='Python/crossinterp.c' line='357' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='357' column='1'/> - <parameter type-id='type-id-1121' name='new_object' filepath='Python/crossinterp.c' line='358' column='1'/> + <parameter type-id='type-id-1123' name='new_object' filepath='Python/crossinterp.c' line='358' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXIData_InitWithSize' mangled-name='_PyXIData_InitWithSize' filepath='Python/crossinterp.c' line='379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_InitWithSize'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='379' column='1'/> - <parameter type-id='type-id-33' name='interp' filepath='Python/crossinterp.c' line='380' column='1'/> - <parameter type-id='type-id-1579' name='size' filepath='Python/crossinterp.c' line='381' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='379' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Python/crossinterp.c' line='380' column='1'/> + <parameter type-id='type-id-1580' name='size' filepath='Python/crossinterp.c' line='381' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='381' column='1'/> - <parameter type-id='type-id-1121' name='new_object' filepath='Python/crossinterp.c' line='382' column='1'/> + <parameter type-id='type-id-1123' name='new_object' filepath='Python/crossinterp.c' line='382' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyXIData_Clear' mangled-name='_PyXIData_Clear' filepath='Python/crossinterp.c' line='398' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_Clear'> - <parameter type-id='type-id-33' name='interp' filepath='Python/crossinterp.c' line='398' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='398' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Python/crossinterp.c' line='398' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='398' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyObject_CheckXIData' mangled-name='_PyObject_CheckXIData' filepath='Python/crossinterp.c' line='431' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CheckXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='431' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='431' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='431' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyObject_GetXIDataNoFallback' mangled-name='_PyObject_GetXIDataNoFallback' filepath='Python/crossinterp.c' line='524' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetXIDataNoFallback'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='524' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='524' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='525' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='525' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='525' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyObject_GetXIData' mangled-name='_PyObject_GetXIData' filepath='Python/crossinterp.c' line='531' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='531' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='531' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='532' column='1'/> - <parameter type-id='type-id-1123' name='fallback' filepath='Python/crossinterp.c' line='532' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='533' column='1'/> + <parameter type-id='type-id-1125' name='fallback' filepath='Python/crossinterp.c' line='532' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='533' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyPickle_LoadFromXIData' mangled-name='_PyPickle_LoadFromXIData' filepath='Python/crossinterp.c' line='724' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyPickle_LoadFromXIData'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='724' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='724' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyPickle_GetXIData' mangled-name='_PyPickle_GetXIData' filepath='Python/crossinterp.c' line='759' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyPickle_GetXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='759' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='759' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='759' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='759' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='759' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyMarshal_ReadObjectFromXIData' mangled-name='_PyMarshal_ReadObjectFromXIData' filepath='Python/crossinterp.c' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMarshal_ReadObjectFromXIData'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='801' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='801' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyMarshal_GetXIData' mangled-name='_PyMarshal_GetXIData' filepath='Python/crossinterp.c' line='818' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMarshal_GetXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='818' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='818' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='818' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='818' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='818' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCode_GetScriptXIData' mangled-name='_PyCode_GetScriptXIData' filepath='Python/crossinterp.c' line='958' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_GetScriptXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='958' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='958' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='959' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='959' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='959' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyCode_GetPureScriptXIData' mangled-name='_PyCode_GetPureScriptXIData' filepath='Python/crossinterp.c' line='965' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_GetPureScriptXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='965' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='965' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='966' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='966' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='966' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyXIData_NewObject' mangled-name='_PyXIData_NewObject' filepath='Python/crossinterp.c' line='975' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_NewObject'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='975' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='975' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyXIData_Release' mangled-name='_PyXIData_Release' filepath='Python/crossinterp.c' line='1025' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_Release'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='1025' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='1025' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyXIData_ReleaseAndRawFree' mangled-name='_PyXIData_ReleaseAndRawFree' filepath='Python/crossinterp.c' line='1031' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_ReleaseAndRawFree'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp.c' line='1031' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp.c' line='1031' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyXI_NewExcInfo' mangled-name='_PyXI_NewExcInfo' filepath='Python/crossinterp.c' line='1636' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewExcInfo'> <parameter type-id='type-id-6' name='exc' filepath='Python/crossinterp.c' line='1636' column='1'/> - <return type-id='type-id-1683'/> + <return type-id='type-id-1684'/> </function-decl> <function-decl name='_PyXI_FreeExcInfo' mangled-name='_PyXI_FreeExcInfo' filepath='Python/crossinterp.c' line='1663' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FreeExcInfo'> - <parameter type-id='type-id-1683' name='info' filepath='Python/crossinterp.c' line='1663' column='1'/> + <parameter type-id='type-id-1684' name='info' filepath='Python/crossinterp.c' line='1663' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXI_FormatExcInfo' mangled-name='_PyXI_FormatExcInfo' filepath='Python/crossinterp.c' line='1670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FormatExcInfo'> - <parameter type-id='type-id-1683' name='info' filepath='Python/crossinterp.c' line='1670' column='1'/> + <parameter type-id='type-id-1684' name='info' filepath='Python/crossinterp.c' line='1670' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyXI_ExcInfoAsObject' mangled-name='_PyXI_ExcInfoAsObject' filepath='Python/crossinterp.c' line='1676' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ExcInfoAsObject'> - <parameter type-id='type-id-1683' name='info' filepath='Python/crossinterp.c' line='1676' column='1'/> + <parameter type-id='type-id-1684' name='info' filepath='Python/crossinterp.c' line='1676' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyXI_NewFailure' mangled-name='_PyXI_NewFailure' filepath='Python/crossinterp.c' line='1767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewFailure'> - <return type-id='type-id-1684'/> + <return type-id='type-id-1685'/> </function-decl> <function-decl name='_PyXI_FreeFailure' mangled-name='_PyXI_FreeFailure' filepath='Python/crossinterp.c' line='1779' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FreeFailure'> - <parameter type-id='type-id-1684' name='failure' filepath='Python/crossinterp.c' line='1779' column='1'/> + <parameter type-id='type-id-1685' name='failure' filepath='Python/crossinterp.c' line='1779' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXI_GetFailureCode' mangled-name='_PyXI_GetFailureCode' filepath='Python/crossinterp.c' line='1786' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_GetFailureCode'> - <parameter type-id='type-id-1684' name='failure' filepath='Python/crossinterp.c' line='1786' column='1'/> - <return type-id='type-id-1673'/> + <parameter type-id='type-id-1685' name='failure' filepath='Python/crossinterp.c' line='1786' column='1'/> + <return type-id='type-id-1674'/> </function-decl> <function-decl name='_PyXI_InitFailureUTF8' mangled-name='_PyXI_InitFailureUTF8' filepath='Python/crossinterp.c' line='1795' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_InitFailureUTF8'> - <parameter type-id='type-id-1684' name='failure' filepath='Python/crossinterp.c' line='1795' column='1'/> - <parameter type-id='type-id-1673' name='code' filepath='Python/crossinterp.c' line='1796' column='1'/> + <parameter type-id='type-id-1685' name='failure' filepath='Python/crossinterp.c' line='1795' column='1'/> + <parameter type-id='type-id-1674' name='code' filepath='Python/crossinterp.c' line='1796' column='1'/> <parameter type-id='type-id-4' name='msg' filepath='Python/crossinterp.c' line='1796' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXI_InitFailure' mangled-name='_PyXI_InitFailure' filepath='Python/crossinterp.c' line='1806' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_InitFailure'> - <parameter type-id='type-id-1684' name='failure' filepath='Python/crossinterp.c' line='1806' column='1'/> - <parameter type-id='type-id-1673' name='code' filepath='Python/crossinterp.c' line='1806' column='1'/> + <parameter type-id='type-id-1685' name='failure' filepath='Python/crossinterp.c' line='1806' column='1'/> + <parameter type-id='type-id-1674' name='code' filepath='Python/crossinterp.c' line='1806' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp.c' line='1806' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyXI_NewSession' mangled-name='_PyXI_NewSession' filepath='Python/crossinterp.c' line='2489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewSession'> - <return type-id='type-id-1685'/> + <function-decl name='_PyXI_NewSession' mangled-name='_PyXI_NewSession' filepath='Python/crossinterp.c' line='2498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewSession'> + <return type-id='type-id-1686'/> </function-decl> - <function-decl name='_PyXI_FreeSession' mangled-name='_PyXI_FreeSession' filepath='Python/crossinterp.c' line='2500' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FreeSession'> - <parameter type-id='type-id-1685' name='session' filepath='Python/crossinterp.c' line='2500' column='1'/> + <function-decl name='_PyXI_FreeSession' mangled-name='_PyXI_FreeSession' filepath='Python/crossinterp.c' line='2509' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FreeSession'> + <parameter type-id='type-id-1686' name='session' filepath='Python/crossinterp.c' line='2509' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyXI_Enter' mangled-name='_PyXI_Enter' filepath='Python/crossinterp.c' line='2609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Enter'> - <parameter type-id='type-id-1685' name='session' filepath='Python/crossinterp.c' line='2609' column='1'/> - <parameter type-id='type-id-33' name='interp' filepath='Python/crossinterp.c' line='2610' column='1'/> - <parameter type-id='type-id-6' name='nsupdates' filepath='Python/crossinterp.c' line='2610' column='1'/> - <parameter type-id='type-id-1686' name='result' filepath='Python/crossinterp.c' line='2611' column='1'/> + <function-decl name='_PyXI_Enter' mangled-name='_PyXI_Enter' filepath='Python/crossinterp.c' line='2618' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Enter'> + <parameter type-id='type-id-1686' name='session' filepath='Python/crossinterp.c' line='2618' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Python/crossinterp.c' line='2619' column='1'/> + <parameter type-id='type-id-6' name='nsupdates' filepath='Python/crossinterp.c' line='2619' column='1'/> + <parameter type-id='type-id-1687' name='result' filepath='Python/crossinterp.c' line='2620' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyXI_Exit' mangled-name='_PyXI_Exit' filepath='Python/crossinterp.c' line='2728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Exit'> - <parameter type-id='type-id-1685' name='session' filepath='Python/crossinterp.c' line='2728' column='1'/> - <parameter type-id='type-id-1684' name='override' filepath='Python/crossinterp.c' line='2728' column='1'/> - <parameter type-id='type-id-1686' name='result' filepath='Python/crossinterp.c' line='2729' column='1'/> + <function-decl name='_PyXI_Exit' mangled-name='_PyXI_Exit' filepath='Python/crossinterp.c' line='2737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Exit'> + <parameter type-id='type-id-1686' name='session' filepath='Python/crossinterp.c' line='2737' column='1'/> + <parameter type-id='type-id-1685' name='override' filepath='Python/crossinterp.c' line='2737' column='1'/> + <parameter type-id='type-id-1687' name='result' filepath='Python/crossinterp.c' line='2738' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyXI_GetMainNamespace' mangled-name='_PyXI_GetMainNamespace' filepath='Python/crossinterp.c' line='2907' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_GetMainNamespace'> - <parameter type-id='type-id-1685' name='session' filepath='Python/crossinterp.c' line='2907' column='1'/> - <parameter type-id='type-id-1684' name='failure' filepath='Python/crossinterp.c' line='2907' column='1'/> + <function-decl name='_PyXI_GetMainNamespace' mangled-name='_PyXI_GetMainNamespace' filepath='Python/crossinterp.c' line='2916' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_GetMainNamespace'> + <parameter type-id='type-id-1686' name='session' filepath='Python/crossinterp.c' line='2916' column='1'/> + <parameter type-id='type-id-1685' name='failure' filepath='Python/crossinterp.c' line='2916' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyXI_Preserve' mangled-name='_PyXI_Preserve' filepath='Python/crossinterp.c' line='3008' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Preserve'> - <parameter type-id='type-id-1685' name='session' filepath='Python/crossinterp.c' line='3008' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/crossinterp.c' line='3008' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Python/crossinterp.c' line='3008' column='1'/> - <parameter type-id='type-id-1684' name='p_failure' filepath='Python/crossinterp.c' line='3009' column='1'/> + <function-decl name='_PyXI_Preserve' mangled-name='_PyXI_Preserve' filepath='Python/crossinterp.c' line='3017' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Preserve'> + <parameter type-id='type-id-1686' name='session' filepath='Python/crossinterp.c' line='3017' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/crossinterp.c' line='3017' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Python/crossinterp.c' line='3017' column='1'/> + <parameter type-id='type-id-1685' name='p_failure' filepath='Python/crossinterp.c' line='3018' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyXI_GetPreserved' mangled-name='_PyXI_GetPreserved' filepath='Python/crossinterp.c' line='3040' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_GetPreserved'> - <parameter type-id='type-id-1686' name='result' filepath='Python/crossinterp.c' line='3040' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/crossinterp.c' line='3040' column='1'/> + <function-decl name='_PyXI_GetPreserved' mangled-name='_PyXI_GetPreserved' filepath='Python/crossinterp.c' line='3049' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_GetPreserved'> + <parameter type-id='type-id-1687' name='result' filepath='Python/crossinterp.c' line='3049' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/crossinterp.c' line='3049' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyXI_ClearResult' mangled-name='_PyXI_ClearResult' filepath='Python/crossinterp.c' line='3050' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ClearResult'> - <parameter type-id='type-id-1686' name='result' filepath='Python/crossinterp.c' line='3050' column='1'/> + <function-decl name='_PyXI_ClearResult' mangled-name='_PyXI_ClearResult' filepath='Python/crossinterp.c' line='3059' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ClearResult'> + <parameter type-id='type-id-1687' name='result' filepath='Python/crossinterp.c' line='3059' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyXI_NewInterpreter' mangled-name='_PyXI_NewInterpreter' filepath='Python/crossinterp.c' line='3197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewInterpreter'> - <parameter type-id='type-id-1680' name='config' filepath='Python/crossinterp.c' line='3197' column='1'/> - <parameter type-id='type-id-170' name='maybe_whence' filepath='Python/crossinterp.c' line='3197' column='1'/> - <parameter type-id='type-id-1681' name='p_tstate' filepath='Python/crossinterp.c' line='3198' column='1'/> - <parameter type-id='type-id-1681' name='p_save_tstate' filepath='Python/crossinterp.c' line='3198' column='1'/> - <return type-id='type-id-33'/> + <function-decl name='_PyXI_NewInterpreter' mangled-name='_PyXI_NewInterpreter' filepath='Python/crossinterp.c' line='3206' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewInterpreter'> + <parameter type-id='type-id-1681' name='config' filepath='Python/crossinterp.c' line='3206' column='1'/> + <parameter type-id='type-id-176' name='maybe_whence' filepath='Python/crossinterp.c' line='3206' column='1'/> + <parameter type-id='type-id-1682' name='p_tstate' filepath='Python/crossinterp.c' line='3207' column='1'/> + <parameter type-id='type-id-1682' name='p_save_tstate' filepath='Python/crossinterp.c' line='3207' column='1'/> + <return type-id='type-id-39'/> </function-decl> - <function-decl name='_PyXI_EndInterpreter' mangled-name='_PyXI_EndInterpreter' filepath='Python/crossinterp.c' line='3244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_EndInterpreter'> - <parameter type-id='type-id-33' name='interp' filepath='Python/crossinterp.c' line='3244' column='1'/> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp.c' line='3245' column='1'/> - <parameter type-id='type-id-1681' name='p_save_tstate' filepath='Python/crossinterp.c' line='3245' column='1'/> + <function-decl name='_PyXI_EndInterpreter' mangled-name='_PyXI_EndInterpreter' filepath='Python/crossinterp.c' line='3253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_EndInterpreter'> + <parameter type-id='type-id-39' name='interp' filepath='Python/crossinterp.c' line='3253' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp.c' line='3254' column='1'/> + <parameter type-id='type-id-1682' name='p_save_tstate' filepath='Python/crossinterp.c' line='3254' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXIData_GetNotShareableErrorType' mangled-name='_PyXIData_GetNotShareableErrorType' filepath='Python/crossinterp_data_lookup.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_GetNotShareableErrorType'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='66' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='66' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyXIData_SetNotShareableError' mangled-name='_PyXIData_SetNotShareableError' filepath='Python/crossinterp_data_lookup.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_SetNotShareableError'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='74' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='74' column='1'/> <parameter type-id='type-id-4' name='msg' filepath='Python/crossinterp_data_lookup.h' line='74' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXIData_FormatNotShareableError' mangled-name='_PyXIData_FormatNotShareableError' filepath='Python/crossinterp_data_lookup.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_FormatNotShareableError'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='81' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='81' column='1'/> <parameter type-id='type-id-4' name='format' filepath='Python/crossinterp_data_lookup.h' line='82' column='1'/> <parameter is-variadic='yes'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXI_UnwrapNotShareableError' mangled-name='_PyXI_UnwrapNotShareableError' filepath='Python/crossinterp_data_lookup.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_UnwrapNotShareableError'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='92' column='1'/> - <parameter type-id='type-id-1684' name='failure' filepath='Python/crossinterp_data_lookup.h' line='92' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='92' column='1'/> + <parameter type-id='type-id-1685' name='failure' filepath='Python/crossinterp_data_lookup.h' line='92' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyXIData_Lookup' mangled-name='_PyXIData_Lookup' filepath='Python/crossinterp_data_lookup.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_Lookup'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='120' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='120' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp_data_lookup.h' line='120' column='1'/> - <return type-id='type-id-1128'/> + <return type-id='type-id-1130'/> </function-decl> <function-decl name='_PyXIData_RegisterClass' mangled-name='_PyXIData_RegisterClass' filepath='Python/crossinterp_data_lookup.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_RegisterClass'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='316' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='316' column='1'/> <parameter type-id='type-id-1' name='cls' filepath='Python/crossinterp_data_lookup.h' line='317' column='1'/> - <parameter type-id='type-id-1128' name='getdata' filepath='Python/crossinterp_data_lookup.h' line='317' column='1'/> + <parameter type-id='type-id-1130' name='getdata' filepath='Python/crossinterp_data_lookup.h' line='317' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyXIData_UnregisterClass' mangled-name='_PyXIData_UnregisterClass' filepath='Python/crossinterp_data_lookup.h' line='352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXIData_UnregisterClass'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='352' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='352' column='1'/> <parameter type-id='type-id-1' name='cls' filepath='Python/crossinterp_data_lookup.h' line='352' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyBytes_GetData' mangled-name='_PyBytes_GetData' filepath='Python/crossinterp_data_lookup.h' line='384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_GetData'> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp_data_lookup.h' line='384' column='1'/> - <parameter type-id='type-id-1682' name='data' filepath='Python/crossinterp_data_lookup.h' line='384' column='1'/> + <parameter type-id='type-id-1683' name='data' filepath='Python/crossinterp_data_lookup.h' line='384' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyBytes_FromData' mangled-name='_PyBytes_FromData' filepath='Python/crossinterp_data_lookup.h' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_FromData'> - <parameter type-id='type-id-1682' name='data' filepath='Python/crossinterp_data_lookup.h' line='403' column='1'/> + <parameter type-id='type-id-1683' name='data' filepath='Python/crossinterp_data_lookup.h' line='403' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyBytes_FromXIData' mangled-name='_PyBytes_FromXIData' filepath='Python/crossinterp_data_lookup.h' line='409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_FromXIData'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='409' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='409' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyBytes_GetXIData' mangled-name='_PyBytes_GetXIData' filepath='Python/crossinterp_data_lookup.h' line='438' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_GetXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='438' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='438' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp_data_lookup.h' line='438' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='438' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='438' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyBytes_GetXIDataWrapped' mangled-name='_PyBytes_GetXIDataWrapped' filepath='Python/crossinterp_data_lookup.h' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_GetXIDataWrapped'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='449' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='449' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp_data_lookup.h' line='450' column='1'/> - <parameter type-id='type-id-21' name='size' filepath='Python/crossinterp_data_lookup.h' line='450' column='1'/> - <parameter type-id='type-id-1121' name='newfunc' filepath='Python/crossinterp_data_lookup.h' line='450' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='451' column='1'/> - <return type-id='type-id-1682'/> + <parameter type-id='type-id-14' name='size' filepath='Python/crossinterp_data_lookup.h' line='450' column='1'/> + <parameter type-id='type-id-1123' name='newfunc' filepath='Python/crossinterp_data_lookup.h' line='450' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='451' column='1'/> + <return type-id='type-id-1683'/> </function-decl> <function-decl name='_PyCode_FromXIData' mangled-name='_PyCode_FromXIData' filepath='Python/crossinterp_data_lookup.h' line='693' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_FromXIData'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='693' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='693' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyCode_GetXIData' mangled-name='_PyCode_GetXIData' filepath='Python/crossinterp_data_lookup.h' line='699' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_GetXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='699' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='699' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/crossinterp_data_lookup.h' line='699' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='699' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='699' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyFunction_FromXIData' mangled-name='_PyFunction_FromXIData' filepath='Python/crossinterp_data_lookup.h' line='716' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFunction_FromXIData'> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='716' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='716' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyFunction_GetXIData' mangled-name='_PyFunction_GetXIData' filepath='Python/crossinterp_data_lookup.h' line='756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFunction_GetXIData'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='756' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/crossinterp_data_lookup.h' line='756' column='1'/> <parameter type-id='type-id-6' name='func' filepath='Python/crossinterp_data_lookup.h' line='756' column='1'/> - <parameter type-id='type-id-1501' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='757' column='1'/> + <parameter type-id='type-id-1502' name='xidata' filepath='Python/crossinterp_data_lookup.h' line='757' column='1'/> <return type-id='type-id-5'/> </function-decl> </abi-instr> @@ -27458,14 +27529,7 @@ <function-decl name='Py_fopen' mangled-name='Py_fopen' filepath='./Include/cpython/fileutils.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_fopen'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> - <return type-id='type-id-61'/> - </function-decl> - <function-decl name='_PyErr_WarnExplicitObjectWithContext' filepath='./Include/cpython/warnings.h' line='22' 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-5'/> - <return type-id='type-id-5'/> + <return type-id='type-id-67'/> </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-6'/> @@ -27479,7 +27543,7 @@ </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'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_PyErr_SetLocaleString' mangled-name='_PyErr_SetLocaleString' filepath='Python/errors.c' line='301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetLocaleString'> <parameter type-id='type-id-6' name='exception' filepath='Python/errors.c' line='301' column='1'/> @@ -27529,16 +27593,16 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyErr_FormatV' mangled-name='_PyErr_FormatV' filepath='Python/errors.c' line='1200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_FormatV'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/errors.c' line='1200' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/errors.c' line='1200' column='1'/> <parameter type-id='type-id-6' name='exception' filepath='Python/errors.c' line='1200' column='1'/> <parameter type-id='type-id-4' 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'/> + <parameter type-id='type-id-308' name='vargs' filepath='Python/errors.c' line='1201' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyErr_FormatV' mangled-name='PyErr_FormatV' filepath='Python/errors.c' line='1219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_FormatV'> <parameter type-id='type-id-6' name='exception' filepath='Python/errors.c' line='1219' column='1'/> <parameter type-id='type-id-4' name='format' filepath='Python/errors.c' line='1219' column='1'/> - <parameter type-id='type-id-306' name='vargs' filepath='Python/errors.c' line='1219' column='1'/> + <parameter type-id='type-id-308' name='vargs' filepath='Python/errors.c' line='1219' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyErr_NewExceptionWithDoc' mangled-name='PyErr_NewExceptionWithDoc' filepath='Python/errors.c' line='1333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NewExceptionWithDoc'> @@ -27579,7 +27643,7 @@ <function-decl name='_PyTokenizer_FindEncodingFilename' filepath='Python/errors.c' line='2021' 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'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='PyErr_ProgramTextObject' mangled-name='PyErr_ProgramTextObject' filepath='Python/errors.c' line='2058' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ProgramTextObject'> <parameter type-id='type-id-6' name='filename' filepath='Python/errors.c' line='2058' column='1'/> @@ -27588,38 +27652,38 @@ </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-1689' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='13' column='1' id='type-id-1690'> + <class-decl name='__mbstate_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1690' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='13' column='1' id='type-id-1691'> <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-1691' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='20' column='1'/> + <var-decl name='__value' type-id='type-id-1692' 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-1691'> + <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-1692'> <data-member access='public'> - <var-decl name='__wch' type-id='type-id-105' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='18' column='1'/> + <var-decl name='__wch' type-id='type-id-111' 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-862' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='19' column='1'/> + <var-decl name='__wchb' type-id='type-id-864' 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-1690' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='21' column='1' id='type-id-1689'/> - <typedef-decl name='mbstate_t' type-id='type-id-1689' filepath='/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h' line='6' column='1' id='type-id-1692'/> - <pointer-type-def type-id='type-id-1692' size-in-bits='64' id='type-id-1693'/> - <qualified-type-def type-id='type-id-1693' restrict='yes' id='type-id-1694'/> - <qualified-type-def type-id='type-id-64' restrict='yes' id='type-id-1695'/> + <typedef-decl name='__mbstate_t' type-id='type-id-1691' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='21' column='1' id='type-id-1690'/> + <typedef-decl name='mbstate_t' type-id='type-id-1690' filepath='/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h' line='6' column='1' id='type-id-1693'/> + <pointer-type-def type-id='type-id-1693' size-in-bits='64' id='type-id-1694'/> + <qualified-type-def type-id='type-id-1694' restrict='yes' id='type-id-1695'/> + <qualified-type-def type-id='type-id-70' restrict='yes' id='type-id-1696'/> <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-180'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-14'/> </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-182'/> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-14'/> </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'/> @@ -27627,33 +27691,33 @@ </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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-24'/> </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-180'/> - <parameter type-id='type-id-182'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-185'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-13'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-189'/> </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-105'/> - <parameter type-id='type-id-105'/> + <parameter type-id='type-id-111'/> + <parameter type-id='type-id-111'/> <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-180'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-1694'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-1695'/> + <return type-id='type-id-14'/> </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'/> @@ -27662,35 +27726,35 @@ <return type-id='type-id-5'/> </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-18' name='text' filepath='Python/fileutils.c' line='863' column='1'/> - <parameter type-id='type-id-62' name='error_pos' filepath='Python/fileutils.c' line='863' column='1'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-25' name='text' filepath='Python/fileutils.c' line='863' column='1'/> + <parameter type-id='type-id-68' name='error_pos' filepath='Python/fileutils.c' line='863' column='1'/> + <return type-id='type-id-24'/> </function-decl> <function-decl name='_Py_stat' mangled-name='_Py_stat' filepath='Python/fileutils.c' line='1360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_stat'> <parameter type-id='type-id-6' name='path' filepath='Python/fileutils.c' line='1360' column='1'/> - <parameter type-id='type-id-64' name='statbuf' filepath='Python/fileutils.c' line='1360' column='1'/> + <parameter type-id='type-id-70' name='statbuf' filepath='Python/fileutils.c' line='1360' 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='1602' 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='1602' column='1'/> <parameter type-id='type-id-5' name='inheritable' filepath='Python/fileutils.c' line='1602' column='1'/> - <parameter type-id='type-id-177' name='atomic_flag_works' filepath='Python/fileutils.c' line='1602' column='1'/> + <parameter type-id='type-id-183' name='atomic_flag_works' filepath='Python/fileutils.c' line='1602' 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='1611' 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='1611' column='1'/> <parameter type-id='type-id-5' name='inheritable' filepath='Python/fileutils.c' line='1611' column='1'/> - <parameter type-id='type-id-177' name='atomic_flag_works' filepath='Python/fileutils.c' line='1611' column='1'/> + <parameter type-id='type-id-183' name='atomic_flag_works' filepath='Python/fileutils.c' line='1611' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='Py_fclose' mangled-name='Py_fclose' filepath='Python/fileutils.c' line='1847' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_fclose'> - <parameter type-id='type-id-61' name='file' filepath='Python/fileutils.c' line='1847' column='1'/> + <parameter type-id='type-id-67' name='file' filepath='Python/fileutils.c' line='1847' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_normpath' mangled-name='_Py_normpath' filepath='Python/fileutils.c' line='2616' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_normpath'> - <parameter type-id='type-id-63' name='path' filepath='Python/fileutils.c' line='2616' column='1'/> + <parameter type-id='type-id-69' name='path' filepath='Python/fileutils.c' line='2616' column='1'/> <parameter type-id='type-id-7' name='size' filepath='Python/fileutils.c' line='2616' column='1'/> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_Py_closerange' mangled-name='_Py_closerange' filepath='Python/fileutils.c' line='3003' 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='3003' column='1'/> @@ -27709,97 +27773,97 @@ <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyCompile_OpcodeStackEffectWithJump' mangled-name='PyCompile_OpcodeStackEffectWithJump' filepath='Python/flowgraph.c' line='4023' 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/flowgraph.c' line='4023' column='1'/> - <parameter type-id='type-id-5' name='oparg' filepath='Python/flowgraph.c' line='4023' column='1'/> - <parameter type-id='type-id-5' name='jump' filepath='Python/flowgraph.c' line='4023' column='1'/> + <function-decl name='PyCompile_OpcodeStackEffectWithJump' mangled-name='PyCompile_OpcodeStackEffectWithJump' filepath='Python/flowgraph.c' line='4030' 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/flowgraph.c' line='4030' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/flowgraph.c' line='4030' column='1'/> + <parameter type-id='type-id-5' name='jump' filepath='Python/flowgraph.c' line='4030' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyCompile_OptimizeCfg' mangled-name='_PyCompile_OptimizeCfg' filepath='Python/flowgraph.c' line='4063' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OptimizeCfg'> - <parameter type-id='type-id-6' name='seq' filepath='Python/flowgraph.c' line='4063' column='1'/> - <parameter type-id='type-id-6' name='consts' filepath='Python/flowgraph.c' line='4063' column='1'/> - <parameter type-id='type-id-5' name='nlocals' filepath='Python/flowgraph.c' line='4063' column='1'/> + <function-decl name='_PyCompile_OptimizeCfg' mangled-name='_PyCompile_OptimizeCfg' filepath='Python/flowgraph.c' line='4070' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OptimizeCfg'> + <parameter type-id='type-id-6' name='seq' filepath='Python/flowgraph.c' line='4070' column='1'/> + <parameter type-id='type-id-6' name='consts' filepath='Python/flowgraph.c' line='4070' column='1'/> + <parameter type-id='type-id-5' name='nlocals' filepath='Python/flowgraph.c' line='4070' column='1'/> <return type-id='type-id-6'/> </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-1696'> + <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-1697'> <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'/> + <var-decl name='decimal_point' type-id='type-id-24' 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'/> + <var-decl name='thousands_sep' type-id='type-id-24' 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'/> + <var-decl name='grouping' type-id='type-id-24' 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'/> + <var-decl name='int_curr_symbol' type-id='type-id-24' 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'/> + <var-decl name='currency_symbol' type-id='type-id-24' 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'/> + <var-decl name='mon_decimal_point' type-id='type-id-24' 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'/> + <var-decl name='mon_thousands_sep' type-id='type-id-24' 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'/> + <var-decl name='mon_grouping' type-id='type-id-24' 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'/> + <var-decl name='positive_sign' type-id='type-id-24' 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'/> + <var-decl name='negative_sign' type-id='type-id-24' 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-58' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/> + <var-decl name='int_frac_digits' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/> + <var-decl name='frac_digits' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/> + <var-decl name='p_cs_precedes' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/> + <var-decl name='p_sep_by_space' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/> + <var-decl name='n_cs_precedes' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/> + <var-decl name='n_sep_by_space' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='91' column='1'/> + <var-decl name='p_sign_posn' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='92' column='1'/> + <var-decl name='n_sign_posn' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='95' column='1'/> + <var-decl name='int_p_cs_precedes' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/> + <var-decl name='int_p_sep_by_space' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/> + <var-decl name='int_n_cs_precedes' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/> + <var-decl name='int_n_sep_by_space' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='108' column='1'/> + <var-decl name='int_p_sign_posn' type-id='type-id-64' 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-58' visibility='default' filepath='/usr/include/locale.h' line='109' column='1'/> + <var-decl name='int_n_sign_posn' type-id='type-id-64' visibility='default' filepath='/usr/include/locale.h' line='109' column='1'/> </data-member> </class-decl> - <pointer-type-def type-id='type-id-1696' size-in-bits='64' id='type-id-1697'/> + <pointer-type-def type-id='type-id-1697' size-in-bits='64' id='type-id-1698'/> <function-decl name='_Py_GetLocaleconvNumeric' filepath='./Include/internal/pycore_fileutils.h' line='229' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1697'/> + <parameter type-id='type-id-1698'/> <parameter type-id='type-id-241'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> @@ -27808,7 +27872,7 @@ <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-305'/> + <parameter type-id='type-id-307'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicode_FastCopyCharacters' filepath='./Include/internal/pycore_unicodeobject.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -27823,10 +27887,10 @@ <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-7'/> - <return type-id='type-id-305'/> + <return type-id='type-id-307'/> </function-decl> <function-decl name='_PyUnicode_InsertThousandsGrouping' filepath='./Include/internal/pycore_unicodeobject.h' line='242' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-379'/> + <parameter type-id='type-id-381'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-7'/> @@ -27834,48 +27898,48 @@ <parameter type-id='type-id-7'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-619'/> + <parameter type-id='type-id-621'/> <parameter type-id='type-id-5'/> <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-1697'/> + <return type-id='type-id-1698'/> </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-1698' size-in-bits='384' id='type-id-1699'> - <subrange length='6' type-id='type-id-2' id='type-id-477'/> + <array-type-def dimensions='1' type-id='type-id-1699' size-in-bits='384' id='type-id-1700'> + <subrange length='6' type-id='type-id-2' id='type-id-479'/> </array-type-def> - <qualified-type-def type-id='type-id-271' const='yes' id='type-id-1700'/> - <pointer-type-def type-id='type-id-1700' size-in-bits='64' id='type-id-1701'/> - <qualified-type-def type-id='type-id-1701' const='yes' id='type-id-1698'/> - <var-decl name='PyUnstable_ExecutableKinds' type-id='type-id-1699' mangled-name='PyUnstable_ExecutableKinds' visibility='default' filepath='./Include/cpython/pyframe.h' line='45' column='1' elf-symbol-id='PyUnstable_ExecutableKinds'/> + <qualified-type-def type-id='type-id-271' const='yes' id='type-id-1701'/> + <pointer-type-def type-id='type-id-1701' size-in-bits='64' id='type-id-1702'/> + <qualified-type-def type-id='type-id-1702' const='yes' id='type-id-1699'/> + <var-decl name='PyUnstable_ExecutableKinds' type-id='type-id-1700' 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='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> - <return type-id='type-id-413'/> + <parameter type-id='type-id-347'/> + <return type-id='type-id-415'/> </function-decl> - <function-decl name='_PyGC_VisitFrameStack' filepath='./Include/internal/pycore_gc.h' line='352' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-428'/> - <parameter type-id='type-id-397'/> - <parameter type-id='type-id-35'/> + <function-decl name='_PyGC_VisitFrameStack' filepath='./Include/internal/pycore_gc.h' line='367' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-430'/> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyUnstable_InterpreterFrame_GetCode' mangled-name='PyUnstable_InterpreterFrame_GetCode' filepath='Python/frame.c' line='133' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetCode'> - <parameter type-id='type-id-431' name='frame' filepath='Python/frame.c' line='133' column='1'/> + <parameter type-id='type-id-433' name='frame' filepath='Python/frame.c' line='133' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyUnstable_InterpreterFrame_GetLasti' mangled-name='PyUnstable_InterpreterFrame_GetLasti' filepath='Python/frame.c' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetLasti'> - <parameter type-id='type-id-431' name='frame' filepath='Python/frame.c' line='139' column='1'/> + <parameter type-id='type-id-433' name='frame' filepath='Python/frame.c' line='139' 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='13' column='1' id='type-id-1702'> + <class-decl name='_frozen' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='13' column='1' id='type-id-1703'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/import.h' line='14' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='code' type-id='type-id-453' visibility='default' filepath='./Include/cpython/import.h' line='15' column='1'/> + <var-decl name='code' type-id='type-id-455' visibility='default' filepath='./Include/cpython/import.h' line='15' 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='16' column='1'/> @@ -27884,7 +27948,7 @@ <var-decl name='is_package' type-id='type-id-5' visibility='default' filepath='./Include/cpython/import.h' line='17' 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='105' column='1' id='type-id-1703'> + <class-decl name='_module_alias' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='105' column='1' id='type-id-1704'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_import.h' line='106' column='1'/> </data-member> @@ -27892,45 +27956,45 @@ <var-decl name='orig' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_import.h' line='107' column='1'/> </data-member> </class-decl> - <qualified-type-def type-id='type-id-1702' const='yes' id='type-id-1704'/> - <pointer-type-def type-id='type-id-1704' size-in-bits='64' id='type-id-1705'/> - <qualified-type-def type-id='type-id-1703' const='yes' id='type-id-1706'/> - <pointer-type-def type-id='type-id-1706' size-in-bits='64' id='type-id-1707'/> - <var-decl name='PyImport_FrozenModules' type-id='type-id-1705' mangled-name='PyImport_FrozenModules' visibility='default' filepath='./Include/cpython/import.h' line='23' column='1' elf-symbol-id='PyImport_FrozenModules'/> - <var-decl name='_PyImport_FrozenBootstrap' type-id='type-id-1705' mangled-name='_PyImport_FrozenBootstrap' visibility='default' filepath='./Include/internal/pycore_import.h' line='111' column='1' elf-symbol-id='_PyImport_FrozenBootstrap'/> - <var-decl name='_PyImport_FrozenStdlib' type-id='type-id-1705' mangled-name='_PyImport_FrozenStdlib' visibility='default' filepath='./Include/internal/pycore_import.h' line='112' column='1' elf-symbol-id='_PyImport_FrozenStdlib'/> - <var-decl name='_PyImport_FrozenTest' type-id='type-id-1705' mangled-name='_PyImport_FrozenTest' visibility='default' filepath='./Include/internal/pycore_import.h' line='113' column='1' elf-symbol-id='_PyImport_FrozenTest'/> - <var-decl name='_PyImport_FrozenAliases' type-id='type-id-1707' visibility='default' filepath='./Include/internal/pycore_import.h' line='115' column='1'/> + <qualified-type-def type-id='type-id-1703' const='yes' id='type-id-1705'/> + <pointer-type-def type-id='type-id-1705' size-in-bits='64' id='type-id-1706'/> + <qualified-type-def type-id='type-id-1704' const='yes' id='type-id-1707'/> + <pointer-type-def type-id='type-id-1707' size-in-bits='64' id='type-id-1708'/> + <var-decl name='PyImport_FrozenModules' type-id='type-id-1706' mangled-name='PyImport_FrozenModules' visibility='default' filepath='./Include/cpython/import.h' line='23' column='1' elf-symbol-id='PyImport_FrozenModules'/> + <var-decl name='_PyImport_FrozenBootstrap' type-id='type-id-1706' mangled-name='_PyImport_FrozenBootstrap' visibility='default' filepath='./Include/internal/pycore_import.h' line='111' column='1' elf-symbol-id='_PyImport_FrozenBootstrap'/> + <var-decl name='_PyImport_FrozenStdlib' type-id='type-id-1706' mangled-name='_PyImport_FrozenStdlib' visibility='default' filepath='./Include/internal/pycore_import.h' line='112' column='1' elf-symbol-id='_PyImport_FrozenStdlib'/> + <var-decl name='_PyImport_FrozenTest' type-id='type-id-1706' mangled-name='_PyImport_FrozenTest' visibility='default' filepath='./Include/internal/pycore_import.h' line='113' column='1' elf-symbol-id='_PyImport_FrozenTest'/> + <var-decl name='_PyImport_FrozenAliases' type-id='type-id-1708' visibility='default' filepath='./Include/internal/pycore_import.h' line='115' 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-272' size-in-bits='64' id='type-id-65'/> + <pointer-type-def type-id='type-id-274' size-in-bits='64' id='type-id-71'/> <function-decl name='PyConfig_InitPythonConfig' mangled-name='PyConfig_InitPythonConfig' filepath='./Include/cpython/initconfig.h' line='246' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitPythonConfig'> - <parameter type-id='type-id-65'/> + <parameter type-id='type-id-71'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyConfig_Clear' mangled-name='PyConfig_Clear' filepath='./Include/cpython/initconfig.h' line='248' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Clear'> - <parameter type-id='type-id-65'/> + <parameter type-id='type-id-71'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyConfig_SetBytesArgv' mangled-name='PyConfig_SetBytesArgv' filepath='./Include/cpython/initconfig.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesArgv'> - <parameter type-id='type-id-65'/> + <parameter type-id='type-id-71'/> <parameter type-id='type-id-7'/> - <parameter type-id='type-id-129'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-135'/> + <return type-id='type-id-72'/> </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-240'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='Py_ExitStatusException' mangled-name='Py_ExitStatusException' filepath='./Include/cpython/pylifecycle.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ExitStatusException'> - <parameter type-id='type-id-66'/> + <parameter type-id='type-id-72'/> <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-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> + <parameter type-id='type-id-213'/> <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'> @@ -27938,7 +28002,7 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyRuntime_Initialize' filepath='./Include/internal/pycore_runtime.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </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'/> @@ -27960,124 +28024,141 @@ </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-396' filepath='./Include/cpython/objimpl.h' line='103' column='1' id='type-id-1708'/> - <function-decl name='_PyGC_ClearAllFreeLists' filepath='./Include/internal/pycore_gc.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <typedef-decl name='gcvisitobjects_t' type-id='type-id-398' filepath='./Include/cpython/objimpl.h' line='103' column='1' id='type-id-1709'/> + <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-180'/> + <function-decl name='PyInterpreterState_ThreadHead' mangled-name='PyInterpreterState_ThreadHead' filepath='./Include/cpython/pystate.h' line='263' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_ThreadHead'> + <parameter type-id='type-id-39'/> + <return type-id='type-id-37'/> + </function-decl> + <function-decl name='PyThreadState_Next' mangled-name='PyThreadState_Next' filepath='./Include/cpython/pystate.h' line='264' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Next'> + <parameter type-id='type-id-37'/> + <return type-id='type-id-37'/> + </function-decl> + <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-34'/> + <return type-id='type-id-178'/> + </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-180'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyGC_ClearAllFreeLists' filepath='./Include/internal/pycore_gc.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTuple_MaybeUntrack' filepath='./Include/internal/pycore_tuple.h' line='14' 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='PyGC_Enable' mangled-name='PyGC_Enable' filepath='Python/gc.c' line='1967' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Enable'> + <function-decl name='PyGC_Enable' mangled-name='PyGC_Enable' filepath='Python/gc.c' line='1969' 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='1976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Disable'> + <function-decl name='PyGC_Disable' mangled-name='PyGC_Disable' filepath='Python/gc.c' line='1978' 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='1985' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_IsEnabled'> + <function-decl name='PyGC_IsEnabled' mangled-name='PyGC_IsEnabled' filepath='Python/gc.c' line='1987' 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='2068' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Collect'> + <function-decl name='PyGC_Collect' mangled-name='PyGC_Collect' filepath='Python/gc.c' line='2083' 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='2323' 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='2323' column='1'/> - <parameter type-id='type-id-21' name='extra_size' filepath='Python/gc.c' line='2323' column='1'/> + <function-decl name='PyUnstable_Object_GC_NewWithExtraData' mangled-name='PyUnstable_Object_GC_NewWithExtraData' filepath='Python/gc.c' line='2339' 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='2339' column='1'/> + <parameter type-id='type-id-14' name='extra_size' filepath='Python/gc.c' line='2339' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyObject_GC_IsTracked' mangled-name='PyObject_GC_IsTracked' filepath='Python/gc.c' line='2384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsTracked'> - <parameter type-id='type-id-6' name='obj' filepath='Python/gc.c' line='2384' column='1'/> + <function-decl name='PyObject_GC_IsTracked' mangled-name='PyObject_GC_IsTracked' filepath='Python/gc.c' line='2400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsTracked'> + <parameter type-id='type-id-6' name='obj' filepath='Python/gc.c' line='2400' 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='2393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsFinalized'> - <parameter type-id='type-id-6' name='obj' filepath='Python/gc.c' line='2393' column='1'/> + <function-decl name='PyObject_GC_IsFinalized' mangled-name='PyObject_GC_IsFinalized' filepath='Python/gc.c' line='2409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsFinalized'> + <parameter type-id='type-id-6' name='obj' filepath='Python/gc.c' line='2409' 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='2419' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_GC_VisitObjects'> - <parameter type-id='type-id-1708' name='callback' filepath='Python/gc.c' line='2419' column='1'/> - <parameter type-id='type-id-35' name='arg' filepath='Python/gc.c' line='2419' column='1'/> + <function-decl name='PyUnstable_GC_VisitObjects' mangled-name='PyUnstable_GC_VisitObjects' filepath='Python/gc.c' line='2435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_GC_VisitObjects'> + <parameter type-id='type-id-1709' name='callback' filepath='Python/gc.c' line='2435' column='1'/> + <parameter type-id='type-id-41' name='arg' filepath='Python/gc.c' line='2435' 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'> - <pointer-type-def type-id='type-id-1174' size-in-bits='64' id='type-id-1709'/> + <pointer-type-def type-id='type-id-1176' size-in-bits='64' id='type-id-1710'/> <function-decl name='_PyObject_ClearFreeLists' filepath='./Include/internal/pycore_freelist.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1709'/> + <parameter type-id='type-id-1710'/> <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-33'/> - <return type-id='type-id-31'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-37'/> </function-decl> - <function-decl name='PyArg_Parse' mangled-name='PyArg_Parse' filepath='Python/getargs.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_Parse'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='73' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='73' column='1'/> + <function-decl name='PyArg_Parse' mangled-name='PyArg_Parse' filepath='Python/getargs.c' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_Parse'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='71' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='71' 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='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_Parse_SizeT'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='85' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='85' column='1'/> + <function-decl name='_PyArg_Parse_SizeT' mangled-name='_PyArg_Parse_SizeT' filepath='Python/getargs.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_Parse_SizeT'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='83' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='83' 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='110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTuple_SizeT'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='110' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='110' column='1'/> + <function-decl name='_PyArg_ParseTuple_SizeT' mangled-name='_PyArg_ParseTuple_SizeT' filepath='Python/getargs.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTuple_SizeT'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='108' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='108' 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='123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStack'> - <parameter type-id='type-id-265' name='args' filepath='Python/getargs.c' line='123' column='1'/> - <parameter type-id='type-id-7' name='nargs' filepath='Python/getargs.c' line='123' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='123' column='1'/> + <function-decl name='_PyArg_ParseStack' mangled-name='_PyArg_ParseStack' filepath='Python/getargs.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStack'> + <parameter type-id='type-id-265' name='args' filepath='Python/getargs.c' line='121' column='1'/> + <parameter type-id='type-id-7' name='nargs' filepath='Python/getargs.c' line='121' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='121' 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='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParse'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='135' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='135' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='135' column='1'/> + <function-decl name='PyArg_VaParse' mangled-name='PyArg_VaParse' filepath='Python/getargs.c' line='133' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParse'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='133' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='133' column='1'/> + <parameter type-id='type-id-308' name='va' filepath='Python/getargs.c' line='133' 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='148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParse_SizeT'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='148' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='148' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='148' column='1'/> + <function-decl name='_PyArg_VaParse_SizeT' mangled-name='_PyArg_VaParse_SizeT' filepath='Python/getargs.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParse_SizeT'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='146' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='146' column='1'/> + <parameter type-id='type-id-308' name='va' filepath='Python/getargs.c' line='146' 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='1432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywords_SizeT'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1432' column='1'/> - <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1433' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='1434' column='1'/> - <parameter type-id='type-id-989' name='kwlist' filepath='Python/getargs.c' line='1435' column='1'/> + <function-decl name='_PyArg_ParseTupleAndKeywords_SizeT' mangled-name='_PyArg_ParseTupleAndKeywords_SizeT' filepath='Python/getargs.c' line='1362' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywords_SizeT'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1362' column='1'/> + <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1363' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='1364' column='1'/> + <parameter type-id='type-id-991' name='kwlist' filepath='Python/getargs.c' line='1365' 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='1458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParseTupleAndKeywords'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1458' column='1'/> - <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1459' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='1460' column='1'/> - <parameter type-id='type-id-989' name='kwlist' filepath='Python/getargs.c' line='1461' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='1461' column='1'/> + <function-decl name='PyArg_VaParseTupleAndKeywords' mangled-name='PyArg_VaParseTupleAndKeywords' filepath='Python/getargs.c' line='1388' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParseTupleAndKeywords'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1388' column='1'/> + <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1389' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='1390' column='1'/> + <parameter type-id='type-id-991' name='kwlist' filepath='Python/getargs.c' line='1391' column='1'/> + <parameter type-id='type-id-308' name='va' filepath='Python/getargs.c' line='1391' 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='1483' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParseTupleAndKeywords_SizeT'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1483' column='1'/> - <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1484' column='1'/> - <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='1485' column='1'/> - <parameter type-id='type-id-989' name='kwlist' filepath='Python/getargs.c' line='1486' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='1486' column='1'/> + <function-decl name='_PyArg_VaParseTupleAndKeywords_SizeT' mangled-name='_PyArg_VaParseTupleAndKeywords_SizeT' filepath='Python/getargs.c' line='1413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParseTupleAndKeywords_SizeT'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1413' column='1'/> + <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1414' column='1'/> + <parameter type-id='type-id-4' name='format' filepath='Python/getargs.c' line='1415' column='1'/> + <parameter type-id='type-id-991' name='kwlist' filepath='Python/getargs.c' line='1416' column='1'/> + <parameter type-id='type-id-308' name='va' filepath='Python/getargs.c' line='1416' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyArg_ParseTupleAndKeywordsFast' mangled-name='_PyArg_ParseTupleAndKeywordsFast' filepath='Python/getargs.c' line='1509' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywordsFast'> - <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1509' column='1'/> - <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1509' column='1'/> - <parameter type-id='type-id-276' name='parser' filepath='Python/getargs.c' line='1510' column='1'/> + <function-decl name='_PyArg_ParseTupleAndKeywordsFast' mangled-name='_PyArg_ParseTupleAndKeywordsFast' filepath='Python/getargs.c' line='1439' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywordsFast'> + <parameter type-id='type-id-6' name='args' filepath='Python/getargs.c' line='1439' column='1'/> + <parameter type-id='type-id-6' name='keywords' filepath='Python/getargs.c' line='1439' column='1'/> + <parameter type-id='type-id-278' name='parser' filepath='Python/getargs.c' line='1440' column='1'/> <parameter is-variadic='yes'/> <return type-id='type-id-5'/> </function-decl> @@ -28090,11 +28171,11 @@ <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'/> + <var-decl name='_PyOS_optarg' type-id='type-id-25' 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-1710'/> - <var-decl name='Py_Version' type-id='type-id-1710' mangled-name='Py_Version' visibility='default' filepath='./Include/pylifecycle.h' line='64' column='1' elf-symbol-id='Py_Version'/> + <qualified-type-def type-id='type-id-2' const='yes' id='type-id-1711'/> + <var-decl name='Py_Version' type-id='type-id-1711' 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-271' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='24' column='1'/> @@ -28106,66 +28187,66 @@ <var-decl name='_PyHamtItems_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='30' 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-1711' filepath='./Include/internal/pycore_hashtable.h' line='97' column='1' id='type-id-1712'/> - <pointer-type-def type-id='type-id-1713' size-in-bits='64' id='type-id-1711'/> + <typedef-decl name='_Py_hashtable_foreach_func' type-id='type-id-1712' filepath='./Include/internal/pycore_hashtable.h' line='97' column='1' id='type-id-1713'/> + <pointer-type-def type-id='type-id-1714' size-in-bits='64' id='type-id-1712'/> <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-35' name='key' filepath='Python/hashtable.c' line='93' column='1'/> - <return type-id='type-id-1217'/> + <parameter type-id='type-id-41' name='key' filepath='Python/hashtable.c' line='93' column='1'/> + <return type-id='type-id-1219'/> </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-35' name='key1' filepath='Python/hashtable.c' line='100' column='1'/> - <parameter type-id='type-id-35' name='key2' filepath='Python/hashtable.c' line='100' column='1'/> + <parameter type-id='type-id-41' name='key1' filepath='Python/hashtable.c' line='100' column='1'/> + <parameter type-id='type-id-41' 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-612' name='ht' filepath='Python/hashtable.c' line='121' column='1'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-614' name='ht' filepath='Python/hashtable.c' line='121' column='1'/> + <return type-id='type-id-14'/> </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-618' name='ht' filepath='Python/hashtable.c' line='182' column='1'/> - <parameter type-id='type-id-35' name='key' filepath='Python/hashtable.c' line='182' column='1'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-620' name='ht' filepath='Python/hashtable.c' line='182' column='1'/> + <parameter type-id='type-id-41' name='key' filepath='Python/hashtable.c' line='182' column='1'/> + <return type-id='type-id-41'/> </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-618' name='ht' filepath='Python/hashtable.c' line='268' column='1'/> - <parameter type-id='type-id-1712' name='func' filepath='Python/hashtable.c' line='269' column='1'/> - <parameter type-id='type-id-35' name='user_data' filepath='Python/hashtable.c' line='270' column='1'/> + <parameter type-id='type-id-620' name='ht' filepath='Python/hashtable.c' line='268' column='1'/> + <parameter type-id='type-id-1713' name='func' filepath='Python/hashtable.c' line='269' column='1'/> + <parameter type-id='type-id-41' 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-615' name='hash_func' filepath='Python/hashtable.c' line='370' column='1'/> - <parameter type-id='type-id-616' name='compare_func' filepath='Python/hashtable.c' line='371' column='1'/> - <return type-id='type-id-618'/> + <parameter type-id='type-id-617' name='hash_func' filepath='Python/hashtable.c' line='370' column='1'/> + <parameter type-id='type-id-618' name='compare_func' filepath='Python/hashtable.c' line='371' column='1'/> + <return type-id='type-id-620'/> </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-618' name='ht' filepath='Python/hashtable.c' line='392' column='1'/> + <parameter type-id='type-id-620' 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-1713'> - <parameter type-id='type-id-618'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> + <function-type size-in-bits='64' id='type-id-1714'> + <parameter type-id='type-id-620'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> <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-1714'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='ext_module_kind' filepath='./Include/internal/pycore_importdl.h' line='18' column='1' id='type-id-1715'> + <underlying-type type-id='type-id-43'/> <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-1714' filepath='./Include/internal/pycore_importdl.h' line='23' column='1' id='type-id-1715'/> - <enum-decl name='ext_module_origin' filepath='./Include/internal/pycore_importdl.h' line='25' column='1' id='type-id-1716'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='_Py_ext_module_kind' type-id='type-id-1715' filepath='./Include/internal/pycore_importdl.h' line='23' column='1' id='type-id-1716'/> + <enum-decl name='ext_module_origin' filepath='./Include/internal/pycore_importdl.h' line='25' column='1' id='type-id-1717'> + <underlying-type type-id='type-id-43'/> <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-1716' filepath='./Include/internal/pycore_importdl.h' line='29' column='1' id='type-id-1717'/> - <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-1718'> + <typedef-decl name='_Py_ext_module_origin' type-id='type-id-1717' filepath='./Include/internal/pycore_importdl.h' line='29' column='1' id='type-id-1718'/> + <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-1719'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='filename' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='33' column='1'/> </data-member> @@ -28182,7 +28263,7 @@ <var-decl name='path' type-id='type-id-6' 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-1717' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='42' column='1'/> + <var-decl name='origin' type-id='type-id-1718' 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-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='43' column='1'/> @@ -28191,33 +28272,33 @@ <var-decl name='newcontext' type-id='type-id-4' 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='66' column='1' id='type-id-1719'> + <class-decl name='_Py_ext_module_loader_result' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='66' column='1' id='type-id-1720'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='def' type-id='type-id-473' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='67' column='1'/> + <var-decl name='def' type-id='type-id-475' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='67' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='module' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='68' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kind' type-id='type-id-1715' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='69' column='1'/> + <var-decl name='kind' type-id='type-id-1716' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='69' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='err' type-id='type-id-1720' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='70' column='1'/> + <var-decl name='err' type-id='type-id-1721' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_err' type-id='type-id-1721' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='82' column='1'/> + <var-decl name='_err' type-id='type-id-1722' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='82' 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='71' column='1' id='type-id-1721'> + <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='71' column='1' id='type-id-1722'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-1722' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='80' column='1'/> + <var-decl name='kind' type-id='type-id-1723' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='80' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='exc' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='81' column='1'/> </data-member> </class-decl> - <enum-decl name='_Py_ext_module_loader_result_error_kind' filepath='./Include/internal/pycore_importdl.h' line='72' column='1' id='type-id-1722'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='_Py_ext_module_loader_result_error_kind' filepath='./Include/internal/pycore_importdl.h' line='72' column='1' id='type-id-1723'> + <underlying-type type-id='type-id-43'/> <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'/> @@ -28226,106 +28307,101 @@ <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-466' filepath='./Include/internal/pycore_importdl.h' line='91' column='1' id='type-id-1723'/> - <typedef-decl name='PyThread_ident_t' type-id='type-id-462' filepath='./Include/internal/pycore_pythread.h' line='119' column='1' id='type-id-1724'/> - <enum-decl name='_PyTime_round_t' naming-typedef-id='type-id-173' filepath='./Include/internal/pycore_time.h' line='68' column='1' id='type-id-1725'> - <underlying-type type-id='type-id-37'/> + <typedef-decl name='PyModInitFunction' type-id='type-id-468' filepath='./Include/internal/pycore_importdl.h' line='91' column='1' id='type-id-1724'/> + <typedef-decl name='PyThread_ident_t' type-id='type-id-464' filepath='./Include/internal/pycore_pythread.h' line='119' column='1' id='type-id-1725'/> + <enum-decl name='_PyTime_round_t' naming-typedef-id='type-id-179' filepath='./Include/internal/pycore_time.h' line='68' column='1' id='type-id-1726'> + <underlying-type type-id='type-id-43'/> <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-1725' filepath='./Include/internal/pycore_time.h' line='92' column='1' id='type-id-173'/> - <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-174'/> - <pointer-type-def type-id='type-id-1718' size-in-bits='64' id='type-id-1726'/> + <typedef-decl name='_PyTime_round_t' type-id='type-id-1726' filepath='./Include/internal/pycore_time.h' line='92' column='1' id='type-id-179'/> <pointer-type-def type-id='type-id-1719' size-in-bits='64' id='type-id-1727'/> - <pointer-type-def type-id='type-id-1721' size-in-bits='64' id='type-id-1720'/> - <var-decl name='PyImport_Inittab' type-id='type-id-1256' mangled-name='PyImport_Inittab' visibility='default' filepath='./Include/cpython/import.h' line='10' column='1' elf-symbol-id='PyImport_Inittab'/> - <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='_PyEval_EnsureBuiltinsWithModule' filepath='./Include/internal/pycore_ceval.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <pointer-type-def type-id='type-id-1720' size-in-bits='64' id='type-id-1728'/> + <pointer-type-def type-id='type-id-1722' size-in-bits='64' id='type-id-1721'/> + <var-decl name='PyImport_Inittab' type-id='type-id-1257' mangled-name='PyImport_Inittab' visibility='default' filepath='./Include/cpython/import.h' line='10' column='1' elf-symbol-id='PyImport_Inittab'/> + <function-decl name='_PyEval_EnsureBuiltinsWithModule' filepath='./Include/internal/pycore_ceval.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-241'/> <return type-id='type-id-5'/> </function-decl> <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-1726'/> + <parameter type-id='type-id-1727'/> <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-1726'/> + <parameter type-id='type-id-1727'/> <parameter type-id='type-id-6'/> <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='60' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1726'/> + <parameter type-id='type-id-1727'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_ext_module_loader_result_clear' filepath='./Include/internal/pycore_importdl.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1727'/> + <parameter type-id='type-id-1728'/> <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='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1727'/> + <parameter type-id='type-id-1728'/> <parameter type-id='type-id-4'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyImport_GetModInitFunc' filepath='./Include/internal/pycore_importdl.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1726'/> - <parameter type-id='type-id-61'/> - <return type-id='type-id-1723'/> + <parameter type-id='type-id-1727'/> + <parameter type-id='type-id-67'/> + <return type-id='type-id-1724'/> </function-decl> <function-decl name='_PyImport_RunModInitFunc' filepath='./Include/internal/pycore_importdl.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1723'/> - <parameter type-id='type-id-1726'/> + <parameter type-id='type-id-1724'/> <parameter type-id='type-id-1727'/> + <parameter type-id='type-id-1728'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyRecursiveMutex_IsLockedByCurrentThread' mangled-name='_PyRecursiveMutex_IsLockedByCurrentThread' filepath='./Include/internal/pycore_lock.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_IsLockedByCurrentThread'> - <parameter type-id='type-id-27'/> + <function-decl name='_PyRecursiveMutex_IsLockedByCurrentThread' mangled-name='_PyRecursiveMutex_IsLockedByCurrentThread' filepath='./Include/internal/pycore_lock.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_IsLockedByCurrentThread'> + <parameter type-id='type-id-33'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyRecursiveMutex_Unlock' mangled-name='_PyRecursiveMutex_Unlock' filepath='./Include/internal/pycore_lock.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_Unlock'> - <parameter type-id='type-id-27'/> + <function-decl name='_PyRecursiveMutex_Unlock' mangled-name='_PyRecursiveMutex_Unlock' filepath='./Include/internal/pycore_lock.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_Unlock'> + <parameter type-id='type-id-33'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_KeyedHash' filepath='./Include/internal/pycore_pyhash.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-111'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-117'/> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-7'/> - <return type-id='type-id-111'/> + <return type-id='type-id-117'/> </function-decl> - <function-decl name='_PyMem_DefaultRawMalloc' filepath='./Include/internal/pycore_pymem.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <function-decl name='_PyMem_DefaultRawMalloc' filepath='./Include/internal/pycore_pymem.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyMem_DefaultRawRealloc' filepath='./Include/internal/pycore_pymem.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <function-decl name='_PyMem_DefaultRawRealloc' filepath='./Include/internal/pycore_pymem.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyMem_DefaultRawFree' filepath='./Include/internal/pycore_pymem.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-35'/> + <function-decl name='_PyMem_DefaultRawFree' filepath='./Include/internal/pycore_pymem.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </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-1724'/> + <return type-id='type-id-1725'/> </function-decl> <function-decl name='_PySys_ClearAttrString' filepath='./Include/internal/pycore_sysmodule.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-4'/> <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='176' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsMicroseconds'> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-173'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-179'/> + <return type-id='type-id-34'/> </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-6'/> @@ -28349,22 +28425,22 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='PyState_FindModule' mangled-name='PyState_FindModule' filepath='Python/import.c' line='535' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_FindModule'> - <parameter type-id='type-id-473' name='module' filepath='Python/import.c' line='535' column='1'/> + <parameter type-id='type-id-475' name='module' filepath='Python/import.c' line='535' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyState_AddModule' mangled-name='_PyState_AddModule' filepath='Python/import.c' line='550' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyState_AddModule'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/import.c' line='550' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/import.c' line='550' column='1'/> <parameter type-id='type-id-6' name='module' filepath='Python/import.c' line='550' column='1'/> - <parameter type-id='type-id-473' name='def' filepath='Python/import.c' line='550' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Python/import.c' line='550' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyState_AddModule' mangled-name='PyState_AddModule' filepath='Python/import.c' line='568' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_AddModule'> <parameter type-id='type-id-6' name='module' filepath='Python/import.c' line='568' column='1'/> - <parameter type-id='type-id-473' name='def' filepath='Python/import.c' line='568' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Python/import.c' line='568' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyState_RemoveModule' mangled-name='PyState_RemoveModule' filepath='Python/import.c' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_RemoveModule'> - <parameter type-id='type-id-473' name='def' filepath='Python/import.c' line='598' column='1'/> + <parameter type-id='type-id-475' name='def' filepath='Python/import.c' line='598' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_ClearExtension' mangled-name='_PyImport_ClearExtension' filepath='Python/import.c' line='872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_ClearExtension'> @@ -28373,16 +28449,16 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='PyImport_ExtendInittab' mangled-name='PyImport_ExtendInittab' filepath='Python/import.c' line='2413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExtendInittab'> - <parameter type-id='type-id-1256' name='newtab' filepath='Python/import.c' line='2413' column='1'/> + <parameter type-id='type-id-1257' name='newtab' filepath='Python/import.c' line='2413' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyImport_AppendInittab' mangled-name='PyImport_AppendInittab' filepath='Python/import.c' line='2458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AppendInittab'> <parameter type-id='type-id-4' name='name' filepath='Python/import.c' line='2458' column='1'/> - <parameter type-id='type-id-466' name='initfunc' filepath='Python/import.c' line='2458' column='1'/> + <parameter type-id='type-id-468' name='initfunc' filepath='Python/import.c' line='2458' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyImport_GetMagicNumber' mangled-name='PyImport_GetMagicNumber' filepath='Python/import.c' line='2535' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetMagicNumber'> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </function-decl> <function-decl name='PyImport_GetMagicTag' mangled-name='PyImport_GetMagicTag' filepath='Python/import.c' line='2543' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetMagicTag'> <return type-id='type-id-4'/> @@ -28438,7 +28514,7 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/initconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='PyInitConfig' type-id='type-id-1728' filepath='./Include/cpython/initconfig.h' line='288' column='1' id='type-id-1729'/> + <typedef-decl name='PyInitConfig' type-id='type-id-1729' filepath='./Include/cpython/initconfig.h' line='288' column='1' id='type-id-1730'/> <class-decl name='_PyArgv' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='68' column='1' id='type-id-247'> <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='69' column='1'/> @@ -28447,19 +28523,19 @@ <var-decl name='use_bytes_argv' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='70' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='bytes_argv' type-id='type-id-129' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='71' column='1'/> + <var-decl name='bytes_argv' type-id='type-id-135' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='71' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='wchar_argv' type-id='type-id-1730' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='72' column='1'/> + <var-decl name='wchar_argv' type-id='type-id-1731' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='72' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyArgv' type-id='type-id-247' filepath='./Include/internal/pycore_initconfig.h' line='73' column='1' id='type-id-1731'/> - <class-decl name='_PyPreCmdline' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1732' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='101' column='1' id='type-id-1733'> + <typedef-decl name='_PyArgv' type-id='type-id-247' filepath='./Include/internal/pycore_initconfig.h' line='73' column='1' id='type-id-1732'/> + <class-decl name='_PyPreCmdline' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1733' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='101' column='1' id='type-id-1734'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='argv' type-id='type-id-977' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='102' column='1'/> + <var-decl name='argv' type-id='type-id-979' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='102' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='xoptions' type-id='type-id-977' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='103' column='1'/> + <var-decl name='xoptions' type-id='type-id-979' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='103' 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='104' column='1'/> @@ -28474,48 +28550,48 @@ <var-decl name='warn_default_encoding' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='107' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyPreCmdline' type-id='type-id-1733' filepath='./Include/internal/pycore_initconfig.h' line='108' column='1' id='type-id-1732'/> - <class-decl name='PyInitConfig' size-in-bits='4416' is-struct='yes' visibility='default' filepath='Python/initconfig.c' line='3692' column='1' id='type-id-1728'> + <typedef-decl name='_PyPreCmdline' type-id='type-id-1734' filepath='./Include/internal/pycore_initconfig.h' line='108' column='1' id='type-id-1733'/> + <class-decl name='PyInitConfig' size-in-bits='4416' is-struct='yes' visibility='default' filepath='Python/initconfig.c' line='3694' column='1' id='type-id-1729'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='preconfig' type-id='type-id-980' visibility='default' filepath='Python/initconfig.c' line='3693' column='1'/> + <var-decl name='preconfig' type-id='type-id-982' visibility='default' filepath='Python/initconfig.c' line='3695' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='config' type-id='type-id-272' visibility='default' filepath='Python/initconfig.c' line='3694' column='1'/> + <var-decl name='config' type-id='type-id-274' visibility='default' filepath='Python/initconfig.c' line='3696' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='inittab' type-id='type-id-1256' visibility='default' filepath='Python/initconfig.c' line='3695' column='1'/> + <var-decl name='inittab' type-id='type-id-1257' visibility='default' filepath='Python/initconfig.c' line='3697' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4032'> - <var-decl name='inittab_size' type-id='type-id-7' visibility='default' filepath='Python/initconfig.c' line='3696' column='1'/> + <var-decl name='inittab_size' type-id='type-id-7' visibility='default' filepath='Python/initconfig.c' line='3698' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4096'> - <var-decl name='status' type-id='type-id-66' visibility='default' filepath='Python/initconfig.c' line='3697' column='1'/> + <var-decl name='status' type-id='type-id-72' visibility='default' filepath='Python/initconfig.c' line='3699' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='4352'> - <var-decl name='err_msg' type-id='type-id-17' visibility='default' filepath='Python/initconfig.c' line='3698' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-1729' size-in-bits='64' id='type-id-1734'/> - <pointer-type-def type-id='type-id-980' size-in-bits='64' id='type-id-1735'/> - <pointer-type-def type-id='type-id-977' size-in-bits='64' id='type-id-1736'/> - <pointer-type-def type-id='type-id-1732' size-in-bits='64' id='type-id-1737'/> - <pointer-type-def type-id='type-id-251' size-in-bits='64' id='type-id-1738'/> - <qualified-type-def type-id='type-id-980' const='yes' id='type-id-1739'/> - <pointer-type-def type-id='type-id-1739' size-in-bits='64' id='type-id-250'/> - <qualified-type-def type-id='type-id-977' const='yes' id='type-id-1740'/> - <pointer-type-def type-id='type-id-1740' size-in-bits='64' id='type-id-239'/> - <qualified-type-def type-id='type-id-1731' const='yes' id='type-id-1741'/> - <pointer-type-def type-id='type-id-1741' size-in-bits='64' id='type-id-1742'/> - <qualified-type-def type-id='type-id-1732' const='yes' id='type-id-1743'/> - <pointer-type-def type-id='type-id-1743' size-in-bits='64' id='type-id-1744'/> - <qualified-type-def type-id='type-id-18' restrict='yes' id='type-id-20'/> - <qualified-type-def type-id='type-id-63' const='yes' id='type-id-1745'/> - <pointer-type-def type-id='type-id-1745' size-in-bits='64' id='type-id-1730'/> - <qualified-type-def type-id='type-id-63' restrict='yes' id='type-id-19'/> - <qualified-type-def type-id='type-id-244' restrict='yes' id='type-id-1746'/> - <pointer-type-def type-id='type-id-244' size-in-bits='64' id='type-id-1747'/> + <var-decl name='err_msg' type-id='type-id-24' visibility='default' filepath='Python/initconfig.c' line='3700' column='1'/> + </data-member> + </class-decl> + <pointer-type-def type-id='type-id-1730' size-in-bits='64' id='type-id-1735'/> + <pointer-type-def type-id='type-id-982' size-in-bits='64' id='type-id-1736'/> + <pointer-type-def type-id='type-id-979' size-in-bits='64' id='type-id-1737'/> + <pointer-type-def type-id='type-id-1733' size-in-bits='64' id='type-id-1738'/> + <pointer-type-def type-id='type-id-251' size-in-bits='64' id='type-id-1739'/> + <qualified-type-def type-id='type-id-982' const='yes' id='type-id-1740'/> + <pointer-type-def type-id='type-id-1740' size-in-bits='64' id='type-id-250'/> + <qualified-type-def type-id='type-id-979' const='yes' id='type-id-1741'/> + <pointer-type-def type-id='type-id-1741' size-in-bits='64' id='type-id-239'/> + <qualified-type-def type-id='type-id-1732' const='yes' id='type-id-1742'/> + <pointer-type-def type-id='type-id-1742' size-in-bits='64' id='type-id-1743'/> + <qualified-type-def type-id='type-id-1733' const='yes' id='type-id-1744'/> + <pointer-type-def type-id='type-id-1744' size-in-bits='64' id='type-id-1745'/> + <qualified-type-def type-id='type-id-25' restrict='yes' id='type-id-27'/> + <qualified-type-def type-id='type-id-69' const='yes' id='type-id-1746'/> + <pointer-type-def type-id='type-id-1746' size-in-bits='64' id='type-id-1731'/> + <qualified-type-def type-id='type-id-69' restrict='yes' id='type-id-26'/> + <qualified-type-def type-id='type-id-244' restrict='yes' id='type-id-1747'/> + <pointer-type-def type-id='type-id-244' size-in-bits='64' id='type-id-1748'/> <function-decl name='PyPreConfig_InitIsolatedConfig' mangled-name='PyPreConfig_InitIsolatedConfig' filepath='./Include/cpython/initconfig.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPreConfig_InitIsolatedConfig'> - <parameter type-id='type-id-1735'/> + <parameter type-id='type-id-1736'/> <return type-id='type-id-3'/> </function-decl> <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'/> @@ -28537,44 +28613,44 @@ <parameter type-id='type-id-250'/> <parameter type-id='type-id-7'/> <parameter type-id='type-id-244'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <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-4'/> - <parameter type-id='type-id-62'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-68'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_Py_DecodeUTF8Ex' filepath='./Include/internal/pycore_fileutils.h' line='195' 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-244'/> - <parameter type-id='type-id-62'/> + <parameter type-id='type-id-68'/> <parameter type-id='type-id-266'/> - <parameter type-id='type-id-614'/> + <parameter type-id='type-id-616'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_EncodeUTF8Ex' filepath='./Include/internal/pycore_fileutils.h' line='203' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> + <parameter type-id='type-id-25'/> <parameter type-id='type-id-251'/> - <parameter type-id='type-id-62'/> + <parameter type-id='type-id-68'/> <parameter type-id='type-id-266'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-614'/> + <parameter type-id='type-id-616'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_GetForceASCII' filepath='./Include/internal/pycore_fileutils.h' line='219' 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='237' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_Py_isabs' filepath='./Include/internal/pycore_fileutils.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> + <parameter type-id='type-id-25'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_abspath' filepath='./Include/internal/pycore_fileutils.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> + <parameter type-id='type-id-25'/> <parameter type-id='type-id-244'/> <return type-id='type-id-5'/> </function-decl> @@ -28583,24 +28659,24 @@ </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-1730'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-1731'/> + <parameter type-id='type-id-183'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyArgv_AsWstrList' filepath='./Include/internal/pycore_initconfig.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1742'/> - <parameter type-id='type-id-1736'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1743'/> + <parameter type-id='type-id-1737'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_Py_str_to_int' filepath='./Include/internal/pycore_initconfig.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-183'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_get_xoption' filepath='./Include/internal/pycore_initconfig.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-239'/> - <parameter type-id='type-id-18'/> - <return type-id='type-id-18'/> + <parameter type-id='type-id-25'/> + <return type-id='type-id-25'/> </function-decl> <function-decl name='_Py_GetEnv' filepath='./Include/internal/pycore_initconfig.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> @@ -28609,67 +28685,67 @@ </function-decl> <function-decl name='_Py_get_env_flag' filepath='./Include/internal/pycore_initconfig.h' line='90' 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-183'/> <parameter type-id='type-id-4'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyPreCmdline_Clear' filepath='./Include/internal/pycore_initconfig.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1737'/> + <parameter type-id='type-id-1738'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyPreCmdline_SetConfig' filepath='./Include/internal/pycore_initconfig.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1744'/> - <parameter type-id='type-id-65'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1745'/> + <parameter type-id='type-id-71'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyPreCmdline_Read' filepath='./Include/internal/pycore_initconfig.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1737'/> + <parameter type-id='type-id-1738'/> <parameter type-id='type-id-250'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyPreConfig_InitFromPreConfig' filepath='./Include/internal/pycore_initconfig.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1735'/> + <parameter type-id='type-id-1736'/> <parameter type-id='type-id-250'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyPreConfig_AsDict' filepath='./Include/internal/pycore_initconfig.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-250'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyPreConfig_GetConfig' filepath='./Include/internal/pycore_initconfig.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1735'/> + <parameter type-id='type-id-1736'/> <parameter type-id='type-id-240'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyConfig_InitPathConfig' filepath='./Include/internal/pycore_initconfig.h' line='173' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-65'/> + <parameter type-id='type-id-71'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_Py_IsLocaleCoercionTarget' filepath='./Include/internal/pycore_pylifecycle.h' line='25' 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='_PySys_ReadPreinitWarnOptions' filepath='./Include/internal/pycore_pylifecycle.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1736'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1737'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PySys_ReadPreinitXOptions' filepath='./Include/internal/pycore_pylifecycle.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-65'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-71'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_Py_PreInitializeFromConfig' filepath='./Include/internal/pycore_pylifecycle.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> + <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-240'/> - <parameter type-id='type-id-1742'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1743'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyMem_RawStrdup' filepath='./Include/internal/pycore_pymem.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </function-decl> - <function-decl name='_PyMem_DefaultRawWcsdup' filepath='./Include/internal/pycore_pymem.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> - <return type-id='type-id-63'/> + <function-decl name='_PyMem_DefaultRawWcsdup' filepath='./Include/internal/pycore_pymem.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-25'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='_PySys_SetFlagObj' filepath='./Include/internal/pycore_sysmodule.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-7'/> @@ -28688,13 +28764,13 @@ <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-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-486'/> - <parameter type-id='type-id-182'/> + <parameter type-id='type-id-488'/> + <parameter type-id='type-id-13'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <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'> @@ -28711,199 +28787,199 @@ <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-180'/> - <parameter type-id='type-id-183'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-187'/> <parameter type-id='type-id-5'/> <return type-id='type-id-2'/> </function-decl> <function-decl name='strdup' filepath='/usr/include/string.h' line='187' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> - <return type-id='type-id-17'/> + <return type-id='type-id-24'/> </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-474'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-476'/> + <return type-id='type-id-69'/> </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-1746'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-1747'/> + <return type-id='type-id-69'/> </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-1746'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-1747'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-184'/> + <return type-id='type-id-188'/> </function-decl> - <function-decl name='PyStatus_Exit' mangled-name='PyStatus_Exit' filepath='Python/initconfig.c' line='587' 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='587' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyStatus_Exit' mangled-name='PyStatus_Exit' filepath='Python/initconfig.c' line='589' 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='589' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='PyStatus_IsError' mangled-name='PyStatus_IsError' filepath='Python/initconfig.c' line='591' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsError'> - <parameter type-id='type-id-66' name='status' filepath='Python/initconfig.c' line='591' column='1'/> + <function-decl name='PyStatus_IsError' mangled-name='PyStatus_IsError' filepath='Python/initconfig.c' line='593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsError'> + <parameter type-id='type-id-72' name='status' filepath='Python/initconfig.c' line='593' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyStatus_IsExit' mangled-name='PyStatus_IsExit' filepath='Python/initconfig.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsExit'> - <parameter type-id='type-id-66' name='status' filepath='Python/initconfig.c' line='594' column='1'/> + <function-decl name='PyStatus_IsExit' mangled-name='PyStatus_IsExit' filepath='Python/initconfig.c' line='596' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsExit'> + <parameter type-id='type-id-72' name='status' filepath='Python/initconfig.c' line='596' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyWideStringList_Insert' mangled-name='PyWideStringList_Insert' filepath='Python/initconfig.c' line='732' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Insert'> - <parameter type-id='type-id-1736' name='list' filepath='Python/initconfig.c' line='732' column='1'/> - <parameter type-id='type-id-7' name='index' filepath='Python/initconfig.c' line='733' column='1'/> - <parameter type-id='type-id-18' name='item' filepath='Python/initconfig.c' line='733' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyWideStringList_Insert' mangled-name='PyWideStringList_Insert' filepath='Python/initconfig.c' line='734' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Insert'> + <parameter type-id='type-id-1737' name='list' filepath='Python/initconfig.c' line='734' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Python/initconfig.c' line='735' column='1'/> + <parameter type-id='type-id-25' name='item' filepath='Python/initconfig.c' line='735' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='PyWideStringList_Append' mangled-name='PyWideStringList_Append' filepath='Python/initconfig.c' line='773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Append'> - <parameter type-id='type-id-1736' name='list' filepath='Python/initconfig.c' line='773' column='1'/> - <parameter type-id='type-id-18' name='item' filepath='Python/initconfig.c' line='773' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyWideStringList_Append' mangled-name='PyWideStringList_Append' filepath='Python/initconfig.c' line='775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Append'> + <parameter type-id='type-id-1737' name='list' filepath='Python/initconfig.c' line='775' column='1'/> + <parameter type-id='type-id-25' name='item' filepath='Python/initconfig.c' line='775' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='Py_GetArgcArgv' mangled-name='Py_GetArgcArgv' filepath='Python/initconfig.c' line='870' 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='870' column='1'/> - <parameter type-id='type-id-1747' name='argv' filepath='Python/initconfig.c' line='870' column='1'/> + <function-decl name='Py_GetArgcArgv' mangled-name='Py_GetArgcArgv' filepath='Python/initconfig.c' line='872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetArgcArgv'> + <parameter type-id='type-id-183' name='argc' filepath='Python/initconfig.c' line='872' column='1'/> + <parameter type-id='type-id-1748' name='argv' filepath='Python/initconfig.c' line='872' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyConfig_InitCompatConfig' mangled-name='_PyConfig_InitCompatConfig' filepath='Python/initconfig.c' line='1003' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_InitCompatConfig'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='1003' column='1'/> + <function-decl name='_PyConfig_InitCompatConfig' mangled-name='_PyConfig_InitCompatConfig' filepath='Python/initconfig.c' line='1005' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_InitCompatConfig'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='1005' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyConfig_InitIsolatedConfig' mangled-name='PyConfig_InitIsolatedConfig' filepath='Python/initconfig.c' line='1114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitIsolatedConfig'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='1114' column='1'/> + <function-decl name='PyConfig_InitIsolatedConfig' mangled-name='PyConfig_InitIsolatedConfig' filepath='Python/initconfig.c' line='1116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitIsolatedConfig'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='1116' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyConfig_SetString' mangled-name='PyConfig_SetString' filepath='Python/initconfig.c' line='1146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetString'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='1146' column='1'/> - <parameter type-id='type-id-244' name='config_str' filepath='Python/initconfig.c' line='1146' column='1'/> - <parameter type-id='type-id-18' name='str' filepath='Python/initconfig.c' line='1146' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyConfig_SetString' mangled-name='PyConfig_SetString' filepath='Python/initconfig.c' line='1148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetString'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='1148' column='1'/> + <parameter type-id='type-id-244' name='config_str' filepath='Python/initconfig.c' line='1148' column='1'/> + <parameter type-id='type-id-25' name='str' filepath='Python/initconfig.c' line='1148' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='PyConfig_SetBytesString' mangled-name='PyConfig_SetBytesString' filepath='Python/initconfig.c' line='1208' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesString'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='1208' column='1'/> - <parameter type-id='type-id-244' name='config_str' filepath='Python/initconfig.c' line='1208' column='1'/> - <parameter type-id='type-id-4' name='str' filepath='Python/initconfig.c' line='1209' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyConfig_SetBytesString' mangled-name='PyConfig_SetBytesString' filepath='Python/initconfig.c' line='1210' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesString'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='1210' column='1'/> + <parameter type-id='type-id-244' name='config_str' filepath='Python/initconfig.c' line='1210' column='1'/> + <parameter type-id='type-id-4' name='str' filepath='Python/initconfig.c' line='1211' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_PyConfig_AsDict' mangled-name='_PyConfig_AsDict' filepath='Python/initconfig.c' line='1279' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_AsDict'> - <parameter type-id='type-id-240' name='config' filepath='Python/initconfig.c' line='1279' column='1'/> + <function-decl name='_PyConfig_AsDict' mangled-name='_PyConfig_AsDict' filepath='Python/initconfig.c' line='1281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_AsDict'> + <parameter type-id='type-id-240' name='config' filepath='Python/initconfig.c' line='1281' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyConfig_FromDict' mangled-name='_PyConfig_FromDict' filepath='Python/initconfig.c' line='1513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_FromDict'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='1513' column='1'/> - <parameter type-id='type-id-6' name='dict' filepath='Python/initconfig.c' line='1513' column='1'/> + <function-decl name='_PyConfig_FromDict' mangled-name='_PyConfig_FromDict' filepath='Python/initconfig.c' line='1515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_FromDict'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='1515' column='1'/> + <parameter type-id='type-id-6' name='dict' filepath='Python/initconfig.c' line='1515' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyConfig_SetArgv' mangled-name='PyConfig_SetArgv' filepath='Python/initconfig.c' line='3431' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetArgv'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='3431' column='1'/> - <parameter type-id='type-id-7' name='argc' filepath='Python/initconfig.c' line='3431' column='1'/> - <parameter type-id='type-id-1730' name='argv' filepath='Python/initconfig.c' line='3431' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyConfig_SetArgv' mangled-name='PyConfig_SetArgv' filepath='Python/initconfig.c' line='3433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetArgv'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='3433' column='1'/> + <parameter type-id='type-id-7' name='argc' filepath='Python/initconfig.c' line='3433' column='1'/> + <parameter type-id='type-id-1731' name='argv' filepath='Python/initconfig.c' line='3433' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='PyConfig_SetWideStringList' mangled-name='PyConfig_SetWideStringList' filepath='Python/initconfig.c' line='3443' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetWideStringList'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='3443' column='1'/> - <parameter type-id='type-id-1736' name='list' filepath='Python/initconfig.c' line='3443' column='1'/> - <parameter type-id='type-id-7' name='length' filepath='Python/initconfig.c' line='3444' column='1'/> - <parameter type-id='type-id-244' name='items' filepath='Python/initconfig.c' line='3444' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyConfig_SetWideStringList' mangled-name='PyConfig_SetWideStringList' filepath='Python/initconfig.c' line='3445' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetWideStringList'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='3445' column='1'/> + <parameter type-id='type-id-1737' name='list' filepath='Python/initconfig.c' line='3445' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Python/initconfig.c' line='3446' column='1'/> + <parameter type-id='type-id-244' name='items' filepath='Python/initconfig.c' line='3446' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='PyConfig_Read' mangled-name='PyConfig_Read' filepath='Python/initconfig.c' line='3527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Read'> - <parameter type-id='type-id-65' name='config' filepath='Python/initconfig.c' line='3527' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='PyConfig_Read' mangled-name='PyConfig_Read' filepath='Python/initconfig.c' line='3529' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Read'> + <parameter type-id='type-id-71' name='config' filepath='Python/initconfig.c' line='3529' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_Py_GetConfigsAsDict' mangled-name='_Py_GetConfigsAsDict' filepath='Python/initconfig.c' line='3534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetConfigsAsDict'> + <function-decl name='_Py_GetConfigsAsDict' mangled-name='_Py_GetConfigsAsDict' filepath='Python/initconfig.c' line='3536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetConfigsAsDict'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyInitConfig_Create' mangled-name='PyInitConfig_Create' filepath='Python/initconfig.c' line='3709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_Create'> - <return type-id='type-id-1734'/> + <function-decl name='PyInitConfig_Create' mangled-name='PyInitConfig_Create' filepath='Python/initconfig.c' line='3711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_Create'> + <return type-id='type-id-1735'/> </function-decl> - <function-decl name='PyInitConfig_Free' mangled-name='PyInitConfig_Free' filepath='Python/initconfig.c' line='3723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_Free'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3723' column='1'/> + <function-decl name='PyInitConfig_Free' mangled-name='PyInitConfig_Free' filepath='Python/initconfig.c' line='3725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_Free'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3725' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyInitConfig_GetError' mangled-name='PyInitConfig_GetError' filepath='Python/initconfig.c' line='3734' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetError'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3734' column='1'/> - <parameter type-id='type-id-266' name='perr_msg' filepath='Python/initconfig.c' line='3734' column='1'/> + <function-decl name='PyInitConfig_GetError' mangled-name='PyInitConfig_GetError' filepath='Python/initconfig.c' line='3739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetError'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3739' column='1'/> + <parameter type-id='type-id-266' name='perr_msg' filepath='Python/initconfig.c' line='3739' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_GetExitCode' mangled-name='PyInitConfig_GetExitCode' filepath='Python/initconfig.c' line='3765' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetExitCode'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3765' column='1'/> - <parameter type-id='type-id-177' name='exitcode' filepath='Python/initconfig.c' line='3765' column='1'/> + <function-decl name='PyInitConfig_GetExitCode' mangled-name='PyInitConfig_GetExitCode' filepath='Python/initconfig.c' line='3770' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetExitCode'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3770' column='1'/> + <parameter type-id='type-id-183' name='exitcode' filepath='Python/initconfig.c' line='3770' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_HasOption' mangled-name='PyInitConfig_HasOption' filepath='Python/initconfig.c' line='3797' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_HasOption'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3797' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3797' column='1'/> + <function-decl name='PyInitConfig_HasOption' mangled-name='PyInitConfig_HasOption' filepath='Python/initconfig.c' line='3802' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_HasOption'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3802' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3802' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_GetInt' mangled-name='PyInitConfig_GetInt' filepath='Python/initconfig.c' line='3828' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetInt'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3828' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3828' column='1'/> - <parameter type-id='type-id-458' name='value' filepath='Python/initconfig.c' line='3828' column='1'/> + <function-decl name='PyInitConfig_GetInt' mangled-name='PyInitConfig_GetInt' filepath='Python/initconfig.c' line='3833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetInt'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3833' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3833' column='1'/> + <parameter type-id='type-id-460' name='value' filepath='Python/initconfig.c' line='3833' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_GetStr' mangled-name='PyInitConfig_GetStr' filepath='Python/initconfig.c' line='3898' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetStr'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3898' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3898' column='1'/> - <parameter type-id='type-id-251' name='value' filepath='Python/initconfig.c' line='3898' column='1'/> + <function-decl name='PyInitConfig_GetStr' mangled-name='PyInitConfig_GetStr' filepath='Python/initconfig.c' line='3903' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetStr'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3903' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3903' column='1'/> + <parameter type-id='type-id-251' name='value' filepath='Python/initconfig.c' line='3903' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_GetStrList' mangled-name='PyInitConfig_GetStrList' filepath='Python/initconfig.c' line='3928' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetStrList'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3928' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3928' column='1'/> - <parameter type-id='type-id-62' name='length' filepath='Python/initconfig.c' line='3928' column='1'/> - <parameter type-id='type-id-1738' name='items' filepath='Python/initconfig.c' line='3928' column='1'/> + <function-decl name='PyInitConfig_GetStrList' mangled-name='PyInitConfig_GetStrList' filepath='Python/initconfig.c' line='3933' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_GetStrList'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3933' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3933' column='1'/> + <parameter type-id='type-id-68' name='length' filepath='Python/initconfig.c' line='3933' column='1'/> + <parameter type-id='type-id-1739' name='items' filepath='Python/initconfig.c' line='3933' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_FreeStrList' mangled-name='PyInitConfig_FreeStrList' filepath='Python/initconfig.c' line='3962' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_FreeStrList'> - <parameter type-id='type-id-21' name='length' filepath='Python/initconfig.c' line='3962' column='1'/> - <parameter type-id='type-id-251' name='items' filepath='Python/initconfig.c' line='3962' column='1'/> + <function-decl name='PyInitConfig_FreeStrList' mangled-name='PyInitConfig_FreeStrList' filepath='Python/initconfig.c' line='3967' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_FreeStrList'> + <parameter type-id='type-id-14' name='length' filepath='Python/initconfig.c' line='3967' column='1'/> + <parameter type-id='type-id-251' name='items' filepath='Python/initconfig.c' line='3967' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyInitConfig_SetInt' mangled-name='PyInitConfig_SetInt' filepath='Python/initconfig.c' line='3972' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_SetInt'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='3972' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3972' column='1'/> - <parameter type-id='type-id-409' name='value' filepath='Python/initconfig.c' line='3972' column='1'/> + <function-decl name='PyInitConfig_SetInt' mangled-name='PyInitConfig_SetInt' filepath='Python/initconfig.c' line='3977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_SetInt'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='3977' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='3977' column='1'/> + <parameter type-id='type-id-411' name='value' filepath='Python/initconfig.c' line='3977' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_SetStr' mangled-name='PyInitConfig_SetStr' filepath='Python/initconfig.c' line='4068' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_SetStr'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='4068' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4068' column='1'/> - <parameter type-id='type-id-4' name='value' filepath='Python/initconfig.c' line='4068' column='1'/> + <function-decl name='PyInitConfig_SetStr' mangled-name='PyInitConfig_SetStr' filepath='Python/initconfig.c' line='4073' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_SetStr'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='4073' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4073' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Python/initconfig.c' line='4073' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_SetStrList' mangled-name='PyInitConfig_SetStrList' filepath='Python/initconfig.c' line='4125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_SetStrList'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='4125' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4125' column='1'/> - <parameter type-id='type-id-21' name='length' filepath='Python/initconfig.c' line='4126' column='1'/> - <parameter type-id='type-id-129' name='items' filepath='Python/initconfig.c' line='4126' column='1'/> + <function-decl name='PyInitConfig_SetStrList' mangled-name='PyInitConfig_SetStrList' filepath='Python/initconfig.c' line='4168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_SetStrList'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='4168' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4168' column='1'/> + <parameter type-id='type-id-14' name='length' filepath='Python/initconfig.c' line='4169' column='1'/> + <parameter type-id='type-id-135' name='items' filepath='Python/initconfig.c' line='4169' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyInitConfig_AddModule' mangled-name='PyInitConfig_AddModule' filepath='Python/initconfig.c' line='4151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_AddModule'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='4151' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4151' column='1'/> - <parameter type-id='type-id-466' name='initfunc' filepath='Python/initconfig.c' line='4152' column='1'/> + <function-decl name='PyInitConfig_AddModule' mangled-name='PyInitConfig_AddModule' filepath='Python/initconfig.c' line='4194' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInitConfig_AddModule'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='4194' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4194' column='1'/> + <parameter type-id='type-id-468' name='initfunc' filepath='Python/initconfig.c' line='4195' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='Py_InitializeFromInitConfig' mangled-name='Py_InitializeFromInitConfig' filepath='Python/initconfig.c' line='4177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_InitializeFromInitConfig'> - <parameter type-id='type-id-1734' name='config' filepath='Python/initconfig.c' line='4177' column='1'/> + <function-decl name='Py_InitializeFromInitConfig' mangled-name='Py_InitializeFromInitConfig' filepath='Python/initconfig.c' line='4220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_InitializeFromInitConfig'> + <parameter type-id='type-id-1735' name='config' filepath='Python/initconfig.c' line='4220' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyConfig_Get' mangled-name='PyConfig_Get' filepath='Python/initconfig.c' line='4412' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Get'> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4412' column='1'/> + <function-decl name='PyConfig_Get' mangled-name='PyConfig_Get' filepath='Python/initconfig.c' line='4455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Get'> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4455' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyConfig_GetInt' mangled-name='PyConfig_GetInt' filepath='Python/initconfig.c' line='4432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_GetInt'> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4432' column='1'/> - <parameter type-id='type-id-177' name='value' filepath='Python/initconfig.c' line='4432' column='1'/> + <function-decl name='PyConfig_GetInt' mangled-name='PyConfig_GetInt' filepath='Python/initconfig.c' line='4475' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_GetInt'> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4475' column='1'/> + <parameter type-id='type-id-183' name='value' filepath='Python/initconfig.c' line='4475' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyConfig_Names' mangled-name='PyConfig_Names' filepath='Python/initconfig.c' line='4482' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Names'> + <function-decl name='PyConfig_Names' mangled-name='PyConfig_Names' filepath='Python/initconfig.c' line='4525' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Names'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyConfig_Set' mangled-name='PyConfig_Set' filepath='Python/initconfig.c' line='4574' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Set'> - <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4574' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Python/initconfig.c' line='4574' column='1'/> + <function-decl name='PyConfig_Set' mangled-name='PyConfig_Set' filepath='Python/initconfig.c' line='4617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Set'> + <parameter type-id='type-id-4' name='name' filepath='Python/initconfig.c' line='4617' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Python/initconfig.c' line='4617' column='1'/> <return type-id='type-id-5'/> </function-decl> </abi-instr> @@ -28911,219 +28987,219 @@ <var-decl name='_PyInstructionSequence_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='77' 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='39' column='1' id='type-id-1748'> + <class-decl name='_PyMonitoringState' size-in-bits='16' is-struct='yes' visibility='default' filepath='./Include/cpython/monitoring.h' line='39' column='1' id='type-id-1749'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='active' type-id='type-id-309' visibility='default' filepath='./Include/cpython/monitoring.h' line='40' column='1'/> + <var-decl name='active' type-id='type-id-311' visibility='default' filepath='./Include/cpython/monitoring.h' line='40' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='opaque' type-id='type-id-309' visibility='default' filepath='./Include/cpython/monitoring.h' line='41' column='1'/> + <var-decl name='opaque' type-id='type-id-311' visibility='default' filepath='./Include/cpython/monitoring.h' line='41' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyMonitoringState' type-id='type-id-1748' filepath='./Include/cpython/monitoring.h' line='42' column='1' id='type-id-1749'/> - <pointer-type-def type-id='type-id-1749' size-in-bits='64' id='type-id-1750'/> - <var-decl name='_PyInstrumentation_MISSING' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='68' column='1'/> - <var-decl name='_PyInstrumentation_DISABLE' type-id='type-id-390' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='69' column='1'/> - <function-decl name='PyMonitoring_EnterScope' mangled-name='PyMonitoring_EnterScope' filepath='Python/instrumentation.c' line='2643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMonitoring_EnterScope'> - <parameter type-id='type-id-1750' name='state_array' filepath='Python/instrumentation.c' line='2643' column='1'/> - <parameter type-id='type-id-460' name='version' filepath='Python/instrumentation.c' line='2643' column='1'/> - <parameter type-id='type-id-326' name='event_types' filepath='Python/instrumentation.c' line='2644' column='1'/> - <parameter type-id='type-id-7' name='length' filepath='Python/instrumentation.c' line='2644' column='1'/> + <typedef-decl name='PyMonitoringState' type-id='type-id-1749' filepath='./Include/cpython/monitoring.h' line='42' column='1' id='type-id-1750'/> + <pointer-type-def type-id='type-id-1750' size-in-bits='64' id='type-id-1751'/> + <var-decl name='_PyInstrumentation_MISSING' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='68' column='1'/> + <var-decl name='_PyInstrumentation_DISABLE' type-id='type-id-392' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='69' column='1'/> + <function-decl name='PyMonitoring_EnterScope' mangled-name='PyMonitoring_EnterScope' filepath='Python/instrumentation.c' line='2647' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMonitoring_EnterScope'> + <parameter type-id='type-id-1751' name='state_array' filepath='Python/instrumentation.c' line='2647' column='1'/> + <parameter type-id='type-id-462' name='version' filepath='Python/instrumentation.c' line='2647' column='1'/> + <parameter type-id='type-id-328' name='event_types' filepath='Python/instrumentation.c' line='2648' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Python/instrumentation.c' line='2648' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyMonitoring_ExitScope' mangled-name='PyMonitoring_ExitScope' filepath='Python/instrumentation.c' line='2661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMonitoring_ExitScope'> + <function-decl name='PyMonitoring_ExitScope' mangled-name='PyMonitoring_ExitScope' filepath='Python/instrumentation.c' line='2665' 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='2667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyStartEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2667' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2667' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2667' column='1'/> + <function-decl name='_PyMonitoring_FirePyStartEvent' mangled-name='_PyMonitoring_FirePyStartEvent' filepath='Python/instrumentation.c' line='2671' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyStartEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2671' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2671' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2671' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FirePyResumeEvent' mangled-name='_PyMonitoring_FirePyResumeEvent' filepath='Python/instrumentation.c' line='2676' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyResumeEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2676' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2676' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2676' column='1'/> + <function-decl name='_PyMonitoring_FirePyResumeEvent' mangled-name='_PyMonitoring_FirePyResumeEvent' filepath='Python/instrumentation.c' line='2680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyResumeEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2680' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2680' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2680' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FirePyReturnEvent' mangled-name='_PyMonitoring_FirePyReturnEvent' filepath='Python/instrumentation.c' line='2687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyReturnEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2687' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2687' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2687' column='1'/> - <parameter type-id='type-id-6' name='retval' filepath='Python/instrumentation.c' line='2688' column='1'/> + <function-decl name='_PyMonitoring_FirePyReturnEvent' mangled-name='_PyMonitoring_FirePyReturnEvent' filepath='Python/instrumentation.c' line='2691' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyReturnEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2691' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2691' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2691' column='1'/> + <parameter type-id='type-id-6' name='retval' filepath='Python/instrumentation.c' line='2692' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FirePyYieldEvent' mangled-name='_PyMonitoring_FirePyYieldEvent' filepath='Python/instrumentation.c' line='2697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyYieldEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2697' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2697' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2697' column='1'/> - <parameter type-id='type-id-6' name='retval' filepath='Python/instrumentation.c' line='2698' column='1'/> + <function-decl name='_PyMonitoring_FirePyYieldEvent' mangled-name='_PyMonitoring_FirePyYieldEvent' filepath='Python/instrumentation.c' line='2701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyYieldEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2701' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2701' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2701' column='1'/> + <parameter type-id='type-id-6' name='retval' filepath='Python/instrumentation.c' line='2702' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireCallEvent' mangled-name='_PyMonitoring_FireCallEvent' filepath='Python/instrumentation.c' line='2707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCallEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2707' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2707' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2707' column='1'/> - <parameter type-id='type-id-6' name='callable' filepath='Python/instrumentation.c' line='2708' column='1'/> - <parameter type-id='type-id-6' name='arg0' filepath='Python/instrumentation.c' line='2708' column='1'/> + <function-decl name='_PyMonitoring_FireCallEvent' mangled-name='_PyMonitoring_FireCallEvent' filepath='Python/instrumentation.c' line='2711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCallEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2711' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2711' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2711' column='1'/> + <parameter type-id='type-id-6' name='callable' filepath='Python/instrumentation.c' line='2712' column='1'/> + <parameter type-id='type-id-6' name='arg0' filepath='Python/instrumentation.c' line='2712' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireLineEvent' mangled-name='_PyMonitoring_FireLineEvent' filepath='Python/instrumentation.c' line='2717' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireLineEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2717' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2717' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2717' column='1'/> - <parameter type-id='type-id-5' name='lineno' filepath='Python/instrumentation.c' line='2718' column='1'/> + <function-decl name='_PyMonitoring_FireLineEvent' mangled-name='_PyMonitoring_FireLineEvent' filepath='Python/instrumentation.c' line='2721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireLineEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2721' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2721' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2721' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/instrumentation.c' line='2722' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireJumpEvent' mangled-name='_PyMonitoring_FireJumpEvent' filepath='Python/instrumentation.c' line='2733' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireJumpEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2733' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2733' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2733' column='1'/> - <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2734' column='1'/> + <function-decl name='_PyMonitoring_FireJumpEvent' mangled-name='_PyMonitoring_FireJumpEvent' filepath='Python/instrumentation.c' line='2737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireJumpEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2737' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2737' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2737' column='1'/> + <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2738' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireBranchEvent' mangled-name='_PyMonitoring_FireBranchEvent' filepath='Python/instrumentation.c' line='2743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2743' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2743' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2743' column='1'/> - <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2744' column='1'/> + <function-decl name='_PyMonitoring_FireBranchEvent' mangled-name='_PyMonitoring_FireBranchEvent' filepath='Python/instrumentation.c' line='2747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2747' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2747' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2747' column='1'/> + <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2748' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireBranchRightEvent' mangled-name='_PyMonitoring_FireBranchRightEvent' filepath='Python/instrumentation.c' line='2753' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchRightEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2753' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2753' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2753' column='1'/> - <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2754' column='1'/> + <function-decl name='_PyMonitoring_FireBranchRightEvent' mangled-name='_PyMonitoring_FireBranchRightEvent' filepath='Python/instrumentation.c' line='2757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchRightEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2757' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2757' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2757' column='1'/> + <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2758' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireBranchLeftEvent' mangled-name='_PyMonitoring_FireBranchLeftEvent' filepath='Python/instrumentation.c' line='2763' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchLeftEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2763' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2763' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2763' column='1'/> - <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2764' column='1'/> + <function-decl name='_PyMonitoring_FireBranchLeftEvent' mangled-name='_PyMonitoring_FireBranchLeftEvent' filepath='Python/instrumentation.c' line='2767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchLeftEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2767' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2767' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2767' column='1'/> + <parameter type-id='type-id-6' name='target_offset' filepath='Python/instrumentation.c' line='2768' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireCReturnEvent' mangled-name='_PyMonitoring_FireCReturnEvent' filepath='Python/instrumentation.c' line='2773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCReturnEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2773' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2773' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2773' column='1'/> - <parameter type-id='type-id-6' name='retval' filepath='Python/instrumentation.c' line='2774' column='1'/> + <function-decl name='_PyMonitoring_FireCReturnEvent' mangled-name='_PyMonitoring_FireCReturnEvent' filepath='Python/instrumentation.c' line='2777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCReturnEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2777' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2777' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2777' column='1'/> + <parameter type-id='type-id-6' name='retval' filepath='Python/instrumentation.c' line='2778' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FirePyThrowEvent' mangled-name='_PyMonitoring_FirePyThrowEvent' filepath='Python/instrumentation.c' line='2808' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyThrowEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2808' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2808' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2808' column='1'/> + <function-decl name='_PyMonitoring_FirePyThrowEvent' mangled-name='_PyMonitoring_FirePyThrowEvent' filepath='Python/instrumentation.c' line='2812' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyThrowEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2812' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2812' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2812' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireRaiseEvent' mangled-name='_PyMonitoring_FireRaiseEvent' filepath='Python/instrumentation.c' line='2822' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireRaiseEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2822' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2822' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2822' column='1'/> + <function-decl name='_PyMonitoring_FireRaiseEvent' mangled-name='_PyMonitoring_FireRaiseEvent' filepath='Python/instrumentation.c' line='2826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireRaiseEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2826' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2826' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2826' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireCRaiseEvent' mangled-name='_PyMonitoring_FireCRaiseEvent' filepath='Python/instrumentation.c' line='2836' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCRaiseEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2836' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2836' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2836' column='1'/> + <function-decl name='_PyMonitoring_FireCRaiseEvent' mangled-name='_PyMonitoring_FireCRaiseEvent' filepath='Python/instrumentation.c' line='2840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCRaiseEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2840' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2840' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2840' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireReraiseEvent' mangled-name='_PyMonitoring_FireReraiseEvent' filepath='Python/instrumentation.c' line='2850' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireReraiseEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2850' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2850' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2850' column='1'/> + <function-decl name='_PyMonitoring_FireReraiseEvent' mangled-name='_PyMonitoring_FireReraiseEvent' filepath='Python/instrumentation.c' line='2854' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireReraiseEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2854' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2854' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2854' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireExceptionHandledEvent' mangled-name='_PyMonitoring_FireExceptionHandledEvent' filepath='Python/instrumentation.c' line='2864' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireExceptionHandledEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2864' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2864' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2864' column='1'/> + <function-decl name='_PyMonitoring_FireExceptionHandledEvent' mangled-name='_PyMonitoring_FireExceptionHandledEvent' filepath='Python/instrumentation.c' line='2868' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireExceptionHandledEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2868' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2868' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2868' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FirePyUnwindEvent' mangled-name='_PyMonitoring_FirePyUnwindEvent' filepath='Python/instrumentation.c' line='2878' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyUnwindEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2878' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2878' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2878' column='1'/> + <function-decl name='_PyMonitoring_FirePyUnwindEvent' mangled-name='_PyMonitoring_FirePyUnwindEvent' filepath='Python/instrumentation.c' line='2882' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyUnwindEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2882' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2882' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2882' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMonitoring_FireStopIterationEvent' mangled-name='_PyMonitoring_FireStopIterationEvent' filepath='Python/instrumentation.c' line='2892' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireStopIterationEvent'> - <parameter type-id='type-id-1750' name='state' filepath='Python/instrumentation.c' line='2892' column='1'/> - <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2892' column='1'/> - <parameter type-id='type-id-456' name='offset' filepath='Python/instrumentation.c' line='2892' column='1'/> - <parameter type-id='type-id-6' name='value' filepath='Python/instrumentation.c' line='2892' column='1'/> + <function-decl name='_PyMonitoring_FireStopIterationEvent' mangled-name='_PyMonitoring_FireStopIterationEvent' filepath='Python/instrumentation.c' line='2896' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireStopIterationEvent'> + <parameter type-id='type-id-1751' name='state' filepath='Python/instrumentation.c' line='2896' column='1'/> + <parameter type-id='type-id-6' name='codelike' filepath='Python/instrumentation.c' line='2896' column='1'/> + <parameter type-id='type-id-458' name='offset' filepath='Python/instrumentation.c' line='2896' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Python/instrumentation.c' line='2896' 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='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_AsDict'> - <parameter type-id='type-id-1680' name='config' filepath='Python/interpconfig.c' line='55' column='1'/> + <parameter type-id='type-id-1681' name='config' filepath='Python/interpconfig.c' line='55' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyInterpreterConfig_InitFromDict' mangled-name='_PyInterpreterConfig_InitFromDict' filepath='Python/interpconfig.c' line='224' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_InitFromDict'> - <parameter type-id='type-id-1680' name='config' filepath='Python/interpconfig.c' line='224' column='1'/> + <parameter type-id='type-id-1681' name='config' filepath='Python/interpconfig.c' line='224' column='1'/> <parameter type-id='type-id-6' name='dict' filepath='Python/interpconfig.c' line='224' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInterpreterConfig_UpdateFromDict' mangled-name='_PyInterpreterConfig_UpdateFromDict' filepath='Python/interpconfig.c' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_UpdateFromDict'> - <parameter type-id='type-id-1680' name='config' filepath='Python/interpconfig.c' line='237' column='1'/> + <parameter type-id='type-id-1681' name='config' filepath='Python/interpconfig.c' line='237' column='1'/> <parameter type-id='type-id-6' name='dict' filepath='Python/interpconfig.c' line='237' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyInterpreterConfig_InitFromState' mangled-name='_PyInterpreterConfig_InitFromState' filepath='Python/interpconfig.c' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_InitFromState'> - <parameter type-id='type-id-1680' name='config' filepath='Python/interpconfig.c' line='250' column='1'/> - <parameter type-id='type-id-33' name='interp' filepath='Python/interpconfig.c' line='251' column='1'/> + <parameter type-id='type-id-1681' name='config' filepath='Python/interpconfig.c' line='250' column='1'/> + <parameter type-id='type-id-39' name='interp' filepath='Python/interpconfig.c' line='251' 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-1751' size-in-bits='1536' id='type-id-1752'> - <subrange length='12' type-id='type-id-2' id='type-id-911'/> + <array-type-def dimensions='1' type-id='type-id-1752' size-in-bits='1536' id='type-id-1753'> + <subrange length='12' type-id='type-id-2' id='type-id-913'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1751' size-in-bits='infinite' id='type-id-1753'> + <array-type-def dimensions='1' type-id='type-id-1752' size-in-bits='infinite' id='type-id-1754'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1754' size-in-bits='768' id='type-id-1755'> - <subrange length='6' type-id='type-id-2' id='type-id-477'/> + <array-type-def dimensions='1' type-id='type-id-1755' size-in-bits='768' id='type-id-1756'> + <subrange length='6' type-id='type-id-2' id='type-id-479'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1754' size-in-bits='infinite' id='type-id-1756'> + <array-type-def dimensions='1' type-id='type-id-1755' size-in-bits='infinite' id='type-id-1757'> <subrange length='infinite' id='type-id-230'/> </array-type-def> - <typedef-decl name='intrinsic_func1' type-id='type-id-1757' filepath='./Include/internal/pycore_intrinsics.h' line='35' column='1' id='type-id-1758'/> - <typedef-decl name='intrinsic_func2' type-id='type-id-1759' filepath='./Include/internal/pycore_intrinsics.h' line='36' column='1' id='type-id-1760'/> - <class-decl name='intrinsic_func1_info' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1761' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='38' column='1' id='type-id-1762'> + <typedef-decl name='intrinsic_func1' type-id='type-id-1758' filepath='./Include/internal/pycore_intrinsics.h' line='35' column='1' id='type-id-1759'/> + <typedef-decl name='intrinsic_func2' type-id='type-id-1760' filepath='./Include/internal/pycore_intrinsics.h' line='36' column='1' id='type-id-1761'/> + <class-decl name='intrinsic_func1_info' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1762' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='38' column='1' id='type-id-1763'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-1758' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='39' column='1'/> + <var-decl name='func' type-id='type-id-1759' 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-4' 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-1762' filepath='./Include/internal/pycore_intrinsics.h' line='41' column='1' id='type-id-1761'/> - <class-decl name='intrinsic_func2_info' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1763' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='43' column='1' id='type-id-1764'> + <typedef-decl name='intrinsic_func1_info' type-id='type-id-1763' filepath='./Include/internal/pycore_intrinsics.h' line='41' column='1' id='type-id-1762'/> + <class-decl name='intrinsic_func2_info' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1764' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='43' column='1' id='type-id-1765'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-1760' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='44' column='1'/> + <var-decl name='func' type-id='type-id-1761' 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-4' 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-1764' filepath='./Include/internal/pycore_intrinsics.h' line='46' column='1' id='type-id-1763'/> - <pointer-type-def type-id='type-id-1765' size-in-bits='64' id='type-id-1757'/> - <pointer-type-def type-id='type-id-1766' size-in-bits='64' id='type-id-1759'/> - <qualified-type-def type-id='type-id-1761' const='yes' id='type-id-1751'/> - <qualified-type-def type-id='type-id-1763' const='yes' id='type-id-1754'/> + <typedef-decl name='intrinsic_func2_info' type-id='type-id-1765' filepath='./Include/internal/pycore_intrinsics.h' line='46' column='1' id='type-id-1764'/> + <pointer-type-def type-id='type-id-1766' size-in-bits='64' id='type-id-1758'/> + <pointer-type-def type-id='type-id-1767' size-in-bits='64' id='type-id-1760'/> + <qualified-type-def type-id='type-id-1762' const='yes' id='type-id-1752'/> + <qualified-type-def type-id='type-id-1764' const='yes' id='type-id-1755'/> <function-decl name='_Py_set_function_type_params' filepath='./Include/internal/pycore_function.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyAsyncGenValueWrapperNew' filepath='./Include/internal/pycore_genobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-decl> - <var-decl name='_PyIntrinsics_UnaryFunctions' type-id='type-id-1753' 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-1756' mangled-name='_PyIntrinsics_BinaryFunctions' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='49' column='1' elf-symbol-id='_PyIntrinsics_BinaryFunctions'/> + <var-decl name='_PyIntrinsics_UnaryFunctions' type-id='type-id-1754' 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-1757' 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='175' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> @@ -29136,27 +29212,27 @@ <return type-id='type-id-6'/> </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-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> @@ -29169,21 +29245,21 @@ <parameter type-id='type-id-5' name='index' filepath='Python/intrinsics.c' line='281' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-type size-in-bits='64' id='type-id-1765'> - <parameter type-id='type-id-31'/> + <function-type size-in-bits='64' id='type-id-1766'> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </function-type> - <function-type size-in-bits='64' id='type-id-1766'> - <parameter type-id='type-id-31'/> + <function-type size-in-bits='64' id='type-id-1767'> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-6'/> <return type-id='type-id-6'/> </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-322' filepath='./Include/internal/pycore_instruments.h' line='15' column='1' id='type-id-1767'/> - <pointer-type-def type-id='type-id-1767' size-in-bits='64' id='type-id-1768'/> + <typedef-decl name='_PyMonitoringEventSet' type-id='type-id-324' filepath='./Include/internal/pycore_instruments.h' line='15' column='1' id='type-id-1768'/> + <pointer-type-def type-id='type-id-1768' size-in-bits='64' id='type-id-1769'/> <function-decl name='_PyMonitoring_RegisterCallback' filepath='./Include/internal/pycore_instruments.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> <parameter type-id='type-id-5'/> @@ -29192,278 +29268,282 @@ </function-decl> <function-decl name='_PyMonitoring_SetEvents' filepath='./Include/internal/pycore_instruments.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1767'/> + <parameter type-id='type-id-1768'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyMonitoring_SetLocalEvents' filepath='./Include/internal/pycore_instruments.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-347'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1767'/> + <parameter type-id='type-id-1768'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyMonitoring_GetLocalEvents' filepath='./Include/internal/pycore_instruments.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-345'/> + <parameter type-id='type-id-347'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-1768'/> + <parameter type-id='type-id-1769'/> <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-58' size-in-bits='256' id='type-id-1769'> - <subrange length='32' type-id='type-id-2' id='type-id-73'/> + <array-type-def dimensions='1' type-id='type-id-64' size-in-bits='256' id='type-id-1770'> + <subrange length='32' type-id='type-id-2' id='type-id-79'/> </array-type-def> - <class-decl name='_PySeqLock' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1770' visibility='default' filepath='./Include/internal/pycore_lock.h' line='215' column='1' id='type-id-1771'> + <class-decl name='_PySeqLock' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1771' visibility='default' filepath='./Include/internal/pycore_lock.h' line='208' column='1' id='type-id-1772'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sequence' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_lock.h' line='216' column='1'/> + <var-decl name='sequence' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_lock.h' line='209' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PySeqLock' type-id='type-id-1771' filepath='./Include/internal/pycore_lock.h' line='217' column='1' id='type-id-1770'/> - <typedef-decl name='_Py_unpark_fn_t' type-id='type-id-1772' filepath='./Include/internal/pycore_parking_lot.h' line='74' column='1' id='type-id-1773'/> - <class-decl name='_PySemaphore' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_semaphore.h' line='36' column='1' id='type-id-1774'> + <typedef-decl name='_PySeqLock' type-id='type-id-1772' filepath='./Include/internal/pycore_lock.h' line='210' column='1' id='type-id-1771'/> + <typedef-decl name='_Py_unpark_fn_t' type-id='type-id-1773' filepath='./Include/internal/pycore_parking_lot.h' line='74' column='1' id='type-id-1774'/> + <class-decl name='_PySemaphore' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_semaphore.h' line='36' column='1' id='type-id-1775'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='platform_sem' type-id='type-id-1775' visibility='default' filepath='./Include/internal/pycore_semaphore.h' line='40' column='1'/> + <var-decl name='platform_sem' type-id='type-id-1776' visibility='default' filepath='./Include/internal/pycore_semaphore.h' line='40' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PySemaphore' type-id='type-id-1774' filepath='./Include/internal/pycore_semaphore.h' line='46' column='1' id='type-id-1776'/> - <union-decl name='sem_t' size-in-bits='256' naming-typedef-id='type-id-1775' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='35' column='1' id='type-id-1777'> + <typedef-decl name='_PySemaphore' type-id='type-id-1775' filepath='./Include/internal/pycore_semaphore.h' line='46' column='1' id='type-id-1777'/> + <union-decl name='sem_t' size-in-bits='256' naming-typedef-id='type-id-1776' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='35' column='1' id='type-id-1778'> <data-member access='public'> - <var-decl name='__size' type-id='type-id-1769' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='37' column='1'/> + <var-decl name='__size' type-id='type-id-1770' 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-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='38' column='1'/> + <var-decl name='__align' type-id='type-id-188' 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-1777' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='39' column='1' id='type-id-1775'/> - <pointer-type-def type-id='type-id-1264' size-in-bits='64' id='type-id-1778'/> - <pointer-type-def type-id='type-id-1304' size-in-bits='64' id='type-id-1779'/> - <pointer-type-def type-id='type-id-1776' size-in-bits='64' id='type-id-1780'/> - <pointer-type-def type-id='type-id-1770' size-in-bits='64' id='type-id-1781'/> - <pointer-type-def type-id='type-id-1773' size-in-bits='64' id='type-id-1782'/> + <typedef-decl name='sem_t' type-id='type-id-1778' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='39' column='1' id='type-id-1776'/> + <pointer-type-def type-id='type-id-1265' size-in-bits='64' id='type-id-1779'/> + <pointer-type-def type-id='type-id-1305' size-in-bits='64' id='type-id-1780'/> + <pointer-type-def type-id='type-id-1777' size-in-bits='64' id='type-id-1781'/> + <pointer-type-def type-id='type-id-1771' size-in-bits='64' id='type-id-1782'/> + <pointer-type-def type-id='type-id-1774' size-in-bits='64' id='type-id-1783'/> <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'/> + <parameter type-id='type-id-180'/> <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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-41'/> <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-35'/> - <parameter type-id='type-id-1782'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-1783'/> + <parameter type-id='type-id-41'/> <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-35'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySemaphore_Wait' mangled-name='_PySemaphore_Wait' filepath='./Include/internal/pycore_semaphore.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Wait'> - <parameter type-id='type-id-1780'/> - <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1781'/> + <parameter type-id='type-id-34'/> <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='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Wakeup'> - <parameter type-id='type-id-1780'/> + <parameter type-id='type-id-1781'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySemaphore_Init' mangled-name='_PySemaphore_Init' filepath='./Include/internal/pycore_semaphore.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Init'> - <parameter type-id='type-id-1780'/> + <parameter type-id='type-id-1781'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySemaphore_Destroy' mangled-name='_PySemaphore_Destroy' filepath='./Include/internal/pycore_semaphore.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Destroy'> - <parameter type-id='type-id-1780'/> + <parameter type-id='type-id-1781'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTime_Add' filepath='./Include/internal/pycore_time.h' line='243' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-28'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-34'/> + <return type-id='type-id-34'/> </function-decl> <function-decl name='_PyDeadline_Get' mangled-name='_PyDeadline_Get' filepath='./Include/internal/pycore_time.h' line='306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDeadline_Get'> - <parameter type-id='type-id-28'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34'/> + <return type-id='type-id-34'/> </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='247' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvent_IsSet'> - <parameter type-id='type-id-1778' name='evt' filepath='Python/lock.c' line='247' column='1'/> + <parameter type-id='type-id-1779' name='evt' filepath='Python/lock.c' line='247' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyEvent_Notify' mangled-name='_PyEvent_Notify' filepath='Python/lock.c' line='254' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvent_Notify'> - <parameter type-id='type-id-1778' name='evt' filepath='Python/lock.c' line='254' column='1'/> + <parameter type-id='type-id-1779' name='evt' filepath='Python/lock.c' line='254' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyEvent_Wait' mangled-name='PyEvent_Wait' filepath='Python/lock.c' line='272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEvent_Wait'> - <parameter type-id='type-id-1778' name='evt' filepath='Python/lock.c' line='272' column='1'/> + <parameter type-id='type-id-1779' name='evt' filepath='Python/lock.c' line='272' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyEvent_WaitTimed' mangled-name='PyEvent_WaitTimed' filepath='Python/lock.c' line='279' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEvent_WaitTimed'> - <parameter type-id='type-id-1778' name='evt' filepath='Python/lock.c' line='279' column='1'/> - <parameter type-id='type-id-28' name='timeout_ns' filepath='Python/lock.c' line='279' column='1'/> + <parameter type-id='type-id-1779' name='evt' filepath='Python/lock.c' line='279' column='1'/> + <parameter type-id='type-id-34' name='timeout_ns' filepath='Python/lock.c' line='279' column='1'/> <parameter type-id='type-id-5' name='detach' filepath='Python/lock.c' line='279' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyRWMutex_RLock' mangled-name='_PyRWMutex_RLock' filepath='Python/lock.c' line='455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_RLock'> - <parameter type-id='type-id-1779' name='rwmutex' filepath='Python/lock.c' line='455' column='1'/> + <parameter type-id='type-id-1780' name='rwmutex' filepath='Python/lock.c' line='455' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyRWMutex_RUnlock' mangled-name='_PyRWMutex_RUnlock' filepath='Python/lock.c' line='486' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_RUnlock'> - <parameter type-id='type-id-1779' name='rwmutex' filepath='Python/lock.c' line='486' column='1'/> + <parameter type-id='type-id-1780' name='rwmutex' filepath='Python/lock.c' line='486' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyRWMutex_Lock' mangled-name='_PyRWMutex_Lock' filepath='Python/lock.c' line='499' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_Lock'> - <parameter type-id='type-id-1779' name='rwmutex' filepath='Python/lock.c' line='499' column='1'/> + <parameter type-id='type-id-1780' name='rwmutex' filepath='Python/lock.c' line='499' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyRWMutex_Unlock' mangled-name='_PyRWMutex_Unlock' filepath='Python/lock.c' line='520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_Unlock'> - <parameter type-id='type-id-1779' name='rwmutex' filepath='Python/lock.c' line='520' column='1'/> + <parameter type-id='type-id-1780' name='rwmutex' filepath='Python/lock.c' line='520' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySeqLock_LockWrite' mangled-name='_PySeqLock_LockWrite' filepath='Python/lock.c' line='534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_LockWrite'> - <parameter type-id='type-id-1781' name='seqlock' filepath='Python/lock.c' line='534' column='1'/> + <parameter type-id='type-id-1782' name='seqlock' filepath='Python/lock.c' line='534' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySeqLock_AbandonWrite' mangled-name='_PySeqLock_AbandonWrite' filepath='Python/lock.c' line='555' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_AbandonWrite'> - <parameter type-id='type-id-1781' name='seqlock' filepath='Python/lock.c' line='555' column='1'/> + <parameter type-id='type-id-1782' name='seqlock' filepath='Python/lock.c' line='555' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySeqLock_UnlockWrite' mangled-name='_PySeqLock_UnlockWrite' filepath='Python/lock.c' line='562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_UnlockWrite'> - <parameter type-id='type-id-1781' name='seqlock' filepath='Python/lock.c' line='562' column='1'/> + <parameter type-id='type-id-1782' name='seqlock' filepath='Python/lock.c' line='562' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySeqLock_BeginRead' mangled-name='_PySeqLock_BeginRead' filepath='Python/lock.c' line='569' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_BeginRead'> - <parameter type-id='type-id-1781' name='seqlock' filepath='Python/lock.c' line='569' column='1'/> - <return type-id='type-id-322'/> + <parameter type-id='type-id-1782' name='seqlock' filepath='Python/lock.c' line='569' column='1'/> + <return type-id='type-id-324'/> </function-decl> <function-decl name='_PySeqLock_EndRead' mangled-name='_PySeqLock_EndRead' filepath='Python/lock.c' line='580' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_EndRead'> - <parameter type-id='type-id-1781' name='seqlock' filepath='Python/lock.c' line='580' column='1'/> - <parameter type-id='type-id-322' name='previous' filepath='Python/lock.c' line='580' column='1'/> + <parameter type-id='type-id-1782' name='seqlock' filepath='Python/lock.c' line='580' column='1'/> + <parameter type-id='type-id-324' name='previous' filepath='Python/lock.c' line='580' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PySeqLock_AfterFork' mangled-name='_PySeqLock_AfterFork' filepath='Python/lock.c' line='595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_AfterFork'> - <parameter type-id='type-id-1781' name='seqlock' filepath='Python/lock.c' line='595' column='1'/> + <parameter type-id='type-id-1782' name='seqlock' filepath='Python/lock.c' line='595' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-type size-in-bits='64' id='type-id-1772'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-35'/> + <function-decl name='PyMutex_IsLocked' mangled-name='PyMutex_IsLocked' filepath='Python/lock.c' line='626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMutex_IsLocked'> + <parameter type-id='type-id-32' name='m' filepath='Python/lock.c' line='626' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1773'> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> <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-546' size-in-bits='192' id='type-id-1783'> - <subrange length='3' type-id='type-id-2' id='type-id-883'/> + <array-type-def dimensions='1' type-id='type-id-548' size-in-bits='192' id='type-id-1784'> + <subrange length='3' type-id='type-id-2' id='type-id-885'/> </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-1784'> + <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-1785'> <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'/> + <var-decl name='st_dev' type-id='type-id-191' 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-1785' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='36' column='1'/> + <var-decl name='st_ino' type-id='type-id-1786' 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-1786' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='44' column='1'/> + <var-decl name='st_nlink' type-id='type-id-1787' 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-117' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='45' column='1'/> + <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-119' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='47' column='1'/> + <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-115' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='48' column='1'/> + <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-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-187' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='52' column='1'/> + <var-decl name='st_rdev' type-id='type-id-191' 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-1434' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='57' column='1'/> + <var-decl name='st_size' type-id='type-id-1435' 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-1787' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='61' column='1'/> + <var-decl name='st_blksize' type-id='type-id-1788' 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-1788' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='63' column='1'/> + <var-decl name='st_blocks' type-id='type-id-1789' 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-110' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='74' column='1'/> + <var-decl name='st_atim' type-id='type-id-116' 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-110' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='75' column='1'/> + <var-decl name='st_mtim' type-id='type-id-116' 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-110' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='76' column='1'/> + <var-decl name='st_ctim' type-id='type-id-116' 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-1783' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='89' column='1'/> + <var-decl name='__glibc_reserved' type-id='type-id-1784' 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-105' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='147' column='1' id='type-id-115'/> - <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-1785'/> - <typedef-decl name='__mode_t' type-id='type-id-105' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='150' column='1' id='type-id-117'/> - <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-1786'/> - <typedef-decl name='__blksize_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='175' column='1' id='type-id-1787'/> - <typedef-decl name='__blkcnt_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='180' column='1' id='type-id-1788'/> - <pointer-type-def type-id='type-id-1784' size-in-bits='64' id='type-id-64'/> + <typedef-decl name='__gid_t' type-id='type-id-111' 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-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-1786'/> + <typedef-decl name='__mode_t' type-id='type-id-111' 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-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='151' column='1' id='type-id-1787'/> + <typedef-decl name='__blksize_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='175' column='1' id='type-id-1788'/> + <typedef-decl name='__blkcnt_t' type-id='type-id-188' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='180' column='1' id='type-id-1789'/> + <pointer-type-def type-id='type-id-1785' size-in-bits='64' id='type-id-70'/> <function-decl name='_Py_fstat_noraise' mangled-name='_Py_fstat_noraise' filepath='./Include/internal/pycore_fileutils.h' line='95' 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-64'/> + <parameter type-id='type-id-70'/> <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-231'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-486'/> - <return type-id='type-id-21'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-488'/> + <return type-id='type-id-14'/> </function-decl> - <function-decl name='PyMarshal_WriteLongToFile' mangled-name='PyMarshal_WriteLongToFile' filepath='Python/marshal.c' line='739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteLongToFile'> - <parameter type-id='type-id-184' name='x' filepath='Python/marshal.c' line='739' column='1'/> - <parameter type-id='type-id-61' name='fp' filepath='Python/marshal.c' line='739' column='1'/> - <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='739' column='1'/> + <function-decl name='PyMarshal_WriteLongToFile' mangled-name='PyMarshal_WriteLongToFile' filepath='Python/marshal.c' line='740' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteLongToFile'> + <parameter type-id='type-id-188' name='x' filepath='Python/marshal.c' line='740' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/marshal.c' line='740' column='1'/> + <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='740' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyMarshal_WriteObjectToFile' mangled-name='PyMarshal_WriteObjectToFile' filepath='Python/marshal.c' line='754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteObjectToFile'> - <parameter type-id='type-id-6' name='x' filepath='Python/marshal.c' line='754' column='1'/> - <parameter type-id='type-id-61' name='fp' filepath='Python/marshal.c' line='754' column='1'/> - <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='754' column='1'/> + <function-decl name='PyMarshal_WriteObjectToFile' mangled-name='PyMarshal_WriteObjectToFile' filepath='Python/marshal.c' line='755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteObjectToFile'> + <parameter type-id='type-id-6' name='x' filepath='Python/marshal.c' line='755' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/marshal.c' line='755' column='1'/> + <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='755' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyMarshal_ReadShortFromFile' mangled-name='PyMarshal_ReadShortFromFile' filepath='Python/marshal.c' line='1720' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadShortFromFile'> - <parameter type-id='type-id-61' name='fp' filepath='Python/marshal.c' line='1720' column='1'/> + <function-decl name='PyMarshal_ReadShortFromFile' mangled-name='PyMarshal_ReadShortFromFile' filepath='Python/marshal.c' line='1721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadShortFromFile'> + <parameter type-id='type-id-67' name='fp' filepath='Python/marshal.c' line='1721' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyMarshal_ReadLongFromFile' mangled-name='PyMarshal_ReadLongFromFile' filepath='Python/marshal.c' line='1736' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLongFromFile'> - <parameter type-id='type-id-61' name='fp' filepath='Python/marshal.c' line='1736' column='1'/> - <return type-id='type-id-184'/> + <function-decl name='PyMarshal_ReadLongFromFile' mangled-name='PyMarshal_ReadLongFromFile' filepath='Python/marshal.c' line='1737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLongFromFile'> + <parameter type-id='type-id-67' name='fp' filepath='Python/marshal.c' line='1737' column='1'/> + <return type-id='type-id-188'/> </function-decl> - <function-decl name='PyMarshal_ReadLastObjectFromFile' mangled-name='PyMarshal_ReadLastObjectFromFile' filepath='Python/marshal.c' line='1772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLastObjectFromFile'> - <parameter type-id='type-id-61' name='fp' filepath='Python/marshal.c' line='1772' column='1'/> + <function-decl name='PyMarshal_ReadLastObjectFromFile' mangled-name='PyMarshal_ReadLastObjectFromFile' filepath='Python/marshal.c' line='1773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLastObjectFromFile'> + <parameter type-id='type-id-67' name='fp' filepath='Python/marshal.c' line='1773' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyMarshal_ReadObjectFromFile' mangled-name='PyMarshal_ReadObjectFromFile' filepath='Python/marshal.c' line='1797' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadObjectFromFile'> - <parameter type-id='type-id-61' name='fp' filepath='Python/marshal.c' line='1797' column='1'/> + <function-decl name='PyMarshal_ReadObjectFromFile' mangled-name='PyMarshal_ReadObjectFromFile' filepath='Python/marshal.c' line='1798' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadObjectFromFile'> + <parameter type-id='type-id-67' name='fp' filepath='Python/marshal.c' line='1798' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyMarshal_Init' mangled-name='PyMarshal_Init' filepath='Python/marshal.c' line='2125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_Init'> + <function-decl name='PyMarshal_Init' mangled-name='PyMarshal_Init' filepath='Python/marshal.c' line='2126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_Init'> <return type-id='type-id-6'/> </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-6' name='obj' filepath='Python/modsupport.c' line='14' column='1'/> - <parameter type-id='type-id-35' name='result' filepath='Python/modsupport.c' line='14' column='1'/> + <parameter type-id='type-id-41' 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='493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_BuildValue_SizeT'> @@ -29473,12 +29553,12 @@ </function-decl> <function-decl name='Py_VaBuildValue' mangled-name='Py_VaBuildValue' filepath='Python/modsupport.c' line='504' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_VaBuildValue'> <parameter type-id='type-id-4' name='format' filepath='Python/modsupport.c' line='504' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/modsupport.c' line='504' column='1'/> + <parameter type-id='type-id-308' name='va' filepath='Python/modsupport.c' line='504' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_Py_VaBuildValue_SizeT' mangled-name='_Py_VaBuildValue_SizeT' filepath='Python/modsupport.c' line='510' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_VaBuildValue_SizeT'> <parameter type-id='type-id-4' name='format' filepath='Python/modsupport.c' line='510' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/modsupport.c' line='510' column='1'/> + <parameter type-id='type-id-308' name='va' filepath='Python/modsupport.c' line='510' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='PyModule_AddObject' mangled-name='PyModule_AddObject' filepath='Python/modsupport.c' line='624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddObject'> @@ -29499,158 +29579,158 @@ <parameter type-id='type-id-5' name='z' filepath='Python/modsupport.c' line='663' column='1'/> <parameter type-id='type-id-5' name='level' filepath='Python/modsupport.c' line='663' column='1'/> <parameter type-id='type-id-5' name='serial' filepath='Python/modsupport.c' line='663' column='1'/> - <return type-id='type-id-322'/> + <return type-id='type-id-324'/> </function-decl> <function-decl name='Py_PACK_VERSION' mangled-name='Py_PACK_VERSION' filepath='Python/modsupport.c' line='670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PACK_VERSION'> <parameter type-id='type-id-5' name='x' filepath='Python/modsupport.c' line='670' column='1'/> <parameter type-id='type-id-5' name='y' filepath='Python/modsupport.c' line='670' column='1'/> - <return type-id='type-id-322'/> + <return type-id='type-id-324'/> </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-24' name='str' filepath='Python/mysnprintf.c' line='53' column='1'/> + <parameter type-id='type-id-14' name='size' filepath='Python/mysnprintf.c' line='53' column='1'/> <parameter type-id='type-id-4' 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'/> + <parameter type-id='type-id-308' 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-1789' visibility='default' filepath='./Include/internal/pycore_lock.h' line='104' column='1' id='type-id-1790'> + <class-decl name='_PyRawMutex' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1790' visibility='default' filepath='./Include/internal/pycore_lock.h' line='97' column='1' id='type-id-1791'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_lock.h' line='105' column='1'/> + <var-decl name='v' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_lock.h' line='98' column='1'/> </data-member> </class-decl> - <typedef-decl name='_PyRawMutex' type-id='type-id-1790' filepath='./Include/internal/pycore_lock.h' line='106' column='1' id='type-id-1789'/> - <pointer-type-def type-id='type-id-1789' size-in-bits='64' id='type-id-1791'/> - <pointer-type-def type-id='type-id-1775' size-in-bits='64' id='type-id-1792'/> - <qualified-type-def type-id='type-id-1792' restrict='yes' id='type-id-1793'/> - <function-decl name='_PyRawMutex_LockSlow' filepath='./Include/internal/pycore_lock.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1791'/> + <typedef-decl name='_PyRawMutex' type-id='type-id-1791' filepath='./Include/internal/pycore_lock.h' line='99' column='1' id='type-id-1790'/> + <pointer-type-def type-id='type-id-1790' size-in-bits='64' id='type-id-1792'/> + <pointer-type-def type-id='type-id-1776' size-in-bits='64' id='type-id-1793'/> + <qualified-type-def type-id='type-id-1793' restrict='yes' id='type-id-1794'/> + <function-decl name='_PyRawMutex_LockSlow' filepath='./Include/internal/pycore_lock.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1792'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyRawMutex_UnlockSlow' filepath='./Include/internal/pycore_lock.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1791'/> + <function-decl name='_PyRawMutex_UnlockSlow' filepath='./Include/internal/pycore_lock.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1792'/> <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='238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimespec_clamp'> - <parameter type-id='type-id-28'/> - <parameter type-id='type-id-179'/> + <parameter type-id='type-id-34'/> + <parameter type-id='type-id-185'/> <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-1792'/> + <parameter type-id='type-id-1793'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-105'/> + <parameter type-id='type-id-111'/> <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-1792'/> + <parameter type-id='type-id-1793'/> <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-1792'/> + <parameter type-id='type-id-1793'/> <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-1793'/> + <parameter type-id='type-id-1794'/> <parameter type-id='type-id-226'/> - <parameter type-id='type-id-208'/> + <parameter type-id='type-id-212'/> <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-1792'/> + <parameter type-id='type-id-1793'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyParkingLot_AfterFork' mangled-name='_PyParkingLot_AfterFork' filepath='Python/parking_lot.c' line='415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyParkingLot_AfterFork'> + <function-decl name='_PyParkingLot_AfterFork' mangled-name='_PyParkingLot_AfterFork' filepath='Python/parking_lot.c' line='430' 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='136' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-63'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-69'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_wrealpath' filepath='./Include/internal/pycore_fileutils.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-63'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-63'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-69'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-69'/> </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-63'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-27'/> + <return type-id='type-id-69'/> </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-63'/> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-69'/> </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='204' 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='204' column='1'/> + <parameter type-id='type-id-25' name='path' filepath='Python/pathconfig.c' line='204' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='Py_SetPythonHome' mangled-name='Py_SetPythonHome' filepath='Python/pathconfig.c' line='240' 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='240' column='1'/> + <parameter type-id='type-id-25' name='home' filepath='Python/pathconfig.c' line='240' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='Py_SetProgramName' mangled-name='Py_SetProgramName' filepath='Python/pathconfig.c' line='258' 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='258' column='1'/> + <parameter type-id='type-id-25' name='program_name' filepath='Python/pathconfig.c' line='258' column='1'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='Py_GetPath' mangled-name='Py_GetPath' filepath='Python/pathconfig.c' line='276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPath'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='Py_GetPrefix' mangled-name='Py_GetPrefix' filepath='Python/pathconfig.c' line='299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPrefix'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='Py_GetExecPrefix' mangled-name='Py_GetExecPrefix' filepath='Python/pathconfig.c' line='306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetExecPrefix'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='Py_GetProgramFullPath' mangled-name='Py_GetProgramFullPath' filepath='Python/pathconfig.c' line='313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetProgramFullPath'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='Py_GetPythonHome' mangled-name='Py_GetPythonHome' filepath='Python/pathconfig.c' line='320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPythonHome'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </function-decl> <function-decl name='Py_GetProgramName' mangled-name='Py_GetProgramName' filepath='Python/pathconfig.c' line='327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetProgramName'> - <return type-id='type-id-63'/> + <return type-id='type-id-69'/> </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-221' restrict='yes' id='type-id-1794'/> - <var-decl name='_Py_perfmap_jit_callbacks' type-id='type-id-1795' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='111' column='1'/> + <qualified-type-def type-id='type-id-221' restrict='yes' id='type-id-1795'/> + <var-decl name='_Py_perfmap_jit_callbacks' type-id='type-id-1796' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='113' 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-1794'/> + <parameter type-id='type-id-1795'/> <parameter type-id='type-id-231'/> <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-1795' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='110' column='1'/> + <var-decl name='_Py_perfmap_callbacks' type-id='type-id-1796' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='112' 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-178'/> + <return type-id='type-id-184'/> </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-345' name='co' filepath='Python/perf_trampoline.c' line='412' column='1'/> + <function-decl name='PyUnstable_PerfTrampoline_CompileCode' mangled-name='PyUnstable_PerfTrampoline_CompileCode' filepath='Python/perf_trampoline.c' line='418' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfTrampoline_CompileCode'> + <parameter type-id='type-id-347' name='co' filepath='Python/perf_trampoline.c' line='418' 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'/> + <function-decl name='PyUnstable_PerfTrampoline_SetPersistAfterFork' mangled-name='PyUnstable_PerfTrampoline_SetPersistAfterFork' filepath='Python/perf_trampoline.c' line='543' 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='543' 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-1796' filepath='./Include/cpython/pymem.h' line='16' column='1' id='type-id-1797'> - <underlying-type type-id='type-id-37'/> + <enum-decl name='PyMemAllocatorName' naming-typedef-id='type-id-1797' filepath='./Include/cpython/pymem.h' line='16' column='1' id='type-id-1798'> + <underlying-type type-id='type-id-43'/> <enumerator name='PYMEM_ALLOCATOR_NOT_SET' value='0'/> <enumerator name='PYMEM_ALLOCATOR_DEFAULT' value='1'/> <enumerator name='PYMEM_ALLOCATOR_DEBUG' value='2'/> @@ -29661,277 +29741,277 @@ <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-1797' filepath='./Include/cpython/pymem.h' line='30' column='1' id='type-id-1796'/> - <pointer-type-def type-id='type-id-1796' size-in-bits='64' id='type-id-1798'/> + <typedef-decl name='PyMemAllocatorName' type-id='type-id-1798' filepath='./Include/cpython/pymem.h' line='30' column='1' id='type-id-1797'/> + <pointer-type-def type-id='type-id-1797' size-in-bits='64' id='type-id-1799'/> <var-decl name='Py_FileSystemDefaultEncoding' type-id='type-id-4' 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-4' 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='193' column='1'/> <function-decl name='_PyWideStringList_Clear' filepath='./Include/internal/pycore_initconfig.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1736'/> + <parameter type-id='type-id-1737'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyWideStringList_Copy' filepath='./Include/internal/pycore_initconfig.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1736'/> + <parameter type-id='type-id-1737'/> <parameter type-id='type-id-239'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyWideStringList_Extend' filepath='./Include/internal/pycore_initconfig.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1736'/> + <parameter type-id='type-id-1737'/> <parameter type-id='type-id-239'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_Py_CoerceLegacyLocale' filepath='./Include/internal/pycore_pylifecycle.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_SetLocaleFromEnv'> + <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'/> + <return type-id='type-id-24'/> </function-decl> - <function-decl name='_PyMem_GetAllocatorName' filepath='./Include/internal/pycore_pymem.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyMem_GetAllocatorName' filepath='./Include/internal/pycore_pymem.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-1798'/> + <parameter type-id='type-id-1799'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyMem_SetupAllocators' filepath='./Include/internal/pycore_pymem.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1796'/> + <function-decl name='_PyMem_SetupAllocators' filepath='./Include/internal/pycore_pymem.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1797'/> <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'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-25'/> + <parameter type-id='type-id-14'/> <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-1735' name='config' filepath='Python/preconfig.c' line='284' column='1'/> + <parameter type-id='type-id-1736' 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-1735' name='config' filepath='Python/preconfig.c' line='312' column='1'/> + <parameter type-id='type-id-1736' name='config' filepath='Python/preconfig.c' line='312' 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-452' size-in-bits='2048' id='type-id-1799'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <array-type-def dimensions='1' type-id='type-id-454' size-in-bits='2048' id='type-id-1800'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1800' size-in-bits='8192' id='type-id-1801'> - <subrange length='256' type-id='type-id-2' id='type-id-75'/> + <array-type-def dimensions='1' type-id='type-id-1801' size-in-bits='8192' id='type-id-1802'> + <subrange length='256' type-id='type-id-2' id='type-id-81'/> </array-type-def> - <qualified-type-def type-id='type-id-105' const='yes' id='type-id-1800'/> - <var-decl name='_Py_ctype_table' type-id='type-id-1801' 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-1799' 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-1799' mangled-name='_Py_ctype_toupper' visibility='default' filepath='./Include/cpython/pyctype.h' line='30' column='1' elf-symbol-id='_Py_ctype_toupper'/> + <qualified-type-def type-id='type-id-111' const='yes' id='type-id-1801'/> + <var-decl name='_Py_ctype_table' type-id='type-id-1802' 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-1800' 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-1800' 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-95' size-in-bits='128' id='type-id-1802'> - <subrange length='16' type-id='type-id-2' id='type-id-70'/> + <array-type-def dimensions='1' type-id='type-id-101' size-in-bits='128' id='type-id-1803'> + <subrange length='16' type-id='type-id-2' id='type-id-76'/> </array-type-def> - <array-type-def dimensions='1' type-id='type-id-95' size-in-bits='192' id='type-id-1803'> - <subrange length='24' type-id='type-id-2' id='type-id-933'/> + <array-type-def dimensions='1' type-id='type-id-101' size-in-bits='192' id='type-id-1804'> + <subrange length='24' type-id='type-id-2' id='type-id-935'/> </array-type-def> - <class-decl name='PyHash_FuncDef' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1804' visibility='default' filepath='./Include/cpython/pyhash.h' line='34' column='1' id='type-id-1805'> + <class-decl name='PyHash_FuncDef' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1805' visibility='default' filepath='./Include/cpython/pyhash.h' line='34' column='1' id='type-id-1806'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='hash' type-id='type-id-1806' visibility='default' filepath='./Include/cpython/pyhash.h' line='35' column='1'/> + <var-decl name='hash' type-id='type-id-1807' visibility='default' filepath='./Include/cpython/pyhash.h' line='35' 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/cpython/pyhash.h' line='36' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='hash_bits' type-id='type-id-274' visibility='default' filepath='./Include/cpython/pyhash.h' line='37' column='1'/> + <var-decl name='hash_bits' type-id='type-id-276' visibility='default' filepath='./Include/cpython/pyhash.h' line='37' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='seed_bits' type-id='type-id-274' visibility='default' filepath='./Include/cpython/pyhash.h' line='38' column='1'/> + <var-decl name='seed_bits' type-id='type-id-276' visibility='default' filepath='./Include/cpython/pyhash.h' line='38' column='1'/> </data-member> </class-decl> - <typedef-decl name='PyHash_FuncDef' type-id='type-id-1805' filepath='./Include/cpython/pyhash.h' line='39' column='1' id='type-id-1804'/> - <union-decl name='_Py_HashSecret_t' size-in-bits='192' naming-typedef-id='type-id-1807' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='42' column='1' id='type-id-1808'> + <typedef-decl name='PyHash_FuncDef' type-id='type-id-1806' filepath='./Include/cpython/pyhash.h' line='39' column='1' id='type-id-1805'/> + <union-decl name='_Py_HashSecret_t' size-in-bits='192' naming-typedef-id='type-id-1808' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='42' column='1' id='type-id-1809'> <data-member access='public'> - <var-decl name='uc' type-id='type-id-1803' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='44' column='1'/> + <var-decl name='uc' type-id='type-id-1804' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='44' column='1'/> </data-member> <data-member access='public'> - <var-decl name='fnv' type-id='type-id-1809' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='49' column='1'/> + <var-decl name='fnv' type-id='type-id-1810' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='49' column='1'/> </data-member> <data-member access='public'> - <var-decl name='siphash' type-id='type-id-1810' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='54' column='1'/> + <var-decl name='siphash' type-id='type-id-1811' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='54' column='1'/> </data-member> <data-member access='public'> - <var-decl name='djbx33a' type-id='type-id-1811' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='59' column='1'/> + <var-decl name='djbx33a' type-id='type-id-1812' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='59' column='1'/> </data-member> <data-member access='public'> - <var-decl name='expat' type-id='type-id-1812' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='63' column='1'/> + <var-decl name='expat' type-id='type-id-1813' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='63' 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='46' column='1' id='type-id-1809'> + <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='46' column='1' id='type-id-1810'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='prefix' type-id='type-id-304' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='47' column='1'/> + <var-decl name='prefix' type-id='type-id-306' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='47' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='suffix' type-id='type-id-304' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='48' column='1'/> + <var-decl name='suffix' type-id='type-id-306' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='48' 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='51' column='1' id='type-id-1810'> + <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='51' column='1' id='type-id-1811'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='k0' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='52' column='1'/> + <var-decl name='k0' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='52' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='k1' type-id='type-id-111' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='53' column='1'/> + <var-decl name='k1' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='53' 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='56' column='1' id='type-id-1811'> + <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='56' column='1' id='type-id-1812'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='padding' type-id='type-id-1802' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='57' column='1'/> + <var-decl name='padding' type-id='type-id-1803' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='57' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='suffix' type-id='type-id-304' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='58' column='1'/> + <var-decl name='suffix' type-id='type-id-306' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='58' 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='60' column='1' id='type-id-1812'> + <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='60' column='1' id='type-id-1813'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='padding' type-id='type-id-1802' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='61' column='1'/> + <var-decl name='padding' type-id='type-id-1803' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='61' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='hashsalt' type-id='type-id-304' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='62' column='1'/> + <var-decl name='hashsalt' type-id='type-id-306' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='62' column='1'/> </data-member> </class-decl> - <typedef-decl name='_Py_HashSecret_t' type-id='type-id-1808' filepath='./Include/internal/pycore_pyhash.h' line='64' column='1' id='type-id-1807'/> - <pointer-type-def type-id='type-id-1804' size-in-bits='64' id='type-id-1813'/> - <pointer-type-def type-id='type-id-1814' size-in-bits='64' id='type-id-1815'/> - <qualified-type-def type-id='type-id-1815' const='yes' id='type-id-1806'/> - <var-decl name='_Py_HashSecret' type-id='type-id-1807' mangled-name='_Py_HashSecret' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='67' column='1' elf-symbol-id='_Py_HashSecret'/> + <typedef-decl name='_Py_HashSecret_t' type-id='type-id-1809' filepath='./Include/internal/pycore_pyhash.h' line='64' column='1' id='type-id-1808'/> + <pointer-type-def type-id='type-id-1805' size-in-bits='64' id='type-id-1814'/> + <pointer-type-def type-id='type-id-1815' size-in-bits='64' id='type-id-1816'/> + <qualified-type-def type-id='type-id-1816' const='yes' id='type-id-1807'/> + <var-decl name='_Py_HashSecret' type-id='type-id-1808' mangled-name='_Py_HashSecret' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='67' column='1' elf-symbol-id='_Py_HashSecret'/> <function-decl name='PyHash_GetFuncDef' mangled-name='PyHash_GetFuncDef' filepath='Python/pyhash.c' line='215' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyHash_GetFuncDef'> - <return type-id='type-id-1813'/> + <return type-id='type-id-1814'/> </function-decl> - <function-type size-in-bits='64' id='type-id-1814'> - <parameter type-id='type-id-35'/> + <function-type size-in-bits='64' id='type-id-1815'> + <parameter type-id='type-id-41'/> <parameter type-id='type-id-7'/> - <return type-id='type-id-304'/> + <return type-id='type-id-306'/> </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-1795' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='92' column='1' id='type-id-1816'> + <class-decl name='_PyPerf_Callbacks' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1796' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='94' column='1' id='type-id-1817'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='init_state' type-id='type-id-1240' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='94' column='1'/> + <var-decl name='init_state' type-id='type-id-1242' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='96' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='write_state' type-id='type-id-1241' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='96' column='1'/> + <var-decl name='write_state' type-id='type-id-1243' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='98' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='free_state' type-id='type-id-255' 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-1816' filepath='./Include/internal/pycore_ceval.h' line='100' column='1' id='type-id-1795'/> - <typedef-decl name='PyOS_sighandler_t' type-id='type-id-1413' filepath='./Include/pylifecycle.h' line='59' column='1' id='type-id-1817'/> - <typedef-decl name='nl_item' type-id='type-id-5' filepath='/usr/include/nl_types.h' line='36' column='1' id='type-id-1818'/> - <typedef-decl name='sigset_t' type-id='type-id-42' filepath='/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h' line='7' column='1' id='type-id-86'/> - <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-1819'/> - <pointer-type-def type-id='type-id-1795' size-in-bits='64' id='type-id-238'/> - <qualified-type-def type-id='type-id-1167' const='yes' id='type-id-1820'/> - <pointer-type-def type-id='type-id-1820' size-in-bits='64' id='type-id-1821'/> - <qualified-type-def type-id='type-id-1821' restrict='yes' id='type-id-1822'/> - <pointer-type-def type-id='type-id-1167' size-in-bits='64' id='type-id-1823'/> - <qualified-type-def type-id='type-id-1823' restrict='yes' id='type-id-1824'/> - <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-57'/> + <var-decl name='free_state' type-id='type-id-255' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='101' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyPerf_Callbacks' type-id='type-id-1817' filepath='./Include/internal/pycore_ceval.h' line='102' column='1' id='type-id-1796'/> + <typedef-decl name='PyOS_sighandler_t' type-id='type-id-1414' filepath='./Include/pylifecycle.h' line='59' column='1' id='type-id-1818'/> + <typedef-decl name='nl_item' type-id='type-id-5' filepath='/usr/include/nl_types.h' line='36' column='1' id='type-id-1819'/> + <typedef-decl name='sigset_t' type-id='type-id-48' filepath='/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h' line='7' column='1' id='type-id-92'/> + <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-1820'/> + <pointer-type-def type-id='type-id-1796' size-in-bits='64' id='type-id-238'/> + <qualified-type-def type-id='type-id-1169' const='yes' id='type-id-1821'/> + <pointer-type-def type-id='type-id-1821' size-in-bits='64' id='type-id-1822'/> + <qualified-type-def type-id='type-id-1822' restrict='yes' id='type-id-1823'/> + <pointer-type-def type-id='type-id-1169' size-in-bits='64' id='type-id-1824'/> + <qualified-type-def type-id='type-id-1824' restrict='yes' id='type-id-1825'/> + <pointer-type-def type-id='type-id-92' size-in-bits='64' id='type-id-63'/> <function-decl name='_PySys_ClearAuditHooks' filepath='./Include/internal/pycore_audit.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_FinishPendingCalls' filepath='./Include/internal/pycore_ceval.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_Py_FinishPendingCalls' filepath='./Include/internal/pycore_ceval.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyEval_Fini' filepath='./Include/internal/pycore_ceval.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyEval_Fini' filepath='./Include/internal/pycore_ceval.h' line='87' 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'> + <function-decl name='_PyPerfTrampoline_SetCallbacks' filepath='./Include/internal/pycore_ceval.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-238'/> <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'> + <function-decl name='_PyPerfTrampoline_Init' filepath='./Include/internal/pycore_ceval.h' line='106' 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'> + <function-decl name='_PyPerfTrampoline_Fini' 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='_PyPerfTrampoline_FreeArenas' filepath='./Include/internal/pycore_ceval.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyPerfTrampoline_FreeArenas' filepath='./Include/internal/pycore_ceval.h' line='108' 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-31'/> + <function-decl name='_PyEval_InitGIL' filepath='./Include/internal/pycore_ceval.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <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-33'/> + <function-decl name='_PyEval_FiniGIL' filepath='./Include/internal/pycore_ceval.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyCode_Init' filepath='./Include/internal/pycore_code.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyCode_Fini' filepath='./Include/internal/pycore_code.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyContext_Init' filepath='./Include/internal/pycore_context.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyXI_Init' filepath='./Include/internal/pycore_crossinterp.h' line='274' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyXI_Fini' filepath='./Include/internal/pycore_crossinterp.h' line='275' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyXI_InitTypes' filepath='./Include/internal/pycore_crossinterp.h' line='276' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyXI_FiniTypes' filepath='./Include/internal/pycore_crossinterp.h' line='277' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyDtoa_Init' filepath='./Include/internal/pycore_dtoa.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyDtoa_Fini' filepath='./Include/internal/pycore_dtoa.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </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-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </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-33'/> + <parameter type-id='type-id-39'/> <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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyExc_ClearExceptionGroupType' filepath='./Include/internal/pycore_exceptions.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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='130' 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-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-7'/> </function-decl> <function-decl name='_Py_ResetForceASCII' filepath='./Include/internal/pycore_fileutils.h' line='226' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -29942,121 +30022,121 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyFloat_InitState' filepath='./Include/internal/pycore_floatobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyFloat_InitTypes' filepath='./Include/internal/pycore_floatobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGC_CollectNoFail' filepath='./Include/internal/pycore_gc.h' line='332' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyGC_CollectNoFail' filepath='./Include/internal/pycore_gc.h' line='348' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <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-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_ClearModules' filepath='./Include/internal/pycore_import.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyImport_ClearModulesByIndex' filepath='./Include/internal/pycore_import.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyImport_InitDefaultImportFunc' filepath='./Include/internal/pycore_import.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyImport_GetImportlibLoader' filepath='./Include/internal/pycore_import.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyImport_Init' filepath='./Include/internal/pycore_import.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyImport_Fini' filepath='./Include/internal/pycore_import.h' line='91' 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='94' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyImport_InitExternal' filepath='./Include/internal/pycore_import.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-37'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyImport_FiniCore' filepath='./Include/internal/pycore_import.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyImport_FiniExternal' filepath='./Include/internal/pycore_import.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyPreConfig_InitFromConfig' filepath='./Include/internal/pycore_initconfig.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1735'/> + <parameter type-id='type-id-1736'/> <parameter type-id='type-id-240'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyPreConfig_Read' filepath='./Include/internal/pycore_initconfig.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1735'/> - <parameter type-id='type-id-1742'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1736'/> + <parameter type-id='type-id-1743'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyPreConfig_Write' filepath='./Include/internal/pycore_initconfig.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-250'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyConfig_Copy' filepath='./Include/internal/pycore_initconfig.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-65'/> + <parameter type-id='type-id-71'/> <parameter type-id='type-id-240'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyConfig_InitImportConfig' filepath='./Include/internal/pycore_initconfig.h' line='176' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-65'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-71'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyConfig_Read' filepath='./Include/internal/pycore_initconfig.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-65'/> + <parameter type-id='type-id-71'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyConfig_Write' filepath='./Include/internal/pycore_initconfig.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-240'/> - <parameter type-id='type-id-171'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyInterpreterState_Clear' filepath='./Include/internal/pycore_interp.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyInterpreterState_New' mangled-name='_PyInterpreterState_New' filepath='./Include/internal/pycore_interp.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_New'> - <parameter type-id='type-id-31'/> - <parameter type-id='type-id-1819'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-37'/> + <parameter type-id='type-id-1820'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyInterpolation_InitTypes' filepath='./Include/internal/pycore_interpolation.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyLong_InitTypes' filepath='./Include/internal/pycore_long.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyLong_FiniTypes' filepath='./Include/internal/pycore_long.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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'> @@ -30072,57 +30152,57 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyObject_InitState' filepath='./Include/internal/pycore_object.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_Py_GetConstant_Init' filepath='./Include/internal/pycore_object.h' line='1001' 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-33'/> + <parameter type-id='type-id-39'/> <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-240'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyErr_InitTypes' filepath='./Include/internal/pycore_pyerrors.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyErr_FiniTypes' filepath='./Include/internal/pycore_pyerrors.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_ClearFileSystemEncoding' filepath='./Include/internal/pycore_pylifecycle.h' line='19' 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='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-37'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_Py_InitVersion' filepath='./Include/internal/pycore_pylifecycle.h' line='29' 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='30' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyBuiltin_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PySys_Create' filepath='./Include/internal/pycore_pylifecycle.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-241'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PySys_UpdateConfig' filepath='./Include/internal/pycore_pylifecycle.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PySys_FiniTypes' filepath='./Include/internal/pycore_pylifecycle.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyBuiltins_AddExceptions' filepath='./Include/internal/pycore_pylifecycle.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -30131,166 +30211,170 @@ </function-decl> <function-decl name='_Py_HashRandomization_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-240'/> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyGC_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyAtExit_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_PySignal_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> + <function-decl name='_PyDateTime_InitTypes' filepath='./Include/internal/pycore_pylifecycle.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> + </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='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='51' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='52' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='53' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyArg_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <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='60' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> + <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-177'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGILState_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <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-39'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='_PyGILState_SetTstate' filepath='./Include/internal/pycore_pylifecycle.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <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-37'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGILState_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGC_DumpShutdownStats' filepath='./Include/internal/pycore_pylifecycle.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyAtExit_Call' filepath='./Include/internal/pycore_pylifecycle.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyMem_FiniDelayed' filepath='./Include/internal/pycore_pymem.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <function-decl name='_PyMem_FiniDelayed' filepath='./Include/internal/pycore_pymem.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> <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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> <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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_IsRunningMain' filepath='./Include/internal/pycore_pystate.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyThreadState_SetShuttingDown' filepath='./Include/internal/pycore_pystate.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_New' mangled-name='_PyThreadState_New' filepath='./Include/internal/pycore_pystate.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_New'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-5'/> - <return type-id='type-id-31'/> + <return type-id='type-id-37'/> </function-decl> <function-decl name='_PyThreadState_Bind' filepath='./Include/internal/pycore_pystate.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_RemoveExcept' filepath='./Include/internal/pycore_pystate.h' line='225' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> - <return type-id='type-id-31'/> + <parameter type-id='type-id-37'/> + <return type-id='type-id-37'/> </function-decl> <function-decl name='_PyThreadState_DeleteList' filepath='./Include/internal/pycore_pystate.h' line='226' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-5'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyThreadState_ClearMimallocHeaps' filepath='./Include/internal/pycore_pystate.h' line='227' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyInterpreterState_Enable' filepath='./Include/internal/pycore_pystate.h' line='244' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-72'/> </function-decl> - <var-decl name='_PyRuntime' type-id='type-id-1379' mangled-name='_PyRuntime' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='19' column='1' elf-symbol-id='_PyRuntime'/> + <var-decl name='_PyRuntime' type-id='type-id-1380' mangled-name='_PyRuntime' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='19' column='1' elf-symbol-id='_PyRuntime'/> <function-decl name='_PyRuntimeState_Init' filepath='./Include/internal/pycore_runtime.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyRuntimeState_Fini' filepath='./Include/internal/pycore_runtime.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-171'/> + <parameter type-id='type-id-177'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PySys_SetAttr' filepath='./Include/internal/pycore_sysmodule.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -30300,8 +30384,8 @@ </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-33'/> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-37'/> <return type-id='type-id-4'/> </function-decl> <function-decl name='_Py_DumpASCII' filepath='./Include/internal/pycore_traceback.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -30311,75 +30395,72 @@ </function-decl> <function-decl name='_Py_DumpDecimal' filepath='./Include/internal/pycore_traceback.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_DumpHexadecimal' filepath='./Include/internal/pycore_traceback.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-369'/> + <parameter type-id='type-id-371'/> <parameter type-id='type-id-7'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTraceMalloc_Init' filepath='./Include/internal/pycore_tracemalloc.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-66'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyTraceMalloc_Start' filepath='./Include/internal/pycore_tracemalloc.h' line='144' 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='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyTypes_FiniTypes' filepath='./Include/internal/pycore_typeobject.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTypes_FiniExtTypes' filepath='./Include/internal/pycore_typeobject.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTypes_Fini' filepath='./Include/internal/pycore_typeobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicode_InitState' filepath='./Include/internal/pycore_unicodeobject.h' line='276' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicode_InitGlobalObjects' filepath='./Include/internal/pycore_unicodeobject.h' line='277' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyUnicode_InitTypes' filepath='./Include/internal/pycore_unicodeobject.h' line='278' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyUnicode_Fini' filepath='./Include/internal/pycore_unicodeobject.h' line='279' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicode_FiniTypes' filepath='./Include/internal/pycore_unicodeobject.h' line='280' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyUnicode_ClearInterned' filepath='./Include/internal/pycore_unicodeobject.h' line='298' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyWarnings_InitState' filepath='./Include/internal/pycore_warnings.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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-33'/> - </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-31'/> + <return type-id='type-id-37'/> </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-4'/> @@ -30392,23 +30473,23 @@ <return type-id='type-id-3'/> </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-1818'/> - <return type-id='type-id-17'/> + <parameter type-id='type-id-1819'/> + <return type-id='type-id-24'/> </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-57'/> + <parameter type-id='type-id-63'/> <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-1822'/> - <parameter type-id='type-id-1824'/> + <parameter type-id='type-id-1823'/> + <parameter type-id='type-id-1825'/> <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-486'/> - <parameter type-id='type-id-180'/> - <parameter type-id='type-id-306'/> + <parameter type-id='type-id-488'/> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-308'/> <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'> @@ -30420,146 +30501,145 @@ <function-decl name='Py_IsFinalizing' mangled-name='Py_IsFinalizing' filepath='Python/pylifecycle.c' line='145' 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='Py_PreInitializeFromBytesArgs' mangled-name='Py_PreInitializeFromBytesArgs' filepath='Python/pylifecycle.c' line='1008' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitializeFromBytesArgs'> - <parameter type-id='type-id-250' name='src_config' filepath='Python/pylifecycle.c' line='1008' column='1'/> - <parameter type-id='type-id-7' name='argc' filepath='Python/pylifecycle.c' line='1008' column='1'/> - <parameter type-id='type-id-251' name='argv' filepath='Python/pylifecycle.c' line='1008' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='Py_PreInitializeFromBytesArgs' mangled-name='Py_PreInitializeFromBytesArgs' filepath='Python/pylifecycle.c' line='1013' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitializeFromBytesArgs'> + <parameter type-id='type-id-250' name='src_config' filepath='Python/pylifecycle.c' line='1013' column='1'/> + <parameter type-id='type-id-7' name='argc' filepath='Python/pylifecycle.c' line='1013' column='1'/> + <parameter type-id='type-id-251' name='argv' filepath='Python/pylifecycle.c' line='1013' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='Py_PreInitialize' mangled-name='Py_PreInitialize' filepath='Python/pylifecycle.c' line='1024' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitialize'> - <parameter type-id='type-id-250' name='src_config' filepath='Python/pylifecycle.c' line='1024' column='1'/> - <return type-id='type-id-66'/> + <function-decl name='Py_PreInitialize' mangled-name='Py_PreInitialize' filepath='Python/pylifecycle.c' line='1029' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitialize'> + <parameter type-id='type-id-250' name='src_config' filepath='Python/pylifecycle.c' line='1029' column='1'/> + <return type-id='type-id-72'/> </function-decl> - <function-decl name='Py_InitializeEx' mangled-name='Py_InitializeEx' filepath='Python/pylifecycle.c' line='1450' 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='1450' column='1'/> + <function-decl name='Py_InitializeEx' mangled-name='Py_InitializeEx' filepath='Python/pylifecycle.c' line='1455' 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='1455' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='Py_Initialize' mangled-name='Py_Initialize' filepath='Python/pylifecycle.c' line='1478' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Initialize'> + <function-decl name='Py_Initialize' mangled-name='Py_Initialize' filepath='Python/pylifecycle.c' line='1483' 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_Finalize' mangled-name='Py_Finalize' filepath='Python/pylifecycle.c' line='2257' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Finalize'> + <function-decl name='Py_Finalize' mangled-name='Py_Finalize' filepath='Python/pylifecycle.c' line='2270' 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='2401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreter'> - <return type-id='type-id-31'/> + <function-decl name='Py_NewInterpreter' mangled-name='Py_NewInterpreter' filepath='Python/pylifecycle.c' line='2413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreter'> + <return type-id='type-id-37'/> </function-decl> - <function-decl name='Py_FatalError' mangled-name='Py_FatalError' filepath='Python/pylifecycle.c' line='3373' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FatalError'> - <parameter type-id='type-id-4' name='msg' filepath='Python/pylifecycle.c' line='3373' column='1'/> + <function-decl name='Py_FatalError' mangled-name='Py_FatalError' filepath='Python/pylifecycle.c' line='3381' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FatalError'> + <parameter type-id='type-id-4' name='msg' filepath='Python/pylifecycle.c' line='3381' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_FatalRefcountErrorFunc' mangled-name='_Py_FatalRefcountErrorFunc' filepath='Python/pylifecycle.c' line='3417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalRefcountErrorFunc'> - <parameter type-id='type-id-4' name='func' filepath='Python/pylifecycle.c' line='3417' column='1'/> - <parameter type-id='type-id-4' name='msg' filepath='Python/pylifecycle.c' line='3417' column='1'/> + <function-decl name='_Py_FatalRefcountErrorFunc' mangled-name='_Py_FatalRefcountErrorFunc' filepath='Python/pylifecycle.c' line='3425' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalRefcountErrorFunc'> + <parameter type-id='type-id-4' name='func' filepath='Python/pylifecycle.c' line='3425' column='1'/> + <parameter type-id='type-id-4' name='msg' filepath='Python/pylifecycle.c' line='3425' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='Py_AtExit' mangled-name='Py_AtExit' filepath='Python/pylifecycle.c' line='3467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AtExit'> - <parameter type-id='type-id-232' name='func' filepath='Python/pylifecycle.c' line='3467' column='1'/> + <function-decl name='Py_AtExit' mangled-name='Py_AtExit' filepath='Python/pylifecycle.c' line='3475' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AtExit'> + <parameter type-id='type-id-232' name='func' filepath='Python/pylifecycle.c' line='3475' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='Py_Exit' mangled-name='Py_Exit' filepath='Python/pylifecycle.c' line='3504' 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='3504' column='1'/> + <function-decl name='Py_Exit' mangled-name='Py_Exit' filepath='Python/pylifecycle.c' line='3512' 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='3512' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='Py_FdIsInteractive' mangled-name='Py_FdIsInteractive' filepath='Python/pylifecycle.c' line='3525' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FdIsInteractive'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pylifecycle.c' line='3525' column='1'/> - <parameter type-id='type-id-4' name='filename' filepath='Python/pylifecycle.c' line='3525' column='1'/> + <function-decl name='Py_FdIsInteractive' mangled-name='Py_FdIsInteractive' filepath='Python/pylifecycle.c' line='3533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FdIsInteractive'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pylifecycle.c' line='3533' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Python/pylifecycle.c' line='3533' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyOS_getsig' mangled-name='PyOS_getsig' filepath='Python/pylifecycle.c' line='3557' 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='3557' column='1'/> - <return type-id='type-id-1817'/> + <function-decl name='PyOS_getsig' mangled-name='PyOS_getsig' filepath='Python/pylifecycle.c' line='3565' 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='3565' column='1'/> + <return type-id='type-id-1818'/> </function-decl> - <function-decl name='PyOS_setsig' mangled-name='PyOS_setsig' filepath='Python/pylifecycle.c' line='3596' 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='3596' column='1'/> - <parameter type-id='type-id-1817' name='handler' filepath='Python/pylifecycle.c' line='3596' column='1'/> - <return type-id='type-id-1817'/> + <function-decl name='PyOS_setsig' mangled-name='PyOS_setsig' filepath='Python/pylifecycle.c' line='3604' 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='3604' column='1'/> + <parameter type-id='type-id-1818' name='handler' filepath='Python/pylifecycle.c' line='3604' column='1'/> + <return type-id='type-id-1818'/> </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-1355' size-in-bits='64' id='type-id-1825'/> - <pointer-type-def type-id='type-id-1347' size-in-bits='64' id='type-id-1826'/> - <pointer-type-def type-id='type-id-1254' size-in-bits='64' id='type-id-1827'/> - <pointer-type-def type-id='type-id-1326' size-in-bits='64' id='type-id-1828'/> - <function-decl name='_PyEval_InitState' filepath='./Include/internal/pycore_ceval.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <pointer-type-def type-id='type-id-1356' size-in-bits='64' id='type-id-1826'/> + <pointer-type-def type-id='type-id-1348' size-in-bits='64' id='type-id-1827'/> + <pointer-type-def type-id='type-id-1327' size-in-bits='64' id='type-id-1828'/> + <function-decl name='_PyEval_InitState' filepath='./Include/internal/pycore_ceval.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> <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-31'/> + <function-decl name='_PyEval_AcquireLock' filepath='./Include/internal/pycore_ceval.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <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-33'/> - <parameter type-id='type-id-31'/> + <function-decl name='_PyEval_ReleaseLock' filepath='./Include/internal/pycore_ceval.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-37'/> <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-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyGC_InitState' filepath='./Include/internal/pycore_gc.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1827'/> + <function-decl name='_PyGC_InitState' filepath='./Include/internal/pycore_gc.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-273'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyImport_ClearCore' filepath='./Include/internal/pycore_import.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyImport_GetModulesRef' filepath='./Include/internal/pycore_import.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyType_InitCache' filepath='./Include/internal/pycore_object.h' line='319' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyObject_FiniState' filepath='./Include/internal/pycore_object.h' line='322' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <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-35'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-41'/> </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-35'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-14'/> <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-33'/> + <parameter type-id='type-id-39'/> <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-33'/> - <return type-id='type-id-344'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-346'/> </function-decl> <function-decl name='_PyErr_SetModuleNotFoundError' filepath='./Include/internal/pycore_pyerrors.h' line='63' 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='_PyGC_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyWarnings_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyAST_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyAtExit_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <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-39'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyMem_AbandonDelayed' filepath='./Include/internal/pycore_pymem.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <function-decl name='_PyMem_AbandonDelayed' filepath='./Include/internal/pycore_pymem.h' line='116' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-37'/> <return type-id='type-id-3'/> </function-decl> - <var-decl name='_Py_tss_tstate' type-id='type-id-31' visibility='default' filepath='./Include/internal/pycore_pystate.h' line='93' column='1'/> + <var-decl name='_Py_tss_tstate' type-id='type-id-37' visibility='default' filepath='./Include/internal/pycore_pystate.h' line='93' column='1'/> <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-1828'/> <return type-id='type-id-3'/> @@ -30568,12 +30648,12 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='_Py_qsbr_fini' filepath='./Include/internal/pycore_qsbr.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='_PyTime_Init' filepath='./Include/internal/pycore_time.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1826'/> - <return type-id='type-id-66'/> + <parameter type-id='type-id-1827'/> + <return type-id='type-id-72'/> </function-decl> <function-decl name='_PyTypes_AfterFork' filepath='./Include/internal/pycore_typeobject.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-3'/> @@ -30585,109 +30665,112 @@ <return type-id='type-id-2'/> </function-decl> <function-decl name='PyThread_tss_is_created' mangled-name='PyThread_tss_is_created' filepath='./Include/pythread.h' line='115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_is_created'> - <parameter type-id='type-id-1825'/> + <parameter type-id='type-id-1826'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyThread_tss_create' mangled-name='PyThread_tss_create' filepath='./Include/pythread.h' line='116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_create'> - <parameter type-id='type-id-1825'/> + <parameter type-id='type-id-1826'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyThread_tss_delete' mangled-name='PyThread_tss_delete' filepath='./Include/pythread.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_delete'> - <parameter type-id='type-id-1825'/> + <parameter type-id='type-id-1826'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyThread_tss_set' mangled-name='PyThread_tss_set' filepath='./Include/pythread.h' line='118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_set'> - <parameter type-id='type-id-1825'/> - <parameter type-id='type-id-35'/> + <parameter type-id='type-id-1826'/> + <parameter type-id='type-id-41'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyThread_tss_get' mangled-name='PyThread_tss_get' filepath='./Include/pythread.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_get'> - <parameter type-id='type-id-1825'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-1826'/> + <return type-id='type-id-41'/> </function-decl> - <function-decl name='_PyThreadState_GetCurrent' mangled-name='_PyThreadState_GetCurrent' filepath='Python/pystate.c' line='115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetCurrent'> - <return type-id='type-id-31'/> + <function-decl name='_PyThreadState_GetCurrent' mangled-name='_PyThreadState_GetCurrent' filepath='Python/pystate.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetCurrent'> + <return type-id='type-id-37'/> + </function-decl> + <function-decl name='PyInterpreterState_New' mangled-name='PyInterpreterState_New' filepath='Python/pystate.c' line='800' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_New'> + <return type-id='type-id-39'/> </function-decl> - <function-decl name='PyInterpreterState_Clear' mangled-name='PyInterpreterState_Clear' filepath='Python/pystate.c' line='984' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Clear'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='984' column='1'/> + <function-decl name='PyInterpreterState_Clear' mangled-name='PyInterpreterState_Clear' filepath='Python/pystate.c' line='979' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Clear'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='979' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyInterpreterState_GetWhence' mangled-name='_PyInterpreterState_GetWhence' filepath='Python/pystate.c' line='1208' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetWhence'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1208' column='1'/> - <return type-id='type-id-184'/> + <function-decl name='_PyInterpreterState_GetWhence' mangled-name='_PyInterpreterState_GetWhence' filepath='Python/pystate.c' line='1205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetWhence'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1205' column='1'/> + <return type-id='type-id-188'/> </function-decl> - <function-decl name='_PyInterpreterState_ObjectToID' mangled-name='_PyInterpreterState_ObjectToID' filepath='Python/pystate.c' line='1281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_ObjectToID'> - <parameter type-id='type-id-6' name='idobj' filepath='Python/pystate.c' line='1281' column='1'/> - <return type-id='type-id-409'/> + <function-decl name='_PyInterpreterState_ObjectToID' mangled-name='_PyInterpreterState_ObjectToID' filepath='Python/pystate.c' line='1278' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_ObjectToID'> + <parameter type-id='type-id-6' name='idobj' filepath='Python/pystate.c' line='1278' column='1'/> + <return type-id='type-id-411'/> </function-decl> - <function-decl name='_PyInterpreterState_GetIDObject' mangled-name='_PyInterpreterState_GetIDObject' filepath='Python/pystate.c' line='1325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetIDObject'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1325' column='1'/> + <function-decl name='_PyInterpreterState_GetIDObject' mangled-name='_PyInterpreterState_GetIDObject' filepath='Python/pystate.c' line='1322' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetIDObject'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1322' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='_PyInterpreterState_IDIncref' mangled-name='_PyInterpreterState_IDIncref' filepath='Python/pystate.c' line='1338' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDIncref'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1338' column='1'/> + <function-decl name='_PyInterpreterState_IDIncref' mangled-name='_PyInterpreterState_IDIncref' filepath='Python/pystate.c' line='1335' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDIncref'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1335' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyInterpreterState_IDDecref' mangled-name='_PyInterpreterState_IDDecref' filepath='Python/pystate.c' line='1345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDDecref'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1345' column='1'/> + <function-decl name='_PyInterpreterState_IDDecref' mangled-name='_PyInterpreterState_IDDecref' filepath='Python/pystate.c' line='1342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDDecref'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1342' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyInterpreterState_RequiresIDRef' mangled-name='_PyInterpreterState_RequiresIDRef' filepath='Python/pystate.c' line='1363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequiresIDRef'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1363' column='1'/> + <function-decl name='_PyInterpreterState_RequiresIDRef' mangled-name='_PyInterpreterState_RequiresIDRef' filepath='Python/pystate.c' line='1360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequiresIDRef'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1360' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='_PyInterpreterState_RequireIDRef' mangled-name='_PyInterpreterState_RequireIDRef' filepath='Python/pystate.c' line='1369' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequireIDRef'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1369' column='1'/> - <parameter type-id='type-id-5' name='required' filepath='Python/pystate.c' line='1369' column='1'/> + <function-decl name='_PyInterpreterState_RequireIDRef' mangled-name='_PyInterpreterState_RequireIDRef' filepath='Python/pystate.c' line='1366' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequireIDRef'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1366' column='1'/> + <parameter type-id='type-id-5' name='required' filepath='Python/pystate.c' line='1366' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_PyInterpreterState_LookUpIDObject' mangled-name='_PyInterpreterState_LookUpIDObject' filepath='Python/pystate.c' line='1436' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_LookUpIDObject'> - <parameter type-id='type-id-6' name='requested_id' filepath='Python/pystate.c' line='1436' column='1'/> - <return type-id='type-id-33'/> + <function-decl name='_PyInterpreterState_LookUpIDObject' mangled-name='_PyInterpreterState_LookUpIDObject' filepath='Python/pystate.c' line='1433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_LookUpIDObject'> + <parameter type-id='type-id-6' name='requested_id' filepath='Python/pystate.c' line='1433' column='1'/> + <return type-id='type-id-39'/> </function-decl> <function-decl name='_PyThreadState_Prealloc' mangled-name='_PyThreadState_Prealloc' filepath='Python/pystate.c' line='1693' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Prealloc'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='1693' column='1'/> - <return type-id='type-id-31'/> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='1693' column='1'/> + <return type-id='type-id-37'/> </function-decl> <function-decl name='_PyThreadState_Init' mangled-name='_PyThreadState_Init' filepath='Python/pystate.c' line='1701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Init'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/pystate.c' line='1701' column='1'/> + <parameter type-id='type-id-37' name='tstate' filepath='Python/pystate.c' line='1701' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='PyThreadState_DeleteCurrent' mangled-name='PyThreadState_DeleteCurrent' filepath='Python/pystate.c' line='1952' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_DeleteCurrent'> + <function-decl name='PyThreadState_DeleteCurrent' mangled-name='PyThreadState_DeleteCurrent' filepath='Python/pystate.c' line='1953' 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='2038' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetDict'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/pystate.c' line='2038' column='1'/> + <function-decl name='_PyThreadState_GetDict' mangled-name='_PyThreadState_GetDict' filepath='Python/pystate.c' line='2039' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetDict'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/pystate.c' line='2039' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyThreadState_GetID' mangled-name='PyThreadState_GetID' filepath='Python/pystate.c' line='2087' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetID'> - <parameter type-id='type-id-31' name='tstate' filepath='Python/pystate.c' line='2087' column='1'/> - <return type-id='type-id-111'/> + <function-decl name='PyThreadState_GetID' mangled-name='PyThreadState_GetID' filepath='Python/pystate.c' line='2088' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetID'> + <parameter type-id='type-id-37' name='tstate' filepath='Python/pystate.c' line='2088' column='1'/> + <return type-id='type-id-117'/> </function-decl> - <function-decl name='PyThreadState_SetAsyncExc' mangled-name='PyThreadState_SetAsyncExc' filepath='Python/pystate.c' line='2485' 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='2485' column='1'/> - <parameter type-id='type-id-6' name='exc' filepath='Python/pystate.c' line='2485' column='1'/> + <function-decl name='PyThreadState_SetAsyncExc' mangled-name='PyThreadState_SetAsyncExc' filepath='Python/pystate.c' line='2488' 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='2488' column='1'/> + <parameter type-id='type-id-6' name='exc' filepath='Python/pystate.c' line='2488' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyThreadState_GetUnchecked' mangled-name='PyThreadState_GetUnchecked' filepath='Python/pystate.c' line='2527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetUnchecked'> - <return type-id='type-id-31'/> + <function-decl name='PyThreadState_GetUnchecked' mangled-name='PyThreadState_GetUnchecked' filepath='Python/pystate.c' line='2530' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetUnchecked'> + <return type-id='type-id-37'/> </function-decl> - <function-decl name='PyInterpreterState_Main' mangled-name='PyInterpreterState_Main' filepath='Python/pystate.c' line='2605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Main'> - <return type-id='type-id-33'/> + <function-decl name='PyInterpreterState_Main' mangled-name='PyInterpreterState_Main' filepath='Python/pystate.c' line='2608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Main'> + <return type-id='type-id-39'/> </function-decl> - <function-decl name='_PyThread_CurrentFrames' mangled-name='_PyThread_CurrentFrames' filepath='Python/pystate.c' line='2636' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThread_CurrentFrames'> + <function-decl name='_PyThread_CurrentFrames' mangled-name='_PyThread_CurrentFrames' filepath='Python/pystate.c' line='2639' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThread_CurrentFrames'> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyGILState_Check' mangled-name='PyGILState_Check' filepath='Python/pystate.c' line='2833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Check'> + <function-decl name='PyGILState_Check' mangled-name='PyGILState_Check' filepath='Python/pystate.c' line='2836' 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_GetEvalFrameFunc' mangled-name='_PyInterpreterState_GetEvalFrameFunc' filepath='Python/pystate.c' line='2959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetEvalFrameFunc'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='2959' column='1'/> - <return type-id='type-id-1053'/> + <function-decl name='_PyInterpreterState_GetEvalFrameFunc' mangled-name='_PyInterpreterState_GetEvalFrameFunc' filepath='Python/pystate.c' line='2962' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetEvalFrameFunc'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='2962' column='1'/> + <return type-id='type-id-1055'/> </function-decl> - <function-decl name='_PyInterpreterState_SetEvalFrameFunc' mangled-name='_PyInterpreterState_SetEvalFrameFunc' filepath='Python/pystate.c' line='2969' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetEvalFrameFunc'> - <parameter type-id='type-id-33' name='interp' filepath='Python/pystate.c' line='2969' column='1'/> - <parameter type-id='type-id-1053' name='eval_frame' filepath='Python/pystate.c' line='2970' column='1'/> + <function-decl name='_PyInterpreterState_SetEvalFrameFunc' mangled-name='_PyInterpreterState_SetEvalFrameFunc' filepath='Python/pystate.c' line='2972' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetEvalFrameFunc'> + <parameter type-id='type-id-39' name='interp' filepath='Python/pystate.c' line='2972' column='1'/> + <parameter type-id='type-id-1055' name='eval_frame' filepath='Python/pystate.c' line='2973' column='1'/> <return type-id='type-id-3'/> </function-decl> </abi-instr> @@ -30708,13 +30791,13 @@ <parameter type-id='type-id-4' name='argbuf' filepath='Python/pystrhex.c' line='168' column='1'/> <parameter type-id='type-id-263' name='arglen' filepath='Python/pystrhex.c' line='168' column='1'/> <parameter type-id='type-id-6' name='sep' filepath='Python/pystrhex.c' line='169' column='1'/> - <parameter type-id='type-id-274' name='bytes_per_group' filepath='Python/pystrhex.c' line='169' column='1'/> + <parameter type-id='type-id-276' name='bytes_per_group' filepath='Python/pystrhex.c' line='169' column='1'/> <return type-id='type-id-6'/> </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='79' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> + <parameter type-id='type-id-39'/> <parameter type-id='type-id-4'/> <return type-id='type-id-6'/> </function-decl> @@ -30722,37 +30805,37 @@ <parameter type-id='type-id-4'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-5'/> - <parameter type-id='type-id-209'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-646'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-648'/> </function-decl> <function-decl name='_PyParser_ASTFromFile' filepath='./Include/internal/pycore_parser.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-209'/> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-646'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-183'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-648'/> </function-decl> <function-decl name='_PyParser_InteractiveASTFromFile' filepath='./Include/internal/pycore_parser.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <parameter type-id='type-id-67'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-5'/> <parameter type-id='type-id-4'/> <parameter type-id='type-id-4'/> - <parameter type-id='type-id-209'/> - <parameter type-id='type-id-177'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-183'/> <parameter type-id='type-id-241'/> - <parameter type-id='type-id-743'/> - <return type-id='type-id-646'/> + <parameter type-id='type-id-745'/> + <return type-id='type-id-648'/> </function-decl> - <function-decl name='_Py_FdIsInteractive' filepath='./Include/internal/pycore_pylifecycle.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-61'/> + <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-67'/> <parameter type-id='type-id-6'/> <return type-id='type-id-5'/> </function-decl> @@ -30763,37 +30846,37 @@ <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-61'/> + <parameter type-id='type-id-67'/> <return type-id='type-id-3'/> </function-decl> <function-decl name='PyRun_InteractiveLoopFlags' mangled-name='PyRun_InteractiveLoopFlags' filepath='Python/pythonrun.c' line='183' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoopFlags'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='183' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='183' column='1'/> <parameter type-id='type-id-4' name='filename' filepath='Python/pythonrun.c' line='183' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='183' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='183' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyRun_InteractiveOneObject' mangled-name='PyRun_InteractiveOneObject' filepath='Python/pythonrun.c' line='357' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOneObject'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='357' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='357' column='1'/> <parameter type-id='type-id-6' name='filename' filepath='Python/pythonrun.c' line='357' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='357' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='357' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyRun_InteractiveOneFlags' mangled-name='PyRun_InteractiveOneFlags' filepath='Python/pythonrun.c' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOneFlags'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='370' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='370' column='1'/> <parameter type-id='type-id-4' name='filename_str' filepath='Python/pythonrun.c' line='370' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='370' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='370' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyRun_SimpleFileExFlags' mangled-name='PyRun_SimpleFileExFlags' filepath='Python/pythonrun.c' line='548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileExFlags'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='548' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='548' column='1'/> <parameter type-id='type-id-4' name='filename' filepath='Python/pythonrun.c' line='548' column='1'/> <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='548' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='549' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='549' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyRun_SimpleStringFlags' mangled-name='PyRun_SimpleStringFlags' filepath='Python/pythonrun.c' line='592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleStringFlags'> <parameter type-id='type-id-4' name='command' filepath='Python/pythonrun.c' line='592' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='592' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='592' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyErr_Display' mangled-name='PyErr_Display' filepath='Python/pythonrun.c' line='1197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Display'> @@ -30803,101 +30886,101 @@ <return type-id='type-id-3'/> </function-decl> <function-decl name='PyRun_FileExFlags' mangled-name='PyRun_FileExFlags' filepath='Python/pythonrun.c' line='1305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileExFlags'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1305' column='1'/> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1305' column='1'/> <parameter type-id='type-id-4' name='filename' filepath='Python/pythonrun.c' line='1305' column='1'/> <parameter type-id='type-id-5' name='start' filepath='Python/pythonrun.c' line='1305' column='1'/> <parameter type-id='type-id-6' name='globals' filepath='Python/pythonrun.c' line='1305' column='1'/> <parameter type-id='type-id-6' name='locals' filepath='Python/pythonrun.c' line='1306' column='1'/> <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='1306' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1306' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='1306' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyRun_AnyFile' mangled-name='PyRun_AnyFile' filepath='Python/pythonrun.c' line='1616' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFile'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1616' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/pythonrun.c' line='1616' column='1'/> + <function-decl name='PyRun_AnyFile' mangled-name='PyRun_AnyFile' filepath='Python/pythonrun.c' line='1639' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFile'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1639' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/pythonrun.c' line='1639' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyRun_AnyFileEx' mangled-name='PyRun_AnyFileEx' filepath='Python/pythonrun.c' line='1623' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileEx'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1623' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/pythonrun.c' line='1623' column='1'/> - <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='1623' column='1'/> + <function-decl name='PyRun_AnyFileEx' mangled-name='PyRun_AnyFileEx' filepath='Python/pythonrun.c' line='1646' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileEx'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1646' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/pythonrun.c' line='1646' column='1'/> + <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='1646' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyRun_AnyFileFlags' mangled-name='PyRun_AnyFileFlags' filepath='Python/pythonrun.c' line='1630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileFlags'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1630' column='1'/> - <parameter type-id='type-id-4' name='name' filepath='Python/pythonrun.c' line='1630' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1630' column='1'/> + <function-decl name='PyRun_AnyFileFlags' mangled-name='PyRun_AnyFileFlags' filepath='Python/pythonrun.c' line='1653' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileFlags'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1653' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/pythonrun.c' line='1653' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='1653' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyRun_File' mangled-name='PyRun_File' filepath='Python/pythonrun.c' line='1637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_File'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1637' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1637' column='1'/> - <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1637' column='1'/> - <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1637' column='1'/> - <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1637' column='1'/> + <function-decl name='PyRun_File' mangled-name='PyRun_File' filepath='Python/pythonrun.c' line='1660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_File'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1660' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1660' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1660' column='1'/> + <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1660' column='1'/> + <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1660' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyRun_FileEx' mangled-name='PyRun_FileEx' filepath='Python/pythonrun.c' line='1644' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileEx'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1644' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1644' column='1'/> - <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1644' column='1'/> - <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1644' column='1'/> - <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1644' column='1'/> - <parameter type-id='type-id-5' name='c' filepath='Python/pythonrun.c' line='1644' column='1'/> + <function-decl name='PyRun_FileEx' mangled-name='PyRun_FileEx' filepath='Python/pythonrun.c' line='1667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileEx'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1667' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1667' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1667' column='1'/> + <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1667' column='1'/> + <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1667' column='1'/> + <parameter type-id='type-id-5' name='c' filepath='Python/pythonrun.c' line='1667' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyRun_FileFlags' mangled-name='PyRun_FileFlags' filepath='Python/pythonrun.c' line='1651' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileFlags'> - <parameter type-id='type-id-61' name='fp' filepath='Python/pythonrun.c' line='1651' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1651' column='1'/> - <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1651' column='1'/> - <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1651' column='1'/> - <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1651' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1652' column='1'/> + <function-decl name='PyRun_FileFlags' mangled-name='PyRun_FileFlags' filepath='Python/pythonrun.c' line='1674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileFlags'> + <parameter type-id='type-id-67' name='fp' filepath='Python/pythonrun.c' line='1674' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1674' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1674' column='1'/> + <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1674' column='1'/> + <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1674' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='1675' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyRun_SimpleFile' mangled-name='PyRun_SimpleFile' filepath='Python/pythonrun.c' line='1659' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFile'> - <parameter type-id='type-id-61' name='f' filepath='Python/pythonrun.c' line='1659' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1659' column='1'/> + <function-decl name='PyRun_SimpleFile' mangled-name='PyRun_SimpleFile' filepath='Python/pythonrun.c' line='1682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFile'> + <parameter type-id='type-id-67' name='f' filepath='Python/pythonrun.c' line='1682' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1682' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyRun_SimpleFileEx' mangled-name='PyRun_SimpleFileEx' filepath='Python/pythonrun.c' line='1666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileEx'> - <parameter type-id='type-id-61' name='f' filepath='Python/pythonrun.c' line='1666' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1666' column='1'/> - <parameter type-id='type-id-5' name='c' filepath='Python/pythonrun.c' line='1666' column='1'/> + <function-decl name='PyRun_SimpleFileEx' mangled-name='PyRun_SimpleFileEx' filepath='Python/pythonrun.c' line='1689' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileEx'> + <parameter type-id='type-id-67' name='f' filepath='Python/pythonrun.c' line='1689' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1689' column='1'/> + <parameter type-id='type-id-5' name='c' filepath='Python/pythonrun.c' line='1689' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyRun_String' mangled-name='PyRun_String' filepath='Python/pythonrun.c' line='1674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_String'> - <parameter type-id='type-id-4' name='str' filepath='Python/pythonrun.c' line='1674' column='1'/> - <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1674' column='1'/> - <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1674' column='1'/> - <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1674' column='1'/> + <function-decl name='PyRun_String' mangled-name='PyRun_String' filepath='Python/pythonrun.c' line='1697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_String'> + <parameter type-id='type-id-4' name='str' filepath='Python/pythonrun.c' line='1697' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1697' column='1'/> + <parameter type-id='type-id-6' name='g' filepath='Python/pythonrun.c' line='1697' column='1'/> + <parameter type-id='type-id-6' name='l' filepath='Python/pythonrun.c' line='1697' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyRun_SimpleString' mangled-name='PyRun_SimpleString' filepath='Python/pythonrun.c' line='1681' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleString'> - <parameter type-id='type-id-4' name='s' filepath='Python/pythonrun.c' line='1681' column='1'/> + <function-decl name='PyRun_SimpleString' mangled-name='PyRun_SimpleString' filepath='Python/pythonrun.c' line='1704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleString'> + <parameter type-id='type-id-4' name='s' filepath='Python/pythonrun.c' line='1704' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='Py_CompileString' mangled-name='Py_CompileString' filepath='Python/pythonrun.c' line='1688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileString'> - <parameter type-id='type-id-4' name='str' filepath='Python/pythonrun.c' line='1688' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1688' column='1'/> - <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1688' column='1'/> + <function-decl name='Py_CompileString' mangled-name='Py_CompileString' filepath='Python/pythonrun.c' line='1711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileString'> + <parameter type-id='type-id-4' name='str' filepath='Python/pythonrun.c' line='1711' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1711' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1711' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='Py_CompileStringFlags' mangled-name='Py_CompileStringFlags' filepath='Python/pythonrun.c' line='1695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringFlags'> - <parameter type-id='type-id-4' name='str' filepath='Python/pythonrun.c' line='1695' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1695' column='1'/> - <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1695' column='1'/> - <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1696' column='1'/> + <function-decl name='Py_CompileStringFlags' mangled-name='Py_CompileStringFlags' filepath='Python/pythonrun.c' line='1718' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringFlags'> + <parameter type-id='type-id-4' name='str' filepath='Python/pythonrun.c' line='1718' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1718' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1718' column='1'/> + <parameter type-id='type-id-213' name='flags' filepath='Python/pythonrun.c' line='1719' column='1'/> <return type-id='type-id-6'/> </function-decl> - <function-decl name='PyRun_InteractiveOne' mangled-name='PyRun_InteractiveOne' filepath='Python/pythonrun.c' line='1703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOne'> - <parameter type-id='type-id-61' name='f' filepath='Python/pythonrun.c' line='1703' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1703' column='1'/> + <function-decl name='PyRun_InteractiveOne' mangled-name='PyRun_InteractiveOne' filepath='Python/pythonrun.c' line='1726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOne'> + <parameter type-id='type-id-67' name='f' filepath='Python/pythonrun.c' line='1726' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1726' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyRun_InteractiveLoop' mangled-name='PyRun_InteractiveLoop' filepath='Python/pythonrun.c' line='1710' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoop'> - <parameter type-id='type-id-61' name='f' filepath='Python/pythonrun.c' line='1710' column='1'/> - <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1710' column='1'/> + <function-decl name='PyRun_InteractiveLoop' mangled-name='PyRun_InteractiveLoop' filepath='Python/pythonrun.c' line='1733' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoop'> + <parameter type-id='type-id-67' name='f' filepath='Python/pythonrun.c' line='1733' column='1'/> + <parameter type-id='type-id-4' name='p' filepath='Python/pythonrun.c' line='1733' column='1'/> <return type-id='type-id-5'/> </function-decl> </abi-instr> @@ -30913,11 +30996,11 @@ <var-decl name='adjustable' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_time.h' line='249' 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='250' column='1'/> + <var-decl name='resolution' type-id='type-id-178' visibility='default' filepath='./Include/internal/pycore_time.h' line='250' column='1'/> </data-member> </class-decl> <typedef-decl name='_Py_clock_info_t' type-id='type-id-1830' filepath='./Include/internal/pycore_time.h' line='251' column='1' id='type-id-1829'/> - <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-217'> + <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-9'> <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> @@ -30946,20 +31029,20 @@ <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-184' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='20' column='1'/> + <var-decl name='tm_gmtoff' type-id='type-id-188' 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-4' 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-544' filepath='/usr/include/x86_64-linux-gnu/bits/types/time_t.h' line='10' column='1' id='type-id-224'/> + <typedef-decl name='time_t' type-id='type-id-546' filepath='/usr/include/x86_64-linux-gnu/bits/types/time_t.h' line='10' column='1' id='type-id-224'/> <pointer-type-def type-id='type-id-1829' size-in-bits='64' id='type-id-222'/> <qualified-type-def type-id='type-id-224' const='yes' id='type-id-1831'/> <pointer-type-def type-id='type-id-1831' size-in-bits='64' id='type-id-1832'/> <qualified-type-def type-id='type-id-1832' restrict='yes' id='type-id-1833'/> <pointer-type-def type-id='type-id-224' size-in-bits='64' id='type-id-223'/> - <pointer-type-def type-id='type-id-199' size-in-bits='64' id='type-id-221'/> - <pointer-type-def type-id='type-id-217' size-in-bits='64' id='type-id-225'/> + <pointer-type-def type-id='type-id-203' size-in-bits='64' id='type-id-221'/> + <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-225'/> <qualified-type-def type-id='type-id-225' restrict='yes' id='type-id-1834'/> <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-1833'/> @@ -30973,7 +31056,7 @@ </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-226'/> - <parameter type-id='type-id-179'/> + <parameter type-id='type-id-185'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyLong_AsTime_t' mangled-name='_PyLong_AsTime_t' filepath='Python/pytime.c' line='205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsTime_t'> @@ -30987,100 +31070,96 @@ <function-decl name='_PyTime_ObjectToTime_t' mangled-name='_PyTime_ObjectToTime_t' filepath='Python/pytime.c' line='397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTime_t'> <parameter type-id='type-id-6' name='obj' filepath='Python/pytime.c' line='397' column='1'/> <parameter type-id='type-id-223' name='sec' filepath='Python/pytime.c' line='397' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='397' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='397' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_ObjectToTimespec' mangled-name='_PyTime_ObjectToTimespec' filepath='Python/pytime.c' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTimespec'> <parameter type-id='type-id-6' name='obj' filepath='Python/pytime.c' line='432' column='1'/> <parameter type-id='type-id-223' name='sec' filepath='Python/pytime.c' line='432' column='1'/> - <parameter type-id='type-id-170' name='nsec' filepath='Python/pytime.c' line='432' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='433' column='1'/> + <parameter type-id='type-id-176' name='nsec' filepath='Python/pytime.c' line='432' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='433' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_ObjectToTimeval' mangled-name='_PyTime_ObjectToTimeval' filepath='Python/pytime.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTimeval'> <parameter type-id='type-id-6' name='obj' filepath='Python/pytime.c' line='440' column='1'/> <parameter type-id='type-id-223' name='sec' filepath='Python/pytime.c' line='440' column='1'/> - <parameter type-id='type-id-170' name='usec' filepath='Python/pytime.c' line='440' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='441' column='1'/> + <parameter type-id='type-id-176' name='usec' filepath='Python/pytime.c' line='440' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='441' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_FromSeconds' mangled-name='_PyTime_FromSeconds' filepath='Python/pytime.c' line='448' 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='448' column='1'/> - <return type-id='type-id-28'/> + <return type-id='type-id-34'/> </function-decl> <function-decl name='_PyTime_FromLong' mangled-name='_PyTime_FromLong' filepath='Python/pytime.c' line='473' 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='473' column='1'/> + <parameter type-id='type-id-180' name='tp' filepath='Python/pytime.c' line='473' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/pytime.c' line='473' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_FromSecondsObject' mangled-name='_PyTime_FromSecondsObject' filepath='Python/pytime.c' line='626' 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='626' column='1'/> + <parameter type-id='type-id-180' name='tp' filepath='Python/pytime.c' line='626' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/pytime.c' line='626' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='626' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='626' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_FromMillisecondsObject' mangled-name='_PyTime_FromMillisecondsObject' filepath='Python/pytime.c' line='633' 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='633' column='1'/> + <parameter type-id='type-id-180' name='tp' filepath='Python/pytime.c' line='633' column='1'/> <parameter type-id='type-id-6' name='obj' filepath='Python/pytime.c' line='633' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='633' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='633' column='1'/> <return type-id='type-id-5'/> </function-decl> - <function-decl name='PyTime_AsSecondsDouble' mangled-name='PyTime_AsSecondsDouble' filepath='Python/pytime.c' line='640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_AsSecondsDouble'> - <parameter type-id='type-id-28' name='ns' filepath='Python/pytime.c' line='640' column='1'/> - <return type-id='type-id-172'/> - </function-decl> <function-decl name='_PyTime_AsLong' mangled-name='_PyTime_AsLong' filepath='Python/pytime.c' line='660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsLong'> - <parameter type-id='type-id-28' name='ns' filepath='Python/pytime.c' line='660' column='1'/> + <parameter type-id='type-id-34' name='ns' filepath='Python/pytime.c' line='660' column='1'/> <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyTime_AsMilliseconds' mangled-name='_PyTime_AsMilliseconds' filepath='Python/pytime.c' line='786' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsMilliseconds'> - <parameter type-id='type-id-28' name='ns' filepath='Python/pytime.c' line='786' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='786' column='1'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34' name='ns' filepath='Python/pytime.c' line='786' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='786' column='1'/> + <return type-id='type-id-34'/> </function-decl> <function-decl name='_PyTime_AsTimeval' mangled-name='_PyTime_AsTimeval' filepath='Python/pytime.c' line='834' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimeval'> - <parameter type-id='type-id-28' name='t' filepath='Python/pytime.c' line='834' column='1'/> + <parameter type-id='type-id-34' name='t' filepath='Python/pytime.c' line='834' column='1'/> <parameter type-id='type-id-221' name='tv' filepath='Python/pytime.c' line='834' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='834' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='834' 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='841' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimeval_clamp'> - <parameter type-id='type-id-28' name='t' filepath='Python/pytime.c' line='841' column='1'/> + <parameter type-id='type-id-34' name='t' filepath='Python/pytime.c' line='841' column='1'/> <parameter type-id='type-id-221' name='tv' filepath='Python/pytime.c' line='841' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='841' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='841' 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='848' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimevalTime_t'> - <parameter type-id='type-id-28' name='t' filepath='Python/pytime.c' line='848' column='1'/> + <parameter type-id='type-id-34' name='t' filepath='Python/pytime.c' line='848' column='1'/> <parameter type-id='type-id-223' name='p_secs' filepath='Python/pytime.c' line='848' column='1'/> - <parameter type-id='type-id-177' name='us' filepath='Python/pytime.c' line='848' column='1'/> - <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='849' column='1'/> + <parameter type-id='type-id-183' name='us' filepath='Python/pytime.c' line='848' column='1'/> + <parameter type-id='type-id-179' name='round' filepath='Python/pytime.c' line='849' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_AsTimespec' mangled-name='_PyTime_AsTimespec' filepath='Python/pytime.c' line='892' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimespec'> - <parameter type-id='type-id-28' name='t' filepath='Python/pytime.c' line='892' column='1'/> - <parameter type-id='type-id-179' name='ts' filepath='Python/pytime.c' line='892' column='1'/> + <parameter type-id='type-id-34' name='t' filepath='Python/pytime.c' line='892' column='1'/> + <parameter type-id='type-id-185' name='ts' filepath='Python/pytime.c' line='892' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyTime_Time' mangled-name='PyTime_Time' filepath='Python/pytime.c' line='1009' 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='1009' column='1'/> + <parameter type-id='type-id-180' name='result' filepath='Python/pytime.c' line='1009' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyTime_TimeRaw' mangled-name='PyTime_TimeRaw' filepath='Python/pytime.c' line='1020' 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='1020' column='1'/> + <parameter type-id='type-id-180' name='result' filepath='Python/pytime.c' line='1020' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyTime_Monotonic' mangled-name='PyTime_Monotonic' filepath='Python/pytime.c' line='1223' 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='1223' column='1'/> + <parameter type-id='type-id-180' name='result' filepath='Python/pytime.c' line='1223' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_MonotonicWithInfo' mangled-name='_PyTime_MonotonicWithInfo' filepath='Python/pytime.c' line='1245' 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='1245' column='1'/> + <parameter type-id='type-id-180' name='tp' filepath='Python/pytime.c' line='1245' column='1'/> <parameter type-id='type-id-222' name='info' filepath='Python/pytime.c' line='1245' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyTime_PerfCounter' mangled-name='PyTime_PerfCounter' filepath='Python/pytime.c' line='1259' 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='1259' column='1'/> + <parameter type-id='type-id-180' name='result' filepath='Python/pytime.c' line='1259' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTime_localtime' mangled-name='_PyTime_localtime' filepath='Python/pytime.c' line='1273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_localtime'> @@ -31094,167 +31173,167 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyDeadline_Init' mangled-name='_PyDeadline_Init' filepath='Python/pytime.c' line='1340' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDeadline_Init'> - <parameter type-id='type-id-28' name='timeout' filepath='Python/pytime.c' line='1340' column='1'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34' name='timeout' filepath='Python/pytime.c' line='1340' column='1'/> + <return type-id='type-id-34'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/remote_debugging.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> <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-1835'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='iov_base' type-id='type-id-35' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='28' column='1'/> + <var-decl name='iov_base' type-id='type-id-41' 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'/> + <var-decl name='iov_len' type-id='type-id-14' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='29' column='1'/> </data-member> </class-decl> - <typedef-decl name='pid_t' type-id='type-id-178' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='97' column='1' id='type-id-85'/> + <typedef-decl name='pid_t' type-id='type-id-184' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='97' column='1' id='type-id-91'/> <qualified-type-def type-id='type-id-1835' const='yes' id='type-id-1836'/> - <pointer-type-def type-id='type-id-1836' size-in-bits='64' id='type-id-189'/> + <pointer-type-def type-id='type-id-1836' size-in-bits='64' id='type-id-193'/> <function-decl name='getpagesize' filepath='/usr/include/unistd.h' line='1011' column='1' visibility='default' binding='global' size-in-bits='64'> <return type-id='type-id-5'/> </function-decl> <function-decl name='process_vm_readv' filepath='/usr/include/x86_64-linux-gnu/bits/uio-ext.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-85'/> - <parameter type-id='type-id-189'/> + <parameter type-id='type-id-91'/> + <parameter type-id='type-id-193'/> <parameter type-id='type-id-2'/> - <parameter type-id='type-id-189'/> + <parameter type-id='type-id-193'/> <parameter type-id='type-id-2'/> <parameter type-id='type-id-2'/> - <return type-id='type-id-185'/> + <return type-id='type-id-189'/> </function-decl> <function-decl name='process_vm_writev' filepath='/usr/include/x86_64-linux-gnu/bits/uio-ext.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-85'/> - <parameter type-id='type-id-189'/> + <parameter type-id='type-id-91'/> + <parameter type-id='type-id-193'/> <parameter type-id='type-id-2'/> - <parameter type-id='type-id-189'/> + <parameter type-id='type-id-193'/> <parameter type-id='type-id-2'/> <parameter type-id='type-id-2'/> - <return type-id='type-id-185'/> + <return type-id='type-id-189'/> </function-decl> </abi-instr> <abi-instr address-size='64' path='Python/specialize.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_PyCode8' size-in-bits='1728' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1' id='type-id-1837'> + <class-decl name='_PyCode8' size-in-bits='1728' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1' id='type-id-1837'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='ob_base' type-id='type-id-254' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='co_consts' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_consts' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='co_names' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_names' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='co_exceptiontable' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_exceptiontable' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_flags' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_argcount' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_posonlyargcount' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_kwonlyargcount' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_stacksize' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_firstlineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_nlocalsplus' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_framesize' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_nlocals' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_ncellvars' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' 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/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_nfreevars' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='co_version' type-id='type-id-322' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_version' type-id='type-id-324' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='co_localsplusnames' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_localsplusnames' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='co_localspluskinds' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_localspluskinds' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='co_filename' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_filename' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='co_name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='co_qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='co_linetable' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_linetable' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='co_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_weakreflist' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='co_executors' type-id='type-id-367' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_executors' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_co_cached' type-id='type-id-368' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='_co_cached' type-id='type-id-370' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_co_instrumentation_version' type-id='type-id-369' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='_co_instrumentation_version' type-id='type-id-371' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_co_monitoring' type-id='type-id-370' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='_co_monitoring' type-id='type-id-372' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='_co_unique_id' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='_co_unique_id' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_co_firsttraceable' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='_co_firsttraceable' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='co_extra' type-id='type-id-35' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_extra' type-id='type-id-41' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='co_code_adaptive' type-id='type-id-864' visibility='default' filepath='./Include/internal/pycore_code.h' line='520' column='1'/> + <var-decl name='co_code_adaptive' type-id='type-id-866' visibility='default' filepath='./Include/internal/pycore_code.h' line='527' column='1'/> </data-member> </class-decl> - <typedef-decl name='_py_validate_type' type-id='type-id-1027' filepath='./Include/internal/pycore_typeobject.h' line='144' column='1' id='type-id-1838'/> + <typedef-decl name='_py_validate_type' type-id='type-id-1029' filepath='./Include/internal/pycore_typeobject.h' line='144' column='1' id='type-id-1838'/> <qualified-type-def type-id='type-id-1837' const='yes' id='type-id-1839'/> - <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-1840'/> - <var-decl name='_Py_InitCleanup' type-id='type-id-1839' mangled-name='_Py_InitCleanup' visibility='default' filepath='./Include/internal/pycore_code.h' line='522' column='1' elf-symbol-id='_Py_InitCleanup'/> - <function-decl name='_PyDict_GetKeysVersionForCurrentState' filepath='./Include/internal/pycore_dict.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-33'/> - <parameter type-id='type-id-394'/> - <return type-id='type-id-322'/> + <pointer-type-def type-id='type-id-111' size-in-bits='64' id='type-id-1840'/> + <var-decl name='_Py_InitCleanup' type-id='type-id-1839' mangled-name='_Py_InitCleanup' visibility='default' filepath='./Include/internal/pycore_code.h' line='529' column='1' elf-symbol-id='_Py_InitCleanup'/> + <function-decl name='_PyDict_GetKeysVersionForCurrentState' filepath='./Include/internal/pycore_dict.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-39'/> + <parameter type-id='type-id-396'/> + <return type-id='type-id-324'/> </function-decl> - <function-decl name='_PyDict_LookupIndex' filepath='./Include/internal/pycore_dict.h' line='116' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-394'/> + <function-decl name='_PyDict_LookupIndex' filepath='./Include/internal/pycore_dict.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-396'/> <parameter type-id='type-id-6'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyDictKeys_StringLookup' filepath='./Include/internal/pycore_dict.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-391'/> + <function-decl name='_PyDictKeys_StringLookup' filepath='./Include/internal/pycore_dict.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-393'/> <parameter type-id='type-id-6'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyDictKeys_StringLookupAndVersion' filepath='./Include/internal/pycore_dict.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-391'/> + <function-decl name='_PyDictKeys_StringLookupAndVersion' filepath='./Include/internal/pycore_dict.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-393'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-459'/> + <parameter type-id='type-id-461'/> <return type-id='type-id-7'/> </function-decl> - <function-decl name='_PyDictKeys_StringLookupSplit' filepath='./Include/internal/pycore_dict.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-391'/> + <function-decl name='_PyDictKeys_StringLookupSplit' filepath='./Include/internal/pycore_dict.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-393'/> <parameter type-id='type-id-6'/> <return type-id='type-id-7'/> </function-decl> @@ -31265,9 +31344,9 @@ <return type-id='type-id-6'/> </function-decl> <function-decl name='_PyType_CacheInitForSpecialization' filepath='./Include/internal/pycore_object.h' line='908' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-599'/> + <parameter type-id='type-id-601'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-105'/> + <parameter type-id='type-id-111'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_Py_slot_tp_getattro' filepath='./Include/internal/pycore_typeobject.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64'> @@ -31287,9 +31366,9 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyType_CacheGetItemForSpecialization' filepath='./Include/internal/pycore_typeobject.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-599'/> + <parameter type-id='type-id-601'/> <parameter type-id='type-id-6'/> - <parameter type-id='type-id-322'/> + <parameter type-id='type-id-324'/> <return type-id='type-id-5'/> </function-decl> </abi-instr> @@ -31305,80 +31384,80 @@ <var-decl name='PySTEntry_Type' type-id='type-id-271' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='136' column='1'/> </abi-instr> <abi-instr address-size='64' path='Python/thread.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='PyThread_handle_t' type-id='type-id-443' filepath='./Include/internal/pycore_pythread.h' line='120' column='1' id='type-id-1841'/> + <typedef-decl name='PyThread_handle_t' type-id='type-id-445' filepath='./Include/internal/pycore_pythread.h' line='120' column='1' id='type-id-1841'/> <pointer-type-def type-id='type-id-1841' size-in-bits='64' id='type-id-1842'/> - <pointer-type-def type-id='type-id-1724' size-in-bits='64' id='type-id-1843'/> - <qualified-type-def type-id='type-id-463' const='yes' id='type-id-1844'/> - <qualified-type-def type-id='type-id-1329' const='yes' id='type-id-1845'/> + <pointer-type-def type-id='type-id-1725' size-in-bits='64' id='type-id-1843'/> + <qualified-type-def type-id='type-id-465' const='yes' id='type-id-1844'/> + <qualified-type-def type-id='type-id-1330' const='yes' id='type-id-1845'/> <pointer-type-def type-id='type-id-1845' size-in-bits='64' id='type-id-1846'/> <qualified-type-def type-id='type-id-1846' restrict='yes' id='type-id-1847'/> - <pointer-type-def type-id='type-id-463' size-in-bits='64' id='type-id-1848'/> - <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-1849'/> + <pointer-type-def type-id='type-id-465' size-in-bits='64' id='type-id-1848'/> + <pointer-type-def type-id='type-id-38' size-in-bits='64' id='type-id-1849'/> <qualified-type-def type-id='type-id-1849' restrict='yes' id='type-id-1850'/> <pointer-type-def type-id='type-id-1851' size-in-bits='64' id='type-id-1852'/> <var-decl name='PY_TIMEOUT_MAX' type-id='type-id-1844' 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='148' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-28'/> - <return type-id='type-id-28'/> + <parameter type-id='type-id-34'/> + <return type-id='type-id-34'/> </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-1850'/> - <parameter type-id='type-id-1589'/> + <parameter type-id='type-id-1590'/> <parameter type-id='type-id-1852'/> <parameter type-id='type-id-231'/> <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-35'/> + <parameter type-id='type-id-41'/> <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-32'/> + <parameter type-id='type-id-38'/> <parameter type-id='type-id-267'/> <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-32'/> + <parameter type-id='type-id-38'/> <return type-id='type-id-5'/> </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-1590'/> + <parameter type-id='type-id-1591'/> <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-1590'/> + <parameter type-id='type-id-1591'/> <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-1590'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-1591'/> + <parameter type-id='type-id-14'/> <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-1599'/> + <parameter type-id='type-id-1600'/> <parameter type-id='type-id-1847'/> <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-1328'/> + <parameter type-id='type-id-1329'/> <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-1328'/> - <parameter type-id='type-id-188'/> + <parameter type-id='type-id-1329'/> + <parameter type-id='type-id-192'/> <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-569'/> + <parameter type-id='type-id-571'/> <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-569'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-571'/> + <return type-id='type-id-41'/> </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-1792'/> + <parameter type-id='type-id-1793'/> <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'> @@ -31390,19 +31469,19 @@ </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'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> + <return type-id='type-id-14'/> </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-184'/> + <return type-id='type-id-188'/> </function-decl> <function-decl name='PyThread_get_stacksize' mangled-name='PyThread_get_stacksize' filepath='Python/thread.c' line='76' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_stacksize'> - <return type-id='type-id-21'/> + <return type-id='type-id-14'/> </function-decl> <function-decl name='PyThread_set_stacksize' mangled-name='PyThread_set_stacksize' filepath='Python/thread.c' line='87' 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='87' column='1'/> + <parameter type-id='type-id-14' name='size' filepath='Python/thread.c' line='87' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyThread_ParseTimeoutArg' mangled-name='PyThread_ParseTimeoutArg' filepath='Python/thread.c' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_ParseTimeoutArg'> @@ -31413,26 +31492,26 @@ </function-decl> <function-decl name='PyThread_acquire_lock_timed_with_retries' mangled-name='PyThread_acquire_lock_timed_with_retries' filepath='Python/thread.c' line='132' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock_timed_with_retries'> <parameter type-id='type-id-243' name='lock' filepath='Python/thread.c' line='132' column='1'/> - <parameter type-id='type-id-463' name='timeout' filepath='Python/thread.c' line='133' column='1'/> - <return type-id='type-id-30'/> + <parameter type-id='type-id-465' name='timeout' filepath='Python/thread.c' line='133' column='1'/> + <return type-id='type-id-36'/> </function-decl> <function-decl name='PyThread_tss_alloc' mangled-name='PyThread_tss_alloc' filepath='Python/thread.c' line='186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_alloc'> - <return type-id='type-id-1825'/> + <return type-id='type-id-1826'/> </function-decl> <function-decl name='PyThread_tss_free' mangled-name='PyThread_tss_free' filepath='Python/thread.c' line='197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_free'> - <parameter type-id='type-id-1825' name='key' filepath='Python/thread.c' line='197' column='1'/> + <parameter type-id='type-id-1826' name='key' filepath='Python/thread.c' line='197' 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='328' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_start_joinable_thread'> - <parameter type-id='type-id-572' name='func' filepath='Python/thread_pthread.h' line='328' column='1'/> - <parameter type-id='type-id-35' name='arg' filepath='Python/thread_pthread.h' line='328' column='1'/> + <parameter type-id='type-id-574' name='func' filepath='Python/thread_pthread.h' line='328' column='1'/> + <parameter type-id='type-id-41' name='arg' filepath='Python/thread_pthread.h' line='328' column='1'/> <parameter type-id='type-id-1843' name='ident' filepath='Python/thread_pthread.h' line='329' column='1'/> <parameter type-id='type-id-1842' name='handle' filepath='Python/thread_pthread.h' line='329' 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='341' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_start_new_thread'> - <parameter type-id='type-id-572' name='func' filepath='Python/thread_pthread.h' line='341' column='1'/> - <parameter type-id='type-id-35' name='arg' filepath='Python/thread_pthread.h' line='341' column='1'/> + <parameter type-id='type-id-574' name='func' filepath='Python/thread_pthread.h' line='341' column='1'/> + <parameter type-id='type-id-41' name='arg' filepath='Python/thread_pthread.h' line='341' 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='352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_join_thread'> @@ -31448,9 +31527,9 @@ </function-decl> <function-decl name='PyThread_acquire_lock_timed' mangled-name='PyThread_acquire_lock_timed' filepath='Python/thread_pthread.h' line='505' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock_timed'> <parameter type-id='type-id-243' name='lock' filepath='Python/thread_pthread.h' line='505' column='1'/> - <parameter type-id='type-id-463' name='microseconds' filepath='Python/thread_pthread.h' line='505' column='1'/> + <parameter type-id='type-id-465' name='microseconds' filepath='Python/thread_pthread.h' line='505' column='1'/> <parameter type-id='type-id-5' name='intr_flag' filepath='Python/thread_pthread.h' line='506' column='1'/> - <return type-id='type-id-30'/> + <return type-id='type-id-36'/> </function-decl> <function-decl name='PyThread_create_key' mangled-name='PyThread_create_key' filepath='Python/thread_pthread.h' line='890' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_create_key'> <return type-id='type-id-5'/> @@ -31465,19 +31544,19 @@ </function-decl> <function-decl name='PyThread_set_key_value' mangled-name='PyThread_set_key_value' filepath='Python/thread_pthread.h' line='926' 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='926' column='1'/> - <parameter type-id='type-id-35' name='value' filepath='Python/thread_pthread.h' line='926' column='1'/> + <parameter type-id='type-id-41' name='value' filepath='Python/thread_pthread.h' line='926' 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='937' 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='937' column='1'/> - <return type-id='type-id-35'/> + <return type-id='type-id-41'/> </function-decl> <function-decl name='PyThread_ReInitTLS' mangled-name='PyThread_ReInitTLS' filepath='Python/thread_pthread.h' line='948' 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-1851'> - <parameter type-id='type-id-35'/> - <return type-id='type-id-35'/> + <parameter type-id='type-id-41'/> + <return type-id='type-id-41'/> </function-type> </abi-instr> <abi-instr address-size='64' path='Python/traceback.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> @@ -31486,31 +31565,36 @@ <var-decl name='dli_fname' type-id='type-id-4' visibility='default' filepath='/usr/include/dlfcn.h' line='92' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dli_fbase' type-id='type-id-35' visibility='default' filepath='/usr/include/dlfcn.h' line='93' column='1'/> + <var-decl name='dli_fbase' type-id='type-id-41' visibility='default' filepath='/usr/include/dlfcn.h' line='93' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='dli_sname' type-id='type-id-4' visibility='default' filepath='/usr/include/dlfcn.h' line='94' column='1'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='dli_saddr' type-id='type-id-35' visibility='default' filepath='/usr/include/dlfcn.h' line='95' column='1'/> + <var-decl name='dli_saddr' type-id='type-id-41' visibility='default' filepath='/usr/include/dlfcn.h' line='95' column='1'/> </data-member> </class-decl> <typedef-decl name='Dl_info' type-id='type-id-1854' filepath='/usr/include/dlfcn.h' line='96' column='1' id='type-id-1853'/> - <pointer-type-def type-id='type-id-1853' size-in-bits='64' id='type-id-67'/> + <pointer-type-def type-id='type-id-1853' size-in-bits='64' id='type-id-73'/> <function-decl name='_PyObject_CallMethodFormat' filepath='./Include/internal/pycore_call.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-31'/> + <parameter type-id='type-id-37'/> <parameter type-id='type-id-6'/> <parameter type-id='type-id-4'/> <parameter is-variadic='yes'/> <return type-id='type-id-6'/> </function-decl> + <function-decl name='_PyCode_SafeAddr2Line' filepath='./Include/internal/pycore_code.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-347'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> <function-decl name='_PyGILState_GetInterpreterStateUnsafe' filepath='./Include/internal/pycore_pystate.h' line='286' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-33'/> + <return type-id='type-id-39'/> </function-decl> <var-decl name='PyTraceBack_Type' type-id='type-id-271' mangled-name='PyTraceBack_Type' visibility='default' filepath='./Include/traceback.h' line='13' column='1' elf-symbol-id='PyTraceBack_Type'/> <function-decl name='dladdr1' filepath='/usr/include/dlfcn.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-67'/> + <parameter type-id='type-id-41'/> + <parameter type-id='type-id-73'/> <parameter type-id='type-id-267'/> <parameter type-id='type-id-5'/> <return type-id='type-id-5'/> @@ -31521,9 +31605,9 @@ <return type-id='type-id-5'/> </function-decl> <function-decl name='pthread_getname_np' filepath='/usr/include/pthread.h' line='458' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-32'/> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-21'/> + <parameter type-id='type-id-38'/> + <parameter type-id='type-id-24'/> + <parameter type-id='type-id-14'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTraceback_Add' mangled-name='_PyTraceback_Add' filepath='Python/traceback.c' line='333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceback_Add'> @@ -31532,26 +31616,29 @@ <parameter type-id='type-id-5' name='lineno' filepath='Python/traceback.c' line='333' column='1'/> <return type-id='type-id-3'/> </function-decl> - <function-decl name='_Py_DumpStack' mangled-name='_Py_DumpStack' filepath='Python/traceback.c' line='1303' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpStack'> - <parameter type-id='type-id-5' name='fd' filepath='Python/traceback.c' line='1303' column='1'/> + <function-decl name='_Py_DumpStack' mangled-name='_Py_DumpStack' filepath='Python/traceback.c' line='1317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpStack'> + <parameter type-id='type-id-5' name='fd' filepath='Python/traceback.c' line='1317' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_InitDumpStack' mangled-name='_Py_InitDumpStack' filepath='Python/traceback.c' line='1346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_InitDumpStack'> <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='1197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceMalloc_Track'> - <parameter type-id='type-id-105' name='domain' filepath='Python/tracemalloc.c' line='1197' column='1'/> - <parameter type-id='type-id-369' name='ptr' filepath='Python/tracemalloc.c' line='1197' column='1'/> - <parameter type-id='type-id-21' name='size' filepath='Python/tracemalloc.c' line='1198' column='1'/> + <parameter type-id='type-id-111' name='domain' filepath='Python/tracemalloc.c' line='1197' column='1'/> + <parameter type-id='type-id-371' name='ptr' filepath='Python/tracemalloc.c' line='1197' column='1'/> + <parameter type-id='type-id-14' name='size' filepath='Python/tracemalloc.c' line='1198' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='PyTraceMalloc_Untrack' mangled-name='PyTraceMalloc_Untrack' filepath='Python/tracemalloc.c' line='1219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceMalloc_Untrack'> - <parameter type-id='type-id-105' name='domain' filepath='Python/tracemalloc.c' line='1219' column='1'/> - <parameter type-id='type-id-369' name='ptr' filepath='Python/tracemalloc.c' line='1219' column='1'/> + <parameter type-id='type-id-111' name='domain' filepath='Python/tracemalloc.c' line='1219' column='1'/> + <parameter type-id='type-id-371' name='ptr' filepath='Python/tracemalloc.c' line='1219' column='1'/> <return type-id='type-id-5'/> </function-decl> <function-decl name='_PyTraceMalloc_GetTraceback' mangled-name='_PyTraceMalloc_GetTraceback' filepath='Python/tracemalloc.c' line='1290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetTraceback'> - <parameter type-id='type-id-105' name='domain' filepath='Python/tracemalloc.c' line='1290' column='1'/> - <parameter type-id='type-id-369' name='ptr' filepath='Python/tracemalloc.c' line='1290' column='1'/> + <parameter type-id='type-id-111' name='domain' filepath='Python/tracemalloc.c' line='1290' column='1'/> + <parameter type-id='type-id-371' name='ptr' filepath='Python/tracemalloc.c' line='1290' column='1'/> <return type-id='type-id-6'/> </function-decl> </abi-instr> diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst index bc4e34fa338b3d..67159b1599bef5 100644 --- a/Doc/whatsnew/3.14.rst +++ b/Doc/whatsnew/3.14.rst @@ -3435,3 +3435,13 @@ Changes in the C API functions on Python 3.13 and older. .. _pythoncapi-compat project: https://github.com/python/pythoncapi-compat/ + + +Notable changes in 3.14.1 +========================= + +* Add :c:func:`PyUnstable_ThreadState_SetStackProtection` and + :c:func:`PyUnstable_ThreadState_ResetStackProtection` functions to set + the stack protection base address and stack protection size of a Python + thread state. + (Contributed by Victor Stinner in :gh:`139653`.) diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index e7d80f2694baf2..f428396411c5e5 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -243,6 +243,18 @@ PyAPI_FUNC(int) PyGILState_Check(void); */ PyAPI_FUNC(PyObject*) _PyThread_CurrentFrames(void); +// Set the stack protection start address and stack protection size +// of a Python thread state +PyAPI_FUNC(int) PyUnstable_ThreadState_SetStackProtection( + PyThreadState *tstate, + void *stack_start_addr, // Stack start address + size_t stack_size); // Stack size (in bytes) + +// Reset the stack protection start address and stack protection size +// of a Python thread state +PyAPI_FUNC(void) PyUnstable_ThreadState_ResetStackProtection( + PyThreadState *tstate); + /* Routines for advanced debuggers, requested by David Beazley. Don't use unless you know what you are doing! */ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void); diff --git a/Include/internal/pycore_pythonrun.h b/Include/internal/pycore_pythonrun.h index c2832098ddb3e7..b232429c4d09c3 100644 --- a/Include/internal/pycore_pythonrun.h +++ b/Include/internal/pycore_pythonrun.h @@ -54,6 +54,12 @@ extern const char* _Py_SourceAsString( # define _PyOS_STACK_MARGIN_SHIFT (_PyOS_LOG2_STACK_MARGIN + 2) #endif +#ifdef _Py_THREAD_SANITIZER +# define _PyOS_MIN_STACK_SIZE (_PyOS_STACK_MARGIN_BYTES * 6) +#else +# define _PyOS_MIN_STACK_SIZE (_PyOS_STACK_MARGIN_BYTES * 3) +#endif + #ifdef __cplusplus } diff --git a/Include/internal/pycore_tstate.h b/Include/internal/pycore_tstate.h index bad968428c73a1..c3ac52bd76613e 100644 --- a/Include/internal/pycore_tstate.h +++ b/Include/internal/pycore_tstate.h @@ -76,6 +76,10 @@ typedef struct _PyThreadStateImpl { Py_ssize_t reftotal; // this thread's total refcount operations #endif + // PyUnstable_ThreadState_ResetStackProtection() values + uintptr_t c_stack_init_base; + uintptr_t c_stack_init_top; + } _PyThreadStateImpl; #ifdef __cplusplus diff --git a/Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst b/Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst new file mode 100644 index 00000000000000..cd3d5262fa0f3a --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst @@ -0,0 +1,4 @@ +Add :c:func:`PyUnstable_ThreadState_SetStackProtection` and +:c:func:`PyUnstable_ThreadState_ResetStackProtection` functions to set the +stack protection base address and stack protection size of a Python thread +state. Patch by Victor Stinner. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 5d877b5655b89c..ce11a81211e7e6 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -2408,6 +2408,58 @@ set_vectorcall_nop(PyObject *self, PyObject *func) Py_RETURN_NONE; } + +static void +check_threadstate_set_stack_protection(PyThreadState *tstate, + void *start, size_t size) +{ + assert(PyUnstable_ThreadState_SetStackProtection(tstate, start, size) == 0); + assert(!PyErr_Occurred()); + + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)tstate; + assert(ts->c_stack_top == (uintptr_t)start + size); + assert(ts->c_stack_hard_limit <= ts->c_stack_soft_limit); + assert(ts->c_stack_soft_limit < ts->c_stack_top); +} + + +static PyObject * +test_threadstate_set_stack_protection(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyThreadState *tstate = PyThreadState_GET(); + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)tstate; + assert(!PyErr_Occurred()); + + uintptr_t init_base = ts->c_stack_init_base; + size_t init_top = ts->c_stack_init_top; + + // Test the minimum stack size + size_t size = _PyOS_MIN_STACK_SIZE; + void *start = (void*)(_Py_get_machine_stack_pointer() - size); + check_threadstate_set_stack_protection(tstate, start, size); + + // Test a larger size + size = 7654321; + assert(size > _PyOS_MIN_STACK_SIZE); + start = (void*)(_Py_get_machine_stack_pointer() - size); + check_threadstate_set_stack_protection(tstate, start, size); + + // Test invalid size (too small) + size = 5; + start = (void*)(_Py_get_machine_stack_pointer() - size); + assert(PyUnstable_ThreadState_SetStackProtection(tstate, start, size) == -1); + assert(PyErr_ExceptionMatches(PyExc_ValueError)); + PyErr_Clear(); + + // Test PyUnstable_ThreadState_ResetStackProtection() + PyUnstable_ThreadState_ResetStackProtection(tstate); + assert(ts->c_stack_init_base == init_base); + assert(ts->c_stack_init_top == init_top); + + Py_RETURN_NONE; +} + + static PyMethodDef module_functions[] = { {"get_configs", get_configs, METH_NOARGS}, {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, @@ -2516,6 +2568,8 @@ static PyMethodDef module_functions[] = { {"emscripten_set_up_async_input_device", emscripten_set_up_async_input_device, METH_NOARGS}, #endif {"set_vectorcall_nop", set_vectorcall_nop, METH_O}, + {"test_threadstate_set_stack_protection", + test_threadstate_set_stack_protection, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/ceval.c b/Python/ceval.c index d37a98df418322..306ca0818bbf8d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -436,24 +436,26 @@ int pthread_attr_destroy(pthread_attr_t *a) #endif - -void -_Py_InitializeRecursionLimits(PyThreadState *tstate) +static void +hardware_stack_limits(uintptr_t *base, uintptr_t *top) { - _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; #ifdef WIN32 ULONG_PTR low, high; GetCurrentThreadStackLimits(&low, &high); - _tstate->c_stack_top = (uintptr_t)high; + *top = (uintptr_t)high; ULONG guarantee = 0; SetThreadStackGuarantee(&guarantee); - _tstate->c_stack_hard_limit = ((uintptr_t)low) + guarantee + _PyOS_STACK_MARGIN_BYTES; - _tstate->c_stack_soft_limit = _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES; + *base = (uintptr_t)low + guarantee; +#elif defined(__APPLE__) + pthread_t this_thread = pthread_self(); + void *stack_addr = pthread_get_stackaddr_np(this_thread); // top of the stack + size_t stack_size = pthread_get_stacksize_np(this_thread); + *top = (uintptr_t)stack_addr; + *base = ((uintptr_t)stack_addr) - stack_size; #else - uintptr_t here_addr = _Py_get_machine_stack_pointer(); -/// XXX musl supports HAVE_PTHRED_GETATTR_NP, but the resulting stack size -/// (on alpine at least) is much smaller than expected and imposes undue limits -/// compared to the old stack size estimation. (We assume musl is not glibc.) + /// XXX musl supports HAVE_PTHRED_GETATTR_NP, but the resulting stack size + /// (on alpine at least) is much smaller than expected and imposes undue limits + /// compared to the old stack size estimation. (We assume musl is not glibc.) # if defined(HAVE_PTHREAD_GETATTR_NP) && !defined(_AIX) && \ !defined(__NetBSD__) && (defined(__GLIBC__) || !defined(__linux__)) size_t stack_size, guard_size; @@ -466,38 +468,106 @@ _Py_InitializeRecursionLimits(PyThreadState *tstate) err |= pthread_attr_destroy(&attr); } if (err == 0) { - uintptr_t base = ((uintptr_t)stack_addr) + guard_size; - uintptr_t top = base + stack_size; -# ifdef _Py_THREAD_SANITIZER - // Thread sanitizer crashes if we use a bit more than half the stack. -# if _Py_STACK_GROWS_DOWN - base += stack_size / 2; -# else - top -= stack_size / 2; -# endif -# endif -# if _Py_STACK_GROWS_DOWN - _tstate->c_stack_top = top; - _tstate->c_stack_hard_limit = base + _PyOS_STACK_MARGIN_BYTES; - _tstate->c_stack_soft_limit = base + _PyOS_STACK_MARGIN_BYTES * 2; - assert(_tstate->c_stack_soft_limit < here_addr); - assert(here_addr < _tstate->c_stack_top); -# else - _tstate->c_stack_top = base; - _tstate->c_stack_hard_limit = top - _PyOS_STACK_MARGIN_BYTES; - _tstate->c_stack_soft_limit = top - _PyOS_STACK_MARGIN_BYTES * 2; - assert(here_addr > base); - assert(here_addr < _tstate->c_stack_soft_limit); -# endif + *base = ((uintptr_t)stack_addr) + guard_size; + *top = (uintptr_t)stack_addr + stack_size; return; } # endif - _tstate->c_stack_top = _Py_SIZE_ROUND_UP(here_addr, 4096); - _tstate->c_stack_soft_limit = _tstate->c_stack_top - Py_C_STACK_SIZE; - _tstate->c_stack_hard_limit = _tstate->c_stack_top - (Py_C_STACK_SIZE + _PyOS_STACK_MARGIN_BYTES); + uintptr_t here_addr = _Py_get_machine_stack_pointer(); + uintptr_t top_addr = _Py_SIZE_ROUND_UP(here_addr, 4096); + *top = top_addr; + *base = top_addr - Py_C_STACK_SIZE; +#endif +} + +static void +tstate_set_stack(PyThreadState *tstate, + uintptr_t base, uintptr_t top) +{ + assert(base < top); + assert((top - base) >= _PyOS_MIN_STACK_SIZE); + +#ifdef _Py_THREAD_SANITIZER + // Thread sanitizer crashes if we use more than half the stack. + uintptr_t stacksize = top - base; +# if _Py_STACK_GROWS_DOWN + base += stacksize / 2; +# else + top -= stacksize / 2; +# endif +#endif + _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; +#if _Py_STACK_GROWS_DOWN + _tstate->c_stack_top = top; + _tstate->c_stack_hard_limit = base + _PyOS_STACK_MARGIN_BYTES; + _tstate->c_stack_soft_limit = base + _PyOS_STACK_MARGIN_BYTES * 2; +# ifndef NDEBUG + // Sanity checks + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)tstate; + assert(ts->c_stack_hard_limit <= ts->c_stack_soft_limit); + assert(ts->c_stack_soft_limit < ts->c_stack_top); +# endif +#else + _tstate->c_stack_top = base; + _tstate->c_stack_hard_limit = top - _PyOS_STACK_MARGIN_BYTES; + _tstate->c_stack_soft_limit = top - _PyOS_STACK_MARGIN_BYTES * 2; +# ifndef NDEBUG + // Sanity checks + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)tstate; + assert(ts->c_stack_hard_limit >= ts->c_stack_soft_limit); + assert(ts->c_stack_soft_limit > ts->c_stack_top); +# endif #endif } + +void +_Py_InitializeRecursionLimits(PyThreadState *tstate) +{ + uintptr_t base, top; + hardware_stack_limits(&base, &top); + assert(top != 0); + + tstate_set_stack(tstate, base, top); + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)tstate; + ts->c_stack_init_base = base; + ts->c_stack_init_top = top; +} + + +int +PyUnstable_ThreadState_SetStackProtection(PyThreadState *tstate, + void *stack_start_addr, size_t stack_size) +{ + if (stack_size < _PyOS_MIN_STACK_SIZE) { + PyErr_Format(PyExc_ValueError, + "stack_size must be at least %zu bytes", + _PyOS_MIN_STACK_SIZE); + return -1; + } + + uintptr_t base = (uintptr_t)stack_start_addr; + uintptr_t top = base + stack_size; + tstate_set_stack(tstate, base, top); + return 0; +} + + +void +PyUnstable_ThreadState_ResetStackProtection(PyThreadState *tstate) +{ + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)tstate; + if (ts->c_stack_init_top != 0) { + tstate_set_stack(tstate, + ts->c_stack_init_base, + ts->c_stack_init_top); + return; + } + + _Py_InitializeRecursionLimits(tstate); +} + + /* The function _Py_EnterRecursiveCallTstate() only calls _Py_CheckRecursiveCall() if the recursion_depth reaches recursion_limit. */ int diff --git a/Python/pystate.c b/Python/pystate.c index 06f997fb5ad5be..6781920b9eec66 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1583,6 +1583,9 @@ init_threadstate(_PyThreadStateImpl *_tstate, _tstate->c_stack_top = 0; _tstate->c_stack_hard_limit = 0; + _tstate->c_stack_init_base = 0; + _tstate->c_stack_init_top = 0; + _tstate->asyncio_running_loop = NULL; _tstate->asyncio_running_task = NULL; From 630074b7cec52232257451f8c16f0eb952d78b6c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:51:02 +0100 Subject: [PATCH 1492/1674] [3.14] gh-141004: Document `PyOS_mystr(n)icmp` (GH-141760) (#141947) gh-141004: Document `PyOS_mystr(n)icmp` (GH-141760) (cherry picked from commit f445c452ea879e01b4144809a5fd8826ac98f305) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/c-api/conversion.rst | 29 +++++++++++++++++++++++------ Misc/NEWS.d/3.10.0a1.rst | 4 ++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index 533e5460da8952..977406eb4d4222 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -162,16 +162,33 @@ The following functions provide locale-independent string to number conversions. .. versionadded:: 3.1 -.. c:function:: int PyOS_stricmp(const char *s1, const char *s2) +.. c:function:: int PyOS_mystricmp(const char *str1, const char *str2) + int PyOS_mystrnicmp(const char *str1, const char *str2, Py_ssize_t size) - Case insensitive comparison of strings. The function works almost - identically to :c:func:`!strcmp` except that it ignores the case. + Case insensitive comparison of strings. These functions work almost + identically to :c:func:`!strcmp` and :c:func:`!strncmp` (respectively), + except that they ignore the case of ASCII characters. + Return ``0`` if the strings are equal, a negative value if *str1* sorts + lexicographically before *str2*, or a positive value if it sorts after. -.. c:function:: int PyOS_strnicmp(const char *s1, const char *s2, Py_ssize_t size) + In the *str1* or *str2* arguments, a NUL byte marks the end of the string. + For :c:func:`!PyOS_mystrnicmp`, the *size* argument gives the maximum size + of the string, as if NUL was present at the index given by *size*. - Case insensitive comparison of strings. The function works almost - identically to :c:func:`!strncmp` except that it ignores the case. + These functions do not use the locale. + + +.. c:function:: int PyOS_stricmp(const char *str1, const char *str2) + int PyOS_strnicmp(const char *str1, const char *str2, Py_ssize_t size) + + Case insensitive comparison of strings. + + On Windows, these are aliases of :c:func:`!stricmp` and :c:func:`!strnicmp`, + respectively. + + On other platforms, they are aliases of :c:func:`PyOS_mystricmp` and + :c:func:`PyOS_mystrnicmp`, respectively. Character classification and conversion diff --git a/Misc/NEWS.d/3.10.0a1.rst b/Misc/NEWS.d/3.10.0a1.rst index f09842f1e77dea..473e7c7ac0f574 100644 --- a/Misc/NEWS.d/3.10.0a1.rst +++ b/Misc/NEWS.d/3.10.0a1.rst @@ -3275,8 +3275,8 @@ Types created with :c:func:`PyType_FromSpec` now make any signature in their .. nonce: u6Xfr2 .. section: C API -Fix bug in PyOS_mystrnicmp and PyOS_mystricmp that incremented pointers -beyond the end of a string. +Fix bug in :c:func:`PyOS_mystrnicmp` and :c:func:`PyOS_mystricmp` that +incremented pointers beyond the end of a string. .. From 9969c4280f4d7c7876ee6d0c4309ab05f599d9dc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:56:05 +0100 Subject: [PATCH 1493/1674] [3.14] gh-140911: Ensure that UserString.index() and UserString.rindex() accept UserString as argument (GH-140945) (GH-141946) (cherry picked from commit e6174ee9812f514b42ab6d3a1064bd6057de96c7) Co-authored-by: Krishna Chaitanya <141550576+XChaitanyaX@users.noreply.github.com> --- Lib/collections/__init__.py | 4 + Lib/test/string_tests.py | 74 ++++++++++--------- ...-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst | 3 + 3 files changed, 48 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index d2ddc1cd9ec2ea..803de0c6792d64 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1495,6 +1495,8 @@ def format_map(self, mapping): return self.data.format_map(mapping) def index(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data return self.data.index(sub, start, end) def isalpha(self): @@ -1563,6 +1565,8 @@ def rfind(self, sub, start=0, end=_sys.maxsize): return self.data.rfind(sub, start, end) def rindex(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data return self.data.rindex(sub, start, end) def rjust(self, width, *args): diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 1814a55b74ea0c..185aa3fce39149 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -90,6 +90,18 @@ def checkcall(self, obj, methodname, *args): args = self.fixtype(args) getattr(obj, methodname)(*args) + def _get_teststrings(self, charset, digits): + base = len(charset) + teststrings = set() + for i in range(base ** digits): + entry = [] + for j in range(digits): + i, m = divmod(i, base) + entry.append(charset[m]) + teststrings.add(''.join(entry)) + teststrings = [self.fixtype(ts) for ts in teststrings] + return teststrings + def test_count(self): self.checkequal(3, 'aaa', 'count', 'a') self.checkequal(0, 'aaa', 'count', 'b') @@ -130,17 +142,7 @@ def test_count(self): # For a variety of combinations, # verify that str.count() matches an equivalent function # replacing all occurrences and then differencing the string lengths - charset = ['', 'a', 'b'] - digits = 7 - base = len(charset) - teststrings = set() - for i in range(base ** digits): - entry = [] - for j in range(digits): - i, m = divmod(i, base) - entry.append(charset[m]) - teststrings.add(''.join(entry)) - teststrings = [self.fixtype(ts) for ts in teststrings] + teststrings = self._get_teststrings(['', 'a', 'b'], 7) for i in teststrings: n = len(i) for j in teststrings: @@ -197,17 +199,7 @@ def test_find(self): # For a variety of combinations, # verify that str.find() matches __contains__ # and that the found substring is really at that location - charset = ['', 'a', 'b', 'c'] - digits = 5 - base = len(charset) - teststrings = set() - for i in range(base ** digits): - entry = [] - for j in range(digits): - i, m = divmod(i, base) - entry.append(charset[m]) - teststrings.add(''.join(entry)) - teststrings = [self.fixtype(ts) for ts in teststrings] + teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5) for i in teststrings: for j in teststrings: loc = i.find(j) @@ -244,17 +236,7 @@ def test_rfind(self): # For a variety of combinations, # verify that str.rfind() matches __contains__ # and that the found substring is really at that location - charset = ['', 'a', 'b', 'c'] - digits = 5 - base = len(charset) - teststrings = set() - for i in range(base ** digits): - entry = [] - for j in range(digits): - i, m = divmod(i, base) - entry.append(charset[m]) - teststrings.add(''.join(entry)) - teststrings = [self.fixtype(ts) for ts in teststrings] + teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5) for i in teststrings: for j in teststrings: loc = i.rfind(j) @@ -295,6 +277,19 @@ def test_index(self): else: self.checkraises(TypeError, 'hello', 'index', 42) + # For a variety of combinations, + # verify that str.index() matches __contains__ + # and that the found substring is really at that location + teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5) + for i in teststrings: + for j in teststrings: + if j in i: + loc = i.index(j) + self.assertGreaterEqual(loc, 0) + self.assertEqual(i[loc:loc+len(j)], j) + else: + self.assertRaises(ValueError, i.index, j) + def test_rindex(self): self.checkequal(12, 'abcdefghiabc', 'rindex', '') self.checkequal(3, 'abcdefghiabc', 'rindex', 'def') @@ -321,6 +316,19 @@ def test_rindex(self): else: self.checkraises(TypeError, 'hello', 'rindex', 42) + # For a variety of combinations, + # verify that str.rindex() matches __contains__ + # and that the found substring is really at that location + teststrings = self._get_teststrings(['', 'a', 'b', 'c'], 5) + for i in teststrings: + for j in teststrings: + if j in i: + loc = i.rindex(j) + self.assertGreaterEqual(loc, 0) + self.assertEqual(i[loc:loc+len(j)], j) + else: + self.assertRaises(ValueError, i.rindex, j) + def test_find_periodic_pattern(self): """Cover the special path for periodic patterns.""" def reference_find(p, s): diff --git a/Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst b/Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst new file mode 100644 index 00000000000000..b0b6e4611924c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst @@ -0,0 +1,3 @@ +:mod:`collections`: Ensure that the methods ``UserString.rindex()`` and +``UserString.index()`` accept :class:`collections.UserString` instances as the +sub argument. From 20a677d75a95fa63be904f7ca4f8cb268aec95c1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:58:44 +0100 Subject: [PATCH 1494/1674] [3.14] gh-141004: Document missing `PyThread*` APIs (GH-141810) (GH-141954) gh-141004: Document missing `PyThread*` APIs (GH-141810) (cherry picked from commit a89ee4b9c2a87d9bdf105883f834cda9d943d541) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/init.rst | 217 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 573dd05c812534..2226908688b014 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -2708,3 +2708,220 @@ code triggered by the finalizer blocks and calls :c:func:`PyEval_SaveThread`. In the default build, this macro expands to ``}``. .. versionadded:: 3.13 + + +Legacy Locking APIs +------------------- + +These APIs are obsolete since Python 3.13 with the introduction of +:c:type:`PyMutex`. + +.. versionchanged:: 3.15 + These APIs are now a simple wrapper around ``PyMutex``. + + +.. c:type:: PyThread_type_lock + + A pointer to a mutual exclusion lock. + + +.. c:type:: PyLockStatus + + The result of acquiring a lock with a timeout. + + .. c:namespace:: NULL + + .. c:enumerator:: PY_LOCK_FAILURE + + Failed to acquire the lock. + + .. c:enumerator:: PY_LOCK_ACQUIRED + + The lock was successfully acquired. + + .. c:enumerator:: PY_LOCK_INTR + + The lock was interrupted by a signal. + + +.. c:function:: PyThread_type_lock PyThread_allocate_lock(void) + + Allocate a new lock. + + On success, this function returns a lock; on failure, this + function returns ``0`` without an exception set. + + The caller does not need to hold an :term:`attached thread state`. + + .. versionchanged:: 3.15 + This function now always uses :c:type:`PyMutex`. In prior versions, this + would use a lock provided by the operating system. + + +.. c:function:: void PyThread_free_lock(PyThread_type_lock lock) + + Destroy *lock*. The lock should not be held by any thread when calling + this. + + The caller does not need to hold an :term:`attached thread state`. + + +.. c:function:: PyLockStatus PyThread_acquire_lock_timed(PyThread_type_lock lock, long long microseconds, int intr_flag) + + Acquire *lock* with a timeout. + + This will wait for *microseconds* microseconds to acquire the lock. If the + timeout expires, this function returns :c:enumerator:`PY_LOCK_FAILURE`. + If *microseconds* is ``-1``, this will wait indefinitely until the lock has + been released. + + If *intr_flag* is ``1``, acquiring the lock may be interrupted by a signal, + in which case this function returns :c:enumerator:`PY_LOCK_INTR`. Upon + interruption, it's generally expected that the caller makes a call to + :c:func:`Py_MakePendingCalls` to propagate an exception to Python code. + + If the lock is successfully acquired, this function returns + :c:enumerator:`PY_LOCK_ACQUIRED`. + + The caller does not need to hold an :term:`attached thread state`. + + +.. c:function:: int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) + + Acquire *lock*. + + If *waitflag* is ``1`` and another thread currently holds the lock, this + function will wait until the lock can be acquired and will always return + ``1``. + + If *waitflag* is ``0`` and another thread holds the lock, this function will + not wait and instead return ``0``. If the lock is not held by any other + thread, then this function will acquire it and return ``1``. + + Unlike :c:func:`PyThread_acquire_lock_timed`, acquiring the lock cannot be + interrupted by a signal. + + The caller does not need to hold an :term:`attached thread state`. + + +.. c:function:: int PyThread_release_lock(PyThread_type_lock lock) + + Release *lock*. If *lock* is not held, then this function issues a + fatal error. + + The caller does not need to hold an :term:`attached thread state`. + + +Operating System Thread APIs +============================ + +.. c:macro:: PYTHREAD_INVALID_THREAD_ID + + Sentinel value for an invalid thread ID. + + This is currently equivalent to ``(unsigned long)-1``. + + +.. c:function:: unsigned long PyThread_start_new_thread(void (*func)(void *), void *arg) + + Start function *func* in a new thread with argument *arg*. + The resulting thread is not intended to be joined. + + *func* must not be ``NULL``, but *arg* may be ``NULL``. + + On success, this function returns the identifier of the new thread; on failure, + this returns :c:macro:`PYTHREAD_INVALID_THREAD_ID`. + + The caller does not need to hold an :term:`attached thread state`. + + +.. c:function:: unsigned long PyThread_get_thread_ident(void) + + Return the identifier of the current thread, which will never be zero. + + This function cannot fail, and the caller does not need to hold an + :term:`attached thread state`. + + .. seealso:: + :py:func:`threading.get_ident` + + +.. c:function:: PyObject *PyThread_GetInfo(void) + + Get general information about the current thread in the form of a + :ref:`struct sequence <struct-sequence-objects>` object. This information is + accessible as :py:attr:`sys.thread_info` in Python. + + On success, this returns a new :term:`strong reference` to the thread + information; on failure, this returns ``NULL`` with an exception set. + + The caller must hold an :term:`attached thread state`. + + +.. c:macro:: PY_HAVE_THREAD_NATIVE_ID + + This macro is defined when the system supports native thread IDs. + + +.. c:function:: unsigned long PyThread_get_thread_native_id(void) + + Get the native identifier of the current thread as it was assigned by the operating + system's kernel, which will never be less than zero. + + This function is only available when :c:macro:`PY_HAVE_THREAD_NATIVE_ID` is + defined. + + This function cannot fail, and the caller does not need to hold an + :term:`attached thread state`. + + .. seealso:: + :py:func:`threading.get_native_id` + + +.. c:function:: void PyThread_exit_thread(void) + + Terminate the current thread. This function is generally considered unsafe + and should be avoided. It is kept solely for backwards compatibility. + + This function is only safe to call if all functions in the full call + stack are written to safely allow it. + + .. warning:: + + If the current system uses POSIX threads (also known as "pthreads"), + this calls :manpage:`pthread_exit(3)`, which attempts to unwind the stack + and call C++ destructors on some libc implementations. However, if a + ``noexcept`` function is reached, it may terminate the process. + Other systems, such as macOS, do unwinding. + + On Windows, this function calls ``_endthreadex()``, which kills the thread + without calling C++ destructors. + + In any case, there is a risk of corruption on the thread's stack. + + .. deprecated:: 3.14 + + +.. c:function:: void PyThread_init_thread(void) + + Initialize ``PyThread*`` APIs. Python executes this function automatically, + so there's little need to call it from an extension module. + + +.. c:function:: int PyThread_set_stacksize(size_t size) + + Set the stack size of the current thread to *size* bytes. + + This function returns ``0`` on success, ``-1`` if *size* is invalid, or + ``-2`` if the system does not support changing the stack size. This function + does not set exceptions. + + The caller does not need to hold an :term:`attached thread state`. + + +.. c:function:: size_t PyThread_get_stacksize(void) + + Return the stack size of the current thread in bytes, or ``0`` if the system's + default stack size is in use. + + The caller does not need to hold an :term:`attached thread state`. From 69021e9acf74a4a43325241d641b6d09ed55b699 Mon Sep 17 00:00:00 2001 From: Petr Viktorin <encukou@gmail.com> Date: Wed, 26 Nov 2025 12:54:56 +0100 Subject: [PATCH 1495/1674] [3.14] GH-139653: Only raise an exception (or fatal error) when the stack pointer is about to overflow the stack. (GH-141711) (GH-141944) Only raises if the stack pointer is both below the limit *and* above the stack base. This prevents false positives for user-space threads, as the stack pointer will be outside those bounds if the stack has been swapped. Cherry-picked from commit c25a070759952b13f97ecc37ca2991c2669aee47 Co-authored-by: Mark Shannon <mark@hotpy.org> --- Include/internal/pycore_ceval.h | 7 +- InternalDocs/stack_protection.md | 68 +++++++++++++++++++ ...-11-17-14-40-45.gh-issue-139653.LzOy1M.rst | 4 ++ Python/ceval.c | 28 ++++++-- 4 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 InternalDocs/stack_protection.md create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 905cc0cf0509b8..cf5ad528217eab 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -201,10 +201,13 @@ extern void _PyEval_DeactivateOpCache(void); static inline int _Py_MakeRecCheck(PyThreadState *tstate) { uintptr_t here_addr = _Py_get_machine_stack_pointer(); _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; + // Overflow if stack pointer is between soft limit and the base of the hardware stack. + // If it is below the hardware stack base, assume that we have the wrong stack limits, and do nothing. + // We could have the wrong stack limits because of limited platform support, or user-space threads. #if _Py_STACK_GROWS_DOWN - return here_addr < _tstate->c_stack_soft_limit; + return here_addr < _tstate->c_stack_soft_limit && here_addr >= _tstate->c_stack_soft_limit - 2 * _PyOS_STACK_MARGIN_BYTES; #else - return here_addr > _tstate->c_stack_soft_limit; + return here_addr > _tstate->c_stack_soft_limit && here_addr <= _tstate->c_stack_soft_limit + 2 * _PyOS_STACK_MARGIN_BYTES; #endif } diff --git a/InternalDocs/stack_protection.md b/InternalDocs/stack_protection.md new file mode 100644 index 00000000000000..14802e57d095f4 --- /dev/null +++ b/InternalDocs/stack_protection.md @@ -0,0 +1,68 @@ +# Stack Protection + +CPython protects against stack overflow in the form of runaway, or just very deep, recursion by raising a `RecursionError` instead of just crashing. +Protection against pure Python stack recursion has existed since very early, but in 3.12 we added protection against stack overflow +in C code. This was initially implemented using a counter and later improved in 3.14 to use the actual stack depth. +For those platforms that support it (Windows, Mac, and most Linuxes) we query the operating system to find the stack bounds. +For other platforms we use conservative estimates. + + +The C stack looks like this: + +``` + +-------+ <--- Top of machine stack + | | + | | + + ~~ + + | | + | | + +-------+ <--- Soft limit + | | + | | _PyOS_STACK_MARGIN_BYTES + | | + +-------+ <--- Hard limit + | | + | | _PyOS_STACK_MARGIN_BYTES + | | + +-------+ <--- Bottom of machine stack +``` + + +We get the current stack pointer using compiler intrinsics where available, or by taking the address of a C local variable. See `_Py_get_machine_stack_pointer()`. + +The soft and hard limits pointers are set by calling `_Py_InitializeRecursionLimits()` during thread initialization. + +Recursion checks are performed by `_Py_EnterRecursiveCall()` or `_Py_EnterRecursiveCallTstate()` which compare the stack pointer to the soft limit. If the stack pointer is lower than the soft limit, then `_Py_CheckRecursiveCall()` is called which checks against both the hard and soft limits: + +```python +kb_used = (stack_top - stack_pointer)>>10 +if stack_pointer < bottom_of_machine_stack: + pass # Our stack limits could be wrong so it is safest to do nothing. +elif stack_pointer < hard_limit: + FatalError(f"Unrecoverable stack overflow (used {kb_used} kB)") +elif stack_pointer < soft_limit: + raise RecursionError(f"Stack overflow (used {kb_used} kB)") +``` + +### User space threads and other oddities + +Some libraries provide user-space threads. These will change the C stack at runtime. +To guard against this we only raise if the stack pointer is in the window between the expected stack base and the soft limit. + +### Diagnosing and fixing stack overflows + +For stack protection to work correctly the amount of stack consumed between calls to `_Py_EnterRecursiveCall()` must be less than `_PyOS_STACK_MARGIN_BYTES`. + +If you see a traceback ending in: `RecursionError: Stack overflow (used ... kB)` then the stack protection is working as intended. If you don't expect to see the error, then check the amount of stack used. If it seems low then CPython may not be configured properly. + +However, if you see a fatal error or crash, then something is not right. +Either a recursive call is not checking `_Py_EnterRecursiveCall()`, or the amount of C stack consumed by a single call exceeds `_PyOS_STACK_MARGIN_BYTES`. If a hard crash occurs, it probably means that the amount of C stack consumed is more than double `_PyOS_STACK_MARGIN_BYTES`. + +Likely causes: +* Recursive code is not calling `_Py_EnterRecursiveCall()` +* `-O0` compilation flags, especially for Clang. With no optimization, C calls can consume a lot of stack space +* Giant, complex functions in third-party C extensions. This is unlikely as the function in question would need to be more complicated than the bytecode interpreter. +* `_PyOS_STACK_MARGIN_BYTES` is just too low. +* `_Py_InitializeRecursionLimits()` is not setting the soft and hard limits correctly for that platform. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst new file mode 100644 index 00000000000000..c3ae0e8adab319 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst @@ -0,0 +1,4 @@ +Only raise a ``RecursionError`` or trigger a fatal error if the stack +pointer is both below the limit pointer *and* above the stack base. If +outside of these bounds assume that it is OK. This prevents false positives +when user-space threads swap stacks. diff --git a/Python/ceval.c b/Python/ceval.c index 306ca0818bbf8d..4b1e7abe66dfad 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -344,9 +344,11 @@ _Py_ReachedRecursionLimitWithMargin(PyThreadState *tstate, int margin_count) _Py_InitializeRecursionLimits(tstate); } #if _Py_STACK_GROWS_DOWN - return here_addr <= _tstate->c_stack_soft_limit + margin_count * _PyOS_STACK_MARGIN_BYTES; + return here_addr <= _tstate->c_stack_soft_limit + margin_count * _PyOS_STACK_MARGIN_BYTES && + here_addr >= _tstate->c_stack_soft_limit - 2 * _PyOS_STACK_MARGIN_BYTES; #else - return here_addr > _tstate->c_stack_soft_limit - margin_count * _PyOS_STACK_MARGIN_BYTES; + return here_addr > _tstate->c_stack_soft_limit - margin_count * _PyOS_STACK_MARGIN_BYTES && + here_addr <= _tstate->c_stack_soft_limit + 2 * _PyOS_STACK_MARGIN_BYTES; #endif } @@ -437,7 +439,7 @@ int pthread_attr_destroy(pthread_attr_t *a) #endif static void -hardware_stack_limits(uintptr_t *base, uintptr_t *top) +hardware_stack_limits(uintptr_t *base, uintptr_t *top, uintptr_t sp) { #ifdef WIN32 ULONG_PTR low, high; @@ -473,10 +475,19 @@ hardware_stack_limits(uintptr_t *base, uintptr_t *top) return; } # endif - uintptr_t here_addr = _Py_get_machine_stack_pointer(); - uintptr_t top_addr = _Py_SIZE_ROUND_UP(here_addr, 4096); + // Add some space for caller function then round to minimum page size + // This is a guess at the top of the stack, but should be a reasonably + // good guess if called from _PyThreadState_Attach when creating a thread. + // If the thread is attached deep in a call stack, then the guess will be poor. +#if _Py_STACK_GROWS_DOWN + uintptr_t top_addr = _Py_SIZE_ROUND_UP(sp + 8*sizeof(void*), SYSTEM_PAGE_SIZE); *top = top_addr; *base = top_addr - Py_C_STACK_SIZE; +# else + uintptr_t base_addr = _Py_SIZE_ROUND_DOWN(sp - 8*sizeof(void*), SYSTEM_PAGE_SIZE); + *base = base_addr; + *top = base_addr + Py_C_STACK_SIZE; +#endif #endif } @@ -525,7 +536,8 @@ void _Py_InitializeRecursionLimits(PyThreadState *tstate) { uintptr_t base, top; - hardware_stack_limits(&base, &top); + uintptr_t here_addr = _Py_get_machine_stack_pointer(); + hardware_stack_limits(&base, &top, here_addr); assert(top != 0); tstate_set_stack(tstate, base, top); @@ -569,7 +581,7 @@ PyUnstable_ThreadState_ResetStackProtection(PyThreadState *tstate) /* The function _Py_EnterRecursiveCallTstate() only calls _Py_CheckRecursiveCall() - if the recursion_depth reaches recursion_limit. */ + if the stack pointer is between the stack base and c_stack_hard_limit. */ int _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) { @@ -578,10 +590,12 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) assert(_tstate->c_stack_soft_limit != 0); assert(_tstate->c_stack_hard_limit != 0); #if _Py_STACK_GROWS_DOWN + assert(here_addr >= _tstate->c_stack_hard_limit - _PyOS_STACK_MARGIN_BYTES); if (here_addr < _tstate->c_stack_hard_limit) { /* Overflowing while handling an overflow. Give up. */ int kbytes_used = (int)(_tstate->c_stack_top - here_addr)/1024; #else + assert(here_addr <= _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES); if (here_addr > _tstate->c_stack_hard_limit) { /* Overflowing while handling an overflow. Give up. */ int kbytes_used = (int)(here_addr - _tstate->c_stack_top)/1024; From 96bc021d7c93587a98b13a8bd191e5c9e31a6baf Mon Sep 17 00:00:00 2001 From: Petr Viktorin <encukou@gmail.com> Date: Wed, 26 Nov 2025 15:35:04 +0100 Subject: [PATCH 1496/1674] [3.14] gh-141909: Add `PyModuleDef_Slot` and earlier Py_mod_* constants to stable ABI manifest (#141910) (GH-141978) These were added to the limited API in 3.5-3.13. Not including them in `Misc/stable_abi.toml` was a bug. (cherry picked from commit 202fce0dbde1da32d8abc2eb59ddfce6f6a3c9fa) --- Doc/c-api/module.rst | 4 ++++ Doc/data/stable_abi.dat | 5 +++++ Misc/stable_abi.toml | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index bc844582ff4377..11b488e4e52069 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -328,6 +328,8 @@ The available slot types are: ``PyModuleDef`` has non-``NULL`` ``m_traverse``, ``m_clear``, ``m_free``; non-zero ``m_size``; or slots other than ``Py_mod_create``. + .. versionadded:: 3.5 + .. c:macro:: Py_mod_exec Specifies a function that is called to *execute* the module. @@ -342,6 +344,8 @@ The available slot types are: If multiple ``Py_mod_exec`` slots are specified, they are processed in the order they appear in the *m_slots* array. + .. versionadded:: 3.5 + .. c:macro:: Py_mod_multiple_interpreters Specifies one of the following values: diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 86054f87e9f6ae..b69799f5a4235a 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -454,6 +454,7 @@ data,PyMethodDescr_Type,3.2,, type,PyModuleDef,3.2,,full-abi type,PyModuleDef_Base,3.2,,full-abi func,PyModuleDef_Init,3.5,, +type,PyModuleDef_Slot,3.5,,full-abi data,PyModuleDef_Type,3.5,, func,PyModule_Add,3.13,, func,PyModule_AddFunctions,3.7,, @@ -972,6 +973,10 @@ macro,Py_bf_getbuffer,3.11,, macro,Py_bf_releasebuffer,3.11,, type,Py_buffer,3.11,,full-abi type,Py_intptr_t,3.2,, +macro,Py_mod_create,3.5,, +macro,Py_mod_exec,3.5,, +macro,Py_mod_gil,3.13,, +macro,Py_mod_multiple_interpreters,3.12,, macro,Py_mp_ass_subscript,3.2,, macro,Py_mp_length,3.2,, macro,Py_mp_subscript,3.2,, diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 27d57e695d3ae0..cc58ffc176af59 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -1889,6 +1889,13 @@ added = '3.5' [data.PyModuleDef_Type] added = '3.5' +[const.Py_mod_create] + added = '3.5' +[const.Py_mod_exec] + added = '3.5' +[struct.PyModuleDef_Slot] + added = '3.5' + struct_abi_kind = 'full-abi' # New slots in 3.5: # d51374ed78a3e3145911a16cdf3b9b84b3ba7d15 - Matrix multiplication (PEP 465) @@ -2431,6 +2438,9 @@ added = '3.12' [const.Py_TPFLAGS_ITEMS_AT_END] added = '3.12' +[const.Py_mod_multiple_interpreters] + added = '3.12' + [function.PyImport_AddModuleRef] added = '3.13' [function.PyWeakref_GetRef] @@ -2509,6 +2519,8 @@ added = '3.13' [function.PyEval_GetFrameLocals] added = '3.13' +[const.Py_mod_gil] + added = '3.13' [function.Py_TYPE] added = '3.14' From f47e928574187ae97c778e326739b3aa0c7dc765 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:08:39 +0100 Subject: [PATCH 1497/1674] [3.14] gh-116738: Fix thread-safety issue in re module for free threading (gh-141923) (gh-141990) Added atomic operations to `scanner_begin()` and `scanner_end()` to prevent race conditions on the `executing` flag in free-threaded builds. Also added tests for concurrent usage of the `re` module. Without the atomic operations, `test_scanner_concurrent_access()` triggers `assert(self->executing)` failures, or a thread sanitizer run emits errors. (cherry picked from commit bc9e63dd9d2931771415cca1b0ed774471d523c0) Co-authored-by: Alper <alperyoney@fb.com> --- .../internal/pycore_pyatomic_ft_wrappers.h | 6 ++ Lib/test/test_free_threading/test_re.py | 62 +++++++++++++++++++ ...-11-25-13-13-34.gh-issue-116738.MnZRdV.rst | 2 + Modules/_sre/sre.c | 13 ++-- 4 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 Lib/test/test_free_threading/test_re.py create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst diff --git a/Include/internal/pycore_pyatomic_ft_wrappers.h b/Include/internal/pycore_pyatomic_ft_wrappers.h index 3e41e2fd1569ca..223ee951e4bcc2 100644 --- a/Include/internal/pycore_pyatomic_ft_wrappers.h +++ b/Include/internal/pycore_pyatomic_ft_wrappers.h @@ -77,6 +77,10 @@ extern "C" { _Py_atomic_store_ushort_relaxed(&value, new_value) #define FT_ATOMIC_LOAD_USHORT_RELAXED(value) \ _Py_atomic_load_ushort_relaxed(&value) +#define FT_ATOMIC_LOAD_INT(value) \ + _Py_atomic_load_int(&value) +#define FT_ATOMIC_STORE_INT(value, new_value) \ + _Py_atomic_store_int(&value, new_value) #define FT_ATOMIC_STORE_INT_RELAXED(value, new_value) \ _Py_atomic_store_int_relaxed(&value, new_value) #define FT_ATOMIC_LOAD_INT_RELAXED(value) \ @@ -142,6 +146,8 @@ extern "C" { #define FT_ATOMIC_STORE_SHORT_RELAXED(value, new_value) value = new_value #define FT_ATOMIC_LOAD_USHORT_RELAXED(value) value #define FT_ATOMIC_STORE_USHORT_RELAXED(value, new_value) value = new_value +#define FT_ATOMIC_LOAD_INT(value) value +#define FT_ATOMIC_STORE_INT(value, new_value) value = new_value #define FT_ATOMIC_LOAD_INT_RELAXED(value) value #define FT_ATOMIC_STORE_INT_RELAXED(value, new_value) value = new_value #define FT_ATOMIC_LOAD_UINT_RELAXED(value) value diff --git a/Lib/test/test_free_threading/test_re.py b/Lib/test/test_free_threading/test_re.py new file mode 100644 index 00000000000000..56f25045d1bf8e --- /dev/null +++ b/Lib/test/test_free_threading/test_re.py @@ -0,0 +1,62 @@ +import re +import unittest + +from test.support import threading_helper +from test.support.threading_helper import run_concurrently + + +NTHREADS = 10 + + +@threading_helper.requires_working_threading() +class TestRe(unittest.TestCase): + def test_pattern_sub(self): + """Pattern substitution should work across threads""" + pattern = re.compile(r"\w+@\w+\.\w+") + text = "e-mail: test@python.org or user@pycon.org. " * 5 + results = [] + + def worker(): + substituted = pattern.sub("(redacted)", text) + results.append(substituted.count("(redacted)")) + + run_concurrently(worker_func=worker, nthreads=NTHREADS) + self.assertEqual(results, [2 * 5] * NTHREADS) + + def test_pattern_search(self): + """Pattern search should work across threads.""" + emails = ["alice@python.org", "bob@pycon.org"] * 10 + pattern = re.compile(r"\w+@\w+\.\w+") + results = [] + + def worker(): + matches = [pattern.search(e).group() for e in emails] + results.append(len(matches)) + + run_concurrently(worker_func=worker, nthreads=NTHREADS) + self.assertEqual(results, [2 * 10] * NTHREADS) + + def test_scanner_concurrent_access(self): + """Shared scanner should reject concurrent access.""" + pattern = re.compile(r"\w+") + scanner = pattern.scanner("word " * 10) + + def worker(): + for _ in range(100): + try: + scanner.search() + except ValueError as e: + if "already executing" in str(e): + pass + else: + raise + + run_concurrently(worker_func=worker, nthreads=NTHREADS) + # This test has no assertions. Its purpose is to catch crashes and + # enable thread sanitizer to detect race conditions. While "already + # executing" errors are very likely, they're not guaranteed due to + # non-deterministic thread scheduling, so we can't assert errors > 0. + + +if __name__ == "__main__": + unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst new file mode 100644 index 00000000000000..151f8968292a61 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst @@ -0,0 +1,2 @@ +Fix thread safety issue with :mod:`re` scanner objects in free-threaded +builds. diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index 2761c76a3792f8..249d6fffc32cc2 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -2835,20 +2835,25 @@ scanner_dealloc(PyObject *self) static int scanner_begin(ScannerObject* self) { - if (self->executing) { +#ifdef Py_GIL_DISABLED + int was_executing = _Py_atomic_exchange_int(&self->executing, 1); +#else + int was_executing = self->executing; + self->executing = 1; +#endif + if (was_executing) { PyErr_SetString(PyExc_ValueError, "regular expression scanner already executing"); return 0; } - self->executing = 1; return 1; } static void scanner_end(ScannerObject* self) { - assert(self->executing); - self->executing = 0; + assert(FT_ATOMIC_LOAD_INT_RELAXED(self->executing)); + FT_ATOMIC_STORE_INT(self->executing, 0); } /*[clinic input] From ad60d8963effb7677dbab05c6d8b3c1c3d78904c Mon Sep 17 00:00:00 2001 From: Victor Stinner <vstinner@python.org> Date: Thu, 27 Nov 2025 13:05:37 +0100 Subject: [PATCH 1498/1674] [3.14] gh-125434: Display thread name in faulthandler on Windows (#142011) * gh-125434: Display thread name in faulthandler on Windows (#140675) (cherry picked from commit 313145eab5f6ebca21d2e3c80c130980d3bcdc88) * gh-125434: Fix non-ASCII thread names in faulthandler on Windows (#140700) Add _Py_DumpWideString() function to dump a wide string as ASCII. It supports surrogate pairs. Replace _Py_EncodeLocaleRaw() with _Py_DumpWideString() in write_thread_name(). (cherry picked from commit 80f20f58b2b8368ed8451a0161036dda94d8d33a) --- Include/internal/pycore_traceback.h | 2 + ...-10-27-16-01-41.gh-issue-125434.qy0uRA.rst | 2 + Python/pylifecycle.c | 1 + Python/traceback.c | 130 ++++++++++++++++-- 4 files changed, 121 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index a4f125e073d3d1..8357cce9d899fb 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -103,6 +103,8 @@ extern int _Py_WriteIndent(int, PyObject *); PyAPI_FUNC(void) _Py_InitDumpStack(void); PyAPI_FUNC(void) _Py_DumpStack(int fd); +extern void _Py_DumpTraceback_Init(void); + #ifdef __cplusplus } #endif diff --git a/Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst b/Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst new file mode 100644 index 00000000000000..299e9f04df7c39 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst @@ -0,0 +1,2 @@ +Display thread name in :mod:`faulthandler` on Windows. Patch by Victor +Stinner. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f5fbdeedac34ad..fad69f82b60796 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -503,6 +503,7 @@ pycore_init_runtime(_PyRuntimeState *runtime, _PyRuntimeState_SetFinalizing(runtime, NULL); _Py_InitVersion(); + _Py_DumpTraceback_Init(); status = _Py_HashRandomization_Init(config); if (_PyStatus_EXCEPTION(status)) { diff --git a/Python/traceback.c b/Python/traceback.c index 5efa70fb676882..a46276f66b285b 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -70,6 +70,13 @@ class traceback "PyTracebackObject *" "&PyTraceback_Type" #include "clinic/traceback.c.h" + +#ifdef MS_WINDOWS +typedef HRESULT (WINAPI *PF_GET_THREAD_DESCRIPTION)(HANDLE, PCWSTR*); +static PF_GET_THREAD_DESCRIPTION pGetThreadDescription = NULL; +#endif + + static PyObject * tb_create_raw(PyTracebackObject *next, PyFrameObject *frame, int lasti, int lineno) @@ -974,6 +981,52 @@ _Py_DumpASCII(int fd, PyObject *text) } } + +#ifdef MS_WINDOWS +static void +_Py_DumpWideString(int fd, wchar_t *str) +{ + Py_ssize_t size = wcslen(str); + int truncated; + if (MAX_STRING_LENGTH < size) { + size = MAX_STRING_LENGTH; + truncated = 1; + } + else { + truncated = 0; + } + + for (Py_ssize_t i=0; i < size; i++) { + Py_UCS4 ch = str[i]; + if (' ' <= ch && ch <= 126) { + /* printable ASCII character */ + dump_char(fd, (char)ch); + } + else if (ch <= 0xff) { + PUTS(fd, "\\x"); + _Py_DumpHexadecimal(fd, ch, 2); + } + else if (Py_UNICODE_IS_HIGH_SURROGATE(ch) + && Py_UNICODE_IS_LOW_SURROGATE(str[i+1])) { + ch = Py_UNICODE_JOIN_SURROGATES(ch, str[i+1]); + i++; // Skip the low surrogate character + PUTS(fd, "\\U"); + _Py_DumpHexadecimal(fd, ch, 8); + } + else { + Py_BUILD_ASSERT(sizeof(wchar_t) == 2); + PUTS(fd, "\\u"); + _Py_DumpHexadecimal(fd, ch, 4); + } + } + + if (truncated) { + PUTS(fd, "..."); + } +} +#endif + + /* Write a frame into the file fd: "File "xxx", line xxx in xxx". This function is signal safe. @@ -1122,23 +1175,12 @@ _Py_DumpTraceback(int fd, PyThreadState *tstate) # endif #endif -/* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if - is_current is true, "Thread 0xHHHH:\n" otherwise. - - This function is signal safe. */ +// Write the thread name static void -write_thread_id(int fd, PyThreadState *tstate, int is_current) +write_thread_name(int fd, PyThreadState *tstate) { - if (is_current) - PUTS(fd, "Current thread 0x"); - else - PUTS(fd, "Thread 0x"); - _Py_DumpHexadecimal(fd, - tstate->thread_id, - sizeof(unsigned long) * 2); - - // Write the thread name +#ifndef MS_WINDOWS #if defined(HAVE_PTHREAD_GETNAME_NP) || defined(HAVE_PTHREAD_GET_NAME_NP) char name[100]; pthread_t thread = (pthread_t)tstate->thread_id; @@ -1157,6 +1199,49 @@ write_thread_id(int fd, PyThreadState *tstate, int is_current) } } #endif +#else + // Windows implementation + if (pGetThreadDescription == NULL) { + return; + } + + HANDLE thread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, tstate->thread_id); + if (thread == NULL) { + return; + } + + wchar_t *name; + HRESULT hr = pGetThreadDescription(thread, &name); + if (!FAILED(hr)) { + if (name[0] != 0) { + PUTS(fd, " ["); + _Py_DumpWideString(fd, name); + PUTS(fd, "]"); + } + LocalFree(name); + } + CloseHandle(thread); +#endif +} + + +/* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if + is_current is true, "Thread 0xHHHH:\n" otherwise. + + This function is signal safe (except on Windows). */ + +static void +write_thread_id(int fd, PyThreadState *tstate, int is_current) +{ + if (is_current) + PUTS(fd, "Current thread 0x"); + else + PUTS(fd, "Thread 0x"); + _Py_DumpHexadecimal(fd, + tstate->thread_id, + sizeof(unsigned long) * 2); + + write_thread_name(fd, tstate); PUTS(fd, " (most recent call first):\n"); } @@ -1351,3 +1436,20 @@ _Py_InitDumpStack(void) (void)backtrace(callstack, 1); #endif } + + +void +_Py_DumpTraceback_Init(void) +{ +#ifdef MS_WINDOWS + if (pGetThreadDescription != NULL) { + return; + } + + HMODULE kernelbase = GetModuleHandleW(L"kernelbase.dll"); + if (kernelbase != NULL) { + pGetThreadDescription = (PF_GET_THREAD_DESCRIPTION)GetProcAddress( + kernelbase, "GetThreadDescription"); + } +#endif +} From 64d6bde38ffb97a6f7c7fee82ba98de81911f1b9 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Thu, 27 Nov 2025 12:17:39 +0000 Subject: [PATCH 1499/1674] [3.14] gh-98896: resource_tracker: use json&base64 to allow arbitrary shared memory names (GH-138473) (GH-141922) Co-authored-by: Rani Pinchuk <33353578+rani-pinchuk@users.noreply.github.com> --- Lib/multiprocessing/resource_tracker.py | 60 ++++++++++++++++--- Lib/test/_test_multiprocessing.py | 44 ++++++++++++++ ...5-09-03-20-18-39.gh-issue-98896.tjez89.rst | 2 + 3 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index 38fcaed48fa9fb..b0f9099f4a59f3 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -15,6 +15,7 @@ # this resource tracker process, "killall python" would probably leave unlinked # resources. +import base64 import os import signal import sys @@ -22,6 +23,8 @@ import warnings from collections import deque +import json + from . import spawn from . import util @@ -196,6 +199,17 @@ def _launch(self): finally: os.close(r) + def _make_probe_message(self): + """Return a JSON-encoded probe message.""" + return ( + json.dumps( + {"cmd": "PROBE", "rtype": "noop"}, + ensure_ascii=True, + separators=(",", ":"), + ) + + "\n" + ).encode("ascii") + def _ensure_running_and_write(self, msg=None): with self._lock: if self._lock._recursion_count() > 1: @@ -207,7 +221,7 @@ def _ensure_running_and_write(self, msg=None): if self._fd is not None: # resource tracker was launched before, is it still running? if msg is None: - to_send = b'PROBE:0:noop\n' + to_send = self._make_probe_message() else: to_send = msg try: @@ -234,7 +248,7 @@ def _check_alive(self): try: # We cannot use send here as it calls ensure_running, creating # a cycle. - os.write(self._fd, b'PROBE:0:noop\n') + os.write(self._fd, self._make_probe_message()) except OSError: return False else: @@ -253,11 +267,25 @@ def _write(self, msg): assert nbytes == len(msg), f"{nbytes=} != {len(msg)=}" def _send(self, cmd, name, rtype): - msg = f"{cmd}:{name}:{rtype}\n".encode("ascii") - if len(msg) > 512: - # posix guarantees that writes to a pipe of less than PIPE_BUF - # bytes are atomic, and that PIPE_BUF >= 512 - raise ValueError('msg too long') + # POSIX guarantees that writes to a pipe of less than PIPE_BUF (512 on Linux) + # bytes are atomic. Therefore, we want the message to be shorter than 512 bytes. + # POSIX shm_open() and sem_open() require the name, including its leading slash, + # to be at most NAME_MAX bytes (255 on Linux) + # With json.dump(..., ensure_ascii=True) every non-ASCII byte becomes a 6-char + # escape like \uDC80. + # As we want the overall message to be kept atomic and therefore smaller than 512, + # we encode encode the raw name bytes with URL-safe Base64 - so a 255 long name + # will not exceed 340 bytes. + b = name.encode('utf-8', 'surrogateescape') + if len(b) > 255: + raise ValueError('shared memory name too long (max 255 bytes)') + b64 = base64.urlsafe_b64encode(b).decode('ascii') + + payload = {"cmd": cmd, "rtype": rtype, "base64_name": b64} + msg = (json.dumps(payload, ensure_ascii=True, separators=(",", ":")) + "\n").encode("ascii") + + # The entire JSON message is guaranteed < PIPE_BUF (512 bytes) by construction. + assert len(msg) <= 512, f"internal error: message too long ({len(msg)} bytes)" self._ensure_running_and_write(msg) @@ -290,7 +318,23 @@ def main(fd): with open(fd, 'rb') as f: for line in f: try: - cmd, name, rtype = line.strip().decode('ascii').split(':') + try: + obj = json.loads(line.decode('ascii')) + except Exception as e: + raise ValueError("malformed resource_tracker message: %r" % (line,)) from e + + cmd = obj["cmd"] + rtype = obj["rtype"] + b64 = obj.get("base64_name", "") + + if not isinstance(cmd, str) or not isinstance(rtype, str) or not isinstance(b64, str): + raise ValueError("malformed resource_tracker fields: %r" % (obj,)) + + try: + name = base64.urlsafe_b64decode(b64).decode('utf-8', 'surrogateescape') + except ValueError as e: + raise ValueError("malformed resource_tracker base64_name: %r" % (b64,)) from e + cleanup_func = _CLEANUP_FUNCS.get(rtype, None) if cleanup_func is None: raise ValueError( diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 03114f1701e0ce..d5cd25a7980468 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -7144,3 +7144,47 @@ class SemLock(_multiprocessing.SemLock): name = f'test_semlock_subclass-{os.getpid()}' s = SemLock(1, 0, 10, name, False) _multiprocessing.sem_unlink(name) + + +@unittest.skipUnless(HAS_SHMEM, "requires multiprocessing.shared_memory") +class TestSharedMemoryNames(unittest.TestCase): + def test_that_shared_memory_name_with_colons_has_no_resource_tracker_errors(self): + # Test script that creates and cleans up shared memory with colon in name + test_script = textwrap.dedent(""" + import sys + from multiprocessing import shared_memory + import time + + # Test various patterns of colons in names + test_names = [ + "a:b", + "a:b:c", + "test:name:with:many:colons", + ":starts:with:colon", + "ends:with:colon:", + "::double::colons::", + "name\\nwithnewline", + "name-with-trailing-newline\\n", + "\\nname-starts-with-newline", + "colons:and\\nnewlines:mix", + "multi\\nline\\nname", + ] + + for name in test_names: + try: + shm = shared_memory.SharedMemory(create=True, size=100, name=name) + shm.buf[:5] = b'hello' # Write something to the shared memory + shm.close() + shm.unlink() + + except Exception as e: + print(f"Error with name '{name}': {e}", file=sys.stderr) + sys.exit(1) + + print("SUCCESS") + """) + + rc, out, err = script_helper.assert_python_ok("-c", test_script) + self.assertIn(b"SUCCESS", out) + self.assertNotIn(b"traceback", err.lower(), err) + self.assertNotIn(b"resource_tracker.py", err, err) diff --git a/Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst b/Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst new file mode 100644 index 00000000000000..6831499c0afb43 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst @@ -0,0 +1,2 @@ +Fix a failure in multiprocessing resource_tracker when SharedMemory names contain colons. +Patch by Rani Pinchuk. From a1dd2480226370b6924dbd8a59f9c86dc856047b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 27 Nov 2025 21:34:00 +0100 Subject: [PATCH 1500/1674] [3.14] gh-116008: Detect freed thread state in faulthandler (GH-141988) (#142013) gh-116008: Detect freed thread state in faulthandler (GH-141988) Add _PyMem_IsULongFreed() function. (cherry picked from commit d5d9e89dde9843a61b46872b1914c5b75ad05998) Co-authored-by: Victor Stinner <vstinner@python.org> --- Include/internal/pycore_pymem.h | 21 +++++++++++++++++++++ Python/traceback.c | 23 +++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index e27cff03daa8f9..f0b90a25597d0d 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -70,6 +70,27 @@ static inline int _PyMem_IsPtrFreed(const void *ptr) #endif } +// Similar to _PyMem_IsPtrFreed() but expects an 'unsigned long' instead of a +// pointer. +static inline int _PyMem_IsULongFreed(unsigned long value) +{ +#if SIZEOF_LONG == 8 + return (value == 0 + || value == (unsigned long)0xCDCDCDCDCDCDCDCD + || value == (unsigned long)0xDDDDDDDDDDDDDDDD + || value == (unsigned long)0xFDFDFDFDFDFDFDFD + || value == (unsigned long)0xFFFFFFFFFFFFFFFF); +#elif SIZEOF_LONG == 4 + return (value == 0 + || value == (unsigned long)0xCDCDCDCD + || value == (unsigned long)0xDDDDDDDD + || value == (unsigned long)0xFDFDFDFD + || value == (unsigned long)0xFFFFFFFF); +#else +# error "unknown long size" +#endif +} + extern int _PyMem_GetAllocatorName( const char *name, PyMemAllocatorName *allocator); diff --git a/Python/traceback.c b/Python/traceback.c index a46276f66b285b..86273da3c8ae3c 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -1095,6 +1095,9 @@ tstate_is_freed(PyThreadState *tstate) if (_PyMem_IsPtrFreed(tstate->interp)) { return 1; } + if (_PyMem_IsULongFreed(tstate->thread_id)) { + return 1; + } return 0; } @@ -1114,7 +1117,7 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) } if (tstate_is_freed(tstate)) { - PUTS(fd, " <tstate is freed>\n"); + PUTS(fd, " <freed thread state>\n"); return; } @@ -1139,12 +1142,16 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) PUTS(fd, " <freed frame>\n"); break; } + // Read frame->previous early since memory can be freed during + // dump_frame() + _PyInterpreterFrame *previous = frame->previous; + if (dump_frame(fd, frame) < 0) { PUTS(fd, " <invalid frame>\n"); break; } - frame = frame->previous; + frame = previous; if (frame == NULL) { break; } @@ -1241,7 +1248,9 @@ write_thread_id(int fd, PyThreadState *tstate, int is_current) tstate->thread_id, sizeof(unsigned long) * 2); - write_thread_name(fd, tstate); + if (!_PyMem_IsULongFreed(tstate->thread_id)) { + write_thread_name(fd, tstate); + } PUTS(fd, " (most recent call first):\n"); } @@ -1299,7 +1308,6 @@ _Py_DumpTracebackThreads(int fd, PyInterpreterState *interp, return "unable to get the thread head state"; /* Dump the traceback of each thread */ - tstate = PyInterpreterState_ThreadHead(interp); unsigned int nthreads = 0; _Py_BEGIN_SUPPRESS_IPH do @@ -1310,11 +1318,18 @@ _Py_DumpTracebackThreads(int fd, PyInterpreterState *interp, PUTS(fd, "...\n"); break; } + + if (tstate_is_freed(tstate)) { + PUTS(fd, "<freed thread state>\n"); + break; + } + write_thread_id(fd, tstate, tstate == current_tstate); if (tstate == current_tstate && tstate->interp->gc.collecting) { PUTS(fd, " Garbage-collecting\n"); } dump_traceback(fd, tstate, 0); + tstate = PyThreadState_Next(tstate); nthreads++; } while (tstate != NULL); From c1d3e2523b9f85c21489accb3b193035d9d943f4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 05:52:14 +0100 Subject: [PATCH 1501/1674] [3.14] GH-134453: Fix subprocess memoryview input handling on POSIX (GH-134949) (#142062) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GH-134453: Fix subprocess memoryview input handling on POSIX (GH-134949) Fix inconsistent subprocess.Popen.communicate() behavior between Windows and POSIX when using memoryview objects with non-byte elements as input. On POSIX systems, the code was incorrectly comparing bytes written against element count instead of byte count, causing data truncation for large inputs with non-byte element types. Changes: - Cast memoryview inputs to byte view when input is already a memoryview - Fix progress tracking to use len(input_view) instead of len(self._input) - Add comprehensive test coverage for memoryview inputs 🤖 Generated with [Claude Code](https://claude.ai/code) * old-man-yells-at-ReST * Update 2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst * assertIsNone review feedback * fix memoryview_nonbytes test to fail without our fix on main, and have a nicer error. Thanks to Peter Bierma @ZeroIntensity for the code review. (cherry picked from commit cc6bc4c97f7be5b401a91119ba603e6c1a07c99b) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/subprocess.py | 7 +++- Lib/test/test_subprocess.py | 42 +++++++++++++++++++ ...-05-30-18-37-44.gh-issue-134453.kxkA-o.rst | 4 ++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 54c2eb515b60da..c1116358a39ce1 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -2103,7 +2103,10 @@ def _communicate(self, input, endtime, orig_timeout): self._save_input(input) if self._input: - input_view = memoryview(self._input) + if not isinstance(self._input, memoryview): + input_view = memoryview(self._input) + else: + input_view = self._input.cast("b") # byte input required with _PopenSelector() as selector: if self.stdin and input: @@ -2139,7 +2142,7 @@ def _communicate(self, input, endtime, orig_timeout): selector.unregister(key.fileobj) key.fileobj.close() else: - if self._input_offset >= len(self._input): + if self._input_offset >= len(input_view): selector.unregister(key.fileobj) key.fileobj.close() elif key.fileobj in (self.stdout, self.stderr): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index f0e350c71f60ea..7d0aab2ea9d0cf 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -957,6 +957,48 @@ def test_communicate(self): self.assertEqual(stdout, b"banana") self.assertEqual(stderr, b"pineapple") + def test_communicate_memoryview_input(self): + # Test memoryview input with byte elements + test_data = b"Hello, memoryview!" + mv = memoryview(test_data) + p = subprocess.Popen([sys.executable, "-c", + 'import sys; sys.stdout.write(sys.stdin.read())'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + self.addCleanup(p.stdout.close) + self.addCleanup(p.stdin.close) + (stdout, stderr) = p.communicate(mv) + self.assertEqual(stdout, test_data) + self.assertIsNone(stderr) + + def test_communicate_memoryview_input_nonbyte(self): + # Test memoryview input with non-byte elements (e.g., int32) + # This tests the fix for gh-134453 where non-byte memoryviews + # had incorrect length tracking on POSIX + import array + # Create an array of 32-bit integers that's large enough to trigger + # the chunked writing behavior (> PIPE_BUF) + pipe_buf = getattr(select, 'PIPE_BUF', 512) + # Each 'i' element is 4 bytes, so we need more than pipe_buf/4 elements + # Add some extra to ensure we exceed the buffer size + num_elements = pipe_buf + 1 + test_array = array.array('i', [0x64306f66 for _ in range(num_elements)]) + expected_bytes = test_array.tobytes() + mv = memoryview(test_array) + + p = subprocess.Popen([sys.executable, "-c", + 'import sys; ' + 'data = sys.stdin.buffer.read(); ' + 'sys.stdout.buffer.write(data)'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + self.addCleanup(p.stdout.close) + self.addCleanup(p.stdin.close) + (stdout, stderr) = p.communicate(mv) + self.assertEqual(stdout, expected_bytes, + msg=f"{len(stdout)=} =? {len(expected_bytes)=}") + self.assertIsNone(stderr) + def test_communicate_timeout(self): p = subprocess.Popen([sys.executable, "-c", 'import sys,os,time;' diff --git a/Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst b/Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst new file mode 100644 index 00000000000000..fee975ea70230c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst @@ -0,0 +1,4 @@ +Fixed :func:`subprocess.Popen.communicate` ``input=`` handling of :class:`memoryview` +instances that were non-byte shaped on POSIX platforms. Those are now properly +cast to a byte shaped view instead of truncating the input. Windows platforms +did not have this bug. From 476089479d53ff2f430938d3628ee7cdf6010952 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 07:21:43 +0100 Subject: [PATCH 1502/1674] [3.14] gh-141473: Fix subprocess.Popen.communicate to send input to stdin upon a subsequent post-timeout call (GH-141477) (#142059) gh-141473: Fix subprocess.Popen.communicate to send input to stdin upon a subsequent post-timeout call (GH-141477) * gh-141473: Fix subprocess.Popen.communicate to send input to stdin * Docs: Clarify that `input` is one time only on `communicate()` * NEWS entry * Add a regression test. --------- (cherry picked from commit 526d7a8bb47bd8ff58c829c30384cd70cc5d0747) Co-authored-by: Artur Jamro <artur.jamro@gmail.com> Co-authored-by: Gregory P. Smith <greg@krypto.org> --- Doc/library/subprocess.rst | 4 ++- Lib/subprocess.py | 2 +- Lib/test/test_subprocess.py | 34 +++++++++++++++++++ ...-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst | 4 +++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 1aade881745f21..43da804b62beb1 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -831,7 +831,9 @@ Instances of the :class:`Popen` class have the following methods: If the process does not terminate after *timeout* seconds, a :exc:`TimeoutExpired` exception will be raised. Catching this exception and - retrying communication will not lose any output. + retrying communication will not lose any output. Supplying *input* to a + subsequent post-timeout :meth:`communicate` call is in undefined behavior + and may become an error in the future. The child process is not killed if the timeout expires, so in order to cleanup properly a well-behaved application should kill the child process and diff --git a/Lib/subprocess.py b/Lib/subprocess.py index c1116358a39ce1..301133e9e9c712 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -2109,7 +2109,7 @@ def _communicate(self, input, endtime, orig_timeout): input_view = self._input.cast("b") # byte input required with _PopenSelector() as selector: - if self.stdin and input: + if self.stdin and not self.stdin.closed and self._input: selector.register(self.stdin, selectors.EVENT_WRITE) if self.stdout and not self.stdout.closed: selector.register(self.stdout, selectors.EVENT_READ) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 7d0aab2ea9d0cf..5e73810dcb7253 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1685,6 +1685,40 @@ def test_wait_negative_timeout(self): self.assertEqual(proc.wait(), 0) + def test_post_timeout_communicate_sends_input(self): + """GH-141473 regression test; the stdin pipe must close""" + with subprocess.Popen( + [sys.executable, "-uc", """\ +import sys +while c := sys.stdin.read(512): + sys.stdout.write(c) +print() +"""], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) as proc: + try: + data = f"spam{'#'*4096}beans" + proc.communicate( + input=data, + timeout=0, + ) + except subprocess.TimeoutExpired as exc: + pass + # Prior to the bugfix, this would hang as the stdin + # pipe to the child had not been closed. + try: + stdout, stderr = proc.communicate(timeout=15) + except subprocess.TimeoutExpired as exc: + self.fail("communicate() hung waiting on child process that should have seen its stdin pipe close and exit") + self.assertEqual( + proc.returncode, 0, + msg=f"STDERR:\n{stderr}\nSTDOUT:\n{stdout}") + self.assertStartsWith(stdout, "spam") + self.assertIn("beans", stdout) + class RunFuncTestCase(BaseTestCase): def run_python(self, code, **kwargs): diff --git a/Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst b/Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst new file mode 100644 index 00000000000000..f6aa592cefda35 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst @@ -0,0 +1,4 @@ +When :meth:`subprocess.Popen.communicate` was called with *input* and a +*timeout* and is called for a second time after a +:exc:`~subprocess.TimeoutExpired` exception before the process has died, it +should no longer hang. From c7f741100b53d064d995c13072cb439f8c34ed64 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 07:47:04 +0100 Subject: [PATCH 1503/1674] [3.14] gh-87512: Fix `subprocess` using `timeout=` on Windows blocking with a large `input=` (GH-142058) (#142068) gh-87512: Fix `subprocess` using `timeout=` on Windows blocking with a large `input=` (GH-142058) On Windows, Popen._communicate() previously wrote to stdin synchronously, which could block indefinitely if the subprocess didn't consume input= quickly and the pipe buffer filled up. The timeout= parameter was only checked when joining the reader threads, not during the stdin write. This change moves the Windows stdin writing to a background thread (similar to how stdout/stderr are read in threads), allowing the timeout to be properly enforced. If timeout expires, TimeoutExpired is raised promptly and the writer thread continues in the background. Subsequent calls to communicate() will join the existing writer thread. Adds test_communicate_timeout_large_input to verify that TimeoutExpired is raised promptly when communicate() is called with large input and a timeout, even when the subprocess doesn't consume stdin quickly. This test already passed on POSIX (where select() is used) but failed on Windows where the stdin write blocks without checking the timeout. (cherry picked from commit 5b1862bdd8021b5295df95d730c2d2efa827fa88) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> --- Lib/subprocess.py | 23 +++++++- Lib/test/test_subprocess.py | 56 +++++++++++++++++++ ...5-11-29-03-02-45.gh-issue-87512.bn4xbm.rst | 5 ++ 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 301133e9e9c712..7c7ee51f514ed1 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1614,6 +1614,10 @@ def _readerthread(self, fh, buffer): fh.close() + def _writerthread(self, input): + self._stdin_write(input) + + def _communicate(self, input, endtime, orig_timeout): # Start reader threads feeding into a list hanging off of this # object, unless they've already been started. @@ -1632,8 +1636,23 @@ def _communicate(self, input, endtime, orig_timeout): self.stderr_thread.daemon = True self.stderr_thread.start() - if self.stdin: - self._stdin_write(input) + # Start writer thread to send input to stdin, unless already + # started. The thread writes input and closes stdin when done, + # or continues in the background on timeout. + if self.stdin and not hasattr(self, "_stdin_thread"): + self._stdin_thread = \ + threading.Thread(target=self._writerthread, + args=(input,)) + self._stdin_thread.daemon = True + self._stdin_thread.start() + + # Wait for the writer thread, or time out. If we time out, the + # thread remains writing and the fd left open in case the user + # calls communicate again. + if hasattr(self, "_stdin_thread"): + self._stdin_thread.join(self._remaining_time(endtime)) + if self._stdin_thread.is_alive(): + raise TimeoutExpired(self.args, orig_timeout) # Wait for the reader threads, or time out. If we time out, the # threads remain reading and the fds left open in case the user diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 5e73810dcb7253..b869e30135e02b 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1034,6 +1034,62 @@ def test_communicate_timeout_large_output(self): (stdout, _) = p.communicate() self.assertEqual(len(stdout), 4 * 64 * 1024) + def test_communicate_timeout_large_input(self): + # Test that timeout is enforced when writing large input to a + # slow-to-read subprocess, and that partial input is preserved + # for continuation after timeout (gh-141473). + # + # This is a regression test for Windows matching POSIX behavior. + # On POSIX, select() is used to multiplex I/O with timeout checking. + # On Windows, stdin writing must also honor the timeout rather than + # blocking indefinitely when the pipe buffer fills. + + # Input larger than typical pipe buffer (4-64KB on Windows) + input_data = b"x" * (128 * 1024) + + p = subprocess.Popen( + [sys.executable, "-c", + "import sys, time; " + "time.sleep(30); " # Don't read stdin for a long time + "sys.stdout.buffer.write(sys.stdin.buffer.read())"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + try: + timeout = 0.2 + start = time.monotonic() + try: + p.communicate(input_data, timeout=timeout) + # If we get here without TimeoutExpired, the timeout was ignored + elapsed = time.monotonic() - start + self.fail( + f"TimeoutExpired not raised. communicate() completed in " + f"{elapsed:.2f}s, but subprocess sleeps for 30s. " + "Stdin writing blocked without enforcing timeout.") + except subprocess.TimeoutExpired: + elapsed = time.monotonic() - start + + # Timeout should occur close to the specified timeout value, + # not after waiting for the subprocess to finish sleeping. + # Allow generous margin for slow CI, but must be well under + # the subprocess sleep time. + self.assertLess(elapsed, 5.0, + f"TimeoutExpired raised after {elapsed:.2f}s; expected ~{timeout}s. " + "Stdin writing blocked without checking timeout.") + + # After timeout, continue communication. The remaining input + # should be sent and we should receive all data back. + stdout, stderr = p.communicate() + + # Verify all input was eventually received by the subprocess + self.assertEqual(len(stdout), len(input_data), + f"Expected {len(input_data)} bytes output but got {len(stdout)}") + self.assertEqual(stdout, input_data) + finally: + p.kill() + p.wait() + # Test for the fd leak reported in http://bugs.python.org/issue2791. def test_communicate_pipe_fd_leak(self): for stdin_pipe in (False, True): diff --git a/Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst b/Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst new file mode 100644 index 00000000000000..091350108eea1b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst @@ -0,0 +1,5 @@ +Fix :func:`subprocess.Popen.communicate` timeout handling on Windows +when writing large input. Previously, the timeout was ignored during +stdin writing, causing the method to block indefinitely if the child +process did not consume input quickly. The stdin write is now performed +in a background thread, allowing the timeout to be properly enforced. From 6b799e15918a6fc60a38041994ef51e1f33b87fa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:03:05 +0100 Subject: [PATCH 1504/1674] [3.14] gh-74389: gh-70560: subprocess.Popen.communicate() now ignores stdin.flush error when closed (GH-142061) (#142064) gh-74389: gh-70560: subprocess.Popen.communicate() now ignores stdin.flush error when closed (GH-142061) gh-70560: gh-74389: subprocess.Popen.communicate() now ignores stdin.flush error when closed with a unittest and news entry. (cherry picked from commit 923056b2d41c4c28ad9163901053cd3824d775c5) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/subprocess.py | 4 ++++ Lib/test/test_subprocess.py | 13 +++++++++++++ .../2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 7c7ee51f514ed1..6911cd8e85973d 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -2097,6 +2097,10 @@ def _communicate(self, input, endtime, orig_timeout): self.stdin.flush() except BrokenPipeError: pass # communicate() must ignore BrokenPipeError. + except ValueError: + # ignore ValueError: I/O operation on closed file. + if not self.stdin.closed: + raise if not input: try: self.stdin.close() diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index b869e30135e02b..806a1e3fa303eb 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1160,6 +1160,19 @@ def test_writes_before_communicate(self): self.assertEqual(stdout, b"bananasplit") self.assertEqual(stderr, b"") + def test_communicate_stdin_closed_before_call(self): + # gh-70560, gh-74389: stdin.close() before communicate() + # should not raise ValueError from stdin.flush() + with subprocess.Popen([sys.executable, "-c", + 'import sys; sys.exit(0)'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) as p: + p.stdin.close() # Close stdin before communicate + # This should not raise ValueError + (stdout, stderr) = p.communicate() + self.assertEqual(p.returncode, 0) + def test_universal_newlines_and_text(self): args = [ sys.executable, "-c", diff --git a/Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst b/Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst new file mode 100644 index 00000000000000..a9bf5f80d80c9f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst @@ -0,0 +1,3 @@ +When the stdin being used by a :class:`subprocess.Popen` instance is closed, +this is now ignored in :meth:`subprocess.Popen.communicate` instead of +leaving the class in an inconsistent state. From 3d8ad2d3661b6bf3bb2b7eb812e26ddc08e861e3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:14:02 +0100 Subject: [PATCH 1505/1674] [3.14] gh-141994: Warn of XXE vulnerability in documentation of SAX feature `xml.sax.handler.feature_external_ges` (GH-141996) (#142072) gh-141994: Warn of XXE vulnerability in documentation of SAX feature `xml.sax.handler.feature_external_ges` (GH-141996) Doc/library/xml.sax.handler.rst: Warn of XXE with feature_external_ges Related to commit baa9f338971c6a13433a8232db77cd45e6b87b77 (cherry picked from commit 440bcb94560937888cd9bcb28a138acc2c6a6cbc) Co-authored-by: Sebastian Pipping <sebastian@pipping.org> --- Doc/library/xml.sax.handler.rst | 8 ++++++++ .../2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst diff --git a/Doc/library/xml.sax.handler.rst b/Doc/library/xml.sax.handler.rst index 38ca4507d81e76..f1af7253e437b4 100644 --- a/Doc/library/xml.sax.handler.rst +++ b/Doc/library/xml.sax.handler.rst @@ -96,6 +96,14 @@ for the feature and property names. .. data:: feature_external_ges + .. warning:: + + Enabling opens a vulnerability to + `external entity attacks <https://en.wikipedia.org/wiki/XML_external_entity_attack>`_ + if the parser is used with user-provided XML content. + Please reflect on your `threat model <https://en.wikipedia.org/wiki/Threat_model>`_ + before enabling this feature. + | value: ``"http://xml.org/sax/features/external-general-entities"`` | true: Include all external general (text) entities. | false: Do not include external general entities. diff --git a/Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst b/Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst new file mode 100644 index 00000000000000..c370e8a86e1766 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst @@ -0,0 +1,4 @@ +:mod:`xml.sax.handler`: Make Documentation of +:data:`xml.sax.handler.feature_external_ges` warn of opening up to `external +entity attacks <https://en.wikipedia.org/wiki/XML_external_entity_attack>`_. +Patch by Sebastian Pipping. From 23d771a5de04fe05e43021d48ae8219a224132ed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:17:39 +0100 Subject: [PATCH 1506/1674] [3.14] Docs: multi-disk ZIP files -> multipart ZIP files (GH-141962) (#142074) Docs: multi-disk ZIP files -> multipart ZIP files (GH-141962) * Remove some old currentlies * multi-disk -> multipart * Sentence case headings (cherry picked from commit 890fe5aad55d4f28cda56834f9457ff79e9e8c60) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/zipfile.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 5a8bbc8c1aedf7..ae4e25b13b92cd 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -16,10 +16,10 @@ provides tools to create, read, write, append, and list a ZIP file. Any advanced use of this module will require an understanding of the format, as defined in `PKZIP Application Note`_. -This module does not currently handle multi-disk ZIP files. +This module does not handle multipart ZIP files. It can handle ZIP files that use the ZIP64 extensions (that is ZIP files that are more than 4 GiB in size). It supports -decryption of encrypted files in ZIP archives, but it currently cannot +decryption of encrypted files in ZIP archives, but it cannot create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. @@ -175,7 +175,7 @@ The module defines the following items: .. _zipfile-objects: -ZipFile Objects +ZipFile objects --------------- @@ -248,7 +248,7 @@ ZipFile Objects .. note:: *metadata_encoding* is an instance-wide setting for the ZipFile. - It is not currently possible to set this on a per-member basis. + It is not possible to set this on a per-member basis. This attribute is a workaround for legacy implementations which produce archives with names in the current locale encoding or code page (mostly @@ -571,7 +571,7 @@ The following data attributes are also available: .. _path-objects: -Path Objects +Path objects ------------ .. class:: Path(root, at='') @@ -707,7 +707,7 @@ changes. .. _pyzipfile-objects: -PyZipFile Objects +PyZipFile objects ----------------- The :class:`PyZipFile` constructor takes the same parameters as the @@ -784,7 +784,7 @@ The :class:`PyZipFile` constructor takes the same parameters as the .. _zipinfo-objects: -ZipInfo Objects +ZipInfo objects --------------- Instances of the :class:`ZipInfo` class are returned by the :meth:`.getinfo` and @@ -954,7 +954,7 @@ Instances have the following methods and attributes: .. _zipfile-commandline: .. program:: zipfile -Command-Line Interface +Command-line interface ---------------------- The :mod:`zipfile` module provides a simple command-line interface to interact @@ -1029,7 +1029,7 @@ From file itself Decompression may fail due to incorrect password / CRC checksum / ZIP format or unsupported compression method / decryption. -File System limitations +File system limitations ~~~~~~~~~~~~~~~~~~~~~~~ Exceeding limitations on different file systems can cause decompression failed. From 20b910ca8b6b1ad4593411999832f7e1c563acb9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:25:46 +0100 Subject: [PATCH 1507/1674] [3.14] Fix multiprocessing queue test_get() (GH-142024) (#142070) Fix multiprocessing queue test_get() (GH-142024) * Replace sleep() with support.sleeping_retry(). * Test get_nowait() first. * Restore previously disabled test. Fix the failure: FAIL: test_get (test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_get) ---------------------------------------------------------------------- Traceback (most recent call last): File "Lib/test/_test_multiprocessing.py", line 1208, in test_get self.assertEqual(queue_empty(queue), False) ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError: True != False (cherry picked from commit 5e749d3743621be4c8bf5618ed3249e9fde9a599) Co-authored-by: Victor Stinner <vstinner@python.org> --- Lib/test/_test_multiprocessing.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index d5cd25a7980468..1a188daa003b85 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -1180,7 +1180,7 @@ def test_put(self): @classmethod def _test_get(cls, queue, child_can_start, parent_can_continue): child_can_start.wait() - #queue.put(1) + queue.put(1) queue.put(2) queue.put(3) queue.put(4) @@ -1204,15 +1204,16 @@ def test_get(self): child_can_start.set() parent_can_continue.wait() - time.sleep(DELTA) + for _ in support.sleeping_retry(support.SHORT_TIMEOUT): + if not queue_empty(queue): + break self.assertEqual(queue_empty(queue), False) - # Hangs unexpectedly, remove for now - #self.assertEqual(queue.get(), 1) + self.assertEqual(queue.get_nowait(), 1) self.assertEqual(queue.get(True, None), 2) self.assertEqual(queue.get(True), 3) self.assertEqual(queue.get(timeout=1), 4) - self.assertEqual(queue.get_nowait(), 5) + self.assertEqual(queue.get(), 5) self.assertEqual(queue_empty(queue), True) From d8a72b4c5eddd9bbcb6532a2cbd3eca8d2e55e99 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:28:50 +0100 Subject: [PATCH 1508/1674] [3.14] GH-141963: Clarify argparse documentation (GH-141964) (#142076) GH-141963: Clarify argparse documentation (GH-141964) Clarify argparse documentation Tightens the phrasing for several argparse actions. (cherry picked from commit cfcd52490d6531f3b0e8ddd4bb2b40fb6baee854) Co-authored-by: Moshe Kaplan <mosheekaplan@gmail.com> --- Doc/library/argparse.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 2dca4a71a5361a..b8ecbf3e584630 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -768,9 +768,9 @@ how the command-line arguments should be handled. The supplied actions are: Namespace(foo=42) * ``'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:: + ``'store_const'`` that respectively store the values ``True`` and ``False`` + with default values of ``False`` and + ``True``:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') @@ -790,8 +790,8 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['0', '1', '2']) -* ``'append_const'`` - This stores a list, and appends the value specified by - the const_ keyword argument to the list; note that the const_ keyword +* ``'append_const'`` - This appends the value specified by + the const_ keyword argument to a list; note that the const_ keyword argument defaults to ``None``. The ``'append_const'`` action is typically useful when multiple arguments need to store constants to the same list. For example:: @@ -802,8 +802,8 @@ 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. +* ``'extend'`` - This appends each item from a multi-value + argument to a list. The ``'extend'`` action is typically used with the nargs_ keyword argument value ``'+'`` or ``'*'``. Note that when nargs_ is ``None`` (the default) or ``'?'``, each @@ -817,7 +817,7 @@ how the command-line arguments should be handled. The supplied actions are: .. versionadded:: 3.8 -* ``'count'`` - This counts the number of times a keyword argument occurs. For +* ``'count'`` - This counts the number of times an argument occurs. For example, this is useful for increasing verbosity levels:: >>> parser = argparse.ArgumentParser() From f7d17ac9f8b570a9900456a29b46639f02c03d16 Mon Sep 17 00:00:00 2001 From: Itamar Oren <itamarost@gmail.com> Date: Fri, 28 Nov 2025 23:30:57 -0800 Subject: [PATCH 1509/1674] [3.14] gh-140011: Delete importdl assertion that prevents importing embedded modules from packages (GH-141605) (#141986) gh-140011: Delete importdl assertion that prevents importing embedded modules from packages (GH-141605) (cherry picked from commit 27f62eb711720c215f9798ae30728ee5a1b4d442) --- Lib/test/test_embed.py | 38 +++++++++ Programs/_testembed.c | 174 ++++++++++++++++++++++++++++++++++++++++- Python/importdl.c | 1 - 3 files changed, 211 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 95b2d80464c349..a4a328aa3dde24 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -239,6 +239,26 @@ def test_repeated_init_and_inittab(self): lines = "\n".join(lines) + "\n" self.assertEqual(out, lines) + def test_inittab_submodule_multiphase(self): + out, err = self.run_embedded_interpreter("test_inittab_submodule_multiphase") + self.assertEqual(err, "") + self.assertEqual(out, + "<module 'mp_pkg.mp_submod' (built-in)>\n" + "<module 'mp_pkg.mp_submod' (built-in)>\n" + "Hello from sub-module\n" + "mp_pkg.mp_submod.mp_submod_exec_slot_ran='yes'\n" + "mp_pkg.mp_pkg_exec_slot_ran='yes'\n" + ) + + def test_inittab_submodule_singlephase(self): + out, err = self.run_embedded_interpreter("test_inittab_submodule_singlephase") + self.assertEqual(self._nogil_filtered_err(err, "sp_pkg"), "") + self.assertEqual(out, + "<module 'sp_pkg.sp_submod' (built-in)>\n" + "<module 'sp_pkg.sp_submod' (built-in)>\n" + "Hello from sub-module\n" + ) + def test_forced_io_encoding(self): # Checks forced configuration of embedded interpreter IO streams env = dict(os.environ, PYTHONIOENCODING="utf-8:surrogateescape") @@ -516,6 +536,24 @@ def test_getargs_reset_static_parser(self): out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) self.assertEqual(out, '1\n2\n3\n' * INIT_LOOPS) + @staticmethod + def _nogil_filtered_err(err: str, mod_name: str) -> str: + if not support.Py_GIL_DISABLED: + return err + + # the test imports a singlephase init extension, so it emits a warning + # under the free-threaded build + expected_runtime_warning = ( + "RuntimeWarning: The global interpreter lock (GIL)" + f" has been enabled to load module '{mod_name}'" + ) + filtered_err_lines = [ + line + for line in err.strip().splitlines() + if expected_runtime_warning not in line + ] + return "\n".join(filtered_err_lines) + def config_dev_mode(preconfig, config): preconfig['allocator'] = PYMEM_ALLOCATOR_DEBUG diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6958a1679a2a0c..3256464b7b8219 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -2276,6 +2276,177 @@ static int test_repeated_init_and_inittab(void) return 0; } +/// Multi-phase initialization package & submodule /// + +int +mp_pkg_exec(PyObject *mod) +{ + // make this a namespace package + // empty list = namespace package + if (PyModule_Add(mod, "__path__", PyList_New(0)) < 0) { + return -1; + } + if (PyModule_AddStringConstant(mod, "mp_pkg_exec_slot_ran", "yes") < 0) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot mp_pkg_slots[] = { + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, + {Py_mod_exec, mp_pkg_exec}, + {0, NULL} +}; + +static struct PyModuleDef mp_pkg_def = { + PyModuleDef_HEAD_INIT, + .m_name = "mp_pkg", + .m_size = 0, + .m_slots = mp_pkg_slots, +}; + +PyMODINIT_FUNC +PyInit_mp_pkg(void) +{ + return PyModuleDef_Init(&mp_pkg_def); +} + +static PyObject * +submod_greet(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return PyUnicode_FromString("Hello from sub-module"); +} + +static PyMethodDef submod_methods[] = { + {"greet", submod_greet, METH_NOARGS, NULL}, + {NULL}, +}; + +int +mp_submod_exec(PyObject *mod) +{ + return PyModule_AddStringConstant(mod, "mp_submod_exec_slot_ran", "yes"); +} + +static PyModuleDef_Slot mp_submod_slots[] = { + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, + {Py_mod_exec, mp_submod_exec}, + {0, NULL} +}; + +static struct PyModuleDef mp_submod_def = { + PyModuleDef_HEAD_INIT, + .m_name = "mp_pkg.mp_submod", + .m_size = 0, + .m_methods = submod_methods, + .m_slots = mp_submod_slots, +}; + +PyMODINIT_FUNC +PyInit_mp_submod(void) +{ + return PyModuleDef_Init(&mp_submod_def); +} + +static int +test_inittab_submodule_multiphase(void) +{ + wchar_t* argv[] = { + PROGRAM_NAME, + L"-c", + L"import sys;" + L"import mp_pkg.mp_submod;" + L"print(mp_pkg.mp_submod);" + L"print(sys.modules['mp_pkg.mp_submod']);" + L"print(mp_pkg.mp_submod.greet());" + L"print(f'{mp_pkg.mp_submod.mp_submod_exec_slot_ran=}');" + L"print(f'{mp_pkg.mp_pkg_exec_slot_ran=}');" + }; + PyConfig config; + if (PyImport_AppendInittab("mp_pkg", + &PyInit_mp_pkg) != 0) { + fprintf(stderr, "PyImport_AppendInittab() failed\n"); + return 1; + } + if (PyImport_AppendInittab("mp_pkg.mp_submod", + &PyInit_mp_submod) != 0) { + fprintf(stderr, "PyImport_AppendInittab() failed\n"); + return 1; + } + PyConfig_InitPythonConfig(&config); + config.isolated = 1; + config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); + init_from_config_clear(&config); + return Py_RunMain(); +} + +/// Single-phase initialization package & submodule /// + +static struct PyModuleDef sp_pkg_def = { + PyModuleDef_HEAD_INIT, + .m_name = "sp_pkg", + .m_size = 0, +}; + +PyMODINIT_FUNC +PyInit_sp_pkg(void) +{ + PyObject *mod = PyModule_Create(&sp_pkg_def); + if (mod == NULL) { + return NULL; + } + // make this a namespace package + // empty list = namespace package + if (PyModule_Add(mod, "__path__", PyList_New(0)) < 0) { + Py_DECREF(mod); + return NULL; + } + return mod; +} + +static struct PyModuleDef sp_submod_def = { + PyModuleDef_HEAD_INIT, + .m_name = "sp_pkg.sp_submod", + .m_size = 0, + .m_methods = submod_methods, +}; + +PyMODINIT_FUNC +PyInit_sp_submod(void) +{ + return PyModule_Create(&sp_submod_def); +} + +static int +test_inittab_submodule_singlephase(void) +{ + wchar_t* argv[] = { + PROGRAM_NAME, + L"-c", + L"import sys;" + L"import sp_pkg.sp_submod;" + L"print(sp_pkg.sp_submod);" + L"print(sys.modules['sp_pkg.sp_submod']);" + L"print(sp_pkg.sp_submod.greet());" + }; + PyConfig config; + if (PyImport_AppendInittab("sp_pkg", + &PyInit_sp_pkg) != 0) { + fprintf(stderr, "PyImport_AppendInittab() failed\n"); + return 1; + } + if (PyImport_AppendInittab("sp_pkg.sp_submod", + &PyInit_sp_submod) != 0) { + fprintf(stderr, "PyImport_AppendInittab() failed\n"); + return 1; + } + PyConfig_InitPythonConfig(&config); + config.isolated = 1; + config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); + init_from_config_clear(&config); + return Py_RunMain(); +} + static void wrap_allocator(PyMemAllocatorEx *allocator); static void unwrap_allocator(PyMemAllocatorEx *allocator); @@ -2433,7 +2604,8 @@ static struct TestCase TestCases[] = { {"test_frozenmain", test_frozenmain}, #endif {"test_get_incomplete_frame", test_get_incomplete_frame}, - + {"test_inittab_submodule_multiphase", test_inittab_submodule_multiphase}, + {"test_inittab_submodule_singlephase", test_inittab_submodule_singlephase}, {NULL, NULL} }; diff --git a/Python/importdl.c b/Python/importdl.c index 802843fe7b9dce..98e71e643ef331 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -175,7 +175,6 @@ _Py_ext_module_loader_info_init_for_builtin( PyObject *name) { assert(PyUnicode_Check(name)); - assert(PyUnicode_FindChar(name, '.', 0, PyUnicode_GetLength(name), -1) == -1); assert(PyUnicode_GetLength(name) > 0); PyObject *name_encoded = PyUnicode_AsEncodedString(name, "ascii", NULL); From fed2af6f9ea7f3cece57947c988f382f3309f6cb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 08:34:36 +0100 Subject: [PATCH 1510/1674] [3.14] GH-91636: Clear weakrefs created by finalizers. (GH-136401) (#141993) GH-91636: Clear weakrefs created by finalizers. (GH-136401) Weakrefs to unreachable garbage that are created during running of finalizers need to be cleared. This avoids exposing objects that have `tp_clear` called on them to Python-level code. (cherry picked from commit b6b99bf7f1edab77c485faf4e23da868f3a7b68c) Co-authored-by: Neil Schemenauer <nas-github@arctrix.com> --- Lib/test/test_gc.py | 20 +++++++++------ ...5-07-07-17-26-06.gh-issue-91636.GyHU72.rst | 3 +++ Python/gc.c | 25 ++++++++++++++++--- Python/gc_free_threading.c | 20 ++++++++++++--- 4 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index a6adc2c98514ba..7fd339f1ad7184 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -262,9 +262,11 @@ class Cyclic(tuple): # finalizer. def __del__(self): - # 5. Create a weakref to `func` now. If we had created - # it earlier, it would have been cleared by the - # garbage collector before calling the finalizers. + # 5. Create a weakref to `func` now. In previous + # versions of Python, this would avoid having it + # cleared by the garbage collector before calling + # the finalizers. Now, weakrefs get cleared after + # calling finalizers. self[1].ref = weakref.ref(self[0]) # 6. Drop the global reference to `latefin`. The only @@ -293,14 +295,18 @@ def func(): # which will find `cyc` and `func` as garbage. gc.collect() - # 9. Previously, this would crash because `func_qualname` - # had been NULL-ed out by func_clear(). + # 9. Previously, this would crash because the weakref + # created in the finalizer revealed the function after + # `tp_clear` was called and `func_qualname` + # had been NULL-ed out by func_clear(). Now, we clear + # weakrefs to unreachable objects before calling `tp_clear` + # but after calling finalizers. print(f"{func=}") """ - # We're mostly just checking that this doesn't crash. rc, stdout, stderr = assert_python_ok("-c", code) self.assertEqual(rc, 0) - self.assertRegex(stdout, rb"""\A\s*func=<function at \S+>\s*\z""") + # The `func` global is None because the weakref was cleared. + self.assertRegex(stdout, rb"""\A\s*func=None""") self.assertFalse(stderr) @refcount_test diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst new file mode 100644 index 00000000000000..09c192f9c5657e --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst @@ -0,0 +1,3 @@ +While performing garbage collection, clear weakrefs to unreachable objects +that are created during running of finalizers. If those weakrefs were are +not cleared, they could reveal unreachable objects. diff --git a/Python/gc.c b/Python/gc.c index c87d714ce4cfb1..c134dc57e28f6d 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -870,7 +870,7 @@ move_legacy_finalizer_reachable(PyGC_Head *finalizers) * no object in `unreachable` is weakly referenced anymore. */ static int -handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) +handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old, bool allow_callbacks) { PyGC_Head *gc; PyObject *op; /* generally FROM_GC(gc) */ @@ -879,7 +879,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) PyGC_Head *next; int num_freed = 0; - gc_list_init(&wrcb_to_call); + if (allow_callbacks) { + gc_list_init(&wrcb_to_call); + } /* Clear all weakrefs to the objects in unreachable. If such a weakref * also has a callback, move it into `wrcb_to_call` if the callback @@ -935,6 +937,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) _PyObject_ASSERT((PyObject *)wr, wr->wr_object == op); _PyWeakref_ClearRef(wr); _PyObject_ASSERT((PyObject *)wr, wr->wr_object == Py_None); + + if (!allow_callbacks) { + continue; + } + if (wr->wr_callback == NULL) { /* no callback */ continue; @@ -987,6 +994,10 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) } } + if (!allow_callbacks) { + return 0; + } + /* Invoke the callbacks we decided to honor. It's safe to invoke them * because they can't reference unreachable objects. */ @@ -1739,7 +1750,7 @@ gc_collect_region(PyThreadState *tstate, } /* Clear weakrefs and invoke callbacks as necessary. */ - stats->collected += handle_weakrefs(&unreachable, to); + stats->collected += handle_weakrefs(&unreachable, to, true); gc_list_validate_space(to, gcstate->visited_space); validate_list(to, collecting_clear_unreachable_clear); validate_list(&unreachable, collecting_set_unreachable_clear); @@ -1753,6 +1764,14 @@ gc_collect_region(PyThreadState *tstate, gc_list_init(&final_unreachable); handle_resurrected_objects(&unreachable, &final_unreachable, to); + /* Clear weakrefs to objects in the unreachable set. No Python-level + * code must be allowed to access those unreachable objects. During + * delete_garbage(), finalizers outside the unreachable set might run + * and create new weakrefs. If those weakrefs were not cleared, they + * could reveal unreachable objects. Callbacks are not executed. + */ + handle_weakrefs(&final_unreachable, NULL, false); + /* Call tp_clear on objects in the final_unreachable set. This will cause * the reference cycles to be broken. It may also cause some objects * in finalizers to be freed. diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 94c77991f5f45b..43add9bc8b7eda 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -1493,9 +1493,9 @@ move_legacy_finalizer_reachable(struct collection_state *state) } // Clear all weakrefs to unreachable objects. Weakrefs with callbacks are -// enqueued in `wrcb_to_call`, but not invoked yet. +// optionally enqueued in `wrcb_to_call`, but not invoked yet. static void -clear_weakrefs(struct collection_state *state) +clear_weakrefs(struct collection_state *state, bool enqueue_callbacks) { PyObject *op; WORKSTACK_FOR_EACH(&state->unreachable, op) { @@ -1527,6 +1527,10 @@ clear_weakrefs(struct collection_state *state) _PyWeakref_ClearRef(wr); _PyObject_ASSERT((PyObject *)wr, wr->wr_object == Py_None); + if (!enqueue_callbacks) { + continue; + } + // We do not invoke callbacks for weakrefs that are themselves // unreachable. This is partly for historical reasons: weakrefs // predate safe object finalization, and a weakref that is itself @@ -2212,7 +2216,7 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, interp->gc.long_lived_total = state->long_lived_total; // Clear weakrefs and enqueue callbacks (but do not call them). - clear_weakrefs(state); + clear_weakrefs(state, true); _PyEval_StartTheWorld(interp); // Deallocate any object from the refcount merge step @@ -2223,11 +2227,19 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, call_weakref_callbacks(state); finalize_garbage(state); - // Handle any objects that may have resurrected after the finalization. _PyEval_StopTheWorld(interp); + // Handle any objects that may have resurrected after the finalization. err = handle_resurrected_objects(state); // Clear free lists in all threads _PyGC_ClearAllFreeLists(interp); + if (err == 0) { + // Clear weakrefs to objects in the unreachable set. No Python-level + // code must be allowed to access those unreachable objects. During + // delete_garbage(), finalizers outside the unreachable set might + // run and create new weakrefs. If those weakrefs were not cleared, + // they could reveal unreachable objects. + clear_weakrefs(state, false); + } _PyEval_StartTheWorld(interp); if (err < 0) { From 612213c0f4928968c3f4ea3a369336aed54d2b05 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 15:56:29 +0100 Subject: [PATCH 1511/1674] [3.14] GH-121970: Remove Docutils list monkeypatch (GH-142056) (#142088) --- Doc/howto/functional.rst | 2 +- Doc/library/decimal.rst | 40 +++++++++++++++--------------- Doc/library/ssl.rst | 8 +++--- Doc/tools/extensions/pyspecific.py | 8 ------ Doc/whatsnew/3.4.rst | 2 +- 5 files changed, 26 insertions(+), 34 deletions(-) diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index b0b2414a1a02c8..320dcf7eaca113 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -4,7 +4,7 @@ Functional Programming HOWTO ******************************** -:Author: A. M. Kuchling +:Author: \A. M. Kuchling :Release: 0.32 In this document, we'll take a tour of Python's features suitable for diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 8d3223e89d96c7..08e87e29cd7ce6 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -2100,20 +2100,20 @@ to work with the :class:`Decimal` class:: Decimal FAQ ----------- -Q. It is cumbersome to type ``decimal.Decimal('1234.5')``. Is there a way to +Q: It is cumbersome to type ``decimal.Decimal('1234.5')``. Is there a way to minimize typing when using the interactive interpreter? -A. Some users abbreviate the constructor to just a single letter: +A: Some users abbreviate the constructor to just a single letter: >>> D = decimal.Decimal >>> D('1.23') + D('3.45') Decimal('4.68') -Q. In a fixed-point application with two decimal places, some inputs have many +Q: In a fixed-point application with two decimal places, some inputs have many places and need to be rounded. Others are not supposed to have excess digits and need to be validated. What methods should be used? -A. The :meth:`~Decimal.quantize` method rounds to a fixed number of decimal places. If +A: The :meth:`~Decimal.quantize` method rounds to a fixed number of decimal places. If the :const:`Inexact` trap is set, it is also useful for validation: >>> TWOPLACES = Decimal(10) ** -2 # same as Decimal('0.01') @@ -2131,10 +2131,10 @@ the :const:`Inexact` trap is set, it is also useful for validation: ... Inexact: None -Q. Once I have valid two place inputs, how do I maintain that invariant +Q: Once I have valid two place inputs, how do I maintain that invariant throughout an application? -A. Some operations like addition, subtraction, and multiplication by an integer +A: Some operations like addition, subtraction, and multiplication by an integer will automatically preserve fixed point. Others operations, like division and non-integer multiplication, will change the number of decimal places and need to be followed-up with a :meth:`~Decimal.quantize` step: @@ -2166,21 +2166,21 @@ to handle the :meth:`~Decimal.quantize` step: >>> div(b, a) Decimal('0.03') -Q. There are many ways to express the same value. The numbers ``200``, +Q: There are many ways to express the same value. The numbers ``200``, ``200.000``, ``2E2``, and ``.02E+4`` all have the same value at various precisions. Is there a way to transform them to a single recognizable canonical value? -A. The :meth:`~Decimal.normalize` method maps all equivalent values to a single +A: The :meth:`~Decimal.normalize` method maps all equivalent values to a single representative: >>> values = map(Decimal, '200 200.000 2E2 .02E+4'.split()) >>> [v.normalize() for v in values] [Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2'), Decimal('2E+2')] -Q. When does rounding occur in a computation? +Q: When does rounding occur in a computation? -A. It occurs *after* the computation. The philosophy of the decimal +A: It occurs *after* the computation. The philosophy of the decimal specification is that numbers are considered exact and are created independent of the current context. They can even have greater precision than current context. Computations process with those @@ -2198,10 +2198,10 @@ applied to the *result* of the computation:: >>> pi + 0 - Decimal('0.00005'). # Intermediate values are rounded Decimal('3.1416') -Q. Some decimal values always print with exponential notation. Is there a way +Q: Some decimal values always print with exponential notation. Is there a way to get a non-exponential representation? -A. For some values, exponential notation is the only way to express the number +A: For some values, exponential notation is the only way to express the number of significant places in the coefficient. For example, expressing ``5.0E+3`` as ``5000`` keeps the value constant but cannot show the original's two-place significance. @@ -2216,9 +2216,9 @@ value unchanged: >>> remove_exponent(Decimal('5E+3')) Decimal('5000') -Q. Is there a way to convert a regular float to a :class:`Decimal`? +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: @@ -2227,19 +2227,19 @@ suggest: >>> Decimal(math.pi) Decimal('3.141592653589793115997963468544185161590576171875') -Q. Within a complex calculation, how can I make sure that I haven't gotten a +Q: Within a complex calculation, how can I make sure that I haven't gotten a spurious result because of insufficient precision or rounding anomalies. -A. The decimal module makes it easy to test results. A best practice is to +A: The decimal module makes it easy to test results. A best practice is to re-run calculations using greater precision and with various rounding modes. Widely differing results indicate insufficient precision, rounding mode issues, ill-conditioned inputs, or a numerically unstable algorithm. -Q. I noticed that context precision is applied to the results of operations but +Q: I noticed that context precision is applied to the results of operations but not to the inputs. Is there anything to watch out for when mixing values of different precisions? -A. Yes. The principle is that all values are considered to be exact and so is +A: Yes. The principle is that all values are considered to be exact and so is the arithmetic on those values. Only the results are rounded. The advantage for inputs is that "what you type is what you get". A disadvantage is that the results can look odd if you forget that the inputs haven't been rounded: @@ -2267,9 +2267,9 @@ Alternatively, inputs can be rounded upon creation using the >>> Context(prec=5, rounding=ROUND_DOWN).create_decimal('1.2345678') Decimal('1.2345') -Q. Is the CPython implementation fast for large numbers? +Q: Is the CPython implementation fast for large numbers? -A. Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of +A: Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of the decimal module integrate the high speed `libmpdec <https://www.bytereef.org/mpdecimal/doc/libmpdec/index.html>`_ library for arbitrary precision correctly rounded decimal floating-point arithmetic [#]_. diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 7dc7840fbf77f4..93cdf6d85f01dd 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -2825,16 +2825,16 @@ of TLS/SSL. Some new TLS 1.3 features are not yet available. Steve Kent :rfc:`RFC 4086: Randomness Requirements for Security <4086>` - Donald E., Jeffrey I. Schiller + Donald E. Eastlake, Jeffrey I. Schiller, Steve Crocker :rfc:`RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile <5280>` - D. Cooper + David Cooper et al. :rfc:`RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 <5246>` - T. Dierks et. al. + Tim Dierks and Eric Rescorla. :rfc:`RFC 6066: Transport Layer Security (TLS) Extensions <6066>` - D. Eastlake + Donald E. Eastlake `IANA TLS: Transport Layer Security (TLS) Parameters <https://www.iana.org/assignments/tls-parameters/tls-parameters.xml>`_ IANA diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index fd6b8f95f736fd..aa1eb5cff9ac12 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -24,14 +24,6 @@ # Used in conf.py and updated here by python/release-tools/run_release.py SOURCE_URI = 'https://github.com/python/cpython/tree/3.14/%s' -# monkey-patch reST parser to disable alphabetic and roman enumerated lists -from docutils.parsers.rst.states import Body -Body.enum.converters['loweralpha'] = \ - Body.enum.converters['upperalpha'] = \ - Body.enum.converters['lowerroman'] = \ - Body.enum.converters['upperroman'] = lambda x: None - - class PyAwaitableMixin(object): def handle_signature(self, sig, signode): ret = super(PyAwaitableMixin, self).handle_signature(sig, signode) diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index 59afd6520c418f..9f4068116e3726 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -2,7 +2,7 @@ What's New In Python 3.4 **************************** -:Author: R. David Murray <rdmurray@bitdance.com> (Editor) +:Author: \R. David Murray <rdmurray@bitdance.com> (Editor) .. Rules for maintenance: From 85591009d141274d5a59a5fb7807076cbe943c29 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 16:15:25 +0100 Subject: [PATCH 1512/1674] [3.14] Docs: Prepare for Sphinx 9 (GH-142057) (#142091) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/howto/urllib2.rst | 2 +- Doc/library/socket.rst | 7 ++----- Doc/tools/extensions/glossary_search.py | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index d79d1abe8d0577..4e77d2cb407f72 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -15,7 +15,7 @@ Introduction You may also find useful the following article on fetching web resources with Python: - * `Basic Authentication <https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml>`_ + * `Basic Authentication <https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml>`__ A tutorial on *Basic Authentication*, with examples in Python. diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index bc89a3228f0ed9..782ea7d8fdaed2 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -2086,11 +2086,8 @@ to sockets. :attr:`socket.type`. -.. method:: socket.setsockopt(level, optname, value: int) -.. method:: socket.setsockopt(level, optname, value: buffer) - :noindex: -.. method:: socket.setsockopt(level, optname, None, optlen: int) - :noindex: +.. method:: socket.setsockopt(level, optname, value: int | Buffer) + socket.setsockopt(level, optname, None, optlen: int) .. index:: pair: module; struct diff --git a/Doc/tools/extensions/glossary_search.py b/Doc/tools/extensions/glossary_search.py index 502b6cd95bcb94..bcda4b7b435593 100644 --- a/Doc/tools/extensions/glossary_search.py +++ b/Doc/tools/extensions/glossary_search.py @@ -38,7 +38,7 @@ def process_glossary_nodes( rendered = app.builder.render_partial(definition) terms[term.lower()] = { 'title': term, - 'body': rendered['html_body'], + 'body': rendered['fragment'], } From 3d448061a18b7757bc227a761165122aa258362f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Nov 2025 22:09:19 +0100 Subject: [PATCH 1513/1674] [3.14] GH-141808: Do not generate the jit stencils twice in case of PGO builds on Windows. (GH-142043) (#142100) GH-141808: Do not generate the jit stencils twice in case of PGO builds on Windows. (GH-142043) * do not build the jit stencils twice in case of PGO builds on Windows * blurb it (cherry picked from commit f2ca1581cab2da45880198af1c924dd40ec8a10b) Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com> --- .../next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst | 1 + PCbuild/pyproject.props | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst diff --git a/Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst b/Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst new file mode 100644 index 00000000000000..3162c7c41418cc --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst @@ -0,0 +1 @@ +Do not generate the jit stencils twice in case of PGO builds on Windows. diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index cf35e705f355a7..53bfe5e3ea95cc 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -13,6 +13,7 @@ <GeneratedFrozenModulesDir>$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)_frozen\</GeneratedFrozenModulesDir> <GeneratedZlibNgDir>$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\zlib-ng\</GeneratedZlibNgDir> <GeneratedJitStencilsDir>$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)_$(Configuration)</GeneratedJitStencilsDir> + <GeneratedJitStencilsDir Condition="$(Configuration) == 'PGUpdate'">$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)_PGInstrument</GeneratedJitStencilsDir> <TargetName Condition="'$(TargetName)' == ''">$(ProjectName)</TargetName> <TargetName>$(TargetName)$(PyDebugExt)</TargetName> <GenerateManifest>false</GenerateManifest> From 1011c0c38f920d2a6d0625416fa4b5388208644b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:19:30 +0100 Subject: [PATCH 1514/1674] [3.14] gh-132795: Add docs for `multiprocessing.Semaphore.locked` (GH-133299) (#142111) Co-authored-by: Duprat <yduprat@gmail.com> --- Doc/library/multiprocessing.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 0d46a5dfc7466e..714207cb0aefcd 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1419,6 +1419,12 @@ object -- see :ref:`multiprocessing-managers`. A solitary difference from its close analog exists: its ``acquire`` method's first argument is named *block*, as is consistent with :meth:`Lock.acquire`. + .. method:: locked() + + Return a boolean indicating whether this object is locked right now. + + .. versionadded:: 3.14 + .. note:: On macOS, this is indistinguishable from :class:`Semaphore` because ``sem_getvalue()`` is not implemented on that platform. @@ -1571,6 +1577,12 @@ object -- see :ref:`multiprocessing-managers`. A solitary difference from its close analog exists: its ``acquire`` method's first argument is named *block*, as is consistent with :meth:`Lock.acquire`. + .. method:: locked() + + Return a boolean indicating whether this object is locked right now. + + .. versionadded:: 3.14 + .. note:: On macOS, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with From 848a2ebe53c2c2475472459b4a3cf484e692f359 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:30:56 +0100 Subject: [PATCH 1515/1674] [3.14] gh-136063: fix quadratic-complexity parsing in `email.message._parseparam` (GH-136072) (#140827) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/email/message.py | 26 ++++++++++++------- Lib/test/test_email/test_email.py | 21 +++++++++++++++ ...-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst | 2 ++ 3 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst diff --git a/Lib/email/message.py b/Lib/email/message.py index 2505d17ef15e69..641fb2e944d431 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -74,19 +74,25 @@ def _parseparam(s): # RDM This might be a Header, so for now stringify it. s = ';' + str(s) plist = [] - 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) + start = 0 + while s.find(';', start) == start: + start += 1 + end = s.find(';', start) + ind, diff = start, 0 + while end > 0: + diff += s.count('"', ind, end) - s.count('\\"', ind, end) + if diff % 2 == 0: + break + end, ind = ind, s.find(';', end + 1) if end < 0: end = len(s) - f = s[:end] - if '=' in f: - i = f.index('=') - f = f[:i].strip().lower() + '=' + f[i+1:].strip() + i = s.find('=', start, end) + if i == -1: + f = s[start:end] + else: + f = s[start:i].rstrip().lower() + '=' + s[i+1:end].lstrip() plist.append(f.strip()) - s = s[end:] + start = end return plist diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 9f2dc1bb7e6c9a..4cd587bcd76040 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -481,6 +481,27 @@ def test_get_param_with_quotes(self): "Content-Type: foo; bar*0=\"baz\\\"foobar\"; bar*1=\"\\\"baz\"") self.assertEqual(msg.get_param('bar'), 'baz"foobar"baz') + def test_get_param_linear_complexity(self): + # Ensure that email.message._parseparam() is fast. + # See https://github.com/python/cpython/issues/136063. + N = 100_000 + for s, r in [ + ("", ""), + ("foo=bar", "foo=bar"), + (" FOO = bar ", "foo=bar"), + ]: + with self.subTest(s=s, r=r, N=N): + src = f'{s};' * (N - 1) + s + res = email.message._parseparam(src) + self.assertEqual(len(res), N) + self.assertEqual(len(set(res)), 1) + self.assertEqual(res[0], r) + + # This will be considered as a single parameter. + malformed = 's="' + ';' * (N - 1) + res = email.message._parseparam(malformed) + self.assertEqual(res, [malformed]) + def test_field_containment(self): msg = email.message_from_string('Header: exists') self.assertIn('header', msg) diff --git a/Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst b/Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst new file mode 100644 index 00000000000000..940a3ad5a72f68 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst @@ -0,0 +1,2 @@ +:mod:`email.message`: ensure linear complexity for legacy HTTP parameters +parsing. Patch by Bénédikt Tran. From 212b096b2ae0625346bfca3eaf03dce80788ef57 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:32:11 +0100 Subject: [PATCH 1516/1674] [3.14] gh-140042: Removing unsafe call to sqlite3_shutdown (GH-141690) (#141793) Co-authored-by: Prithviraj Chaudhuri <p.chaudhuri1993@gmail.com> --- .../next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst | 1 + Modules/_sqlite/module.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst diff --git a/Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst b/Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst new file mode 100644 index 00000000000000..608e806b431372 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst @@ -0,0 +1 @@ +Removed the sqlite3_shutdown call that could cause closing connections for sqlite when used with multiple sub interpreters. diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 27e8dab92e0e67..fcc1d69c707ebe 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -745,7 +745,6 @@ module_exec(PyObject *module) return 0; error: - sqlite3_shutdown(); return -1; } From 58c0af99848e5ddf2e8471af11ff2f8c6a1a221c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:34:12 +0100 Subject: [PATCH 1517/1674] [3.14] gh-139741: Make `dist-pdf` docs archive build work for macOS (GH-140837) (#141229) Co-authored-by: Naitree Zhu <Naitreey@gmail.com> --- Doc/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/Makefile b/Doc/Makefile index f6f4c721080c42..f16d9cacb1b6fb 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -241,7 +241,8 @@ dist-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) + if [ -n "$(filter output-sync,$(value .FEATURES))" ]; then OUTPUTSYNC=--output-sync; else OUTPUTSYNC=; fi && \ + (cd build/latex; $(MAKE) clean && $(MAKE) --jobs=$$((`getconf _NPROCESSORS_ONLN`+1)) $$OUTPUTSYNC 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!" From 52731c4e62f6dcc15dffc0d98796c43763b7bcc2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:35:14 +0100 Subject: [PATCH 1518/1674] [3.14] gh-140373: Correctly emit `PY_UNWIND` event when generator is closed (GH-140767) (#140816) Co-authored-by: Mikhail Efimov <efimov.mikhail@gmail.com> --- Include/internal/pycore_ceval.h | 1 + Lib/test/test_monitoring.py | 19 +++++++++++++++++++ Lib/test/test_sys_setprofile.py | 2 ++ ...-10-29-20-59-10.gh-issue-140373.-uoaPP.rst | 2 ++ Objects/genobject.c | 3 ++- Python/ceval.c | 4 ++++ 6 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index cf5ad528217eab..89504f6bfbbfb7 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -296,6 +296,7 @@ PyAPI_FUNC(PyObject *) _PyEval_ImportName(PyThreadState *, _PyInterpreterFrame * 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(void) _PyEval_MonitorRaise(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr); +PyAPI_FUNC(bool) _PyEval_NoToolsForUnwind(PyThreadState *tstate); PyAPI_FUNC(int) _PyEval_UnpackIterableStackRef(PyThreadState *tstate, PyObject *v, int argcnt, int argcntafter, _PyStackRef *sp); PyAPI_FUNC(void) _PyEval_FrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame *frame); PyAPI_FUNC(PyObject **) _PyObjectArray_FromStackRefArray(_PyStackRef *input, Py_ssize_t nargs, PyObject **scratch); diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 98276a8ccaa610..de658c597a197d 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1079,6 +1079,25 @@ def f(): self.assertEqual(events, expected) + # gh-140373 + def test_gen_unwind(self): + def gen(): + yield 1 + + def f(): + g = gen() + next(g) + g.close() + + recorders = ( + UnwindRecorder, + ) + events = self.get_events(f, TEST_TOOL, recorders) + expected = [ + ("unwind", GeneratorExit, "gen"), + ] + self.assertEqual(events, expected) + class LineRecorder: event_type = E.LINE diff --git a/Lib/test/test_sys_setprofile.py b/Lib/test/test_sys_setprofile.py index 345c022bd2374c..a22b728b569419 100644 --- a/Lib/test/test_sys_setprofile.py +++ b/Lib/test/test_sys_setprofile.py @@ -272,6 +272,8 @@ def g(p): self.check_events(g, [(1, 'call', g_ident, None), (2, 'call', f_ident, None), (2, 'return', f_ident, 0), + (2, 'call', f_ident, None), + (2, 'return', f_ident, None), (1, 'return', g_ident, None), ], check_args=True) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst new file mode 100644 index 00000000000000..c9a97037920fda --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst @@ -0,0 +1,2 @@ +Correctly emit ``PY_UNWIND`` event when generator object is closed. Patch by +Mikhail Efimov. diff --git a/Objects/genobject.c b/Objects/genobject.c index f429bc47678fed..575752fc84002a 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -407,11 +407,12 @@ gen_close(PyObject *self, PyObject *args) } _PyInterpreterFrame *frame = &gen->gi_iframe; if (is_resume(frame->instr_ptr)) { + bool no_unwind_tools = _PyEval_NoToolsForUnwind(_PyThreadState_GET()); /* We can safely ignore the outermost try block * as it is automatically generated to handle * StopIteration. */ int oparg = frame->instr_ptr->op.arg; - if (oparg & RESUME_OPARG_DEPTH1_MASK) { + if (oparg & RESUME_OPARG_DEPTH1_MASK && no_unwind_tools) { // RESUME after YIELD_VALUE and exception depth is 1 assert((oparg & RESUME_OPARG_LOCATION_MASK) != RESUME_AT_FUNC_START); gen->gi_frame_state = FRAME_COMPLETED; diff --git a/Python/ceval.c b/Python/ceval.c index 4b1e7abe66dfad..faca6fe81b977a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2545,6 +2545,10 @@ monitor_unwind(PyThreadState *tstate, do_monitor_exc(tstate, frame, instr, PY_MONITORING_EVENT_PY_UNWIND); } +bool +_PyEval_NoToolsForUnwind(PyThreadState *tstate) { + return no_tools_for_global_event(tstate, PY_MONITORING_EVENT_PY_UNWIND); +} static int monitor_handled(PyThreadState *tstate, From 3824ad0286e0e9634e38dfd2b0c57e4b37c67337 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:53:05 +0100 Subject: [PATCH 1519/1674] [3.14] Improve clarity in tutorial introduction (GH-140669) (#142112) Co-authored-by: Thierry Martos <81799048+ThierryMT@users.noreply.github.com> --- Doc/tutorial/introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index fb491149793cf7..deabac5253051c 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -49,7 +49,7 @@ primary prompt, ``>>>``. (It shouldn't take long.) Numbers ------- -The interpreter acts as a simple calculator: you can type an expression at it +The interpreter acts as a simple calculator: you can type an expression into it and it will write the value. Expression syntax is straightforward: the operators ``+``, ``-``, ``*`` and ``/`` can be used to perform arithmetic; parentheses (``()``) can be used for grouping. From b95d16a338d23e52a4aeb46809fcf8a145bd38b2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sun, 30 Nov 2025 23:06:56 +0200 Subject: [PATCH 1520/1674] [3.14] gh-133146: Add the old public `get_value` method to documentation and refactor code. (GH-133301) (#142110) also uses it within the internals in a few places. (cherry picked from commit db098a475a47b16d25c88d95dbcf0c6572c68576) Co-authored-by: Duprat <yduprat@gmail.com> --- Doc/library/multiprocessing.rst | 10 ++++++++++ Lib/multiprocessing/queues.py | 2 +- Lib/multiprocessing/synchronize.py | 13 +++++++++---- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 714207cb0aefcd..cbc98b256a93a4 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1577,12 +1577,22 @@ object -- see :ref:`multiprocessing-managers`. A solitary difference from its close analog exists: its ``acquire`` method's first argument is named *block*, as is consistent with :meth:`Lock.acquire`. + + .. method:: get_value() + + Return the current value of semaphore. + + Note that this may raise :exc:`NotImplementedError` on platforms like + macOS where ``sem_getvalue()`` is not implemented. + + .. method:: locked() Return a boolean indicating whether this object is locked right now. .. versionadded:: 3.14 + .. note:: On macOS, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index 925f043900004e..981599acf5ef26 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -121,7 +121,7 @@ def get(self, block=True, timeout=None): def qsize(self): # Raises NotImplementedError on Mac OSX because of broken sem_getvalue() - return self._maxsize - self._sem._semlock._get_value() + return self._maxsize - self._sem.get_value() def empty(self): return not self._poll() diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index 30425047e9801a..9188114ae284c7 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -135,11 +135,16 @@ def __init__(self, value=1, *, ctx): SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX, ctx=ctx) def get_value(self): + '''Returns current value of Semaphore. + + Raises NotImplementedError on Mac OSX + because of broken sem_getvalue(). + ''' return self._semlock._get_value() def __repr__(self): try: - value = self._semlock._get_value() + value = self.get_value() except Exception: value = 'unknown' return '<%s(value=%s)>' % (self.__class__.__name__, value) @@ -155,7 +160,7 @@ def __init__(self, value=1, *, ctx): def __repr__(self): try: - value = self._semlock._get_value() + value = self.get_value() except Exception: value = 'unknown' return '<%s(value=%s, maxvalue=%s)>' % \ @@ -247,8 +252,8 @@ def _make_methods(self): def __repr__(self): try: - num_waiters = (self._sleeping_count._semlock._get_value() - - self._woken_count._semlock._get_value()) + num_waiters = (self._sleeping_count.get_value() - + self._woken_count.get_value()) except Exception: num_waiters = 'unknown' return '<%s(%s, %s)>' % (self.__class__.__name__, self._lock, num_waiters) From 4dbf8e14ba6a03705dfd05fcb8036e2db27d0c18 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Nov 2025 22:15:39 +0100 Subject: [PATCH 1521/1674] [3.14] gh-142067: Add missing default value for param in `multiprocessing.Pipe`'s doc (GH-142109) (#142120) gh-142067: Add missing default value for param in `multiprocessing.Pipe`'s doc (GH-142109) (cherry picked from commit 229ed3dd1f97b2f87629a240b90eddba5ded67bf) Co-authored-by: flovent <flbven@protonmail.com> --- Doc/library/multiprocessing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index cbc98b256a93a4..b297001f2b544e 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -890,7 +890,7 @@ For an example of the usage of queues for interprocess communication see :ref:`multiprocessing-examples`. -.. function:: Pipe([duplex]) +.. function:: Pipe(duplex=True) Returns a pair ``(conn1, conn2)`` of :class:`~multiprocessing.connection.Connection` objects representing the From 8899ed52f24657e9d59fb8b6ca916a7e90b86930 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 03:19:48 +0100 Subject: [PATCH 1522/1674] [3.14] gh-142066: Fix grammar in multiprocessing Pipes and Queues (GH-142121) (#142122) gh-142066: Fix grammar in multiprocessing Pipes and Queues (GH-142121) (cherry picked from commit 981ce0cf3af68cd8eee41fed19969cf0f2218572) docs: Fix grammar in multiprocessing Pipes and Queues (gh-142066) Co-authored-by: Tadej Magajna <tmagajna@gmail.com> --- Doc/library/multiprocessing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index b297001f2b544e..92605c57527887 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -832,8 +832,8 @@ 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. +The object returned 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`. From 9cb5a93e074b20d415bf77b8b48f6364a2faf69c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 03:55:28 +0100 Subject: [PATCH 1523/1674] [3.14] gh-141473: Document not calling Popen.wait after Popen.communicate times out. (GH-142101) (#142124) gh-141473: Document not calling Popen.wait after Popen.communicate times out. (GH-142101) Document not calling Popen.wait after Popen.communicate times out. Closes GH-141473 (cherry picked from commit 3e2c55749326809a2fc76b9f2cb87a6f89037ebe) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Doc/library/subprocess.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 43da804b62beb1..b8dfcc310771fe 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -846,6 +846,11 @@ Instances of the :class:`Popen` class have the following methods: proc.kill() outs, errs = proc.communicate() + After a call to :meth:`~Popen.communicate` raises :exc:`TimeoutExpired`, do + not call :meth:`~Popen.wait`. Use an additional :meth:`~Popen.communicate` + call to finish handling pipes and populate the :attr:`~Popen.returncode` + attribute. + .. note:: The data read is buffered in memory, so do not use this method if the data From c4054f7aa8aff80f4fed1b6af02c9aec79b14c6f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:22:05 +0100 Subject: [PATCH 1524/1674] [3.14] Docs: Upgrade Sphinx to 9.0 (GH-142114) (#142128) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/requirements.txt b/Doc/requirements.txt index d5f7b473c3aa84..716772b7f28d99 100644 --- a/Doc/requirements.txt +++ b/Doc/requirements.txt @@ -7,7 +7,7 @@ # won't suddenly cause build failures. Updating the version is fine as long # as no warnings are raised by doing so. # Keep this version in sync with ``Doc/conf.py``. -sphinx~=8.2.0 +sphinx~=9.0.0 blurb From 29c657a1f231c0908796e0c9ff6967e15ab20d9b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Mon, 1 Dec 2025 14:59:09 +0200 Subject: [PATCH 1525/1674] [3.14] gh-119452: Fix a potential virtual memory allocation denial of service in http.server (GH-119455) The CGI server on Windows could consume the amount of memory specified in the Content-Length header of the request even if the client does not send such much data. Now it reads the POST request body by chunks, so that the memory consumption is proportional to the amount of sent data. --- Lib/http/server.py | 15 +++++++- Lib/test/test_httpservers.py | 38 +++++++++++++++++++ ...-05-23-11-44-41.gh-issue-119452.PRfsSv.rst | 5 +++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 8bb49275e78cbd..226ca3b16ccbeb 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -134,6 +134,10 @@ DEFAULT_ERROR_CONTENT_TYPE = "text/html;charset=utf-8" +# Data larger than this will be read in chunks, to prevent extreme +# overallocation. +_MIN_READ_BUF_SIZE = 1 << 20 + class HTTPServer(socketserver.TCPServer): allow_reuse_address = True # Seems to make sense in testing environment @@ -1284,7 +1288,16 @@ def run_cgi(self): env = env ) if self.command.lower() == "post" and nbytes > 0: - data = self.rfile.read(nbytes) + cursize = 0 + data = self.rfile.read(min(nbytes, _MIN_READ_BUF_SIZE)) + while (len(data) < nbytes and len(data) != cursize and + select.select([self.rfile._sock], [], [], 0)[0]): + cursize = len(data) + # This is a geometric increase in read size (never more + # than doubling our the current length of data per loop + # iteration). + delta = min(cursize, nbytes - cursize) + data += self.rfile.read(delta) else: data = None # throw away additional data [see bug #427345] diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 9539457d4d829d..0f003064f3109c 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -913,6 +913,20 @@ def test_path_without_leading_slash(self): print("</pre>") """ +cgi_file7 = """\ +#!%s +import os +import sys + +print("Content-type: text/plain") +print() + +content_length = int(os.environ["CONTENT_LENGTH"]) +body = sys.stdin.buffer.read(content_length) + +print(f"{content_length} {len(body)}") +""" + @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "This test can't be run reliably as root (issue #13308).") @@ -952,6 +966,8 @@ def setUp(self): self.file3_path = None self.file4_path = None self.file5_path = None + self.file6_path = None + self.file7_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -1006,6 +1022,11 @@ def setUp(self): file6.write(cgi_file6 % self.pythonexe) os.chmod(self.file6_path, 0o777) + self.file7_path = os.path.join(self.cgi_dir, 'file7.py') + with open(self.file7_path, 'w', encoding='utf-8') as file7: + file7.write(cgi_file7 % self.pythonexe) + os.chmod(self.file7_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -1028,6 +1049,8 @@ def tearDown(self): os.remove(self.file5_path) if self.file6_path: os.remove(self.file6_path) + if self.file7_path: + os.remove(self.file7_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.cgi_dir_in_sub_dir) @@ -1100,6 +1123,21 @@ def test_post(self): self.assertEqual(res.read(), b'1, python, 123456' + self.linesep) + def test_large_content_length(self): + for w in range(15, 25): + size = 1 << w + body = b'X' * size + headers = {'Content-Length' : str(size)} + res = self.request('/cgi-bin/file7.py', 'POST', body, headers) + self.assertEqual(res.read(), b'%d %d' % (size, size) + self.linesep) + + def test_large_content_length_truncated(self): + for w in range(18, 65): + size = 1 << w + headers = {'Content-Length' : str(size)} + res = self.request('/cgi-bin/file1.py', 'POST', b'x', headers) + self.assertEqual(res.read(), b'Hello World' + self.linesep) + def test_invaliduri(self): res = self.request('/cgi-bin/invalid') res.read() diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst new file mode 100644 index 00000000000000..98956627f2b30d --- /dev/null +++ b/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst @@ -0,0 +1,5 @@ +Fix a potential memory denial of service in the :mod:`http.server` module. +When a malicious user is connected to the CGI server on Windows, it could cause +an arbitrary amount of memory to be allocated. +This could have led to symptoms including a :exc:`MemoryError`, swapping, out +of memory (OOM) killed processes or containers, or even system crashes. From b64441e4852383645af5b435411a6f849dd1b4cb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 16:54:58 +0100 Subject: [PATCH 1526/1674] [3.14] gh-119342: Fix a potential denial of service in plistlib (GH-119343) (GH-142143) Reading a specially prepared small Plist file could cause OOM because file's read(n) preallocates a bytes object for reading the specified amount of data. Now plistlib reads large data by chunks, therefore the upper limit of consumed memory is proportional to the size of the input file. (cherry picked from commit 694922cf40aa3a28f898b5f5ee08b71b4922df70) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/plistlib.py | 31 ++++++++++------ Lib/test/test_plistlib.py | 37 +++++++++++++++++-- ...-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst | 5 +++ 3 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 67e832db217319..655c51eea3da5d 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -73,6 +73,9 @@ PlistFormat = enum.Enum('PlistFormat', 'FMT_XML FMT_BINARY', module=__name__) globals().update(PlistFormat.__members__) +# Data larger than this will be read in chunks, to prevent extreme +# overallocation. +_MIN_READ_BUF_SIZE = 1 << 20 class UID: def __init__(self, data): @@ -508,12 +511,24 @@ def _get_size(self, tokenL): return tokenL + def _read(self, size): + cursize = min(size, _MIN_READ_BUF_SIZE) + data = self._fp.read(cursize) + while True: + if len(data) != cursize: + raise InvalidFileException + if cursize == size: + return data + delta = min(cursize, size - cursize) + data += self._fp.read(delta) + cursize += delta + def _read_ints(self, n, size): - data = self._fp.read(size * n) + data = self._read(size * n) if size in _BINARY_FORMAT: return struct.unpack(f'>{n}{_BINARY_FORMAT[size]}', data) else: - if not size or len(data) != size * n: + if not size: raise InvalidFileException() return tuple(int.from_bytes(data[i: i + size], 'big') for i in range(0, size * n, size)) @@ -573,22 +588,16 @@ def _read_object(self, ref): elif tokenH == 0x40: # data s = self._get_size(tokenL) - result = self._fp.read(s) - if len(result) != s: - raise InvalidFileException() + result = self._read(s) elif tokenH == 0x50: # ascii string s = self._get_size(tokenL) - data = self._fp.read(s) - if len(data) != s: - raise InvalidFileException() + data = self._read(s) result = data.decode('ascii') elif tokenH == 0x60: # unicode string s = self._get_size(tokenL) * 2 - data = self._fp.read(s) - if len(data) != s: - raise InvalidFileException() + data = self._read(s) result = data.decode('utf-16be') elif tokenH == 0x80: # UID diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index a0c76e5dec5ebe..de2a2fd1fc34bf 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -903,8 +903,7 @@ def test_dump_naive_datetime_with_aware_datetime_option(self): class TestBinaryPlistlib(unittest.TestCase): - @staticmethod - def decode(*objects, offset_size=1, ref_size=1): + def build(self, *objects, offset_size=1, ref_size=1): data = [b'bplist00'] offset = 8 offsets = [] @@ -916,7 +915,11 @@ def decode(*objects, offset_size=1, ref_size=1): len(objects), 0, offset) data.extend(offsets) data.append(tail) - return plistlib.loads(b''.join(data), fmt=plistlib.FMT_BINARY) + return b''.join(data) + + def decode(self, *objects, offset_size=1, ref_size=1): + data = self.build(*objects, offset_size=offset_size, ref_size=ref_size) + return plistlib.loads(data, fmt=plistlib.FMT_BINARY) def test_nonstandard_refs_size(self): # Issue #21538: Refs and offsets are 24-bit integers @@ -1024,6 +1027,34 @@ def test_invalid_binary(self): with self.assertRaises(plistlib.InvalidFileException): plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY) + def test_truncated_large_data(self): + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + def check(data): + with open(os_helper.TESTFN, 'wb') as f: + f.write(data) + # buffered file + with open(os_helper.TESTFN, 'rb') as f: + with self.assertRaises(plistlib.InvalidFileException): + plistlib.load(f, fmt=plistlib.FMT_BINARY) + # unbuffered file + with open(os_helper.TESTFN, 'rb', buffering=0) as f: + with self.assertRaises(plistlib.InvalidFileException): + plistlib.load(f, fmt=plistlib.FMT_BINARY) + for w in range(20, 64): + s = 1 << w + # data + check(self.build(b'\x4f\x13' + s.to_bytes(8, 'big'))) + # ascii string + check(self.build(b'\x5f\x13' + s.to_bytes(8, 'big'))) + # unicode string + check(self.build(b'\x6f\x13' + s.to_bytes(8, 'big'))) + # array + check(self.build(b'\xaf\x13' + s.to_bytes(8, 'big'))) + # dict + check(self.build(b'\xdf\x13' + s.to_bytes(8, 'big'))) + # number of objects + check(b'bplist00' + struct.pack('>6xBBQQQ', 1, 1, s, 0, 8)) + def test_load_aware_datetime(self): data = (b'bplist003B\x04>\xd0d\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00' b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00' diff --git a/Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst b/Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst new file mode 100644 index 00000000000000..04fd8faca4cf7e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst @@ -0,0 +1,5 @@ +Fix a potential memory denial of service in the :mod:`plistlib` module. +When reading a Plist file received from untrusted source, it could cause +an arbitrary amount of memory to be allocated. +This could have led to symptoms including a :exc:`MemoryError`, swapping, out +of memory (OOM) killed processes or containers, or even system crashes. From 521fb3656141a76a920257717fd7bb4d1495e04c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 16:57:31 +0100 Subject: [PATCH 1527/1674] [3.14] gh-141004: Document descriptor and dict proxy type objects (GH-141803) (GH142147) gh-141004: Document descriptor and dict proxy type objects (GH-141803) (cherry picked from commit 52f9b5f580b6b85dbf08fa23103d17a60455bc20) Co-authored-by: Yashraj <yashrajpala8@gmail.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Doc/c-api/descriptor.rst | 42 ++++++++++++++++++++++++++++++++++++++++ Doc/c-api/dict.rst | 11 +++++++++++ 2 files changed, 53 insertions(+) diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index 22c3b790cc3ec3..313c534545a861 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -21,12 +21,46 @@ found in the dictionary of type objects. .. c:function:: PyObject* PyDescr_NewMember(PyTypeObject *type, struct PyMemberDef *meth) +.. c:var:: PyTypeObject PyMemberDescr_Type + + The type object for member descriptor objects created from + :c:type:`PyMemberDef` structures. These descriptors expose fields of a + C struct as attributes on a type, and correspond + to :class:`types.MemberDescriptorType` objects in Python. + + + +.. c:var:: PyTypeObject PyGetSetDescr_Type + + The type object for get/set descriptor objects created from + :c:type:`PyGetSetDef` structures. These descriptors implement attributes + whose value is computed by C getter and setter functions, and are used + for many built-in type attributes. + + .. c:function:: PyObject* PyDescr_NewMethod(PyTypeObject *type, struct PyMethodDef *meth) +.. c:var:: PyTypeObject PyMethodDescr_Type + + The type object for method descriptor objects created from + :c:type:`PyMethodDef` structures. These descriptors expose C functions as + methods on a type, and correspond to :class:`types.MemberDescriptorType` + objects in Python. + + .. c:function:: PyObject* PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *wrapper, void *wrapped) +.. c:var:: PyTypeObject PyWrapperDescr_Type + + The type object for wrapper descriptor objects created by + :c:func:`PyDescr_NewWrapper` and :c:func:`PyWrapper_New`. Wrapper + descriptors are used internally to expose special methods implemented + via wrapper structures, and appear in Python as + :class:`types.WrapperDescriptorType` objects. + + .. c:function:: PyObject* PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method) @@ -55,6 +89,14 @@ Built-in descriptors :class:`classmethod` in the Python layer. +.. c:var:: PyTypeObject PyClassMethodDescr_Type + + The type object for C-level class method descriptor objects. + This is the type of the descriptors created for :func:`classmethod` defined in + C extension types, and is the same object as :class:`classmethod` + in Python. + + .. c:function:: PyObject *PyClassMethod_New(PyObject *callable) Create a new :class:`classmethod` object wrapping *callable*. diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index ede1699cfeb653..9c4428ced41b5a 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -43,6 +43,17 @@ Dictionary Objects prevent modification of the dictionary for non-dynamic class types. +.. c:var:: PyTypeObject PyDictProxy_Type + + The type object for mapping proxy objects created by + :c:func:`PyDictProxy_New` and for the read-only ``__dict__`` attribute + of many built-in types. A :c:type:`PyDictProxy_Type` instance provides a + dynamic, read-only view of an underlying dictionary: changes to the + underlying dictionary are reflected in the proxy, but the proxy itself + does not support mutation operations. This corresponds to + :class:`types.MappingProxyType` in Python. + + .. c:function:: void PyDict_Clear(PyObject *p) Empty an existing dictionary of all key-value pairs. From afce34fbf01de84b053a9fef4a97d2c05f039986 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:43:50 +0100 Subject: [PATCH 1528/1674] [3.14] gh-141930: Use the regular IO stack to write .pyc files for a better error message on failure (GH-141931) (#142021) Co-authored-by: Stefano Rivera <stefano@rivera.za.net> --- Lib/importlib/_bootstrap_external.py | 8 +-- Lib/test/test_importlib/test_util.py | 71 ++++++++++++++----- ...-11-24-21-09-30.gh-issue-141930.hIIzSd.rst | 2 + 3 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index d19c20b6d62a74..95ce14b2c3942e 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -208,12 +208,8 @@ def _write_atomic(path, data, mode=0o666): try: # 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: - 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") + with _io.open(fd, 'wb') as file: + file.write(data) _os.replace(path_tmp, path) except OSError: try: diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index f280433f91e868..8c14b96271ad3d 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -788,31 +788,70 @@ def test_complete_multi_phase_init_module(self): self.run_with_own_gil(script) -class MiscTests(unittest.TestCase): - def test_atomic_write_should_notice_incomplete_writes(self): +class PatchAtomicWrites: + def __init__(self, truncate_at_length, never_complete=False): + self.truncate_at_length = truncate_at_length + self.never_complete = never_complete + self.seen_write = False + self._children = [] + + def __enter__(self): import _pyio oldwrite = os.write - seen_write = False - - truncate_at_length = 100 # Emulate an os.write that only writes partial data. def write(fd, data): - nonlocal seen_write - seen_write = True - return oldwrite(fd, data[:truncate_at_length]) + if self.seen_write and self.never_complete: + return None + self.seen_write = True + return oldwrite(fd, data[:self.truncate_at_length]) # Need to patch _io to be _pyio, so that io.FileIO is affected by the # os.write patch. - with (support.swap_attr(_bootstrap_external, '_io', _pyio), - support.swap_attr(os, 'write', write)): - with self.assertRaises(OSError): - # Make sure we write something longer than the point where we - # truncate. - content = b'x' * (truncate_at_length * 2) - _bootstrap_external._write_atomic(os_helper.TESTFN, content) - assert seen_write + self.children = [ + support.swap_attr(_bootstrap_external, '_io', _pyio), + support.swap_attr(os, 'write', write) + ] + for child in self.children: + child.__enter__() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + for child in self.children: + child.__exit__(exc_type, exc_val, exc_tb) + + +class MiscTests(unittest.TestCase): + + def test_atomic_write_retries_incomplete_writes(self): + truncate_at_length = 100 + length = truncate_at_length * 2 + + with PatchAtomicWrites(truncate_at_length=truncate_at_length) as cm: + # Make sure we write something longer than the point where we + # truncate. + content = b'x' * length + _bootstrap_external._write_atomic(os_helper.TESTFN, content) + self.assertTrue(cm.seen_write) + + self.assertEqual(os.stat(support.os_helper.TESTFN).st_size, length) + os.unlink(support.os_helper.TESTFN) + + def test_atomic_write_errors_if_unable_to_complete(self): + truncate_at_length = 100 + + with ( + PatchAtomicWrites( + truncate_at_length=truncate_at_length, never_complete=True, + ) as cm, + self.assertRaises(OSError) + ): + # Make sure we write something longer than the point where we + # truncate. + content = b'x' * (truncate_at_length * 2) + _bootstrap_external._write_atomic(os_helper.TESTFN, content) + self.assertTrue(cm.seen_write) with self.assertRaises(OSError): os.stat(support.os_helper.TESTFN) # Check that the file did not get written. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst new file mode 100644 index 00000000000000..06a12f98224e88 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst @@ -0,0 +1,2 @@ +When importing a module, use Python's regular file object to ensure that +writes to ``.pyc`` files are complete or an appropriate error is raised. From 4ce27904b597c77d74dd93f2c912676021a99155 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Dec 2025 19:34:09 +0100 Subject: [PATCH 1529/1674] [3.14] gh-119451: Fix a potential denial of service in http.client (GH-119454) (#142138) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/http/client.py | 28 ++++++-- Lib/test/test_httplib.py | 66 +++++++++++++++++++ ...-05-23-11-47-48.gh-issue-119451.qkJe9-.rst | 5 ++ 3 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst diff --git a/Lib/http/client.py b/Lib/http/client.py index cf19440f7b0b9e..77f8d26291dfc2 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -111,6 +111,11 @@ _MAXLINE = 65536 _MAXHEADERS = 100 +# Data larger than this will be read in chunks, to prevent extreme +# overallocation. +_MIN_READ_BUF_SIZE = 1 << 20 + + # Header name/value ABNF (http://tools.ietf.org/html/rfc7230#section-3.2) # # VCHAR = %x21-7E @@ -639,10 +644,25 @@ def _safe_read(self, amt): reading. If the bytes are truly not available (due to EOF), then the IncompleteRead exception can be used to detect the problem. """ - data = self.fp.read(amt) - if len(data) < amt: - raise IncompleteRead(data, amt-len(data)) - return data + cursize = min(amt, _MIN_READ_BUF_SIZE) + data = self.fp.read(cursize) + if len(data) >= amt: + return data + if len(data) < cursize: + raise IncompleteRead(data, amt - len(data)) + + data = io.BytesIO(data) + data.seek(0, 2) + while True: + # This is a geometric increase in read size (never more than + # doubling out the current length of data per loop iteration). + delta = min(cursize, amt - cursize) + data.write(self.fp.read(delta)) + if data.tell() >= amt: + return data.getvalue() + cursize += delta + if data.tell() < cursize: + raise IncompleteRead(data.getvalue(), amt - data.tell()) def _safe_readinto(self, b): """Same as _safe_read, but for reading into a buffer.""" diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 38429ad480ff1c..bcb828edec7c39 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -1465,6 +1465,72 @@ def run_server(): thread.join() self.assertEqual(result, b"proxied data\n") + def test_large_content_length(self): + serv = socket.create_server((HOST, 0)) + self.addCleanup(serv.close) + + def run_server(): + [conn, address] = serv.accept() + with conn: + while conn.recv(1024): + conn.sendall( + b"HTTP/1.1 200 Ok\r\n" + b"Content-Length: %d\r\n" + b"\r\n" % size) + conn.sendall(b'A' * (size//3)) + conn.sendall(b'B' * (size - size//3)) + + thread = threading.Thread(target=run_server) + thread.start() + self.addCleanup(thread.join, 1.0) + + conn = client.HTTPConnection(*serv.getsockname()) + try: + for w in range(15, 27): + size = 1 << w + conn.request("GET", "/") + with conn.getresponse() as response: + self.assertEqual(len(response.read()), size) + finally: + conn.close() + thread.join(1.0) + + def test_large_content_length_truncated(self): + serv = socket.create_server((HOST, 0)) + self.addCleanup(serv.close) + + def run_server(): + while True: + [conn, address] = serv.accept() + with conn: + conn.recv(1024) + if not size: + break + conn.sendall( + b"HTTP/1.1 200 Ok\r\n" + b"Content-Length: %d\r\n" + b"\r\n" + b"Text" % size) + + thread = threading.Thread(target=run_server) + thread.start() + self.addCleanup(thread.join, 1.0) + + conn = client.HTTPConnection(*serv.getsockname()) + try: + for w in range(18, 65): + size = 1 << w + conn.request("GET", "/") + with conn.getresponse() as response: + self.assertRaises(client.IncompleteRead, response.read) + conn.close() + finally: + conn.close() + size = 0 + conn.request("GET", "/") + conn.close() + thread.join(1.0) + def test_putrequest_override_domain_validation(self): """ It should be possible to override the default validation diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst new file mode 100644 index 00000000000000..6d6f25cd2f8bf7 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst @@ -0,0 +1,5 @@ +Fix a potential memory denial of service in the :mod:`http.client` module. +When connecting to a malicious server, it could cause +an arbitrary amount of memory to be allocated. +This could have led to symptoms including a :exc:`MemoryError`, swapping, out +of memory (OOM) killed processes or containers, or even system crashes. From 7642070807ea45f4e496c01b7a46cfac9cc579b5 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:34:37 +0200 Subject: [PATCH 1530/1674] [3.14] Revert "GH-91636: Clear weakrefs created by finalizers. (GH-136401) (#141993)" (#142152) --- Lib/test/test_gc.py | 20 ++++++--------- ...5-07-07-17-26-06.gh-issue-91636.GyHU72.rst | 3 --- Python/gc.c | 25 +++---------------- Python/gc_free_threading.c | 20 +++------------ 4 files changed, 14 insertions(+), 54 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 7fd339f1ad7184..a6adc2c98514ba 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -262,11 +262,9 @@ class Cyclic(tuple): # finalizer. def __del__(self): - # 5. Create a weakref to `func` now. In previous - # versions of Python, this would avoid having it - # cleared by the garbage collector before calling - # the finalizers. Now, weakrefs get cleared after - # calling finalizers. + # 5. Create a weakref to `func` now. If we had created + # it earlier, it would have been cleared by the + # garbage collector before calling the finalizers. self[1].ref = weakref.ref(self[0]) # 6. Drop the global reference to `latefin`. The only @@ -295,18 +293,14 @@ def func(): # which will find `cyc` and `func` as garbage. gc.collect() - # 9. Previously, this would crash because the weakref - # created in the finalizer revealed the function after - # `tp_clear` was called and `func_qualname` - # had been NULL-ed out by func_clear(). Now, we clear - # weakrefs to unreachable objects before calling `tp_clear` - # but after calling finalizers. + # 9. Previously, this would crash because `func_qualname` + # had been NULL-ed out by func_clear(). print(f"{func=}") """ + # We're mostly just checking that this doesn't crash. rc, stdout, stderr = assert_python_ok("-c", code) self.assertEqual(rc, 0) - # The `func` global is None because the weakref was cleared. - self.assertRegex(stdout, rb"""\A\s*func=None""") + self.assertRegex(stdout, rb"""\A\s*func=<function at \S+>\s*\z""") self.assertFalse(stderr) @refcount_test diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst deleted file mode 100644 index 09c192f9c5657e..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-07-17-26-06.gh-issue-91636.GyHU72.rst +++ /dev/null @@ -1,3 +0,0 @@ -While performing garbage collection, clear weakrefs to unreachable objects -that are created during running of finalizers. If those weakrefs were are -not cleared, they could reveal unreachable objects. diff --git a/Python/gc.c b/Python/gc.c index c134dc57e28f6d..c87d714ce4cfb1 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -870,7 +870,7 @@ move_legacy_finalizer_reachable(PyGC_Head *finalizers) * no object in `unreachable` is weakly referenced anymore. */ static int -handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old, bool allow_callbacks) +handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) { PyGC_Head *gc; PyObject *op; /* generally FROM_GC(gc) */ @@ -879,9 +879,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old, bool allow_callbacks) PyGC_Head *next; int num_freed = 0; - if (allow_callbacks) { - gc_list_init(&wrcb_to_call); - } + gc_list_init(&wrcb_to_call); /* Clear all weakrefs to the objects in unreachable. If such a weakref * also has a callback, move it into `wrcb_to_call` if the callback @@ -937,11 +935,6 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old, bool allow_callbacks) _PyObject_ASSERT((PyObject *)wr, wr->wr_object == op); _PyWeakref_ClearRef(wr); _PyObject_ASSERT((PyObject *)wr, wr->wr_object == Py_None); - - if (!allow_callbacks) { - continue; - } - if (wr->wr_callback == NULL) { /* no callback */ continue; @@ -994,10 +987,6 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old, bool allow_callbacks) } } - if (!allow_callbacks) { - return 0; - } - /* Invoke the callbacks we decided to honor. It's safe to invoke them * because they can't reference unreachable objects. */ @@ -1750,7 +1739,7 @@ gc_collect_region(PyThreadState *tstate, } /* Clear weakrefs and invoke callbacks as necessary. */ - stats->collected += handle_weakrefs(&unreachable, to, true); + stats->collected += handle_weakrefs(&unreachable, to); gc_list_validate_space(to, gcstate->visited_space); validate_list(to, collecting_clear_unreachable_clear); validate_list(&unreachable, collecting_set_unreachable_clear); @@ -1764,14 +1753,6 @@ gc_collect_region(PyThreadState *tstate, gc_list_init(&final_unreachable); handle_resurrected_objects(&unreachable, &final_unreachable, to); - /* Clear weakrefs to objects in the unreachable set. No Python-level - * code must be allowed to access those unreachable objects. During - * delete_garbage(), finalizers outside the unreachable set might run - * and create new weakrefs. If those weakrefs were not cleared, they - * could reveal unreachable objects. Callbacks are not executed. - */ - handle_weakrefs(&final_unreachable, NULL, false); - /* Call tp_clear on objects in the final_unreachable set. This will cause * the reference cycles to be broken. It may also cause some objects * in finalizers to be freed. diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 43add9bc8b7eda..94c77991f5f45b 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -1493,9 +1493,9 @@ move_legacy_finalizer_reachable(struct collection_state *state) } // Clear all weakrefs to unreachable objects. Weakrefs with callbacks are -// optionally enqueued in `wrcb_to_call`, but not invoked yet. +// enqueued in `wrcb_to_call`, but not invoked yet. static void -clear_weakrefs(struct collection_state *state, bool enqueue_callbacks) +clear_weakrefs(struct collection_state *state) { PyObject *op; WORKSTACK_FOR_EACH(&state->unreachable, op) { @@ -1527,10 +1527,6 @@ clear_weakrefs(struct collection_state *state, bool enqueue_callbacks) _PyWeakref_ClearRef(wr); _PyObject_ASSERT((PyObject *)wr, wr->wr_object == Py_None); - if (!enqueue_callbacks) { - continue; - } - // We do not invoke callbacks for weakrefs that are themselves // unreachable. This is partly for historical reasons: weakrefs // predate safe object finalization, and a weakref that is itself @@ -2216,7 +2212,7 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, interp->gc.long_lived_total = state->long_lived_total; // Clear weakrefs and enqueue callbacks (but do not call them). - clear_weakrefs(state, true); + clear_weakrefs(state); _PyEval_StartTheWorld(interp); // Deallocate any object from the refcount merge step @@ -2227,19 +2223,11 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, call_weakref_callbacks(state); finalize_garbage(state); - _PyEval_StopTheWorld(interp); // Handle any objects that may have resurrected after the finalization. + _PyEval_StopTheWorld(interp); err = handle_resurrected_objects(state); // Clear free lists in all threads _PyGC_ClearAllFreeLists(interp); - if (err == 0) { - // Clear weakrefs to objects in the unreachable set. No Python-level - // code must be allowed to access those unreachable objects. During - // delete_garbage(), finalizers outside the unreachable set might - // run and create new weakrefs. If those weakrefs were not cleared, - // they could reveal unreachable objects. - clear_weakrefs(state, false); - } _PyEval_StartTheWorld(interp); if (err < 0) { From 5c5670eb45103860774c362fc948d54c24cc103b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 2 Dec 2025 01:30:11 +0100 Subject: [PATCH 1531/1674] [3.14] gh-142048: Fix quadratically increasing GC delays (gh-142051) (gh-142166) The GC for the free threaded build would get slower with each collection due to effectively double counting objects freed by the GC. (cherry picked from commit eb892868b31322d7cf271bc25923e14b1f67ae38) Co-authored-by: Kevin Wang <kevmo314@gmail.com> --- .../2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst | 2 ++ Python/gc_free_threading.c | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst new file mode 100644 index 00000000000000..1400dae13ffe32 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst @@ -0,0 +1,2 @@ +Fix quadratically increasing garbage collection delays in free-threaded +build. diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 94c77991f5f45b..d096accb4371c1 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -2134,7 +2134,19 @@ record_deallocation(PyThreadState *tstate) gc->alloc_count--; if (gc->alloc_count <= -LOCAL_ALLOC_COUNT_THRESHOLD) { GCState *gcstate = &tstate->interp->gc; - _Py_atomic_add_int(&gcstate->young.count, (int)gc->alloc_count); + int count = _Py_atomic_load_int_relaxed(&gcstate->young.count); + int new_count; + do { + if (count == 0) { + break; + } + new_count = count + (int)gc->alloc_count; + if (new_count < 0) { + new_count = 0; + } + } while (!_Py_atomic_compare_exchange_int(&gcstate->young.count, + &count, + new_count)); gc->alloc_count = 0; } } From 15a25f44ee82d67e8c11f78765007ff786b6bfef Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 2 Dec 2025 06:06:26 +0100 Subject: [PATCH 1532/1674] [3.14] gh-59000: Fix pdb breakpoint resolution for class methods when module not imported (GH-141949) (#142171) gh-59000: Fix pdb breakpoint resolution for class methods when module not imported (GH-141949) (cherry picked from commit 5e58548ebe8f7ac8c6cb0bad775912caa4090515) Co-authored-by: LloydZ <35182391+cocolato@users.noreply.github.com> --- Lib/pdb.py | 4 +++- Lib/test/test_pdb.py | 16 ++++++++++++++++ ...2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index fa5b14ccb9271b..01f8f7487233af 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1481,7 +1481,9 @@ def lineinfo(self, identifier): f = self.lookupmodule(parts[0]) if f: fname = f - item = parts[1] + item = parts[1] + else: + return failed answer = find_function(item, self.canonic(fname)) return answer or failed diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 9d89008756a1d3..b1b8c7d49befde 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -4573,6 +4573,22 @@ def bar(): ])) self.assertIn('break in bar', stdout) + def test_issue_59000(self): + script = """ + def foo(): + pass + + class C: + def foo(self): + pass + """ + commands = """ + break C.foo + quit + """ + stdout, stderr = self.run_pdb_script(script, commands) + self.assertIn("The specified object 'C.foo' is not a function", stdout) + class ChecklineTests(unittest.TestCase): def setUp(self): diff --git a/Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst b/Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst new file mode 100644 index 00000000000000..33ab8a0659e4a2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst @@ -0,0 +1 @@ +Fix :mod:`pdb` breakpoint resolution for class methods when the module defining the class is not imported. From b053c2abf0a4547ee1a1417cfa5eadc685ea72a6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 2 Dec 2025 07:06:15 +0100 Subject: [PATCH 1533/1674] [3.14] gh-140281: Update free threading Python HOWTO for 3.14 (gh-140566) (gh-142173) (cherry picked from commit 2dc28eb8b0956f3ebc8ec9cedcb614fb7516e120) Co-authored-by: Krishna-web-hub <masterkiran27@gmail.com> Co-authored-by: Sam Gross <colesbury@gmail.com> --- Doc/howto/free-threading-python.rst | 57 +++++++++-------------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/Doc/howto/free-threading-python.rst b/Doc/howto/free-threading-python.rst index e4df7a787a2b17..380c2be04957d5 100644 --- a/Doc/howto/free-threading-python.rst +++ b/Doc/howto/free-threading-python.rst @@ -11,9 +11,7 @@ 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 working and continues to be improved, but -there is some additional overhead in single-threaded workloads compared -to the regular build. Additionally, third-party packages, in particular ones +Some third-party packages, in particular ones with an :term:`extension module`, may not be ready for use in a free-threaded build, and will re-enable the :term:`GIL`. @@ -101,63 +99,42 @@ 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`. +In the free-threaded build, some objects are :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: +As of the 3.14 release, immortalization is limited to: -* :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 under Python 3.13. This -has been addressed in the 3.14 release, where the aforementioned objects use -deferred reference counting to avoid reference count contention. - -Additionally, numeric and string literals in the code as well as strings -returned by :func:`sys.intern` are also immortalized in the 3.13 release. This -behavior is part of the 3.14 release as well and it is expected to remain in -future free-threaded builds. +* Code constants: numeric literals, string literals, and tuple literals + composed of other constants. +* Strings interned by :func:`sys.intern`. 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. +It is not safe to access :attr:`frame.f_locals` from a :ref:`frame <frame-objects>` +object if that frame is currently executing in another thread, and doing so may +crash the interpreter. + 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. +It is generally not thread-safe to access the same iterator object from +multiple threads concurrently, and threads may see duplicate or missing +elements. 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. - -The specializing adaptive interpreter has been re-enabled in a thread-safe way -in the 3.14 release. The performance penalty on single-threaded code in -free-threaded mode is now roughly 5-10%, depending on the platform and C -compiler used. +compared to the default GIL-enabled build. The amount of overhead depends +on the workload and hardware. On the pyperformance benchmark suite, the +average overhead ranges from about 1% on macOS aarch64 to 8% on x86-64 Linux +systems. Behavioral changes From 82274c491a48c8cebbc1a1350a9cc67bb423caff Mon Sep 17 00:00:00 2001 From: Petr Viktorin <encukou@gmail.com> Date: Tue, 2 Dec 2025 12:45:07 +0100 Subject: [PATCH 1534/1674] [3.14] Document None for timeout argument of select.select (GH-142177) (#142182) --- Doc/library/select.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/select.rst b/Doc/library/select.rst index d2094283d54736..0f0c76060df733 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -115,7 +115,7 @@ The module defines the following: :ref:`kevent-objects` below for the methods supported by kevent objects. -.. function:: select(rlist, wlist, xlist[, timeout]) +.. function:: select(rlist, wlist, xlist, timeout=None) This is a straightforward interface to the Unix :c:func:`!select` system call. The first three arguments are iterables of 'waitable objects': either @@ -130,7 +130,8 @@ 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 - in seconds. When the *timeout* argument is omitted the function blocks until + in seconds. + When the *timeout* argument is omitted or ``None``, the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks. From 49fe7574d9e267fcd82269228995068744e9f0f8 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 2 Dec 2025 14:06:25 +0200 Subject: [PATCH 1535/1674] [3.14] Revert "gh-119452: Fix a potential virtual memory allocation denial of service in http.server (GH-119455)" (#142184) Fix a potential virtual memory allocation denial of service in http.server (GH-119455)" --- Lib/http/server.py | 15 +------- Lib/test/test_httpservers.py | 38 ------------------- ...-05-23-11-44-41.gh-issue-119452.PRfsSv.rst | 5 --- 3 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 226ca3b16ccbeb..8bb49275e78cbd 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -134,10 +134,6 @@ DEFAULT_ERROR_CONTENT_TYPE = "text/html;charset=utf-8" -# Data larger than this will be read in chunks, to prevent extreme -# overallocation. -_MIN_READ_BUF_SIZE = 1 << 20 - class HTTPServer(socketserver.TCPServer): allow_reuse_address = True # Seems to make sense in testing environment @@ -1288,16 +1284,7 @@ def run_cgi(self): env = env ) if self.command.lower() == "post" and nbytes > 0: - cursize = 0 - data = self.rfile.read(min(nbytes, _MIN_READ_BUF_SIZE)) - while (len(data) < nbytes and len(data) != cursize and - select.select([self.rfile._sock], [], [], 0)[0]): - cursize = len(data) - # This is a geometric increase in read size (never more - # than doubling our the current length of data per loop - # iteration). - delta = min(cursize, nbytes - cursize) - data += self.rfile.read(delta) + data = self.rfile.read(nbytes) else: data = None # throw away additional data [see bug #427345] diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 0f003064f3109c..9539457d4d829d 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -913,20 +913,6 @@ def test_path_without_leading_slash(self): print("</pre>") """ -cgi_file7 = """\ -#!%s -import os -import sys - -print("Content-type: text/plain") -print() - -content_length = int(os.environ["CONTENT_LENGTH"]) -body = sys.stdin.buffer.read(content_length) - -print(f"{content_length} {len(body)}") -""" - @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "This test can't be run reliably as root (issue #13308).") @@ -966,8 +952,6 @@ def setUp(self): self.file3_path = None self.file4_path = None self.file5_path = None - self.file6_path = None - self.file7_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -1022,11 +1006,6 @@ def setUp(self): file6.write(cgi_file6 % self.pythonexe) os.chmod(self.file6_path, 0o777) - self.file7_path = os.path.join(self.cgi_dir, 'file7.py') - with open(self.file7_path, 'w', encoding='utf-8') as file7: - file7.write(cgi_file7 % self.pythonexe) - os.chmod(self.file7_path, 0o777) - os.chdir(self.parent_dir) def tearDown(self): @@ -1049,8 +1028,6 @@ def tearDown(self): os.remove(self.file5_path) if self.file6_path: os.remove(self.file6_path) - if self.file7_path: - os.remove(self.file7_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.cgi_dir_in_sub_dir) @@ -1123,21 +1100,6 @@ def test_post(self): self.assertEqual(res.read(), b'1, python, 123456' + self.linesep) - def test_large_content_length(self): - for w in range(15, 25): - size = 1 << w - body = b'X' * size - headers = {'Content-Length' : str(size)} - res = self.request('/cgi-bin/file7.py', 'POST', body, headers) - self.assertEqual(res.read(), b'%d %d' % (size, size) + self.linesep) - - def test_large_content_length_truncated(self): - for w in range(18, 65): - size = 1 << w - headers = {'Content-Length' : str(size)} - res = self.request('/cgi-bin/file1.py', 'POST', b'x', headers) - self.assertEqual(res.read(), b'Hello World' + self.linesep) - def test_invaliduri(self): res = self.request('/cgi-bin/invalid') res.read() diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst deleted file mode 100644 index 98956627f2b30d..00000000000000 --- a/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a potential memory denial of service in the :mod:`http.server` module. -When a malicious user is connected to the CGI server on Windows, it could cause -an arbitrary amount of memory to be allocated. -This could have led to symptoms including a :exc:`MemoryError`, swapping, out -of memory (OOM) killed processes or containers, or even system crashes. From 57e0d177c26d4a508ef46adae9cbae46fca39f70 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 2 Dec 2025 14:51:18 +0200 Subject: [PATCH 1536/1674] Python 3.14.1 --- Doc/c-api/init.rst | 4 +- Doc/library/pyexpat.rst | 4 +- Doc/library/sqlite3.rst | 4 +- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 428 +++- Misc/NEWS.d/3.14.1.rst | 2105 +++++++++++++++++ ...-01-03-13-02-06.gh-issue-123681.gQ67nK.rst | 3 - ...-08-10-22-28-06.gh-issue-137618.FdNvIE.rst | 2 - ...-09-24-13-59-26.gh-issue-138489.1AcuZM.rst | 6 - ...-10-16-11-30-53.gh-issue-140189.YCrUyt.rst | 1 - ...-10-25-08-07-06.gh-issue-140513.6OhLTs.rst | 2 - ...-10-29-12-30-38.gh-issue-140768.ITYrzw.rst | 1 - ...-11-20-17-01-05.gh-issue-141784.LkYI2n.rst | 4 - ...-11-28-19-49-01.gh-issue-141808.cV5K12.rst | 1 - ...-10-06-22-17-47.gh-issue-139653.6-1MOd.rst | 4 - ...-10-15-15-59-59.gh-issue-140153.BO7sH4.rst | 2 - ...-10-26-16-45-06.gh-issue-140487.fGOqss.rst | 2 - ...-11-06-06-28-14.gh-issue-141042.brOioJ.rst | 3 - ...-11-18-04-16-09.gh-issue-140042.S1C7id.rst | 1 - ...-11-21-10-34-00.gh-issue-137422.tzZKLi.rst | 4 - ...-01-08-12-52-47.gh-issue-128640.9nbh9z.rst | 1 - ...-05-11-09-40-19.gh-issue-133400.zkWla8.rst | 1 - ...-07-09-21-27-14.gh-issue-132657.kSA8R3.rst | 1 - ...5-08-05-17-22-24.gh-issue-58124.q1__53.rst | 3 - ...-08-07-09-52-19.gh-issue-137400.AK1dy-.rst | 5 - ...-08-13-13-39-02.gh-issue-137433.g6Atfz.rst | 3 - ...-08-21-06-31-42.gh-issue-138004.FH2Hre.rst | 1 - ...-08-28-09-29-46.gh-issue-116738.yLZJpV.rst | 2 - ...5-08-30-17-15-05.gh-issue-69605.KjBk99.rst | 1 - ...-09-06-13-53-33.gh-issue-105487.a43YaY.rst | 1 - ...-09-15-13-06-11.gh-issue-138944.PeCgLb.rst | 3 - ...-09-15-14-04-56.gh-issue-134466.yR4fYW.rst | 2 - ...-09-17-17-17-21.gh-issue-138558.0VbzCH.rst | 1 - ...-09-21-14-33-17.gh-issue-116738.vNaI4h.rst | 2 - ...5-10-01-18-21-19.gh-issue-63161.ef1S6N.rst | 5 - ...-10-06-10-03-37.gh-issue-139640.gY5oTb.rst | 3 - ...10-06-10-03-37.gh-issue-139640.gY5oTb2.rst | 3 - ...-10-06-13-15-26.gh-issue-139516.d9Pkur.rst | 1 - ...-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst | 2 - ...-10-12-11-00-06.gh-issue-139988.4wi51t.rst | 2 - ...-10-13-13-54-19.gh-issue-139914.M-y_3E.rst | 1 - ...-10-13-17-56-23.gh-issue-140000.tLhn3e.rst | 4 - ...-10-14-17-07-37.gh-issue-140067.ID2gOm.rst | 1 - ...-10-15-00-21-40.gh-issue-140061.J0XeDV.rst | 2 - ...-10-16-21-47-00.gh-issue-140104.A8SQIm.rst | 2 - ...-10-17-18-03-12.gh-issue-139951.IdwM2O.rst | 7 - ...-10-17-20-23-19.gh-issue-140257.8Txmem.rst | 2 - ...-10-18-18-08-36.gh-issue-140301.m-2HxC.rst | 1 - ...-10-18-21-29-45.gh-issue-140306.xS5CcS.rst | 2 - ...-10-20-11-24-36.gh-issue-140358.UQuKdV.rst | 4 - ...-10-21-06-51-50.gh-issue-140406.0gJs8M.rst | 2 - ...-10-21-09-20-03.gh-issue-140398.SoABwJ.rst | 4 - ...-10-22-17-22-22.gh-issue-140431.m8D_A-.rst | 3 - ...-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst | 2 - ...-10-24-20-16-42.gh-issue-140517.cqun-K.rst | 3 - ...-10-24-20-42-33.gh-issue-140551.-9swrl.rst | 2 - ...-10-25-17-36-46.gh-issue-140576.kj0SCY.rst | 2 - ...-10-29-20-59-10.gh-issue-140373.-uoaPP.rst | 2 - ...-11-02-12-47-38.gh-issue-140530.S934bp.rst | 2 - ...-11-02-15-28-33.gh-issue-140260.JNzlGz.rst | 2 - ...-11-03-17-21-38.gh-issue-140939.FVboAw.rst | 2 - ...-11-10-00-14-20.gh-issue-116738.IxliC_.rst | 2 - ...-11-10-23-07-06.gh-issue-141312.H-58GB.rst | 2 - ...-11-14-00-19-45.gh-issue-141528.VWdax1.rst | 3 - ...-11-14-16-25-15.gh-issue-114203.n3tlQO.rst | 1 - ...-11-15-01-21-00.gh-issue-141579.aB7cD9.rst | 2 - ...-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst | 1 - ...-11-17-14-40-45.gh-issue-139653.LzOy1M.rst | 4 - ...-11-22-10-43-26.gh-issue-120158.41_rXd.rst | 2 - ...-11-24-21-09-30.gh-issue-141930.hIIzSd.rst | 2 - ...-11-25-13-13-34.gh-issue-116738.MnZRdV.rst | 2 - ...-12-01-20-41-26.gh-issue-142048.c2YosX.rst | 2 - ...-10-27-23-06-01.gh-issue-140578.FMBdEn.rst | 3 - ...-11-26-23-30-09.gh-issue-141994.arBEG6.rst | 4 - ...-10-08-08-35-50.gh-issue-139742.B3fZLg.rst | 1 - ...5-10-09-12-53-47.gh-issue-96491.4YKxvy.rst | 1 - .../2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst | 2 - .../2022-01-07-16-56-57.bpo-38735.NFfJX6.rst | 2 - ...3-02-13-20-34-52.gh-issue-78319.V1zzed.rst | 1 - ...-03-21-10-59-40.gh-issue-102431.eUDnf4.rst | 2 - ...-05-13-09-50-31.gh-issue-118981.zgOQPv.rst | 2 - ...-03-27-08-13-32.gh-issue-131788.0RWiFc.rst | 1 - ...-04-16-21-02-57.gh-issue-132551.Psa7pL.rst | 1 - ...-04-21-01-05-14.gh-issue-127081.Egrpq7.rst | 2 - ...-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst | 1 - ...-05-10-17-42-03.gh-issue-125996.vaQp0-.rst | 1 - ...-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst | 2 - ...-05-30-18-37-44.gh-issue-134453.kxkA-o.rst | 4 - ...-06-10-18-02-29.gh-issue-135307.fXGrcK.rst | 2 - ...-06-10-21-00-48.gh-issue-126631.eITVJd.rst | 2 - ...-06-16-12-37-02.gh-issue-135444.An2eeA.rst | 2 - ...-06-16-15-00-13.gh-issue-135386.lNrxLc.rst | 2 - ...-07-01-04-57-57.gh-issue-136057.4-t596.rst | 1 - ...-07-10-21-02-43.gh-issue-136507.pnEuGS.rst | 1 - ...-07-17-16-12-23.gh-issue-136234.VmTxtj.rst | 2 - ...5-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst | 2 - ...-07-21-11-56-47.gh-issue-136912.zWosAL.rst | 3 - ...-07-21-15-40-00.gh-issue-136914.-GNG-d.rst | 2 - ...-07-28-20-48-32.gh-issue-137185.fgI7-B.rst | 2 - ...5-07-28-23-11-29.gh-issue-81325.jMJFBe.rst | 2 - ...-07-30-17-42-36.gh-issue-137239.qSpj32.rst | 1 - ...-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst | 1 - ...-08-01-23-11-25.gh-issue-137017.0yGcNc.rst | 3 - ...5-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst | 3 - ...-08-03-13-16-39.gh-issue-137044.0hPVL_.rst | 4 - ...-08-06-23-16-42.gh-issue-137477.bk6BDV.rst | 2 - ...-08-07-17-18-57.gh-issue-137490.s89ieZ.rst | 2 - ...-08-16-09-02-11.gh-issue-137754.mCev1Y.rst | 2 - ...-08-16-16-04-15.gh-issue-137317.Dl13B5.rst | 3 - ...-08-26-08-17-56.gh-issue-138151.I6CdAk.rst | 3 - ...-08-27-17-05-36.gh-issue-138010.ZZJmPL.rst | 4 - ...-08-28-13-20-09.gh-issue-138204.8oLOud.rst | 2 - ...-08-29-12-56-55.gh-issue-138239.uthZFI.rst | 2 - ...5-08-30-10-04-28.gh-issue-60462.yh_vDc.rst | 1 - ...-08-31-09-06-49.gh-issue-138008.heOvsU.rst | 1 - ...-09-03-15-20-10.gh-issue-138432.RMc7UX.rst | 6 - ...-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst | 2 - ...5-09-03-20-18-39.gh-issue-98896.tjez89.rst | 2 - ...-09-04-15-18-11.gh-issue-111788.tuTEM5.rst | 3 - ...5-09-05-15-35-59.gh-issue-88375.dC491a.rst | 4 - ...-09-05-21-10-24.gh-issue-137706.0EztiJ.rst | 1 - ...-09-11-11-09-28.gh-issue-138779.TNZnLr.rst | 3 - ...-09-11-15-03-37.gh-issue-138775.w7rnSx.rst | 2 - ...-09-12-09-34-37.gh-issue-138764.mokHoY.rst | 3 - ...-09-13-12-19-17.gh-issue-138859.PxjIoN.rst | 1 - ...-09-15-19-29-12.gh-issue-130567.shDEnT.rst | 2 - ...-09-15-21-03-11.gh-issue-138891.oZFdtR.rst | 2 - ...-09-16-16-46-58.gh-issue-138993.-8s8_T.rst | 1 - ...-09-17-08-32-43.gh-issue-138813.LHkHjX.rst | 1 - ...-09-17-12-07-21.gh-issue-139001.O6tseN.rst | 2 - ...-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst | 2 - ...-09-17-21-54-53.gh-issue-139076.2eX9lG.rst | 3 - ...-09-18-05-32-18.gh-issue-135729.8AmMza.rst | 2 - ...-09-19-09-36-42.gh-issue-112729.mmty0_.rst | 2 - ...-09-20-17-50-31.gh-issue-138860.Y9JXap.rst | 1 - ...-09-21-15-58-57.gh-issue-139210.HGbMvz.rst | 1 - ...5-09-22-14-40-11.gh-issue-90949.UM35nb.rst | 5 - ...-09-23-09-46-46.gh-issue-139246.pzfM-w.rst | 1 - ...-09-24-14-17-34.gh-issue-139289.Vmk25k.rst | 1 - ...-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst | 3 - ...-09-28-16-34-11.gh-issue-139391.nRFnmx.rst | 3 - ...5-09-30-12-52-54.gh-issue-63161.mECM1A.rst | 3 - ...5-10-02-17-40-10.gh-issue-70765.zVlLZn.rst | 5 - ...-10-08-00-06-30.gh-issue-139736.baPeBd.rst | 2 - ...-10-09-03-06-19.gh-issue-139809.lzHJNu.rst | 1 - ...-10-09-13-48-28.gh-issue-139783.__NUgo.rst | 2 - ...-10-09-21-37-20.gh-issue-139845.dzx5UP.rst | 1 - ...-10-10-11-22-50.gh-issue-139894.ECAXqj.rst | 1 - ...-10-11-10-02-56.gh-issue-139905.UyJIR_.rst | 3 - ...-10-15-20-47-04.gh-issue-140120.3gffZq.rst | 2 - ...-10-15-21-42-13.gh-issue-140041._Fka2j.rst | 1 - ...-10-17-23-58-11.gh-issue-140272.lhY8uS.rst | 1 - ...-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst | 3 - ...-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst | 1 - ...-10-22-20-52-13.gh-issue-140474.xIWlip.rst | 2 - ...-10-23-12-12-22.gh-issue-138774.mnh2gU.rst | 2 - ...-10-23-19-39-16.gh-issue-138162.Znw5DN.rst | 2 - ...-10-25-21-04-00.gh-issue-140607.oOZGxS.rst | 2 - ...-10-25-21-26-16.gh-issue-140593.OxlLc9.rst | 3 - ...-10-26-16-24-12.gh-issue-140633.ioayC1.rst | 2 - ...-10-27-13-49-31.gh-issue-140634.ULng9G.rst | 1 - ...-10-27-16-01-41.gh-issue-125434.qy0uRA.rst | 2 - ...-10-27-18-29-42.gh-issue-140590.LT9HHn.rst | 2 - ...-10-28-17-43-51.gh-issue-140228.8kfHhO.rst | 1 - ...-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst | 1 - ...-10-31-13-57-55.gh-issue-103847.VM7TnW.rst | 1 - ...-10-31-15-06-26.gh-issue-140691.JzHGtg.rst | 3 - ...-11-01-00-36-14.gh-issue-140874.eAWt3K.rst | 1 - ...-11-02-09-37-22.gh-issue-140734.f8gST9.rst | 2 - ...-11-02-10-44-23.gh-issue-140875.wt6B37.rst | 3 - ...-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst | 3 - ...-11-02-19-23-32.gh-issue-140815.McEG-T.rst | 2 - ...-11-03-05-38-31.gh-issue-125115.jGS8MN.rst | 1 - ...-11-03-16-23-54.gh-issue-140797.DuFEeR.rst | 2 - ...-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst | 3 - ...-11-04-15-40-35.gh-issue-137969.9VZQVt.rst | 3 - ...-11-06-15-11-50.gh-issue-141141.tgIfgH.rst | 1 - ...-11-09-18-55-13.gh-issue-141311.qZ3swc.rst | 2 - ...-11-10-01-47-18.gh-issue-141314.baaa28.rst | 1 - ...-11-12-01-49-03.gh-issue-137109.D6sq2B.rst | 5 - ...-11-12-15-42-47.gh-issue-124111.hTw4OE.rst | 2 - ...-11-13-14-51-30.gh-issue-140938.kXsHHv.rst | 2 - ...-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst | 4 - ...-11-15-14-58-12.gh-issue-141600.XY2BXg.rst | 1 - ...-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst | 1 - ...-11-18-14-39-31.gh-issue-141570.q3n984.rst | 2 - ...5-11-25-16-00-29.gh-issue-59000.YtOyJy.rst | 1 - ...-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst | 4 - ...5-11-29-03-02-45.gh-issue-87512.bn4xbm.rst | 5 - ...5-11-29-04-20-44.gh-issue-74389.pW3URj.rst | 3 - ...-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst | 5 - ...-05-23-11-47-48.gh-issue-119451.qkJe9-.rst | 5 - ...-05-30-22-33-27.gh-issue-136065.bu337o.rst | 1 - ...-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst | 2 - ...-08-15-23-08-44.gh-issue-137836.b55rhh.rst | 3 - ...-09-24-13-39-56.gh-issue-139283.jODz_q.rst | 4 - ...-10-07-19-31-34.gh-issue-139700.vNHU1O.rst | 3 - ...-07-09-21-45-51.gh-issue-136442.jlbklP.rst | 1 - ...-09-22-15-40-09.gh-issue-139208.Tc13dl.rst | 2 - ...-10-15-00-52-12.gh-issue-140082.fpET50.rst | 3 - ...-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst | 1 - ...-07-30-10-28-35.gh-issue-137243.NkdUqH.rst | 2 - ...-07-30-11-15-47.gh-issue-137248.8IxwY3.rst | 2 - ...-08-06-11-54-55.gh-issue-137484.8iFAQs.rst | 2 - ...-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst | 2 - ...-11-12-12-54-28.gh-issue-141442.50dS3P.rst | 1 - ...-11-18-13-55-47.gh-issue-141692.tud9if.rst | 3 - ...-10-08-22-54-38.gh-issue-139810.LAaemi.rst | 2 - README.rst | 2 +- 209 files changed, 2451 insertions(+), 548 deletions(-) create mode 100644 Misc/NEWS.d/3.14.1.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst delete mode 100644 Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst delete mode 100644 Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst delete mode 100644 Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst delete mode 100644 Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst delete mode 100644 Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-27-17-05-36.gh-issue-138010.ZZJmPL.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-28-17-43-51.gh-issue-140228.8kfHhO.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst delete mode 100644 Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst delete mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst delete mode 100644 Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst delete mode 100644 Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 2226908688b014..1559f1c8fcd6dd 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1555,7 +1555,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. See :c:func:`PyUnstable_ThreadState_ResetStackProtection` for undoing this operation. - .. versionadded:: next + .. versionadded:: 3.14.1 .. warning:: @@ -1575,7 +1575,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. See :c:func:`PyUnstable_ThreadState_SetStackProtection` for an explanation. - .. versionadded:: next + .. versionadded:: 3.14.1 .. warning:: diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index c00554739b82d8..b2dd92f7ba2b9d 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -254,7 +254,7 @@ common XML vulnerabilities. The corresponding :attr:`~ExpatError.lineno` and :attr:`~ExpatError.offset` should not be used as they may have no special meaning. - .. versionadded:: next + .. versionadded:: 3.14.1 .. method:: xmlparser.SetAllocTrackerMaximumAmplification(max_factor, /) @@ -284,7 +284,7 @@ common XML vulnerabilities. that can be adjusted by :meth:`.SetAllocTrackerActivationThreshold` is exceeded. - .. versionadded:: next + .. versionadded:: 3.14.1 :class:`xmlparser` objects have the following attributes: diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 3dfac220eaf4a5..cbc3f32d9b9157 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -1614,7 +1614,7 @@ Cursor objects If the *size* parameter is used, then it is best for it to retain the same value from one :meth:`fetchmany` call to the next. - .. versionchanged:: next + .. versionchanged:: 3.14.1 Negative *size* values are rejected by raising :exc:`ValueError`. .. method:: fetchall() @@ -1644,7 +1644,7 @@ Cursor objects Read/write attribute that controls the number of rows returned by :meth:`fetchmany`. The default value is 1 which means a single row would be fetched per call. - .. versionchanged:: next + .. versionchanged:: 3.14.1 Negative values are rejected by raising :exc:`ValueError`. .. attribute:: connection diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 35838175df0fce..ce7d23b2155c7c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,12 +19,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 14 -#define PY_MICRO_VERSION 0 +#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.14.0+" +#define PY_VERSION "3.14.1" /*--end constants--*/ diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 64f354b4e5c0ff..dd9bda6e14c6f2 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Tue Oct 7 12:34:44 2025 +# Autogenerated by Sphinx on Tue Dec 2 14:51:32 2025 # as part of the release process. topics = { @@ -1098,10 +1098,10 @@ class and instance attributes applies as for regular assignments. 'bltin-ellipsis-object': r'''The Ellipsis Object ******************* -This object is commonly used used to indicate that something is -omitted. It supports no special operations. There is exactly one -ellipsis object, named "Ellipsis" (a built-in name). -"type(Ellipsis)()" produces the "Ellipsis" singleton. +This object is commonly used to indicate that something is omitted. It +supports no special operations. There is exactly one ellipsis object, +named "Ellipsis" (a built-in name). "type(Ellipsis)()" produces the +"Ellipsis" singleton. It is written as "Ellipsis" or "...". @@ -1946,15 +1946,29 @@ class attributes; they are shared by instances. Instance attributes "except*" clause ---------------- -The "except*" clause(s) are used for handling "ExceptionGroup"s. The -exception type for matching is interpreted as in the case of "except", -but in the case of exception groups we can have partial matches when -the type matches some of the exceptions in the group. This means that -multiple "except*" clauses can execute, each handling part of the -exception group. Each clause executes at most once and handles an -exception group of all matching exceptions. Each exception in the -group is handled by at most one "except*" clause, the first that -matches it. +The "except*" clause(s) specify one or more handlers for groups of +exceptions ("BaseExceptionGroup" instances). A "try" statement can +have either "except" or "except*" clauses, but not both. The exception +type for matching is mandatory in the case of "except*", so "except*:" +is a syntax error. The type is interpreted as in the case of "except", +but matching is performed on the exceptions contained in the group +that is being handled. An "TypeError" is raised if a matching type is +a subclass of "BaseExceptionGroup", because that would have ambiguous +semantics. + +When an exception group is raised in the try block, each "except*" +clause splits (see "split()") it into the subgroups of matching and +non-matching exceptions. If the matching subgroup is not empty, it +becomes the handled exception (the value returned from +"sys.exception()") and assigned to the target of the "except*" clause +(if there is one). Then, the body of the "except*" clause executes. If +the non-matching subgroup is not empty, it is processed by the next +"except*" in the same manner. This continues until all exceptions in +the group have been matched, or the last "except*" clause has run. + +After all "except*" clauses execute, the group of unhandled exceptions +is merged with any exceptions that were raised or re-raised from +within "except*" clauses. This merged exception group propagates on.: >>> try: ... raise ExceptionGroup("eg", @@ -1967,20 +1981,19 @@ class attributes; they are shared by instances. Instance attributes caught <class 'ExceptionGroup'> with nested (TypeError(2),) caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4)) + Exception Group Traceback (most recent call last): - | File "<stdin>", line 2, in <module> - | ExceptionGroup: eg + | File "<doctest default[0]>", line 2, in <module> + | raise ExceptionGroup("eg", + | [ValueError(1), TypeError(2), OSError(3), OSError(4)]) + | ExceptionGroup: eg (1 sub-exception) +-+---------------- 1 ---------------- | ValueError: 1 +------------------------------------ -Any remaining exceptions that were not handled by any "except*" clause -are re-raised at the end, along with all exceptions that were raised -from within the "except*" clauses. If this list contains more than one -exception to reraise, they are combined into an exception group. - -If the raised exception is not an exception group and its type matches -one of the "except*" clauses, it is caught and wrapped by an exception -group with an empty message string. +If the exception raised from the "try" block is not an exception group +and its type matches one of the "except*" clauses, it is caught and +wrapped by an exception group with an empty message string. This +ensures that the type of the target "e" is consistently +"BaseExceptionGroup": >>> try: ... raise BlockingIOError @@ -1989,13 +2002,7 @@ class attributes; they are shared by instances. Instance attributes ... ExceptionGroup('', (BlockingIOError())) -An "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 "except" and "except*" in the same "try". -The "break", "continue", and "return" statements cannot appear in an -"except*" clause. +"break", "continue" and "return" cannot appear in an "except*" clause. "else" clause @@ -2665,7 +2672,7 @@ def foo(): If only keyword patterns are present, they are processed as follows, one by one: - I. The keyword is looked up as an attribute on the subject. + 1. The keyword is looked up as an attribute on the subject. * If this raises an exception other than "AttributeError", the exception bubbles up. @@ -2677,14 +2684,14 @@ def foo(): the class pattern fails; if this succeeds, the match proceeds to the next keyword. - II. If all keyword patterns succeed, the class pattern succeeds. + 2. If all keyword patterns succeed, the class pattern succeeds. If any positional patterns are present, they are converted to keyword patterns using the "__match_args__" attribute on the class "name_or_attr" before matching: - I. The equivalent of "getattr(cls, "__match_args__", ())" is - called. + 1. The equivalent of "getattr(cls, "__match_args__", ())" is + called. * If this raises an exception, the exception bubbles up. @@ -2705,9 +2712,9 @@ def foo(): Customizing positional arguments in class pattern matching - II. Once all positional patterns have been converted to keyword - patterns, - the match proceeds as if there were only keyword patterns. + 2. Once all positional patterns have been converted to keyword + patterns, the match proceeds as if there were only keyword + patterns. For the following built-in types the handling of positional subpatterns is different: @@ -3909,6 +3916,10 @@ def double(x): available for commands and command arguments, e.g. the current global and local names are offered as arguments of the "p" command. + +Command-line interface +====================== + You can also invoke "pdb" from the command line to debug other scripts. For example: @@ -3924,7 +3935,7 @@ def double(x): -c, --command <command> To execute commands as if given in a ".pdbrc" file; see Debugger - Commands. + commands. Changed in version 3.2: Added the "-c" option. @@ -4145,7 +4156,7 @@ class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=Fa See the documentation for the functions explained above. -Debugger Commands +Debugger commands ================= The commands recognized by the debugger are listed below. Most @@ -4808,11 +4819,6 @@ class of the instance or a *non-virtual base class* thereof. The See also the description of the "try" statement in section The try statement and "raise" statement in section The raise statement. - --[ Footnotes ]- - -[1] This limitation occurs because the code that is executed by these - operations is not available at the time the module is compiled. ''', 'execmodel': r'''Execution model *************** @@ -5166,6 +5172,181 @@ class of the instance or a *non-virtual base class* thereof. The See also the description of the "try" statement in section The try statement and "raise" statement in section The raise statement. + +Runtime Components +================== + + +General Computing Model +----------------------- + +Python’s execution model does not operate in a vacuum. It runs on a +host machine and through that host’s runtime environment, including +its operating system (OS), if there is one. When a program runs, the +conceptual layers of how it runs on the host look something like this: + + **host machine** + **process** (global resources) + **thread** (runs machine code) + +Each process represents a program running on the host. Think of each +process itself as the data part of its program. Think of the process’ +threads as the execution part of the program. This distinction will +be important to understand the conceptual Python runtime. + +The process, as the data part, is the execution context in which the +program runs. It mostly consists of the set of resources assigned to +the program by the host, including memory, signals, file handles, +sockets, and environment variables. + +Processes are isolated and independent from one another. (The same is +true for hosts.) The host manages the process’ access to its assigned +resources, in addition to coordinating between processes. + +Each thread represents the actual execution of the program’s machine +code, running relative to the resources assigned to the program’s +process. It’s strictly up to the host how and when that execution +takes place. + +From the point of view of Python, a program always starts with exactly +one thread. However, the program may grow to run in multiple +simultaneous threads. Not all hosts support multiple threads per +process, but most do. Unlike processes, threads in a process are not +isolated and independent from one another. Specifically, all threads +in a process share all of the process’ resources. + +The fundamental point of threads is that each one does *run* +independently, at the same time as the others. That may be only +conceptually at the same time (“concurrently”) or physically (“in +parallel”). Either way, the threads effectively run at a non- +synchronized rate. + +Note: + + That non-synchronized rate means none of the process’ memory is + guaranteed to stay consistent for the code running in any given + thread. Thus multi-threaded programs must take care to coordinate + access to intentionally shared resources. Likewise, they must take + care to be absolutely diligent about not accessing any *other* + resources in multiple threads; otherwise two threads running at the + same time might accidentally interfere with each other’s use of some + shared data. All this is true for both Python programs and the + Python runtime.The cost of this broad, unstructured requirement is + the tradeoff for the kind of raw concurrency that threads provide. + The alternative to the required discipline generally means dealing + with non-deterministic bugs and data corruption. + + +Python Runtime Model +-------------------- + +The same conceptual layers apply to each Python program, with some +extra data layers specific to Python: + + **host machine** + **process** (global resources) + Python global runtime (*state*) + Python interpreter (*state*) + **thread** (runs Python bytecode and “C-API”) + Python thread *state* + +At the conceptual level: when a Python program starts, it looks +exactly like that diagram, with one of each. The runtime may grow to +include multiple interpreters, and each interpreter may grow to +include multiple thread states. + +Note: + + A Python implementation won’t necessarily implement the runtime + layers distinctly or even concretely. The only exception is places + where distinct layers are directly specified or exposed to users, + like through the "threading" module. + +Note: + + The initial interpreter is typically called the “main” interpreter. + Some Python implementations, like CPython, assign special roles to + the main interpreter.Likewise, the host thread where the runtime was + initialized is known as the “main” thread. It may be different from + the process’ initial thread, though they are often the same. In + some cases “main thread” may be even more specific and refer to the + initial thread state. A Python runtime might assign specific + responsibilities to the main thread, such as handling signals. + +As a whole, the Python runtime consists of the global runtime state, +interpreters, and thread states. The runtime ensures all that state +stays consistent over its lifetime, particularly when used with +multiple host threads. + +The global runtime, at the conceptual level, is just a set of +interpreters. While those interpreters are otherwise isolated and +independent from one another, they may share some data or other +resources. The runtime is responsible for managing these global +resources safely. The actual nature and management of these resources +is implementation-specific. Ultimately, the external utility of the +global runtime is limited to managing interpreters. + +In contrast, an “interpreter” is conceptually what we would normally +think of as the (full-featured) “Python runtime”. When machine code +executing in a host thread interacts with the Python runtime, it calls +into Python in the context of a specific interpreter. + +Note: + + The term “interpreter” here is not the same as the “bytecode + interpreter”, which is what regularly runs in threads, executing + compiled Python code.In an ideal world, “Python runtime” would refer + to what we currently call “interpreter”. However, it’s been called + “interpreter” at least since introduced in 1997 (CPython:a027efa5b). + +Each interpreter completely encapsulates all of the non-process- +global, non-thread-specific state needed for the Python runtime to +work. Notably, the interpreter’s state persists between uses. It +includes fundamental data like "sys.modules". The runtime ensures +multiple threads using the same interpreter will safely share it +between them. + +A Python implementation may support using multiple interpreters at the +same time in the same process. They are independent and isolated from +one another. For example, each interpreter has its own "sys.modules". + +For thread-specific runtime state, each interpreter has a set of +thread states, which it manages, in the same way the global runtime +contains a set of interpreters. It can have thread states for as many +host threads as it needs. It may even have multiple thread states for +the same host thread, though that isn’t as common. + +Each thread state, conceptually, has all the thread-specific runtime +data an interpreter needs to operate in one host thread. The thread +state includes the current raised exception and the thread’s Python +call stack. It may include other thread-specific resources. + +Note: + + The term “Python thread” can sometimes refer to a thread state, but + normally it means a thread created using the "threading" module. + +Each thread state, over its lifetime, is always tied to exactly one +interpreter and exactly one host thread. It will only ever be used in +that thread and with that interpreter. + +Multiple thread states may be tied to the same host thread, whether +for different interpreters or even the same interpreter. However, for +any given host thread, only one of the thread states tied to it can be +used by the thread at a time. + +Thread states are isolated and independent from one another and don’t +share any data, except for possibly sharing an interpreter and objects +or other resources belonging to that interpreter. + +Once a program is running, new Python threads can be created using the +"threading" module (on platforms and Python implementations that +support threads). Additional processes can be created using the "os", +"subprocess", and "multiprocessing" modules. Interpreters can be +created and used with the "interpreters" module. Coroutines (async) +can be run using "asyncio" in each interpreter, typically only in a +single thread (often the main thread). + -[ Footnotes ]- [1] This limitation occurs because the code that is executed by these @@ -5215,9 +5396,8 @@ class of the instance or a *non-virtual base class* thereof. The 2.71828 4.0 -Unlike in integer literals, leading zeros are allowed in the numeric -parts. For example, "077.010" is legal, and denotes the same number as -"77.10". +Unlike in integer literals, leading zeros are allowed. For example, +"077.010" is legal, and denotes the same number as "77.01". As in integer literals, single underscores may occur between digits to help readability: @@ -6012,9 +6192,15 @@ def whats_on_the_telly(penguin=None): without "global", although free variables may refer to globals without being declared global. -The "global" statement applies to the entire scope of a function or -class body. A "SyntaxError" is raised if a variable is used or -assigned to prior to its global declaration in the scope. +The "global" statement applies to the entire current scope (module, +function body or class definition). A "SyntaxError" is raised if a +variable is used or assigned to prior to its global declaration in the +scope. + +At the module level, all variables are global, so a "global" statement +has no effect. However, variables must still not be used or assigned +to prior to their "global" declaration. This requirement is relaxed in +the interactive prompt (*REPL*). **Programmer’s note:** "global" is a directive to the parser. It applies only to code parsed at the same time as the "global" @@ -7028,9 +7214,8 @@ class body. A "SyntaxError" is raised if a variable is used or 2.71828 4.0 -Unlike in integer literals, leading zeros are allowed in the numeric -parts. For example, "077.010" is legal, and denotes the same number as -"77.10". +Unlike in integer literals, leading zeros are allowed. For example, +"077.010" is legal, and denotes the same number as "77.01". As in integer literals, single underscores may occur between digits to help readability: @@ -7278,9 +7463,8 @@ class that has an "__rsub__()" method, "type(y).__rsub__(y, x)" is ************************* *Objects* are Python’s abstraction for data. All data in a Python -program is represented by objects or by relations between objects. (In -a sense, and in conformance to Von Neumann’s model of a “stored -program computer”, code is also represented by objects.) +program is represented by objects or by relations between objects. +Even code is 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 @@ -9742,10 +9926,14 @@ class is used in a class pattern with positional arguments, each the numeric index of a positional argument, or the name of a keyword argument. Returns a copy of the string where each replacement field is replaced with the string value of the - corresponding argument. + corresponding argument. For example: - >>> "The sum of 1 + 2 is {0}".format(1+2) - 'The sum of 1 + 2 is 3' + >>> "The sum of 1 + 2 is {0}".format(1+2) + 'The sum of 1 + 2 is 3' + >>> "The sum of {a} + {b} is {answer}".format(answer=1+2, a=1, b=2) + 'The sum of 1 + 2 is 3' + >>> "{1} expects the {0} Inquisition!".format("Spanish", "Nobody") + 'Nobody expects the Spanish Inquisition!' See Format String Syntax for a description of the various formatting options that can be specified in format strings. @@ -9800,13 +9988,28 @@ class is used in a class pattern with positional arguments, each database as “Letter”, i.e., those with general category 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. + ‘Letters, Alphabetic, and Ideographic’ of the Unicode Standard. For + example: + + >>> 'Letters and spaces'.isalpha() + False + >>> 'LettersOnly'.isalpha() + True + >>> 'µ'.isalpha() # non-ASCII characters can be considered alphabetical too + True + + See Unicode Properties. str.isascii() Return "True" if the string is empty or all characters in the string are ASCII, "False" otherwise. ASCII characters have code - points in the range U+0000-U+007F. + points in the range U+0000-U+007F. For example: + + >>> 'ASCII characters'.isascii() + True + >>> 'µ'.isascii() + False Added in version 3.7. @@ -9815,8 +10018,16 @@ class is used in a class pattern with positional arguments, each Return "True" if all characters in the string are decimal characters and there is at least one character, "False" otherwise. Decimal characters are those that can be used to form numbers in - base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal - character is a character in the Unicode General Category “Nd”. + base 10, such as U+0660, ARABIC-INDIC DIGIT ZERO. Formally a + decimal character is a character in the Unicode General Category + “Nd”. For example: + + >>> '0123456789'.isdecimal() + True + >>> '٠١٢٣٤٥٦٧٨٩'.isdecimal() # Arabic-Indic digits zero to nine + True + >>> 'alphabetic'.isdecimal() + False str.isdigit() @@ -9894,6 +10105,17 @@ class is used in a class pattern with positional arguments, each follow uncased characters and lowercase characters only cased ones. Return "False" otherwise. + For example: + + >>> 'Spam, Spam, Spam'.istitle() + True + >>> 'spam, spam, spam'.istitle() + False + >>> 'SPAM, SPAM, SPAM'.istitle() + False + + See also "title()". + str.isupper() Return "True" if all cased characters [4] in the string are @@ -9914,7 +10136,15 @@ class is used in a class pattern with positional arguments, each Return a string which is the concatenation of the strings in *iterable*. A "TypeError" will be raised if there are any non- string values in *iterable*, including "bytes" objects. The - separator between elements is the string providing this method. + separator between elements is the string providing this method. For + example: + + >>> ', '.join(['spam', 'spam', 'spam']) + 'spam, spam, spam' + >>> '-'.join('Python') + 'P-y-t-h-o-n' + + See also "split()". str.ljust(width, fillchar=' ', /) @@ -10124,6 +10354,8 @@ class is used in a class pattern with positional arguments, each >>> " foo ".split(maxsplit=0) ['foo '] + See also "join()". + str.splitlines(keepends=False) Return a list of the lines in the string, breaking at line @@ -10256,6 +10488,8 @@ class is used in a class pattern with positional arguments, each >>> titlecase("they're bill's friends.") "They're Bill's Friends." + See also "istitle()". + str.translate(table, /) Return a copy of the string in which each character has been mapped @@ -11005,15 +11239,29 @@ class is used in a class pattern with positional arguments, each "except*" clause ================ -The "except*" clause(s) are used for handling "ExceptionGroup"s. The -exception type for matching is interpreted as in the case of "except", -but in the case of exception groups we can have partial matches when -the type matches some of the exceptions in the group. This means that -multiple "except*" clauses can execute, each handling part of the -exception group. Each clause executes at most once and handles an -exception group of all matching exceptions. Each exception in the -group is handled by at most one "except*" clause, the first that -matches it. +The "except*" clause(s) specify one or more handlers for groups of +exceptions ("BaseExceptionGroup" instances). A "try" statement can +have either "except" or "except*" clauses, but not both. The exception +type for matching is mandatory in the case of "except*", so "except*:" +is a syntax error. The type is interpreted as in the case of "except", +but matching is performed on the exceptions contained in the group +that is being handled. An "TypeError" is raised if a matching type is +a subclass of "BaseExceptionGroup", because that would have ambiguous +semantics. + +When an exception group is raised in the try block, each "except*" +clause splits (see "split()") it into the subgroups of matching and +non-matching exceptions. If the matching subgroup is not empty, it +becomes the handled exception (the value returned from +"sys.exception()") and assigned to the target of the "except*" clause +(if there is one). Then, the body of the "except*" clause executes. If +the non-matching subgroup is not empty, it is processed by the next +"except*" in the same manner. This continues until all exceptions in +the group have been matched, or the last "except*" clause has run. + +After all "except*" clauses execute, the group of unhandled exceptions +is merged with any exceptions that were raised or re-raised from +within "except*" clauses. This merged exception group propagates on.: >>> try: ... raise ExceptionGroup("eg", @@ -11026,20 +11274,19 @@ class is used in a class pattern with positional arguments, each caught <class 'ExceptionGroup'> with nested (TypeError(2),) caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4)) + Exception Group Traceback (most recent call last): - | File "<stdin>", line 2, in <module> - | ExceptionGroup: eg + | File "<doctest default[0]>", line 2, in <module> + | raise ExceptionGroup("eg", + | [ValueError(1), TypeError(2), OSError(3), OSError(4)]) + | ExceptionGroup: eg (1 sub-exception) +-+---------------- 1 ---------------- | ValueError: 1 +------------------------------------ -Any remaining exceptions that were not handled by any "except*" clause -are re-raised at the end, along with all exceptions that were raised -from within the "except*" clauses. If this list contains more than one -exception to reraise, they are combined into an exception group. - -If the raised exception is not an exception group and its type matches -one of the "except*" clauses, it is caught and wrapped by an exception -group with an empty message string. +If the exception raised from the "try" block is not an exception group +and its type matches one of the "except*" clauses, it is caught and +wrapped by an exception group with an empty message string. This +ensures that the type of the target "e" is consistently +"BaseExceptionGroup": >>> try: ... raise BlockingIOError @@ -11048,13 +11295,7 @@ class is used in a class pattern with positional arguments, each ... ExceptionGroup('', (BlockingIOError())) -An "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 "except" and "except*" in the same "try". -The "break", "continue", and "return" statements cannot appear in an -"except*" clause. +"break", "continue" and "return" cannot appear in an "except*" clause. "else" clause @@ -11949,6 +12190,11 @@ class method object, it is transformed into an instance method object | | "X.__bases__" will be exactly equal to "(A, B, | | | C)". | +----------------------------------------------------+----------------------------------------------------+ +| type.__base__ | **CPython implementation detail:** The single base | +| | class in the inheritance chain that is responsible | +| | for the memory layout of instances. This attribute | +| | corresponds to "tp_base" at the C level. | ++----------------------------------------------------+----------------------------------------------------+ | type.__doc__ | The class’s documentation string, or "None" if | | | undefined. Not inherited by subclasses. | +----------------------------------------------------+----------------------------------------------------+ diff --git a/Misc/NEWS.d/3.14.1.rst b/Misc/NEWS.d/3.14.1.rst new file mode 100644 index 00000000000000..c00eb371b11fd1 --- /dev/null +++ b/Misc/NEWS.d/3.14.1.rst @@ -0,0 +1,2105 @@ +.. date: 2025-10-08-22-54-38 +.. gh-issue: 139810 +.. nonce: LAaemi +.. release date: 2025-12-02 +.. section: Windows + +Installing with ``py install 3[.x]-dev`` will now select final versions as +well as prereleases. + +.. + +.. date: 2025-11-18-13-55-47 +.. gh-issue: 141692 +.. nonce: tud9if +.. section: Tools/Demos + +Each slice of an iOS XCframework now contains a ``lib`` folder that contains +a symlink to the libpython dylib. This allows binary modules to be compiled +for iOS using dynamic libreary linking, rather than Framework linking. + +.. + +.. date: 2025-11-12-12-54-28 +.. gh-issue: 141442 +.. nonce: 50dS3P +.. section: Tools/Demos + +The iOS testbed now correctly handles test arguments that contain spaces. + +.. + +.. date: 2025-10-29-15-20-19 +.. gh-issue: 140702 +.. nonce: ZXtW8h +.. section: Tools/Demos + +The iOS testbed app will now expose the ``GITHUB_ACTIONS`` environment +variable to iOS apps being tested. + +.. + +.. date: 2025-08-06-11-54-55 +.. gh-issue: 137484 +.. nonce: 8iFAQs +.. section: Tools/Demos + +Have ``Tools/wasm/wasi`` put the build Python into a directory named after +the build triple instead of "build". + +.. + +.. date: 2025-07-30-11-15-47 +.. gh-issue: 137248 +.. nonce: 8IxwY3 +.. section: Tools/Demos + +Add a ``--logdir`` option to ``Tools/wasm/wasi`` for specifying where to +write log files. + +.. + +.. date: 2025-07-30-10-28-35 +.. gh-issue: 137243 +.. nonce: NkdUqH +.. section: Tools/Demos + +Have Tools/wasm/wasi detect a WASI SDK install in /opt when it was directly +extracted from a release tarball. + +.. + +.. date: 2025-10-23-16-39-49 +.. gh-issue: 140482 +.. nonce: ZMtyeD +.. section: Tests + +Preserve and restore the state of ``stty echo`` as part of the test +environment. + +.. + +.. date: 2025-10-15-00-52-12 +.. gh-issue: 140082 +.. nonce: fpET50 +.. section: Tests + +Update ``python -m test`` to set ``FORCE_COLOR=1`` when being run with color +enabled so that :mod:`unittest` which is run by it with redirected output +will output in color. + +.. + +.. date: 2025-09-22-15-40-09 +.. gh-issue: 139208 +.. nonce: Tc13dl +.. section: Tests + +Fix regrtest ``--fast-ci --verbose``: don't ignore the ``--verbose`` option +anymore. Patch by Victor Stinner. + +.. + +.. date: 2025-07-09-21-45-51 +.. gh-issue: 136442 +.. nonce: jlbklP +.. section: Tests + +Use exitcode ``1`` instead of ``5`` if :func:`unittest.TestCase.setUpClass` +raises an exception + +.. + +.. date: 2025-10-07-19-31-34 +.. gh-issue: 139700 +.. nonce: vNHU1O +.. section: Security + +Check consistency of the zip64 end of central directory record. Support +records with "zip64 extensible data" if there are no bytes prepended to the +ZIP file. + +.. + +.. date: 2025-09-24-13-39-56 +.. gh-issue: 139283 +.. nonce: jODz_q +.. section: Security + +:mod:`sqlite3`: correctly handle maximum number of rows to fetch in +:meth:`Cursor.fetchmany <sqlite3.Cursor.fetchmany>` and reject negative +values for :attr:`Cursor.arraysize <sqlite3.Cursor.arraysize>`. Patch by +Bénédikt Tran. + +.. + +.. date: 2025-08-15-23-08-44 +.. gh-issue: 137836 +.. nonce: b55rhh +.. section: Security + +Add support of the "plaintext" element, RAWTEXT elements "xmp", "iframe", +"noembed" and "noframes", and optionally RAWTEXT element "noscript" in +:class:`html.parser.HTMLParser`. + +.. + +.. date: 2025-06-28-13-23-53 +.. gh-issue: 136063 +.. nonce: aGk0Jv +.. section: Security + +:mod:`email.message`: ensure linear complexity for legacy HTTP parameters +parsing. Patch by Bénédikt Tran. + +.. + +.. date: 2025-05-30-22-33-27 +.. gh-issue: 136065 +.. nonce: bu337o +.. section: Security + +Fix quadratic complexity in :func:`os.path.expandvars`. + +.. + +.. date: 2024-05-23-11-47-48 +.. gh-issue: 119451 +.. nonce: qkJe9- +.. section: Security + +Fix a potential memory denial of service in the :mod:`http.client` module. +When connecting to a malicious server, it could cause an arbitrary amount of +memory to be allocated. This could have led to symptoms including a +:exc:`MemoryError`, swapping, out of memory (OOM) killed processes or +containers, or even system crashes. + +.. + +.. date: 2024-05-21-22-11-31 +.. gh-issue: 119342 +.. nonce: BTFj4Z +.. section: Security + +Fix a potential memory denial of service in the :mod:`plistlib` module. When +reading a Plist file received from untrusted source, it could cause an +arbitrary amount of memory to be allocated. This could have led to symptoms +including a :exc:`MemoryError`, swapping, out of memory (OOM) killed +processes or containers, or even system crashes. + +.. + +.. date: 2025-11-29-04-20-44 +.. gh-issue: 74389 +.. nonce: pW3URj +.. section: Library + +When the stdin being used by a :class:`subprocess.Popen` instance is closed, +this is now ignored in :meth:`subprocess.Popen.communicate` instead of +leaving the class in an inconsistent state. + +.. + +.. date: 2025-11-29-03-02-45 +.. gh-issue: 87512 +.. nonce: bn4xbm +.. section: Library + +Fix :func:`subprocess.Popen.communicate` timeout handling on Windows when +writing large input. Previously, the timeout was ignored during stdin +writing, causing the method to block indefinitely if the child process did +not consume input quickly. The stdin write is now performed in a background +thread, allowing the timeout to be properly enforced. + +.. + +.. date: 2025-11-27-20-16-38 +.. gh-issue: 141473 +.. nonce: Wq4xVN +.. section: Library + +When :meth:`subprocess.Popen.communicate` was called with *input* and a +*timeout* and is called for a second time after a +:exc:`~subprocess.TimeoutExpired` exception before the process has died, it +should no longer hang. + +.. + +.. date: 2025-11-25-16-00-29 +.. gh-issue: 59000 +.. nonce: YtOyJy +.. section: Library + +Fix :mod:`pdb` breakpoint resolution for class methods when the module +defining the class is not imported. + +.. + +.. date: 2025-11-18-14-39-31 +.. gh-issue: 141570 +.. nonce: q3n984 +.. section: Library + +Support :term:`file-like object` raising :exc:`OSError` from +:meth:`~io.IOBase.fileno` in color detection (``_colorize.can_colorize()``). +This can occur when ``sys.stdout`` is redirected. + +.. + +.. date: 2025-11-17-08-16-30 +.. gh-issue: 141659 +.. nonce: QNi9Aj +.. section: Library + +Fix bad file descriptor errors from ``_posixsubprocess`` on AIX. + +.. + +.. date: 2025-11-15-14-58-12 +.. gh-issue: 141600 +.. nonce: XY2BXg +.. section: Library + +Fix musl version detection on Void Linux. + +.. + +.. date: 2025-11-14-16-24-20 +.. gh-issue: 141497 +.. nonce: L_CxDJ +.. section: Library + +:mod:`ipaddress`: ensure that the methods :meth:`IPv4Network.hosts() +<ipaddress.IPv4Network.hosts>` and :meth:`IPv6Network.hosts() +<ipaddress.IPv6Network.hosts>` always return an iterator. + +.. + +.. date: 2025-11-13-14-51-30 +.. gh-issue: 140938 +.. nonce: kXsHHv +.. section: Library + +The :func:`statistics.stdev` and :func:`statistics.pstdev` functions now +raise a :exc:`ValueError` when the input contains an infinity or a NaN. + +.. + +.. date: 2025-11-12-15-42-47 +.. gh-issue: 124111 +.. nonce: hTw4OE +.. section: Library + +Updated Tcl threading configuration in :mod:`_tkinter` to assume that +threads are always available in Tcl 9 and later. + +.. + +.. date: 2025-11-12-01-49-03 +.. gh-issue: 137109 +.. nonce: D6sq2B +.. section: Library + +The :mod:`os.fork` and related forking APIs will no longer warn in the +common case where Linux or macOS platform APIs return the number of threads +in a process and find the answer to be 1 even when a +:func:`os.register_at_fork` ``after_in_parent=`` callback (re)starts a +thread. + +.. + +.. date: 2025-11-10-01-47-18 +.. gh-issue: 141314 +.. nonce: baaa28 +.. section: Library + +Fix assertion failure in :meth:`io.TextIOWrapper.tell` when reading files +with standalone carriage return (``\r``) line endings. + +.. + +.. date: 2025-11-09-18-55-13 +.. gh-issue: 141311 +.. nonce: qZ3swc +.. section: Library + +Fix assertion failure in :func:`!io.BytesIO.readinto` and undefined behavior +arising when read position is above capcity in :class:`io.BytesIO`. + +.. + +.. date: 2025-11-06-15-11-50 +.. gh-issue: 141141 +.. nonce: tgIfgH +.. section: Library + +Fix a thread safety issue with :func:`base64.b85decode`. Contributed by +Benel Tayar. + +.. + +.. date: 2025-11-04-15-40-35 +.. gh-issue: 137969 +.. nonce: 9VZQVt +.. section: Library + +Fix :meth:`annotationlib.ForwardRef.evaluate` returning +:class:`~annotationlib.ForwardRef` objects which don't update with new +globals. + +.. + +.. date: 2025-11-03-17-13-00 +.. gh-issue: 140911 +.. nonce: 7KFvSQ +.. section: Library + +:mod:`collections`: Ensure that the methods ``UserString.rindex()`` and +``UserString.index()`` accept :class:`collections.UserString` instances as +the sub argument. + +.. + +.. date: 2025-11-03-16-23-54 +.. gh-issue: 140797 +.. nonce: DuFEeR +.. section: Library + +The undocumented :class:`!re.Scanner` class now forbids regular expressions +containing capturing groups in its lexicon patterns. Patterns using +capturing groups could previously lead to crashes with segmentation fault. +Use non-capturing groups (?:...) instead. + +.. + +.. date: 2025-11-03-05-38-31 +.. gh-issue: 125115 +.. nonce: jGS8MN +.. section: Library + +Refactor the :mod:`pdb` parsing issue so positional arguments can pass +through intuitively. + +.. + +.. date: 2025-11-02-19-23-32 +.. gh-issue: 140815 +.. nonce: McEG-T +.. section: Library + +:mod:`faulthandler` now detects if a frame or a code object is invalid or +freed. Patch by Victor Stinner. + +.. + +.. date: 2025-11-02-11-46-00 +.. gh-issue: 100218 +.. nonce: 9Ezfdq +.. section: Library + +Correctly set :attr:`~OSError.errno` when :func:`socket.if_nametoindex` or +:func:`socket.if_indextoname` raise an :exc:`OSError`. Patch by Bénédikt +Tran. + +.. + +.. date: 2025-11-02-10-44-23 +.. gh-issue: 140875 +.. nonce: wt6B37 +.. section: Library + +Fix handling of unclosed character references (named and numerical) followed +by the end of file in :class:`html.parser.HTMLParser` with +``convert_charrefs=False``. + +.. + +.. date: 2025-11-02-09-37-22 +.. gh-issue: 140734 +.. nonce: f8gST9 +.. section: Library + +:mod:`multiprocessing`: fix off-by-one error when checking the length of a +temporary socket file path. Patch by Bénédikt Tran. + +.. + +.. date: 2025-11-01-00-36-14 +.. gh-issue: 140874 +.. nonce: eAWt3K +.. section: Library + +Bump the version of pip bundled in ensurepip to version 25.3 + +.. + +.. date: 2025-10-31-15-06-26 +.. gh-issue: 140691 +.. nonce: JzHGtg +.. section: Library + +In :mod:`urllib.request`, when opening a FTP URL fails because a data +connection cannot be made, the control connection's socket is now closed to +avoid a :exc:`ResourceWarning`. + +.. + +.. date: 2025-10-31-13-57-55 +.. gh-issue: 103847 +.. nonce: VM7TnW +.. section: Library + +Fix hang when cancelling process created by +:func:`asyncio.create_subprocess_exec` or +:func:`asyncio.create_subprocess_shell`. Patch by Kumar Aditya. + +.. + +.. date: 2025-10-29-16-12-41 +.. gh-issue: 120057 +.. nonce: qGj5Dl +.. section: Library + +Add :func:`os.reload_environ` to ``os.__all__``. + +.. + +.. date: 2025-10-28-17-43-51 +.. gh-issue: 140228 +.. nonce: 8kfHhO +.. section: Library + +Avoid making unnecessary filesystem calls for frozen modules in +:mod:`linecache` when the global module cache is not present. + +.. + +.. date: 2025-10-27-18-29-42 +.. gh-issue: 140590 +.. nonce: LT9HHn +.. section: Library + +Fix arguments checking for the :meth:`!functools.partial.__setstate__` that +may lead to internal state corruption and crash. Patch by Sergey Miryanov. + +.. + +.. date: 2025-10-27-16-01-41 +.. gh-issue: 125434 +.. nonce: qy0uRA +.. section: Library + +Display thread name in :mod:`faulthandler` on Windows. Patch by Victor +Stinner. + +.. + +.. date: 2025-10-27-13-49-31 +.. gh-issue: 140634 +.. nonce: ULng9G +.. section: Library + +Fix a reference counting bug in :meth:`!os.sched_param.__reduce__`. + +.. + +.. date: 2025-10-26-16-24-12 +.. gh-issue: 140633 +.. nonce: ioayC1 +.. section: Library + +Ignore :exc:`AttributeError` when setting a module's ``__file__`` attribute +when loading an extension module packaged as Apple Framework. + +.. + +.. date: 2025-10-25-21-26-16 +.. gh-issue: 140593 +.. nonce: OxlLc9 +.. section: Library + +:mod:`xml.parsers.expat`: Fix a memory leak that could affect users with +:meth:`~xml.parsers.expat.xmlparser.ElementDeclHandler` set to a custom +element declaration handler. Patch by Sebastian Pipping. + +.. + +.. date: 2025-10-25-21-04-00 +.. gh-issue: 140607 +.. nonce: oOZGxS +.. section: Library + +Inside :meth:`io.RawIOBase.read`, validate that the count of bytes returned +by :meth:`io.RawIOBase.readinto` is valid (inside the provided buffer). + +.. + +.. date: 2025-10-23-19-39-16 +.. gh-issue: 138162 +.. nonce: Znw5DN +.. section: Library + +Fix :class:`logging.LoggerAdapter` with ``merge_extra=True`` and without the +*extra* argument. + +.. + +.. date: 2025-10-23-12-12-22 +.. gh-issue: 138774 +.. nonce: mnh2gU +.. section: Library + +:func:`ast.unparse` now generates full source code when handling +:class:`ast.Interpolation` nodes that do not have a specified source. + +.. + +.. date: 2025-10-22-20-52-13 +.. gh-issue: 140474 +.. nonce: xIWlip +.. section: Library + +Fix memory leak in :class:`array.array` when creating arrays from an empty +:class:`str` and the ``u`` type code. + +.. + +.. date: 2025-10-21-15-54-13 +.. gh-issue: 137530 +.. nonce: ZyIVUH +.. section: Library + +:mod:`dataclasses` Fix annotations for generated ``__init__`` methods by +replacing the annotations that were in-line in the generated source code +with ``__annotate__`` functions attached to the methods. + +.. + +.. date: 2025-10-20-12-33-49 +.. gh-issue: 140348 +.. nonce: SAKnQZ +.. section: Library + +Fix regression in Python 3.14.0 where using the ``|`` operator on a +:class:`typing.Union` object combined with an object that is not a type +would raise an error. + +.. + +.. date: 2025-10-17-23-58-11 +.. gh-issue: 140272 +.. nonce: lhY8uS +.. section: Library + +Fix memory leak in the :meth:`!clear` method of the :mod:`dbm.gnu` database. + +.. + +.. date: 2025-10-15-21-42-13 +.. gh-issue: 140041 +.. nonce: _Fka2j +.. section: Library + +Fix import of :mod:`ctypes` on Android and Cygwin when ABI flags are +present. + +.. + +.. date: 2025-10-15-20-47-04 +.. gh-issue: 140120 +.. nonce: 3gffZq +.. section: Library + +Fixed a memory leak in :mod:`hmac` when it was using the hacl-star backend. +Discovered by ``@ashm-dev`` using AddressSanitizer. + +.. + +.. date: 2025-10-11-10-02-56 +.. gh-issue: 139905 +.. nonce: UyJIR_ +.. section: Library + +Add suggestion to error message for :class:`typing.Generic` subclasses when +``cls.__parameters__`` is missing due to a parent class failing to call +:meth:`super().__init_subclass__() <object.__init_subclass__>` in its +``__init_subclass__``. + +.. + +.. date: 2025-10-10-11-22-50 +.. gh-issue: 139894 +.. nonce: ECAXqj +.. section: Library + +Fix incorrect sharing of current task with the child process while forking +in :mod:`asyncio`. Patch by Kumar Aditya. + +.. + +.. date: 2025-10-09-21-37-20 +.. gh-issue: 139845 +.. nonce: dzx5UP +.. section: Library + +Fix to not print KeyboardInterrupt twice in default asyncio REPL. + +.. + +.. date: 2025-10-09-13-48-28 +.. gh-issue: 139783 +.. nonce: __NUgo +.. section: Library + +Fix :func:`inspect.getsourcelines` for the case when a decorator is followed +by a comment or an empty line. + +.. + +.. date: 2025-10-09-03-06-19 +.. gh-issue: 139809 +.. nonce: lzHJNu +.. section: Library + +Prevent premature colorization of subparser ``prog`` in +:meth:`argparse.ArgumentParser.add_subparsers` to respect color environment +variable changes after parser creation. + +.. + +.. date: 2025-10-08-00-06-30 +.. gh-issue: 139736 +.. nonce: baPeBd +.. section: Library + +Fix excessive indentation in the default :mod:`argparse` +:class:`!HelpFormatter`. Patch by Alexander Edland. + +.. + +.. date: 2025-10-02-17-40-10 +.. gh-issue: 70765 +.. nonce: zVlLZn +.. section: Library + +:mod:`http.server`: fix default handling of HTTP/0.9 requests in +:class:`~http.server.BaseHTTPRequestHandler`. Previously, +:meth:`!BaseHTTPRequestHandler.parse_request` incorrectly waited for headers +in the request although those are not supported in HTTP/0.9. Patch by +Bénédikt Tran. + +.. + +.. date: 2025-09-30-12-52-54 +.. gh-issue: 63161 +.. nonce: mECM1A +.. section: Library + +Fix :func:`tokenize.detect_encoding`. Support non-UTF-8 shebang and comments +if non-UTF-8 encoding is specified. Detect decoding error for non-UTF-8 +encoding. Detect null bytes in source code. + +.. + +.. date: 2025-09-28-16-34-11 +.. gh-issue: 139391 +.. nonce: nRFnmx +.. section: Library + +Fix an issue when, on non-Windows platforms, it was not possible to +gracefully exit a ``python -m asyncio`` process suspended by Ctrl+Z and +later resumed by :manpage:`fg` other than with :manpage:`kill`. + +.. + +.. date: 2025-09-25-20-16-10 +.. gh-issue: 101828 +.. nonce: yTxJlJ +.. section: Library + +Fix ``'shift_jisx0213'``, ``'shift_jis_2004'``, ``'euc_jisx0213'`` and +``'euc_jis_2004'`` codecs truncating null chars as they were treated as part +of multi-character sequences. + +.. + +.. date: 2025-09-24-14-17-34 +.. gh-issue: 139289 +.. nonce: Vmk25k +.. section: Library + +Do a real lazy-import on :mod:`rlcompleter` in :mod:`pdb` and restore the +existing completer after importing :mod:`rlcompleter`. + +.. + +.. date: 2025-09-23-09-46-46 +.. gh-issue: 139246 +.. nonce: pzfM-w +.. section: Library + +fix: paste zero-width in default repl width is wrong. + +.. + +.. date: 2025-09-22-14-40-11 +.. gh-issue: 90949 +.. nonce: UM35nb +.. section: Library + +Add :meth:`~xml.parsers.expat.xmlparser.SetAllocTrackerActivationThreshold` +and :meth:`~xml.parsers.expat.xmlparser.SetAllocTrackerMaximumAmplification` +to :ref:`xmlparser <xmlparser-objects>` objects to prevent use of +disproportional amounts of dynamic memory from within an Expat parser. Patch +by Bénédikt Tran. + +.. + +.. date: 2025-09-21-15-58-57 +.. gh-issue: 139210 +.. nonce: HGbMvz +.. section: Library + +Fix use-after-free when reporting unknown event in +:func:`xml.etree.ElementTree.iterparse`. Patch by Ken Jin. + +.. + +.. date: 2025-09-20-17-50-31 +.. gh-issue: 138860 +.. nonce: Y9JXap +.. section: Library + +Lazy import :mod:`rlcompleter` in :mod:`pdb` to avoid deadlock in +subprocess. + +.. + +.. date: 2025-09-19-09-36-42 +.. gh-issue: 112729 +.. nonce: mmty0_ +.. section: Library + +Fix crash when calling :func:`concurrent.interpreters.create` when the +process is out of memory. + +.. + +.. date: 2025-09-18-05-32-18 +.. gh-issue: 135729 +.. nonce: 8AmMza +.. section: Library + +Fix unraisable exception during finalization when using +:mod:`concurrent.interpreters` in the REPL. + +.. + +.. date: 2025-09-17-21-54-53 +.. gh-issue: 139076 +.. nonce: 2eX9lG +.. section: Library + +Fix a bug in the :mod:`pydoc` module that was hiding functions in a Python +module if they were implemented in an extension module and the module did +not have ``__all__``. + +.. + +.. date: 2025-09-17-19-08-34 +.. gh-issue: 139065 +.. nonce: Hu8fM5 +.. section: Library + +Fix trailing space before a wrapped long word if the line length is exactly +*width* in :mod:`textwrap`. + +.. + +.. date: 2025-09-17-12-07-21 +.. gh-issue: 139001 +.. nonce: O6tseN +.. section: Library + +Fix race condition in :class:`pathlib.Path` on the internal ``_raw_paths`` +field. + +.. + +.. date: 2025-09-17-08-32-43 +.. gh-issue: 138813 +.. nonce: LHkHjX +.. section: Library + +:class:`!multiprocessing.BaseProcess` defaults ``kwargs`` to ``None`` +instead of a shared dictionary. + +.. + +.. date: 2025-09-16-16-46-58 +.. gh-issue: 138993 +.. nonce: -8s8_T +.. section: Library + +Dedent :data:`credits` text. + +.. + +.. date: 2025-09-15-21-03-11 +.. gh-issue: 138891 +.. nonce: oZFdtR +.. section: Library + +Fix ``SyntaxError`` when ``inspect.get_annotations(f, eval_str=True)`` is +called on a function annotated with a :pep:`646` ``star_expression`` + +.. + +.. date: 2025-09-15-19-29-12 +.. gh-issue: 130567 +.. nonce: shDEnT +.. section: Library + +Fix possible crash in :func:`locale.strxfrm` due to a platform bug on macOS. + +.. + +.. date: 2025-09-13-12-19-17 +.. gh-issue: 138859 +.. nonce: PxjIoN +.. section: Library + +Fix generic type parameterization raising a :exc:`TypeError` when omitting a +:class:`ParamSpec` that has a default which is not a list of types. + +.. + +.. date: 2025-09-12-09-34-37 +.. gh-issue: 138764 +.. nonce: mokHoY +.. section: Library + +Prevent :func:`annotationlib.call_annotate_function` from calling +``__annotate__`` functions that don't support ``VALUE_WITH_FAKE_GLOBALS`` in +a fake globals namespace with empty globals. + +Make ``FORWARDREF`` and ``STRING`` annotations fall back to using ``VALUE`` +annotations in the case that neither their own format, nor +``VALUE_WITH_FAKE_GLOBALS`` are supported. + +.. + +.. date: 2025-09-11-15-03-37 +.. gh-issue: 138775 +.. nonce: w7rnSx +.. section: Library + +Use of ``python -m`` with :mod:`base64` has been fixed to detect input from +a terminal so that it properly notices EOF. + +.. + +.. date: 2025-09-11-11-09-28 +.. gh-issue: 138779 +.. nonce: TNZnLr +.. section: Library + +Support device numbers larger than ``2**63-1`` for the +:attr:`~os.stat_result.st_rdev` field of the :class:`os.stat_result` +structure. + +.. + +.. date: 2025-09-05-21-10-24 +.. gh-issue: 137706 +.. nonce: 0EztiJ +.. section: Library + +Fix the partial evaluation of annotations that use ``typing.Annotated[T, +x]`` where ``T`` is a forward reference. + +.. + +.. date: 2025-09-05-15-35-59 +.. gh-issue: 88375 +.. nonce: dC491a +.. section: Library + +Fix normalization of the ``robots.txt`` rules and URLs in the +:mod:`urllib.robotparser` module. No longer ignore trailing ``?``. +Distinguish raw special characters ``?``, ``=`` and ``&`` from the +percent-encoded ones. + +.. + +.. date: 2025-09-04-15-18-11 +.. gh-issue: 111788 +.. nonce: tuTEM5 +.. section: Library + +Fix parsing errors in the :mod:`urllib.robotparser` module. Don't fail +trying to parse weird paths. Don't fail trying to decode non-UTF-8 +``robots.txt`` files. + +.. + +.. date: 2025-09-03-20-18-39 +.. gh-issue: 98896 +.. nonce: tjez89 +.. section: Library + +Fix a failure in multiprocessing resource_tracker when SharedMemory names +contain colons. Patch by Rani Pinchuk. + +.. + +.. date: 2025-09-03-18-26-07 +.. gh-issue: 138425 +.. nonce: cVE9Ho +.. section: Library + +Fix partial evaluation of :class:`annotationlib.ForwardRef` objects which +rely on names defined as globals. + +.. + +.. date: 2025-09-03-15-20-10 +.. gh-issue: 138432 +.. nonce: RMc7UX +.. section: Library + +:meth:`zoneinfo.reset_tzpath` will now convert any :class:`os.PathLike` +objects it receives into strings before adding them to ``TZPATH``. It will +raise ``TypeError`` if anything other than a string is found after this +conversion. If given an :class:`os.PathLike` object that represents a +relative path, it will now raise ``ValueError`` instead of ``TypeError``, +and present a more informative error message. + +.. + +.. date: 2025-08-31-09-06-49 +.. gh-issue: 138008 +.. nonce: heOvsU +.. section: Library + +Fix segmentation faults in the :mod:`ctypes` module due to invalid +:attr:`~ctypes._CFuncPtr.argtypes`. Patch by Dung Nguyen. + +.. + +.. date: 2025-08-30-10-04-28 +.. gh-issue: 60462 +.. nonce: yh_vDc +.. section: Library + +Fix :func:`locale.strxfrm` on Solaris (and possibly other platforms). + +.. + +.. date: 2025-08-29-12-56-55 +.. gh-issue: 138239 +.. nonce: uthZFI +.. section: Library + +The REPL now highlights :keyword:`type` as a soft keyword in :ref:`type +statements <type>`. + +.. + +.. date: 2025-08-28-13-20-09 +.. gh-issue: 138204 +.. nonce: 8oLOud +.. section: Library + +Forbid expansion of shared anonymous :mod:`memory maps <mmap>` on Linux, +which caused a bus error. + +.. + +.. date: 2025-08-27-17-05-36 +.. gh-issue: 138010 +.. nonce: ZZJmPL +.. section: Library + +Fix an issue where defining a class with an :func:`@warnings.deprecated +<warnings.deprecated>`-decorated base class may not invoke the correct +:meth:`~object.__init_subclass__` method in cases involving multiple +inheritance. Patch by Brian Schubert. + +.. + +.. date: 2025-08-26-08-17-56 +.. gh-issue: 138151 +.. nonce: I6CdAk +.. section: Library + +In :mod:`annotationlib`, improve evaluation of forward references to +nonlocal variables that are not yet defined when the annotations are +initially evaluated. + +.. + +.. date: 2025-08-16-16-04-15 +.. gh-issue: 137317 +.. nonce: Dl13B5 +.. section: Library + +:func:`inspect.signature` now correctly handles classes that use a +descriptor on a wrapped :meth:`!__init__` or :meth:`!__new__` method. +Contributed by Yongyu Yan. + +.. + +.. date: 2025-08-16-09-02-11 +.. gh-issue: 137754 +.. nonce: mCev1Y +.. section: Library + +Fix import of the :mod:`zoneinfo` module if the C implementation of the +:mod:`datetime` module is not available. + +.. + +.. date: 2025-08-07-17-18-57 +.. gh-issue: 137490 +.. nonce: s89ieZ +.. section: Library + +Handle :data:`~errno.ECANCELED` in the same way as :data:`~errno.EINTR` in +:func:`signal.sigwaitinfo` on NetBSD. + +.. + +.. date: 2025-08-06-23-16-42 +.. gh-issue: 137477 +.. nonce: bk6BDV +.. section: Library + +Fix :func:`!inspect.getblock`, :func:`inspect.getsourcelines` and +:func:`inspect.getsource` for generator expressions. + +.. + +.. date: 2025-08-03-13-16-39 +.. gh-issue: 137044 +.. nonce: 0hPVL_ +.. section: Library + +Return large limit values as positive integers instead of negative integers +in :func:`resource.getrlimit`. Accept large values and reject negative +values (except :data:`~resource.RLIM_INFINITY`) for limits in +:func:`resource.setrlimit`. + +.. + +.. date: 2025-08-01-23-52-49 +.. gh-issue: 75989 +.. nonce: 5aYXNJ +.. section: Library + +:func:`tarfile.TarFile.extractall` and :func:`tarfile.TarFile.extract` now +overwrite symlinks when extracting hardlinks. (Contributed by Alexander +Enrique Urieles Nieto in :gh:`75989`.) + +.. + +.. date: 2025-08-01-23-11-25 +.. gh-issue: 137017 +.. nonce: 0yGcNc +.. section: Library + +Fix :obj:`threading.Thread.is_alive` to remain ``True`` until the underlying +OS thread is fully cleaned up. This avoids false negatives in edge cases +involving thread monitoring or premature :obj:`threading.Thread.is_alive` +calls. + +.. + +.. date: 2025-08-01-15-07-59 +.. gh-issue: 137273 +.. nonce: 4V8Xmv +.. section: Library + +Fix debug assertion failure in :func:`locale.setlocale` on Windows. + +.. + +.. date: 2025-07-30-17-42-36 +.. gh-issue: 137239 +.. nonce: qSpj32 +.. section: Library + +:mod:`heapq`: Update :data:`!heapq.__all__` with ``*_max`` functions. + +.. + +.. date: 2025-07-28-23-11-29 +.. gh-issue: 81325 +.. nonce: jMJFBe +.. section: Library + +:class:`tarfile.TarFile` now accepts a :term:`path-like <path-like object>` +when working on a tar archive. (Contributed by Alexander Enrique Urieles +Nieto in :gh:`81325`.) + +.. + +.. date: 2025-07-28-20-48-32 +.. gh-issue: 137185 +.. nonce: fgI7-B +.. section: Library + +Fix a potential async-signal-safety issue in :mod:`faulthandler` when +printing C stack traces. + +.. + +.. date: 2025-07-21-15-40-00 +.. gh-issue: 136914 +.. nonce: -GNG-d +.. section: Library + +Fix retrieval of :attr:`doctest.DocTest.lineno` for objects decorated with +:func:`functools.cache` or :class:`functools.cached_property`. + +.. + +.. date: 2025-07-21-11-56-47 +.. gh-issue: 136912 +.. nonce: zWosAL +.. section: Library + +:func:`hmac.digest` now properly handles large keys and messages by falling +back to the pure Python implementation when necessary. Patch by Bénédikt +Tran. + +.. + +.. date: 2025-07-21-01-16-32 +.. gh-issue: 83424 +.. nonce: Y3tEV4 +.. section: Library + +Allows creating a :class:`ctypes.CDLL` without name when passing a handle as +an argument. + +.. + +.. date: 2025-07-17-16-12-23 +.. gh-issue: 136234 +.. nonce: VmTxtj +.. section: Library + +Fix :meth:`asyncio.WriteTransport.writelines` to be robust to connection +failure, by using the same behavior as +:meth:`~asyncio.WriteTransport.write`. + +.. + +.. date: 2025-07-10-21-02-43 +.. gh-issue: 136507 +.. nonce: pnEuGS +.. section: Library + +Fix mimetypes CLI to handle multiple file parameters. + +.. + +.. date: 2025-07-01-04-57-57 +.. gh-issue: 136057 +.. nonce: 4-t596 +.. section: Library + +Fixed the bug in :mod:`pdb` and :mod:`bdb` where ``next`` and ``step`` can't +go over the line if a loop exists in the line. + +.. + +.. date: 2025-06-16-15-00-13 +.. gh-issue: 135386 +.. nonce: lNrxLc +.. section: Library + +Fix opening a :mod:`dbm.sqlite3` database for reading from read-only file or +directory. + +.. + +.. date: 2025-06-16-12-37-02 +.. gh-issue: 135444 +.. nonce: An2eeA +.. section: Library + +Fix :meth:`asyncio.DatagramTransport.sendto` to account for datagram header +size when data cannot be sent. + +.. + +.. date: 2025-06-10-21-00-48 +.. gh-issue: 126631 +.. nonce: eITVJd +.. section: Library + +Fix :mod:`multiprocessing` ``forkserver`` bug which prevented ``__main__`` +from being preloaded. + +.. + +.. date: 2025-06-10-18-02-29 +.. gh-issue: 135307 +.. nonce: fXGrcK +.. section: Library + +:mod:`email`: Fix exception in ``set_content()`` when encoding text and +max_line_length is set to ``0`` or ``None`` (unlimited). + +.. + +.. date: 2025-05-30-18-37-44 +.. gh-issue: 134453 +.. nonce: kxkA-o +.. section: Library + +Fixed :func:`subprocess.Popen.communicate` ``input=`` handling of +:class:`memoryview` instances that were non-byte shaped on POSIX platforms. +Those are now properly cast to a byte shaped view instead of truncating the +input. Windows platforms did not have this bug. + +.. + +.. date: 2025-05-26-10-52-27 +.. gh-issue: 134698 +.. nonce: aJ1mZ1 +.. section: Library + +Fix a crash when calling methods of :class:`ssl.SSLContext` or +:class:`ssl.SSLSocket` across multiple threads. + +.. + +.. date: 2025-05-10-17-42-03 +.. gh-issue: 125996 +.. nonce: vaQp0- +.. section: Library + +Fix thread safety of :class:`collections.OrderedDict`. Patch by Kumar +Aditya. + +.. + +.. date: 2025-05-10-15-10-54 +.. gh-issue: 133789 +.. nonce: I-ZlUX +.. section: Library + +Fix unpickling of :mod:`pathlib` objects that were pickled in Python 3.13. + +.. + +.. date: 2025-04-21-01-05-14 +.. gh-issue: 127081 +.. nonce: Egrpq7 +.. section: Library + +Fix libc thread safety issues with :mod:`dbm` by performing stateful +operations in critical sections. + +.. + +.. date: 2025-04-16-21-02-57 +.. gh-issue: 132551 +.. nonce: Psa7pL +.. section: Library + +Make :class:`io.BytesIO` safe in :term:`free-threaded <free threading>` +build. + +.. + +.. date: 2025-03-27-08-13-32 +.. gh-issue: 131788 +.. nonce: 0RWiFc +.. section: Library + +Make ``ResourceTracker.send`` from :mod:`multiprocessing` re-entrant safe + +.. + +.. date: 2024-05-13-09-50-31 +.. gh-issue: 118981 +.. nonce: zgOQPv +.. section: Library + +Fix potential hang in ``multiprocessing.popen_spawn_posix`` that can happen +when the child proc dies early by closing the child fds right away. + +.. + +.. date: 2023-03-21-10-59-40 +.. gh-issue: 102431 +.. nonce: eUDnf4 +.. section: Library + +Clarify constraints for "logical" arguments in methods of +:class:`decimal.Context`. + +.. + +.. date: 2023-02-13-20-34-52 +.. gh-issue: 78319 +.. nonce: V1zzed +.. section: Library + +UTF8 support for the IMAP APPEND command has been made RFC compliant. + +.. + +.. bpo: 38735 +.. date: 2022-01-07-16-56-57 +.. nonce: NFfJX6 +.. section: Library + +Fix failure when importing a module from the root directory on unix-like +platforms with sys.pycache_prefix set. + +.. + +.. bpo: 41839 +.. date: 2020-09-23-11-54-17 +.. nonce: kU5Ywl +.. section: Library + +Allow negative priority values from :func:`os.sched_get_priority_min` and +:func:`os.sched_get_priority_max` functions. + +.. + +.. date: 2025-10-09-12-53-47 +.. gh-issue: 96491 +.. nonce: 4YKxvy +.. section: IDLE + +Deduplicate version number in IDLE shell title bar after saving to a file. + +.. + +.. date: 2025-10-08-08-35-50 +.. gh-issue: 139742 +.. nonce: B3fZLg +.. section: IDLE + +Colorize t-string prefixes for template strings in IDLE, as done for +f-string prefixes. + +.. + +.. date: 2025-11-26-23-30-09 +.. gh-issue: 141994 +.. nonce: arBEG6 +.. section: Documentation + +:mod:`xml.sax.handler`: Make Documentation of +:data:`xml.sax.handler.feature_external_ges` warn of opening up to `external +entity attacks <https://en.wikipedia.org/wiki/XML_external_entity_attack>`_. +Patch by Sebastian Pipping. + +.. + +.. date: 2025-10-27-23-06-01 +.. gh-issue: 140578 +.. nonce: FMBdEn +.. section: Documentation + +Remove outdated sencence in the documentation for :mod:`multiprocessing`, +that implied that :class:`concurrent.futures.ThreadPoolExecutor` did not +exist. + +.. + +.. date: 2025-12-01-20-41-26 +.. gh-issue: 142048 +.. nonce: c2YosX +.. section: Core and Builtins + +Fix quadratically increasing garbage collection delays in free-threaded +build. + +.. + +.. date: 2025-11-25-13-13-34 +.. gh-issue: 116738 +.. nonce: MnZRdV +.. section: Core and Builtins + +Fix thread safety issue with :mod:`re` scanner objects in free-threaded +builds. + +.. + +.. date: 2025-11-24-21-09-30 +.. gh-issue: 141930 +.. nonce: hIIzSd +.. section: Core and Builtins + +When importing a module, use Python's regular file object to ensure that +writes to ``.pyc`` files are complete or an appropriate error is raised. + +.. + +.. date: 2025-11-22-10-43-26 +.. gh-issue: 120158 +.. nonce: 41_rXd +.. section: Core and Builtins + +Fix inconsistent state when enabling or disabling monitoring events too many +times. + +.. + +.. date: 2025-11-17-14-40-45 +.. gh-issue: 139653 +.. nonce: LzOy1M +.. section: Core and Builtins + +Only raise a ``RecursionError`` or trigger a fatal error if the stack +pointer is both below the limit pointer *and* above the stack base. If +outside of these bounds assume that it is OK. This prevents false positives +when user-space threads swap stacks. + +.. + +.. date: 2025-11-15-23-58-23 +.. gh-issue: 139103 +.. nonce: 9cVYJ0 +.. section: Core and Builtins + +Improve multithreaded scaling of dataclasses on the free-threaded build. + +.. + +.. date: 2025-11-15-01-21-00 +.. gh-issue: 141579 +.. nonce: aB7cD9 +.. section: Core and Builtins + +Fix :func:`sys.activate_stack_trampoline` to properly support the +``perf_jit`` backend. Patch by Pablo Galindo. + +.. + +.. date: 2025-11-14-16-25-15 +.. gh-issue: 114203 +.. nonce: n3tlQO +.. section: Core and Builtins + +Skip locking if object is already locked by two-mutex critical section. + +.. + +.. date: 2025-11-14-00-19-45 +.. gh-issue: 141528 +.. nonce: VWdax1 +.. section: Core and Builtins + +Suggest using :meth:`concurrent.interpreters.Interpreter.close` instead of +the private ``_interpreters.destroy`` function when warning about remaining +subinterpreters. Patch by Sergey Miryanov. + +.. + +.. date: 2025-11-10-23-07-06 +.. gh-issue: 141312 +.. nonce: H-58GB +.. section: Core and Builtins + +Fix the assertion failure in the ``__setstate__`` method of the range +iterator when a non-integer argument is passed. Patch by Sergey Miryanov. + +.. + +.. date: 2025-11-10-00-14-20 +.. gh-issue: 116738 +.. nonce: IxliC_ +.. section: Core and Builtins + +Make csv module thread-safe on the :term:`free threaded <free threading>` +build. + +.. + +.. date: 2025-11-03-17-21-38 +.. gh-issue: 140939 +.. nonce: FVboAw +.. section: Core and Builtins + +Fix memory leak when :class:`bytearray` or :class:`bytes` is formated with +the ``%*b`` format with a large width that results in a :exc:`MemoryError`. + +.. + +.. date: 2025-11-02-15-28-33 +.. gh-issue: 140260 +.. nonce: JNzlGz +.. section: Core and Builtins + +Fix :mod:`struct` data race in endian table initialization with +subinterpreters. Patch by Shamil Abdulaev. + +.. + +.. date: 2025-11-02-12-47-38 +.. gh-issue: 140530 +.. nonce: S934bp +.. section: Core and Builtins + +Fix a reference leak when ``raise exc from cause`` fails. Patch by Bénédikt +Tran. + +.. + +.. date: 2025-10-29-20-59-10 +.. gh-issue: 140373 +.. nonce: -uoaPP +.. section: Core and Builtins + +Correctly emit ``PY_UNWIND`` event when generator object is closed. Patch by +Mikhail Efimov. + +.. + +.. date: 2025-10-25-17-36-46 +.. gh-issue: 140576 +.. nonce: kj0SCY +.. section: Core and Builtins + +Fixed crash in :func:`tokenize.generate_tokens` in case of specific +incorrect input. Patch by Mikhail Efimov. + +.. + +.. date: 2025-10-24-20-42-33 +.. gh-issue: 140551 +.. nonce: -9swrl +.. section: Core and Builtins + +Fixed crash in :class:`dict` if :meth:`dict.clear` is called at the lookup +stage. Patch by Mikhail Efimov and Inada Naoki. + +.. + +.. date: 2025-10-24-20-16-42 +.. gh-issue: 140517 +.. nonce: cqun-K +.. section: Core and Builtins + +Fixed a reference leak when iterating over the result of :func:`map` with +``strict=True`` when the input iterables have different lengths. Patch by +Mikhail Efimov. + +.. + +.. date: 2025-10-23-16-05-50 +.. gh-issue: 140471 +.. nonce: Ax_aXn +.. section: Core and Builtins + +Fix potential buffer overflow in :class:`ast.AST` node initialization when +encountering malformed :attr:`~ast.AST._fields` containing non-:class:`str`. + +.. + +.. date: 2025-10-22-17-22-22 +.. gh-issue: 140431 +.. nonce: m8D_A- +.. section: Core and Builtins + +Fix a crash in Python's :term:`garbage collector <garbage collection>` due +to partially initialized :term:`coroutine` objects when coroutine origin +tracking depth is enabled (:func:`sys.set_coroutine_origin_tracking_depth`). + +.. + +.. date: 2025-10-21-09-20-03 +.. gh-issue: 140398 +.. nonce: SoABwJ +.. section: Core and Builtins + +Fix memory leaks in :mod:`readline` functions +:func:`~readline.read_init_file`, :func:`~readline.read_history_file`, +:func:`~readline.write_history_file`, and +:func:`~readline.append_history_file` when :c:func:`PySys_Audit` fails. + +.. + +.. date: 2025-10-21-06-51-50 +.. gh-issue: 140406 +.. nonce: 0gJs8M +.. section: Core and Builtins + +Fix memory leak when an object's :meth:`~object.__hash__` method returns an +object that isn't an :class:`int`. + +.. + +.. date: 2025-10-20-11-24-36 +.. gh-issue: 140358 +.. nonce: UQuKdV +.. section: Core and Builtins + +Restore elapsed time and unreachable object count in GC debug output. These +were inadvertently removed during a refactor of ``gc.c``. The debug log now +again reports elapsed collection time and the number of unreachable objects. +Contributed by Pål Grønås Drange. + +.. + +.. date: 2025-10-18-21-29-45 +.. gh-issue: 140306 +.. nonce: xS5CcS +.. section: Core and Builtins + +Fix memory leaks in cross-interpreter channel operations and shared +namespace handling. + +.. + +.. date: 2025-10-18-18-08-36 +.. gh-issue: 140301 +.. nonce: m-2HxC +.. section: Core and Builtins + +Fix memory leak of ``PyConfig`` in subinterpreters. + +.. + +.. date: 2025-10-17-20-23-19 +.. gh-issue: 140257 +.. nonce: 8Txmem +.. section: Core and Builtins + +Fix data race between interpreter_clear() and take_gil() on eval_breaker +during finalization with daemon threads. + +.. + +.. date: 2025-10-17-18-03-12 +.. gh-issue: 139951 +.. nonce: IdwM2O +.. section: Core and Builtins + +Fixes a regression in GC performance for a growing heap composed mostly of +small tuples. + +* Counts number of actually tracked objects, instead of trackable objects. + This ensures that untracking tuples has the desired effect of reducing GC overhead. +* Does not track most untrackable tuples during creation. + This prevents large numbers of small tuples causing excessive GCs. + +.. + +.. date: 2025-10-16-21-47-00 +.. gh-issue: 140104 +.. nonce: A8SQIm +.. section: Core and Builtins + +Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported +by Daniel Diniz. + +.. + +.. date: 2025-10-15-00-21-40 +.. gh-issue: 140061 +.. nonce: J0XeDV +.. section: Core and Builtins + +Fixing the checking of whether an object is uniquely referenced to ensure +free-threaded compatibility. Patch by Sergey Miryanov. + +.. + +.. date: 2025-10-14-17-07-37 +.. gh-issue: 140067 +.. nonce: ID2gOm +.. section: Core and Builtins + +Fix memory leak in sub-interpreter creation. + +.. + +.. date: 2025-10-13-17-56-23 +.. gh-issue: 140000 +.. nonce: tLhn3e +.. section: Core and Builtins + +Fix potential memory leak when a reference cycle exists between an instance +of :class:`typing.TypeAliasType`, :class:`typing.TypeVar`, +:class:`typing.ParamSpec`, or :class:`typing.TypeVarTuple` and its +``__name__`` attribute. Patch by Mikhail Efimov. + +.. + +.. date: 2025-10-13-13-54-19 +.. gh-issue: 139914 +.. nonce: M-y_3E +.. section: Core and Builtins + +Restore support for HP PA-RISC, which has an upwards-growing stack. + +.. + +.. date: 2025-10-12-11-00-06 +.. gh-issue: 139988 +.. nonce: 4wi51t +.. section: Core and Builtins + +Fix a memory leak when failing to create a :class:`~typing.Union` type. +Patch by Bénédikt Tran. + +.. + +.. date: 2025-10-08-13-52-00 +.. gh-issue: 139748 +.. nonce: jq0yFJ +.. section: Core and Builtins + +Fix reference leaks in error branches of functions accepting path strings or +bytes such as :func:`compile` and :func:`os.system`. Patch by Bénédikt Tran. + +.. + +.. date: 2025-10-06-13-15-26 +.. gh-issue: 139516 +.. nonce: d9Pkur +.. section: Core and Builtins + +Fix lambda colon erroneously start format spec in f-string in tokenizer. + +.. + +.. date: 2025-10-06-10-03-37 +.. gh-issue: 139640 +.. nonce: gY5oTb2 +.. section: Core and Builtins + +:func:`ast.parse` no longer emits syntax warnings for +``return``/``break``/``continue`` in ``finally`` (see :pep:`765`) -- they +are only emitted during compilation. + +.. + +.. date: 2025-10-06-10-03-37 +.. gh-issue: 139640 +.. nonce: gY5oTb +.. section: Core and Builtins + +Fix swallowing some syntax warnings in different modules if they +accidentally have the same message and are emitted from the same line. Fix +duplicated warnings in the ``finally`` block. + +.. + +.. date: 2025-10-01-18-21-19 +.. gh-issue: 63161 +.. nonce: ef1S6N +.. section: Core and Builtins + +Support non-UTF-8 shebang and comments in Python source files if non-UTF-8 +encoding is specified. Detect decoding error in comments for default (UTF-8) +encoding. Show the line and position of decoding error for default encoding +in a traceback. Show the line containing the coding cookie when it conflicts +with the BOM in a traceback. + +.. + +.. date: 2025-09-21-14-33-17 +.. gh-issue: 116738 +.. nonce: vNaI4h +.. section: Core and Builtins + +Make :mod:`mmap` thread-safe on the :term:`free threaded <free threading>` +build. + +.. + +.. date: 2025-09-17-17-17-21 +.. gh-issue: 138558 +.. nonce: 0VbzCH +.. section: Core and Builtins + +Fix handling of unusual t-string annotations in annotationlib. Patch by Dave +Peck. + +.. + +.. date: 2025-09-15-14-04-56 +.. gh-issue: 134466 +.. nonce: yR4fYW +.. section: Core and Builtins + +Don't run PyREPL in a degraded environment where setting termios attributes +is not allowed. + +.. + +.. date: 2025-09-15-13-06-11 +.. gh-issue: 138944 +.. nonce: PeCgLb +.. section: Core and Builtins + +Fix :exc:`SyntaxError` message when invalid syntax appears on the same line +as a valid ``import ... as ...`` or ``from ... import ... as ...`` +statement. Patch by Brian Schubert. + +.. + +.. date: 2025-09-06-13-53-33 +.. gh-issue: 105487 +.. nonce: a43YaY +.. section: Core and Builtins + +Remove non-existent :meth:`~object.__copy__`, :meth:`~object.__deepcopy__`, +and :attr:`~type.__bases__` from the :meth:`~object.__dir__` entries of +:class:`types.GenericAlias`. + +.. + +.. date: 2025-08-30-17-15-05 +.. gh-issue: 69605 +.. nonce: KjBk99 +.. section: Core and Builtins + +Fix some standard library submodules missing from the :term:`REPL` +auto-completion of imports. + +.. + +.. date: 2025-08-28-09-29-46 +.. gh-issue: 116738 +.. nonce: yLZJpV +.. section: Core and Builtins + +Make :mod:`cProfile` thread-safe on the :term:`free threaded <free +threading>` build. + +.. + +.. date: 2025-08-21-06-31-42 +.. gh-issue: 138004 +.. nonce: FH2Hre +.. section: Core and Builtins + +On Solaris/Illumos platforms, thread names are now encoded as ASCII to avoid +errors on systems (e.g. OpenIndiana) that don't support non-ASCII names. + +.. + +.. date: 2025-08-13-13-39-02 +.. gh-issue: 137433 +.. nonce: g6Atfz +.. section: Core and Builtins + +Fix a potential deadlock in the :term:`free threading` build when daemon +threads enable or disable profiling or tracing while the main thread is +shutting down the interpreter. + +.. + +.. date: 2025-08-07-09-52-19 +.. gh-issue: 137400 +.. nonce: AK1dy- +.. section: Core and Builtins + +Fix a crash in the :term:`free threading` build when disabling profiling or +tracing across all threads with :c:func:`PyEval_SetProfileAllThreads` or +:c:func:`PyEval_SetTraceAllThreads` or their Python equivalents +:func:`threading.settrace_all_threads` and +:func:`threading.setprofile_all_threads`. + +.. + +.. date: 2025-08-05-17-22-24 +.. gh-issue: 58124 +.. nonce: q1__53 +.. section: Core and Builtins + +Fix name of the Python encoding in Unicode errors of the code page codec: +use "cp65000" and "cp65001" instead of "CP_UTF7" and "CP_UTF8" which are not +valid Python code names. Patch by Victor Stinner. + +.. + +.. date: 2025-07-09-21-27-14 +.. gh-issue: 132657 +.. nonce: kSA8R3 +.. section: Core and Builtins + +Improve performance of :class:`frozenset` by removing locks in the +free-threading build. + +.. + +.. date: 2025-05-11-09-40-19 +.. gh-issue: 133400 +.. nonce: zkWla8 +.. section: Core and Builtins + +Fixed Ctrl+D (^D) behavior in _pyrepl module to match old pre-3.13 REPL +behavior. + +.. + +.. date: 2025-01-08-12-52-47 +.. gh-issue: 128640 +.. nonce: 9nbh9z +.. section: Core and Builtins + +Fix a crash when using threads inside of a subinterpreter. + +.. + +.. date: 2025-11-21-10-34-00 +.. gh-issue: 137422 +.. nonce: tzZKLi +.. section: C API + +Fix :term:`free threading` race condition in +:c:func:`PyImport_AddModuleRef`. It was previously possible for two calls to +the function return two different objects, only one of which was stored in +:data:`sys.modules`. + +.. + +.. date: 2025-11-18-04-16-09 +.. gh-issue: 140042 +.. nonce: S1C7id +.. section: C API + +Removed the sqlite3_shutdown call that could cause closing connections for +sqlite when used with multiple sub interpreters. + +.. + +.. date: 2025-11-06-06-28-14 +.. gh-issue: 141042 +.. nonce: brOioJ +.. section: C API + +Make qNaN in :c:func:`PyFloat_Pack2` and :c:func:`PyFloat_Pack4`, if while +conversion to a narrower precision floating-point format --- the remaining +after truncation payload will be zero. Patch by Sergey B Kirpichev. + +.. + +.. date: 2025-10-26-16-45-06 +.. gh-issue: 140487 +.. nonce: fGOqss +.. section: C API + +Fix :c:macro:`Py_RETURN_NOTIMPLEMENTED` in limited C API 3.11 and older: +don't treat ``Py_NotImplemented`` as immortal. Patch by Victor Stinner. + +.. + +.. date: 2025-10-15-15-59-59 +.. gh-issue: 140153 +.. nonce: BO7sH4 +.. section: C API + +Fix :c:func:`Py_REFCNT` definition on limited C API 3.11-3.13. Patch by +Victor Stinner. + +.. + +.. date: 2025-10-06-22-17-47 +.. gh-issue: 139653 +.. nonce: 6-1MOd +.. section: C API + +Add :c:func:`PyUnstable_ThreadState_SetStackProtection` and +:c:func:`PyUnstable_ThreadState_ResetStackProtection` functions to set the +stack protection base address and stack protection size of a Python thread +state. Patch by Victor Stinner. + +.. + +.. date: 2025-11-28-19-49-01 +.. gh-issue: 141808 +.. nonce: cV5K12 +.. section: Build + +Do not generate the jit stencils twice in case of PGO builds on Windows. + +.. + +.. date: 2025-11-20-17-01-05 +.. gh-issue: 141784 +.. nonce: LkYI2n +.. section: Build + +Fix ``_remote_debugging_module.c`` compilation on 32-bit Linux. Include +Python.h before system headers to make sure that +``_remote_debugging_module.c`` uses the same types (ABI) than Python. Patch +by Victor Stinner. + +.. + +.. date: 2025-10-29-12-30-38 +.. gh-issue: 140768 +.. nonce: ITYrzw +.. section: Build + +Warn when the WASI SDK version doesn't match what's supported. + +.. + +.. date: 2025-10-25-08-07-06 +.. gh-issue: 140513 +.. nonce: 6OhLTs +.. section: Build + +Generate a clear compilation error when ``_Py_TAIL_CALL_INTERP`` is enabled +but either ``preserve_none`` or ``musttail`` is not supported. + +.. + +.. date: 2025-10-16-11-30-53 +.. gh-issue: 140189 +.. nonce: YCrUyt +.. section: Build + +iOS builds were added to CI. + +.. + +.. date: 2025-09-24-13-59-26 +.. gh-issue: 138489 +.. nonce: 1AcuZM +.. section: Build + +When cross-compiling for WASI by ``build_wasm`` or ``build_emscripten``, the +``build-details.json`` step is now included in the build process, just like +with native builds. + +This fixes the ``libinstall`` task which requires the ``build-details.json`` +file during the process. + +.. + +.. date: 2025-08-10-22-28-06 +.. gh-issue: 137618 +.. nonce: FdNvIE +.. section: Build + +``PYTHON_FOR_REGEN`` now requires Python 3.10 to Python 3.15. Patch by Adam +Turner. + +.. + +.. date: 2025-01-03-13-02-06 +.. gh-issue: 123681 +.. nonce: gQ67nK +.. section: Build + +Check the ``strftime()`` behavior at runtime instead of at the compile time +to support cross-compiling. Remove the internal macro +``_Py_NORMALIZE_CENTURY``. diff --git a/Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst b/Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst deleted file mode 100644 index a60b4607456096..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-01-03-13-02-06.gh-issue-123681.gQ67nK.rst +++ /dev/null @@ -1,3 +0,0 @@ -Check the ``strftime()`` behavior at runtime instead of at the compile time -to support cross-compiling. -Remove the internal macro ``_Py_NORMALIZE_CENTURY``. diff --git a/Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst b/Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst deleted file mode 100644 index 0b56c4c8f68566..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-08-10-22-28-06.gh-issue-137618.FdNvIE.rst +++ /dev/null @@ -1,2 +0,0 @@ -``PYTHON_FOR_REGEN`` now requires Python 3.10 to Python 3.15. -Patch by Adam Turner. diff --git a/Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst b/Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst deleted file mode 100644 index b11098a3f87953..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-09-24-13-59-26.gh-issue-138489.1AcuZM.rst +++ /dev/null @@ -1,6 +0,0 @@ -When cross-compiling for WASI by ``build_wasm`` or ``build_emscripten``, the -``build-details.json`` step is now included in the build process, just like -with native builds. - -This fixes the ``libinstall`` task which requires the ``build-details.json`` -file during the process. diff --git a/Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst b/Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst deleted file mode 100644 index a1b81659242670..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-10-16-11-30-53.gh-issue-140189.YCrUyt.rst +++ /dev/null @@ -1 +0,0 @@ -iOS builds were added to CI. diff --git a/Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst b/Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst deleted file mode 100644 index 1035ebf8d781cf..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-10-25-08-07-06.gh-issue-140513.6OhLTs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Generate a clear compilation error when ``_Py_TAIL_CALL_INTERP`` is enabled but -either ``preserve_none`` or ``musttail`` is not supported. diff --git a/Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst b/Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst deleted file mode 100644 index 0009f83cd20d8f..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-10-29-12-30-38.gh-issue-140768.ITYrzw.rst +++ /dev/null @@ -1 +0,0 @@ -Warn when the WASI SDK version doesn't match what's supported. diff --git a/Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst b/Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst deleted file mode 100644 index f20d84094162ac..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-11-20-17-01-05.gh-issue-141784.LkYI2n.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix ``_remote_debugging_module.c`` compilation on 32-bit Linux. Include -Python.h before system headers to make sure that -``_remote_debugging_module.c`` uses the same types (ABI) than Python. Patch -by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst b/Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst deleted file mode 100644 index 3162c7c41418cc..00000000000000 --- a/Misc/NEWS.d/next/Build/2025-11-28-19-49-01.gh-issue-141808.cV5K12.rst +++ /dev/null @@ -1 +0,0 @@ -Do not generate the jit stencils twice in case of PGO builds on Windows. diff --git a/Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst b/Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst deleted file mode 100644 index cd3d5262fa0f3a..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-10-06-22-17-47.gh-issue-139653.6-1MOd.rst +++ /dev/null @@ -1,4 +0,0 @@ -Add :c:func:`PyUnstable_ThreadState_SetStackProtection` and -:c:func:`PyUnstable_ThreadState_ResetStackProtection` functions to set the -stack protection base address and stack protection size of a Python thread -state. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst b/Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst deleted file mode 100644 index 502c48b6842d1c..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-10-15-15-59-59.gh-issue-140153.BO7sH4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :c:func:`Py_REFCNT` definition on limited C API 3.11-3.13. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst b/Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst deleted file mode 100644 index 16b0d9d4084ba0..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :c:macro:`Py_RETURN_NOTIMPLEMENTED` in limited C API 3.11 and older: -don't treat ``Py_NotImplemented`` as immortal. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst b/Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst deleted file mode 100644 index 22a1aa1f405318..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-11-06-06-28-14.gh-issue-141042.brOioJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Make qNaN in :c:func:`PyFloat_Pack2` and :c:func:`PyFloat_Pack4`, if while -conversion to a narrower precision floating-point format --- the remaining -after truncation payload will be zero. Patch by Sergey B Kirpichev. diff --git a/Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst b/Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst deleted file mode 100644 index 608e806b431372..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-11-18-04-16-09.gh-issue-140042.S1C7id.rst +++ /dev/null @@ -1 +0,0 @@ -Removed the sqlite3_shutdown call that could cause closing connections for sqlite when used with multiple sub interpreters. diff --git a/Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst b/Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst deleted file mode 100644 index 656289663cfebb..00000000000000 --- a/Misc/NEWS.d/next/C_API/2025-11-21-10-34-00.gh-issue-137422.tzZKLi.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix :term:`free threading` race condition in -:c:func:`PyImport_AddModuleRef`. It was previously possible for two calls to -the function return two different objects, only one of which was stored in -:data:`sys.modules`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst deleted file mode 100644 index 040c6d56c47244..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-01-08-12-52-47.gh-issue-128640.9nbh9z.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a crash when using threads inside of a subinterpreter. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst deleted file mode 100644 index 2498d6ebaa543e..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-11-09-40-19.gh-issue-133400.zkWla8.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed Ctrl+D (^D) behavior in _pyrepl module to match old pre-3.13 REPL behavior. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst deleted file mode 100644 index 99f7a990875a0a..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-09-21-27-14.gh-issue-132657.kSA8R3.rst +++ /dev/null @@ -1 +0,0 @@ -Improve performance of :class:`frozenset` by removing locks in the free-threading build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst deleted file mode 100644 index f875d4c5e785c6..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-17-22-24.gh-issue-58124.q1__53.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix name of the Python encoding in Unicode errors of the code page codec: -use "cp65000" and "cp65001" instead of "CP_UTF7" and "CP_UTF8" which are not -valid Python code names. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst deleted file mode 100644 index 406d6528840ba5..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-07-09-52-19.gh-issue-137400.AK1dy-.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a crash in the :term:`free threading` build when disabling profiling or -tracing across all threads with :c:func:`PyEval_SetProfileAllThreads` or -:c:func:`PyEval_SetTraceAllThreads` or their Python equivalents -:func:`threading.settrace_all_threads` and -:func:`threading.setprofile_all_threads`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst deleted file mode 100644 index 0389cb0c735128..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-13-13-39-02.gh-issue-137433.g6Atfz.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a potential deadlock in the :term:`free threading` build when daemon -threads enable or disable profiling or tracing while the main thread is -shutting down the interpreter. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst deleted file mode 100644 index e73be998f4be7b..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-21-06-31-42.gh-issue-138004.FH2Hre.rst +++ /dev/null @@ -1 +0,0 @@ -On Solaris/Illumos platforms, thread names are now encoded as ASCII to avoid errors on systems (e.g. OpenIndiana) that don't support non-ASCII names. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst deleted file mode 100644 index 2bb68035b56509..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-28-09-29-46.gh-issue-116738.yLZJpV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make :mod:`cProfile` thread-safe on the :term:`free threaded <free -threading>` build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst deleted file mode 100644 index d855470fc2b326..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-30-17-15-05.gh-issue-69605.KjBk99.rst +++ /dev/null @@ -1 +0,0 @@ -Fix some standard library submodules missing from the :term:`REPL` auto-completion of imports. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst deleted file mode 100644 index 968e92c94c1ffc..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-06-13-53-33.gh-issue-105487.a43YaY.rst +++ /dev/null @@ -1 +0,0 @@ -Remove non-existent :meth:`~object.__copy__`, :meth:`~object.__deepcopy__`, and :attr:`~type.__bases__` from the :meth:`~object.__dir__` entries of :class:`types.GenericAlias`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst deleted file mode 100644 index 248585e2eba995..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-06-11.gh-issue-138944.PeCgLb.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :exc:`SyntaxError` message when invalid syntax appears on the same line -as a valid ``import ... as ...`` or ``from ... import ... as ...`` -statement. Patch by Brian Schubert. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst deleted file mode 100644 index 4fae7e0d6f6326..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-14-04-56.gh-issue-134466.yR4fYW.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't run PyREPL in a degraded environment where setting termios attributes -is not allowed. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst deleted file mode 100644 index 23c995d2452f7b..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-17-17-17-21.gh-issue-138558.0VbzCH.rst +++ /dev/null @@ -1 +0,0 @@ -Fix handling of unusual t-string annotations in annotationlib. Patch by Dave Peck. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst deleted file mode 100644 index 0668d57604bc43..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-21-14-33-17.gh-issue-116738.vNaI4h.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make :mod:`mmap` thread-safe on the :term:`free threaded <free threading>` -build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst deleted file mode 100644 index 5eafe0813dc933..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-01-18-21-19.gh-issue-63161.ef1S6N.rst +++ /dev/null @@ -1,5 +0,0 @@ -Support non-UTF-8 shebang and comments in Python source files if non-UTF-8 -encoding is specified. Detect decoding error in comments for default (UTF-8) -encoding. Show the line and position of decoding error for default encoding -in a traceback. Show the line containing the coding cookie when it conflicts -with the BOM in a traceback. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst deleted file mode 100644 index 396e40f0e1360b..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix swallowing some syntax warnings in different modules if they -accidentally have the same message and are emitted from the same line. -Fix duplicated warnings in the ``finally`` block. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst deleted file mode 100644 index b147b430ccccf5..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-10-03-37.gh-issue-139640.gY5oTb2.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`ast.parse` no longer emits syntax warnings for -``return``/``break``/``continue`` in ``finally`` (see :pep:`765`) -- they are -only emitted during compilation. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst deleted file mode 100644 index a709112306025f..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-06-13-15-26.gh-issue-139516.d9Pkur.rst +++ /dev/null @@ -1 +0,0 @@ -Fix lambda colon erroneously start format spec in f-string in tokenizer. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst deleted file mode 100644 index 3b190f3f6df6e3..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-08-13-52-00.gh-issue-139748.jq0yFJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix reference leaks in error branches of functions accepting path strings or -bytes such as :func:`compile` and :func:`os.system`. Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst deleted file mode 100644 index 60fa3b1d339cb1..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-12-11-00-06.gh-issue-139988.4wi51t.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a memory leak when failing to create a :class:`~typing.Union` type. -Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst deleted file mode 100644 index 7529108d5d4772..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-13-54-19.gh-issue-139914.M-y_3E.rst +++ /dev/null @@ -1 +0,0 @@ -Restore support for HP PA-RISC, which has an upwards-growing stack. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst deleted file mode 100644 index 2c6259635eaf04..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-13-17-56-23.gh-issue-140000.tLhn3e.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix potential memory leak when a reference cycle exists between an instance -of :class:`typing.TypeAliasType`, :class:`typing.TypeVar`, -:class:`typing.ParamSpec`, or :class:`typing.TypeVarTuple` and its -``__name__`` attribute. Patch by Mikhail Efimov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst deleted file mode 100644 index 3c5a828101d9a8..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory leak in sub-interpreter creation. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst deleted file mode 100644 index 7c3924195eb85f..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-15-00-21-40.gh-issue-140061.J0XeDV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixing the checking of whether an object is uniquely referenced to ensure -free-threaded compatibility. Patch by Sergey Miryanov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst deleted file mode 100644 index 1c18cbc9ad0588..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported -by Daniel Diniz. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst deleted file mode 100644 index e03996188a7e22..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-18-03-12.gh-issue-139951.IdwM2O.rst +++ /dev/null @@ -1,7 +0,0 @@ -Fixes a regression in GC performance for a growing heap composed mostly of -small tuples. - -* Counts number of actually tracked objects, instead of trackable objects. - This ensures that untracking tuples has the desired effect of reducing GC overhead. -* Does not track most untrackable tuples during creation. - This prevents large numbers of small tuples causing excessive GCs. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst deleted file mode 100644 index 50f7e0e48ae369..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-17-20-23-19.gh-issue-140257.8Txmem.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix data race between interpreter_clear() and take_gil() on eval_breaker -during finalization with daemon threads. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst deleted file mode 100644 index 8b1c81c04ece92..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-18-08-36.gh-issue-140301.m-2HxC.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory leak of ``PyConfig`` in subinterpreters. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst deleted file mode 100644 index 2178c4960636cb..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-18-21-29-45.gh-issue-140306.xS5CcS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leaks in cross-interpreter channel operations and shared -namespace handling. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst deleted file mode 100644 index 739228f7e36f20..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-20-11-24-36.gh-issue-140358.UQuKdV.rst +++ /dev/null @@ -1,4 +0,0 @@ -Restore elapsed time and unreachable object count in GC debug output. These -were inadvertently removed during a refactor of ``gc.c``. The debug log now -again reports elapsed collection time and the number of unreachable objects. -Contributed by Pål Grønås Drange. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst deleted file mode 100644 index 3506ba42581faa..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-06-51-50.gh-issue-140406.0gJs8M.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leak when an object's :meth:`~object.__hash__` method returns an -object that isn't an :class:`int`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst deleted file mode 100644 index 481dac7f26dd5e..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix memory leaks in :mod:`readline` functions -:func:`~readline.read_init_file`, :func:`~readline.read_history_file`, -:func:`~readline.write_history_file`, and -:func:`~readline.append_history_file` when :c:func:`PySys_Audit` fails. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst deleted file mode 100644 index 3d62d210f1f007..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-22-17-22-22.gh-issue-140431.m8D_A-.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a crash in Python's :term:`garbage collector <garbage collection>` due to -partially initialized :term:`coroutine` objects when coroutine origin tracking -depth is enabled (:func:`sys.set_coroutine_origin_tracking_depth`). diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst deleted file mode 100644 index afa9326fff3aee..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-23-16-05-50.gh-issue-140471.Ax_aXn.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix potential buffer overflow in :class:`ast.AST` node initialization when -encountering malformed :attr:`~ast.AST._fields` containing non-:class:`str`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst deleted file mode 100644 index 15aaea8ab027e3..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-16-42.gh-issue-140517.cqun-K.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed a reference leak when iterating over the result of :func:`map` -with ``strict=True`` when the input iterables have different lengths. -Patch by Mikhail Efimov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst deleted file mode 100644 index 8fd9b46c0aeabe..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-24-20-42-33.gh-issue-140551.-9swrl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed crash in :class:`dict` if :meth:`dict.clear` is called at the lookup -stage. Patch by Mikhail Efimov and Inada Naoki. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst deleted file mode 100644 index 2c27525d9f782c..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-25-17-36-46.gh-issue-140576.kj0SCY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed crash in :func:`tokenize.generate_tokens` in case of -specific incorrect input. Patch by Mikhail Efimov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst deleted file mode 100644 index c9a97037920fda..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-29-20-59-10.gh-issue-140373.-uoaPP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correctly emit ``PY_UNWIND`` event when generator object is closed. Patch by -Mikhail Efimov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst deleted file mode 100644 index e3af493893afcb..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-12-47-38.gh-issue-140530.S934bp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a reference leak when ``raise exc from cause`` fails. Patch by Bénédikt -Tran. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst deleted file mode 100644 index 96bf9b51e4862c..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-02-15-28-33.gh-issue-140260.JNzlGz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :mod:`struct` data race in endian table initialization with -subinterpreters. Patch by Shamil Abdulaev. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst deleted file mode 100644 index a2921761f75556..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-03-17-21-38.gh-issue-140939.FVboAw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leak when :class:`bytearray` or :class:`bytes` is formated with the -``%*b`` format with a large width that results in a :exc:`MemoryError`. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst deleted file mode 100644 index 8b08bccafd73eb..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-00-14-20.gh-issue-116738.IxliC_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make csv module thread-safe on the :term:`free threaded <free threading>` -build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst deleted file mode 100644 index fdb136cef3f33c..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-10-23-07-06.gh-issue-141312.H-58GB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the assertion failure in the ``__setstate__`` method of the range iterator -when a non-integer argument is passed. Patch by Sergey Miryanov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst deleted file mode 100644 index a51aa49522866b..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-00-19-45.gh-issue-141528.VWdax1.rst +++ /dev/null @@ -1,3 +0,0 @@ -Suggest using :meth:`concurrent.interpreters.Interpreter.close` instead of the -private ``_interpreters.destroy`` function when warning about remaining subinterpreters. -Patch by Sergey Miryanov. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst deleted file mode 100644 index 883f9333cae880..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-14-16-25-15.gh-issue-114203.n3tlQO.rst +++ /dev/null @@ -1 +0,0 @@ -Skip locking if object is already locked by two-mutex critical section. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst deleted file mode 100644 index 8ab9979c39917b..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-01-21-00.gh-issue-141579.aB7cD9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`sys.activate_stack_trampoline` to properly support the -``perf_jit`` backend. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst deleted file mode 100644 index c038dc742ccec9..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-15-23-58-23.gh-issue-139103.9cVYJ0.rst +++ /dev/null @@ -1 +0,0 @@ -Improve multithreaded scaling of dataclasses on the free-threaded build. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst deleted file mode 100644 index c3ae0e8adab319..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-17-14-40-45.gh-issue-139653.LzOy1M.rst +++ /dev/null @@ -1,4 +0,0 @@ -Only raise a ``RecursionError`` or trigger a fatal error if the stack -pointer is both below the limit pointer *and* above the stack base. If -outside of these bounds assume that it is OK. This prevents false positives -when user-space threads swap stacks. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst deleted file mode 100644 index b3b5f252ac07cb..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix inconsistent state when enabling or disabling monitoring events too many -times. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst deleted file mode 100644 index 06a12f98224e88..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-24-21-09-30.gh-issue-141930.hIIzSd.rst +++ /dev/null @@ -1,2 +0,0 @@ -When importing a module, use Python's regular file object to ensure that -writes to ``.pyc`` files are complete or an appropriate error is raised. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst deleted file mode 100644 index 151f8968292a61..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-25-13-13-34.gh-issue-116738.MnZRdV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix thread safety issue with :mod:`re` scanner objects in free-threaded -builds. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst deleted file mode 100644 index 1400dae13ffe32..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-20-41-26.gh-issue-142048.c2YosX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix quadratically increasing garbage collection delays in free-threaded -build. diff --git a/Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst b/Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst deleted file mode 100644 index 702d38d4d24df6..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2025-10-27-23-06-01.gh-issue-140578.FMBdEn.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove outdated sencence in the documentation for :mod:`multiprocessing`, -that implied that :class:`concurrent.futures.ThreadPoolExecutor` did not -exist. diff --git a/Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst b/Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst deleted file mode 100644 index c370e8a86e1766..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2025-11-26-23-30-09.gh-issue-141994.arBEG6.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`xml.sax.handler`: Make Documentation of -:data:`xml.sax.handler.feature_external_ges` warn of opening up to `external -entity attacks <https://en.wikipedia.org/wiki/XML_external_entity_attack>`_. -Patch by Sebastian Pipping. diff --git a/Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst b/Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst deleted file mode 100644 index c9e2f977a7967d..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2025-10-08-08-35-50.gh-issue-139742.B3fZLg.rst +++ /dev/null @@ -1 +0,0 @@ -Colorize t-string prefixes for template strings in IDLE, as done for f-string prefixes. diff --git a/Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst b/Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst deleted file mode 100644 index beb6ef5ade562f..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2025-10-09-12-53-47.gh-issue-96491.4YKxvy.rst +++ /dev/null @@ -1 +0,0 @@ -Deduplicate version number in IDLE shell title bar after saving to a file. diff --git a/Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst b/Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst deleted file mode 100644 index 760660408100d5..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-23-11-54-17.bpo-41839.kU5Ywl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow negative priority values from :func:`os.sched_get_priority_min` and -:func:`os.sched_get_priority_max` functions. diff --git a/Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst b/Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst deleted file mode 100644 index 7f4ea04284e10b..00000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-07-16-56-57.bpo-38735.NFfJX6.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix failure when importing a module from the root directory on unix-like -platforms with sys.pycache_prefix set. diff --git a/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst b/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst deleted file mode 100644 index cc8a6e73942203..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-02-13-20-34-52.gh-issue-78319.V1zzed.rst +++ /dev/null @@ -1 +0,0 @@ -UTF8 support for the IMAP APPEND command has been made RFC compliant. diff --git a/Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst b/Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst deleted file mode 100644 index e82ddb6e1011ad..00000000000000 --- a/Misc/NEWS.d/next/Library/2023-03-21-10-59-40.gh-issue-102431.eUDnf4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clarify constraints for "logical" arguments in methods of -:class:`decimal.Context`. diff --git a/Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst b/Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst deleted file mode 100644 index 72b9f6c9e4eb99..00000000000000 --- a/Misc/NEWS.d/next/Library/2024-05-13-09-50-31.gh-issue-118981.zgOQPv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix potential hang in ``multiprocessing.popen_spawn_posix`` that can happen -when the child proc dies early by closing the child fds right away. diff --git a/Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst b/Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst deleted file mode 100644 index 525802405bd8bd..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-03-27-08-13-32.gh-issue-131788.0RWiFc.rst +++ /dev/null @@ -1 +0,0 @@ -Make ``ResourceTracker.send`` from :mod:`multiprocessing` re-entrant safe diff --git a/Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst b/Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst deleted file mode 100644 index c8743d49ca01d2..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-04-16-21-02-57.gh-issue-132551.Psa7pL.rst +++ /dev/null @@ -1 +0,0 @@ -Make :class:`io.BytesIO` safe in :term:`free-threaded <free threading>` build. diff --git a/Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst b/Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst deleted file mode 100644 index 30643673bf9a3f..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-04-21-01-05-14.gh-issue-127081.Egrpq7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix libc thread safety issues with :mod:`dbm` by performing stateful -operations in critical sections. diff --git a/Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst b/Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst deleted file mode 100644 index d2a4f7f42c3b38..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-05-10-15-10-54.gh-issue-133789.I-ZlUX.rst +++ /dev/null @@ -1 +0,0 @@ -Fix unpickling of :mod:`pathlib` objects that were pickled in Python 3.13. diff --git a/Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst b/Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst deleted file mode 100644 index 4bbfaa3a5e2d85..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-05-10-17-42-03.gh-issue-125996.vaQp0-.rst +++ /dev/null @@ -1 +0,0 @@ -Fix thread safety of :class:`collections.OrderedDict`. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst b/Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst deleted file mode 100644 index cf3901aba34ebc..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-05-26-10-52-27.gh-issue-134698.aJ1mZ1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash when calling methods of :class:`ssl.SSLContext` or -:class:`ssl.SSLSocket` across multiple threads. diff --git a/Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst b/Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst deleted file mode 100644 index fee975ea70230c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-05-30-18-37-44.gh-issue-134453.kxkA-o.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed :func:`subprocess.Popen.communicate` ``input=`` handling of :class:`memoryview` -instances that were non-byte shaped on POSIX platforms. Those are now properly -cast to a byte shaped view instead of truncating the input. Windows platforms -did not have this bug. diff --git a/Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst b/Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst deleted file mode 100644 index 47e1feb5cbff09..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-10-18-02-29.gh-issue-135307.fXGrcK.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`email`: Fix exception in ``set_content()`` when encoding text -and max_line_length is set to ``0`` or ``None`` (unlimited). diff --git a/Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst b/Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst deleted file mode 100644 index 195253b1ec1e39..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-10-21-00-48.gh-issue-126631.eITVJd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :mod:`multiprocessing` ``forkserver`` bug which prevented ``__main__`` -from being preloaded. diff --git a/Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst b/Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst deleted file mode 100644 index e1182f56eb33ab..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-16-12-37-02.gh-issue-135444.An2eeA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`asyncio.DatagramTransport.sendto` to account for datagram header size when -data cannot be sent. diff --git a/Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst b/Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst deleted file mode 100644 index dbf1f4525092c6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-06-16-15-00-13.gh-issue-135386.lNrxLc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix opening a :mod:`dbm.sqlite3` database for reading from read-only file -or directory. diff --git a/Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst b/Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst deleted file mode 100644 index e237a0e98cc486..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-01-04-57-57.gh-issue-136057.4-t596.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed the bug in :mod:`pdb` and :mod:`bdb` where ``next`` and ``step`` can't go over the line if a loop exists in the line. diff --git a/Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst b/Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst deleted file mode 100644 index b72fd26b38a83b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-10-21-02-43.gh-issue-136507.pnEuGS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix mimetypes CLI to handle multiple file parameters. diff --git a/Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst b/Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst deleted file mode 100644 index 044a601c9170a1..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-17-16-12-23.gh-issue-136234.VmTxtj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :meth:`asyncio.WriteTransport.writelines` to be robust to connection -failure, by using the same behavior as :meth:`~asyncio.WriteTransport.write`. diff --git a/Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst b/Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst deleted file mode 100644 index 0c1a16cdb29f43..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-21-01-16-32.gh-issue-83424.Y3tEV4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allows creating a :class:`ctypes.CDLL` without name when passing a handle as -an argument. diff --git a/Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst b/Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst deleted file mode 100644 index 6c5f31145f76d1..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-21-11-56-47.gh-issue-136912.zWosAL.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`hmac.digest` now properly handles large keys and messages -by falling back to the pure Python implementation when necessary. -Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst b/Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst deleted file mode 100644 index 78ec8025fbc0fd..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-21-15-40-00.gh-issue-136914.-GNG-d.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix retrieval of :attr:`doctest.DocTest.lineno` for objects decorated with -:func:`functools.cache` or :class:`functools.cached_property`. diff --git a/Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst b/Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst deleted file mode 100644 index 89398dff147394..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-28-20-48-32.gh-issue-137185.fgI7-B.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a potential async-signal-safety issue in :mod:`faulthandler` when -printing C stack traces. diff --git a/Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst b/Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst deleted file mode 100644 index 3d89b6eb92a0d6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-28-23-11-29.gh-issue-81325.jMJFBe.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`tarfile.TarFile` now accepts a :term:`path-like <path-like object>` when working on a tar archive. -(Contributed by Alexander Enrique Urieles Nieto in :gh:`81325`.) diff --git a/Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst b/Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst deleted file mode 100644 index 3be583ee937f8c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-07-30-17-42-36.gh-issue-137239.qSpj32.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`heapq`: Update :data:`!heapq.__all__` with ``*_max`` functions. diff --git a/Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst b/Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst deleted file mode 100644 index f344877955fea0..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-01-15-07-59.gh-issue-137273.4V8Xmv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix debug assertion failure in :func:`locale.setlocale` on Windows. diff --git a/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst b/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst deleted file mode 100644 index 7c2c013016d72e..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-01-23-11-25.gh-issue-137017.0yGcNc.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :obj:`threading.Thread.is_alive` to remain ``True`` until the underlying OS -thread is fully cleaned up. This avoids false negatives in edge cases -involving thread monitoring or premature :obj:`threading.Thread.is_alive` calls. diff --git a/Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst b/Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst deleted file mode 100644 index 00b15503b50ba3..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-01-23-52-49.gh-issue-75989.5aYXNJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`tarfile.TarFile.extractall` and :func:`tarfile.TarFile.extract` now -overwrite symlinks when extracting hardlinks. -(Contributed by Alexander Enrique Urieles Nieto in :gh:`75989`.) diff --git a/Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst b/Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst deleted file mode 100644 index f5f96263823e86..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-03-13-16-39.gh-issue-137044.0hPVL_.rst +++ /dev/null @@ -1,4 +0,0 @@ -Return large limit values as positive integers instead of negative integers -in :func:`resource.getrlimit`. Accept large values and reject negative -values (except :data:`~resource.RLIM_INFINITY`) for limits in -:func:`resource.setrlimit`. diff --git a/Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst b/Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst deleted file mode 100644 index a6e097ea026293..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-06-23-16-42.gh-issue-137477.bk6BDV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`!inspect.getblock`, :func:`inspect.getsourcelines` and -:func:`inspect.getsource` for generator expressions. diff --git a/Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst b/Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst deleted file mode 100644 index bcb0938b8e3acb..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-07-17-18-57.gh-issue-137490.s89ieZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Handle :data:`~errno.ECANCELED` in the same way as :data:`~errno.EINTR` in -:func:`signal.sigwaitinfo` on NetBSD. diff --git a/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst b/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst deleted file mode 100644 index 323870afd97106..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix import of the :mod:`zoneinfo` module if the C implementation of the -:mod:`datetime` module is not available. diff --git a/Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst b/Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst deleted file mode 100644 index 026cc320455963..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-16-16-04-15.gh-issue-137317.Dl13B5.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`inspect.signature` now correctly handles classes that use a descriptor -on a wrapped :meth:`!__init__` or :meth:`!__new__` method. -Contributed by Yongyu Yan. diff --git a/Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst b/Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst deleted file mode 100644 index de29f536afc95e..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-26-08-17-56.gh-issue-138151.I6CdAk.rst +++ /dev/null @@ -1,3 +0,0 @@ -In :mod:`annotationlib`, improve evaluation of forward references to -nonlocal variables that are not yet defined when the annotations are -initially evaluated. diff --git a/Misc/NEWS.d/next/Library/2025-08-27-17-05-36.gh-issue-138010.ZZJmPL.rst b/Misc/NEWS.d/next/Library/2025-08-27-17-05-36.gh-issue-138010.ZZJmPL.rst deleted file mode 100644 index 117f3ad6c6761b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-27-17-05-36.gh-issue-138010.ZZJmPL.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix an issue where defining a class with an :func:`@warnings.deprecated -<warnings.deprecated>`-decorated base class may not invoke the correct -:meth:`~object.__init_subclass__` method in cases involving multiple -inheritance. Patch by Brian Schubert. diff --git a/Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst b/Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst deleted file mode 100644 index 8eb5497f5da545..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-28-13-20-09.gh-issue-138204.8oLOud.rst +++ /dev/null @@ -1,2 +0,0 @@ -Forbid expansion of shared anonymous :mod:`memory maps <mmap>` on Linux, -which caused a bus error. diff --git a/Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst b/Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst deleted file mode 100644 index 9e0218e02664c6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-29-12-56-55.gh-issue-138239.uthZFI.rst +++ /dev/null @@ -1,2 +0,0 @@ -The REPL now highlights :keyword:`type` as a soft keyword -in :ref:`type statements <type>`. diff --git a/Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst b/Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst deleted file mode 100644 index 1365b1bfdf28f6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-30-10-04-28.gh-issue-60462.yh_vDc.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :func:`locale.strxfrm` on Solaris (and possibly other platforms). diff --git a/Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst b/Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst deleted file mode 100644 index 40930b8ccbd9ca..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-08-31-09-06-49.gh-issue-138008.heOvsU.rst +++ /dev/null @@ -1 +0,0 @@ -Fix segmentation faults in the :mod:`ctypes` module due to invalid :attr:`~ctypes._CFuncPtr.argtypes`. Patch by Dung Nguyen. diff --git a/Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst b/Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst deleted file mode 100644 index b48b978a6d5c75..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-03-15-20-10.gh-issue-138432.RMc7UX.rst +++ /dev/null @@ -1,6 +0,0 @@ -:meth:`zoneinfo.reset_tzpath` will now convert any :class:`os.PathLike` objects -it receives into strings before adding them to ``TZPATH``. It will raise -``TypeError`` if anything other than a string is found after this conversion. -If given an :class:`os.PathLike` object that represents a relative path, it -will now raise ``ValueError`` instead of ``TypeError``, and present a more -informative error message. diff --git a/Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst b/Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst deleted file mode 100644 index 328e5988cb0b51..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-03-18-26-07.gh-issue-138425.cVE9Ho.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix partial evaluation of :class:`annotationlib.ForwardRef` objects which rely -on names defined as globals. diff --git a/Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst b/Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst deleted file mode 100644 index 6831499c0afb43..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-03-20-18-39.gh-issue-98896.tjez89.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a failure in multiprocessing resource_tracker when SharedMemory names contain colons. -Patch by Rani Pinchuk. diff --git a/Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst b/Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst deleted file mode 100644 index a86e71e052d9f1..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-04-15-18-11.gh-issue-111788.tuTEM5.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix parsing errors in the :mod:`urllib.robotparser` module. -Don't fail trying to parse weird paths. -Don't fail trying to decode non-UTF-8 ``robots.txt`` files. diff --git a/Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst b/Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst deleted file mode 100644 index 1660f39ddb1d3c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-05-15-35-59.gh-issue-88375.dC491a.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix normalization of the ``robots.txt`` rules and URLs in the -:mod:`urllib.robotparser` module. No longer ignore trailing ``?``. -Distinguish raw special characters ``?``, ``=`` and ``&`` from the -percent-encoded ones. diff --git a/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst b/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst deleted file mode 100644 index 9eed50ec20a8f6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the partial evaluation of annotations that use ``typing.Annotated[T, x]`` where ``T`` is a forward reference. diff --git a/Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst b/Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst deleted file mode 100644 index d54f21ffb89669..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-11-11-09-28.gh-issue-138779.TNZnLr.rst +++ /dev/null @@ -1,3 +0,0 @@ -Support device numbers larger than ``2**63-1`` for the -:attr:`~os.stat_result.st_rdev` field of the :class:`os.stat_result` -structure. diff --git a/Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst b/Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst deleted file mode 100644 index 455c1a9925a5e1..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-11-15-03-37.gh-issue-138775.w7rnSx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use of ``python -m`` with :mod:`base64` has been fixed to detect input from a -terminal so that it properly notices EOF. diff --git a/Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst b/Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst deleted file mode 100644 index 85ebef8ff11d5c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-12-09-34-37.gh-issue-138764.mokHoY.rst +++ /dev/null @@ -1,3 +0,0 @@ -Prevent :func:`annotationlib.call_annotate_function` from calling ``__annotate__`` functions that don't support ``VALUE_WITH_FAKE_GLOBALS`` in a fake globals namespace with empty globals. - -Make ``FORWARDREF`` and ``STRING`` annotations fall back to using ``VALUE`` annotations in the case that neither their own format, nor ``VALUE_WITH_FAKE_GLOBALS`` are supported. diff --git a/Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst b/Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst deleted file mode 100644 index a5d4dd042fcd5b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-13-12-19-17.gh-issue-138859.PxjIoN.rst +++ /dev/null @@ -1 +0,0 @@ -Fix generic type parameterization raising a :exc:`TypeError` when omitting a :class:`ParamSpec` that has a default which is not a list of types. diff --git a/Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst b/Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst deleted file mode 100644 index c194b2331e5f4a..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-15-19-29-12.gh-issue-130567.shDEnT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crash in :func:`locale.strxfrm` due to a platform bug on -macOS. diff --git a/Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst b/Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst deleted file mode 100644 index f7ecb05d20c241..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-15-21-03-11.gh-issue-138891.oZFdtR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``SyntaxError`` when ``inspect.get_annotations(f, eval_str=True)`` is -called on a function annotated with a :pep:`646` ``star_expression`` diff --git a/Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst b/Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst deleted file mode 100644 index 1be588f2ba568c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-16-16-46-58.gh-issue-138993.-8s8_T.rst +++ /dev/null @@ -1 +0,0 @@ -Dedent :data:`credits` text. diff --git a/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst b/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst deleted file mode 100644 index 97f4d76bb2f454..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`!multiprocessing.BaseProcess` defaults ``kwargs`` to ``None`` instead of a shared dictionary. diff --git a/Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst b/Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst deleted file mode 100644 index 3ad5a1272df4af..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-17-12-07-21.gh-issue-139001.O6tseN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix race condition in :class:`pathlib.Path` on the internal ``_raw_paths`` -field. diff --git a/Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst b/Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst deleted file mode 100644 index 20c00603959276..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-17-19-08-34.gh-issue-139065.Hu8fM5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix trailing space before a wrapped long word if the line length is exactly -*width* in :mod:`textwrap`. diff --git a/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst b/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst deleted file mode 100644 index 5e0ae6ed73edd4..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-17-21-54-53.gh-issue-139076.2eX9lG.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a bug in the :mod:`pydoc` module that was hiding functions in a Python -module if they were implemented in an extension module and the module did -not have ``__all__``. diff --git a/Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst b/Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst deleted file mode 100644 index 1777839a1bf633..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-18-05-32-18.gh-issue-135729.8AmMza.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix unraisable exception during finalization when using -:mod:`concurrent.interpreters` in the REPL. diff --git a/Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst b/Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst deleted file mode 100644 index 950853a696f315..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-19-09-36-42.gh-issue-112729.mmty0_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix crash when calling :func:`concurrent.interpreters.create` when the -process is out of memory. diff --git a/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst b/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst deleted file mode 100644 index 0903eb71ae4346..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-20-17-50-31.gh-issue-138860.Y9JXap.rst +++ /dev/null @@ -1 +0,0 @@ -Lazy import :mod:`rlcompleter` in :mod:`pdb` to avoid deadlock in subprocess. diff --git a/Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst b/Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst deleted file mode 100644 index 1227b29a68a9d7..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-21-15-58-57.gh-issue-139210.HGbMvz.rst +++ /dev/null @@ -1 +0,0 @@ -Fix use-after-free when reporting unknown event in :func:`xml.etree.ElementTree.iterparse`. Patch by Ken Jin. diff --git a/Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst b/Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst deleted file mode 100644 index 5611f33fb8e37b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-22-14-40-11.gh-issue-90949.UM35nb.rst +++ /dev/null @@ -1,5 +0,0 @@ -Add :meth:`~xml.parsers.expat.xmlparser.SetAllocTrackerActivationThreshold` -and :meth:`~xml.parsers.expat.xmlparser.SetAllocTrackerMaximumAmplification` -to :ref:`xmlparser <xmlparser-objects>` objects to prevent use of -disproportional amounts of dynamic memory from within an Expat parser. -Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst b/Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst deleted file mode 100644 index a816bda5cfe8e8..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-23-09-46-46.gh-issue-139246.pzfM-w.rst +++ /dev/null @@ -1 +0,0 @@ -fix: paste zero-width in default repl width is wrong. diff --git a/Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst b/Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst deleted file mode 100644 index 04162619cf218b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-24-14-17-34.gh-issue-139289.Vmk25k.rst +++ /dev/null @@ -1 +0,0 @@ -Do a real lazy-import on :mod:`rlcompleter` in :mod:`pdb` and restore the existing completer after importing :mod:`rlcompleter`. diff --git a/Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst b/Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst deleted file mode 100644 index 1d100180c072ec..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-25-20-16-10.gh-issue-101828.yTxJlJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix ``'shift_jisx0213'``, ``'shift_jis_2004'``, ``'euc_jisx0213'`` and -``'euc_jis_2004'`` codecs truncating null chars -as they were treated as part of multi-character sequences. diff --git a/Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst b/Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst deleted file mode 100644 index 93d1ce613bc2d6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-28-16-34-11.gh-issue-139391.nRFnmx.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an issue when, on non-Windows platforms, it was not possible to -gracefully exit a ``python -m asyncio`` process suspended by Ctrl+Z -and later resumed by :manpage:`fg` other than with :manpage:`kill`. diff --git a/Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst b/Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst deleted file mode 100644 index 3daed20d099a8a..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-09-30-12-52-54.gh-issue-63161.mECM1A.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :func:`tokenize.detect_encoding`. Support non-UTF-8 shebang and comments -if non-UTF-8 encoding is specified. Detect decoding error for non-UTF-8 -encoding. Detect null bytes in source code. diff --git a/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst b/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst deleted file mode 100644 index d20f881eb09d55..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-02-17-40-10.gh-issue-70765.zVlLZn.rst +++ /dev/null @@ -1,5 +0,0 @@ -:mod:`http.server`: fix default handling of HTTP/0.9 requests in -:class:`~http.server.BaseHTTPRequestHandler`. Previously, -:meth:`!BaseHTTPRequestHandler.parse_request` incorrectly -waited for headers in the request although those are not -supported in HTTP/0.9. Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst b/Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst deleted file mode 100644 index 820679632d1e26..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-08-00-06-30.gh-issue-139736.baPeBd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix excessive indentation in the default :mod:`argparse` -:class:`!HelpFormatter`. Patch by Alexander Edland. diff --git a/Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst b/Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst deleted file mode 100644 index 498b8f7fd27bd3..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-09-03-06-19.gh-issue-139809.lzHJNu.rst +++ /dev/null @@ -1 +0,0 @@ -Prevent premature colorization of subparser ``prog`` in :meth:`argparse.ArgumentParser.add_subparsers` to respect color environment variable changes after parser creation. diff --git a/Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst b/Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst deleted file mode 100644 index 336653e73bfa98..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-09-13-48-28.gh-issue-139783.__NUgo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`inspect.getsourcelines` for the case when a decorator is followed -by a comment or an empty line. diff --git a/Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst b/Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst deleted file mode 100644 index 3cd294e49cdda3..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-09-21-37-20.gh-issue-139845.dzx5UP.rst +++ /dev/null @@ -1 +0,0 @@ -Fix to not print KeyboardInterrupt twice in default asyncio REPL. diff --git a/Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst b/Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst deleted file mode 100644 index 05a977ad119e07..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-10-11-22-50.gh-issue-139894.ECAXqj.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect sharing of current task with the child process while forking in :mod:`asyncio`. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst b/Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst deleted file mode 100644 index a6876ca2df8299..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-11-10-02-56.gh-issue-139905.UyJIR_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add suggestion to error message for :class:`typing.Generic` subclasses when -``cls.__parameters__`` is missing due to a parent class failing to call -:meth:`super().__init_subclass__() <object.__init_subclass__>` in its ``__init_subclass__``. diff --git a/Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst b/Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst deleted file mode 100644 index 9eefe1405203bd..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-15-20-47-04.gh-issue-140120.3gffZq.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a memory leak in :mod:`hmac` when it was using the hacl-star backend. -Discovered by ``@ashm-dev`` using AddressSanitizer. diff --git a/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst b/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst deleted file mode 100644 index 243ff39311cf06..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst +++ /dev/null @@ -1 +0,0 @@ -Fix import of :mod:`ctypes` on Android and Cygwin when ABI flags are present. diff --git a/Misc/NEWS.d/next/Library/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst b/Misc/NEWS.d/next/Library/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst deleted file mode 100644 index 666a45055f5a58..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-17-23-58-11.gh-issue-140272.lhY8uS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory leak in the :meth:`!clear` method of the :mod:`dbm.gnu` database. diff --git a/Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst b/Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst deleted file mode 100644 index 16d5b2a8bf03d0..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-20-12-33-49.gh-issue-140348.SAKnQZ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix regression in Python 3.14.0 where using the ``|`` operator on a -:class:`typing.Union` object combined with an object that is not a type -would raise an error. diff --git a/Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst b/Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst deleted file mode 100644 index 4ff55b41dea96e..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-21-15-54-13.gh-issue-137530.ZyIVUH.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`dataclasses` Fix annotations for generated ``__init__`` methods by replacing the annotations that were in-line in the generated source code with ``__annotate__`` functions attached to the methods. diff --git a/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst b/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst deleted file mode 100644 index aca4e68b1e5e49..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix memory leak in :class:`array.array` when creating arrays from an empty -:class:`str` and the ``u`` type code. diff --git a/Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst b/Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst deleted file mode 100644 index e12f789e674454..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-23-12-12-22.gh-issue-138774.mnh2gU.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`ast.unparse` now generates full source code when handling -:class:`ast.Interpolation` nodes that do not have a specified source. diff --git a/Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst b/Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst deleted file mode 100644 index ef7a90bc37e650..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-23-19-39-16.gh-issue-138162.Znw5DN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :class:`logging.LoggerAdapter` with ``merge_extra=True`` and without the -*extra* argument. diff --git a/Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst b/Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst deleted file mode 100644 index cc33217c9f563e..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-25-21-04-00.gh-issue-140607.oOZGxS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Inside :meth:`io.RawIOBase.read`, validate that the count of bytes returned by -:meth:`io.RawIOBase.readinto` is valid (inside the provided buffer). diff --git a/Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst b/Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst deleted file mode 100644 index 612ad82dc64309..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-25-21-26-16.gh-issue-140593.OxlLc9.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`xml.parsers.expat`: Fix a memory leak that could affect users with -:meth:`~xml.parsers.expat.xmlparser.ElementDeclHandler` set to a custom -element declaration handler. Patch by Sebastian Pipping. diff --git a/Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst b/Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst deleted file mode 100644 index 9675a5d427a0d9..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-26-16-24-12.gh-issue-140633.ioayC1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ignore :exc:`AttributeError` when setting a module's ``__file__`` attribute -when loading an extension module packaged as Apple Framework. diff --git a/Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst b/Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst deleted file mode 100644 index b1ba9b26ad5431..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-27-13-49-31.gh-issue-140634.ULng9G.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a reference counting bug in :meth:`!os.sched_param.__reduce__`. diff --git a/Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst b/Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst deleted file mode 100644 index 299e9f04df7c39..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-27-16-01-41.gh-issue-125434.qy0uRA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Display thread name in :mod:`faulthandler` on Windows. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst b/Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst deleted file mode 100644 index 802183673cfacc..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-27-18-29-42.gh-issue-140590.LT9HHn.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix arguments checking for the :meth:`!functools.partial.__setstate__` that -may lead to internal state corruption and crash. Patch by Sergey Miryanov. diff --git a/Misc/NEWS.d/next/Library/2025-10-28-17-43-51.gh-issue-140228.8kfHhO.rst b/Misc/NEWS.d/next/Library/2025-10-28-17-43-51.gh-issue-140228.8kfHhO.rst deleted file mode 100644 index b3b692bae62c5d..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-28-17-43-51.gh-issue-140228.8kfHhO.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid making unnecessary filesystem calls for frozen modules in :mod:`linecache` when the global module cache is not present. diff --git a/Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst b/Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst deleted file mode 100644 index f6b42be1fbf50d..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-29-16-12-41.gh-issue-120057.qGj5Dl.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`os.reload_environ` to ``os.__all__``. diff --git a/Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst b/Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst deleted file mode 100644 index e14af7d97083d6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-31-13-57-55.gh-issue-103847.VM7TnW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix hang when cancelling process created by :func:`asyncio.create_subprocess_exec` or :func:`asyncio.create_subprocess_shell`. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst b/Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst deleted file mode 100644 index 84b6195c9262c8..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-10-31-15-06-26.gh-issue-140691.JzHGtg.rst +++ /dev/null @@ -1,3 +0,0 @@ -In :mod:`urllib.request`, when opening a FTP URL fails because a data -connection cannot be made, the control connection's socket is now closed to -avoid a :exc:`ResourceWarning`. diff --git a/Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst b/Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst deleted file mode 100644 index a48162de76b496..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-01-00-36-14.gh-issue-140874.eAWt3K.rst +++ /dev/null @@ -1 +0,0 @@ -Bump the version of pip bundled in ensurepip to version 25.3 diff --git a/Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst b/Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst deleted file mode 100644 index 46582f7fcf417c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-02-09-37-22.gh-issue-140734.f8gST9.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`multiprocessing`: fix off-by-one error when checking the length -of a temporary socket file path. Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst b/Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst deleted file mode 100644 index c08a8966d53401..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-02-10-44-23.gh-issue-140875.wt6B37.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix handling of unclosed character references (named and numerical) -followed by the end of file in :class:`html.parser.HTMLParser` with -``convert_charrefs=False``. diff --git a/Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst b/Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst deleted file mode 100644 index 2f7500d295578b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-02-11-46-00.gh-issue-100218.9Ezfdq.rst +++ /dev/null @@ -1,3 +0,0 @@ -Correctly set :attr:`~OSError.errno` when :func:`socket.if_nametoindex` or -:func:`socket.if_indextoname` raise an :exc:`OSError`. Patch by Bénédikt -Tran. diff --git a/Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst b/Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst deleted file mode 100644 index 18c4d3836efef1..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-02-19-23-32.gh-issue-140815.McEG-T.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`faulthandler` now detects if a frame or a code object is invalid or -freed. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst b/Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst deleted file mode 100644 index d36debec3ed6cc..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-03-05-38-31.gh-issue-125115.jGS8MN.rst +++ /dev/null @@ -1 +0,0 @@ -Refactor the :mod:`pdb` parsing issue so positional arguments can pass through intuitively. diff --git a/Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst b/Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst deleted file mode 100644 index 493b740261e64c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-03-16-23-54.gh-issue-140797.DuFEeR.rst +++ /dev/null @@ -1,2 +0,0 @@ -The undocumented :class:`!re.Scanner` class now forbids regular expressions containing capturing groups in its lexicon patterns. Patterns using capturing groups could -previously lead to crashes with segmentation fault. Use non-capturing groups (?:...) instead. diff --git a/Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst b/Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst deleted file mode 100644 index b0b6e4611924c2..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-03-17-13-00.gh-issue-140911.7KFvSQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`collections`: Ensure that the methods ``UserString.rindex()`` and -``UserString.index()`` accept :class:`collections.UserString` instances as the -sub argument. diff --git a/Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst b/Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst deleted file mode 100644 index dfa582bdbc8825..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-04-15-40-35.gh-issue-137969.9VZQVt.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :meth:`annotationlib.ForwardRef.evaluate` returning -:class:`~annotationlib.ForwardRef` objects which don't update with new -globals. diff --git a/Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst b/Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst deleted file mode 100644 index f59ccfb33e7669..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-06-15-11-50.gh-issue-141141.tgIfgH.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a thread safety issue with :func:`base64.b85decode`. Contributed by Benel Tayar. diff --git a/Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst b/Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst deleted file mode 100644 index bb425ce5df309d..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-09-18-55-13.gh-issue-141311.qZ3swc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix assertion failure in :func:`!io.BytesIO.readinto` and undefined behavior -arising when read position is above capcity in :class:`io.BytesIO`. diff --git a/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst b/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst deleted file mode 100644 index 37acaabfa3eada..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-10-01-47-18.gh-issue-141314.baaa28.rst +++ /dev/null @@ -1 +0,0 @@ -Fix assertion failure in :meth:`io.TextIOWrapper.tell` when reading files with standalone carriage return (``\r``) line endings. diff --git a/Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst b/Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst deleted file mode 100644 index 32f4e39f6d5f4c..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-12-01-49-03.gh-issue-137109.D6sq2B.rst +++ /dev/null @@ -1,5 +0,0 @@ -The :mod:`os.fork` and related forking APIs will no longer warn in the -common case where Linux or macOS platform APIs return the number of threads -in a process and find the answer to be 1 even when a -:func:`os.register_at_fork` ``after_in_parent=`` callback (re)starts a -thread. diff --git a/Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst b/Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst deleted file mode 100644 index 8436cd2415dbd6..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-12-15-42-47.gh-issue-124111.hTw4OE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated Tcl threading configuration in :mod:`_tkinter` to assume that -threads are always available in Tcl 9 and later. diff --git a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst deleted file mode 100644 index bd3044002a2d54..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :func:`statistics.stdev` and :func:`statistics.pstdev` functions now raise a -:exc:`ValueError` when the input contains an infinity or a NaN. diff --git a/Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst b/Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst deleted file mode 100644 index 328bfe067ad96b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-14-16-24-20.gh-issue-141497.L_CxDJ.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`ipaddress`: ensure that the methods -:meth:`IPv4Network.hosts() <ipaddress.IPv4Network.hosts>` and -:meth:`IPv6Network.hosts() <ipaddress.IPv6Network.hosts>` always return an -iterator. diff --git a/Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst b/Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst deleted file mode 100644 index 8071246f130ace..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-15-14-58-12.gh-issue-141600.XY2BXg.rst +++ /dev/null @@ -1 +0,0 @@ -Fix musl version detection on Void Linux. diff --git a/Misc/NEWS.d/next/Library/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst b/Misc/NEWS.d/next/Library/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst deleted file mode 100644 index eeb055c6012a12..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-17-08-16-30.gh-issue-141659.QNi9Aj.rst +++ /dev/null @@ -1 +0,0 @@ -Fix bad file descriptor errors from ``_posixsubprocess`` on AIX. diff --git a/Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst b/Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst deleted file mode 100644 index 8f4641ce4cf8c2..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-18-14-39-31.gh-issue-141570.q3n984.rst +++ /dev/null @@ -1,2 +0,0 @@ -Support :term:`file-like object` raising :exc:`OSError` from :meth:`~io.IOBase.fileno` in color -detection (``_colorize.can_colorize()``). This can occur when ``sys.stdout`` is redirected. diff --git a/Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst b/Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst deleted file mode 100644 index 33ab8a0659e4a2..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-25-16-00-29.gh-issue-59000.YtOyJy.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :mod:`pdb` breakpoint resolution for class methods when the module defining the class is not imported. diff --git a/Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst b/Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst deleted file mode 100644 index f6aa592cefda35..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-27-20-16-38.gh-issue-141473.Wq4xVN.rst +++ /dev/null @@ -1,4 +0,0 @@ -When :meth:`subprocess.Popen.communicate` was called with *input* and a -*timeout* and is called for a second time after a -:exc:`~subprocess.TimeoutExpired` exception before the process has died, it -should no longer hang. diff --git a/Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst b/Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst deleted file mode 100644 index 091350108eea1b..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-29-03-02-45.gh-issue-87512.bn4xbm.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix :func:`subprocess.Popen.communicate` timeout handling on Windows -when writing large input. Previously, the timeout was ignored during -stdin writing, causing the method to block indefinitely if the child -process did not consume input quickly. The stdin write is now performed -in a background thread, allowing the timeout to be properly enforced. diff --git a/Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst b/Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst deleted file mode 100644 index a9bf5f80d80c9f..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-11-29-04-20-44.gh-issue-74389.pW3URj.rst +++ /dev/null @@ -1,3 +0,0 @@ -When the stdin being used by a :class:`subprocess.Popen` instance is closed, -this is now ignored in :meth:`subprocess.Popen.communicate` instead of -leaving the class in an inconsistent state. diff --git a/Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst b/Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst deleted file mode 100644 index 04fd8faca4cf7e..00000000000000 --- a/Misc/NEWS.d/next/Security/2024-05-21-22-11-31.gh-issue-119342.BTFj4Z.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a potential memory denial of service in the :mod:`plistlib` module. -When reading a Plist file received from untrusted source, it could cause -an arbitrary amount of memory to be allocated. -This could have led to symptoms including a :exc:`MemoryError`, swapping, out -of memory (OOM) killed processes or containers, or even system crashes. diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst deleted file mode 100644 index 6d6f25cd2f8bf7..00000000000000 --- a/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a potential memory denial of service in the :mod:`http.client` module. -When connecting to a malicious server, it could cause -an arbitrary amount of memory to be allocated. -This could have led to symptoms including a :exc:`MemoryError`, swapping, out -of memory (OOM) killed processes or containers, or even system crashes. diff --git a/Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst b/Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst deleted file mode 100644 index 1d152bb5318380..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-05-30-22-33-27.gh-issue-136065.bu337o.rst +++ /dev/null @@ -1 +0,0 @@ -Fix quadratic complexity in :func:`os.path.expandvars`. diff --git a/Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst b/Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst deleted file mode 100644 index 940a3ad5a72f68..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-06-28-13-23-53.gh-issue-136063.aGk0Jv.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`email.message`: ensure linear complexity for legacy HTTP parameters -parsing. Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst b/Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst deleted file mode 100644 index c30c9439a76a19..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-08-15-23-08-44.gh-issue-137836.b55rhh.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add support of the "plaintext" element, RAWTEXT elements "xmp", "iframe", -"noembed" and "noframes", and optionally RAWTEXT element "noscript" in -:class:`html.parser.HTMLParser`. diff --git a/Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst b/Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst deleted file mode 100644 index a8fd83bca52554..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-09-24-13-39-56.gh-issue-139283.jODz_q.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`sqlite3`: correctly handle maximum number of rows to fetch in -:meth:`Cursor.fetchmany <sqlite3.Cursor.fetchmany>` and reject negative -values for :attr:`Cursor.arraysize <sqlite3.Cursor.arraysize>`. Patch by -Bénédikt Tran. diff --git a/Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst b/Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst deleted file mode 100644 index a8e7a1f1878c6b..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-10-07-19-31-34.gh-issue-139700.vNHU1O.rst +++ /dev/null @@ -1,3 +0,0 @@ -Check consistency of the zip64 end of central directory record. Support -records with "zip64 extensible data" if there are no bytes prepended to the -ZIP file. diff --git a/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst b/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst deleted file mode 100644 index f87fb1113cad12..00000000000000 --- a/Misc/NEWS.d/next/Tests/2025-07-09-21-45-51.gh-issue-136442.jlbklP.rst +++ /dev/null @@ -1 +0,0 @@ -Use exitcode ``1`` instead of ``5`` if :func:`unittest.TestCase.setUpClass` raises an exception diff --git a/Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst b/Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst deleted file mode 100644 index b8672ac83e1ead..00000000000000 --- a/Misc/NEWS.d/next/Tests/2025-09-22-15-40-09.gh-issue-139208.Tc13dl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix regrtest ``--fast-ci --verbose``: don't ignore the ``--verbose`` option -anymore. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst b/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst deleted file mode 100644 index 70e70218254488..00000000000000 --- a/Misc/NEWS.d/next/Tests/2025-10-15-00-52-12.gh-issue-140082.fpET50.rst +++ /dev/null @@ -1,3 +0,0 @@ -Update ``python -m test`` to set ``FORCE_COLOR=1`` when being run with color -enabled so that :mod:`unittest` which is run by it with redirected output will -output in color. diff --git a/Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst b/Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst deleted file mode 100644 index 20747ad7f113ec..00000000000000 --- a/Misc/NEWS.d/next/Tests/2025-10-23-16-39-49.gh-issue-140482.ZMtyeD.rst +++ /dev/null @@ -1 +0,0 @@ -Preserve and restore the state of ``stty echo`` as part of the test environment. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst b/Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst deleted file mode 100644 index c9c6c2ca287efd..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-07-30-10-28-35.gh-issue-137243.NkdUqH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Have Tools/wasm/wasi detect a WASI SDK install in /opt when it was directly -extracted from a release tarball. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst b/Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst deleted file mode 100644 index 311ade0c8f3040..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-07-30-11-15-47.gh-issue-137248.8IxwY3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a ``--logdir`` option to ``Tools/wasm/wasi`` for specifying where to -write log files. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst b/Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst deleted file mode 100644 index bd7bc0984ecfcc..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-08-06-11-54-55.gh-issue-137484.8iFAQs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Have ``Tools/wasm/wasi`` put the build Python into a directory named after -the build triple instead of "build". diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst b/Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst deleted file mode 100644 index 9efbf0162dd1c1..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-10-29-15-20-19.gh-issue-140702.ZXtW8h.rst +++ /dev/null @@ -1,2 +0,0 @@ -The iOS testbed app will now expose the ``GITHUB_ACTIONS`` environment -variable to iOS apps being tested. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst b/Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst deleted file mode 100644 index 073c070413f7e0..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-11-12-12-54-28.gh-issue-141442.50dS3P.rst +++ /dev/null @@ -1 +0,0 @@ -The iOS testbed now correctly handles test arguments that contain spaces. diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst b/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst deleted file mode 100644 index d85c54db3646f6..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2025-11-18-13-55-47.gh-issue-141692.tud9if.rst +++ /dev/null @@ -1,3 +0,0 @@ -Each slice of an iOS XCframework now contains a ``lib`` folder that contains -a symlink to the libpython dylib. This allows binary modules to be compiled -for iOS using dynamic libreary linking, rather than Framework linking. diff --git a/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst b/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst deleted file mode 100644 index 55252f288b0a33..00000000000000 --- a/Misc/NEWS.d/next/Windows/2025-10-08-22-54-38.gh-issue-139810.LAaemi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Installing with ``py install 3[.x]-dev`` will now select final versions as -well as prereleases. diff --git a/README.rst b/README.rst index 367fcba602c2ea..242c9dc7b6a137 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.14.0 +This is Python version 3.14.1 ============================= .. image:: https://github.com/python/cpython/actions/workflows/build.yml/badge.svg?branch=main&event=push From 206f1966ec51855313a60c1d70775ea43ee694d9 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:16:07 +0200 Subject: [PATCH 1537/1674] Post 3.14.1 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index ce7d23b2155c7c..1a53949b163416 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -24,7 +24,7 @@ #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.14.1" +#define PY_VERSION "3.14.1+" /*--end constants--*/ From 79245a47ed127c14f63e1450a1b554d86c266a5d Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:43:06 +0000 Subject: [PATCH 1538/1674] [3.14] gh-135676: Simplify docs on lexing names (GH-140464) (GH-142015) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This simplifies the Lexical Analysis section on Names (but keeps it technically correct) by putting all the info about non-ASCII characters in a separate (and very technical) section. It uses a mental model where the parser doesn't handle Unicode complexity “immediately”, but: - parses any non-ASCII character (outside strings/comments) as part of a name, since these can't (yet) be e.g. operators - normalizes the name - validates the name, using the xid_start/xid_continue sets (cherry picked from commit 2ff8608b4da33f667960e5099a1a442197acaea4) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Blaise Pabon <blaise@gmail.com> Co-authored-by: Micha Albert <info@micha.zone> Co-authored-by: KeithTheEE <kmurrayis@gmail.com> --- Doc/reference/lexical_analysis.rst | 161 ++++++++++++++++++----------- 1 file changed, 103 insertions(+), 58 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 969da12690636d..03ddad431e7aa2 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -386,73 +386,29 @@ Names (identifiers and keywords) :data:`~token.NAME` tokens represent *identifiers*, *keywords*, and *soft keywords*. -Within the ASCII range (U+0001..U+007F), the valid characters for names -include the uppercase and lowercase letters (``A-Z`` and ``a-z``), -the underscore ``_`` and, except for the first character, the digits -``0`` through ``9``. +Names are composed of the following characters: + +* uppercase and lowercase letters (``A-Z`` and ``a-z``), +* the underscore (``_``), +* digits (``0`` through ``9``), which cannot appear as the first character, and +* non-ASCII characters. Valid names may only contain "letter-like" and + "digit-like" characters; see :ref:`lexical-names-nonascii` for details. Names must contain at least one character, but have no upper length limit. Case is significant. -Besides ``A-Z``, ``a-z``, ``_`` and ``0-9``, names can also use "letter-like" -and "number-like" characters from outside the ASCII range, as detailed below. - -All identifiers are converted into the `normalization form`_ NFKC while -parsing; comparison of identifiers is based on NFKC. - -Formally, the first character of a normalized identifier must belong to the -set ``id_start``, which is the union of: - -* Unicode category ``<Lu>`` - uppercase letters (includes ``A`` to ``Z``) -* Unicode category ``<Ll>`` - lowercase letters (includes ``a`` to ``z``) -* Unicode category ``<Lt>`` - titlecase letters -* Unicode category ``<Lm>`` - modifier letters -* Unicode category ``<Lo>`` - other letters -* Unicode category ``<Nl>`` - letter numbers -* {``"_"``} - the underscore -* ``<Other_ID_Start>`` - an explicit set of characters in `PropList.txt`_ - to support backwards compatibility - -The remaining characters must belong to the set ``id_continue``, which is the -union of: - -* all characters in ``id_start`` -* Unicode category ``<Nd>`` - decimal numbers (includes ``0`` to ``9``) -* Unicode category ``<Pc>`` - connector punctuations -* Unicode category ``<Mn>`` - nonspacing marks -* Unicode category ``<Mc>`` - spacing combining marks -* ``<Other_ID_Continue>`` - another explicit set of characters in - `PropList.txt`_ to support backwards compatibility - -Unicode categories use the version of the Unicode Character Database as -included in the :mod:`unicodedata` module. - -These sets are based on the Unicode standard annex `UAX-31`_. -See also :pep:`3131` for further details. - -Even more formally, names are described by the following lexical definitions: +Formally, names are described by the following lexical definitions: .. grammar-snippet:: :group: python-grammar - NAME: `xid_start` `xid_continue`* - id_start: <Lu> | <Ll> | <Lt> | <Lm> | <Lo> | <Nl> | "_" | <Other_ID_Start> - id_continue: `id_start` | <Nd> | <Pc> | <Mn> | <Mc> | <Other_ID_Continue> - xid_start: <all characters in `id_start` whose NFKC normalization is - in (`id_start` `xid_continue`*)"> - xid_continue: <all characters in `id_continue` whose NFKC normalization is - in (`id_continue`*)"> - identifier: <`NAME`, except keywords> + NAME: `name_start` `name_continue`* + name_start: "a"..."z" | "A"..."Z" | "_" | <non-ASCII character> + name_continue: name_start | "0"..."9" + identifier: <`NAME`, except keywords> -A non-normative listing of all valid identifier characters as defined by -Unicode is available in the `DerivedCoreProperties.txt`_ file in the Unicode -Character Database. - - -.. _UAX-31: https://www.unicode.org/reports/tr31/ -.. _PropList.txt: https://www.unicode.org/Public/16.0.0/ucd/PropList.txt -.. _DerivedCoreProperties.txt: https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt -.. _normalization form: https://www.unicode.org/reports/tr15/#Norm_Forms +Note that not all names matched by this grammar are valid; see +:ref:`lexical-names-nonascii` for details. .. _keywords: @@ -555,6 +511,95 @@ characters: :ref:`atom-identifiers`. +.. _lexical-names-nonascii: + +Non-ASCII characters in names +----------------------------- + +Names that contain non-ASCII characters need additional normalization +and validation beyond the rules and grammar explained +:ref:`above <identifiers>`. +For example, ``ř_1``, ``蛇``, or ``साँप`` are valid names, but ``r〰2``, +``€``, or ``🐍`` are not. + +This section explains the exact rules. + +All names are converted into the `normalization form`_ NFKC while parsing. +This means that, for example, some typographic variants of characters are +converted to their "basic" form. For example, ``fiⁿₐˡᵢᶻₐᵗᵢᵒₙ`` normalizes to +``finalization``, so Python treats them as the same name:: + + >>> fiⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3 + >>> finalization + 3 + +.. note:: + + Normalization is done at the lexical level only. + Run-time functions that take names as *strings* generally do not normalize + their arguments. + For example, the variable defined above is accessible at run time in the + :func:`globals` dictionary as ``globals()["finalization"]`` but not + ``globals()["fiⁿₐˡᵢᶻₐᵗᵢᵒₙ"]``. + +Similarly to how ASCII-only names must contain only letters, digits and +the underscore, and cannot start with a digit, a valid name must +start with a character in the "letter-like" set ``xid_start``, +and the remaining characters must be in the "letter- and digit-like" set +``xid_continue``. + +These sets based on the *XID_Start* and *XID_Continue* sets as defined by the +Unicode standard annex `UAX-31`_. +Python's ``xid_start`` additionally includes the underscore (``_``). +Note that Python does not necessarily conform to `UAX-31`_. + +A non-normative listing of characters in the *XID_Start* and *XID_Continue* +sets as defined by Unicode is available in the `DerivedCoreProperties.txt`_ +file in the Unicode Character Database. +For reference, the construction rules for the ``xid_*`` sets are given below. + +The set ``id_start`` is defined as the union of: + +* Unicode category ``<Lu>`` - uppercase letters (includes ``A`` to ``Z``) +* Unicode category ``<Ll>`` - lowercase letters (includes ``a`` to ``z``) +* Unicode category ``<Lt>`` - titlecase letters +* Unicode category ``<Lm>`` - modifier letters +* Unicode category ``<Lo>`` - other letters +* Unicode category ``<Nl>`` - letter numbers +* {``"_"``} - the underscore +* ``<Other_ID_Start>`` - an explicit set of characters in `PropList.txt`_ + to support backwards compatibility + +The set ``xid_start`` then closes this set under NFKC normalization, by +removing all characters whose normalization is not of the form +``id_start id_continue*``. + +The set ``id_continue`` is defined as the union of: + +* ``id_start`` (see above) +* Unicode category ``<Nd>`` - decimal numbers (includes ``0`` to ``9``) +* Unicode category ``<Pc>`` - connector punctuations +* Unicode category ``<Mn>`` - nonspacing marks +* Unicode category ``<Mc>`` - spacing combining marks +* ``<Other_ID_Continue>`` - another explicit set of characters in + `PropList.txt`_ to support backwards compatibility + +Again, ``xid_continue`` closes this set under NFKC normalization. + +Unicode categories use the version of the Unicode Character Database as +included in the :mod:`unicodedata` module. + +.. _UAX-31: https://www.unicode.org/reports/tr31/ +.. _PropList.txt: https://www.unicode.org/Public/16.0.0/ucd/PropList.txt +.. _DerivedCoreProperties.txt: https://www.unicode.org/Public/16.0.0/ucd/DerivedCoreProperties.txt +.. _normalization form: https://www.unicode.org/reports/tr15/#Norm_Forms + +.. seealso:: + + * :pep:`3131` -- Supporting Non-ASCII Identifiers + * :pep:`672` -- Unicode-related Security Considerations for Python + + .. _literals: Literals From 027f21e417b26eed4505ac2db101a4352b7c51a0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:09:44 +0100 Subject: [PATCH 1539/1674] [3.14] gh-142145: Remove quadratic behavior in node ID cache clearing (GH-142146) (#142209) gh-142145: Remove quadratic behavior in node ID cache clearing (GH-142146) * Remove quadratic behavior in node ID cache clearing * Add news fragment --------- (cherry picked from commit 08d8e18ad81cd45bc4a27d6da478b51ea49486e4) Co-authored-by: Seth Michael Larson <seth@python.org> Co-authored-by: Jacob Walls <38668450+jacobtylerwalls@users.noreply.github.com> --- Lib/test/test_minidom.py | 18 ++++++++++++++++++ Lib/xml/dom/minidom.py | 9 +-------- ...5-12-01-09-36-45.gh-issue-142145.tcAUhg.rst | 1 + 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 4f25e9c2a03cb4..4fa5a4e6768b25 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -2,6 +2,7 @@ import copy import pickle +import time import io from test import support import unittest @@ -173,6 +174,23 @@ def testAppendChild(self): self.assertEqual(dom.documentElement.childNodes[-1].data, "Hello") dom.unlink() + def testAppendChildNoQuadraticComplexity(self): + impl = getDOMImplementation() + + newdoc = impl.createDocument(None, "some_tag", None) + top_element = newdoc.documentElement + children = [newdoc.createElement(f"child-{i}") for i in range(1, 2 ** 15 + 1)] + element = top_element + + start = time.time() + for child in children: + element.appendChild(child) + element = child + end = time.time() + + # This example used to take at least 30 seconds. + self.assertLess(end - start, 1) + def testAppendChildFragment(self): dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes() dom.documentElement.appendChild(frag) diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index db51f350ea0153..0a2ccc00f1857d 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -292,13 +292,6 @@ def _append_child(self, node): childNodes.append(node) node.parentNode = self -def _in_document(node): - # return True iff node is part of a document tree - while node is not None: - if node.nodeType == Node.DOCUMENT_NODE: - return True - node = node.parentNode - return False def _write_data(writer, text, attr): "Writes datachars to writer." @@ -1555,7 +1548,7 @@ def _clear_id_cache(node): if node.nodeType == Node.DOCUMENT_NODE: node._id_cache.clear() node._id_search_stack = None - elif _in_document(node): + elif node.ownerDocument: node.ownerDocument._id_cache.clear() node.ownerDocument._id_search_stack= None diff --git a/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst b/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst new file mode 100644 index 00000000000000..440bc7794c69ef --- /dev/null +++ b/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst @@ -0,0 +1 @@ +Remove quadratic behavior in ``xml.minidom`` node ID cache clearing. From 319c6a2ae1ea033d5aea09a43acbc8d451764869 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 4 Dec 2025 01:03:18 +0100 Subject: [PATCH 1540/1674] [3.14] gh-142218: Fix split table dictionary crash (gh-142229) (gh-142244) This fixes a regression introduced in gh-140558. The interpreter would crash if we inserted a non `str` key into a split table that matches an existing key. (cherry picked from commit 547d8daf780646e2800bec598ed32085817c8606) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Lib/test/test_dict.py | 8 ++++++++ .../2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst | 2 ++ Objects/dictobject.c | 10 +++++++--- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 2e6c2bbdf19409..665b3e843dd3a5 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1621,6 +1621,14 @@ def __eq__(self, other): self.assertEqual(len(d), 1) + def test_split_table_update_with_str_subclass(self): + class MyStr(str): pass + class MyClass: pass + obj = MyClass() + obj.attr = 1 + obj.__dict__[MyStr('attr')] = 2 + self.assertEqual(obj.attr, 2) + class CAPITest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst new file mode 100644 index 00000000000000..a8ce0fc65267d5 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst @@ -0,0 +1,2 @@ +Fix crash when inserting into a split table dictionary with a non +:class:`str` key that matches an existing key. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 1b4640f9649569..0eb00410cf41eb 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1863,10 +1863,14 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp, if (old_value != value) { _PyDict_NotifyEvent(interp, PyDict_EVENT_MODIFIED, mp, key, value); assert(old_value != NULL); - assert(!_PyDict_HasSplitTable(mp)); if (DK_IS_UNICODE(mp->ma_keys)) { - PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(mp->ma_keys)[ix]; - STORE_VALUE(ep, value); + if (_PyDict_HasSplitTable(mp)) { + STORE_SPLIT_VALUE(mp, ix, value); + } + else { + PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(mp->ma_keys)[ix]; + STORE_VALUE(ep, value); + } } else { PyDictKeyEntry *ep = &DK_ENTRIES(mp->ma_keys)[ix]; From afaa3b02f79b16d175129e9c5cbf6660f7521a69 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 4 Dec 2025 01:16:37 +0100 Subject: [PATCH 1541/1674] [3.14] Being more flexible in when not to explicitly set the sysroot when compiling for WASI (GH-142242) (GH-142246) Being more flexible in when not to explicitly set the sysroot when compiling for WASI (GH-142242) (cherry picked from commit c5252045d3a7164f1829503d122091b5e469fda3) Co-authored-by: Brett Cannon <brett@python.org> --- Tools/wasm/wasi/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index 628fbb10b630bc..62085dc0e64030 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -269,7 +269,7 @@ def wasi_sdk_env(context): for env_var, binary_name in list(env.items()): env[env_var] = os.fsdecode(wasi_sdk_path / "bin" / binary_name) - if wasi_sdk_path != pathlib.Path("/opt/wasi-sdk"): + if not wasi_sdk_path.name.startswith("wasi-sdk"): for compiler in ["CC", "CPP", "CXX"]: env[compiler] += f" --sysroot={sysroot}" From 5611e0809b00a1d167f4ad92a1d6cfe34b7b3faa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:53:12 +0100 Subject: [PATCH 1542/1674] [3.14] gh-135676: Reword the f-string (and t-string) section (GH-137469) (GH-142227) Much of the information was duplicated in stdtypes.rst; this PR keeps lexical/syntactical details in Lexical Analysis and the evaluation & runtime behaviour in Standard types, with cross-references between the two. Since the t-string section only listed differences from f-strings, and the grammar for the two is equivalent, that section was moved to Standard types almost entirely. (cherry picked from commit aea5531583aaa8bfdf3ebca914e9c694617c3489) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Blaise Pabon <blaise@gmail.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/stdtypes.rst | 196 ++++++++------- Doc/reference/expressions.rst | 2 +- Doc/reference/lexical_analysis.rst | 377 +++++++++++++++++------------ 3 files changed, 332 insertions(+), 243 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index a8b9575dea02d0..cc5d1442b86cee 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2656,6 +2656,8 @@ expression support in the :mod:`re` module). single: : (colon); in formatted string literal single: = (equals); for help in debugging using string literals +.. _stdtypes-fstrings: + Formatted String Literals (f-strings) ------------------------------------- @@ -2664,123 +2666,147 @@ Formatted String Literals (f-strings) The :keyword:`await` and :keyword:`async for` can be used in expressions within f-strings. .. versionchanged:: 3.8 - Added the debugging operator (``=``) + Added the debug specifier (``=``) .. versionchanged:: 3.12 Many restrictions on expressions within f-strings have been removed. Notably, nested strings, comments, and backslashes are now permitted. An :dfn:`f-string` (formally a :dfn:`formatted string literal`) is a string literal that is prefixed with ``f`` or ``F``. -This type of string literal allows embedding arbitrary Python expressions -within *replacement fields*, which are delimited by curly brackets (``{}``). -These expressions are evaluated at runtime, similarly to :meth:`str.format`, -and are converted into regular :class:`str` objects. -For example: +This type of string literal allows embedding the results of arbitrary Python +expressions within *replacement fields*, which are delimited by curly +brackets (``{}``). +Each replacement field must contain an expression, optionally followed by: -.. doctest:: +* a *debug specifier* -- an equal sign (``=``); +* a *conversion specifier* -- ``!s``, ``!r`` or ``!a``; and/or +* a *format specifier* prefixed with a colon (``:``). - >>> who = 'nobody' - >>> nationality = 'Spanish' - >>> f'{who.title()} expects the {nationality} Inquisition!' - 'Nobody expects the Spanish Inquisition!' +See the :ref:`Lexical Analysis section on f-strings <f-strings>` for details +on the syntax of these fields. -It is also possible to use a multi line f-string: +Debug specifier +^^^^^^^^^^^^^^^ -.. doctest:: +.. versionadded:: 3.8 - >>> f'''This is a string - ... on two lines''' - 'This is a string\non two lines' +If a debug specifier -- an equal sign (``=``) -- appears after the replacement +field expression, the resulting f-string will contain the expression's source, +the equal sign, and the value of the expression. +This is often useful for debugging:: -A single opening curly bracket, ``'{'``, marks a *replacement field* that -can contain any Python expression: + >>> number = 14.3 + >>> f'{number=}' + 'number=14.3' -.. doctest:: - - >>> nationality = 'Spanish' - >>> f'The {nationality} Inquisition!' - 'The Spanish Inquisition!' +Whitespace before, inside and after the expression, as well as whitespace +after the equal sign, is significant --- it is retained in the result:: -To include a literal ``{`` or ``}``, use a double bracket: + >>> f'{ number - 4 = }' + ' number - 4 = 10.3' -.. doctest:: - >>> x = 42 - >>> f'{{x}} is {x}' - '{x} is 42' +Conversion specifier +^^^^^^^^^^^^^^^^^^^^ -Functions can also be used, and :ref:`format specifiers <formatstrings>`: - -.. doctest:: - - >>> from math import sqrt - >>> f'√2 \N{ALMOST EQUAL TO} {sqrt(2):.5f}' - '√2 ≈ 1.41421' - -Any non-string expression is converted using :func:`str`, by default: - -.. doctest:: +By default, the value of a replacement field expression is converted to +a string using :func:`str`:: >>> from fractions import Fraction - >>> f'{Fraction(1, 3)}' + >>> one_third = Fraction(1, 3) + >>> f'{one_third}' '1/3' -To use an explicit conversion, use the ``!`` (exclamation mark) operator, -followed by any of the valid formats, which are: +When a debug specifier but no format specifier is used, the default conversion +instead uses :func:`repr`:: -========== ============== -Conversion Meaning -========== ============== -``!a`` :func:`ascii` -``!r`` :func:`repr` -``!s`` :func:`str` -========== ============== + >>> f'{one_third = }' + 'one_third = Fraction(1, 3)' -For example: +The conversion can be specified explicitly using one of these specifiers: -.. doctest:: +* ``!s`` for :func:`str` +* ``!r`` for :func:`repr` +* ``!a`` for :func:`ascii` - >>> from fractions import Fraction - >>> f'{Fraction(1, 3)!s}' +For example:: + + >>> str(one_third) '1/3' - >>> f'{Fraction(1, 3)!r}' + >>> repr(one_third) 'Fraction(1, 3)' - >>> question = '¿Dónde está el Presidente?' - >>> print(f'{question!a}') - '\xbfD\xf3nde est\xe1 el Presidente?' - -While debugging it may be helpful to see both the expression and its value, -by using the equals sign (``=``) after the expression. -This preserves spaces within the brackets, and can be used with a converter. -By default, the debugging operator uses the :func:`repr` (``!r``) conversion. -For example: -.. doctest:: + >>> f'{one_third!s} is {one_third!r}' + '1/3 is Fraction(1, 3)' - >>> from fractions import Fraction - >>> calculation = Fraction(1, 3) - >>> f'{calculation=}' - 'calculation=Fraction(1, 3)' - >>> f'{calculation = }' - 'calculation = Fraction(1, 3)' - >>> f'{calculation = !s}' - 'calculation = 1/3' - -Once the output has been evaluated, it can be formatted using a -:ref:`format specifier <formatstrings>` following a colon (``':'``). -After the expression has been evaluated, and possibly converted to a string, -the :meth:`!__format__` method of the result is called with the format specifier, -or the empty string if no format specifier is given. -The formatted result is then used as the final value for the replacement field. -For example: + >>> string = "¡kočka 😸!" + >>> ascii(string) + "'\\xa1ko\\u010dka \\U0001f638!'" -.. doctest:: + >>> f'{string = !a}' + "string = '\\xa1ko\\u010dka \\U0001f638!'" + + +Format specifier +^^^^^^^^^^^^^^^^ + +After the expression has been evaluated, and possibly converted using an +explicit conversion specifier, it is formatted using the :func:`format` function. +If the replacement field includes a *format specifier* introduced by a colon +(``:``), the specifier is passed to :func:`!format` as the second argument. +The result of :func:`!format` is then used as the final value for the +replacement field. For example:: >>> from fractions import Fraction - >>> f'{Fraction(1, 7):.6f}' - '0.142857' - >>> f'{Fraction(1, 7):_^+10}' - '___+1/7___' + >>> one_third = Fraction(1, 3) + >>> f'{one_third:.6f}' + '0.333333' + >>> f'{one_third:_^+10}' + '___+1/3___' + >>> >>> f'{one_third!r:_^20}' + '___Fraction(1, 3)___' + >>> f'{one_third = :~>10}~' + 'one_third = ~~~~~~~1/3~' + +.. _stdtypes-tstrings: + +Template String Literals (t-strings) +------------------------------------ + +An :dfn:`t-string` (formally a :dfn:`template string literal`) is +a string literal that is prefixed with ``t`` or ``T``. + +These strings follow the same syntax and evaluation rules as +:ref:`formatted string literals <stdtypes-fstrings>`, +with for the following differences: + +* Rather than evaluating to a ``str`` object, template string literals evaluate + to a :class:`string.templatelib.Template` object. + +* The :func:`format` protocol is not used. + Instead, the format specifier and conversions (if any) are passed to + a new :class:`~string.templatelib.Interpolation` object that is created + for each evaluated expression. + It is up to code that processes the resulting :class:`~string.templatelib.Template` + object to decide how to handle format specifiers and conversions. + +* Format specifiers containing nested replacement fields are evaluated eagerly, + prior to being passed to the :class:`~string.templatelib.Interpolation` object. + For instance, an interpolation of the form ``{amount:.{precision}f}`` will + evaluate the inner expression ``{precision}`` to determine the value of the + ``format_spec`` attribute. + If ``precision`` were to be ``2``, the resulting format specifier + would be ``'.2f'``. + +* When the equals sign ``'='`` is provided in an interpolation expression, + the text of the expression is appended to the literal string that precedes + the relevant interpolation. + This includes the equals sign and any surrounding whitespace. + The :class:`!Interpolation` instance for the expression will be created as + normal, except that :attr:`~string.templatelib.Interpolation.conversion` will + be set to '``r``' (:func:`repr`) by default. + If an explicit conversion or format specifier are provided, + this will override the default behaviour. .. _old-string-formatting: diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index c655d6c52ecc16..165dfa69f880d0 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -174,7 +174,7 @@ Formally: .. grammar-snippet:: :group: python-grammar - strings: ( `STRING` | fstring)+ | tstring+ + strings: ( `STRING` | `fstring`)+ | `tstring`+ This feature is defined at the syntactical level, so it only works with literals. To concatenate string expressions at run time, the '+' operator may be used:: diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 03ddad431e7aa2..c2bf45db265b33 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -345,7 +345,15 @@ Whitespace between tokens Except at the beginning of a logical line or in string literals, the whitespace characters space, tab and formfeed can be used interchangeably to separate -tokens. Whitespace is needed between two tokens only if their concatenation +tokens: + +.. grammar-snippet:: + :group: python-grammar + + whitespace: ' ' | tab | formfeed + + +Whitespace is needed between two tokens only if their concatenation could otherwise be interpreted as a different token. For example, ``ab`` is one token, but ``a b`` is two tokens. However, ``+a`` and ``+ a`` both produce two tokens, ``+`` and ``a``, as ``+a`` is not a valid token. @@ -1032,124 +1040,59 @@ f-strings --------- .. versionadded:: 3.6 +.. versionchanged:: 3.7 + The :keyword:`await` and :keyword:`async for` can be used in expressions + within f-strings. +.. versionchanged:: 3.8 + Added the debug specifier (``=``) +.. versionchanged:: 3.12 + Many restrictions on expressions within f-strings have been removed. + Notably, nested strings, comments, and backslashes are now permitted. A :dfn:`formatted string literal` or :dfn:`f-string` is a string literal -that is prefixed with '``f``' or '``F``'. These strings may contain -replacement fields, which are expressions delimited by curly braces ``{}``. -While other string literals always have a constant value, formatted strings -are really expressions evaluated at run time. - -Escape sequences are decoded like in ordinary string literals (except when -a literal is also marked as a raw string). After decoding, the grammar -for the contents of the string is: - -.. productionlist:: python-grammar - f_string: (`literal_char` | "{{" | "}}" | `replacement_field`)* - replacement_field: "{" `f_expression` ["="] ["!" `conversion`] [":" `format_spec`] "}" - f_expression: (`conditional_expression` | "*" `or_expr`) - : ("," `conditional_expression` | "," "*" `or_expr`)* [","] - : | `yield_expression` - conversion: "s" | "r" | "a" - format_spec: (`literal_char` | `replacement_field`)* - literal_char: <any code point except "{", "}" or NULL> - -The parts of the string outside curly braces are treated literally, -except that any doubled curly braces ``'{{'`` or ``'}}'`` are replaced -with the corresponding single curly brace. A single opening curly -bracket ``'{'`` marks a replacement field, which starts with a -Python expression. To display both the expression text and its value after -evaluation, (useful in debugging), an equal sign ``'='`` may be added after the -expression. A conversion field, introduced by an exclamation point ``'!'`` may -follow. A format specifier may also be appended, introduced by a colon ``':'``. -A replacement field ends with a closing curly bracket ``'}'``. +that is prefixed with '``f``' or '``F``'. +Unlike other string literals, f-strings do not have a constant value. +They may contain *replacement fields* delimited by curly braces ``{}``. +Replacement fields contain expressions which are evaluated at run time. +For example:: + + >>> who = 'nobody' + >>> nationality = 'Spanish' + >>> f'{who.title()} expects the {nationality} Inquisition!' + 'Nobody expects the Spanish Inquisition!' + +Any doubled curly braces (``{{`` or ``}}``) outside replacement fields +are replaced with the corresponding single curly brace:: + + >>> print(f'{{...}}') + {...} + +Other characters outside replacement fields are treated like in ordinary +string literals. +This means that escape sequences are decoded (except when a literal is +also marked as a raw string), and newlines are possible in triple-quoted +f-strings:: + + >>> name = 'Galahad' + >>> favorite_color = 'blue' + >>> print(f'{name}:\t{favorite_color}') + Galahad: blue + >>> print(rf"C:\Users\{name}") + C:\Users\Galahad + >>> print(f'''Three shall be the number of the counting + ... and the number of the counting shall be three.''') + Three shall be the number of the counting + and the number of the counting shall be three. Expressions in formatted string literals are treated like regular -Python expressions surrounded by parentheses, with a few exceptions. -An empty expression is not allowed, and both :keyword:`lambda` and -assignment expressions ``:=`` must be surrounded by explicit parentheses. +Python expressions. Each expression is evaluated in the context where the formatted string literal -appears, in order from left to right. Replacement expressions can contain -newlines in both single-quoted and triple-quoted f-strings and they can contain -comments. Everything that comes after a ``#`` inside a replacement field -is a comment (even closing braces and quotes). In that case, replacement fields -must be closed in a different line. - -.. code-block:: text - - >>> f"abc{a # This is a comment }" - ... + 3}" - 'abc5' - -.. versionchanged:: 3.7 - Prior to Python 3.7, an :keyword:`await` expression and comprehensions - containing an :keyword:`async for` clause were illegal in the expressions - in formatted string literals due to a problem with the implementation. - -.. versionchanged:: 3.12 - Prior to Python 3.12, comments were not allowed inside f-string replacement - fields. - -When the equal sign ``'='`` is provided, the output will have the expression -text, the ``'='`` and the evaluated value. Spaces after the opening brace -``'{'``, within the expression and after the ``'='`` are all retained in the -output. By default, the ``'='`` causes the :func:`repr` of the expression to be -provided, unless there is a format specified. When a format is specified it -defaults to the :func:`str` of the expression unless a conversion ``'!r'`` is -declared. - -.. versionadded:: 3.8 - The equal sign ``'='``. - -If a conversion is specified, the result of evaluating the expression -is converted before formatting. Conversion ``'!s'`` calls :func:`str` on -the result, ``'!r'`` calls :func:`repr`, and ``'!a'`` calls :func:`ascii`. - -The result is then formatted using the :func:`format` protocol. The -format specifier is passed to the :meth:`~object.__format__` method of the -expression or conversion result. An empty string is passed when the -format specifier is omitted. The formatted result is then included in -the final value of the whole string. - -Top-level format specifiers may include nested replacement fields. These nested -fields may include their own conversion fields and :ref:`format specifiers -<formatspec>`, but may not include more deeply nested replacement fields. The -:ref:`format specifier mini-language <formatspec>` is the same as that used by -the :meth:`str.format` method. - -Formatted string literals may be concatenated, but replacement fields -cannot be split across literals. - -Some examples of formatted string literals:: - - >>> name = "Fred" - >>> f"He said his name is {name!r}." - "He said his name is 'Fred'." - >>> f"He said his name is {repr(name)}." # repr() is equivalent to !r - "He said his name is 'Fred'." - >>> width = 10 - >>> precision = 4 - >>> value = decimal.Decimal("12.34567") - >>> f"result: {value:{width}.{precision}}" # nested fields - 'result: 12.35' - >>> today = datetime(year=2017, month=1, day=27) - >>> f"{today:%B %d, %Y}" # using date format specifier - 'January 27, 2017' - >>> f"{today=:%B %d, %Y}" # using date format specifier and debugging - 'today=January 27, 2017' - >>> number = 1024 - >>> f"{number:#0x}" # using integer format specifier - '0x400' - >>> foo = "bar" - >>> f"{ foo = }" # preserves whitespace - " foo = 'bar'" - >>> line = "The mill's closed" - >>> f"{line = }" - 'line = "The mill\'s closed"' - >>> f"{line = :20}" - "line = The mill's closed " - >>> f"{line = !r:20}" - 'line = "The mill\'s closed" ' +appears, in order from left to right. +An empty expression is not allowed, and both :keyword:`lambda` and +assignment expressions ``:=`` must be surrounded by explicit parentheses:: + >>> f'{(half := 1/2)}, {half * 42}' + '0.5, 21.0' Reusing the outer f-string quoting type inside a replacement field is permitted:: @@ -1158,10 +1101,6 @@ permitted:: >>> f"abc {a["x"]} def" 'abc 2 def' -.. versionchanged:: 3.12 - Prior to Python 3.12, reuse of the same quoting type of the outer f-string - inside a replacement field was not possible. - Backslashes are also allowed in replacement fields and are evaluated the same way as in any other context:: @@ -1172,23 +1111,84 @@ way as in any other context:: b c -.. versionchanged:: 3.12 - Prior to Python 3.12, backslashes were not permitted inside an f-string - replacement field. +It is possible to nest f-strings:: + + >>> name = 'world' + >>> f'Repeated:{f' hello {name}' * 3}' + 'Repeated: hello world hello world hello world' + +Portable Python programs should not use more than 5 levels of nesting. + +.. impl-detail:: + + CPython does not limit nesting of f-strings. + +Replacement expressions can contain newlines in both single-quoted and +triple-quoted f-strings and they can contain comments. +Everything that comes after a ``#`` inside a replacement field +is a comment (even closing braces and quotes). +This means that replacement fields with comments must be closed in a +different line: + +.. code-block:: text + + >>> a = 2 + >>> f"abc{a # This comment }" continues until the end of the line + ... + 3}" + 'abc5' + +After the expression, replacement fields may optionally contain: + +* a *debug specifier* -- an equal sign (``=``), optionally surrounded by + whitespace on one or both sides; +* a *conversion specifier* -- ``!s``, ``!r`` or ``!a``; and/or +* a *format specifier* prefixed with a colon (``:``). + +See the :ref:`Standard Library section on f-strings <stdtypes-fstrings>` +for details on how these fields are evaluated. + +As that section explains, *format specifiers* are passed as the second argument +to the :func:`format` function to format a replacement field value. +For example, they can be used to specify a field width and padding characters +using the :ref:`Format Specification Mini-Language <formatspec>`:: -Formatted string literals cannot be used as docstrings, even if they do not -include expressions. + >>> number = 14.3 + >>> f'{number:20.7f}' + ' 14.3000000' -:: +Top-level format specifiers may include nested replacement fields:: + + >>> field_size = 20 + >>> precision = 7 + >>> f'{number:{field_size}.{precision}f}' + ' 14.3000000' + +These nested fields may include their own conversion fields and +:ref:`format specifiers <formatspec>`:: + + >>> number = 3 + >>> f'{number:{field_size}}' + ' 3' + >>> f'{number:{field_size:05}}' + '00000000000000000003' + +However, these nested fields may not include more deeply nested replacement +fields. + +Formatted string literals cannot be used as :term:`docstrings <docstring>`, +even if they do not include expressions:: >>> def foo(): ... f"Not a docstring" ... - >>> foo.__doc__ is None - True + >>> print(foo.__doc__) + None + +.. seealso:: -See also :pep:`498` for the proposal that added formatted string literals, -and :meth:`str.format`, which uses a related format string mechanism. + * :pep:`498` -- Literal String Interpolation + * :pep:`701` -- Syntactic formalization of f-strings + * :meth:`str.format`, which uses a related format string mechanism. .. _t-strings: @@ -1201,36 +1201,99 @@ t-strings A :dfn:`template string literal` or :dfn:`t-string` is a string literal that is prefixed with '``t``' or '``T``'. -These strings follow the same syntax and evaluation rules as -:ref:`formatted string literals <f-strings>`, with the following differences: - -* Rather than evaluating to a ``str`` object, template string literals evaluate - to a :class:`string.templatelib.Template` object. - -* The :func:`format` protocol is not used. - Instead, the format specifier and conversions (if any) are passed to - a new :class:`~string.templatelib.Interpolation` object that is created - for each evaluated expression. - It is up to code that processes the resulting :class:`~string.templatelib.Template` - object to decide how to handle format specifiers and conversions. - -* Format specifiers containing nested replacement fields are evaluated eagerly, - prior to being passed to the :class:`~string.templatelib.Interpolation` object. - For instance, an interpolation of the form ``{amount:.{precision}f}`` will - evaluate the inner expression ``{precision}`` to determine the value of the - ``format_spec`` attribute. - If ``precision`` were to be ``2``, the resulting format specifier - would be ``'.2f'``. - -* When the equals sign ``'='`` is provided in an interpolation expression, - the text of the expression is appended to the literal string that precedes - the relevant interpolation. - This includes the equals sign and any surrounding whitespace. - The :class:`!Interpolation` instance for the expression will be created as - normal, except that :attr:`~string.templatelib.Interpolation.conversion` will - be set to '``r``' (:func:`repr`) by default. - If an explicit conversion or format specifier are provided, - this will override the default behaviour. +These strings follow the same syntax rules as +:ref:`formatted string literals <f-strings>`. +For differences in evaluation rules, see the +:ref:`Standard Library section on t-strings <stdtypes-tstrings>` + + +Formal grammar for f-strings +---------------------------- + +F-strings are handled partly by the :term:`lexical analyzer`, which produces the +tokens :py:data:`~token.FSTRING_START`, :py:data:`~token.FSTRING_MIDDLE` +and :py:data:`~token.FSTRING_END`, and partly by the parser, which handles +expressions in the replacement field. +The exact way the work is split is a CPython implementation detail. + +Correspondingly, the f-string grammar is a mix of +:ref:`lexical and syntactic definitions <notation-lexical-vs-syntactic>`. + +Whitespace is significant in these situations: + +* There may be no whitespace in :py:data:`~token.FSTRING_START` (between + the prefix and quote). +* Whitespace in :py:data:`~token.FSTRING_MIDDLE` is part of the literal + string contents. +* In ``fstring_replacement_field``, if ``f_debug_specifier`` is present, + all whitespace after the opening brace until the ``f_debug_specifier``, + as well as whitespace immediatelly following ``f_debug_specifier``, + is retained as part of the expression. + + .. impl-detail:: + + The expression is not handled in the tokenization phase; it is + retrieved from the source code using locations of the ``{`` token + and the token after ``=``. + + +The ``FSTRING_MIDDLE`` definition uses +:ref:`negative lookaheads <lexical-lookaheads>` (``!``) +to indicate special characters (backslash, newline, ``{``, ``}``) and +sequences (``f_quote``). + +.. grammar-snippet:: + :group: python-grammar + + fstring: `FSTRING_START` `fstring_middle`* `FSTRING_END` + + FSTRING_START: `fstringprefix` ("'" | '"' | "'''" | '"""') + FSTRING_END: `f_quote` + fstringprefix: <("f" | "fr" | "rf"), case-insensitive> + f_debug_specifier: '=' + f_quote: <the quote character(s) used in FSTRING_START> + + fstring_middle: + | `fstring_replacement_field` + | `FSTRING_MIDDLE` + FSTRING_MIDDLE: + | (!"\" !`newline` !'{' !'}' !`f_quote`) `source_character` + | `stringescapeseq` + | "{{" + | "}}" + | <newline, in triple-quoted f-strings only> + fstring_replacement_field: + | '{' `f_expression` [`f_debug_specifier`] [`fstring_conversion`] + [`fstring_full_format_spec`] '}' + fstring_conversion: + | "!" ("s" | "r" | "a") + fstring_full_format_spec: + | ':' `fstring_format_spec`* + fstring_format_spec: + | `FSTRING_MIDDLE` + | `fstring_replacement_field` + f_expression: + | ','.(`conditional_expression` | "*" `or_expr`)+ [","] + | `yield_expression` + +.. note:: + + In the above grammar snippet, the ``f_quote`` and ``FSTRING_MIDDLE`` rules + are context-sensitive -- they depend on the contents of ``FSTRING_START`` + of the nearest enclosing ``fstring``. + + Constructing a more traditional formal grammar from this template is left + as an exercise for the reader. + +The grammar for t-strings is identical to the one for f-strings, with *t* +instead of *f* at the beginning of rule and token names and in the prefix. + +.. grammar-snippet:: + :group: python-grammar + + tstring: TSTRING_START tstring_middle* TSTRING_END + + <rest of the t-string grammar is omitted; see above> .. _numbers: From d069edc9e8048b3f4b1bd63379dd387d2b75d14c Mon Sep 17 00:00:00 2001 From: Peter Bierma <zintensitydev@gmail.com> Date: Thu, 4 Dec 2025 08:07:39 -0500 Subject: [PATCH 1543/1674] [3.14] gh-141004: Add a CI job ensuring that new C APIs include documentation (GH-142102) (GH-142247) * gh-141004: Add a CI job ensuring that new C APIs include documentation (GH-142102) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> (cherry picked from commit 1a7824a927f0706300af7bfc182884a43e2f587a) --------- Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .github/workflows/build.yml | 3 + Makefile.pre.in | 5 + Tools/check-c-api-docs/ignored_c_api.txt | 99 ++++++++++++ Tools/check-c-api-docs/main.py | 193 +++++++++++++++++++++++ 5 files changed, 301 insertions(+) create mode 100644 Tools/check-c-api-docs/ignored_c_api.txt create mode 100644 Tools/check-c-api-docs/main.py diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b5e5bae2c9c98a..9c262f47a404e2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -58,6 +58,7 @@ Lib/test/test_type_*.py @JelleZijlstra Lib/test/test_capi/test_misc.py @markshannon Lib/test/test_pyrepl/* @pablogsal @lysnikolaou @ambv Tools/c-analyzer/ @ericsnowcurrently +Tools/check-c-api-docs/ @ZeroIntensity # dbm **/*dbm* @corona10 @erlend-aasland @serhiy-storchaka diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 77f7be20dcd4b3..1dbc890d5b38c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -189,6 +189,9 @@ jobs: - name: Check for unsupported C global variables if: github.event_name == 'pull_request' # $GITHUB_EVENT_NAME run: make check-c-globals + - name: Check for undocumented C APIs + run: make check-c-api-docs + build-windows: name: >- diff --git a/Makefile.pre.in b/Makefile.pre.in index f29de054aba6ee..08ad5f4921dd5f 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -3295,6 +3295,11 @@ check-c-globals: --format summary \ --traceback +# Check for undocumented C APIs. +.PHONY: check-c-api-docs +check-c-api-docs: + $(PYTHON_FOR_REGEN) $(srcdir)/Tools/check-c-api-docs/main.py + # Find files with funny names .PHONY: funny funny: diff --git a/Tools/check-c-api-docs/ignored_c_api.txt b/Tools/check-c-api-docs/ignored_c_api.txt new file mode 100644 index 00000000000000..c5a277bb3a599d --- /dev/null +++ b/Tools/check-c-api-docs/ignored_c_api.txt @@ -0,0 +1,99 @@ +# pydtrace_probes.h +PyDTrace_AUDIT +PyDTrace_FUNCTION_ENTRY +PyDTrace_FUNCTION_RETURN +PyDTrace_GC_DONE +PyDTrace_GC_START +PyDTrace_IMPORT_FIND_LOAD_DONE +PyDTrace_IMPORT_FIND_LOAD_START +PyDTrace_INSTANCE_DELETE_DONE +PyDTrace_INSTANCE_DELETE_START +PyDTrace_INSTANCE_NEW_DONE +PyDTrace_INSTANCE_NEW_START +PyDTrace_LINE +# fileobject.h +Py_FileSystemDefaultEncodeErrors +Py_FileSystemDefaultEncoding +Py_HasFileSystemDefaultEncoding +Py_UTF8Mode +# pyhash.h +Py_HASH_EXTERNAL +# exports.h +PyAPI_DATA +Py_EXPORTED_SYMBOL +Py_IMPORTED_SYMBOL +Py_LOCAL_SYMBOL +# modsupport.h +PyABIInfo_FREETHREADING_AGNOSTIC +# moduleobject.h +PyModuleDef_Type +# object.h +Py_INVALID_SIZE +Py_TPFLAGS_HAVE_VERSION_TAG +Py_TPFLAGS_INLINE_VALUES +Py_TPFLAGS_IS_ABSTRACT +# pyexpat.h +PyExpat_CAPI_MAGIC +PyExpat_CAPSULE_NAME +# pyport.h +Py_ALIGNED +Py_ARITHMETIC_RIGHT_SHIFT +Py_CAN_START_THREADS +Py_FORCE_EXPANSION +Py_GCC_ATTRIBUTE +Py_LL +Py_SAFE_DOWNCAST +Py_ULL +Py_VA_COPY +# unicodeobject.h +Py_UNICODE_SIZE +# cpython/methodobject.h +PyCFunction_GET_CLASS +# cpython/compile.h +PyCF_ALLOW_INCOMPLETE_INPUT +PyCF_COMPILE_MASK +PyCF_DONT_IMPLY_DEDENT +PyCF_IGNORE_COOKIE +PyCF_MASK +PyCF_MASK_OBSOLETE +PyCF_SOURCE_IS_UTF8 +# cpython/descrobject.h +PyDescr_COMMON +PyDescr_NAME +PyDescr_TYPE +PyWrapperFlag_KEYWORDS +# cpython/fileobject.h +PyFile_NewStdPrinter +PyStdPrinter_Type +Py_UniversalNewlineFgets +# cpython/setobject.h +PySet_MINSIZE +# cpython/ceval.h +PyUnstable_CopyPerfMapFile +PyUnstable_PerfTrampoline_CompileCode +PyUnstable_PerfTrampoline_SetPersistAfterFork +# cpython/genobject.h +PyAsyncGenASend_CheckExact +# cpython/longintrepr.h +PyLong_BASE +PyLong_MASK +PyLong_SHIFT +# cpython/pyerrors.h +PyException_HEAD +# cpython/pyframe.h +PyUnstable_EXECUTABLE_KINDS +PyUnstable_EXECUTABLE_KIND_BUILTIN_FUNCTION +PyUnstable_EXECUTABLE_KIND_METHOD_DESCRIPTOR +PyUnstable_EXECUTABLE_KIND_PY_FUNCTION +PyUnstable_EXECUTABLE_KIND_SKIP +# cpython/pylifecycle.h +Py_FrozenMain +# cpython/unicodeobject.h +PyUnicode_IS_COMPACT +PyUnicode_IS_COMPACT_ASCII +# 3.14 only +Py_TPFLAGS_PREHEADER +PyUnicode_AsDecodedObject +PyUnicode_AsDecodedUnicode +PyUnicode_AsEncodedObject +PyUnicode_AsEncodedUnicode diff --git a/Tools/check-c-api-docs/main.py b/Tools/check-c-api-docs/main.py new file mode 100644 index 00000000000000..6bdf80a9ae8985 --- /dev/null +++ b/Tools/check-c-api-docs/main.py @@ -0,0 +1,193 @@ +import re +from pathlib import Path +import sys +import _colorize +import textwrap + +SIMPLE_FUNCTION_REGEX = re.compile(r"PyAPI_FUNC(.+) (\w+)\(") +SIMPLE_MACRO_REGEX = re.compile(r"# *define *(\w+)(\(.+\))? ") +SIMPLE_INLINE_REGEX = re.compile(r"static inline .+( |\n)(\w+)") +SIMPLE_DATA_REGEX = re.compile(r"PyAPI_DATA\(.+\) (\w+)") + +CPYTHON = Path(__file__).parent.parent.parent +INCLUDE = CPYTHON / "Include" +C_API_DOCS = CPYTHON / "Doc" / "c-api" +IGNORED = ( + (CPYTHON / "Tools" / "check-c-api-docs" / "ignored_c_api.txt") + .read_text() + .split("\n") +) + +for index, line in enumerate(IGNORED): + if line.startswith("#"): + IGNORED.pop(index) + +MISTAKE = """ +If this is a mistake and this script should not be failing, create an +issue and tag Peter (@ZeroIntensity) on it.\ +""" + + +def found_undocumented(singular: bool) -> str: + some = "an" if singular else "some" + s = "" if singular else "s" + these = "this" if singular else "these" + them = "it" if singular else "them" + were = "was" if singular else "were" + + return ( + textwrap.dedent( + f""" + Found {some} undocumented C API{s}! + + Python requires documentation on all public C API symbols, macros, and types. + If {these} API{s} {were} not meant to be public, prefix {them} with a + leading underscore (_PySomething_API) or move {them} to the internal C API + (pycore_*.h files). + + In exceptional cases, certain APIs can be ignored by adding them to + Tools/check-c-api-docs/ignored_c_api.txt + """ + ) + + MISTAKE + ) + + +def found_ignored_documented(singular: bool) -> str: + some = "a" if singular else "some" + s = "" if singular else "s" + them = "it" if singular else "them" + were = "was" if singular else "were" + they = "it" if singular else "they" + + return ( + textwrap.dedent( + f""" + Found {some} C API{s} listed in Tools/c-api-docs-check/ignored_c_api.txt, but + {they} {were} found in the documentation. To fix this, remove {them} from + ignored_c_api.txt. + """ + ) + + MISTAKE + ) + + +def is_documented(name: str) -> bool: + """ + Is a name present in the C API documentation? + """ + for path in C_API_DOCS.iterdir(): + if path.is_dir(): + continue + if path.suffix != ".rst": + continue + + text = path.read_text(encoding="utf-8") + if name in text: + return True + + return False + + +def scan_file_for_docs(filename: str, text: str) -> tuple[list[str], list[str]]: + """ + Scan a header file for C API functions. + """ + undocumented: list[str] = [] + documented_ignored: list[str] = [] + colors = _colorize.get_colors() + + def check_for_name(name: str) -> None: + documented = is_documented(name) + if documented and (name in IGNORED): + documented_ignored.append(name) + elif not documented and (name not in IGNORED): + undocumented.append(name) + + for function in SIMPLE_FUNCTION_REGEX.finditer(text): + name = function.group(2) + if not name.startswith("Py"): + continue + + check_for_name(name) + + for macro in SIMPLE_MACRO_REGEX.finditer(text): + name = macro.group(1) + if not name.startswith("Py"): + continue + + if "(" in name: + name = name[: name.index("(")] + + check_for_name(name) + + for inline in SIMPLE_INLINE_REGEX.finditer(text): + name = inline.group(2) + if not name.startswith("Py"): + continue + + check_for_name(name) + + for data in SIMPLE_DATA_REGEX.finditer(text): + name = data.group(1) + if not name.startswith("Py"): + continue + + check_for_name(name) + + # Remove duplicates and sort alphabetically to keep the output deterministic + undocumented = list(set(undocumented)) + undocumented.sort() + + if undocumented or documented_ignored: + print(f"{filename} {colors.RED}BAD{colors.RESET}") + for name in undocumented: + print(f"{colors.BOLD_RED}UNDOCUMENTED:{colors.RESET} {name}") + for name in documented_ignored: + print(f"{colors.BOLD_YELLOW}DOCUMENTED BUT IGNORED:{colors.RESET} {name}") + else: + print(f"{filename} {colors.GREEN}OK{colors.RESET}") + + return undocumented, documented_ignored + + +def main() -> None: + print("Scanning for undocumented C API functions...") + files = [*INCLUDE.iterdir(), *(INCLUDE / "cpython").iterdir()] + all_missing: list[str] = [] + all_found_ignored: list[str] = [] + + for file in files: + if file.is_dir(): + continue + assert file.exists() + text = file.read_text(encoding="utf-8") + missing, ignored = scan_file_for_docs(str(file.relative_to(INCLUDE)), text) + all_found_ignored += ignored + all_missing += missing + + fail = False + to_check = [ + (all_missing, "missing", found_undocumented(len(all_missing) == 1)), + ( + all_found_ignored, + "documented but ignored", + found_ignored_documented(len(all_found_ignored) == 1), + ), + ] + for name_list, what, message in to_check: + if not name_list: + continue + + s = "s" if len(name_list) != 1 else "" + print(f"-- {len(name_list)} {what} C API{s} --") + for name in name_list: + print(f" - {name}") + print(message) + fail = True + + sys.exit(1 if fail else 0) + + +if __name__ == "__main__": + main() From 88e1f695f385c9625a499940d163972f8f51b96e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 4 Dec 2025 15:03:36 +0100 Subject: [PATCH 1544/1674] [3.14] gh-129483: Make `TestLocalTimeDisambiguation`'s time format locale independent (GH-142193) (#142258) gh-129483: Make `TestLocalTimeDisambiguation`'s time format locale independent (GH-142193) * Change to update %c to the exact time format. --------- (cherry picked from commit 8392095bf969655faf785dd0932c3f02fc4ec311) Co-authored-by: Kir Chou <148194051+gkirchou@users.noreply.github.com> Co-authored-by: Kir Chou <note351@hotmail.com> --- Lib/test/datetimetester.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index aca5fbc04b18cb..0540f94fe93a83 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -6137,21 +6137,21 @@ def test_vilnius_1941_fromutc(self): gdt = datetime(1941, 6, 23, 20, 59, 59, tzinfo=timezone.utc) ldt = gdt.astimezone(Vilnius) - self.assertEqual(ldt.strftime("%c %Z%z"), + self.assertEqual(ldt.strftime("%a %b %d %H:%M:%S %Y %Z%z"), 'Mon Jun 23 23:59:59 1941 MSK+0300') self.assertEqual(ldt.fold, 0) self.assertFalse(ldt.dst()) gdt = datetime(1941, 6, 23, 21, tzinfo=timezone.utc) ldt = gdt.astimezone(Vilnius) - self.assertEqual(ldt.strftime("%c %Z%z"), + self.assertEqual(ldt.strftime("%a %b %d %H:%M:%S %Y %Z%z"), 'Mon Jun 23 23:00:00 1941 CEST+0200') self.assertEqual(ldt.fold, 1) self.assertTrue(ldt.dst()) gdt = datetime(1941, 6, 23, 22, tzinfo=timezone.utc) ldt = gdt.astimezone(Vilnius) - self.assertEqual(ldt.strftime("%c %Z%z"), + self.assertEqual(ldt.strftime("%a %b %d %H:%M:%S %Y %Z%z"), 'Tue Jun 24 00:00:00 1941 CEST+0200') self.assertEqual(ldt.fold, 0) self.assertTrue(ldt.dst()) @@ -6161,22 +6161,22 @@ def test_vilnius_1941_toutc(self): ldt = datetime(1941, 6, 23, 22, 59, 59, tzinfo=Vilnius) gdt = ldt.astimezone(timezone.utc) - self.assertEqual(gdt.strftime("%c %Z"), + self.assertEqual(gdt.strftime("%a %b %d %H:%M:%S %Y %Z"), 'Mon Jun 23 19:59:59 1941 UTC') ldt = datetime(1941, 6, 23, 23, 59, 59, tzinfo=Vilnius) gdt = ldt.astimezone(timezone.utc) - self.assertEqual(gdt.strftime("%c %Z"), + self.assertEqual(gdt.strftime("%a %b %d %H:%M:%S %Y %Z"), 'Mon Jun 23 20:59:59 1941 UTC') ldt = datetime(1941, 6, 23, 23, 59, 59, tzinfo=Vilnius, fold=1) gdt = ldt.astimezone(timezone.utc) - self.assertEqual(gdt.strftime("%c %Z"), + self.assertEqual(gdt.strftime("%a %b %d %H:%M:%S %Y %Z"), 'Mon Jun 23 21:59:59 1941 UTC') ldt = datetime(1941, 6, 24, 0, tzinfo=Vilnius) gdt = ldt.astimezone(timezone.utc) - self.assertEqual(gdt.strftime("%c %Z"), + self.assertEqual(gdt.strftime("%a %b %d %H:%M:%S %Y %Z"), 'Mon Jun 23 22:00:00 1941 UTC') def test_constructors(self): From 94012d65c9669c03d254c1afe1278eff215e7f56 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 4 Dec 2025 15:51:55 +0100 Subject: [PATCH 1545/1674] [3.14] gh-116738: Statically initialize special constants in cmath module (gh-142161) (gh-142261) The initialization during `mod_exec` wasn't thread-safe with multiple interpreters. (cherry picked from commit 2dac9e6016c81abbefa4256253ff5c59b29378a7) Co-authored-by: Alper <alperyoney@fb.com> --- ...-12-01-10-03-08.gh-issue-116738.972YsG.rst | 2 + Modules/cmathmodule.c | 225 ++++++++---------- 2 files changed, 101 insertions(+), 126 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst new file mode 100644 index 00000000000000..d6d9d02b017473 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst @@ -0,0 +1,2 @@ +Fix :mod:`cmath` data race when initializing trigonometric tables with +subinterpreters. diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 81cbf0d554de3c..f12455b286b84d 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -163,8 +163,15 @@ special_type(double d) raised. */ -static Py_complex acos_special_values[7][7]; - +static Py_complex acos_special_values[7][7] = { + { {P34,INF}, {P,INF}, {P,INF}, {P,-INF}, {P,-INF}, {P34,-INF}, {N,INF} }, + { {P12,INF}, {U,U}, {U,U}, {U,U}, {U,U}, {P12,-INF}, {N,N} }, + { {P12,INF}, {U,U}, {P12,0.}, {P12,-0.}, {U,U}, {P12,-INF}, {P12,N} }, + { {P12,INF}, {U,U}, {P12,0.}, {P12,-0.}, {U,U}, {P12,-INF}, {P12,N} }, + { {P12,INF}, {U,U}, {U,U}, {U,U}, {U,U}, {P12,-INF}, {N,N} }, + { {P14,INF}, {0.,INF}, {0.,INF}, {0.,-INF}, {0.,-INF}, {P14,-INF}, {N,INF} }, + { {N,INF}, {N,N}, {N,N}, {N,N}, {N,N}, {N,-INF}, {N,N} } +}; /*[clinic input] cmath.acos -> Py_complex_protected @@ -202,7 +209,15 @@ cmath_acos_impl(PyObject *module, Py_complex z) } -static Py_complex acosh_special_values[7][7]; +static Py_complex acosh_special_values[7][7] = { + { {INF,-P34}, {INF,-P}, {INF,-P}, {INF,P}, {INF,P}, {INF,P34}, {INF,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {0.,-P12}, {0.,P12}, {U,U}, {INF,P12}, {N,P12} }, + { {INF,-P12}, {U,U}, {0.,-P12}, {0.,P12}, {U,U}, {INF,P12}, {N,P12} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P14}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,P14}, {INF,N} }, + { {INF,N}, {N,N}, {N,N}, {N,N}, {N,N}, {INF,N}, {N,N} } +}; /*[clinic input] cmath.acosh = cmath.acos @@ -257,7 +272,15 @@ cmath_asin_impl(PyObject *module, Py_complex z) } -static Py_complex asinh_special_values[7][7]; +static Py_complex asinh_special_values[7][7] = { + { {-INF,-P14}, {-INF,-0.}, {-INF,-0.}, {-INF,0.}, {-INF,0.}, {-INF,P14}, {-INF,N} }, + { {-INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {-INF,P12}, {N,N} }, + { {-INF,-P12}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {-INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P14}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,P14}, {INF,N} }, + { {INF,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {INF,N}, {N,N} } +}; /*[clinic input] cmath.asinh = cmath.acos @@ -318,7 +341,15 @@ cmath_atan_impl(PyObject *module, Py_complex z) } -static Py_complex atanh_special_values[7][7]; +static Py_complex atanh_special_values[7][7] = { + { {-0.,-P12}, {-0.,-P12}, {-0.,-P12}, {-0.,P12}, {-0.,P12}, {-0.,P12}, {-0.,N} }, + { {-0.,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {-0.,P12}, {N,N} }, + { {-0.,-P12}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {-0.,P12}, {-0.,N} }, + { {0.,-P12}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,P12}, {0.,N} }, + { {0.,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {0.,P12}, {N,N} }, + { {0.,-P12}, {0.,-P12}, {0.,-P12}, {0.,P12}, {0.,P12}, {0.,P12}, {0.,N} }, + { {0.,-P12}, {N,N}, {N,N}, {N,N}, {N,N}, {0.,P12}, {N,N} } +}; /*[clinic input] cmath.atanh = cmath.acos @@ -391,7 +422,15 @@ cmath_cos_impl(PyObject *module, Py_complex z) /* cosh(infinity + i*y) needs to be dealt with specially */ -static Py_complex cosh_special_values[7][7]; +static Py_complex cosh_special_values[7][7] = { + { {INF,N}, {U,U}, {INF,0.}, {INF,-0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {N,0.}, {U,U}, {1.,0.}, {1.,-0.}, {U,U}, {N,0.}, {N,0.} }, + { {N,0.}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {N,0.}, {N,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,0.}, {N,0.}, {N,N}, {N,N}, {N,N} } +}; /*[clinic input] cmath.cosh = cmath.acos @@ -453,7 +492,15 @@ cmath_cosh_impl(PyObject *module, Py_complex z) /* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for finite y */ -static Py_complex exp_special_values[7][7]; +static Py_complex exp_special_values[7][7] = { + { {0.,0.}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,0.}, {0.,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {N,N}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {N,N}, {N,N} }, + { {N,N}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {N,N}, {N,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {N,N}, {N,N} } +}; /*[clinic input] cmath.exp = cmath.acos @@ -512,7 +559,15 @@ cmath_exp_impl(PyObject *module, Py_complex z) return r; } -static Py_complex log_special_values[7][7]; +static Py_complex log_special_values[7][7] = { + { {INF,-P34}, {INF,-P}, {INF,-P}, {INF,P}, {INF,P}, {INF,P34}, {INF,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {-INF,-P}, {-INF,P}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {-INF,-0.}, {-INF,0.}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P14}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,P14}, {INF,N} }, + { {INF,N}, {N,N}, {N,N}, {N,N}, {N,N}, {INF,N}, {N,N} } +}; static Py_complex c_log(Py_complex z) @@ -628,7 +683,15 @@ cmath_sin_impl(PyObject *module, Py_complex z) /* sinh(infinity + i*y) needs to be dealt with specially */ -static Py_complex sinh_special_values[7][7]; +static Py_complex sinh_special_values[7][7] = { + { {INF,N}, {U,U}, {-INF,-0.}, {-INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {0.,N}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {0.,N}, {0.,N} }, + { {0.,N}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,N}, {0.,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {N,N}, {N,N} } +}; /*[clinic input] cmath.sinh = cmath.acos @@ -687,7 +750,15 @@ cmath_sinh_impl(PyObject *module, Py_complex z) } -static Py_complex sqrt_special_values[7][7]; +static Py_complex sqrt_special_values[7][7] = { + { {INF,-INF}, {0.,-INF}, {0.,-INF}, {0.,INF}, {0.,INF}, {INF,INF}, {N,INF} }, + { {INF,-INF}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,INF}, {INF,N} }, + { {INF,-INF}, {N,N}, {N,N}, {N,N}, {N,N}, {INF,INF}, {N,N} } +}; /*[clinic input] cmath.sqrt = cmath.acos @@ -786,7 +857,15 @@ cmath_tan_impl(PyObject *module, Py_complex z) /* tanh(infinity + i*y) needs to be dealt with specially */ -static Py_complex tanh_special_values[7][7]; +static Py_complex tanh_special_values[7][7] = { + { {-1.,0.}, {U,U}, {-1.,-0.}, {-1.,0.}, {U,U}, {-1.,0.}, {-1.,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {-0.0,N}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {-0.0,N}, {-0.,N} }, + { {0.0,N}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.0,N}, {0.,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {1.,0.}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {1.,0.}, {1.,0.} }, + { {N,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {N,N}, {N,N} } +}; /*[clinic input] cmath.tanh = cmath.acos @@ -969,7 +1048,15 @@ cmath_polar_impl(PyObject *module, Py_complex z) */ -static Py_complex rect_special_values[7][7]; +static Py_complex rect_special_values[7][7] = { + { {INF,N}, {U,U}, {-INF,0.}, {-INF,-0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {0.,0.}, {U,U}, {-0.,0.}, {-0.,-0.}, {U,U}, {0.,0.}, {0.,0.} }, + { {0.,0.}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,0.}, {0.,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,0.}, {N,0.}, {N,N}, {N,N}, {N,N} } +}; /*[clinic input] cmath.rect @@ -1200,120 +1287,6 @@ cmath_exec(PyObject *mod) return -1; } - /* initialize special value tables */ - -#define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY } -#define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p; - - INIT_SPECIAL_VALUES(acos_special_values, { - C(P34,INF) C(P,INF) C(P,INF) C(P,-INF) C(P,-INF) C(P34,-INF) C(N,INF) - C(P12,INF) C(U,U) C(U,U) C(U,U) C(U,U) C(P12,-INF) C(N,N) - C(P12,INF) C(U,U) C(P12,0.) C(P12,-0.) C(U,U) C(P12,-INF) C(P12,N) - C(P12,INF) C(U,U) C(P12,0.) C(P12,-0.) C(U,U) C(P12,-INF) C(P12,N) - C(P12,INF) C(U,U) C(U,U) C(U,U) C(U,U) C(P12,-INF) C(N,N) - C(P14,INF) C(0.,INF) C(0.,INF) C(0.,-INF) C(0.,-INF) C(P14,-INF) C(N,INF) - C(N,INF) C(N,N) C(N,N) C(N,N) C(N,N) C(N,-INF) C(N,N) - }) - - INIT_SPECIAL_VALUES(acosh_special_values, { - C(INF,-P34) C(INF,-P) C(INF,-P) C(INF,P) C(INF,P) C(INF,P34) C(INF,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(0.,-P12) C(0.,P12) C(U,U) C(INF,P12) C(N,P12) - C(INF,-P12) C(U,U) C(0.,-P12) C(0.,P12) C(U,U) C(INF,P12) C(N,P12) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N) - C(INF,N) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(asinh_special_values, { - C(-INF,-P14) C(-INF,-0.) C(-INF,-0.) C(-INF,0.) C(-INF,0.) C(-INF,P14) C(-INF,N) - C(-INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(-INF,P12) C(N,N) - C(-INF,-P12) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N) - C(INF,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(INF,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(atanh_special_values, { - C(-0.,-P12) C(-0.,-P12) C(-0.,-P12) C(-0.,P12) C(-0.,P12) C(-0.,P12) C(-0.,N) - C(-0.,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(-0.,P12) C(N,N) - C(-0.,-P12) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-0.,P12) C(-0.,N) - C(0.,-P12) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,P12) C(0.,N) - C(0.,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(0.,P12) C(N,N) - C(0.,-P12) C(0.,-P12) C(0.,-P12) C(0.,P12) C(0.,P12) C(0.,P12) C(0.,N) - C(0.,-P12) C(N,N) C(N,N) C(N,N) C(N,N) C(0.,P12) C(N,N) - }) - - INIT_SPECIAL_VALUES(cosh_special_values, { - C(INF,N) C(U,U) C(INF,0.) C(INF,-0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(N,0.) C(U,U) C(1.,0.) C(1.,-0.) C(U,U) C(N,0.) C(N,0.) - C(N,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,0.) C(N,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(exp_special_values, { - C(0.,0.) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,0.) C(0.,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(N,N) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,N) C(N,N) - C(N,N) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,N) C(N,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(log_special_values, { - C(INF,-P34) C(INF,-P) C(INF,-P) C(INF,P) C(INF,P) C(INF,P34) C(INF,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(-INF,-P) C(-INF,P) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N) - C(INF,N) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(sinh_special_values, { - C(INF,N) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(0.,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(0.,N) C(0.,N) - C(0.,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,N) C(0.,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(sqrt_special_values, { - C(INF,-INF) C(0.,-INF) C(0.,-INF) C(0.,INF) C(0.,INF) C(INF,INF) C(N,INF) - C(INF,-INF) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,INF) C(INF,N) - C(INF,-INF) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,INF) C(N,N) - }) - - INIT_SPECIAL_VALUES(tanh_special_values, { - C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(-0.0,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-0.0,N) C(-0.,N) - C(0.0,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.0,N) C(0.,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(1.,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(1.,0.) C(1.,0.) - C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(rect_special_values, { - C(INF,N) C(U,U) C(-INF,0.) C(-INF,-0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(0.,0.) C(U,U) C(-0.,0.) C(-0.,-0.) C(U,U) C(0.,0.) C(0.,0.) - C(0.,0.) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,0.) C(0.,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) return 0; } From 654e3c7435180d4aec8a2fcb16a16585cea7ab70 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 09:08:15 +0100 Subject: [PATCH 1546/1674] [3.14] gh-142214: Fix two regressions in dataclasses (GH-142223) (#142277) gh-142214: Fix two regressions in dataclasses (GH-142223) (cherry picked from commit 53ec7c8fc07eb6958869638a0cad70c52ad6fcf5) Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> --- Lib/dataclasses.py | 14 +++++++--- Lib/test/test_dataclasses/__init__.py | 28 +++++++++++++++++++ ...-12-03-06-12-39.gh-issue-142214.appYNZ.rst | 12 ++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index fb7e1701cce0a4..c8dbb247745ab7 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -550,7 +550,12 @@ def __annotate__(format, /): new_annotations = {} for k in annotation_fields: - new_annotations[k] = cls_annotations[k] + # gh-142214: The annotation may be missing in unusual dynamic cases. + # If so, just skip it. + try: + new_annotations[k] = cls_annotations[k] + except KeyError: + pass if return_type is not MISSING: if format == Format.STRING: @@ -1398,9 +1403,10 @@ def _add_slots(cls, is_frozen, weakref_slot, defined_fields): f.type = ann # Fix the class reference in the __annotate__ method - init_annotate = newcls.__init__.__annotate__ - if getattr(init_annotate, "__generated_by_dataclasses__", False): - _update_func_cell_for__class__(init_annotate, cls, newcls) + init = newcls.__init__ + if init_annotate := getattr(init, "__annotate__", None): + if getattr(init_annotate, "__generated_by_dataclasses__", False): + _update_func_cell_for__class__(init_annotate, cls, newcls) return newcls diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index 513dd78c4381b4..3b335429b98500 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -927,6 +927,20 @@ class C: validate_class(C) + def test_incomplete_annotations(self): + # gh-142214 + @dataclass + class C: + "doc" # needed because otherwise we fetch the annotations at the wrong time + x: int + + C.__annotate__ = lambda _: {} + + self.assertEqual( + annotationlib.get_annotations(C.__init__), + {"return": None} + ) + def test_missing_default(self): # Test that MISSING works the same as a default not being # specified. @@ -2578,6 +2592,20 @@ def __init__(self, x: int) -> None: self.assertFalse(hasattr(E.__init__.__annotate__, "__generated_by_dataclasses__")) + def test_slots_true_init_false(self): + # Test that slots=True and init=False work together and + # that __annotate__ is not added to __init__. + + @dataclass(slots=True, init=False) + class F: + x: int + + f = F() + f.x = 10 + self.assertEqual(f.x, 10) + + self.assertFalse(hasattr(F.__init__, "__annotate__")) + def test_init_false_forwardref(self): # Test forward references in fields not required for __init__ annotations. diff --git a/Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst b/Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst new file mode 100644 index 00000000000000..b87430ec1a3d65 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst @@ -0,0 +1,12 @@ +Fix two regressions in :mod:`dataclasses` in Python 3.14.1 related to +annotations. + +* An exception is no longer raised if ``slots=True`` is used and the + ``__init__`` method does not have an ``__annotate__`` attribute + (likely because ``init=False`` was used). + +* An exception is no longer raised if annotations are requested on the + ``__init__`` method and one of the fields is not present in the class + annotations. This can occur in certain dynamic scenarios. + +Patch by Jelle Zijlstra. From f130b06da30616dd4dae363c7d8af79b540a7971 Mon Sep 17 00:00:00 2001 From: Petr Viktorin <encukou@gmail.com> Date: Fri, 5 Dec 2025 12:47:30 +0100 Subject: [PATCH 1547/1674] [3.14] gh-142206: multiprocessing.resource_tracker: Decode messages using older protocol (GH-142215) (GH-142285) (cherry picked from commit 4172644d78d58189e46424af0aea302b1d78e2de) Difference from the original commit: the default in 3.14 is to use the simpler original protocol (except for filenames with newlines). Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Lib/multiprocessing/resource_tracker.py | 63 +++++++++++++------ Lib/test/_test_multiprocessing.py | 27 +++++++- ...-12-03-09-36-29.gh-issue-142206.ilwegH.rst | 7 +++ 3 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index b0f9099f4a59f3..2ef2d1ece540d5 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -68,6 +68,13 @@ def __init__(self): self._exitcode = None self._reentrant_messages = deque() + # True to use colon-separated lines, rather than JSON lines, + # for internal communication. (Mainly for testing). + # Filenames not supported by the simple format will always be sent + # using JSON. + # The reader should understand all formats. + self._use_simple_format = True + 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 (*) @@ -200,7 +207,9 @@ def _launch(self): os.close(r) def _make_probe_message(self): - """Return a JSON-encoded probe message.""" + """Return a probe message.""" + if self._use_simple_format: + return b'PROBE:0:noop\n' return ( json.dumps( {"cmd": "PROBE", "rtype": "noop"}, @@ -267,6 +276,15 @@ def _write(self, msg): assert nbytes == len(msg), f"{nbytes=} != {len(msg)=}" def _send(self, cmd, name, rtype): + if self._use_simple_format and '\n' not in name: + msg = f"{cmd}:{name}:{rtype}\n".encode("ascii") + if len(msg) > 512: + # posix guarantees that writes to a pipe of less than PIPE_BUF + # bytes are atomic, and that PIPE_BUF >= 512 + raise ValueError('msg too long') + self._ensure_running_and_write(msg) + return + # POSIX guarantees that writes to a pipe of less than PIPE_BUF (512 on Linux) # bytes are atomic. Therefore, we want the message to be shorter than 512 bytes. # POSIX shm_open() and sem_open() require the name, including its leading slash, @@ -286,6 +304,7 @@ def _send(self, cmd, name, rtype): # The entire JSON message is guaranteed < PIPE_BUF (512 bytes) by construction. assert len(msg) <= 512, f"internal error: message too long ({len(msg)} bytes)" + assert msg.startswith(b'{') self._ensure_running_and_write(msg) @@ -296,6 +315,30 @@ def _send(self, cmd, name, rtype): getfd = _resource_tracker.getfd +def _decode_message(line): + if line.startswith(b'{'): + try: + obj = json.loads(line.decode('ascii')) + except Exception as e: + raise ValueError("malformed resource_tracker message: %r" % (line,)) from e + + cmd = obj["cmd"] + rtype = obj["rtype"] + b64 = obj.get("base64_name", "") + + if not isinstance(cmd, str) or not isinstance(rtype, str) or not isinstance(b64, str): + raise ValueError("malformed resource_tracker fields: %r" % (obj,)) + + try: + name = base64.urlsafe_b64decode(b64).decode('utf-8', 'surrogateescape') + except ValueError as e: + raise ValueError("malformed resource_tracker base64_name: %r" % (b64,)) from e + else: + cmd, rest = line.strip().decode('ascii').split(':', maxsplit=1) + name, rtype = rest.rsplit(':', maxsplit=1) + return cmd, rtype, name + + def main(fd): '''Run resource tracker.''' # protect the process from ^C and "killall python" etc @@ -318,23 +361,7 @@ def main(fd): with open(fd, 'rb') as f: for line in f: try: - try: - obj = json.loads(line.decode('ascii')) - except Exception as e: - raise ValueError("malformed resource_tracker message: %r" % (line,)) from e - - cmd = obj["cmd"] - rtype = obj["rtype"] - b64 = obj.get("base64_name", "") - - if not isinstance(cmd, str) or not isinstance(rtype, str) or not isinstance(b64, str): - raise ValueError("malformed resource_tracker fields: %r" % (obj,)) - - try: - name = base64.urlsafe_b64decode(b64).decode('utf-8', 'surrogateescape') - except ValueError as e: - raise ValueError("malformed resource_tracker base64_name: %r" % (b64,)) from e - + cmd, rtype, name = _decode_message(line) cleanup_func = _CLEANUP_FUNCS.get(rtype, None) if cleanup_func is None: raise ValueError( diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 1a188daa003b85..4b437f8eb48865 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -39,7 +39,7 @@ from test.support import socket_helper from test.support import threading_helper from test.support import warnings_helper - +from test.support import subTests # Skip tests if _multiprocessing wasn't built. _multiprocessing = import_helper.import_module('_multiprocessing') @@ -4284,6 +4284,19 @@ def test_copy(self): self.assertEqual(bar.z, 2 ** 33) +def resource_tracker_format_subtests(func): + """Run given test using both resource tracker communication formats""" + def _inner(self, *args, **kwargs): + tracker = resource_tracker._resource_tracker + for use_simple_format in False, True: + with ( + self.subTest(use_simple_format=use_simple_format), + unittest.mock.patch.object( + tracker, '_use_simple_format', use_simple_format) + ): + func(self, *args, **kwargs) + return _inner + @unittest.skipUnless(HAS_SHMEM, "requires multiprocessing.shared_memory") @hashlib_helper.requires_hashdigest('sha256') class _TestSharedMemory(BaseTestCase): @@ -4561,6 +4574,7 @@ def test_shared_memory_SharedMemoryServer_ignores_sigint(self): smm.shutdown() @unittest.skipIf(os.name != "posix", "resource_tracker is posix only") + @resource_tracker_format_subtests def test_shared_memory_SharedMemoryManager_reuses_resource_tracker(self): # bpo-36867: test that a SharedMemoryManager uses the # same resource_tracker process as its parent. @@ -4811,6 +4825,7 @@ def test_shared_memory_cleaned_after_process_termination(self): "shared_memory objects to clean up at shutdown", err) @unittest.skipIf(os.name != "posix", "resource_tracker is posix only") + @resource_tracker_format_subtests def test_shared_memory_untracking(self): # gh-82300: When a separate Python process accesses shared memory # with track=False, it must not cause the memory to be deleted @@ -4838,6 +4853,7 @@ def test_shared_memory_untracking(self): mem.close() @unittest.skipIf(os.name != "posix", "resource_tracker is posix only") + @resource_tracker_format_subtests def test_shared_memory_tracking(self): # gh-82300: When a separate Python process accesses shared memory # with track=True, it must cause the memory to be deleted when @@ -7149,13 +7165,18 @@ class SemLock(_multiprocessing.SemLock): @unittest.skipUnless(HAS_SHMEM, "requires multiprocessing.shared_memory") class TestSharedMemoryNames(unittest.TestCase): - def test_that_shared_memory_name_with_colons_has_no_resource_tracker_errors(self): + @subTests('use_simple_format', (True, False)) + def test_that_shared_memory_name_with_colons_has_no_resource_tracker_errors( + self, use_simple_format): # Test script that creates and cleans up shared memory with colon in name test_script = textwrap.dedent(""" import sys from multiprocessing import shared_memory + from multiprocessing import resource_tracker import time + resource_tracker._resource_tracker._use_simple_format = %s + # Test various patterns of colons in names test_names = [ "a:b", @@ -7183,7 +7204,7 @@ def test_that_shared_memory_name_with_colons_has_no_resource_tracker_errors(self sys.exit(1) print("SUCCESS") - """) + """ % use_simple_format) rc, out, err = script_helper.assert_python_ok("-c", test_script) self.assertIn(b"SUCCESS", out) diff --git a/Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst b/Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst new file mode 100644 index 00000000000000..2fc2e3098f8c25 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst @@ -0,0 +1,7 @@ +The resource tracker in the :mod:`multiprocessing` module now uses the +original communication protocol, as in Python 3.14.0 and below, +by default. +This avoids issues with upgrading Python while it is running. +(Note that such 'in-place' upgrades are not tested.) +The tracker remains compatible with subprocesses that use new protocol +(that is, subprocesses using Python 3.13.10, 3.14.1 and 3.15). From 0e4f4f1a4633f2d215fb5a803cae278aeea31845 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Fri, 5 Dec 2025 16:20:23 +0200 Subject: [PATCH 1548/1674] [3.14] gh-119452: Fix a potential virtual memory allocation denial of service in http.server (GH-142216) The CGI server on Windows could consume the amount of memory specified in the Content-Length header of the request even if the client does not send such much data. Now it reads the POST request body by chunks, therefore the memory consumption is proportional to the amount of sent data. --- Lib/http/server.py | 17 +++++++- Lib/test/test_httpservers.py | 39 +++++++++++++++++++ ...-05-23-11-44-41.gh-issue-119452.PRfsSv.rst | 5 +++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 8bb49275e78cbd..ac1f57c29f06ff 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -134,6 +134,10 @@ DEFAULT_ERROR_CONTENT_TYPE = "text/html;charset=utf-8" +# Data larger than this will be read in chunks, to prevent extreme +# overallocation. +_MIN_READ_BUF_SIZE = 1 << 20 + class HTTPServer(socketserver.TCPServer): allow_reuse_address = True # Seems to make sense in testing environment @@ -1284,7 +1288,18 @@ def run_cgi(self): env = env ) if self.command.lower() == "post" and nbytes > 0: - data = self.rfile.read(nbytes) + cursize = 0 + data = self.rfile.read(min(nbytes, _MIN_READ_BUF_SIZE)) + while len(data) < nbytes and len(data) != cursize: + cursize = len(data) + # This is a geometric increase in read size (never more + # than doubling out the current length of data per loop + # iteration). + delta = min(cursize, nbytes - cursize) + try: + data += self.rfile.read(delta) + except TimeoutError: + break else: data = None # throw away additional data [see bug #427345] diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 9539457d4d829d..7b58c5ef55b337 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -913,6 +913,20 @@ def test_path_without_leading_slash(self): print("</pre>") """ +cgi_file7 = """\ +#!%s +import os +import sys + +print("Content-type: text/plain") +print() + +content_length = int(os.environ["CONTENT_LENGTH"]) +body = sys.stdin.buffer.read(content_length) + +print(f"{content_length} {len(body)}") +""" + @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "This test can't be run reliably as root (issue #13308).") @@ -952,6 +966,8 @@ def setUp(self): self.file3_path = None self.file4_path = None self.file5_path = None + self.file6_path = None + self.file7_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -1006,6 +1022,11 @@ def setUp(self): file6.write(cgi_file6 % self.pythonexe) os.chmod(self.file6_path, 0o777) + self.file7_path = os.path.join(self.cgi_dir, 'file7.py') + with open(self.file7_path, 'w', encoding='utf-8') as file7: + file7.write(cgi_file7 % self.pythonexe) + os.chmod(self.file7_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -1028,6 +1049,8 @@ def tearDown(self): os.remove(self.file5_path) if self.file6_path: os.remove(self.file6_path) + if self.file7_path: + os.remove(self.file7_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.cgi_dir_in_sub_dir) @@ -1100,6 +1123,22 @@ def test_post(self): self.assertEqual(res.read(), b'1, python, 123456' + self.linesep) + def test_large_content_length(self): + for w in range(15, 25): + size = 1 << w + body = b'X' * size + headers = {'Content-Length' : str(size)} + res = self.request('/cgi-bin/file7.py', 'POST', body, headers) + self.assertEqual(res.read(), b'%d %d' % (size, size) + self.linesep) + + def test_large_content_length_truncated(self): + with support.swap_attr(self.request_handler, 'timeout', 0.001): + for w in range(18, 65): + size = 1 << w + headers = {'Content-Length' : str(size)} + res = self.request('/cgi-bin/file1.py', 'POST', b'x', headers) + self.assertEqual(res.read(), b'Hello World' + self.linesep) + def test_invaliduri(self): res = self.request('/cgi-bin/invalid') res.read() diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst new file mode 100644 index 00000000000000..98956627f2b30d --- /dev/null +++ b/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst @@ -0,0 +1,5 @@ +Fix a potential memory denial of service in the :mod:`http.server` module. +When a malicious user is connected to the CGI server on Windows, it could cause +an arbitrary amount of memory to be allocated. +This could have led to symptoms including a :exc:`MemoryError`, swapping, out +of memory (OOM) killed processes or containers, or even system crashes. From c9b2ec6c66ef309b8dc63c28f34a5a496a600fe0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:33:35 +0100 Subject: [PATCH 1549/1674] [3.14] gh-101100: Fix references to the set methods (GH-141857) (GH-142300) gh-101100: Fix references to the set methods (GH-141857) (cherry picked from commit 1d8f3ed2eba762e60a02ff87e782a5c7dcd0e77c) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Doc/c-api/set.rst | 2 +- Doc/library/stdtypes.rst | 210 +++++++++++++++++++----------------- Doc/reference/datamodel.rst | 2 +- Doc/whatsnew/2.3.rst | 4 +- 4 files changed, 113 insertions(+), 105 deletions(-) diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index cba823aa027bd6..09c0fb6b9c5f23 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:`~frozenset.discard` + :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~set.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. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index cc5d1442b86cee..9bb903688bc0d3 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4802,7 +4802,7 @@ other sequence-like behavior. There are currently two built-in set types, :class:`set` and :class:`frozenset`. The :class:`set` type is mutable --- the contents can be changed using methods -like :meth:`add <frozenset.add>` and :meth:`remove <frozenset.add>`. +like :meth:`~set.add` and :meth:`~set.remove`. Since it is mutable, it has no hash value and cannot be used as either a dictionary key or as an element of another set. The :class:`frozenset` type is immutable and :term:`hashable` --- @@ -4824,164 +4824,172 @@ The constructors for both classes work the same: objects. If *iterable* is not specified, a new empty set is returned. - Sets can be created by several means: +Sets can be created by several means: - * Use a comma-separated list of elements within braces: ``{'jack', 'sjoerd'}`` - * Use a set comprehension: ``{c for c in 'abracadabra' if c not in 'abc'}`` - * Use the type constructor: ``set()``, ``set('foobar')``, ``set(['a', 'b', 'foo'])`` +* Use a comma-separated list of elements within braces: ``{'jack', 'sjoerd'}`` +* Use a set comprehension: ``{c for c in 'abracadabra' if c not in 'abc'}`` +* Use the type constructor: ``set()``, ``set('foobar')``, ``set(['a', 'b', 'foo'])`` - Instances of :class:`set` and :class:`frozenset` provide the following - operations: +Instances of :class:`set` and :class:`frozenset` provide the following +operations: - .. describe:: len(s) +.. describe:: len(s) - Return the number of elements in set *s* (cardinality of *s*). + Return the number of elements in set *s* (cardinality of *s*). - .. describe:: x in s +.. describe:: x in s - Test *x* for membership in *s*. + Test *x* for membership in *s*. - .. describe:: x not in s +.. describe:: x not in s - Test *x* for non-membership in *s*. + Test *x* for non-membership in *s*. - .. method:: isdisjoint(other, /) +.. method:: frozenset.isdisjoint(other, /) + set.isdisjoint(other, /) - Return ``True`` if the set has no elements in common with *other*. Sets are - disjoint if and only if their intersection is the empty set. + Return ``True`` if the set has no elements in common with *other*. Sets are + disjoint if and only if their intersection is the empty set. - .. method:: issubset(other, /) - set <= other +.. method:: frozenset.issubset(other, /) + set.issubset(other, /) +.. describe:: set <= other - Test whether every element in the set is in *other*. + Test whether every element in the set is in *other*. - .. method:: set < other +.. describe:: set < other - Test whether the set is a proper subset of *other*, that is, - ``set <= other and set != other``. + Test whether the set is a proper subset of *other*, that is, + ``set <= other and set != other``. - .. method:: issuperset(other, /) - set >= other +.. method:: frozenset.issuperset(other, /) + set.issuperset(other, /) +.. describe:: set >= other - Test whether every element in *other* is in the set. + Test whether every element in *other* is in the set. - .. method:: set > other +.. describe:: set > other - Test whether the set is a proper superset of *other*, that is, ``set >= - other and set != other``. + Test whether the set is a proper superset of *other*, that is, ``set >= + other and set != other``. - .. method:: union(*others) - set | other | ... +.. method:: frozenset.union(*others) + set.union(*others) +.. describe:: set | other | ... - Return a new set with elements from the set and all others. + Return a new set with elements from the set and all others. - .. method:: intersection(*others) - set & other & ... +.. method:: frozenset.intersection(*others) + set.intersection(*others) +.. describe:: set & other & ... - Return a new set with elements common to the set and all others. + Return a new set with elements common to the set and all others. - .. method:: difference(*others) - set - other - ... +.. method:: frozenset.difference(*others) + set.difference(*others) +.. describe:: set - other - ... - Return a new set with elements in the set that are not in the others. + Return a new set with elements in the set that are not in the others. - .. method:: symmetric_difference(other, /) - set ^ other +.. method:: frozenset.symmetric_difference(other, /) + set.symmetric_difference(other, /) +.. describe:: set ^ other - Return a new set with elements in either the set or *other* but not both. + Return a new set with elements in either the set or *other* but not both. - .. method:: copy() +.. method:: frozenset.copy() + set.copy() - Return a shallow copy of the set. + Return a shallow copy of the set. - Note, the non-operator versions of :meth:`union`, :meth:`intersection`, - :meth:`difference`, :meth:`symmetric_difference`, :meth:`issubset`, and - :meth:`issuperset` methods will accept any iterable as an argument. In - contrast, their operator based counterparts require their arguments to be - sets. This precludes error-prone constructions like ``set('abc') & 'cbs'`` - in favor of the more readable ``set('abc').intersection('cbs')``. +Note, the non-operator versions of :meth:`~frozenset.union`, +:meth:`~frozenset.intersection`, :meth:`~frozenset.difference`, :meth:`~frozenset.symmetric_difference`, :meth:`~frozenset.issubset`, and +:meth:`~frozenset.issuperset` methods will accept any iterable as an argument. In +contrast, their operator based counterparts require their arguments to be +sets. This precludes error-prone constructions like ``set('abc') & 'cbs'`` +in favor of the more readable ``set('abc').intersection('cbs')``. - Both :class:`set` and :class:`frozenset` support set to set comparisons. Two - sets are equal if and only if every element of each set is contained in the - other (each is a subset of the other). A set is less than another set if and - only if the first set is a proper subset of the second set (is a subset, but - is not equal). A set is greater than another set if and only if the first set - is a proper superset of the second set (is a superset, but is not equal). +Both :class:`set` and :class:`frozenset` support set to set comparisons. Two +sets are equal if and only if every element of each set is contained in the +other (each is a subset of the other). A set is less than another set if and +only if the first set is a proper subset of the second set (is a subset, but +is not equal). A set is greater than another set if and only if the first set +is a proper superset of the second set (is a superset, but is not equal). - Instances of :class:`set` are compared to instances of :class:`frozenset` - based on their members. For example, ``set('abc') == frozenset('abc')`` - returns ``True`` and so does ``set('abc') in set([frozenset('abc')])``. +Instances of :class:`set` are compared to instances of :class:`frozenset` +based on their members. For example, ``set('abc') == frozenset('abc')`` +returns ``True`` and so does ``set('abc') in set([frozenset('abc')])``. - The subset and equality comparisons do not generalize to a total ordering - function. For example, any two nonempty disjoint sets are not equal and are not - subsets of each other, so *all* of the following return ``False``: ``a<b``, - ``a==b``, or ``a>b``. +The subset and equality comparisons do not generalize to a total ordering +function. For example, any two nonempty disjoint sets are not equal and are not +subsets of each other, so *all* of the following return ``False``: ``a<b``, +``a==b``, or ``a>b``. - Since sets only define partial ordering (subset relationships), the output of - the :meth:`list.sort` method is undefined for lists of sets. +Since sets only define partial ordering (subset relationships), the output of +the :meth:`list.sort` method is undefined for lists of sets. - Set elements, like dictionary keys, must be :term:`hashable`. +Set elements, like dictionary keys, must be :term:`hashable`. - Binary operations that mix :class:`set` instances with :class:`frozenset` - return the type of the first operand. For example: ``frozenset('ab') | - set('bc')`` returns an instance of :class:`frozenset`. +Binary operations that mix :class:`set` instances with :class:`frozenset` +return the type of the first operand. For example: ``frozenset('ab') | +set('bc')`` returns an instance of :class:`frozenset`. - The following table lists operations available for :class:`set` that do not - apply to immutable instances of :class:`frozenset`: +The following table lists operations available for :class:`set` that do not +apply to immutable instances of :class:`frozenset`: - .. method:: update(*others) - set |= other | ... +.. method:: set.update(*others) +.. describe:: set |= other | ... - Update the set, adding elements from all others. + Update the set, adding elements from all others. - .. method:: intersection_update(*others) - set &= other & ... +.. method:: set.intersection_update(*others) +.. describe:: set &= other & ... - Update the set, keeping only elements found in it and all others. + Update the set, keeping only elements found in it and all others. - .. method:: difference_update(*others) - set -= other | ... +.. method:: set.difference_update(*others) +.. describe:: set -= other | ... - Update the set, removing elements found in others. + Update the set, removing elements found in others. - .. method:: symmetric_difference_update(other, /) - set ^= other +.. method:: set.symmetric_difference_update(other, /) +.. describe:: set ^= other - Update the set, keeping only elements found in either set, but not in both. + Update the set, keeping only elements found in either set, but not in both. - .. method:: add(elem, /) +.. method:: set.add(elem, /) - Add element *elem* to the set. + Add element *elem* to the set. - .. method:: remove(elem, /) +.. method:: set.remove(elem, /) - Remove element *elem* from the set. Raises :exc:`KeyError` if *elem* is - not contained in the set. + Remove element *elem* from the set. Raises :exc:`KeyError` if *elem* is + not contained in the set. - .. method:: discard(elem, /) +.. method:: set.discard(elem, /) - Remove element *elem* from the set if it is present. + Remove element *elem* from the set if it is present. - .. method:: pop() +.. method:: set.pop() - Remove and return an arbitrary element from the set. Raises - :exc:`KeyError` if the set is empty. + Remove and return an arbitrary element from the set. Raises + :exc:`KeyError` if the set is empty. - .. method:: clear() +.. method:: set.clear() - Remove all elements from the set. + Remove all elements from the set. - Note, the non-operator versions of the :meth:`update`, - :meth:`intersection_update`, :meth:`difference_update`, and - :meth:`symmetric_difference_update` methods will accept any iterable as an - argument. +Note, the non-operator versions of the :meth:`~set.update`, +:meth:`~set.intersection_update`, :meth:`~set.difference_update`, and +:meth:`~set.symmetric_difference_update` methods will accept any iterable as an +argument. - 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*. +Note, the *elem* argument to the :meth:`~object.__contains__`, +:meth:`~set.remove`, and +:meth:`~set.discard` methods may be a set. To support searching for an equivalent +frozenset, a temporary one is created from *elem*. .. _typesmapping: diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index e5c5cc2d5ef6cb..71f669af76d8cd 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -449,7 +449,7 @@ Sets These represent a mutable set. They are created by the built-in :func:`set` constructor and can be modified afterwards by several methods, such as - :meth:`add <frozenset.add>`. + :meth:`~set.add`. Frozen sets diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst index b7e4e73f4ce4aa..f43692b3dce9e8 100644 --- a/Doc/whatsnew/2.3.rst +++ b/Doc/whatsnew/2.3.rst @@ -66,7 +66,7 @@ Here's a simple example:: 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:`~frozenset.intersection_update`. :: +:meth:`!union_update` and :meth:`~set.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:`~frozenset.symmetric_difference_update`. :: +in-place version with the ungainly name :meth:`~set.symmetric_difference_update`. :: >>> S1 = sets.Set([1,2,3,4]) >>> S2 = sets.Set([3,4,5,6]) From 7eec794f1a017627943b41391a12829604450cff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:12:16 +0100 Subject: [PATCH 1550/1674] [3.14] Fix disk space issues in Android CI (GH-142289) (#142292) Co-authored-by: Malcolm Smith <smith@chaquo.com> --- Android/android.py | 39 +++++++++++++++++++--------- Android/testbed/app/build.gradle.kts | 4 +-- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Android/android.py b/Android/android.py index 25bb4ca70b581f..d1a10be776ed16 100755 --- a/Android/android.py +++ b/Android/android.py @@ -29,6 +29,7 @@ ANDROID_DIR.name == "Android" and (PYTHON_DIR / "pyconfig.h.in").exists() ) +ENV_SCRIPT = ANDROID_DIR / "android-env.sh" TESTBED_DIR = ANDROID_DIR / "testbed" CROSS_BUILD_DIR = PYTHON_DIR / "cross-build" @@ -129,12 +130,11 @@ def android_env(host): sysconfig_filename = next(sysconfig_files).name host = re.fullmatch(r"_sysconfigdata__android_(.+).py", sysconfig_filename)[1] - env_script = ANDROID_DIR / "android-env.sh" env_output = subprocess.run( f"set -eu; " f"HOST={host}; " f"PREFIX={prefix}; " - f". {env_script}; " + f". {ENV_SCRIPT}; " f"export", check=True, shell=True, capture_output=True, encoding='utf-8', ).stdout @@ -151,7 +151,7 @@ def android_env(host): env[key] = value if not env: - raise ValueError(f"Found no variables in {env_script.name} output:\n" + raise ValueError(f"Found no variables in {ENV_SCRIPT.name} output:\n" + env_output) return env @@ -281,15 +281,30 @@ def clean_all(context): def setup_ci(): - # https://github.blog/changelog/2024-04-02-github-actions-hardware-accelerated-android-virtualization-now-available/ - if "GITHUB_ACTIONS" in os.environ and platform.system() == "Linux": - run( - ["sudo", "tee", "/etc/udev/rules.d/99-kvm4all.rules"], - input='KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"\n', - text=True, - ) - run(["sudo", "udevadm", "control", "--reload-rules"]) - run(["sudo", "udevadm", "trigger", "--name-match=kvm"]) + if "GITHUB_ACTIONS" in os.environ: + # Enable emulator hardware acceleration + # (https://github.blog/changelog/2024-04-02-github-actions-hardware-accelerated-android-virtualization-now-available/). + if platform.system() == "Linux": + run( + ["sudo", "tee", "/etc/udev/rules.d/99-kvm4all.rules"], + input='KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"\n', + text=True, + ) + run(["sudo", "udevadm", "control", "--reload-rules"]) + run(["sudo", "udevadm", "trigger", "--name-match=kvm"]) + + # Free up disk space by deleting unused versions of the NDK + # (https://github.com/freakboy3742/pyspamsum/pull/108). + for line in ENV_SCRIPT.read_text().splitlines(): + if match := re.fullmatch(r"ndk_version=(.+)", line): + ndk_version = match[1] + break + else: + raise ValueError(f"Failed to find NDK version in {ENV_SCRIPT.name}") + + for item in (android_home / "ndk").iterdir(): + if item.name[0].isdigit() and item.name != ndk_version: + delete_glob(item) def setup_sdk(): diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts index 4de628a279ca3f..14d43d8c4d5c42 100644 --- a/Android/testbed/app/build.gradle.kts +++ b/Android/testbed/app/build.gradle.kts @@ -79,7 +79,7 @@ android { val androidEnvFile = file("../../android-env.sh").absoluteFile namespace = "org.python.testbed" - compileSdk = 34 + compileSdk = 35 defaultConfig { applicationId = "org.python.testbed" @@ -92,7 +92,7 @@ android { } throw GradleException("Failed to find API level in $androidEnvFile") } - targetSdk = 34 + targetSdk = 35 versionCode = 1 versionName = "1.0" From 8fd39c0e51b51c789d0cead38a570964fd9e0b30 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:18:40 +0100 Subject: [PATCH 1551/1674] [3.14] gh-140482: Avoid changing terminal settings in test_pty (gh-142202) (gh-142239) The previous test_spawn_doesnt_hang test had a few problems: * It would cause ENV CHANGED failures if other tests were running concurrently due to stty changes * Typing while the test was running could cause it to fail (cherry picked from commit c0c65141b37029bfb364094a6dfb4c75ebf8359e) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Lib/test/test_pty.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 2dde84b54dd86f..b5407642f823e5 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -3,7 +3,6 @@ is_android, is_apple_mobile, is_wasm32, reap_children, verbose ) from test.support.import_helper import import_module -from test.support.os_helper import TESTFN, unlink # Skip these tests if termios is not available import_module('termios') @@ -297,26 +296,27 @@ def test_master_read(self): self.assertEqual(data, b"") def test_spawn_doesnt_hang(self): - self.addCleanup(unlink, TESTFN) - with open(TESTFN, 'wb') as f: - STDOUT_FILENO = 1 - dup_stdout = os.dup(STDOUT_FILENO) - os.dup2(f.fileno(), STDOUT_FILENO) - buf = b'' - def master_read(fd): - nonlocal buf - data = os.read(fd, 1024) - buf += data - return data + # gh-140482: Do the test in a pty.fork() child to avoid messing + # with the interactive test runner's terminal settings. + pid, fd = pty.fork() + if pid == pty.CHILD: + pty.spawn([sys.executable, '-c', 'print("hi there")']) + os._exit(0) + + try: + buf = bytearray() try: - pty.spawn([sys.executable, '-c', 'print("hi there")'], - master_read) - finally: - os.dup2(dup_stdout, STDOUT_FILENO) - os.close(dup_stdout) - self.assertEqual(buf, b'hi there\r\n') - with open(TESTFN, 'rb') as f: - self.assertEqual(f.read(), b'hi there\r\n') + while (data := os.read(fd, 1024)) != b'': + buf.extend(data) + except OSError as e: + if e.errno != errno.EIO: + raise + + (pid, status) = os.waitpid(pid, 0) + self.assertEqual(status, 0) + self.assertEqual(bytes(buf), b"hi there\r\n") + finally: + os.close(fd) class SmallPtyTests(unittest.TestCase): """These tests don't spawn children or hang.""" From d8b1ce10bd72b0069fb87cb31de959511f816d80 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:35:21 +0100 Subject: [PATCH 1552/1674] [3.14] Add explanation comments for tests for overlapped ZIP entries (GH-137152) (GH-142310) (cherry picked from commit 100c726d9895ef26d0d279ae585c0228c0d8529f) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/test/test_zipfile/test_core.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index 1edb5dde998658..6887a5e5cc4d18 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -2531,6 +2531,10 @@ def test_decompress_without_3rd_party_library(self): @requires_zlib() def test_full_overlap_different_names(self): + # The ZIP file contains two central directory entries with + # different names which refer to the same local header. + # The name of the local header matches the name of the first + # central directory entry. data = ( b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e' b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00b\xed' @@ -2560,6 +2564,10 @@ def test_full_overlap_different_names(self): @requires_zlib() def test_full_overlap_different_names2(self): + # The ZIP file contains two central directory entries with + # different names which refer to the same local header. + # The name of the local header matches the name of the second + # central directory entry. data = ( b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e' b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00a\xed' @@ -2591,6 +2599,8 @@ def test_full_overlap_different_names2(self): @requires_zlib() def test_full_overlap_same_name(self): + # The ZIP file contains two central directory entries with + # the same name which refer to the same local header. data = ( b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05\xe2\x1e' b'8\xbb\x10\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00a\xed' @@ -2623,6 +2633,8 @@ def test_full_overlap_same_name(self): @requires_zlib() def test_quoted_overlap(self): + # The ZIP file contains two files. The second local header + # is contained in the range of the first file. data = ( b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xa0lH\x05Y\xfc' b'8\x044\x00\x00\x00(\x04\x00\x00\x01\x00\x00\x00a\x00' @@ -2654,6 +2666,7 @@ def test_quoted_overlap(self): @requires_zlib() def test_overlap_with_central_dir(self): + # The local header offset is equal to the central directory offset. data = ( b'PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00G_|Z' b'\xe2\x1e8\xbb\x0b\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00' @@ -2668,11 +2681,15 @@ def test_overlap_with_central_dir(self): self.assertEqual(zi.header_offset, 0) self.assertEqual(zi.compress_size, 11) self.assertEqual(zi.file_size, 1033) + # Found central directory signature PK\x01\x02 instead of + # local header signature PK\x03\x04. with self.assertRaisesRegex(zipfile.BadZipFile, 'Bad magic number'): zipf.read('a') @requires_zlib() def test_overlap_with_archive_comment(self): + # The local header is written after the central directory, + # in the archive comment. data = ( b'PK\x01\x02\x14\x03\x14\x00\x00\x00\x08\x00G_|Z' b'\xe2\x1e8\xbb\x0b\x00\x00\x00\t\x04\x00\x00\x01\x00\x00\x00' From 4cb6cbb6faa23cf8c6c687ab5738bea2259d9918 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:45:15 +0200 Subject: [PATCH 1553/1674] [3.14] Revert "gh-140797: Forbid capturing groups in re.Scanner lexicon patterns (GH-140944) (GH-140982)" (#142309) --- Lib/re/__init__.py | 5 +---- Lib/test/test_re.py | 18 ------------------ ...5-12-05-17-58-29.gh-issue-140797.YxB27u.rst | 3 +++ 3 files changed, 4 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst diff --git a/Lib/re/__init__.py b/Lib/re/__init__.py index e0d6c844b4fa7c..af2808a77da691 100644 --- a/Lib/re/__init__.py +++ b/Lib/re/__init__.py @@ -399,12 +399,9 @@ def __init__(self, lexicon, flags=0): s = _parser.State() s.flags = flags for phrase, action in lexicon: - sub_pattern = _parser.parse(phrase, flags) - if sub_pattern.state.groups != 1: - raise ValueError("Cannot use capturing groups in re.Scanner") gid = s.opengroup() p.append(_parser.SubPattern(s, [ - (SUBPATTERN, (gid, 0, 0, sub_pattern)), + (SUBPATTERN, (gid, 0, 0, _parser.parse(phrase, flags))), ])) s.closegroup(gid, p[-1]) p = _parser.SubPattern(s, [(BRANCH, (None, p))]) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index b7ed86849cb193..f6e797b3785dbe 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1639,24 +1639,6 @@ def s_int(scanner, token): return int(token) (['sum', 'op=', 3, 'op*', 'foo', 'op+', 312.5, 'op+', 'bar'], '')) - def test_bug_gh140797(self): - # gh140797: Capturing groups are not allowed in re.Scanner - - msg = r"Cannot use capturing groups in re\.Scanner" - # Capturing group throws an error - with self.assertRaisesRegex(ValueError, msg): - Scanner([("(a)b", None)]) - - # Named Group - with self.assertRaisesRegex(ValueError, msg): - Scanner([("(?P<name>a)", None)]) - - # Non-capturing groups should pass normally - s = Scanner([("(?:a)b", lambda scanner, token: token)]) - result, rem = s.scan("ab") - self.assertEqual(result,['ab']) - self.assertEqual(rem,'') - def test_bug_448951(self): # bug 448951 (similar to 429357, but with single char match) # (Also test greedy matches.) diff --git a/Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst b/Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst new file mode 100644 index 00000000000000..ebbe06fddfb372 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst @@ -0,0 +1,3 @@ +Revert changes to the undocumented :class:`!re.Scanner` class. Capturing +groups are still allowed for backward compatibility, although using them can +lead to incorrect result. They will be forbidden in future Python versions. From df793163d5821791d4e7caf88885a2c11a107986 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:49:01 +0200 Subject: [PATCH 1554/1674] Python 3.14.2 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 530 +++++++++++------- Misc/NEWS.d/3.14.2.rst | 85 +++ ...-12-01-10-03-08.gh-issue-116738.972YsG.rst | 2 - ...-12-03-11-03-35.gh-issue-142218.44Fq_J.rst | 2 - ...-12-03-06-12-39.gh-issue-142214.appYNZ.rst | 12 - ...-12-03-09-36-29.gh-issue-142206.ilwegH.rst | 7 - ...-12-05-17-58-29.gh-issue-140797.YxB27u.rst | 3 - ...-05-23-11-44-41.gh-issue-119452.PRfsSv.rst | 5 - ...-12-01-09-36-45.gh-issue-142145.tcAUhg.rst | 1 - README.rst | 2 +- 11 files changed, 403 insertions(+), 250 deletions(-) create mode 100644 Misc/NEWS.d/3.14.2.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst delete mode 100644 Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst delete mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst delete mode 100644 Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 1a53949b163416..3ff6be5838882c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,12 +19,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 14 -#define PY_MICRO_VERSION 1 +#define PY_MICRO_VERSION 2 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.14.1+" +#define PY_VERSION "3.14.2" /*--end constants--*/ diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index dd9bda6e14c6f2..56317b8a7244de 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Tue Dec 2 14:51:32 2025 +# Autogenerated by Sphinx on Fri Dec 5 18:49:09 2025 # as part of the release process. topics = { @@ -6260,78 +6260,31 @@ def whats_on_the_telly(penguin=None): "NAME" tokens represent *identifiers*, *keywords*, and *soft keywords*. -Within the ASCII range (U+0001..U+007F), the valid characters for -names include the uppercase and lowercase letters ("A-Z" and "a-z"), -the underscore "_" and, except for the first character, the digits "0" -through "9". +Names are composed of the following characters: -Names must contain at least one character, but have no upper length -limit. Case is significant. - -Besides "A-Z", "a-z", "_" and "0-9", names can also use “letter-like” -and “number-like” characters from outside the ASCII range, as detailed -below. - -All identifiers are converted into the normalization form NFKC while -parsing; comparison of identifiers is based on NFKC. - -Formally, the first character of a normalized identifier must belong -to the set "id_start", which is the union of: - -* Unicode category "<Lu>" - uppercase letters (includes "A" to "Z") - -* Unicode category "<Ll>" - lowercase letters (includes "a" to "z") +* uppercase and lowercase letters ("A-Z" and "a-z"), -* Unicode category "<Lt>" - titlecase letters +* the underscore ("_"), -* Unicode category "<Lm>" - modifier letters +* digits ("0" through "9"), which cannot appear as the first + character, and -* Unicode category "<Lo>" - other letters +* non-ASCII characters. Valid names may only contain “letter-like” and + “digit-like” characters; see Non-ASCII characters in names for + details. -* Unicode category "<Nl>" - letter numbers - -* {""_""} - the underscore - -* "<Other_ID_Start>" - an explicit set of characters in PropList.txt - to support backwards compatibility - -The remaining characters must belong to the set "id_continue", which -is the union of: - -* all characters in "id_start" - -* Unicode category "<Nd>" - decimal numbers (includes "0" to "9") - -* Unicode category "<Pc>" - connector punctuations - -* Unicode category "<Mn>" - nonspacing marks - -* Unicode category "<Mc>" - spacing combining marks - -* "<Other_ID_Continue>" - another explicit set of characters in - PropList.txt to support backwards compatibility - -Unicode categories use the version of the Unicode Character Database -as included in the "unicodedata" module. +Names must contain at least one character, but have no upper length +limit. Case is significant. -These sets are based on the Unicode standard annex UAX-31. See also -**PEP 3131** for further details. +Formally, names are described by the following lexical definitions: -Even more formally, names are described by the following lexical -definitions: + NAME: name_start name_continue* + name_start: "a"..."z" | "A"..."Z" | "_" | <non-ASCII character> + name_continue: name_start | "0"..."9" + identifier: <NAME, except keywords> - NAME: xid_start xid_continue* - id_start: <Lu> | <Ll> | <Lt> | <Lm> | <Lo> | <Nl> | "_" | <Other_ID_Start> - id_continue: id_start | <Nd> | <Pc> | <Mn> | <Mc> | <Other_ID_Continue> - xid_start: <all characters in id_start whose NFKC normalization is - in (id_start xid_continue*)"> - xid_continue: <all characters in id_continue whose NFKC normalization is - in (id_continue*)"> - identifier: <NAME, except keywords> - -A non-normative listing of all valid identifier characters as defined -by Unicode is available in the DerivedCoreProperties.txt file in the -Unicode Character Database. +Note that not all names matched by this grammar are valid; see Non- +ASCII characters in names for details. Keywords @@ -6414,6 +6367,101 @@ def whats_on_the_telly(penguin=None): context of a class definition, are re-written to use a mangled form to help avoid name clashes between “private” attributes of base and derived classes. See section Identifiers (Names). + + +Non-ASCII characters in names +============================= + +Names that contain non-ASCII characters need additional normalization +and validation beyond the rules and grammar explained above. For +example, "ř_1", "蛇", or "साँप" are valid names, but "r〰2", "€", or +"🐍" are not. + +This section explains the exact rules. + +All names are converted into the normalization form NFKC while +parsing. This means that, for example, some typographic variants of +characters are converted to their “basic” form. For example, +"fiⁿₐˡᵢᶻₐᵗᵢᵒₙ" normalizes to "finalization", so Python treats them as +the same name: + + >>> fiⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3 + >>> finalization + 3 + +Note: + + Normalization is done at the lexical level only. Run-time functions + that take names as *strings* generally do not normalize their + arguments. For example, the variable defined above is accessible at + run time in the "globals()" dictionary as + "globals()["finalization"]" but not "globals()["fiⁿₐˡᵢᶻₐᵗᵢᵒₙ"]". + +Similarly to how ASCII-only names must contain only letters, digits +and the underscore, and cannot start with a digit, a valid name must +start with a character in the “letter-like” set "xid_start", and the +remaining characters must be in the “letter- and digit-like” set +"xid_continue". + +These sets based on the *XID_Start* and *XID_Continue* sets as defined +by the Unicode standard annex UAX-31. Python’s "xid_start" +additionally includes the underscore ("_"). Note that Python does not +necessarily conform to UAX-31. + +A non-normative listing of characters in the *XID_Start* and +*XID_Continue* sets as defined by Unicode is available in the +DerivedCoreProperties.txt file in the Unicode Character Database. For +reference, the construction rules for the "xid_*" sets are given +below. + +The set "id_start" is defined as the union of: + +* Unicode category "<Lu>" - uppercase letters (includes "A" to "Z") + +* Unicode category "<Ll>" - lowercase letters (includes "a" to "z") + +* Unicode category "<Lt>" - titlecase letters + +* Unicode category "<Lm>" - modifier letters + +* Unicode category "<Lo>" - other letters + +* Unicode category "<Nl>" - letter numbers + +* {""_""} - the underscore + +* "<Other_ID_Start>" - an explicit set of characters in PropList.txt + to support backwards compatibility + +The set "xid_start" then closes this set under NFKC normalization, by +removing all characters whose normalization is not of the form +"id_start id_continue*". + +The set "id_continue" is defined as the union of: + +* "id_start" (see above) + +* Unicode category "<Nd>" - decimal numbers (includes "0" to "9") + +* Unicode category "<Pc>" - connector punctuations + +* Unicode category "<Mn>" - nonspacing marks + +* Unicode category "<Mc>" - spacing combining marks + +* "<Other_ID_Continue>" - another explicit set of characters in + PropList.txt to support backwards compatibility + +Again, "xid_continue" closes this set under NFKC normalization. + +Unicode categories use the version of the Unicode Character Database +as included in the "unicodedata" module. + +See also: + + * **PEP 3131** – Supporting Non-ASCII Identifiers + + * **PEP 672** – Unicode-related Security Considerations for Python ''', 'if': r'''The "if" statement ****************** @@ -10859,119 +10907,56 @@ class is used in a class pattern with positional arguments, each Added in version 3.6. -A *formatted string literal* or *f-string* is a string literal that is -prefixed with ‘"f"’ or ‘"F"’. These strings may contain replacement -fields, which are expressions delimited by curly braces "{}". While -other string literals always have a constant value, formatted strings -are really expressions evaluated at run time. - -Escape sequences are decoded like in ordinary string literals (except -when a literal is also marked as a raw string). After decoding, the -grammar for the contents of the string is: - - f_string: (literal_char | "{{" | "}}" | replacement_field)* - replacement_field: "{" f_expression ["="] ["!" conversion] [":" format_spec] "}" - f_expression: (conditional_expression | "*" or_expr) - ("," conditional_expression | "," "*" or_expr)* [","] - | yield_expression - conversion: "s" | "r" | "a" - format_spec: (literal_char | replacement_field)* - literal_char: <any code point except "{", "}" or NULL> - -The parts of the string outside curly braces are treated literally, -except that any doubled curly braces "'{{'" or "'}}'" are replaced -with the corresponding single curly brace. A single opening curly -bracket "'{'" marks a replacement field, which starts with a Python -expression. To display both the expression text and its value after -evaluation, (useful in debugging), an equal sign "'='" may be added -after the expression. A conversion field, introduced by an exclamation -point "'!'" may follow. A format specifier may also be appended, -introduced by a colon "':'". A replacement field ends with a closing -curly bracket "'}'". +Changed in version 3.7: The "await" and "async for" can be used in +expressions within f-strings. -Expressions in formatted string literals are treated like regular -Python expressions surrounded by parentheses, with a few exceptions. -An empty expression is not allowed, and both "lambda" and assignment -expressions ":=" must be surrounded by explicit parentheses. Each -expression is evaluated in the context where the formatted string -literal appears, in order from left to right. Replacement expressions -can contain newlines in both single-quoted and triple-quoted f-strings -and they can contain comments. Everything that comes after a "#" -inside a replacement field is a comment (even closing braces and -quotes). In that case, replacement fields must be closed in a -different line. - - >>> f"abc{a # This is a comment }" - ... + 3}" - 'abc5' +Changed in version 3.8: Added the debug specifier ("=") -Changed in version 3.7: Prior to Python 3.7, an "await" expression and -comprehensions containing an "async for" clause were illegal in the -expressions in formatted string literals due to a problem with the -implementation. +Changed in version 3.12: Many restrictions on expressions within +f-strings have been removed. Notably, nested strings, comments, and +backslashes are now permitted. -Changed in version 3.12: Prior to Python 3.12, comments were not -allowed inside f-string replacement fields. - -When the equal sign "'='" is provided, the output will have the -expression text, the "'='" and the evaluated value. Spaces after the -opening brace "'{'", within the expression and after the "'='" are all -retained in the output. By default, the "'='" causes the "repr()" of -the expression to be provided, unless there is a format specified. -When a format is specified it defaults to the "str()" of the -expression unless a conversion "'!r'" is declared. - -Added in version 3.8: The equal sign "'='". - -If a conversion is specified, the result of evaluating the expression -is converted before formatting. Conversion "'!s'" calls "str()" on -the result, "'!r'" calls "repr()", and "'!a'" calls "ascii()". +A *formatted string literal* or *f-string* is a string literal that is +prefixed with ‘"f"’ or ‘"F"’. Unlike other string literals, f-strings +do not have a constant value. They may contain *replacement fields* +delimited by curly braces "{}". Replacement fields contain expressions +which are evaluated at run time. For example: + + >>> who = 'nobody' + >>> nationality = 'Spanish' + >>> f'{who.title()} expects the {nationality} Inquisition!' + 'Nobody expects the Spanish Inquisition!' + +Any doubled curly braces ("{{" or "}}") outside replacement fields are +replaced with the corresponding single curly brace: + + >>> print(f'{{...}}') + {...} + +Other characters outside replacement fields are treated like in +ordinary string literals. This means that escape sequences are decoded +(except when a literal is also marked as a raw string), and newlines +are possible in triple-quoted f-strings: + + >>> name = 'Galahad' + >>> favorite_color = 'blue' + >>> print(f'{name}:\\t{favorite_color}') + Galahad: blue + >>> print(rf"C:\\Users\\{name}") + C:\\Users\\Galahad + >>> print(f\'\'\'Three shall be the number of the counting + ... and the number of the counting shall be three.\'\'\') + Three shall be the number of the counting + and the number of the counting shall be three. -The result is then formatted using the "format()" protocol. The -format specifier is passed to the "__format__()" method of the -expression or conversion result. An empty string is passed when the -format specifier is omitted. The formatted result is then included in -the final value of the whole string. +Expressions in formatted string literals are treated like regular +Python expressions. Each expression is evaluated in the context where +the formatted string literal appears, in order from left to right. An +empty expression is not allowed, and both "lambda" and assignment +expressions ":=" must be surrounded by explicit parentheses: -Top-level format specifiers may include nested replacement fields. -These nested fields may include their own conversion fields and format -specifiers, but may not include more deeply nested replacement fields. -The format specifier mini-language is the same as that used by the -"str.format()" method. - -Formatted string literals may be concatenated, but replacement fields -cannot be split across literals. - -Some examples of formatted string literals: - - >>> name = "Fred" - >>> f"He said his name is {name!r}." - "He said his name is 'Fred'." - >>> f"He said his name is {repr(name)}." # repr() is equivalent to !r - "He said his name is 'Fred'." - >>> width = 10 - >>> precision = 4 - >>> value = decimal.Decimal("12.34567") - >>> f"result: {value:{width}.{precision}}" # nested fields - 'result: 12.35' - >>> today = datetime(year=2017, month=1, day=27) - >>> f"{today:%B %d, %Y}" # using date format specifier - 'January 27, 2017' - >>> f"{today=:%B %d, %Y}" # using date format specifier and debugging - 'today=January 27, 2017' - >>> number = 1024 - >>> f"{number:#0x}" # using integer format specifier - '0x400' - >>> foo = "bar" - >>> f"{ foo = }" # preserves whitespace - " foo = 'bar'" - >>> line = "The mill's closed" - >>> f"{line = }" - 'line = "The mill\\'s closed"' - >>> f"{line = :20}" - "line = The mill's closed " - >>> f"{line = !r:20}" - 'line = "The mill\\'s closed" ' + >>> f'{(half := 1/2)}, {half * 42}' + '0.5, 21.0' Reusing the outer f-string quoting type inside a replacement field is permitted: @@ -10980,10 +10965,6 @@ class is used in a class pattern with positional arguments, each >>> f"abc {a["x"]} def" 'abc 2 def' -Changed in version 3.12: Prior to Python 3.12, reuse of the same -quoting type of the outer f-string inside a replacement field was not -possible. - Backslashes are also allowed in replacement fields and are evaluated the same way as in any other context: @@ -10994,21 +10975,84 @@ class is used in a class pattern with positional arguments, each b c -Changed in version 3.12: Prior to Python 3.12, backslashes were not -permitted inside an f-string replacement field. +It is possible to nest f-strings: + + >>> name = 'world' + >>> f'Repeated:{f' hello {name}' * 3}' + 'Repeated: hello world hello world hello world' -Formatted string literals cannot be used as docstrings, even if they -do not include expressions. +Portable Python programs should not use more than 5 levels of nesting. + +**CPython implementation detail:** CPython does not limit nesting of +f-strings. + +Replacement expressions can contain newlines in both single-quoted and +triple-quoted f-strings and they can contain comments. Everything that +comes after a "#" inside a replacement field is a comment (even +closing braces and quotes). This means that replacement fields with +comments must be closed in a different line: + + >>> a = 2 + >>> f"abc{a # This comment }" continues until the end of the line + ... + 3}" + 'abc5' + +After the expression, replacement fields may optionally contain: + +* a *debug specifier* – an equal sign ("="), optionally surrounded by + whitespace on one or both sides; + +* a *conversion specifier* – "!s", "!r" or "!a"; and/or + +* a *format specifier* prefixed with a colon (":"). + +See the Standard Library section on f-strings for details on how these +fields are evaluated. + +As that section explains, *format specifiers* are passed as the second +argument to the "format()" function to format a replacement field +value. For example, they can be used to specify a field width and +padding characters using the Format Specification Mini-Language: + + >>> number = 14.3 + >>> f'{number:20.7f}' + ' 14.3000000' + +Top-level format specifiers may include nested replacement fields: + + >>> field_size = 20 + >>> precision = 7 + >>> f'{number:{field_size}.{precision}f}' + ' 14.3000000' + +These nested fields may include their own conversion fields and format +specifiers: + + >>> number = 3 + >>> f'{number:{field_size}}' + ' 3' + >>> f'{number:{field_size:05}}' + '00000000000000000003' + +However, these nested fields may not include more deeply nested +replacement fields. + +Formatted string literals cannot be used as *docstrings*, even if they +do not include expressions: >>> def foo(): ... f"Not a docstring" ... - >>> foo.__doc__ is None - True + >>> print(foo.__doc__) + None + +See also: -See also **PEP 498** for the proposal that added formatted string -literals, and "str.format()", which uses a related format string -mechanism. + * **PEP 498** – Literal String Interpolation + + * **PEP 701** – Syntactic formalization of f-strings + + * "str.format()", which uses a related format string mechanism. t-strings @@ -11017,34 +11061,90 @@ class is used in a class pattern with positional arguments, each Added in version 3.14. A *template string literal* or *t-string* is a string literal that is -prefixed with ‘"t"’ or ‘"T"’. These strings follow the same syntax and -evaluation rules as formatted string literals, with the following -differences: - -* Rather than evaluating to a "str" object, template string literals - evaluate to a "string.templatelib.Template" object. - -* The "format()" protocol is not used. Instead, the format specifier - and conversions (if any) are passed to a new "Interpolation" object - that is created for each evaluated expression. It is up to code that - processes the resulting "Template" object to decide how to handle - format specifiers and conversions. - -* Format specifiers containing nested replacement fields are evaluated - eagerly, prior to being passed to the "Interpolation" object. For - instance, an interpolation of the form "{amount:.{precision}f}" will - evaluate the inner expression "{precision}" to determine the value - of the "format_spec" attribute. If "precision" were to be "2", the - resulting format specifier would be "'.2f'". - -* When the equals sign "'='" is provided in an interpolation - expression, the text of the expression is appended to the literal - string that precedes the relevant interpolation. This includes the - equals sign and any surrounding whitespace. The "Interpolation" - instance for the expression will be created as normal, except that - "conversion" will be set to ‘"r"’ ("repr()") by default. If an - explicit conversion or format specifier are provided, this will - override the default behaviour. +prefixed with ‘"t"’ or ‘"T"’. These strings follow the same syntax +rules as formatted string literals. For differences in evaluation +rules, see the Standard Library section on t-strings + + +Formal grammar for f-strings +============================ + +F-strings are handled partly by the *lexical analyzer*, which produces +the tokens "FSTRING_START", "FSTRING_MIDDLE" and "FSTRING_END", and +partly by the parser, which handles expressions in the replacement +field. The exact way the work is split is a CPython implementation +detail. + +Correspondingly, the f-string grammar is a mix of lexical and +syntactic definitions. + +Whitespace is significant in these situations: + +* There may be no whitespace in "FSTRING_START" (between the prefix + and quote). + +* Whitespace in "FSTRING_MIDDLE" is part of the literal string + contents. + +* In "fstring_replacement_field", if "f_debug_specifier" is present, + all whitespace after the opening brace until the + "f_debug_specifier", as well as whitespace immediatelly following + "f_debug_specifier", is retained as part of the expression. + + **CPython implementation detail:** The expression is not handled in + the tokenization phase; it is retrieved from the source code using + locations of the "{" token and the token after "=". + +The "FSTRING_MIDDLE" definition uses negative lookaheads ("!") to +indicate special characters (backslash, newline, "{", "}") and +sequences ("f_quote"). + + fstring: FSTRING_START fstring_middle* FSTRING_END + + FSTRING_START: fstringprefix ("'" | '"' | "\'\'\'" | '"""') + FSTRING_END: f_quote + fstringprefix: <("f" | "fr" | "rf"), case-insensitive> + f_debug_specifier: '=' + f_quote: <the quote character(s) used in FSTRING_START> + + fstring_middle: + | fstring_replacement_field + | FSTRING_MIDDLE + FSTRING_MIDDLE: + | (!"\\" !newline !'{' !'}' !f_quote) source_character + | stringescapeseq + | "{{" + | "}}" + | <newline, in triple-quoted f-strings only> + fstring_replacement_field: + | '{' f_expression [f_debug_specifier] [fstring_conversion] + [fstring_full_format_spec] '}' + fstring_conversion: + | "!" ("s" | "r" | "a") + fstring_full_format_spec: + | ':' fstring_format_spec* + fstring_format_spec: + | FSTRING_MIDDLE + | fstring_replacement_field + f_expression: + | ','.(conditional_expression | "*" or_expr)+ [","] + | yield_expression + +Note: + + In the above grammar snippet, the "f_quote" and "FSTRING_MIDDLE" + rules are context-sensitive – they depend on the contents of + "FSTRING_START" of the nearest enclosing "fstring".Constructing a + more traditional formal grammar from this template is left as an + exercise for the reader. + +The grammar for t-strings is identical to the one for f-strings, with +*t* instead of *f* at the beginning of rule and token names and in the +prefix. + + tstring: TSTRING_START tstring_middle* TSTRING_END + + <rest of the t-string grammar is omitted; see above> ''', 'subscriptions': r'''Subscriptions ************* @@ -11603,7 +11703,7 @@ def foo(): Sets These represent a mutable set. They are created by the built-in "set()" constructor and can be modified afterwards by several - methods, such as "add". + methods, such as "add()". Frozen sets These represent an immutable set. They are created by the built-in diff --git a/Misc/NEWS.d/3.14.2.rst b/Misc/NEWS.d/3.14.2.rst new file mode 100644 index 00000000000000..b4b4c48da22028 --- /dev/null +++ b/Misc/NEWS.d/3.14.2.rst @@ -0,0 +1,85 @@ +.. date: 2025-12-01-09-36-45 +.. gh-issue: 142145 +.. nonce: tcAUhg +.. release date: 2025-12-05 +.. section: Security + +Remove quadratic behavior in ``xml.minidom`` node ID cache clearing. + +.. + +.. date: 2024-05-23-11-44-41 +.. gh-issue: 119452 +.. nonce: PRfsSv +.. section: Security + +Fix a potential memory denial of service in the :mod:`http.server` module. +When a malicious user is connected to the CGI server on Windows, it could +cause an arbitrary amount of memory to be allocated. This could have led to +symptoms including a :exc:`MemoryError`, swapping, out of memory (OOM) +killed processes or containers, or even system crashes. + +.. + +.. date: 2025-12-05-17-58-29 +.. gh-issue: 140797 +.. nonce: YxB27u +.. section: Library + +Revert changes to the undocumented :class:`!re.Scanner` class. Capturing +groups are still allowed for backward compatibility, although using them can +lead to incorrect result. They will be forbidden in future Python versions. + +.. + +.. date: 2025-12-03-09-36-29 +.. gh-issue: 142206 +.. nonce: ilwegH +.. section: Library + +The resource tracker in the :mod:`multiprocessing` module now uses the +original communication protocol, as in Python 3.14.0 and below, by default. +This avoids issues with upgrading Python while it is running. (Note that +such 'in-place' upgrades are not tested.) The tracker remains compatible +with subprocesses that use new protocol (that is, subprocesses using Python +3.13.10, 3.14.1 and 3.15). + +.. + +.. date: 2025-12-03-06-12-39 +.. gh-issue: 142214 +.. nonce: appYNZ +.. section: Library + +Fix two regressions in :mod:`dataclasses` in Python 3.14.1 related to +annotations. + +* An exception is no longer raised if ``slots=True`` is used and the + ``__init__`` method does not have an ``__annotate__`` attribute + (likely because ``init=False`` was used). + +* An exception is no longer raised if annotations are requested on the + ``__init__`` method and one of the fields is not present in the class + annotations. This can occur in certain dynamic scenarios. + +Patch by Jelle Zijlstra. + +.. + +.. date: 2025-12-03-11-03-35 +.. gh-issue: 142218 +.. nonce: 44Fq_J +.. section: Core and Builtins + +Fix crash when inserting into a split table dictionary with a non +:class:`str` key that matches an existing key. + +.. + +.. date: 2025-12-01-10-03-08 +.. gh-issue: 116738 +.. nonce: 972YsG +.. section: Core and Builtins + +Fix :mod:`cmath` data race when initializing trigonometric tables with +subinterpreters. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst deleted file mode 100644 index d6d9d02b017473..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :mod:`cmath` data race when initializing trigonometric tables with -subinterpreters. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst deleted file mode 100644 index a8ce0fc65267d5..00000000000000 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-03-11-03-35.gh-issue-142218.44Fq_J.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix crash when inserting into a split table dictionary with a non -:class:`str` key that matches an existing key. diff --git a/Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst b/Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst deleted file mode 100644 index b87430ec1a3d65..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-12-03-06-12-39.gh-issue-142214.appYNZ.rst +++ /dev/null @@ -1,12 +0,0 @@ -Fix two regressions in :mod:`dataclasses` in Python 3.14.1 related to -annotations. - -* An exception is no longer raised if ``slots=True`` is used and the - ``__init__`` method does not have an ``__annotate__`` attribute - (likely because ``init=False`` was used). - -* An exception is no longer raised if annotations are requested on the - ``__init__`` method and one of the fields is not present in the class - annotations. This can occur in certain dynamic scenarios. - -Patch by Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst b/Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst deleted file mode 100644 index 2fc2e3098f8c25..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-12-03-09-36-29.gh-issue-142206.ilwegH.rst +++ /dev/null @@ -1,7 +0,0 @@ -The resource tracker in the :mod:`multiprocessing` module now uses the -original communication protocol, as in Python 3.14.0 and below, -by default. -This avoids issues with upgrading Python while it is running. -(Note that such 'in-place' upgrades are not tested.) -The tracker remains compatible with subprocesses that use new protocol -(that is, subprocesses using Python 3.13.10, 3.14.1 and 3.15). diff --git a/Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst b/Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst deleted file mode 100644 index ebbe06fddfb372..00000000000000 --- a/Misc/NEWS.d/next/Library/2025-12-05-17-58-29.gh-issue-140797.YxB27u.rst +++ /dev/null @@ -1,3 +0,0 @@ -Revert changes to the undocumented :class:`!re.Scanner` class. Capturing -groups are still allowed for backward compatibility, although using them can -lead to incorrect result. They will be forbidden in future Python versions. diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst deleted file mode 100644 index 98956627f2b30d..00000000000000 --- a/Misc/NEWS.d/next/Security/2024-05-23-11-44-41.gh-issue-119452.PRfsSv.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a potential memory denial of service in the :mod:`http.server` module. -When a malicious user is connected to the CGI server on Windows, it could cause -an arbitrary amount of memory to be allocated. -This could have led to symptoms including a :exc:`MemoryError`, swapping, out -of memory (OOM) killed processes or containers, or even system crashes. diff --git a/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst b/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst deleted file mode 100644 index 440bc7794c69ef..00000000000000 --- a/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst +++ /dev/null @@ -1 +0,0 @@ -Remove quadratic behavior in ``xml.minidom`` node ID cache clearing. diff --git a/README.rst b/README.rst index 242c9dc7b6a137..90e1ed6e07931d 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.14.1 +This is Python version 3.14.2 ============================= .. image:: https://github.com/python/cpython/actions/workflows/build.yml/badge.svg?branch=main&event=push From 37c6dd1c91159c87bb458c5c2e21f02a88f9386b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:14:56 +0100 Subject: [PATCH 1555/1674] [3.14] GH-142267: Cache formatter to avoid repeated `_set_color` calls (GH-142268) (#142313) GH-142267: Cache formatter to avoid repeated `_set_color` calls (GH-142268) (cherry picked from commit 4085ff7b32f91bad7d821e5564d8565c5928f7d1) Co-authored-by: Savannah Ostrowski <savannah@python.org> --- Lib/argparse.py | 18 ++++++++++++++---- ...5-12-04-23-26-12.gh-issue-142267.yOM6fP.rst | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 88c1f5a7ef3342..2a74bf27b9d623 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1552,8 +1552,8 @@ def add_argument(self, *args, **kwargs): f'instance of it must be passed') # raise an error if the metavar does not match the type - if hasattr(self, "_get_formatter"): - formatter = self._get_formatter() + if hasattr(self, "_get_validation_formatter"): + formatter = self._get_validation_formatter() try: formatter._format_args(action, None) except TypeError: @@ -1741,8 +1741,8 @@ def _handle_conflict_resolve(self, action, conflicting_actions): action.container._remove_action(action) def _check_help(self, action): - if action.help and hasattr(self, "_get_formatter"): - formatter = self._get_formatter() + if action.help and hasattr(self, "_get_validation_formatter"): + formatter = self._get_validation_formatter() try: formatter._expand_help(action) except (ValueError, TypeError, KeyError) as exc: @@ -1897,6 +1897,9 @@ def __init__(self, self.suggest_on_error = suggest_on_error self.color = color + # Cached formatter for validation (avoids repeated _set_color calls) + self._cached_formatter = None + add_group = self.add_argument_group self._positionals = add_group(_('positional arguments')) self._optionals = add_group(_('options')) @@ -2728,6 +2731,13 @@ def _get_formatter(self): formatter._set_color(self.color) return formatter + def _get_validation_formatter(self): + # Return cached formatter for read-only validation operations + # (_expand_help and _format_args). Avoids repeated slow _set_color calls. + if self._cached_formatter is None: + self._cached_formatter = self._get_formatter() + return self._cached_formatter + # ===================== # Help-printing methods # ===================== diff --git a/Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst b/Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst new file mode 100644 index 00000000000000..f46e82105fc2f5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst @@ -0,0 +1 @@ +Improve :mod:`argparse` performance by caching the formatter used for argument validation. From 160ca1c8c32d2b038c81e478ab4993d91fed88e5 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 5 Dec 2025 21:59:38 +0200 Subject: [PATCH 1556/1674] Post 3.14.2 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 3ff6be5838882c..7cda21cb678e7f 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -24,7 +24,7 @@ #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.14.2" +#define PY_VERSION "3.14.2+" /*--end constants--*/ From 5a639ca1b316101d24e7219841d3c73d559be370 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 6 Dec 2025 00:04:50 +0100 Subject: [PATCH 1557/1674] [3.14] Introduce `build-python` and `build-host` subcommands for `Tools/wasm/wasi` (GH-142266) (#142322) Introduce `build-python` and `build-host` subcommands for `Tools/wasm/wasi` (GH-142266) It should make it easier when you need to rebuild just the e.g. host Python, but it requires ./configure to run. (cherry picked from commit 58e1c7a16f0926b1047c336eeed2849d5fff7c70) Co-authored-by: Brett Cannon <brett@python.org> Co-authored-by: Emma Smith <emma@emmatyping.dev> --- Tools/wasm/wasi/__main__.py | 56 ++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py index 62085dc0e64030..b57bcaca924380 100644 --- a/Tools/wasm/wasi/__main__.py +++ b/Tools/wasm/wasi/__main__.py @@ -389,18 +389,6 @@ def make_wasi_python(context, working_dir): ) -def build_all(context): - """Build everything.""" - steps = [ - configure_build_python, - make_build_python, - configure_wasi_python, - make_wasi_python, - ] - for step in steps: - step(context) - - def clean_contents(context): """Delete all files created by this script.""" if CROSS_BUILD_DIR.exists(): @@ -412,6 +400,16 @@ def clean_contents(context): log("🧹", f"Deleting generated {LOCAL_SETUP} ...") +def build_steps(*steps): + """Construct a command from other steps.""" + + def builder(context): + for step in steps: + step(context) + + return builder + + def main(): default_host_triple = "wasm32-wasip1" default_wasi_sdk = find_wasi_sdk() @@ -439,6 +437,9 @@ def main(): make_build = subcommands.add_parser( "make-build-python", help="Run `make` for the build Python" ) + build_python = subcommands.add_parser( + "build-python", help="Build the build Python" + ) configure_host = subcommands.add_parser( "configure-host", help="Run `configure` for the " @@ -449,6 +450,9 @@ def main(): make_host = subcommands.add_parser( "make-host", help="Run `make` for the host/WASI" ) + build_host = subcommands.add_parser( + "build-host", help="Build the host/WASI Python" + ) subcommands.add_parser( "clean", help="Delete files and directories created by this script" ) @@ -456,8 +460,10 @@ def main(): build, configure_build, make_build, + build_python, configure_host, make_host, + build_host, ): subcommand.add_argument( "--quiet", @@ -472,7 +478,12 @@ def main(): default=default_logdir, help=f"Directory to store log files; defaults to {default_logdir}", ) - for subcommand in configure_build, configure_host: + for subcommand in ( + configure_build, + configure_host, + build_python, + build_host, + ): subcommand.add_argument( "--clean", action="store_true", @@ -480,11 +491,17 @@ def main(): dest="clean", help="Delete any relevant directories before building", ) - for subcommand in build, configure_build, configure_host: + for subcommand in ( + build, + configure_build, + configure_host, + build_python, + build_host, + ): subcommand.add_argument( "args", nargs="*", help="Extra arguments to pass to `configure`" ) - for subcommand in build, configure_host: + for subcommand in build, configure_host, build_host: subcommand.add_argument( "--wasi-sdk", type=pathlib.Path, @@ -500,7 +517,7 @@ def main(): help="Command template for running the WASI host; defaults to " f"`{default_host_runner}`", ) - for subcommand in build, configure_host, make_host: + for subcommand in build, configure_host, make_host, build_host: subcommand.add_argument( "--host-triple", action="store", @@ -512,12 +529,17 @@ def main(): context = parser.parse_args() context.init_dir = pathlib.Path().absolute() + build_build_python = build_steps(configure_build_python, make_build_python) + build_wasi_python = build_steps(configure_wasi_python, make_wasi_python) + dispatch = { "configure-build-python": configure_build_python, "make-build-python": make_build_python, + "build-python": build_build_python, "configure-host": configure_wasi_python, "make-host": make_wasi_python, - "build": build_all, + "build-host": build_wasi_python, + "build": build_steps(build_build_python, build_wasi_python), "clean": clean_contents, } dispatch[context.subcommand](context) From 95d19fc5b6de3190197b30bb9e6c89ae62590024 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 6 Dec 2025 15:51:08 +0100 Subject: [PATCH 1558/1674] [3.14] Docs: fix RFC index reference for TLS 1.3 (GH-142262) (#142340) Docs: fix RFC index reference for TLS 1.3 (GH-142262) (cherry picked from commit 61823a5382e8c0c0292e90a46ae3e1859b7f278b) Co-authored-by: Y. Z. Chen <754097987@qq.com> --- Lib/ssl.py | 2 +- Lib/test/test_ssl.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/ssl.py b/Lib/ssl.py index 05df4ad7f0f05c..8889aff92fa6c0 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -186,7 +186,7 @@ class _TLSContentType: class _TLSAlertType: """Alert types for TLSContentType.ALERT messages - See RFC 8466, section B.2 + See RFC 8446, section B.2 """ CLOSE_NOTIFY = 0 UNEXPECTED_MESSAGE = 10 diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index effa1da55d36b6..67a63907293e8e 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -5359,7 +5359,7 @@ def test_tlsalerttype(self): class Checked_TLSAlertType(enum.IntEnum): """Alert types for TLSContentType.ALERT messages - See RFC 8466, section B.2 + See RFC 8446, section B.2 """ CLOSE_NOTIFY = 0 UNEXPECTED_MESSAGE = 10 From 4556b9e7dc31865f6f1a89d21418bfea16db263b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 6 Dec 2025 16:37:34 +0100 Subject: [PATCH 1559/1674] [3.14] GH-75949: Fix argparse dropping '|' in mutually exclusive groups on line wrap (GH-142312) (#142347) --- Lib/argparse.py | 33 ++++++++++++++++--- Lib/test/test_argparse.py | 19 +++++++++++ ...5-12-05-16-39-17.gh-issue-75949.pHxW98.rst | 1 + 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-05-16-39-17.gh-issue-75949.pHxW98.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 2a74bf27b9d623..8fda5b844aef6c 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -356,8 +356,14 @@ def _format_usage(self, usage, actions, groups, prefix): if len(prefix) + len(self._decolor(usage)) > text_width: # break usage into wrappable parts - opt_parts = self._get_actions_usage_parts(optionals, groups) - pos_parts = self._get_actions_usage_parts(positionals, groups) + # keep optionals and positionals together to preserve + # mutually exclusive group formatting (gh-75949) + all_actions = optionals + positionals + parts, pos_start = self._get_actions_usage_parts_with_split( + all_actions, groups, len(optionals) + ) + opt_parts = parts[:pos_start] + pos_parts = parts[pos_start:] # helper for wrapping lines def get_lines(parts, indent, prefix=None): @@ -421,6 +427,17 @@ def _is_long_option(self, string): return len(string) > 2 def _get_actions_usage_parts(self, actions, groups): + parts, _ = self._get_actions_usage_parts_with_split(actions, groups) + return parts + + def _get_actions_usage_parts_with_split(self, actions, groups, opt_count=None): + """Get usage parts with split index for optionals/positionals. + + Returns (parts, pos_start) where pos_start is the index in parts + where positionals begin. When opt_count is None, pos_start is None. + This preserves mutually exclusive group formatting across the + optionals/positionals boundary (gh-75949). + """ # find group indices and identify actions in groups group_actions = set() inserts = {} @@ -516,8 +533,16 @@ def _get_actions_usage_parts(self, actions, groups): 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] + # if opt_count is provided, calculate where positionals start in + # the final parts list (for wrapping onto separate lines). + # Count before filtering None entries since indices shift after. + if opt_count is not None: + pos_start = sum(1 for p in parts[:opt_count] if p is not None) + else: + pos_start = None + + # return the usage parts and split point (gh-75949) + return [item for item in parts if item is not None], pos_start def _format_text(self, text): if '%(prog)' in text: diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 9b8179ef9693b2..aa32cb00325aeb 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -4885,6 +4885,25 @@ def test_long_mutex_groups_wrap(self): ''') self.assertEqual(parser.format_usage(), usage) + def test_mutex_groups_with_mixed_optionals_positionals_wrap(self): + # https://github.com/python/cpython/issues/75949 + # Mutually exclusive groups containing both optionals and positionals + # should preserve pipe separators when the usage line wraps. + parser = argparse.ArgumentParser(prog='PROG') + g = parser.add_mutually_exclusive_group() + g.add_argument('-v', '--verbose', action='store_true') + g.add_argument('-q', '--quiet', action='store_true') + g.add_argument('-x', '--extra-long-option-name', nargs='?') + g.add_argument('-y', '--yet-another-long-option', nargs='?') + g.add_argument('positional', nargs='?') + + usage = textwrap.dedent('''\ + usage: PROG [-h] [-v | -q | -x [EXTRA_LONG_OPTION_NAME] | + -y [YET_ANOTHER_LONG_OPTION] | + positional] + ''') + self.assertEqual(parser.format_usage(), usage) + class TestHelpVariableExpansion(HelpTestCase): """Test that variables are expanded properly in help messages""" diff --git a/Misc/NEWS.d/next/Library/2025-12-05-16-39-17.gh-issue-75949.pHxW98.rst b/Misc/NEWS.d/next/Library/2025-12-05-16-39-17.gh-issue-75949.pHxW98.rst new file mode 100644 index 00000000000000..5ca3fc05b9816d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-05-16-39-17.gh-issue-75949.pHxW98.rst @@ -0,0 +1 @@ +Fix :mod:`argparse` to preserve ``|`` separators in mutually exclusive groups when the usage line wraps due to length. From 1dfe219fec324611c3fe6282fd8628e94d940ada Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:28:54 +0100 Subject: [PATCH 1560/1674] [3.14] gh-142332: Fix usage formatting for positional arguments in mutually exclusive groups in argparse (GH-142333) (GH-142356) (cherry picked from commit 70c27ce94b2c18f375c10e508e7d9323ae795496) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/argparse.py | 8 ++----- Lib/test/test_argparse.py | 23 ++++++++++++++++++- ...-12-06-13-02-13.gh-issue-142332.PNvXCV.rst | 2 ++ 3 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 8fda5b844aef6c..665d4429461208 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -470,16 +470,12 @@ def _get_actions_usage_parts_with_split(self, actions, groups, opt_count=None): # produce all arg strings elif not action.option_strings: default = self._get_default_metavar_for_positional(action) - part = ( - t.summary_action - + self._format_args(action, default) - + t.reset - ) - + part = self._format_args(action, default) # if it's in a group, strip the outer [] if action in group_actions: if part[0] == '[' and part[-1] == ']': part = part[1:-1] + part = t.summary_action + part + t.reset # produce the first way to invoke the option in brackets else: diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index aa32cb00325aeb..02753b2fd35ec2 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -7275,7 +7275,28 @@ def test_argparse_color(self): ), ) - def test_argparse_color_usage(self): + def test_argparse_color_mutually_exclusive_group_usage(self): + parser = argparse.ArgumentParser(color=True, prog="PROG") + group = parser.add_mutually_exclusive_group() + group.add_argument('--foo', action='store_true', help='FOO') + group.add_argument('--spam', help='SPAM') + group.add_argument('badger', nargs='*', help='BADGER') + + prog = self.theme.prog + heading = self.theme.heading + long = self.theme.summary_long_option + short = self.theme.summary_short_option + label = self.theme.summary_label + pos = self.theme.summary_action + reset = self.theme.reset + + self.assertEqual(parser.format_usage(), + f"{heading}usage: {reset}{prog}PROG{reset} [{short}-h{reset}] " + f"[{long}--foo{reset} | " + f"{long}--spam {label}SPAM{reset} | " + f"{pos}badger ...{reset}]\n") + + def test_argparse_color_custom_usage(self): # Arrange parser = argparse.ArgumentParser( add_help=False, diff --git a/Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst b/Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst new file mode 100644 index 00000000000000..ee2d5e1d4911a7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst @@ -0,0 +1,2 @@ +Fix usage formatting for positional arguments in mutually exclusive groups in :mod:`argparse`. +in :mod:`argparse`. From b188ebeca0710a243571e95e650d6a910c26795e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 6 Dec 2025 22:39:47 +0100 Subject: [PATCH 1561/1674] [3.14] gh-142006: Fix HeaderWriteError in email.policy.default caused by extra newline (GH-142008) (#142361) gh-142006: Fix HeaderWriteError in email.policy.default caused by extra newline (GH-142008) RDM: This fixes a subtle folding error that showed up when a token exactly filled a line and was followed by whitespace and a token with no folding whitespace that was longer than a line. In this particular circumstance the whitespace after the first token got pushed on to the next line, and then stolen to go in front of the next unfoldable token...leaving a completely empty line in the line buffer. That line got turned in to a newline, which is RFC illegal, and the newish security check caught it. The fix is to just delete that empty line from the buffer. (cherry picked from commit 07eff899d8a8ee4c4b1be7cb223fe25687f6216c) Co-authored-by: Paresh Joshi <rahulj9223@gmail.com> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/email/_header_value_parser.py | 3 +++ Lib/test/test_email/test__header_value_parser.py | 10 ++++++++++ .../2025-11-27-10-49-13.gh-issue-142006.nzJDG5.rst | 1 + 3 files changed, 14 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-11-27-10-49-13.gh-issue-142006.nzJDG5.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 91243378dc0441..41401f8f8d54da 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2788,6 +2788,9 @@ def _steal_trailing_WSP_if_exists(lines): if lines and lines[-1] and lines[-1][-1] in WSP: wsp = lines[-1][-1] lines[-1] = lines[-1][:-1] + # gh-142006: if the line is now empty, remove it entirely. + if not lines[-1]: + lines.pop() return wsp def _refold_parse_tree(parse_tree, *, policy): diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 179e236ecdfd7f..f7f9f9c4e2fbb5 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -3255,5 +3255,15 @@ def test_long_filename_attachment(self): " filename*1*=_TEST_TES.txt\n", ) + def test_fold_unfoldable_element_stealing_whitespace(self): + # gh-142006: When an element is too long to fit on the current line + # the previous line's trailing whitespace should not trigger a double newline. + policy = self.policy.clone(max_line_length=10) + # The non-whitespace text needs to exactly fill the max_line_length (10). + text = ("a" * 9) + ", " + ("b" * 20) + expected = ("a" * 9) + ",\n " + ("b" * 20) + "\n" + token = parser.get_address_list(text)[0] + self._test(token, expected, policy=policy) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-11-27-10-49-13.gh-issue-142006.nzJDG5.rst b/Misc/NEWS.d/next/Library/2025-11-27-10-49-13.gh-issue-142006.nzJDG5.rst new file mode 100644 index 00000000000000..49643892ff9ccd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-27-10-49-13.gh-issue-142006.nzJDG5.rst @@ -0,0 +1 @@ +Fix a bug in the :mod:`email.policy.default` folding algorithm which incorrectly resulted in a doubled newline when a line ending at exactly max_line_length was followed by an unfoldable token. From 7308015d9ce2c3d1a9887b769abc4fd888571dd1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 7 Dec 2025 21:03:05 +0100 Subject: [PATCH 1562/1674] [3.14] gh-142346: Fix usage formatting for mutually exclusive groups in argparse (GH-142381) (GH-142385) Support groups preceded by positional arguments or followed or intermixed with other optional arguments. Support empty groups. (cherry picked from commit 1db9f56bff5bbb0292b131ea8a928612acb7ec16) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/argparse.py | 211 ++++++++---------- Lib/test/test_argparse.py | 63 +++--- ...-12-07-17-30-05.gh-issue-142346.okcAAp.rst | 3 + 3 files changed, 131 insertions(+), 146 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-07-17-30-05.gh-issue-142346.okcAAp.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 665d4429461208..9f32d595bf6106 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -337,31 +337,15 @@ def _format_usage(self, usage, actions, groups, prefix): elif usage is None: prog = '%(prog)s' % dict(prog=self._prog) - # split optionals from positionals - optionals = [] - positionals = [] - for action in actions: - if action.option_strings: - optionals.append(action) - else: - positionals.append(action) - + parts, pos_start = self._get_actions_usage_parts(actions, groups) # build full usage string - format = self._format_actions_usage - action_usage = format(optionals + positionals, groups) - usage = ' '.join([s for s in [prog, action_usage] if s]) + usage = ' '.join(filter(None, [prog, *parts])) # wrap the usage parts if it's too long text_width = self._width - self._current_indent if len(prefix) + len(self._decolor(usage)) > text_width: # break usage into wrappable parts - # keep optionals and positionals together to preserve - # mutually exclusive group formatting (gh-75949) - all_actions = optionals + positionals - parts, pos_start = self._get_actions_usage_parts_with_split( - all_actions, groups, len(optionals) - ) opt_parts = parts[:pos_start] pos_parts = parts[pos_start:] @@ -420,125 +404,114 @@ def get_lines(parts, indent, prefix=None): # prefix with 'usage:' return f'{t.usage}{prefix}{t.reset}{usage}\n\n' - def _format_actions_usage(self, actions, groups): - return ' '.join(self._get_actions_usage_parts(actions, groups)) - def _is_long_option(self, string): return len(string) > 2 def _get_actions_usage_parts(self, actions, groups): - parts, _ = self._get_actions_usage_parts_with_split(actions, groups) - return parts - - def _get_actions_usage_parts_with_split(self, actions, groups, opt_count=None): """Get usage parts with split index for optionals/positionals. Returns (parts, pos_start) where pos_start is the index in parts - where positionals begin. When opt_count is None, pos_start is None. + where positionals begin. This preserves mutually exclusive group formatting across the optionals/positionals boundary (gh-75949). """ - # find group indices and identify actions in groups - group_actions = set() - inserts = {} + actions = [action for action in actions if action.help is not SUPPRESS] + # group actions by mutually exclusive groups + action_groups = dict.fromkeys(actions) for group in groups: - 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 = min(actions.index(item) for item in group._group_actions) - except ValueError: - continue - else: - end = start + len(group._group_actions) - if set(actions[start:end]) == set(group._group_actions): - group_actions.update(group._group_actions) - inserts[start, end] = group + for action in group._group_actions: + if action in action_groups: + action_groups[action] = group + # positional arguments keep their position + positionals = [] + for action in actions: + if not action.option_strings: + group = action_groups.pop(action) + if group: + group_actions = [ + action2 for action2 in group._group_actions + if action2.option_strings and + action_groups.pop(action2, None) + ] + [action] + positionals.append((group.required, group_actions)) + else: + positionals.append((None, [action])) + # the remaining optional arguments are sorted by the position of + # the first option in the group + optionals = [] + for action in actions: + if action.option_strings and action in action_groups: + group = action_groups.pop(action) + if group: + group_actions = [action] + [ + action2 for action2 in group._group_actions + if action2.option_strings and + action_groups.pop(action2, None) + ] + optionals.append((group.required, group_actions)) + else: + optionals.append((None, [action])) # collect all actions format strings parts = [] t = self._theme - for action in actions: - - # suppressed arguments are marked with None - if action.help is SUPPRESS: - part = None - - # produce all arg strings - elif not action.option_strings: - default = self._get_default_metavar_for_positional(action) - part = self._format_args(action, default) - # if it's in a group, strip the outer [] - if action in group_actions: - if part[0] == '[' and part[-1] == ']': - part = part[1:-1] - part = t.summary_action + part + t.reset - - # produce the first way to invoke the option in brackets - else: - option_string = action.option_strings[0] - if self._is_long_option(option_string): - option_color = t.summary_long_option + pos_start = None + for i, (required, group) in enumerate(optionals + positionals): + start = len(parts) + if i == len(optionals): + pos_start = start + in_group = len(group) > 1 + for action in group: + # produce all arg strings + if not action.option_strings: + default = self._get_default_metavar_for_positional(action) + part = self._format_args(action, default) + # if it's in a group, strip the outer [] + if in_group: + if part[0] == '[' and part[-1] == ']': + part = part[1:-1] + part = t.summary_action + part + t.reset + + # produce the first way to invoke the option in brackets else: - option_color = t.summary_short_option - - # if the Optional doesn't take a value, format is: - # -s or --long - if action.nargs == 0: - part = action.format_usage() - part = f"{option_color}{part}{t.reset}" + option_string = action.option_strings[0] + if self._is_long_option(option_string): + option_color = t.summary_long_option + else: + option_color = t.summary_short_option - # if the Optional takes a value, format is: - # -s ARGS or --long ARGS - else: - default = self._get_default_metavar_for_optional(action) - args_string = self._format_args(action, default) - part = ( - f"{option_color}{option_string} " - f"{t.summary_label}{args_string}{t.reset}" - ) - - # make it look optional if it's not required or in a group - if not action.required and action not in group_actions: - part = '[%s]' % part - - # add the action string to the list - parts.append(part) - - # 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 - - # if opt_count is provided, calculate where positionals start in - # the final parts list (for wrapping onto separate lines). - # Count before filtering None entries since indices shift after. - if opt_count is not None: - pos_start = sum(1 for p in parts[:opt_count] if p is not None) - else: - pos_start = None + # if the Optional doesn't take a value, format is: + # -s or --long + if action.nargs == 0: + part = action.format_usage() + part = f"{option_color}{part}{t.reset}" - # return the usage parts and split point (gh-75949) - return [item for item in parts if item is not None], pos_start + # if the Optional takes a value, format is: + # -s ARGS or --long ARGS + else: + default = self._get_default_metavar_for_optional(action) + args_string = self._format_args(action, default) + part = ( + f"{option_color}{option_string} " + f"{t.summary_label}{args_string}{t.reset}" + ) + + # make it look optional if it's not required or in a group + if not (action.required or required or in_group): + part = '[%s]' % part + + # add the action string to the list + parts.append(part) + + if in_group: + parts[start] = ('(' if required else '[') + parts[start] + for i in range(start, len(parts) - 1): + parts[i] += ' |' + parts[-1] += ')' if required else ']' + + if pos_start is None: + pos_start = len(parts) + return parts, pos_start def _format_text(self, text): if '%(prog)' in text: diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 02753b2fd35ec2..f2b216446a6200 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -3307,12 +3307,11 @@ def test_help_subparser_all_mutually_exclusive_group_members_suppressed(self): ''' self.assertEqual(cmd_foo.format_help(), textwrap.dedent(expected)) - def test_empty_group(self): + def test_usage_empty_group(self): # See issue 26952 - parser = argparse.ArgumentParser() + parser = ErrorRaisingArgumentParser(prog='PROG') group = parser.add_mutually_exclusive_group() - with self.assertRaises(ValueError): - parser.parse_args(['-h']) + self.assertEqual(parser.format_usage(), 'usage: PROG [-h]\n') def test_nested_mutex_groups(self): parser = argparse.ArgumentParser(prog='PROG') @@ -3580,25 +3579,29 @@ def get_parser(self, required): group.add_argument('-b', action='store_true', help='b help') parser.add_argument('-y', action='store_true', help='y help') group.add_argument('-c', action='store_true', help='c help') + parser.add_argument('-z', action='store_true', help='z help') return parser failures = ['-a -b', '-b -c', '-a -c', '-a -b -c'] successes = [ - ('-a', NS(a=True, b=False, c=False, x=False, y=False)), - ('-b', NS(a=False, b=True, c=False, x=False, y=False)), - ('-c', NS(a=False, b=False, c=True, x=False, y=False)), - ('-a -x', NS(a=True, b=False, c=False, x=True, y=False)), - ('-y -b', NS(a=False, b=True, c=False, x=False, y=True)), - ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True)), + ('-a', NS(a=True, b=False, c=False, x=False, y=False, z=False)), + ('-b', NS(a=False, b=True, c=False, x=False, y=False, z=False)), + ('-c', NS(a=False, b=False, c=True, x=False, y=False, z=False)), + ('-a -x', NS(a=True, b=False, c=False, x=True, y=False, z=False)), + ('-y -b', NS(a=False, b=True, c=False, x=False, y=True, z=False)), + ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True, z=False)), ] successes_when_not_required = [ - ('', NS(a=False, b=False, c=False, x=False, y=False)), - ('-x', NS(a=False, b=False, c=False, x=True, y=False)), - ('-y', NS(a=False, b=False, c=False, x=False, y=True)), + ('', NS(a=False, b=False, c=False, x=False, y=False, z=False)), + ('-x', NS(a=False, b=False, c=False, x=True, y=False, z=False)), + ('-y', NS(a=False, b=False, c=False, x=False, y=True, z=False)), ] - usage_when_required = usage_when_not_required = '''\ - usage: PROG [-h] [-x] [-a] [-b] [-y] [-c] + usage_when_not_required = '''\ + usage: PROG [-h] [-x] [-a | -b | -c] [-y] [-z] + ''' + usage_when_required = '''\ + usage: PROG [-h] [-x] (-a | -b | -c) [-y] [-z] ''' help = '''\ @@ -3609,6 +3612,7 @@ def get_parser(self, required): -b b help -y y help -c c help + -z z help ''' @@ -3662,23 +3666,27 @@ def get_parser(self, required): group.add_argument('a', nargs='?', help='a help') group.add_argument('-b', action='store_true', help='b help') group.add_argument('-c', action='store_true', help='c help') + parser.add_argument('-z', action='store_true', help='z help') return parser failures = ['X A -b', '-b -c', '-c X A'] successes = [ - ('X A', NS(a='A', b=False, c=False, x='X', y=False)), - ('X -b', NS(a=None, b=True, c=False, x='X', y=False)), - ('X -c', NS(a=None, b=False, c=True, x='X', y=False)), - ('X A -y', NS(a='A', b=False, c=False, x='X', y=True)), - ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True)), + ('X A', NS(a='A', b=False, c=False, x='X', y=False, z=False)), + ('X -b', NS(a=None, b=True, c=False, x='X', y=False, z=False)), + ('X -c', NS(a=None, b=False, c=True, x='X', y=False, z=False)), + ('X A -y', NS(a='A', b=False, c=False, x='X', y=True, z=False)), + ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True, z=False)), ] successes_when_not_required = [ - ('X', NS(a=None, b=False, c=False, x='X', y=False)), - ('X -y', NS(a=None, b=False, c=False, x='X', y=True)), + ('X', NS(a=None, b=False, c=False, x='X', y=False, z=False)), + ('X -y', NS(a=None, b=False, c=False, x='X', y=True, z=False)), ] - usage_when_required = usage_when_not_required = '''\ - usage: PROG [-h] [-y] [-b] [-c] x [a] + usage_when_not_required = '''\ + usage: PROG [-h] [-y] [-z] x [-b | -c | a] + ''' + usage_when_required = '''\ + usage: PROG [-h] [-y] [-z] x (-b | -c | a) ''' help = '''\ @@ -3691,6 +3699,7 @@ def get_parser(self, required): -y y help -b b help -c c help + -z z help ''' @@ -4898,9 +4907,9 @@ def test_mutex_groups_with_mixed_optionals_positionals_wrap(self): g.add_argument('positional', nargs='?') usage = textwrap.dedent('''\ - usage: PROG [-h] [-v | -q | -x [EXTRA_LONG_OPTION_NAME] | - -y [YET_ANOTHER_LONG_OPTION] | - positional] + usage: PROG [-h] + [-v | -q | -x [EXTRA_LONG_OPTION_NAME] | + -y [YET_ANOTHER_LONG_OPTION] | positional] ''') self.assertEqual(parser.format_usage(), usage) diff --git a/Misc/NEWS.d/next/Library/2025-12-07-17-30-05.gh-issue-142346.okcAAp.rst b/Misc/NEWS.d/next/Library/2025-12-07-17-30-05.gh-issue-142346.okcAAp.rst new file mode 100644 index 00000000000000..cf570f314c00cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-07-17-30-05.gh-issue-142346.okcAAp.rst @@ -0,0 +1,3 @@ +Fix usage formatting for mutually exclusive groups in :mod:`argparse` +when they are preceded by positional arguments or followed or intermixed +with other optional arguments. From d2f5a0e72e0220366ca4ce4184e0011a04d1505f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 8 Dec 2025 08:58:21 +0100 Subject: [PATCH 1563/1674] [3.14] gh-141794: Reduce size of compiler stress tests to fix Android warnings (GH-142263) (#142386) gh-141794: Reduce size of compiler stress tests to fix Android warnings (GH-142263) (cherry picked from commit f193c8fe9e1d722c9a7f9a2b15f8f1b913755491) Co-authored-by: Malcolm Smith <smith@chaquo.com> --- Lib/test/test_ast/test_ast.py | 3 ++- Lib/test/test_compile.py | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py index 361ee508376d2a..c13423edba625e 100644 --- a/Lib/test/test_ast/test_ast.py +++ b/Lib/test/test_ast/test_ast.py @@ -991,7 +991,8 @@ def next(self): @skip_wasi_stack_overflow() @skip_emscripten_stack_overflow() def test_ast_recursion_limit(self): - crash_depth = 500_000 + # Android test devices have less memory. + crash_depth = 100_000 if sys.platform == "android" else 500_000 success_depth = 200 if _testinternalcapi is not None: remaining = _testinternalcapi.get_c_recursion_remaining() diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index b978be8bc6862b..d37a9db8c8368a 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -728,7 +728,8 @@ def test_yet_more_evil_still_undecodable(self): def test_compiler_recursion_limit(self): # Compiler frames are small limit = 100 - crash_depth = limit * 5000 + # Android test devices have less memory. + crash_depth = limit * (1000 if sys.platform == "android" else 5000) success_depth = limit def check_limit(prefix, repeated, mode="single"): @@ -1030,11 +1031,13 @@ def test_path_like_objects(self): # An implicit test for PyUnicode_FSDecoder(). compile("42", FakePath("test_compile_pathlike"), "single") + # bpo-31113: Stack overflow when compile a long sequence of + # complex statements. @support.requires_resource('cpu') def test_stack_overflow(self): - # bpo-31113: Stack overflow when compile a long sequence of - # complex statements. - compile("if a: b\n" * 200000, "<dummy>", "exec") + # Android test devices have less memory. + size = 100_000 if sys.platform == "android" else 200_000 + compile("if a: b\n" * size, "<dummy>", "exec") # Multiple users rely on the fact that CPython does not generate # bytecode for dead code blocks. See bpo-37500 for more context. From 9bb27cd1051e0e1ee2022fcaedb828643a84a30e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:31:56 +0100 Subject: [PATCH 1564/1674] [3.14] gh-140125: Increase object recursion depth for `test_json` from 200k to 500k (GH-142226) (#142416) gh-140125: Increase object recursion depth for `test_json` from 200k to 500k (GH-142226) (cherry picked from commit e3539e99e3642ceea2330b3f78a6e9fa8ac3da64) Co-authored-by: Zanie Blue <contact@zanie.dev> Co-authored-by: Victor Stinner <vstinner@python.org> --- Lib/test/test_json/test_recursion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_json/test_recursion.py b/Lib/test/test_json/test_recursion.py index 5d7b56ff9ad285..40a0baa53f0c3b 100644 --- a/Lib/test/test_json/test_recursion.py +++ b/Lib/test/test_json/test_recursion.py @@ -71,7 +71,7 @@ def default(self, o): @support.skip_emscripten_stack_overflow() @support.skip_wasi_stack_overflow() def test_highly_nested_objects_decoding(self): - very_deep = 200000 + very_deep = 500_000 # test that loading highly-nested objects doesn't segfault when C # accelerations are used. See #12017 with self.assertRaises(RecursionError): @@ -90,7 +90,7 @@ def test_highly_nested_objects_decoding(self): def test_highly_nested_objects_encoding(self): # See #12051 l, d = [], {} - for x in range(200_000): + for x in range(500_000): l, d = [l], {'k':d} with self.assertRaises(RecursionError): with support.infinite_recursion(5000): From caba09cd6e83d383a3417eb70fde174d842caa28 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 8 Dec 2025 18:27:57 +0100 Subject: [PATCH 1565/1674] [3.14] gh-123241: Document restrictions for `tp_traverse` implementations (gh-142272) (#142423) (cherry picked from commit 37988c57ea244b0ed2f969e9c6039710dfe8f31d) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Doc/c-api/gcsupport.rst | 4 ++++ Doc/c-api/typeobj.rst | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index f6fa52b36c5ab3..fed795b1e8c963 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -232,6 +232,10 @@ The :c:member:`~PyTypeObject.tp_traverse` handler must have the following type: object argument. If *visit* returns a non-zero value that value should be returned immediately. + The traversal function must not have any side effects. Implementations + may not modify the reference counts of any Python objects nor create or + destroy any Python objects. + To simplify writing :c:member:`~PyTypeObject.tp_traverse` handlers, a :c:func:`Py_VISIT` macro is provided. In order to use this macro, the :c:member:`~PyTypeObject.tp_traverse` implementation must name its arguments exactly *visit* and *arg*: diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index b2e8626cb6e811..42bfbeccff1429 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1554,6 +1554,11 @@ and :c:data:`PyType_Type` effectively act as defaults.) but the instance has no strong reference to the elements inside it, as they are allowed to be removed even if the instance is still alive). + .. warning:: + The traversal function must not have any side effects. It must not + modify the reference counts of any Python objects nor create or destroy + any Python objects. + 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 anything. From 20b454d2726d3aa4f80efaeb274da338c7fcf92c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 8 Dec 2025 21:54:24 +0100 Subject: [PATCH 1566/1674] [3.14] Fix typo in `Tools/wasm/README.md` (GH-142426) (GH-142429) Fix typo in `Tools/wasm/README.md` (GH-142426) (cherry picked from commit 719d7960e2b55ab8310df3d9d69b7c9df3283fbf) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Tools/wasm/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index efe9a3550c3e19..91354b2e008041 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -226,8 +226,8 @@ await createEmscriptenModule({ e.g. ``ctypes``, ``readline``, ``ssl``, and more. - Shared extension modules are not implemented yet. All extension modules are statically linked into the main binary. The experimental configure - option ``--enable-wasm-dynamic-linking`` enables dynamic extensions - supports. It's currently known to crash in combination with threading. + option ``--enable-wasm-dynamic-linking`` enables dynamic extension + support. It's currently known to crash in combination with threading. - glibc extensions for date and time formatting are not available. - ``locales`` module is affected by musl libc issues, [gh-90548](https://github.com/python/cpython/issues/90548). From 378b24b54e2d0690c165b1ae52af366419dadb4d Mon Sep 17 00:00:00 2001 From: Sam Gross <colesbury@gmail.com> Date: Mon, 8 Dec 2025 18:16:28 -0500 Subject: [PATCH 1567/1674] [3.14] gh-133932: Tagged ints are heap-safe (free threading) (gh-142431) The previous fix (gh-134494) didn't fix the free threading build. --- Include/internal/pycore_stackref.h | 2 +- .../2025-12-08-15-46-06.gh-issue-133932.HAxa4p.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-15-46-06.gh-issue-133932.HAxa4p.rst diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h index 0ce759fc743d82..52acd918c9b9f9 100644 --- a/Include/internal/pycore_stackref.h +++ b/Include/internal/pycore_stackref.h @@ -323,7 +323,7 @@ _PyStackRef_FromPyObjectSteal(PyObject *obj) static inline bool PyStackRef_IsHeapSafe(_PyStackRef stackref) { - if (PyStackRef_IsDeferred(stackref)) { + if (PyStackRef_IsDeferred(stackref) && !PyStackRef_IsTaggedInt(stackref)) { PyObject *obj = PyStackRef_AsPyObjectBorrow(stackref); return obj == NULL || _Py_IsImmortal(obj) || _PyObject_HasDeferredRefcount(obj); } diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-15-46-06.gh-issue-133932.HAxa4p.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-15-46-06.gh-issue-133932.HAxa4p.rst new file mode 100644 index 00000000000000..460226303599e2 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-15-46-06.gh-issue-133932.HAxa4p.rst @@ -0,0 +1,2 @@ +Fix crash in the free threading build when clearing frames that hold tagged +integers. From f200776b137ab1823ee47a753728e7b61856fdc0 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 08:39:01 +0100 Subject: [PATCH 1568/1674] [3.14] gh-68552: fix defects policy (GH-138579) (#142366) Co-authored-by: Ivo Bellin Salarin <nilleb@users.noreply.github.com> Co-authored-by: Martin Panter <vadmium@users.noreply.github.com> Co-authored-by: Ivo Bellin Salarin <ivo@nilleb.com> --- Lib/email/feedparser.py | 7 +- Lib/test/test_email/test_defect_handling.py | 46 +++++++++- Lib/test/test_email/test_email.py | 88 ------------------- ...5-12-04-09-22-31.gh-issue-68552.I_v-xB.rst | 1 + 4 files changed, 48 insertions(+), 94 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-04-09-22-31.gh-issue-68552.I_v-xB.rst diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py index 6479b9bab7ac5b..ae8ef32792b3e9 100644 --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -504,10 +504,9 @@ def _parse_headers(self, lines): self._input.unreadline(line) return else: - # Weirdly placed unix-from line. Note this as a defect - # and ignore it. + # Weirdly placed unix-from line. defect = errors.MisplacedEnvelopeHeaderDefect(line) - self._cur.defects.append(defect) + self.policy.handle_defect(self._cur, defect) continue # Split the line on the colon separating field name from value. # There will always be a colon, because if there wasn't the part of @@ -519,7 +518,7 @@ def _parse_headers(self, lines): # message. Track the error but keep going. if i == 0: defect = errors.InvalidHeaderDefect("Missing header name.") - self._cur.defects.append(defect) + self.policy.handle_defect(self._cur, defect) continue assert i>0, "_parse_headers fed line with no : and no leading WS" diff --git a/Lib/test/test_email/test_defect_handling.py b/Lib/test/test_email/test_defect_handling.py index 44e76c8ce5e03a..acc4accccac756 100644 --- a/Lib/test/test_email/test_defect_handling.py +++ b/Lib/test/test_email/test_defect_handling.py @@ -126,12 +126,10 @@ def test_multipart_invalid_cte(self): errors.InvalidMultipartContentTransferEncodingDefect) def test_multipart_no_cte_no_defect(self): - if self.raise_expected: return msg = self._str_msg(self.multipart_msg.format('')) self.assertEqual(len(self.get_defects(msg)), 0) def test_multipart_valid_cte_no_defect(self): - if self.raise_expected: return for cte in ('7bit', '8bit', 'BINary'): msg = self._str_msg( self.multipart_msg.format("\nContent-Transfer-Encoding: "+cte)) @@ -300,6 +298,47 @@ def test_missing_ending_boundary(self): self.assertDefectsEqual(self.get_defects(msg), [errors.CloseBoundaryNotFoundDefect]) + def test_line_beginning_colon(self): + string = ( + "Subject: Dummy subject\r\n: faulty header line\r\n\r\nbody\r\n" + ) + + with self._raise_point(errors.InvalidHeaderDefect): + msg = self._str_msg(string) + self.assertEqual(len(self.get_defects(msg)), 1) + self.assertDefectsEqual( + self.get_defects(msg), [errors.InvalidHeaderDefect] + ) + + if msg: + self.assertEqual(msg.items(), [("Subject", "Dummy subject")]) + self.assertEqual(msg.get_payload(), "body\r\n") + + def test_misplaced_envelope(self): + string = ( + "Subject: Dummy subject\r\nFrom wtf\r\nTo: abc\r\n\r\nbody\r\n" + ) + with self._raise_point(errors.MisplacedEnvelopeHeaderDefect): + msg = self._str_msg(string) + self.assertEqual(len(self.get_defects(msg)), 1) + self.assertDefectsEqual( + self.get_defects(msg), [errors.MisplacedEnvelopeHeaderDefect] + ) + + if msg: + headers = [("Subject", "Dummy subject"), ("To", "abc")] + self.assertEqual(msg.items(), headers) + self.assertEqual(msg.get_payload(), "body\r\n") + + + +class TestCompat32(TestDefectsBase, TestEmailBase): + + policy = policy.compat32 + + def get_defects(self, obj): + return obj.defects + class TestDefectDetection(TestDefectsBase, TestEmailBase): @@ -332,6 +371,9 @@ def _raise_point(self, defect): with self.assertRaises(defect): yield + def get_defects(self, obj): + return obj.defects + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 4cd587bcd76040..0f138182fda2ba 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -2262,70 +2262,6 @@ def test_parse_missing_minor_type(self): eq(msg.get_content_maintype(), 'text') eq(msg.get_content_subtype(), 'plain') - # test_defect_handling - def test_same_boundary_inner_outer(self): - msg = self._msgobj('msg_15.txt') - # XXX We can probably eventually do better - inner = msg.get_payload(0) - self.assertHasAttr(inner, 'defects') - self.assertEqual(len(inner.defects), 1) - self.assertIsInstance(inner.defects[0], - errors.StartBoundaryNotFoundDefect) - - # test_defect_handling - def test_multipart_no_boundary(self): - msg = self._msgobj('msg_25.txt') - self.assertIsInstance(msg.get_payload(), str) - self.assertEqual(len(msg.defects), 2) - self.assertIsInstance(msg.defects[0], - errors.NoBoundaryInMultipartDefect) - self.assertIsInstance(msg.defects[1], - errors.MultipartInvariantViolationDefect) - - multipart_msg = textwrap.dedent("""\ - Date: Wed, 14 Nov 2007 12:56:23 GMT - From: foo@bar.invalid - To: foo@bar.invalid - Subject: Content-Transfer-Encoding: base64 and multipart - MIME-Version: 1.0 - Content-Type: multipart/mixed; - boundary="===============3344438784458119861=="{} - - --===============3344438784458119861== - Content-Type: text/plain - - Test message - - --===============3344438784458119861== - Content-Type: application/octet-stream - Content-Transfer-Encoding: base64 - - YWJj - - --===============3344438784458119861==-- - """) - - # test_defect_handling - def test_multipart_invalid_cte(self): - msg = self._str_msg( - self.multipart_msg.format("\nContent-Transfer-Encoding: base64")) - self.assertEqual(len(msg.defects), 1) - self.assertIsInstance(msg.defects[0], - errors.InvalidMultipartContentTransferEncodingDefect) - - # test_defect_handling - def test_multipart_no_cte_no_defect(self): - msg = self._str_msg(self.multipart_msg.format('')) - self.assertEqual(len(msg.defects), 0) - - # test_defect_handling - def test_multipart_valid_cte_no_defect(self): - for cte in ('7bit', '8bit', 'BINary'): - msg = self._str_msg( - self.multipart_msg.format( - "\nContent-Transfer-Encoding: {}".format(cte))) - self.assertEqual(len(msg.defects), 0) - # test_headerregistry.TestContentTypeHeader invalid_1 and invalid_2. def test_invalid_content_type(self): eq = self.assertEqual @@ -2402,30 +2338,6 @@ def test_missing_start_boundary(self): self.assertIsInstance(bad.defects[0], errors.StartBoundaryNotFoundDefect) - # test_defect_handling - def test_first_line_is_continuation_header(self): - eq = self.assertEqual - m = ' Line 1\nSubject: test\n\nbody' - msg = email.message_from_string(m) - eq(msg.keys(), ['Subject']) - eq(msg.get_payload(), 'body') - eq(len(msg.defects), 1) - self.assertDefectsEqual(msg.defects, - [errors.FirstHeaderLineIsContinuationDefect]) - eq(msg.defects[0].line, ' Line 1\n') - - # test_defect_handling - def test_missing_header_body_separator(self): - # Our heuristic if we see a line that doesn't look like a header (no - # leading whitespace but no ':') is to assume that the blank line that - # separates the header from the body is missing, and to stop parsing - # headers and start parsing the body. - msg = self._str_msg('Subject: test\nnot a header\nTo: abc\n\nb\n') - self.assertEqual(msg.keys(), ['Subject']) - self.assertEqual(msg.get_payload(), 'not a header\nTo: abc\n\nb\n') - self.assertDefectsEqual(msg.defects, - [errors.MissingHeaderBodySeparatorDefect]) - def test_string_payload_with_extra_space_after_cte(self): # https://github.com/python/cpython/issues/98188 cte = "base64 " diff --git a/Misc/NEWS.d/next/Library/2025-12-04-09-22-31.gh-issue-68552.I_v-xB.rst b/Misc/NEWS.d/next/Library/2025-12-04-09-22-31.gh-issue-68552.I_v-xB.rst new file mode 100644 index 00000000000000..bd3e53c9f8193f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-04-09-22-31.gh-issue-68552.I_v-xB.rst @@ -0,0 +1 @@ +``MisplacedEnvelopeHeaderDefect`` and ``Missing header name`` defects are now correctly passed to the ``handle_defect`` method of ``policy`` in :class:`~email.parser.FeedParser`. From 19968c89276e16c20ff8f6916f897f2a19a08daa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:33:35 +0100 Subject: [PATCH 1569/1674] [3.14] gh-142282 Fix winreg.QueryValueEx() under race condition (GH-142283) (GH-142453) (cherry picked from commit 3ec941b364778bce4fac6c6100730e120b426849) Co-authored-by: Jeong, YunWon <69878+youknowone@users.noreply.github.com> --- Lib/test/test_winreg.py | 32 +++++++++++++++++++ ...-12-05-18-26-50.gh-issue-142282.g6RQUN.rst | 1 + PC/winreg.c | 2 +- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py index 924a962781a75b..1bc830c02c39ce 100644 --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -3,6 +3,7 @@ import gc import os, sys, errno +import itertools import threading import unittest from platform import machine, win32_edition @@ -291,6 +292,37 @@ def run(self): DeleteKey(HKEY_CURRENT_USER, test_key_name+'\\changing_value') DeleteKey(HKEY_CURRENT_USER, test_key_name) + def test_queryvalueex_race_condition(self): + # gh-142282: QueryValueEx could read garbage buffer under race + # condition when another thread changes the value size + done = False + ready = threading.Event() + values = [b'ham', b'spam'] + + class WriterThread(threading.Thread): + def run(self): + with CreateKey(HKEY_CURRENT_USER, test_key_name) as key: + values_iter = itertools.cycle(values) + while not done: + val = next(values_iter) + SetValueEx(key, 'test_value', 0, REG_BINARY, val) + ready.set() + + thread = WriterThread() + thread.start() + try: + ready.wait() + with CreateKey(HKEY_CURRENT_USER, test_key_name) as key: + for _ in range(1000): + result, typ = QueryValueEx(key, 'test_value') + # The result must be one of the written values, + # not garbage data from uninitialized buffer + self.assertIn(result, values) + finally: + done = True + thread.join() + DeleteKey(HKEY_CURRENT_USER, test_key_name) + def test_long_key(self): # Issue2810, in 2.6 and 3.1 when the key name was exactly 256 # characters, EnumKey raised "WindowsError: More data is diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst new file mode 100644 index 00000000000000..d038cd40f4f57a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst @@ -0,0 +1 @@ +Fix :func:`winreg.QueryValueEx` to not accidentally read garbage buffer under race condition. diff --git a/PC/winreg.c b/PC/winreg.c index fc649e10bac944..159df46bc639d6 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -1681,7 +1681,7 @@ winreg_QueryValueEx_impl(PyObject *module, HKEY key, const wchar_t *name) return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryValueEx"); } - obData = Reg2Py(retBuf, bufSize, typ); + obData = Reg2Py(retBuf, retSize, typ); PyMem_Free(retBuf); if (obData == NULL) return NULL; From 43f696d942708e059c1400d521d1170a3f9b6af9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:13:31 +0100 Subject: [PATCH 1570/1674] [3.14] gh-142342: Fix m68k assembler operand constraints for `%fpcr` access (gh-142343) (#142458) On m68k, an fmove instruction accessing %fpcr may only move from or to a data register or a memory operand. The constraint "g" also permits the use of address registers, which is invalid. The correct constraint is "dm". Beginning with GCC 15, the register allocator picks an address register in the code which causes SIGILL during runtime. (cherry picked from commit 02c085d48b59c00fb7f4454fb13933e1c2c0b01a) Co-authored-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> Co-authored-by: Michael Karcher <github@mkarcher.dialup.fu-berlin.de> --- Include/internal/pycore_pymath.h | 6 +++--- .../2025-12-08-13-04-37.gh-issue-142343.BTAyML.rst | 1 + configure | 4 ++-- configure.ac | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-13-04-37.gh-issue-142343.BTAyML.rst diff --git a/Include/internal/pycore_pymath.h b/Include/internal/pycore_pymath.h index eea8996ba68ca0..5bbbdaab8f42dc 100644 --- a/Include/internal/pycore_pymath.h +++ b/Include/internal/pycore_pymath.h @@ -146,17 +146,17 @@ extern void _Py_set_387controlword(unsigned short); unsigned int old_fpcr, new_fpcr #define _Py_SET_53BIT_PRECISION_START \ do { \ - __asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr)); \ + __asm__ ("fmove.l %%fpcr,%0" : "=dm" (old_fpcr)); \ /* Set double precision / round to nearest. */ \ new_fpcr = (old_fpcr & ~0xf0) | 0x80; \ if (new_fpcr != old_fpcr) { \ - __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr));\ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "dm" (new_fpcr)); \ } \ } while (0) #define _Py_SET_53BIT_PRECISION_END \ do { \ if (new_fpcr != old_fpcr) { \ - __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr)); \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "dm" (old_fpcr)); \ } \ } while (0) #endif diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-13-04-37.gh-issue-142343.BTAyML.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-13-04-37.gh-issue-142343.BTAyML.rst new file mode 100644 index 00000000000000..9da936c2a6f3bd --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-13-04-37.gh-issue-142343.BTAyML.rst @@ -0,0 +1 @@ +Fix SIGILL crash on m68k due to incorrect assembly constraint. diff --git a/configure b/configure index 46eb0665bf4795..645628fecf2df7 100755 --- a/configure +++ b/configure @@ -26010,8 +26010,8 @@ main (void) { unsigned int fpcr; - __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=g" (fpcr)); - __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "g" (fpcr)); + __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm" (fpcr)); + __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm" (fpcr)); ; return 0; diff --git a/configure.ac b/configure.ac index bd4446e9488f7b..d81c76fc12230f 100644 --- a/configure.ac +++ b/configure.ac @@ -6099,8 +6099,8 @@ AS_VAR_IF([ac_cv_gcc_asm_for_x87], [yes], [ AC_CACHE_CHECK([whether we can use gcc inline assembler to get and set mc68881 fpcr], [ac_cv_gcc_asm_for_mc68881], [ AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[ unsigned int fpcr; - __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=g" (fpcr)); - __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "g" (fpcr)); + __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm" (fpcr)); + __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm" (fpcr)); ]])],[ac_cv_gcc_asm_for_mc68881=yes],[ac_cv_gcc_asm_for_mc68881=no]) ]) AS_VAR_IF([ac_cv_gcc_asm_for_mc68881], [yes], [ From 5d5d92b62fdf76465d95b8ce01c662bdbbfc595c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:46:05 +0100 Subject: [PATCH 1571/1674] [3.14] gh-105836: Fix `asyncio.run_coroutine_threadsafe` leaving underlying cancelled asyncio task running (GH-141696) (#142358) gh-105836: Fix `asyncio.run_coroutine_threadsafe` leaving underlying cancelled asyncio task running (GH-141696) (cherry picked from commit 14715e3a64a674629c781d4a3dd11143ba010990) Co-authored-by: Kaisheng Xu <iaalmsimon@gmail.com> Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- Lib/asyncio/futures.py | 4 ++-- Lib/test/test_asyncio/test_tasks.py | 24 +++++++++++++++++++ Misc/ACKS | 1 + ...-11-18-15-48-13.gh-issue-105836.sbUw24.rst | 2 ++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-18-15-48-13.gh-issue-105836.sbUw24.rst diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index d1df6707302277..e8a99556b1885e 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -392,7 +392,7 @@ def _set_state(future, other): def _call_check_cancel(destination): if destination.cancelled(): - if source_loop is None or source_loop is dest_loop: + if source_loop is None or source_loop is events._get_running_loop(): source.cancel() else: source_loop.call_soon_threadsafe(source.cancel) @@ -401,7 +401,7 @@ def _call_set_state(source): if (destination.cancelled() and dest_loop is not None and dest_loop.is_closed()): return - if dest_loop is None or dest_loop is source_loop: + if dest_loop is None or dest_loop is events._get_running_loop(): _set_state(destination, source) else: if dest_loop.is_closed(): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 931a43816a257a..9809621a324450 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -3680,6 +3680,30 @@ def task_factory(loop, coro): (loop, context), kwargs = callback.call_args self.assertEqual(context['exception'], exc_context.exception) + def test_run_coroutine_threadsafe_and_cancel(self): + task = None + thread_future = None + # Use a custom task factory to capture the created Task + def task_factory(loop, coro): + nonlocal task + task = asyncio.Task(coro, loop=loop) + return task + + self.addCleanup(self.loop.set_task_factory, + self.loop.get_task_factory()) + + async def target(): + nonlocal thread_future + self.loop.set_task_factory(task_factory) + thread_future = asyncio.run_coroutine_threadsafe(asyncio.sleep(10), self.loop) + await asyncio.sleep(0) + + thread_future.cancel() + + self.loop.run_until_complete(target()) + self.assertTrue(task.cancelled()) + self.assertTrue(thread_future.cancelled()) + class SleepTests(test_utils.TestCase): def setUp(self): diff --git a/Misc/ACKS b/Misc/ACKS index 1730eb71cb86eb..15957d68a574d1 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -2103,6 +2103,7 @@ Xiang Zhang Robert Xiao Florent Xicluna Yanbo, Xie +Kaisheng Xu Xinhang Xu Arnon Yaari Alakshendra Yadav diff --git a/Misc/NEWS.d/next/Library/2025-11-18-15-48-13.gh-issue-105836.sbUw24.rst b/Misc/NEWS.d/next/Library/2025-11-18-15-48-13.gh-issue-105836.sbUw24.rst new file mode 100644 index 00000000000000..d2edc5b2cb743d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-18-15-48-13.gh-issue-105836.sbUw24.rst @@ -0,0 +1,2 @@ +Fix :meth:`asyncio.run_coroutine_threadsafe` leaving underlying cancelled +asyncio task running. From 04ecff52c34364fc5df53bfdcf7218d626b19b43 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:59:42 +0100 Subject: [PATCH 1572/1674] [3.14] gh-140222: Increase stack margin on debug build (GH-142452) (#142471) gh-140222: Increase stack margin on debug build (GH-142452) Increase _PyOS_MIN_STACK_SIZE if Python is built in debug mode. (cherry picked from commit 49207a522627718a19886386ec2a7ce957437d08) Co-authored-by: Victor Stinner <vstinner@python.org> --- Include/internal/pycore_pythonrun.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/internal/pycore_pythonrun.h b/Include/internal/pycore_pythonrun.h index b232429c4d09c3..b25abb4f64c688 100644 --- a/Include/internal/pycore_pythonrun.h +++ b/Include/internal/pycore_pythonrun.h @@ -38,9 +38,9 @@ extern const char* _Py_SourceAsString( * no two calls to check recursion depth are more than this far * apart. In practice, that means it must be larger than the C * stack consumption of PyEval_EvalDefault */ -#if defined(_Py_ADDRESS_SANITIZER) || defined(_Py_THREAD_SANITIZER) -# define _PyOS_LOG2_STACK_MARGIN 12 -#elif defined(Py_DEBUG) && defined(WIN32) +#if (defined(Py_DEBUG) \ + || defined(_Py_ADDRESS_SANITIZER) \ + || defined(_Py_THREAD_SANITIZER)) # define _PyOS_LOG2_STACK_MARGIN 12 #else # define _PyOS_LOG2_STACK_MARGIN 11 From 69ecb4c234b6aa6f2863e8282526264a1f7942ba Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski <savannah@python.org> Date: Tue, 9 Dec 2025 09:22:26 -0800 Subject: [PATCH 1573/1674] [3.14] GH-139946: Document argparse includes color codes when redirecting to stderr to file (#142398) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/argparse.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index b8ecbf3e584630..f64ace037f6975 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -644,6 +644,13 @@ variables and terminal capabilities. However, if ``color=False``, colored output is always disabled, even if environment variables like ``FORCE_COLOR`` are set. +.. note:: + + Error messages will include color codes when redirecting stderr to a + file. To avoid this, set the |NO_COLOR|_ or :envvar:`PYTHON_COLORS` + environment variable (for example, + ``NO_COLOR=1 python script.py 2> errors.txt``). + .. versionadded:: 3.14 From dafac8a47a3680b6adcb4ccc23e9ba63316aaf60 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Tue, 9 Dec 2025 19:35:49 +0200 Subject: [PATCH 1574/1674] [3.14] gh-112527: Fix help text for required options in argparse (GH-112528) (GH-142475) For optional arguments with required=True, the ArgumentDefaultsHelpFormatter would always add a " (default: None)" to the end of the help text. Since that's a bit misleading, it is removed with this commit. (cherry picked from commit 1adb17b1a26e1547d14ca15f915e605cfdda3edd) Co-authored-by: Fabian Henze <32638720+henzef@users.noreply.github.com> --- Lib/argparse.py | 13 ++++++++----- Lib/test/test_argparse.py | 6 ++++-- .../2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 9f32d595bf6106..1d7d34f9924326 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -739,11 +739,14 @@ def _get_help_string(self, action): if help is None: help = '' - if '%(default)' not in help: - 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)') + if ( + '%(default)' not in help + and action.default is not SUPPRESS + and not action.required + ): + defaulting_nargs = (OPTIONAL, ZERO_OR_MORE) + if action.option_strings or action.nargs in defaulting_nargs: + help += _(' (default: %(default)s)') return help diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index f2b216446a6200..f48fb765bb31d1 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -5328,6 +5328,7 @@ class TestHelpArgumentDefaults(HelpTestCase): argument_signatures = [ Sig('--foo', help='foo help - oh and by the way, %(default)s'), Sig('--bar', action='store_true', help='bar help'), + Sig('--required', required=True, help='some help'), Sig('--taz', action=argparse.BooleanOptionalAction, help='Whether to taz it', default=True), Sig('--corge', action=argparse.BooleanOptionalAction, @@ -5341,8 +5342,8 @@ class TestHelpArgumentDefaults(HelpTestCase): [Sig('--baz', type=int, default=42, help='baz help')]), ] usage = '''\ - usage: PROG [-h] [--foo FOO] [--bar] [--taz | --no-taz] [--corge | --no-corge] - [--quux QUUX] [--baz BAZ] + usage: PROG [-h] [--foo FOO] [--bar] --required REQUIRED [--taz | --no-taz] + [--corge | --no-corge] [--quux QUUX] [--baz BAZ] spam [badger] ''' help = usage + '''\ @@ -5357,6 +5358,7 @@ class TestHelpArgumentDefaults(HelpTestCase): -h, --help show this help message and exit --foo FOO foo help - oh and by the way, None --bar bar help (default: False) + --required REQUIRED some help --taz, --no-taz Whether to taz it (default: True) --corge, --no-corge Whether to corge it --quux QUUX Set the quux (default: 42) diff --git a/Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst b/Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst new file mode 100644 index 00000000000000..70447bc6437677 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst @@ -0,0 +1,2 @@ +The help text for required options in :mod:`argparse` no +longer extended with " (default: None)". From 8cb65ca1dd7c63e45cfba9a07459cbaea8a6f571 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:18:14 +0100 Subject: [PATCH 1575/1674] [3.14] gh-138061: Exclude __pycache__ directory from the computed digest in the JIT stencils (GH-138131) (#142482) Co-authored-by: alm <alonme@users.noreply.github.com> --- .../next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst | 1 + Tools/jit/_targets.py | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst diff --git a/Misc/NEWS.d/next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst b/Misc/NEWS.d/next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst new file mode 100644 index 00000000000000..7af79d0b87ef55 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst @@ -0,0 +1 @@ +Ensure reproducible builds by making JIT stencil header generation deterministic. diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index ed63e388e433b9..d7c9aed1191c10 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -69,6 +69,9 @@ def _compute_digest(self) -> str: hasher.update(PYTHON_EXECUTOR_CASES_C_H.read_bytes()) hasher.update((self.pyconfig_dir / "pyconfig.h").read_bytes()) for dirpath, _, filenames in sorted(os.walk(TOOLS_JIT)): + # Exclude cache files from digest computation to ensure reproducible builds. + if dirpath.endswith("__pycache__"): + continue for filename in filenames: hasher.update(pathlib.Path(dirpath, filename).read_bytes()) return hasher.hexdigest() From 7621bbd828bb42e3b54aae45bd33563cfa9e5ccb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:50:53 +0100 Subject: [PATCH 1576/1674] [3.14] gh-142454: Make the JIT digest more deterministic by sorting the files in Tools/jit (GH-142455) (#142485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-142454: Make the JIT digest more deterministic by sorting the files in Tools/jit (GH-142455) (cherry picked from commit bcf90de8ba2ea087540a5f632656ef880ee46b5c) Co-authored-by: Miro Hrončok <miro@hroncok.cz> Co-authored-by: Ken Jin <kenjin4096@gmail.com> --- .../next/Build/2025-12-09-13-33-46.gh-issue-142454.cqUxzQ.rst | 4 ++++ Tools/jit/_targets.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Build/2025-12-09-13-33-46.gh-issue-142454.cqUxzQ.rst diff --git a/Misc/NEWS.d/next/Build/2025-12-09-13-33-46.gh-issue-142454.cqUxzQ.rst b/Misc/NEWS.d/next/Build/2025-12-09-13-33-46.gh-issue-142454.cqUxzQ.rst new file mode 100644 index 00000000000000..4de16866f28851 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-12-09-13-33-46.gh-issue-142454.cqUxzQ.rst @@ -0,0 +1,4 @@ +When calculating the digest of the JIT stencils input, sort the hashed files +by filenames before adding their content to the hasher. This ensures +deterministic hash input and hence deterministic hash, independent on +filesystem order. diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index d7c9aed1191c10..f1085cc9bf081d 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -72,7 +72,7 @@ def _compute_digest(self) -> str: # Exclude cache files from digest computation to ensure reproducible builds. if dirpath.endswith("__pycache__"): continue - for filename in filenames: + for filename in sorted(filenames): hasher.update(pathlib.Path(dirpath, filename).read_bytes()) return hasher.hexdigest() From 1e495c209dde7c41a537a25f40289aef74a634f5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:44:15 +0100 Subject: [PATCH 1577/1674] [3.14] gh-140189: Use macos-14 runner for iOS CI tests (GH-142444) (#142494) Switch to the macos-14 runner for iOS CI, working around some instability in the macos-15 runner. (cherry picked from commit 91884838bc3c47e02ab6099e6f9b12d80a0abae2) Co-authored-by: Russell Keith-Magee <russell@keith-magee.com> --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1dbc890d5b38c0..56eb876ee3f384 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -373,7 +373,7 @@ jobs: needs: build-context if: needs.build-context.outputs.run-tests == 'true' timeout-minutes: 60 - runs-on: macos-15 + runs-on: macos-14 steps: - uses: actions/checkout@v4 with: @@ -386,10 +386,10 @@ jobs: # https://github.com/actions/runner-images/issues/12751. - name: Select Xcode version run: | - sudo xcode-select --switch /Applications/Xcode_16.4.app + sudo xcode-select --switch /Applications/Xcode_15.4.app - name: Build and test - run: python3 Apple ci iOS --fast-ci --simulator 'iPhone 16e,OS=18.5' + run: python3 Apple ci iOS --fast-ci --simulator 'iPhone SE (3rd generation),OS=17.5' build-wasi: name: 'WASI' From d14697db18a71678de91e6e236f42d377eeab258 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:13:26 +0100 Subject: [PATCH 1578/1674] Updates to PyManager docs based on feedback. (GH-142473) (cherry picked from commit 37fe9a90c5f99fd3830bb3c86e745ba16edf4723) Co-authored-by: Steve Dower <steve.dower@python.org> --- Doc/using/windows.rst | 47 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index a706280dc2d9fd..e15132e9752448 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -290,8 +290,12 @@ Passing ``--dry-run`` will generate output and logs, but will not modify any installs. In addition to the above options, the ``--target`` option will extract the -runtime to the specified directory instead of doing a normal install. This is -useful for embedding runtimes into larger applications. +runtime to the specified directory instead of doing a normal install. +This is useful for embedding runtimes into larger applications. +Unlike a normal install, ``py`` will not be aware of the extracted runtime, +and no Start menu or other shortcuts will be created. +To launch the runtime, directly execute the main executable (typically +``python.exe``) in the target directory. .. code:: @@ -378,10 +382,13 @@ overridden installs may resolve settings differently. A global configuration file may be configured by an administrator, and would be read first. The user configuration file is stored at -:file:`%AppData%\\Python\\pymanager.json` (by default) and is read next, +:file:`%AppData%\\Python\\pymanager.json` +(note that this location is under ``Roaming``, not ``Local``) and is read next, overwriting any settings from earlier files. An additional configuration file may be specified as the ``PYTHON_MANAGER_CONFIG`` environment variable or the ``--config`` command line option (but not both). +These locations may be modified by administrative customization options listed +later. The following settings are those that are considered likely to be modified in normal use. Later sections list those that are intended for administrative @@ -420,8 +427,8 @@ customization. * - ``automatic_install`` - ``PYTHON_MANAGER_AUTOMATIC_INSTALL`` - - True to allow automatic installs when specifying a particular runtime - to launch. + - True to allow automatic installs when using ``py exec`` to launch. + Other commands will not automatically install. By default, true. * - ``include_unmanaged`` @@ -799,6 +806,12 @@ default). * - - Check that the ``py`` and ``pymanager`` commands work. + * - + - Ensure your :envvar:`PATH` variable contains the entry for + ``%UserProfile%\AppData\Local\Microsoft\WindowsApps``. + The operating system includes this entry once by default, after other + user paths. If removed, shortcuts will not be found. + * - ``py`` gives me a "command not found" error when I type it in my terminal. - Did you :ref:`install the Python install manager <pymanager>`? @@ -809,6 +822,12 @@ default). The "Python (default windowed)" and "Python install manager" commands may also need refreshing. + * - + - Ensure your :envvar:`PATH` variable contains the entry for + ``%UserProfile%\AppData\Local\Microsoft\WindowsApps``. + The operating system includes this entry once by default, after other + user paths. If removed, shortcuts will not be found. + * - ``py`` gives me a "can't open file" error when I type commands in my terminal. - This usually means you have the legacy launcher installed and @@ -839,7 +858,7 @@ default). - Prerelease and experimental installs that are not managed by the Python install manager may be chosen ahead of stable releases. Configure your default tag or uninstall the prerelease runtime - and reinstall using ``py install``. + and reinstall it using ``py install``. * - ``pythonw`` or ``pyw`` don't launch the same runtime as ``python`` or ``py`` - Click Start, open "Manage app execution aliases", and check that your @@ -869,6 +888,20 @@ default). the `legacy launcher`_, or with the Python install manager when installed from the MSI. + * - I have installed the Python install manager multiple times. + - It is possible to install from the Store or WinGet, from the MSIX on + the Python website, and from the MSI, all at once. + They are all compatible and will share configuration and runtimes. + + * - + - See the earlier :ref:`pymanager-advancedinstall` section for ways to + uninstall the install manager other than the typical Installed Apps + (Add and Remove Programs) settings page. + + * - My old ``py.ini`` settings no longer work. + - The new Python install manager no longer supports this configuration file + or its settings, and so it will be ignored. + See :ref:`pymanager-config` for information about configuration settings. .. _windows-embeddable: @@ -886,7 +919,7 @@ To install an embedded distribution, we recommend using ``py install`` with the .. code:: - $> py install 3.14-embed --target=runtime + $> py install 3.14-embed --target=<directory> When extracted, the embedded distribution is (almost) fully isolated from the user's system, including environment variables, system registry settings, and From 0114178911f8713bfcb935ff5542fe61b4a5d551 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:52:55 +0100 Subject: [PATCH 1579/1674] [3.14] gh-142048: Fix lost gc allocations count on thread cleanup (GH-142233) (#142504) gh-142048: Fix lost gc allocations count on thread cleanup (GH-142233) (cherry picked from commit 49b1fb43f65290dadeb83ed6f7c0c74995fda7a1) Co-authored-by: Kevin Wang <kevmo314@gmail.com> --- Python/pystate.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Python/pystate.c b/Python/pystate.c index 6781920b9eec66..7188e5bf361fa5 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1815,16 +1815,23 @@ PyThreadState_Clear(PyThreadState *tstate) struct _Py_freelists *freelists = _Py_freelists_GET(); _PyObject_ClearFreeLists(freelists, 1); + // Flush the thread's local GC allocation count to the global count + // before the thread state is cleared, otherwise the count is lost. + _PyThreadStateImpl *tstate_impl = (_PyThreadStateImpl *)tstate; + _Py_atomic_add_int(&tstate->interp->gc.young.count, + (int)tstate_impl->gc.alloc_count); + tstate_impl->gc.alloc_count = 0; + // Merge our thread-local refcounts into the type's own refcount and // free our local refcount array. - _PyObject_FinalizePerThreadRefcounts((_PyThreadStateImpl *)tstate); + _PyObject_FinalizePerThreadRefcounts(tstate_impl); // Remove ourself from the biased reference counting table of threads. _Py_brc_remove_thread(tstate); // Release our thread-local copies of the bytecode for reuse by another // thread - _Py_ClearTLBCIndex((_PyThreadStateImpl *)tstate); + _Py_ClearTLBCIndex(tstate_impl); #endif // Merge our queue of pointers to be freed into the interpreter queue. From 36d4f67b3cc97df8fb46f15e300719cc02cc496f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:07:59 +0100 Subject: [PATCH 1580/1674] [3.14] gh-142433: Move deref to below the error when checking for laststring (GH-142402) (#142524) gh-142433: Move deref to below the error when checking for laststring (GH-142402) Move deref of laststring to below the error checking so the deref is applied after the object in strings is replaced. (cherry picked from commit 785268fdceb0d0fe217aed1d6e43e0231c0e50c3) Co-authored-by: AZero13 <gfunni234@gmail.com> --- .../2025-12-08-17-34-57.gh-issue-142402.iV0ON3.rst | 3 +++ Objects/templateobject.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-17-34-57.gh-issue-142402.iV0ON3.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-17-34-57.gh-issue-142402.iV0ON3.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-17-34-57.gh-issue-142402.iV0ON3.rst new file mode 100644 index 00000000000000..bad31470a25552 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-08-17-34-57.gh-issue-142402.iV0ON3.rst @@ -0,0 +1,3 @@ +Fix reference counting when adjacent literal parts are merged while constructing +:class:`string.templatelib.Template`, preventing the displaced string object +from leaking. diff --git a/Objects/templateobject.c b/Objects/templateobject.c index ac38e4de435d5d..a05208e4c8fc8e 100644 --- a/Objects/templateobject.c +++ b/Objects/templateobject.c @@ -148,13 +148,14 @@ template_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (last_was_str) { PyObject *laststring = PyTuple_GET_ITEM(strings, stringsidx - 1); PyObject *concat = PyUnicode_Concat(laststring, item); - Py_DECREF(laststring); if (!concat) { Py_DECREF(strings); Py_DECREF(interpolations); return NULL; } + /* Replace laststring with concat */ PyTuple_SET_ITEM(strings, stringsidx - 1, concat); + Py_DECREF(laststring); } else { PyTuple_SET_ITEM(strings, stringsidx++, Py_NewRef(item)); From 35df805bb75eb4cc410c26164b8039cdc84b5009 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:41:12 +0100 Subject: [PATCH 1581/1674] [3.14] gh-139927: Fix test_embed on OpenIndiana (GH-142514) (#142520) gh-139927: Fix test_embed on OpenIndiana (GH-142514) Avoid swprintf() function in Programs/_testembed.c since it doesn't work as expected on OpenIndiana. (cherry picked from commit c76cfe8d89c5f44b6a012d24c0e14b45eab16b90) Co-authored-by: Victor Stinner <vstinner@python.org> --- Programs/_testembed.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3256464b7b8219..fe3e656a22ae31 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -2116,15 +2116,20 @@ static int check_use_frozen_modules(const char *rawval) if (rawval == NULL) { wcscpy(optval, L"frozen_modules"); } - else if (swprintf(optval, 100, -#if defined(_MSC_VER) - L"frozen_modules=%S", -#else - L"frozen_modules=%s", -#endif - rawval) < 0) { - error("rawval is too long"); - return -1; + else { + wchar_t *val = Py_DecodeLocale(rawval, NULL); + if (val == NULL) { + error("unable to decode TESTFROZEN"); + return -1; + } + wcscpy(optval, L"frozen_modules="); + if ((wcslen(optval) + wcslen(val)) >= Py_ARRAY_LENGTH(optval)) { + error("TESTFROZEN is too long"); + PyMem_RawFree(val); + return -1; + } + wcscat(optval, val); + PyMem_RawFree(val); } PyConfig config; From a160317b5a5f460cab55b89d741783d98e96c38d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 23:46:18 +0100 Subject: [PATCH 1582/1674] [3.14] [Docs] Fix typo in bdb: `is_skipped_line` to `is_skipped_module` (GH-141771) (#142547) [Docs] Fix typo in bdb: `is_skipped_line` to `is_skipped_module` (GH-141771) (cherry picked from commit e5adaafc52060ece7232ee074a7133b78fe01f9e) Co-authored-by: Guo Ci <zguoci@gmail.com> --- Doc/library/bdb.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/bdb.rst b/Doc/library/bdb.rst index 90f042aa377711..2b87f2626b2ce1 100644 --- a/Doc/library/bdb.rst +++ b/Doc/library/bdb.rst @@ -240,7 +240,7 @@ The :mod:`bdb` module also defines two classes: Normally derived classes don't override the following methods, but they may if they want to redefine the definition of stopping and breakpoints. - .. method:: is_skipped_line(module_name) + .. method:: is_skipped_module(module_name) Return ``True`` if *module_name* matches any skip pattern. From cbec73cf6342af03fea81655cf171f495c7a410e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 23:46:35 +0100 Subject: [PATCH 1583/1674] [3.14] gh-142489: Increase ssl_handshake_timeout in asyncio tests (GH-142523) (#142545) gh-142489: Increase ssl_handshake_timeout in asyncio tests (GH-142523) Replace SHORT_TIMEOUT with LONG_TIMEOUT for very slow CIs. And add the HANDSHAKE_TIMEOUT constant. (cherry picked from commit dc3ece2bc06d56c21ef81f86424b4598880ba1c8) Co-authored-by: Victor Stinner <vstinner@python.org> --- Lib/test/test_asyncio/test_ssl.py | 40 +++++++++++++------------------ 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/Lib/test/test_asyncio/test_ssl.py b/Lib/test/test_asyncio/test_ssl.py index 06118f3a61587b..ca15fc3bdd42dd 100644 --- a/Lib/test/test_asyncio/test_ssl.py +++ b/Lib/test/test_asyncio/test_ssl.py @@ -27,6 +27,7 @@ MACOS = (sys.platform == 'darwin') BUF_MULTIPLIER = 1024 if not MACOS else 64 +HANDSHAKE_TIMEOUT = support.LONG_TIMEOUT def tearDownModule(): @@ -257,15 +258,12 @@ def prog(sock): await fut async def start_server(): - extras = {} - extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) - srv = await asyncio.start_server( handle_client, '127.0.0.1', 0, family=socket.AF_INET, ssl=sslctx, - **extras) + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) try: srv_socks = srv.sockets @@ -322,14 +320,11 @@ def server(sock): sock.close() async def client(addr): - extras = {} - extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) - reader, writer = await asyncio.open_connection( *addr, ssl=client_sslctx, server_hostname='', - **extras) + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) writer.write(A_DATA) self.assertEqual(await reader.readexactly(2), b'OK') @@ -349,7 +344,8 @@ async def client_sock(addr): reader, writer = await asyncio.open_connection( sock=sock, ssl=client_sslctx, - server_hostname='') + server_hostname='', + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) writer.write(A_DATA) self.assertEqual(await reader.readexactly(2), b'OK') @@ -448,7 +444,7 @@ async def client(addr): *addr, ssl=client_sslctx, server_hostname='', - ssl_handshake_timeout=support.SHORT_TIMEOUT) + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) writer.close() await self.wait_closed(writer) @@ -610,7 +606,7 @@ def client(): extras = {} if server_ssl: - extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) + extras = dict(ssl_handshake_timeout=HANDSHAKE_TIMEOUT) f = loop.create_task( loop.connect_accepted_socket( @@ -659,7 +655,8 @@ async def client(addr): reader, writer = await asyncio.open_connection( *addr, ssl=client_sslctx, - server_hostname='') + server_hostname='', + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) self.assertEqual(await reader.readline(), b'A\n') writer.write(b'B') @@ -1152,14 +1149,11 @@ def do(func, *args): await fut async def start_server(): - extras = {} - srv = await self.loop.create_server( server_protocol_factory, '127.0.0.1', 0, family=socket.AF_INET, - ssl=sslctx_1, - **extras) + ssl=sslctx_1) try: srv_socks = srv.sockets @@ -1209,14 +1203,11 @@ def server(sock): sock.close() async def client(addr): - extras = {} - extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) - reader, writer = await asyncio.open_connection( *addr, ssl=client_sslctx, server_hostname='', - **extras) + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) writer.write(A_DATA) self.assertEqual(await reader.readexactly(2), b'OK') @@ -1286,7 +1277,8 @@ async def client(addr): reader, writer = await asyncio.open_connection( *addr, ssl=client_sslctx, - server_hostname='') + server_hostname='', + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) sslprotocol = writer.transport._ssl_protocol writer.write(b'ping') data = await reader.readexactly(4) @@ -1398,7 +1390,8 @@ async def client(addr): reader, writer = await asyncio.open_connection( *addr, ssl=client_sslctx, - server_hostname='') + server_hostname='', + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) writer.write(b'ping') data = await reader.readexactly(4) self.assertEqual(data, b'pong') @@ -1529,7 +1522,8 @@ async def client(addr): reader, writer = await asyncio.open_connection( *addr, ssl=client_sslctx, - server_hostname='') + server_hostname='', + ssl_handshake_timeout=HANDSHAKE_TIMEOUT) writer.write(b'ping') data = await reader.readexactly(4) self.assertEqual(data, b'pong') From acd5b9708222e768fe0d0e1fb6071c6602acb63f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 10 Dec 2025 23:54:28 +0100 Subject: [PATCH 1584/1674] [3.14] gh-137007: Track executor before any possible deallocations (GH-137016) (GH-142541) gh-137007: Track executor before any possible deallocations (GH-137016) (cherry picked from commit 97e19014ddc652beae58e7eceb591f5d65a875e6) Co-authored-by: Ken Jin <kenjin@python.org> --- .../2025-07-22-16-20-06.gh-issue-137007.1oPvvK.rst | 1 + Python/optimizer.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-22-16-20-06.gh-issue-137007.1oPvvK.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-22-16-20-06.gh-issue-137007.1oPvvK.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-22-16-20-06.gh-issue-137007.1oPvvK.rst new file mode 100644 index 00000000000000..cb25fd10c0bd2c --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-22-16-20-06.gh-issue-137007.1oPvvK.rst @@ -0,0 +1 @@ +Fix a bug during JIT compilation failure which caused garbage collection debug assertions to fail. diff --git a/Python/optimizer.c b/Python/optimizer.c index 6679eecd648a85..3a66aeb4f827b3 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1213,6 +1213,10 @@ make_executor_from_uops(_PyUOpInstruction *buffer, int length, const _PyBloomFil assert(next_exit == -1); assert(dest == executor->trace); assert(dest->opcode == _START_EXECUTOR); + // Note: we MUST track it here before any Py_DECREF(executor) or + // linking of executor. Otherwise, the GC tries to untrack a + // still untracked object during dealloc. + _PyObject_GC_TRACK(executor); _Py_ExecutorInit(executor, dependencies); #ifdef Py_DEBUG char *python_lltrace = Py_GETENV("PYTHON_LLTRACE"); @@ -1242,7 +1246,6 @@ make_executor_from_uops(_PyUOpInstruction *buffer, int length, const _PyBloomFil return NULL; } #endif - _PyObject_GC_TRACK(executor); return executor; } From cc705be468adc3f47f85b42f18f010e55f5c0e59 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 02:01:59 +0100 Subject: [PATCH 1585/1674] gh-140172: Skip JSON tools test during PGO training (GH-140809) (cherry picked from commit fa448451abfabe7dbc969ef6468bedc4a8b8ecaf) Co-authored-by: Steve Dower <steve.dower@python.org> --- Lib/test/test_json/test_tool.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 30f9bb3331605c..7b5d217a21558c 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -13,6 +13,7 @@ @support.requires_subprocess() +@support.skip_if_pgo_task class TestMain(unittest.TestCase): data = """ @@ -319,6 +320,7 @@ def test_colors(self): @support.requires_subprocess() +@support.skip_if_pgo_task class TestTool(TestMain): module = 'json.tool' From 82ebdd207fb6b79975635f8f6aab4e3e2bd5b4e4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 03:18:36 +0100 Subject: [PATCH 1586/1674] [3.14] GH-139436: Remove PDF and CHM from IDLE HelpSource (GH-140418) (#142552) GH-139436: Remove PDF and CHM from IDLE HelpSource (GH-140418) (cherry picked from commit c5825ff4c9e26e17224c466db6b3bd49d44c26e0) Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Lib/idlelib/config-main.def | 5 ++--- Lib/idlelib/editor.py | 13 ------------- Lib/idlelib/query.py | 2 -- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def index 28ae94161d5c03..54bdce34af31e0 100644 --- a/Lib/idlelib/config-main.def +++ b/Lib/idlelib/config-main.def @@ -34,9 +34,8 @@ # relevant settings from the default file. # # Additional help sources are listed in the [HelpFiles] section below -# and should be viewable by a web browser (or the Windows Help viewer in -# the case of .chm files). These sources will be listed on the Help -# menu. The pattern, and two examples, are: +# and should be viewable by a web browser. These sources will be listed +# on the Help menu. The pattern, and two examples, are: # # <sequence_number = menu item;/path/to/help/source> # 1 = IDLE;C:/Programs/Python36/Lib/idlelib/help.html diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 83112d85575e47..3128934763a1c0 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -35,19 +35,6 @@ TK_TABWIDTH_DEFAULT = 8 darwin = sys.platform == 'darwin' -def _sphinx_version(): - "Format sys.version_info to produce the Sphinx version string used to install the chm docs" - major, minor, micro, level, serial = sys.version_info - # TODO remove unneeded function since .chm no longer installed - release = f'{major}{minor}' - release += f'{micro}' - if level == 'candidate': - release += f'rc{serial}' - elif level != 'final': - release += f'{level[0]}{serial}' - return release - - class EditorWindow: from idlelib.percolator import Percolator from idlelib.colorizer import ColorDelegator, color_config diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index 57230e2aaca66d..5f9bdc031e544b 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -289,8 +289,6 @@ def askfilename(self, filetypes, initdir, initfile): # htest # def browse_file(self): filetypes = [ ("HTML Files", "*.htm *.html", "TEXT"), - ("PDF Files", "*.pdf", "TEXT"), - ("Windows Help Files", "*.chm"), ("Text Files", "*.txt", "TEXT"), ("All Files", "*")] path = self.pathvar.get() From b317c60e04d5afb00bce0fd798bc257c28e5a385 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Thu, 11 Dec 2025 07:16:13 +0000 Subject: [PATCH 1587/1674] [3.14] gh-142278: Add granular change detection for platforms in CI (GH-142350) (#142537) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/build.yml | 54 +++++++--------- .github/workflows/reusable-context.yml | 32 ++++++++-- Tools/build/compute-changes.py | 87 ++++++++++++++++++++++++-- 3 files changed, 129 insertions(+), 44 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 56eb876ee3f384..b3b98ba3ba62f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -238,7 +238,7 @@ jobs: macOS ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-macos == 'true' strategy: fail-fast: false matrix: @@ -264,7 +264,7 @@ jobs: ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} ${{ fromJSON(matrix.bolt) && '(bolt)' || '' }} needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ubuntu == 'true' strategy: fail-fast: false matrix: @@ -295,7 +295,7 @@ jobs: runs-on: ${{ matrix.os }} timeout-minutes: 60 needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ubuntu == 'true' strategy: fail-fast: false matrix: @@ -349,7 +349,7 @@ jobs: build-android: name: Android (${{ matrix.arch }}) needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-android == 'true' timeout-minutes: 60 strategy: fail-fast: false @@ -371,7 +371,7 @@ jobs: build-ios: name: iOS needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ios == 'true' timeout-minutes: 60 runs-on: macos-14 steps: @@ -394,7 +394,7 @@ jobs: build-wasi: name: 'WASI' needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-wasi == 'true' uses: ./.github/workflows/reusable-wasi.yml test-hypothesis: @@ -402,7 +402,7 @@ jobs: runs-on: ubuntu-24.04 timeout-minutes: 60 needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ubuntu == 'true' env: OPENSSL_VER: 3.0.18 PYTHONSTRICTEXTENSIONBUILD: 1 @@ -509,7 +509,7 @@ jobs: runs-on: ${{ matrix.os }} timeout-minutes: 60 needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ubuntu == 'true' strategy: fail-fast: false matrix: @@ -562,7 +562,7 @@ jobs: # ${{ '' } is a hack to nest jobs under the same sidebar category. name: Sanitizers${{ '' }} # zizmor: ignore[obfuscation] needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ubuntu == 'true' strategy: fail-fast: false matrix: @@ -587,7 +587,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 needs: build-context - if: needs.build-context.outputs.run-tests == 'true' + if: needs.build-context.outputs.run-ubuntu == 'true' steps: - uses: actions/checkout@v4 with: @@ -691,24 +691,23 @@ jobs: test-hypothesis, cifuzz, allowed-skips: >- + ${{ !fromJSON(needs.build-context.outputs.run-docs) && 'check-docs,' || '' }} ${{ - !fromJSON(needs.build-context.outputs.run-docs) + needs.build-context.outputs.run-tests != 'true' && ' - check-docs, + check-autoconf-regen, + check-generated-files, ' || '' }} + ${{ !fromJSON(needs.build-context.outputs.run-windows-tests) && 'build-windows,' || '' }} + ${{ !fromJSON(needs.build-context.outputs.run-ci-fuzz) && 'cifuzz,' || '' }} + ${{ !fromJSON(needs.build-context.outputs.run-macos) && 'build-macos,' || '' }} ${{ - needs.build-context.outputs.run-tests != 'true' + !fromJSON(needs.build-context.outputs.run-ubuntu) && ' - check-autoconf-regen, - check-generated-files, - build-macos, build-ubuntu, build-ubuntu-ssltests, - build-android, - build-ios, - build-wasi, test-hypothesis, build-asan, build-san, @@ -716,18 +715,7 @@ jobs: ' || '' }} - ${{ - !fromJSON(needs.build-context.outputs.run-windows-tests) - && ' - build-windows, - ' - || '' - }} - ${{ - !fromJSON(needs.build-context.outputs.run-ci-fuzz) - && ' - cifuzz, - ' - || '' - }} + ${{ !fromJSON(needs.build-context.outputs.run-android) && 'build-android,' || '' }} + ${{ !fromJSON(needs.build-context.outputs.run-ios) && 'build-ios,' || '' }} + ${{ !fromJSON(needs.build-context.outputs.run-wasi) && 'build-wasi,' || '' }} jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/reusable-context.yml b/.github/workflows/reusable-context.yml index 66c7cc47de03fb..ce5562f2d51fbb 100644 --- a/.github/workflows/reusable-context.yml +++ b/.github/workflows/reusable-context.yml @@ -17,21 +17,36 @@ on: # yamllint disable-line rule:truthy # || 'falsy-branch' # }} # + run-android: + description: Whether to run the Android tests + value: ${{ jobs.compute-changes.outputs.run-android }} # bool + run-ci-fuzz: + description: Whether to run the CIFuzz job + value: ${{ jobs.compute-changes.outputs.run-ci-fuzz }} # bool run-docs: description: Whether to build the docs value: ${{ jobs.compute-changes.outputs.run-docs }} # bool + run-ios: + description: Whether to run the iOS tests + value: ${{ jobs.compute-changes.outputs.run-ios }} # bool + run-macos: + description: Whether to run the macOS tests + value: ${{ jobs.compute-changes.outputs.run-macos }} # bool run-tests: description: Whether to run the regular tests value: ${{ jobs.compute-changes.outputs.run-tests }} # bool - run-windows-tests: - description: Whether to run the Windows tests - value: ${{ jobs.compute-changes.outputs.run-windows-tests }} # bool + run-ubuntu: + description: Whether to run the Ubuntu tests + value: ${{ jobs.compute-changes.outputs.run-ubuntu }} # bool + run-wasi: + description: Whether to run the WASI tests + value: ${{ jobs.compute-changes.outputs.run-wasi }} # bool run-windows-msi: description: Whether to run the MSI installer smoke tests value: ${{ jobs.compute-changes.outputs.run-windows-msi }} # bool - run-ci-fuzz: - description: Whether to run the CIFuzz job - value: ${{ jobs.compute-changes.outputs.run-ci-fuzz }} # bool + run-windows-tests: + description: Whether to run the Windows tests + value: ${{ jobs.compute-changes.outputs.run-windows-tests }} # bool jobs: compute-changes: @@ -39,9 +54,14 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 outputs: + run-android: ${{ steps.changes.outputs.run-android }} run-ci-fuzz: ${{ steps.changes.outputs.run-ci-fuzz }} run-docs: ${{ steps.changes.outputs.run-docs }} + run-ios: ${{ steps.changes.outputs.run-ios }} + run-macos: ${{ steps.changes.outputs.run-macos }} run-tests: ${{ steps.changes.outputs.run-tests }} + run-ubuntu: ${{ steps.changes.outputs.run-ubuntu }} + run-wasi: ${{ steps.changes.outputs.run-wasi }} run-windows-msi: ${{ steps.changes.outputs.run-windows-msi }} run-windows-tests: ${{ steps.changes.outputs.run-windows-tests }} steps: diff --git a/Tools/build/compute-changes.py b/Tools/build/compute-changes.py index b5993d29b92972..524d3066fbffa7 100644 --- a/Tools/build/compute-changes.py +++ b/Tools/build/compute-changes.py @@ -45,12 +45,22 @@ SUFFIXES_C_OR_CPP = frozenset({".c", ".h", ".cpp"}) SUFFIXES_DOCUMENTATION = frozenset({".rst", ".md"}) +ANDROID_DIRS = frozenset({"Android"}) +IOS_DIRS = frozenset({"Apple", "iOS"}) +MACOS_DIRS = frozenset({"Mac"}) +WASI_DIRS = frozenset({Path("Tools", "wasm")}) + @dataclass(kw_only=True, slots=True) class Outputs: + run_android: bool = False run_ci_fuzz: bool = False run_docs: bool = False + run_ios: bool = False + run_macos: bool = False run_tests: bool = False + run_ubuntu: bool = False + run_wasi: bool = False run_windows_msi: bool = False run_windows_tests: bool = False @@ -63,7 +73,15 @@ def compute_changes() -> None: outputs = process_changed_files(files) else: # Otherwise, just run the tests - outputs = Outputs(run_tests=True, run_windows_tests=True) + outputs = Outputs( + run_android=True, + run_ios=True, + run_macos=True, + run_tests=True, + run_ubuntu=True, + run_wasi=True, + run_windows_tests=True, + ) outputs = process_target_branch(outputs, target_branch) if outputs.run_tests: @@ -111,6 +129,21 @@ def get_changed_files( return frozenset(map(Path, filter(None, map(str.strip, changed_files)))) +def get_file_platform(file: Path) -> str | None: + if not file.parts: + return None + first_part = file.parts[0] + if first_part in MACOS_DIRS: + return "macos" + if first_part in IOS_DIRS: + return "ios" + if first_part in ANDROID_DIRS: + return "android" + if len(file.parts) >= 2 and Path(*file.parts[:2]) in WASI_DIRS: # Tools/wasm/ + return "wasi" + return None + + def process_changed_files(changed_files: Set[Path]) -> Outputs: run_tests = False run_ci_fuzz = False @@ -118,6 +151,9 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs: run_windows_tests = False run_windows_msi = False + platforms_changed = set() + has_platform_specific_change = True + for file in changed_files: # Documentation files doc_or_misc = file.parts[0] in {"Doc", "Misc"} @@ -126,10 +162,15 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs: if file.parent == GITHUB_WORKFLOWS_PATH: if file.name == "build.yml": run_tests = run_ci_fuzz = True + has_platform_specific_change = False if file.name == "reusable-docs.yml": run_docs = True if file.name == "reusable-windows-msi.yml": run_windows_msi = True + if file.name == "reusable-macos.yml": + platforms_changed.add("macos") + if file.name == "reusable-wasi.yml": + platforms_changed.add("wasi") if not ( doc_file @@ -138,8 +179,13 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs: ): run_tests = True - if file not in UNIX_BUILD_SYSTEM_FILE_NAMES: - run_windows_tests = True + platform = get_file_platform(file) + if platform is not None: + platforms_changed.add(platform) + else: + has_platform_specific_change = False + if file not in UNIX_BUILD_SYSTEM_FILE_NAMES: + run_windows_tests = True # The fuzz tests are pretty slow so they are executed only for PRs # changing relevant files. @@ -159,12 +205,38 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs: if file.parts[:2] == ("Tools", "msi"): run_windows_msi = True + # Check which platform specific tests to run + if run_tests: + if not has_platform_specific_change or not platforms_changed: + run_android = True + run_ios = True + run_macos = True + run_ubuntu = True + run_wasi = True + else: + run_android = "android" in platforms_changed + run_ios = "ios" in platforms_changed + run_macos = "macos" in platforms_changed + run_ubuntu = False + run_wasi = "wasi" in platforms_changed + else: + run_android = False + run_ios = False + run_macos = False + run_ubuntu = False + run_wasi = False + return Outputs( + run_android=run_android, run_ci_fuzz=run_ci_fuzz, run_docs=run_docs, + run_ios=run_ios, + run_macos=run_macos, run_tests=run_tests, - run_windows_tests=run_windows_tests, + run_ubuntu=run_ubuntu, + run_wasi=run_wasi, run_windows_msi=run_windows_msi, + run_windows_tests=run_windows_tests, ) @@ -191,11 +263,16 @@ def write_github_output(outputs: Outputs) -> None: return with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as f: + f.write(f"run-android={bool_lower(outputs.run_android)}\n") f.write(f"run-ci-fuzz={bool_lower(outputs.run_ci_fuzz)}\n") f.write(f"run-docs={bool_lower(outputs.run_docs)}\n") + f.write(f"run-ios={bool_lower(outputs.run_ios)}\n") + f.write(f"run-macos={bool_lower(outputs.run_macos)}\n") f.write(f"run-tests={bool_lower(outputs.run_tests)}\n") - f.write(f"run-windows-tests={bool_lower(outputs.run_windows_tests)}\n") + f.write(f"run-ubuntu={bool_lower(outputs.run_ubuntu)}\n") + f.write(f"run-wasi={bool_lower(outputs.run_wasi)}\n") f.write(f"run-windows-msi={bool_lower(outputs.run_windows_msi)}\n") + f.write(f"run-windows-tests={bool_lower(outputs.run_windows_tests)}\n") def bool_lower(value: bool, /) -> str: From 7218be0199932413c05e39f68cdc4ad27a282867 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 11:00:44 +0100 Subject: [PATCH 1588/1674] [3.14] gh-142556: fix crash when a task gets re-registered during finalization in `asyncio` (GH-142565) (#142566) gh-142556: fix crash when a task gets re-registered during finalization in `asyncio` (GH-142565) (cherry picked from commit 42d2bedb875f42f0580ee2cfb4bd80a5a229bbd4) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- Lib/test/test_asyncio/test_tasks.py | 23 +++++++++++++++++++ ...-12-11-09-03-07.gh-issue-142556.RuiBte.rst | 1 + Modules/_asynciomodule.c | 14 ++++------- 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-11-09-03-07.gh-issue-142556.RuiBte.rst diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 9809621a324450..a3c5351fed0252 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -3045,6 +3045,26 @@ class BaseTaskIntrospectionTests: _enter_task = None _leave_task = None all_tasks = None + Task = None + + def test_register_task_resurrection(self): + register_task = self._register_task + class EvilLoop: + def get_debug(self): + return False + + def call_exception_handler(self, context): + register_task(context["task"]) + + async def coro_fn (): + pass + + coro = coro_fn() + self.addCleanup(coro.close) + loop = EvilLoop() + with self.assertRaises(AttributeError): + self.Task(coro, loop=loop) + def test__register_task_1(self): class TaskLike: @@ -3175,6 +3195,7 @@ class PyIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests): _leave_task = staticmethod(tasks._py_leave_task) all_tasks = staticmethod(tasks._py_all_tasks) current_task = staticmethod(tasks._py_current_task) + Task = tasks._PyTask @unittest.skipUnless(hasattr(tasks, '_c_register_task'), @@ -3187,10 +3208,12 @@ class CIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests): _leave_task = staticmethod(tasks._c_leave_task) all_tasks = staticmethod(tasks._c_all_tasks) current_task = staticmethod(tasks._c_current_task) + Task = tasks._CTask else: _register_task = _unregister_task = _enter_task = _leave_task = None + class BaseCurrentLoopTests: current_task = None diff --git a/Misc/NEWS.d/next/Library/2025-12-11-09-03-07.gh-issue-142556.RuiBte.rst b/Misc/NEWS.d/next/Library/2025-12-11-09-03-07.gh-issue-142556.RuiBte.rst new file mode 100644 index 00000000000000..782e62b65a36f3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-11-09-03-07.gh-issue-142556.RuiBte.rst @@ -0,0 +1 @@ +Fix crash when a task gets re-registered during finalization in :mod:`asyncio`. Patch by Kumar Aditya. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 5f9181395c4828..7ff3aeff2c7669 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -2990,16 +2990,12 @@ static PyType_Spec Task_spec = { static void TaskObj_dealloc(PyObject *self) { - _PyObject_ResurrectStart(self); - // Unregister the task here so that even if any subclass of Task - // which doesn't end up calling TaskObj_finalize not crashes. - unregister_task((TaskObj *)self); - - PyObject_CallFinalizer(self); - - if (_PyObject_ResurrectEnd(self)) { - return; + if (PyObject_CallFinalizerFromDealloc(self) < 0) { + return; // resurrected } + // unregister the task after finalization so that + // if the task gets resurrected, it remains registered + unregister_task((TaskObj *)self); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); From fc40e7dc52c0b578d873f7fff7c0f709bf5c5aab Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 18:32:11 +0100 Subject: [PATCH 1589/1674] [3.14] Fix os.posix_spawn() error handling (GH-142532) (#142582) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix os.posix_spawn() error handling (GH-142532) Consistently use `goto exit;` in `py_posix_spawn()`. (cherry picked from commit 8cfa351560487d472df4c7d841814801fbf57397) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> --- Modules/posixmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6e878e3de37291..e11f16d0940f5e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7447,7 +7447,7 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a if (argc < 1) { PyErr_Format(PyExc_ValueError, "%s: argv must not be empty", func_name); - return NULL; + goto exit; } if (!PyMapping_Check(env) && env != Py_None) { From 65d07f1948139a72f1cf52737a90637116b9f13d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 18:48:26 +0100 Subject: [PATCH 1590/1674] [3.14] Use subcommand over sub-command in argparse docs (GH-142488) (#142587) Use subcommand over sub-command in argparse docs (GH-142488) (cherry picked from commit 387f88cac1e911672f6321f4fbb0a3af9710626d) Co-authored-by: Savannah Ostrowski <savannah@python.org> --- Doc/library/argparse.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index f64ace037f6975..413920ef1e1732 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1669,7 +1669,7 @@ The Namespace object Other utilities --------------- -Sub-commands +Subcommands ^^^^^^^^^^^^ .. method:: ArgumentParser.add_subparsers(*, [title], [description], [prog], \ @@ -1698,7 +1698,7 @@ Sub-commands * *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 subcommand help, by default the name of the program and any positional arguments before the subparser argument @@ -1708,7 +1708,7 @@ Sub-commands * action_ - the basic type of action to be taken when this argument is encountered at the command line - * dest_ - name of the attribute under which sub-command name will be + * dest_ - name of the attribute under which subcommand name will be stored; by default ``None`` and no value is stored * required_ - Whether or not a subcommand must be provided, by default From e09c4deb254a85ef2be7a0a636c2845688c915ad Mon Sep 17 00:00:00 2001 From: Petr Viktorin <encukou@gmail.com> Date: Thu, 11 Dec 2025 19:51:11 +0100 Subject: [PATCH 1591/1674] [3.14] gh-123241: Don't modify ref count during visitation (GH-142232) (#142567) (cherry picked from commit da8199f8842c2830fa4015138725849863523de4) Co-authored-by: Dino Viehland <dinoviehland@meta.com> --- Include/internal/pycore_typeobject.h | 5 +++ ...-12-10-11-20-05.gh-issue-123241.oYg2n7.rst | 2 + Modules/_ctypes/ctypes.h | 14 +++---- Objects/typeobject.c | 42 +++++++++++++------ 4 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-10-11-20-05.gh-issue-123241.oYg2n7.rst diff --git a/Include/internal/pycore_typeobject.h b/Include/internal/pycore_typeobject.h index 1a4f89fd2449a0..ba66364d3e94b1 100644 --- a/Include/internal/pycore_typeobject.h +++ b/Include/internal/pycore_typeobject.h @@ -149,6 +149,11 @@ typedef int (*_py_validate_type)(PyTypeObject *); extern int _PyType_Validate(PyTypeObject *ty, _py_validate_type validate, unsigned int *tp_version); extern int _PyType_CacheGetItemForSpecialization(PyHeapTypeObject *ht, PyObject *descriptor, uint32_t tp_version); +// Like PyType_GetBaseByToken, but does not modify refcounts. +// Cannot fail; arguments must be valid. +PyAPI_FUNC(int) +_PyType_GetBaseByToken_Borrow(PyTypeObject *type, void *token, PyTypeObject **result); + #ifdef __cplusplus } #endif diff --git a/Misc/NEWS.d/next/Library/2025-12-10-11-20-05.gh-issue-123241.oYg2n7.rst b/Misc/NEWS.d/next/Library/2025-12-10-11-20-05.gh-issue-123241.oYg2n7.rst new file mode 100644 index 00000000000000..871a03a6fd1021 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-10-11-20-05.gh-issue-123241.oYg2n7.rst @@ -0,0 +1,2 @@ +Avoid reference count operations in garbage collection of :mod:`ctypes` +objects. diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index f8389f98fec780..78a33fea0192c2 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -596,7 +596,8 @@ PyStgInfo_FromAny(ctypes_state *state, PyObject *obj, StgInfo **result) return _stginfo_from_type(state, Py_TYPE(obj), result); } -/* A variant of PyStgInfo_FromType that doesn't need the state, +/* A variant of PyStgInfo_FromType that doesn't need the state + * and doesn't modify any refcounts, * so it can be called from finalization functions when the module * state is torn down. */ @@ -604,17 +605,12 @@ static inline StgInfo * _PyStgInfo_FromType_NoState(PyObject *type) { PyTypeObject *PyCType_Type; - if (PyType_GetBaseByToken(Py_TYPE(type), &pyctype_type_spec, &PyCType_Type) < 0) { - return NULL; - } - if (PyCType_Type == NULL) { - PyErr_Format(PyExc_TypeError, "expected a ctypes type, got '%N'", type); + if (_PyType_GetBaseByToken_Borrow(Py_TYPE(type), &pyctype_type_spec, &PyCType_Type) < 0 || + PyCType_Type == NULL) { return NULL; } - StgInfo *info = PyObject_GetTypeData(type, PyCType_Type); - Py_DECREF(PyCType_Type); - return info; + return PyObject_GetTypeData(type, PyCType_Type); } // Initialize StgInfo on a newly created type diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 05d12bf6bbaf5c..adbc0743161326 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5533,23 +5533,15 @@ get_base_by_token_recursive(PyObject *bases, void *token) } int -PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result) +_PyType_GetBaseByToken_Borrow(PyTypeObject *type, void *token, PyTypeObject **result) { + assert(token != NULL); + assert(PyType_Check(type)); + if (result != NULL) { *result = NULL; } - if (token == NULL) { - PyErr_Format(PyExc_SystemError, - "PyType_GetBaseByToken called with token=NULL"); - return -1; - } - if (!PyType_Check(type)) { - PyErr_Format(PyExc_TypeError, - "expected a type, got a '%T' object", type); - return -1; - } - if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) { // No static type has a heaptype superclass, // which is ensured by type_ready_mro(). @@ -5558,7 +5550,7 @@ PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result) if (((PyHeapTypeObject*)type)->ht_token == token) { found: if (result != NULL) { - *result = (PyTypeObject *)Py_NewRef(type); + *result = type; } return 1; } @@ -5592,6 +5584,30 @@ PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result) return 0; } +int +PyType_GetBaseByToken(PyTypeObject *type, void *token, PyTypeObject **result) +{ + if (result != NULL) { + *result = NULL; + } + if (token == NULL) { + PyErr_Format(PyExc_SystemError, + "PyType_GetBaseByToken called with token=NULL"); + return -1; + } + if (!PyType_Check(type)) { + PyErr_Format(PyExc_TypeError, + "expected a type, got a '%T' object", type); + return -1; + } + + int res = _PyType_GetBaseByToken_Borrow(type, token, result); + if (res > 0 && result) { + Py_INCREF(*result); + } + return res; +} + void * PyObject_GetTypeData(PyObject *obj, PyTypeObject *cls) From 12d2b95adff88a3395227ec7b28b2c81d879f455 Mon Sep 17 00:00:00 2001 From: Sam Gross <colesbury@gmail.com> Date: Thu, 11 Dec 2025 15:08:45 -0500 Subject: [PATCH 1592/1674] [3.14] gh-142589: Fix PyUnstable_Object_IsUniqueReferencedTemporary (gh-142593) (#142597) PyUnstable_Object_IsUniqueReferencedTemporary wasn't handling tagged ints on the evaluation stack properly. (cherry picked from commit a26c831bc486b6e607cee6a5923bad52b97c2341) --- Lib/test/test_capi/test_object.py | 7 +++++++ .../2025-12-11-13-01-49.gh-issue-142589.nNAqgw.rst | 2 ++ Modules/_testcapi/object.c | 10 ++++++++++ Objects/object.c | 8 ++++++-- 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-12-11-13-01-49.gh-issue-142589.nNAqgw.rst diff --git a/Lib/test/test_capi/test_object.py b/Lib/test/test_capi/test_object.py index 98a9a096cfee4d..807b62c19863e7 100644 --- a/Lib/test/test_capi/test_object.py +++ b/Lib/test/test_capi/test_object.py @@ -247,5 +247,12 @@ def func(x): func(object()) + # Test that a newly created object in C is not considered + # a uniquely referenced temporary, because it's not on the stack. + # gh-142586: do the test in a loop over a list to test for handling + # tagged ints on the stack. + for i in [0, 1, 2]: + self.assertFalse(_testcapi.pyobject_is_unique_temporary_new_object()) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/C_API/2025-12-11-13-01-49.gh-issue-142589.nNAqgw.rst b/Misc/NEWS.d/next/C_API/2025-12-11-13-01-49.gh-issue-142589.nNAqgw.rst new file mode 100644 index 00000000000000..529277b951ada3 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-12-11-13-01-49.gh-issue-142589.nNAqgw.rst @@ -0,0 +1,2 @@ +Fix :c:func:`PyUnstable_Object_IsUniqueReferencedTemporary()` handling of +tagged ints on the interpreter stack. diff --git a/Modules/_testcapi/object.c b/Modules/_testcapi/object.c index 798ef97c495aeb..4d53b3c678a470 100644 --- a/Modules/_testcapi/object.c +++ b/Modules/_testcapi/object.c @@ -138,6 +138,15 @@ pyobject_is_unique_temporary(PyObject *self, PyObject *obj) return PyLong_FromLong(result); } +static PyObject * +pyobject_is_unique_temporary_new_object(PyObject *self, PyObject *unused) +{ + PyObject *obj = PyList_New(0); + int result = PyUnstable_Object_IsUniqueReferencedTemporary(obj); + Py_DECREF(obj); + return PyLong_FromLong(result); +} + static int MyObject_dealloc_called = 0; static void @@ -493,6 +502,7 @@ static PyMethodDef test_methods[] = { {"pyobject_clear_weakrefs_no_callbacks", pyobject_clear_weakrefs_no_callbacks, METH_O}, {"pyobject_enable_deferred_refcount", pyobject_enable_deferred_refcount, METH_O}, {"pyobject_is_unique_temporary", pyobject_is_unique_temporary, METH_O}, + {"pyobject_is_unique_temporary_new_object", pyobject_is_unique_temporary_new_object, METH_NOARGS}, {"test_py_try_inc_ref", test_py_try_inc_ref, METH_NOARGS}, {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS}, {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS}, diff --git a/Objects/object.c b/Objects/object.c index 8dc3ab9643cbb2..b88110faf921a3 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2631,8 +2631,12 @@ PyUnstable_Object_IsUniqueReferencedTemporary(PyObject *op) _PyStackRef *stackpointer = frame->stackpointer; while (stackpointer > base) { stackpointer--; - if (op == PyStackRef_AsPyObjectBorrow(*stackpointer)) { - return PyStackRef_IsHeapSafe(*stackpointer); + _PyStackRef ref = *stackpointer; + if (PyStackRef_IsTaggedInt(ref)) { + continue; + } + if (op == PyStackRef_AsPyObjectBorrow(ref)) { + return PyStackRef_IsHeapSafe(ref); } } return 0; From b868f1414c5fec33664e49e60738498e1443f36c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 22:51:02 +0100 Subject: [PATCH 1593/1674] [3.14] gh-142534: Avoid TSan warnings in dictobject.c (gh-142544) (gh-142603) There are places we use "relaxed" loads where C11 requires "consume" or stronger. Unfortunately, compilers don't really implement "consume" so fake it for our use in a way that avoids upsetting TSan. (cherry picked from commit 0a62f8277e9a0dd9f34b0b070adb83994e81b2a8) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Include/cpython/pyatomic.h | 11 +++++++++++ Include/internal/pycore_pyatomic_ft_wrappers.h | 3 +++ Objects/dictobject.c | 12 ++++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Include/cpython/pyatomic.h b/Include/cpython/pyatomic.h index 2a0c11e7b3ad66..790640309f1e03 100644 --- a/Include/cpython/pyatomic.h +++ b/Include/cpython/pyatomic.h @@ -591,6 +591,17 @@ static inline void _Py_atomic_fence_release(void); // --- aliases --------------------------------------------------------------- +// Compilers don't really support "consume" semantics, so we fake it. Use +// "acquire" with TSan to support false positives. Use "relaxed" otherwise, +// because CPUs on all platforms we support respect address dependencies without +// extra barriers. +// See 2.6.7 in https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2055r0.pdf +#if defined(_Py_THREAD_SANITIZER) +# define _Py_atomic_load_ptr_consume _Py_atomic_load_ptr_acquire +#else +# define _Py_atomic_load_ptr_consume _Py_atomic_load_ptr_relaxed +#endif + #if SIZEOF_LONG == 8 # define _Py_atomic_load_ulong(p) \ _Py_atomic_load_uint64((uint64_t *)p) diff --git a/Include/internal/pycore_pyatomic_ft_wrappers.h b/Include/internal/pycore_pyatomic_ft_wrappers.h index 223ee951e4bcc2..4187f46995e2c3 100644 --- a/Include/internal/pycore_pyatomic_ft_wrappers.h +++ b/Include/internal/pycore_pyatomic_ft_wrappers.h @@ -31,6 +31,8 @@ extern "C" { _Py_atomic_store_ptr(&value, new_value) #define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) \ _Py_atomic_load_ptr_acquire(&value) +#define FT_ATOMIC_LOAD_PTR_CONSUME(value) \ + _Py_atomic_load_ptr_consume(&value) #define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) \ _Py_atomic_load_uintptr_acquire(&value) #define FT_ATOMIC_LOAD_PTR_RELAXED(value) \ @@ -123,6 +125,7 @@ extern "C" { #define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) value #define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) value #define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) value +#define FT_ATOMIC_LOAD_PTR_CONSUME(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 diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 0eb00410cf41eb..62be2c53d670ef 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1082,7 +1082,7 @@ compare_unicode_unicode(PyDictObject *mp, PyDictKeysObject *dk, void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash) { PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix]; - PyObject *ep_key = FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_key); + PyObject *ep_key = FT_ATOMIC_LOAD_PTR_CONSUME(ep->me_key); assert(ep_key != NULL); assert(PyUnicode_CheckExact(ep_key)); if (ep_key == key || @@ -1375,7 +1375,7 @@ compare_unicode_generic_threadsafe(PyDictObject *mp, PyDictKeysObject *dk, void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash) { PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix]; - PyObject *startkey = _Py_atomic_load_ptr_relaxed(&ep->me_key); + PyObject *startkey = _Py_atomic_load_ptr_consume(&ep->me_key); assert(startkey == NULL || PyUnicode_CheckExact(ep->me_key)); assert(!PyUnicode_CheckExact(key)); @@ -1418,7 +1418,7 @@ compare_unicode_unicode_threadsafe(PyDictObject *mp, PyDictKeysObject *dk, void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash) { PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix]; - PyObject *startkey = _Py_atomic_load_ptr_relaxed(&ep->me_key); + PyObject *startkey = _Py_atomic_load_ptr_consume(&ep->me_key); if (startkey == key) { assert(PyUnicode_CheckExact(startkey)); return 1; @@ -1454,7 +1454,7 @@ compare_generic_threadsafe(PyDictObject *mp, PyDictKeysObject *dk, void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash) { PyDictKeyEntry *ep = &((PyDictKeyEntry *)ep0)[ix]; - PyObject *startkey = _Py_atomic_load_ptr_relaxed(&ep->me_key); + PyObject *startkey = _Py_atomic_load_ptr_consume(&ep->me_key); if (startkey == key) { return 1; } @@ -5519,7 +5519,7 @@ dictiter_iternext_threadsafe(PyDictObject *d, PyObject *self, k = _Py_atomic_load_ptr_acquire(&d->ma_keys); assert(i >= 0); if (_PyDict_HasSplitTable(d)) { - PyDictValues *values = _Py_atomic_load_ptr_relaxed(&d->ma_values); + PyDictValues *values = _Py_atomic_load_ptr_consume(&d->ma_values); if (values == NULL) { goto concurrent_modification; } @@ -7111,7 +7111,7 @@ _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, PyObject **attr Py_BEGIN_CRITICAL_SECTION(dict); if (dict->ma_values == values && FT_ATOMIC_LOAD_UINT8(values->valid)) { - value = _Py_atomic_load_ptr_relaxed(&values->values[ix]); + value = _Py_atomic_load_ptr_consume(&values->values[ix]); *attr = _Py_XNewRefWithLock(value); success = true; } else { From c3fbe286c0ec549b5f468c59ae0d479dc5e6f149 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 11 Dec 2025 23:13:36 +0100 Subject: [PATCH 1594/1674] [3.14] gh-142571: Check for errors before calling each syscall in `PyUnstable_CopyPerfMapFile()` (GH-142460) (#142600) Co-authored-by: AZero13 <gfunni234@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Victor Stinner <vstinner@python.org> Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com> --- ...-12-11-09-06-36.gh-issue-142571.Csdxnn.rst | 1 + Python/sysmodule.c | 23 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C_API/2025-12-11-09-06-36.gh-issue-142571.Csdxnn.rst diff --git a/Misc/NEWS.d/next/C_API/2025-12-11-09-06-36.gh-issue-142571.Csdxnn.rst b/Misc/NEWS.d/next/C_API/2025-12-11-09-06-36.gh-issue-142571.Csdxnn.rst new file mode 100644 index 00000000000000..ea419b4fe1d6b0 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-12-11-09-06-36.gh-issue-142571.Csdxnn.rst @@ -0,0 +1 @@ +:c:func:`!PyUnstable_CopyPerfMapFile` now checks that opening the file succeeded before flushing. diff --git a/Python/sysmodule.c b/Python/sysmodule.c index a7280c0da2e87c..545b130836e26c 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2786,20 +2786,31 @@ PyAPI_FUNC(int) PyUnstable_CopyPerfMapFile(const char* parent_filename) { } char buf[4096]; PyThread_acquire_lock(perf_map_state.map_lock, 1); - int fflush_result = 0, result = 0; + int result = 0; while (1) { size_t bytes_read = fread(buf, 1, sizeof(buf), from); + if (bytes_read == 0) { + if (ferror(from)) { + result = -1; + } + break; + } + size_t bytes_written = fwrite(buf, 1, bytes_read, perf_map_state.perf_map); - fflush_result = fflush(perf_map_state.perf_map); - if (fflush_result != 0 || bytes_read == 0 || bytes_written < bytes_read) { + if (bytes_written < bytes_read) { result = -1; - goto close_and_release; + break; } + + if (fflush(perf_map_state.perf_map) != 0) { + result = -1; + break; + } + if (bytes_read < sizeof(buf) && feof(from)) { - goto close_and_release; + break; } } -close_and_release: fclose(from); PyThread_release_lock(perf_map_state.map_lock); return result; From 8e496013b287a7f60c9cee71f4321dddc0776b61 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:38:09 +0100 Subject: [PATCH 1595/1674] [3.14] gh-142627: Ignore anonymous mappings in Linux remote debugging (GH-142628) (#142630) gh-142627: Ignore anonymous mappings in Linux remote debugging (GH-142628) (cherry picked from commit e0bca091a4f112b9f0beb4ce19dfac2a7fc50342) Co-authored-by: Victor Stinner <vstinner@python.org> --- Python/remote_debug.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Python/remote_debug.h b/Python/remote_debug.h index 8f9b6cd4c4960f..ed213859a8afab 100644 --- a/Python/remote_debug.h +++ b/Python/remote_debug.h @@ -720,6 +720,11 @@ search_linux_map_for_section(proc_handle_t *handle, const char* secname, const c } const char *path = line + path_pos; + if (path[0] == '[' && path[strlen(path)-1] == ']') { + // Skip [heap], [stack], [anon:cpython:pymalloc], etc. + continue; + } + const char *filename = strrchr(path, '/'); if (filename) { filename++; // Move past the '/' From 5e425c3f9629edf7e7cbade2e4cd29834eb9d4fa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:08:08 +0100 Subject: [PATCH 1596/1674] [3.14] gh-142353: Isolate tests from personal GNU Readline init files (GH-142370) (#142634) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-142353: Isolate tests from personal GNU Readline init files (GH-142370) Isolate tests from personal Readline init files using `INPUTRC=/dev/null` trick. (cherry picked from commit f564654bae79c69e3de40dadbec2399f1423ffcf) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> Co-authored-by: Victor Stinner <vstinner@python.org> --- Lib/test/support/pty_helper.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Lib/test/support/pty_helper.py b/Lib/test/support/pty_helper.py index 6587fd40333c51..dbe7fa429096fc 100644 --- a/Lib/test/support/pty_helper.py +++ b/Lib/test/support/pty_helper.py @@ -15,6 +15,14 @@ def run_pty(script, input=b"dummy input\r", env=None): output = bytearray() [master, slave] = pty.openpty() args = (sys.executable, '-c', script) + + # Isolate readline from personal init files by setting INPUTRC + # to an empty file. See also GH-142353. + if env is None: + env = {**os.environ.copy(), "INPUTRC": os.devnull} + else: + env.setdefault("INPUTRC", os.devnull) + proc = subprocess.Popen(args, stdin=slave, stdout=slave, stderr=slave, env=env) os.close(slave) with ExitStack() as cleanup: From ebeb07f1324f988331e8c3ce5fa98d5c54eec364 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:11:43 +0100 Subject: [PATCH 1597/1674] [3.14] gh-141370: Fix undefined behavior when using Py_ABS() (GH-141548) (GH-142301) (cherry picked from commit 706fdda8b360120a25b272898df40c8913381723) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> --- Include/pymacro.h | 6 ++++++ Lib/test/test_bytes.py | 11 +++++++++++ Lib/test/test_marshal.py | 5 +++++ Lib/test/test_memoryview.py | 19 +++++++++++++++++++ Python/marshal.c | 2 +- Python/pystrhex.c | 3 +-- 6 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Include/pymacro.h b/Include/pymacro.h index 218987a80b0d91..1af057ad78266a 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -72,6 +72,12 @@ /* Absolute value of the number x */ #define Py_ABS(x) ((x) < 0 ? -(x) : (x)) +/* Safer implementation that avoids an undefined behavior for the minimal + value of the signed integer type if its absolute value is larger than + the maximal value of the signed integer type (in the two's complement + representations, which is common). + */ +#define _Py_ABS_CAST(T, x) ((x) >= 0 ? ((T) (x)) : ((T) (((T) -((x) + 1)) + 1u))) #define _Py_XSTRINGIFY(x) #x diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 1257715586913c..8c6ac8910cab56 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -549,6 +549,17 @@ def test_hex_separator_basics(self): self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef') self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef') self.assertEqual(three_bytes.hex('*', -2), 'b901*ef') + self.assertEqual(three_bytes.hex(sep=':', bytes_per_sep=2), 'b9:01ef') + self.assertEqual(three_bytes.hex(sep='*', bytes_per_sep=-2), 'b901*ef') + for bytes_per_sep in 3, -3, 2**31-1, -(2**31-1): + with self.subTest(bytes_per_sep=bytes_per_sep): + self.assertEqual(three_bytes.hex(':', bytes_per_sep), 'b901ef') + for bytes_per_sep in 2**31, -2**31, 2**1000, -2**1000: + with self.subTest(bytes_per_sep=bytes_per_sep): + try: + self.assertEqual(three_bytes.hex(':', bytes_per_sep), 'b901ef') + except OverflowError: + pass value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030') diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index 8b1fb0eba1f8b6..662bdfccc79125 100644 --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -43,6 +43,11 @@ def test_ints(self): for expected in (-n, n): self.helper(expected) n = n >> 1 + n = 1 << 100 + while n: + for expected in (-n, -n+1, n-1, n): + self.helper(expected) + n = n >> 1 def test_int64(self): # Simulate int marshaling with TYPE_INT64. diff --git a/Lib/test/test_memoryview.py b/Lib/test/test_memoryview.py index 64f440f180bbf0..1bd58eb6408833 100644 --- a/Lib/test/test_memoryview.py +++ b/Lib/test/test_memoryview.py @@ -600,6 +600,25 @@ def test_memoryview_hex(self): m2 = m1[::-1] self.assertEqual(m2.hex(), '30' * 200000) + def test_memoryview_hex_separator(self): + x = bytes(range(97, 102)) + m1 = memoryview(x) + m2 = m1[::-1] + self.assertEqual(m2.hex(':'), '65:64:63:62:61') + self.assertEqual(m2.hex(':', 2), '65:6463:6261') + self.assertEqual(m2.hex(':', -2), '6564:6362:61') + self.assertEqual(m2.hex(sep=':', bytes_per_sep=2), '65:6463:6261') + self.assertEqual(m2.hex(sep=':', bytes_per_sep=-2), '6564:6362:61') + for bytes_per_sep in 5, -5, 2**31-1, -(2**31-1): + with self.subTest(bytes_per_sep=bytes_per_sep): + self.assertEqual(m2.hex(':', bytes_per_sep), '6564636261') + for bytes_per_sep in 2**31, -2**31, 2**1000, -2**1000: + with self.subTest(bytes_per_sep=bytes_per_sep): + try: + self.assertEqual(m2.hex(':', bytes_per_sep), '6564636261') + except OverflowError: + pass + def test_copy(self): m = memoryview(b'abc') with self.assertRaises(TypeError): diff --git a/Python/marshal.c b/Python/marshal.c index 50001497f6250b..5130edc91fa6fc 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -310,7 +310,7 @@ w_PyLong(const PyLongObject *ob, char flag, WFILE *p) } if (!long_export.digits) { int8_t sign = long_export.value < 0 ? -1 : 1; - uint64_t abs_value = Py_ABS(long_export.value); + uint64_t abs_value = _Py_ABS_CAST(uint64_t, long_export.value); uint64_t d = abs_value; long l = 0; diff --git a/Python/pystrhex.c b/Python/pystrhex.c index 38484f5a7d4227..af2f5c5dce5fca 100644 --- a/Python/pystrhex.c +++ b/Python/pystrhex.c @@ -42,8 +42,7 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, else { bytes_per_sep_group = 0; } - - unsigned int abs_bytes_per_sep = Py_ABS(bytes_per_sep_group); + unsigned int abs_bytes_per_sep = _Py_ABS_CAST(unsigned int, bytes_per_sep_group); Py_ssize_t resultlen = 0; if (bytes_per_sep_group && arglen > 0) { /* How many sep characters we'll be inserting. */ From e01407683e5942ea8cf6b8c0fb54229b9e94a90a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 12 Dec 2025 20:26:34 +0100 Subject: [PATCH 1598/1674] [3.14] Doc: remove the invalid type variables of typing.TextIO and BinaryIO (GH-142642) (#142643) They are not generic classes. (cherry picked from commit fa1ac9070c7525cab69c043ca2259e6d86357fb3) Co-authored-by: Roman Donchenko <rdonchen@outlook.com> --- Doc/library/typing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 862f765b148c73..360a0af0ee4e5b 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2875,8 +2875,8 @@ ABCs and Protocols for working with I/O --------------------------------------- .. class:: IO[AnyStr] - TextIO[AnyStr] - BinaryIO[AnyStr] + TextIO + BinaryIO Generic class ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])`` and ``BinaryIO(IO[bytes])`` From 27f27a68b35e5650c350b83c347d43e8b794422f Mon Sep 17 00:00:00 2001 From: Neil Schemenauer <nas-github@arctrix.com> Date: Fri, 12 Dec 2025 14:30:20 -0800 Subject: [PATCH 1599/1674] [3.14] gh-142531: Fix free-threaded GC performance regression (gh-142562) (gh-142617) If there are many untracked tuples, the GC will run too often, resulting in poor performance. The fix is to include untracked tuples in the "long lived" object count. The number of frozen objects is also now included since the free-threaded GC must scan those too. (cherry picked from commit e38967ed60778146050cc88dd16b70bfd867fde7) --- Lib/test/test_gc.py | 18 ++++++++++ ...-12-10-23-03-10.gh-issue-142531.NUEa1T.rst | 5 +++ Modules/_testinternalcapi.c | 8 +++++ Python/gc_free_threading.c | 35 +++++++++++++++---- 4 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-10-23-03-10.gh-issue-142531.NUEa1T.rst diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index a6adc2c98514ba..3e3092dcae1119 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1157,6 +1157,24 @@ def test_something(self): assert_python_ok("-c", source) + @unittest.skipUnless(Py_GIL_DISABLED, "requires free-threaded GC") + @unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi") + def test_tuple_untrack_counts(self): + # This ensures that the free-threaded GC is counting untracked tuples + # in the "long_lived_total" count. This is required to avoid + # performance issues from running the GC too frequently. See + # GH-142531 as an example. + gc.collect() + count = _testinternalcapi.get_long_lived_total() + n = 20_000 + tuples = [(x,) for x in range(n)] + gc.collect() + new_count = _testinternalcapi.get_long_lived_total() + self.assertFalse(gc.is_tracked(tuples[0])) + # Use n // 2 just in case some other objects were collected. + self.assertTrue(new_count - count > (n // 2)) + + class IncrementalGCTests(unittest.TestCase): @unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi") @requires_gil_enabled("Free threading does not support incremental GC") diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-10-23-03-10.gh-issue-142531.NUEa1T.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-10-23-03-10.gh-issue-142531.NUEa1T.rst new file mode 100644 index 00000000000000..15e03c1b9dd03f --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-10-23-03-10.gh-issue-142531.NUEa1T.rst @@ -0,0 +1,5 @@ +Fix a free-threaded GC performance regression. If there are many untracked +tuples, the GC will run too often, resulting in poor performance. The fix +is to include untracked tuples in the "long lived" object count. The number +of frozen objects is also now included since the free-threaded GC must +scan those too. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index ce11a81211e7e6..27f2d70e832c0f 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -2250,6 +2250,13 @@ get_tlbc_id(PyObject *Py_UNUSED(module), PyObject *obj) } return PyLong_FromVoidPtr(bc); } + +static PyObject * +get_long_lived_total(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return PyLong_FromInt64(PyInterpreterState_Get()->gc.long_lived_total); +} + #endif static PyObject * @@ -2552,6 +2559,7 @@ static PyMethodDef module_functions[] = { {"py_thread_id", get_py_thread_id, METH_NOARGS}, {"get_tlbc", get_tlbc, METH_O, NULL}, {"get_tlbc_id", get_tlbc_id, METH_O, NULL}, + {"get_long_lived_total", get_long_lived_total, METH_NOARGS}, #endif #ifdef _Py_TIER2 {"uop_symbols_test", _Py_uop_symbols_test, METH_NOARGS}, diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index d096accb4371c1..079b6b78dcd96f 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -374,6 +374,19 @@ op_from_block(void *block, void *arg, bool include_frozen) return op; } +// As above but returns untracked and frozen objects as well. +static PyObject * +op_from_block_all_gc(void *block, void *arg) +{ + struct visitor_args *a = arg; + if (block == NULL) { + return NULL; + } + PyObject *op = (PyObject *)((char*)block + a->offset); + assert(PyObject_IS_GC(op)); + return op; +} + static int gc_visit_heaps_lock_held(PyInterpreterState *interp, mi_block_visit_fun *visitor, struct visitor_args *arg) @@ -1175,12 +1188,20 @@ static bool scan_heap_visitor(const mi_heap_t *heap, const mi_heap_area_t *area, void *block, size_t block_size, void *args) { - PyObject *op = op_from_block(block, args, false); + PyObject *op = op_from_block_all_gc(block, args); if (op == NULL) { return true; } - struct collection_state *state = (struct collection_state *)args; + // The free-threaded GC cost is proportional to the number of objects in + // the mimalloc GC heap and so we should include the counts for untracked + // and frozen objects as well. This is especially important if many + // tuples have been untracked. + state->long_lived_total++; + if (!_PyObject_GC_IS_TRACKED(op) || gc_is_frozen(op)) { + return true; + } + if (gc_is_unreachable(op)) { // Disable deferred refcounting for unreachable objects so that they // are collected immediately after finalization. @@ -1198,6 +1219,9 @@ scan_heap_visitor(const mi_heap_t *heap, const mi_heap_area_t *area, else { worklist_push(&state->unreachable, op); } + // It is possible this object will be resurrected but + // for now we assume it will be deallocated. + state->long_lived_total--; return true; } @@ -1211,7 +1235,6 @@ scan_heap_visitor(const mi_heap_t *heap, const mi_heap_area_t *area, // object is reachable, restore `ob_tid`; we're done with these objects gc_restore_tid(op); gc_clear_alive(op); - state->long_lived_total++; return true; } @@ -1818,6 +1841,7 @@ handle_resurrected_objects(struct collection_state *state) _PyObject_ASSERT(op, Py_REFCNT(op) > 1); worklist_remove(&iter); merge_refcount(op, -1); // remove worklist reference + state->long_lived_total++; } } } @@ -2220,9 +2244,6 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, } } - // Record the number of live GC objects - interp->gc.long_lived_total = state->long_lived_total; - // Clear weakrefs and enqueue callbacks (but do not call them). clear_weakrefs(state); _PyEval_StartTheWorld(interp); @@ -2240,6 +2261,8 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, err = handle_resurrected_objects(state); // Clear free lists in all threads _PyGC_ClearAllFreeLists(interp); + // Record the number of live GC objects + interp->gc.long_lived_total = state->long_lived_total; _PyEval_StartTheWorld(interp); if (err < 0) { From 73c80f69ba37eebb5279dcdea7f0fa8ef856c143 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Sat, 13 Dec 2025 14:15:10 +0000 Subject: [PATCH 1600/1674] [3.14] gh-141808: Don't remove the JIT stencils when building with PGO (GH-141809) (GH-142657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See: https://discuss.python.org/t/building-the-jit-with-pre-built-stencils/91838/12 (cherry picked from commit 8914148151c957aebfaab1f3c890144d1b33968d) Co-authored-by: Miro Hrončok <miro@hroncok.cz> Co-authored-by: Mikhail Efimov <efimov.mikhail@gmail.com> --- Makefile.pre.in | 15 +++++++++++---- ...2025-11-20-23-15-39.gh-issue-141808.NEewZC.rst | 4 ++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-11-20-23-15-39.gh-issue-141808.NEewZC.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index 08ad5f4921dd5f..38a355a23f2aab 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -834,7 +834,7 @@ check-app-store-compliance: # Profile generation build must start from a clean tree. profile-clean-stamp: - $(MAKE) clean + $(MAKE) clean-profile touch $@ # Compile with profile generation enabled. @@ -3222,7 +3222,6 @@ clean-retain-profile: pycremoval -rm -rf Python/deepfreeze -rm -f Python/frozen_modules/*.h -rm -f Python/frozen_modules/MANIFEST - -rm -f jit_stencils.h -find build -type f -a ! -name '*.gc??' -exec rm -f {} ';' -rm -f Include/pydtrace_probes.h -rm -f profile-gen-stamp @@ -3241,13 +3240,21 @@ profile-removal: rm -f profile-run-stamp rm -f profile-bolt-stamp -.PHONY: clean -clean: clean-retain-profile clean-bolt +.PHONY: clean-profile +clean-profile: clean-retain-profile clean-bolt @if test @DEF_MAKE_ALL_RULE@ = profile-opt -o @DEF_MAKE_ALL_RULE@ = bolt-opt; then \ rm -f profile-gen-stamp profile-clean-stamp; \ $(MAKE) profile-removal; \ fi +# gh-141808: The JIT stencils are deliberately kept in clean-profile +.PHONY: clean-jit-stencils +clean-jit-stencils: + -rm -f jit_stencils*.h + +.PHONY: clean +clean: clean-profile clean-jit-stencils + .PHONY: clobber clobber: clean -rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ diff --git a/Misc/NEWS.d/next/Build/2025-11-20-23-15-39.gh-issue-141808.NEewZC.rst b/Misc/NEWS.d/next/Build/2025-11-20-23-15-39.gh-issue-141808.NEewZC.rst new file mode 100644 index 00000000000000..73220e1990006b --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-11-20-23-15-39.gh-issue-141808.NEewZC.rst @@ -0,0 +1,4 @@ +When running ``make clean-retain-profile``, keep the +generated JIT stencils. That way, the stencils are not generated twice when +Profile-guided optimization (PGO) is used. It also allows distributors to +supply their own pre-built JIT stencils. From 4e74259e91f8d4a56bb2d39d4475713ba05fdf43 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 13 Dec 2025 17:13:34 +0100 Subject: [PATCH 1601/1674] [3.14] gh-142568: Fix eval() docs to use 'source' parameter name (GH-142644) (#142669) gh-142568: Fix eval() docs to use 'source' parameter name (GH-142644) (cherry picked from commit c865ab3781e92ccc56b1729b2b751ac2769f50a0) Co-authored-by: Joshua Ward <joshie@flewognetworks.wales> --- Doc/library/functions.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index c66486d3908aa7..3167ff4454fca2 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -597,16 +597,16 @@ are always available. They are listed here in alphabetical order. 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 + The *source* argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the *globals* and *locals* 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 + inserted under that key before *source* 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* mapping is omitted it defaults to the - *globals* dictionary. If both mappings are omitted, the expression is + *globals* dictionary. If both mappings are omitted, the source is executed with the *globals* and *locals* in the environment where :func:`eval` is called. Note, *eval()* will only have access to the :term:`nested scopes <nested scope>` (non-locals) in the enclosing From affc38f40b042d0b15d32387931892bd3c42cb1b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 13 Dec 2025 23:57:29 +0100 Subject: [PATCH 1602/1674] [3.14] Add missing comma to tuple in `except*` docs (GH-142395) (#142685) Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com> --- Doc/reference/compound_stmts.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index b55ced574e4d38..52bae88607af2f 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -388,7 +388,7 @@ type of the target ``e`` is consistently :exc:`BaseExceptionGroup`:: ... except* BlockingIOError as e: ... print(repr(e)) ... - ExceptionGroup('', (BlockingIOError())) + ExceptionGroup('', (BlockingIOError(),)) :keyword:`break`, :keyword:`continue` and :keyword:`return` cannot appear in an :keyword:`!except*` clause. From f6c16004418b4a9d5f94c8ea8f22148804d8b351 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 14 Dec 2025 00:09:03 +0100 Subject: [PATCH 1603/1674] [3.14] Add 'Show translation source' to docs sidebar (GH-130355) (#142686) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Maciej Olko <maciej.olko@affirm.com> --- Doc/tools/templates/customsourcelink.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index 8e271bca1e08c8..0d83ac9f78adb9 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -8,6 +8,12 @@ <h3>{{ _('This page') }}</h3> rel="nofollow">{{ _('Show source') }} </a> </li> + {% if language != "en" %} + <li> + <a href="https://github.com/python/python-docs-{{ language }}/blob/{{ version }}/{{ pagename }}.po?plain=1" + rel="nofollow">{{ _('Show translation source') }}</a> + </li> + {% endif %} </ul> </div> {%- endif %} From 7297d3a98d377519c83ef142043ad22376abfe7c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Sun, 14 Dec 2025 01:24:31 +0200 Subject: [PATCH 1604/1674] [3.14] gh-142461: Move misplaced NEWS entries to an appropriate section (GH-142464) (#142688) (cherry picked from commit 87e152d203259784beb3e97067ce1c25ebb7a41c) --- Misc/NEWS.d/3.14.0a1.rst | 14 +++++++------- Misc/NEWS.d/3.14.0a2.rst | 8 ++++---- Misc/NEWS.d/3.14.0a3.rst | 2 +- Misc/NEWS.d/3.14.0a4.rst | 4 ++-- Misc/NEWS.d/3.14.0a5.rst | 6 +++--- Misc/NEWS.d/3.14.0a6.rst | 4 ++-- Misc/NEWS.d/3.14.0a7.rst | 2 +- Misc/NEWS.d/3.14.0b1.rst | 6 +++--- Misc/NEWS.d/3.14.0b2.rst | 2 +- Misc/NEWS.d/3.14.0b3.rst | 6 +++--- Misc/NEWS.d/3.14.0rc1.rst | 4 ++-- Misc/NEWS.d/3.14.1.rst | 14 +++++++------- Misc/NEWS.d/3.14.2.rst | 2 +- .../2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst | 0 14 files changed, 37 insertions(+), 37 deletions(-) rename Misc/NEWS.d/next/{Core_and_Builtins => Library}/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst (100%) diff --git a/Misc/NEWS.d/3.14.0a1.rst b/Misc/NEWS.d/3.14.0a1.rst index 1938976fa4226a..825cfe535c8edf 100644 --- a/Misc/NEWS.d/3.14.0a1.rst +++ b/Misc/NEWS.d/3.14.0a1.rst @@ -4016,7 +4016,7 @@ Make ``this_instr`` and ``prev_instr`` const in cases generator. .. date: 2024-10-05-23-53-06 .. gh-issue: 125008 .. nonce: ETANpd -.. section: Core and Builtins +.. section: Library Fix :func:`tokenize.untokenize` producing invalid syntax for double braces preceded by certain escape characters. @@ -4275,7 +4275,7 @@ devdanzin .. date: 2024-09-02-20-39-10 .. gh-issue: 123614 .. nonce: 26TMHp -.. section: Core and Builtins +.. section: Library Add :func:`turtle.save` to easily save Turtle drawings as PostScript files. Patch by Marie Roald and Yngve Mardal Moe. @@ -4761,7 +4761,7 @@ enabled (yet). .. date: 2024-07-18-21-19-04 .. gh-issue: 121999 .. nonce: 8IBbTK -.. section: Core and Builtins +.. section: Library The default extraction filter for the :mod:`tarfile` module is now set to :func:`'data' <tarfile.data_filter>`. @@ -4955,7 +4955,7 @@ Galindo .. date: 2024-06-28-23-17-22 .. gh-issue: 121381 .. nonce: i2xL7P -.. section: Core and Builtins +.. section: Library Remove ``subprocess._USE_VFORK`` escape hatch code and documentation. It was added just in case, and doesn't have any known cases that require it. @@ -5115,7 +5115,7 @@ and identities of :class:`str` objects. .. date: 2024-06-14-07-52-00 .. gh-issue: 120485 .. nonce: yy4K4b -.. section: Core and Builtins +.. section: Library Add an override of ``allow_reuse_port`` on classes subclassing ``socketserver.TCPServer`` where ``allow_reuse_address`` is also overridden. @@ -5147,7 +5147,7 @@ after exception handlers are moved to the end of the code. .. date: 2024-06-12-18-23-15 .. gh-issue: 120380 .. nonce: edtqjq -.. section: Core and Builtins +.. section: Library Fix Python implementation of :class:`pickle.Pickler` for :class:`bytes` and :class:`bytearray` objects when using protocol version 5. Patch by Bénédikt @@ -5625,7 +5625,7 @@ in the future. .. date: 2024-04-27-18-36-46 .. gh-issue: 115801 .. nonce: SVeHSy -.. section: Core and Builtins +.. section: Library Raise ``TypeError`` when passing a string to :func:`difflib.unified_diff` and :func:`difflib.context_diff`. diff --git a/Misc/NEWS.d/3.14.0a2.rst b/Misc/NEWS.d/3.14.0a2.rst index 7405a1344a9fa6..85009034ad316c 100644 --- a/Misc/NEWS.d/3.14.0a2.rst +++ b/Misc/NEWS.d/3.14.0a2.rst @@ -1253,7 +1253,7 @@ including SerenityOS. .. date: 2024-11-09-16-10-22 .. gh-issue: 126066 .. nonce: 9zs4m4 -.. section: Core and Builtins +.. section: Library Fix :mod:`importlib` to not write an incomplete .pyc files when a ulimit or some other operating system mechanism is preventing the write to go through @@ -1285,7 +1285,7 @@ its ``__iter__``. .. date: 2024-11-02-18-01-31 .. gh-issue: 126209 .. nonce: 2ZIhrS -.. section: Core and Builtins +.. section: Library Fix an issue with ``skip_file_prefixes`` parameter which resulted in an inconsistent behaviour between the C and Python implementations of @@ -1567,7 +1567,7 @@ Wannes Boeykens. .. date: 2024-05-12-03-10-36 .. gh-issue: 118950 .. nonce: 5Wc4vp -.. section: Core and Builtins +.. section: Library Fix bug where SSLProtocol.connection_lost wasn't getting called when OSError was thrown on writing to socket. @@ -1577,7 +1577,7 @@ was thrown on writing to socket. .. date: 2023-12-30-00-21-45 .. gh-issue: 113570 .. nonce: _XQgsW -.. section: Core and Builtins +.. section: Library Fixed a bug in ``reprlib.repr`` where it incorrectly called the repr method on shadowed Python built-in types. diff --git a/Misc/NEWS.d/3.14.0a3.rst b/Misc/NEWS.d/3.14.0a3.rst index 8393be8909ff8f..b4264335a2d8c3 100644 --- a/Misc/NEWS.d/3.14.0a3.rst +++ b/Misc/NEWS.d/3.14.0a3.rst @@ -820,7 +820,7 @@ Fix possible undefined behavior division by zero in :class:`complex`'s .. date: 2024-11-23-04-54-42 .. gh-issue: 127133 .. nonce: WMoJjF -.. section: Core and Builtins +.. section: Library Calling :meth:`argparse.ArgumentParser.add_argument_group` on an argument group, and calling :meth:`argparse.ArgumentParser.add_argument_group` or diff --git a/Misc/NEWS.d/3.14.0a4.rst b/Misc/NEWS.d/3.14.0a4.rst index 176ba72da65e4b..94350556093433 100644 --- a/Misc/NEWS.d/3.14.0a4.rst +++ b/Misc/NEWS.d/3.14.0a4.rst @@ -548,7 +548,7 @@ atomic operation. Patch by Donghee Na. .. date: 2024-12-23-11-14-07 .. gh-issue: 128192 .. nonce: 02mEhD -.. section: Core and Builtins +.. section: Library Upgrade HTTP digest authentication algorithm for :mod:`urllib.request` by supporting SHA-256 digest authentication as specified in :rfc:`7616`. @@ -613,7 +613,7 @@ object when importing a non-existent symbol from a non-module object. .. date: 2024-12-17-18-20-37 .. gh-issue: 128035 .. nonce: JwqHdB -.. section: Core and Builtins +.. section: Library Indicate through :data:`ssl.HAS_PHA` whether the :mod:`ssl` module supports TLSv1.3 post-handshake client authentication (PHA). Patch by Will diff --git a/Misc/NEWS.d/3.14.0a5.rst b/Misc/NEWS.d/3.14.0a5.rst index a3548d0a7b0357..6242fce823c569 100644 --- a/Misc/NEWS.d/3.14.0a5.rst +++ b/Misc/NEWS.d/3.14.0a5.rst @@ -944,7 +944,7 @@ It is always ``'freebsd'``, instead of ``'freebsd13'`` or ``'freebsd14'``. .. date: 2025-01-28-06-23-59 .. gh-issue: 129345 .. nonce: uOjkML -.. section: Core and Builtins +.. section: Library Fix null pointer dereference in :func:`syslog.openlog` when an audit hook raises an exception. @@ -1197,7 +1197,7 @@ generator. Patch by Mikhail Efimov. .. date: 2024-11-03-06-05-16 .. gh-issue: 126349 .. nonce: 7YwWsI -.. section: Core and Builtins +.. section: Library Add :func:`turtle.fill`, :func:`turtle.poly` and :func:`turtle.no_animation` context managers. Patch by Marie Roald and Yngve Mardal Moe. @@ -1218,7 +1218,7 @@ Willmer. .. date: 2023-12-04-15-53-25 .. gh-issue: 112713 .. nonce: Zrhv77 -.. section: Core and Builtins +.. section: Library Added support for the ``Partitioned`` cookie flag in :mod:`http.cookies`. diff --git a/Misc/NEWS.d/3.14.0a6.rst b/Misc/NEWS.d/3.14.0a6.rst index d8840b6f283e76..6ffd0c9d31a45d 100644 --- a/Misc/NEWS.d/3.14.0a6.rst +++ b/Misc/NEWS.d/3.14.0a6.rst @@ -1187,7 +1187,7 @@ Improve the experimental JIT's handling of returns to unknown callers. .. date: 2025-02-11-20-38-37 .. gh-issue: 129983 .. nonce: _1Fujo -.. section: Core and Builtins +.. section: Library Fix data race in compile_template in :file:`sre.c`. @@ -1335,7 +1335,7 @@ interpreter state. .. date: 2022-12-21-14-28-01 .. gh-issue: 100388 .. nonce: vne8ky -.. section: Core and Builtins +.. section: Library Fix the ``platform._sys_version()`` method when ``__DATE__`` is undefined at buildtime by changing default buildtime datetime string to the UNIX epoch. diff --git a/Misc/NEWS.d/3.14.0a7.rst b/Misc/NEWS.d/3.14.0a7.rst index 946ca27046a745..752d8be8dc8f44 100644 --- a/Misc/NEWS.d/3.14.0a7.rst +++ b/Misc/NEWS.d/3.14.0a7.rst @@ -880,7 +880,7 @@ Fix an issue with thread identifiers being sign-extended on some platforms. .. date: 2025-02-15-14-36-32 .. gh-issue: 99108 .. nonce: u6CfmK -.. section: Core and Builtins +.. section: Library Add support for built-in implementation of HMAC (:rfc:`2104`) based on HACL*. Patch by Bénédikt Tran. diff --git a/Misc/NEWS.d/3.14.0b1.rst b/Misc/NEWS.d/3.14.0b1.rst index f2dd631358550b..66457bb04725c6 100644 --- a/Misc/NEWS.d/3.14.0b1.rst +++ b/Misc/NEWS.d/3.14.0b1.rst @@ -1325,7 +1325,7 @@ Add new utilities of observing JIT compilation: .. date: 2025-04-30-13-09-20 .. gh-issue: 133194 .. nonce: 25_G5c -.. section: Core and Builtins +.. section: Library :func:`ast.parse` will no longer parse new :pep:`758` syntax with older *feature_version* passed. @@ -1498,7 +1498,7 @@ helpful fix suggestion for the typo. Contributed by Pablo Galindo Salgado. .. date: 2025-04-19-18-07-34 .. gh-issue: 132737 .. nonce: 9mW1il -.. section: Core and Builtins +.. section: Library Support profiling code that requires ``__main__``, such as :mod:`pickle`. @@ -1891,7 +1891,7 @@ Steven Sun) .. date: 2022-12-29-19-10-36 .. gh-issue: 89562 .. nonce: g8m8RC -.. section: Core and Builtins +.. section: Library Remove ``hostflags`` member from ``PySSLContext`` struct. diff --git a/Misc/NEWS.d/3.14.0b2.rst b/Misc/NEWS.d/3.14.0b2.rst index 214f7430a58395..95570ee4a63873 100644 --- a/Misc/NEWS.d/3.14.0b2.rst +++ b/Misc/NEWS.d/3.14.0b2.rst @@ -569,7 +569,7 @@ Improve Zip file validation false positive rate in .. date: 2025-05-22-14-48-19 .. gh-issue: 134381 .. nonce: 2BXhth -.. section: Core and Builtins +.. section: Library Fix :exc:`RuntimeError` when using a not-started :class:`threading.Thread` after calling :func:`os.fork` diff --git a/Misc/NEWS.d/3.14.0b3.rst b/Misc/NEWS.d/3.14.0b3.rst index 6b8c5ff8f95822..479f72276ca167 100644 --- a/Misc/NEWS.d/3.14.0b3.rst +++ b/Misc/NEWS.d/3.14.0b3.rst @@ -366,7 +366,7 @@ context. Patch by Pablo Galindo. .. date: 2025-06-11-15-08-10 .. gh-issue: 127319 .. nonce: OVGFSZ -.. section: Core and Builtins +.. section: Library Set the ``allow_reuse_port`` class variable to ``False`` on the XMLRPC, logging, and HTTP servers. This matches the behavior in prior Python @@ -411,7 +411,7 @@ additional check to ``FOR_ITER``. .. date: 2025-06-02-13-57-40 .. gh-issue: 116738 .. nonce: ycJsL8 -.. section: Core and Builtins +.. section: Library Make methods in :mod:`heapq` thread-safe on the :term:`free threaded <free threading>` build. @@ -441,7 +441,7 @@ optimizing ``LOAD_FAST``. .. date: 2025-05-30-15-56-19 .. gh-issue: 134908 .. nonce: 3a7PxM -.. section: Core and Builtins +.. section: Library Fix crash when iterating over lines in a text file on the :term:`free threaded <free threading>` build. diff --git a/Misc/NEWS.d/3.14.0rc1.rst b/Misc/NEWS.d/3.14.0rc1.rst index b7e9a2a7b122fc..01c4fc92a70e21 100644 --- a/Misc/NEWS.d/3.14.0rc1.rst +++ b/Misc/NEWS.d/3.14.0rc1.rst @@ -169,7 +169,7 @@ Contributed by Olga Matoula. .. date: 2025-07-12-09-59-14 .. gh-issue: 136421 .. nonce: ZD1rNj -.. section: Core and Builtins +.. section: Library Fix crash when initializing :mod:`datetime` concurrently. @@ -231,7 +231,7 @@ f-string literals. .. date: 2025-06-12-00-03-34 .. gh-issue: 116738 .. nonce: iBBAdo -.. section: Core and Builtins +.. section: Library Make functions in :mod:`grp` thread-safe on the :term:`free threaded <free threading>` build. diff --git a/Misc/NEWS.d/3.14.1.rst b/Misc/NEWS.d/3.14.1.rst index c00eb371b11fd1..ef882678a7bdad 100644 --- a/Misc/NEWS.d/3.14.1.rst +++ b/Misc/NEWS.d/3.14.1.rst @@ -1429,7 +1429,7 @@ build. .. date: 2025-11-25-13-13-34 .. gh-issue: 116738 .. nonce: MnZRdV -.. section: Core and Builtins +.. section: Library Fix thread safety issue with :mod:`re` scanner objects in free-threaded builds. @@ -1520,7 +1520,7 @@ iterator when a non-integer argument is passed. Patch by Sergey Miryanov. .. date: 2025-11-10-00-14-20 .. gh-issue: 116738 .. nonce: IxliC_ -.. section: Core and Builtins +.. section: Library Make csv module thread-safe on the :term:`free threaded <free threading>` build. @@ -1540,7 +1540,7 @@ the ``%*b`` format with a large width that results in a :exc:`MemoryError`. .. date: 2025-11-02-15-28-33 .. gh-issue: 140260 .. nonce: JNzlGz -.. section: Core and Builtins +.. section: Library Fix :mod:`struct` data race in endian table initialization with subinterpreters. Patch by Shamil Abdulaev. @@ -1622,7 +1622,7 @@ tracking depth is enabled (:func:`sys.set_coroutine_origin_tracking_depth`). .. date: 2025-10-21-09-20-03 .. gh-issue: 140398 .. nonce: SoABwJ -.. section: Core and Builtins +.. section: Library Fix memory leaks in :mod:`readline` functions :func:`~readline.read_init_file`, :func:`~readline.read_history_file`, @@ -1814,7 +1814,7 @@ with the BOM in a traceback. .. date: 2025-09-21-14-33-17 .. gh-issue: 116738 .. nonce: vNaI4h -.. section: Core and Builtins +.. section: Library Make :mod:`mmap` thread-safe on the :term:`free threaded <free threading>` build. @@ -1876,7 +1876,7 @@ auto-completion of imports. .. date: 2025-08-28-09-29-46 .. gh-issue: 116738 .. nonce: yLZJpV -.. section: Core and Builtins +.. section: Library Make :mod:`cProfile` thread-safe on the :term:`free threaded <free threading>` build. @@ -1886,7 +1886,7 @@ threading>` build. .. date: 2025-08-21-06-31-42 .. gh-issue: 138004 .. nonce: FH2Hre -.. section: Core and Builtins +.. section: Library On Solaris/Illumos platforms, thread names are now encoded as ASCII to avoid errors on systems (e.g. OpenIndiana) that don't support non-ASCII names. diff --git a/Misc/NEWS.d/3.14.2.rst b/Misc/NEWS.d/3.14.2.rst index b4b4c48da22028..fba5fb96b3d614 100644 --- a/Misc/NEWS.d/3.14.2.rst +++ b/Misc/NEWS.d/3.14.2.rst @@ -79,7 +79,7 @@ Fix crash when inserting into a split table dictionary with a non .. date: 2025-12-01-10-03-08 .. gh-issue: 116738 .. nonce: 972YsG -.. section: Core and Builtins +.. section: Library Fix :mod:`cmath` data race when initializing trigonometric tables with subinterpreters. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst b/Misc/NEWS.d/next/Library/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst similarity index 100% rename from Misc/NEWS.d/next/Core_and_Builtins/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst rename to Misc/NEWS.d/next/Library/2025-12-05-18-26-50.gh-issue-142282.g6RQUN.rst From aef4552d046ab5d0fdb9abbfd50132778437f4cd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 14 Dec 2025 10:04:37 +0100 Subject: [PATCH 1605/1674] [3.14] gh-142554: avoid `divmod` crashes due to bad `_pylong.int_divmod` (GH-142673) (#142696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-142554: avoid `divmod` crashes due to bad `_pylong.int_divmod` (GH-142673) (cherry picked from commit 4e4163676add8caab2dec6cdb93e1b317cf02a2e) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_int.py | 12 ++++++++++++ .../2025-12-13-17-20-38.gh-issue-142554.wNtEFF.rst | 2 ++ Objects/longobject.c | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-13-17-20-38.gh-issue-142554.wNtEFF.rst diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py index 7a7cb73f673787..fa675f626cbe10 100644 --- a/Lib/test/test_int.py +++ b/Lib/test/test_int.py @@ -778,6 +778,18 @@ def test_pylong_int_divmod(self): a, b = divmod(n*3 + 1, n) assert a == 3 and b == 1 + @support.cpython_only # tests implementation details of CPython. + @unittest.skipUnless(_pylong, "_pylong module required") + def test_pylong_int_divmod_crash(self): + # Regression test for https://github.com/python/cpython/issues/142554. + bad_int_divmod = lambda a, b: (1,) + # 'k' chosen such that divmod(2**(2*k), 2**k) uses _pylong.int_divmod() + k = 10_000 + a, b = (1 << (2 * k)), (1 << k) + with mock.patch.object(_pylong, "int_divmod", wraps=bad_int_divmod): + msg = r"tuple of length 2 is required from int_divmod\(\)" + self.assertRaisesRegex(ValueError, msg, divmod, a, b) + def test_pylong_str_to_int(self): v1 = 1 << 100_000 s = str(v1) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-13-17-20-38.gh-issue-142554.wNtEFF.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-13-17-20-38.gh-issue-142554.wNtEFF.rst new file mode 100644 index 00000000000000..d0aafe2c44bb4a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-13-17-20-38.gh-issue-142554.wNtEFF.rst @@ -0,0 +1,2 @@ +Fix a crash in :func:`divmod` when :func:`!_pylong.int_divmod` does not +return a tuple of length two exactly. Patch by Bénédikt Tran. diff --git a/Objects/longobject.c b/Objects/longobject.c index 6a35413136fe3f..803da9f590be65 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4339,10 +4339,10 @@ pylong_int_divmod(PyLongObject *v, PyLongObject *w, if (result == NULL) { return -1; } - if (!PyTuple_Check(result)) { + if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) { Py_DECREF(result); PyErr_SetString(PyExc_ValueError, - "tuple is required from int_divmod()"); + "tuple of length 2 is required from int_divmod()"); return -1; } PyObject *q = PyTuple_GET_ITEM(result, 0); From 77ad3d59c2c920dd3c0408139cb9be9cab430ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sun, 14 Dec 2025 10:27:03 +0100 Subject: [PATCH 1606/1674] [3.14] gh-142451: correctly copy HMAC attributes in `HMAC.copy()` (GH-142510) (#142698) Partially cherry-picked from d3ef5ba34d3068b8178d6ff0f39462db6bbc4ad5 which ensures that the `block_size` attribute exists on the copy. --- Lib/hmac.py | 1 + Lib/test/test_hmac.py | 9 +++++++++ .../2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst diff --git a/Lib/hmac.py b/Lib/hmac.py index 16022c9ceb5439..2d6016cda11c0e 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -159,6 +159,7 @@ def copy(self): # Call __new__ directly to avoid the expensive __init__. other = self.__class__.__new__(self.__class__) other.digest_size = self.digest_size + other.block_size = self.block_size if self._hmac: other._hmac = self._hmac.copy() other._inner = other._outer = None diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 344c6ddf28afcf..1d270b2a43c184 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -1076,6 +1076,15 @@ def test_properties(self): self.assertEqual(h.digest_size, self.digest_size) self.assertEqual(h.block_size, self.block_size) + def test_copy(self): + # Test a generic copy() and the attributes it exposes. + # See https://github.com/python/cpython/issues/142451. + h1 = self.hmac_new(b"my secret key", digestmod=self.digestname) + h2 = h1.copy() + self.assertEqual(h1.name, h2.name) + self.assertEqual(h1.digest_size, h2.digest_size) + self.assertEqual(h1.block_size, h2.block_size) + def test_repr(self): # HMAC object representation may differ across implementations raise NotImplementedError diff --git a/Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst b/Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst new file mode 100644 index 00000000000000..cceb572f503eda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst @@ -0,0 +1,3 @@ +:mod:`hmac`: Ensure that the :attr:`HMAC.block_size <hmac.HMAC.block_size>` +attribute is correctly copied by :meth:`HMAC.copy <hmac.HMAC.copy>`. Patch +by Bénédikt Tran. From df22bcdf5fca83db3f76dfec36cfd7cc7d4ff18a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 14 Dec 2025 11:17:54 +0100 Subject: [PATCH 1607/1674] [3.14] gh-141938: document treatment of `OSError` raised by `HTTPConnection.getresponse` (GH-142339) (#142704) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-141938: document treatment of `OSError` raised by `HTTPConnection.getresponse` (GH-142339) (cherry picked from commit 11aef219f5186fcb9b8121651e5bdbd7e84c3a4e) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/http.client.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 75aa818ab9f5d7..14c67a0600f728 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -311,6 +311,12 @@ HTTPConnection Objects :class:`str` or bytes-like object that is not also a file as the body representation. + .. note:: + + Note that you must have read the whole response or call :meth:`close` + if :meth:`getresponse` raised an non-:exc:`ConnectionError` exception + before you can send a new request to the server. + .. versionchanged:: 3.2 *body* can now be an iterable. @@ -326,16 +332,15 @@ HTTPConnection Objects Should be called after a request is sent to get the response from the server. Returns an :class:`HTTPResponse` instance. - .. note:: - - Note that you must have read the whole response before you can send a new - request to the server. - .. versionchanged:: 3.5 If a :exc:`ConnectionError` or subclass is raised, the :class:`HTTPConnection` object will be ready to reconnect when a new request is sent. + Note that this does not apply to :exc:`OSError`\s raised by the underlying + socket. Instead the caller is responsible to call :meth:`close` on the + existing connection. + .. method:: HTTPConnection.set_debuglevel(level) From f6ed94e70edf3250ea7481210d8f536b1448b5c8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka <storchaka@gmail.com> Date: Sun, 14 Dec 2025 13:51:14 +0200 Subject: [PATCH 1608/1674] [3.14] gh-142681: Improve unicodedata tests (GH-142682) (GH-142708) (cherry picked from commit af7cca3c39d59d21073765cbaca3f97e05e6aeec) --- Lib/test/data/NormalizationTest-3.2.0.txt | 17035 ++++++++++++++++++++ Lib/test/test_unicodedata.py | 501 +- 2 files changed, 17446 insertions(+), 90 deletions(-) create mode 100644 Lib/test/data/NormalizationTest-3.2.0.txt diff --git a/Lib/test/data/NormalizationTest-3.2.0.txt b/Lib/test/data/NormalizationTest-3.2.0.txt new file mode 100644 index 00000000000000..d1c7b5165e3618 --- /dev/null +++ b/Lib/test/data/NormalizationTest-3.2.0.txt @@ -0,0 +1,17035 @@ +# NormalizationTest-3.2.0.txt +# Date: 2002-03-19,23:31:18 GMT [MD] +# +# Normalization Test Suite +# Format: +# +# Columns (c1, c2,...) are separated by semicolons +# Comments are indicated with hash marks +# +# CONFORMANCE: +# 1. The following invariants must be true for all conformant implementations +# +# NFC +# c2 == NFC(c1) == NFC(c2) == NFC(c3) +# c4 == NFC(c4) == NFC(c5) +# +# NFD +# c3 == NFD(c1) == NFD(c2) == NFD(c3) +# c5 == NFD(c4) == NFD(c5) +# +# NFKC +# c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5) +# +# NFKD +# c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5) +# +# 2. For every assigned Unicode 3.1.0 code point X that is not specifically +# listed in Part 1, the following invariants must be true for all conformant +# implementations: +# +# X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X) +# +@Part0 # Specific cases +# +1E0A;1E0A;0044 0307;1E0A;0044 0307; # (Ḋ; Ḋ; D◌̇; Ḋ; D◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C;1E0C;0044 0323;1E0C;0044 0323; # (Ḍ; Ḍ; D◌̣; Ḍ; D◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW +1E0A 0323;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (Ḋ◌̣; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE, COMBINING DOT BELOW +1E0C 0307;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (Ḍ◌̇; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT BELOW, COMBINING DOT ABOVE +0044 0307 0323;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (D◌̇◌̣; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING DOT ABOVE, COMBINING DOT BELOW +0044 0323 0307;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING DOT BELOW, COMBINING DOT ABOVE +1E0A 031B;1E0A 031B;0044 031B 0307;1E0A 031B;0044 031B 0307; # (Ḋ◌̛; Ḋ◌̛; D◌̛◌̇; Ḋ◌̛; D◌̛◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE, COMBINING HORN +1E0C 031B;1E0C 031B;0044 031B 0323;1E0C 031B;0044 031B 0323; # (Ḍ◌̛; Ḍ◌̛; D◌̛◌̣; Ḍ◌̛; D◌̛◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW, COMBINING HORN +1E0A 031B 0323;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (Ḋ◌̛◌̣; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE, COMBINING HORN, COMBINING DOT BELOW +1E0C 031B 0307;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (Ḍ◌̛◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT BELOW, COMBINING HORN, COMBINING DOT ABOVE +0044 031B 0307 0323;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (D◌̛◌̇◌̣; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING HORN, COMBINING DOT ABOVE, COMBINING DOT BELOW +0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING HORN, COMBINING DOT BELOW, COMBINING DOT ABOVE +00C8;00C8;0045 0300;00C8;0045 0300; # (È; È; E◌̀; È; E◌̀; ) LATIN CAPITAL LETTER E WITH GRAVE +0112;0112;0045 0304;0112;0045 0304; # (Ē; Ē; E◌̄; Ē; E◌̄; ) LATIN CAPITAL LETTER E WITH MACRON +0045 0300;00C8;0045 0300;00C8;0045 0300; # (E◌̀; È; E◌̀; È; E◌̀; ) LATIN CAPITAL LETTER E, COMBINING GRAVE ACCENT +0045 0304;0112;0045 0304;0112;0045 0304; # (E◌̄; Ē; E◌̄; Ē; E◌̄; ) LATIN CAPITAL LETTER E, COMBINING MACRON +1E14;1E14;0045 0304 0300;1E14;0045 0304 0300; # (Ḕ; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +0112 0300;1E14;0045 0304 0300;1E14;0045 0304 0300; # (Ē◌̀; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E WITH MACRON, COMBINING GRAVE ACCENT +1E14 0304;1E14 0304;0045 0304 0300 0304;1E14 0304;0045 0304 0300 0304; # (Ḕ◌̄; Ḕ◌̄; E◌̄◌̀◌̄; Ḕ◌̄; E◌̄◌̀◌̄; ) LATIN CAPITAL LETTER E WITH MACRON AND GRAVE, COMBINING MACRON +0045 0304 0300;1E14;0045 0304 0300;1E14;0045 0304 0300; # (E◌̄◌̀; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E, COMBINING MACRON, COMBINING GRAVE ACCENT +0045 0300 0304;00C8 0304;0045 0300 0304;00C8 0304;0045 0300 0304; # (E◌̀◌̄; È◌̄; E◌̀◌̄; È◌̄; E◌̀◌̄; ) LATIN CAPITAL LETTER E, COMBINING GRAVE ACCENT, COMBINING MACRON +05B8 05B9 05B1 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F; # (◌ָ◌ֹ◌ֱ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ) HEBREW POINT QAMATS, HEBREW POINT HOLAM, HEBREW POINT HATAF SEGOL, HEBREW ACCENT ETNAHTA, HEBREW PUNCTUATION SOF PASUQ, HEBREW POINT SHEVA, HEBREW ACCENT ILUY, HEBREW ACCENT QARNEY PARA +0592 05B7 05BC 05A5 05B0 05C0 05C4 05AD;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4; # (◌֒◌ַ◌ּ◌֥◌ְ׀◌ׄ◌֭; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ) HEBREW ACCENT SEGOL, HEBREW POINT PATAH, HEBREW POINT DAGESH OR MAPIQ, HEBREW ACCENT MERKHA, HEBREW POINT SHEVA, HEBREW PUNCTUATION PASEQ, HEBREW MARK UPPER DOT, HEBREW ACCENT DEHI +# +@Part1 # Character by character test +# All characters not explicitly occurring in c1 of Part 1 have identical NFC, D, KC, KD forms. +# +00A0;00A0;00A0;0020;0020; # ( ;  ;  ; ; ; ) NO-BREAK SPACE +00A8;00A8;00A8;0020 0308;0020 0308; # (¨; ¨; ¨; ◌̈; ◌̈; ) DIAERESIS +00AA;00AA;00AA;0061;0061; # (ª; ª; ª; a; a; ) FEMININE ORDINAL INDICATOR +00AF;00AF;00AF;0020 0304;0020 0304; # (¯; ¯; ¯; ◌̄; ◌̄; ) MACRON +00B2;00B2;00B2;0032;0032; # (²; ²; ²; 2; 2; ) SUPERSCRIPT TWO +00B3;00B3;00B3;0033;0033; # (³; ³; ³; 3; 3; ) SUPERSCRIPT THREE +00B4;00B4;00B4;0020 0301;0020 0301; # (´; ´; ´; ◌́; ◌́; ) ACUTE ACCENT +00B5;00B5;00B5;03BC;03BC; # (µ; µ; µ; μ; μ; ) MICRO SIGN +00B8;00B8;00B8;0020 0327;0020 0327; # (¸; ¸; ¸; ◌̧; ◌̧; ) CEDILLA +00B9;00B9;00B9;0031;0031; # (¹; ¹; ¹; 1; 1; ) SUPERSCRIPT ONE +00BA;00BA;00BA;006F;006F; # (º; º; º; o; o; ) MASCULINE ORDINAL INDICATOR +00BC;00BC;00BC;0031 2044 0034;0031 2044 0034; # (¼; ¼; ¼; 1⁄4; 1⁄4; ) VULGAR FRACTION ONE QUARTER +00BD;00BD;00BD;0031 2044 0032;0031 2044 0032; # (½; ½; ½; 1⁄2; 1⁄2; ) VULGAR FRACTION ONE HALF +00BE;00BE;00BE;0033 2044 0034;0033 2044 0034; # (¾; ¾; ¾; 3⁄4; 3⁄4; ) VULGAR FRACTION THREE QUARTERS +00C0;00C0;0041 0300;00C0;0041 0300; # (À; À; A◌̀; À; A◌̀; ) LATIN CAPITAL LETTER A WITH GRAVE +00C1;00C1;0041 0301;00C1;0041 0301; # (Á; Á; A◌́; Á; A◌́; ) LATIN CAPITAL LETTER A WITH ACUTE +00C2;00C2;0041 0302;00C2;0041 0302; # (Â; Â; A◌̂; Â; A◌̂; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3;00C3;0041 0303;00C3;0041 0303; # (Ã; Ã; A◌̃; Ã; A◌̃; ) LATIN CAPITAL LETTER A WITH TILDE +00C4;00C4;0041 0308;00C4;0041 0308; # (Ä; Ä; A◌̈; Ä; A◌̈; ) LATIN CAPITAL LETTER A WITH DIAERESIS +00C5;00C5;0041 030A;00C5;0041 030A; # (Å; Å; A◌̊; Å; A◌̊; ) LATIN CAPITAL LETTER A WITH RING ABOVE +00C7;00C7;0043 0327;00C7;0043 0327; # (Ç; Ç; C◌̧; Ç; C◌̧; ) LATIN CAPITAL LETTER C WITH CEDILLA +00C8;00C8;0045 0300;00C8;0045 0300; # (È; È; E◌̀; È; E◌̀; ) LATIN CAPITAL LETTER E WITH GRAVE +00C9;00C9;0045 0301;00C9;0045 0301; # (É; É; E◌́; É; E◌́; ) LATIN CAPITAL LETTER E WITH ACUTE +00CA;00CA;0045 0302;00CA;0045 0302; # (Ê; Ê; E◌̂; Ê; E◌̂; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB;00CB;0045 0308;00CB;0045 0308; # (Ë; Ë; E◌̈; Ë; E◌̈; ) LATIN CAPITAL LETTER E WITH DIAERESIS +00CC;00CC;0049 0300;00CC;0049 0300; # (Ì; Ì; I◌̀; Ì; I◌̀; ) LATIN CAPITAL LETTER I WITH GRAVE +00CD;00CD;0049 0301;00CD;0049 0301; # (Í; Í; I◌́; Í; I◌́; ) LATIN CAPITAL LETTER I WITH ACUTE +00CE;00CE;0049 0302;00CE;0049 0302; # (Î; Î; I◌̂; Î; I◌̂; ) LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF;00CF;0049 0308;00CF;0049 0308; # (Ï; Ï; I◌̈; Ï; I◌̈; ) LATIN CAPITAL LETTER I WITH DIAERESIS +00D1;00D1;004E 0303;00D1;004E 0303; # (Ñ; Ñ; N◌̃; Ñ; N◌̃; ) LATIN CAPITAL LETTER N WITH TILDE +00D2;00D2;004F 0300;00D2;004F 0300; # (Ò; Ò; O◌̀; Ò; O◌̀; ) LATIN CAPITAL LETTER O WITH GRAVE +00D3;00D3;004F 0301;00D3;004F 0301; # (Ó; Ó; O◌́; Ó; O◌́; ) LATIN CAPITAL LETTER O WITH ACUTE +00D4;00D4;004F 0302;00D4;004F 0302; # (Ô; Ô; O◌̂; Ô; O◌̂; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5;00D5;004F 0303;00D5;004F 0303; # (Õ; Õ; O◌̃; Õ; O◌̃; ) LATIN CAPITAL LETTER O WITH TILDE +00D6;00D6;004F 0308;00D6;004F 0308; # (Ö; Ö; O◌̈; Ö; O◌̈; ) LATIN CAPITAL LETTER O WITH DIAERESIS +00D9;00D9;0055 0300;00D9;0055 0300; # (Ù; Ù; U◌̀; Ù; U◌̀; ) LATIN CAPITAL LETTER U WITH GRAVE +00DA;00DA;0055 0301;00DA;0055 0301; # (Ú; Ú; U◌́; Ú; U◌́; ) LATIN CAPITAL LETTER U WITH ACUTE +00DB;00DB;0055 0302;00DB;0055 0302; # (Û; Û; U◌̂; Û; U◌̂; ) LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC;00DC;0055 0308;00DC;0055 0308; # (Ü; Ü; U◌̈; Ü; U◌̈; ) LATIN CAPITAL LETTER U WITH DIAERESIS +00DD;00DD;0059 0301;00DD;0059 0301; # (Ý; Ý; Y◌́; Ý; Y◌́; ) LATIN CAPITAL LETTER Y WITH ACUTE +00E0;00E0;0061 0300;00E0;0061 0300; # (à; à; a◌̀; à; a◌̀; ) LATIN SMALL LETTER A WITH GRAVE +00E1;00E1;0061 0301;00E1;0061 0301; # (á; á; a◌́; á; a◌́; ) LATIN SMALL LETTER A WITH ACUTE +00E2;00E2;0061 0302;00E2;0061 0302; # (â; â; a◌̂; â; a◌̂; ) LATIN SMALL LETTER A WITH CIRCUMFLEX +00E3;00E3;0061 0303;00E3;0061 0303; # (ã; ã; a◌̃; ã; a◌̃; ) LATIN SMALL LETTER A WITH TILDE +00E4;00E4;0061 0308;00E4;0061 0308; # (ä; ä; a◌̈; ä; a◌̈; ) LATIN SMALL LETTER A WITH DIAERESIS +00E5;00E5;0061 030A;00E5;0061 030A; # (å; å; a◌̊; å; a◌̊; ) LATIN SMALL LETTER A WITH RING ABOVE +00E7;00E7;0063 0327;00E7;0063 0327; # (ç; ç; c◌̧; ç; c◌̧; ) LATIN SMALL LETTER C WITH CEDILLA +00E8;00E8;0065 0300;00E8;0065 0300; # (è; è; e◌̀; è; e◌̀; ) LATIN SMALL LETTER E WITH GRAVE +00E9;00E9;0065 0301;00E9;0065 0301; # (é; é; e◌́; é; e◌́; ) LATIN SMALL LETTER E WITH ACUTE +00EA;00EA;0065 0302;00EA;0065 0302; # (ê; ê; e◌̂; ê; e◌̂; ) LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;00EB;0065 0308;00EB;0065 0308; # (ë; ë; e◌̈; ë; e◌̈; ) LATIN SMALL LETTER E WITH DIAERESIS +00EC;00EC;0069 0300;00EC;0069 0300; # (ì; ì; i◌̀; ì; i◌̀; ) LATIN SMALL LETTER I WITH GRAVE +00ED;00ED;0069 0301;00ED;0069 0301; # (í; í; i◌́; í; i◌́; ) LATIN SMALL LETTER I WITH ACUTE +00EE;00EE;0069 0302;00EE;0069 0302; # (î; î; i◌̂; î; i◌̂; ) LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF;00EF;0069 0308;00EF;0069 0308; # (ï; ï; i◌̈; ï; i◌̈; ) LATIN SMALL LETTER I WITH DIAERESIS +00F1;00F1;006E 0303;00F1;006E 0303; # (ñ; ñ; n◌̃; ñ; n◌̃; ) LATIN SMALL LETTER N WITH TILDE +00F2;00F2;006F 0300;00F2;006F 0300; # (ò; ò; o◌̀; ò; o◌̀; ) LATIN SMALL LETTER O WITH GRAVE +00F3;00F3;006F 0301;00F3;006F 0301; # (ó; ó; o◌́; ó; o◌́; ) LATIN SMALL LETTER O WITH ACUTE +00F4;00F4;006F 0302;00F4;006F 0302; # (ô; ô; o◌̂; ô; o◌̂; ) LATIN SMALL LETTER O WITH CIRCUMFLEX +00F5;00F5;006F 0303;00F5;006F 0303; # (õ; õ; o◌̃; õ; o◌̃; ) LATIN SMALL LETTER O WITH TILDE +00F6;00F6;006F 0308;00F6;006F 0308; # (ö; ö; o◌̈; ö; o◌̈; ) LATIN SMALL LETTER O WITH DIAERESIS +00F9;00F9;0075 0300;00F9;0075 0300; # (ù; ù; u◌̀; ù; u◌̀; ) LATIN SMALL LETTER U WITH GRAVE +00FA;00FA;0075 0301;00FA;0075 0301; # (ú; ú; u◌́; ú; u◌́; ) LATIN SMALL LETTER U WITH ACUTE +00FB;00FB;0075 0302;00FB;0075 0302; # (û; û; u◌̂; û; u◌̂; ) LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;00FC;0075 0308;00FC;0075 0308; # (ü; ü; u◌̈; ü; u◌̈; ) LATIN SMALL LETTER U WITH DIAERESIS +00FD;00FD;0079 0301;00FD;0079 0301; # (ý; ý; y◌́; ý; y◌́; ) LATIN SMALL LETTER Y WITH ACUTE +00FF;00FF;0079 0308;00FF;0079 0308; # (ÿ; ÿ; y◌̈; ÿ; y◌̈; ) LATIN SMALL LETTER Y WITH DIAERESIS +0100;0100;0041 0304;0100;0041 0304; # (Ā; Ā; A◌̄; Ā; A◌̄; ) LATIN CAPITAL LETTER A WITH MACRON +0101;0101;0061 0304;0101;0061 0304; # (ā; ā; a◌̄; ā; a◌̄; ) LATIN SMALL LETTER A WITH MACRON +0102;0102;0041 0306;0102;0041 0306; # (Ă; Ă; A◌̆; Ă; A◌̆; ) LATIN CAPITAL LETTER A WITH BREVE +0103;0103;0061 0306;0103;0061 0306; # (ă; ă; a◌̆; ă; a◌̆; ) LATIN SMALL LETTER A WITH BREVE +0104;0104;0041 0328;0104;0041 0328; # (Ą; Ą; A◌̨; Ą; A◌̨; ) LATIN CAPITAL LETTER A WITH OGONEK +0105;0105;0061 0328;0105;0061 0328; # (ą; ą; a◌̨; ą; a◌̨; ) LATIN SMALL LETTER A WITH OGONEK +0106;0106;0043 0301;0106;0043 0301; # (Ć; Ć; C◌́; Ć; C◌́; ) LATIN CAPITAL LETTER C WITH ACUTE +0107;0107;0063 0301;0107;0063 0301; # (ć; ć; c◌́; ć; c◌́; ) LATIN SMALL LETTER C WITH ACUTE +0108;0108;0043 0302;0108;0043 0302; # (Ĉ; Ĉ; C◌̂; Ĉ; C◌̂; ) LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0109;0109;0063 0302;0109;0063 0302; # (ĉ; ĉ; c◌̂; ĉ; c◌̂; ) LATIN SMALL LETTER C WITH CIRCUMFLEX +010A;010A;0043 0307;010A;0043 0307; # (Ċ; Ċ; C◌̇; Ċ; C◌̇; ) LATIN CAPITAL LETTER C WITH DOT ABOVE +010B;010B;0063 0307;010B;0063 0307; # (ċ; ċ; c◌̇; ċ; c◌̇; ) LATIN SMALL LETTER C WITH DOT ABOVE +010C;010C;0043 030C;010C;0043 030C; # (Č; Č; C◌̌; Č; C◌̌; ) LATIN CAPITAL LETTER C WITH CARON +010D;010D;0063 030C;010D;0063 030C; # (č; č; c◌̌; č; c◌̌; ) LATIN SMALL LETTER C WITH CARON +010E;010E;0044 030C;010E;0044 030C; # (Ď; Ď; D◌̌; Ď; D◌̌; ) LATIN CAPITAL LETTER D WITH CARON +010F;010F;0064 030C;010F;0064 030C; # (ď; ď; d◌̌; ď; d◌̌; ) LATIN SMALL LETTER D WITH CARON +0112;0112;0045 0304;0112;0045 0304; # (Ē; Ē; E◌̄; Ē; E◌̄; ) LATIN CAPITAL LETTER E WITH MACRON +0113;0113;0065 0304;0113;0065 0304; # (ē; ē; e◌̄; ē; e◌̄; ) LATIN SMALL LETTER E WITH MACRON +0114;0114;0045 0306;0114;0045 0306; # (Ĕ; Ĕ; E◌̆; Ĕ; E◌̆; ) LATIN CAPITAL LETTER E WITH BREVE +0115;0115;0065 0306;0115;0065 0306; # (ĕ; ĕ; e◌̆; ĕ; e◌̆; ) LATIN SMALL LETTER E WITH BREVE +0116;0116;0045 0307;0116;0045 0307; # (Ė; Ė; E◌̇; Ė; E◌̇; ) LATIN CAPITAL LETTER E WITH DOT ABOVE +0117;0117;0065 0307;0117;0065 0307; # (ė; ė; e◌̇; ė; e◌̇; ) LATIN SMALL LETTER E WITH DOT ABOVE +0118;0118;0045 0328;0118;0045 0328; # (Ę; Ę; E◌̨; Ę; E◌̨; ) LATIN CAPITAL LETTER E WITH OGONEK +0119;0119;0065 0328;0119;0065 0328; # (ę; ę; e◌̨; ę; e◌̨; ) LATIN SMALL LETTER E WITH OGONEK +011A;011A;0045 030C;011A;0045 030C; # (Ě; Ě; E◌̌; Ě; E◌̌; ) LATIN CAPITAL LETTER E WITH CARON +011B;011B;0065 030C;011B;0065 030C; # (ě; ě; e◌̌; ě; e◌̌; ) LATIN SMALL LETTER E WITH CARON +011C;011C;0047 0302;011C;0047 0302; # (Ĝ; Ĝ; G◌̂; Ĝ; G◌̂; ) LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011D;011D;0067 0302;011D;0067 0302; # (ĝ; ĝ; g◌̂; ĝ; g◌̂; ) LATIN SMALL LETTER G WITH CIRCUMFLEX +011E;011E;0047 0306;011E;0047 0306; # (Ğ; Ğ; G◌̆; Ğ; G◌̆; ) LATIN CAPITAL LETTER G WITH BREVE +011F;011F;0067 0306;011F;0067 0306; # (ğ; ğ; g◌̆; ğ; g◌̆; ) LATIN SMALL LETTER G WITH BREVE +0120;0120;0047 0307;0120;0047 0307; # (Ġ; Ġ; G◌̇; Ġ; G◌̇; ) LATIN CAPITAL LETTER G WITH DOT ABOVE +0121;0121;0067 0307;0121;0067 0307; # (ġ; ġ; g◌̇; ġ; g◌̇; ) LATIN SMALL LETTER G WITH DOT ABOVE +0122;0122;0047 0327;0122;0047 0327; # (Ģ; Ģ; G◌̧; Ģ; G◌̧; ) LATIN CAPITAL LETTER G WITH CEDILLA +0123;0123;0067 0327;0123;0067 0327; # (ģ; ģ; g◌̧; ģ; g◌̧; ) LATIN SMALL LETTER G WITH CEDILLA +0124;0124;0048 0302;0124;0048 0302; # (Ĥ; Ĥ; H◌̂; Ĥ; H◌̂; ) LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0125;0125;0068 0302;0125;0068 0302; # (ĥ; ĥ; h◌̂; ĥ; h◌̂; ) LATIN SMALL LETTER H WITH CIRCUMFLEX +0128;0128;0049 0303;0128;0049 0303; # (Ĩ; Ĩ; I◌̃; Ĩ; I◌̃; ) LATIN CAPITAL LETTER I WITH TILDE +0129;0129;0069 0303;0129;0069 0303; # (ĩ; ĩ; i◌̃; ĩ; i◌̃; ) LATIN SMALL LETTER I WITH TILDE +012A;012A;0049 0304;012A;0049 0304; # (Ī; Ī; I◌̄; Ī; I◌̄; ) LATIN CAPITAL LETTER I WITH MACRON +012B;012B;0069 0304;012B;0069 0304; # (ī; ī; i◌̄; ī; i◌̄; ) LATIN SMALL LETTER I WITH MACRON +012C;012C;0049 0306;012C;0049 0306; # (Ĭ; Ĭ; I◌̆; Ĭ; I◌̆; ) LATIN CAPITAL LETTER I WITH BREVE +012D;012D;0069 0306;012D;0069 0306; # (ĭ; ĭ; i◌̆; ĭ; i◌̆; ) LATIN SMALL LETTER I WITH BREVE +012E;012E;0049 0328;012E;0049 0328; # (Į; Į; I◌̨; Į; I◌̨; ) LATIN CAPITAL LETTER I WITH OGONEK +012F;012F;0069 0328;012F;0069 0328; # (į; į; i◌̨; į; i◌̨; ) LATIN SMALL LETTER I WITH OGONEK +0130;0130;0049 0307;0130;0049 0307; # (İ; İ; I◌̇; İ; I◌̇; ) LATIN CAPITAL LETTER I WITH DOT ABOVE +0132;0132;0132;0049 004A;0049 004A; # (IJ; IJ; IJ; IJ; IJ; ) LATIN CAPITAL LIGATURE IJ +0133;0133;0133;0069 006A;0069 006A; # (ij; ij; ij; ij; ij; ) LATIN SMALL LIGATURE IJ +0134;0134;004A 0302;0134;004A 0302; # (Ĵ; Ĵ; J◌̂; Ĵ; J◌̂; ) LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0135;0135;006A 0302;0135;006A 0302; # (ĵ; ĵ; j◌̂; ĵ; j◌̂; ) LATIN SMALL LETTER J WITH CIRCUMFLEX +0136;0136;004B 0327;0136;004B 0327; # (Ķ; Ķ; K◌̧; Ķ; K◌̧; ) LATIN CAPITAL LETTER K WITH CEDILLA +0137;0137;006B 0327;0137;006B 0327; # (ķ; ķ; k◌̧; ķ; k◌̧; ) LATIN SMALL LETTER K WITH CEDILLA +0139;0139;004C 0301;0139;004C 0301; # (Ĺ; Ĺ; L◌́; Ĺ; L◌́; ) LATIN CAPITAL LETTER L WITH ACUTE +013A;013A;006C 0301;013A;006C 0301; # (ĺ; ĺ; l◌́; ĺ; l◌́; ) LATIN SMALL LETTER L WITH ACUTE +013B;013B;004C 0327;013B;004C 0327; # (Ļ; Ļ; L◌̧; Ļ; L◌̧; ) LATIN CAPITAL LETTER L WITH CEDILLA +013C;013C;006C 0327;013C;006C 0327; # (ļ; ļ; l◌̧; ļ; l◌̧; ) LATIN SMALL LETTER L WITH CEDILLA +013D;013D;004C 030C;013D;004C 030C; # (Ľ; Ľ; L◌̌; Ľ; L◌̌; ) LATIN CAPITAL LETTER L WITH CARON +013E;013E;006C 030C;013E;006C 030C; # (ľ; ľ; l◌̌; ľ; l◌̌; ) LATIN SMALL LETTER L WITH CARON +013F;013F;013F;004C 00B7;004C 00B7; # (Ŀ; Ŀ; Ŀ; L·; L·; ) LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140;0140;0140;006C 00B7;006C 00B7; # (ŀ; ŀ; ŀ; l·; l·; ) LATIN SMALL LETTER L WITH MIDDLE DOT +0143;0143;004E 0301;0143;004E 0301; # (Ń; Ń; N◌́; Ń; N◌́; ) LATIN CAPITAL LETTER N WITH ACUTE +0144;0144;006E 0301;0144;006E 0301; # (ń; ń; n◌́; ń; n◌́; ) LATIN SMALL LETTER N WITH ACUTE +0145;0145;004E 0327;0145;004E 0327; # (Ņ; Ņ; N◌̧; Ņ; N◌̧; ) LATIN CAPITAL LETTER N WITH CEDILLA +0146;0146;006E 0327;0146;006E 0327; # (ņ; ņ; n◌̧; ņ; n◌̧; ) LATIN SMALL LETTER N WITH CEDILLA +0147;0147;004E 030C;0147;004E 030C; # (Ň; Ň; N◌̌; Ň; N◌̌; ) LATIN CAPITAL LETTER N WITH CARON +0148;0148;006E 030C;0148;006E 030C; # (ň; ň; n◌̌; ň; n◌̌; ) LATIN SMALL LETTER N WITH CARON +0149;0149;0149;02BC 006E;02BC 006E; # (ʼn; ʼn; ʼn; ʼn; ʼn; ) LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014C;014C;004F 0304;014C;004F 0304; # (Ō; Ō; O◌̄; Ō; O◌̄; ) LATIN CAPITAL LETTER O WITH MACRON +014D;014D;006F 0304;014D;006F 0304; # (ō; ō; o◌̄; ō; o◌̄; ) LATIN SMALL LETTER O WITH MACRON +014E;014E;004F 0306;014E;004F 0306; # (Ŏ; Ŏ; O◌̆; Ŏ; O◌̆; ) LATIN CAPITAL LETTER O WITH BREVE +014F;014F;006F 0306;014F;006F 0306; # (ŏ; ŏ; o◌̆; ŏ; o◌̆; ) LATIN SMALL LETTER O WITH BREVE +0150;0150;004F 030B;0150;004F 030B; # (Ő; Ő; O◌̋; Ő; O◌̋; ) LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0151;0151;006F 030B;0151;006F 030B; # (ő; ő; o◌̋; ő; o◌̋; ) LATIN SMALL LETTER O WITH DOUBLE ACUTE +0154;0154;0052 0301;0154;0052 0301; # (Ŕ; Ŕ; R◌́; Ŕ; R◌́; ) LATIN CAPITAL LETTER R WITH ACUTE +0155;0155;0072 0301;0155;0072 0301; # (ŕ; ŕ; r◌́; ŕ; r◌́; ) LATIN SMALL LETTER R WITH ACUTE +0156;0156;0052 0327;0156;0052 0327; # (Ŗ; Ŗ; R◌̧; Ŗ; R◌̧; ) LATIN CAPITAL LETTER R WITH CEDILLA +0157;0157;0072 0327;0157;0072 0327; # (ŗ; ŗ; r◌̧; ŗ; r◌̧; ) LATIN SMALL LETTER R WITH CEDILLA +0158;0158;0052 030C;0158;0052 030C; # (Ř; Ř; R◌̌; Ř; R◌̌; ) LATIN CAPITAL LETTER R WITH CARON +0159;0159;0072 030C;0159;0072 030C; # (ř; ř; r◌̌; ř; r◌̌; ) LATIN SMALL LETTER R WITH CARON +015A;015A;0053 0301;015A;0053 0301; # (Ś; Ś; S◌́; Ś; S◌́; ) LATIN CAPITAL LETTER S WITH ACUTE +015B;015B;0073 0301;015B;0073 0301; # (ś; ś; s◌́; ś; s◌́; ) LATIN SMALL LETTER S WITH ACUTE +015C;015C;0053 0302;015C;0053 0302; # (Ŝ; Ŝ; S◌̂; Ŝ; S◌̂; ) LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015D;015D;0073 0302;015D;0073 0302; # (ŝ; ŝ; s◌̂; ŝ; s◌̂; ) LATIN SMALL LETTER S WITH CIRCUMFLEX +015E;015E;0053 0327;015E;0053 0327; # (Ş; Ş; S◌̧; Ş; S◌̧; ) LATIN CAPITAL LETTER S WITH CEDILLA +015F;015F;0073 0327;015F;0073 0327; # (ş; ş; s◌̧; ş; s◌̧; ) LATIN SMALL LETTER S WITH CEDILLA +0160;0160;0053 030C;0160;0053 030C; # (Š; Š; S◌̌; Š; S◌̌; ) LATIN CAPITAL LETTER S WITH CARON +0161;0161;0073 030C;0161;0073 030C; # (š; š; s◌̌; š; s◌̌; ) LATIN SMALL LETTER S WITH CARON +0162;0162;0054 0327;0162;0054 0327; # (Ţ; Ţ; T◌̧; Ţ; T◌̧; ) LATIN CAPITAL LETTER T WITH CEDILLA +0163;0163;0074 0327;0163;0074 0327; # (ţ; ţ; t◌̧; ţ; t◌̧; ) LATIN SMALL LETTER T WITH CEDILLA +0164;0164;0054 030C;0164;0054 030C; # (Ť; Ť; T◌̌; Ť; T◌̌; ) LATIN CAPITAL LETTER T WITH CARON +0165;0165;0074 030C;0165;0074 030C; # (ť; ť; t◌̌; ť; t◌̌; ) LATIN SMALL LETTER T WITH CARON +0168;0168;0055 0303;0168;0055 0303; # (Ũ; Ũ; U◌̃; Ũ; U◌̃; ) LATIN CAPITAL LETTER U WITH TILDE +0169;0169;0075 0303;0169;0075 0303; # (ũ; ũ; u◌̃; ũ; u◌̃; ) LATIN SMALL LETTER U WITH TILDE +016A;016A;0055 0304;016A;0055 0304; # (Ū; Ū; U◌̄; Ū; U◌̄; ) LATIN CAPITAL LETTER U WITH MACRON +016B;016B;0075 0304;016B;0075 0304; # (ū; ū; u◌̄; ū; u◌̄; ) LATIN SMALL LETTER U WITH MACRON +016C;016C;0055 0306;016C;0055 0306; # (Ŭ; Ŭ; U◌̆; Ŭ; U◌̆; ) LATIN CAPITAL LETTER U WITH BREVE +016D;016D;0075 0306;016D;0075 0306; # (ŭ; ŭ; u◌̆; ŭ; u◌̆; ) LATIN SMALL LETTER U WITH BREVE +016E;016E;0055 030A;016E;0055 030A; # (Ů; Ů; U◌̊; Ů; U◌̊; ) LATIN CAPITAL LETTER U WITH RING ABOVE +016F;016F;0075 030A;016F;0075 030A; # (ů; ů; u◌̊; ů; u◌̊; ) LATIN SMALL LETTER U WITH RING ABOVE +0170;0170;0055 030B;0170;0055 030B; # (Ű; Ű; U◌̋; Ű; U◌̋; ) LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0171;0171;0075 030B;0171;0075 030B; # (ű; ű; u◌̋; ű; u◌̋; ) LATIN SMALL LETTER U WITH DOUBLE ACUTE +0172;0172;0055 0328;0172;0055 0328; # (Ų; Ų; U◌̨; Ų; U◌̨; ) LATIN CAPITAL LETTER U WITH OGONEK +0173;0173;0075 0328;0173;0075 0328; # (ų; ų; u◌̨; ų; u◌̨; ) LATIN SMALL LETTER U WITH OGONEK +0174;0174;0057 0302;0174;0057 0302; # (Ŵ; Ŵ; W◌̂; Ŵ; W◌̂; ) LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175;0175;0077 0302;0175;0077 0302; # (ŵ; ŵ; w◌̂; ŵ; w◌̂; ) LATIN SMALL LETTER W WITH CIRCUMFLEX +0176;0176;0059 0302;0176;0059 0302; # (Ŷ; Ŷ; Y◌̂; Ŷ; Y◌̂; ) LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177;0177;0079 0302;0177;0079 0302; # (ŷ; ŷ; y◌̂; ŷ; y◌̂; ) LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178;0178;0059 0308;0178;0059 0308; # (Ÿ; Ÿ; Y◌̈; Ÿ; Y◌̈; ) LATIN CAPITAL LETTER Y WITH DIAERESIS +0179;0179;005A 0301;0179;005A 0301; # (Ź; Ź; Z◌́; Ź; Z◌́; ) LATIN CAPITAL LETTER Z WITH ACUTE +017A;017A;007A 0301;017A;007A 0301; # (ź; ź; z◌́; ź; z◌́; ) LATIN SMALL LETTER Z WITH ACUTE +017B;017B;005A 0307;017B;005A 0307; # (Ż; Ż; Z◌̇; Ż; Z◌̇; ) LATIN CAPITAL LETTER Z WITH DOT ABOVE +017C;017C;007A 0307;017C;007A 0307; # (ż; ż; z◌̇; ż; z◌̇; ) LATIN SMALL LETTER Z WITH DOT ABOVE +017D;017D;005A 030C;017D;005A 030C; # (Ž; Ž; Z◌̌; Ž; Z◌̌; ) LATIN CAPITAL LETTER Z WITH CARON +017E;017E;007A 030C;017E;007A 030C; # (ž; ž; z◌̌; ž; z◌̌; ) LATIN SMALL LETTER Z WITH CARON +017F;017F;017F;0073;0073; # (ſ; ſ; ſ; s; s; ) LATIN SMALL LETTER LONG S +01A0;01A0;004F 031B;01A0;004F 031B; # (Ơ; Ơ; O◌̛; Ơ; O◌̛; ) LATIN CAPITAL LETTER O WITH HORN +01A1;01A1;006F 031B;01A1;006F 031B; # (ơ; ơ; o◌̛; ơ; o◌̛; ) LATIN SMALL LETTER O WITH HORN +01AF;01AF;0055 031B;01AF;0055 031B; # (Ư; Ư; U◌̛; Ư; U◌̛; ) LATIN CAPITAL LETTER U WITH HORN +01B0;01B0;0075 031B;01B0;0075 031B; # (ư; ư; u◌̛; ư; u◌̛; ) LATIN SMALL LETTER U WITH HORN +01C4;01C4;01C4;0044 017D;0044 005A 030C; # (DŽ; DŽ; DŽ; DŽ; DZ◌̌; ) LATIN CAPITAL LETTER DZ WITH CARON +01C5;01C5;01C5;0044 017E;0044 007A 030C; # (Dž; Dž; Dž; Dž; Dz◌̌; ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C6;01C6;01C6;0064 017E;0064 007A 030C; # (dž; dž; dž; dž; dz◌̌; ) LATIN SMALL LETTER DZ WITH CARON +01C7;01C7;01C7;004C 004A;004C 004A; # (LJ; LJ; LJ; LJ; LJ; ) LATIN CAPITAL LETTER LJ +01C8;01C8;01C8;004C 006A;004C 006A; # (Lj; Lj; Lj; Lj; Lj; ) LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C9;01C9;01C9;006C 006A;006C 006A; # (lj; lj; lj; lj; lj; ) LATIN SMALL LETTER LJ +01CA;01CA;01CA;004E 004A;004E 004A; # (NJ; NJ; NJ; NJ; NJ; ) LATIN CAPITAL LETTER NJ +01CB;01CB;01CB;004E 006A;004E 006A; # (Nj; Nj; Nj; Nj; Nj; ) LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CC;01CC;01CC;006E 006A;006E 006A; # (nj; nj; nj; nj; nj; ) LATIN SMALL LETTER NJ +01CD;01CD;0041 030C;01CD;0041 030C; # (Ǎ; Ǎ; A◌̌; Ǎ; A◌̌; ) LATIN CAPITAL LETTER A WITH CARON +01CE;01CE;0061 030C;01CE;0061 030C; # (ǎ; ǎ; a◌̌; ǎ; a◌̌; ) LATIN SMALL LETTER A WITH CARON +01CF;01CF;0049 030C;01CF;0049 030C; # (Ǐ; Ǐ; I◌̌; Ǐ; I◌̌; ) LATIN CAPITAL LETTER I WITH CARON +01D0;01D0;0069 030C;01D0;0069 030C; # (ǐ; ǐ; i◌̌; ǐ; i◌̌; ) LATIN SMALL LETTER I WITH CARON +01D1;01D1;004F 030C;01D1;004F 030C; # (Ǒ; Ǒ; O◌̌; Ǒ; O◌̌; ) LATIN CAPITAL LETTER O WITH CARON +01D2;01D2;006F 030C;01D2;006F 030C; # (ǒ; ǒ; o◌̌; ǒ; o◌̌; ) LATIN SMALL LETTER O WITH CARON +01D3;01D3;0055 030C;01D3;0055 030C; # (Ǔ; Ǔ; U◌̌; Ǔ; U◌̌; ) LATIN CAPITAL LETTER U WITH CARON +01D4;01D4;0075 030C;01D4;0075 030C; # (ǔ; ǔ; u◌̌; ǔ; u◌̌; ) LATIN SMALL LETTER U WITH CARON +01D5;01D5;0055 0308 0304;01D5;0055 0308 0304; # (Ǖ; Ǖ; U◌̈◌̄; Ǖ; U◌̈◌̄; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6;01D6;0075 0308 0304;01D6;0075 0308 0304; # (ǖ; ǖ; u◌̈◌̄; ǖ; u◌̈◌̄; ) LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7;01D7;0055 0308 0301;01D7;0055 0308 0301; # (Ǘ; Ǘ; U◌̈◌́; Ǘ; U◌̈◌́; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8;01D8;0075 0308 0301;01D8;0075 0308 0301; # (ǘ; ǘ; u◌̈◌́; ǘ; u◌̈◌́; ) LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9;01D9;0055 0308 030C;01D9;0055 0308 030C; # (Ǚ; Ǚ; U◌̈◌̌; Ǚ; U◌̈◌̌; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA;01DA;0075 0308 030C;01DA;0075 0308 030C; # (ǚ; ǚ; u◌̈◌̌; ǚ; u◌̈◌̌; ) LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB;01DB;0055 0308 0300;01DB;0055 0308 0300; # (Ǜ; Ǜ; U◌̈◌̀; Ǜ; U◌̈◌̀; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC;01DC;0075 0308 0300;01DC;0075 0308 0300; # (ǜ; ǜ; u◌̈◌̀; ǜ; u◌̈◌̀; ) LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DE;01DE;0041 0308 0304;01DE;0041 0308 0304; # (Ǟ; Ǟ; A◌̈◌̄; Ǟ; A◌̈◌̄; ) LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01DF;01DF;0061 0308 0304;01DF;0061 0308 0304; # (ǟ; ǟ; a◌̈◌̄; ǟ; a◌̈◌̄; ) LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E0;01E0;0041 0307 0304;01E0;0041 0307 0304; # (Ǡ; Ǡ; A◌̇◌̄; Ǡ; A◌̇◌̄; ) LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E1;01E1;0061 0307 0304;01E1;0061 0307 0304; # (ǡ; ǡ; a◌̇◌̄; ǡ; a◌̇◌̄; ) LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E2;01E2;00C6 0304;01E2;00C6 0304; # (Ǣ; Ǣ; Æ◌̄; Ǣ; Æ◌̄; ) LATIN CAPITAL LETTER AE WITH MACRON +01E3;01E3;00E6 0304;01E3;00E6 0304; # (ǣ; ǣ; æ◌̄; ǣ; æ◌̄; ) LATIN SMALL LETTER AE WITH MACRON +01E6;01E6;0047 030C;01E6;0047 030C; # (Ǧ; Ǧ; G◌̌; Ǧ; G◌̌; ) LATIN CAPITAL LETTER G WITH CARON +01E7;01E7;0067 030C;01E7;0067 030C; # (ǧ; ǧ; g◌̌; ǧ; g◌̌; ) LATIN SMALL LETTER G WITH CARON +01E8;01E8;004B 030C;01E8;004B 030C; # (Ǩ; Ǩ; K◌̌; Ǩ; K◌̌; ) LATIN CAPITAL LETTER K WITH CARON +01E9;01E9;006B 030C;01E9;006B 030C; # (ǩ; ǩ; k◌̌; ǩ; k◌̌; ) LATIN SMALL LETTER K WITH CARON +01EA;01EA;004F 0328;01EA;004F 0328; # (Ǫ; Ǫ; O◌̨; Ǫ; O◌̨; ) LATIN CAPITAL LETTER O WITH OGONEK +01EB;01EB;006F 0328;01EB;006F 0328; # (ǫ; ǫ; o◌̨; ǫ; o◌̨; ) LATIN SMALL LETTER O WITH OGONEK +01EC;01EC;004F 0328 0304;01EC;004F 0328 0304; # (Ǭ; Ǭ; O◌̨◌̄; Ǭ; O◌̨◌̄; ) LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01ED;01ED;006F 0328 0304;01ED;006F 0328 0304; # (ǭ; ǭ; o◌̨◌̄; ǭ; o◌̨◌̄; ) LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EE;01EE;01B7 030C;01EE;01B7 030C; # (Ǯ; Ǯ; Ʒ◌̌; Ǯ; Ʒ◌̌; ) LATIN CAPITAL LETTER EZH WITH CARON +01EF;01EF;0292 030C;01EF;0292 030C; # (ǯ; ǯ; ʒ◌̌; ǯ; ʒ◌̌; ) LATIN SMALL LETTER EZH WITH CARON +01F0;01F0;006A 030C;01F0;006A 030C; # (ǰ; ǰ; j◌̌; ǰ; j◌̌; ) LATIN SMALL LETTER J WITH CARON +01F1;01F1;01F1;0044 005A;0044 005A; # (DZ; DZ; DZ; DZ; DZ; ) LATIN CAPITAL LETTER DZ +01F2;01F2;01F2;0044 007A;0044 007A; # (Dz; Dz; Dz; Dz; Dz; ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F3;01F3;01F3;0064 007A;0064 007A; # (dz; dz; dz; dz; dz; ) LATIN SMALL LETTER DZ +01F4;01F4;0047 0301;01F4;0047 0301; # (Ǵ; Ǵ; G◌́; Ǵ; G◌́; ) LATIN CAPITAL LETTER G WITH ACUTE +01F5;01F5;0067 0301;01F5;0067 0301; # (ǵ; ǵ; g◌́; ǵ; g◌́; ) LATIN SMALL LETTER G WITH ACUTE +01F8;01F8;004E 0300;01F8;004E 0300; # (Ǹ; Ǹ; N◌̀; Ǹ; N◌̀; ) LATIN CAPITAL LETTER N WITH GRAVE +01F9;01F9;006E 0300;01F9;006E 0300; # (ǹ; ǹ; n◌̀; ǹ; n◌̀; ) LATIN SMALL LETTER N WITH GRAVE +01FA;01FA;0041 030A 0301;01FA;0041 030A 0301; # (Ǻ; Ǻ; A◌̊◌́; Ǻ; A◌̊◌́; ) LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FB;01FB;0061 030A 0301;01FB;0061 030A 0301; # (ǻ; ǻ; a◌̊◌́; ǻ; a◌̊◌́; ) LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FC;01FC;00C6 0301;01FC;00C6 0301; # (Ǽ; Ǽ; Æ◌́; Ǽ; Æ◌́; ) LATIN CAPITAL LETTER AE WITH ACUTE +01FD;01FD;00E6 0301;01FD;00E6 0301; # (ǽ; ǽ; æ◌́; ǽ; æ◌́; ) LATIN SMALL LETTER AE WITH ACUTE +01FE;01FE;00D8 0301;01FE;00D8 0301; # (Ǿ; Ǿ; Ø◌́; Ǿ; Ø◌́; ) LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01FF;01FF;00F8 0301;01FF;00F8 0301; # (ǿ; ǿ; ø◌́; ǿ; ø◌́; ) LATIN SMALL LETTER O WITH STROKE AND ACUTE +0200;0200;0041 030F;0200;0041 030F; # (Ȁ; Ȁ; A◌̏; Ȁ; A◌̏; ) LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0201;0201;0061 030F;0201;0061 030F; # (ȁ; ȁ; a◌̏; ȁ; a◌̏; ) LATIN SMALL LETTER A WITH DOUBLE GRAVE +0202;0202;0041 0311;0202;0041 0311; # (Ȃ; Ȃ; A◌̑; Ȃ; A◌̑; ) LATIN CAPITAL LETTER A WITH INVERTED BREVE +0203;0203;0061 0311;0203;0061 0311; # (ȃ; ȃ; a◌̑; ȃ; a◌̑; ) LATIN SMALL LETTER A WITH INVERTED BREVE +0204;0204;0045 030F;0204;0045 030F; # (Ȅ; Ȅ; E◌̏; Ȅ; E◌̏; ) LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0205;0205;0065 030F;0205;0065 030F; # (ȅ; ȅ; e◌̏; ȅ; e◌̏; ) LATIN SMALL LETTER E WITH DOUBLE GRAVE +0206;0206;0045 0311;0206;0045 0311; # (Ȇ; Ȇ; E◌̑; Ȇ; E◌̑; ) LATIN CAPITAL LETTER E WITH INVERTED BREVE +0207;0207;0065 0311;0207;0065 0311; # (ȇ; ȇ; e◌̑; ȇ; e◌̑; ) LATIN SMALL LETTER E WITH INVERTED BREVE +0208;0208;0049 030F;0208;0049 030F; # (Ȉ; Ȉ; I◌̏; Ȉ; I◌̏; ) LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +0209;0209;0069 030F;0209;0069 030F; # (ȉ; ȉ; i◌̏; ȉ; i◌̏; ) LATIN SMALL LETTER I WITH DOUBLE GRAVE +020A;020A;0049 0311;020A;0049 0311; # (Ȋ; Ȋ; I◌̑; Ȋ; I◌̑; ) LATIN CAPITAL LETTER I WITH INVERTED BREVE +020B;020B;0069 0311;020B;0069 0311; # (ȋ; ȋ; i◌̑; ȋ; i◌̑; ) LATIN SMALL LETTER I WITH INVERTED BREVE +020C;020C;004F 030F;020C;004F 030F; # (Ȍ; Ȍ; O◌̏; Ȍ; O◌̏; ) LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020D;020D;006F 030F;020D;006F 030F; # (ȍ; ȍ; o◌̏; ȍ; o◌̏; ) LATIN SMALL LETTER O WITH DOUBLE GRAVE +020E;020E;004F 0311;020E;004F 0311; # (Ȏ; Ȏ; O◌̑; Ȏ; O◌̑; ) LATIN CAPITAL LETTER O WITH INVERTED BREVE +020F;020F;006F 0311;020F;006F 0311; # (ȏ; ȏ; o◌̑; ȏ; o◌̑; ) LATIN SMALL LETTER O WITH INVERTED BREVE +0210;0210;0052 030F;0210;0052 030F; # (Ȑ; Ȑ; R◌̏; Ȑ; R◌̏; ) LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0211;0211;0072 030F;0211;0072 030F; # (ȑ; ȑ; r◌̏; ȑ; r◌̏; ) LATIN SMALL LETTER R WITH DOUBLE GRAVE +0212;0212;0052 0311;0212;0052 0311; # (Ȓ; Ȓ; R◌̑; Ȓ; R◌̑; ) LATIN CAPITAL LETTER R WITH INVERTED BREVE +0213;0213;0072 0311;0213;0072 0311; # (ȓ; ȓ; r◌̑; ȓ; r◌̑; ) LATIN SMALL LETTER R WITH INVERTED BREVE +0214;0214;0055 030F;0214;0055 030F; # (Ȕ; Ȕ; U◌̏; Ȕ; U◌̏; ) LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0215;0215;0075 030F;0215;0075 030F; # (ȕ; ȕ; u◌̏; ȕ; u◌̏; ) LATIN SMALL LETTER U WITH DOUBLE GRAVE +0216;0216;0055 0311;0216;0055 0311; # (Ȗ; Ȗ; U◌̑; Ȗ; U◌̑; ) LATIN CAPITAL LETTER U WITH INVERTED BREVE +0217;0217;0075 0311;0217;0075 0311; # (ȗ; ȗ; u◌̑; ȗ; u◌̑; ) LATIN SMALL LETTER U WITH INVERTED BREVE +0218;0218;0053 0326;0218;0053 0326; # (Ș; Ș; S◌̦; Ș; S◌̦; ) LATIN CAPITAL LETTER S WITH COMMA BELOW +0219;0219;0073 0326;0219;0073 0326; # (ș; ș; s◌̦; ș; s◌̦; ) LATIN SMALL LETTER S WITH COMMA BELOW +021A;021A;0054 0326;021A;0054 0326; # (Ț; Ț; T◌̦; Ț; T◌̦; ) LATIN CAPITAL LETTER T WITH COMMA BELOW +021B;021B;0074 0326;021B;0074 0326; # (ț; ț; t◌̦; ț; t◌̦; ) LATIN SMALL LETTER T WITH COMMA BELOW +021E;021E;0048 030C;021E;0048 030C; # (Ȟ; Ȟ; H◌̌; Ȟ; H◌̌; ) LATIN CAPITAL LETTER H WITH CARON +021F;021F;0068 030C;021F;0068 030C; # (ȟ; ȟ; h◌̌; ȟ; h◌̌; ) LATIN SMALL LETTER H WITH CARON +0226;0226;0041 0307;0226;0041 0307; # (Ȧ; Ȧ; A◌̇; Ȧ; A◌̇; ) LATIN CAPITAL LETTER A WITH DOT ABOVE +0227;0227;0061 0307;0227;0061 0307; # (ȧ; ȧ; a◌̇; ȧ; a◌̇; ) LATIN SMALL LETTER A WITH DOT ABOVE +0228;0228;0045 0327;0228;0045 0327; # (Ȩ; Ȩ; E◌̧; Ȩ; E◌̧; ) LATIN CAPITAL LETTER E WITH CEDILLA +0229;0229;0065 0327;0229;0065 0327; # (ȩ; ȩ; e◌̧; ȩ; e◌̧; ) LATIN SMALL LETTER E WITH CEDILLA +022A;022A;004F 0308 0304;022A;004F 0308 0304; # (Ȫ; Ȫ; O◌̈◌̄; Ȫ; O◌̈◌̄; ) LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022B;022B;006F 0308 0304;022B;006F 0308 0304; # (ȫ; ȫ; o◌̈◌̄; ȫ; o◌̈◌̄; ) LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022C;022C;004F 0303 0304;022C;004F 0303 0304; # (Ȭ; Ȭ; O◌̃◌̄; Ȭ; O◌̃◌̄; ) LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022D;022D;006F 0303 0304;022D;006F 0303 0304; # (ȭ; ȭ; o◌̃◌̄; ȭ; o◌̃◌̄; ) LATIN SMALL LETTER O WITH TILDE AND MACRON +022E;022E;004F 0307;022E;004F 0307; # (Ȯ; Ȯ; O◌̇; Ȯ; O◌̇; ) LATIN CAPITAL LETTER O WITH DOT ABOVE +022F;022F;006F 0307;022F;006F 0307; # (ȯ; ȯ; o◌̇; ȯ; o◌̇; ) LATIN SMALL LETTER O WITH DOT ABOVE +0230;0230;004F 0307 0304;0230;004F 0307 0304; # (Ȱ; Ȱ; O◌̇◌̄; Ȱ; O◌̇◌̄; ) LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0231;0231;006F 0307 0304;0231;006F 0307 0304; # (ȱ; ȱ; o◌̇◌̄; ȱ; o◌̇◌̄; ) LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0232;0232;0059 0304;0232;0059 0304; # (Ȳ; Ȳ; Y◌̄; Ȳ; Y◌̄; ) LATIN CAPITAL LETTER Y WITH MACRON +0233;0233;0079 0304;0233;0079 0304; # (ȳ; ȳ; y◌̄; ȳ; y◌̄; ) LATIN SMALL LETTER Y WITH MACRON +02B0;02B0;02B0;0068;0068; # (ʰ; ʰ; ʰ; h; h; ) MODIFIER LETTER SMALL H +02B1;02B1;02B1;0266;0266; # (ʱ; ʱ; ʱ; ɦ; ɦ; ) MODIFIER LETTER SMALL H WITH HOOK +02B2;02B2;02B2;006A;006A; # (ʲ; ʲ; ʲ; j; j; ) MODIFIER LETTER SMALL J +02B3;02B3;02B3;0072;0072; # (ʳ; ʳ; ʳ; r; r; ) MODIFIER LETTER SMALL R +02B4;02B4;02B4;0279;0279; # (ʴ; ʴ; ʴ; ɹ; ɹ; ) MODIFIER LETTER SMALL TURNED R +02B5;02B5;02B5;027B;027B; # (ʵ; ʵ; ʵ; ɻ; ɻ; ) MODIFIER LETTER SMALL TURNED R WITH HOOK +02B6;02B6;02B6;0281;0281; # (ʶ; ʶ; ʶ; ʁ; ʁ; ) MODIFIER LETTER SMALL CAPITAL INVERTED R +02B7;02B7;02B7;0077;0077; # (ʷ; ʷ; ʷ; w; w; ) MODIFIER LETTER SMALL W +02B8;02B8;02B8;0079;0079; # (ʸ; ʸ; ʸ; y; y; ) MODIFIER LETTER SMALL Y +02D8;02D8;02D8;0020 0306;0020 0306; # (˘; ˘; ˘; ◌̆; ◌̆; ) BREVE +02D9;02D9;02D9;0020 0307;0020 0307; # (˙; ˙; ˙; ◌̇; ◌̇; ) DOT ABOVE +02DA;02DA;02DA;0020 030A;0020 030A; # (˚; ˚; ˚; ◌̊; ◌̊; ) RING ABOVE +02DB;02DB;02DB;0020 0328;0020 0328; # (˛; ˛; ˛; ◌̨; ◌̨; ) OGONEK +02DC;02DC;02DC;0020 0303;0020 0303; # (˜; ˜; ˜; ◌̃; ◌̃; ) SMALL TILDE +02DD;02DD;02DD;0020 030B;0020 030B; # (˝; ˝; ˝; ◌̋; ◌̋; ) DOUBLE ACUTE ACCENT +02E0;02E0;02E0;0263;0263; # (ˠ; ˠ; ˠ; ɣ; ɣ; ) MODIFIER LETTER SMALL GAMMA +02E1;02E1;02E1;006C;006C; # (ˡ; ˡ; ˡ; l; l; ) MODIFIER LETTER SMALL L +02E2;02E2;02E2;0073;0073; # (ˢ; ˢ; ˢ; s; s; ) MODIFIER LETTER SMALL S +02E3;02E3;02E3;0078;0078; # (ˣ; ˣ; ˣ; x; x; ) MODIFIER LETTER SMALL X +02E4;02E4;02E4;0295;0295; # (ˤ; ˤ; ˤ; ʕ; ʕ; ) MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0340;0300;0300;0300;0300; # (◌̀; ◌̀; ◌̀; ◌̀; ◌̀; ) COMBINING GRAVE TONE MARK +0341;0301;0301;0301;0301; # (◌́; ◌́; ◌́; ◌́; ◌́; ) COMBINING ACUTE TONE MARK +0343;0313;0313;0313;0313; # (◌̓; ◌̓; ◌̓; ◌̓; ◌̓; ) COMBINING GREEK KORONIS +0344;0308 0301;0308 0301;0308 0301;0308 0301; # (◌̈́; ◌̈◌́; ◌̈◌́; ◌̈◌́; ◌̈◌́; ) COMBINING GREEK DIALYTIKA TONOS +0374;02B9;02B9;02B9;02B9; # (ʹ; ʹ; ʹ; ʹ; ʹ; ) GREEK NUMERAL SIGN +037A;037A;037A;0020 0345;0020 0345; # (ͺ; ͺ; ͺ; ◌ͅ; ◌ͅ; ) GREEK YPOGEGRAMMENI +037E;003B;003B;003B;003B; # (;; ;; ;; ;; ;; ) GREEK QUESTION MARK +0384;0384;0384;0020 0301;0020 0301; # (΄; ΄; ΄; ◌́; ◌́; ) GREEK TONOS +0385;0385;00A8 0301;0020 0308 0301;0020 0308 0301; # (΅; ΅; ¨◌́; ◌̈◌́; ◌̈◌́; ) GREEK DIALYTIKA TONOS +0386;0386;0391 0301;0386;0391 0301; # (Ά; Ά; Α◌́; Ά; Α◌́; ) GREEK CAPITAL LETTER ALPHA WITH TONOS +0387;00B7;00B7;00B7;00B7; # (·; ·; ·; ·; ·; ) GREEK ANO TELEIA +0388;0388;0395 0301;0388;0395 0301; # (Έ; Έ; Ε◌́; Έ; Ε◌́; ) GREEK CAPITAL LETTER EPSILON WITH TONOS +0389;0389;0397 0301;0389;0397 0301; # (Ή; Ή; Η◌́; Ή; Η◌́; ) GREEK CAPITAL LETTER ETA WITH TONOS +038A;038A;0399 0301;038A;0399 0301; # (Ί; Ί; Ι◌́; Ί; Ι◌́; ) GREEK CAPITAL LETTER IOTA WITH TONOS +038C;038C;039F 0301;038C;039F 0301; # (Ό; Ό; Ο◌́; Ό; Ο◌́; ) GREEK CAPITAL LETTER OMICRON WITH TONOS +038E;038E;03A5 0301;038E;03A5 0301; # (Ύ; Ύ; Υ◌́; Ύ; Υ◌́; ) GREEK CAPITAL LETTER UPSILON WITH TONOS +038F;038F;03A9 0301;038F;03A9 0301; # (Ώ; Ώ; Ω◌́; Ώ; Ω◌́; ) GREEK CAPITAL LETTER OMEGA WITH TONOS +0390;0390;03B9 0308 0301;0390;03B9 0308 0301; # (ΐ; ΐ; ι◌̈◌́; ΐ; ι◌̈◌́; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AA;03AA;0399 0308;03AA;0399 0308; # (Ϊ; Ϊ; Ι◌̈; Ϊ; Ι◌̈; ) GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB;03AB;03A5 0308;03AB;03A5 0308; # (Ϋ; Ϋ; Υ◌̈; Ϋ; Υ◌̈; ) GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03AC;03AC;03B1 0301;03AC;03B1 0301; # (ά; ά; α◌́; ά; α◌́; ) GREEK SMALL LETTER ALPHA WITH TONOS +03AD;03AD;03B5 0301;03AD;03B5 0301; # (έ; έ; ε◌́; έ; ε◌́; ) GREEK SMALL LETTER EPSILON WITH TONOS +03AE;03AE;03B7 0301;03AE;03B7 0301; # (ή; ή; η◌́; ή; η◌́; ) GREEK SMALL LETTER ETA WITH TONOS +03AF;03AF;03B9 0301;03AF;03B9 0301; # (ί; ί; ι◌́; ί; ι◌́; ) GREEK SMALL LETTER IOTA WITH TONOS +03B0;03B0;03C5 0308 0301;03B0;03C5 0308 0301; # (ΰ; ΰ; υ◌̈◌́; ΰ; υ◌̈◌́; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03CA;03CA;03B9 0308;03CA;03B9 0308; # (ϊ; ϊ; ι◌̈; ϊ; ι◌̈; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA +03CB;03CB;03C5 0308;03CB;03C5 0308; # (ϋ; ϋ; υ◌̈; ϋ; υ◌̈; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03CC;03CC;03BF 0301;03CC;03BF 0301; # (ό; ό; ο◌́; ό; ο◌́; ) GREEK SMALL LETTER OMICRON WITH TONOS +03CD;03CD;03C5 0301;03CD;03C5 0301; # (ύ; ύ; υ◌́; ύ; υ◌́; ) GREEK SMALL LETTER UPSILON WITH TONOS +03CE;03CE;03C9 0301;03CE;03C9 0301; # (ώ; ώ; ω◌́; ώ; ω◌́; ) GREEK SMALL LETTER OMEGA WITH TONOS +03D0;03D0;03D0;03B2;03B2; # (ϐ; ϐ; ϐ; β; β; ) GREEK BETA SYMBOL +03D1;03D1;03D1;03B8;03B8; # (ϑ; ϑ; ϑ; θ; θ; ) GREEK THETA SYMBOL +03D2;03D2;03D2;03A5;03A5; # (ϒ; ϒ; ϒ; Υ; Υ; ) GREEK UPSILON WITH HOOK SYMBOL +03D3;03D3;03D2 0301;038E;03A5 0301; # (ϓ; ϓ; ϒ◌́; Ύ; Υ◌́; ) GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +03D4;03D4;03D2 0308;03AB;03A5 0308; # (ϔ; ϔ; ϒ◌̈; Ϋ; Υ◌̈; ) GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D5;03D5;03D5;03C6;03C6; # (ϕ; ϕ; ϕ; φ; φ; ) GREEK PHI SYMBOL +03D6;03D6;03D6;03C0;03C0; # (ϖ; ϖ; ϖ; π; π; ) GREEK PI SYMBOL +03F0;03F0;03F0;03BA;03BA; # (ϰ; ϰ; ϰ; κ; κ; ) GREEK KAPPA SYMBOL +03F1;03F1;03F1;03C1;03C1; # (ϱ; ϱ; ϱ; ρ; ρ; ) GREEK RHO SYMBOL +03F2;03F2;03F2;03C2;03C2; # (ϲ; ϲ; ϲ; ς; ς; ) GREEK LUNATE SIGMA SYMBOL +03F4;03F4;03F4;0398;0398; # (ϴ; ϴ; ϴ; Θ; Θ; ) GREEK CAPITAL THETA SYMBOL +03F5;03F5;03F5;03B5;03B5; # (ϵ; ϵ; ϵ; ε; ε; ) GREEK LUNATE EPSILON SYMBOL +0400;0400;0415 0300;0400;0415 0300; # (Ѐ; Ѐ; Е◌̀; Ѐ; Е◌̀; ) CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401;0401;0415 0308;0401;0415 0308; # (Ё; Ё; Е◌̈; Ё; Е◌̈; ) CYRILLIC CAPITAL LETTER IO +0403;0403;0413 0301;0403;0413 0301; # (Ѓ; Ѓ; Г◌́; Ѓ; Г◌́; ) CYRILLIC CAPITAL LETTER GJE +0407;0407;0406 0308;0407;0406 0308; # (Ї; Ї; І◌̈; Ї; І◌̈; ) CYRILLIC CAPITAL LETTER YI +040C;040C;041A 0301;040C;041A 0301; # (Ќ; Ќ; К◌́; Ќ; К◌́; ) CYRILLIC CAPITAL LETTER KJE +040D;040D;0418 0300;040D;0418 0300; # (Ѝ; Ѝ; И◌̀; Ѝ; И◌̀; ) CYRILLIC CAPITAL LETTER I WITH GRAVE +040E;040E;0423 0306;040E;0423 0306; # (Ў; Ў; У◌̆; Ў; У◌̆; ) CYRILLIC CAPITAL LETTER SHORT U +0419;0419;0418 0306;0419;0418 0306; # (Й; Й; И◌̆; Й; И◌̆; ) CYRILLIC CAPITAL LETTER SHORT I +0439;0439;0438 0306;0439;0438 0306; # (й; й; и◌̆; й; и◌̆; ) CYRILLIC SMALL LETTER SHORT I +0450;0450;0435 0300;0450;0435 0300; # (ѐ; ѐ; е◌̀; ѐ; е◌̀; ) CYRILLIC SMALL LETTER IE WITH GRAVE +0451;0451;0435 0308;0451;0435 0308; # (ё; ё; е◌̈; ё; е◌̈; ) CYRILLIC SMALL LETTER IO +0453;0453;0433 0301;0453;0433 0301; # (ѓ; ѓ; г◌́; ѓ; г◌́; ) CYRILLIC SMALL LETTER GJE +0457;0457;0456 0308;0457;0456 0308; # (ї; ї; і◌̈; ї; і◌̈; ) CYRILLIC SMALL LETTER YI +045C;045C;043A 0301;045C;043A 0301; # (ќ; ќ; к◌́; ќ; к◌́; ) CYRILLIC SMALL LETTER KJE +045D;045D;0438 0300;045D;0438 0300; # (ѝ; ѝ; и◌̀; ѝ; и◌̀; ) CYRILLIC SMALL LETTER I WITH GRAVE +045E;045E;0443 0306;045E;0443 0306; # (ў; ў; у◌̆; ў; у◌̆; ) CYRILLIC SMALL LETTER SHORT U +0476;0476;0474 030F;0476;0474 030F; # (Ѷ; Ѷ; Ѵ◌̏; Ѷ; Ѵ◌̏; ) CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0477;0477;0475 030F;0477;0475 030F; # (ѷ; ѷ; ѵ◌̏; ѷ; ѵ◌̏; ) CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +04C1;04C1;0416 0306;04C1;0416 0306; # (Ӂ; Ӂ; Ж◌̆; Ӂ; Ж◌̆; ) CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C2;04C2;0436 0306;04C2;0436 0306; # (ӂ; ӂ; ж◌̆; ӂ; ж◌̆; ) CYRILLIC SMALL LETTER ZHE WITH BREVE +04D0;04D0;0410 0306;04D0;0410 0306; # (Ӑ; Ӑ; А◌̆; Ӑ; А◌̆; ) CYRILLIC CAPITAL LETTER A WITH BREVE +04D1;04D1;0430 0306;04D1;0430 0306; # (ӑ; ӑ; а◌̆; ӑ; а◌̆; ) CYRILLIC SMALL LETTER A WITH BREVE +04D2;04D2;0410 0308;04D2;0410 0308; # (Ӓ; Ӓ; А◌̈; Ӓ; А◌̈; ) CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D3;04D3;0430 0308;04D3;0430 0308; # (ӓ; ӓ; а◌̈; ӓ; а◌̈; ) CYRILLIC SMALL LETTER A WITH DIAERESIS +04D6;04D6;0415 0306;04D6;0415 0306; # (Ӗ; Ӗ; Е◌̆; Ӗ; Е◌̆; ) CYRILLIC CAPITAL LETTER IE WITH BREVE +04D7;04D7;0435 0306;04D7;0435 0306; # (ӗ; ӗ; е◌̆; ӗ; е◌̆; ) CYRILLIC SMALL LETTER IE WITH BREVE +04DA;04DA;04D8 0308;04DA;04D8 0308; # (Ӛ; Ӛ; Ә◌̈; Ӛ; Ә◌̈; ) CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DB;04DB;04D9 0308;04DB;04D9 0308; # (ӛ; ӛ; ә◌̈; ӛ; ә◌̈; ) CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DC;04DC;0416 0308;04DC;0416 0308; # (Ӝ; Ӝ; Ж◌̈; Ӝ; Ж◌̈; ) CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DD;04DD;0436 0308;04DD;0436 0308; # (ӝ; ӝ; ж◌̈; ӝ; ж◌̈; ) CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DE;04DE;0417 0308;04DE;0417 0308; # (Ӟ; Ӟ; З◌̈; Ӟ; З◌̈; ) CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04DF;04DF;0437 0308;04DF;0437 0308; # (ӟ; ӟ; з◌̈; ӟ; з◌̈; ) CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E2;04E2;0418 0304;04E2;0418 0304; # (Ӣ; Ӣ; И◌̄; Ӣ; И◌̄; ) CYRILLIC CAPITAL LETTER I WITH MACRON +04E3;04E3;0438 0304;04E3;0438 0304; # (ӣ; ӣ; и◌̄; ӣ; и◌̄; ) CYRILLIC SMALL LETTER I WITH MACRON +04E4;04E4;0418 0308;04E4;0418 0308; # (Ӥ; Ӥ; И◌̈; Ӥ; И◌̈; ) CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E5;04E5;0438 0308;04E5;0438 0308; # (ӥ; ӥ; и◌̈; ӥ; и◌̈; ) CYRILLIC SMALL LETTER I WITH DIAERESIS +04E6;04E6;041E 0308;04E6;041E 0308; # (Ӧ; Ӧ; О◌̈; Ӧ; О◌̈; ) CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E7;04E7;043E 0308;04E7;043E 0308; # (ӧ; ӧ; о◌̈; ӧ; о◌̈; ) CYRILLIC SMALL LETTER O WITH DIAERESIS +04EA;04EA;04E8 0308;04EA;04E8 0308; # (Ӫ; Ӫ; Ө◌̈; Ӫ; Ө◌̈; ) CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EB;04EB;04E9 0308;04EB;04E9 0308; # (ӫ; ӫ; ө◌̈; ӫ; ө◌̈; ) CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EC;04EC;042D 0308;04EC;042D 0308; # (Ӭ; Ӭ; Э◌̈; Ӭ; Э◌̈; ) CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04ED;04ED;044D 0308;04ED;044D 0308; # (ӭ; ӭ; э◌̈; ӭ; э◌̈; ) CYRILLIC SMALL LETTER E WITH DIAERESIS +04EE;04EE;0423 0304;04EE;0423 0304; # (Ӯ; Ӯ; У◌̄; Ӯ; У◌̄; ) CYRILLIC CAPITAL LETTER U WITH MACRON +04EF;04EF;0443 0304;04EF;0443 0304; # (ӯ; ӯ; у◌̄; ӯ; у◌̄; ) CYRILLIC SMALL LETTER U WITH MACRON +04F0;04F0;0423 0308;04F0;0423 0308; # (Ӱ; Ӱ; У◌̈; Ӱ; У◌̈; ) CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F1;04F1;0443 0308;04F1;0443 0308; # (ӱ; ӱ; у◌̈; ӱ; у◌̈; ) CYRILLIC SMALL LETTER U WITH DIAERESIS +04F2;04F2;0423 030B;04F2;0423 030B; # (Ӳ; Ӳ; У◌̋; Ӳ; У◌̋; ) CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F3;04F3;0443 030B;04F3;0443 030B; # (ӳ; ӳ; у◌̋; ӳ; у◌̋; ) CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F4;04F4;0427 0308;04F4;0427 0308; # (Ӵ; Ӵ; Ч◌̈; Ӵ; Ч◌̈; ) CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F5;04F5;0447 0308;04F5;0447 0308; # (ӵ; ӵ; ч◌̈; ӵ; ч◌̈; ) CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F8;04F8;042B 0308;04F8;042B 0308; # (Ӹ; Ӹ; Ы◌̈; Ӹ; Ы◌̈; ) CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04F9;04F9;044B 0308;04F9;044B 0308; # (ӹ; ӹ; ы◌̈; ӹ; ы◌̈; ) CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0587;0587;0587;0565 0582;0565 0582; # (և; և; և; եւ; եւ; ) ARMENIAN SMALL LIGATURE ECH YIWN +0622;0622;0627 0653;0622;0627 0653; # (آ; آ; ا◌ٓ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE +0623;0623;0627 0654;0623;0627 0654; # (أ; أ; ا◌ٔ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE +0624;0624;0648 0654;0624;0648 0654; # (ؤ; ؤ; و◌ٔ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE +0625;0625;0627 0655;0625;0627 0655; # (إ; إ; ا◌ٕ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW +0626;0626;064A 0654;0626;064A 0654; # (ئ; ئ; ي◌ٔ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE +0675;0675;0675;0627 0674;0627 0674; # (ٵ; ٵ; ٵ; اٴ; اٴ; ) ARABIC LETTER HIGH HAMZA ALEF +0676;0676;0676;0648 0674;0648 0674; # (ٶ; ٶ; ٶ; وٴ; وٴ; ) ARABIC LETTER HIGH HAMZA WAW +0677;0677;0677;06C7 0674;06C7 0674; # (ٷ; ٷ; ٷ; ۇٴ; ۇٴ; ) ARABIC LETTER U WITH HAMZA ABOVE +0678;0678;0678;064A 0674;064A 0674; # (ٸ; ٸ; ٸ; يٴ; يٴ; ) ARABIC LETTER HIGH HAMZA YEH +06C0;06C0;06D5 0654;06C0;06D5 0654; # (ۀ; ۀ; ە◌ٔ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE +06C2;06C2;06C1 0654;06C2;06C1 0654; # (ۂ; ۂ; ہ◌ٔ; ۂ; ہ◌ٔ; ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06D3;06D3;06D2 0654;06D3;06D2 0654; # (ۓ; ۓ; ے◌ٔ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +0929;0929;0928 093C;0929;0928 093C; # (ऩ; ऩ; न◌़; ऩ; न◌़; ) DEVANAGARI LETTER NNNA +0931;0931;0930 093C;0931;0930 093C; # (ऱ; ऱ; र◌़; ऱ; र◌़; ) DEVANAGARI LETTER RRA +0934;0934;0933 093C;0934;0933 093C; # (ऴ; ऴ; ळ◌़; ऴ; ळ◌़; ) DEVANAGARI LETTER LLLA +0958;0915 093C;0915 093C;0915 093C;0915 093C; # (क़; क◌़; क◌़; क◌़; क◌़; ) DEVANAGARI LETTER QA +0959;0916 093C;0916 093C;0916 093C;0916 093C; # (ख़; ख◌़; ख◌़; ख◌़; ख◌़; ) DEVANAGARI LETTER KHHA +095A;0917 093C;0917 093C;0917 093C;0917 093C; # (ग़; ग◌़; ग◌़; ग◌़; ग◌़; ) DEVANAGARI LETTER GHHA +095B;091C 093C;091C 093C;091C 093C;091C 093C; # (ज़; ज◌़; ज◌़; ज◌़; ज◌़; ) DEVANAGARI LETTER ZA +095C;0921 093C;0921 093C;0921 093C;0921 093C; # (ड़; ड◌़; ड◌़; ड◌़; ड◌़; ) DEVANAGARI LETTER DDDHA +095D;0922 093C;0922 093C;0922 093C;0922 093C; # (ढ़; ढ◌़; ढ◌़; ढ◌़; ढ◌़; ) DEVANAGARI LETTER RHA +095E;092B 093C;092B 093C;092B 093C;092B 093C; # (फ़; फ◌़; फ◌़; फ◌़; फ◌़; ) DEVANAGARI LETTER FA +095F;092F 093C;092F 093C;092F 093C;092F 093C; # (य़; य◌़; य◌़; य◌़; य◌़; ) DEVANAGARI LETTER YYA +09CB;09CB;09C7 09BE;09CB;09C7 09BE; # (ো; ো; ো; ো; ো; ) BENGALI VOWEL SIGN O +09CC;09CC;09C7 09D7;09CC;09C7 09D7; # (ৌ; ৌ; ৌ; ৌ; ৌ; ) BENGALI VOWEL SIGN AU +09DC;09A1 09BC;09A1 09BC;09A1 09BC;09A1 09BC; # (ড়; ড◌়; ড◌়; ড◌়; ড◌়; ) BENGALI LETTER RRA +09DD;09A2 09BC;09A2 09BC;09A2 09BC;09A2 09BC; # (ঢ়; ঢ◌়; ঢ◌়; ঢ◌়; ঢ◌়; ) BENGALI LETTER RHA +09DF;09AF 09BC;09AF 09BC;09AF 09BC;09AF 09BC; # (য়; য◌়; য◌়; য◌়; য◌়; ) BENGALI LETTER YYA +0A33;0A32 0A3C;0A32 0A3C;0A32 0A3C;0A32 0A3C; # (ਲ਼; ਲ◌਼; ਲ◌਼; ਲ◌਼; ਲ◌਼; ) GURMUKHI LETTER LLA +0A36;0A38 0A3C;0A38 0A3C;0A38 0A3C;0A38 0A3C; # (ਸ਼; ਸ◌਼; ਸ◌਼; ਸ◌਼; ਸ◌਼; ) GURMUKHI LETTER SHA +0A59;0A16 0A3C;0A16 0A3C;0A16 0A3C;0A16 0A3C; # (ਖ਼; ਖ◌਼; ਖ◌਼; ਖ◌਼; ਖ◌਼; ) GURMUKHI LETTER KHHA +0A5A;0A17 0A3C;0A17 0A3C;0A17 0A3C;0A17 0A3C; # (ਗ਼; ਗ◌਼; ਗ◌਼; ਗ◌਼; ਗ◌਼; ) GURMUKHI LETTER GHHA +0A5B;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C; # (ਜ਼; ਜ◌਼; ਜ◌਼; ਜ◌਼; ਜ◌਼; ) GURMUKHI LETTER ZA +0A5E;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C; # (ਫ਼; ਫ◌਼; ਫ◌਼; ਫ◌਼; ਫ◌਼; ) GURMUKHI LETTER FA +0B48;0B48;0B47 0B56;0B48;0B47 0B56; # (ୈ; ୈ; େ◌ୖ; ୈ; େ◌ୖ; ) ORIYA VOWEL SIGN AI +0B4B;0B4B;0B47 0B3E;0B4B;0B47 0B3E; # (ୋ; ୋ; ୋ; ୋ; ୋ; ) ORIYA VOWEL SIGN O +0B4C;0B4C;0B47 0B57;0B4C;0B47 0B57; # (ୌ; ୌ; ୌ; ୌ; ୌ; ) ORIYA VOWEL SIGN AU +0B5C;0B21 0B3C;0B21 0B3C;0B21 0B3C;0B21 0B3C; # (ଡ଼; ଡ◌଼; ଡ◌଼; ଡ◌଼; ଡ◌଼; ) ORIYA LETTER RRA +0B5D;0B22 0B3C;0B22 0B3C;0B22 0B3C;0B22 0B3C; # (ଢ଼; ଢ◌଼; ଢ◌଼; ଢ◌଼; ଢ◌଼; ) ORIYA LETTER RHA +0B94;0B94;0B92 0BD7;0B94;0B92 0BD7; # (ஔ; ஔ; ஔ; ஔ; ஔ; ) TAMIL LETTER AU +0BCA;0BCA;0BC6 0BBE;0BCA;0BC6 0BBE; # (ொ; ொ; ொ; ொ; ொ; ) TAMIL VOWEL SIGN O +0BCB;0BCB;0BC7 0BBE;0BCB;0BC7 0BBE; # (ோ; ோ; ோ; ோ; ோ; ) TAMIL VOWEL SIGN OO +0BCC;0BCC;0BC6 0BD7;0BCC;0BC6 0BD7; # (ௌ; ௌ; ௌ; ௌ; ௌ; ) TAMIL VOWEL SIGN AU +0C48;0C48;0C46 0C56;0C48;0C46 0C56; # (◌ై; ◌ై; ◌ె◌ౖ; ◌ై; ◌ె◌ౖ; ) TELUGU VOWEL SIGN AI +0CC0;0CC0;0CBF 0CD5;0CC0;0CBF 0CD5; # (ೀ; ೀ; ◌ೀ; ೀ; ◌ೀ; ) KANNADA VOWEL SIGN II +0CC7;0CC7;0CC6 0CD5;0CC7;0CC6 0CD5; # (ೇ; ೇ; ◌ೇ; ೇ; ◌ೇ; ) KANNADA VOWEL SIGN EE +0CC8;0CC8;0CC6 0CD6;0CC8;0CC6 0CD6; # (ೈ; ೈ; ◌ೈ; ೈ; ◌ೈ; ) KANNADA VOWEL SIGN AI +0CCA;0CCA;0CC6 0CC2;0CCA;0CC6 0CC2; # (ೊ; ೊ; ◌ೊ; ೊ; ◌ೊ; ) KANNADA VOWEL SIGN O +0CCB;0CCB;0CC6 0CC2 0CD5;0CCB;0CC6 0CC2 0CD5; # (ೋ; ೋ; ◌ೋ; ೋ; ◌ೋ; ) KANNADA VOWEL SIGN OO +0D4A;0D4A;0D46 0D3E;0D4A;0D46 0D3E; # (ൊ; ൊ; ൊ; ൊ; ൊ; ) MALAYALAM VOWEL SIGN O +0D4B;0D4B;0D47 0D3E;0D4B;0D47 0D3E; # (ോ; ോ; ോ; ോ; ോ; ) MALAYALAM VOWEL SIGN OO +0D4C;0D4C;0D46 0D57;0D4C;0D46 0D57; # (ൌ; ൌ; ൌ; ൌ; ൌ; ) MALAYALAM VOWEL SIGN AU +0DDA;0DDA;0DD9 0DCA;0DDA;0DD9 0DCA; # (ේ; ේ; ෙ◌්; ේ; ෙ◌්; ) SINHALA VOWEL SIGN DIGA KOMBUVA +0DDC;0DDC;0DD9 0DCF;0DDC;0DD9 0DCF; # (ො; ො; ො; ො; ො; ) SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD;0DDD;0DD9 0DCF 0DCA;0DDD;0DD9 0DCF 0DCA; # (ෝ; ෝ; ො◌්; ෝ; ො◌්; ) SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE;0DDE;0DD9 0DDF;0DDE;0DD9 0DDF; # (ෞ; ෞ; ෞ; ෞ; ෞ; ) SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0E33;0E33;0E33;0E4D 0E32;0E4D 0E32; # (ำ; ำ; ำ; ◌ํา; ◌ํา; ) THAI CHARACTER SARA AM +0EB3;0EB3;0EB3;0ECD 0EB2;0ECD 0EB2; # (ຳ; ຳ; ຳ; ◌ໍາ; ◌ໍາ; ) LAO VOWEL SIGN AM +0EDC;0EDC;0EDC;0EAB 0E99;0EAB 0E99; # (ໜ; ໜ; ໜ; ຫນ; ຫນ; ) LAO HO NO +0EDD;0EDD;0EDD;0EAB 0EA1;0EAB 0EA1; # (ໝ; ໝ; ໝ; ຫມ; ຫມ; ) LAO HO MO +0F0C;0F0C;0F0C;0F0B;0F0B; # (༌; ༌; ༌; ་; ་; ) TIBETAN MARK DELIMITER TSHEG BSTAR +0F43;0F42 0FB7;0F42 0FB7;0F42 0FB7;0F42 0FB7; # (གྷ; ག◌ྷ; ག◌ྷ; ག◌ྷ; ག◌ྷ; ) TIBETAN LETTER GHA +0F4D;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7; # (ཌྷ; ཌ◌ྷ; ཌ◌ྷ; ཌ◌ྷ; ཌ◌ྷ; ) TIBETAN LETTER DDHA +0F52;0F51 0FB7;0F51 0FB7;0F51 0FB7;0F51 0FB7; # (དྷ; ད◌ྷ; ད◌ྷ; ད◌ྷ; ད◌ྷ; ) TIBETAN LETTER DHA +0F57;0F56 0FB7;0F56 0FB7;0F56 0FB7;0F56 0FB7; # (བྷ; བ◌ྷ; བ◌ྷ; བ◌ྷ; བ◌ྷ; ) TIBETAN LETTER BHA +0F5C;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7; # (ཛྷ; ཛ◌ྷ; ཛ◌ྷ; ཛ◌ྷ; ཛ◌ྷ; ) TIBETAN LETTER DZHA +0F69;0F40 0FB5;0F40 0FB5;0F40 0FB5;0F40 0FB5; # (ཀྵ; ཀ◌ྵ; ཀ◌ྵ; ཀ◌ྵ; ཀ◌ྵ; ) TIBETAN LETTER KSSA +0F73;0F71 0F72;0F71 0F72;0F71 0F72;0F71 0F72; # (◌ཱི; ◌ཱ◌ི; ◌ཱ◌ི; ◌ཱ◌ི; ◌ཱ◌ི; ) TIBETAN VOWEL SIGN II +0F75;0F71 0F74;0F71 0F74;0F71 0F74;0F71 0F74; # (◌ཱུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ) TIBETAN VOWEL SIGN UU +0F76;0FB2 0F80;0FB2 0F80;0FB2 0F80;0FB2 0F80; # (◌ྲྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC R +0F77;0F77;0F77;0FB2 0F71 0F80;0FB2 0F71 0F80; # (◌ཷ; ◌ཷ; ◌ཷ; ◌ྲ◌ཱ◌ྀ; ◌ྲ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC RR +0F78;0FB3 0F80;0FB3 0F80;0FB3 0F80;0FB3 0F80; # (◌ླྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC L +0F79;0F79;0F79;0FB3 0F71 0F80;0FB3 0F71 0F80; # (◌ཹ; ◌ཹ; ◌ཹ; ◌ླ◌ཱ◌ྀ; ◌ླ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC LL +0F81;0F71 0F80;0F71 0F80;0F71 0F80;0F71 0F80; # (◌ཱྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN REVERSED II +0F93;0F92 0FB7;0F92 0FB7;0F92 0FB7;0F92 0FB7; # (◌ྒྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ) TIBETAN SUBJOINED LETTER GHA +0F9D;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7; # (◌ྜྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ) TIBETAN SUBJOINED LETTER DDHA +0FA2;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7; # (◌ྡྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ) TIBETAN SUBJOINED LETTER DHA +0FA7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7; # (◌ྦྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ) TIBETAN SUBJOINED LETTER BHA +0FAC;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7; # (◌ྫྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ) TIBETAN SUBJOINED LETTER DZHA +0FB9;0F90 0FB5;0F90 0FB5;0F90 0FB5;0F90 0FB5; # (◌ྐྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ) TIBETAN SUBJOINED LETTER KSSA +1026;1026;1025 102E;1026;1025 102E; # (ဦ; ဦ; ဥ◌ီ; ဦ; ဥ◌ီ; ) MYANMAR LETTER UU +1E00;1E00;0041 0325;1E00;0041 0325; # (Ḁ; Ḁ; A◌̥; Ḁ; A◌̥; ) LATIN CAPITAL LETTER A WITH RING BELOW +1E01;1E01;0061 0325;1E01;0061 0325; # (ḁ; ḁ; a◌̥; ḁ; a◌̥; ) LATIN SMALL LETTER A WITH RING BELOW +1E02;1E02;0042 0307;1E02;0042 0307; # (Ḃ; Ḃ; B◌̇; Ḃ; B◌̇; ) LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03;1E03;0062 0307;1E03;0062 0307; # (ḃ; ḃ; b◌̇; ḃ; b◌̇; ) LATIN SMALL LETTER B WITH DOT ABOVE +1E04;1E04;0042 0323;1E04;0042 0323; # (Ḅ; Ḅ; B◌̣; Ḅ; B◌̣; ) LATIN CAPITAL LETTER B WITH DOT BELOW +1E05;1E05;0062 0323;1E05;0062 0323; # (ḅ; ḅ; b◌̣; ḅ; b◌̣; ) LATIN SMALL LETTER B WITH DOT BELOW +1E06;1E06;0042 0331;1E06;0042 0331; # (Ḇ; Ḇ; B◌̱; Ḇ; B◌̱; ) LATIN CAPITAL LETTER B WITH LINE BELOW +1E07;1E07;0062 0331;1E07;0062 0331; # (ḇ; ḇ; b◌̱; ḇ; b◌̱; ) LATIN SMALL LETTER B WITH LINE BELOW +1E08;1E08;0043 0327 0301;1E08;0043 0327 0301; # (Ḉ; Ḉ; C◌̧◌́; Ḉ; C◌̧◌́; ) LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E09;1E09;0063 0327 0301;1E09;0063 0327 0301; # (ḉ; ḉ; c◌̧◌́; ḉ; c◌̧◌́; ) LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0A;1E0A;0044 0307;1E0A;0044 0307; # (Ḋ; Ḋ; D◌̇; Ḋ; D◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B;1E0B;0064 0307;1E0B;0064 0307; # (ḋ; ḋ; d◌̇; ḋ; d◌̇; ) LATIN SMALL LETTER D WITH DOT ABOVE +1E0C;1E0C;0044 0323;1E0C;0044 0323; # (Ḍ; Ḍ; D◌̣; Ḍ; D◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW +1E0D;1E0D;0064 0323;1E0D;0064 0323; # (ḍ; ḍ; d◌̣; ḍ; d◌̣; ) LATIN SMALL LETTER D WITH DOT BELOW +1E0E;1E0E;0044 0331;1E0E;0044 0331; # (Ḏ; Ḏ; D◌̱; Ḏ; D◌̱; ) LATIN CAPITAL LETTER D WITH LINE BELOW +1E0F;1E0F;0064 0331;1E0F;0064 0331; # (ḏ; ḏ; d◌̱; ḏ; d◌̱; ) LATIN SMALL LETTER D WITH LINE BELOW +1E10;1E10;0044 0327;1E10;0044 0327; # (Ḑ; Ḑ; D◌̧; Ḑ; D◌̧; ) LATIN CAPITAL LETTER D WITH CEDILLA +1E11;1E11;0064 0327;1E11;0064 0327; # (ḑ; ḑ; d◌̧; ḑ; d◌̧; ) LATIN SMALL LETTER D WITH CEDILLA +1E12;1E12;0044 032D;1E12;0044 032D; # (Ḓ; Ḓ; D◌̭; Ḓ; D◌̭; ) LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E13;1E13;0064 032D;1E13;0064 032D; # (ḓ; ḓ; d◌̭; ḓ; d◌̭; ) LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E14;1E14;0045 0304 0300;1E14;0045 0304 0300; # (Ḕ; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E15;1E15;0065 0304 0300;1E15;0065 0304 0300; # (ḕ; ḕ; e◌̄◌̀; ḕ; e◌̄◌̀; ) LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E16;1E16;0045 0304 0301;1E16;0045 0304 0301; # (Ḗ; Ḗ; E◌̄◌́; Ḗ; E◌̄◌́; ) LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E17;1E17;0065 0304 0301;1E17;0065 0304 0301; # (ḗ; ḗ; e◌̄◌́; ḗ; e◌̄◌́; ) LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E18;1E18;0045 032D;1E18;0045 032D; # (Ḙ; Ḙ; E◌̭; Ḙ; E◌̭; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E19;1E19;0065 032D;1E19;0065 032D; # (ḙ; ḙ; e◌̭; ḙ; e◌̭; ) LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1A;1E1A;0045 0330;1E1A;0045 0330; # (Ḛ; Ḛ; E◌̰; Ḛ; E◌̰; ) LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1B;1E1B;0065 0330;1E1B;0065 0330; # (ḛ; ḛ; e◌̰; ḛ; e◌̰; ) LATIN SMALL LETTER E WITH TILDE BELOW +1E1C;1E1C;0045 0327 0306;1E1C;0045 0327 0306; # (Ḝ; Ḝ; E◌̧◌̆; Ḝ; E◌̧◌̆; ) LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1D;1E1D;0065 0327 0306;1E1D;0065 0327 0306; # (ḝ; ḝ; e◌̧◌̆; ḝ; e◌̧◌̆; ) LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1E;1E1E;0046 0307;1E1E;0046 0307; # (Ḟ; Ḟ; F◌̇; Ḟ; F◌̇; ) LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F;1E1F;0066 0307;1E1F;0066 0307; # (ḟ; ḟ; f◌̇; ḟ; f◌̇; ) LATIN SMALL LETTER F WITH DOT ABOVE +1E20;1E20;0047 0304;1E20;0047 0304; # (Ḡ; Ḡ; G◌̄; Ḡ; G◌̄; ) LATIN CAPITAL LETTER G WITH MACRON +1E21;1E21;0067 0304;1E21;0067 0304; # (ḡ; ḡ; g◌̄; ḡ; g◌̄; ) LATIN SMALL LETTER G WITH MACRON +1E22;1E22;0048 0307;1E22;0048 0307; # (Ḣ; Ḣ; H◌̇; Ḣ; H◌̇; ) LATIN CAPITAL LETTER H WITH DOT ABOVE +1E23;1E23;0068 0307;1E23;0068 0307; # (ḣ; ḣ; h◌̇; ḣ; h◌̇; ) LATIN SMALL LETTER H WITH DOT ABOVE +1E24;1E24;0048 0323;1E24;0048 0323; # (Ḥ; Ḥ; H◌̣; Ḥ; H◌̣; ) LATIN CAPITAL LETTER H WITH DOT BELOW +1E25;1E25;0068 0323;1E25;0068 0323; # (ḥ; ḥ; h◌̣; ḥ; h◌̣; ) LATIN SMALL LETTER H WITH DOT BELOW +1E26;1E26;0048 0308;1E26;0048 0308; # (Ḧ; Ḧ; H◌̈; Ḧ; H◌̈; ) LATIN CAPITAL LETTER H WITH DIAERESIS +1E27;1E27;0068 0308;1E27;0068 0308; # (ḧ; ḧ; h◌̈; ḧ; h◌̈; ) LATIN SMALL LETTER H WITH DIAERESIS +1E28;1E28;0048 0327;1E28;0048 0327; # (Ḩ; Ḩ; H◌̧; Ḩ; H◌̧; ) LATIN CAPITAL LETTER H WITH CEDILLA +1E29;1E29;0068 0327;1E29;0068 0327; # (ḩ; ḩ; h◌̧; ḩ; h◌̧; ) LATIN SMALL LETTER H WITH CEDILLA +1E2A;1E2A;0048 032E;1E2A;0048 032E; # (Ḫ; Ḫ; H◌̮; Ḫ; H◌̮; ) LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2B;1E2B;0068 032E;1E2B;0068 032E; # (ḫ; ḫ; h◌̮; ḫ; h◌̮; ) LATIN SMALL LETTER H WITH BREVE BELOW +1E2C;1E2C;0049 0330;1E2C;0049 0330; # (Ḭ; Ḭ; I◌̰; Ḭ; I◌̰; ) LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2D;1E2D;0069 0330;1E2D;0069 0330; # (ḭ; ḭ; i◌̰; ḭ; i◌̰; ) LATIN SMALL LETTER I WITH TILDE BELOW +1E2E;1E2E;0049 0308 0301;1E2E;0049 0308 0301; # (Ḯ; Ḯ; I◌̈◌́; Ḯ; I◌̈◌́; ) LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E2F;1E2F;0069 0308 0301;1E2F;0069 0308 0301; # (ḯ; ḯ; i◌̈◌́; ḯ; i◌̈◌́; ) LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E30;1E30;004B 0301;1E30;004B 0301; # (Ḱ; Ḱ; K◌́; Ḱ; K◌́; ) LATIN CAPITAL LETTER K WITH ACUTE +1E31;1E31;006B 0301;1E31;006B 0301; # (ḱ; ḱ; k◌́; ḱ; k◌́; ) LATIN SMALL LETTER K WITH ACUTE +1E32;1E32;004B 0323;1E32;004B 0323; # (Ḳ; Ḳ; K◌̣; Ḳ; K◌̣; ) LATIN CAPITAL LETTER K WITH DOT BELOW +1E33;1E33;006B 0323;1E33;006B 0323; # (ḳ; ḳ; k◌̣; ḳ; k◌̣; ) LATIN SMALL LETTER K WITH DOT BELOW +1E34;1E34;004B 0331;1E34;004B 0331; # (Ḵ; Ḵ; K◌̱; Ḵ; K◌̱; ) LATIN CAPITAL LETTER K WITH LINE BELOW +1E35;1E35;006B 0331;1E35;006B 0331; # (ḵ; ḵ; k◌̱; ḵ; k◌̱; ) LATIN SMALL LETTER K WITH LINE BELOW +1E36;1E36;004C 0323;1E36;004C 0323; # (Ḷ; Ḷ; L◌̣; Ḷ; L◌̣; ) LATIN CAPITAL LETTER L WITH DOT BELOW +1E37;1E37;006C 0323;1E37;006C 0323; # (ḷ; ḷ; l◌̣; ḷ; l◌̣; ) LATIN SMALL LETTER L WITH DOT BELOW +1E38;1E38;004C 0323 0304;1E38;004C 0323 0304; # (Ḹ; Ḹ; L◌̣◌̄; Ḹ; L◌̣◌̄; ) LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E39;1E39;006C 0323 0304;1E39;006C 0323 0304; # (ḹ; ḹ; l◌̣◌̄; ḹ; l◌̣◌̄; ) LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3A;1E3A;004C 0331;1E3A;004C 0331; # (Ḻ; Ḻ; L◌̱; Ḻ; L◌̱; ) LATIN CAPITAL LETTER L WITH LINE BELOW +1E3B;1E3B;006C 0331;1E3B;006C 0331; # (ḻ; ḻ; l◌̱; ḻ; l◌̱; ) LATIN SMALL LETTER L WITH LINE BELOW +1E3C;1E3C;004C 032D;1E3C;004C 032D; # (Ḽ; Ḽ; L◌̭; Ḽ; L◌̭; ) LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3D;1E3D;006C 032D;1E3D;006C 032D; # (ḽ; ḽ; l◌̭; ḽ; l◌̭; ) LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3E;1E3E;004D 0301;1E3E;004D 0301; # (Ḿ; Ḿ; M◌́; Ḿ; M◌́; ) LATIN CAPITAL LETTER M WITH ACUTE +1E3F;1E3F;006D 0301;1E3F;006D 0301; # (ḿ; ḿ; m◌́; ḿ; m◌́; ) LATIN SMALL LETTER M WITH ACUTE +1E40;1E40;004D 0307;1E40;004D 0307; # (Ṁ; Ṁ; M◌̇; Ṁ; M◌̇; ) LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41;1E41;006D 0307;1E41;006D 0307; # (ṁ; ṁ; m◌̇; ṁ; m◌̇; ) LATIN SMALL LETTER M WITH DOT ABOVE +1E42;1E42;004D 0323;1E42;004D 0323; # (Ṃ; Ṃ; M◌̣; Ṃ; M◌̣; ) LATIN CAPITAL LETTER M WITH DOT BELOW +1E43;1E43;006D 0323;1E43;006D 0323; # (ṃ; ṃ; m◌̣; ṃ; m◌̣; ) LATIN SMALL LETTER M WITH DOT BELOW +1E44;1E44;004E 0307;1E44;004E 0307; # (Ṅ; Ṅ; N◌̇; Ṅ; N◌̇; ) LATIN CAPITAL LETTER N WITH DOT ABOVE +1E45;1E45;006E 0307;1E45;006E 0307; # (ṅ; ṅ; n◌̇; ṅ; n◌̇; ) LATIN SMALL LETTER N WITH DOT ABOVE +1E46;1E46;004E 0323;1E46;004E 0323; # (Ṇ; Ṇ; N◌̣; Ṇ; N◌̣; ) LATIN CAPITAL LETTER N WITH DOT BELOW +1E47;1E47;006E 0323;1E47;006E 0323; # (ṇ; ṇ; n◌̣; ṇ; n◌̣; ) LATIN SMALL LETTER N WITH DOT BELOW +1E48;1E48;004E 0331;1E48;004E 0331; # (Ṉ; Ṉ; N◌̱; Ṉ; N◌̱; ) LATIN CAPITAL LETTER N WITH LINE BELOW +1E49;1E49;006E 0331;1E49;006E 0331; # (ṉ; ṉ; n◌̱; ṉ; n◌̱; ) LATIN SMALL LETTER N WITH LINE BELOW +1E4A;1E4A;004E 032D;1E4A;004E 032D; # (Ṋ; Ṋ; N◌̭; Ṋ; N◌̭; ) LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4B;1E4B;006E 032D;1E4B;006E 032D; # (ṋ; ṋ; n◌̭; ṋ; n◌̭; ) LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4C;1E4C;004F 0303 0301;1E4C;004F 0303 0301; # (Ṍ; Ṍ; O◌̃◌́; Ṍ; O◌̃◌́; ) LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4D;1E4D;006F 0303 0301;1E4D;006F 0303 0301; # (ṍ; ṍ; o◌̃◌́; ṍ; o◌̃◌́; ) LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4E;1E4E;004F 0303 0308;1E4E;004F 0303 0308; # (Ṏ; Ṏ; O◌̃◌̈; Ṏ; O◌̃◌̈; ) LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E4F;1E4F;006F 0303 0308;1E4F;006F 0303 0308; # (ṏ; ṏ; o◌̃◌̈; ṏ; o◌̃◌̈; ) LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E50;1E50;004F 0304 0300;1E50;004F 0304 0300; # (Ṑ; Ṑ; O◌̄◌̀; Ṑ; O◌̄◌̀; ) LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E51;1E51;006F 0304 0300;1E51;006F 0304 0300; # (ṑ; ṑ; o◌̄◌̀; ṑ; o◌̄◌̀; ) LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E52;1E52;004F 0304 0301;1E52;004F 0304 0301; # (Ṓ; Ṓ; O◌̄◌́; Ṓ; O◌̄◌́; ) LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E53;1E53;006F 0304 0301;1E53;006F 0304 0301; # (ṓ; ṓ; o◌̄◌́; ṓ; o◌̄◌́; ) LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E54;1E54;0050 0301;1E54;0050 0301; # (Ṕ; Ṕ; P◌́; Ṕ; P◌́; ) LATIN CAPITAL LETTER P WITH ACUTE +1E55;1E55;0070 0301;1E55;0070 0301; # (ṕ; ṕ; p◌́; ṕ; p◌́; ) LATIN SMALL LETTER P WITH ACUTE +1E56;1E56;0050 0307;1E56;0050 0307; # (Ṗ; Ṗ; P◌̇; Ṗ; P◌̇; ) LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57;1E57;0070 0307;1E57;0070 0307; # (ṗ; ṗ; p◌̇; ṗ; p◌̇; ) LATIN SMALL LETTER P WITH DOT ABOVE +1E58;1E58;0052 0307;1E58;0052 0307; # (Ṙ; Ṙ; R◌̇; Ṙ; R◌̇; ) LATIN CAPITAL LETTER R WITH DOT ABOVE +1E59;1E59;0072 0307;1E59;0072 0307; # (ṙ; ṙ; r◌̇; ṙ; r◌̇; ) LATIN SMALL LETTER R WITH DOT ABOVE +1E5A;1E5A;0052 0323;1E5A;0052 0323; # (Ṛ; Ṛ; R◌̣; Ṛ; R◌̣; ) LATIN CAPITAL LETTER R WITH DOT BELOW +1E5B;1E5B;0072 0323;1E5B;0072 0323; # (ṛ; ṛ; r◌̣; ṛ; r◌̣; ) LATIN SMALL LETTER R WITH DOT BELOW +1E5C;1E5C;0052 0323 0304;1E5C;0052 0323 0304; # (Ṝ; Ṝ; R◌̣◌̄; Ṝ; R◌̣◌̄; ) LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5D;1E5D;0072 0323 0304;1E5D;0072 0323 0304; # (ṝ; ṝ; r◌̣◌̄; ṝ; r◌̣◌̄; ) LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5E;1E5E;0052 0331;1E5E;0052 0331; # (Ṟ; Ṟ; R◌̱; Ṟ; R◌̱; ) LATIN CAPITAL LETTER R WITH LINE BELOW +1E5F;1E5F;0072 0331;1E5F;0072 0331; # (ṟ; ṟ; r◌̱; ṟ; r◌̱; ) LATIN SMALL LETTER R WITH LINE BELOW +1E60;1E60;0053 0307;1E60;0053 0307; # (Ṡ; Ṡ; S◌̇; Ṡ; S◌̇; ) LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61;1E61;0073 0307;1E61;0073 0307; # (ṡ; ṡ; s◌̇; ṡ; s◌̇; ) LATIN SMALL LETTER S WITH DOT ABOVE +1E62;1E62;0053 0323;1E62;0053 0323; # (Ṣ; Ṣ; S◌̣; Ṣ; S◌̣; ) LATIN CAPITAL LETTER S WITH DOT BELOW +1E63;1E63;0073 0323;1E63;0073 0323; # (ṣ; ṣ; s◌̣; ṣ; s◌̣; ) LATIN SMALL LETTER S WITH DOT BELOW +1E64;1E64;0053 0301 0307;1E64;0053 0301 0307; # (Ṥ; Ṥ; S◌́◌̇; Ṥ; S◌́◌̇; ) LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E65;1E65;0073 0301 0307;1E65;0073 0301 0307; # (ṥ; ṥ; s◌́◌̇; ṥ; s◌́◌̇; ) LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E66;1E66;0053 030C 0307;1E66;0053 030C 0307; # (Ṧ; Ṧ; S◌̌◌̇; Ṧ; S◌̌◌̇; ) LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E67;1E67;0073 030C 0307;1E67;0073 030C 0307; # (ṧ; ṧ; s◌̌◌̇; ṧ; s◌̌◌̇; ) LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E68;1E68;0053 0323 0307;1E68;0053 0323 0307; # (Ṩ; Ṩ; S◌̣◌̇; Ṩ; S◌̣◌̇; ) LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E69;1E69;0073 0323 0307;1E69;0073 0323 0307; # (ṩ; ṩ; s◌̣◌̇; ṩ; s◌̣◌̇; ) LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A;1E6A;0054 0307;1E6A;0054 0307; # (Ṫ; Ṫ; T◌̇; Ṫ; T◌̇; ) LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B;1E6B;0074 0307;1E6B;0074 0307; # (ṫ; ṫ; t◌̇; ṫ; t◌̇; ) LATIN SMALL LETTER T WITH DOT ABOVE +1E6C;1E6C;0054 0323;1E6C;0054 0323; # (Ṭ; Ṭ; T◌̣; Ṭ; T◌̣; ) LATIN CAPITAL LETTER T WITH DOT BELOW +1E6D;1E6D;0074 0323;1E6D;0074 0323; # (ṭ; ṭ; t◌̣; ṭ; t◌̣; ) LATIN SMALL LETTER T WITH DOT BELOW +1E6E;1E6E;0054 0331;1E6E;0054 0331; # (Ṯ; Ṯ; T◌̱; Ṯ; T◌̱; ) LATIN CAPITAL LETTER T WITH LINE BELOW +1E6F;1E6F;0074 0331;1E6F;0074 0331; # (ṯ; ṯ; t◌̱; ṯ; t◌̱; ) LATIN SMALL LETTER T WITH LINE BELOW +1E70;1E70;0054 032D;1E70;0054 032D; # (Ṱ; Ṱ; T◌̭; Ṱ; T◌̭; ) LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E71;1E71;0074 032D;1E71;0074 032D; # (ṱ; ṱ; t◌̭; ṱ; t◌̭; ) LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E72;1E72;0055 0324;1E72;0055 0324; # (Ṳ; Ṳ; U◌̤; Ṳ; U◌̤; ) LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E73;1E73;0075 0324;1E73;0075 0324; # (ṳ; ṳ; u◌̤; ṳ; u◌̤; ) LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E74;1E74;0055 0330;1E74;0055 0330; # (Ṵ; Ṵ; U◌̰; Ṵ; U◌̰; ) LATIN CAPITAL LETTER U WITH TILDE BELOW +1E75;1E75;0075 0330;1E75;0075 0330; # (ṵ; ṵ; u◌̰; ṵ; u◌̰; ) LATIN SMALL LETTER U WITH TILDE BELOW +1E76;1E76;0055 032D;1E76;0055 032D; # (Ṷ; Ṷ; U◌̭; Ṷ; U◌̭; ) LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E77;1E77;0075 032D;1E77;0075 032D; # (ṷ; ṷ; u◌̭; ṷ; u◌̭; ) LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E78;1E78;0055 0303 0301;1E78;0055 0303 0301; # (Ṹ; Ṹ; U◌̃◌́; Ṹ; U◌̃◌́; ) LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E79;1E79;0075 0303 0301;1E79;0075 0303 0301; # (ṹ; ṹ; u◌̃◌́; ṹ; u◌̃◌́; ) LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7A;1E7A;0055 0304 0308;1E7A;0055 0304 0308; # (Ṻ; Ṻ; U◌̄◌̈; Ṻ; U◌̄◌̈; ) LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7B;1E7B;0075 0304 0308;1E7B;0075 0304 0308; # (ṻ; ṻ; u◌̄◌̈; ṻ; u◌̄◌̈; ) LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7C;1E7C;0056 0303;1E7C;0056 0303; # (Ṽ; Ṽ; V◌̃; Ṽ; V◌̃; ) LATIN CAPITAL LETTER V WITH TILDE +1E7D;1E7D;0076 0303;1E7D;0076 0303; # (ṽ; ṽ; v◌̃; ṽ; v◌̃; ) LATIN SMALL LETTER V WITH TILDE +1E7E;1E7E;0056 0323;1E7E;0056 0323; # (Ṿ; Ṿ; V◌̣; Ṿ; V◌̣; ) LATIN CAPITAL LETTER V WITH DOT BELOW +1E7F;1E7F;0076 0323;1E7F;0076 0323; # (ṿ; ṿ; v◌̣; ṿ; v◌̣; ) LATIN SMALL LETTER V WITH DOT BELOW +1E80;1E80;0057 0300;1E80;0057 0300; # (Ẁ; Ẁ; W◌̀; Ẁ; W◌̀; ) LATIN CAPITAL LETTER W WITH GRAVE +1E81;1E81;0077 0300;1E81;0077 0300; # (ẁ; ẁ; w◌̀; ẁ; w◌̀; ) LATIN SMALL LETTER W WITH GRAVE +1E82;1E82;0057 0301;1E82;0057 0301; # (Ẃ; Ẃ; W◌́; Ẃ; W◌́; ) LATIN CAPITAL LETTER W WITH ACUTE +1E83;1E83;0077 0301;1E83;0077 0301; # (ẃ; ẃ; w◌́; ẃ; w◌́; ) LATIN SMALL LETTER W WITH ACUTE +1E84;1E84;0057 0308;1E84;0057 0308; # (Ẅ; Ẅ; W◌̈; Ẅ; W◌̈; ) LATIN CAPITAL LETTER W WITH DIAERESIS +1E85;1E85;0077 0308;1E85;0077 0308; # (ẅ; ẅ; w◌̈; ẅ; w◌̈; ) LATIN SMALL LETTER W WITH DIAERESIS +1E86;1E86;0057 0307;1E86;0057 0307; # (Ẇ; Ẇ; W◌̇; Ẇ; W◌̇; ) LATIN CAPITAL LETTER W WITH DOT ABOVE +1E87;1E87;0077 0307;1E87;0077 0307; # (ẇ; ẇ; w◌̇; ẇ; w◌̇; ) LATIN SMALL LETTER W WITH DOT ABOVE +1E88;1E88;0057 0323;1E88;0057 0323; # (Ẉ; Ẉ; W◌̣; Ẉ; W◌̣; ) LATIN CAPITAL LETTER W WITH DOT BELOW +1E89;1E89;0077 0323;1E89;0077 0323; # (ẉ; ẉ; w◌̣; ẉ; w◌̣; ) LATIN SMALL LETTER W WITH DOT BELOW +1E8A;1E8A;0058 0307;1E8A;0058 0307; # (Ẋ; Ẋ; X◌̇; Ẋ; X◌̇; ) LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8B;1E8B;0078 0307;1E8B;0078 0307; # (ẋ; ẋ; x◌̇; ẋ; x◌̇; ) LATIN SMALL LETTER X WITH DOT ABOVE +1E8C;1E8C;0058 0308;1E8C;0058 0308; # (Ẍ; Ẍ; X◌̈; Ẍ; X◌̈; ) LATIN CAPITAL LETTER X WITH DIAERESIS +1E8D;1E8D;0078 0308;1E8D;0078 0308; # (ẍ; ẍ; x◌̈; ẍ; x◌̈; ) LATIN SMALL LETTER X WITH DIAERESIS +1E8E;1E8E;0059 0307;1E8E;0059 0307; # (Ẏ; Ẏ; Y◌̇; Ẏ; Y◌̇; ) LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E8F;1E8F;0079 0307;1E8F;0079 0307; # (ẏ; ẏ; y◌̇; ẏ; y◌̇; ) LATIN SMALL LETTER Y WITH DOT ABOVE +1E90;1E90;005A 0302;1E90;005A 0302; # (Ẑ; Ẑ; Z◌̂; Ẑ; Z◌̂; ) LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E91;1E91;007A 0302;1E91;007A 0302; # (ẑ; ẑ; z◌̂; ẑ; z◌̂; ) LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E92;1E92;005A 0323;1E92;005A 0323; # (Ẓ; Ẓ; Z◌̣; Ẓ; Z◌̣; ) LATIN CAPITAL LETTER Z WITH DOT BELOW +1E93;1E93;007A 0323;1E93;007A 0323; # (ẓ; ẓ; z◌̣; ẓ; z◌̣; ) LATIN SMALL LETTER Z WITH DOT BELOW +1E94;1E94;005A 0331;1E94;005A 0331; # (Ẕ; Ẕ; Z◌̱; Ẕ; Z◌̱; ) LATIN CAPITAL LETTER Z WITH LINE BELOW +1E95;1E95;007A 0331;1E95;007A 0331; # (ẕ; ẕ; z◌̱; ẕ; z◌̱; ) LATIN SMALL LETTER Z WITH LINE BELOW +1E96;1E96;0068 0331;1E96;0068 0331; # (ẖ; ẖ; h◌̱; ẖ; h◌̱; ) LATIN SMALL LETTER H WITH LINE BELOW +1E97;1E97;0074 0308;1E97;0074 0308; # (ẗ; ẗ; t◌̈; ẗ; t◌̈; ) LATIN SMALL LETTER T WITH DIAERESIS +1E98;1E98;0077 030A;1E98;0077 030A; # (ẘ; ẘ; w◌̊; ẘ; w◌̊; ) LATIN SMALL LETTER W WITH RING ABOVE +1E99;1E99;0079 030A;1E99;0079 030A; # (ẙ; ẙ; y◌̊; ẙ; y◌̊; ) LATIN SMALL LETTER Y WITH RING ABOVE +1E9A;1E9A;1E9A;0061 02BE;0061 02BE; # (ẚ; ẚ; ẚ; aʾ; aʾ; ) LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B;1E9B;017F 0307;1E61;0073 0307; # (ẛ; ẛ; ſ◌̇; ṡ; s◌̇; ) LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0;1EA0;0041 0323;1EA0;0041 0323; # (Ạ; Ạ; A◌̣; Ạ; A◌̣; ) LATIN CAPITAL LETTER A WITH DOT BELOW +1EA1;1EA1;0061 0323;1EA1;0061 0323; # (ạ; ạ; a◌̣; ạ; a◌̣; ) LATIN SMALL LETTER A WITH DOT BELOW +1EA2;1EA2;0041 0309;1EA2;0041 0309; # (Ả; Ả; A◌̉; Ả; A◌̉; ) LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA3;1EA3;0061 0309;1EA3;0061 0309; # (ả; ả; a◌̉; ả; a◌̉; ) LATIN SMALL LETTER A WITH HOOK ABOVE +1EA4;1EA4;0041 0302 0301;1EA4;0041 0302 0301; # (Ấ; Ấ; A◌̂◌́; Ấ; A◌̂◌́; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA5;1EA5;0061 0302 0301;1EA5;0061 0302 0301; # (ấ; ấ; a◌̂◌́; ấ; a◌̂◌́; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6;1EA6;0041 0302 0300;1EA6;0041 0302 0300; # (Ầ; Ầ; A◌̂◌̀; Ầ; A◌̂◌̀; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA7;1EA7;0061 0302 0300;1EA7;0061 0302 0300; # (ầ; ầ; a◌̂◌̀; ầ; a◌̂◌̀; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8;1EA8;0041 0302 0309;1EA8;0041 0302 0309; # (Ẩ; Ẩ; A◌̂◌̉; Ẩ; A◌̂◌̉; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA9;1EA9;0061 0302 0309;1EA9;0061 0302 0309; # (ẩ; ẩ; a◌̂◌̉; ẩ; a◌̂◌̉; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA;1EAA;0041 0302 0303;1EAA;0041 0302 0303; # (Ẫ; Ẫ; A◌̂◌̃; Ẫ; A◌̂◌̃; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAB;1EAB;0061 0302 0303;1EAB;0061 0302 0303; # (ẫ; ẫ; a◌̂◌̃; ẫ; a◌̂◌̃; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC;1EAC;0041 0323 0302;1EAC;0041 0323 0302; # (Ậ; Ậ; A◌̣◌̂; Ậ; A◌̣◌̂; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAD;1EAD;0061 0323 0302;1EAD;0061 0323 0302; # (ậ; ậ; a◌̣◌̂; ậ; a◌̣◌̂; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE;1EAE;0041 0306 0301;1EAE;0041 0306 0301; # (Ắ; Ắ; A◌̆◌́; Ắ; A◌̆◌́; ) LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EAF;1EAF;0061 0306 0301;1EAF;0061 0306 0301; # (ắ; ắ; a◌̆◌́; ắ; a◌̆◌́; ) LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB0;1EB0;0041 0306 0300;1EB0;0041 0306 0300; # (Ằ; Ằ; A◌̆◌̀; Ằ; A◌̆◌̀; ) LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB1;1EB1;0061 0306 0300;1EB1;0061 0306 0300; # (ằ; ằ; a◌̆◌̀; ằ; a◌̆◌̀; ) LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB2;1EB2;0041 0306 0309;1EB2;0041 0306 0309; # (Ẳ; Ẳ; A◌̆◌̉; Ẳ; A◌̆◌̉; ) LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB3;1EB3;0061 0306 0309;1EB3;0061 0306 0309; # (ẳ; ẳ; a◌̆◌̉; ẳ; a◌̆◌̉; ) LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB4;1EB4;0041 0306 0303;1EB4;0041 0306 0303; # (Ẵ; Ẵ; A◌̆◌̃; Ẵ; A◌̆◌̃; ) LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB5;1EB5;0061 0306 0303;1EB5;0061 0306 0303; # (ẵ; ẵ; a◌̆◌̃; ẵ; a◌̆◌̃; ) LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB6;1EB6;0041 0323 0306;1EB6;0041 0323 0306; # (Ặ; Ặ; A◌̣◌̆; Ặ; A◌̣◌̆; ) LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB7;1EB7;0061 0323 0306;1EB7;0061 0323 0306; # (ặ; ặ; a◌̣◌̆; ặ; a◌̣◌̆; ) LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB8;1EB8;0045 0323;1EB8;0045 0323; # (Ẹ; Ẹ; E◌̣; Ẹ; E◌̣; ) LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9;1EB9;0065 0323;1EB9;0065 0323; # (ẹ; ẹ; e◌̣; ẹ; e◌̣; ) LATIN SMALL LETTER E WITH DOT BELOW +1EBA;1EBA;0045 0309;1EBA;0045 0309; # (Ẻ; Ẻ; E◌̉; Ẻ; E◌̉; ) LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBB;1EBB;0065 0309;1EBB;0065 0309; # (ẻ; ẻ; e◌̉; ẻ; e◌̉; ) LATIN SMALL LETTER E WITH HOOK ABOVE +1EBC;1EBC;0045 0303;1EBC;0045 0303; # (Ẽ; Ẽ; E◌̃; Ẽ; E◌̃; ) LATIN CAPITAL LETTER E WITH TILDE +1EBD;1EBD;0065 0303;1EBD;0065 0303; # (ẽ; ẽ; e◌̃; ẽ; e◌̃; ) LATIN SMALL LETTER E WITH TILDE +1EBE;1EBE;0045 0302 0301;1EBE;0045 0302 0301; # (Ế; Ế; E◌̂◌́; Ế; E◌̂◌́; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBF;1EBF;0065 0302 0301;1EBF;0065 0302 0301; # (ế; ế; e◌̂◌́; ế; e◌̂◌́; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0;1EC0;0045 0302 0300;1EC0;0045 0302 0300; # (Ề; Ề; E◌̂◌̀; Ề; E◌̂◌̀; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC1;1EC1;0065 0302 0300;1EC1;0065 0302 0300; # (ề; ề; e◌̂◌̀; ề; e◌̂◌̀; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2;1EC2;0045 0302 0309;1EC2;0045 0302 0309; # (Ể; Ể; E◌̂◌̉; Ể; E◌̂◌̉; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC3;1EC3;0065 0302 0309;1EC3;0065 0302 0309; # (ể; ể; e◌̂◌̉; ể; e◌̂◌̉; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4;1EC4;0045 0302 0303;1EC4;0045 0302 0303; # (Ễ; Ễ; E◌̂◌̃; Ễ; E◌̂◌̃; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC5;1EC5;0065 0302 0303;1EC5;0065 0302 0303; # (ễ; ễ; e◌̂◌̃; ễ; e◌̂◌̃; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6;1EC6;0045 0323 0302;1EC6;0045 0323 0302; # (Ệ; Ệ; E◌̣◌̂; Ệ; E◌̣◌̂; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC7;1EC7;0065 0323 0302;1EC7;0065 0323 0302; # (ệ; ệ; e◌̣◌̂; ệ; e◌̣◌̂; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8;1EC8;0049 0309;1EC8;0049 0309; # (Ỉ; Ỉ; I◌̉; Ỉ; I◌̉; ) LATIN CAPITAL LETTER I WITH HOOK ABOVE +1EC9;1EC9;0069 0309;1EC9;0069 0309; # (ỉ; ỉ; i◌̉; ỉ; i◌̉; ) LATIN SMALL LETTER I WITH HOOK ABOVE +1ECA;1ECA;0049 0323;1ECA;0049 0323; # (Ị; Ị; I◌̣; Ị; I◌̣; ) LATIN CAPITAL LETTER I WITH DOT BELOW +1ECB;1ECB;0069 0323;1ECB;0069 0323; # (ị; ị; i◌̣; ị; i◌̣; ) LATIN SMALL LETTER I WITH DOT BELOW +1ECC;1ECC;004F 0323;1ECC;004F 0323; # (Ọ; Ọ; O◌̣; Ọ; O◌̣; ) LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD;1ECD;006F 0323;1ECD;006F 0323; # (ọ; ọ; o◌̣; ọ; o◌̣; ) LATIN SMALL LETTER O WITH DOT BELOW +1ECE;1ECE;004F 0309;1ECE;004F 0309; # (Ỏ; Ỏ; O◌̉; Ỏ; O◌̉; ) LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ECF;1ECF;006F 0309;1ECF;006F 0309; # (ỏ; ỏ; o◌̉; ỏ; o◌̉; ) LATIN SMALL LETTER O WITH HOOK ABOVE +1ED0;1ED0;004F 0302 0301;1ED0;004F 0302 0301; # (Ố; Ố; O◌̂◌́; Ố; O◌̂◌́; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED1;1ED1;006F 0302 0301;1ED1;006F 0302 0301; # (ố; ố; o◌̂◌́; ố; o◌̂◌́; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2;1ED2;004F 0302 0300;1ED2;004F 0302 0300; # (Ồ; Ồ; O◌̂◌̀; Ồ; O◌̂◌̀; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED3;1ED3;006F 0302 0300;1ED3;006F 0302 0300; # (ồ; ồ; o◌̂◌̀; ồ; o◌̂◌̀; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4;1ED4;004F 0302 0309;1ED4;004F 0302 0309; # (Ổ; Ổ; O◌̂◌̉; Ổ; O◌̂◌̉; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED5;1ED5;006F 0302 0309;1ED5;006F 0302 0309; # (ổ; ổ; o◌̂◌̉; ổ; o◌̂◌̉; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6;1ED6;004F 0302 0303;1ED6;004F 0302 0303; # (Ỗ; Ỗ; O◌̂◌̃; Ỗ; O◌̂◌̃; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED7;1ED7;006F 0302 0303;1ED7;006F 0302 0303; # (ỗ; ỗ; o◌̂◌̃; ỗ; o◌̂◌̃; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8;1ED8;004F 0323 0302;1ED8;004F 0323 0302; # (Ộ; Ộ; O◌̣◌̂; Ộ; O◌̣◌̂; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED9;1ED9;006F 0323 0302;1ED9;006F 0323 0302; # (ộ; ộ; o◌̣◌̂; ộ; o◌̣◌̂; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA;1EDA;004F 031B 0301;1EDA;004F 031B 0301; # (Ớ; Ớ; O◌̛◌́; Ớ; O◌̛◌́; ) LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDB;1EDB;006F 031B 0301;1EDB;006F 031B 0301; # (ớ; ớ; o◌̛◌́; ớ; o◌̛◌́; ) LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDC;1EDC;004F 031B 0300;1EDC;004F 031B 0300; # (Ờ; Ờ; O◌̛◌̀; Ờ; O◌̛◌̀; ) LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDD;1EDD;006F 031B 0300;1EDD;006F 031B 0300; # (ờ; ờ; o◌̛◌̀; ờ; o◌̛◌̀; ) LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDE;1EDE;004F 031B 0309;1EDE;004F 031B 0309; # (Ở; Ở; O◌̛◌̉; Ở; O◌̛◌̉; ) LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EDF;1EDF;006F 031B 0309;1EDF;006F 031B 0309; # (ở; ở; o◌̛◌̉; ở; o◌̛◌̉; ) LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE0;1EE0;004F 031B 0303;1EE0;004F 031B 0303; # (Ỡ; Ỡ; O◌̛◌̃; Ỡ; O◌̛◌̃; ) LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE1;1EE1;006F 031B 0303;1EE1;006F 031B 0303; # (ỡ; ỡ; o◌̛◌̃; ỡ; o◌̛◌̃; ) LATIN SMALL LETTER O WITH HORN AND TILDE +1EE2;1EE2;004F 031B 0323;1EE2;004F 031B 0323; # (Ợ; Ợ; O◌̛◌̣; Ợ; O◌̛◌̣; ) LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE3;1EE3;006F 031B 0323;1EE3;006F 031B 0323; # (ợ; ợ; o◌̛◌̣; ợ; o◌̛◌̣; ) LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE4;1EE4;0055 0323;1EE4;0055 0323; # (Ụ; Ụ; U◌̣; Ụ; U◌̣; ) LATIN CAPITAL LETTER U WITH DOT BELOW +1EE5;1EE5;0075 0323;1EE5;0075 0323; # (ụ; ụ; u◌̣; ụ; u◌̣; ) LATIN SMALL LETTER U WITH DOT BELOW +1EE6;1EE6;0055 0309;1EE6;0055 0309; # (Ủ; Ủ; U◌̉; Ủ; U◌̉; ) LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE7;1EE7;0075 0309;1EE7;0075 0309; # (ủ; ủ; u◌̉; ủ; u◌̉; ) LATIN SMALL LETTER U WITH HOOK ABOVE +1EE8;1EE8;0055 031B 0301;1EE8;0055 031B 0301; # (Ứ; Ứ; U◌̛◌́; Ứ; U◌̛◌́; ) LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EE9;1EE9;0075 031B 0301;1EE9;0075 031B 0301; # (ứ; ứ; u◌̛◌́; ứ; u◌̛◌́; ) LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEA;1EEA;0055 031B 0300;1EEA;0055 031B 0300; # (Ừ; Ừ; U◌̛◌̀; Ừ; U◌̛◌̀; ) LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEB;1EEB;0075 031B 0300;1EEB;0075 031B 0300; # (ừ; ừ; u◌̛◌̀; ừ; u◌̛◌̀; ) LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEC;1EEC;0055 031B 0309;1EEC;0055 031B 0309; # (Ử; Ử; U◌̛◌̉; Ử; U◌̛◌̉; ) LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EED;1EED;0075 031B 0309;1EED;0075 031B 0309; # (ử; ử; u◌̛◌̉; ử; u◌̛◌̉; ) LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEE;1EEE;0055 031B 0303;1EEE;0055 031B 0303; # (Ữ; Ữ; U◌̛◌̃; Ữ; U◌̛◌̃; ) LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EEF;1EEF;0075 031B 0303;1EEF;0075 031B 0303; # (ữ; ữ; u◌̛◌̃; ữ; u◌̛◌̃; ) LATIN SMALL LETTER U WITH HORN AND TILDE +1EF0;1EF0;0055 031B 0323;1EF0;0055 031B 0323; # (Ự; Ự; U◌̛◌̣; Ự; U◌̛◌̣; ) LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF1;1EF1;0075 031B 0323;1EF1;0075 031B 0323; # (ự; ự; u◌̛◌̣; ự; u◌̛◌̣; ) LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF2;1EF2;0059 0300;1EF2;0059 0300; # (Ỳ; Ỳ; Y◌̀; Ỳ; Y◌̀; ) LATIN CAPITAL LETTER Y WITH GRAVE +1EF3;1EF3;0079 0300;1EF3;0079 0300; # (ỳ; ỳ; y◌̀; ỳ; y◌̀; ) LATIN SMALL LETTER Y WITH GRAVE +1EF4;1EF4;0059 0323;1EF4;0059 0323; # (Ỵ; Ỵ; Y◌̣; Ỵ; Y◌̣; ) LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF5;1EF5;0079 0323;1EF5;0079 0323; # (ỵ; ỵ; y◌̣; ỵ; y◌̣; ) LATIN SMALL LETTER Y WITH DOT BELOW +1EF6;1EF6;0059 0309;1EF6;0059 0309; # (Ỷ; Ỷ; Y◌̉; Ỷ; Y◌̉; ) LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF7;1EF7;0079 0309;1EF7;0079 0309; # (ỷ; ỷ; y◌̉; ỷ; y◌̉; ) LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF8;1EF8;0059 0303;1EF8;0059 0303; # (Ỹ; Ỹ; Y◌̃; Ỹ; Y◌̃; ) LATIN CAPITAL LETTER Y WITH TILDE +1EF9;1EF9;0079 0303;1EF9;0079 0303; # (ỹ; ỹ; y◌̃; ỹ; y◌̃; ) LATIN SMALL LETTER Y WITH TILDE +1F00;1F00;03B1 0313;1F00;03B1 0313; # (ἀ; ἀ; α◌̓; ἀ; α◌̓; ) GREEK SMALL LETTER ALPHA WITH PSILI +1F01;1F01;03B1 0314;1F01;03B1 0314; # (ἁ; ἁ; α◌̔; ἁ; α◌̔; ) GREEK SMALL LETTER ALPHA WITH DASIA +1F02;1F02;03B1 0313 0300;1F02;03B1 0313 0300; # (ἂ; ἂ; α◌̓◌̀; ἂ; α◌̓◌̀; ) GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F03;1F03;03B1 0314 0300;1F03;03B1 0314 0300; # (ἃ; ἃ; α◌̔◌̀; ἃ; α◌̔◌̀; ) GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F04;1F04;03B1 0313 0301;1F04;03B1 0313 0301; # (ἄ; ἄ; α◌̓◌́; ἄ; α◌̓◌́; ) GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F05;1F05;03B1 0314 0301;1F05;03B1 0314 0301; # (ἅ; ἅ; α◌̔◌́; ἅ; α◌̔◌́; ) GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F06;1F06;03B1 0313 0342;1F06;03B1 0313 0342; # (ἆ; ἆ; α◌̓◌͂; ἆ; α◌̓◌͂; ) GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F07;1F07;03B1 0314 0342;1F07;03B1 0314 0342; # (ἇ; ἇ; α◌̔◌͂; ἇ; α◌̔◌͂; ) GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F08;1F08;0391 0313;1F08;0391 0313; # (Ἀ; Ἀ; Α◌̓; Ἀ; Α◌̓; ) GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09;1F09;0391 0314;1F09;0391 0314; # (Ἁ; Ἁ; Α◌̔; Ἁ; Α◌̔; ) GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A;1F0A;0391 0313 0300;1F0A;0391 0313 0300; # (Ἂ; Ἂ; Α◌̓◌̀; Ἂ; Α◌̓◌̀; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B;1F0B;0391 0314 0300;1F0B;0391 0314 0300; # (Ἃ; Ἃ; Α◌̔◌̀; Ἃ; Α◌̔◌̀; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C;1F0C;0391 0313 0301;1F0C;0391 0313 0301; # (Ἄ; Ἄ; Α◌̓◌́; Ἄ; Α◌̓◌́; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D;1F0D;0391 0314 0301;1F0D;0391 0314 0301; # (Ἅ; Ἅ; Α◌̔◌́; Ἅ; Α◌̔◌́; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E;1F0E;0391 0313 0342;1F0E;0391 0313 0342; # (Ἆ; Ἆ; Α◌̓◌͂; Ἆ; Α◌̓◌͂; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F;1F0F;0391 0314 0342;1F0F;0391 0314 0342; # (Ἇ; Ἇ; Α◌̔◌͂; Ἇ; Α◌̔◌͂; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10;1F10;03B5 0313;1F10;03B5 0313; # (ἐ; ἐ; ε◌̓; ἐ; ε◌̓; ) GREEK SMALL LETTER EPSILON WITH PSILI +1F11;1F11;03B5 0314;1F11;03B5 0314; # (ἑ; ἑ; ε◌̔; ἑ; ε◌̔; ) GREEK SMALL LETTER EPSILON WITH DASIA +1F12;1F12;03B5 0313 0300;1F12;03B5 0313 0300; # (ἒ; ἒ; ε◌̓◌̀; ἒ; ε◌̓◌̀; ) GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F13;1F13;03B5 0314 0300;1F13;03B5 0314 0300; # (ἓ; ἓ; ε◌̔◌̀; ἓ; ε◌̔◌̀; ) GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F14;1F14;03B5 0313 0301;1F14;03B5 0313 0301; # (ἔ; ἔ; ε◌̓◌́; ἔ; ε◌̓◌́; ) GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F15;1F15;03B5 0314 0301;1F15;03B5 0314 0301; # (ἕ; ἕ; ε◌̔◌́; ἕ; ε◌̔◌́; ) GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18;1F18;0395 0313;1F18;0395 0313; # (Ἐ; Ἐ; Ε◌̓; Ἐ; Ε◌̓; ) GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19;1F19;0395 0314;1F19;0395 0314; # (Ἑ; Ἑ; Ε◌̔; Ἑ; Ε◌̔; ) GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A;1F1A;0395 0313 0300;1F1A;0395 0313 0300; # (Ἒ; Ἒ; Ε◌̓◌̀; Ἒ; Ε◌̓◌̀; ) GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B;1F1B;0395 0314 0300;1F1B;0395 0314 0300; # (Ἓ; Ἓ; Ε◌̔◌̀; Ἓ; Ε◌̔◌̀; ) GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C;1F1C;0395 0313 0301;1F1C;0395 0313 0301; # (Ἔ; Ἔ; Ε◌̓◌́; Ἔ; Ε◌̓◌́; ) GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D;1F1D;0395 0314 0301;1F1D;0395 0314 0301; # (Ἕ; Ἕ; Ε◌̔◌́; Ἕ; Ε◌̔◌́; ) GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20;1F20;03B7 0313;1F20;03B7 0313; # (ἠ; ἠ; η◌̓; ἠ; η◌̓; ) GREEK SMALL LETTER ETA WITH PSILI +1F21;1F21;03B7 0314;1F21;03B7 0314; # (ἡ; ἡ; η◌̔; ἡ; η◌̔; ) GREEK SMALL LETTER ETA WITH DASIA +1F22;1F22;03B7 0313 0300;1F22;03B7 0313 0300; # (ἢ; ἢ; η◌̓◌̀; ἢ; η◌̓◌̀; ) GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F23;1F23;03B7 0314 0300;1F23;03B7 0314 0300; # (ἣ; ἣ; η◌̔◌̀; ἣ; η◌̔◌̀; ) GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F24;1F24;03B7 0313 0301;1F24;03B7 0313 0301; # (ἤ; ἤ; η◌̓◌́; ἤ; η◌̓◌́; ) GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F25;1F25;03B7 0314 0301;1F25;03B7 0314 0301; # (ἥ; ἥ; η◌̔◌́; ἥ; η◌̔◌́; ) GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F26;1F26;03B7 0313 0342;1F26;03B7 0313 0342; # (ἦ; ἦ; η◌̓◌͂; ἦ; η◌̓◌͂; ) GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F27;1F27;03B7 0314 0342;1F27;03B7 0314 0342; # (ἧ; ἧ; η◌̔◌͂; ἧ; η◌̔◌͂; ) GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F28;1F28;0397 0313;1F28;0397 0313; # (Ἠ; Ἠ; Η◌̓; Ἠ; Η◌̓; ) GREEK CAPITAL LETTER ETA WITH PSILI +1F29;1F29;0397 0314;1F29;0397 0314; # (Ἡ; Ἡ; Η◌̔; Ἡ; Η◌̔; ) GREEK CAPITAL LETTER ETA WITH DASIA +1F2A;1F2A;0397 0313 0300;1F2A;0397 0313 0300; # (Ἢ; Ἢ; Η◌̓◌̀; Ἢ; Η◌̓◌̀; ) GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B;1F2B;0397 0314 0300;1F2B;0397 0314 0300; # (Ἣ; Ἣ; Η◌̔◌̀; Ἣ; Η◌̔◌̀; ) GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C;1F2C;0397 0313 0301;1F2C;0397 0313 0301; # (Ἤ; Ἤ; Η◌̓◌́; Ἤ; Η◌̓◌́; ) GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D;1F2D;0397 0314 0301;1F2D;0397 0314 0301; # (Ἥ; Ἥ; Η◌̔◌́; Ἥ; Η◌̔◌́; ) GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E;1F2E;0397 0313 0342;1F2E;0397 0313 0342; # (Ἦ; Ἦ; Η◌̓◌͂; Ἦ; Η◌̓◌͂; ) GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F;1F2F;0397 0314 0342;1F2F;0397 0314 0342; # (Ἧ; Ἧ; Η◌̔◌͂; Ἧ; Η◌̔◌͂; ) GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F30;1F30;03B9 0313;1F30;03B9 0313; # (ἰ; ἰ; ι◌̓; ἰ; ι◌̓; ) GREEK SMALL LETTER IOTA WITH PSILI +1F31;1F31;03B9 0314;1F31;03B9 0314; # (ἱ; ἱ; ι◌̔; ἱ; ι◌̔; ) GREEK SMALL LETTER IOTA WITH DASIA +1F32;1F32;03B9 0313 0300;1F32;03B9 0313 0300; # (ἲ; ἲ; ι◌̓◌̀; ἲ; ι◌̓◌̀; ) GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F33;1F33;03B9 0314 0300;1F33;03B9 0314 0300; # (ἳ; ἳ; ι◌̔◌̀; ἳ; ι◌̔◌̀; ) GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F34;1F34;03B9 0313 0301;1F34;03B9 0313 0301; # (ἴ; ἴ; ι◌̓◌́; ἴ; ι◌̓◌́; ) GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F35;1F35;03B9 0314 0301;1F35;03B9 0314 0301; # (ἵ; ἵ; ι◌̔◌́; ἵ; ι◌̔◌́; ) GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F36;1F36;03B9 0313 0342;1F36;03B9 0313 0342; # (ἶ; ἶ; ι◌̓◌͂; ἶ; ι◌̓◌͂; ) GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F37;1F37;03B9 0314 0342;1F37;03B9 0314 0342; # (ἷ; ἷ; ι◌̔◌͂; ἷ; ι◌̔◌͂; ) GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F38;1F38;0399 0313;1F38;0399 0313; # (Ἰ; Ἰ; Ι◌̓; Ἰ; Ι◌̓; ) GREEK CAPITAL LETTER IOTA WITH PSILI +1F39;1F39;0399 0314;1F39;0399 0314; # (Ἱ; Ἱ; Ι◌̔; Ἱ; Ι◌̔; ) GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A;1F3A;0399 0313 0300;1F3A;0399 0313 0300; # (Ἲ; Ἲ; Ι◌̓◌̀; Ἲ; Ι◌̓◌̀; ) GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B;1F3B;0399 0314 0300;1F3B;0399 0314 0300; # (Ἳ; Ἳ; Ι◌̔◌̀; Ἳ; Ι◌̔◌̀; ) GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C;1F3C;0399 0313 0301;1F3C;0399 0313 0301; # (Ἴ; Ἴ; Ι◌̓◌́; Ἴ; Ι◌̓◌́; ) GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D;1F3D;0399 0314 0301;1F3D;0399 0314 0301; # (Ἵ; Ἵ; Ι◌̔◌́; Ἵ; Ι◌̔◌́; ) GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E;1F3E;0399 0313 0342;1F3E;0399 0313 0342; # (Ἶ; Ἶ; Ι◌̓◌͂; Ἶ; Ι◌̓◌͂; ) GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F;1F3F;0399 0314 0342;1F3F;0399 0314 0342; # (Ἷ; Ἷ; Ι◌̔◌͂; Ἷ; Ι◌̔◌͂; ) GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40;1F40;03BF 0313;1F40;03BF 0313; # (ὀ; ὀ; ο◌̓; ὀ; ο◌̓; ) GREEK SMALL LETTER OMICRON WITH PSILI +1F41;1F41;03BF 0314;1F41;03BF 0314; # (ὁ; ὁ; ο◌̔; ὁ; ο◌̔; ) GREEK SMALL LETTER OMICRON WITH DASIA +1F42;1F42;03BF 0313 0300;1F42;03BF 0313 0300; # (ὂ; ὂ; ο◌̓◌̀; ὂ; ο◌̓◌̀; ) GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F43;1F43;03BF 0314 0300;1F43;03BF 0314 0300; # (ὃ; ὃ; ο◌̔◌̀; ὃ; ο◌̔◌̀; ) GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F44;1F44;03BF 0313 0301;1F44;03BF 0313 0301; # (ὄ; ὄ; ο◌̓◌́; ὄ; ο◌̓◌́; ) GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F45;1F45;03BF 0314 0301;1F45;03BF 0314 0301; # (ὅ; ὅ; ο◌̔◌́; ὅ; ο◌̔◌́; ) GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48;1F48;039F 0313;1F48;039F 0313; # (Ὀ; Ὀ; Ο◌̓; Ὀ; Ο◌̓; ) GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49;1F49;039F 0314;1F49;039F 0314; # (Ὁ; Ὁ; Ο◌̔; Ὁ; Ο◌̔; ) GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A;1F4A;039F 0313 0300;1F4A;039F 0313 0300; # (Ὂ; Ὂ; Ο◌̓◌̀; Ὂ; Ο◌̓◌̀; ) GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B;1F4B;039F 0314 0300;1F4B;039F 0314 0300; # (Ὃ; Ὃ; Ο◌̔◌̀; Ὃ; Ο◌̔◌̀; ) GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C;1F4C;039F 0313 0301;1F4C;039F 0313 0301; # (Ὄ; Ὄ; Ο◌̓◌́; Ὄ; Ο◌̓◌́; ) GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D;1F4D;039F 0314 0301;1F4D;039F 0314 0301; # (Ὅ; Ὅ; Ο◌̔◌́; Ὅ; Ο◌̔◌́; ) GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50;1F50;03C5 0313;1F50;03C5 0313; # (ὐ; ὐ; υ◌̓; ὐ; υ◌̓; ) GREEK SMALL LETTER UPSILON WITH PSILI +1F51;1F51;03C5 0314;1F51;03C5 0314; # (ὑ; ὑ; υ◌̔; ὑ; υ◌̔; ) GREEK SMALL LETTER UPSILON WITH DASIA +1F52;1F52;03C5 0313 0300;1F52;03C5 0313 0300; # (ὒ; ὒ; υ◌̓◌̀; ὒ; υ◌̓◌̀; ) GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F53;1F53;03C5 0314 0300;1F53;03C5 0314 0300; # (ὓ; ὓ; υ◌̔◌̀; ὓ; υ◌̔◌̀; ) GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F54;1F54;03C5 0313 0301;1F54;03C5 0313 0301; # (ὔ; ὔ; υ◌̓◌́; ὔ; υ◌̓◌́; ) GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F55;1F55;03C5 0314 0301;1F55;03C5 0314 0301; # (ὕ; ὕ; υ◌̔◌́; ὕ; υ◌̔◌́; ) GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F56;1F56;03C5 0313 0342;1F56;03C5 0313 0342; # (ὖ; ὖ; υ◌̓◌͂; ὖ; υ◌̓◌͂; ) GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F57;1F57;03C5 0314 0342;1F57;03C5 0314 0342; # (ὗ; ὗ; υ◌̔◌͂; ὗ; υ◌̔◌͂; ) GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59;1F59;03A5 0314;1F59;03A5 0314; # (Ὑ; Ὑ; Υ◌̔; Ὑ; Υ◌̔; ) GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B;1F5B;03A5 0314 0300;1F5B;03A5 0314 0300; # (Ὓ; Ὓ; Υ◌̔◌̀; Ὓ; Υ◌̔◌̀; ) GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D;1F5D;03A5 0314 0301;1F5D;03A5 0314 0301; # (Ὕ; Ὕ; Υ◌̔◌́; Ὕ; Υ◌̔◌́; ) GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F;1F5F;03A5 0314 0342;1F5F;03A5 0314 0342; # (Ὗ; Ὗ; Υ◌̔◌͂; Ὗ; Υ◌̔◌͂; ) GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60;1F60;03C9 0313;1F60;03C9 0313; # (ὠ; ὠ; ω◌̓; ὠ; ω◌̓; ) GREEK SMALL LETTER OMEGA WITH PSILI +1F61;1F61;03C9 0314;1F61;03C9 0314; # (ὡ; ὡ; ω◌̔; ὡ; ω◌̔; ) GREEK SMALL LETTER OMEGA WITH DASIA +1F62;1F62;03C9 0313 0300;1F62;03C9 0313 0300; # (ὢ; ὢ; ω◌̓◌̀; ὢ; ω◌̓◌̀; ) GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F63;1F63;03C9 0314 0300;1F63;03C9 0314 0300; # (ὣ; ὣ; ω◌̔◌̀; ὣ; ω◌̔◌̀; ) GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F64;1F64;03C9 0313 0301;1F64;03C9 0313 0301; # (ὤ; ὤ; ω◌̓◌́; ὤ; ω◌̓◌́; ) GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F65;1F65;03C9 0314 0301;1F65;03C9 0314 0301; # (ὥ; ὥ; ω◌̔◌́; ὥ; ω◌̔◌́; ) GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F66;1F66;03C9 0313 0342;1F66;03C9 0313 0342; # (ὦ; ὦ; ω◌̓◌͂; ὦ; ω◌̓◌͂; ) GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F67;1F67;03C9 0314 0342;1F67;03C9 0314 0342; # (ὧ; ὧ; ω◌̔◌͂; ὧ; ω◌̔◌͂; ) GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F68;1F68;03A9 0313;1F68;03A9 0313; # (Ὠ; Ὠ; Ω◌̓; Ὠ; Ω◌̓; ) GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69;1F69;03A9 0314;1F69;03A9 0314; # (Ὡ; Ὡ; Ω◌̔; Ὡ; Ω◌̔; ) GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A;1F6A;03A9 0313 0300;1F6A;03A9 0313 0300; # (Ὢ; Ὢ; Ω◌̓◌̀; Ὢ; Ω◌̓◌̀; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B;1F6B;03A9 0314 0300;1F6B;03A9 0314 0300; # (Ὣ; Ὣ; Ω◌̔◌̀; Ὣ; Ω◌̔◌̀; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C;1F6C;03A9 0313 0301;1F6C;03A9 0313 0301; # (Ὤ; Ὤ; Ω◌̓◌́; Ὤ; Ω◌̓◌́; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D;1F6D;03A9 0314 0301;1F6D;03A9 0314 0301; # (Ὥ; Ὥ; Ω◌̔◌́; Ὥ; Ω◌̔◌́; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E;1F6E;03A9 0313 0342;1F6E;03A9 0313 0342; # (Ὦ; Ὦ; Ω◌̓◌͂; Ὦ; Ω◌̓◌͂; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F;1F6F;03A9 0314 0342;1F6F;03A9 0314 0342; # (Ὧ; Ὧ; Ω◌̔◌͂; Ὧ; Ω◌̔◌͂; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70;1F70;03B1 0300;1F70;03B1 0300; # (ὰ; ὰ; α◌̀; ὰ; α◌̀; ) GREEK SMALL LETTER ALPHA WITH VARIA +1F71;03AC;03B1 0301;03AC;03B1 0301; # (ά; ά; α◌́; ά; α◌́; ) GREEK SMALL LETTER ALPHA WITH OXIA +1F72;1F72;03B5 0300;1F72;03B5 0300; # (ὲ; ὲ; ε◌̀; ὲ; ε◌̀; ) GREEK SMALL LETTER EPSILON WITH VARIA +1F73;03AD;03B5 0301;03AD;03B5 0301; # (έ; έ; ε◌́; έ; ε◌́; ) GREEK SMALL LETTER EPSILON WITH OXIA +1F74;1F74;03B7 0300;1F74;03B7 0300; # (ὴ; ὴ; η◌̀; ὴ; η◌̀; ) GREEK SMALL LETTER ETA WITH VARIA +1F75;03AE;03B7 0301;03AE;03B7 0301; # (ή; ή; η◌́; ή; η◌́; ) GREEK SMALL LETTER ETA WITH OXIA +1F76;1F76;03B9 0300;1F76;03B9 0300; # (ὶ; ὶ; ι◌̀; ὶ; ι◌̀; ) GREEK SMALL LETTER IOTA WITH VARIA +1F77;03AF;03B9 0301;03AF;03B9 0301; # (ί; ί; ι◌́; ί; ι◌́; ) GREEK SMALL LETTER IOTA WITH OXIA +1F78;1F78;03BF 0300;1F78;03BF 0300; # (ὸ; ὸ; ο◌̀; ὸ; ο◌̀; ) GREEK SMALL LETTER OMICRON WITH VARIA +1F79;03CC;03BF 0301;03CC;03BF 0301; # (ό; ό; ο◌́; ό; ο◌́; ) GREEK SMALL LETTER OMICRON WITH OXIA +1F7A;1F7A;03C5 0300;1F7A;03C5 0300; # (ὺ; ὺ; υ◌̀; ὺ; υ◌̀; ) GREEK SMALL LETTER UPSILON WITH VARIA +1F7B;03CD;03C5 0301;03CD;03C5 0301; # (ύ; ύ; υ◌́; ύ; υ◌́; ) GREEK SMALL LETTER UPSILON WITH OXIA +1F7C;1F7C;03C9 0300;1F7C;03C9 0300; # (ὼ; ὼ; ω◌̀; ὼ; ω◌̀; ) GREEK SMALL LETTER OMEGA WITH VARIA +1F7D;03CE;03C9 0301;03CE;03C9 0301; # (ώ; ώ; ω◌́; ώ; ω◌́; ) GREEK SMALL LETTER OMEGA WITH OXIA +1F80;1F80;03B1 0313 0345;1F80;03B1 0313 0345; # (ᾀ; ᾀ; α◌̓◌ͅ; ᾀ; α◌̓◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81;1F81;03B1 0314 0345;1F81;03B1 0314 0345; # (ᾁ; ᾁ; α◌̔◌ͅ; ᾁ; α◌̔◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82;1F82;03B1 0313 0300 0345;1F82;03B1 0313 0300 0345; # (ᾂ; ᾂ; α◌̓◌̀◌ͅ; ᾂ; α◌̓◌̀◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83;1F83;03B1 0314 0300 0345;1F83;03B1 0314 0300 0345; # (ᾃ; ᾃ; α◌̔◌̀◌ͅ; ᾃ; α◌̔◌̀◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84;1F84;03B1 0313 0301 0345;1F84;03B1 0313 0301 0345; # (ᾄ; ᾄ; α◌̓◌́◌ͅ; ᾄ; α◌̓◌́◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85;1F85;03B1 0314 0301 0345;1F85;03B1 0314 0301 0345; # (ᾅ; ᾅ; α◌̔◌́◌ͅ; ᾅ; α◌̔◌́◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86;1F86;03B1 0313 0342 0345;1F86;03B1 0313 0342 0345; # (ᾆ; ᾆ; α◌̓◌͂◌ͅ; ᾆ; α◌̓◌͂◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87;1F87;03B1 0314 0342 0345;1F87;03B1 0314 0342 0345; # (ᾇ; ᾇ; α◌̔◌͂◌ͅ; ᾇ; α◌̔◌͂◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88;1F88;0391 0313 0345;1F88;0391 0313 0345; # (ᾈ; ᾈ; Α◌̓◌ͅ; ᾈ; Α◌̓◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89;1F89;0391 0314 0345;1F89;0391 0314 0345; # (ᾉ; ᾉ; Α◌̔◌ͅ; ᾉ; Α◌̔◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A;1F8A;0391 0313 0300 0345;1F8A;0391 0313 0300 0345; # (ᾊ; ᾊ; Α◌̓◌̀◌ͅ; ᾊ; Α◌̓◌̀◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B;1F8B;0391 0314 0300 0345;1F8B;0391 0314 0300 0345; # (ᾋ; ᾋ; Α◌̔◌̀◌ͅ; ᾋ; Α◌̔◌̀◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C;1F8C;0391 0313 0301 0345;1F8C;0391 0313 0301 0345; # (ᾌ; ᾌ; Α◌̓◌́◌ͅ; ᾌ; Α◌̓◌́◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D;1F8D;0391 0314 0301 0345;1F8D;0391 0314 0301 0345; # (ᾍ; ᾍ; Α◌̔◌́◌ͅ; ᾍ; Α◌̔◌́◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E;1F8E;0391 0313 0342 0345;1F8E;0391 0313 0342 0345; # (ᾎ; ᾎ; Α◌̓◌͂◌ͅ; ᾎ; Α◌̓◌͂◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F;1F8F;0391 0314 0342 0345;1F8F;0391 0314 0342 0345; # (ᾏ; ᾏ; Α◌̔◌͂◌ͅ; ᾏ; Α◌̔◌͂◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90;1F90;03B7 0313 0345;1F90;03B7 0313 0345; # (ᾐ; ᾐ; η◌̓◌ͅ; ᾐ; η◌̓◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91;1F91;03B7 0314 0345;1F91;03B7 0314 0345; # (ᾑ; ᾑ; η◌̔◌ͅ; ᾑ; η◌̔◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92;1F92;03B7 0313 0300 0345;1F92;03B7 0313 0300 0345; # (ᾒ; ᾒ; η◌̓◌̀◌ͅ; ᾒ; η◌̓◌̀◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93;1F93;03B7 0314 0300 0345;1F93;03B7 0314 0300 0345; # (ᾓ; ᾓ; η◌̔◌̀◌ͅ; ᾓ; η◌̔◌̀◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94;1F94;03B7 0313 0301 0345;1F94;03B7 0313 0301 0345; # (ᾔ; ᾔ; η◌̓◌́◌ͅ; ᾔ; η◌̓◌́◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95;1F95;03B7 0314 0301 0345;1F95;03B7 0314 0301 0345; # (ᾕ; ᾕ; η◌̔◌́◌ͅ; ᾕ; η◌̔◌́◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96;1F96;03B7 0313 0342 0345;1F96;03B7 0313 0342 0345; # (ᾖ; ᾖ; η◌̓◌͂◌ͅ; ᾖ; η◌̓◌͂◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97;1F97;03B7 0314 0342 0345;1F97;03B7 0314 0342 0345; # (ᾗ; ᾗ; η◌̔◌͂◌ͅ; ᾗ; η◌̔◌͂◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98;1F98;0397 0313 0345;1F98;0397 0313 0345; # (ᾘ; ᾘ; Η◌̓◌ͅ; ᾘ; Η◌̓◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99;1F99;0397 0314 0345;1F99;0397 0314 0345; # (ᾙ; ᾙ; Η◌̔◌ͅ; ᾙ; Η◌̔◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A;1F9A;0397 0313 0300 0345;1F9A;0397 0313 0300 0345; # (ᾚ; ᾚ; Η◌̓◌̀◌ͅ; ᾚ; Η◌̓◌̀◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B;1F9B;0397 0314 0300 0345;1F9B;0397 0314 0300 0345; # (ᾛ; ᾛ; Η◌̔◌̀◌ͅ; ᾛ; Η◌̔◌̀◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C;1F9C;0397 0313 0301 0345;1F9C;0397 0313 0301 0345; # (ᾜ; ᾜ; Η◌̓◌́◌ͅ; ᾜ; Η◌̓◌́◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D;1F9D;0397 0314 0301 0345;1F9D;0397 0314 0301 0345; # (ᾝ; ᾝ; Η◌̔◌́◌ͅ; ᾝ; Η◌̔◌́◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E;1F9E;0397 0313 0342 0345;1F9E;0397 0313 0342 0345; # (ᾞ; ᾞ; Η◌̓◌͂◌ͅ; ᾞ; Η◌̓◌͂◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F;1F9F;0397 0314 0342 0345;1F9F;0397 0314 0342 0345; # (ᾟ; ᾟ; Η◌̔◌͂◌ͅ; ᾟ; Η◌̔◌͂◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0;1FA0;03C9 0313 0345;1FA0;03C9 0313 0345; # (ᾠ; ᾠ; ω◌̓◌ͅ; ᾠ; ω◌̓◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1;1FA1;03C9 0314 0345;1FA1;03C9 0314 0345; # (ᾡ; ᾡ; ω◌̔◌ͅ; ᾡ; ω◌̔◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2;1FA2;03C9 0313 0300 0345;1FA2;03C9 0313 0300 0345; # (ᾢ; ᾢ; ω◌̓◌̀◌ͅ; ᾢ; ω◌̓◌̀◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3;1FA3;03C9 0314 0300 0345;1FA3;03C9 0314 0300 0345; # (ᾣ; ᾣ; ω◌̔◌̀◌ͅ; ᾣ; ω◌̔◌̀◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4;1FA4;03C9 0313 0301 0345;1FA4;03C9 0313 0301 0345; # (ᾤ; ᾤ; ω◌̓◌́◌ͅ; ᾤ; ω◌̓◌́◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5;1FA5;03C9 0314 0301 0345;1FA5;03C9 0314 0301 0345; # (ᾥ; ᾥ; ω◌̔◌́◌ͅ; ᾥ; ω◌̔◌́◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6;1FA6;03C9 0313 0342 0345;1FA6;03C9 0313 0342 0345; # (ᾦ; ᾦ; ω◌̓◌͂◌ͅ; ᾦ; ω◌̓◌͂◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7;1FA7;03C9 0314 0342 0345;1FA7;03C9 0314 0342 0345; # (ᾧ; ᾧ; ω◌̔◌͂◌ͅ; ᾧ; ω◌̔◌͂◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8;1FA8;03A9 0313 0345;1FA8;03A9 0313 0345; # (ᾨ; ᾨ; Ω◌̓◌ͅ; ᾨ; Ω◌̓◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9;1FA9;03A9 0314 0345;1FA9;03A9 0314 0345; # (ᾩ; ᾩ; Ω◌̔◌ͅ; ᾩ; Ω◌̔◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA;1FAA;03A9 0313 0300 0345;1FAA;03A9 0313 0300 0345; # (ᾪ; ᾪ; Ω◌̓◌̀◌ͅ; ᾪ; Ω◌̓◌̀◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB;1FAB;03A9 0314 0300 0345;1FAB;03A9 0314 0300 0345; # (ᾫ; ᾫ; Ω◌̔◌̀◌ͅ; ᾫ; Ω◌̔◌̀◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC;1FAC;03A9 0313 0301 0345;1FAC;03A9 0313 0301 0345; # (ᾬ; ᾬ; Ω◌̓◌́◌ͅ; ᾬ; Ω◌̓◌́◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD;1FAD;03A9 0314 0301 0345;1FAD;03A9 0314 0301 0345; # (ᾭ; ᾭ; Ω◌̔◌́◌ͅ; ᾭ; Ω◌̔◌́◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE;1FAE;03A9 0313 0342 0345;1FAE;03A9 0313 0342 0345; # (ᾮ; ᾮ; Ω◌̓◌͂◌ͅ; ᾮ; Ω◌̓◌͂◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF;1FAF;03A9 0314 0342 0345;1FAF;03A9 0314 0342 0345; # (ᾯ; ᾯ; Ω◌̔◌͂◌ͅ; ᾯ; Ω◌̔◌͂◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB0;1FB0;03B1 0306;1FB0;03B1 0306; # (ᾰ; ᾰ; α◌̆; ᾰ; α◌̆; ) GREEK SMALL LETTER ALPHA WITH VRACHY +1FB1;1FB1;03B1 0304;1FB1;03B1 0304; # (ᾱ; ᾱ; α◌̄; ᾱ; α◌̄; ) GREEK SMALL LETTER ALPHA WITH MACRON +1FB2;1FB2;03B1 0300 0345;1FB2;03B1 0300 0345; # (ᾲ; ᾲ; α◌̀◌ͅ; ᾲ; α◌̀◌ͅ; ) GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3;1FB3;03B1 0345;1FB3;03B1 0345; # (ᾳ; ᾳ; α◌ͅ; ᾳ; α◌ͅ; ) GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4;1FB4;03B1 0301 0345;1FB4;03B1 0301 0345; # (ᾴ; ᾴ; α◌́◌ͅ; ᾴ; α◌́◌ͅ; ) GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6;1FB6;03B1 0342;1FB6;03B1 0342; # (ᾶ; ᾶ; α◌͂; ᾶ; α◌͂; ) GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7;1FB7;03B1 0342 0345;1FB7;03B1 0342 0345; # (ᾷ; ᾷ; α◌͂◌ͅ; ᾷ; α◌͂◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8;1FB8;0391 0306;1FB8;0391 0306; # (Ᾰ; Ᾰ; Α◌̆; Ᾰ; Α◌̆; ) GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9;1FB9;0391 0304;1FB9;0391 0304; # (Ᾱ; Ᾱ; Α◌̄; Ᾱ; Α◌̄; ) GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA;1FBA;0391 0300;1FBA;0391 0300; # (Ὰ; Ὰ; Α◌̀; Ὰ; Α◌̀; ) GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB;0386;0391 0301;0386;0391 0301; # (Ά; Ά; Α◌́; Ά; Α◌́; ) GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC;1FBC;0391 0345;1FBC;0391 0345; # (ᾼ; ᾼ; Α◌ͅ; ᾼ; Α◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD;1FBD;1FBD;0020 0313;0020 0313; # (᾽; ᾽; ᾽; ◌̓; ◌̓; ) GREEK KORONIS +1FBE;03B9;03B9;03B9;03B9; # (ι; ι; ι; ι; ι; ) GREEK PROSGEGRAMMENI +1FBF;1FBF;1FBF;0020 0313;0020 0313; # (᾿; ᾿; ᾿; ◌̓; ◌̓; ) GREEK PSILI +1FC0;1FC0;1FC0;0020 0342;0020 0342; # (῀; ῀; ῀; ◌͂; ◌͂; ) GREEK PERISPOMENI +1FC1;1FC1;00A8 0342;0020 0308 0342;0020 0308 0342; # (῁; ῁; ¨◌͂; ◌̈◌͂; ◌̈◌͂; ) GREEK DIALYTIKA AND PERISPOMENI +1FC2;1FC2;03B7 0300 0345;1FC2;03B7 0300 0345; # (ῂ; ῂ; η◌̀◌ͅ; ῂ; η◌̀◌ͅ; ) GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3;1FC3;03B7 0345;1FC3;03B7 0345; # (ῃ; ῃ; η◌ͅ; ῃ; η◌ͅ; ) GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4;1FC4;03B7 0301 0345;1FC4;03B7 0301 0345; # (ῄ; ῄ; η◌́◌ͅ; ῄ; η◌́◌ͅ; ) GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6;1FC6;03B7 0342;1FC6;03B7 0342; # (ῆ; ῆ; η◌͂; ῆ; η◌͂; ) GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7;1FC7;03B7 0342 0345;1FC7;03B7 0342 0345; # (ῇ; ῇ; η◌͂◌ͅ; ῇ; η◌͂◌ͅ; ) GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8;1FC8;0395 0300;1FC8;0395 0300; # (Ὲ; Ὲ; Ε◌̀; Ὲ; Ε◌̀; ) GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9;0388;0395 0301;0388;0395 0301; # (Έ; Έ; Ε◌́; Έ; Ε◌́; ) GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA;1FCA;0397 0300;1FCA;0397 0300; # (Ὴ; Ὴ; Η◌̀; Ὴ; Η◌̀; ) GREEK CAPITAL LETTER ETA WITH VARIA +1FCB;0389;0397 0301;0389;0397 0301; # (Ή; Ή; Η◌́; Ή; Η◌́; ) GREEK CAPITAL LETTER ETA WITH OXIA +1FCC;1FCC;0397 0345;1FCC;0397 0345; # (ῌ; ῌ; Η◌ͅ; ῌ; Η◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD;1FCD;1FBF 0300;0020 0313 0300;0020 0313 0300; # (῍; ῍; ᾿◌̀; ◌̓◌̀; ◌̓◌̀; ) GREEK PSILI AND VARIA +1FCE;1FCE;1FBF 0301;0020 0313 0301;0020 0313 0301; # (῎; ῎; ᾿◌́; ◌̓◌́; ◌̓◌́; ) GREEK PSILI AND OXIA +1FCF;1FCF;1FBF 0342;0020 0313 0342;0020 0313 0342; # (῏; ῏; ᾿◌͂; ◌̓◌͂; ◌̓◌͂; ) GREEK PSILI AND PERISPOMENI +1FD0;1FD0;03B9 0306;1FD0;03B9 0306; # (ῐ; ῐ; ι◌̆; ῐ; ι◌̆; ) GREEK SMALL LETTER IOTA WITH VRACHY +1FD1;1FD1;03B9 0304;1FD1;03B9 0304; # (ῑ; ῑ; ι◌̄; ῑ; ι◌̄; ) GREEK SMALL LETTER IOTA WITH MACRON +1FD2;1FD2;03B9 0308 0300;1FD2;03B9 0308 0300; # (ῒ; ῒ; ι◌̈◌̀; ῒ; ι◌̈◌̀; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3;0390;03B9 0308 0301;0390;03B9 0308 0301; # (ΐ; ΐ; ι◌̈◌́; ΐ; ι◌̈◌́; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6;1FD6;03B9 0342;1FD6;03B9 0342; # (ῖ; ῖ; ι◌͂; ῖ; ι◌͂; ) GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7;1FD7;03B9 0308 0342;1FD7;03B9 0308 0342; # (ῗ; ῗ; ι◌̈◌͂; ῗ; ι◌̈◌͂; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8;1FD8;0399 0306;1FD8;0399 0306; # (Ῐ; Ῐ; Ι◌̆; Ῐ; Ι◌̆; ) GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9;1FD9;0399 0304;1FD9;0399 0304; # (Ῑ; Ῑ; Ι◌̄; Ῑ; Ι◌̄; ) GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA;1FDA;0399 0300;1FDA;0399 0300; # (Ὶ; Ὶ; Ι◌̀; Ὶ; Ι◌̀; ) GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB;038A;0399 0301;038A;0399 0301; # (Ί; Ί; Ι◌́; Ί; Ι◌́; ) GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD;1FDD;1FFE 0300;0020 0314 0300;0020 0314 0300; # (῝; ῝; ῾◌̀; ◌̔◌̀; ◌̔◌̀; ) GREEK DASIA AND VARIA +1FDE;1FDE;1FFE 0301;0020 0314 0301;0020 0314 0301; # (῞; ῞; ῾◌́; ◌̔◌́; ◌̔◌́; ) GREEK DASIA AND OXIA +1FDF;1FDF;1FFE 0342;0020 0314 0342;0020 0314 0342; # (῟; ῟; ῾◌͂; ◌̔◌͂; ◌̔◌͂; ) GREEK DASIA AND PERISPOMENI +1FE0;1FE0;03C5 0306;1FE0;03C5 0306; # (ῠ; ῠ; υ◌̆; ῠ; υ◌̆; ) GREEK SMALL LETTER UPSILON WITH VRACHY +1FE1;1FE1;03C5 0304;1FE1;03C5 0304; # (ῡ; ῡ; υ◌̄; ῡ; υ◌̄; ) GREEK SMALL LETTER UPSILON WITH MACRON +1FE2;1FE2;03C5 0308 0300;1FE2;03C5 0308 0300; # (ῢ; ῢ; υ◌̈◌̀; ῢ; υ◌̈◌̀; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3;03B0;03C5 0308 0301;03B0;03C5 0308 0301; # (ΰ; ΰ; υ◌̈◌́; ΰ; υ◌̈◌́; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4;1FE4;03C1 0313;1FE4;03C1 0313; # (ῤ; ῤ; ρ◌̓; ῤ; ρ◌̓; ) GREEK SMALL LETTER RHO WITH PSILI +1FE5;1FE5;03C1 0314;1FE5;03C1 0314; # (ῥ; ῥ; ρ◌̔; ῥ; ρ◌̔; ) GREEK SMALL LETTER RHO WITH DASIA +1FE6;1FE6;03C5 0342;1FE6;03C5 0342; # (ῦ; ῦ; υ◌͂; ῦ; υ◌͂; ) GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7;1FE7;03C5 0308 0342;1FE7;03C5 0308 0342; # (ῧ; ῧ; υ◌̈◌͂; ῧ; υ◌̈◌͂; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8;1FE8;03A5 0306;1FE8;03A5 0306; # (Ῠ; Ῠ; Υ◌̆; Ῠ; Υ◌̆; ) GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9;1FE9;03A5 0304;1FE9;03A5 0304; # (Ῡ; Ῡ; Υ◌̄; Ῡ; Υ◌̄; ) GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA;1FEA;03A5 0300;1FEA;03A5 0300; # (Ὺ; Ὺ; Υ◌̀; Ὺ; Υ◌̀; ) GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB;038E;03A5 0301;038E;03A5 0301; # (Ύ; Ύ; Υ◌́; Ύ; Υ◌́; ) GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC;1FEC;03A1 0314;1FEC;03A1 0314; # (Ῥ; Ῥ; Ρ◌̔; Ῥ; Ρ◌̔; ) GREEK CAPITAL LETTER RHO WITH DASIA +1FED;1FED;00A8 0300;0020 0308 0300;0020 0308 0300; # (῭; ῭; ¨◌̀; ◌̈◌̀; ◌̈◌̀; ) GREEK DIALYTIKA AND VARIA +1FEE;0385;00A8 0301;0020 0308 0301;0020 0308 0301; # (΅; ΅; ¨◌́; ◌̈◌́; ◌̈◌́; ) GREEK DIALYTIKA AND OXIA +1FEF;0060;0060;0060;0060; # (`; `; `; `; `; ) GREEK VARIA +1FF2;1FF2;03C9 0300 0345;1FF2;03C9 0300 0345; # (ῲ; ῲ; ω◌̀◌ͅ; ῲ; ω◌̀◌ͅ; ) GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3;1FF3;03C9 0345;1FF3;03C9 0345; # (ῳ; ῳ; ω◌ͅ; ῳ; ω◌ͅ; ) GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4;1FF4;03C9 0301 0345;1FF4;03C9 0301 0345; # (ῴ; ῴ; ω◌́◌ͅ; ῴ; ω◌́◌ͅ; ) GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6;1FF6;03C9 0342;1FF6;03C9 0342; # (ῶ; ῶ; ω◌͂; ῶ; ω◌͂; ) GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7;1FF7;03C9 0342 0345;1FF7;03C9 0342 0345; # (ῷ; ῷ; ω◌͂◌ͅ; ῷ; ω◌͂◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8;1FF8;039F 0300;1FF8;039F 0300; # (Ὸ; Ὸ; Ο◌̀; Ὸ; Ο◌̀; ) GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9;038C;039F 0301;038C;039F 0301; # (Ό; Ό; Ο◌́; Ό; Ο◌́; ) GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA;1FFA;03A9 0300;1FFA;03A9 0300; # (Ὼ; Ὼ; Ω◌̀; Ὼ; Ω◌̀; ) GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB;038F;03A9 0301;038F;03A9 0301; # (Ώ; Ώ; Ω◌́; Ώ; Ω◌́; ) GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC;1FFC;03A9 0345;1FFC;03A9 0345; # (ῼ; ῼ; Ω◌ͅ; ῼ; Ω◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD;00B4;00B4;0020 0301;0020 0301; # (´; ´; ´; ◌́; ◌́; ) GREEK OXIA +1FFE;1FFE;1FFE;0020 0314;0020 0314; # (῾; ῾; ῾; ◌̔; ◌̔; ) GREEK DASIA +2000;2002;2002;0020;0020; # ( ;  ;  ; ; ; ) EN QUAD +2001;2003;2003;0020;0020; # ( ;  ;  ; ; ; ) EM QUAD +2002;2002;2002;0020;0020; # ( ;  ;  ; ; ; ) EN SPACE +2003;2003;2003;0020;0020; # ( ;  ;  ; ; ; ) EM SPACE +2004;2004;2004;0020;0020; # ( ;  ;  ; ; ; ) THREE-PER-EM SPACE +2005;2005;2005;0020;0020; # ( ;  ;  ; ; ; ) FOUR-PER-EM SPACE +2006;2006;2006;0020;0020; # ( ;  ;  ; ; ; ) SIX-PER-EM SPACE +2007;2007;2007;0020;0020; # ( ;  ;  ; ; ; ) FIGURE SPACE +2008;2008;2008;0020;0020; # ( ;  ;  ; ; ; ) PUNCTUATION SPACE +2009;2009;2009;0020;0020; # ( ;  ;  ; ; ; ) THIN SPACE +200A;200A;200A;0020;0020; # ( ;  ;  ; ; ; ) HAIR SPACE +2011;2011;2011;2010;2010; # (‑; ‑; ‑; ‐; ‐; ) NON-BREAKING HYPHEN +2017;2017;2017;0020 0333;0020 0333; # (‗; ‗; ‗; ◌̳; ◌̳; ) DOUBLE LOW LINE +2024;2024;2024;002E;002E; # (․; ․; ․; .; .; ) ONE DOT LEADER +2025;2025;2025;002E 002E;002E 002E; # (‥; ‥; ‥; ..; ..; ) TWO DOT LEADER +2026;2026;2026;002E 002E 002E;002E 002E 002E; # (…; …; …; ...; ...; ) HORIZONTAL ELLIPSIS +202F;202F;202F;0020;0020; # ( ;  ;  ; ; ; ) NARROW NO-BREAK SPACE +2033;2033;2033;2032 2032;2032 2032; # (″; ″; ″; ′′; ′′; ) DOUBLE PRIME +2034;2034;2034;2032 2032 2032;2032 2032 2032; # (‴; ‴; ‴; ′′′; ′′′; ) TRIPLE PRIME +2036;2036;2036;2035 2035;2035 2035; # (‶; ‶; ‶; ‵‵; ‵‵; ) REVERSED DOUBLE PRIME +2037;2037;2037;2035 2035 2035;2035 2035 2035; # (‷; ‷; ‷; ‵‵‵; ‵‵‵; ) REVERSED TRIPLE PRIME +203C;203C;203C;0021 0021;0021 0021; # (‼; ‼; ‼; !!; !!; ) DOUBLE EXCLAMATION MARK +203E;203E;203E;0020 0305;0020 0305; # (‾; ‾; ‾; ◌̅; ◌̅; ) OVERLINE +2047;2047;2047;003F 003F;003F 003F; # (⁇; ⁇; ⁇; ??; ??; ) DOUBLE QUESTION MARK +2048;2048;2048;003F 0021;003F 0021; # (⁈; ⁈; ⁈; ?!; ?!; ) QUESTION EXCLAMATION MARK +2049;2049;2049;0021 003F;0021 003F; # (⁉; ⁉; ⁉; !?; !?; ) EXCLAMATION QUESTION MARK +2057;2057;2057;2032 2032 2032 2032;2032 2032 2032 2032; # (⁗; ⁗; ⁗; ′′′′; ′′′′; ) QUADRUPLE PRIME +205F;205F;205F;0020;0020; # ( ;  ;  ; ; ; ) MEDIUM MATHEMATICAL SPACE +2070;2070;2070;0030;0030; # (⁰; ⁰; ⁰; 0; 0; ) SUPERSCRIPT ZERO +2071;2071;2071;0069;0069; # (ⁱ; ⁱ; ⁱ; i; i; ) SUPERSCRIPT LATIN SMALL LETTER I +2074;2074;2074;0034;0034; # (⁴; ⁴; ⁴; 4; 4; ) SUPERSCRIPT FOUR +2075;2075;2075;0035;0035; # (⁵; ⁵; ⁵; 5; 5; ) SUPERSCRIPT FIVE +2076;2076;2076;0036;0036; # (⁶; ⁶; ⁶; 6; 6; ) SUPERSCRIPT SIX +2077;2077;2077;0037;0037; # (⁷; ⁷; ⁷; 7; 7; ) SUPERSCRIPT SEVEN +2078;2078;2078;0038;0038; # (⁸; ⁸; ⁸; 8; 8; ) SUPERSCRIPT EIGHT +2079;2079;2079;0039;0039; # (⁹; ⁹; ⁹; 9; 9; ) SUPERSCRIPT NINE +207A;207A;207A;002B;002B; # (⁺; ⁺; ⁺; +; +; ) SUPERSCRIPT PLUS SIGN +207B;207B;207B;2212;2212; # (⁻; ⁻; ⁻; −; −; ) SUPERSCRIPT MINUS +207C;207C;207C;003D;003D; # (⁼; ⁼; ⁼; =; =; ) SUPERSCRIPT EQUALS SIGN +207D;207D;207D;0028;0028; # (⁽; ⁽; ⁽; (; (; ) SUPERSCRIPT LEFT PARENTHESIS +207E;207E;207E;0029;0029; # (⁾; ⁾; ⁾; ); ); ) SUPERSCRIPT RIGHT PARENTHESIS +207F;207F;207F;006E;006E; # (ⁿ; ⁿ; ⁿ; n; n; ) SUPERSCRIPT LATIN SMALL LETTER N +2080;2080;2080;0030;0030; # (₀; ₀; ₀; 0; 0; ) SUBSCRIPT ZERO +2081;2081;2081;0031;0031; # (₁; ₁; ₁; 1; 1; ) SUBSCRIPT ONE +2082;2082;2082;0032;0032; # (₂; ₂; ₂; 2; 2; ) SUBSCRIPT TWO +2083;2083;2083;0033;0033; # (₃; ₃; ₃; 3; 3; ) SUBSCRIPT THREE +2084;2084;2084;0034;0034; # (₄; ₄; ₄; 4; 4; ) SUBSCRIPT FOUR +2085;2085;2085;0035;0035; # (₅; ₅; ₅; 5; 5; ) SUBSCRIPT FIVE +2086;2086;2086;0036;0036; # (₆; ₆; ₆; 6; 6; ) SUBSCRIPT SIX +2087;2087;2087;0037;0037; # (₇; ₇; ₇; 7; 7; ) SUBSCRIPT SEVEN +2088;2088;2088;0038;0038; # (₈; ₈; ₈; 8; 8; ) SUBSCRIPT EIGHT +2089;2089;2089;0039;0039; # (₉; ₉; ₉; 9; 9; ) SUBSCRIPT NINE +208A;208A;208A;002B;002B; # (₊; ₊; ₊; +; +; ) SUBSCRIPT PLUS SIGN +208B;208B;208B;2212;2212; # (₋; ₋; ₋; −; −; ) SUBSCRIPT MINUS +208C;208C;208C;003D;003D; # (₌; ₌; ₌; =; =; ) SUBSCRIPT EQUALS SIGN +208D;208D;208D;0028;0028; # (₍; ₍; ₍; (; (; ) SUBSCRIPT LEFT PARENTHESIS +208E;208E;208E;0029;0029; # (₎; ₎; ₎; ); ); ) SUBSCRIPT RIGHT PARENTHESIS +20A8;20A8;20A8;0052 0073;0052 0073; # (₨; ₨; ₨; Rs; Rs; ) RUPEE SIGN +2100;2100;2100;0061 002F 0063;0061 002F 0063; # (℀; ℀; ℀; a/c; a/c; ) ACCOUNT OF +2101;2101;2101;0061 002F 0073;0061 002F 0073; # (℁; ℁; ℁; a/s; a/s; ) ADDRESSED TO THE SUBJECT +2102;2102;2102;0043;0043; # (ℂ; ℂ; ℂ; C; C; ) DOUBLE-STRUCK CAPITAL C +2103;2103;2103;00B0 0043;00B0 0043; # (℃; ℃; ℃; °C; °C; ) DEGREE CELSIUS +2105;2105;2105;0063 002F 006F;0063 002F 006F; # (℅; ℅; ℅; c/o; c/o; ) CARE OF +2106;2106;2106;0063 002F 0075;0063 002F 0075; # (℆; ℆; ℆; c/u; c/u; ) CADA UNA +2107;2107;2107;0190;0190; # (ℇ; ℇ; ℇ; Ɛ; Ɛ; ) EULER CONSTANT +2109;2109;2109;00B0 0046;00B0 0046; # (℉; ℉; ℉; °F; °F; ) DEGREE FAHRENHEIT +210A;210A;210A;0067;0067; # (ℊ; ℊ; ℊ; g; g; ) SCRIPT SMALL G +210B;210B;210B;0048;0048; # (ℋ; ℋ; ℋ; H; H; ) SCRIPT CAPITAL H +210C;210C;210C;0048;0048; # (ℌ; ℌ; ℌ; H; H; ) BLACK-LETTER CAPITAL H +210D;210D;210D;0048;0048; # (ℍ; ℍ; ℍ; H; H; ) DOUBLE-STRUCK CAPITAL H +210E;210E;210E;0068;0068; # (ℎ; ℎ; ℎ; h; h; ) PLANCK CONSTANT +210F;210F;210F;0127;0127; # (ℏ; ℏ; ℏ; ħ; ħ; ) PLANCK CONSTANT OVER TWO PI +2110;2110;2110;0049;0049; # (ℐ; ℐ; ℐ; I; I; ) SCRIPT CAPITAL I +2111;2111;2111;0049;0049; # (ℑ; ℑ; ℑ; I; I; ) BLACK-LETTER CAPITAL I +2112;2112;2112;004C;004C; # (ℒ; ℒ; ℒ; L; L; ) SCRIPT CAPITAL L +2113;2113;2113;006C;006C; # (ℓ; ℓ; ℓ; l; l; ) SCRIPT SMALL L +2115;2115;2115;004E;004E; # (ℕ; ℕ; ℕ; N; N; ) DOUBLE-STRUCK CAPITAL N +2116;2116;2116;004E 006F;004E 006F; # (№; №; №; No; No; ) NUMERO SIGN +2119;2119;2119;0050;0050; # (ℙ; ℙ; ℙ; P; P; ) DOUBLE-STRUCK CAPITAL P +211A;211A;211A;0051;0051; # (ℚ; ℚ; ℚ; Q; Q; ) DOUBLE-STRUCK CAPITAL Q +211B;211B;211B;0052;0052; # (ℛ; ℛ; ℛ; R; R; ) SCRIPT CAPITAL R +211C;211C;211C;0052;0052; # (ℜ; ℜ; ℜ; R; R; ) BLACK-LETTER CAPITAL R +211D;211D;211D;0052;0052; # (ℝ; ℝ; ℝ; R; R; ) DOUBLE-STRUCK CAPITAL R +2120;2120;2120;0053 004D;0053 004D; # (℠; ℠; ℠; SM; SM; ) SERVICE MARK +2121;2121;2121;0054 0045 004C;0054 0045 004C; # (℡; ℡; ℡; TEL; TEL; ) TELEPHONE SIGN +2122;2122;2122;0054 004D;0054 004D; # (™; ™; ™; TM; TM; ) TRADE MARK SIGN +2124;2124;2124;005A;005A; # (ℤ; ℤ; ℤ; Z; Z; ) DOUBLE-STRUCK CAPITAL Z +2126;03A9;03A9;03A9;03A9; # (Ω; Ω; Ω; Ω; Ω; ) OHM SIGN +2128;2128;2128;005A;005A; # (ℨ; ℨ; ℨ; Z; Z; ) BLACK-LETTER CAPITAL Z +212A;004B;004B;004B;004B; # (K; K; K; K; K; ) KELVIN SIGN +212B;00C5;0041 030A;00C5;0041 030A; # (Å; Å; A◌̊; Å; A◌̊; ) ANGSTROM SIGN +212C;212C;212C;0042;0042; # (ℬ; ℬ; ℬ; B; B; ) SCRIPT CAPITAL B +212D;212D;212D;0043;0043; # (ℭ; ℭ; ℭ; C; C; ) BLACK-LETTER CAPITAL C +212F;212F;212F;0065;0065; # (ℯ; ℯ; ℯ; e; e; ) SCRIPT SMALL E +2130;2130;2130;0045;0045; # (ℰ; ℰ; ℰ; E; E; ) SCRIPT CAPITAL E +2131;2131;2131;0046;0046; # (ℱ; ℱ; ℱ; F; F; ) SCRIPT CAPITAL F +2133;2133;2133;004D;004D; # (ℳ; ℳ; ℳ; M; M; ) SCRIPT CAPITAL M +2134;2134;2134;006F;006F; # (ℴ; ℴ; ℴ; o; o; ) SCRIPT SMALL O +2135;2135;2135;05D0;05D0; # (ℵ; ℵ; ℵ; א; א; ) ALEF SYMBOL +2136;2136;2136;05D1;05D1; # (ℶ; ℶ; ℶ; ב; ב; ) BET SYMBOL +2137;2137;2137;05D2;05D2; # (ℷ; ℷ; ℷ; ג; ג; ) GIMEL SYMBOL +2138;2138;2138;05D3;05D3; # (ℸ; ℸ; ℸ; ד; ד; ) DALET SYMBOL +2139;2139;2139;0069;0069; # (ℹ; ℹ; ℹ; i; i; ) INFORMATION SOURCE +213D;213D;213D;03B3;03B3; # (ℽ; ℽ; ℽ; γ; γ; ) DOUBLE-STRUCK SMALL GAMMA +213E;213E;213E;0393;0393; # (ℾ; ℾ; ℾ; Γ; Γ; ) DOUBLE-STRUCK CAPITAL GAMMA +213F;213F;213F;03A0;03A0; # (ℿ; ℿ; ℿ; Π; Π; ) DOUBLE-STRUCK CAPITAL PI +2140;2140;2140;2211;2211; # (⅀; ⅀; ⅀; ∑; ∑; ) DOUBLE-STRUCK N-ARY SUMMATION +2145;2145;2145;0044;0044; # (ⅅ; ⅅ; ⅅ; D; D; ) DOUBLE-STRUCK ITALIC CAPITAL D +2146;2146;2146;0064;0064; # (ⅆ; ⅆ; ⅆ; d; d; ) DOUBLE-STRUCK ITALIC SMALL D +2147;2147;2147;0065;0065; # (ⅇ; ⅇ; ⅇ; e; e; ) DOUBLE-STRUCK ITALIC SMALL E +2148;2148;2148;0069;0069; # (ⅈ; ⅈ; ⅈ; i; i; ) DOUBLE-STRUCK ITALIC SMALL I +2149;2149;2149;006A;006A; # (ⅉ; ⅉ; ⅉ; j; j; ) DOUBLE-STRUCK ITALIC SMALL J +2153;2153;2153;0031 2044 0033;0031 2044 0033; # (⅓; ⅓; ⅓; 1⁄3; 1⁄3; ) VULGAR FRACTION ONE THIRD +2154;2154;2154;0032 2044 0033;0032 2044 0033; # (⅔; ⅔; ⅔; 2⁄3; 2⁄3; ) VULGAR FRACTION TWO THIRDS +2155;2155;2155;0031 2044 0035;0031 2044 0035; # (⅕; ⅕; ⅕; 1⁄5; 1⁄5; ) VULGAR FRACTION ONE FIFTH +2156;2156;2156;0032 2044 0035;0032 2044 0035; # (⅖; ⅖; ⅖; 2⁄5; 2⁄5; ) VULGAR FRACTION TWO FIFTHS +2157;2157;2157;0033 2044 0035;0033 2044 0035; # (⅗; ⅗; ⅗; 3⁄5; 3⁄5; ) VULGAR FRACTION THREE FIFTHS +2158;2158;2158;0034 2044 0035;0034 2044 0035; # (⅘; ⅘; ⅘; 4⁄5; 4⁄5; ) VULGAR FRACTION FOUR FIFTHS +2159;2159;2159;0031 2044 0036;0031 2044 0036; # (⅙; ⅙; ⅙; 1⁄6; 1⁄6; ) VULGAR FRACTION ONE SIXTH +215A;215A;215A;0035 2044 0036;0035 2044 0036; # (⅚; ⅚; ⅚; 5⁄6; 5⁄6; ) VULGAR FRACTION FIVE SIXTHS +215B;215B;215B;0031 2044 0038;0031 2044 0038; # (⅛; ⅛; ⅛; 1⁄8; 1⁄8; ) VULGAR FRACTION ONE EIGHTH +215C;215C;215C;0033 2044 0038;0033 2044 0038; # (⅜; ⅜; ⅜; 3⁄8; 3⁄8; ) VULGAR FRACTION THREE EIGHTHS +215D;215D;215D;0035 2044 0038;0035 2044 0038; # (⅝; ⅝; ⅝; 5⁄8; 5⁄8; ) VULGAR FRACTION FIVE EIGHTHS +215E;215E;215E;0037 2044 0038;0037 2044 0038; # (⅞; ⅞; ⅞; 7⁄8; 7⁄8; ) VULGAR FRACTION SEVEN EIGHTHS +215F;215F;215F;0031 2044;0031 2044; # (⅟; ⅟; ⅟; 1⁄; 1⁄; ) FRACTION NUMERATOR ONE +2160;2160;2160;0049;0049; # (Ⅰ; Ⅰ; Ⅰ; I; I; ) ROMAN NUMERAL ONE +2161;2161;2161;0049 0049;0049 0049; # (Ⅱ; Ⅱ; Ⅱ; II; II; ) ROMAN NUMERAL TWO +2162;2162;2162;0049 0049 0049;0049 0049 0049; # (Ⅲ; Ⅲ; Ⅲ; III; III; ) ROMAN NUMERAL THREE +2163;2163;2163;0049 0056;0049 0056; # (Ⅳ; Ⅳ; Ⅳ; IV; IV; ) ROMAN NUMERAL FOUR +2164;2164;2164;0056;0056; # (Ⅴ; Ⅴ; Ⅴ; V; V; ) ROMAN NUMERAL FIVE +2165;2165;2165;0056 0049;0056 0049; # (Ⅵ; Ⅵ; Ⅵ; VI; VI; ) ROMAN NUMERAL SIX +2166;2166;2166;0056 0049 0049;0056 0049 0049; # (Ⅶ; Ⅶ; Ⅶ; VII; VII; ) ROMAN NUMERAL SEVEN +2167;2167;2167;0056 0049 0049 0049;0056 0049 0049 0049; # (Ⅷ; Ⅷ; Ⅷ; VIII; VIII; ) ROMAN NUMERAL EIGHT +2168;2168;2168;0049 0058;0049 0058; # (Ⅸ; Ⅸ; Ⅸ; IX; IX; ) ROMAN NUMERAL NINE +2169;2169;2169;0058;0058; # (Ⅹ; Ⅹ; Ⅹ; X; X; ) ROMAN NUMERAL TEN +216A;216A;216A;0058 0049;0058 0049; # (Ⅺ; Ⅺ; Ⅺ; XI; XI; ) ROMAN NUMERAL ELEVEN +216B;216B;216B;0058 0049 0049;0058 0049 0049; # (Ⅻ; Ⅻ; Ⅻ; XII; XII; ) ROMAN NUMERAL TWELVE +216C;216C;216C;004C;004C; # (Ⅼ; Ⅼ; Ⅼ; L; L; ) ROMAN NUMERAL FIFTY +216D;216D;216D;0043;0043; # (Ⅽ; Ⅽ; Ⅽ; C; C; ) ROMAN NUMERAL ONE HUNDRED +216E;216E;216E;0044;0044; # (Ⅾ; Ⅾ; Ⅾ; D; D; ) ROMAN NUMERAL FIVE HUNDRED +216F;216F;216F;004D;004D; # (Ⅿ; Ⅿ; Ⅿ; M; M; ) ROMAN NUMERAL ONE THOUSAND +2170;2170;2170;0069;0069; # (ⅰ; ⅰ; ⅰ; i; i; ) SMALL ROMAN NUMERAL ONE +2171;2171;2171;0069 0069;0069 0069; # (ⅱ; ⅱ; ⅱ; ii; ii; ) SMALL ROMAN NUMERAL TWO +2172;2172;2172;0069 0069 0069;0069 0069 0069; # (ⅲ; ⅲ; ⅲ; iii; iii; ) SMALL ROMAN NUMERAL THREE +2173;2173;2173;0069 0076;0069 0076; # (ⅳ; ⅳ; ⅳ; iv; iv; ) SMALL ROMAN NUMERAL FOUR +2174;2174;2174;0076;0076; # (ⅴ; ⅴ; ⅴ; v; v; ) SMALL ROMAN NUMERAL FIVE +2175;2175;2175;0076 0069;0076 0069; # (ⅵ; ⅵ; ⅵ; vi; vi; ) SMALL ROMAN NUMERAL SIX +2176;2176;2176;0076 0069 0069;0076 0069 0069; # (ⅶ; ⅶ; ⅶ; vii; vii; ) SMALL ROMAN NUMERAL SEVEN +2177;2177;2177;0076 0069 0069 0069;0076 0069 0069 0069; # (ⅷ; ⅷ; ⅷ; viii; viii; ) SMALL ROMAN NUMERAL EIGHT +2178;2178;2178;0069 0078;0069 0078; # (ⅸ; ⅸ; ⅸ; ix; ix; ) SMALL ROMAN NUMERAL NINE +2179;2179;2179;0078;0078; # (ⅹ; ⅹ; ⅹ; x; x; ) SMALL ROMAN NUMERAL TEN +217A;217A;217A;0078 0069;0078 0069; # (ⅺ; ⅺ; ⅺ; xi; xi; ) SMALL ROMAN NUMERAL ELEVEN +217B;217B;217B;0078 0069 0069;0078 0069 0069; # (ⅻ; ⅻ; ⅻ; xii; xii; ) SMALL ROMAN NUMERAL TWELVE +217C;217C;217C;006C;006C; # (ⅼ; ⅼ; ⅼ; l; l; ) SMALL ROMAN NUMERAL FIFTY +217D;217D;217D;0063;0063; # (ⅽ; ⅽ; ⅽ; c; c; ) SMALL ROMAN NUMERAL ONE HUNDRED +217E;217E;217E;0064;0064; # (ⅾ; ⅾ; ⅾ; d; d; ) SMALL ROMAN NUMERAL FIVE HUNDRED +217F;217F;217F;006D;006D; # (ⅿ; ⅿ; ⅿ; m; m; ) SMALL ROMAN NUMERAL ONE THOUSAND +219A;219A;2190 0338;219A;2190 0338; # (↚; ↚; ←◌̸; ↚; ←◌̸; ) LEFTWARDS ARROW WITH STROKE +219B;219B;2192 0338;219B;2192 0338; # (↛; ↛; →◌̸; ↛; →◌̸; ) RIGHTWARDS ARROW WITH STROKE +21AE;21AE;2194 0338;21AE;2194 0338; # (↮; ↮; ↔◌̸; ↮; ↔◌̸; ) LEFT RIGHT ARROW WITH STROKE +21CD;21CD;21D0 0338;21CD;21D0 0338; # (⇍; ⇍; ⇐◌̸; ⇍; ⇐◌̸; ) LEFTWARDS DOUBLE ARROW WITH STROKE +21CE;21CE;21D4 0338;21CE;21D4 0338; # (⇎; ⇎; ⇔◌̸; ⇎; ⇔◌̸; ) LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF;21CF;21D2 0338;21CF;21D2 0338; # (⇏; ⇏; ⇒◌̸; ⇏; ⇒◌̸; ) RIGHTWARDS DOUBLE ARROW WITH STROKE +2204;2204;2203 0338;2204;2203 0338; # (∄; ∄; ∃◌̸; ∄; ∃◌̸; ) THERE DOES NOT EXIST +2209;2209;2208 0338;2209;2208 0338; # (∉; ∉; ∈◌̸; ∉; ∈◌̸; ) NOT AN ELEMENT OF +220C;220C;220B 0338;220C;220B 0338; # (∌; ∌; ∋◌̸; ∌; ∋◌̸; ) DOES NOT CONTAIN AS MEMBER +2224;2224;2223 0338;2224;2223 0338; # (∤; ∤; ∣◌̸; ∤; ∣◌̸; ) DOES NOT DIVIDE +2226;2226;2225 0338;2226;2225 0338; # (∦; ∦; ∥◌̸; ∦; ∥◌̸; ) NOT PARALLEL TO +222C;222C;222C;222B 222B;222B 222B; # (∬; ∬; ∬; ∫∫; ∫∫; ) DOUBLE INTEGRAL +222D;222D;222D;222B 222B 222B;222B 222B 222B; # (∭; ∭; ∭; ∫∫∫; ∫∫∫; ) TRIPLE INTEGRAL +222F;222F;222F;222E 222E;222E 222E; # (∯; ∯; ∯; ∮∮; ∮∮; ) SURFACE INTEGRAL +2230;2230;2230;222E 222E 222E;222E 222E 222E; # (∰; ∰; ∰; ∮∮∮; ∮∮∮; ) VOLUME INTEGRAL +2241;2241;223C 0338;2241;223C 0338; # (≁; ≁; ∼◌̸; ≁; ∼◌̸; ) NOT TILDE +2244;2244;2243 0338;2244;2243 0338; # (≄; ≄; ≃◌̸; ≄; ≃◌̸; ) NOT ASYMPTOTICALLY EQUAL TO +2247;2247;2245 0338;2247;2245 0338; # (≇; ≇; ≅◌̸; ≇; ≅◌̸; ) NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2249;2249;2248 0338;2249;2248 0338; # (≉; ≉; ≈◌̸; ≉; ≈◌̸; ) NOT ALMOST EQUAL TO +2260;2260;003D 0338;2260;003D 0338; # (≠; ≠; =◌̸; ≠; =◌̸; ) NOT EQUAL TO +2262;2262;2261 0338;2262;2261 0338; # (≢; ≢; ≡◌̸; ≢; ≡◌̸; ) NOT IDENTICAL TO +226D;226D;224D 0338;226D;224D 0338; # (≭; ≭; ≍◌̸; ≭; ≍◌̸; ) NOT EQUIVALENT TO +226E;226E;003C 0338;226E;003C 0338; # (≮; ≮; <◌̸; ≮; <◌̸; ) NOT LESS-THAN +226F;226F;003E 0338;226F;003E 0338; # (≯; ≯; >◌̸; ≯; >◌̸; ) NOT GREATER-THAN +2270;2270;2264 0338;2270;2264 0338; # (≰; ≰; ≤◌̸; ≰; ≤◌̸; ) NEITHER LESS-THAN NOR EQUAL TO +2271;2271;2265 0338;2271;2265 0338; # (≱; ≱; ≥◌̸; ≱; ≥◌̸; ) NEITHER GREATER-THAN NOR EQUAL TO +2274;2274;2272 0338;2274;2272 0338; # (≴; ≴; ≲◌̸; ≴; ≲◌̸; ) NEITHER LESS-THAN NOR EQUIVALENT TO +2275;2275;2273 0338;2275;2273 0338; # (≵; ≵; ≳◌̸; ≵; ≳◌̸; ) NEITHER GREATER-THAN NOR EQUIVALENT TO +2278;2278;2276 0338;2278;2276 0338; # (≸; ≸; ≶◌̸; ≸; ≶◌̸; ) NEITHER LESS-THAN NOR GREATER-THAN +2279;2279;2277 0338;2279;2277 0338; # (≹; ≹; ≷◌̸; ≹; ≷◌̸; ) NEITHER GREATER-THAN NOR LESS-THAN +2280;2280;227A 0338;2280;227A 0338; # (⊀; ⊀; ≺◌̸; ⊀; ≺◌̸; ) DOES NOT PRECEDE +2281;2281;227B 0338;2281;227B 0338; # (⊁; ⊁; ≻◌̸; ⊁; ≻◌̸; ) DOES NOT SUCCEED +2284;2284;2282 0338;2284;2282 0338; # (⊄; ⊄; ⊂◌̸; ⊄; ⊂◌̸; ) NOT A SUBSET OF +2285;2285;2283 0338;2285;2283 0338; # (⊅; ⊅; ⊃◌̸; ⊅; ⊃◌̸; ) NOT A SUPERSET OF +2288;2288;2286 0338;2288;2286 0338; # (⊈; ⊈; ⊆◌̸; ⊈; ⊆◌̸; ) NEITHER A SUBSET OF NOR EQUAL TO +2289;2289;2287 0338;2289;2287 0338; # (⊉; ⊉; ⊇◌̸; ⊉; ⊇◌̸; ) NEITHER A SUPERSET OF NOR EQUAL TO +22AC;22AC;22A2 0338;22AC;22A2 0338; # (⊬; ⊬; ⊢◌̸; ⊬; ⊢◌̸; ) DOES NOT PROVE +22AD;22AD;22A8 0338;22AD;22A8 0338; # (⊭; ⊭; ⊨◌̸; ⊭; ⊨◌̸; ) NOT TRUE +22AE;22AE;22A9 0338;22AE;22A9 0338; # (⊮; ⊮; ⊩◌̸; ⊮; ⊩◌̸; ) DOES NOT FORCE +22AF;22AF;22AB 0338;22AF;22AB 0338; # (⊯; ⊯; ⊫◌̸; ⊯; ⊫◌̸; ) NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22E0;22E0;227C 0338;22E0;227C 0338; # (⋠; ⋠; ≼◌̸; ⋠; ≼◌̸; ) DOES NOT PRECEDE OR EQUAL +22E1;22E1;227D 0338;22E1;227D 0338; # (⋡; ⋡; ≽◌̸; ⋡; ≽◌̸; ) DOES NOT SUCCEED OR EQUAL +22E2;22E2;2291 0338;22E2;2291 0338; # (⋢; ⋢; ⊑◌̸; ⋢; ⊑◌̸; ) NOT SQUARE IMAGE OF OR EQUAL TO +22E3;22E3;2292 0338;22E3;2292 0338; # (⋣; ⋣; ⊒◌̸; ⋣; ⊒◌̸; ) NOT SQUARE ORIGINAL OF OR EQUAL TO +22EA;22EA;22B2 0338;22EA;22B2 0338; # (⋪; ⋪; ⊲◌̸; ⋪; ⊲◌̸; ) NOT NORMAL SUBGROUP OF +22EB;22EB;22B3 0338;22EB;22B3 0338; # (⋫; ⋫; ⊳◌̸; ⋫; ⊳◌̸; ) DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC;22EC;22B4 0338;22EC;22B4 0338; # (⋬; ⋬; ⊴◌̸; ⋬; ⊴◌̸; ) NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED;22ED;22B5 0338;22ED;22B5 0338; # (⋭; ⋭; ⊵◌̸; ⋭; ⊵◌̸; ) DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +2329;3008;3008;3008;3008; # (〈; 〈; 〈; 〈; 〈; ) LEFT-POINTING ANGLE BRACKET +232A;3009;3009;3009;3009; # (〉; 〉; 〉; 〉; 〉; ) RIGHT-POINTING ANGLE BRACKET +2460;2460;2460;0031;0031; # (①; ①; ①; 1; 1; ) CIRCLED DIGIT ONE +2461;2461;2461;0032;0032; # (②; ②; ②; 2; 2; ) CIRCLED DIGIT TWO +2462;2462;2462;0033;0033; # (③; ③; ③; 3; 3; ) CIRCLED DIGIT THREE +2463;2463;2463;0034;0034; # (④; ④; ④; 4; 4; ) CIRCLED DIGIT FOUR +2464;2464;2464;0035;0035; # (⑤; ⑤; ⑤; 5; 5; ) CIRCLED DIGIT FIVE +2465;2465;2465;0036;0036; # (⑥; ⑥; ⑥; 6; 6; ) CIRCLED DIGIT SIX +2466;2466;2466;0037;0037; # (⑦; ⑦; ⑦; 7; 7; ) CIRCLED DIGIT SEVEN +2467;2467;2467;0038;0038; # (⑧; ⑧; ⑧; 8; 8; ) CIRCLED DIGIT EIGHT +2468;2468;2468;0039;0039; # (⑨; ⑨; ⑨; 9; 9; ) CIRCLED DIGIT NINE +2469;2469;2469;0031 0030;0031 0030; # (⑩; ⑩; ⑩; 10; 10; ) CIRCLED NUMBER TEN +246A;246A;246A;0031 0031;0031 0031; # (⑪; ⑪; ⑪; 11; 11; ) CIRCLED NUMBER ELEVEN +246B;246B;246B;0031 0032;0031 0032; # (⑫; ⑫; ⑫; 12; 12; ) CIRCLED NUMBER TWELVE +246C;246C;246C;0031 0033;0031 0033; # (⑬; ⑬; ⑬; 13; 13; ) CIRCLED NUMBER THIRTEEN +246D;246D;246D;0031 0034;0031 0034; # (⑭; ⑭; ⑭; 14; 14; ) CIRCLED NUMBER FOURTEEN +246E;246E;246E;0031 0035;0031 0035; # (⑮; ⑮; ⑮; 15; 15; ) CIRCLED NUMBER FIFTEEN +246F;246F;246F;0031 0036;0031 0036; # (⑯; ⑯; ⑯; 16; 16; ) CIRCLED NUMBER SIXTEEN +2470;2470;2470;0031 0037;0031 0037; # (⑰; ⑰; ⑰; 17; 17; ) CIRCLED NUMBER SEVENTEEN +2471;2471;2471;0031 0038;0031 0038; # (⑱; ⑱; ⑱; 18; 18; ) CIRCLED NUMBER EIGHTEEN +2472;2472;2472;0031 0039;0031 0039; # (⑲; ⑲; ⑲; 19; 19; ) CIRCLED NUMBER NINETEEN +2473;2473;2473;0032 0030;0032 0030; # (⑳; ⑳; ⑳; 20; 20; ) CIRCLED NUMBER TWENTY +2474;2474;2474;0028 0031 0029;0028 0031 0029; # (⑴; ⑴; ⑴; (1); (1); ) PARENTHESIZED DIGIT ONE +2475;2475;2475;0028 0032 0029;0028 0032 0029; # (⑵; ⑵; ⑵; (2); (2); ) PARENTHESIZED DIGIT TWO +2476;2476;2476;0028 0033 0029;0028 0033 0029; # (⑶; ⑶; ⑶; (3); (3); ) PARENTHESIZED DIGIT THREE +2477;2477;2477;0028 0034 0029;0028 0034 0029; # (⑷; ⑷; ⑷; (4); (4); ) PARENTHESIZED DIGIT FOUR +2478;2478;2478;0028 0035 0029;0028 0035 0029; # (⑸; ⑸; ⑸; (5); (5); ) PARENTHESIZED DIGIT FIVE +2479;2479;2479;0028 0036 0029;0028 0036 0029; # (⑹; ⑹; ⑹; (6); (6); ) PARENTHESIZED DIGIT SIX +247A;247A;247A;0028 0037 0029;0028 0037 0029; # (⑺; ⑺; ⑺; (7); (7); ) PARENTHESIZED DIGIT SEVEN +247B;247B;247B;0028 0038 0029;0028 0038 0029; # (⑻; ⑻; ⑻; (8); (8); ) PARENTHESIZED DIGIT EIGHT +247C;247C;247C;0028 0039 0029;0028 0039 0029; # (⑼; ⑼; ⑼; (9); (9); ) PARENTHESIZED DIGIT NINE +247D;247D;247D;0028 0031 0030 0029;0028 0031 0030 0029; # (⑽; ⑽; ⑽; (10); (10); ) PARENTHESIZED NUMBER TEN +247E;247E;247E;0028 0031 0031 0029;0028 0031 0031 0029; # (⑾; ⑾; ⑾; (11); (11); ) PARENTHESIZED NUMBER ELEVEN +247F;247F;247F;0028 0031 0032 0029;0028 0031 0032 0029; # (⑿; ⑿; ⑿; (12); (12); ) PARENTHESIZED NUMBER TWELVE +2480;2480;2480;0028 0031 0033 0029;0028 0031 0033 0029; # (⒀; ⒀; ⒀; (13); (13); ) PARENTHESIZED NUMBER THIRTEEN +2481;2481;2481;0028 0031 0034 0029;0028 0031 0034 0029; # (⒁; ⒁; ⒁; (14); (14); ) PARENTHESIZED NUMBER FOURTEEN +2482;2482;2482;0028 0031 0035 0029;0028 0031 0035 0029; # (⒂; ⒂; ⒂; (15); (15); ) PARENTHESIZED NUMBER FIFTEEN +2483;2483;2483;0028 0031 0036 0029;0028 0031 0036 0029; # (⒃; ⒃; ⒃; (16); (16); ) PARENTHESIZED NUMBER SIXTEEN +2484;2484;2484;0028 0031 0037 0029;0028 0031 0037 0029; # (⒄; ⒄; ⒄; (17); (17); ) PARENTHESIZED NUMBER SEVENTEEN +2485;2485;2485;0028 0031 0038 0029;0028 0031 0038 0029; # (⒅; ⒅; ⒅; (18); (18); ) PARENTHESIZED NUMBER EIGHTEEN +2486;2486;2486;0028 0031 0039 0029;0028 0031 0039 0029; # (⒆; ⒆; ⒆; (19); (19); ) PARENTHESIZED NUMBER NINETEEN +2487;2487;2487;0028 0032 0030 0029;0028 0032 0030 0029; # (⒇; ⒇; ⒇; (20); (20); ) PARENTHESIZED NUMBER TWENTY +2488;2488;2488;0031 002E;0031 002E; # (⒈; ⒈; ⒈; 1.; 1.; ) DIGIT ONE FULL STOP +2489;2489;2489;0032 002E;0032 002E; # (⒉; ⒉; ⒉; 2.; 2.; ) DIGIT TWO FULL STOP +248A;248A;248A;0033 002E;0033 002E; # (⒊; ⒊; ⒊; 3.; 3.; ) DIGIT THREE FULL STOP +248B;248B;248B;0034 002E;0034 002E; # (⒋; ⒋; ⒋; 4.; 4.; ) DIGIT FOUR FULL STOP +248C;248C;248C;0035 002E;0035 002E; # (⒌; ⒌; ⒌; 5.; 5.; ) DIGIT FIVE FULL STOP +248D;248D;248D;0036 002E;0036 002E; # (⒍; ⒍; ⒍; 6.; 6.; ) DIGIT SIX FULL STOP +248E;248E;248E;0037 002E;0037 002E; # (⒎; ⒎; ⒎; 7.; 7.; ) DIGIT SEVEN FULL STOP +248F;248F;248F;0038 002E;0038 002E; # (⒏; ⒏; ⒏; 8.; 8.; ) DIGIT EIGHT FULL STOP +2490;2490;2490;0039 002E;0039 002E; # (⒐; ⒐; ⒐; 9.; 9.; ) DIGIT NINE FULL STOP +2491;2491;2491;0031 0030 002E;0031 0030 002E; # (⒑; ⒑; ⒑; 10.; 10.; ) NUMBER TEN FULL STOP +2492;2492;2492;0031 0031 002E;0031 0031 002E; # (⒒; ⒒; ⒒; 11.; 11.; ) NUMBER ELEVEN FULL STOP +2493;2493;2493;0031 0032 002E;0031 0032 002E; # (⒓; ⒓; ⒓; 12.; 12.; ) NUMBER TWELVE FULL STOP +2494;2494;2494;0031 0033 002E;0031 0033 002E; # (⒔; ⒔; ⒔; 13.; 13.; ) NUMBER THIRTEEN FULL STOP +2495;2495;2495;0031 0034 002E;0031 0034 002E; # (⒕; ⒕; ⒕; 14.; 14.; ) NUMBER FOURTEEN FULL STOP +2496;2496;2496;0031 0035 002E;0031 0035 002E; # (⒖; ⒖; ⒖; 15.; 15.; ) NUMBER FIFTEEN FULL STOP +2497;2497;2497;0031 0036 002E;0031 0036 002E; # (⒗; ⒗; ⒗; 16.; 16.; ) NUMBER SIXTEEN FULL STOP +2498;2498;2498;0031 0037 002E;0031 0037 002E; # (⒘; ⒘; ⒘; 17.; 17.; ) NUMBER SEVENTEEN FULL STOP +2499;2499;2499;0031 0038 002E;0031 0038 002E; # (⒙; ⒙; ⒙; 18.; 18.; ) NUMBER EIGHTEEN FULL STOP +249A;249A;249A;0031 0039 002E;0031 0039 002E; # (⒚; ⒚; ⒚; 19.; 19.; ) NUMBER NINETEEN FULL STOP +249B;249B;249B;0032 0030 002E;0032 0030 002E; # (⒛; ⒛; ⒛; 20.; 20.; ) NUMBER TWENTY FULL STOP +249C;249C;249C;0028 0061 0029;0028 0061 0029; # (⒜; ⒜; ⒜; (a); (a); ) PARENTHESIZED LATIN SMALL LETTER A +249D;249D;249D;0028 0062 0029;0028 0062 0029; # (⒝; ⒝; ⒝; (b); (b); ) PARENTHESIZED LATIN SMALL LETTER B +249E;249E;249E;0028 0063 0029;0028 0063 0029; # (⒞; ⒞; ⒞; (c); (c); ) PARENTHESIZED LATIN SMALL LETTER C +249F;249F;249F;0028 0064 0029;0028 0064 0029; # (⒟; ⒟; ⒟; (d); (d); ) PARENTHESIZED LATIN SMALL LETTER D +24A0;24A0;24A0;0028 0065 0029;0028 0065 0029; # (⒠; ⒠; ⒠; (e); (e); ) PARENTHESIZED LATIN SMALL LETTER E +24A1;24A1;24A1;0028 0066 0029;0028 0066 0029; # (⒡; ⒡; ⒡; (f); (f); ) PARENTHESIZED LATIN SMALL LETTER F +24A2;24A2;24A2;0028 0067 0029;0028 0067 0029; # (⒢; ⒢; ⒢; (g); (g); ) PARENTHESIZED LATIN SMALL LETTER G +24A3;24A3;24A3;0028 0068 0029;0028 0068 0029; # (⒣; ⒣; ⒣; (h); (h); ) PARENTHESIZED LATIN SMALL LETTER H +24A4;24A4;24A4;0028 0069 0029;0028 0069 0029; # (⒤; ⒤; ⒤; (i); (i); ) PARENTHESIZED LATIN SMALL LETTER I +24A5;24A5;24A5;0028 006A 0029;0028 006A 0029; # (⒥; ⒥; ⒥; (j); (j); ) PARENTHESIZED LATIN SMALL LETTER J +24A6;24A6;24A6;0028 006B 0029;0028 006B 0029; # (⒦; ⒦; ⒦; (k); (k); ) PARENTHESIZED LATIN SMALL LETTER K +24A7;24A7;24A7;0028 006C 0029;0028 006C 0029; # (⒧; ⒧; ⒧; (l); (l); ) PARENTHESIZED LATIN SMALL LETTER L +24A8;24A8;24A8;0028 006D 0029;0028 006D 0029; # (⒨; ⒨; ⒨; (m); (m); ) PARENTHESIZED LATIN SMALL LETTER M +24A9;24A9;24A9;0028 006E 0029;0028 006E 0029; # (⒩; ⒩; ⒩; (n); (n); ) PARENTHESIZED LATIN SMALL LETTER N +24AA;24AA;24AA;0028 006F 0029;0028 006F 0029; # (⒪; ⒪; ⒪; (o); (o); ) PARENTHESIZED LATIN SMALL LETTER O +24AB;24AB;24AB;0028 0070 0029;0028 0070 0029; # (⒫; ⒫; ⒫; (p); (p); ) PARENTHESIZED LATIN SMALL LETTER P +24AC;24AC;24AC;0028 0071 0029;0028 0071 0029; # (⒬; ⒬; ⒬; (q); (q); ) PARENTHESIZED LATIN SMALL LETTER Q +24AD;24AD;24AD;0028 0072 0029;0028 0072 0029; # (⒭; ⒭; ⒭; (r); (r); ) PARENTHESIZED LATIN SMALL LETTER R +24AE;24AE;24AE;0028 0073 0029;0028 0073 0029; # (⒮; ⒮; ⒮; (s); (s); ) PARENTHESIZED LATIN SMALL LETTER S +24AF;24AF;24AF;0028 0074 0029;0028 0074 0029; # (⒯; ⒯; ⒯; (t); (t); ) PARENTHESIZED LATIN SMALL LETTER T +24B0;24B0;24B0;0028 0075 0029;0028 0075 0029; # (⒰; ⒰; ⒰; (u); (u); ) PARENTHESIZED LATIN SMALL LETTER U +24B1;24B1;24B1;0028 0076 0029;0028 0076 0029; # (⒱; ⒱; ⒱; (v); (v); ) PARENTHESIZED LATIN SMALL LETTER V +24B2;24B2;24B2;0028 0077 0029;0028 0077 0029; # (⒲; ⒲; ⒲; (w); (w); ) PARENTHESIZED LATIN SMALL LETTER W +24B3;24B3;24B3;0028 0078 0029;0028 0078 0029; # (⒳; ⒳; ⒳; (x); (x); ) PARENTHESIZED LATIN SMALL LETTER X +24B4;24B4;24B4;0028 0079 0029;0028 0079 0029; # (⒴; ⒴; ⒴; (y); (y); ) PARENTHESIZED LATIN SMALL LETTER Y +24B5;24B5;24B5;0028 007A 0029;0028 007A 0029; # (⒵; ⒵; ⒵; (z); (z); ) PARENTHESIZED LATIN SMALL LETTER Z +24B6;24B6;24B6;0041;0041; # (Ⓐ; Ⓐ; Ⓐ; A; A; ) CIRCLED LATIN CAPITAL LETTER A +24B7;24B7;24B7;0042;0042; # (Ⓑ; Ⓑ; Ⓑ; B; B; ) CIRCLED LATIN CAPITAL LETTER B +24B8;24B8;24B8;0043;0043; # (Ⓒ; Ⓒ; Ⓒ; C; C; ) CIRCLED LATIN CAPITAL LETTER C +24B9;24B9;24B9;0044;0044; # (Ⓓ; Ⓓ; Ⓓ; D; D; ) CIRCLED LATIN CAPITAL LETTER D +24BA;24BA;24BA;0045;0045; # (Ⓔ; Ⓔ; Ⓔ; E; E; ) CIRCLED LATIN CAPITAL LETTER E +24BB;24BB;24BB;0046;0046; # (Ⓕ; Ⓕ; Ⓕ; F; F; ) CIRCLED LATIN CAPITAL LETTER F +24BC;24BC;24BC;0047;0047; # (Ⓖ; Ⓖ; Ⓖ; G; G; ) CIRCLED LATIN CAPITAL LETTER G +24BD;24BD;24BD;0048;0048; # (Ⓗ; Ⓗ; Ⓗ; H; H; ) CIRCLED LATIN CAPITAL LETTER H +24BE;24BE;24BE;0049;0049; # (Ⓘ; Ⓘ; Ⓘ; I; I; ) CIRCLED LATIN CAPITAL LETTER I +24BF;24BF;24BF;004A;004A; # (Ⓙ; Ⓙ; Ⓙ; J; J; ) CIRCLED LATIN CAPITAL LETTER J +24C0;24C0;24C0;004B;004B; # (Ⓚ; Ⓚ; Ⓚ; K; K; ) CIRCLED LATIN CAPITAL LETTER K +24C1;24C1;24C1;004C;004C; # (Ⓛ; Ⓛ; Ⓛ; L; L; ) CIRCLED LATIN CAPITAL LETTER L +24C2;24C2;24C2;004D;004D; # (Ⓜ; Ⓜ; Ⓜ; M; M; ) CIRCLED LATIN CAPITAL LETTER M +24C3;24C3;24C3;004E;004E; # (Ⓝ; Ⓝ; Ⓝ; N; N; ) CIRCLED LATIN CAPITAL LETTER N +24C4;24C4;24C4;004F;004F; # (Ⓞ; Ⓞ; Ⓞ; O; O; ) CIRCLED LATIN CAPITAL LETTER O +24C5;24C5;24C5;0050;0050; # (Ⓟ; Ⓟ; Ⓟ; P; P; ) CIRCLED LATIN CAPITAL LETTER P +24C6;24C6;24C6;0051;0051; # (Ⓠ; Ⓠ; Ⓠ; Q; Q; ) CIRCLED LATIN CAPITAL LETTER Q +24C7;24C7;24C7;0052;0052; # (Ⓡ; Ⓡ; Ⓡ; R; R; ) CIRCLED LATIN CAPITAL LETTER R +24C8;24C8;24C8;0053;0053; # (Ⓢ; Ⓢ; Ⓢ; S; S; ) CIRCLED LATIN CAPITAL LETTER S +24C9;24C9;24C9;0054;0054; # (Ⓣ; Ⓣ; Ⓣ; T; T; ) CIRCLED LATIN CAPITAL LETTER T +24CA;24CA;24CA;0055;0055; # (Ⓤ; Ⓤ; Ⓤ; U; U; ) CIRCLED LATIN CAPITAL LETTER U +24CB;24CB;24CB;0056;0056; # (Ⓥ; Ⓥ; Ⓥ; V; V; ) CIRCLED LATIN CAPITAL LETTER V +24CC;24CC;24CC;0057;0057; # (Ⓦ; Ⓦ; Ⓦ; W; W; ) CIRCLED LATIN CAPITAL LETTER W +24CD;24CD;24CD;0058;0058; # (Ⓧ; Ⓧ; Ⓧ; X; X; ) CIRCLED LATIN CAPITAL LETTER X +24CE;24CE;24CE;0059;0059; # (Ⓨ; Ⓨ; Ⓨ; Y; Y; ) CIRCLED LATIN CAPITAL LETTER Y +24CF;24CF;24CF;005A;005A; # (Ⓩ; Ⓩ; Ⓩ; Z; Z; ) CIRCLED LATIN CAPITAL LETTER Z +24D0;24D0;24D0;0061;0061; # (ⓐ; ⓐ; ⓐ; a; a; ) CIRCLED LATIN SMALL LETTER A +24D1;24D1;24D1;0062;0062; # (ⓑ; ⓑ; ⓑ; b; b; ) CIRCLED LATIN SMALL LETTER B +24D2;24D2;24D2;0063;0063; # (ⓒ; ⓒ; ⓒ; c; c; ) CIRCLED LATIN SMALL LETTER C +24D3;24D3;24D3;0064;0064; # (ⓓ; ⓓ; ⓓ; d; d; ) CIRCLED LATIN SMALL LETTER D +24D4;24D4;24D4;0065;0065; # (ⓔ; ⓔ; ⓔ; e; e; ) CIRCLED LATIN SMALL LETTER E +24D5;24D5;24D5;0066;0066; # (ⓕ; ⓕ; ⓕ; f; f; ) CIRCLED LATIN SMALL LETTER F +24D6;24D6;24D6;0067;0067; # (ⓖ; ⓖ; ⓖ; g; g; ) CIRCLED LATIN SMALL LETTER G +24D7;24D7;24D7;0068;0068; # (ⓗ; ⓗ; ⓗ; h; h; ) CIRCLED LATIN SMALL LETTER H +24D8;24D8;24D8;0069;0069; # (ⓘ; ⓘ; ⓘ; i; i; ) CIRCLED LATIN SMALL LETTER I +24D9;24D9;24D9;006A;006A; # (ⓙ; ⓙ; ⓙ; j; j; ) CIRCLED LATIN SMALL LETTER J +24DA;24DA;24DA;006B;006B; # (ⓚ; ⓚ; ⓚ; k; k; ) CIRCLED LATIN SMALL LETTER K +24DB;24DB;24DB;006C;006C; # (ⓛ; ⓛ; ⓛ; l; l; ) CIRCLED LATIN SMALL LETTER L +24DC;24DC;24DC;006D;006D; # (ⓜ; ⓜ; ⓜ; m; m; ) CIRCLED LATIN SMALL LETTER M +24DD;24DD;24DD;006E;006E; # (ⓝ; ⓝ; ⓝ; n; n; ) CIRCLED LATIN SMALL LETTER N +24DE;24DE;24DE;006F;006F; # (ⓞ; ⓞ; ⓞ; o; o; ) CIRCLED LATIN SMALL LETTER O +24DF;24DF;24DF;0070;0070; # (ⓟ; ⓟ; ⓟ; p; p; ) CIRCLED LATIN SMALL LETTER P +24E0;24E0;24E0;0071;0071; # (ⓠ; ⓠ; ⓠ; q; q; ) CIRCLED LATIN SMALL LETTER Q +24E1;24E1;24E1;0072;0072; # (ⓡ; ⓡ; ⓡ; r; r; ) CIRCLED LATIN SMALL LETTER R +24E2;24E2;24E2;0073;0073; # (ⓢ; ⓢ; ⓢ; s; s; ) CIRCLED LATIN SMALL LETTER S +24E3;24E3;24E3;0074;0074; # (ⓣ; ⓣ; ⓣ; t; t; ) CIRCLED LATIN SMALL LETTER T +24E4;24E4;24E4;0075;0075; # (ⓤ; ⓤ; ⓤ; u; u; ) CIRCLED LATIN SMALL LETTER U +24E5;24E5;24E5;0076;0076; # (ⓥ; ⓥ; ⓥ; v; v; ) CIRCLED LATIN SMALL LETTER V +24E6;24E6;24E6;0077;0077; # (ⓦ; ⓦ; ⓦ; w; w; ) CIRCLED LATIN SMALL LETTER W +24E7;24E7;24E7;0078;0078; # (ⓧ; ⓧ; ⓧ; x; x; ) CIRCLED LATIN SMALL LETTER X +24E8;24E8;24E8;0079;0079; # (ⓨ; ⓨ; ⓨ; y; y; ) CIRCLED LATIN SMALL LETTER Y +24E9;24E9;24E9;007A;007A; # (ⓩ; ⓩ; ⓩ; z; z; ) CIRCLED LATIN SMALL LETTER Z +24EA;24EA;24EA;0030;0030; # (⓪; ⓪; ⓪; 0; 0; ) CIRCLED DIGIT ZERO +2A0C;2A0C;2A0C;222B 222B 222B 222B;222B 222B 222B 222B; # (⨌; ⨌; ⨌; ∫∫∫∫; ∫∫∫∫; ) QUADRUPLE INTEGRAL OPERATOR +2A74;2A74;2A74;003A 003A 003D;003A 003A 003D; # (⩴; ⩴; ⩴; ::=; ::=; ) DOUBLE COLON EQUAL +2A75;2A75;2A75;003D 003D;003D 003D; # (⩵; ⩵; ⩵; ==; ==; ) TWO CONSECUTIVE EQUALS SIGNS +2A76;2A76;2A76;003D 003D 003D;003D 003D 003D; # (⩶; ⩶; ⩶; ===; ===; ) THREE CONSECUTIVE EQUALS SIGNS +2ADC;2ADD 0338;2ADD 0338;2ADD 0338;2ADD 0338; # (⫝̸; ⫝◌̸; ⫝◌̸; ⫝◌̸; ⫝◌̸; ) FORKING +2E9F;2E9F;2E9F;6BCD;6BCD; # (⺟; ⺟; ⺟; 母; 母; ) CJK RADICAL MOTHER +2EF3;2EF3;2EF3;9F9F;9F9F; # (⻳; ⻳; ⻳; 龟; 龟; ) CJK RADICAL C-SIMPLIFIED TURTLE +2F00;2F00;2F00;4E00;4E00; # (⼀; ⼀; ⼀; 一; 一; ) KANGXI RADICAL ONE +2F01;2F01;2F01;4E28;4E28; # (⼁; ⼁; ⼁; 丨; 丨; ) KANGXI RADICAL LINE +2F02;2F02;2F02;4E36;4E36; # (⼂; ⼂; ⼂; 丶; 丶; ) KANGXI RADICAL DOT +2F03;2F03;2F03;4E3F;4E3F; # (⼃; ⼃; ⼃; 丿; 丿; ) KANGXI RADICAL SLASH +2F04;2F04;2F04;4E59;4E59; # (⼄; ⼄; ⼄; 乙; 乙; ) KANGXI RADICAL SECOND +2F05;2F05;2F05;4E85;4E85; # (⼅; ⼅; ⼅; 亅; 亅; ) KANGXI RADICAL HOOK +2F06;2F06;2F06;4E8C;4E8C; # (⼆; ⼆; ⼆; 二; 二; ) KANGXI RADICAL TWO +2F07;2F07;2F07;4EA0;4EA0; # (⼇; ⼇; ⼇; 亠; 亠; ) KANGXI RADICAL LID +2F08;2F08;2F08;4EBA;4EBA; # (⼈; ⼈; ⼈; 人; 人; ) KANGXI RADICAL MAN +2F09;2F09;2F09;513F;513F; # (⼉; ⼉; ⼉; 儿; 儿; ) KANGXI RADICAL LEGS +2F0A;2F0A;2F0A;5165;5165; # (⼊; ⼊; ⼊; 入; 入; ) KANGXI RADICAL ENTER +2F0B;2F0B;2F0B;516B;516B; # (⼋; ⼋; ⼋; 八; 八; ) KANGXI RADICAL EIGHT +2F0C;2F0C;2F0C;5182;5182; # (⼌; ⼌; ⼌; 冂; 冂; ) KANGXI RADICAL DOWN BOX +2F0D;2F0D;2F0D;5196;5196; # (⼍; ⼍; ⼍; 冖; 冖; ) KANGXI RADICAL COVER +2F0E;2F0E;2F0E;51AB;51AB; # (⼎; ⼎; ⼎; 冫; 冫; ) KANGXI RADICAL ICE +2F0F;2F0F;2F0F;51E0;51E0; # (⼏; ⼏; ⼏; 几; 几; ) KANGXI RADICAL TABLE +2F10;2F10;2F10;51F5;51F5; # (⼐; ⼐; ⼐; 凵; 凵; ) KANGXI RADICAL OPEN BOX +2F11;2F11;2F11;5200;5200; # (⼑; ⼑; ⼑; 刀; 刀; ) KANGXI RADICAL KNIFE +2F12;2F12;2F12;529B;529B; # (⼒; ⼒; ⼒; 力; 力; ) KANGXI RADICAL POWER +2F13;2F13;2F13;52F9;52F9; # (⼓; ⼓; ⼓; 勹; 勹; ) KANGXI RADICAL WRAP +2F14;2F14;2F14;5315;5315; # (⼔; ⼔; ⼔; 匕; 匕; ) KANGXI RADICAL SPOON +2F15;2F15;2F15;531A;531A; # (⼕; ⼕; ⼕; 匚; 匚; ) KANGXI RADICAL RIGHT OPEN BOX +2F16;2F16;2F16;5338;5338; # (⼖; ⼖; ⼖; 匸; 匸; ) KANGXI RADICAL HIDING ENCLOSURE +2F17;2F17;2F17;5341;5341; # (⼗; ⼗; ⼗; 十; 十; ) KANGXI RADICAL TEN +2F18;2F18;2F18;535C;535C; # (⼘; ⼘; ⼘; 卜; 卜; ) KANGXI RADICAL DIVINATION +2F19;2F19;2F19;5369;5369; # (⼙; ⼙; ⼙; 卩; 卩; ) KANGXI RADICAL SEAL +2F1A;2F1A;2F1A;5382;5382; # (⼚; ⼚; ⼚; 厂; 厂; ) KANGXI RADICAL CLIFF +2F1B;2F1B;2F1B;53B6;53B6; # (⼛; ⼛; ⼛; 厶; 厶; ) KANGXI RADICAL PRIVATE +2F1C;2F1C;2F1C;53C8;53C8; # (⼜; ⼜; ⼜; 又; 又; ) KANGXI RADICAL AGAIN +2F1D;2F1D;2F1D;53E3;53E3; # (⼝; ⼝; ⼝; 口; 口; ) KANGXI RADICAL MOUTH +2F1E;2F1E;2F1E;56D7;56D7; # (⼞; ⼞; ⼞; 囗; 囗; ) KANGXI RADICAL ENCLOSURE +2F1F;2F1F;2F1F;571F;571F; # (⼟; ⼟; ⼟; 土; 土; ) KANGXI RADICAL EARTH +2F20;2F20;2F20;58EB;58EB; # (⼠; ⼠; ⼠; 士; 士; ) KANGXI RADICAL SCHOLAR +2F21;2F21;2F21;5902;5902; # (⼡; ⼡; ⼡; 夂; 夂; ) KANGXI RADICAL GO +2F22;2F22;2F22;590A;590A; # (⼢; ⼢; ⼢; 夊; 夊; ) KANGXI RADICAL GO SLOWLY +2F23;2F23;2F23;5915;5915; # (⼣; ⼣; ⼣; 夕; 夕; ) KANGXI RADICAL EVENING +2F24;2F24;2F24;5927;5927; # (⼤; ⼤; ⼤; 大; 大; ) KANGXI RADICAL BIG +2F25;2F25;2F25;5973;5973; # (⼥; ⼥; ⼥; 女; 女; ) KANGXI RADICAL WOMAN +2F26;2F26;2F26;5B50;5B50; # (⼦; ⼦; ⼦; 子; 子; ) KANGXI RADICAL CHILD +2F27;2F27;2F27;5B80;5B80; # (⼧; ⼧; ⼧; 宀; 宀; ) KANGXI RADICAL ROOF +2F28;2F28;2F28;5BF8;5BF8; # (⼨; ⼨; ⼨; 寸; 寸; ) KANGXI RADICAL INCH +2F29;2F29;2F29;5C0F;5C0F; # (⼩; ⼩; ⼩; 小; 小; ) KANGXI RADICAL SMALL +2F2A;2F2A;2F2A;5C22;5C22; # (⼪; ⼪; ⼪; 尢; 尢; ) KANGXI RADICAL LAME +2F2B;2F2B;2F2B;5C38;5C38; # (⼫; ⼫; ⼫; 尸; 尸; ) KANGXI RADICAL CORPSE +2F2C;2F2C;2F2C;5C6E;5C6E; # (⼬; ⼬; ⼬; 屮; 屮; ) KANGXI RADICAL SPROUT +2F2D;2F2D;2F2D;5C71;5C71; # (⼭; ⼭; ⼭; 山; 山; ) KANGXI RADICAL MOUNTAIN +2F2E;2F2E;2F2E;5DDB;5DDB; # (⼮; ⼮; ⼮; 巛; 巛; ) KANGXI RADICAL RIVER +2F2F;2F2F;2F2F;5DE5;5DE5; # (⼯; ⼯; ⼯; 工; 工; ) KANGXI RADICAL WORK +2F30;2F30;2F30;5DF1;5DF1; # (⼰; ⼰; ⼰; 己; 己; ) KANGXI RADICAL ONESELF +2F31;2F31;2F31;5DFE;5DFE; # (⼱; ⼱; ⼱; 巾; 巾; ) KANGXI RADICAL TURBAN +2F32;2F32;2F32;5E72;5E72; # (⼲; ⼲; ⼲; 干; 干; ) KANGXI RADICAL DRY +2F33;2F33;2F33;5E7A;5E7A; # (⼳; ⼳; ⼳; 幺; 幺; ) KANGXI RADICAL SHORT THREAD +2F34;2F34;2F34;5E7F;5E7F; # (⼴; ⼴; ⼴; 广; 广; ) KANGXI RADICAL DOTTED CLIFF +2F35;2F35;2F35;5EF4;5EF4; # (⼵; ⼵; ⼵; 廴; 廴; ) KANGXI RADICAL LONG STRIDE +2F36;2F36;2F36;5EFE;5EFE; # (⼶; ⼶; ⼶; 廾; 廾; ) KANGXI RADICAL TWO HANDS +2F37;2F37;2F37;5F0B;5F0B; # (⼷; ⼷; ⼷; 弋; 弋; ) KANGXI RADICAL SHOOT +2F38;2F38;2F38;5F13;5F13; # (⼸; ⼸; ⼸; 弓; 弓; ) KANGXI RADICAL BOW +2F39;2F39;2F39;5F50;5F50; # (⼹; ⼹; ⼹; 彐; 彐; ) KANGXI RADICAL SNOUT +2F3A;2F3A;2F3A;5F61;5F61; # (⼺; ⼺; ⼺; 彡; 彡; ) KANGXI RADICAL BRISTLE +2F3B;2F3B;2F3B;5F73;5F73; # (⼻; ⼻; ⼻; 彳; 彳; ) KANGXI RADICAL STEP +2F3C;2F3C;2F3C;5FC3;5FC3; # (⼼; ⼼; ⼼; 心; 心; ) KANGXI RADICAL HEART +2F3D;2F3D;2F3D;6208;6208; # (⼽; ⼽; ⼽; 戈; 戈; ) KANGXI RADICAL HALBERD +2F3E;2F3E;2F3E;6236;6236; # (⼾; ⼾; ⼾; 戶; 戶; ) KANGXI RADICAL DOOR +2F3F;2F3F;2F3F;624B;624B; # (⼿; ⼿; ⼿; 手; 手; ) KANGXI RADICAL HAND +2F40;2F40;2F40;652F;652F; # (⽀; ⽀; ⽀; 支; 支; ) KANGXI RADICAL BRANCH +2F41;2F41;2F41;6534;6534; # (⽁; ⽁; ⽁; 攴; 攴; ) KANGXI RADICAL RAP +2F42;2F42;2F42;6587;6587; # (⽂; ⽂; ⽂; 文; 文; ) KANGXI RADICAL SCRIPT +2F43;2F43;2F43;6597;6597; # (⽃; ⽃; ⽃; 斗; 斗; ) KANGXI RADICAL DIPPER +2F44;2F44;2F44;65A4;65A4; # (⽄; ⽄; ⽄; 斤; 斤; ) KANGXI RADICAL AXE +2F45;2F45;2F45;65B9;65B9; # (⽅; ⽅; ⽅; 方; 方; ) KANGXI RADICAL SQUARE +2F46;2F46;2F46;65E0;65E0; # (⽆; ⽆; ⽆; 无; 无; ) KANGXI RADICAL NOT +2F47;2F47;2F47;65E5;65E5; # (⽇; ⽇; ⽇; 日; 日; ) KANGXI RADICAL SUN +2F48;2F48;2F48;66F0;66F0; # (⽈; ⽈; ⽈; 曰; 曰; ) KANGXI RADICAL SAY +2F49;2F49;2F49;6708;6708; # (⽉; ⽉; ⽉; 月; 月; ) KANGXI RADICAL MOON +2F4A;2F4A;2F4A;6728;6728; # (⽊; ⽊; ⽊; 木; 木; ) KANGXI RADICAL TREE +2F4B;2F4B;2F4B;6B20;6B20; # (⽋; ⽋; ⽋; 欠; 欠; ) KANGXI RADICAL LACK +2F4C;2F4C;2F4C;6B62;6B62; # (⽌; ⽌; ⽌; 止; 止; ) KANGXI RADICAL STOP +2F4D;2F4D;2F4D;6B79;6B79; # (⽍; ⽍; ⽍; 歹; 歹; ) KANGXI RADICAL DEATH +2F4E;2F4E;2F4E;6BB3;6BB3; # (⽎; ⽎; ⽎; 殳; 殳; ) KANGXI RADICAL WEAPON +2F4F;2F4F;2F4F;6BCB;6BCB; # (⽏; ⽏; ⽏; 毋; 毋; ) KANGXI RADICAL DO NOT +2F50;2F50;2F50;6BD4;6BD4; # (⽐; ⽐; ⽐; 比; 比; ) KANGXI RADICAL COMPARE +2F51;2F51;2F51;6BDB;6BDB; # (⽑; ⽑; ⽑; 毛; 毛; ) KANGXI RADICAL FUR +2F52;2F52;2F52;6C0F;6C0F; # (⽒; ⽒; ⽒; 氏; 氏; ) KANGXI RADICAL CLAN +2F53;2F53;2F53;6C14;6C14; # (⽓; ⽓; ⽓; 气; 气; ) KANGXI RADICAL STEAM +2F54;2F54;2F54;6C34;6C34; # (⽔; ⽔; ⽔; 水; 水; ) KANGXI RADICAL WATER +2F55;2F55;2F55;706B;706B; # (⽕; ⽕; ⽕; 火; 火; ) KANGXI RADICAL FIRE +2F56;2F56;2F56;722A;722A; # (⽖; ⽖; ⽖; 爪; 爪; ) KANGXI RADICAL CLAW +2F57;2F57;2F57;7236;7236; # (⽗; ⽗; ⽗; 父; 父; ) KANGXI RADICAL FATHER +2F58;2F58;2F58;723B;723B; # (⽘; ⽘; ⽘; 爻; 爻; ) KANGXI RADICAL DOUBLE X +2F59;2F59;2F59;723F;723F; # (⽙; ⽙; ⽙; 爿; 爿; ) KANGXI RADICAL HALF TREE TRUNK +2F5A;2F5A;2F5A;7247;7247; # (⽚; ⽚; ⽚; 片; 片; ) KANGXI RADICAL SLICE +2F5B;2F5B;2F5B;7259;7259; # (⽛; ⽛; ⽛; 牙; 牙; ) KANGXI RADICAL FANG +2F5C;2F5C;2F5C;725B;725B; # (⽜; ⽜; ⽜; 牛; 牛; ) KANGXI RADICAL COW +2F5D;2F5D;2F5D;72AC;72AC; # (⽝; ⽝; ⽝; 犬; 犬; ) KANGXI RADICAL DOG +2F5E;2F5E;2F5E;7384;7384; # (⽞; ⽞; ⽞; 玄; 玄; ) KANGXI RADICAL PROFOUND +2F5F;2F5F;2F5F;7389;7389; # (⽟; ⽟; ⽟; 玉; 玉; ) KANGXI RADICAL JADE +2F60;2F60;2F60;74DC;74DC; # (⽠; ⽠; ⽠; 瓜; 瓜; ) KANGXI RADICAL MELON +2F61;2F61;2F61;74E6;74E6; # (⽡; ⽡; ⽡; 瓦; 瓦; ) KANGXI RADICAL TILE +2F62;2F62;2F62;7518;7518; # (⽢; ⽢; ⽢; 甘; 甘; ) KANGXI RADICAL SWEET +2F63;2F63;2F63;751F;751F; # (⽣; ⽣; ⽣; 生; 生; ) KANGXI RADICAL LIFE +2F64;2F64;2F64;7528;7528; # (⽤; ⽤; ⽤; 用; 用; ) KANGXI RADICAL USE +2F65;2F65;2F65;7530;7530; # (⽥; ⽥; ⽥; 田; 田; ) KANGXI RADICAL FIELD +2F66;2F66;2F66;758B;758B; # (⽦; ⽦; ⽦; 疋; 疋; ) KANGXI RADICAL BOLT OF CLOTH +2F67;2F67;2F67;7592;7592; # (⽧; ⽧; ⽧; 疒; 疒; ) KANGXI RADICAL SICKNESS +2F68;2F68;2F68;7676;7676; # (⽨; ⽨; ⽨; 癶; 癶; ) KANGXI RADICAL DOTTED TENT +2F69;2F69;2F69;767D;767D; # (⽩; ⽩; ⽩; 白; 白; ) KANGXI RADICAL WHITE +2F6A;2F6A;2F6A;76AE;76AE; # (⽪; ⽪; ⽪; 皮; 皮; ) KANGXI RADICAL SKIN +2F6B;2F6B;2F6B;76BF;76BF; # (⽫; ⽫; ⽫; 皿; 皿; ) KANGXI RADICAL DISH +2F6C;2F6C;2F6C;76EE;76EE; # (⽬; ⽬; ⽬; 目; 目; ) KANGXI RADICAL EYE +2F6D;2F6D;2F6D;77DB;77DB; # (⽭; ⽭; ⽭; 矛; 矛; ) KANGXI RADICAL SPEAR +2F6E;2F6E;2F6E;77E2;77E2; # (⽮; ⽮; ⽮; 矢; 矢; ) KANGXI RADICAL ARROW +2F6F;2F6F;2F6F;77F3;77F3; # (⽯; ⽯; ⽯; 石; 石; ) KANGXI RADICAL STONE +2F70;2F70;2F70;793A;793A; # (⽰; ⽰; ⽰; 示; 示; ) KANGXI RADICAL SPIRIT +2F71;2F71;2F71;79B8;79B8; # (⽱; ⽱; ⽱; 禸; 禸; ) KANGXI RADICAL TRACK +2F72;2F72;2F72;79BE;79BE; # (⽲; ⽲; ⽲; 禾; 禾; ) KANGXI RADICAL GRAIN +2F73;2F73;2F73;7A74;7A74; # (⽳; ⽳; ⽳; 穴; 穴; ) KANGXI RADICAL CAVE +2F74;2F74;2F74;7ACB;7ACB; # (⽴; ⽴; ⽴; 立; 立; ) KANGXI RADICAL STAND +2F75;2F75;2F75;7AF9;7AF9; # (⽵; ⽵; ⽵; 竹; 竹; ) KANGXI RADICAL BAMBOO +2F76;2F76;2F76;7C73;7C73; # (⽶; ⽶; ⽶; 米; 米; ) KANGXI RADICAL RICE +2F77;2F77;2F77;7CF8;7CF8; # (⽷; ⽷; ⽷; 糸; 糸; ) KANGXI RADICAL SILK +2F78;2F78;2F78;7F36;7F36; # (⽸; ⽸; ⽸; 缶; 缶; ) KANGXI RADICAL JAR +2F79;2F79;2F79;7F51;7F51; # (⽹; ⽹; ⽹; 网; 网; ) KANGXI RADICAL NET +2F7A;2F7A;2F7A;7F8A;7F8A; # (⽺; ⽺; ⽺; 羊; 羊; ) KANGXI RADICAL SHEEP +2F7B;2F7B;2F7B;7FBD;7FBD; # (⽻; ⽻; ⽻; 羽; 羽; ) KANGXI RADICAL FEATHER +2F7C;2F7C;2F7C;8001;8001; # (⽼; ⽼; ⽼; 老; 老; ) KANGXI RADICAL OLD +2F7D;2F7D;2F7D;800C;800C; # (⽽; ⽽; ⽽; 而; 而; ) KANGXI RADICAL AND +2F7E;2F7E;2F7E;8012;8012; # (⽾; ⽾; ⽾; 耒; 耒; ) KANGXI RADICAL PLOW +2F7F;2F7F;2F7F;8033;8033; # (⽿; ⽿; ⽿; 耳; 耳; ) KANGXI RADICAL EAR +2F80;2F80;2F80;807F;807F; # (⾀; ⾀; ⾀; 聿; 聿; ) KANGXI RADICAL BRUSH +2F81;2F81;2F81;8089;8089; # (⾁; ⾁; ⾁; 肉; 肉; ) KANGXI RADICAL MEAT +2F82;2F82;2F82;81E3;81E3; # (⾂; ⾂; ⾂; 臣; 臣; ) KANGXI RADICAL MINISTER +2F83;2F83;2F83;81EA;81EA; # (⾃; ⾃; ⾃; 自; 自; ) KANGXI RADICAL SELF +2F84;2F84;2F84;81F3;81F3; # (⾄; ⾄; ⾄; 至; 至; ) KANGXI RADICAL ARRIVE +2F85;2F85;2F85;81FC;81FC; # (⾅; ⾅; ⾅; 臼; 臼; ) KANGXI RADICAL MORTAR +2F86;2F86;2F86;820C;820C; # (⾆; ⾆; ⾆; 舌; 舌; ) KANGXI RADICAL TONGUE +2F87;2F87;2F87;821B;821B; # (⾇; ⾇; ⾇; 舛; 舛; ) KANGXI RADICAL OPPOSE +2F88;2F88;2F88;821F;821F; # (⾈; ⾈; ⾈; 舟; 舟; ) KANGXI RADICAL BOAT +2F89;2F89;2F89;826E;826E; # (⾉; ⾉; ⾉; 艮; 艮; ) KANGXI RADICAL STOPPING +2F8A;2F8A;2F8A;8272;8272; # (⾊; ⾊; ⾊; 色; 色; ) KANGXI RADICAL COLOR +2F8B;2F8B;2F8B;8278;8278; # (⾋; ⾋; ⾋; 艸; 艸; ) KANGXI RADICAL GRASS +2F8C;2F8C;2F8C;864D;864D; # (⾌; ⾌; ⾌; 虍; 虍; ) KANGXI RADICAL TIGER +2F8D;2F8D;2F8D;866B;866B; # (⾍; ⾍; ⾍; 虫; 虫; ) KANGXI RADICAL INSECT +2F8E;2F8E;2F8E;8840;8840; # (⾎; ⾎; ⾎; 血; 血; ) KANGXI RADICAL BLOOD +2F8F;2F8F;2F8F;884C;884C; # (⾏; ⾏; ⾏; 行; 行; ) KANGXI RADICAL WALK ENCLOSURE +2F90;2F90;2F90;8863;8863; # (⾐; ⾐; ⾐; 衣; 衣; ) KANGXI RADICAL CLOTHES +2F91;2F91;2F91;897E;897E; # (⾑; ⾑; ⾑; 襾; 襾; ) KANGXI RADICAL WEST +2F92;2F92;2F92;898B;898B; # (⾒; ⾒; ⾒; 見; 見; ) KANGXI RADICAL SEE +2F93;2F93;2F93;89D2;89D2; # (⾓; ⾓; ⾓; 角; 角; ) KANGXI RADICAL HORN +2F94;2F94;2F94;8A00;8A00; # (⾔; ⾔; ⾔; 言; 言; ) KANGXI RADICAL SPEECH +2F95;2F95;2F95;8C37;8C37; # (⾕; ⾕; ⾕; 谷; 谷; ) KANGXI RADICAL VALLEY +2F96;2F96;2F96;8C46;8C46; # (⾖; ⾖; ⾖; 豆; 豆; ) KANGXI RADICAL BEAN +2F97;2F97;2F97;8C55;8C55; # (⾗; ⾗; ⾗; 豕; 豕; ) KANGXI RADICAL PIG +2F98;2F98;2F98;8C78;8C78; # (⾘; ⾘; ⾘; 豸; 豸; ) KANGXI RADICAL BADGER +2F99;2F99;2F99;8C9D;8C9D; # (⾙; ⾙; ⾙; 貝; 貝; ) KANGXI RADICAL SHELL +2F9A;2F9A;2F9A;8D64;8D64; # (⾚; ⾚; ⾚; 赤; 赤; ) KANGXI RADICAL RED +2F9B;2F9B;2F9B;8D70;8D70; # (⾛; ⾛; ⾛; 走; 走; ) KANGXI RADICAL RUN +2F9C;2F9C;2F9C;8DB3;8DB3; # (⾜; ⾜; ⾜; 足; 足; ) KANGXI RADICAL FOOT +2F9D;2F9D;2F9D;8EAB;8EAB; # (⾝; ⾝; ⾝; 身; 身; ) KANGXI RADICAL BODY +2F9E;2F9E;2F9E;8ECA;8ECA; # (⾞; ⾞; ⾞; 車; 車; ) KANGXI RADICAL CART +2F9F;2F9F;2F9F;8F9B;8F9B; # (⾟; ⾟; ⾟; 辛; 辛; ) KANGXI RADICAL BITTER +2FA0;2FA0;2FA0;8FB0;8FB0; # (⾠; ⾠; ⾠; 辰; 辰; ) KANGXI RADICAL MORNING +2FA1;2FA1;2FA1;8FB5;8FB5; # (⾡; ⾡; ⾡; 辵; 辵; ) KANGXI RADICAL WALK +2FA2;2FA2;2FA2;9091;9091; # (⾢; ⾢; ⾢; 邑; 邑; ) KANGXI RADICAL CITY +2FA3;2FA3;2FA3;9149;9149; # (⾣; ⾣; ⾣; 酉; 酉; ) KANGXI RADICAL WINE +2FA4;2FA4;2FA4;91C6;91C6; # (⾤; ⾤; ⾤; 釆; 釆; ) KANGXI RADICAL DISTINGUISH +2FA5;2FA5;2FA5;91CC;91CC; # (⾥; ⾥; ⾥; 里; 里; ) KANGXI RADICAL VILLAGE +2FA6;2FA6;2FA6;91D1;91D1; # (⾦; ⾦; ⾦; 金; 金; ) KANGXI RADICAL GOLD +2FA7;2FA7;2FA7;9577;9577; # (⾧; ⾧; ⾧; 長; 長; ) KANGXI RADICAL LONG +2FA8;2FA8;2FA8;9580;9580; # (⾨; ⾨; ⾨; 門; 門; ) KANGXI RADICAL GATE +2FA9;2FA9;2FA9;961C;961C; # (⾩; ⾩; ⾩; 阜; 阜; ) KANGXI RADICAL MOUND +2FAA;2FAA;2FAA;96B6;96B6; # (⾪; ⾪; ⾪; 隶; 隶; ) KANGXI RADICAL SLAVE +2FAB;2FAB;2FAB;96B9;96B9; # (⾫; ⾫; ⾫; 隹; 隹; ) KANGXI RADICAL SHORT TAILED BIRD +2FAC;2FAC;2FAC;96E8;96E8; # (⾬; ⾬; ⾬; 雨; 雨; ) KANGXI RADICAL RAIN +2FAD;2FAD;2FAD;9751;9751; # (⾭; ⾭; ⾭; 靑; 靑; ) KANGXI RADICAL BLUE +2FAE;2FAE;2FAE;975E;975E; # (⾮; ⾮; ⾮; 非; 非; ) KANGXI RADICAL WRONG +2FAF;2FAF;2FAF;9762;9762; # (⾯; ⾯; ⾯; 面; 面; ) KANGXI RADICAL FACE +2FB0;2FB0;2FB0;9769;9769; # (⾰; ⾰; ⾰; 革; 革; ) KANGXI RADICAL LEATHER +2FB1;2FB1;2FB1;97CB;97CB; # (⾱; ⾱; ⾱; 韋; 韋; ) KANGXI RADICAL TANNED LEATHER +2FB2;2FB2;2FB2;97ED;97ED; # (⾲; ⾲; ⾲; 韭; 韭; ) KANGXI RADICAL LEEK +2FB3;2FB3;2FB3;97F3;97F3; # (⾳; ⾳; ⾳; 音; 音; ) KANGXI RADICAL SOUND +2FB4;2FB4;2FB4;9801;9801; # (⾴; ⾴; ⾴; 頁; 頁; ) KANGXI RADICAL LEAF +2FB5;2FB5;2FB5;98A8;98A8; # (⾵; ⾵; ⾵; 風; 風; ) KANGXI RADICAL WIND +2FB6;2FB6;2FB6;98DB;98DB; # (⾶; ⾶; ⾶; 飛; 飛; ) KANGXI RADICAL FLY +2FB7;2FB7;2FB7;98DF;98DF; # (⾷; ⾷; ⾷; 食; 食; ) KANGXI RADICAL EAT +2FB8;2FB8;2FB8;9996;9996; # (⾸; ⾸; ⾸; 首; 首; ) KANGXI RADICAL HEAD +2FB9;2FB9;2FB9;9999;9999; # (⾹; ⾹; ⾹; 香; 香; ) KANGXI RADICAL FRAGRANT +2FBA;2FBA;2FBA;99AC;99AC; # (⾺; ⾺; ⾺; 馬; 馬; ) KANGXI RADICAL HORSE +2FBB;2FBB;2FBB;9AA8;9AA8; # (⾻; ⾻; ⾻; 骨; 骨; ) KANGXI RADICAL BONE +2FBC;2FBC;2FBC;9AD8;9AD8; # (⾼; ⾼; ⾼; 高; 高; ) KANGXI RADICAL TALL +2FBD;2FBD;2FBD;9ADF;9ADF; # (⾽; ⾽; ⾽; 髟; 髟; ) KANGXI RADICAL HAIR +2FBE;2FBE;2FBE;9B25;9B25; # (⾾; ⾾; ⾾; 鬥; 鬥; ) KANGXI RADICAL FIGHT +2FBF;2FBF;2FBF;9B2F;9B2F; # (⾿; ⾿; ⾿; 鬯; 鬯; ) KANGXI RADICAL SACRIFICIAL WINE +2FC0;2FC0;2FC0;9B32;9B32; # (⿀; ⿀; ⿀; 鬲; 鬲; ) KANGXI RADICAL CAULDRON +2FC1;2FC1;2FC1;9B3C;9B3C; # (⿁; ⿁; ⿁; 鬼; 鬼; ) KANGXI RADICAL GHOST +2FC2;2FC2;2FC2;9B5A;9B5A; # (⿂; ⿂; ⿂; 魚; 魚; ) KANGXI RADICAL FISH +2FC3;2FC3;2FC3;9CE5;9CE5; # (⿃; ⿃; ⿃; 鳥; 鳥; ) KANGXI RADICAL BIRD +2FC4;2FC4;2FC4;9E75;9E75; # (⿄; ⿄; ⿄; 鹵; 鹵; ) KANGXI RADICAL SALT +2FC5;2FC5;2FC5;9E7F;9E7F; # (⿅; ⿅; ⿅; 鹿; 鹿; ) KANGXI RADICAL DEER +2FC6;2FC6;2FC6;9EA5;9EA5; # (⿆; ⿆; ⿆; 麥; 麥; ) KANGXI RADICAL WHEAT +2FC7;2FC7;2FC7;9EBB;9EBB; # (⿇; ⿇; ⿇; 麻; 麻; ) KANGXI RADICAL HEMP +2FC8;2FC8;2FC8;9EC3;9EC3; # (⿈; ⿈; ⿈; 黃; 黃; ) KANGXI RADICAL YELLOW +2FC9;2FC9;2FC9;9ECD;9ECD; # (⿉; ⿉; ⿉; 黍; 黍; ) KANGXI RADICAL MILLET +2FCA;2FCA;2FCA;9ED1;9ED1; # (⿊; ⿊; ⿊; 黑; 黑; ) KANGXI RADICAL BLACK +2FCB;2FCB;2FCB;9EF9;9EF9; # (⿋; ⿋; ⿋; 黹; 黹; ) KANGXI RADICAL EMBROIDERY +2FCC;2FCC;2FCC;9EFD;9EFD; # (⿌; ⿌; ⿌; 黽; 黽; ) KANGXI RADICAL FROG +2FCD;2FCD;2FCD;9F0E;9F0E; # (⿍; ⿍; ⿍; 鼎; 鼎; ) KANGXI RADICAL TRIPOD +2FCE;2FCE;2FCE;9F13;9F13; # (⿎; ⿎; ⿎; 鼓; 鼓; ) KANGXI RADICAL DRUM +2FCF;2FCF;2FCF;9F20;9F20; # (⿏; ⿏; ⿏; 鼠; 鼠; ) KANGXI RADICAL RAT +2FD0;2FD0;2FD0;9F3B;9F3B; # (⿐; ⿐; ⿐; 鼻; 鼻; ) KANGXI RADICAL NOSE +2FD1;2FD1;2FD1;9F4A;9F4A; # (⿑; ⿑; ⿑; 齊; 齊; ) KANGXI RADICAL EVEN +2FD2;2FD2;2FD2;9F52;9F52; # (⿒; ⿒; ⿒; 齒; 齒; ) KANGXI RADICAL TOOTH +2FD3;2FD3;2FD3;9F8D;9F8D; # (⿓; ⿓; ⿓; 龍; 龍; ) KANGXI RADICAL DRAGON +2FD4;2FD4;2FD4;9F9C;9F9C; # (⿔; ⿔; ⿔; 龜; 龜; ) KANGXI RADICAL TURTLE +2FD5;2FD5;2FD5;9FA0;9FA0; # (⿕; ⿕; ⿕; 龠; 龠; ) KANGXI RADICAL FLUTE +3000;3000;3000;0020;0020; # ( ;  ;  ; ; ; ) IDEOGRAPHIC SPACE +3036;3036;3036;3012;3012; # (〶; 〶; 〶; 〒; 〒; ) CIRCLED POSTAL MARK +3038;3038;3038;5341;5341; # (〸; 〸; 〸; 十; 十; ) HANGZHOU NUMERAL TEN +3039;3039;3039;5344;5344; # (〹; 〹; 〹; 卄; 卄; ) HANGZHOU NUMERAL TWENTY +303A;303A;303A;5345;5345; # (〺; 〺; 〺; 卅; 卅; ) HANGZHOU NUMERAL THIRTY +304C;304C;304B 3099;304C;304B 3099; # (が; が; か◌゙; が; か◌゙; ) HIRAGANA LETTER GA +304E;304E;304D 3099;304E;304D 3099; # (ぎ; ぎ; き◌゙; ぎ; き◌゙; ) HIRAGANA LETTER GI +3050;3050;304F 3099;3050;304F 3099; # (ぐ; ぐ; く◌゙; ぐ; く◌゙; ) HIRAGANA LETTER GU +3052;3052;3051 3099;3052;3051 3099; # (げ; げ; け◌゙; げ; け◌゙; ) HIRAGANA LETTER GE +3054;3054;3053 3099;3054;3053 3099; # (ご; ご; こ◌゙; ご; こ◌゙; ) HIRAGANA LETTER GO +3056;3056;3055 3099;3056;3055 3099; # (ざ; ざ; さ◌゙; ざ; さ◌゙; ) HIRAGANA LETTER ZA +3058;3058;3057 3099;3058;3057 3099; # (じ; じ; し◌゙; じ; し◌゙; ) HIRAGANA LETTER ZI +305A;305A;3059 3099;305A;3059 3099; # (ず; ず; す◌゙; ず; す◌゙; ) HIRAGANA LETTER ZU +305C;305C;305B 3099;305C;305B 3099; # (ぜ; ぜ; せ◌゙; ぜ; せ◌゙; ) HIRAGANA LETTER ZE +305E;305E;305D 3099;305E;305D 3099; # (ぞ; ぞ; そ◌゙; ぞ; そ◌゙; ) HIRAGANA LETTER ZO +3060;3060;305F 3099;3060;305F 3099; # (だ; だ; た◌゙; だ; た◌゙; ) HIRAGANA LETTER DA +3062;3062;3061 3099;3062;3061 3099; # (ぢ; ぢ; ち◌゙; ぢ; ち◌゙; ) HIRAGANA LETTER DI +3065;3065;3064 3099;3065;3064 3099; # (づ; づ; つ◌゙; づ; つ◌゙; ) HIRAGANA LETTER DU +3067;3067;3066 3099;3067;3066 3099; # (で; で; て◌゙; で; て◌゙; ) HIRAGANA LETTER DE +3069;3069;3068 3099;3069;3068 3099; # (ど; ど; と◌゙; ど; と◌゙; ) HIRAGANA LETTER DO +3070;3070;306F 3099;3070;306F 3099; # (ば; ば; は◌゙; ば; は◌゙; ) HIRAGANA LETTER BA +3071;3071;306F 309A;3071;306F 309A; # (ぱ; ぱ; は◌゚; ぱ; は◌゚; ) HIRAGANA LETTER PA +3073;3073;3072 3099;3073;3072 3099; # (び; び; ひ◌゙; び; ひ◌゙; ) HIRAGANA LETTER BI +3074;3074;3072 309A;3074;3072 309A; # (ぴ; ぴ; ひ◌゚; ぴ; ひ◌゚; ) HIRAGANA LETTER PI +3076;3076;3075 3099;3076;3075 3099; # (ぶ; ぶ; ふ◌゙; ぶ; ふ◌゙; ) HIRAGANA LETTER BU +3077;3077;3075 309A;3077;3075 309A; # (ぷ; ぷ; ふ◌゚; ぷ; ふ◌゚; ) HIRAGANA LETTER PU +3079;3079;3078 3099;3079;3078 3099; # (べ; べ; へ◌゙; べ; へ◌゙; ) HIRAGANA LETTER BE +307A;307A;3078 309A;307A;3078 309A; # (ぺ; ぺ; へ◌゚; ぺ; へ◌゚; ) HIRAGANA LETTER PE +307C;307C;307B 3099;307C;307B 3099; # (ぼ; ぼ; ほ◌゙; ぼ; ほ◌゙; ) HIRAGANA LETTER BO +307D;307D;307B 309A;307D;307B 309A; # (ぽ; ぽ; ほ◌゚; ぽ; ほ◌゚; ) HIRAGANA LETTER PO +3094;3094;3046 3099;3094;3046 3099; # (ゔ; ゔ; う◌゙; ゔ; う◌゙; ) HIRAGANA LETTER VU +309B;309B;309B;0020 3099;0020 3099; # (゛; ゛; ゛; ◌゙; ◌゙; ) KATAKANA-HIRAGANA VOICED SOUND MARK +309C;309C;309C;0020 309A;0020 309A; # (゜; ゜; ゜; ◌゚; ◌゚; ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309E;309E;309D 3099;309E;309D 3099; # (ゞ; ゞ; ゝ◌゙; ゞ; ゝ◌゙; ) HIRAGANA VOICED ITERATION MARK +309F;309F;309F;3088 308A;3088 308A; # (ゟ; ゟ; ゟ; より; より; ) HIRAGANA DIGRAPH YORI +30AC;30AC;30AB 3099;30AC;30AB 3099; # (ガ; ガ; カ◌゙; ガ; カ◌゙; ) KATAKANA LETTER GA +30AE;30AE;30AD 3099;30AE;30AD 3099; # (ギ; ギ; キ◌゙; ギ; キ◌゙; ) KATAKANA LETTER GI +30B0;30B0;30AF 3099;30B0;30AF 3099; # (グ; グ; ク◌゙; グ; ク◌゙; ) KATAKANA LETTER GU +30B2;30B2;30B1 3099;30B2;30B1 3099; # (ゲ; ゲ; ケ◌゙; ゲ; ケ◌゙; ) KATAKANA LETTER GE +30B4;30B4;30B3 3099;30B4;30B3 3099; # (ゴ; ゴ; コ◌゙; ゴ; コ◌゙; ) KATAKANA LETTER GO +30B6;30B6;30B5 3099;30B6;30B5 3099; # (ザ; ザ; サ◌゙; ザ; サ◌゙; ) KATAKANA LETTER ZA +30B8;30B8;30B7 3099;30B8;30B7 3099; # (ジ; ジ; シ◌゙; ジ; シ◌゙; ) KATAKANA LETTER ZI +30BA;30BA;30B9 3099;30BA;30B9 3099; # (ズ; ズ; ス◌゙; ズ; ス◌゙; ) KATAKANA LETTER ZU +30BC;30BC;30BB 3099;30BC;30BB 3099; # (ゼ; ゼ; セ◌゙; ゼ; セ◌゙; ) KATAKANA LETTER ZE +30BE;30BE;30BD 3099;30BE;30BD 3099; # (ゾ; ゾ; ソ◌゙; ゾ; ソ◌゙; ) KATAKANA LETTER ZO +30C0;30C0;30BF 3099;30C0;30BF 3099; # (ダ; ダ; タ◌゙; ダ; タ◌゙; ) KATAKANA LETTER DA +30C2;30C2;30C1 3099;30C2;30C1 3099; # (ヂ; ヂ; チ◌゙; ヂ; チ◌゙; ) KATAKANA LETTER DI +30C5;30C5;30C4 3099;30C5;30C4 3099; # (ヅ; ヅ; ツ◌゙; ヅ; ツ◌゙; ) KATAKANA LETTER DU +30C7;30C7;30C6 3099;30C7;30C6 3099; # (デ; デ; テ◌゙; デ; テ◌゙; ) KATAKANA LETTER DE +30C9;30C9;30C8 3099;30C9;30C8 3099; # (ド; ド; ト◌゙; ド; ト◌゙; ) KATAKANA LETTER DO +30D0;30D0;30CF 3099;30D0;30CF 3099; # (バ; バ; ハ◌゙; バ; ハ◌゙; ) KATAKANA LETTER BA +30D1;30D1;30CF 309A;30D1;30CF 309A; # (パ; パ; ハ◌゚; パ; ハ◌゚; ) KATAKANA LETTER PA +30D3;30D3;30D2 3099;30D3;30D2 3099; # (ビ; ビ; ヒ◌゙; ビ; ヒ◌゙; ) KATAKANA LETTER BI +30D4;30D4;30D2 309A;30D4;30D2 309A; # (ピ; ピ; ヒ◌゚; ピ; ヒ◌゚; ) KATAKANA LETTER PI +30D6;30D6;30D5 3099;30D6;30D5 3099; # (ブ; ブ; フ◌゙; ブ; フ◌゙; ) KATAKANA LETTER BU +30D7;30D7;30D5 309A;30D7;30D5 309A; # (プ; プ; フ◌゚; プ; フ◌゚; ) KATAKANA LETTER PU +30D9;30D9;30D8 3099;30D9;30D8 3099; # (ベ; ベ; ヘ◌゙; ベ; ヘ◌゙; ) KATAKANA LETTER BE +30DA;30DA;30D8 309A;30DA;30D8 309A; # (ペ; ペ; ヘ◌゚; ペ; ヘ◌゚; ) KATAKANA LETTER PE +30DC;30DC;30DB 3099;30DC;30DB 3099; # (ボ; ボ; ホ◌゙; ボ; ホ◌゙; ) KATAKANA LETTER BO +30DD;30DD;30DB 309A;30DD;30DB 309A; # (ポ; ポ; ホ◌゚; ポ; ホ◌゚; ) KATAKANA LETTER PO +30F4;30F4;30A6 3099;30F4;30A6 3099; # (ヴ; ヴ; ウ◌゙; ヴ; ウ◌゙; ) KATAKANA LETTER VU +30F7;30F7;30EF 3099;30F7;30EF 3099; # (ヷ; ヷ; ワ◌゙; ヷ; ワ◌゙; ) KATAKANA LETTER VA +30F8;30F8;30F0 3099;30F8;30F0 3099; # (ヸ; ヸ; ヰ◌゙; ヸ; ヰ◌゙; ) KATAKANA LETTER VI +30F9;30F9;30F1 3099;30F9;30F1 3099; # (ヹ; ヹ; ヱ◌゙; ヹ; ヱ◌゙; ) KATAKANA LETTER VE +30FA;30FA;30F2 3099;30FA;30F2 3099; # (ヺ; ヺ; ヲ◌゙; ヺ; ヲ◌゙; ) KATAKANA LETTER VO +30FE;30FE;30FD 3099;30FE;30FD 3099; # (ヾ; ヾ; ヽ◌゙; ヾ; ヽ◌゙; ) KATAKANA VOICED ITERATION MARK +30FF;30FF;30FF;30B3 30C8;30B3 30C8; # (ヿ; ヿ; ヿ; コト; コト; ) KATAKANA DIGRAPH KOTO +3131;3131;3131;1100;1100; # (ㄱ; ㄱ; ㄱ; ᄀ; ᄀ; ) HANGUL LETTER KIYEOK +3132;3132;3132;1101;1101; # (ㄲ; ㄲ; ㄲ; ᄁ; ᄁ; ) HANGUL LETTER SSANGKIYEOK +3133;3133;3133;11AA;11AA; # (ㄳ; ㄳ; ㄳ; ᆪ; ᆪ; ) HANGUL LETTER KIYEOK-SIOS +3134;3134;3134;1102;1102; # (ㄴ; ㄴ; ㄴ; ᄂ; ᄂ; ) HANGUL LETTER NIEUN +3135;3135;3135;11AC;11AC; # (ㄵ; ㄵ; ㄵ; ᆬ; ᆬ; ) HANGUL LETTER NIEUN-CIEUC +3136;3136;3136;11AD;11AD; # (ㄶ; ㄶ; ㄶ; ᆭ; ᆭ; ) HANGUL LETTER NIEUN-HIEUH +3137;3137;3137;1103;1103; # (ㄷ; ㄷ; ㄷ; ᄃ; ᄃ; ) HANGUL LETTER TIKEUT +3138;3138;3138;1104;1104; # (ㄸ; ㄸ; ㄸ; ᄄ; ᄄ; ) HANGUL LETTER SSANGTIKEUT +3139;3139;3139;1105;1105; # (ㄹ; ㄹ; ㄹ; ᄅ; ᄅ; ) HANGUL LETTER RIEUL +313A;313A;313A;11B0;11B0; # (ㄺ; ㄺ; ㄺ; ᆰ; ᆰ; ) HANGUL LETTER RIEUL-KIYEOK +313B;313B;313B;11B1;11B1; # (ㄻ; ㄻ; ㄻ; ᆱ; ᆱ; ) HANGUL LETTER RIEUL-MIEUM +313C;313C;313C;11B2;11B2; # (ㄼ; ㄼ; ㄼ; ᆲ; ᆲ; ) HANGUL LETTER RIEUL-PIEUP +313D;313D;313D;11B3;11B3; # (ㄽ; ㄽ; ㄽ; ᆳ; ᆳ; ) HANGUL LETTER RIEUL-SIOS +313E;313E;313E;11B4;11B4; # (ㄾ; ㄾ; ㄾ; ᆴ; ᆴ; ) HANGUL LETTER RIEUL-THIEUTH +313F;313F;313F;11B5;11B5; # (ㄿ; ㄿ; ㄿ; ᆵ; ᆵ; ) HANGUL LETTER RIEUL-PHIEUPH +3140;3140;3140;111A;111A; # (ㅀ; ㅀ; ㅀ; ᄚ; ᄚ; ) HANGUL LETTER RIEUL-HIEUH +3141;3141;3141;1106;1106; # (ㅁ; ㅁ; ㅁ; ᄆ; ᄆ; ) HANGUL LETTER MIEUM +3142;3142;3142;1107;1107; # (ㅂ; ㅂ; ㅂ; ᄇ; ᄇ; ) HANGUL LETTER PIEUP +3143;3143;3143;1108;1108; # (ㅃ; ㅃ; ㅃ; ᄈ; ᄈ; ) HANGUL LETTER SSANGPIEUP +3144;3144;3144;1121;1121; # (ㅄ; ㅄ; ㅄ; ᄡ; ᄡ; ) HANGUL LETTER PIEUP-SIOS +3145;3145;3145;1109;1109; # (ㅅ; ㅅ; ㅅ; ᄉ; ᄉ; ) HANGUL LETTER SIOS +3146;3146;3146;110A;110A; # (ㅆ; ㅆ; ㅆ; ᄊ; ᄊ; ) HANGUL LETTER SSANGSIOS +3147;3147;3147;110B;110B; # (ㅇ; ㅇ; ㅇ; ᄋ; ᄋ; ) HANGUL LETTER IEUNG +3148;3148;3148;110C;110C; # (ㅈ; ㅈ; ㅈ; ᄌ; ᄌ; ) HANGUL LETTER CIEUC +3149;3149;3149;110D;110D; # (ㅉ; ㅉ; ㅉ; ᄍ; ᄍ; ) HANGUL LETTER SSANGCIEUC +314A;314A;314A;110E;110E; # (ㅊ; ㅊ; ㅊ; ᄎ; ᄎ; ) HANGUL LETTER CHIEUCH +314B;314B;314B;110F;110F; # (ㅋ; ㅋ; ㅋ; ᄏ; ᄏ; ) HANGUL LETTER KHIEUKH +314C;314C;314C;1110;1110; # (ㅌ; ㅌ; ㅌ; ᄐ; ᄐ; ) HANGUL LETTER THIEUTH +314D;314D;314D;1111;1111; # (ㅍ; ㅍ; ㅍ; ᄑ; ᄑ; ) HANGUL LETTER PHIEUPH +314E;314E;314E;1112;1112; # (ㅎ; ㅎ; ㅎ; ᄒ; ᄒ; ) HANGUL LETTER HIEUH +314F;314F;314F;1161;1161; # (ㅏ; ㅏ; ㅏ; ᅡ; ᅡ; ) HANGUL LETTER A +3150;3150;3150;1162;1162; # (ㅐ; ㅐ; ㅐ; ᅢ; ᅢ; ) HANGUL LETTER AE +3151;3151;3151;1163;1163; # (ㅑ; ㅑ; ㅑ; ᅣ; ᅣ; ) HANGUL LETTER YA +3152;3152;3152;1164;1164; # (ㅒ; ㅒ; ㅒ; ᅤ; ᅤ; ) HANGUL LETTER YAE +3153;3153;3153;1165;1165; # (ㅓ; ㅓ; ㅓ; ᅥ; ᅥ; ) HANGUL LETTER EO +3154;3154;3154;1166;1166; # (ㅔ; ㅔ; ㅔ; ᅦ; ᅦ; ) HANGUL LETTER E +3155;3155;3155;1167;1167; # (ㅕ; ㅕ; ㅕ; ᅧ; ᅧ; ) HANGUL LETTER YEO +3156;3156;3156;1168;1168; # (ㅖ; ㅖ; ㅖ; ᅨ; ᅨ; ) HANGUL LETTER YE +3157;3157;3157;1169;1169; # (ㅗ; ㅗ; ㅗ; ᅩ; ᅩ; ) HANGUL LETTER O +3158;3158;3158;116A;116A; # (ㅘ; ㅘ; ㅘ; ᅪ; ᅪ; ) HANGUL LETTER WA +3159;3159;3159;116B;116B; # (ㅙ; ㅙ; ㅙ; ᅫ; ᅫ; ) HANGUL LETTER WAE +315A;315A;315A;116C;116C; # (ㅚ; ㅚ; ㅚ; ᅬ; ᅬ; ) HANGUL LETTER OE +315B;315B;315B;116D;116D; # (ㅛ; ㅛ; ㅛ; ᅭ; ᅭ; ) HANGUL LETTER YO +315C;315C;315C;116E;116E; # (ㅜ; ㅜ; ㅜ; ᅮ; ᅮ; ) HANGUL LETTER U +315D;315D;315D;116F;116F; # (ㅝ; ㅝ; ㅝ; ᅯ; ᅯ; ) HANGUL LETTER WEO +315E;315E;315E;1170;1170; # (ㅞ; ㅞ; ㅞ; ᅰ; ᅰ; ) HANGUL LETTER WE +315F;315F;315F;1171;1171; # (ㅟ; ㅟ; ㅟ; ᅱ; ᅱ; ) HANGUL LETTER WI +3160;3160;3160;1172;1172; # (ㅠ; ㅠ; ㅠ; ᅲ; ᅲ; ) HANGUL LETTER YU +3161;3161;3161;1173;1173; # (ㅡ; ㅡ; ㅡ; ᅳ; ᅳ; ) HANGUL LETTER EU +3162;3162;3162;1174;1174; # (ㅢ; ㅢ; ㅢ; ᅴ; ᅴ; ) HANGUL LETTER YI +3163;3163;3163;1175;1175; # (ㅣ; ㅣ; ㅣ; ᅵ; ᅵ; ) HANGUL LETTER I +3164;3164;3164;1160;1160; # (ㅤ; ㅤ; ㅤ; ᅠ; ᅠ; ) HANGUL FILLER +3165;3165;3165;1114;1114; # (ㅥ; ㅥ; ㅥ; ᄔ; ᄔ; ) HANGUL LETTER SSANGNIEUN +3166;3166;3166;1115;1115; # (ㅦ; ㅦ; ㅦ; ᄕ; ᄕ; ) HANGUL LETTER NIEUN-TIKEUT +3167;3167;3167;11C7;11C7; # (ㅧ; ㅧ; ㅧ; ᇇ; ᇇ; ) HANGUL LETTER NIEUN-SIOS +3168;3168;3168;11C8;11C8; # (ㅨ; ㅨ; ㅨ; ᇈ; ᇈ; ) HANGUL LETTER NIEUN-PANSIOS +3169;3169;3169;11CC;11CC; # (ㅩ; ㅩ; ㅩ; ᇌ; ᇌ; ) HANGUL LETTER RIEUL-KIYEOK-SIOS +316A;316A;316A;11CE;11CE; # (ㅪ; ㅪ; ㅪ; ᇎ; ᇎ; ) HANGUL LETTER RIEUL-TIKEUT +316B;316B;316B;11D3;11D3; # (ㅫ; ㅫ; ㅫ; ᇓ; ᇓ; ) HANGUL LETTER RIEUL-PIEUP-SIOS +316C;316C;316C;11D7;11D7; # (ㅬ; ㅬ; ㅬ; ᇗ; ᇗ; ) HANGUL LETTER RIEUL-PANSIOS +316D;316D;316D;11D9;11D9; # (ㅭ; ㅭ; ㅭ; ᇙ; ᇙ; ) HANGUL LETTER RIEUL-YEORINHIEUH +316E;316E;316E;111C;111C; # (ㅮ; ㅮ; ㅮ; ᄜ; ᄜ; ) HANGUL LETTER MIEUM-PIEUP +316F;316F;316F;11DD;11DD; # (ㅯ; ㅯ; ㅯ; ᇝ; ᇝ; ) HANGUL LETTER MIEUM-SIOS +3170;3170;3170;11DF;11DF; # (ㅰ; ㅰ; ㅰ; ᇟ; ᇟ; ) HANGUL LETTER MIEUM-PANSIOS +3171;3171;3171;111D;111D; # (ㅱ; ㅱ; ㅱ; ᄝ; ᄝ; ) HANGUL LETTER KAPYEOUNMIEUM +3172;3172;3172;111E;111E; # (ㅲ; ㅲ; ㅲ; ᄞ; ᄞ; ) HANGUL LETTER PIEUP-KIYEOK +3173;3173;3173;1120;1120; # (ㅳ; ㅳ; ㅳ; ᄠ; ᄠ; ) HANGUL LETTER PIEUP-TIKEUT +3174;3174;3174;1122;1122; # (ㅴ; ㅴ; ㅴ; ᄢ; ᄢ; ) HANGUL LETTER PIEUP-SIOS-KIYEOK +3175;3175;3175;1123;1123; # (ㅵ; ㅵ; ㅵ; ᄣ; ᄣ; ) HANGUL LETTER PIEUP-SIOS-TIKEUT +3176;3176;3176;1127;1127; # (ㅶ; ㅶ; ㅶ; ᄧ; ᄧ; ) HANGUL LETTER PIEUP-CIEUC +3177;3177;3177;1129;1129; # (ㅷ; ㅷ; ㅷ; ᄩ; ᄩ; ) HANGUL LETTER PIEUP-THIEUTH +3178;3178;3178;112B;112B; # (ㅸ; ㅸ; ㅸ; ᄫ; ᄫ; ) HANGUL LETTER KAPYEOUNPIEUP +3179;3179;3179;112C;112C; # (ㅹ; ㅹ; ㅹ; ᄬ; ᄬ; ) HANGUL LETTER KAPYEOUNSSANGPIEUP +317A;317A;317A;112D;112D; # (ㅺ; ㅺ; ㅺ; ᄭ; ᄭ; ) HANGUL LETTER SIOS-KIYEOK +317B;317B;317B;112E;112E; # (ㅻ; ㅻ; ㅻ; ᄮ; ᄮ; ) HANGUL LETTER SIOS-NIEUN +317C;317C;317C;112F;112F; # (ㅼ; ㅼ; ㅼ; ᄯ; ᄯ; ) HANGUL LETTER SIOS-TIKEUT +317D;317D;317D;1132;1132; # (ㅽ; ㅽ; ㅽ; ᄲ; ᄲ; ) HANGUL LETTER SIOS-PIEUP +317E;317E;317E;1136;1136; # (ㅾ; ㅾ; ㅾ; ᄶ; ᄶ; ) HANGUL LETTER SIOS-CIEUC +317F;317F;317F;1140;1140; # (ㅿ; ㅿ; ㅿ; ᅀ; ᅀ; ) HANGUL LETTER PANSIOS +3180;3180;3180;1147;1147; # (ㆀ; ㆀ; ㆀ; ᅇ; ᅇ; ) HANGUL LETTER SSANGIEUNG +3181;3181;3181;114C;114C; # (ㆁ; ㆁ; ㆁ; ᅌ; ᅌ; ) HANGUL LETTER YESIEUNG +3182;3182;3182;11F1;11F1; # (ㆂ; ㆂ; ㆂ; ᇱ; ᇱ; ) HANGUL LETTER YESIEUNG-SIOS +3183;3183;3183;11F2;11F2; # (ㆃ; ㆃ; ㆃ; ᇲ; ᇲ; ) HANGUL LETTER YESIEUNG-PANSIOS +3184;3184;3184;1157;1157; # (ㆄ; ㆄ; ㆄ; ᅗ; ᅗ; ) HANGUL LETTER KAPYEOUNPHIEUPH +3185;3185;3185;1158;1158; # (ㆅ; ㆅ; ㆅ; ᅘ; ᅘ; ) HANGUL LETTER SSANGHIEUH +3186;3186;3186;1159;1159; # (ㆆ; ㆆ; ㆆ; ᅙ; ᅙ; ) HANGUL LETTER YEORINHIEUH +3187;3187;3187;1184;1184; # (ㆇ; ㆇ; ㆇ; ᆄ; ᆄ; ) HANGUL LETTER YO-YA +3188;3188;3188;1185;1185; # (ㆈ; ㆈ; ㆈ; ᆅ; ᆅ; ) HANGUL LETTER YO-YAE +3189;3189;3189;1188;1188; # (ㆉ; ㆉ; ㆉ; ᆈ; ᆈ; ) HANGUL LETTER YO-I +318A;318A;318A;1191;1191; # (ㆊ; ㆊ; ㆊ; ᆑ; ᆑ; ) HANGUL LETTER YU-YEO +318B;318B;318B;1192;1192; # (ㆋ; ㆋ; ㆋ; ᆒ; ᆒ; ) HANGUL LETTER YU-YE +318C;318C;318C;1194;1194; # (ㆌ; ㆌ; ㆌ; ᆔ; ᆔ; ) HANGUL LETTER YU-I +318D;318D;318D;119E;119E; # (ㆍ; ㆍ; ㆍ; ᆞ; ᆞ; ) HANGUL LETTER ARAEA +318E;318E;318E;11A1;11A1; # (ㆎ; ㆎ; ㆎ; ᆡ; ᆡ; ) HANGUL LETTER ARAEAE +3192;3192;3192;4E00;4E00; # (㆒; ㆒; ㆒; 一; 一; ) IDEOGRAPHIC ANNOTATION ONE MARK +3193;3193;3193;4E8C;4E8C; # (㆓; ㆓; ㆓; 二; 二; ) IDEOGRAPHIC ANNOTATION TWO MARK +3194;3194;3194;4E09;4E09; # (㆔; ㆔; ㆔; 三; 三; ) IDEOGRAPHIC ANNOTATION THREE MARK +3195;3195;3195;56DB;56DB; # (㆕; ㆕; ㆕; 四; 四; ) IDEOGRAPHIC ANNOTATION FOUR MARK +3196;3196;3196;4E0A;4E0A; # (㆖; ㆖; ㆖; 上; 上; ) IDEOGRAPHIC ANNOTATION TOP MARK +3197;3197;3197;4E2D;4E2D; # (㆗; ㆗; ㆗; 中; 中; ) IDEOGRAPHIC ANNOTATION MIDDLE MARK +3198;3198;3198;4E0B;4E0B; # (㆘; ㆘; ㆘; 下; 下; ) IDEOGRAPHIC ANNOTATION BOTTOM MARK +3199;3199;3199;7532;7532; # (㆙; ㆙; ㆙; 甲; 甲; ) IDEOGRAPHIC ANNOTATION FIRST MARK +319A;319A;319A;4E59;4E59; # (㆚; ㆚; ㆚; 乙; 乙; ) IDEOGRAPHIC ANNOTATION SECOND MARK +319B;319B;319B;4E19;4E19; # (㆛; ㆛; ㆛; 丙; 丙; ) IDEOGRAPHIC ANNOTATION THIRD MARK +319C;319C;319C;4E01;4E01; # (㆜; ㆜; ㆜; 丁; 丁; ) IDEOGRAPHIC ANNOTATION FOURTH MARK +319D;319D;319D;5929;5929; # (㆝; ㆝; ㆝; 天; 天; ) IDEOGRAPHIC ANNOTATION HEAVEN MARK +319E;319E;319E;5730;5730; # (㆞; ㆞; ㆞; 地; 地; ) IDEOGRAPHIC ANNOTATION EARTH MARK +319F;319F;319F;4EBA;4EBA; # (㆟; ㆟; ㆟; 人; 人; ) IDEOGRAPHIC ANNOTATION MAN MARK +3200;3200;3200;0028 1100 0029;0028 1100 0029; # (㈀; ㈀; ㈀; (ᄀ); (ᄀ); ) PARENTHESIZED HANGUL KIYEOK +3201;3201;3201;0028 1102 0029;0028 1102 0029; # (㈁; ㈁; ㈁; (ᄂ); (ᄂ); ) PARENTHESIZED HANGUL NIEUN +3202;3202;3202;0028 1103 0029;0028 1103 0029; # (㈂; ㈂; ㈂; (ᄃ); (ᄃ); ) PARENTHESIZED HANGUL TIKEUT +3203;3203;3203;0028 1105 0029;0028 1105 0029; # (㈃; ㈃; ㈃; (ᄅ); (ᄅ); ) PARENTHESIZED HANGUL RIEUL +3204;3204;3204;0028 1106 0029;0028 1106 0029; # (㈄; ㈄; ㈄; (ᄆ); (ᄆ); ) PARENTHESIZED HANGUL MIEUM +3205;3205;3205;0028 1107 0029;0028 1107 0029; # (㈅; ㈅; ㈅; (ᄇ); (ᄇ); ) PARENTHESIZED HANGUL PIEUP +3206;3206;3206;0028 1109 0029;0028 1109 0029; # (㈆; ㈆; ㈆; (ᄉ); (ᄉ); ) PARENTHESIZED HANGUL SIOS +3207;3207;3207;0028 110B 0029;0028 110B 0029; # (㈇; ㈇; ㈇; (ᄋ); (ᄋ); ) PARENTHESIZED HANGUL IEUNG +3208;3208;3208;0028 110C 0029;0028 110C 0029; # (㈈; ㈈; ㈈; (ᄌ); (ᄌ); ) PARENTHESIZED HANGUL CIEUC +3209;3209;3209;0028 110E 0029;0028 110E 0029; # (㈉; ㈉; ㈉; (ᄎ); (ᄎ); ) PARENTHESIZED HANGUL CHIEUCH +320A;320A;320A;0028 110F 0029;0028 110F 0029; # (㈊; ㈊; ㈊; (ᄏ); (ᄏ); ) PARENTHESIZED HANGUL KHIEUKH +320B;320B;320B;0028 1110 0029;0028 1110 0029; # (㈋; ㈋; ㈋; (ᄐ); (ᄐ); ) PARENTHESIZED HANGUL THIEUTH +320C;320C;320C;0028 1111 0029;0028 1111 0029; # (㈌; ㈌; ㈌; (ᄑ); (ᄑ); ) PARENTHESIZED HANGUL PHIEUPH +320D;320D;320D;0028 1112 0029;0028 1112 0029; # (㈍; ㈍; ㈍; (ᄒ); (ᄒ); ) PARENTHESIZED HANGUL HIEUH +320E;320E;320E;0028 AC00 0029;0028 1100 1161 0029; # (㈎; ㈎; ㈎; (가); (가); ) PARENTHESIZED HANGUL KIYEOK A +320F;320F;320F;0028 B098 0029;0028 1102 1161 0029; # (㈏; ㈏; ㈏; (나); (나); ) PARENTHESIZED HANGUL NIEUN A +3210;3210;3210;0028 B2E4 0029;0028 1103 1161 0029; # (㈐; ㈐; ㈐; (다); (다); ) PARENTHESIZED HANGUL TIKEUT A +3211;3211;3211;0028 B77C 0029;0028 1105 1161 0029; # (㈑; ㈑; ㈑; (라); (라); ) PARENTHESIZED HANGUL RIEUL A +3212;3212;3212;0028 B9C8 0029;0028 1106 1161 0029; # (㈒; ㈒; ㈒; (마); (마); ) PARENTHESIZED HANGUL MIEUM A +3213;3213;3213;0028 BC14 0029;0028 1107 1161 0029; # (㈓; ㈓; ㈓; (바); (바); ) PARENTHESIZED HANGUL PIEUP A +3214;3214;3214;0028 C0AC 0029;0028 1109 1161 0029; # (㈔; ㈔; ㈔; (사); (사); ) PARENTHESIZED HANGUL SIOS A +3215;3215;3215;0028 C544 0029;0028 110B 1161 0029; # (㈕; ㈕; ㈕; (아); (아); ) PARENTHESIZED HANGUL IEUNG A +3216;3216;3216;0028 C790 0029;0028 110C 1161 0029; # (㈖; ㈖; ㈖; (자); (자); ) PARENTHESIZED HANGUL CIEUC A +3217;3217;3217;0028 CC28 0029;0028 110E 1161 0029; # (㈗; ㈗; ㈗; (차); (차); ) PARENTHESIZED HANGUL CHIEUCH A +3218;3218;3218;0028 CE74 0029;0028 110F 1161 0029; # (㈘; ㈘; ㈘; (카); (카); ) PARENTHESIZED HANGUL KHIEUKH A +3219;3219;3219;0028 D0C0 0029;0028 1110 1161 0029; # (㈙; ㈙; ㈙; (타); (타); ) PARENTHESIZED HANGUL THIEUTH A +321A;321A;321A;0028 D30C 0029;0028 1111 1161 0029; # (㈚; ㈚; ㈚; (파); (파); ) PARENTHESIZED HANGUL PHIEUPH A +321B;321B;321B;0028 D558 0029;0028 1112 1161 0029; # (㈛; ㈛; ㈛; (하); (하); ) PARENTHESIZED HANGUL HIEUH A +321C;321C;321C;0028 C8FC 0029;0028 110C 116E 0029; # (㈜; ㈜; ㈜; (주); (주); ) PARENTHESIZED HANGUL CIEUC U +3220;3220;3220;0028 4E00 0029;0028 4E00 0029; # (㈠; ㈠; ㈠; (一); (一); ) PARENTHESIZED IDEOGRAPH ONE +3221;3221;3221;0028 4E8C 0029;0028 4E8C 0029; # (㈡; ㈡; ㈡; (二); (二); ) PARENTHESIZED IDEOGRAPH TWO +3222;3222;3222;0028 4E09 0029;0028 4E09 0029; # (㈢; ㈢; ㈢; (三); (三); ) PARENTHESIZED IDEOGRAPH THREE +3223;3223;3223;0028 56DB 0029;0028 56DB 0029; # (㈣; ㈣; ㈣; (四); (四); ) PARENTHESIZED IDEOGRAPH FOUR +3224;3224;3224;0028 4E94 0029;0028 4E94 0029; # (㈤; ㈤; ㈤; (五); (五); ) PARENTHESIZED IDEOGRAPH FIVE +3225;3225;3225;0028 516D 0029;0028 516D 0029; # (㈥; ㈥; ㈥; (六); (六); ) PARENTHESIZED IDEOGRAPH SIX +3226;3226;3226;0028 4E03 0029;0028 4E03 0029; # (㈦; ㈦; ㈦; (七); (七); ) PARENTHESIZED IDEOGRAPH SEVEN +3227;3227;3227;0028 516B 0029;0028 516B 0029; # (㈧; ㈧; ㈧; (八); (八); ) PARENTHESIZED IDEOGRAPH EIGHT +3228;3228;3228;0028 4E5D 0029;0028 4E5D 0029; # (㈨; ㈨; ㈨; (九); (九); ) PARENTHESIZED IDEOGRAPH NINE +3229;3229;3229;0028 5341 0029;0028 5341 0029; # (㈩; ㈩; ㈩; (十); (十); ) PARENTHESIZED IDEOGRAPH TEN +322A;322A;322A;0028 6708 0029;0028 6708 0029; # (㈪; ㈪; ㈪; (月); (月); ) PARENTHESIZED IDEOGRAPH MOON +322B;322B;322B;0028 706B 0029;0028 706B 0029; # (㈫; ㈫; ㈫; (火); (火); ) PARENTHESIZED IDEOGRAPH FIRE +322C;322C;322C;0028 6C34 0029;0028 6C34 0029; # (㈬; ㈬; ㈬; (水); (水); ) PARENTHESIZED IDEOGRAPH WATER +322D;322D;322D;0028 6728 0029;0028 6728 0029; # (㈭; ㈭; ㈭; (木); (木); ) PARENTHESIZED IDEOGRAPH WOOD +322E;322E;322E;0028 91D1 0029;0028 91D1 0029; # (㈮; ㈮; ㈮; (金); (金); ) PARENTHESIZED IDEOGRAPH METAL +322F;322F;322F;0028 571F 0029;0028 571F 0029; # (㈯; ㈯; ㈯; (土); (土); ) PARENTHESIZED IDEOGRAPH EARTH +3230;3230;3230;0028 65E5 0029;0028 65E5 0029; # (㈰; ㈰; ㈰; (日); (日); ) PARENTHESIZED IDEOGRAPH SUN +3231;3231;3231;0028 682A 0029;0028 682A 0029; # (㈱; ㈱; ㈱; (株); (株); ) PARENTHESIZED IDEOGRAPH STOCK +3232;3232;3232;0028 6709 0029;0028 6709 0029; # (㈲; ㈲; ㈲; (有); (有); ) PARENTHESIZED IDEOGRAPH HAVE +3233;3233;3233;0028 793E 0029;0028 793E 0029; # (㈳; ㈳; ㈳; (社); (社); ) PARENTHESIZED IDEOGRAPH SOCIETY +3234;3234;3234;0028 540D 0029;0028 540D 0029; # (㈴; ㈴; ㈴; (名); (名); ) PARENTHESIZED IDEOGRAPH NAME +3235;3235;3235;0028 7279 0029;0028 7279 0029; # (㈵; ㈵; ㈵; (特); (特); ) PARENTHESIZED IDEOGRAPH SPECIAL +3236;3236;3236;0028 8CA1 0029;0028 8CA1 0029; # (㈶; ㈶; ㈶; (財); (財); ) PARENTHESIZED IDEOGRAPH FINANCIAL +3237;3237;3237;0028 795D 0029;0028 795D 0029; # (㈷; ㈷; ㈷; (祝); (祝); ) PARENTHESIZED IDEOGRAPH CONGRATULATION +3238;3238;3238;0028 52B4 0029;0028 52B4 0029; # (㈸; ㈸; ㈸; (労); (労); ) PARENTHESIZED IDEOGRAPH LABOR +3239;3239;3239;0028 4EE3 0029;0028 4EE3 0029; # (㈹; ㈹; ㈹; (代); (代); ) PARENTHESIZED IDEOGRAPH REPRESENT +323A;323A;323A;0028 547C 0029;0028 547C 0029; # (㈺; ㈺; ㈺; (呼); (呼); ) PARENTHESIZED IDEOGRAPH CALL +323B;323B;323B;0028 5B66 0029;0028 5B66 0029; # (㈻; ㈻; ㈻; (学); (学); ) PARENTHESIZED IDEOGRAPH STUDY +323C;323C;323C;0028 76E3 0029;0028 76E3 0029; # (㈼; ㈼; ㈼; (監); (監); ) PARENTHESIZED IDEOGRAPH SUPERVISE +323D;323D;323D;0028 4F01 0029;0028 4F01 0029; # (㈽; ㈽; ㈽; (企); (企); ) PARENTHESIZED IDEOGRAPH ENTERPRISE +323E;323E;323E;0028 8CC7 0029;0028 8CC7 0029; # (㈾; ㈾; ㈾; (資); (資); ) PARENTHESIZED IDEOGRAPH RESOURCE +323F;323F;323F;0028 5354 0029;0028 5354 0029; # (㈿; ㈿; ㈿; (協); (協); ) PARENTHESIZED IDEOGRAPH ALLIANCE +3240;3240;3240;0028 796D 0029;0028 796D 0029; # (㉀; ㉀; ㉀; (祭); (祭); ) PARENTHESIZED IDEOGRAPH FESTIVAL +3241;3241;3241;0028 4F11 0029;0028 4F11 0029; # (㉁; ㉁; ㉁; (休); (休); ) PARENTHESIZED IDEOGRAPH REST +3242;3242;3242;0028 81EA 0029;0028 81EA 0029; # (㉂; ㉂; ㉂; (自); (自); ) PARENTHESIZED IDEOGRAPH SELF +3243;3243;3243;0028 81F3 0029;0028 81F3 0029; # (㉃; ㉃; ㉃; (至); (至); ) PARENTHESIZED IDEOGRAPH REACH +3251;3251;3251;0032 0031;0032 0031; # (㉑; ㉑; ㉑; 21; 21; ) CIRCLED NUMBER TWENTY ONE +3252;3252;3252;0032 0032;0032 0032; # (㉒; ㉒; ㉒; 22; 22; ) CIRCLED NUMBER TWENTY TWO +3253;3253;3253;0032 0033;0032 0033; # (㉓; ㉓; ㉓; 23; 23; ) CIRCLED NUMBER TWENTY THREE +3254;3254;3254;0032 0034;0032 0034; # (㉔; ㉔; ㉔; 24; 24; ) CIRCLED NUMBER TWENTY FOUR +3255;3255;3255;0032 0035;0032 0035; # (㉕; ㉕; ㉕; 25; 25; ) CIRCLED NUMBER TWENTY FIVE +3256;3256;3256;0032 0036;0032 0036; # (㉖; ㉖; ㉖; 26; 26; ) CIRCLED NUMBER TWENTY SIX +3257;3257;3257;0032 0037;0032 0037; # (㉗; ㉗; ㉗; 27; 27; ) CIRCLED NUMBER TWENTY SEVEN +3258;3258;3258;0032 0038;0032 0038; # (㉘; ㉘; ㉘; 28; 28; ) CIRCLED NUMBER TWENTY EIGHT +3259;3259;3259;0032 0039;0032 0039; # (㉙; ㉙; ㉙; 29; 29; ) CIRCLED NUMBER TWENTY NINE +325A;325A;325A;0033 0030;0033 0030; # (㉚; ㉚; ㉚; 30; 30; ) CIRCLED NUMBER THIRTY +325B;325B;325B;0033 0031;0033 0031; # (㉛; ㉛; ㉛; 31; 31; ) CIRCLED NUMBER THIRTY ONE +325C;325C;325C;0033 0032;0033 0032; # (㉜; ㉜; ㉜; 32; 32; ) CIRCLED NUMBER THIRTY TWO +325D;325D;325D;0033 0033;0033 0033; # (㉝; ㉝; ㉝; 33; 33; ) CIRCLED NUMBER THIRTY THREE +325E;325E;325E;0033 0034;0033 0034; # (㉞; ㉞; ㉞; 34; 34; ) CIRCLED NUMBER THIRTY FOUR +325F;325F;325F;0033 0035;0033 0035; # (㉟; ㉟; ㉟; 35; 35; ) CIRCLED NUMBER THIRTY FIVE +3260;3260;3260;1100;1100; # (㉠; ㉠; ㉠; ᄀ; ᄀ; ) CIRCLED HANGUL KIYEOK +3261;3261;3261;1102;1102; # (㉡; ㉡; ㉡; ᄂ; ᄂ; ) CIRCLED HANGUL NIEUN +3262;3262;3262;1103;1103; # (㉢; ㉢; ㉢; ᄃ; ᄃ; ) CIRCLED HANGUL TIKEUT +3263;3263;3263;1105;1105; # (㉣; ㉣; ㉣; ᄅ; ᄅ; ) CIRCLED HANGUL RIEUL +3264;3264;3264;1106;1106; # (㉤; ㉤; ㉤; ᄆ; ᄆ; ) CIRCLED HANGUL MIEUM +3265;3265;3265;1107;1107; # (㉥; ㉥; ㉥; ᄇ; ᄇ; ) CIRCLED HANGUL PIEUP +3266;3266;3266;1109;1109; # (㉦; ㉦; ㉦; ᄉ; ᄉ; ) CIRCLED HANGUL SIOS +3267;3267;3267;110B;110B; # (㉧; ㉧; ㉧; ᄋ; ᄋ; ) CIRCLED HANGUL IEUNG +3268;3268;3268;110C;110C; # (㉨; ㉨; ㉨; ᄌ; ᄌ; ) CIRCLED HANGUL CIEUC +3269;3269;3269;110E;110E; # (㉩; ㉩; ㉩; ᄎ; ᄎ; ) CIRCLED HANGUL CHIEUCH +326A;326A;326A;110F;110F; # (㉪; ㉪; ㉪; ᄏ; ᄏ; ) CIRCLED HANGUL KHIEUKH +326B;326B;326B;1110;1110; # (㉫; ㉫; ㉫; ᄐ; ᄐ; ) CIRCLED HANGUL THIEUTH +326C;326C;326C;1111;1111; # (㉬; ㉬; ㉬; ᄑ; ᄑ; ) CIRCLED HANGUL PHIEUPH +326D;326D;326D;1112;1112; # (㉭; ㉭; ㉭; ᄒ; ᄒ; ) CIRCLED HANGUL HIEUH +326E;326E;326E;AC00;1100 1161; # (㉮; ㉮; ㉮; 가; 가; ) CIRCLED HANGUL KIYEOK A +326F;326F;326F;B098;1102 1161; # (㉯; ㉯; ㉯; 나; 나; ) CIRCLED HANGUL NIEUN A +3270;3270;3270;B2E4;1103 1161; # (㉰; ㉰; ㉰; 다; 다; ) CIRCLED HANGUL TIKEUT A +3271;3271;3271;B77C;1105 1161; # (㉱; ㉱; ㉱; 라; 라; ) CIRCLED HANGUL RIEUL A +3272;3272;3272;B9C8;1106 1161; # (㉲; ㉲; ㉲; 마; 마; ) CIRCLED HANGUL MIEUM A +3273;3273;3273;BC14;1107 1161; # (㉳; ㉳; ㉳; 바; 바; ) CIRCLED HANGUL PIEUP A +3274;3274;3274;C0AC;1109 1161; # (㉴; ㉴; ㉴; 사; 사; ) CIRCLED HANGUL SIOS A +3275;3275;3275;C544;110B 1161; # (㉵; ㉵; ㉵; 아; 아; ) CIRCLED HANGUL IEUNG A +3276;3276;3276;C790;110C 1161; # (㉶; ㉶; ㉶; 자; 자; ) CIRCLED HANGUL CIEUC A +3277;3277;3277;CC28;110E 1161; # (㉷; ㉷; ㉷; 차; 차; ) CIRCLED HANGUL CHIEUCH A +3278;3278;3278;CE74;110F 1161; # (㉸; ㉸; ㉸; 카; 카; ) CIRCLED HANGUL KHIEUKH A +3279;3279;3279;D0C0;1110 1161; # (㉹; ㉹; ㉹; 타; 타; ) CIRCLED HANGUL THIEUTH A +327A;327A;327A;D30C;1111 1161; # (㉺; ㉺; ㉺; 파; 파; ) CIRCLED HANGUL PHIEUPH A +327B;327B;327B;D558;1112 1161; # (㉻; ㉻; ㉻; 하; 하; ) CIRCLED HANGUL HIEUH A +3280;3280;3280;4E00;4E00; # (㊀; ㊀; ㊀; 一; 一; ) CIRCLED IDEOGRAPH ONE +3281;3281;3281;4E8C;4E8C; # (㊁; ㊁; ㊁; 二; 二; ) CIRCLED IDEOGRAPH TWO +3282;3282;3282;4E09;4E09; # (㊂; ㊂; ㊂; 三; 三; ) CIRCLED IDEOGRAPH THREE +3283;3283;3283;56DB;56DB; # (㊃; ㊃; ㊃; 四; 四; ) CIRCLED IDEOGRAPH FOUR +3284;3284;3284;4E94;4E94; # (㊄; ㊄; ㊄; 五; 五; ) CIRCLED IDEOGRAPH FIVE +3285;3285;3285;516D;516D; # (㊅; ㊅; ㊅; 六; 六; ) CIRCLED IDEOGRAPH SIX +3286;3286;3286;4E03;4E03; # (㊆; ㊆; ㊆; 七; 七; ) CIRCLED IDEOGRAPH SEVEN +3287;3287;3287;516B;516B; # (㊇; ㊇; ㊇; 八; 八; ) CIRCLED IDEOGRAPH EIGHT +3288;3288;3288;4E5D;4E5D; # (㊈; ㊈; ㊈; 九; 九; ) CIRCLED IDEOGRAPH NINE +3289;3289;3289;5341;5341; # (㊉; ㊉; ㊉; 十; 十; ) CIRCLED IDEOGRAPH TEN +328A;328A;328A;6708;6708; # (㊊; ㊊; ㊊; 月; 月; ) CIRCLED IDEOGRAPH MOON +328B;328B;328B;706B;706B; # (㊋; ㊋; ㊋; 火; 火; ) CIRCLED IDEOGRAPH FIRE +328C;328C;328C;6C34;6C34; # (㊌; ㊌; ㊌; 水; 水; ) CIRCLED IDEOGRAPH WATER +328D;328D;328D;6728;6728; # (㊍; ㊍; ㊍; 木; 木; ) CIRCLED IDEOGRAPH WOOD +328E;328E;328E;91D1;91D1; # (㊎; ㊎; ㊎; 金; 金; ) CIRCLED IDEOGRAPH METAL +328F;328F;328F;571F;571F; # (㊏; ㊏; ㊏; 土; 土; ) CIRCLED IDEOGRAPH EARTH +3290;3290;3290;65E5;65E5; # (㊐; ㊐; ㊐; 日; 日; ) CIRCLED IDEOGRAPH SUN +3291;3291;3291;682A;682A; # (㊑; ㊑; ㊑; 株; 株; ) CIRCLED IDEOGRAPH STOCK +3292;3292;3292;6709;6709; # (㊒; ㊒; ㊒; 有; 有; ) CIRCLED IDEOGRAPH HAVE +3293;3293;3293;793E;793E; # (㊓; ㊓; ㊓; 社; 社; ) CIRCLED IDEOGRAPH SOCIETY +3294;3294;3294;540D;540D; # (㊔; ㊔; ㊔; 名; 名; ) CIRCLED IDEOGRAPH NAME +3295;3295;3295;7279;7279; # (㊕; ㊕; ㊕; 特; 特; ) CIRCLED IDEOGRAPH SPECIAL +3296;3296;3296;8CA1;8CA1; # (㊖; ㊖; ㊖; 財; 財; ) CIRCLED IDEOGRAPH FINANCIAL +3297;3297;3297;795D;795D; # (㊗; ㊗; ㊗; 祝; 祝; ) CIRCLED IDEOGRAPH CONGRATULATION +3298;3298;3298;52B4;52B4; # (㊘; ㊘; ㊘; 労; 労; ) CIRCLED IDEOGRAPH LABOR +3299;3299;3299;79D8;79D8; # (㊙; ㊙; ㊙; 秘; 秘; ) CIRCLED IDEOGRAPH SECRET +329A;329A;329A;7537;7537; # (㊚; ㊚; ㊚; 男; 男; ) CIRCLED IDEOGRAPH MALE +329B;329B;329B;5973;5973; # (㊛; ㊛; ㊛; 女; 女; ) CIRCLED IDEOGRAPH FEMALE +329C;329C;329C;9069;9069; # (㊜; ㊜; ㊜; 適; 適; ) CIRCLED IDEOGRAPH SUITABLE +329D;329D;329D;512A;512A; # (㊝; ㊝; ㊝; 優; 優; ) CIRCLED IDEOGRAPH EXCELLENT +329E;329E;329E;5370;5370; # (㊞; ㊞; ㊞; 印; 印; ) CIRCLED IDEOGRAPH PRINT +329F;329F;329F;6CE8;6CE8; # (㊟; ㊟; ㊟; 注; 注; ) CIRCLED IDEOGRAPH ATTENTION +32A0;32A0;32A0;9805;9805; # (㊠; ㊠; ㊠; 項; 項; ) CIRCLED IDEOGRAPH ITEM +32A1;32A1;32A1;4F11;4F11; # (㊡; ㊡; ㊡; 休; 休; ) CIRCLED IDEOGRAPH REST +32A2;32A2;32A2;5199;5199; # (㊢; ㊢; ㊢; 写; 写; ) CIRCLED IDEOGRAPH COPY +32A3;32A3;32A3;6B63;6B63; # (㊣; ㊣; ㊣; 正; 正; ) CIRCLED IDEOGRAPH CORRECT +32A4;32A4;32A4;4E0A;4E0A; # (㊤; ㊤; ㊤; 上; 上; ) CIRCLED IDEOGRAPH HIGH +32A5;32A5;32A5;4E2D;4E2D; # (㊥; ㊥; ㊥; 中; 中; ) CIRCLED IDEOGRAPH CENTRE +32A6;32A6;32A6;4E0B;4E0B; # (㊦; ㊦; ㊦; 下; 下; ) CIRCLED IDEOGRAPH LOW +32A7;32A7;32A7;5DE6;5DE6; # (㊧; ㊧; ㊧; 左; 左; ) CIRCLED IDEOGRAPH LEFT +32A8;32A8;32A8;53F3;53F3; # (㊨; ㊨; ㊨; 右; 右; ) CIRCLED IDEOGRAPH RIGHT +32A9;32A9;32A9;533B;533B; # (㊩; ㊩; ㊩; 医; 医; ) CIRCLED IDEOGRAPH MEDICINE +32AA;32AA;32AA;5B97;5B97; # (㊪; ㊪; ㊪; 宗; 宗; ) CIRCLED IDEOGRAPH RELIGION +32AB;32AB;32AB;5B66;5B66; # (㊫; ㊫; ㊫; 学; 学; ) CIRCLED IDEOGRAPH STUDY +32AC;32AC;32AC;76E3;76E3; # (㊬; ㊬; ㊬; 監; 監; ) CIRCLED IDEOGRAPH SUPERVISE +32AD;32AD;32AD;4F01;4F01; # (㊭; ㊭; ㊭; 企; 企; ) CIRCLED IDEOGRAPH ENTERPRISE +32AE;32AE;32AE;8CC7;8CC7; # (㊮; ㊮; ㊮; 資; 資; ) CIRCLED IDEOGRAPH RESOURCE +32AF;32AF;32AF;5354;5354; # (㊯; ㊯; ㊯; 協; 協; ) CIRCLED IDEOGRAPH ALLIANCE +32B0;32B0;32B0;591C;591C; # (㊰; ㊰; ㊰; 夜; 夜; ) CIRCLED IDEOGRAPH NIGHT +32B1;32B1;32B1;0033 0036;0033 0036; # (㊱; ㊱; ㊱; 36; 36; ) CIRCLED NUMBER THIRTY SIX +32B2;32B2;32B2;0033 0037;0033 0037; # (㊲; ㊲; ㊲; 37; 37; ) CIRCLED NUMBER THIRTY SEVEN +32B3;32B3;32B3;0033 0038;0033 0038; # (㊳; ㊳; ㊳; 38; 38; ) CIRCLED NUMBER THIRTY EIGHT +32B4;32B4;32B4;0033 0039;0033 0039; # (㊴; ㊴; ㊴; 39; 39; ) CIRCLED NUMBER THIRTY NINE +32B5;32B5;32B5;0034 0030;0034 0030; # (㊵; ㊵; ㊵; 40; 40; ) CIRCLED NUMBER FORTY +32B6;32B6;32B6;0034 0031;0034 0031; # (㊶; ㊶; ㊶; 41; 41; ) CIRCLED NUMBER FORTY ONE +32B7;32B7;32B7;0034 0032;0034 0032; # (㊷; ㊷; ㊷; 42; 42; ) CIRCLED NUMBER FORTY TWO +32B8;32B8;32B8;0034 0033;0034 0033; # (㊸; ㊸; ㊸; 43; 43; ) CIRCLED NUMBER FORTY THREE +32B9;32B9;32B9;0034 0034;0034 0034; # (㊹; ㊹; ㊹; 44; 44; ) CIRCLED NUMBER FORTY FOUR +32BA;32BA;32BA;0034 0035;0034 0035; # (㊺; ㊺; ㊺; 45; 45; ) CIRCLED NUMBER FORTY FIVE +32BB;32BB;32BB;0034 0036;0034 0036; # (㊻; ㊻; ㊻; 46; 46; ) CIRCLED NUMBER FORTY SIX +32BC;32BC;32BC;0034 0037;0034 0037; # (㊼; ㊼; ㊼; 47; 47; ) CIRCLED NUMBER FORTY SEVEN +32BD;32BD;32BD;0034 0038;0034 0038; # (㊽; ㊽; ㊽; 48; 48; ) CIRCLED NUMBER FORTY EIGHT +32BE;32BE;32BE;0034 0039;0034 0039; # (㊾; ㊾; ㊾; 49; 49; ) CIRCLED NUMBER FORTY NINE +32BF;32BF;32BF;0035 0030;0035 0030; # (㊿; ㊿; ㊿; 50; 50; ) CIRCLED NUMBER FIFTY +32C0;32C0;32C0;0031 6708;0031 6708; # (㋀; ㋀; ㋀; 1月; 1月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +32C1;32C1;32C1;0032 6708;0032 6708; # (㋁; ㋁; ㋁; 2月; 2月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +32C2;32C2;32C2;0033 6708;0033 6708; # (㋂; ㋂; ㋂; 3月; 3月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +32C3;32C3;32C3;0034 6708;0034 6708; # (㋃; ㋃; ㋃; 4月; 4月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +32C4;32C4;32C4;0035 6708;0035 6708; # (㋄; ㋄; ㋄; 5月; 5月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +32C5;32C5;32C5;0036 6708;0036 6708; # (㋅; ㋅; ㋅; 6月; 6月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +32C6;32C6;32C6;0037 6708;0037 6708; # (㋆; ㋆; ㋆; 7月; 7月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +32C7;32C7;32C7;0038 6708;0038 6708; # (㋇; ㋇; ㋇; 8月; 8月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +32C8;32C8;32C8;0039 6708;0039 6708; # (㋈; ㋈; ㋈; 9月; 9月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +32C9;32C9;32C9;0031 0030 6708;0031 0030 6708; # (㋉; ㋉; ㋉; 10月; 10月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +32CA;32CA;32CA;0031 0031 6708;0031 0031 6708; # (㋊; ㋊; ㋊; 11月; 11月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +32CB;32CB;32CB;0031 0032 6708;0031 0032 6708; # (㋋; ㋋; ㋋; 12月; 12月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32D0;32D0;32D0;30A2;30A2; # (㋐; ㋐; ㋐; ア; ア; ) CIRCLED KATAKANA A +32D1;32D1;32D1;30A4;30A4; # (㋑; ㋑; ㋑; イ; イ; ) CIRCLED KATAKANA I +32D2;32D2;32D2;30A6;30A6; # (㋒; ㋒; ㋒; ウ; ウ; ) CIRCLED KATAKANA U +32D3;32D3;32D3;30A8;30A8; # (㋓; ㋓; ㋓; エ; エ; ) CIRCLED KATAKANA E +32D4;32D4;32D4;30AA;30AA; # (㋔; ㋔; ㋔; オ; オ; ) CIRCLED KATAKANA O +32D5;32D5;32D5;30AB;30AB; # (㋕; ㋕; ㋕; カ; カ; ) CIRCLED KATAKANA KA +32D6;32D6;32D6;30AD;30AD; # (㋖; ㋖; ㋖; キ; キ; ) CIRCLED KATAKANA KI +32D7;32D7;32D7;30AF;30AF; # (㋗; ㋗; ㋗; ク; ク; ) CIRCLED KATAKANA KU +32D8;32D8;32D8;30B1;30B1; # (㋘; ㋘; ㋘; ケ; ケ; ) CIRCLED KATAKANA KE +32D9;32D9;32D9;30B3;30B3; # (㋙; ㋙; ㋙; コ; コ; ) CIRCLED KATAKANA KO +32DA;32DA;32DA;30B5;30B5; # (㋚; ㋚; ㋚; サ; サ; ) CIRCLED KATAKANA SA +32DB;32DB;32DB;30B7;30B7; # (㋛; ㋛; ㋛; シ; シ; ) CIRCLED KATAKANA SI +32DC;32DC;32DC;30B9;30B9; # (㋜; ㋜; ㋜; ス; ス; ) CIRCLED KATAKANA SU +32DD;32DD;32DD;30BB;30BB; # (㋝; ㋝; ㋝; セ; セ; ) CIRCLED KATAKANA SE +32DE;32DE;32DE;30BD;30BD; # (㋞; ㋞; ㋞; ソ; ソ; ) CIRCLED KATAKANA SO +32DF;32DF;32DF;30BF;30BF; # (㋟; ㋟; ㋟; タ; タ; ) CIRCLED KATAKANA TA +32E0;32E0;32E0;30C1;30C1; # (㋠; ㋠; ㋠; チ; チ; ) CIRCLED KATAKANA TI +32E1;32E1;32E1;30C4;30C4; # (㋡; ㋡; ㋡; ツ; ツ; ) CIRCLED KATAKANA TU +32E2;32E2;32E2;30C6;30C6; # (㋢; ㋢; ㋢; テ; テ; ) CIRCLED KATAKANA TE +32E3;32E3;32E3;30C8;30C8; # (㋣; ㋣; ㋣; ト; ト; ) CIRCLED KATAKANA TO +32E4;32E4;32E4;30CA;30CA; # (㋤; ㋤; ㋤; ナ; ナ; ) CIRCLED KATAKANA NA +32E5;32E5;32E5;30CB;30CB; # (㋥; ㋥; ㋥; ニ; ニ; ) CIRCLED KATAKANA NI +32E6;32E6;32E6;30CC;30CC; # (㋦; ㋦; ㋦; ヌ; ヌ; ) CIRCLED KATAKANA NU +32E7;32E7;32E7;30CD;30CD; # (㋧; ㋧; ㋧; ネ; ネ; ) CIRCLED KATAKANA NE +32E8;32E8;32E8;30CE;30CE; # (㋨; ㋨; ㋨; ノ; ノ; ) CIRCLED KATAKANA NO +32E9;32E9;32E9;30CF;30CF; # (㋩; ㋩; ㋩; ハ; ハ; ) CIRCLED KATAKANA HA +32EA;32EA;32EA;30D2;30D2; # (㋪; ㋪; ㋪; ヒ; ヒ; ) CIRCLED KATAKANA HI +32EB;32EB;32EB;30D5;30D5; # (㋫; ㋫; ㋫; フ; フ; ) CIRCLED KATAKANA HU +32EC;32EC;32EC;30D8;30D8; # (㋬; ㋬; ㋬; ヘ; ヘ; ) CIRCLED KATAKANA HE +32ED;32ED;32ED;30DB;30DB; # (㋭; ㋭; ㋭; ホ; ホ; ) CIRCLED KATAKANA HO +32EE;32EE;32EE;30DE;30DE; # (㋮; ㋮; ㋮; マ; マ; ) CIRCLED KATAKANA MA +32EF;32EF;32EF;30DF;30DF; # (㋯; ㋯; ㋯; ミ; ミ; ) CIRCLED KATAKANA MI +32F0;32F0;32F0;30E0;30E0; # (㋰; ㋰; ㋰; ム; ム; ) CIRCLED KATAKANA MU +32F1;32F1;32F1;30E1;30E1; # (㋱; ㋱; ㋱; メ; メ; ) CIRCLED KATAKANA ME +32F2;32F2;32F2;30E2;30E2; # (㋲; ㋲; ㋲; モ; モ; ) CIRCLED KATAKANA MO +32F3;32F3;32F3;30E4;30E4; # (㋳; ㋳; ㋳; ヤ; ヤ; ) CIRCLED KATAKANA YA +32F4;32F4;32F4;30E6;30E6; # (㋴; ㋴; ㋴; ユ; ユ; ) CIRCLED KATAKANA YU +32F5;32F5;32F5;30E8;30E8; # (㋵; ㋵; ㋵; ヨ; ヨ; ) CIRCLED KATAKANA YO +32F6;32F6;32F6;30E9;30E9; # (㋶; ㋶; ㋶; ラ; ラ; ) CIRCLED KATAKANA RA +32F7;32F7;32F7;30EA;30EA; # (㋷; ㋷; ㋷; リ; リ; ) CIRCLED KATAKANA RI +32F8;32F8;32F8;30EB;30EB; # (㋸; ㋸; ㋸; ル; ル; ) CIRCLED KATAKANA RU +32F9;32F9;32F9;30EC;30EC; # (㋹; ㋹; ㋹; レ; レ; ) CIRCLED KATAKANA RE +32FA;32FA;32FA;30ED;30ED; # (㋺; ㋺; ㋺; ロ; ロ; ) CIRCLED KATAKANA RO +32FB;32FB;32FB;30EF;30EF; # (㋻; ㋻; ㋻; ワ; ワ; ) CIRCLED KATAKANA WA +32FC;32FC;32FC;30F0;30F0; # (㋼; ㋼; ㋼; ヰ; ヰ; ) CIRCLED KATAKANA WI +32FD;32FD;32FD;30F1;30F1; # (㋽; ㋽; ㋽; ヱ; ヱ; ) CIRCLED KATAKANA WE +32FE;32FE;32FE;30F2;30F2; # (㋾; ㋾; ㋾; ヲ; ヲ; ) CIRCLED KATAKANA WO +3300;3300;3300;30A2 30D1 30FC 30C8;30A2 30CF 309A 30FC 30C8; # (㌀; ㌀; ㌀; アパート; アハ◌゚ート; ) SQUARE APAATO +3301;3301;3301;30A2 30EB 30D5 30A1;30A2 30EB 30D5 30A1; # (㌁; ㌁; ㌁; アルファ; アルファ; ) SQUARE ARUHUA +3302;3302;3302;30A2 30F3 30DA 30A2;30A2 30F3 30D8 309A 30A2; # (㌂; ㌂; ㌂; アンペア; アンヘ◌゚ア; ) SQUARE ANPEA +3303;3303;3303;30A2 30FC 30EB;30A2 30FC 30EB; # (㌃; ㌃; ㌃; アール; アール; ) SQUARE AARU +3304;3304;3304;30A4 30CB 30F3 30B0;30A4 30CB 30F3 30AF 3099; # (㌄; ㌄; ㌄; イニング; イニンク◌゙; ) SQUARE ININGU +3305;3305;3305;30A4 30F3 30C1;30A4 30F3 30C1; # (㌅; ㌅; ㌅; インチ; インチ; ) SQUARE INTI +3306;3306;3306;30A6 30A9 30F3;30A6 30A9 30F3; # (㌆; ㌆; ㌆; ウォン; ウォン; ) SQUARE UON +3307;3307;3307;30A8 30B9 30AF 30FC 30C9;30A8 30B9 30AF 30FC 30C8 3099; # (㌇; ㌇; ㌇; エスクード; エスクート◌゙; ) SQUARE ESUKUUDO +3308;3308;3308;30A8 30FC 30AB 30FC;30A8 30FC 30AB 30FC; # (㌈; ㌈; ㌈; エーカー; エーカー; ) SQUARE EEKAA +3309;3309;3309;30AA 30F3 30B9;30AA 30F3 30B9; # (㌉; ㌉; ㌉; オンス; オンス; ) SQUARE ONSU +330A;330A;330A;30AA 30FC 30E0;30AA 30FC 30E0; # (㌊; ㌊; ㌊; オーム; オーム; ) SQUARE OOMU +330B;330B;330B;30AB 30A4 30EA;30AB 30A4 30EA; # (㌋; ㌋; ㌋; カイリ; カイリ; ) SQUARE KAIRI +330C;330C;330C;30AB 30E9 30C3 30C8;30AB 30E9 30C3 30C8; # (㌌; ㌌; ㌌; カラット; カラット; ) SQUARE KARATTO +330D;330D;330D;30AB 30ED 30EA 30FC;30AB 30ED 30EA 30FC; # (㌍; ㌍; ㌍; カロリー; カロリー; ) SQUARE KARORII +330E;330E;330E;30AC 30ED 30F3;30AB 3099 30ED 30F3; # (㌎; ㌎; ㌎; ガロン; カ◌゙ロン; ) SQUARE GARON +330F;330F;330F;30AC 30F3 30DE;30AB 3099 30F3 30DE; # (㌏; ㌏; ㌏; ガンマ; カ◌゙ンマ; ) SQUARE GANMA +3310;3310;3310;30AE 30AC;30AD 3099 30AB 3099; # (㌐; ㌐; ㌐; ギガ; キ◌゙カ◌゙; ) SQUARE GIGA +3311;3311;3311;30AE 30CB 30FC;30AD 3099 30CB 30FC; # (㌑; ㌑; ㌑; ギニー; キ◌゙ニー; ) SQUARE GINII +3312;3312;3312;30AD 30E5 30EA 30FC;30AD 30E5 30EA 30FC; # (㌒; ㌒; ㌒; キュリー; キュリー; ) SQUARE KYURII +3313;3313;3313;30AE 30EB 30C0 30FC;30AD 3099 30EB 30BF 3099 30FC; # (㌓; ㌓; ㌓; ギルダー; キ◌゙ルタ◌゙ー; ) SQUARE GIRUDAA +3314;3314;3314;30AD 30ED;30AD 30ED; # (㌔; ㌔; ㌔; キロ; キロ; ) SQUARE KIRO +3315;3315;3315;30AD 30ED 30B0 30E9 30E0;30AD 30ED 30AF 3099 30E9 30E0; # (㌕; ㌕; ㌕; キログラム; キロク◌゙ラム; ) SQUARE KIROGURAMU +3316;3316;3316;30AD 30ED 30E1 30FC 30C8 30EB;30AD 30ED 30E1 30FC 30C8 30EB; # (㌖; ㌖; ㌖; キロメートル; キロメートル; ) SQUARE KIROMEETORU +3317;3317;3317;30AD 30ED 30EF 30C3 30C8;30AD 30ED 30EF 30C3 30C8; # (㌗; ㌗; ㌗; キロワット; キロワット; ) SQUARE KIROWATTO +3318;3318;3318;30B0 30E9 30E0;30AF 3099 30E9 30E0; # (㌘; ㌘; ㌘; グラム; ク◌゙ラム; ) SQUARE GURAMU +3319;3319;3319;30B0 30E9 30E0 30C8 30F3;30AF 3099 30E9 30E0 30C8 30F3; # (㌙; ㌙; ㌙; グラムトン; ク◌゙ラムトン; ) SQUARE GURAMUTON +331A;331A;331A;30AF 30EB 30BC 30A4 30ED;30AF 30EB 30BB 3099 30A4 30ED; # (㌚; ㌚; ㌚; クルゼイロ; クルセ◌゙イロ; ) SQUARE KURUZEIRO +331B;331B;331B;30AF 30ED 30FC 30CD;30AF 30ED 30FC 30CD; # (㌛; ㌛; ㌛; クローネ; クローネ; ) SQUARE KUROONE +331C;331C;331C;30B1 30FC 30B9;30B1 30FC 30B9; # (㌜; ㌜; ㌜; ケース; ケース; ) SQUARE KEESU +331D;331D;331D;30B3 30EB 30CA;30B3 30EB 30CA; # (㌝; ㌝; ㌝; コルナ; コルナ; ) SQUARE KORUNA +331E;331E;331E;30B3 30FC 30DD;30B3 30FC 30DB 309A; # (㌞; ㌞; ㌞; コーポ; コーホ◌゚; ) SQUARE KOOPO +331F;331F;331F;30B5 30A4 30AF 30EB;30B5 30A4 30AF 30EB; # (㌟; ㌟; ㌟; サイクル; サイクル; ) SQUARE SAIKURU +3320;3320;3320;30B5 30F3 30C1 30FC 30E0;30B5 30F3 30C1 30FC 30E0; # (㌠; ㌠; ㌠; サンチーム; サンチーム; ) SQUARE SANTIIMU +3321;3321;3321;30B7 30EA 30F3 30B0;30B7 30EA 30F3 30AF 3099; # (㌡; ㌡; ㌡; シリング; シリンク◌゙; ) SQUARE SIRINGU +3322;3322;3322;30BB 30F3 30C1;30BB 30F3 30C1; # (㌢; ㌢; ㌢; センチ; センチ; ) SQUARE SENTI +3323;3323;3323;30BB 30F3 30C8;30BB 30F3 30C8; # (㌣; ㌣; ㌣; セント; セント; ) SQUARE SENTO +3324;3324;3324;30C0 30FC 30B9;30BF 3099 30FC 30B9; # (㌤; ㌤; ㌤; ダース; タ◌゙ース; ) SQUARE DAASU +3325;3325;3325;30C7 30B7;30C6 3099 30B7; # (㌥; ㌥; ㌥; デシ; テ◌゙シ; ) SQUARE DESI +3326;3326;3326;30C9 30EB;30C8 3099 30EB; # (㌦; ㌦; ㌦; ドル; ト◌゙ル; ) SQUARE DORU +3327;3327;3327;30C8 30F3;30C8 30F3; # (㌧; ㌧; ㌧; トン; トン; ) SQUARE TON +3328;3328;3328;30CA 30CE;30CA 30CE; # (㌨; ㌨; ㌨; ナノ; ナノ; ) SQUARE NANO +3329;3329;3329;30CE 30C3 30C8;30CE 30C3 30C8; # (㌩; ㌩; ㌩; ノット; ノット; ) SQUARE NOTTO +332A;332A;332A;30CF 30A4 30C4;30CF 30A4 30C4; # (㌪; ㌪; ㌪; ハイツ; ハイツ; ) SQUARE HAITU +332B;332B;332B;30D1 30FC 30BB 30F3 30C8;30CF 309A 30FC 30BB 30F3 30C8; # (㌫; ㌫; ㌫; パーセント; ハ◌゚ーセント; ) SQUARE PAASENTO +332C;332C;332C;30D1 30FC 30C4;30CF 309A 30FC 30C4; # (㌬; ㌬; ㌬; パーツ; ハ◌゚ーツ; ) SQUARE PAATU +332D;332D;332D;30D0 30FC 30EC 30EB;30CF 3099 30FC 30EC 30EB; # (㌭; ㌭; ㌭; バーレル; ハ◌゙ーレル; ) SQUARE BAARERU +332E;332E;332E;30D4 30A2 30B9 30C8 30EB;30D2 309A 30A2 30B9 30C8 30EB; # (㌮; ㌮; ㌮; ピアストル; ヒ◌゚アストル; ) SQUARE PIASUTORU +332F;332F;332F;30D4 30AF 30EB;30D2 309A 30AF 30EB; # (㌯; ㌯; ㌯; ピクル; ヒ◌゚クル; ) SQUARE PIKURU +3330;3330;3330;30D4 30B3;30D2 309A 30B3; # (㌰; ㌰; ㌰; ピコ; ヒ◌゚コ; ) SQUARE PIKO +3331;3331;3331;30D3 30EB;30D2 3099 30EB; # (㌱; ㌱; ㌱; ビル; ヒ◌゙ル; ) SQUARE BIRU +3332;3332;3332;30D5 30A1 30E9 30C3 30C9;30D5 30A1 30E9 30C3 30C8 3099; # (㌲; ㌲; ㌲; ファラッド; ファラット◌゙; ) SQUARE HUARADDO +3333;3333;3333;30D5 30A3 30FC 30C8;30D5 30A3 30FC 30C8; # (㌳; ㌳; ㌳; フィート; フィート; ) SQUARE HUIITO +3334;3334;3334;30D6 30C3 30B7 30A7 30EB;30D5 3099 30C3 30B7 30A7 30EB; # (㌴; ㌴; ㌴; ブッシェル; フ◌゙ッシェル; ) SQUARE BUSSYERU +3335;3335;3335;30D5 30E9 30F3;30D5 30E9 30F3; # (㌵; ㌵; ㌵; フラン; フラン; ) SQUARE HURAN +3336;3336;3336;30D8 30AF 30BF 30FC 30EB;30D8 30AF 30BF 30FC 30EB; # (㌶; ㌶; ㌶; ヘクタール; ヘクタール; ) SQUARE HEKUTAARU +3337;3337;3337;30DA 30BD;30D8 309A 30BD; # (㌷; ㌷; ㌷; ペソ; ヘ◌゚ソ; ) SQUARE PESO +3338;3338;3338;30DA 30CB 30D2;30D8 309A 30CB 30D2; # (㌸; ㌸; ㌸; ペニヒ; ヘ◌゚ニヒ; ) SQUARE PENIHI +3339;3339;3339;30D8 30EB 30C4;30D8 30EB 30C4; # (㌹; ㌹; ㌹; ヘルツ; ヘルツ; ) SQUARE HERUTU +333A;333A;333A;30DA 30F3 30B9;30D8 309A 30F3 30B9; # (㌺; ㌺; ㌺; ペンス; ヘ◌゚ンス; ) SQUARE PENSU +333B;333B;333B;30DA 30FC 30B8;30D8 309A 30FC 30B7 3099; # (㌻; ㌻; ㌻; ページ; ヘ◌゚ーシ◌゙; ) SQUARE PEEZI +333C;333C;333C;30D9 30FC 30BF;30D8 3099 30FC 30BF; # (㌼; ㌼; ㌼; ベータ; ヘ◌゙ータ; ) SQUARE BEETA +333D;333D;333D;30DD 30A4 30F3 30C8;30DB 309A 30A4 30F3 30C8; # (㌽; ㌽; ㌽; ポイント; ホ◌゚イント; ) SQUARE POINTO +333E;333E;333E;30DC 30EB 30C8;30DB 3099 30EB 30C8; # (㌾; ㌾; ㌾; ボルト; ホ◌゙ルト; ) SQUARE BORUTO +333F;333F;333F;30DB 30F3;30DB 30F3; # (㌿; ㌿; ㌿; ホン; ホン; ) SQUARE HON +3340;3340;3340;30DD 30F3 30C9;30DB 309A 30F3 30C8 3099; # (㍀; ㍀; ㍀; ポンド; ホ◌゚ント◌゙; ) SQUARE PONDO +3341;3341;3341;30DB 30FC 30EB;30DB 30FC 30EB; # (㍁; ㍁; ㍁; ホール; ホール; ) SQUARE HOORU +3342;3342;3342;30DB 30FC 30F3;30DB 30FC 30F3; # (㍂; ㍂; ㍂; ホーン; ホーン; ) SQUARE HOON +3343;3343;3343;30DE 30A4 30AF 30ED;30DE 30A4 30AF 30ED; # (㍃; ㍃; ㍃; マイクロ; マイクロ; ) SQUARE MAIKURO +3344;3344;3344;30DE 30A4 30EB;30DE 30A4 30EB; # (㍄; ㍄; ㍄; マイル; マイル; ) SQUARE MAIRU +3345;3345;3345;30DE 30C3 30CF;30DE 30C3 30CF; # (㍅; ㍅; ㍅; マッハ; マッハ; ) SQUARE MAHHA +3346;3346;3346;30DE 30EB 30AF;30DE 30EB 30AF; # (㍆; ㍆; ㍆; マルク; マルク; ) SQUARE MARUKU +3347;3347;3347;30DE 30F3 30B7 30E7 30F3;30DE 30F3 30B7 30E7 30F3; # (㍇; ㍇; ㍇; マンション; マンション; ) SQUARE MANSYON +3348;3348;3348;30DF 30AF 30ED 30F3;30DF 30AF 30ED 30F3; # (㍈; ㍈; ㍈; ミクロン; ミクロン; ) SQUARE MIKURON +3349;3349;3349;30DF 30EA;30DF 30EA; # (㍉; ㍉; ㍉; ミリ; ミリ; ) SQUARE MIRI +334A;334A;334A;30DF 30EA 30D0 30FC 30EB;30DF 30EA 30CF 3099 30FC 30EB; # (㍊; ㍊; ㍊; ミリバール; ミリハ◌゙ール; ) SQUARE MIRIBAARU +334B;334B;334B;30E1 30AC;30E1 30AB 3099; # (㍋; ㍋; ㍋; メガ; メカ◌゙; ) SQUARE MEGA +334C;334C;334C;30E1 30AC 30C8 30F3;30E1 30AB 3099 30C8 30F3; # (㍌; ㍌; ㍌; メガトン; メカ◌゙トン; ) SQUARE MEGATON +334D;334D;334D;30E1 30FC 30C8 30EB;30E1 30FC 30C8 30EB; # (㍍; ㍍; ㍍; メートル; メートル; ) SQUARE MEETORU +334E;334E;334E;30E4 30FC 30C9;30E4 30FC 30C8 3099; # (㍎; ㍎; ㍎; ヤード; ヤート◌゙; ) SQUARE YAADO +334F;334F;334F;30E4 30FC 30EB;30E4 30FC 30EB; # (㍏; ㍏; ㍏; ヤール; ヤール; ) SQUARE YAARU +3350;3350;3350;30E6 30A2 30F3;30E6 30A2 30F3; # (㍐; ㍐; ㍐; ユアン; ユアン; ) SQUARE YUAN +3351;3351;3351;30EA 30C3 30C8 30EB;30EA 30C3 30C8 30EB; # (㍑; ㍑; ㍑; リットル; リットル; ) SQUARE RITTORU +3352;3352;3352;30EA 30E9;30EA 30E9; # (㍒; ㍒; ㍒; リラ; リラ; ) SQUARE RIRA +3353;3353;3353;30EB 30D4 30FC;30EB 30D2 309A 30FC; # (㍓; ㍓; ㍓; ルピー; ルヒ◌゚ー; ) SQUARE RUPII +3354;3354;3354;30EB 30FC 30D6 30EB;30EB 30FC 30D5 3099 30EB; # (㍔; ㍔; ㍔; ルーブル; ルーフ◌゙ル; ) SQUARE RUUBURU +3355;3355;3355;30EC 30E0;30EC 30E0; # (㍕; ㍕; ㍕; レム; レム; ) SQUARE REMU +3356;3356;3356;30EC 30F3 30C8 30B2 30F3;30EC 30F3 30C8 30B1 3099 30F3; # (㍖; ㍖; ㍖; レントゲン; レントケ◌゙ン; ) SQUARE RENTOGEN +3357;3357;3357;30EF 30C3 30C8;30EF 30C3 30C8; # (㍗; ㍗; ㍗; ワット; ワット; ) SQUARE WATTO +3358;3358;3358;0030 70B9;0030 70B9; # (㍘; ㍘; ㍘; 0点; 0点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +3359;3359;3359;0031 70B9;0031 70B9; # (㍙; ㍙; ㍙; 1点; 1点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +335A;335A;335A;0032 70B9;0032 70B9; # (㍚; ㍚; ㍚; 2点; 2点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +335B;335B;335B;0033 70B9;0033 70B9; # (㍛; ㍛; ㍛; 3点; 3点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +335C;335C;335C;0034 70B9;0034 70B9; # (㍜; ㍜; ㍜; 4点; 4点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +335D;335D;335D;0035 70B9;0035 70B9; # (㍝; ㍝; ㍝; 5点; 5点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +335E;335E;335E;0036 70B9;0036 70B9; # (㍞; ㍞; ㍞; 6点; 6点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +335F;335F;335F;0037 70B9;0037 70B9; # (㍟; ㍟; ㍟; 7点; 7点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +3360;3360;3360;0038 70B9;0038 70B9; # (㍠; ㍠; ㍠; 8点; 8点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +3361;3361;3361;0039 70B9;0039 70B9; # (㍡; ㍡; ㍡; 9点; 9点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +3362;3362;3362;0031 0030 70B9;0031 0030 70B9; # (㍢; ㍢; ㍢; 10点; 10点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +3363;3363;3363;0031 0031 70B9;0031 0031 70B9; # (㍣; ㍣; ㍣; 11点; 11点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +3364;3364;3364;0031 0032 70B9;0031 0032 70B9; # (㍤; ㍤; ㍤; 12点; 12点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +3365;3365;3365;0031 0033 70B9;0031 0033 70B9; # (㍥; ㍥; ㍥; 13点; 13点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +3366;3366;3366;0031 0034 70B9;0031 0034 70B9; # (㍦; ㍦; ㍦; 14点; 14点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +3367;3367;3367;0031 0035 70B9;0031 0035 70B9; # (㍧; ㍧; ㍧; 15点; 15点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +3368;3368;3368;0031 0036 70B9;0031 0036 70B9; # (㍨; ㍨; ㍨; 16点; 16点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +3369;3369;3369;0031 0037 70B9;0031 0037 70B9; # (㍩; ㍩; ㍩; 17点; 17点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +336A;336A;336A;0031 0038 70B9;0031 0038 70B9; # (㍪; ㍪; ㍪; 18点; 18点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +336B;336B;336B;0031 0039 70B9;0031 0039 70B9; # (㍫; ㍫; ㍫; 19点; 19点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +336C;336C;336C;0032 0030 70B9;0032 0030 70B9; # (㍬; ㍬; ㍬; 20点; 20点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +336D;336D;336D;0032 0031 70B9;0032 0031 70B9; # (㍭; ㍭; ㍭; 21点; 21点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +336E;336E;336E;0032 0032 70B9;0032 0032 70B9; # (㍮; ㍮; ㍮; 22点; 22点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +336F;336F;336F;0032 0033 70B9;0032 0033 70B9; # (㍯; ㍯; ㍯; 23点; 23点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3370;3370;3370;0032 0034 70B9;0032 0034 70B9; # (㍰; ㍰; ㍰; 24点; 24点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3371;3371;3371;0068 0050 0061;0068 0050 0061; # (㍱; ㍱; ㍱; hPa; hPa; ) SQUARE HPA +3372;3372;3372;0064 0061;0064 0061; # (㍲; ㍲; ㍲; da; da; ) SQUARE DA +3373;3373;3373;0041 0055;0041 0055; # (㍳; ㍳; ㍳; AU; AU; ) SQUARE AU +3374;3374;3374;0062 0061 0072;0062 0061 0072; # (㍴; ㍴; ㍴; bar; bar; ) SQUARE BAR +3375;3375;3375;006F 0056;006F 0056; # (㍵; ㍵; ㍵; oV; oV; ) SQUARE OV +3376;3376;3376;0070 0063;0070 0063; # (㍶; ㍶; ㍶; pc; pc; ) SQUARE PC +337B;337B;337B;5E73 6210;5E73 6210; # (㍻; ㍻; ㍻; 平成; 平成; ) SQUARE ERA NAME HEISEI +337C;337C;337C;662D 548C;662D 548C; # (㍼; ㍼; ㍼; 昭和; 昭和; ) SQUARE ERA NAME SYOUWA +337D;337D;337D;5927 6B63;5927 6B63; # (㍽; ㍽; ㍽; 大正; 大正; ) SQUARE ERA NAME TAISYOU +337E;337E;337E;660E 6CBB;660E 6CBB; # (㍾; ㍾; ㍾; 明治; 明治; ) SQUARE ERA NAME MEIZI +337F;337F;337F;682A 5F0F 4F1A 793E;682A 5F0F 4F1A 793E; # (㍿; ㍿; ㍿; 株式会社; 株式会社; ) SQUARE CORPORATION +3380;3380;3380;0070 0041;0070 0041; # (㎀; ㎀; ㎀; pA; pA; ) SQUARE PA AMPS +3381;3381;3381;006E 0041;006E 0041; # (㎁; ㎁; ㎁; nA; nA; ) SQUARE NA +3382;3382;3382;03BC 0041;03BC 0041; # (㎂; ㎂; ㎂; μA; μA; ) SQUARE MU A +3383;3383;3383;006D 0041;006D 0041; # (㎃; ㎃; ㎃; mA; mA; ) SQUARE MA +3384;3384;3384;006B 0041;006B 0041; # (㎄; ㎄; ㎄; kA; kA; ) SQUARE KA +3385;3385;3385;004B 0042;004B 0042; # (㎅; ㎅; ㎅; KB; KB; ) SQUARE KB +3386;3386;3386;004D 0042;004D 0042; # (㎆; ㎆; ㎆; MB; MB; ) SQUARE MB +3387;3387;3387;0047 0042;0047 0042; # (㎇; ㎇; ㎇; GB; GB; ) SQUARE GB +3388;3388;3388;0063 0061 006C;0063 0061 006C; # (㎈; ㎈; ㎈; cal; cal; ) SQUARE CAL +3389;3389;3389;006B 0063 0061 006C;006B 0063 0061 006C; # (㎉; ㎉; ㎉; kcal; kcal; ) SQUARE KCAL +338A;338A;338A;0070 0046;0070 0046; # (㎊; ㎊; ㎊; pF; pF; ) SQUARE PF +338B;338B;338B;006E 0046;006E 0046; # (㎋; ㎋; ㎋; nF; nF; ) SQUARE NF +338C;338C;338C;03BC 0046;03BC 0046; # (㎌; ㎌; ㎌; μF; μF; ) SQUARE MU F +338D;338D;338D;03BC 0067;03BC 0067; # (㎍; ㎍; ㎍; μg; μg; ) SQUARE MU G +338E;338E;338E;006D 0067;006D 0067; # (㎎; ㎎; ㎎; mg; mg; ) SQUARE MG +338F;338F;338F;006B 0067;006B 0067; # (㎏; ㎏; ㎏; kg; kg; ) SQUARE KG +3390;3390;3390;0048 007A;0048 007A; # (㎐; ㎐; ㎐; Hz; Hz; ) SQUARE HZ +3391;3391;3391;006B 0048 007A;006B 0048 007A; # (㎑; ㎑; ㎑; kHz; kHz; ) SQUARE KHZ +3392;3392;3392;004D 0048 007A;004D 0048 007A; # (㎒; ㎒; ㎒; MHz; MHz; ) SQUARE MHZ +3393;3393;3393;0047 0048 007A;0047 0048 007A; # (㎓; ㎓; ㎓; GHz; GHz; ) SQUARE GHZ +3394;3394;3394;0054 0048 007A;0054 0048 007A; # (㎔; ㎔; ㎔; THz; THz; ) SQUARE THZ +3395;3395;3395;03BC 006C;03BC 006C; # (㎕; ㎕; ㎕; μl; μl; ) SQUARE MU L +3396;3396;3396;006D 006C;006D 006C; # (㎖; ㎖; ㎖; ml; ml; ) SQUARE ML +3397;3397;3397;0064 006C;0064 006C; # (㎗; ㎗; ㎗; dl; dl; ) SQUARE DL +3398;3398;3398;006B 006C;006B 006C; # (㎘; ㎘; ㎘; kl; kl; ) SQUARE KL +3399;3399;3399;0066 006D;0066 006D; # (㎙; ㎙; ㎙; fm; fm; ) SQUARE FM +339A;339A;339A;006E 006D;006E 006D; # (㎚; ㎚; ㎚; nm; nm; ) SQUARE NM +339B;339B;339B;03BC 006D;03BC 006D; # (㎛; ㎛; ㎛; μm; μm; ) SQUARE MU M +339C;339C;339C;006D 006D;006D 006D; # (㎜; ㎜; ㎜; mm; mm; ) SQUARE MM +339D;339D;339D;0063 006D;0063 006D; # (㎝; ㎝; ㎝; cm; cm; ) SQUARE CM +339E;339E;339E;006B 006D;006B 006D; # (㎞; ㎞; ㎞; km; km; ) SQUARE KM +339F;339F;339F;006D 006D 0032;006D 006D 0032; # (㎟; ㎟; ㎟; mm2; mm2; ) SQUARE MM SQUARED +33A0;33A0;33A0;0063 006D 0032;0063 006D 0032; # (㎠; ㎠; ㎠; cm2; cm2; ) SQUARE CM SQUARED +33A1;33A1;33A1;006D 0032;006D 0032; # (㎡; ㎡; ㎡; m2; m2; ) SQUARE M SQUARED +33A2;33A2;33A2;006B 006D 0032;006B 006D 0032; # (㎢; ㎢; ㎢; km2; km2; ) SQUARE KM SQUARED +33A3;33A3;33A3;006D 006D 0033;006D 006D 0033; # (㎣; ㎣; ㎣; mm3; mm3; ) SQUARE MM CUBED +33A4;33A4;33A4;0063 006D 0033;0063 006D 0033; # (㎤; ㎤; ㎤; cm3; cm3; ) SQUARE CM CUBED +33A5;33A5;33A5;006D 0033;006D 0033; # (㎥; ㎥; ㎥; m3; m3; ) SQUARE M CUBED +33A6;33A6;33A6;006B 006D 0033;006B 006D 0033; # (㎦; ㎦; ㎦; km3; km3; ) SQUARE KM CUBED +33A7;33A7;33A7;006D 2215 0073;006D 2215 0073; # (㎧; ㎧; ㎧; m∕s; m∕s; ) SQUARE M OVER S +33A8;33A8;33A8;006D 2215 0073 0032;006D 2215 0073 0032; # (㎨; ㎨; ㎨; m∕s2; m∕s2; ) SQUARE M OVER S SQUARED +33A9;33A9;33A9;0050 0061;0050 0061; # (㎩; ㎩; ㎩; Pa; Pa; ) SQUARE PA +33AA;33AA;33AA;006B 0050 0061;006B 0050 0061; # (㎪; ㎪; ㎪; kPa; kPa; ) SQUARE KPA +33AB;33AB;33AB;004D 0050 0061;004D 0050 0061; # (㎫; ㎫; ㎫; MPa; MPa; ) SQUARE MPA +33AC;33AC;33AC;0047 0050 0061;0047 0050 0061; # (㎬; ㎬; ㎬; GPa; GPa; ) SQUARE GPA +33AD;33AD;33AD;0072 0061 0064;0072 0061 0064; # (㎭; ㎭; ㎭; rad; rad; ) SQUARE RAD +33AE;33AE;33AE;0072 0061 0064 2215 0073;0072 0061 0064 2215 0073; # (㎮; ㎮; ㎮; rad∕s; rad∕s; ) SQUARE RAD OVER S +33AF;33AF;33AF;0072 0061 0064 2215 0073 0032;0072 0061 0064 2215 0073 0032; # (㎯; ㎯; ㎯; rad∕s2; rad∕s2; ) SQUARE RAD OVER S SQUARED +33B0;33B0;33B0;0070 0073;0070 0073; # (㎰; ㎰; ㎰; ps; ps; ) SQUARE PS +33B1;33B1;33B1;006E 0073;006E 0073; # (㎱; ㎱; ㎱; ns; ns; ) SQUARE NS +33B2;33B2;33B2;03BC 0073;03BC 0073; # (㎲; ㎲; ㎲; μs; μs; ) SQUARE MU S +33B3;33B3;33B3;006D 0073;006D 0073; # (㎳; ㎳; ㎳; ms; ms; ) SQUARE MS +33B4;33B4;33B4;0070 0056;0070 0056; # (㎴; ㎴; ㎴; pV; pV; ) SQUARE PV +33B5;33B5;33B5;006E 0056;006E 0056; # (㎵; ㎵; ㎵; nV; nV; ) SQUARE NV +33B6;33B6;33B6;03BC 0056;03BC 0056; # (㎶; ㎶; ㎶; μV; μV; ) SQUARE MU V +33B7;33B7;33B7;006D 0056;006D 0056; # (㎷; ㎷; ㎷; mV; mV; ) SQUARE MV +33B8;33B8;33B8;006B 0056;006B 0056; # (㎸; ㎸; ㎸; kV; kV; ) SQUARE KV +33B9;33B9;33B9;004D 0056;004D 0056; # (㎹; ㎹; ㎹; MV; MV; ) SQUARE MV MEGA +33BA;33BA;33BA;0070 0057;0070 0057; # (㎺; ㎺; ㎺; pW; pW; ) SQUARE PW +33BB;33BB;33BB;006E 0057;006E 0057; # (㎻; ㎻; ㎻; nW; nW; ) SQUARE NW +33BC;33BC;33BC;03BC 0057;03BC 0057; # (㎼; ㎼; ㎼; μW; μW; ) SQUARE MU W +33BD;33BD;33BD;006D 0057;006D 0057; # (㎽; ㎽; ㎽; mW; mW; ) SQUARE MW +33BE;33BE;33BE;006B 0057;006B 0057; # (㎾; ㎾; ㎾; kW; kW; ) SQUARE KW +33BF;33BF;33BF;004D 0057;004D 0057; # (㎿; ㎿; ㎿; MW; MW; ) SQUARE MW MEGA +33C0;33C0;33C0;006B 03A9;006B 03A9; # (㏀; ㏀; ㏀; kΩ; kΩ; ) SQUARE K OHM +33C1;33C1;33C1;004D 03A9;004D 03A9; # (㏁; ㏁; ㏁; MΩ; MΩ; ) SQUARE M OHM +33C2;33C2;33C2;0061 002E 006D 002E;0061 002E 006D 002E; # (㏂; ㏂; ㏂; a.m.; a.m.; ) SQUARE AM +33C3;33C3;33C3;0042 0071;0042 0071; # (㏃; ㏃; ㏃; Bq; Bq; ) SQUARE BQ +33C4;33C4;33C4;0063 0063;0063 0063; # (㏄; ㏄; ㏄; cc; cc; ) SQUARE CC +33C5;33C5;33C5;0063 0064;0063 0064; # (㏅; ㏅; ㏅; cd; cd; ) SQUARE CD +33C6;33C6;33C6;0043 2215 006B 0067;0043 2215 006B 0067; # (㏆; ㏆; ㏆; C∕kg; C∕kg; ) SQUARE C OVER KG +33C7;33C7;33C7;0043 006F 002E;0043 006F 002E; # (㏇; ㏇; ㏇; Co.; Co.; ) SQUARE CO +33C8;33C8;33C8;0064 0042;0064 0042; # (㏈; ㏈; ㏈; dB; dB; ) SQUARE DB +33C9;33C9;33C9;0047 0079;0047 0079; # (㏉; ㏉; ㏉; Gy; Gy; ) SQUARE GY +33CA;33CA;33CA;0068 0061;0068 0061; # (㏊; ㏊; ㏊; ha; ha; ) SQUARE HA +33CB;33CB;33CB;0048 0050;0048 0050; # (㏋; ㏋; ㏋; HP; HP; ) SQUARE HP +33CC;33CC;33CC;0069 006E;0069 006E; # (㏌; ㏌; ㏌; in; in; ) SQUARE IN +33CD;33CD;33CD;004B 004B;004B 004B; # (㏍; ㏍; ㏍; KK; KK; ) SQUARE KK +33CE;33CE;33CE;004B 004D;004B 004D; # (㏎; ㏎; ㏎; KM; KM; ) SQUARE KM CAPITAL +33CF;33CF;33CF;006B 0074;006B 0074; # (㏏; ㏏; ㏏; kt; kt; ) SQUARE KT +33D0;33D0;33D0;006C 006D;006C 006D; # (㏐; ㏐; ㏐; lm; lm; ) SQUARE LM +33D1;33D1;33D1;006C 006E;006C 006E; # (㏑; ㏑; ㏑; ln; ln; ) SQUARE LN +33D2;33D2;33D2;006C 006F 0067;006C 006F 0067; # (㏒; ㏒; ㏒; log; log; ) SQUARE LOG +33D3;33D3;33D3;006C 0078;006C 0078; # (㏓; ㏓; ㏓; lx; lx; ) SQUARE LX +33D4;33D4;33D4;006D 0062;006D 0062; # (㏔; ㏔; ㏔; mb; mb; ) SQUARE MB SMALL +33D5;33D5;33D5;006D 0069 006C;006D 0069 006C; # (㏕; ㏕; ㏕; mil; mil; ) SQUARE MIL +33D6;33D6;33D6;006D 006F 006C;006D 006F 006C; # (㏖; ㏖; ㏖; mol; mol; ) SQUARE MOL +33D7;33D7;33D7;0050 0048;0050 0048; # (㏗; ㏗; ㏗; PH; PH; ) SQUARE PH +33D8;33D8;33D8;0070 002E 006D 002E;0070 002E 006D 002E; # (㏘; ㏘; ㏘; p.m.; p.m.; ) SQUARE PM +33D9;33D9;33D9;0050 0050 004D;0050 0050 004D; # (㏙; ㏙; ㏙; PPM; PPM; ) SQUARE PPM +33DA;33DA;33DA;0050 0052;0050 0052; # (㏚; ㏚; ㏚; PR; PR; ) SQUARE PR +33DB;33DB;33DB;0073 0072;0073 0072; # (㏛; ㏛; ㏛; sr; sr; ) SQUARE SR +33DC;33DC;33DC;0053 0076;0053 0076; # (㏜; ㏜; ㏜; Sv; Sv; ) SQUARE SV +33DD;33DD;33DD;0057 0062;0057 0062; # (㏝; ㏝; ㏝; Wb; Wb; ) SQUARE WB +33E0;33E0;33E0;0031 65E5;0031 65E5; # (㏠; ㏠; ㏠; 1日; 1日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +33E1;33E1;33E1;0032 65E5;0032 65E5; # (㏡; ㏡; ㏡; 2日; 2日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +33E2;33E2;33E2;0033 65E5;0033 65E5; # (㏢; ㏢; ㏢; 3日; 3日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +33E3;33E3;33E3;0034 65E5;0034 65E5; # (㏣; ㏣; ㏣; 4日; 4日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +33E4;33E4;33E4;0035 65E5;0035 65E5; # (㏤; ㏤; ㏤; 5日; 5日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +33E5;33E5;33E5;0036 65E5;0036 65E5; # (㏥; ㏥; ㏥; 6日; 6日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +33E6;33E6;33E6;0037 65E5;0037 65E5; # (㏦; ㏦; ㏦; 7日; 7日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +33E7;33E7;33E7;0038 65E5;0038 65E5; # (㏧; ㏧; ㏧; 8日; 8日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +33E8;33E8;33E8;0039 65E5;0039 65E5; # (㏨; ㏨; ㏨; 9日; 9日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +33E9;33E9;33E9;0031 0030 65E5;0031 0030 65E5; # (㏩; ㏩; ㏩; 10日; 10日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +33EA;33EA;33EA;0031 0031 65E5;0031 0031 65E5; # (㏪; ㏪; ㏪; 11日; 11日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +33EB;33EB;33EB;0031 0032 65E5;0031 0032 65E5; # (㏫; ㏫; ㏫; 12日; 12日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +33EC;33EC;33EC;0031 0033 65E5;0031 0033 65E5; # (㏬; ㏬; ㏬; 13日; 13日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +33ED;33ED;33ED;0031 0034 65E5;0031 0034 65E5; # (㏭; ㏭; ㏭; 14日; 14日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +33EE;33EE;33EE;0031 0035 65E5;0031 0035 65E5; # (㏮; ㏮; ㏮; 15日; 15日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +33EF;33EF;33EF;0031 0036 65E5;0031 0036 65E5; # (㏯; ㏯; ㏯; 16日; 16日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +33F0;33F0;33F0;0031 0037 65E5;0031 0037 65E5; # (㏰; ㏰; ㏰; 17日; 17日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +33F1;33F1;33F1;0031 0038 65E5;0031 0038 65E5; # (㏱; ㏱; ㏱; 18日; 18日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +33F2;33F2;33F2;0031 0039 65E5;0031 0039 65E5; # (㏲; ㏲; ㏲; 19日; 19日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +33F3;33F3;33F3;0032 0030 65E5;0032 0030 65E5; # (㏳; ㏳; ㏳; 20日; 20日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +33F4;33F4;33F4;0032 0031 65E5;0032 0031 65E5; # (㏴; ㏴; ㏴; 21日; 21日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +33F5;33F5;33F5;0032 0032 65E5;0032 0032 65E5; # (㏵; ㏵; ㏵; 22日; 22日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +33F6;33F6;33F6;0032 0033 65E5;0032 0033 65E5; # (㏶; ㏶; ㏶; 23日; 23日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +33F7;33F7;33F7;0032 0034 65E5;0032 0034 65E5; # (㏷; ㏷; ㏷; 24日; 24日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +33F8;33F8;33F8;0032 0035 65E5;0032 0035 65E5; # (㏸; ㏸; ㏸; 25日; 25日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +33F9;33F9;33F9;0032 0036 65E5;0032 0036 65E5; # (㏹; ㏹; ㏹; 26日; 26日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +33FA;33FA;33FA;0032 0037 65E5;0032 0037 65E5; # (㏺; ㏺; ㏺; 27日; 27日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +33FB;33FB;33FB;0032 0038 65E5;0032 0038 65E5; # (㏻; ㏻; ㏻; 28日; 28日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +33FC;33FC;33FC;0032 0039 65E5;0032 0039 65E5; # (㏼; ㏼; ㏼; 29日; 29日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33FD;33FD;33FD;0033 0030 65E5;0033 0030 65E5; # (㏽; ㏽; ㏽; 30日; 30日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +33FE;33FE;33FE;0033 0031 65E5;0033 0031 65E5; # (㏾; ㏾; ㏾; 31日; 31日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +AC00;AC00;1100 1161;AC00;1100 1161; # (가; 가; 가; 가; 가; ) HANGUL SYLLABLE GA +AC01;AC01;1100 1161 11A8;AC01;1100 1161 11A8; # (각; 각; 각; 각; 각; ) HANGUL SYLLABLE GAG +AC02;AC02;1100 1161 11A9;AC02;1100 1161 11A9; # (갂; 갂; 갂; 갂; 갂; ) HANGUL SYLLABLE GAGG +AC03;AC03;1100 1161 11AA;AC03;1100 1161 11AA; # (갃; 갃; 갃; 갃; 갃; ) HANGUL SYLLABLE GAGS +AC04;AC04;1100 1161 11AB;AC04;1100 1161 11AB; # (간; 간; 간; 간; 간; ) HANGUL SYLLABLE GAN +AC05;AC05;1100 1161 11AC;AC05;1100 1161 11AC; # (갅; 갅; 갅; 갅; 갅; ) HANGUL SYLLABLE GANJ +AC06;AC06;1100 1161 11AD;AC06;1100 1161 11AD; # (갆; 갆; 갆; 갆; 갆; ) HANGUL SYLLABLE GANH +AC07;AC07;1100 1161 11AE;AC07;1100 1161 11AE; # (갇; 갇; 갇; 갇; 갇; ) HANGUL SYLLABLE GAD +AC08;AC08;1100 1161 11AF;AC08;1100 1161 11AF; # (갈; 갈; 갈; 갈; 갈; ) HANGUL SYLLABLE GAL +AC09;AC09;1100 1161 11B0;AC09;1100 1161 11B0; # (갉; 갉; 갉; 갉; 갉; ) HANGUL SYLLABLE GALG +AC0A;AC0A;1100 1161 11B1;AC0A;1100 1161 11B1; # (갊; 갊; 갊; 갊; 갊; ) HANGUL SYLLABLE GALM +AC0B;AC0B;1100 1161 11B2;AC0B;1100 1161 11B2; # (갋; 갋; 갋; 갋; 갋; ) HANGUL SYLLABLE GALB +AC0C;AC0C;1100 1161 11B3;AC0C;1100 1161 11B3; # (갌; 갌; 갌; 갌; 갌; ) HANGUL SYLLABLE GALS +AC0D;AC0D;1100 1161 11B4;AC0D;1100 1161 11B4; # (갍; 갍; 갍; 갍; 갍; ) HANGUL SYLLABLE GALT +AC0E;AC0E;1100 1161 11B5;AC0E;1100 1161 11B5; # (갎; 갎; 갎; 갎; 갎; ) HANGUL SYLLABLE GALP +AC0F;AC0F;1100 1161 11B6;AC0F;1100 1161 11B6; # (갏; 갏; 갏; 갏; 갏; ) HANGUL SYLLABLE GALH +AC10;AC10;1100 1161 11B7;AC10;1100 1161 11B7; # (감; 감; 감; 감; 감; ) HANGUL SYLLABLE GAM +AC11;AC11;1100 1161 11B8;AC11;1100 1161 11B8; # (갑; 갑; 갑; 갑; 갑; ) HANGUL SYLLABLE GAB +AC12;AC12;1100 1161 11B9;AC12;1100 1161 11B9; # (값; 값; 값; 값; 값; ) HANGUL SYLLABLE GABS +AC13;AC13;1100 1161 11BA;AC13;1100 1161 11BA; # (갓; 갓; 갓; 갓; 갓; ) HANGUL SYLLABLE GAS +AC14;AC14;1100 1161 11BB;AC14;1100 1161 11BB; # (갔; 갔; 갔; 갔; 갔; ) HANGUL SYLLABLE GASS +AC15;AC15;1100 1161 11BC;AC15;1100 1161 11BC; # (강; 강; 강; 강; 강; ) HANGUL SYLLABLE GANG +AC16;AC16;1100 1161 11BD;AC16;1100 1161 11BD; # (갖; 갖; 갖; 갖; 갖; ) HANGUL SYLLABLE GAJ +AC17;AC17;1100 1161 11BE;AC17;1100 1161 11BE; # (갗; 갗; 갗; 갗; 갗; ) HANGUL SYLLABLE GAC +AC18;AC18;1100 1161 11BF;AC18;1100 1161 11BF; # (갘; 갘; 갘; 갘; 갘; ) HANGUL SYLLABLE GAK +AC19;AC19;1100 1161 11C0;AC19;1100 1161 11C0; # (같; 같; 같; 같; 같; ) HANGUL SYLLABLE GAT +AC1A;AC1A;1100 1161 11C1;AC1A;1100 1161 11C1; # (갚; 갚; 갚; 갚; 갚; ) HANGUL SYLLABLE GAP +AC1B;AC1B;1100 1161 11C2;AC1B;1100 1161 11C2; # (갛; 갛; 갛; 갛; 갛; ) HANGUL SYLLABLE GAH +AC1C;AC1C;1100 1162;AC1C;1100 1162; # (개; 개; 개; 개; 개; ) HANGUL SYLLABLE GAE +AC1D;AC1D;1100 1162 11A8;AC1D;1100 1162 11A8; # (객; 객; 객; 객; 객; ) HANGUL SYLLABLE GAEG +AC1E;AC1E;1100 1162 11A9;AC1E;1100 1162 11A9; # (갞; 갞; 갞; 갞; 갞; ) HANGUL SYLLABLE GAEGG +AC1F;AC1F;1100 1162 11AA;AC1F;1100 1162 11AA; # (갟; 갟; 갟; 갟; 갟; ) HANGUL SYLLABLE GAEGS +AC20;AC20;1100 1162 11AB;AC20;1100 1162 11AB; # (갠; 갠; 갠; 갠; 갠; ) HANGUL SYLLABLE GAEN +AC21;AC21;1100 1162 11AC;AC21;1100 1162 11AC; # (갡; 갡; 갡; 갡; 갡; ) HANGUL SYLLABLE GAENJ +AC22;AC22;1100 1162 11AD;AC22;1100 1162 11AD; # (갢; 갢; 갢; 갢; 갢; ) HANGUL SYLLABLE GAENH +AC23;AC23;1100 1162 11AE;AC23;1100 1162 11AE; # (갣; 갣; 갣; 갣; 갣; ) HANGUL SYLLABLE GAED +AC24;AC24;1100 1162 11AF;AC24;1100 1162 11AF; # (갤; 갤; 갤; 갤; 갤; ) HANGUL SYLLABLE GAEL +AC25;AC25;1100 1162 11B0;AC25;1100 1162 11B0; # (갥; 갥; 갥; 갥; 갥; ) HANGUL SYLLABLE GAELG +AC26;AC26;1100 1162 11B1;AC26;1100 1162 11B1; # (갦; 갦; 갦; 갦; 갦; ) HANGUL SYLLABLE GAELM +AC27;AC27;1100 1162 11B2;AC27;1100 1162 11B2; # (갧; 갧; 갧; 갧; 갧; ) HANGUL SYLLABLE GAELB +AC28;AC28;1100 1162 11B3;AC28;1100 1162 11B3; # (갨; 갨; 갨; 갨; 갨; ) HANGUL SYLLABLE GAELS +AC29;AC29;1100 1162 11B4;AC29;1100 1162 11B4; # (갩; 갩; 갩; 갩; 갩; ) HANGUL SYLLABLE GAELT +AC2A;AC2A;1100 1162 11B5;AC2A;1100 1162 11B5; # (갪; 갪; 갪; 갪; 갪; ) HANGUL SYLLABLE GAELP +AC2B;AC2B;1100 1162 11B6;AC2B;1100 1162 11B6; # (갫; 갫; 갫; 갫; 갫; ) HANGUL SYLLABLE GAELH +AC2C;AC2C;1100 1162 11B7;AC2C;1100 1162 11B7; # (갬; 갬; 갬; 갬; 갬; ) HANGUL SYLLABLE GAEM +AC2D;AC2D;1100 1162 11B8;AC2D;1100 1162 11B8; # (갭; 갭; 갭; 갭; 갭; ) HANGUL SYLLABLE GAEB +AC2E;AC2E;1100 1162 11B9;AC2E;1100 1162 11B9; # (갮; 갮; 갮; 갮; 갮; ) HANGUL SYLLABLE GAEBS +AC2F;AC2F;1100 1162 11BA;AC2F;1100 1162 11BA; # (갯; 갯; 갯; 갯; 갯; ) HANGUL SYLLABLE GAES +AC30;AC30;1100 1162 11BB;AC30;1100 1162 11BB; # (갰; 갰; 갰; 갰; 갰; ) HANGUL SYLLABLE GAESS +AC31;AC31;1100 1162 11BC;AC31;1100 1162 11BC; # (갱; 갱; 갱; 갱; 갱; ) HANGUL SYLLABLE GAENG +AC32;AC32;1100 1162 11BD;AC32;1100 1162 11BD; # (갲; 갲; 갲; 갲; 갲; ) HANGUL SYLLABLE GAEJ +AC33;AC33;1100 1162 11BE;AC33;1100 1162 11BE; # (갳; 갳; 갳; 갳; 갳; ) HANGUL SYLLABLE GAEC +AC34;AC34;1100 1162 11BF;AC34;1100 1162 11BF; # (갴; 갴; 갴; 갴; 갴; ) HANGUL SYLLABLE GAEK +AC35;AC35;1100 1162 11C0;AC35;1100 1162 11C0; # (갵; 갵; 갵; 갵; 갵; ) HANGUL SYLLABLE GAET +AC36;AC36;1100 1162 11C1;AC36;1100 1162 11C1; # (갶; 갶; 갶; 갶; 갶; ) HANGUL SYLLABLE GAEP +AC37;AC37;1100 1162 11C2;AC37;1100 1162 11C2; # (갷; 갷; 갷; 갷; 갷; ) HANGUL SYLLABLE GAEH +AC38;AC38;1100 1163;AC38;1100 1163; # (갸; 갸; 갸; 갸; 갸; ) HANGUL SYLLABLE GYA +AC39;AC39;1100 1163 11A8;AC39;1100 1163 11A8; # (갹; 갹; 갹; 갹; 갹; ) HANGUL SYLLABLE GYAG +AC3A;AC3A;1100 1163 11A9;AC3A;1100 1163 11A9; # (갺; 갺; 갺; 갺; 갺; ) HANGUL SYLLABLE GYAGG +AC3B;AC3B;1100 1163 11AA;AC3B;1100 1163 11AA; # (갻; 갻; 갻; 갻; 갻; ) HANGUL SYLLABLE GYAGS +AC3C;AC3C;1100 1163 11AB;AC3C;1100 1163 11AB; # (갼; 갼; 갼; 갼; 갼; ) HANGUL SYLLABLE GYAN +AC3D;AC3D;1100 1163 11AC;AC3D;1100 1163 11AC; # (갽; 갽; 갽; 갽; 갽; ) HANGUL SYLLABLE GYANJ +AC3E;AC3E;1100 1163 11AD;AC3E;1100 1163 11AD; # (갾; 갾; 갾; 갾; 갾; ) HANGUL SYLLABLE GYANH +AC3F;AC3F;1100 1163 11AE;AC3F;1100 1163 11AE; # (갿; 갿; 갿; 갿; 갿; ) HANGUL SYLLABLE GYAD +AC40;AC40;1100 1163 11AF;AC40;1100 1163 11AF; # (걀; 걀; 걀; 걀; 걀; ) HANGUL SYLLABLE GYAL +AC41;AC41;1100 1163 11B0;AC41;1100 1163 11B0; # (걁; 걁; 걁; 걁; 걁; ) HANGUL SYLLABLE GYALG +AC42;AC42;1100 1163 11B1;AC42;1100 1163 11B1; # (걂; 걂; 걂; 걂; 걂; ) HANGUL SYLLABLE GYALM +AC43;AC43;1100 1163 11B2;AC43;1100 1163 11B2; # (걃; 걃; 걃; 걃; 걃; ) HANGUL SYLLABLE GYALB +AC44;AC44;1100 1163 11B3;AC44;1100 1163 11B3; # (걄; 걄; 걄; 걄; 걄; ) HANGUL SYLLABLE GYALS +AC45;AC45;1100 1163 11B4;AC45;1100 1163 11B4; # (걅; 걅; 걅; 걅; 걅; ) HANGUL SYLLABLE GYALT +AC46;AC46;1100 1163 11B5;AC46;1100 1163 11B5; # (걆; 걆; 걆; 걆; 걆; ) HANGUL SYLLABLE GYALP +AC47;AC47;1100 1163 11B6;AC47;1100 1163 11B6; # (걇; 걇; 걇; 걇; 걇; ) HANGUL SYLLABLE GYALH +AC48;AC48;1100 1163 11B7;AC48;1100 1163 11B7; # (걈; 걈; 걈; 걈; 걈; ) HANGUL SYLLABLE GYAM +AC49;AC49;1100 1163 11B8;AC49;1100 1163 11B8; # (걉; 걉; 걉; 걉; 걉; ) HANGUL SYLLABLE GYAB +AC4A;AC4A;1100 1163 11B9;AC4A;1100 1163 11B9; # (걊; 걊; 걊; 걊; 걊; ) HANGUL SYLLABLE GYABS +AC4B;AC4B;1100 1163 11BA;AC4B;1100 1163 11BA; # (걋; 걋; 걋; 걋; 걋; ) HANGUL SYLLABLE GYAS +AC4C;AC4C;1100 1163 11BB;AC4C;1100 1163 11BB; # (걌; 걌; 걌; 걌; 걌; ) HANGUL SYLLABLE GYASS +AC4D;AC4D;1100 1163 11BC;AC4D;1100 1163 11BC; # (걍; 걍; 걍; 걍; 걍; ) HANGUL SYLLABLE GYANG +AC4E;AC4E;1100 1163 11BD;AC4E;1100 1163 11BD; # (걎; 걎; 걎; 걎; 걎; ) HANGUL SYLLABLE GYAJ +AC4F;AC4F;1100 1163 11BE;AC4F;1100 1163 11BE; # (걏; 걏; 걏; 걏; 걏; ) HANGUL SYLLABLE GYAC +AC50;AC50;1100 1163 11BF;AC50;1100 1163 11BF; # (걐; 걐; 걐; 걐; 걐; ) HANGUL SYLLABLE GYAK +AC51;AC51;1100 1163 11C0;AC51;1100 1163 11C0; # (걑; 걑; 걑; 걑; 걑; ) HANGUL SYLLABLE GYAT +AC52;AC52;1100 1163 11C1;AC52;1100 1163 11C1; # (걒; 걒; 걒; 걒; 걒; ) HANGUL SYLLABLE GYAP +AC53;AC53;1100 1163 11C2;AC53;1100 1163 11C2; # (걓; 걓; 걓; 걓; 걓; ) HANGUL SYLLABLE GYAH +AC54;AC54;1100 1164;AC54;1100 1164; # (걔; 걔; 걔; 걔; 걔; ) HANGUL SYLLABLE GYAE +AC55;AC55;1100 1164 11A8;AC55;1100 1164 11A8; # (걕; 걕; 걕; 걕; 걕; ) HANGUL SYLLABLE GYAEG +AC56;AC56;1100 1164 11A9;AC56;1100 1164 11A9; # (걖; 걖; 걖; 걖; 걖; ) HANGUL SYLLABLE GYAEGG +AC57;AC57;1100 1164 11AA;AC57;1100 1164 11AA; # (걗; 걗; 걗; 걗; 걗; ) HANGUL SYLLABLE GYAEGS +AC58;AC58;1100 1164 11AB;AC58;1100 1164 11AB; # (걘; 걘; 걘; 걘; 걘; ) HANGUL SYLLABLE GYAEN +AC59;AC59;1100 1164 11AC;AC59;1100 1164 11AC; # (걙; 걙; 걙; 걙; 걙; ) HANGUL SYLLABLE GYAENJ +AC5A;AC5A;1100 1164 11AD;AC5A;1100 1164 11AD; # (걚; 걚; 걚; 걚; 걚; ) HANGUL SYLLABLE GYAENH +AC5B;AC5B;1100 1164 11AE;AC5B;1100 1164 11AE; # (걛; 걛; 걛; 걛; 걛; ) HANGUL SYLLABLE GYAED +AC5C;AC5C;1100 1164 11AF;AC5C;1100 1164 11AF; # (걜; 걜; 걜; 걜; 걜; ) HANGUL SYLLABLE GYAEL +AC5D;AC5D;1100 1164 11B0;AC5D;1100 1164 11B0; # (걝; 걝; 걝; 걝; 걝; ) HANGUL SYLLABLE GYAELG +AC5E;AC5E;1100 1164 11B1;AC5E;1100 1164 11B1; # (걞; 걞; 걞; 걞; 걞; ) HANGUL SYLLABLE GYAELM +AC5F;AC5F;1100 1164 11B2;AC5F;1100 1164 11B2; # (걟; 걟; 걟; 걟; 걟; ) HANGUL SYLLABLE GYAELB +AC60;AC60;1100 1164 11B3;AC60;1100 1164 11B3; # (걠; 걠; 걠; 걠; 걠; ) HANGUL SYLLABLE GYAELS +AC61;AC61;1100 1164 11B4;AC61;1100 1164 11B4; # (걡; 걡; 걡; 걡; 걡; ) HANGUL SYLLABLE GYAELT +AC62;AC62;1100 1164 11B5;AC62;1100 1164 11B5; # (걢; 걢; 걢; 걢; 걢; ) HANGUL SYLLABLE GYAELP +AC63;AC63;1100 1164 11B6;AC63;1100 1164 11B6; # (걣; 걣; 걣; 걣; 걣; ) HANGUL SYLLABLE GYAELH +AC64;AC64;1100 1164 11B7;AC64;1100 1164 11B7; # (걤; 걤; 걤; 걤; 걤; ) HANGUL SYLLABLE GYAEM +AC65;AC65;1100 1164 11B8;AC65;1100 1164 11B8; # (걥; 걥; 걥; 걥; 걥; ) HANGUL SYLLABLE GYAEB +AC66;AC66;1100 1164 11B9;AC66;1100 1164 11B9; # (걦; 걦; 걦; 걦; 걦; ) HANGUL SYLLABLE GYAEBS +AC67;AC67;1100 1164 11BA;AC67;1100 1164 11BA; # (걧; 걧; 걧; 걧; 걧; ) HANGUL SYLLABLE GYAES +AC68;AC68;1100 1164 11BB;AC68;1100 1164 11BB; # (걨; 걨; 걨; 걨; 걨; ) HANGUL SYLLABLE GYAESS +AC69;AC69;1100 1164 11BC;AC69;1100 1164 11BC; # (걩; 걩; 걩; 걩; 걩; ) HANGUL SYLLABLE GYAENG +AC6A;AC6A;1100 1164 11BD;AC6A;1100 1164 11BD; # (걪; 걪; 걪; 걪; 걪; ) HANGUL SYLLABLE GYAEJ +AC6B;AC6B;1100 1164 11BE;AC6B;1100 1164 11BE; # (걫; 걫; 걫; 걫; 걫; ) HANGUL SYLLABLE GYAEC +AC6C;AC6C;1100 1164 11BF;AC6C;1100 1164 11BF; # (걬; 걬; 걬; 걬; 걬; ) HANGUL SYLLABLE GYAEK +AC6D;AC6D;1100 1164 11C0;AC6D;1100 1164 11C0; # (걭; 걭; 걭; 걭; 걭; ) HANGUL SYLLABLE GYAET +AC6E;AC6E;1100 1164 11C1;AC6E;1100 1164 11C1; # (걮; 걮; 걮; 걮; 걮; ) HANGUL SYLLABLE GYAEP +AC6F;AC6F;1100 1164 11C2;AC6F;1100 1164 11C2; # (걯; 걯; 걯; 걯; 걯; ) HANGUL SYLLABLE GYAEH +AC70;AC70;1100 1165;AC70;1100 1165; # (거; 거; 거; 거; 거; ) HANGUL SYLLABLE GEO +AC71;AC71;1100 1165 11A8;AC71;1100 1165 11A8; # (걱; 걱; 걱; 걱; 걱; ) HANGUL SYLLABLE GEOG +AC72;AC72;1100 1165 11A9;AC72;1100 1165 11A9; # (걲; 걲; 걲; 걲; 걲; ) HANGUL SYLLABLE GEOGG +AC73;AC73;1100 1165 11AA;AC73;1100 1165 11AA; # (걳; 걳; 걳; 걳; 걳; ) HANGUL SYLLABLE GEOGS +AC74;AC74;1100 1165 11AB;AC74;1100 1165 11AB; # (건; 건; 건; 건; 건; ) HANGUL SYLLABLE GEON +AC75;AC75;1100 1165 11AC;AC75;1100 1165 11AC; # (걵; 걵; 걵; 걵; 걵; ) HANGUL SYLLABLE GEONJ +AC76;AC76;1100 1165 11AD;AC76;1100 1165 11AD; # (걶; 걶; 걶; 걶; 걶; ) HANGUL SYLLABLE GEONH +AC77;AC77;1100 1165 11AE;AC77;1100 1165 11AE; # (걷; 걷; 걷; 걷; 걷; ) HANGUL SYLLABLE GEOD +AC78;AC78;1100 1165 11AF;AC78;1100 1165 11AF; # (걸; 걸; 걸; 걸; 걸; ) HANGUL SYLLABLE GEOL +AC79;AC79;1100 1165 11B0;AC79;1100 1165 11B0; # (걹; 걹; 걹; 걹; 걹; ) HANGUL SYLLABLE GEOLG +AC7A;AC7A;1100 1165 11B1;AC7A;1100 1165 11B1; # (걺; 걺; 걺; 걺; 걺; ) HANGUL SYLLABLE GEOLM +AC7B;AC7B;1100 1165 11B2;AC7B;1100 1165 11B2; # (걻; 걻; 걻; 걻; 걻; ) HANGUL SYLLABLE GEOLB +AC7C;AC7C;1100 1165 11B3;AC7C;1100 1165 11B3; # (걼; 걼; 걼; 걼; 걼; ) HANGUL SYLLABLE GEOLS +AC7D;AC7D;1100 1165 11B4;AC7D;1100 1165 11B4; # (걽; 걽; 걽; 걽; 걽; ) HANGUL SYLLABLE GEOLT +AC7E;AC7E;1100 1165 11B5;AC7E;1100 1165 11B5; # (걾; 걾; 걾; 걾; 걾; ) HANGUL SYLLABLE GEOLP +AC7F;AC7F;1100 1165 11B6;AC7F;1100 1165 11B6; # (걿; 걿; 걿; 걿; 걿; ) HANGUL SYLLABLE GEOLH +AC80;AC80;1100 1165 11B7;AC80;1100 1165 11B7; # (검; 검; 검; 검; 검; ) HANGUL SYLLABLE GEOM +AC81;AC81;1100 1165 11B8;AC81;1100 1165 11B8; # (겁; 겁; 겁; 겁; 겁; ) HANGUL SYLLABLE GEOB +AC82;AC82;1100 1165 11B9;AC82;1100 1165 11B9; # (겂; 겂; 겂; 겂; 겂; ) HANGUL SYLLABLE GEOBS +AC83;AC83;1100 1165 11BA;AC83;1100 1165 11BA; # (것; 것; 것; 것; 것; ) HANGUL SYLLABLE GEOS +AC84;AC84;1100 1165 11BB;AC84;1100 1165 11BB; # (겄; 겄; 겄; 겄; 겄; ) HANGUL SYLLABLE GEOSS +AC85;AC85;1100 1165 11BC;AC85;1100 1165 11BC; # (겅; 겅; 겅; 겅; 겅; ) HANGUL SYLLABLE GEONG +AC86;AC86;1100 1165 11BD;AC86;1100 1165 11BD; # (겆; 겆; 겆; 겆; 겆; ) HANGUL SYLLABLE GEOJ +AC87;AC87;1100 1165 11BE;AC87;1100 1165 11BE; # (겇; 겇; 겇; 겇; 겇; ) HANGUL SYLLABLE GEOC +AC88;AC88;1100 1165 11BF;AC88;1100 1165 11BF; # (겈; 겈; 겈; 겈; 겈; ) HANGUL SYLLABLE GEOK +AC89;AC89;1100 1165 11C0;AC89;1100 1165 11C0; # (겉; 겉; 겉; 겉; 겉; ) HANGUL SYLLABLE GEOT +AC8A;AC8A;1100 1165 11C1;AC8A;1100 1165 11C1; # (겊; 겊; 겊; 겊; 겊; ) HANGUL SYLLABLE GEOP +AC8B;AC8B;1100 1165 11C2;AC8B;1100 1165 11C2; # (겋; 겋; 겋; 겋; 겋; ) HANGUL SYLLABLE GEOH +AC8C;AC8C;1100 1166;AC8C;1100 1166; # (게; 게; 게; 게; 게; ) HANGUL SYLLABLE GE +AC8D;AC8D;1100 1166 11A8;AC8D;1100 1166 11A8; # (겍; 겍; 겍; 겍; 겍; ) HANGUL SYLLABLE GEG +AC8E;AC8E;1100 1166 11A9;AC8E;1100 1166 11A9; # (겎; 겎; 겎; 겎; 겎; ) HANGUL SYLLABLE GEGG +AC8F;AC8F;1100 1166 11AA;AC8F;1100 1166 11AA; # (겏; 겏; 겏; 겏; 겏; ) HANGUL SYLLABLE GEGS +AC90;AC90;1100 1166 11AB;AC90;1100 1166 11AB; # (겐; 겐; 겐; 겐; 겐; ) HANGUL SYLLABLE GEN +AC91;AC91;1100 1166 11AC;AC91;1100 1166 11AC; # (겑; 겑; 겑; 겑; 겑; ) HANGUL SYLLABLE GENJ +AC92;AC92;1100 1166 11AD;AC92;1100 1166 11AD; # (겒; 겒; 겒; 겒; 겒; ) HANGUL SYLLABLE GENH +AC93;AC93;1100 1166 11AE;AC93;1100 1166 11AE; # (겓; 겓; 겓; 겓; 겓; ) HANGUL SYLLABLE GED +AC94;AC94;1100 1166 11AF;AC94;1100 1166 11AF; # (겔; 겔; 겔; 겔; 겔; ) HANGUL SYLLABLE GEL +AC95;AC95;1100 1166 11B0;AC95;1100 1166 11B0; # (겕; 겕; 겕; 겕; 겕; ) HANGUL SYLLABLE GELG +AC96;AC96;1100 1166 11B1;AC96;1100 1166 11B1; # (겖; 겖; 겖; 겖; 겖; ) HANGUL SYLLABLE GELM +AC97;AC97;1100 1166 11B2;AC97;1100 1166 11B2; # (겗; 겗; 겗; 겗; 겗; ) HANGUL SYLLABLE GELB +AC98;AC98;1100 1166 11B3;AC98;1100 1166 11B3; # (겘; 겘; 겘; 겘; 겘; ) HANGUL SYLLABLE GELS +AC99;AC99;1100 1166 11B4;AC99;1100 1166 11B4; # (겙; 겙; 겙; 겙; 겙; ) HANGUL SYLLABLE GELT +AC9A;AC9A;1100 1166 11B5;AC9A;1100 1166 11B5; # (겚; 겚; 겚; 겚; 겚; ) HANGUL SYLLABLE GELP +AC9B;AC9B;1100 1166 11B6;AC9B;1100 1166 11B6; # (겛; 겛; 겛; 겛; 겛; ) HANGUL SYLLABLE GELH +AC9C;AC9C;1100 1166 11B7;AC9C;1100 1166 11B7; # (겜; 겜; 겜; 겜; 겜; ) HANGUL SYLLABLE GEM +AC9D;AC9D;1100 1166 11B8;AC9D;1100 1166 11B8; # (겝; 겝; 겝; 겝; 겝; ) HANGUL SYLLABLE GEB +AC9E;AC9E;1100 1166 11B9;AC9E;1100 1166 11B9; # (겞; 겞; 겞; 겞; 겞; ) HANGUL SYLLABLE GEBS +AC9F;AC9F;1100 1166 11BA;AC9F;1100 1166 11BA; # (겟; 겟; 겟; 겟; 겟; ) HANGUL SYLLABLE GES +ACA0;ACA0;1100 1166 11BB;ACA0;1100 1166 11BB; # (겠; 겠; 겠; 겠; 겠; ) HANGUL SYLLABLE GESS +ACA1;ACA1;1100 1166 11BC;ACA1;1100 1166 11BC; # (겡; 겡; 겡; 겡; 겡; ) HANGUL SYLLABLE GENG +ACA2;ACA2;1100 1166 11BD;ACA2;1100 1166 11BD; # (겢; 겢; 겢; 겢; 겢; ) HANGUL SYLLABLE GEJ +ACA3;ACA3;1100 1166 11BE;ACA3;1100 1166 11BE; # (겣; 겣; 겣; 겣; 겣; ) HANGUL SYLLABLE GEC +ACA4;ACA4;1100 1166 11BF;ACA4;1100 1166 11BF; # (겤; 겤; 겤; 겤; 겤; ) HANGUL SYLLABLE GEK +ACA5;ACA5;1100 1166 11C0;ACA5;1100 1166 11C0; # (겥; 겥; 겥; 겥; 겥; ) HANGUL SYLLABLE GET +ACA6;ACA6;1100 1166 11C1;ACA6;1100 1166 11C1; # (겦; 겦; 겦; 겦; 겦; ) HANGUL SYLLABLE GEP +ACA7;ACA7;1100 1166 11C2;ACA7;1100 1166 11C2; # (겧; 겧; 겧; 겧; 겧; ) HANGUL SYLLABLE GEH +ACA8;ACA8;1100 1167;ACA8;1100 1167; # (겨; 겨; 겨; 겨; 겨; ) HANGUL SYLLABLE GYEO +ACA9;ACA9;1100 1167 11A8;ACA9;1100 1167 11A8; # (격; 격; 격; 격; 격; ) HANGUL SYLLABLE GYEOG +ACAA;ACAA;1100 1167 11A9;ACAA;1100 1167 11A9; # (겪; 겪; 겪; 겪; 겪; ) HANGUL SYLLABLE GYEOGG +ACAB;ACAB;1100 1167 11AA;ACAB;1100 1167 11AA; # (겫; 겫; 겫; 겫; 겫; ) HANGUL SYLLABLE GYEOGS +ACAC;ACAC;1100 1167 11AB;ACAC;1100 1167 11AB; # (견; 견; 견; 견; 견; ) HANGUL SYLLABLE GYEON +ACAD;ACAD;1100 1167 11AC;ACAD;1100 1167 11AC; # (겭; 겭; 겭; 겭; 겭; ) HANGUL SYLLABLE GYEONJ +ACAE;ACAE;1100 1167 11AD;ACAE;1100 1167 11AD; # (겮; 겮; 겮; 겮; 겮; ) HANGUL SYLLABLE GYEONH +ACAF;ACAF;1100 1167 11AE;ACAF;1100 1167 11AE; # (겯; 겯; 겯; 겯; 겯; ) HANGUL SYLLABLE GYEOD +ACB0;ACB0;1100 1167 11AF;ACB0;1100 1167 11AF; # (결; 결; 결; 결; 결; ) HANGUL SYLLABLE GYEOL +ACB1;ACB1;1100 1167 11B0;ACB1;1100 1167 11B0; # (겱; 겱; 겱; 겱; 겱; ) HANGUL SYLLABLE GYEOLG +ACB2;ACB2;1100 1167 11B1;ACB2;1100 1167 11B1; # (겲; 겲; 겲; 겲; 겲; ) HANGUL SYLLABLE GYEOLM +ACB3;ACB3;1100 1167 11B2;ACB3;1100 1167 11B2; # (겳; 겳; 겳; 겳; 겳; ) HANGUL SYLLABLE GYEOLB +ACB4;ACB4;1100 1167 11B3;ACB4;1100 1167 11B3; # (겴; 겴; 겴; 겴; 겴; ) HANGUL SYLLABLE GYEOLS +ACB5;ACB5;1100 1167 11B4;ACB5;1100 1167 11B4; # (겵; 겵; 겵; 겵; 겵; ) HANGUL SYLLABLE GYEOLT +ACB6;ACB6;1100 1167 11B5;ACB6;1100 1167 11B5; # (겶; 겶; 겶; 겶; 겶; ) HANGUL SYLLABLE GYEOLP +ACB7;ACB7;1100 1167 11B6;ACB7;1100 1167 11B6; # (겷; 겷; 겷; 겷; 겷; ) HANGUL SYLLABLE GYEOLH +ACB8;ACB8;1100 1167 11B7;ACB8;1100 1167 11B7; # (겸; 겸; 겸; 겸; 겸; ) HANGUL SYLLABLE GYEOM +ACB9;ACB9;1100 1167 11B8;ACB9;1100 1167 11B8; # (겹; 겹; 겹; 겹; 겹; ) HANGUL SYLLABLE GYEOB +ACBA;ACBA;1100 1167 11B9;ACBA;1100 1167 11B9; # (겺; 겺; 겺; 겺; 겺; ) HANGUL SYLLABLE GYEOBS +ACBB;ACBB;1100 1167 11BA;ACBB;1100 1167 11BA; # (겻; 겻; 겻; 겻; 겻; ) HANGUL SYLLABLE GYEOS +ACBC;ACBC;1100 1167 11BB;ACBC;1100 1167 11BB; # (겼; 겼; 겼; 겼; 겼; ) HANGUL SYLLABLE GYEOSS +ACBD;ACBD;1100 1167 11BC;ACBD;1100 1167 11BC; # (경; 경; 경; 경; 경; ) HANGUL SYLLABLE GYEONG +ACBE;ACBE;1100 1167 11BD;ACBE;1100 1167 11BD; # (겾; 겾; 겾; 겾; 겾; ) HANGUL SYLLABLE GYEOJ +ACBF;ACBF;1100 1167 11BE;ACBF;1100 1167 11BE; # (겿; 겿; 겿; 겿; 겿; ) HANGUL SYLLABLE GYEOC +ACC0;ACC0;1100 1167 11BF;ACC0;1100 1167 11BF; # (곀; 곀; 곀; 곀; 곀; ) HANGUL SYLLABLE GYEOK +ACC1;ACC1;1100 1167 11C0;ACC1;1100 1167 11C0; # (곁; 곁; 곁; 곁; 곁; ) HANGUL SYLLABLE GYEOT +ACC2;ACC2;1100 1167 11C1;ACC2;1100 1167 11C1; # (곂; 곂; 곂; 곂; 곂; ) HANGUL SYLLABLE GYEOP +ACC3;ACC3;1100 1167 11C2;ACC3;1100 1167 11C2; # (곃; 곃; 곃; 곃; 곃; ) HANGUL SYLLABLE GYEOH +ACC4;ACC4;1100 1168;ACC4;1100 1168; # (계; 계; 계; 계; 계; ) HANGUL SYLLABLE GYE +ACC5;ACC5;1100 1168 11A8;ACC5;1100 1168 11A8; # (곅; 곅; 곅; 곅; 곅; ) HANGUL SYLLABLE GYEG +ACC6;ACC6;1100 1168 11A9;ACC6;1100 1168 11A9; # (곆; 곆; 곆; 곆; 곆; ) HANGUL SYLLABLE GYEGG +ACC7;ACC7;1100 1168 11AA;ACC7;1100 1168 11AA; # (곇; 곇; 곇; 곇; 곇; ) HANGUL SYLLABLE GYEGS +ACC8;ACC8;1100 1168 11AB;ACC8;1100 1168 11AB; # (곈; 곈; 곈; 곈; 곈; ) HANGUL SYLLABLE GYEN +ACC9;ACC9;1100 1168 11AC;ACC9;1100 1168 11AC; # (곉; 곉; 곉; 곉; 곉; ) HANGUL SYLLABLE GYENJ +ACCA;ACCA;1100 1168 11AD;ACCA;1100 1168 11AD; # (곊; 곊; 곊; 곊; 곊; ) HANGUL SYLLABLE GYENH +ACCB;ACCB;1100 1168 11AE;ACCB;1100 1168 11AE; # (곋; 곋; 곋; 곋; 곋; ) HANGUL SYLLABLE GYED +ACCC;ACCC;1100 1168 11AF;ACCC;1100 1168 11AF; # (곌; 곌; 곌; 곌; 곌; ) HANGUL SYLLABLE GYEL +ACCD;ACCD;1100 1168 11B0;ACCD;1100 1168 11B0; # (곍; 곍; 곍; 곍; 곍; ) HANGUL SYLLABLE GYELG +ACCE;ACCE;1100 1168 11B1;ACCE;1100 1168 11B1; # (곎; 곎; 곎; 곎; 곎; ) HANGUL SYLLABLE GYELM +ACCF;ACCF;1100 1168 11B2;ACCF;1100 1168 11B2; # (곏; 곏; 곏; 곏; 곏; ) HANGUL SYLLABLE GYELB +ACD0;ACD0;1100 1168 11B3;ACD0;1100 1168 11B3; # (곐; 곐; 곐; 곐; 곐; ) HANGUL SYLLABLE GYELS +ACD1;ACD1;1100 1168 11B4;ACD1;1100 1168 11B4; # (곑; 곑; 곑; 곑; 곑; ) HANGUL SYLLABLE GYELT +ACD2;ACD2;1100 1168 11B5;ACD2;1100 1168 11B5; # (곒; 곒; 곒; 곒; 곒; ) HANGUL SYLLABLE GYELP +ACD3;ACD3;1100 1168 11B6;ACD3;1100 1168 11B6; # (곓; 곓; 곓; 곓; 곓; ) HANGUL SYLLABLE GYELH +ACD4;ACD4;1100 1168 11B7;ACD4;1100 1168 11B7; # (곔; 곔; 곔; 곔; 곔; ) HANGUL SYLLABLE GYEM +ACD5;ACD5;1100 1168 11B8;ACD5;1100 1168 11B8; # (곕; 곕; 곕; 곕; 곕; ) HANGUL SYLLABLE GYEB +ACD6;ACD6;1100 1168 11B9;ACD6;1100 1168 11B9; # (곖; 곖; 곖; 곖; 곖; ) HANGUL SYLLABLE GYEBS +ACD7;ACD7;1100 1168 11BA;ACD7;1100 1168 11BA; # (곗; 곗; 곗; 곗; 곗; ) HANGUL SYLLABLE GYES +ACD8;ACD8;1100 1168 11BB;ACD8;1100 1168 11BB; # (곘; 곘; 곘; 곘; 곘; ) HANGUL SYLLABLE GYESS +ACD9;ACD9;1100 1168 11BC;ACD9;1100 1168 11BC; # (곙; 곙; 곙; 곙; 곙; ) HANGUL SYLLABLE GYENG +ACDA;ACDA;1100 1168 11BD;ACDA;1100 1168 11BD; # (곚; 곚; 곚; 곚; 곚; ) HANGUL SYLLABLE GYEJ +ACDB;ACDB;1100 1168 11BE;ACDB;1100 1168 11BE; # (곛; 곛; 곛; 곛; 곛; ) HANGUL SYLLABLE GYEC +ACDC;ACDC;1100 1168 11BF;ACDC;1100 1168 11BF; # (곜; 곜; 곜; 곜; 곜; ) HANGUL SYLLABLE GYEK +ACDD;ACDD;1100 1168 11C0;ACDD;1100 1168 11C0; # (곝; 곝; 곝; 곝; 곝; ) HANGUL SYLLABLE GYET +ACDE;ACDE;1100 1168 11C1;ACDE;1100 1168 11C1; # (곞; 곞; 곞; 곞; 곞; ) HANGUL SYLLABLE GYEP +ACDF;ACDF;1100 1168 11C2;ACDF;1100 1168 11C2; # (곟; 곟; 곟; 곟; 곟; ) HANGUL SYLLABLE GYEH +ACE0;ACE0;1100 1169;ACE0;1100 1169; # (고; 고; 고; 고; 고; ) HANGUL SYLLABLE GO +ACE1;ACE1;1100 1169 11A8;ACE1;1100 1169 11A8; # (곡; 곡; 곡; 곡; 곡; ) HANGUL SYLLABLE GOG +ACE2;ACE2;1100 1169 11A9;ACE2;1100 1169 11A9; # (곢; 곢; 곢; 곢; 곢; ) HANGUL SYLLABLE GOGG +ACE3;ACE3;1100 1169 11AA;ACE3;1100 1169 11AA; # (곣; 곣; 곣; 곣; 곣; ) HANGUL SYLLABLE GOGS +ACE4;ACE4;1100 1169 11AB;ACE4;1100 1169 11AB; # (곤; 곤; 곤; 곤; 곤; ) HANGUL SYLLABLE GON +ACE5;ACE5;1100 1169 11AC;ACE5;1100 1169 11AC; # (곥; 곥; 곥; 곥; 곥; ) HANGUL SYLLABLE GONJ +ACE6;ACE6;1100 1169 11AD;ACE6;1100 1169 11AD; # (곦; 곦; 곦; 곦; 곦; ) HANGUL SYLLABLE GONH +ACE7;ACE7;1100 1169 11AE;ACE7;1100 1169 11AE; # (곧; 곧; 곧; 곧; 곧; ) HANGUL SYLLABLE GOD +ACE8;ACE8;1100 1169 11AF;ACE8;1100 1169 11AF; # (골; 골; 골; 골; 골; ) HANGUL SYLLABLE GOL +ACE9;ACE9;1100 1169 11B0;ACE9;1100 1169 11B0; # (곩; 곩; 곩; 곩; 곩; ) HANGUL SYLLABLE GOLG +ACEA;ACEA;1100 1169 11B1;ACEA;1100 1169 11B1; # (곪; 곪; 곪; 곪; 곪; ) HANGUL SYLLABLE GOLM +ACEB;ACEB;1100 1169 11B2;ACEB;1100 1169 11B2; # (곫; 곫; 곫; 곫; 곫; ) HANGUL SYLLABLE GOLB +ACEC;ACEC;1100 1169 11B3;ACEC;1100 1169 11B3; # (곬; 곬; 곬; 곬; 곬; ) HANGUL SYLLABLE GOLS +ACED;ACED;1100 1169 11B4;ACED;1100 1169 11B4; # (곭; 곭; 곭; 곭; 곭; ) HANGUL SYLLABLE GOLT +ACEE;ACEE;1100 1169 11B5;ACEE;1100 1169 11B5; # (곮; 곮; 곮; 곮; 곮; ) HANGUL SYLLABLE GOLP +ACEF;ACEF;1100 1169 11B6;ACEF;1100 1169 11B6; # (곯; 곯; 곯; 곯; 곯; ) HANGUL SYLLABLE GOLH +ACF0;ACF0;1100 1169 11B7;ACF0;1100 1169 11B7; # (곰; 곰; 곰; 곰; 곰; ) HANGUL SYLLABLE GOM +ACF1;ACF1;1100 1169 11B8;ACF1;1100 1169 11B8; # (곱; 곱; 곱; 곱; 곱; ) HANGUL SYLLABLE GOB +ACF2;ACF2;1100 1169 11B9;ACF2;1100 1169 11B9; # (곲; 곲; 곲; 곲; 곲; ) HANGUL SYLLABLE GOBS +ACF3;ACF3;1100 1169 11BA;ACF3;1100 1169 11BA; # (곳; 곳; 곳; 곳; 곳; ) HANGUL SYLLABLE GOS +ACF4;ACF4;1100 1169 11BB;ACF4;1100 1169 11BB; # (곴; 곴; 곴; 곴; 곴; ) HANGUL SYLLABLE GOSS +ACF5;ACF5;1100 1169 11BC;ACF5;1100 1169 11BC; # (공; 공; 공; 공; 공; ) HANGUL SYLLABLE GONG +ACF6;ACF6;1100 1169 11BD;ACF6;1100 1169 11BD; # (곶; 곶; 곶; 곶; 곶; ) HANGUL SYLLABLE GOJ +ACF7;ACF7;1100 1169 11BE;ACF7;1100 1169 11BE; # (곷; 곷; 곷; 곷; 곷; ) HANGUL SYLLABLE GOC +ACF8;ACF8;1100 1169 11BF;ACF8;1100 1169 11BF; # (곸; 곸; 곸; 곸; 곸; ) HANGUL SYLLABLE GOK +ACF9;ACF9;1100 1169 11C0;ACF9;1100 1169 11C0; # (곹; 곹; 곹; 곹; 곹; ) HANGUL SYLLABLE GOT +ACFA;ACFA;1100 1169 11C1;ACFA;1100 1169 11C1; # (곺; 곺; 곺; 곺; 곺; ) HANGUL SYLLABLE GOP +ACFB;ACFB;1100 1169 11C2;ACFB;1100 1169 11C2; # (곻; 곻; 곻; 곻; 곻; ) HANGUL SYLLABLE GOH +ACFC;ACFC;1100 116A;ACFC;1100 116A; # (과; 과; 과; 과; 과; ) HANGUL SYLLABLE GWA +ACFD;ACFD;1100 116A 11A8;ACFD;1100 116A 11A8; # (곽; 곽; 곽; 곽; 곽; ) HANGUL SYLLABLE GWAG +ACFE;ACFE;1100 116A 11A9;ACFE;1100 116A 11A9; # (곾; 곾; 곾; 곾; 곾; ) HANGUL SYLLABLE GWAGG +ACFF;ACFF;1100 116A 11AA;ACFF;1100 116A 11AA; # (곿; 곿; 곿; 곿; 곿; ) HANGUL SYLLABLE GWAGS +AD00;AD00;1100 116A 11AB;AD00;1100 116A 11AB; # (관; 관; 관; 관; 관; ) HANGUL SYLLABLE GWAN +AD01;AD01;1100 116A 11AC;AD01;1100 116A 11AC; # (괁; 괁; 괁; 괁; 괁; ) HANGUL SYLLABLE GWANJ +AD02;AD02;1100 116A 11AD;AD02;1100 116A 11AD; # (괂; 괂; 괂; 괂; 괂; ) HANGUL SYLLABLE GWANH +AD03;AD03;1100 116A 11AE;AD03;1100 116A 11AE; # (괃; 괃; 괃; 괃; 괃; ) HANGUL SYLLABLE GWAD +AD04;AD04;1100 116A 11AF;AD04;1100 116A 11AF; # (괄; 괄; 괄; 괄; 괄; ) HANGUL SYLLABLE GWAL +AD05;AD05;1100 116A 11B0;AD05;1100 116A 11B0; # (괅; 괅; 괅; 괅; 괅; ) HANGUL SYLLABLE GWALG +AD06;AD06;1100 116A 11B1;AD06;1100 116A 11B1; # (괆; 괆; 괆; 괆; 괆; ) HANGUL SYLLABLE GWALM +AD07;AD07;1100 116A 11B2;AD07;1100 116A 11B2; # (괇; 괇; 괇; 괇; 괇; ) HANGUL SYLLABLE GWALB +AD08;AD08;1100 116A 11B3;AD08;1100 116A 11B3; # (괈; 괈; 괈; 괈; 괈; ) HANGUL SYLLABLE GWALS +AD09;AD09;1100 116A 11B4;AD09;1100 116A 11B4; # (괉; 괉; 괉; 괉; 괉; ) HANGUL SYLLABLE GWALT +AD0A;AD0A;1100 116A 11B5;AD0A;1100 116A 11B5; # (괊; 괊; 괊; 괊; 괊; ) HANGUL SYLLABLE GWALP +AD0B;AD0B;1100 116A 11B6;AD0B;1100 116A 11B6; # (괋; 괋; 괋; 괋; 괋; ) HANGUL SYLLABLE GWALH +AD0C;AD0C;1100 116A 11B7;AD0C;1100 116A 11B7; # (괌; 괌; 괌; 괌; 괌; ) HANGUL SYLLABLE GWAM +AD0D;AD0D;1100 116A 11B8;AD0D;1100 116A 11B8; # (괍; 괍; 괍; 괍; 괍; ) HANGUL SYLLABLE GWAB +AD0E;AD0E;1100 116A 11B9;AD0E;1100 116A 11B9; # (괎; 괎; 괎; 괎; 괎; ) HANGUL SYLLABLE GWABS +AD0F;AD0F;1100 116A 11BA;AD0F;1100 116A 11BA; # (괏; 괏; 괏; 괏; 괏; ) HANGUL SYLLABLE GWAS +AD10;AD10;1100 116A 11BB;AD10;1100 116A 11BB; # (괐; 괐; 괐; 괐; 괐; ) HANGUL SYLLABLE GWASS +AD11;AD11;1100 116A 11BC;AD11;1100 116A 11BC; # (광; 광; 광; 광; 광; ) HANGUL SYLLABLE GWANG +AD12;AD12;1100 116A 11BD;AD12;1100 116A 11BD; # (괒; 괒; 괒; 괒; 괒; ) HANGUL SYLLABLE GWAJ +AD13;AD13;1100 116A 11BE;AD13;1100 116A 11BE; # (괓; 괓; 괓; 괓; 괓; ) HANGUL SYLLABLE GWAC +AD14;AD14;1100 116A 11BF;AD14;1100 116A 11BF; # (괔; 괔; 괔; 괔; 괔; ) HANGUL SYLLABLE GWAK +AD15;AD15;1100 116A 11C0;AD15;1100 116A 11C0; # (괕; 괕; 괕; 괕; 괕; ) HANGUL SYLLABLE GWAT +AD16;AD16;1100 116A 11C1;AD16;1100 116A 11C1; # (괖; 괖; 괖; 괖; 괖; ) HANGUL SYLLABLE GWAP +AD17;AD17;1100 116A 11C2;AD17;1100 116A 11C2; # (괗; 괗; 괗; 괗; 괗; ) HANGUL SYLLABLE GWAH +AD18;AD18;1100 116B;AD18;1100 116B; # (괘; 괘; 괘; 괘; 괘; ) HANGUL SYLLABLE GWAE +AD19;AD19;1100 116B 11A8;AD19;1100 116B 11A8; # (괙; 괙; 괙; 괙; 괙; ) HANGUL SYLLABLE GWAEG +AD1A;AD1A;1100 116B 11A9;AD1A;1100 116B 11A9; # (괚; 괚; 괚; 괚; 괚; ) HANGUL SYLLABLE GWAEGG +AD1B;AD1B;1100 116B 11AA;AD1B;1100 116B 11AA; # (괛; 괛; 괛; 괛; 괛; ) HANGUL SYLLABLE GWAEGS +AD1C;AD1C;1100 116B 11AB;AD1C;1100 116B 11AB; # (괜; 괜; 괜; 괜; 괜; ) HANGUL SYLLABLE GWAEN +AD1D;AD1D;1100 116B 11AC;AD1D;1100 116B 11AC; # (괝; 괝; 괝; 괝; 괝; ) HANGUL SYLLABLE GWAENJ +AD1E;AD1E;1100 116B 11AD;AD1E;1100 116B 11AD; # (괞; 괞; 괞; 괞; 괞; ) HANGUL SYLLABLE GWAENH +AD1F;AD1F;1100 116B 11AE;AD1F;1100 116B 11AE; # (괟; 괟; 괟; 괟; 괟; ) HANGUL SYLLABLE GWAED +AD20;AD20;1100 116B 11AF;AD20;1100 116B 11AF; # (괠; 괠; 괠; 괠; 괠; ) HANGUL SYLLABLE GWAEL +AD21;AD21;1100 116B 11B0;AD21;1100 116B 11B0; # (괡; 괡; 괡; 괡; 괡; ) HANGUL SYLLABLE GWAELG +AD22;AD22;1100 116B 11B1;AD22;1100 116B 11B1; # (괢; 괢; 괢; 괢; 괢; ) HANGUL SYLLABLE GWAELM +AD23;AD23;1100 116B 11B2;AD23;1100 116B 11B2; # (괣; 괣; 괣; 괣; 괣; ) HANGUL SYLLABLE GWAELB +AD24;AD24;1100 116B 11B3;AD24;1100 116B 11B3; # (괤; 괤; 괤; 괤; 괤; ) HANGUL SYLLABLE GWAELS +AD25;AD25;1100 116B 11B4;AD25;1100 116B 11B4; # (괥; 괥; 괥; 괥; 괥; ) HANGUL SYLLABLE GWAELT +AD26;AD26;1100 116B 11B5;AD26;1100 116B 11B5; # (괦; 괦; 괦; 괦; 괦; ) HANGUL SYLLABLE GWAELP +AD27;AD27;1100 116B 11B6;AD27;1100 116B 11B6; # (괧; 괧; 괧; 괧; 괧; ) HANGUL SYLLABLE GWAELH +AD28;AD28;1100 116B 11B7;AD28;1100 116B 11B7; # (괨; 괨; 괨; 괨; 괨; ) HANGUL SYLLABLE GWAEM +AD29;AD29;1100 116B 11B8;AD29;1100 116B 11B8; # (괩; 괩; 괩; 괩; 괩; ) HANGUL SYLLABLE GWAEB +AD2A;AD2A;1100 116B 11B9;AD2A;1100 116B 11B9; # (괪; 괪; 괪; 괪; 괪; ) HANGUL SYLLABLE GWAEBS +AD2B;AD2B;1100 116B 11BA;AD2B;1100 116B 11BA; # (괫; 괫; 괫; 괫; 괫; ) HANGUL SYLLABLE GWAES +AD2C;AD2C;1100 116B 11BB;AD2C;1100 116B 11BB; # (괬; 괬; 괬; 괬; 괬; ) HANGUL SYLLABLE GWAESS +AD2D;AD2D;1100 116B 11BC;AD2D;1100 116B 11BC; # (괭; 괭; 괭; 괭; 괭; ) HANGUL SYLLABLE GWAENG +AD2E;AD2E;1100 116B 11BD;AD2E;1100 116B 11BD; # (괮; 괮; 괮; 괮; 괮; ) HANGUL SYLLABLE GWAEJ +AD2F;AD2F;1100 116B 11BE;AD2F;1100 116B 11BE; # (괯; 괯; 괯; 괯; 괯; ) HANGUL SYLLABLE GWAEC +AD30;AD30;1100 116B 11BF;AD30;1100 116B 11BF; # (괰; 괰; 괰; 괰; 괰; ) HANGUL SYLLABLE GWAEK +AD31;AD31;1100 116B 11C0;AD31;1100 116B 11C0; # (괱; 괱; 괱; 괱; 괱; ) HANGUL SYLLABLE GWAET +AD32;AD32;1100 116B 11C1;AD32;1100 116B 11C1; # (괲; 괲; 괲; 괲; 괲; ) HANGUL SYLLABLE GWAEP +AD33;AD33;1100 116B 11C2;AD33;1100 116B 11C2; # (괳; 괳; 괳; 괳; 괳; ) HANGUL SYLLABLE GWAEH +AD34;AD34;1100 116C;AD34;1100 116C; # (괴; 괴; 괴; 괴; 괴; ) HANGUL SYLLABLE GOE +AD35;AD35;1100 116C 11A8;AD35;1100 116C 11A8; # (괵; 괵; 괵; 괵; 괵; ) HANGUL SYLLABLE GOEG +AD36;AD36;1100 116C 11A9;AD36;1100 116C 11A9; # (괶; 괶; 괶; 괶; 괶; ) HANGUL SYLLABLE GOEGG +AD37;AD37;1100 116C 11AA;AD37;1100 116C 11AA; # (괷; 괷; 괷; 괷; 괷; ) HANGUL SYLLABLE GOEGS +AD38;AD38;1100 116C 11AB;AD38;1100 116C 11AB; # (괸; 괸; 괸; 괸; 괸; ) HANGUL SYLLABLE GOEN +AD39;AD39;1100 116C 11AC;AD39;1100 116C 11AC; # (괹; 괹; 괹; 괹; 괹; ) HANGUL SYLLABLE GOENJ +AD3A;AD3A;1100 116C 11AD;AD3A;1100 116C 11AD; # (괺; 괺; 괺; 괺; 괺; ) HANGUL SYLLABLE GOENH +AD3B;AD3B;1100 116C 11AE;AD3B;1100 116C 11AE; # (괻; 괻; 괻; 괻; 괻; ) HANGUL SYLLABLE GOED +AD3C;AD3C;1100 116C 11AF;AD3C;1100 116C 11AF; # (괼; 괼; 괼; 괼; 괼; ) HANGUL SYLLABLE GOEL +AD3D;AD3D;1100 116C 11B0;AD3D;1100 116C 11B0; # (괽; 괽; 괽; 괽; 괽; ) HANGUL SYLLABLE GOELG +AD3E;AD3E;1100 116C 11B1;AD3E;1100 116C 11B1; # (괾; 괾; 괾; 괾; 괾; ) HANGUL SYLLABLE GOELM +AD3F;AD3F;1100 116C 11B2;AD3F;1100 116C 11B2; # (괿; 괿; 괿; 괿; 괿; ) HANGUL SYLLABLE GOELB +AD40;AD40;1100 116C 11B3;AD40;1100 116C 11B3; # (굀; 굀; 굀; 굀; 굀; ) HANGUL SYLLABLE GOELS +AD41;AD41;1100 116C 11B4;AD41;1100 116C 11B4; # (굁; 굁; 굁; 굁; 굁; ) HANGUL SYLLABLE GOELT +AD42;AD42;1100 116C 11B5;AD42;1100 116C 11B5; # (굂; 굂; 굂; 굂; 굂; ) HANGUL SYLLABLE GOELP +AD43;AD43;1100 116C 11B6;AD43;1100 116C 11B6; # (굃; 굃; 굃; 굃; 굃; ) HANGUL SYLLABLE GOELH +AD44;AD44;1100 116C 11B7;AD44;1100 116C 11B7; # (굄; 굄; 굄; 굄; 굄; ) HANGUL SYLLABLE GOEM +AD45;AD45;1100 116C 11B8;AD45;1100 116C 11B8; # (굅; 굅; 굅; 굅; 굅; ) HANGUL SYLLABLE GOEB +AD46;AD46;1100 116C 11B9;AD46;1100 116C 11B9; # (굆; 굆; 굆; 굆; 굆; ) HANGUL SYLLABLE GOEBS +AD47;AD47;1100 116C 11BA;AD47;1100 116C 11BA; # (굇; 굇; 굇; 굇; 굇; ) HANGUL SYLLABLE GOES +AD48;AD48;1100 116C 11BB;AD48;1100 116C 11BB; # (굈; 굈; 굈; 굈; 굈; ) HANGUL SYLLABLE GOESS +AD49;AD49;1100 116C 11BC;AD49;1100 116C 11BC; # (굉; 굉; 굉; 굉; 굉; ) HANGUL SYLLABLE GOENG +AD4A;AD4A;1100 116C 11BD;AD4A;1100 116C 11BD; # (굊; 굊; 굊; 굊; 굊; ) HANGUL SYLLABLE GOEJ +AD4B;AD4B;1100 116C 11BE;AD4B;1100 116C 11BE; # (굋; 굋; 굋; 굋; 굋; ) HANGUL SYLLABLE GOEC +AD4C;AD4C;1100 116C 11BF;AD4C;1100 116C 11BF; # (굌; 굌; 굌; 굌; 굌; ) HANGUL SYLLABLE GOEK +AD4D;AD4D;1100 116C 11C0;AD4D;1100 116C 11C0; # (굍; 굍; 굍; 굍; 굍; ) HANGUL SYLLABLE GOET +AD4E;AD4E;1100 116C 11C1;AD4E;1100 116C 11C1; # (굎; 굎; 굎; 굎; 굎; ) HANGUL SYLLABLE GOEP +AD4F;AD4F;1100 116C 11C2;AD4F;1100 116C 11C2; # (굏; 굏; 굏; 굏; 굏; ) HANGUL SYLLABLE GOEH +AD50;AD50;1100 116D;AD50;1100 116D; # (교; 교; 교; 교; 교; ) HANGUL SYLLABLE GYO +AD51;AD51;1100 116D 11A8;AD51;1100 116D 11A8; # (굑; 굑; 굑; 굑; 굑; ) HANGUL SYLLABLE GYOG +AD52;AD52;1100 116D 11A9;AD52;1100 116D 11A9; # (굒; 굒; 굒; 굒; 굒; ) HANGUL SYLLABLE GYOGG +AD53;AD53;1100 116D 11AA;AD53;1100 116D 11AA; # (굓; 굓; 굓; 굓; 굓; ) HANGUL SYLLABLE GYOGS +AD54;AD54;1100 116D 11AB;AD54;1100 116D 11AB; # (굔; 굔; 굔; 굔; 굔; ) HANGUL SYLLABLE GYON +AD55;AD55;1100 116D 11AC;AD55;1100 116D 11AC; # (굕; 굕; 굕; 굕; 굕; ) HANGUL SYLLABLE GYONJ +AD56;AD56;1100 116D 11AD;AD56;1100 116D 11AD; # (굖; 굖; 굖; 굖; 굖; ) HANGUL SYLLABLE GYONH +AD57;AD57;1100 116D 11AE;AD57;1100 116D 11AE; # (굗; 굗; 굗; 굗; 굗; ) HANGUL SYLLABLE GYOD +AD58;AD58;1100 116D 11AF;AD58;1100 116D 11AF; # (굘; 굘; 굘; 굘; 굘; ) HANGUL SYLLABLE GYOL +AD59;AD59;1100 116D 11B0;AD59;1100 116D 11B0; # (굙; 굙; 굙; 굙; 굙; ) HANGUL SYLLABLE GYOLG +AD5A;AD5A;1100 116D 11B1;AD5A;1100 116D 11B1; # (굚; 굚; 굚; 굚; 굚; ) HANGUL SYLLABLE GYOLM +AD5B;AD5B;1100 116D 11B2;AD5B;1100 116D 11B2; # (굛; 굛; 굛; 굛; 굛; ) HANGUL SYLLABLE GYOLB +AD5C;AD5C;1100 116D 11B3;AD5C;1100 116D 11B3; # (굜; 굜; 굜; 굜; 굜; ) HANGUL SYLLABLE GYOLS +AD5D;AD5D;1100 116D 11B4;AD5D;1100 116D 11B4; # (굝; 굝; 굝; 굝; 굝; ) HANGUL SYLLABLE GYOLT +AD5E;AD5E;1100 116D 11B5;AD5E;1100 116D 11B5; # (굞; 굞; 굞; 굞; 굞; ) HANGUL SYLLABLE GYOLP +AD5F;AD5F;1100 116D 11B6;AD5F;1100 116D 11B6; # (굟; 굟; 굟; 굟; 굟; ) HANGUL SYLLABLE GYOLH +AD60;AD60;1100 116D 11B7;AD60;1100 116D 11B7; # (굠; 굠; 굠; 굠; 굠; ) HANGUL SYLLABLE GYOM +AD61;AD61;1100 116D 11B8;AD61;1100 116D 11B8; # (굡; 굡; 굡; 굡; 굡; ) HANGUL SYLLABLE GYOB +AD62;AD62;1100 116D 11B9;AD62;1100 116D 11B9; # (굢; 굢; 굢; 굢; 굢; ) HANGUL SYLLABLE GYOBS +AD63;AD63;1100 116D 11BA;AD63;1100 116D 11BA; # (굣; 굣; 굣; 굣; 굣; ) HANGUL SYLLABLE GYOS +AD64;AD64;1100 116D 11BB;AD64;1100 116D 11BB; # (굤; 굤; 굤; 굤; 굤; ) HANGUL SYLLABLE GYOSS +AD65;AD65;1100 116D 11BC;AD65;1100 116D 11BC; # (굥; 굥; 굥; 굥; 굥; ) HANGUL SYLLABLE GYONG +AD66;AD66;1100 116D 11BD;AD66;1100 116D 11BD; # (굦; 굦; 굦; 굦; 굦; ) HANGUL SYLLABLE GYOJ +AD67;AD67;1100 116D 11BE;AD67;1100 116D 11BE; # (굧; 굧; 굧; 굧; 굧; ) HANGUL SYLLABLE GYOC +AD68;AD68;1100 116D 11BF;AD68;1100 116D 11BF; # (굨; 굨; 굨; 굨; 굨; ) HANGUL SYLLABLE GYOK +AD69;AD69;1100 116D 11C0;AD69;1100 116D 11C0; # (굩; 굩; 굩; 굩; 굩; ) HANGUL SYLLABLE GYOT +AD6A;AD6A;1100 116D 11C1;AD6A;1100 116D 11C1; # (굪; 굪; 굪; 굪; 굪; ) HANGUL SYLLABLE GYOP +AD6B;AD6B;1100 116D 11C2;AD6B;1100 116D 11C2; # (굫; 굫; 굫; 굫; 굫; ) HANGUL SYLLABLE GYOH +AD6C;AD6C;1100 116E;AD6C;1100 116E; # (구; 구; 구; 구; 구; ) HANGUL SYLLABLE GU +AD6D;AD6D;1100 116E 11A8;AD6D;1100 116E 11A8; # (국; 국; 국; 국; 국; ) HANGUL SYLLABLE GUG +AD6E;AD6E;1100 116E 11A9;AD6E;1100 116E 11A9; # (굮; 굮; 굮; 굮; 굮; ) HANGUL SYLLABLE GUGG +AD6F;AD6F;1100 116E 11AA;AD6F;1100 116E 11AA; # (굯; 굯; 굯; 굯; 굯; ) HANGUL SYLLABLE GUGS +AD70;AD70;1100 116E 11AB;AD70;1100 116E 11AB; # (군; 군; 군; 군; 군; ) HANGUL SYLLABLE GUN +AD71;AD71;1100 116E 11AC;AD71;1100 116E 11AC; # (굱; 굱; 굱; 굱; 굱; ) HANGUL SYLLABLE GUNJ +AD72;AD72;1100 116E 11AD;AD72;1100 116E 11AD; # (굲; 굲; 굲; 굲; 굲; ) HANGUL SYLLABLE GUNH +AD73;AD73;1100 116E 11AE;AD73;1100 116E 11AE; # (굳; 굳; 굳; 굳; 굳; ) HANGUL SYLLABLE GUD +AD74;AD74;1100 116E 11AF;AD74;1100 116E 11AF; # (굴; 굴; 굴; 굴; 굴; ) HANGUL SYLLABLE GUL +AD75;AD75;1100 116E 11B0;AD75;1100 116E 11B0; # (굵; 굵; 굵; 굵; 굵; ) HANGUL SYLLABLE GULG +AD76;AD76;1100 116E 11B1;AD76;1100 116E 11B1; # (굶; 굶; 굶; 굶; 굶; ) HANGUL SYLLABLE GULM +AD77;AD77;1100 116E 11B2;AD77;1100 116E 11B2; # (굷; 굷; 굷; 굷; 굷; ) HANGUL SYLLABLE GULB +AD78;AD78;1100 116E 11B3;AD78;1100 116E 11B3; # (굸; 굸; 굸; 굸; 굸; ) HANGUL SYLLABLE GULS +AD79;AD79;1100 116E 11B4;AD79;1100 116E 11B4; # (굹; 굹; 굹; 굹; 굹; ) HANGUL SYLLABLE GULT +AD7A;AD7A;1100 116E 11B5;AD7A;1100 116E 11B5; # (굺; 굺; 굺; 굺; 굺; ) HANGUL SYLLABLE GULP +AD7B;AD7B;1100 116E 11B6;AD7B;1100 116E 11B6; # (굻; 굻; 굻; 굻; 굻; ) HANGUL SYLLABLE GULH +AD7C;AD7C;1100 116E 11B7;AD7C;1100 116E 11B7; # (굼; 굼; 굼; 굼; 굼; ) HANGUL SYLLABLE GUM +AD7D;AD7D;1100 116E 11B8;AD7D;1100 116E 11B8; # (굽; 굽; 굽; 굽; 굽; ) HANGUL SYLLABLE GUB +AD7E;AD7E;1100 116E 11B9;AD7E;1100 116E 11B9; # (굾; 굾; 굾; 굾; 굾; ) HANGUL SYLLABLE GUBS +AD7F;AD7F;1100 116E 11BA;AD7F;1100 116E 11BA; # (굿; 굿; 굿; 굿; 굿; ) HANGUL SYLLABLE GUS +AD80;AD80;1100 116E 11BB;AD80;1100 116E 11BB; # (궀; 궀; 궀; 궀; 궀; ) HANGUL SYLLABLE GUSS +AD81;AD81;1100 116E 11BC;AD81;1100 116E 11BC; # (궁; 궁; 궁; 궁; 궁; ) HANGUL SYLLABLE GUNG +AD82;AD82;1100 116E 11BD;AD82;1100 116E 11BD; # (궂; 궂; 궂; 궂; 궂; ) HANGUL SYLLABLE GUJ +AD83;AD83;1100 116E 11BE;AD83;1100 116E 11BE; # (궃; 궃; 궃; 궃; 궃; ) HANGUL SYLLABLE GUC +AD84;AD84;1100 116E 11BF;AD84;1100 116E 11BF; # (궄; 궄; 궄; 궄; 궄; ) HANGUL SYLLABLE GUK +AD85;AD85;1100 116E 11C0;AD85;1100 116E 11C0; # (궅; 궅; 궅; 궅; 궅; ) HANGUL SYLLABLE GUT +AD86;AD86;1100 116E 11C1;AD86;1100 116E 11C1; # (궆; 궆; 궆; 궆; 궆; ) HANGUL SYLLABLE GUP +AD87;AD87;1100 116E 11C2;AD87;1100 116E 11C2; # (궇; 궇; 궇; 궇; 궇; ) HANGUL SYLLABLE GUH +AD88;AD88;1100 116F;AD88;1100 116F; # (궈; 궈; 궈; 궈; 궈; ) HANGUL SYLLABLE GWEO +AD89;AD89;1100 116F 11A8;AD89;1100 116F 11A8; # (궉; 궉; 궉; 궉; 궉; ) HANGUL SYLLABLE GWEOG +AD8A;AD8A;1100 116F 11A9;AD8A;1100 116F 11A9; # (궊; 궊; 궊; 궊; 궊; ) HANGUL SYLLABLE GWEOGG +AD8B;AD8B;1100 116F 11AA;AD8B;1100 116F 11AA; # (궋; 궋; 궋; 궋; 궋; ) HANGUL SYLLABLE GWEOGS +AD8C;AD8C;1100 116F 11AB;AD8C;1100 116F 11AB; # (권; 권; 권; 권; 권; ) HANGUL SYLLABLE GWEON +AD8D;AD8D;1100 116F 11AC;AD8D;1100 116F 11AC; # (궍; 궍; 궍; 궍; 궍; ) HANGUL SYLLABLE GWEONJ +AD8E;AD8E;1100 116F 11AD;AD8E;1100 116F 11AD; # (궎; 궎; 궎; 궎; 궎; ) HANGUL SYLLABLE GWEONH +AD8F;AD8F;1100 116F 11AE;AD8F;1100 116F 11AE; # (궏; 궏; 궏; 궏; 궏; ) HANGUL SYLLABLE GWEOD +AD90;AD90;1100 116F 11AF;AD90;1100 116F 11AF; # (궐; 궐; 궐; 궐; 궐; ) HANGUL SYLLABLE GWEOL +AD91;AD91;1100 116F 11B0;AD91;1100 116F 11B0; # (궑; 궑; 궑; 궑; 궑; ) HANGUL SYLLABLE GWEOLG +AD92;AD92;1100 116F 11B1;AD92;1100 116F 11B1; # (궒; 궒; 궒; 궒; 궒; ) HANGUL SYLLABLE GWEOLM +AD93;AD93;1100 116F 11B2;AD93;1100 116F 11B2; # (궓; 궓; 궓; 궓; 궓; ) HANGUL SYLLABLE GWEOLB +AD94;AD94;1100 116F 11B3;AD94;1100 116F 11B3; # (궔; 궔; 궔; 궔; 궔; ) HANGUL SYLLABLE GWEOLS +AD95;AD95;1100 116F 11B4;AD95;1100 116F 11B4; # (궕; 궕; 궕; 궕; 궕; ) HANGUL SYLLABLE GWEOLT +AD96;AD96;1100 116F 11B5;AD96;1100 116F 11B5; # (궖; 궖; 궖; 궖; 궖; ) HANGUL SYLLABLE GWEOLP +AD97;AD97;1100 116F 11B6;AD97;1100 116F 11B6; # (궗; 궗; 궗; 궗; 궗; ) HANGUL SYLLABLE GWEOLH +AD98;AD98;1100 116F 11B7;AD98;1100 116F 11B7; # (궘; 궘; 궘; 궘; 궘; ) HANGUL SYLLABLE GWEOM +AD99;AD99;1100 116F 11B8;AD99;1100 116F 11B8; # (궙; 궙; 궙; 궙; 궙; ) HANGUL SYLLABLE GWEOB +AD9A;AD9A;1100 116F 11B9;AD9A;1100 116F 11B9; # (궚; 궚; 궚; 궚; 궚; ) HANGUL SYLLABLE GWEOBS +AD9B;AD9B;1100 116F 11BA;AD9B;1100 116F 11BA; # (궛; 궛; 궛; 궛; 궛; ) HANGUL SYLLABLE GWEOS +AD9C;AD9C;1100 116F 11BB;AD9C;1100 116F 11BB; # (궜; 궜; 궜; 궜; 궜; ) HANGUL SYLLABLE GWEOSS +AD9D;AD9D;1100 116F 11BC;AD9D;1100 116F 11BC; # (궝; 궝; 궝; 궝; 궝; ) HANGUL SYLLABLE GWEONG +AD9E;AD9E;1100 116F 11BD;AD9E;1100 116F 11BD; # (궞; 궞; 궞; 궞; 궞; ) HANGUL SYLLABLE GWEOJ +AD9F;AD9F;1100 116F 11BE;AD9F;1100 116F 11BE; # (궟; 궟; 궟; 궟; 궟; ) HANGUL SYLLABLE GWEOC +ADA0;ADA0;1100 116F 11BF;ADA0;1100 116F 11BF; # (궠; 궠; 궠; 궠; 궠; ) HANGUL SYLLABLE GWEOK +ADA1;ADA1;1100 116F 11C0;ADA1;1100 116F 11C0; # (궡; 궡; 궡; 궡; 궡; ) HANGUL SYLLABLE GWEOT +ADA2;ADA2;1100 116F 11C1;ADA2;1100 116F 11C1; # (궢; 궢; 궢; 궢; 궢; ) HANGUL SYLLABLE GWEOP +ADA3;ADA3;1100 116F 11C2;ADA3;1100 116F 11C2; # (궣; 궣; 궣; 궣; 궣; ) HANGUL SYLLABLE GWEOH +ADA4;ADA4;1100 1170;ADA4;1100 1170; # (궤; 궤; 궤; 궤; 궤; ) HANGUL SYLLABLE GWE +ADA5;ADA5;1100 1170 11A8;ADA5;1100 1170 11A8; # (궥; 궥; 궥; 궥; 궥; ) HANGUL SYLLABLE GWEG +ADA6;ADA6;1100 1170 11A9;ADA6;1100 1170 11A9; # (궦; 궦; 궦; 궦; 궦; ) HANGUL SYLLABLE GWEGG +ADA7;ADA7;1100 1170 11AA;ADA7;1100 1170 11AA; # (궧; 궧; 궧; 궧; 궧; ) HANGUL SYLLABLE GWEGS +ADA8;ADA8;1100 1170 11AB;ADA8;1100 1170 11AB; # (궨; 궨; 궨; 궨; 궨; ) HANGUL SYLLABLE GWEN +ADA9;ADA9;1100 1170 11AC;ADA9;1100 1170 11AC; # (궩; 궩; 궩; 궩; 궩; ) HANGUL SYLLABLE GWENJ +ADAA;ADAA;1100 1170 11AD;ADAA;1100 1170 11AD; # (궪; 궪; 궪; 궪; 궪; ) HANGUL SYLLABLE GWENH +ADAB;ADAB;1100 1170 11AE;ADAB;1100 1170 11AE; # (궫; 궫; 궫; 궫; 궫; ) HANGUL SYLLABLE GWED +ADAC;ADAC;1100 1170 11AF;ADAC;1100 1170 11AF; # (궬; 궬; 궬; 궬; 궬; ) HANGUL SYLLABLE GWEL +ADAD;ADAD;1100 1170 11B0;ADAD;1100 1170 11B0; # (궭; 궭; 궭; 궭; 궭; ) HANGUL SYLLABLE GWELG +ADAE;ADAE;1100 1170 11B1;ADAE;1100 1170 11B1; # (궮; 궮; 궮; 궮; 궮; ) HANGUL SYLLABLE GWELM +ADAF;ADAF;1100 1170 11B2;ADAF;1100 1170 11B2; # (궯; 궯; 궯; 궯; 궯; ) HANGUL SYLLABLE GWELB +ADB0;ADB0;1100 1170 11B3;ADB0;1100 1170 11B3; # (궰; 궰; 궰; 궰; 궰; ) HANGUL SYLLABLE GWELS +ADB1;ADB1;1100 1170 11B4;ADB1;1100 1170 11B4; # (궱; 궱; 궱; 궱; 궱; ) HANGUL SYLLABLE GWELT +ADB2;ADB2;1100 1170 11B5;ADB2;1100 1170 11B5; # (궲; 궲; 궲; 궲; 궲; ) HANGUL SYLLABLE GWELP +ADB3;ADB3;1100 1170 11B6;ADB3;1100 1170 11B6; # (궳; 궳; 궳; 궳; 궳; ) HANGUL SYLLABLE GWELH +ADB4;ADB4;1100 1170 11B7;ADB4;1100 1170 11B7; # (궴; 궴; 궴; 궴; 궴; ) HANGUL SYLLABLE GWEM +ADB5;ADB5;1100 1170 11B8;ADB5;1100 1170 11B8; # (궵; 궵; 궵; 궵; 궵; ) HANGUL SYLLABLE GWEB +ADB6;ADB6;1100 1170 11B9;ADB6;1100 1170 11B9; # (궶; 궶; 궶; 궶; 궶; ) HANGUL SYLLABLE GWEBS +ADB7;ADB7;1100 1170 11BA;ADB7;1100 1170 11BA; # (궷; 궷; 궷; 궷; 궷; ) HANGUL SYLLABLE GWES +ADB8;ADB8;1100 1170 11BB;ADB8;1100 1170 11BB; # (궸; 궸; 궸; 궸; 궸; ) HANGUL SYLLABLE GWESS +ADB9;ADB9;1100 1170 11BC;ADB9;1100 1170 11BC; # (궹; 궹; 궹; 궹; 궹; ) HANGUL SYLLABLE GWENG +ADBA;ADBA;1100 1170 11BD;ADBA;1100 1170 11BD; # (궺; 궺; 궺; 궺; 궺; ) HANGUL SYLLABLE GWEJ +ADBB;ADBB;1100 1170 11BE;ADBB;1100 1170 11BE; # (궻; 궻; 궻; 궻; 궻; ) HANGUL SYLLABLE GWEC +ADBC;ADBC;1100 1170 11BF;ADBC;1100 1170 11BF; # (궼; 궼; 궼; 궼; 궼; ) HANGUL SYLLABLE GWEK +ADBD;ADBD;1100 1170 11C0;ADBD;1100 1170 11C0; # (궽; 궽; 궽; 궽; 궽; ) HANGUL SYLLABLE GWET +ADBE;ADBE;1100 1170 11C1;ADBE;1100 1170 11C1; # (궾; 궾; 궾; 궾; 궾; ) HANGUL SYLLABLE GWEP +ADBF;ADBF;1100 1170 11C2;ADBF;1100 1170 11C2; # (궿; 궿; 궿; 궿; 궿; ) HANGUL SYLLABLE GWEH +ADC0;ADC0;1100 1171;ADC0;1100 1171; # (귀; 귀; 귀; 귀; 귀; ) HANGUL SYLLABLE GWI +ADC1;ADC1;1100 1171 11A8;ADC1;1100 1171 11A8; # (귁; 귁; 귁; 귁; 귁; ) HANGUL SYLLABLE GWIG +ADC2;ADC2;1100 1171 11A9;ADC2;1100 1171 11A9; # (귂; 귂; 귂; 귂; 귂; ) HANGUL SYLLABLE GWIGG +ADC3;ADC3;1100 1171 11AA;ADC3;1100 1171 11AA; # (귃; 귃; 귃; 귃; 귃; ) HANGUL SYLLABLE GWIGS +ADC4;ADC4;1100 1171 11AB;ADC4;1100 1171 11AB; # (귄; 귄; 귄; 귄; 귄; ) HANGUL SYLLABLE GWIN +ADC5;ADC5;1100 1171 11AC;ADC5;1100 1171 11AC; # (귅; 귅; 귅; 귅; 귅; ) HANGUL SYLLABLE GWINJ +ADC6;ADC6;1100 1171 11AD;ADC6;1100 1171 11AD; # (귆; 귆; 귆; 귆; 귆; ) HANGUL SYLLABLE GWINH +ADC7;ADC7;1100 1171 11AE;ADC7;1100 1171 11AE; # (귇; 귇; 귇; 귇; 귇; ) HANGUL SYLLABLE GWID +ADC8;ADC8;1100 1171 11AF;ADC8;1100 1171 11AF; # (귈; 귈; 귈; 귈; 귈; ) HANGUL SYLLABLE GWIL +ADC9;ADC9;1100 1171 11B0;ADC9;1100 1171 11B0; # (귉; 귉; 귉; 귉; 귉; ) HANGUL SYLLABLE GWILG +ADCA;ADCA;1100 1171 11B1;ADCA;1100 1171 11B1; # (귊; 귊; 귊; 귊; 귊; ) HANGUL SYLLABLE GWILM +ADCB;ADCB;1100 1171 11B2;ADCB;1100 1171 11B2; # (귋; 귋; 귋; 귋; 귋; ) HANGUL SYLLABLE GWILB +ADCC;ADCC;1100 1171 11B3;ADCC;1100 1171 11B3; # (귌; 귌; 귌; 귌; 귌; ) HANGUL SYLLABLE GWILS +ADCD;ADCD;1100 1171 11B4;ADCD;1100 1171 11B4; # (귍; 귍; 귍; 귍; 귍; ) HANGUL SYLLABLE GWILT +ADCE;ADCE;1100 1171 11B5;ADCE;1100 1171 11B5; # (귎; 귎; 귎; 귎; 귎; ) HANGUL SYLLABLE GWILP +ADCF;ADCF;1100 1171 11B6;ADCF;1100 1171 11B6; # (귏; 귏; 귏; 귏; 귏; ) HANGUL SYLLABLE GWILH +ADD0;ADD0;1100 1171 11B7;ADD0;1100 1171 11B7; # (귐; 귐; 귐; 귐; 귐; ) HANGUL SYLLABLE GWIM +ADD1;ADD1;1100 1171 11B8;ADD1;1100 1171 11B8; # (귑; 귑; 귑; 귑; 귑; ) HANGUL SYLLABLE GWIB +ADD2;ADD2;1100 1171 11B9;ADD2;1100 1171 11B9; # (귒; 귒; 귒; 귒; 귒; ) HANGUL SYLLABLE GWIBS +ADD3;ADD3;1100 1171 11BA;ADD3;1100 1171 11BA; # (귓; 귓; 귓; 귓; 귓; ) HANGUL SYLLABLE GWIS +ADD4;ADD4;1100 1171 11BB;ADD4;1100 1171 11BB; # (귔; 귔; 귔; 귔; 귔; ) HANGUL SYLLABLE GWISS +ADD5;ADD5;1100 1171 11BC;ADD5;1100 1171 11BC; # (귕; 귕; 귕; 귕; 귕; ) HANGUL SYLLABLE GWING +ADD6;ADD6;1100 1171 11BD;ADD6;1100 1171 11BD; # (귖; 귖; 귖; 귖; 귖; ) HANGUL SYLLABLE GWIJ +ADD7;ADD7;1100 1171 11BE;ADD7;1100 1171 11BE; # (귗; 귗; 귗; 귗; 귗; ) HANGUL SYLLABLE GWIC +ADD8;ADD8;1100 1171 11BF;ADD8;1100 1171 11BF; # (귘; 귘; 귘; 귘; 귘; ) HANGUL SYLLABLE GWIK +ADD9;ADD9;1100 1171 11C0;ADD9;1100 1171 11C0; # (귙; 귙; 귙; 귙; 귙; ) HANGUL SYLLABLE GWIT +ADDA;ADDA;1100 1171 11C1;ADDA;1100 1171 11C1; # (귚; 귚; 귚; 귚; 귚; ) HANGUL SYLLABLE GWIP +ADDB;ADDB;1100 1171 11C2;ADDB;1100 1171 11C2; # (귛; 귛; 귛; 귛; 귛; ) HANGUL SYLLABLE GWIH +ADDC;ADDC;1100 1172;ADDC;1100 1172; # (규; 규; 규; 규; 규; ) HANGUL SYLLABLE GYU +ADDD;ADDD;1100 1172 11A8;ADDD;1100 1172 11A8; # (귝; 귝; 귝; 귝; 귝; ) HANGUL SYLLABLE GYUG +ADDE;ADDE;1100 1172 11A9;ADDE;1100 1172 11A9; # (귞; 귞; 귞; 귞; 귞; ) HANGUL SYLLABLE GYUGG +ADDF;ADDF;1100 1172 11AA;ADDF;1100 1172 11AA; # (귟; 귟; 귟; 귟; 귟; ) HANGUL SYLLABLE GYUGS +ADE0;ADE0;1100 1172 11AB;ADE0;1100 1172 11AB; # (균; 균; 균; 균; 균; ) HANGUL SYLLABLE GYUN +ADE1;ADE1;1100 1172 11AC;ADE1;1100 1172 11AC; # (귡; 귡; 귡; 귡; 귡; ) HANGUL SYLLABLE GYUNJ +ADE2;ADE2;1100 1172 11AD;ADE2;1100 1172 11AD; # (귢; 귢; 귢; 귢; 귢; ) HANGUL SYLLABLE GYUNH +ADE3;ADE3;1100 1172 11AE;ADE3;1100 1172 11AE; # (귣; 귣; 귣; 귣; 귣; ) HANGUL SYLLABLE GYUD +ADE4;ADE4;1100 1172 11AF;ADE4;1100 1172 11AF; # (귤; 귤; 귤; 귤; 귤; ) HANGUL SYLLABLE GYUL +ADE5;ADE5;1100 1172 11B0;ADE5;1100 1172 11B0; # (귥; 귥; 귥; 귥; 귥; ) HANGUL SYLLABLE GYULG +ADE6;ADE6;1100 1172 11B1;ADE6;1100 1172 11B1; # (귦; 귦; 귦; 귦; 귦; ) HANGUL SYLLABLE GYULM +ADE7;ADE7;1100 1172 11B2;ADE7;1100 1172 11B2; # (귧; 귧; 귧; 귧; 귧; ) HANGUL SYLLABLE GYULB +ADE8;ADE8;1100 1172 11B3;ADE8;1100 1172 11B3; # (귨; 귨; 귨; 귨; 귨; ) HANGUL SYLLABLE GYULS +ADE9;ADE9;1100 1172 11B4;ADE9;1100 1172 11B4; # (귩; 귩; 귩; 귩; 귩; ) HANGUL SYLLABLE GYULT +ADEA;ADEA;1100 1172 11B5;ADEA;1100 1172 11B5; # (귪; 귪; 귪; 귪; 귪; ) HANGUL SYLLABLE GYULP +ADEB;ADEB;1100 1172 11B6;ADEB;1100 1172 11B6; # (귫; 귫; 귫; 귫; 귫; ) HANGUL SYLLABLE GYULH +ADEC;ADEC;1100 1172 11B7;ADEC;1100 1172 11B7; # (귬; 귬; 귬; 귬; 귬; ) HANGUL SYLLABLE GYUM +ADED;ADED;1100 1172 11B8;ADED;1100 1172 11B8; # (귭; 귭; 귭; 귭; 귭; ) HANGUL SYLLABLE GYUB +ADEE;ADEE;1100 1172 11B9;ADEE;1100 1172 11B9; # (귮; 귮; 귮; 귮; 귮; ) HANGUL SYLLABLE GYUBS +ADEF;ADEF;1100 1172 11BA;ADEF;1100 1172 11BA; # (귯; 귯; 귯; 귯; 귯; ) HANGUL SYLLABLE GYUS +ADF0;ADF0;1100 1172 11BB;ADF0;1100 1172 11BB; # (귰; 귰; 귰; 귰; 귰; ) HANGUL SYLLABLE GYUSS +ADF1;ADF1;1100 1172 11BC;ADF1;1100 1172 11BC; # (귱; 귱; 귱; 귱; 귱; ) HANGUL SYLLABLE GYUNG +ADF2;ADF2;1100 1172 11BD;ADF2;1100 1172 11BD; # (귲; 귲; 귲; 귲; 귲; ) HANGUL SYLLABLE GYUJ +ADF3;ADF3;1100 1172 11BE;ADF3;1100 1172 11BE; # (귳; 귳; 귳; 귳; 귳; ) HANGUL SYLLABLE GYUC +ADF4;ADF4;1100 1172 11BF;ADF4;1100 1172 11BF; # (귴; 귴; 귴; 귴; 귴; ) HANGUL SYLLABLE GYUK +ADF5;ADF5;1100 1172 11C0;ADF5;1100 1172 11C0; # (귵; 귵; 귵; 귵; 귵; ) HANGUL SYLLABLE GYUT +ADF6;ADF6;1100 1172 11C1;ADF6;1100 1172 11C1; # (귶; 귶; 귶; 귶; 귶; ) HANGUL SYLLABLE GYUP +ADF7;ADF7;1100 1172 11C2;ADF7;1100 1172 11C2; # (귷; 귷; 귷; 귷; 귷; ) HANGUL SYLLABLE GYUH +ADF8;ADF8;1100 1173;ADF8;1100 1173; # (그; 그; 그; 그; 그; ) HANGUL SYLLABLE GEU +ADF9;ADF9;1100 1173 11A8;ADF9;1100 1173 11A8; # (극; 극; 극; 극; 극; ) HANGUL SYLLABLE GEUG +ADFA;ADFA;1100 1173 11A9;ADFA;1100 1173 11A9; # (귺; 귺; 귺; 귺; 귺; ) HANGUL SYLLABLE GEUGG +ADFB;ADFB;1100 1173 11AA;ADFB;1100 1173 11AA; # (귻; 귻; 귻; 귻; 귻; ) HANGUL SYLLABLE GEUGS +ADFC;ADFC;1100 1173 11AB;ADFC;1100 1173 11AB; # (근; 근; 근; 근; 근; ) HANGUL SYLLABLE GEUN +ADFD;ADFD;1100 1173 11AC;ADFD;1100 1173 11AC; # (귽; 귽; 귽; 귽; 귽; ) HANGUL SYLLABLE GEUNJ +ADFE;ADFE;1100 1173 11AD;ADFE;1100 1173 11AD; # (귾; 귾; 귾; 귾; 귾; ) HANGUL SYLLABLE GEUNH +ADFF;ADFF;1100 1173 11AE;ADFF;1100 1173 11AE; # (귿; 귿; 귿; 귿; 귿; ) HANGUL SYLLABLE GEUD +AE00;AE00;1100 1173 11AF;AE00;1100 1173 11AF; # (글; 글; 글; 글; 글; ) HANGUL SYLLABLE GEUL +AE01;AE01;1100 1173 11B0;AE01;1100 1173 11B0; # (긁; 긁; 긁; 긁; 긁; ) HANGUL SYLLABLE GEULG +AE02;AE02;1100 1173 11B1;AE02;1100 1173 11B1; # (긂; 긂; 긂; 긂; 긂; ) HANGUL SYLLABLE GEULM +AE03;AE03;1100 1173 11B2;AE03;1100 1173 11B2; # (긃; 긃; 긃; 긃; 긃; ) HANGUL SYLLABLE GEULB +AE04;AE04;1100 1173 11B3;AE04;1100 1173 11B3; # (긄; 긄; 긄; 긄; 긄; ) HANGUL SYLLABLE GEULS +AE05;AE05;1100 1173 11B4;AE05;1100 1173 11B4; # (긅; 긅; 긅; 긅; 긅; ) HANGUL SYLLABLE GEULT +AE06;AE06;1100 1173 11B5;AE06;1100 1173 11B5; # (긆; 긆; 긆; 긆; 긆; ) HANGUL SYLLABLE GEULP +AE07;AE07;1100 1173 11B6;AE07;1100 1173 11B6; # (긇; 긇; 긇; 긇; 긇; ) HANGUL SYLLABLE GEULH +AE08;AE08;1100 1173 11B7;AE08;1100 1173 11B7; # (금; 금; 금; 금; 금; ) HANGUL SYLLABLE GEUM +AE09;AE09;1100 1173 11B8;AE09;1100 1173 11B8; # (급; 급; 급; 급; 급; ) HANGUL SYLLABLE GEUB +AE0A;AE0A;1100 1173 11B9;AE0A;1100 1173 11B9; # (긊; 긊; 긊; 긊; 긊; ) HANGUL SYLLABLE GEUBS +AE0B;AE0B;1100 1173 11BA;AE0B;1100 1173 11BA; # (긋; 긋; 긋; 긋; 긋; ) HANGUL SYLLABLE GEUS +AE0C;AE0C;1100 1173 11BB;AE0C;1100 1173 11BB; # (긌; 긌; 긌; 긌; 긌; ) HANGUL SYLLABLE GEUSS +AE0D;AE0D;1100 1173 11BC;AE0D;1100 1173 11BC; # (긍; 긍; 긍; 긍; 긍; ) HANGUL SYLLABLE GEUNG +AE0E;AE0E;1100 1173 11BD;AE0E;1100 1173 11BD; # (긎; 긎; 긎; 긎; 긎; ) HANGUL SYLLABLE GEUJ +AE0F;AE0F;1100 1173 11BE;AE0F;1100 1173 11BE; # (긏; 긏; 긏; 긏; 긏; ) HANGUL SYLLABLE GEUC +AE10;AE10;1100 1173 11BF;AE10;1100 1173 11BF; # (긐; 긐; 긐; 긐; 긐; ) HANGUL SYLLABLE GEUK +AE11;AE11;1100 1173 11C0;AE11;1100 1173 11C0; # (긑; 긑; 긑; 긑; 긑; ) HANGUL SYLLABLE GEUT +AE12;AE12;1100 1173 11C1;AE12;1100 1173 11C1; # (긒; 긒; 긒; 긒; 긒; ) HANGUL SYLLABLE GEUP +AE13;AE13;1100 1173 11C2;AE13;1100 1173 11C2; # (긓; 긓; 긓; 긓; 긓; ) HANGUL SYLLABLE GEUH +AE14;AE14;1100 1174;AE14;1100 1174; # (긔; 긔; 긔; 긔; 긔; ) HANGUL SYLLABLE GYI +AE15;AE15;1100 1174 11A8;AE15;1100 1174 11A8; # (긕; 긕; 긕; 긕; 긕; ) HANGUL SYLLABLE GYIG +AE16;AE16;1100 1174 11A9;AE16;1100 1174 11A9; # (긖; 긖; 긖; 긖; 긖; ) HANGUL SYLLABLE GYIGG +AE17;AE17;1100 1174 11AA;AE17;1100 1174 11AA; # (긗; 긗; 긗; 긗; 긗; ) HANGUL SYLLABLE GYIGS +AE18;AE18;1100 1174 11AB;AE18;1100 1174 11AB; # (긘; 긘; 긘; 긘; 긘; ) HANGUL SYLLABLE GYIN +AE19;AE19;1100 1174 11AC;AE19;1100 1174 11AC; # (긙; 긙; 긙; 긙; 긙; ) HANGUL SYLLABLE GYINJ +AE1A;AE1A;1100 1174 11AD;AE1A;1100 1174 11AD; # (긚; 긚; 긚; 긚; 긚; ) HANGUL SYLLABLE GYINH +AE1B;AE1B;1100 1174 11AE;AE1B;1100 1174 11AE; # (긛; 긛; 긛; 긛; 긛; ) HANGUL SYLLABLE GYID +AE1C;AE1C;1100 1174 11AF;AE1C;1100 1174 11AF; # (긜; 긜; 긜; 긜; 긜; ) HANGUL SYLLABLE GYIL +AE1D;AE1D;1100 1174 11B0;AE1D;1100 1174 11B0; # (긝; 긝; 긝; 긝; 긝; ) HANGUL SYLLABLE GYILG +AE1E;AE1E;1100 1174 11B1;AE1E;1100 1174 11B1; # (긞; 긞; 긞; 긞; 긞; ) HANGUL SYLLABLE GYILM +AE1F;AE1F;1100 1174 11B2;AE1F;1100 1174 11B2; # (긟; 긟; 긟; 긟; 긟; ) HANGUL SYLLABLE GYILB +AE20;AE20;1100 1174 11B3;AE20;1100 1174 11B3; # (긠; 긠; 긠; 긠; 긠; ) HANGUL SYLLABLE GYILS +AE21;AE21;1100 1174 11B4;AE21;1100 1174 11B4; # (긡; 긡; 긡; 긡; 긡; ) HANGUL SYLLABLE GYILT +AE22;AE22;1100 1174 11B5;AE22;1100 1174 11B5; # (긢; 긢; 긢; 긢; 긢; ) HANGUL SYLLABLE GYILP +AE23;AE23;1100 1174 11B6;AE23;1100 1174 11B6; # (긣; 긣; 긣; 긣; 긣; ) HANGUL SYLLABLE GYILH +AE24;AE24;1100 1174 11B7;AE24;1100 1174 11B7; # (긤; 긤; 긤; 긤; 긤; ) HANGUL SYLLABLE GYIM +AE25;AE25;1100 1174 11B8;AE25;1100 1174 11B8; # (긥; 긥; 긥; 긥; 긥; ) HANGUL SYLLABLE GYIB +AE26;AE26;1100 1174 11B9;AE26;1100 1174 11B9; # (긦; 긦; 긦; 긦; 긦; ) HANGUL SYLLABLE GYIBS +AE27;AE27;1100 1174 11BA;AE27;1100 1174 11BA; # (긧; 긧; 긧; 긧; 긧; ) HANGUL SYLLABLE GYIS +AE28;AE28;1100 1174 11BB;AE28;1100 1174 11BB; # (긨; 긨; 긨; 긨; 긨; ) HANGUL SYLLABLE GYISS +AE29;AE29;1100 1174 11BC;AE29;1100 1174 11BC; # (긩; 긩; 긩; 긩; 긩; ) HANGUL SYLLABLE GYING +AE2A;AE2A;1100 1174 11BD;AE2A;1100 1174 11BD; # (긪; 긪; 긪; 긪; 긪; ) HANGUL SYLLABLE GYIJ +AE2B;AE2B;1100 1174 11BE;AE2B;1100 1174 11BE; # (긫; 긫; 긫; 긫; 긫; ) HANGUL SYLLABLE GYIC +AE2C;AE2C;1100 1174 11BF;AE2C;1100 1174 11BF; # (긬; 긬; 긬; 긬; 긬; ) HANGUL SYLLABLE GYIK +AE2D;AE2D;1100 1174 11C0;AE2D;1100 1174 11C0; # (긭; 긭; 긭; 긭; 긭; ) HANGUL SYLLABLE GYIT +AE2E;AE2E;1100 1174 11C1;AE2E;1100 1174 11C1; # (긮; 긮; 긮; 긮; 긮; ) HANGUL SYLLABLE GYIP +AE2F;AE2F;1100 1174 11C2;AE2F;1100 1174 11C2; # (긯; 긯; 긯; 긯; 긯; ) HANGUL SYLLABLE GYIH +AE30;AE30;1100 1175;AE30;1100 1175; # (기; 기; 기; 기; 기; ) HANGUL SYLLABLE GI +AE31;AE31;1100 1175 11A8;AE31;1100 1175 11A8; # (긱; 긱; 긱; 긱; 긱; ) HANGUL SYLLABLE GIG +AE32;AE32;1100 1175 11A9;AE32;1100 1175 11A9; # (긲; 긲; 긲; 긲; 긲; ) HANGUL SYLLABLE GIGG +AE33;AE33;1100 1175 11AA;AE33;1100 1175 11AA; # (긳; 긳; 긳; 긳; 긳; ) HANGUL SYLLABLE GIGS +AE34;AE34;1100 1175 11AB;AE34;1100 1175 11AB; # (긴; 긴; 긴; 긴; 긴; ) HANGUL SYLLABLE GIN +AE35;AE35;1100 1175 11AC;AE35;1100 1175 11AC; # (긵; 긵; 긵; 긵; 긵; ) HANGUL SYLLABLE GINJ +AE36;AE36;1100 1175 11AD;AE36;1100 1175 11AD; # (긶; 긶; 긶; 긶; 긶; ) HANGUL SYLLABLE GINH +AE37;AE37;1100 1175 11AE;AE37;1100 1175 11AE; # (긷; 긷; 긷; 긷; 긷; ) HANGUL SYLLABLE GID +AE38;AE38;1100 1175 11AF;AE38;1100 1175 11AF; # (길; 길; 길; 길; 길; ) HANGUL SYLLABLE GIL +AE39;AE39;1100 1175 11B0;AE39;1100 1175 11B0; # (긹; 긹; 긹; 긹; 긹; ) HANGUL SYLLABLE GILG +AE3A;AE3A;1100 1175 11B1;AE3A;1100 1175 11B1; # (긺; 긺; 긺; 긺; 긺; ) HANGUL SYLLABLE GILM +AE3B;AE3B;1100 1175 11B2;AE3B;1100 1175 11B2; # (긻; 긻; 긻; 긻; 긻; ) HANGUL SYLLABLE GILB +AE3C;AE3C;1100 1175 11B3;AE3C;1100 1175 11B3; # (긼; 긼; 긼; 긼; 긼; ) HANGUL SYLLABLE GILS +AE3D;AE3D;1100 1175 11B4;AE3D;1100 1175 11B4; # (긽; 긽; 긽; 긽; 긽; ) HANGUL SYLLABLE GILT +AE3E;AE3E;1100 1175 11B5;AE3E;1100 1175 11B5; # (긾; 긾; 긾; 긾; 긾; ) HANGUL SYLLABLE GILP +AE3F;AE3F;1100 1175 11B6;AE3F;1100 1175 11B6; # (긿; 긿; 긿; 긿; 긿; ) HANGUL SYLLABLE GILH +AE40;AE40;1100 1175 11B7;AE40;1100 1175 11B7; # (김; 김; 김; 김; 김; ) HANGUL SYLLABLE GIM +AE41;AE41;1100 1175 11B8;AE41;1100 1175 11B8; # (깁; 깁; 깁; 깁; 깁; ) HANGUL SYLLABLE GIB +AE42;AE42;1100 1175 11B9;AE42;1100 1175 11B9; # (깂; 깂; 깂; 깂; 깂; ) HANGUL SYLLABLE GIBS +AE43;AE43;1100 1175 11BA;AE43;1100 1175 11BA; # (깃; 깃; 깃; 깃; 깃; ) HANGUL SYLLABLE GIS +AE44;AE44;1100 1175 11BB;AE44;1100 1175 11BB; # (깄; 깄; 깄; 깄; 깄; ) HANGUL SYLLABLE GISS +AE45;AE45;1100 1175 11BC;AE45;1100 1175 11BC; # (깅; 깅; 깅; 깅; 깅; ) HANGUL SYLLABLE GING +AE46;AE46;1100 1175 11BD;AE46;1100 1175 11BD; # (깆; 깆; 깆; 깆; 깆; ) HANGUL SYLLABLE GIJ +AE47;AE47;1100 1175 11BE;AE47;1100 1175 11BE; # (깇; 깇; 깇; 깇; 깇; ) HANGUL SYLLABLE GIC +AE48;AE48;1100 1175 11BF;AE48;1100 1175 11BF; # (깈; 깈; 깈; 깈; 깈; ) HANGUL SYLLABLE GIK +AE49;AE49;1100 1175 11C0;AE49;1100 1175 11C0; # (깉; 깉; 깉; 깉; 깉; ) HANGUL SYLLABLE GIT +AE4A;AE4A;1100 1175 11C1;AE4A;1100 1175 11C1; # (깊; 깊; 깊; 깊; 깊; ) HANGUL SYLLABLE GIP +AE4B;AE4B;1100 1175 11C2;AE4B;1100 1175 11C2; # (깋; 깋; 깋; 깋; 깋; ) HANGUL SYLLABLE GIH +AE4C;AE4C;1101 1161;AE4C;1101 1161; # (까; 까; 까; 까; 까; ) HANGUL SYLLABLE GGA +AE4D;AE4D;1101 1161 11A8;AE4D;1101 1161 11A8; # (깍; 깍; 깍; 깍; 깍; ) HANGUL SYLLABLE GGAG +AE4E;AE4E;1101 1161 11A9;AE4E;1101 1161 11A9; # (깎; 깎; 깎; 깎; 깎; ) HANGUL SYLLABLE GGAGG +AE4F;AE4F;1101 1161 11AA;AE4F;1101 1161 11AA; # (깏; 깏; 깏; 깏; 깏; ) HANGUL SYLLABLE GGAGS +AE50;AE50;1101 1161 11AB;AE50;1101 1161 11AB; # (깐; 깐; 깐; 깐; 깐; ) HANGUL SYLLABLE GGAN +AE51;AE51;1101 1161 11AC;AE51;1101 1161 11AC; # (깑; 깑; 깑; 깑; 깑; ) HANGUL SYLLABLE GGANJ +AE52;AE52;1101 1161 11AD;AE52;1101 1161 11AD; # (깒; 깒; 깒; 깒; 깒; ) HANGUL SYLLABLE GGANH +AE53;AE53;1101 1161 11AE;AE53;1101 1161 11AE; # (깓; 깓; 깓; 깓; 깓; ) HANGUL SYLLABLE GGAD +AE54;AE54;1101 1161 11AF;AE54;1101 1161 11AF; # (깔; 깔; 깔; 깔; 깔; ) HANGUL SYLLABLE GGAL +AE55;AE55;1101 1161 11B0;AE55;1101 1161 11B0; # (깕; 깕; 깕; 깕; 깕; ) HANGUL SYLLABLE GGALG +AE56;AE56;1101 1161 11B1;AE56;1101 1161 11B1; # (깖; 깖; 깖; 깖; 깖; ) HANGUL SYLLABLE GGALM +AE57;AE57;1101 1161 11B2;AE57;1101 1161 11B2; # (깗; 깗; 깗; 깗; 깗; ) HANGUL SYLLABLE GGALB +AE58;AE58;1101 1161 11B3;AE58;1101 1161 11B3; # (깘; 깘; 깘; 깘; 깘; ) HANGUL SYLLABLE GGALS +AE59;AE59;1101 1161 11B4;AE59;1101 1161 11B4; # (깙; 깙; 깙; 깙; 깙; ) HANGUL SYLLABLE GGALT +AE5A;AE5A;1101 1161 11B5;AE5A;1101 1161 11B5; # (깚; 깚; 깚; 깚; 깚; ) HANGUL SYLLABLE GGALP +AE5B;AE5B;1101 1161 11B6;AE5B;1101 1161 11B6; # (깛; 깛; 깛; 깛; 깛; ) HANGUL SYLLABLE GGALH +AE5C;AE5C;1101 1161 11B7;AE5C;1101 1161 11B7; # (깜; 깜; 깜; 깜; 깜; ) HANGUL SYLLABLE GGAM +AE5D;AE5D;1101 1161 11B8;AE5D;1101 1161 11B8; # (깝; 깝; 깝; 깝; 깝; ) HANGUL SYLLABLE GGAB +AE5E;AE5E;1101 1161 11B9;AE5E;1101 1161 11B9; # (깞; 깞; 깞; 깞; 깞; ) HANGUL SYLLABLE GGABS +AE5F;AE5F;1101 1161 11BA;AE5F;1101 1161 11BA; # (깟; 깟; 깟; 깟; 깟; ) HANGUL SYLLABLE GGAS +AE60;AE60;1101 1161 11BB;AE60;1101 1161 11BB; # (깠; 깠; 깠; 깠; 깠; ) HANGUL SYLLABLE GGASS +AE61;AE61;1101 1161 11BC;AE61;1101 1161 11BC; # (깡; 깡; 깡; 깡; 깡; ) HANGUL SYLLABLE GGANG +AE62;AE62;1101 1161 11BD;AE62;1101 1161 11BD; # (깢; 깢; 깢; 깢; 깢; ) HANGUL SYLLABLE GGAJ +AE63;AE63;1101 1161 11BE;AE63;1101 1161 11BE; # (깣; 깣; 깣; 깣; 깣; ) HANGUL SYLLABLE GGAC +AE64;AE64;1101 1161 11BF;AE64;1101 1161 11BF; # (깤; 깤; 깤; 깤; 깤; ) HANGUL SYLLABLE GGAK +AE65;AE65;1101 1161 11C0;AE65;1101 1161 11C0; # (깥; 깥; 깥; 깥; 깥; ) HANGUL SYLLABLE GGAT +AE66;AE66;1101 1161 11C1;AE66;1101 1161 11C1; # (깦; 깦; 깦; 깦; 깦; ) HANGUL SYLLABLE GGAP +AE67;AE67;1101 1161 11C2;AE67;1101 1161 11C2; # (깧; 깧; 깧; 깧; 깧; ) HANGUL SYLLABLE GGAH +AE68;AE68;1101 1162;AE68;1101 1162; # (깨; 깨; 깨; 깨; 깨; ) HANGUL SYLLABLE GGAE +AE69;AE69;1101 1162 11A8;AE69;1101 1162 11A8; # (깩; 깩; 깩; 깩; 깩; ) HANGUL SYLLABLE GGAEG +AE6A;AE6A;1101 1162 11A9;AE6A;1101 1162 11A9; # (깪; 깪; 깪; 깪; 깪; ) HANGUL SYLLABLE GGAEGG +AE6B;AE6B;1101 1162 11AA;AE6B;1101 1162 11AA; # (깫; 깫; 깫; 깫; 깫; ) HANGUL SYLLABLE GGAEGS +AE6C;AE6C;1101 1162 11AB;AE6C;1101 1162 11AB; # (깬; 깬; 깬; 깬; 깬; ) HANGUL SYLLABLE GGAEN +AE6D;AE6D;1101 1162 11AC;AE6D;1101 1162 11AC; # (깭; 깭; 깭; 깭; 깭; ) HANGUL SYLLABLE GGAENJ +AE6E;AE6E;1101 1162 11AD;AE6E;1101 1162 11AD; # (깮; 깮; 깮; 깮; 깮; ) HANGUL SYLLABLE GGAENH +AE6F;AE6F;1101 1162 11AE;AE6F;1101 1162 11AE; # (깯; 깯; 깯; 깯; 깯; ) HANGUL SYLLABLE GGAED +AE70;AE70;1101 1162 11AF;AE70;1101 1162 11AF; # (깰; 깰; 깰; 깰; 깰; ) HANGUL SYLLABLE GGAEL +AE71;AE71;1101 1162 11B0;AE71;1101 1162 11B0; # (깱; 깱; 깱; 깱; 깱; ) HANGUL SYLLABLE GGAELG +AE72;AE72;1101 1162 11B1;AE72;1101 1162 11B1; # (깲; 깲; 깲; 깲; 깲; ) HANGUL SYLLABLE GGAELM +AE73;AE73;1101 1162 11B2;AE73;1101 1162 11B2; # (깳; 깳; 깳; 깳; 깳; ) HANGUL SYLLABLE GGAELB +AE74;AE74;1101 1162 11B3;AE74;1101 1162 11B3; # (깴; 깴; 깴; 깴; 깴; ) HANGUL SYLLABLE GGAELS +AE75;AE75;1101 1162 11B4;AE75;1101 1162 11B4; # (깵; 깵; 깵; 깵; 깵; ) HANGUL SYLLABLE GGAELT +AE76;AE76;1101 1162 11B5;AE76;1101 1162 11B5; # (깶; 깶; 깶; 깶; 깶; ) HANGUL SYLLABLE GGAELP +AE77;AE77;1101 1162 11B6;AE77;1101 1162 11B6; # (깷; 깷; 깷; 깷; 깷; ) HANGUL SYLLABLE GGAELH +AE78;AE78;1101 1162 11B7;AE78;1101 1162 11B7; # (깸; 깸; 깸; 깸; 깸; ) HANGUL SYLLABLE GGAEM +AE79;AE79;1101 1162 11B8;AE79;1101 1162 11B8; # (깹; 깹; 깹; 깹; 깹; ) HANGUL SYLLABLE GGAEB +AE7A;AE7A;1101 1162 11B9;AE7A;1101 1162 11B9; # (깺; 깺; 깺; 깺; 깺; ) HANGUL SYLLABLE GGAEBS +AE7B;AE7B;1101 1162 11BA;AE7B;1101 1162 11BA; # (깻; 깻; 깻; 깻; 깻; ) HANGUL SYLLABLE GGAES +AE7C;AE7C;1101 1162 11BB;AE7C;1101 1162 11BB; # (깼; 깼; 깼; 깼; 깼; ) HANGUL SYLLABLE GGAESS +AE7D;AE7D;1101 1162 11BC;AE7D;1101 1162 11BC; # (깽; 깽; 깽; 깽; 깽; ) HANGUL SYLLABLE GGAENG +AE7E;AE7E;1101 1162 11BD;AE7E;1101 1162 11BD; # (깾; 깾; 깾; 깾; 깾; ) HANGUL SYLLABLE GGAEJ +AE7F;AE7F;1101 1162 11BE;AE7F;1101 1162 11BE; # (깿; 깿; 깿; 깿; 깿; ) HANGUL SYLLABLE GGAEC +AE80;AE80;1101 1162 11BF;AE80;1101 1162 11BF; # (꺀; 꺀; 꺀; 꺀; 꺀; ) HANGUL SYLLABLE GGAEK +AE81;AE81;1101 1162 11C0;AE81;1101 1162 11C0; # (꺁; 꺁; 꺁; 꺁; 꺁; ) HANGUL SYLLABLE GGAET +AE82;AE82;1101 1162 11C1;AE82;1101 1162 11C1; # (꺂; 꺂; 꺂; 꺂; 꺂; ) HANGUL SYLLABLE GGAEP +AE83;AE83;1101 1162 11C2;AE83;1101 1162 11C2; # (꺃; 꺃; 꺃; 꺃; 꺃; ) HANGUL SYLLABLE GGAEH +AE84;AE84;1101 1163;AE84;1101 1163; # (꺄; 꺄; 꺄; 꺄; 꺄; ) HANGUL SYLLABLE GGYA +AE85;AE85;1101 1163 11A8;AE85;1101 1163 11A8; # (꺅; 꺅; 꺅; 꺅; 꺅; ) HANGUL SYLLABLE GGYAG +AE86;AE86;1101 1163 11A9;AE86;1101 1163 11A9; # (꺆; 꺆; 꺆; 꺆; 꺆; ) HANGUL SYLLABLE GGYAGG +AE87;AE87;1101 1163 11AA;AE87;1101 1163 11AA; # (꺇; 꺇; 꺇; 꺇; 꺇; ) HANGUL SYLLABLE GGYAGS +AE88;AE88;1101 1163 11AB;AE88;1101 1163 11AB; # (꺈; 꺈; 꺈; 꺈; 꺈; ) HANGUL SYLLABLE GGYAN +AE89;AE89;1101 1163 11AC;AE89;1101 1163 11AC; # (꺉; 꺉; 꺉; 꺉; 꺉; ) HANGUL SYLLABLE GGYANJ +AE8A;AE8A;1101 1163 11AD;AE8A;1101 1163 11AD; # (꺊; 꺊; 꺊; 꺊; 꺊; ) HANGUL SYLLABLE GGYANH +AE8B;AE8B;1101 1163 11AE;AE8B;1101 1163 11AE; # (꺋; 꺋; 꺋; 꺋; 꺋; ) HANGUL SYLLABLE GGYAD +AE8C;AE8C;1101 1163 11AF;AE8C;1101 1163 11AF; # (꺌; 꺌; 꺌; 꺌; 꺌; ) HANGUL SYLLABLE GGYAL +AE8D;AE8D;1101 1163 11B0;AE8D;1101 1163 11B0; # (꺍; 꺍; 꺍; 꺍; 꺍; ) HANGUL SYLLABLE GGYALG +AE8E;AE8E;1101 1163 11B1;AE8E;1101 1163 11B1; # (꺎; 꺎; 꺎; 꺎; 꺎; ) HANGUL SYLLABLE GGYALM +AE8F;AE8F;1101 1163 11B2;AE8F;1101 1163 11B2; # (꺏; 꺏; 꺏; 꺏; 꺏; ) HANGUL SYLLABLE GGYALB +AE90;AE90;1101 1163 11B3;AE90;1101 1163 11B3; # (꺐; 꺐; 꺐; 꺐; 꺐; ) HANGUL SYLLABLE GGYALS +AE91;AE91;1101 1163 11B4;AE91;1101 1163 11B4; # (꺑; 꺑; 꺑; 꺑; 꺑; ) HANGUL SYLLABLE GGYALT +AE92;AE92;1101 1163 11B5;AE92;1101 1163 11B5; # (꺒; 꺒; 꺒; 꺒; 꺒; ) HANGUL SYLLABLE GGYALP +AE93;AE93;1101 1163 11B6;AE93;1101 1163 11B6; # (꺓; 꺓; 꺓; 꺓; 꺓; ) HANGUL SYLLABLE GGYALH +AE94;AE94;1101 1163 11B7;AE94;1101 1163 11B7; # (꺔; 꺔; 꺔; 꺔; 꺔; ) HANGUL SYLLABLE GGYAM +AE95;AE95;1101 1163 11B8;AE95;1101 1163 11B8; # (꺕; 꺕; 꺕; 꺕; 꺕; ) HANGUL SYLLABLE GGYAB +AE96;AE96;1101 1163 11B9;AE96;1101 1163 11B9; # (꺖; 꺖; 꺖; 꺖; 꺖; ) HANGUL SYLLABLE GGYABS +AE97;AE97;1101 1163 11BA;AE97;1101 1163 11BA; # (꺗; 꺗; 꺗; 꺗; 꺗; ) HANGUL SYLLABLE GGYAS +AE98;AE98;1101 1163 11BB;AE98;1101 1163 11BB; # (꺘; 꺘; 꺘; 꺘; 꺘; ) HANGUL SYLLABLE GGYASS +AE99;AE99;1101 1163 11BC;AE99;1101 1163 11BC; # (꺙; 꺙; 꺙; 꺙; 꺙; ) HANGUL SYLLABLE GGYANG +AE9A;AE9A;1101 1163 11BD;AE9A;1101 1163 11BD; # (꺚; 꺚; 꺚; 꺚; 꺚; ) HANGUL SYLLABLE GGYAJ +AE9B;AE9B;1101 1163 11BE;AE9B;1101 1163 11BE; # (꺛; 꺛; 꺛; 꺛; 꺛; ) HANGUL SYLLABLE GGYAC +AE9C;AE9C;1101 1163 11BF;AE9C;1101 1163 11BF; # (꺜; 꺜; 꺜; 꺜; 꺜; ) HANGUL SYLLABLE GGYAK +AE9D;AE9D;1101 1163 11C0;AE9D;1101 1163 11C0; # (꺝; 꺝; 꺝; 꺝; 꺝; ) HANGUL SYLLABLE GGYAT +AE9E;AE9E;1101 1163 11C1;AE9E;1101 1163 11C1; # (꺞; 꺞; 꺞; 꺞; 꺞; ) HANGUL SYLLABLE GGYAP +AE9F;AE9F;1101 1163 11C2;AE9F;1101 1163 11C2; # (꺟; 꺟; 꺟; 꺟; 꺟; ) HANGUL SYLLABLE GGYAH +AEA0;AEA0;1101 1164;AEA0;1101 1164; # (꺠; 꺠; 꺠; 꺠; 꺠; ) HANGUL SYLLABLE GGYAE +AEA1;AEA1;1101 1164 11A8;AEA1;1101 1164 11A8; # (꺡; 꺡; 꺡; 꺡; 꺡; ) HANGUL SYLLABLE GGYAEG +AEA2;AEA2;1101 1164 11A9;AEA2;1101 1164 11A9; # (꺢; 꺢; 꺢; 꺢; 꺢; ) HANGUL SYLLABLE GGYAEGG +AEA3;AEA3;1101 1164 11AA;AEA3;1101 1164 11AA; # (꺣; 꺣; 꺣; 꺣; 꺣; ) HANGUL SYLLABLE GGYAEGS +AEA4;AEA4;1101 1164 11AB;AEA4;1101 1164 11AB; # (꺤; 꺤; 꺤; 꺤; 꺤; ) HANGUL SYLLABLE GGYAEN +AEA5;AEA5;1101 1164 11AC;AEA5;1101 1164 11AC; # (꺥; 꺥; 꺥; 꺥; 꺥; ) HANGUL SYLLABLE GGYAENJ +AEA6;AEA6;1101 1164 11AD;AEA6;1101 1164 11AD; # (꺦; 꺦; 꺦; 꺦; 꺦; ) HANGUL SYLLABLE GGYAENH +AEA7;AEA7;1101 1164 11AE;AEA7;1101 1164 11AE; # (꺧; 꺧; 꺧; 꺧; 꺧; ) HANGUL SYLLABLE GGYAED +AEA8;AEA8;1101 1164 11AF;AEA8;1101 1164 11AF; # (꺨; 꺨; 꺨; 꺨; 꺨; ) HANGUL SYLLABLE GGYAEL +AEA9;AEA9;1101 1164 11B0;AEA9;1101 1164 11B0; # (꺩; 꺩; 꺩; 꺩; 꺩; ) HANGUL SYLLABLE GGYAELG +AEAA;AEAA;1101 1164 11B1;AEAA;1101 1164 11B1; # (꺪; 꺪; 꺪; 꺪; 꺪; ) HANGUL SYLLABLE GGYAELM +AEAB;AEAB;1101 1164 11B2;AEAB;1101 1164 11B2; # (꺫; 꺫; 꺫; 꺫; 꺫; ) HANGUL SYLLABLE GGYAELB +AEAC;AEAC;1101 1164 11B3;AEAC;1101 1164 11B3; # (꺬; 꺬; 꺬; 꺬; 꺬; ) HANGUL SYLLABLE GGYAELS +AEAD;AEAD;1101 1164 11B4;AEAD;1101 1164 11B4; # (꺭; 꺭; 꺭; 꺭; 꺭; ) HANGUL SYLLABLE GGYAELT +AEAE;AEAE;1101 1164 11B5;AEAE;1101 1164 11B5; # (꺮; 꺮; 꺮; 꺮; 꺮; ) HANGUL SYLLABLE GGYAELP +AEAF;AEAF;1101 1164 11B6;AEAF;1101 1164 11B6; # (꺯; 꺯; 꺯; 꺯; 꺯; ) HANGUL SYLLABLE GGYAELH +AEB0;AEB0;1101 1164 11B7;AEB0;1101 1164 11B7; # (꺰; 꺰; 꺰; 꺰; 꺰; ) HANGUL SYLLABLE GGYAEM +AEB1;AEB1;1101 1164 11B8;AEB1;1101 1164 11B8; # (꺱; 꺱; 꺱; 꺱; 꺱; ) HANGUL SYLLABLE GGYAEB +AEB2;AEB2;1101 1164 11B9;AEB2;1101 1164 11B9; # (꺲; 꺲; 꺲; 꺲; 꺲; ) HANGUL SYLLABLE GGYAEBS +AEB3;AEB3;1101 1164 11BA;AEB3;1101 1164 11BA; # (꺳; 꺳; 꺳; 꺳; 꺳; ) HANGUL SYLLABLE GGYAES +AEB4;AEB4;1101 1164 11BB;AEB4;1101 1164 11BB; # (꺴; 꺴; 꺴; 꺴; 꺴; ) HANGUL SYLLABLE GGYAESS +AEB5;AEB5;1101 1164 11BC;AEB5;1101 1164 11BC; # (꺵; 꺵; 꺵; 꺵; 꺵; ) HANGUL SYLLABLE GGYAENG +AEB6;AEB6;1101 1164 11BD;AEB6;1101 1164 11BD; # (꺶; 꺶; 꺶; 꺶; 꺶; ) HANGUL SYLLABLE GGYAEJ +AEB7;AEB7;1101 1164 11BE;AEB7;1101 1164 11BE; # (꺷; 꺷; 꺷; 꺷; 꺷; ) HANGUL SYLLABLE GGYAEC +AEB8;AEB8;1101 1164 11BF;AEB8;1101 1164 11BF; # (꺸; 꺸; 꺸; 꺸; 꺸; ) HANGUL SYLLABLE GGYAEK +AEB9;AEB9;1101 1164 11C0;AEB9;1101 1164 11C0; # (꺹; 꺹; 꺹; 꺹; 꺹; ) HANGUL SYLLABLE GGYAET +AEBA;AEBA;1101 1164 11C1;AEBA;1101 1164 11C1; # (꺺; 꺺; 꺺; 꺺; 꺺; ) HANGUL SYLLABLE GGYAEP +AEBB;AEBB;1101 1164 11C2;AEBB;1101 1164 11C2; # (꺻; 꺻; 꺻; 꺻; 꺻; ) HANGUL SYLLABLE GGYAEH +AEBC;AEBC;1101 1165;AEBC;1101 1165; # (꺼; 꺼; 꺼; 꺼; 꺼; ) HANGUL SYLLABLE GGEO +AEBD;AEBD;1101 1165 11A8;AEBD;1101 1165 11A8; # (꺽; 꺽; 꺽; 꺽; 꺽; ) HANGUL SYLLABLE GGEOG +AEBE;AEBE;1101 1165 11A9;AEBE;1101 1165 11A9; # (꺾; 꺾; 꺾; 꺾; 꺾; ) HANGUL SYLLABLE GGEOGG +AEBF;AEBF;1101 1165 11AA;AEBF;1101 1165 11AA; # (꺿; 꺿; 꺿; 꺿; 꺿; ) HANGUL SYLLABLE GGEOGS +AEC0;AEC0;1101 1165 11AB;AEC0;1101 1165 11AB; # (껀; 껀; 껀; 껀; 껀; ) HANGUL SYLLABLE GGEON +AEC1;AEC1;1101 1165 11AC;AEC1;1101 1165 11AC; # (껁; 껁; 껁; 껁; 껁; ) HANGUL SYLLABLE GGEONJ +AEC2;AEC2;1101 1165 11AD;AEC2;1101 1165 11AD; # (껂; 껂; 껂; 껂; 껂; ) HANGUL SYLLABLE GGEONH +AEC3;AEC3;1101 1165 11AE;AEC3;1101 1165 11AE; # (껃; 껃; 껃; 껃; 껃; ) HANGUL SYLLABLE GGEOD +AEC4;AEC4;1101 1165 11AF;AEC4;1101 1165 11AF; # (껄; 껄; 껄; 껄; 껄; ) HANGUL SYLLABLE GGEOL +AEC5;AEC5;1101 1165 11B0;AEC5;1101 1165 11B0; # (껅; 껅; 껅; 껅; 껅; ) HANGUL SYLLABLE GGEOLG +AEC6;AEC6;1101 1165 11B1;AEC6;1101 1165 11B1; # (껆; 껆; 껆; 껆; 껆; ) HANGUL SYLLABLE GGEOLM +AEC7;AEC7;1101 1165 11B2;AEC7;1101 1165 11B2; # (껇; 껇; 껇; 껇; 껇; ) HANGUL SYLLABLE GGEOLB +AEC8;AEC8;1101 1165 11B3;AEC8;1101 1165 11B3; # (껈; 껈; 껈; 껈; 껈; ) HANGUL SYLLABLE GGEOLS +AEC9;AEC9;1101 1165 11B4;AEC9;1101 1165 11B4; # (껉; 껉; 껉; 껉; 껉; ) HANGUL SYLLABLE GGEOLT +AECA;AECA;1101 1165 11B5;AECA;1101 1165 11B5; # (껊; 껊; 껊; 껊; 껊; ) HANGUL SYLLABLE GGEOLP +AECB;AECB;1101 1165 11B6;AECB;1101 1165 11B6; # (껋; 껋; 껋; 껋; 껋; ) HANGUL SYLLABLE GGEOLH +AECC;AECC;1101 1165 11B7;AECC;1101 1165 11B7; # (껌; 껌; 껌; 껌; 껌; ) HANGUL SYLLABLE GGEOM +AECD;AECD;1101 1165 11B8;AECD;1101 1165 11B8; # (껍; 껍; 껍; 껍; 껍; ) HANGUL SYLLABLE GGEOB +AECE;AECE;1101 1165 11B9;AECE;1101 1165 11B9; # (껎; 껎; 껎; 껎; 껎; ) HANGUL SYLLABLE GGEOBS +AECF;AECF;1101 1165 11BA;AECF;1101 1165 11BA; # (껏; 껏; 껏; 껏; 껏; ) HANGUL SYLLABLE GGEOS +AED0;AED0;1101 1165 11BB;AED0;1101 1165 11BB; # (껐; 껐; 껐; 껐; 껐; ) HANGUL SYLLABLE GGEOSS +AED1;AED1;1101 1165 11BC;AED1;1101 1165 11BC; # (껑; 껑; 껑; 껑; 껑; ) HANGUL SYLLABLE GGEONG +AED2;AED2;1101 1165 11BD;AED2;1101 1165 11BD; # (껒; 껒; 껒; 껒; 껒; ) HANGUL SYLLABLE GGEOJ +AED3;AED3;1101 1165 11BE;AED3;1101 1165 11BE; # (껓; 껓; 껓; 껓; 껓; ) HANGUL SYLLABLE GGEOC +AED4;AED4;1101 1165 11BF;AED4;1101 1165 11BF; # (껔; 껔; 껔; 껔; 껔; ) HANGUL SYLLABLE GGEOK +AED5;AED5;1101 1165 11C0;AED5;1101 1165 11C0; # (껕; 껕; 껕; 껕; 껕; ) HANGUL SYLLABLE GGEOT +AED6;AED6;1101 1165 11C1;AED6;1101 1165 11C1; # (껖; 껖; 껖; 껖; 껖; ) HANGUL SYLLABLE GGEOP +AED7;AED7;1101 1165 11C2;AED7;1101 1165 11C2; # (껗; 껗; 껗; 껗; 껗; ) HANGUL SYLLABLE GGEOH +AED8;AED8;1101 1166;AED8;1101 1166; # (께; 께; 께; 께; 께; ) HANGUL SYLLABLE GGE +AED9;AED9;1101 1166 11A8;AED9;1101 1166 11A8; # (껙; 껙; 껙; 껙; 껙; ) HANGUL SYLLABLE GGEG +AEDA;AEDA;1101 1166 11A9;AEDA;1101 1166 11A9; # (껚; 껚; 껚; 껚; 껚; ) HANGUL SYLLABLE GGEGG +AEDB;AEDB;1101 1166 11AA;AEDB;1101 1166 11AA; # (껛; 껛; 껛; 껛; 껛; ) HANGUL SYLLABLE GGEGS +AEDC;AEDC;1101 1166 11AB;AEDC;1101 1166 11AB; # (껜; 껜; 껜; 껜; 껜; ) HANGUL SYLLABLE GGEN +AEDD;AEDD;1101 1166 11AC;AEDD;1101 1166 11AC; # (껝; 껝; 껝; 껝; 껝; ) HANGUL SYLLABLE GGENJ +AEDE;AEDE;1101 1166 11AD;AEDE;1101 1166 11AD; # (껞; 껞; 껞; 껞; 껞; ) HANGUL SYLLABLE GGENH +AEDF;AEDF;1101 1166 11AE;AEDF;1101 1166 11AE; # (껟; 껟; 껟; 껟; 껟; ) HANGUL SYLLABLE GGED +AEE0;AEE0;1101 1166 11AF;AEE0;1101 1166 11AF; # (껠; 껠; 껠; 껠; 껠; ) HANGUL SYLLABLE GGEL +AEE1;AEE1;1101 1166 11B0;AEE1;1101 1166 11B0; # (껡; 껡; 껡; 껡; 껡; ) HANGUL SYLLABLE GGELG +AEE2;AEE2;1101 1166 11B1;AEE2;1101 1166 11B1; # (껢; 껢; 껢; 껢; 껢; ) HANGUL SYLLABLE GGELM +AEE3;AEE3;1101 1166 11B2;AEE3;1101 1166 11B2; # (껣; 껣; 껣; 껣; 껣; ) HANGUL SYLLABLE GGELB +AEE4;AEE4;1101 1166 11B3;AEE4;1101 1166 11B3; # (껤; 껤; 껤; 껤; 껤; ) HANGUL SYLLABLE GGELS +AEE5;AEE5;1101 1166 11B4;AEE5;1101 1166 11B4; # (껥; 껥; 껥; 껥; 껥; ) HANGUL SYLLABLE GGELT +AEE6;AEE6;1101 1166 11B5;AEE6;1101 1166 11B5; # (껦; 껦; 껦; 껦; 껦; ) HANGUL SYLLABLE GGELP +AEE7;AEE7;1101 1166 11B6;AEE7;1101 1166 11B6; # (껧; 껧; 껧; 껧; 껧; ) HANGUL SYLLABLE GGELH +AEE8;AEE8;1101 1166 11B7;AEE8;1101 1166 11B7; # (껨; 껨; 껨; 껨; 껨; ) HANGUL SYLLABLE GGEM +AEE9;AEE9;1101 1166 11B8;AEE9;1101 1166 11B8; # (껩; 껩; 껩; 껩; 껩; ) HANGUL SYLLABLE GGEB +AEEA;AEEA;1101 1166 11B9;AEEA;1101 1166 11B9; # (껪; 껪; 껪; 껪; 껪; ) HANGUL SYLLABLE GGEBS +AEEB;AEEB;1101 1166 11BA;AEEB;1101 1166 11BA; # (껫; 껫; 껫; 껫; 껫; ) HANGUL SYLLABLE GGES +AEEC;AEEC;1101 1166 11BB;AEEC;1101 1166 11BB; # (껬; 껬; 껬; 껬; 껬; ) HANGUL SYLLABLE GGESS +AEED;AEED;1101 1166 11BC;AEED;1101 1166 11BC; # (껭; 껭; 껭; 껭; 껭; ) HANGUL SYLLABLE GGENG +AEEE;AEEE;1101 1166 11BD;AEEE;1101 1166 11BD; # (껮; 껮; 껮; 껮; 껮; ) HANGUL SYLLABLE GGEJ +AEEF;AEEF;1101 1166 11BE;AEEF;1101 1166 11BE; # (껯; 껯; 껯; 껯; 껯; ) HANGUL SYLLABLE GGEC +AEF0;AEF0;1101 1166 11BF;AEF0;1101 1166 11BF; # (껰; 껰; 껰; 껰; 껰; ) HANGUL SYLLABLE GGEK +AEF1;AEF1;1101 1166 11C0;AEF1;1101 1166 11C0; # (껱; 껱; 껱; 껱; 껱; ) HANGUL SYLLABLE GGET +AEF2;AEF2;1101 1166 11C1;AEF2;1101 1166 11C1; # (껲; 껲; 껲; 껲; 껲; ) HANGUL SYLLABLE GGEP +AEF3;AEF3;1101 1166 11C2;AEF3;1101 1166 11C2; # (껳; 껳; 껳; 껳; 껳; ) HANGUL SYLLABLE GGEH +AEF4;AEF4;1101 1167;AEF4;1101 1167; # (껴; 껴; 껴; 껴; 껴; ) HANGUL SYLLABLE GGYEO +AEF5;AEF5;1101 1167 11A8;AEF5;1101 1167 11A8; # (껵; 껵; 껵; 껵; 껵; ) HANGUL SYLLABLE GGYEOG +AEF6;AEF6;1101 1167 11A9;AEF6;1101 1167 11A9; # (껶; 껶; 껶; 껶; 껶; ) HANGUL SYLLABLE GGYEOGG +AEF7;AEF7;1101 1167 11AA;AEF7;1101 1167 11AA; # (껷; 껷; 껷; 껷; 껷; ) HANGUL SYLLABLE GGYEOGS +AEF8;AEF8;1101 1167 11AB;AEF8;1101 1167 11AB; # (껸; 껸; 껸; 껸; 껸; ) HANGUL SYLLABLE GGYEON +AEF9;AEF9;1101 1167 11AC;AEF9;1101 1167 11AC; # (껹; 껹; 껹; 껹; 껹; ) HANGUL SYLLABLE GGYEONJ +AEFA;AEFA;1101 1167 11AD;AEFA;1101 1167 11AD; # (껺; 껺; 껺; 껺; 껺; ) HANGUL SYLLABLE GGYEONH +AEFB;AEFB;1101 1167 11AE;AEFB;1101 1167 11AE; # (껻; 껻; 껻; 껻; 껻; ) HANGUL SYLLABLE GGYEOD +AEFC;AEFC;1101 1167 11AF;AEFC;1101 1167 11AF; # (껼; 껼; 껼; 껼; 껼; ) HANGUL SYLLABLE GGYEOL +AEFD;AEFD;1101 1167 11B0;AEFD;1101 1167 11B0; # (껽; 껽; 껽; 껽; 껽; ) HANGUL SYLLABLE GGYEOLG +AEFE;AEFE;1101 1167 11B1;AEFE;1101 1167 11B1; # (껾; 껾; 껾; 껾; 껾; ) HANGUL SYLLABLE GGYEOLM +AEFF;AEFF;1101 1167 11B2;AEFF;1101 1167 11B2; # (껿; 껿; 껿; 껿; 껿; ) HANGUL SYLLABLE GGYEOLB +AF00;AF00;1101 1167 11B3;AF00;1101 1167 11B3; # (꼀; 꼀; 꼀; 꼀; 꼀; ) HANGUL SYLLABLE GGYEOLS +AF01;AF01;1101 1167 11B4;AF01;1101 1167 11B4; # (꼁; 꼁; 꼁; 꼁; 꼁; ) HANGUL SYLLABLE GGYEOLT +AF02;AF02;1101 1167 11B5;AF02;1101 1167 11B5; # (꼂; 꼂; 꼂; 꼂; 꼂; ) HANGUL SYLLABLE GGYEOLP +AF03;AF03;1101 1167 11B6;AF03;1101 1167 11B6; # (꼃; 꼃; 꼃; 꼃; 꼃; ) HANGUL SYLLABLE GGYEOLH +AF04;AF04;1101 1167 11B7;AF04;1101 1167 11B7; # (꼄; 꼄; 꼄; 꼄; 꼄; ) HANGUL SYLLABLE GGYEOM +AF05;AF05;1101 1167 11B8;AF05;1101 1167 11B8; # (꼅; 꼅; 꼅; 꼅; 꼅; ) HANGUL SYLLABLE GGYEOB +AF06;AF06;1101 1167 11B9;AF06;1101 1167 11B9; # (꼆; 꼆; 꼆; 꼆; 꼆; ) HANGUL SYLLABLE GGYEOBS +AF07;AF07;1101 1167 11BA;AF07;1101 1167 11BA; # (꼇; 꼇; 꼇; 꼇; 꼇; ) HANGUL SYLLABLE GGYEOS +AF08;AF08;1101 1167 11BB;AF08;1101 1167 11BB; # (꼈; 꼈; 꼈; 꼈; 꼈; ) HANGUL SYLLABLE GGYEOSS +AF09;AF09;1101 1167 11BC;AF09;1101 1167 11BC; # (꼉; 꼉; 꼉; 꼉; 꼉; ) HANGUL SYLLABLE GGYEONG +AF0A;AF0A;1101 1167 11BD;AF0A;1101 1167 11BD; # (꼊; 꼊; 꼊; 꼊; 꼊; ) HANGUL SYLLABLE GGYEOJ +AF0B;AF0B;1101 1167 11BE;AF0B;1101 1167 11BE; # (꼋; 꼋; 꼋; 꼋; 꼋; ) HANGUL SYLLABLE GGYEOC +AF0C;AF0C;1101 1167 11BF;AF0C;1101 1167 11BF; # (꼌; 꼌; 꼌; 꼌; 꼌; ) HANGUL SYLLABLE GGYEOK +AF0D;AF0D;1101 1167 11C0;AF0D;1101 1167 11C0; # (꼍; 꼍; 꼍; 꼍; 꼍; ) HANGUL SYLLABLE GGYEOT +AF0E;AF0E;1101 1167 11C1;AF0E;1101 1167 11C1; # (꼎; 꼎; 꼎; 꼎; 꼎; ) HANGUL SYLLABLE GGYEOP +AF0F;AF0F;1101 1167 11C2;AF0F;1101 1167 11C2; # (꼏; 꼏; 꼏; 꼏; 꼏; ) HANGUL SYLLABLE GGYEOH +AF10;AF10;1101 1168;AF10;1101 1168; # (꼐; 꼐; 꼐; 꼐; 꼐; ) HANGUL SYLLABLE GGYE +AF11;AF11;1101 1168 11A8;AF11;1101 1168 11A8; # (꼑; 꼑; 꼑; 꼑; 꼑; ) HANGUL SYLLABLE GGYEG +AF12;AF12;1101 1168 11A9;AF12;1101 1168 11A9; # (꼒; 꼒; 꼒; 꼒; 꼒; ) HANGUL SYLLABLE GGYEGG +AF13;AF13;1101 1168 11AA;AF13;1101 1168 11AA; # (꼓; 꼓; 꼓; 꼓; 꼓; ) HANGUL SYLLABLE GGYEGS +AF14;AF14;1101 1168 11AB;AF14;1101 1168 11AB; # (꼔; 꼔; 꼔; 꼔; 꼔; ) HANGUL SYLLABLE GGYEN +AF15;AF15;1101 1168 11AC;AF15;1101 1168 11AC; # (꼕; 꼕; 꼕; 꼕; 꼕; ) HANGUL SYLLABLE GGYENJ +AF16;AF16;1101 1168 11AD;AF16;1101 1168 11AD; # (꼖; 꼖; 꼖; 꼖; 꼖; ) HANGUL SYLLABLE GGYENH +AF17;AF17;1101 1168 11AE;AF17;1101 1168 11AE; # (꼗; 꼗; 꼗; 꼗; 꼗; ) HANGUL SYLLABLE GGYED +AF18;AF18;1101 1168 11AF;AF18;1101 1168 11AF; # (꼘; 꼘; 꼘; 꼘; 꼘; ) HANGUL SYLLABLE GGYEL +AF19;AF19;1101 1168 11B0;AF19;1101 1168 11B0; # (꼙; 꼙; 꼙; 꼙; 꼙; ) HANGUL SYLLABLE GGYELG +AF1A;AF1A;1101 1168 11B1;AF1A;1101 1168 11B1; # (꼚; 꼚; 꼚; 꼚; 꼚; ) HANGUL SYLLABLE GGYELM +AF1B;AF1B;1101 1168 11B2;AF1B;1101 1168 11B2; # (꼛; 꼛; 꼛; 꼛; 꼛; ) HANGUL SYLLABLE GGYELB +AF1C;AF1C;1101 1168 11B3;AF1C;1101 1168 11B3; # (꼜; 꼜; 꼜; 꼜; 꼜; ) HANGUL SYLLABLE GGYELS +AF1D;AF1D;1101 1168 11B4;AF1D;1101 1168 11B4; # (꼝; 꼝; 꼝; 꼝; 꼝; ) HANGUL SYLLABLE GGYELT +AF1E;AF1E;1101 1168 11B5;AF1E;1101 1168 11B5; # (꼞; 꼞; 꼞; 꼞; 꼞; ) HANGUL SYLLABLE GGYELP +AF1F;AF1F;1101 1168 11B6;AF1F;1101 1168 11B6; # (꼟; 꼟; 꼟; 꼟; 꼟; ) HANGUL SYLLABLE GGYELH +AF20;AF20;1101 1168 11B7;AF20;1101 1168 11B7; # (꼠; 꼠; 꼠; 꼠; 꼠; ) HANGUL SYLLABLE GGYEM +AF21;AF21;1101 1168 11B8;AF21;1101 1168 11B8; # (꼡; 꼡; 꼡; 꼡; 꼡; ) HANGUL SYLLABLE GGYEB +AF22;AF22;1101 1168 11B9;AF22;1101 1168 11B9; # (꼢; 꼢; 꼢; 꼢; 꼢; ) HANGUL SYLLABLE GGYEBS +AF23;AF23;1101 1168 11BA;AF23;1101 1168 11BA; # (꼣; 꼣; 꼣; 꼣; 꼣; ) HANGUL SYLLABLE GGYES +AF24;AF24;1101 1168 11BB;AF24;1101 1168 11BB; # (꼤; 꼤; 꼤; 꼤; 꼤; ) HANGUL SYLLABLE GGYESS +AF25;AF25;1101 1168 11BC;AF25;1101 1168 11BC; # (꼥; 꼥; 꼥; 꼥; 꼥; ) HANGUL SYLLABLE GGYENG +AF26;AF26;1101 1168 11BD;AF26;1101 1168 11BD; # (꼦; 꼦; 꼦; 꼦; 꼦; ) HANGUL SYLLABLE GGYEJ +AF27;AF27;1101 1168 11BE;AF27;1101 1168 11BE; # (꼧; 꼧; 꼧; 꼧; 꼧; ) HANGUL SYLLABLE GGYEC +AF28;AF28;1101 1168 11BF;AF28;1101 1168 11BF; # (꼨; 꼨; 꼨; 꼨; 꼨; ) HANGUL SYLLABLE GGYEK +AF29;AF29;1101 1168 11C0;AF29;1101 1168 11C0; # (꼩; 꼩; 꼩; 꼩; 꼩; ) HANGUL SYLLABLE GGYET +AF2A;AF2A;1101 1168 11C1;AF2A;1101 1168 11C1; # (꼪; 꼪; 꼪; 꼪; 꼪; ) HANGUL SYLLABLE GGYEP +AF2B;AF2B;1101 1168 11C2;AF2B;1101 1168 11C2; # (꼫; 꼫; 꼫; 꼫; 꼫; ) HANGUL SYLLABLE GGYEH +AF2C;AF2C;1101 1169;AF2C;1101 1169; # (꼬; 꼬; 꼬; 꼬; 꼬; ) HANGUL SYLLABLE GGO +AF2D;AF2D;1101 1169 11A8;AF2D;1101 1169 11A8; # (꼭; 꼭; 꼭; 꼭; 꼭; ) HANGUL SYLLABLE GGOG +AF2E;AF2E;1101 1169 11A9;AF2E;1101 1169 11A9; # (꼮; 꼮; 꼮; 꼮; 꼮; ) HANGUL SYLLABLE GGOGG +AF2F;AF2F;1101 1169 11AA;AF2F;1101 1169 11AA; # (꼯; 꼯; 꼯; 꼯; 꼯; ) HANGUL SYLLABLE GGOGS +AF30;AF30;1101 1169 11AB;AF30;1101 1169 11AB; # (꼰; 꼰; 꼰; 꼰; 꼰; ) HANGUL SYLLABLE GGON +AF31;AF31;1101 1169 11AC;AF31;1101 1169 11AC; # (꼱; 꼱; 꼱; 꼱; 꼱; ) HANGUL SYLLABLE GGONJ +AF32;AF32;1101 1169 11AD;AF32;1101 1169 11AD; # (꼲; 꼲; 꼲; 꼲; 꼲; ) HANGUL SYLLABLE GGONH +AF33;AF33;1101 1169 11AE;AF33;1101 1169 11AE; # (꼳; 꼳; 꼳; 꼳; 꼳; ) HANGUL SYLLABLE GGOD +AF34;AF34;1101 1169 11AF;AF34;1101 1169 11AF; # (꼴; 꼴; 꼴; 꼴; 꼴; ) HANGUL SYLLABLE GGOL +AF35;AF35;1101 1169 11B0;AF35;1101 1169 11B0; # (꼵; 꼵; 꼵; 꼵; 꼵; ) HANGUL SYLLABLE GGOLG +AF36;AF36;1101 1169 11B1;AF36;1101 1169 11B1; # (꼶; 꼶; 꼶; 꼶; 꼶; ) HANGUL SYLLABLE GGOLM +AF37;AF37;1101 1169 11B2;AF37;1101 1169 11B2; # (꼷; 꼷; 꼷; 꼷; 꼷; ) HANGUL SYLLABLE GGOLB +AF38;AF38;1101 1169 11B3;AF38;1101 1169 11B3; # (꼸; 꼸; 꼸; 꼸; 꼸; ) HANGUL SYLLABLE GGOLS +AF39;AF39;1101 1169 11B4;AF39;1101 1169 11B4; # (꼹; 꼹; 꼹; 꼹; 꼹; ) HANGUL SYLLABLE GGOLT +AF3A;AF3A;1101 1169 11B5;AF3A;1101 1169 11B5; # (꼺; 꼺; 꼺; 꼺; 꼺; ) HANGUL SYLLABLE GGOLP +AF3B;AF3B;1101 1169 11B6;AF3B;1101 1169 11B6; # (꼻; 꼻; 꼻; 꼻; 꼻; ) HANGUL SYLLABLE GGOLH +AF3C;AF3C;1101 1169 11B7;AF3C;1101 1169 11B7; # (꼼; 꼼; 꼼; 꼼; 꼼; ) HANGUL SYLLABLE GGOM +AF3D;AF3D;1101 1169 11B8;AF3D;1101 1169 11B8; # (꼽; 꼽; 꼽; 꼽; 꼽; ) HANGUL SYLLABLE GGOB +AF3E;AF3E;1101 1169 11B9;AF3E;1101 1169 11B9; # (꼾; 꼾; 꼾; 꼾; 꼾; ) HANGUL SYLLABLE GGOBS +AF3F;AF3F;1101 1169 11BA;AF3F;1101 1169 11BA; # (꼿; 꼿; 꼿; 꼿; 꼿; ) HANGUL SYLLABLE GGOS +AF40;AF40;1101 1169 11BB;AF40;1101 1169 11BB; # (꽀; 꽀; 꽀; 꽀; 꽀; ) HANGUL SYLLABLE GGOSS +AF41;AF41;1101 1169 11BC;AF41;1101 1169 11BC; # (꽁; 꽁; 꽁; 꽁; 꽁; ) HANGUL SYLLABLE GGONG +AF42;AF42;1101 1169 11BD;AF42;1101 1169 11BD; # (꽂; 꽂; 꽂; 꽂; 꽂; ) HANGUL SYLLABLE GGOJ +AF43;AF43;1101 1169 11BE;AF43;1101 1169 11BE; # (꽃; 꽃; 꽃; 꽃; 꽃; ) HANGUL SYLLABLE GGOC +AF44;AF44;1101 1169 11BF;AF44;1101 1169 11BF; # (꽄; 꽄; 꽄; 꽄; 꽄; ) HANGUL SYLLABLE GGOK +AF45;AF45;1101 1169 11C0;AF45;1101 1169 11C0; # (꽅; 꽅; 꽅; 꽅; 꽅; ) HANGUL SYLLABLE GGOT +AF46;AF46;1101 1169 11C1;AF46;1101 1169 11C1; # (꽆; 꽆; 꽆; 꽆; 꽆; ) HANGUL SYLLABLE GGOP +AF47;AF47;1101 1169 11C2;AF47;1101 1169 11C2; # (꽇; 꽇; 꽇; 꽇; 꽇; ) HANGUL SYLLABLE GGOH +AF48;AF48;1101 116A;AF48;1101 116A; # (꽈; 꽈; 꽈; 꽈; 꽈; ) HANGUL SYLLABLE GGWA +AF49;AF49;1101 116A 11A8;AF49;1101 116A 11A8; # (꽉; 꽉; 꽉; 꽉; 꽉; ) HANGUL SYLLABLE GGWAG +AF4A;AF4A;1101 116A 11A9;AF4A;1101 116A 11A9; # (꽊; 꽊; 꽊; 꽊; 꽊; ) HANGUL SYLLABLE GGWAGG +AF4B;AF4B;1101 116A 11AA;AF4B;1101 116A 11AA; # (꽋; 꽋; 꽋; 꽋; 꽋; ) HANGUL SYLLABLE GGWAGS +AF4C;AF4C;1101 116A 11AB;AF4C;1101 116A 11AB; # (꽌; 꽌; 꽌; 꽌; 꽌; ) HANGUL SYLLABLE GGWAN +AF4D;AF4D;1101 116A 11AC;AF4D;1101 116A 11AC; # (꽍; 꽍; 꽍; 꽍; 꽍; ) HANGUL SYLLABLE GGWANJ +AF4E;AF4E;1101 116A 11AD;AF4E;1101 116A 11AD; # (꽎; 꽎; 꽎; 꽎; 꽎; ) HANGUL SYLLABLE GGWANH +AF4F;AF4F;1101 116A 11AE;AF4F;1101 116A 11AE; # (꽏; 꽏; 꽏; 꽏; 꽏; ) HANGUL SYLLABLE GGWAD +AF50;AF50;1101 116A 11AF;AF50;1101 116A 11AF; # (꽐; 꽐; 꽐; 꽐; 꽐; ) HANGUL SYLLABLE GGWAL +AF51;AF51;1101 116A 11B0;AF51;1101 116A 11B0; # (꽑; 꽑; 꽑; 꽑; 꽑; ) HANGUL SYLLABLE GGWALG +AF52;AF52;1101 116A 11B1;AF52;1101 116A 11B1; # (꽒; 꽒; 꽒; 꽒; 꽒; ) HANGUL SYLLABLE GGWALM +AF53;AF53;1101 116A 11B2;AF53;1101 116A 11B2; # (꽓; 꽓; 꽓; 꽓; 꽓; ) HANGUL SYLLABLE GGWALB +AF54;AF54;1101 116A 11B3;AF54;1101 116A 11B3; # (꽔; 꽔; 꽔; 꽔; 꽔; ) HANGUL SYLLABLE GGWALS +AF55;AF55;1101 116A 11B4;AF55;1101 116A 11B4; # (꽕; 꽕; 꽕; 꽕; 꽕; ) HANGUL SYLLABLE GGWALT +AF56;AF56;1101 116A 11B5;AF56;1101 116A 11B5; # (꽖; 꽖; 꽖; 꽖; 꽖; ) HANGUL SYLLABLE GGWALP +AF57;AF57;1101 116A 11B6;AF57;1101 116A 11B6; # (꽗; 꽗; 꽗; 꽗; 꽗; ) HANGUL SYLLABLE GGWALH +AF58;AF58;1101 116A 11B7;AF58;1101 116A 11B7; # (꽘; 꽘; 꽘; 꽘; 꽘; ) HANGUL SYLLABLE GGWAM +AF59;AF59;1101 116A 11B8;AF59;1101 116A 11B8; # (꽙; 꽙; 꽙; 꽙; 꽙; ) HANGUL SYLLABLE GGWAB +AF5A;AF5A;1101 116A 11B9;AF5A;1101 116A 11B9; # (꽚; 꽚; 꽚; 꽚; 꽚; ) HANGUL SYLLABLE GGWABS +AF5B;AF5B;1101 116A 11BA;AF5B;1101 116A 11BA; # (꽛; 꽛; 꽛; 꽛; 꽛; ) HANGUL SYLLABLE GGWAS +AF5C;AF5C;1101 116A 11BB;AF5C;1101 116A 11BB; # (꽜; 꽜; 꽜; 꽜; 꽜; ) HANGUL SYLLABLE GGWASS +AF5D;AF5D;1101 116A 11BC;AF5D;1101 116A 11BC; # (꽝; 꽝; 꽝; 꽝; 꽝; ) HANGUL SYLLABLE GGWANG +AF5E;AF5E;1101 116A 11BD;AF5E;1101 116A 11BD; # (꽞; 꽞; 꽞; 꽞; 꽞; ) HANGUL SYLLABLE GGWAJ +AF5F;AF5F;1101 116A 11BE;AF5F;1101 116A 11BE; # (꽟; 꽟; 꽟; 꽟; 꽟; ) HANGUL SYLLABLE GGWAC +AF60;AF60;1101 116A 11BF;AF60;1101 116A 11BF; # (꽠; 꽠; 꽠; 꽠; 꽠; ) HANGUL SYLLABLE GGWAK +AF61;AF61;1101 116A 11C0;AF61;1101 116A 11C0; # (꽡; 꽡; 꽡; 꽡; 꽡; ) HANGUL SYLLABLE GGWAT +AF62;AF62;1101 116A 11C1;AF62;1101 116A 11C1; # (꽢; 꽢; 꽢; 꽢; 꽢; ) HANGUL SYLLABLE GGWAP +AF63;AF63;1101 116A 11C2;AF63;1101 116A 11C2; # (꽣; 꽣; 꽣; 꽣; 꽣; ) HANGUL SYLLABLE GGWAH +AF64;AF64;1101 116B;AF64;1101 116B; # (꽤; 꽤; 꽤; 꽤; 꽤; ) HANGUL SYLLABLE GGWAE +AF65;AF65;1101 116B 11A8;AF65;1101 116B 11A8; # (꽥; 꽥; 꽥; 꽥; 꽥; ) HANGUL SYLLABLE GGWAEG +AF66;AF66;1101 116B 11A9;AF66;1101 116B 11A9; # (꽦; 꽦; 꽦; 꽦; 꽦; ) HANGUL SYLLABLE GGWAEGG +AF67;AF67;1101 116B 11AA;AF67;1101 116B 11AA; # (꽧; 꽧; 꽧; 꽧; 꽧; ) HANGUL SYLLABLE GGWAEGS +AF68;AF68;1101 116B 11AB;AF68;1101 116B 11AB; # (꽨; 꽨; 꽨; 꽨; 꽨; ) HANGUL SYLLABLE GGWAEN +AF69;AF69;1101 116B 11AC;AF69;1101 116B 11AC; # (꽩; 꽩; 꽩; 꽩; 꽩; ) HANGUL SYLLABLE GGWAENJ +AF6A;AF6A;1101 116B 11AD;AF6A;1101 116B 11AD; # (꽪; 꽪; 꽪; 꽪; 꽪; ) HANGUL SYLLABLE GGWAENH +AF6B;AF6B;1101 116B 11AE;AF6B;1101 116B 11AE; # (꽫; 꽫; 꽫; 꽫; 꽫; ) HANGUL SYLLABLE GGWAED +AF6C;AF6C;1101 116B 11AF;AF6C;1101 116B 11AF; # (꽬; 꽬; 꽬; 꽬; 꽬; ) HANGUL SYLLABLE GGWAEL +AF6D;AF6D;1101 116B 11B0;AF6D;1101 116B 11B0; # (꽭; 꽭; 꽭; 꽭; 꽭; ) HANGUL SYLLABLE GGWAELG +AF6E;AF6E;1101 116B 11B1;AF6E;1101 116B 11B1; # (꽮; 꽮; 꽮; 꽮; 꽮; ) HANGUL SYLLABLE GGWAELM +AF6F;AF6F;1101 116B 11B2;AF6F;1101 116B 11B2; # (꽯; 꽯; 꽯; 꽯; 꽯; ) HANGUL SYLLABLE GGWAELB +AF70;AF70;1101 116B 11B3;AF70;1101 116B 11B3; # (꽰; 꽰; 꽰; 꽰; 꽰; ) HANGUL SYLLABLE GGWAELS +AF71;AF71;1101 116B 11B4;AF71;1101 116B 11B4; # (꽱; 꽱; 꽱; 꽱; 꽱; ) HANGUL SYLLABLE GGWAELT +AF72;AF72;1101 116B 11B5;AF72;1101 116B 11B5; # (꽲; 꽲; 꽲; 꽲; 꽲; ) HANGUL SYLLABLE GGWAELP +AF73;AF73;1101 116B 11B6;AF73;1101 116B 11B6; # (꽳; 꽳; 꽳; 꽳; 꽳; ) HANGUL SYLLABLE GGWAELH +AF74;AF74;1101 116B 11B7;AF74;1101 116B 11B7; # (꽴; 꽴; 꽴; 꽴; 꽴; ) HANGUL SYLLABLE GGWAEM +AF75;AF75;1101 116B 11B8;AF75;1101 116B 11B8; # (꽵; 꽵; 꽵; 꽵; 꽵; ) HANGUL SYLLABLE GGWAEB +AF76;AF76;1101 116B 11B9;AF76;1101 116B 11B9; # (꽶; 꽶; 꽶; 꽶; 꽶; ) HANGUL SYLLABLE GGWAEBS +AF77;AF77;1101 116B 11BA;AF77;1101 116B 11BA; # (꽷; 꽷; 꽷; 꽷; 꽷; ) HANGUL SYLLABLE GGWAES +AF78;AF78;1101 116B 11BB;AF78;1101 116B 11BB; # (꽸; 꽸; 꽸; 꽸; 꽸; ) HANGUL SYLLABLE GGWAESS +AF79;AF79;1101 116B 11BC;AF79;1101 116B 11BC; # (꽹; 꽹; 꽹; 꽹; 꽹; ) HANGUL SYLLABLE GGWAENG +AF7A;AF7A;1101 116B 11BD;AF7A;1101 116B 11BD; # (꽺; 꽺; 꽺; 꽺; 꽺; ) HANGUL SYLLABLE GGWAEJ +AF7B;AF7B;1101 116B 11BE;AF7B;1101 116B 11BE; # (꽻; 꽻; 꽻; 꽻; 꽻; ) HANGUL SYLLABLE GGWAEC +AF7C;AF7C;1101 116B 11BF;AF7C;1101 116B 11BF; # (꽼; 꽼; 꽼; 꽼; 꽼; ) HANGUL SYLLABLE GGWAEK +AF7D;AF7D;1101 116B 11C0;AF7D;1101 116B 11C0; # (꽽; 꽽; 꽽; 꽽; 꽽; ) HANGUL SYLLABLE GGWAET +AF7E;AF7E;1101 116B 11C1;AF7E;1101 116B 11C1; # (꽾; 꽾; 꽾; 꽾; 꽾; ) HANGUL SYLLABLE GGWAEP +AF7F;AF7F;1101 116B 11C2;AF7F;1101 116B 11C2; # (꽿; 꽿; 꽿; 꽿; 꽿; ) HANGUL SYLLABLE GGWAEH +AF80;AF80;1101 116C;AF80;1101 116C; # (꾀; 꾀; 꾀; 꾀; 꾀; ) HANGUL SYLLABLE GGOE +AF81;AF81;1101 116C 11A8;AF81;1101 116C 11A8; # (꾁; 꾁; 꾁; 꾁; 꾁; ) HANGUL SYLLABLE GGOEG +AF82;AF82;1101 116C 11A9;AF82;1101 116C 11A9; # (꾂; 꾂; 꾂; 꾂; 꾂; ) HANGUL SYLLABLE GGOEGG +AF83;AF83;1101 116C 11AA;AF83;1101 116C 11AA; # (꾃; 꾃; 꾃; 꾃; 꾃; ) HANGUL SYLLABLE GGOEGS +AF84;AF84;1101 116C 11AB;AF84;1101 116C 11AB; # (꾄; 꾄; 꾄; 꾄; 꾄; ) HANGUL SYLLABLE GGOEN +AF85;AF85;1101 116C 11AC;AF85;1101 116C 11AC; # (꾅; 꾅; 꾅; 꾅; 꾅; ) HANGUL SYLLABLE GGOENJ +AF86;AF86;1101 116C 11AD;AF86;1101 116C 11AD; # (꾆; 꾆; 꾆; 꾆; 꾆; ) HANGUL SYLLABLE GGOENH +AF87;AF87;1101 116C 11AE;AF87;1101 116C 11AE; # (꾇; 꾇; 꾇; 꾇; 꾇; ) HANGUL SYLLABLE GGOED +AF88;AF88;1101 116C 11AF;AF88;1101 116C 11AF; # (꾈; 꾈; 꾈; 꾈; 꾈; ) HANGUL SYLLABLE GGOEL +AF89;AF89;1101 116C 11B0;AF89;1101 116C 11B0; # (꾉; 꾉; 꾉; 꾉; 꾉; ) HANGUL SYLLABLE GGOELG +AF8A;AF8A;1101 116C 11B1;AF8A;1101 116C 11B1; # (꾊; 꾊; 꾊; 꾊; 꾊; ) HANGUL SYLLABLE GGOELM +AF8B;AF8B;1101 116C 11B2;AF8B;1101 116C 11B2; # (꾋; 꾋; 꾋; 꾋; 꾋; ) HANGUL SYLLABLE GGOELB +AF8C;AF8C;1101 116C 11B3;AF8C;1101 116C 11B3; # (꾌; 꾌; 꾌; 꾌; 꾌; ) HANGUL SYLLABLE GGOELS +AF8D;AF8D;1101 116C 11B4;AF8D;1101 116C 11B4; # (꾍; 꾍; 꾍; 꾍; 꾍; ) HANGUL SYLLABLE GGOELT +AF8E;AF8E;1101 116C 11B5;AF8E;1101 116C 11B5; # (꾎; 꾎; 꾎; 꾎; 꾎; ) HANGUL SYLLABLE GGOELP +AF8F;AF8F;1101 116C 11B6;AF8F;1101 116C 11B6; # (꾏; 꾏; 꾏; 꾏; 꾏; ) HANGUL SYLLABLE GGOELH +AF90;AF90;1101 116C 11B7;AF90;1101 116C 11B7; # (꾐; 꾐; 꾐; 꾐; 꾐; ) HANGUL SYLLABLE GGOEM +AF91;AF91;1101 116C 11B8;AF91;1101 116C 11B8; # (꾑; 꾑; 꾑; 꾑; 꾑; ) HANGUL SYLLABLE GGOEB +AF92;AF92;1101 116C 11B9;AF92;1101 116C 11B9; # (꾒; 꾒; 꾒; 꾒; 꾒; ) HANGUL SYLLABLE GGOEBS +AF93;AF93;1101 116C 11BA;AF93;1101 116C 11BA; # (꾓; 꾓; 꾓; 꾓; 꾓; ) HANGUL SYLLABLE GGOES +AF94;AF94;1101 116C 11BB;AF94;1101 116C 11BB; # (꾔; 꾔; 꾔; 꾔; 꾔; ) HANGUL SYLLABLE GGOESS +AF95;AF95;1101 116C 11BC;AF95;1101 116C 11BC; # (꾕; 꾕; 꾕; 꾕; 꾕; ) HANGUL SYLLABLE GGOENG +AF96;AF96;1101 116C 11BD;AF96;1101 116C 11BD; # (꾖; 꾖; 꾖; 꾖; 꾖; ) HANGUL SYLLABLE GGOEJ +AF97;AF97;1101 116C 11BE;AF97;1101 116C 11BE; # (꾗; 꾗; 꾗; 꾗; 꾗; ) HANGUL SYLLABLE GGOEC +AF98;AF98;1101 116C 11BF;AF98;1101 116C 11BF; # (꾘; 꾘; 꾘; 꾘; 꾘; ) HANGUL SYLLABLE GGOEK +AF99;AF99;1101 116C 11C0;AF99;1101 116C 11C0; # (꾙; 꾙; 꾙; 꾙; 꾙; ) HANGUL SYLLABLE GGOET +AF9A;AF9A;1101 116C 11C1;AF9A;1101 116C 11C1; # (꾚; 꾚; 꾚; 꾚; 꾚; ) HANGUL SYLLABLE GGOEP +AF9B;AF9B;1101 116C 11C2;AF9B;1101 116C 11C2; # (꾛; 꾛; 꾛; 꾛; 꾛; ) HANGUL SYLLABLE GGOEH +AF9C;AF9C;1101 116D;AF9C;1101 116D; # (꾜; 꾜; 꾜; 꾜; 꾜; ) HANGUL SYLLABLE GGYO +AF9D;AF9D;1101 116D 11A8;AF9D;1101 116D 11A8; # (꾝; 꾝; 꾝; 꾝; 꾝; ) HANGUL SYLLABLE GGYOG +AF9E;AF9E;1101 116D 11A9;AF9E;1101 116D 11A9; # (꾞; 꾞; 꾞; 꾞; 꾞; ) HANGUL SYLLABLE GGYOGG +AF9F;AF9F;1101 116D 11AA;AF9F;1101 116D 11AA; # (꾟; 꾟; 꾟; 꾟; 꾟; ) HANGUL SYLLABLE GGYOGS +AFA0;AFA0;1101 116D 11AB;AFA0;1101 116D 11AB; # (꾠; 꾠; 꾠; 꾠; 꾠; ) HANGUL SYLLABLE GGYON +AFA1;AFA1;1101 116D 11AC;AFA1;1101 116D 11AC; # (꾡; 꾡; 꾡; 꾡; 꾡; ) HANGUL SYLLABLE GGYONJ +AFA2;AFA2;1101 116D 11AD;AFA2;1101 116D 11AD; # (꾢; 꾢; 꾢; 꾢; 꾢; ) HANGUL SYLLABLE GGYONH +AFA3;AFA3;1101 116D 11AE;AFA3;1101 116D 11AE; # (꾣; 꾣; 꾣; 꾣; 꾣; ) HANGUL SYLLABLE GGYOD +AFA4;AFA4;1101 116D 11AF;AFA4;1101 116D 11AF; # (꾤; 꾤; 꾤; 꾤; 꾤; ) HANGUL SYLLABLE GGYOL +AFA5;AFA5;1101 116D 11B0;AFA5;1101 116D 11B0; # (꾥; 꾥; 꾥; 꾥; 꾥; ) HANGUL SYLLABLE GGYOLG +AFA6;AFA6;1101 116D 11B1;AFA6;1101 116D 11B1; # (꾦; 꾦; 꾦; 꾦; 꾦; ) HANGUL SYLLABLE GGYOLM +AFA7;AFA7;1101 116D 11B2;AFA7;1101 116D 11B2; # (꾧; 꾧; 꾧; 꾧; 꾧; ) HANGUL SYLLABLE GGYOLB +AFA8;AFA8;1101 116D 11B3;AFA8;1101 116D 11B3; # (꾨; 꾨; 꾨; 꾨; 꾨; ) HANGUL SYLLABLE GGYOLS +AFA9;AFA9;1101 116D 11B4;AFA9;1101 116D 11B4; # (꾩; 꾩; 꾩; 꾩; 꾩; ) HANGUL SYLLABLE GGYOLT +AFAA;AFAA;1101 116D 11B5;AFAA;1101 116D 11B5; # (꾪; 꾪; 꾪; 꾪; 꾪; ) HANGUL SYLLABLE GGYOLP +AFAB;AFAB;1101 116D 11B6;AFAB;1101 116D 11B6; # (꾫; 꾫; 꾫; 꾫; 꾫; ) HANGUL SYLLABLE GGYOLH +AFAC;AFAC;1101 116D 11B7;AFAC;1101 116D 11B7; # (꾬; 꾬; 꾬; 꾬; 꾬; ) HANGUL SYLLABLE GGYOM +AFAD;AFAD;1101 116D 11B8;AFAD;1101 116D 11B8; # (꾭; 꾭; 꾭; 꾭; 꾭; ) HANGUL SYLLABLE GGYOB +AFAE;AFAE;1101 116D 11B9;AFAE;1101 116D 11B9; # (꾮; 꾮; 꾮; 꾮; 꾮; ) HANGUL SYLLABLE GGYOBS +AFAF;AFAF;1101 116D 11BA;AFAF;1101 116D 11BA; # (꾯; 꾯; 꾯; 꾯; 꾯; ) HANGUL SYLLABLE GGYOS +AFB0;AFB0;1101 116D 11BB;AFB0;1101 116D 11BB; # (꾰; 꾰; 꾰; 꾰; 꾰; ) HANGUL SYLLABLE GGYOSS +AFB1;AFB1;1101 116D 11BC;AFB1;1101 116D 11BC; # (꾱; 꾱; 꾱; 꾱; 꾱; ) HANGUL SYLLABLE GGYONG +AFB2;AFB2;1101 116D 11BD;AFB2;1101 116D 11BD; # (꾲; 꾲; 꾲; 꾲; 꾲; ) HANGUL SYLLABLE GGYOJ +AFB3;AFB3;1101 116D 11BE;AFB3;1101 116D 11BE; # (꾳; 꾳; 꾳; 꾳; 꾳; ) HANGUL SYLLABLE GGYOC +AFB4;AFB4;1101 116D 11BF;AFB4;1101 116D 11BF; # (꾴; 꾴; 꾴; 꾴; 꾴; ) HANGUL SYLLABLE GGYOK +AFB5;AFB5;1101 116D 11C0;AFB5;1101 116D 11C0; # (꾵; 꾵; 꾵; 꾵; 꾵; ) HANGUL SYLLABLE GGYOT +AFB6;AFB6;1101 116D 11C1;AFB6;1101 116D 11C1; # (꾶; 꾶; 꾶; 꾶; 꾶; ) HANGUL SYLLABLE GGYOP +AFB7;AFB7;1101 116D 11C2;AFB7;1101 116D 11C2; # (꾷; 꾷; 꾷; 꾷; 꾷; ) HANGUL SYLLABLE GGYOH +AFB8;AFB8;1101 116E;AFB8;1101 116E; # (꾸; 꾸; 꾸; 꾸; 꾸; ) HANGUL SYLLABLE GGU +AFB9;AFB9;1101 116E 11A8;AFB9;1101 116E 11A8; # (꾹; 꾹; 꾹; 꾹; 꾹; ) HANGUL SYLLABLE GGUG +AFBA;AFBA;1101 116E 11A9;AFBA;1101 116E 11A9; # (꾺; 꾺; 꾺; 꾺; 꾺; ) HANGUL SYLLABLE GGUGG +AFBB;AFBB;1101 116E 11AA;AFBB;1101 116E 11AA; # (꾻; 꾻; 꾻; 꾻; 꾻; ) HANGUL SYLLABLE GGUGS +AFBC;AFBC;1101 116E 11AB;AFBC;1101 116E 11AB; # (꾼; 꾼; 꾼; 꾼; 꾼; ) HANGUL SYLLABLE GGUN +AFBD;AFBD;1101 116E 11AC;AFBD;1101 116E 11AC; # (꾽; 꾽; 꾽; 꾽; 꾽; ) HANGUL SYLLABLE GGUNJ +AFBE;AFBE;1101 116E 11AD;AFBE;1101 116E 11AD; # (꾾; 꾾; 꾾; 꾾; 꾾; ) HANGUL SYLLABLE GGUNH +AFBF;AFBF;1101 116E 11AE;AFBF;1101 116E 11AE; # (꾿; 꾿; 꾿; 꾿; 꾿; ) HANGUL SYLLABLE GGUD +AFC0;AFC0;1101 116E 11AF;AFC0;1101 116E 11AF; # (꿀; 꿀; 꿀; 꿀; 꿀; ) HANGUL SYLLABLE GGUL +AFC1;AFC1;1101 116E 11B0;AFC1;1101 116E 11B0; # (꿁; 꿁; 꿁; 꿁; 꿁; ) HANGUL SYLLABLE GGULG +AFC2;AFC2;1101 116E 11B1;AFC2;1101 116E 11B1; # (꿂; 꿂; 꿂; 꿂; 꿂; ) HANGUL SYLLABLE GGULM +AFC3;AFC3;1101 116E 11B2;AFC3;1101 116E 11B2; # (꿃; 꿃; 꿃; 꿃; 꿃; ) HANGUL SYLLABLE GGULB +AFC4;AFC4;1101 116E 11B3;AFC4;1101 116E 11B3; # (꿄; 꿄; 꿄; 꿄; 꿄; ) HANGUL SYLLABLE GGULS +AFC5;AFC5;1101 116E 11B4;AFC5;1101 116E 11B4; # (꿅; 꿅; 꿅; 꿅; 꿅; ) HANGUL SYLLABLE GGULT +AFC6;AFC6;1101 116E 11B5;AFC6;1101 116E 11B5; # (꿆; 꿆; 꿆; 꿆; 꿆; ) HANGUL SYLLABLE GGULP +AFC7;AFC7;1101 116E 11B6;AFC7;1101 116E 11B6; # (꿇; 꿇; 꿇; 꿇; 꿇; ) HANGUL SYLLABLE GGULH +AFC8;AFC8;1101 116E 11B7;AFC8;1101 116E 11B7; # (꿈; 꿈; 꿈; 꿈; 꿈; ) HANGUL SYLLABLE GGUM +AFC9;AFC9;1101 116E 11B8;AFC9;1101 116E 11B8; # (꿉; 꿉; 꿉; 꿉; 꿉; ) HANGUL SYLLABLE GGUB +AFCA;AFCA;1101 116E 11B9;AFCA;1101 116E 11B9; # (꿊; 꿊; 꿊; 꿊; 꿊; ) HANGUL SYLLABLE GGUBS +AFCB;AFCB;1101 116E 11BA;AFCB;1101 116E 11BA; # (꿋; 꿋; 꿋; 꿋; 꿋; ) HANGUL SYLLABLE GGUS +AFCC;AFCC;1101 116E 11BB;AFCC;1101 116E 11BB; # (꿌; 꿌; 꿌; 꿌; 꿌; ) HANGUL SYLLABLE GGUSS +AFCD;AFCD;1101 116E 11BC;AFCD;1101 116E 11BC; # (꿍; 꿍; 꿍; 꿍; 꿍; ) HANGUL SYLLABLE GGUNG +AFCE;AFCE;1101 116E 11BD;AFCE;1101 116E 11BD; # (꿎; 꿎; 꿎; 꿎; 꿎; ) HANGUL SYLLABLE GGUJ +AFCF;AFCF;1101 116E 11BE;AFCF;1101 116E 11BE; # (꿏; 꿏; 꿏; 꿏; 꿏; ) HANGUL SYLLABLE GGUC +AFD0;AFD0;1101 116E 11BF;AFD0;1101 116E 11BF; # (꿐; 꿐; 꿐; 꿐; 꿐; ) HANGUL SYLLABLE GGUK +AFD1;AFD1;1101 116E 11C0;AFD1;1101 116E 11C0; # (꿑; 꿑; 꿑; 꿑; 꿑; ) HANGUL SYLLABLE GGUT +AFD2;AFD2;1101 116E 11C1;AFD2;1101 116E 11C1; # (꿒; 꿒; 꿒; 꿒; 꿒; ) HANGUL SYLLABLE GGUP +AFD3;AFD3;1101 116E 11C2;AFD3;1101 116E 11C2; # (꿓; 꿓; 꿓; 꿓; 꿓; ) HANGUL SYLLABLE GGUH +AFD4;AFD4;1101 116F;AFD4;1101 116F; # (꿔; 꿔; 꿔; 꿔; 꿔; ) HANGUL SYLLABLE GGWEO +AFD5;AFD5;1101 116F 11A8;AFD5;1101 116F 11A8; # (꿕; 꿕; 꿕; 꿕; 꿕; ) HANGUL SYLLABLE GGWEOG +AFD6;AFD6;1101 116F 11A9;AFD6;1101 116F 11A9; # (꿖; 꿖; 꿖; 꿖; 꿖; ) HANGUL SYLLABLE GGWEOGG +AFD7;AFD7;1101 116F 11AA;AFD7;1101 116F 11AA; # (꿗; 꿗; 꿗; 꿗; 꿗; ) HANGUL SYLLABLE GGWEOGS +AFD8;AFD8;1101 116F 11AB;AFD8;1101 116F 11AB; # (꿘; 꿘; 꿘; 꿘; 꿘; ) HANGUL SYLLABLE GGWEON +AFD9;AFD9;1101 116F 11AC;AFD9;1101 116F 11AC; # (꿙; 꿙; 꿙; 꿙; 꿙; ) HANGUL SYLLABLE GGWEONJ +AFDA;AFDA;1101 116F 11AD;AFDA;1101 116F 11AD; # (꿚; 꿚; 꿚; 꿚; 꿚; ) HANGUL SYLLABLE GGWEONH +AFDB;AFDB;1101 116F 11AE;AFDB;1101 116F 11AE; # (꿛; 꿛; 꿛; 꿛; 꿛; ) HANGUL SYLLABLE GGWEOD +AFDC;AFDC;1101 116F 11AF;AFDC;1101 116F 11AF; # (꿜; 꿜; 꿜; 꿜; 꿜; ) HANGUL SYLLABLE GGWEOL +AFDD;AFDD;1101 116F 11B0;AFDD;1101 116F 11B0; # (꿝; 꿝; 꿝; 꿝; 꿝; ) HANGUL SYLLABLE GGWEOLG +AFDE;AFDE;1101 116F 11B1;AFDE;1101 116F 11B1; # (꿞; 꿞; 꿞; 꿞; 꿞; ) HANGUL SYLLABLE GGWEOLM +AFDF;AFDF;1101 116F 11B2;AFDF;1101 116F 11B2; # (꿟; 꿟; 꿟; 꿟; 꿟; ) HANGUL SYLLABLE GGWEOLB +AFE0;AFE0;1101 116F 11B3;AFE0;1101 116F 11B3; # (꿠; 꿠; 꿠; 꿠; 꿠; ) HANGUL SYLLABLE GGWEOLS +AFE1;AFE1;1101 116F 11B4;AFE1;1101 116F 11B4; # (꿡; 꿡; 꿡; 꿡; 꿡; ) HANGUL SYLLABLE GGWEOLT +AFE2;AFE2;1101 116F 11B5;AFE2;1101 116F 11B5; # (꿢; 꿢; 꿢; 꿢; 꿢; ) HANGUL SYLLABLE GGWEOLP +AFE3;AFE3;1101 116F 11B6;AFE3;1101 116F 11B6; # (꿣; 꿣; 꿣; 꿣; 꿣; ) HANGUL SYLLABLE GGWEOLH +AFE4;AFE4;1101 116F 11B7;AFE4;1101 116F 11B7; # (꿤; 꿤; 꿤; 꿤; 꿤; ) HANGUL SYLLABLE GGWEOM +AFE5;AFE5;1101 116F 11B8;AFE5;1101 116F 11B8; # (꿥; 꿥; 꿥; 꿥; 꿥; ) HANGUL SYLLABLE GGWEOB +AFE6;AFE6;1101 116F 11B9;AFE6;1101 116F 11B9; # (꿦; 꿦; 꿦; 꿦; 꿦; ) HANGUL SYLLABLE GGWEOBS +AFE7;AFE7;1101 116F 11BA;AFE7;1101 116F 11BA; # (꿧; 꿧; 꿧; 꿧; 꿧; ) HANGUL SYLLABLE GGWEOS +AFE8;AFE8;1101 116F 11BB;AFE8;1101 116F 11BB; # (꿨; 꿨; 꿨; 꿨; 꿨; ) HANGUL SYLLABLE GGWEOSS +AFE9;AFE9;1101 116F 11BC;AFE9;1101 116F 11BC; # (꿩; 꿩; 꿩; 꿩; 꿩; ) HANGUL SYLLABLE GGWEONG +AFEA;AFEA;1101 116F 11BD;AFEA;1101 116F 11BD; # (꿪; 꿪; 꿪; 꿪; 꿪; ) HANGUL SYLLABLE GGWEOJ +AFEB;AFEB;1101 116F 11BE;AFEB;1101 116F 11BE; # (꿫; 꿫; 꿫; 꿫; 꿫; ) HANGUL SYLLABLE GGWEOC +AFEC;AFEC;1101 116F 11BF;AFEC;1101 116F 11BF; # (꿬; 꿬; 꿬; 꿬; 꿬; ) HANGUL SYLLABLE GGWEOK +AFED;AFED;1101 116F 11C0;AFED;1101 116F 11C0; # (꿭; 꿭; 꿭; 꿭; 꿭; ) HANGUL SYLLABLE GGWEOT +AFEE;AFEE;1101 116F 11C1;AFEE;1101 116F 11C1; # (꿮; 꿮; 꿮; 꿮; 꿮; ) HANGUL SYLLABLE GGWEOP +AFEF;AFEF;1101 116F 11C2;AFEF;1101 116F 11C2; # (꿯; 꿯; 꿯; 꿯; 꿯; ) HANGUL SYLLABLE GGWEOH +AFF0;AFF0;1101 1170;AFF0;1101 1170; # (꿰; 꿰; 꿰; 꿰; 꿰; ) HANGUL SYLLABLE GGWE +AFF1;AFF1;1101 1170 11A8;AFF1;1101 1170 11A8; # (꿱; 꿱; 꿱; 꿱; 꿱; ) HANGUL SYLLABLE GGWEG +AFF2;AFF2;1101 1170 11A9;AFF2;1101 1170 11A9; # (꿲; 꿲; 꿲; 꿲; 꿲; ) HANGUL SYLLABLE GGWEGG +AFF3;AFF3;1101 1170 11AA;AFF3;1101 1170 11AA; # (꿳; 꿳; 꿳; 꿳; 꿳; ) HANGUL SYLLABLE GGWEGS +AFF4;AFF4;1101 1170 11AB;AFF4;1101 1170 11AB; # (꿴; 꿴; 꿴; 꿴; 꿴; ) HANGUL SYLLABLE GGWEN +AFF5;AFF5;1101 1170 11AC;AFF5;1101 1170 11AC; # (꿵; 꿵; 꿵; 꿵; 꿵; ) HANGUL SYLLABLE GGWENJ +AFF6;AFF6;1101 1170 11AD;AFF6;1101 1170 11AD; # (꿶; 꿶; 꿶; 꿶; 꿶; ) HANGUL SYLLABLE GGWENH +AFF7;AFF7;1101 1170 11AE;AFF7;1101 1170 11AE; # (꿷; 꿷; 꿷; 꿷; 꿷; ) HANGUL SYLLABLE GGWED +AFF8;AFF8;1101 1170 11AF;AFF8;1101 1170 11AF; # (꿸; 꿸; 꿸; 꿸; 꿸; ) HANGUL SYLLABLE GGWEL +AFF9;AFF9;1101 1170 11B0;AFF9;1101 1170 11B0; # (꿹; 꿹; 꿹; 꿹; 꿹; ) HANGUL SYLLABLE GGWELG +AFFA;AFFA;1101 1170 11B1;AFFA;1101 1170 11B1; # (꿺; 꿺; 꿺; 꿺; 꿺; ) HANGUL SYLLABLE GGWELM +AFFB;AFFB;1101 1170 11B2;AFFB;1101 1170 11B2; # (꿻; 꿻; 꿻; 꿻; 꿻; ) HANGUL SYLLABLE GGWELB +AFFC;AFFC;1101 1170 11B3;AFFC;1101 1170 11B3; # (꿼; 꿼; 꿼; 꿼; 꿼; ) HANGUL SYLLABLE GGWELS +AFFD;AFFD;1101 1170 11B4;AFFD;1101 1170 11B4; # (꿽; 꿽; 꿽; 꿽; 꿽; ) HANGUL SYLLABLE GGWELT +AFFE;AFFE;1101 1170 11B5;AFFE;1101 1170 11B5; # (꿾; 꿾; 꿾; 꿾; 꿾; ) HANGUL SYLLABLE GGWELP +AFFF;AFFF;1101 1170 11B6;AFFF;1101 1170 11B6; # (꿿; 꿿; 꿿; 꿿; 꿿; ) HANGUL SYLLABLE GGWELH +B000;B000;1101 1170 11B7;B000;1101 1170 11B7; # (뀀; 뀀; 뀀; 뀀; 뀀; ) HANGUL SYLLABLE GGWEM +B001;B001;1101 1170 11B8;B001;1101 1170 11B8; # (뀁; 뀁; 뀁; 뀁; 뀁; ) HANGUL SYLLABLE GGWEB +B002;B002;1101 1170 11B9;B002;1101 1170 11B9; # (뀂; 뀂; 뀂; 뀂; 뀂; ) HANGUL SYLLABLE GGWEBS +B003;B003;1101 1170 11BA;B003;1101 1170 11BA; # (뀃; 뀃; 뀃; 뀃; 뀃; ) HANGUL SYLLABLE GGWES +B004;B004;1101 1170 11BB;B004;1101 1170 11BB; # (뀄; 뀄; 뀄; 뀄; 뀄; ) HANGUL SYLLABLE GGWESS +B005;B005;1101 1170 11BC;B005;1101 1170 11BC; # (뀅; 뀅; 뀅; 뀅; 뀅; ) HANGUL SYLLABLE GGWENG +B006;B006;1101 1170 11BD;B006;1101 1170 11BD; # (뀆; 뀆; 뀆; 뀆; 뀆; ) HANGUL SYLLABLE GGWEJ +B007;B007;1101 1170 11BE;B007;1101 1170 11BE; # (뀇; 뀇; 뀇; 뀇; 뀇; ) HANGUL SYLLABLE GGWEC +B008;B008;1101 1170 11BF;B008;1101 1170 11BF; # (뀈; 뀈; 뀈; 뀈; 뀈; ) HANGUL SYLLABLE GGWEK +B009;B009;1101 1170 11C0;B009;1101 1170 11C0; # (뀉; 뀉; 뀉; 뀉; 뀉; ) HANGUL SYLLABLE GGWET +B00A;B00A;1101 1170 11C1;B00A;1101 1170 11C1; # (뀊; 뀊; 뀊; 뀊; 뀊; ) HANGUL SYLLABLE GGWEP +B00B;B00B;1101 1170 11C2;B00B;1101 1170 11C2; # (뀋; 뀋; 뀋; 뀋; 뀋; ) HANGUL SYLLABLE GGWEH +B00C;B00C;1101 1171;B00C;1101 1171; # (뀌; 뀌; 뀌; 뀌; 뀌; ) HANGUL SYLLABLE GGWI +B00D;B00D;1101 1171 11A8;B00D;1101 1171 11A8; # (뀍; 뀍; 뀍; 뀍; 뀍; ) HANGUL SYLLABLE GGWIG +B00E;B00E;1101 1171 11A9;B00E;1101 1171 11A9; # (뀎; 뀎; 뀎; 뀎; 뀎; ) HANGUL SYLLABLE GGWIGG +B00F;B00F;1101 1171 11AA;B00F;1101 1171 11AA; # (뀏; 뀏; 뀏; 뀏; 뀏; ) HANGUL SYLLABLE GGWIGS +B010;B010;1101 1171 11AB;B010;1101 1171 11AB; # (뀐; 뀐; 뀐; 뀐; 뀐; ) HANGUL SYLLABLE GGWIN +B011;B011;1101 1171 11AC;B011;1101 1171 11AC; # (뀑; 뀑; 뀑; 뀑; 뀑; ) HANGUL SYLLABLE GGWINJ +B012;B012;1101 1171 11AD;B012;1101 1171 11AD; # (뀒; 뀒; 뀒; 뀒; 뀒; ) HANGUL SYLLABLE GGWINH +B013;B013;1101 1171 11AE;B013;1101 1171 11AE; # (뀓; 뀓; 뀓; 뀓; 뀓; ) HANGUL SYLLABLE GGWID +B014;B014;1101 1171 11AF;B014;1101 1171 11AF; # (뀔; 뀔; 뀔; 뀔; 뀔; ) HANGUL SYLLABLE GGWIL +B015;B015;1101 1171 11B0;B015;1101 1171 11B0; # (뀕; 뀕; 뀕; 뀕; 뀕; ) HANGUL SYLLABLE GGWILG +B016;B016;1101 1171 11B1;B016;1101 1171 11B1; # (뀖; 뀖; 뀖; 뀖; 뀖; ) HANGUL SYLLABLE GGWILM +B017;B017;1101 1171 11B2;B017;1101 1171 11B2; # (뀗; 뀗; 뀗; 뀗; 뀗; ) HANGUL SYLLABLE GGWILB +B018;B018;1101 1171 11B3;B018;1101 1171 11B3; # (뀘; 뀘; 뀘; 뀘; 뀘; ) HANGUL SYLLABLE GGWILS +B019;B019;1101 1171 11B4;B019;1101 1171 11B4; # (뀙; 뀙; 뀙; 뀙; 뀙; ) HANGUL SYLLABLE GGWILT +B01A;B01A;1101 1171 11B5;B01A;1101 1171 11B5; # (뀚; 뀚; 뀚; 뀚; 뀚; ) HANGUL SYLLABLE GGWILP +B01B;B01B;1101 1171 11B6;B01B;1101 1171 11B6; # (뀛; 뀛; 뀛; 뀛; 뀛; ) HANGUL SYLLABLE GGWILH +B01C;B01C;1101 1171 11B7;B01C;1101 1171 11B7; # (뀜; 뀜; 뀜; 뀜; 뀜; ) HANGUL SYLLABLE GGWIM +B01D;B01D;1101 1171 11B8;B01D;1101 1171 11B8; # (뀝; 뀝; 뀝; 뀝; 뀝; ) HANGUL SYLLABLE GGWIB +B01E;B01E;1101 1171 11B9;B01E;1101 1171 11B9; # (뀞; 뀞; 뀞; 뀞; 뀞; ) HANGUL SYLLABLE GGWIBS +B01F;B01F;1101 1171 11BA;B01F;1101 1171 11BA; # (뀟; 뀟; 뀟; 뀟; 뀟; ) HANGUL SYLLABLE GGWIS +B020;B020;1101 1171 11BB;B020;1101 1171 11BB; # (뀠; 뀠; 뀠; 뀠; 뀠; ) HANGUL SYLLABLE GGWISS +B021;B021;1101 1171 11BC;B021;1101 1171 11BC; # (뀡; 뀡; 뀡; 뀡; 뀡; ) HANGUL SYLLABLE GGWING +B022;B022;1101 1171 11BD;B022;1101 1171 11BD; # (뀢; 뀢; 뀢; 뀢; 뀢; ) HANGUL SYLLABLE GGWIJ +B023;B023;1101 1171 11BE;B023;1101 1171 11BE; # (뀣; 뀣; 뀣; 뀣; 뀣; ) HANGUL SYLLABLE GGWIC +B024;B024;1101 1171 11BF;B024;1101 1171 11BF; # (뀤; 뀤; 뀤; 뀤; 뀤; ) HANGUL SYLLABLE GGWIK +B025;B025;1101 1171 11C0;B025;1101 1171 11C0; # (뀥; 뀥; 뀥; 뀥; 뀥; ) HANGUL SYLLABLE GGWIT +B026;B026;1101 1171 11C1;B026;1101 1171 11C1; # (뀦; 뀦; 뀦; 뀦; 뀦; ) HANGUL SYLLABLE GGWIP +B027;B027;1101 1171 11C2;B027;1101 1171 11C2; # (뀧; 뀧; 뀧; 뀧; 뀧; ) HANGUL SYLLABLE GGWIH +B028;B028;1101 1172;B028;1101 1172; # (뀨; 뀨; 뀨; 뀨; 뀨; ) HANGUL SYLLABLE GGYU +B029;B029;1101 1172 11A8;B029;1101 1172 11A8; # (뀩; 뀩; 뀩; 뀩; 뀩; ) HANGUL SYLLABLE GGYUG +B02A;B02A;1101 1172 11A9;B02A;1101 1172 11A9; # (뀪; 뀪; 뀪; 뀪; 뀪; ) HANGUL SYLLABLE GGYUGG +B02B;B02B;1101 1172 11AA;B02B;1101 1172 11AA; # (뀫; 뀫; 뀫; 뀫; 뀫; ) HANGUL SYLLABLE GGYUGS +B02C;B02C;1101 1172 11AB;B02C;1101 1172 11AB; # (뀬; 뀬; 뀬; 뀬; 뀬; ) HANGUL SYLLABLE GGYUN +B02D;B02D;1101 1172 11AC;B02D;1101 1172 11AC; # (뀭; 뀭; 뀭; 뀭; 뀭; ) HANGUL SYLLABLE GGYUNJ +B02E;B02E;1101 1172 11AD;B02E;1101 1172 11AD; # (뀮; 뀮; 뀮; 뀮; 뀮; ) HANGUL SYLLABLE GGYUNH +B02F;B02F;1101 1172 11AE;B02F;1101 1172 11AE; # (뀯; 뀯; 뀯; 뀯; 뀯; ) HANGUL SYLLABLE GGYUD +B030;B030;1101 1172 11AF;B030;1101 1172 11AF; # (뀰; 뀰; 뀰; 뀰; 뀰; ) HANGUL SYLLABLE GGYUL +B031;B031;1101 1172 11B0;B031;1101 1172 11B0; # (뀱; 뀱; 뀱; 뀱; 뀱; ) HANGUL SYLLABLE GGYULG +B032;B032;1101 1172 11B1;B032;1101 1172 11B1; # (뀲; 뀲; 뀲; 뀲; 뀲; ) HANGUL SYLLABLE GGYULM +B033;B033;1101 1172 11B2;B033;1101 1172 11B2; # (뀳; 뀳; 뀳; 뀳; 뀳; ) HANGUL SYLLABLE GGYULB +B034;B034;1101 1172 11B3;B034;1101 1172 11B3; # (뀴; 뀴; 뀴; 뀴; 뀴; ) HANGUL SYLLABLE GGYULS +B035;B035;1101 1172 11B4;B035;1101 1172 11B4; # (뀵; 뀵; 뀵; 뀵; 뀵; ) HANGUL SYLLABLE GGYULT +B036;B036;1101 1172 11B5;B036;1101 1172 11B5; # (뀶; 뀶; 뀶; 뀶; 뀶; ) HANGUL SYLLABLE GGYULP +B037;B037;1101 1172 11B6;B037;1101 1172 11B6; # (뀷; 뀷; 뀷; 뀷; 뀷; ) HANGUL SYLLABLE GGYULH +B038;B038;1101 1172 11B7;B038;1101 1172 11B7; # (뀸; 뀸; 뀸; 뀸; 뀸; ) HANGUL SYLLABLE GGYUM +B039;B039;1101 1172 11B8;B039;1101 1172 11B8; # (뀹; 뀹; 뀹; 뀹; 뀹; ) HANGUL SYLLABLE GGYUB +B03A;B03A;1101 1172 11B9;B03A;1101 1172 11B9; # (뀺; 뀺; 뀺; 뀺; 뀺; ) HANGUL SYLLABLE GGYUBS +B03B;B03B;1101 1172 11BA;B03B;1101 1172 11BA; # (뀻; 뀻; 뀻; 뀻; 뀻; ) HANGUL SYLLABLE GGYUS +B03C;B03C;1101 1172 11BB;B03C;1101 1172 11BB; # (뀼; 뀼; 뀼; 뀼; 뀼; ) HANGUL SYLLABLE GGYUSS +B03D;B03D;1101 1172 11BC;B03D;1101 1172 11BC; # (뀽; 뀽; 뀽; 뀽; 뀽; ) HANGUL SYLLABLE GGYUNG +B03E;B03E;1101 1172 11BD;B03E;1101 1172 11BD; # (뀾; 뀾; 뀾; 뀾; 뀾; ) HANGUL SYLLABLE GGYUJ +B03F;B03F;1101 1172 11BE;B03F;1101 1172 11BE; # (뀿; 뀿; 뀿; 뀿; 뀿; ) HANGUL SYLLABLE GGYUC +B040;B040;1101 1172 11BF;B040;1101 1172 11BF; # (끀; 끀; 끀; 끀; 끀; ) HANGUL SYLLABLE GGYUK +B041;B041;1101 1172 11C0;B041;1101 1172 11C0; # (끁; 끁; 끁; 끁; 끁; ) HANGUL SYLLABLE GGYUT +B042;B042;1101 1172 11C1;B042;1101 1172 11C1; # (끂; 끂; 끂; 끂; 끂; ) HANGUL SYLLABLE GGYUP +B043;B043;1101 1172 11C2;B043;1101 1172 11C2; # (끃; 끃; 끃; 끃; 끃; ) HANGUL SYLLABLE GGYUH +B044;B044;1101 1173;B044;1101 1173; # (끄; 끄; 끄; 끄; 끄; ) HANGUL SYLLABLE GGEU +B045;B045;1101 1173 11A8;B045;1101 1173 11A8; # (끅; 끅; 끅; 끅; 끅; ) HANGUL SYLLABLE GGEUG +B046;B046;1101 1173 11A9;B046;1101 1173 11A9; # (끆; 끆; 끆; 끆; 끆; ) HANGUL SYLLABLE GGEUGG +B047;B047;1101 1173 11AA;B047;1101 1173 11AA; # (끇; 끇; 끇; 끇; 끇; ) HANGUL SYLLABLE GGEUGS +B048;B048;1101 1173 11AB;B048;1101 1173 11AB; # (끈; 끈; 끈; 끈; 끈; ) HANGUL SYLLABLE GGEUN +B049;B049;1101 1173 11AC;B049;1101 1173 11AC; # (끉; 끉; 끉; 끉; 끉; ) HANGUL SYLLABLE GGEUNJ +B04A;B04A;1101 1173 11AD;B04A;1101 1173 11AD; # (끊; 끊; 끊; 끊; 끊; ) HANGUL SYLLABLE GGEUNH +B04B;B04B;1101 1173 11AE;B04B;1101 1173 11AE; # (끋; 끋; 끋; 끋; 끋; ) HANGUL SYLLABLE GGEUD +B04C;B04C;1101 1173 11AF;B04C;1101 1173 11AF; # (끌; 끌; 끌; 끌; 끌; ) HANGUL SYLLABLE GGEUL +B04D;B04D;1101 1173 11B0;B04D;1101 1173 11B0; # (끍; 끍; 끍; 끍; 끍; ) HANGUL SYLLABLE GGEULG +B04E;B04E;1101 1173 11B1;B04E;1101 1173 11B1; # (끎; 끎; 끎; 끎; 끎; ) HANGUL SYLLABLE GGEULM +B04F;B04F;1101 1173 11B2;B04F;1101 1173 11B2; # (끏; 끏; 끏; 끏; 끏; ) HANGUL SYLLABLE GGEULB +B050;B050;1101 1173 11B3;B050;1101 1173 11B3; # (끐; 끐; 끐; 끐; 끐; ) HANGUL SYLLABLE GGEULS +B051;B051;1101 1173 11B4;B051;1101 1173 11B4; # (끑; 끑; 끑; 끑; 끑; ) HANGUL SYLLABLE GGEULT +B052;B052;1101 1173 11B5;B052;1101 1173 11B5; # (끒; 끒; 끒; 끒; 끒; ) HANGUL SYLLABLE GGEULP +B053;B053;1101 1173 11B6;B053;1101 1173 11B6; # (끓; 끓; 끓; 끓; 끓; ) HANGUL SYLLABLE GGEULH +B054;B054;1101 1173 11B7;B054;1101 1173 11B7; # (끔; 끔; 끔; 끔; 끔; ) HANGUL SYLLABLE GGEUM +B055;B055;1101 1173 11B8;B055;1101 1173 11B8; # (끕; 끕; 끕; 끕; 끕; ) HANGUL SYLLABLE GGEUB +B056;B056;1101 1173 11B9;B056;1101 1173 11B9; # (끖; 끖; 끖; 끖; 끖; ) HANGUL SYLLABLE GGEUBS +B057;B057;1101 1173 11BA;B057;1101 1173 11BA; # (끗; 끗; 끗; 끗; 끗; ) HANGUL SYLLABLE GGEUS +B058;B058;1101 1173 11BB;B058;1101 1173 11BB; # (끘; 끘; 끘; 끘; 끘; ) HANGUL SYLLABLE GGEUSS +B059;B059;1101 1173 11BC;B059;1101 1173 11BC; # (끙; 끙; 끙; 끙; 끙; ) HANGUL SYLLABLE GGEUNG +B05A;B05A;1101 1173 11BD;B05A;1101 1173 11BD; # (끚; 끚; 끚; 끚; 끚; ) HANGUL SYLLABLE GGEUJ +B05B;B05B;1101 1173 11BE;B05B;1101 1173 11BE; # (끛; 끛; 끛; 끛; 끛; ) HANGUL SYLLABLE GGEUC +B05C;B05C;1101 1173 11BF;B05C;1101 1173 11BF; # (끜; 끜; 끜; 끜; 끜; ) HANGUL SYLLABLE GGEUK +B05D;B05D;1101 1173 11C0;B05D;1101 1173 11C0; # (끝; 끝; 끝; 끝; 끝; ) HANGUL SYLLABLE GGEUT +B05E;B05E;1101 1173 11C1;B05E;1101 1173 11C1; # (끞; 끞; 끞; 끞; 끞; ) HANGUL SYLLABLE GGEUP +B05F;B05F;1101 1173 11C2;B05F;1101 1173 11C2; # (끟; 끟; 끟; 끟; 끟; ) HANGUL SYLLABLE GGEUH +B060;B060;1101 1174;B060;1101 1174; # (끠; 끠; 끠; 끠; 끠; ) HANGUL SYLLABLE GGYI +B061;B061;1101 1174 11A8;B061;1101 1174 11A8; # (끡; 끡; 끡; 끡; 끡; ) HANGUL SYLLABLE GGYIG +B062;B062;1101 1174 11A9;B062;1101 1174 11A9; # (끢; 끢; 끢; 끢; 끢; ) HANGUL SYLLABLE GGYIGG +B063;B063;1101 1174 11AA;B063;1101 1174 11AA; # (끣; 끣; 끣; 끣; 끣; ) HANGUL SYLLABLE GGYIGS +B064;B064;1101 1174 11AB;B064;1101 1174 11AB; # (끤; 끤; 끤; 끤; 끤; ) HANGUL SYLLABLE GGYIN +B065;B065;1101 1174 11AC;B065;1101 1174 11AC; # (끥; 끥; 끥; 끥; 끥; ) HANGUL SYLLABLE GGYINJ +B066;B066;1101 1174 11AD;B066;1101 1174 11AD; # (끦; 끦; 끦; 끦; 끦; ) HANGUL SYLLABLE GGYINH +B067;B067;1101 1174 11AE;B067;1101 1174 11AE; # (끧; 끧; 끧; 끧; 끧; ) HANGUL SYLLABLE GGYID +B068;B068;1101 1174 11AF;B068;1101 1174 11AF; # (끨; 끨; 끨; 끨; 끨; ) HANGUL SYLLABLE GGYIL +B069;B069;1101 1174 11B0;B069;1101 1174 11B0; # (끩; 끩; 끩; 끩; 끩; ) HANGUL SYLLABLE GGYILG +B06A;B06A;1101 1174 11B1;B06A;1101 1174 11B1; # (끪; 끪; 끪; 끪; 끪; ) HANGUL SYLLABLE GGYILM +B06B;B06B;1101 1174 11B2;B06B;1101 1174 11B2; # (끫; 끫; 끫; 끫; 끫; ) HANGUL SYLLABLE GGYILB +B06C;B06C;1101 1174 11B3;B06C;1101 1174 11B3; # (끬; 끬; 끬; 끬; 끬; ) HANGUL SYLLABLE GGYILS +B06D;B06D;1101 1174 11B4;B06D;1101 1174 11B4; # (끭; 끭; 끭; 끭; 끭; ) HANGUL SYLLABLE GGYILT +B06E;B06E;1101 1174 11B5;B06E;1101 1174 11B5; # (끮; 끮; 끮; 끮; 끮; ) HANGUL SYLLABLE GGYILP +B06F;B06F;1101 1174 11B6;B06F;1101 1174 11B6; # (끯; 끯; 끯; 끯; 끯; ) HANGUL SYLLABLE GGYILH +B070;B070;1101 1174 11B7;B070;1101 1174 11B7; # (끰; 끰; 끰; 끰; 끰; ) HANGUL SYLLABLE GGYIM +B071;B071;1101 1174 11B8;B071;1101 1174 11B8; # (끱; 끱; 끱; 끱; 끱; ) HANGUL SYLLABLE GGYIB +B072;B072;1101 1174 11B9;B072;1101 1174 11B9; # (끲; 끲; 끲; 끲; 끲; ) HANGUL SYLLABLE GGYIBS +B073;B073;1101 1174 11BA;B073;1101 1174 11BA; # (끳; 끳; 끳; 끳; 끳; ) HANGUL SYLLABLE GGYIS +B074;B074;1101 1174 11BB;B074;1101 1174 11BB; # (끴; 끴; 끴; 끴; 끴; ) HANGUL SYLLABLE GGYISS +B075;B075;1101 1174 11BC;B075;1101 1174 11BC; # (끵; 끵; 끵; 끵; 끵; ) HANGUL SYLLABLE GGYING +B076;B076;1101 1174 11BD;B076;1101 1174 11BD; # (끶; 끶; 끶; 끶; 끶; ) HANGUL SYLLABLE GGYIJ +B077;B077;1101 1174 11BE;B077;1101 1174 11BE; # (끷; 끷; 끷; 끷; 끷; ) HANGUL SYLLABLE GGYIC +B078;B078;1101 1174 11BF;B078;1101 1174 11BF; # (끸; 끸; 끸; 끸; 끸; ) HANGUL SYLLABLE GGYIK +B079;B079;1101 1174 11C0;B079;1101 1174 11C0; # (끹; 끹; 끹; 끹; 끹; ) HANGUL SYLLABLE GGYIT +B07A;B07A;1101 1174 11C1;B07A;1101 1174 11C1; # (끺; 끺; 끺; 끺; 끺; ) HANGUL SYLLABLE GGYIP +B07B;B07B;1101 1174 11C2;B07B;1101 1174 11C2; # (끻; 끻; 끻; 끻; 끻; ) HANGUL SYLLABLE GGYIH +B07C;B07C;1101 1175;B07C;1101 1175; # (끼; 끼; 끼; 끼; 끼; ) HANGUL SYLLABLE GGI +B07D;B07D;1101 1175 11A8;B07D;1101 1175 11A8; # (끽; 끽; 끽; 끽; 끽; ) HANGUL SYLLABLE GGIG +B07E;B07E;1101 1175 11A9;B07E;1101 1175 11A9; # (끾; 끾; 끾; 끾; 끾; ) HANGUL SYLLABLE GGIGG +B07F;B07F;1101 1175 11AA;B07F;1101 1175 11AA; # (끿; 끿; 끿; 끿; 끿; ) HANGUL SYLLABLE GGIGS +B080;B080;1101 1175 11AB;B080;1101 1175 11AB; # (낀; 낀; 낀; 낀; 낀; ) HANGUL SYLLABLE GGIN +B081;B081;1101 1175 11AC;B081;1101 1175 11AC; # (낁; 낁; 낁; 낁; 낁; ) HANGUL SYLLABLE GGINJ +B082;B082;1101 1175 11AD;B082;1101 1175 11AD; # (낂; 낂; 낂; 낂; 낂; ) HANGUL SYLLABLE GGINH +B083;B083;1101 1175 11AE;B083;1101 1175 11AE; # (낃; 낃; 낃; 낃; 낃; ) HANGUL SYLLABLE GGID +B084;B084;1101 1175 11AF;B084;1101 1175 11AF; # (낄; 낄; 낄; 낄; 낄; ) HANGUL SYLLABLE GGIL +B085;B085;1101 1175 11B0;B085;1101 1175 11B0; # (낅; 낅; 낅; 낅; 낅; ) HANGUL SYLLABLE GGILG +B086;B086;1101 1175 11B1;B086;1101 1175 11B1; # (낆; 낆; 낆; 낆; 낆; ) HANGUL SYLLABLE GGILM +B087;B087;1101 1175 11B2;B087;1101 1175 11B2; # (낇; 낇; 낇; 낇; 낇; ) HANGUL SYLLABLE GGILB +B088;B088;1101 1175 11B3;B088;1101 1175 11B3; # (낈; 낈; 낈; 낈; 낈; ) HANGUL SYLLABLE GGILS +B089;B089;1101 1175 11B4;B089;1101 1175 11B4; # (낉; 낉; 낉; 낉; 낉; ) HANGUL SYLLABLE GGILT +B08A;B08A;1101 1175 11B5;B08A;1101 1175 11B5; # (낊; 낊; 낊; 낊; 낊; ) HANGUL SYLLABLE GGILP +B08B;B08B;1101 1175 11B6;B08B;1101 1175 11B6; # (낋; 낋; 낋; 낋; 낋; ) HANGUL SYLLABLE GGILH +B08C;B08C;1101 1175 11B7;B08C;1101 1175 11B7; # (낌; 낌; 낌; 낌; 낌; ) HANGUL SYLLABLE GGIM +B08D;B08D;1101 1175 11B8;B08D;1101 1175 11B8; # (낍; 낍; 낍; 낍; 낍; ) HANGUL SYLLABLE GGIB +B08E;B08E;1101 1175 11B9;B08E;1101 1175 11B9; # (낎; 낎; 낎; 낎; 낎; ) HANGUL SYLLABLE GGIBS +B08F;B08F;1101 1175 11BA;B08F;1101 1175 11BA; # (낏; 낏; 낏; 낏; 낏; ) HANGUL SYLLABLE GGIS +B090;B090;1101 1175 11BB;B090;1101 1175 11BB; # (낐; 낐; 낐; 낐; 낐; ) HANGUL SYLLABLE GGISS +B091;B091;1101 1175 11BC;B091;1101 1175 11BC; # (낑; 낑; 낑; 낑; 낑; ) HANGUL SYLLABLE GGING +B092;B092;1101 1175 11BD;B092;1101 1175 11BD; # (낒; 낒; 낒; 낒; 낒; ) HANGUL SYLLABLE GGIJ +B093;B093;1101 1175 11BE;B093;1101 1175 11BE; # (낓; 낓; 낓; 낓; 낓; ) HANGUL SYLLABLE GGIC +B094;B094;1101 1175 11BF;B094;1101 1175 11BF; # (낔; 낔; 낔; 낔; 낔; ) HANGUL SYLLABLE GGIK +B095;B095;1101 1175 11C0;B095;1101 1175 11C0; # (낕; 낕; 낕; 낕; 낕; ) HANGUL SYLLABLE GGIT +B096;B096;1101 1175 11C1;B096;1101 1175 11C1; # (낖; 낖; 낖; 낖; 낖; ) HANGUL SYLLABLE GGIP +B097;B097;1101 1175 11C2;B097;1101 1175 11C2; # (낗; 낗; 낗; 낗; 낗; ) HANGUL SYLLABLE GGIH +B098;B098;1102 1161;B098;1102 1161; # (나; 나; 나; 나; 나; ) HANGUL SYLLABLE NA +B099;B099;1102 1161 11A8;B099;1102 1161 11A8; # (낙; 낙; 낙; 낙; 낙; ) HANGUL SYLLABLE NAG +B09A;B09A;1102 1161 11A9;B09A;1102 1161 11A9; # (낚; 낚; 낚; 낚; 낚; ) HANGUL SYLLABLE NAGG +B09B;B09B;1102 1161 11AA;B09B;1102 1161 11AA; # (낛; 낛; 낛; 낛; 낛; ) HANGUL SYLLABLE NAGS +B09C;B09C;1102 1161 11AB;B09C;1102 1161 11AB; # (난; 난; 난; 난; 난; ) HANGUL SYLLABLE NAN +B09D;B09D;1102 1161 11AC;B09D;1102 1161 11AC; # (낝; 낝; 낝; 낝; 낝; ) HANGUL SYLLABLE NANJ +B09E;B09E;1102 1161 11AD;B09E;1102 1161 11AD; # (낞; 낞; 낞; 낞; 낞; ) HANGUL SYLLABLE NANH +B09F;B09F;1102 1161 11AE;B09F;1102 1161 11AE; # (낟; 낟; 낟; 낟; 낟; ) HANGUL SYLLABLE NAD +B0A0;B0A0;1102 1161 11AF;B0A0;1102 1161 11AF; # (날; 날; 날; 날; 날; ) HANGUL SYLLABLE NAL +B0A1;B0A1;1102 1161 11B0;B0A1;1102 1161 11B0; # (낡; 낡; 낡; 낡; 낡; ) HANGUL SYLLABLE NALG +B0A2;B0A2;1102 1161 11B1;B0A2;1102 1161 11B1; # (낢; 낢; 낢; 낢; 낢; ) HANGUL SYLLABLE NALM +B0A3;B0A3;1102 1161 11B2;B0A3;1102 1161 11B2; # (낣; 낣; 낣; 낣; 낣; ) HANGUL SYLLABLE NALB +B0A4;B0A4;1102 1161 11B3;B0A4;1102 1161 11B3; # (낤; 낤; 낤; 낤; 낤; ) HANGUL SYLLABLE NALS +B0A5;B0A5;1102 1161 11B4;B0A5;1102 1161 11B4; # (낥; 낥; 낥; 낥; 낥; ) HANGUL SYLLABLE NALT +B0A6;B0A6;1102 1161 11B5;B0A6;1102 1161 11B5; # (낦; 낦; 낦; 낦; 낦; ) HANGUL SYLLABLE NALP +B0A7;B0A7;1102 1161 11B6;B0A7;1102 1161 11B6; # (낧; 낧; 낧; 낧; 낧; ) HANGUL SYLLABLE NALH +B0A8;B0A8;1102 1161 11B7;B0A8;1102 1161 11B7; # (남; 남; 남; 남; 남; ) HANGUL SYLLABLE NAM +B0A9;B0A9;1102 1161 11B8;B0A9;1102 1161 11B8; # (납; 납; 납; 납; 납; ) HANGUL SYLLABLE NAB +B0AA;B0AA;1102 1161 11B9;B0AA;1102 1161 11B9; # (낪; 낪; 낪; 낪; 낪; ) HANGUL SYLLABLE NABS +B0AB;B0AB;1102 1161 11BA;B0AB;1102 1161 11BA; # (낫; 낫; 낫; 낫; 낫; ) HANGUL SYLLABLE NAS +B0AC;B0AC;1102 1161 11BB;B0AC;1102 1161 11BB; # (났; 났; 났; 났; 났; ) HANGUL SYLLABLE NASS +B0AD;B0AD;1102 1161 11BC;B0AD;1102 1161 11BC; # (낭; 낭; 낭; 낭; 낭; ) HANGUL SYLLABLE NANG +B0AE;B0AE;1102 1161 11BD;B0AE;1102 1161 11BD; # (낮; 낮; 낮; 낮; 낮; ) HANGUL SYLLABLE NAJ +B0AF;B0AF;1102 1161 11BE;B0AF;1102 1161 11BE; # (낯; 낯; 낯; 낯; 낯; ) HANGUL SYLLABLE NAC +B0B0;B0B0;1102 1161 11BF;B0B0;1102 1161 11BF; # (낰; 낰; 낰; 낰; 낰; ) HANGUL SYLLABLE NAK +B0B1;B0B1;1102 1161 11C0;B0B1;1102 1161 11C0; # (낱; 낱; 낱; 낱; 낱; ) HANGUL SYLLABLE NAT +B0B2;B0B2;1102 1161 11C1;B0B2;1102 1161 11C1; # (낲; 낲; 낲; 낲; 낲; ) HANGUL SYLLABLE NAP +B0B3;B0B3;1102 1161 11C2;B0B3;1102 1161 11C2; # (낳; 낳; 낳; 낳; 낳; ) HANGUL SYLLABLE NAH +B0B4;B0B4;1102 1162;B0B4;1102 1162; # (내; 내; 내; 내; 내; ) HANGUL SYLLABLE NAE +B0B5;B0B5;1102 1162 11A8;B0B5;1102 1162 11A8; # (낵; 낵; 낵; 낵; 낵; ) HANGUL SYLLABLE NAEG +B0B6;B0B6;1102 1162 11A9;B0B6;1102 1162 11A9; # (낶; 낶; 낶; 낶; 낶; ) HANGUL SYLLABLE NAEGG +B0B7;B0B7;1102 1162 11AA;B0B7;1102 1162 11AA; # (낷; 낷; 낷; 낷; 낷; ) HANGUL SYLLABLE NAEGS +B0B8;B0B8;1102 1162 11AB;B0B8;1102 1162 11AB; # (낸; 낸; 낸; 낸; 낸; ) HANGUL SYLLABLE NAEN +B0B9;B0B9;1102 1162 11AC;B0B9;1102 1162 11AC; # (낹; 낹; 낹; 낹; 낹; ) HANGUL SYLLABLE NAENJ +B0BA;B0BA;1102 1162 11AD;B0BA;1102 1162 11AD; # (낺; 낺; 낺; 낺; 낺; ) HANGUL SYLLABLE NAENH +B0BB;B0BB;1102 1162 11AE;B0BB;1102 1162 11AE; # (낻; 낻; 낻; 낻; 낻; ) HANGUL SYLLABLE NAED +B0BC;B0BC;1102 1162 11AF;B0BC;1102 1162 11AF; # (낼; 낼; 낼; 낼; 낼; ) HANGUL SYLLABLE NAEL +B0BD;B0BD;1102 1162 11B0;B0BD;1102 1162 11B0; # (낽; 낽; 낽; 낽; 낽; ) HANGUL SYLLABLE NAELG +B0BE;B0BE;1102 1162 11B1;B0BE;1102 1162 11B1; # (낾; 낾; 낾; 낾; 낾; ) HANGUL SYLLABLE NAELM +B0BF;B0BF;1102 1162 11B2;B0BF;1102 1162 11B2; # (낿; 낿; 낿; 낿; 낿; ) HANGUL SYLLABLE NAELB +B0C0;B0C0;1102 1162 11B3;B0C0;1102 1162 11B3; # (냀; 냀; 냀; 냀; 냀; ) HANGUL SYLLABLE NAELS +B0C1;B0C1;1102 1162 11B4;B0C1;1102 1162 11B4; # (냁; 냁; 냁; 냁; 냁; ) HANGUL SYLLABLE NAELT +B0C2;B0C2;1102 1162 11B5;B0C2;1102 1162 11B5; # (냂; 냂; 냂; 냂; 냂; ) HANGUL SYLLABLE NAELP +B0C3;B0C3;1102 1162 11B6;B0C3;1102 1162 11B6; # (냃; 냃; 냃; 냃; 냃; ) HANGUL SYLLABLE NAELH +B0C4;B0C4;1102 1162 11B7;B0C4;1102 1162 11B7; # (냄; 냄; 냄; 냄; 냄; ) HANGUL SYLLABLE NAEM +B0C5;B0C5;1102 1162 11B8;B0C5;1102 1162 11B8; # (냅; 냅; 냅; 냅; 냅; ) HANGUL SYLLABLE NAEB +B0C6;B0C6;1102 1162 11B9;B0C6;1102 1162 11B9; # (냆; 냆; 냆; 냆; 냆; ) HANGUL SYLLABLE NAEBS +B0C7;B0C7;1102 1162 11BA;B0C7;1102 1162 11BA; # (냇; 냇; 냇; 냇; 냇; ) HANGUL SYLLABLE NAES +B0C8;B0C8;1102 1162 11BB;B0C8;1102 1162 11BB; # (냈; 냈; 냈; 냈; 냈; ) HANGUL SYLLABLE NAESS +B0C9;B0C9;1102 1162 11BC;B0C9;1102 1162 11BC; # (냉; 냉; 냉; 냉; 냉; ) HANGUL SYLLABLE NAENG +B0CA;B0CA;1102 1162 11BD;B0CA;1102 1162 11BD; # (냊; 냊; 냊; 냊; 냊; ) HANGUL SYLLABLE NAEJ +B0CB;B0CB;1102 1162 11BE;B0CB;1102 1162 11BE; # (냋; 냋; 냋; 냋; 냋; ) HANGUL SYLLABLE NAEC +B0CC;B0CC;1102 1162 11BF;B0CC;1102 1162 11BF; # (냌; 냌; 냌; 냌; 냌; ) HANGUL SYLLABLE NAEK +B0CD;B0CD;1102 1162 11C0;B0CD;1102 1162 11C0; # (냍; 냍; 냍; 냍; 냍; ) HANGUL SYLLABLE NAET +B0CE;B0CE;1102 1162 11C1;B0CE;1102 1162 11C1; # (냎; 냎; 냎; 냎; 냎; ) HANGUL SYLLABLE NAEP +B0CF;B0CF;1102 1162 11C2;B0CF;1102 1162 11C2; # (냏; 냏; 냏; 냏; 냏; ) HANGUL SYLLABLE NAEH +B0D0;B0D0;1102 1163;B0D0;1102 1163; # (냐; 냐; 냐; 냐; 냐; ) HANGUL SYLLABLE NYA +B0D1;B0D1;1102 1163 11A8;B0D1;1102 1163 11A8; # (냑; 냑; 냑; 냑; 냑; ) HANGUL SYLLABLE NYAG +B0D2;B0D2;1102 1163 11A9;B0D2;1102 1163 11A9; # (냒; 냒; 냒; 냒; 냒; ) HANGUL SYLLABLE NYAGG +B0D3;B0D3;1102 1163 11AA;B0D3;1102 1163 11AA; # (냓; 냓; 냓; 냓; 냓; ) HANGUL SYLLABLE NYAGS +B0D4;B0D4;1102 1163 11AB;B0D4;1102 1163 11AB; # (냔; 냔; 냔; 냔; 냔; ) HANGUL SYLLABLE NYAN +B0D5;B0D5;1102 1163 11AC;B0D5;1102 1163 11AC; # (냕; 냕; 냕; 냕; 냕; ) HANGUL SYLLABLE NYANJ +B0D6;B0D6;1102 1163 11AD;B0D6;1102 1163 11AD; # (냖; 냖; 냖; 냖; 냖; ) HANGUL SYLLABLE NYANH +B0D7;B0D7;1102 1163 11AE;B0D7;1102 1163 11AE; # (냗; 냗; 냗; 냗; 냗; ) HANGUL SYLLABLE NYAD +B0D8;B0D8;1102 1163 11AF;B0D8;1102 1163 11AF; # (냘; 냘; 냘; 냘; 냘; ) HANGUL SYLLABLE NYAL +B0D9;B0D9;1102 1163 11B0;B0D9;1102 1163 11B0; # (냙; 냙; 냙; 냙; 냙; ) HANGUL SYLLABLE NYALG +B0DA;B0DA;1102 1163 11B1;B0DA;1102 1163 11B1; # (냚; 냚; 냚; 냚; 냚; ) HANGUL SYLLABLE NYALM +B0DB;B0DB;1102 1163 11B2;B0DB;1102 1163 11B2; # (냛; 냛; 냛; 냛; 냛; ) HANGUL SYLLABLE NYALB +B0DC;B0DC;1102 1163 11B3;B0DC;1102 1163 11B3; # (냜; 냜; 냜; 냜; 냜; ) HANGUL SYLLABLE NYALS +B0DD;B0DD;1102 1163 11B4;B0DD;1102 1163 11B4; # (냝; 냝; 냝; 냝; 냝; ) HANGUL SYLLABLE NYALT +B0DE;B0DE;1102 1163 11B5;B0DE;1102 1163 11B5; # (냞; 냞; 냞; 냞; 냞; ) HANGUL SYLLABLE NYALP +B0DF;B0DF;1102 1163 11B6;B0DF;1102 1163 11B6; # (냟; 냟; 냟; 냟; 냟; ) HANGUL SYLLABLE NYALH +B0E0;B0E0;1102 1163 11B7;B0E0;1102 1163 11B7; # (냠; 냠; 냠; 냠; 냠; ) HANGUL SYLLABLE NYAM +B0E1;B0E1;1102 1163 11B8;B0E1;1102 1163 11B8; # (냡; 냡; 냡; 냡; 냡; ) HANGUL SYLLABLE NYAB +B0E2;B0E2;1102 1163 11B9;B0E2;1102 1163 11B9; # (냢; 냢; 냢; 냢; 냢; ) HANGUL SYLLABLE NYABS +B0E3;B0E3;1102 1163 11BA;B0E3;1102 1163 11BA; # (냣; 냣; 냣; 냣; 냣; ) HANGUL SYLLABLE NYAS +B0E4;B0E4;1102 1163 11BB;B0E4;1102 1163 11BB; # (냤; 냤; 냤; 냤; 냤; ) HANGUL SYLLABLE NYASS +B0E5;B0E5;1102 1163 11BC;B0E5;1102 1163 11BC; # (냥; 냥; 냥; 냥; 냥; ) HANGUL SYLLABLE NYANG +B0E6;B0E6;1102 1163 11BD;B0E6;1102 1163 11BD; # (냦; 냦; 냦; 냦; 냦; ) HANGUL SYLLABLE NYAJ +B0E7;B0E7;1102 1163 11BE;B0E7;1102 1163 11BE; # (냧; 냧; 냧; 냧; 냧; ) HANGUL SYLLABLE NYAC +B0E8;B0E8;1102 1163 11BF;B0E8;1102 1163 11BF; # (냨; 냨; 냨; 냨; 냨; ) HANGUL SYLLABLE NYAK +B0E9;B0E9;1102 1163 11C0;B0E9;1102 1163 11C0; # (냩; 냩; 냩; 냩; 냩; ) HANGUL SYLLABLE NYAT +B0EA;B0EA;1102 1163 11C1;B0EA;1102 1163 11C1; # (냪; 냪; 냪; 냪; 냪; ) HANGUL SYLLABLE NYAP +B0EB;B0EB;1102 1163 11C2;B0EB;1102 1163 11C2; # (냫; 냫; 냫; 냫; 냫; ) HANGUL SYLLABLE NYAH +B0EC;B0EC;1102 1164;B0EC;1102 1164; # (냬; 냬; 냬; 냬; 냬; ) HANGUL SYLLABLE NYAE +B0ED;B0ED;1102 1164 11A8;B0ED;1102 1164 11A8; # (냭; 냭; 냭; 냭; 냭; ) HANGUL SYLLABLE NYAEG +B0EE;B0EE;1102 1164 11A9;B0EE;1102 1164 11A9; # (냮; 냮; 냮; 냮; 냮; ) HANGUL SYLLABLE NYAEGG +B0EF;B0EF;1102 1164 11AA;B0EF;1102 1164 11AA; # (냯; 냯; 냯; 냯; 냯; ) HANGUL SYLLABLE NYAEGS +B0F0;B0F0;1102 1164 11AB;B0F0;1102 1164 11AB; # (냰; 냰; 냰; 냰; 냰; ) HANGUL SYLLABLE NYAEN +B0F1;B0F1;1102 1164 11AC;B0F1;1102 1164 11AC; # (냱; 냱; 냱; 냱; 냱; ) HANGUL SYLLABLE NYAENJ +B0F2;B0F2;1102 1164 11AD;B0F2;1102 1164 11AD; # (냲; 냲; 냲; 냲; 냲; ) HANGUL SYLLABLE NYAENH +B0F3;B0F3;1102 1164 11AE;B0F3;1102 1164 11AE; # (냳; 냳; 냳; 냳; 냳; ) HANGUL SYLLABLE NYAED +B0F4;B0F4;1102 1164 11AF;B0F4;1102 1164 11AF; # (냴; 냴; 냴; 냴; 냴; ) HANGUL SYLLABLE NYAEL +B0F5;B0F5;1102 1164 11B0;B0F5;1102 1164 11B0; # (냵; 냵; 냵; 냵; 냵; ) HANGUL SYLLABLE NYAELG +B0F6;B0F6;1102 1164 11B1;B0F6;1102 1164 11B1; # (냶; 냶; 냶; 냶; 냶; ) HANGUL SYLLABLE NYAELM +B0F7;B0F7;1102 1164 11B2;B0F7;1102 1164 11B2; # (냷; 냷; 냷; 냷; 냷; ) HANGUL SYLLABLE NYAELB +B0F8;B0F8;1102 1164 11B3;B0F8;1102 1164 11B3; # (냸; 냸; 냸; 냸; 냸; ) HANGUL SYLLABLE NYAELS +B0F9;B0F9;1102 1164 11B4;B0F9;1102 1164 11B4; # (냹; 냹; 냹; 냹; 냹; ) HANGUL SYLLABLE NYAELT +B0FA;B0FA;1102 1164 11B5;B0FA;1102 1164 11B5; # (냺; 냺; 냺; 냺; 냺; ) HANGUL SYLLABLE NYAELP +B0FB;B0FB;1102 1164 11B6;B0FB;1102 1164 11B6; # (냻; 냻; 냻; 냻; 냻; ) HANGUL SYLLABLE NYAELH +B0FC;B0FC;1102 1164 11B7;B0FC;1102 1164 11B7; # (냼; 냼; 냼; 냼; 냼; ) HANGUL SYLLABLE NYAEM +B0FD;B0FD;1102 1164 11B8;B0FD;1102 1164 11B8; # (냽; 냽; 냽; 냽; 냽; ) HANGUL SYLLABLE NYAEB +B0FE;B0FE;1102 1164 11B9;B0FE;1102 1164 11B9; # (냾; 냾; 냾; 냾; 냾; ) HANGUL SYLLABLE NYAEBS +B0FF;B0FF;1102 1164 11BA;B0FF;1102 1164 11BA; # (냿; 냿; 냿; 냿; 냿; ) HANGUL SYLLABLE NYAES +B100;B100;1102 1164 11BB;B100;1102 1164 11BB; # (넀; 넀; 넀; 넀; 넀; ) HANGUL SYLLABLE NYAESS +B101;B101;1102 1164 11BC;B101;1102 1164 11BC; # (넁; 넁; 넁; 넁; 넁; ) HANGUL SYLLABLE NYAENG +B102;B102;1102 1164 11BD;B102;1102 1164 11BD; # (넂; 넂; 넂; 넂; 넂; ) HANGUL SYLLABLE NYAEJ +B103;B103;1102 1164 11BE;B103;1102 1164 11BE; # (넃; 넃; 넃; 넃; 넃; ) HANGUL SYLLABLE NYAEC +B104;B104;1102 1164 11BF;B104;1102 1164 11BF; # (넄; 넄; 넄; 넄; 넄; ) HANGUL SYLLABLE NYAEK +B105;B105;1102 1164 11C0;B105;1102 1164 11C0; # (넅; 넅; 넅; 넅; 넅; ) HANGUL SYLLABLE NYAET +B106;B106;1102 1164 11C1;B106;1102 1164 11C1; # (넆; 넆; 넆; 넆; 넆; ) HANGUL SYLLABLE NYAEP +B107;B107;1102 1164 11C2;B107;1102 1164 11C2; # (넇; 넇; 넇; 넇; 넇; ) HANGUL SYLLABLE NYAEH +B108;B108;1102 1165;B108;1102 1165; # (너; 너; 너; 너; 너; ) HANGUL SYLLABLE NEO +B109;B109;1102 1165 11A8;B109;1102 1165 11A8; # (넉; 넉; 넉; 넉; 넉; ) HANGUL SYLLABLE NEOG +B10A;B10A;1102 1165 11A9;B10A;1102 1165 11A9; # (넊; 넊; 넊; 넊; 넊; ) HANGUL SYLLABLE NEOGG +B10B;B10B;1102 1165 11AA;B10B;1102 1165 11AA; # (넋; 넋; 넋; 넋; 넋; ) HANGUL SYLLABLE NEOGS +B10C;B10C;1102 1165 11AB;B10C;1102 1165 11AB; # (넌; 넌; 넌; 넌; 넌; ) HANGUL SYLLABLE NEON +B10D;B10D;1102 1165 11AC;B10D;1102 1165 11AC; # (넍; 넍; 넍; 넍; 넍; ) HANGUL SYLLABLE NEONJ +B10E;B10E;1102 1165 11AD;B10E;1102 1165 11AD; # (넎; 넎; 넎; 넎; 넎; ) HANGUL SYLLABLE NEONH +B10F;B10F;1102 1165 11AE;B10F;1102 1165 11AE; # (넏; 넏; 넏; 넏; 넏; ) HANGUL SYLLABLE NEOD +B110;B110;1102 1165 11AF;B110;1102 1165 11AF; # (널; 널; 널; 널; 널; ) HANGUL SYLLABLE NEOL +B111;B111;1102 1165 11B0;B111;1102 1165 11B0; # (넑; 넑; 넑; 넑; 넑; ) HANGUL SYLLABLE NEOLG +B112;B112;1102 1165 11B1;B112;1102 1165 11B1; # (넒; 넒; 넒; 넒; 넒; ) HANGUL SYLLABLE NEOLM +B113;B113;1102 1165 11B2;B113;1102 1165 11B2; # (넓; 넓; 넓; 넓; 넓; ) HANGUL SYLLABLE NEOLB +B114;B114;1102 1165 11B3;B114;1102 1165 11B3; # (넔; 넔; 넔; 넔; 넔; ) HANGUL SYLLABLE NEOLS +B115;B115;1102 1165 11B4;B115;1102 1165 11B4; # (넕; 넕; 넕; 넕; 넕; ) HANGUL SYLLABLE NEOLT +B116;B116;1102 1165 11B5;B116;1102 1165 11B5; # (넖; 넖; 넖; 넖; 넖; ) HANGUL SYLLABLE NEOLP +B117;B117;1102 1165 11B6;B117;1102 1165 11B6; # (넗; 넗; 넗; 넗; 넗; ) HANGUL SYLLABLE NEOLH +B118;B118;1102 1165 11B7;B118;1102 1165 11B7; # (넘; 넘; 넘; 넘; 넘; ) HANGUL SYLLABLE NEOM +B119;B119;1102 1165 11B8;B119;1102 1165 11B8; # (넙; 넙; 넙; 넙; 넙; ) HANGUL SYLLABLE NEOB +B11A;B11A;1102 1165 11B9;B11A;1102 1165 11B9; # (넚; 넚; 넚; 넚; 넚; ) HANGUL SYLLABLE NEOBS +B11B;B11B;1102 1165 11BA;B11B;1102 1165 11BA; # (넛; 넛; 넛; 넛; 넛; ) HANGUL SYLLABLE NEOS +B11C;B11C;1102 1165 11BB;B11C;1102 1165 11BB; # (넜; 넜; 넜; 넜; 넜; ) HANGUL SYLLABLE NEOSS +B11D;B11D;1102 1165 11BC;B11D;1102 1165 11BC; # (넝; 넝; 넝; 넝; 넝; ) HANGUL SYLLABLE NEONG +B11E;B11E;1102 1165 11BD;B11E;1102 1165 11BD; # (넞; 넞; 넞; 넞; 넞; ) HANGUL SYLLABLE NEOJ +B11F;B11F;1102 1165 11BE;B11F;1102 1165 11BE; # (넟; 넟; 넟; 넟; 넟; ) HANGUL SYLLABLE NEOC +B120;B120;1102 1165 11BF;B120;1102 1165 11BF; # (넠; 넠; 넠; 넠; 넠; ) HANGUL SYLLABLE NEOK +B121;B121;1102 1165 11C0;B121;1102 1165 11C0; # (넡; 넡; 넡; 넡; 넡; ) HANGUL SYLLABLE NEOT +B122;B122;1102 1165 11C1;B122;1102 1165 11C1; # (넢; 넢; 넢; 넢; 넢; ) HANGUL SYLLABLE NEOP +B123;B123;1102 1165 11C2;B123;1102 1165 11C2; # (넣; 넣; 넣; 넣; 넣; ) HANGUL SYLLABLE NEOH +B124;B124;1102 1166;B124;1102 1166; # (네; 네; 네; 네; 네; ) HANGUL SYLLABLE NE +B125;B125;1102 1166 11A8;B125;1102 1166 11A8; # (넥; 넥; 넥; 넥; 넥; ) HANGUL SYLLABLE NEG +B126;B126;1102 1166 11A9;B126;1102 1166 11A9; # (넦; 넦; 넦; 넦; 넦; ) HANGUL SYLLABLE NEGG +B127;B127;1102 1166 11AA;B127;1102 1166 11AA; # (넧; 넧; 넧; 넧; 넧; ) HANGUL SYLLABLE NEGS +B128;B128;1102 1166 11AB;B128;1102 1166 11AB; # (넨; 넨; 넨; 넨; 넨; ) HANGUL SYLLABLE NEN +B129;B129;1102 1166 11AC;B129;1102 1166 11AC; # (넩; 넩; 넩; 넩; 넩; ) HANGUL SYLLABLE NENJ +B12A;B12A;1102 1166 11AD;B12A;1102 1166 11AD; # (넪; 넪; 넪; 넪; 넪; ) HANGUL SYLLABLE NENH +B12B;B12B;1102 1166 11AE;B12B;1102 1166 11AE; # (넫; 넫; 넫; 넫; 넫; ) HANGUL SYLLABLE NED +B12C;B12C;1102 1166 11AF;B12C;1102 1166 11AF; # (넬; 넬; 넬; 넬; 넬; ) HANGUL SYLLABLE NEL +B12D;B12D;1102 1166 11B0;B12D;1102 1166 11B0; # (넭; 넭; 넭; 넭; 넭; ) HANGUL SYLLABLE NELG +B12E;B12E;1102 1166 11B1;B12E;1102 1166 11B1; # (넮; 넮; 넮; 넮; 넮; ) HANGUL SYLLABLE NELM +B12F;B12F;1102 1166 11B2;B12F;1102 1166 11B2; # (넯; 넯; 넯; 넯; 넯; ) HANGUL SYLLABLE NELB +B130;B130;1102 1166 11B3;B130;1102 1166 11B3; # (넰; 넰; 넰; 넰; 넰; ) HANGUL SYLLABLE NELS +B131;B131;1102 1166 11B4;B131;1102 1166 11B4; # (넱; 넱; 넱; 넱; 넱; ) HANGUL SYLLABLE NELT +B132;B132;1102 1166 11B5;B132;1102 1166 11B5; # (넲; 넲; 넲; 넲; 넲; ) HANGUL SYLLABLE NELP +B133;B133;1102 1166 11B6;B133;1102 1166 11B6; # (넳; 넳; 넳; 넳; 넳; ) HANGUL SYLLABLE NELH +B134;B134;1102 1166 11B7;B134;1102 1166 11B7; # (넴; 넴; 넴; 넴; 넴; ) HANGUL SYLLABLE NEM +B135;B135;1102 1166 11B8;B135;1102 1166 11B8; # (넵; 넵; 넵; 넵; 넵; ) HANGUL SYLLABLE NEB +B136;B136;1102 1166 11B9;B136;1102 1166 11B9; # (넶; 넶; 넶; 넶; 넶; ) HANGUL SYLLABLE NEBS +B137;B137;1102 1166 11BA;B137;1102 1166 11BA; # (넷; 넷; 넷; 넷; 넷; ) HANGUL SYLLABLE NES +B138;B138;1102 1166 11BB;B138;1102 1166 11BB; # (넸; 넸; 넸; 넸; 넸; ) HANGUL SYLLABLE NESS +B139;B139;1102 1166 11BC;B139;1102 1166 11BC; # (넹; 넹; 넹; 넹; 넹; ) HANGUL SYLLABLE NENG +B13A;B13A;1102 1166 11BD;B13A;1102 1166 11BD; # (넺; 넺; 넺; 넺; 넺; ) HANGUL SYLLABLE NEJ +B13B;B13B;1102 1166 11BE;B13B;1102 1166 11BE; # (넻; 넻; 넻; 넻; 넻; ) HANGUL SYLLABLE NEC +B13C;B13C;1102 1166 11BF;B13C;1102 1166 11BF; # (넼; 넼; 넼; 넼; 넼; ) HANGUL SYLLABLE NEK +B13D;B13D;1102 1166 11C0;B13D;1102 1166 11C0; # (넽; 넽; 넽; 넽; 넽; ) HANGUL SYLLABLE NET +B13E;B13E;1102 1166 11C1;B13E;1102 1166 11C1; # (넾; 넾; 넾; 넾; 넾; ) HANGUL SYLLABLE NEP +B13F;B13F;1102 1166 11C2;B13F;1102 1166 11C2; # (넿; 넿; 넿; 넿; 넿; ) HANGUL SYLLABLE NEH +B140;B140;1102 1167;B140;1102 1167; # (녀; 녀; 녀; 녀; 녀; ) HANGUL SYLLABLE NYEO +B141;B141;1102 1167 11A8;B141;1102 1167 11A8; # (녁; 녁; 녁; 녁; 녁; ) HANGUL SYLLABLE NYEOG +B142;B142;1102 1167 11A9;B142;1102 1167 11A9; # (녂; 녂; 녂; 녂; 녂; ) HANGUL SYLLABLE NYEOGG +B143;B143;1102 1167 11AA;B143;1102 1167 11AA; # (녃; 녃; 녃; 녃; 녃; ) HANGUL SYLLABLE NYEOGS +B144;B144;1102 1167 11AB;B144;1102 1167 11AB; # (년; 년; 년; 년; 년; ) HANGUL SYLLABLE NYEON +B145;B145;1102 1167 11AC;B145;1102 1167 11AC; # (녅; 녅; 녅; 녅; 녅; ) HANGUL SYLLABLE NYEONJ +B146;B146;1102 1167 11AD;B146;1102 1167 11AD; # (녆; 녆; 녆; 녆; 녆; ) HANGUL SYLLABLE NYEONH +B147;B147;1102 1167 11AE;B147;1102 1167 11AE; # (녇; 녇; 녇; 녇; 녇; ) HANGUL SYLLABLE NYEOD +B148;B148;1102 1167 11AF;B148;1102 1167 11AF; # (녈; 녈; 녈; 녈; 녈; ) HANGUL SYLLABLE NYEOL +B149;B149;1102 1167 11B0;B149;1102 1167 11B0; # (녉; 녉; 녉; 녉; 녉; ) HANGUL SYLLABLE NYEOLG +B14A;B14A;1102 1167 11B1;B14A;1102 1167 11B1; # (녊; 녊; 녊; 녊; 녊; ) HANGUL SYLLABLE NYEOLM +B14B;B14B;1102 1167 11B2;B14B;1102 1167 11B2; # (녋; 녋; 녋; 녋; 녋; ) HANGUL SYLLABLE NYEOLB +B14C;B14C;1102 1167 11B3;B14C;1102 1167 11B3; # (녌; 녌; 녌; 녌; 녌; ) HANGUL SYLLABLE NYEOLS +B14D;B14D;1102 1167 11B4;B14D;1102 1167 11B4; # (녍; 녍; 녍; 녍; 녍; ) HANGUL SYLLABLE NYEOLT +B14E;B14E;1102 1167 11B5;B14E;1102 1167 11B5; # (녎; 녎; 녎; 녎; 녎; ) HANGUL SYLLABLE NYEOLP +B14F;B14F;1102 1167 11B6;B14F;1102 1167 11B6; # (녏; 녏; 녏; 녏; 녏; ) HANGUL SYLLABLE NYEOLH +B150;B150;1102 1167 11B7;B150;1102 1167 11B7; # (념; 념; 념; 념; 념; ) HANGUL SYLLABLE NYEOM +B151;B151;1102 1167 11B8;B151;1102 1167 11B8; # (녑; 녑; 녑; 녑; 녑; ) HANGUL SYLLABLE NYEOB +B152;B152;1102 1167 11B9;B152;1102 1167 11B9; # (녒; 녒; 녒; 녒; 녒; ) HANGUL SYLLABLE NYEOBS +B153;B153;1102 1167 11BA;B153;1102 1167 11BA; # (녓; 녓; 녓; 녓; 녓; ) HANGUL SYLLABLE NYEOS +B154;B154;1102 1167 11BB;B154;1102 1167 11BB; # (녔; 녔; 녔; 녔; 녔; ) HANGUL SYLLABLE NYEOSS +B155;B155;1102 1167 11BC;B155;1102 1167 11BC; # (녕; 녕; 녕; 녕; 녕; ) HANGUL SYLLABLE NYEONG +B156;B156;1102 1167 11BD;B156;1102 1167 11BD; # (녖; 녖; 녖; 녖; 녖; ) HANGUL SYLLABLE NYEOJ +B157;B157;1102 1167 11BE;B157;1102 1167 11BE; # (녗; 녗; 녗; 녗; 녗; ) HANGUL SYLLABLE NYEOC +B158;B158;1102 1167 11BF;B158;1102 1167 11BF; # (녘; 녘; 녘; 녘; 녘; ) HANGUL SYLLABLE NYEOK +B159;B159;1102 1167 11C0;B159;1102 1167 11C0; # (녙; 녙; 녙; 녙; 녙; ) HANGUL SYLLABLE NYEOT +B15A;B15A;1102 1167 11C1;B15A;1102 1167 11C1; # (녚; 녚; 녚; 녚; 녚; ) HANGUL SYLLABLE NYEOP +B15B;B15B;1102 1167 11C2;B15B;1102 1167 11C2; # (녛; 녛; 녛; 녛; 녛; ) HANGUL SYLLABLE NYEOH +B15C;B15C;1102 1168;B15C;1102 1168; # (녜; 녜; 녜; 녜; 녜; ) HANGUL SYLLABLE NYE +B15D;B15D;1102 1168 11A8;B15D;1102 1168 11A8; # (녝; 녝; 녝; 녝; 녝; ) HANGUL SYLLABLE NYEG +B15E;B15E;1102 1168 11A9;B15E;1102 1168 11A9; # (녞; 녞; 녞; 녞; 녞; ) HANGUL SYLLABLE NYEGG +B15F;B15F;1102 1168 11AA;B15F;1102 1168 11AA; # (녟; 녟; 녟; 녟; 녟; ) HANGUL SYLLABLE NYEGS +B160;B160;1102 1168 11AB;B160;1102 1168 11AB; # (녠; 녠; 녠; 녠; 녠; ) HANGUL SYLLABLE NYEN +B161;B161;1102 1168 11AC;B161;1102 1168 11AC; # (녡; 녡; 녡; 녡; 녡; ) HANGUL SYLLABLE NYENJ +B162;B162;1102 1168 11AD;B162;1102 1168 11AD; # (녢; 녢; 녢; 녢; 녢; ) HANGUL SYLLABLE NYENH +B163;B163;1102 1168 11AE;B163;1102 1168 11AE; # (녣; 녣; 녣; 녣; 녣; ) HANGUL SYLLABLE NYED +B164;B164;1102 1168 11AF;B164;1102 1168 11AF; # (녤; 녤; 녤; 녤; 녤; ) HANGUL SYLLABLE NYEL +B165;B165;1102 1168 11B0;B165;1102 1168 11B0; # (녥; 녥; 녥; 녥; 녥; ) HANGUL SYLLABLE NYELG +B166;B166;1102 1168 11B1;B166;1102 1168 11B1; # (녦; 녦; 녦; 녦; 녦; ) HANGUL SYLLABLE NYELM +B167;B167;1102 1168 11B2;B167;1102 1168 11B2; # (녧; 녧; 녧; 녧; 녧; ) HANGUL SYLLABLE NYELB +B168;B168;1102 1168 11B3;B168;1102 1168 11B3; # (녨; 녨; 녨; 녨; 녨; ) HANGUL SYLLABLE NYELS +B169;B169;1102 1168 11B4;B169;1102 1168 11B4; # (녩; 녩; 녩; 녩; 녩; ) HANGUL SYLLABLE NYELT +B16A;B16A;1102 1168 11B5;B16A;1102 1168 11B5; # (녪; 녪; 녪; 녪; 녪; ) HANGUL SYLLABLE NYELP +B16B;B16B;1102 1168 11B6;B16B;1102 1168 11B6; # (녫; 녫; 녫; 녫; 녫; ) HANGUL SYLLABLE NYELH +B16C;B16C;1102 1168 11B7;B16C;1102 1168 11B7; # (녬; 녬; 녬; 녬; 녬; ) HANGUL SYLLABLE NYEM +B16D;B16D;1102 1168 11B8;B16D;1102 1168 11B8; # (녭; 녭; 녭; 녭; 녭; ) HANGUL SYLLABLE NYEB +B16E;B16E;1102 1168 11B9;B16E;1102 1168 11B9; # (녮; 녮; 녮; 녮; 녮; ) HANGUL SYLLABLE NYEBS +B16F;B16F;1102 1168 11BA;B16F;1102 1168 11BA; # (녯; 녯; 녯; 녯; 녯; ) HANGUL SYLLABLE NYES +B170;B170;1102 1168 11BB;B170;1102 1168 11BB; # (녰; 녰; 녰; 녰; 녰; ) HANGUL SYLLABLE NYESS +B171;B171;1102 1168 11BC;B171;1102 1168 11BC; # (녱; 녱; 녱; 녱; 녱; ) HANGUL SYLLABLE NYENG +B172;B172;1102 1168 11BD;B172;1102 1168 11BD; # (녲; 녲; 녲; 녲; 녲; ) HANGUL SYLLABLE NYEJ +B173;B173;1102 1168 11BE;B173;1102 1168 11BE; # (녳; 녳; 녳; 녳; 녳; ) HANGUL SYLLABLE NYEC +B174;B174;1102 1168 11BF;B174;1102 1168 11BF; # (녴; 녴; 녴; 녴; 녴; ) HANGUL SYLLABLE NYEK +B175;B175;1102 1168 11C0;B175;1102 1168 11C0; # (녵; 녵; 녵; 녵; 녵; ) HANGUL SYLLABLE NYET +B176;B176;1102 1168 11C1;B176;1102 1168 11C1; # (녶; 녶; 녶; 녶; 녶; ) HANGUL SYLLABLE NYEP +B177;B177;1102 1168 11C2;B177;1102 1168 11C2; # (녷; 녷; 녷; 녷; 녷; ) HANGUL SYLLABLE NYEH +B178;B178;1102 1169;B178;1102 1169; # (노; 노; 노; 노; 노; ) HANGUL SYLLABLE NO +B179;B179;1102 1169 11A8;B179;1102 1169 11A8; # (녹; 녹; 녹; 녹; 녹; ) HANGUL SYLLABLE NOG +B17A;B17A;1102 1169 11A9;B17A;1102 1169 11A9; # (녺; 녺; 녺; 녺; 녺; ) HANGUL SYLLABLE NOGG +B17B;B17B;1102 1169 11AA;B17B;1102 1169 11AA; # (녻; 녻; 녻; 녻; 녻; ) HANGUL SYLLABLE NOGS +B17C;B17C;1102 1169 11AB;B17C;1102 1169 11AB; # (논; 논; 논; 논; 논; ) HANGUL SYLLABLE NON +B17D;B17D;1102 1169 11AC;B17D;1102 1169 11AC; # (녽; 녽; 녽; 녽; 녽; ) HANGUL SYLLABLE NONJ +B17E;B17E;1102 1169 11AD;B17E;1102 1169 11AD; # (녾; 녾; 녾; 녾; 녾; ) HANGUL SYLLABLE NONH +B17F;B17F;1102 1169 11AE;B17F;1102 1169 11AE; # (녿; 녿; 녿; 녿; 녿; ) HANGUL SYLLABLE NOD +B180;B180;1102 1169 11AF;B180;1102 1169 11AF; # (놀; 놀; 놀; 놀; 놀; ) HANGUL SYLLABLE NOL +B181;B181;1102 1169 11B0;B181;1102 1169 11B0; # (놁; 놁; 놁; 놁; 놁; ) HANGUL SYLLABLE NOLG +B182;B182;1102 1169 11B1;B182;1102 1169 11B1; # (놂; 놂; 놂; 놂; 놂; ) HANGUL SYLLABLE NOLM +B183;B183;1102 1169 11B2;B183;1102 1169 11B2; # (놃; 놃; 놃; 놃; 놃; ) HANGUL SYLLABLE NOLB +B184;B184;1102 1169 11B3;B184;1102 1169 11B3; # (놄; 놄; 놄; 놄; 놄; ) HANGUL SYLLABLE NOLS +B185;B185;1102 1169 11B4;B185;1102 1169 11B4; # (놅; 놅; 놅; 놅; 놅; ) HANGUL SYLLABLE NOLT +B186;B186;1102 1169 11B5;B186;1102 1169 11B5; # (놆; 놆; 놆; 놆; 놆; ) HANGUL SYLLABLE NOLP +B187;B187;1102 1169 11B6;B187;1102 1169 11B6; # (놇; 놇; 놇; 놇; 놇; ) HANGUL SYLLABLE NOLH +B188;B188;1102 1169 11B7;B188;1102 1169 11B7; # (놈; 놈; 놈; 놈; 놈; ) HANGUL SYLLABLE NOM +B189;B189;1102 1169 11B8;B189;1102 1169 11B8; # (놉; 놉; 놉; 놉; 놉; ) HANGUL SYLLABLE NOB +B18A;B18A;1102 1169 11B9;B18A;1102 1169 11B9; # (놊; 놊; 놊; 놊; 놊; ) HANGUL SYLLABLE NOBS +B18B;B18B;1102 1169 11BA;B18B;1102 1169 11BA; # (놋; 놋; 놋; 놋; 놋; ) HANGUL SYLLABLE NOS +B18C;B18C;1102 1169 11BB;B18C;1102 1169 11BB; # (놌; 놌; 놌; 놌; 놌; ) HANGUL SYLLABLE NOSS +B18D;B18D;1102 1169 11BC;B18D;1102 1169 11BC; # (농; 농; 농; 농; 농; ) HANGUL SYLLABLE NONG +B18E;B18E;1102 1169 11BD;B18E;1102 1169 11BD; # (놎; 놎; 놎; 놎; 놎; ) HANGUL SYLLABLE NOJ +B18F;B18F;1102 1169 11BE;B18F;1102 1169 11BE; # (놏; 놏; 놏; 놏; 놏; ) HANGUL SYLLABLE NOC +B190;B190;1102 1169 11BF;B190;1102 1169 11BF; # (놐; 놐; 놐; 놐; 놐; ) HANGUL SYLLABLE NOK +B191;B191;1102 1169 11C0;B191;1102 1169 11C0; # (놑; 놑; 놑; 놑; 놑; ) HANGUL SYLLABLE NOT +B192;B192;1102 1169 11C1;B192;1102 1169 11C1; # (높; 높; 높; 높; 높; ) HANGUL SYLLABLE NOP +B193;B193;1102 1169 11C2;B193;1102 1169 11C2; # (놓; 놓; 놓; 놓; 놓; ) HANGUL SYLLABLE NOH +B194;B194;1102 116A;B194;1102 116A; # (놔; 놔; 놔; 놔; 놔; ) HANGUL SYLLABLE NWA +B195;B195;1102 116A 11A8;B195;1102 116A 11A8; # (놕; 놕; 놕; 놕; 놕; ) HANGUL SYLLABLE NWAG +B196;B196;1102 116A 11A9;B196;1102 116A 11A9; # (놖; 놖; 놖; 놖; 놖; ) HANGUL SYLLABLE NWAGG +B197;B197;1102 116A 11AA;B197;1102 116A 11AA; # (놗; 놗; 놗; 놗; 놗; ) HANGUL SYLLABLE NWAGS +B198;B198;1102 116A 11AB;B198;1102 116A 11AB; # (놘; 놘; 놘; 놘; 놘; ) HANGUL SYLLABLE NWAN +B199;B199;1102 116A 11AC;B199;1102 116A 11AC; # (놙; 놙; 놙; 놙; 놙; ) HANGUL SYLLABLE NWANJ +B19A;B19A;1102 116A 11AD;B19A;1102 116A 11AD; # (놚; 놚; 놚; 놚; 놚; ) HANGUL SYLLABLE NWANH +B19B;B19B;1102 116A 11AE;B19B;1102 116A 11AE; # (놛; 놛; 놛; 놛; 놛; ) HANGUL SYLLABLE NWAD +B19C;B19C;1102 116A 11AF;B19C;1102 116A 11AF; # (놜; 놜; 놜; 놜; 놜; ) HANGUL SYLLABLE NWAL +B19D;B19D;1102 116A 11B0;B19D;1102 116A 11B0; # (놝; 놝; 놝; 놝; 놝; ) HANGUL SYLLABLE NWALG +B19E;B19E;1102 116A 11B1;B19E;1102 116A 11B1; # (놞; 놞; 놞; 놞; 놞; ) HANGUL SYLLABLE NWALM +B19F;B19F;1102 116A 11B2;B19F;1102 116A 11B2; # (놟; 놟; 놟; 놟; 놟; ) HANGUL SYLLABLE NWALB +B1A0;B1A0;1102 116A 11B3;B1A0;1102 116A 11B3; # (놠; 놠; 놠; 놠; 놠; ) HANGUL SYLLABLE NWALS +B1A1;B1A1;1102 116A 11B4;B1A1;1102 116A 11B4; # (놡; 놡; 놡; 놡; 놡; ) HANGUL SYLLABLE NWALT +B1A2;B1A2;1102 116A 11B5;B1A2;1102 116A 11B5; # (놢; 놢; 놢; 놢; 놢; ) HANGUL SYLLABLE NWALP +B1A3;B1A3;1102 116A 11B6;B1A3;1102 116A 11B6; # (놣; 놣; 놣; 놣; 놣; ) HANGUL SYLLABLE NWALH +B1A4;B1A4;1102 116A 11B7;B1A4;1102 116A 11B7; # (놤; 놤; 놤; 놤; 놤; ) HANGUL SYLLABLE NWAM +B1A5;B1A5;1102 116A 11B8;B1A5;1102 116A 11B8; # (놥; 놥; 놥; 놥; 놥; ) HANGUL SYLLABLE NWAB +B1A6;B1A6;1102 116A 11B9;B1A6;1102 116A 11B9; # (놦; 놦; 놦; 놦; 놦; ) HANGUL SYLLABLE NWABS +B1A7;B1A7;1102 116A 11BA;B1A7;1102 116A 11BA; # (놧; 놧; 놧; 놧; 놧; ) HANGUL SYLLABLE NWAS +B1A8;B1A8;1102 116A 11BB;B1A8;1102 116A 11BB; # (놨; 놨; 놨; 놨; 놨; ) HANGUL SYLLABLE NWASS +B1A9;B1A9;1102 116A 11BC;B1A9;1102 116A 11BC; # (놩; 놩; 놩; 놩; 놩; ) HANGUL SYLLABLE NWANG +B1AA;B1AA;1102 116A 11BD;B1AA;1102 116A 11BD; # (놪; 놪; 놪; 놪; 놪; ) HANGUL SYLLABLE NWAJ +B1AB;B1AB;1102 116A 11BE;B1AB;1102 116A 11BE; # (놫; 놫; 놫; 놫; 놫; ) HANGUL SYLLABLE NWAC +B1AC;B1AC;1102 116A 11BF;B1AC;1102 116A 11BF; # (놬; 놬; 놬; 놬; 놬; ) HANGUL SYLLABLE NWAK +B1AD;B1AD;1102 116A 11C0;B1AD;1102 116A 11C0; # (놭; 놭; 놭; 놭; 놭; ) HANGUL SYLLABLE NWAT +B1AE;B1AE;1102 116A 11C1;B1AE;1102 116A 11C1; # (놮; 놮; 놮; 놮; 놮; ) HANGUL SYLLABLE NWAP +B1AF;B1AF;1102 116A 11C2;B1AF;1102 116A 11C2; # (놯; 놯; 놯; 놯; 놯; ) HANGUL SYLLABLE NWAH +B1B0;B1B0;1102 116B;B1B0;1102 116B; # (놰; 놰; 놰; 놰; 놰; ) HANGUL SYLLABLE NWAE +B1B1;B1B1;1102 116B 11A8;B1B1;1102 116B 11A8; # (놱; 놱; 놱; 놱; 놱; ) HANGUL SYLLABLE NWAEG +B1B2;B1B2;1102 116B 11A9;B1B2;1102 116B 11A9; # (놲; 놲; 놲; 놲; 놲; ) HANGUL SYLLABLE NWAEGG +B1B3;B1B3;1102 116B 11AA;B1B3;1102 116B 11AA; # (놳; 놳; 놳; 놳; 놳; ) HANGUL SYLLABLE NWAEGS +B1B4;B1B4;1102 116B 11AB;B1B4;1102 116B 11AB; # (놴; 놴; 놴; 놴; 놴; ) HANGUL SYLLABLE NWAEN +B1B5;B1B5;1102 116B 11AC;B1B5;1102 116B 11AC; # (놵; 놵; 놵; 놵; 놵; ) HANGUL SYLLABLE NWAENJ +B1B6;B1B6;1102 116B 11AD;B1B6;1102 116B 11AD; # (놶; 놶; 놶; 놶; 놶; ) HANGUL SYLLABLE NWAENH +B1B7;B1B7;1102 116B 11AE;B1B7;1102 116B 11AE; # (놷; 놷; 놷; 놷; 놷; ) HANGUL SYLLABLE NWAED +B1B8;B1B8;1102 116B 11AF;B1B8;1102 116B 11AF; # (놸; 놸; 놸; 놸; 놸; ) HANGUL SYLLABLE NWAEL +B1B9;B1B9;1102 116B 11B0;B1B9;1102 116B 11B0; # (놹; 놹; 놹; 놹; 놹; ) HANGUL SYLLABLE NWAELG +B1BA;B1BA;1102 116B 11B1;B1BA;1102 116B 11B1; # (놺; 놺; 놺; 놺; 놺; ) HANGUL SYLLABLE NWAELM +B1BB;B1BB;1102 116B 11B2;B1BB;1102 116B 11B2; # (놻; 놻; 놻; 놻; 놻; ) HANGUL SYLLABLE NWAELB +B1BC;B1BC;1102 116B 11B3;B1BC;1102 116B 11B3; # (놼; 놼; 놼; 놼; 놼; ) HANGUL SYLLABLE NWAELS +B1BD;B1BD;1102 116B 11B4;B1BD;1102 116B 11B4; # (놽; 놽; 놽; 놽; 놽; ) HANGUL SYLLABLE NWAELT +B1BE;B1BE;1102 116B 11B5;B1BE;1102 116B 11B5; # (놾; 놾; 놾; 놾; 놾; ) HANGUL SYLLABLE NWAELP +B1BF;B1BF;1102 116B 11B6;B1BF;1102 116B 11B6; # (놿; 놿; 놿; 놿; 놿; ) HANGUL SYLLABLE NWAELH +B1C0;B1C0;1102 116B 11B7;B1C0;1102 116B 11B7; # (뇀; 뇀; 뇀; 뇀; 뇀; ) HANGUL SYLLABLE NWAEM +B1C1;B1C1;1102 116B 11B8;B1C1;1102 116B 11B8; # (뇁; 뇁; 뇁; 뇁; 뇁; ) HANGUL SYLLABLE NWAEB +B1C2;B1C2;1102 116B 11B9;B1C2;1102 116B 11B9; # (뇂; 뇂; 뇂; 뇂; 뇂; ) HANGUL SYLLABLE NWAEBS +B1C3;B1C3;1102 116B 11BA;B1C3;1102 116B 11BA; # (뇃; 뇃; 뇃; 뇃; 뇃; ) HANGUL SYLLABLE NWAES +B1C4;B1C4;1102 116B 11BB;B1C4;1102 116B 11BB; # (뇄; 뇄; 뇄; 뇄; 뇄; ) HANGUL SYLLABLE NWAESS +B1C5;B1C5;1102 116B 11BC;B1C5;1102 116B 11BC; # (뇅; 뇅; 뇅; 뇅; 뇅; ) HANGUL SYLLABLE NWAENG +B1C6;B1C6;1102 116B 11BD;B1C6;1102 116B 11BD; # (뇆; 뇆; 뇆; 뇆; 뇆; ) HANGUL SYLLABLE NWAEJ +B1C7;B1C7;1102 116B 11BE;B1C7;1102 116B 11BE; # (뇇; 뇇; 뇇; 뇇; 뇇; ) HANGUL SYLLABLE NWAEC +B1C8;B1C8;1102 116B 11BF;B1C8;1102 116B 11BF; # (뇈; 뇈; 뇈; 뇈; 뇈; ) HANGUL SYLLABLE NWAEK +B1C9;B1C9;1102 116B 11C0;B1C9;1102 116B 11C0; # (뇉; 뇉; 뇉; 뇉; 뇉; ) HANGUL SYLLABLE NWAET +B1CA;B1CA;1102 116B 11C1;B1CA;1102 116B 11C1; # (뇊; 뇊; 뇊; 뇊; 뇊; ) HANGUL SYLLABLE NWAEP +B1CB;B1CB;1102 116B 11C2;B1CB;1102 116B 11C2; # (뇋; 뇋; 뇋; 뇋; 뇋; ) HANGUL SYLLABLE NWAEH +B1CC;B1CC;1102 116C;B1CC;1102 116C; # (뇌; 뇌; 뇌; 뇌; 뇌; ) HANGUL SYLLABLE NOE +B1CD;B1CD;1102 116C 11A8;B1CD;1102 116C 11A8; # (뇍; 뇍; 뇍; 뇍; 뇍; ) HANGUL SYLLABLE NOEG +B1CE;B1CE;1102 116C 11A9;B1CE;1102 116C 11A9; # (뇎; 뇎; 뇎; 뇎; 뇎; ) HANGUL SYLLABLE NOEGG +B1CF;B1CF;1102 116C 11AA;B1CF;1102 116C 11AA; # (뇏; 뇏; 뇏; 뇏; 뇏; ) HANGUL SYLLABLE NOEGS +B1D0;B1D0;1102 116C 11AB;B1D0;1102 116C 11AB; # (뇐; 뇐; 뇐; 뇐; 뇐; ) HANGUL SYLLABLE NOEN +B1D1;B1D1;1102 116C 11AC;B1D1;1102 116C 11AC; # (뇑; 뇑; 뇑; 뇑; 뇑; ) HANGUL SYLLABLE NOENJ +B1D2;B1D2;1102 116C 11AD;B1D2;1102 116C 11AD; # (뇒; 뇒; 뇒; 뇒; 뇒; ) HANGUL SYLLABLE NOENH +B1D3;B1D3;1102 116C 11AE;B1D3;1102 116C 11AE; # (뇓; 뇓; 뇓; 뇓; 뇓; ) HANGUL SYLLABLE NOED +B1D4;B1D4;1102 116C 11AF;B1D4;1102 116C 11AF; # (뇔; 뇔; 뇔; 뇔; 뇔; ) HANGUL SYLLABLE NOEL +B1D5;B1D5;1102 116C 11B0;B1D5;1102 116C 11B0; # (뇕; 뇕; 뇕; 뇕; 뇕; ) HANGUL SYLLABLE NOELG +B1D6;B1D6;1102 116C 11B1;B1D6;1102 116C 11B1; # (뇖; 뇖; 뇖; 뇖; 뇖; ) HANGUL SYLLABLE NOELM +B1D7;B1D7;1102 116C 11B2;B1D7;1102 116C 11B2; # (뇗; 뇗; 뇗; 뇗; 뇗; ) HANGUL SYLLABLE NOELB +B1D8;B1D8;1102 116C 11B3;B1D8;1102 116C 11B3; # (뇘; 뇘; 뇘; 뇘; 뇘; ) HANGUL SYLLABLE NOELS +B1D9;B1D9;1102 116C 11B4;B1D9;1102 116C 11B4; # (뇙; 뇙; 뇙; 뇙; 뇙; ) HANGUL SYLLABLE NOELT +B1DA;B1DA;1102 116C 11B5;B1DA;1102 116C 11B5; # (뇚; 뇚; 뇚; 뇚; 뇚; ) HANGUL SYLLABLE NOELP +B1DB;B1DB;1102 116C 11B6;B1DB;1102 116C 11B6; # (뇛; 뇛; 뇛; 뇛; 뇛; ) HANGUL SYLLABLE NOELH +B1DC;B1DC;1102 116C 11B7;B1DC;1102 116C 11B7; # (뇜; 뇜; 뇜; 뇜; 뇜; ) HANGUL SYLLABLE NOEM +B1DD;B1DD;1102 116C 11B8;B1DD;1102 116C 11B8; # (뇝; 뇝; 뇝; 뇝; 뇝; ) HANGUL SYLLABLE NOEB +B1DE;B1DE;1102 116C 11B9;B1DE;1102 116C 11B9; # (뇞; 뇞; 뇞; 뇞; 뇞; ) HANGUL SYLLABLE NOEBS +B1DF;B1DF;1102 116C 11BA;B1DF;1102 116C 11BA; # (뇟; 뇟; 뇟; 뇟; 뇟; ) HANGUL SYLLABLE NOES +B1E0;B1E0;1102 116C 11BB;B1E0;1102 116C 11BB; # (뇠; 뇠; 뇠; 뇠; 뇠; ) HANGUL SYLLABLE NOESS +B1E1;B1E1;1102 116C 11BC;B1E1;1102 116C 11BC; # (뇡; 뇡; 뇡; 뇡; 뇡; ) HANGUL SYLLABLE NOENG +B1E2;B1E2;1102 116C 11BD;B1E2;1102 116C 11BD; # (뇢; 뇢; 뇢; 뇢; 뇢; ) HANGUL SYLLABLE NOEJ +B1E3;B1E3;1102 116C 11BE;B1E3;1102 116C 11BE; # (뇣; 뇣; 뇣; 뇣; 뇣; ) HANGUL SYLLABLE NOEC +B1E4;B1E4;1102 116C 11BF;B1E4;1102 116C 11BF; # (뇤; 뇤; 뇤; 뇤; 뇤; ) HANGUL SYLLABLE NOEK +B1E5;B1E5;1102 116C 11C0;B1E5;1102 116C 11C0; # (뇥; 뇥; 뇥; 뇥; 뇥; ) HANGUL SYLLABLE NOET +B1E6;B1E6;1102 116C 11C1;B1E6;1102 116C 11C1; # (뇦; 뇦; 뇦; 뇦; 뇦; ) HANGUL SYLLABLE NOEP +B1E7;B1E7;1102 116C 11C2;B1E7;1102 116C 11C2; # (뇧; 뇧; 뇧; 뇧; 뇧; ) HANGUL SYLLABLE NOEH +B1E8;B1E8;1102 116D;B1E8;1102 116D; # (뇨; 뇨; 뇨; 뇨; 뇨; ) HANGUL SYLLABLE NYO +B1E9;B1E9;1102 116D 11A8;B1E9;1102 116D 11A8; # (뇩; 뇩; 뇩; 뇩; 뇩; ) HANGUL SYLLABLE NYOG +B1EA;B1EA;1102 116D 11A9;B1EA;1102 116D 11A9; # (뇪; 뇪; 뇪; 뇪; 뇪; ) HANGUL SYLLABLE NYOGG +B1EB;B1EB;1102 116D 11AA;B1EB;1102 116D 11AA; # (뇫; 뇫; 뇫; 뇫; 뇫; ) HANGUL SYLLABLE NYOGS +B1EC;B1EC;1102 116D 11AB;B1EC;1102 116D 11AB; # (뇬; 뇬; 뇬; 뇬; 뇬; ) HANGUL SYLLABLE NYON +B1ED;B1ED;1102 116D 11AC;B1ED;1102 116D 11AC; # (뇭; 뇭; 뇭; 뇭; 뇭; ) HANGUL SYLLABLE NYONJ +B1EE;B1EE;1102 116D 11AD;B1EE;1102 116D 11AD; # (뇮; 뇮; 뇮; 뇮; 뇮; ) HANGUL SYLLABLE NYONH +B1EF;B1EF;1102 116D 11AE;B1EF;1102 116D 11AE; # (뇯; 뇯; 뇯; 뇯; 뇯; ) HANGUL SYLLABLE NYOD +B1F0;B1F0;1102 116D 11AF;B1F0;1102 116D 11AF; # (뇰; 뇰; 뇰; 뇰; 뇰; ) HANGUL SYLLABLE NYOL +B1F1;B1F1;1102 116D 11B0;B1F1;1102 116D 11B0; # (뇱; 뇱; 뇱; 뇱; 뇱; ) HANGUL SYLLABLE NYOLG +B1F2;B1F2;1102 116D 11B1;B1F2;1102 116D 11B1; # (뇲; 뇲; 뇲; 뇲; 뇲; ) HANGUL SYLLABLE NYOLM +B1F3;B1F3;1102 116D 11B2;B1F3;1102 116D 11B2; # (뇳; 뇳; 뇳; 뇳; 뇳; ) HANGUL SYLLABLE NYOLB +B1F4;B1F4;1102 116D 11B3;B1F4;1102 116D 11B3; # (뇴; 뇴; 뇴; 뇴; 뇴; ) HANGUL SYLLABLE NYOLS +B1F5;B1F5;1102 116D 11B4;B1F5;1102 116D 11B4; # (뇵; 뇵; 뇵; 뇵; 뇵; ) HANGUL SYLLABLE NYOLT +B1F6;B1F6;1102 116D 11B5;B1F6;1102 116D 11B5; # (뇶; 뇶; 뇶; 뇶; 뇶; ) HANGUL SYLLABLE NYOLP +B1F7;B1F7;1102 116D 11B6;B1F7;1102 116D 11B6; # (뇷; 뇷; 뇷; 뇷; 뇷; ) HANGUL SYLLABLE NYOLH +B1F8;B1F8;1102 116D 11B7;B1F8;1102 116D 11B7; # (뇸; 뇸; 뇸; 뇸; 뇸; ) HANGUL SYLLABLE NYOM +B1F9;B1F9;1102 116D 11B8;B1F9;1102 116D 11B8; # (뇹; 뇹; 뇹; 뇹; 뇹; ) HANGUL SYLLABLE NYOB +B1FA;B1FA;1102 116D 11B9;B1FA;1102 116D 11B9; # (뇺; 뇺; 뇺; 뇺; 뇺; ) HANGUL SYLLABLE NYOBS +B1FB;B1FB;1102 116D 11BA;B1FB;1102 116D 11BA; # (뇻; 뇻; 뇻; 뇻; 뇻; ) HANGUL SYLLABLE NYOS +B1FC;B1FC;1102 116D 11BB;B1FC;1102 116D 11BB; # (뇼; 뇼; 뇼; 뇼; 뇼; ) HANGUL SYLLABLE NYOSS +B1FD;B1FD;1102 116D 11BC;B1FD;1102 116D 11BC; # (뇽; 뇽; 뇽; 뇽; 뇽; ) HANGUL SYLLABLE NYONG +B1FE;B1FE;1102 116D 11BD;B1FE;1102 116D 11BD; # (뇾; 뇾; 뇾; 뇾; 뇾; ) HANGUL SYLLABLE NYOJ +B1FF;B1FF;1102 116D 11BE;B1FF;1102 116D 11BE; # (뇿; 뇿; 뇿; 뇿; 뇿; ) HANGUL SYLLABLE NYOC +B200;B200;1102 116D 11BF;B200;1102 116D 11BF; # (눀; 눀; 눀; 눀; 눀; ) HANGUL SYLLABLE NYOK +B201;B201;1102 116D 11C0;B201;1102 116D 11C0; # (눁; 눁; 눁; 눁; 눁; ) HANGUL SYLLABLE NYOT +B202;B202;1102 116D 11C1;B202;1102 116D 11C1; # (눂; 눂; 눂; 눂; 눂; ) HANGUL SYLLABLE NYOP +B203;B203;1102 116D 11C2;B203;1102 116D 11C2; # (눃; 눃; 눃; 눃; 눃; ) HANGUL SYLLABLE NYOH +B204;B204;1102 116E;B204;1102 116E; # (누; 누; 누; 누; 누; ) HANGUL SYLLABLE NU +B205;B205;1102 116E 11A8;B205;1102 116E 11A8; # (눅; 눅; 눅; 눅; 눅; ) HANGUL SYLLABLE NUG +B206;B206;1102 116E 11A9;B206;1102 116E 11A9; # (눆; 눆; 눆; 눆; 눆; ) HANGUL SYLLABLE NUGG +B207;B207;1102 116E 11AA;B207;1102 116E 11AA; # (눇; 눇; 눇; 눇; 눇; ) HANGUL SYLLABLE NUGS +B208;B208;1102 116E 11AB;B208;1102 116E 11AB; # (눈; 눈; 눈; 눈; 눈; ) HANGUL SYLLABLE NUN +B209;B209;1102 116E 11AC;B209;1102 116E 11AC; # (눉; 눉; 눉; 눉; 눉; ) HANGUL SYLLABLE NUNJ +B20A;B20A;1102 116E 11AD;B20A;1102 116E 11AD; # (눊; 눊; 눊; 눊; 눊; ) HANGUL SYLLABLE NUNH +B20B;B20B;1102 116E 11AE;B20B;1102 116E 11AE; # (눋; 눋; 눋; 눋; 눋; ) HANGUL SYLLABLE NUD +B20C;B20C;1102 116E 11AF;B20C;1102 116E 11AF; # (눌; 눌; 눌; 눌; 눌; ) HANGUL SYLLABLE NUL +B20D;B20D;1102 116E 11B0;B20D;1102 116E 11B0; # (눍; 눍; 눍; 눍; 눍; ) HANGUL SYLLABLE NULG +B20E;B20E;1102 116E 11B1;B20E;1102 116E 11B1; # (눎; 눎; 눎; 눎; 눎; ) HANGUL SYLLABLE NULM +B20F;B20F;1102 116E 11B2;B20F;1102 116E 11B2; # (눏; 눏; 눏; 눏; 눏; ) HANGUL SYLLABLE NULB +B210;B210;1102 116E 11B3;B210;1102 116E 11B3; # (눐; 눐; 눐; 눐; 눐; ) HANGUL SYLLABLE NULS +B211;B211;1102 116E 11B4;B211;1102 116E 11B4; # (눑; 눑; 눑; 눑; 눑; ) HANGUL SYLLABLE NULT +B212;B212;1102 116E 11B5;B212;1102 116E 11B5; # (눒; 눒; 눒; 눒; 눒; ) HANGUL SYLLABLE NULP +B213;B213;1102 116E 11B6;B213;1102 116E 11B6; # (눓; 눓; 눓; 눓; 눓; ) HANGUL SYLLABLE NULH +B214;B214;1102 116E 11B7;B214;1102 116E 11B7; # (눔; 눔; 눔; 눔; 눔; ) HANGUL SYLLABLE NUM +B215;B215;1102 116E 11B8;B215;1102 116E 11B8; # (눕; 눕; 눕; 눕; 눕; ) HANGUL SYLLABLE NUB +B216;B216;1102 116E 11B9;B216;1102 116E 11B9; # (눖; 눖; 눖; 눖; 눖; ) HANGUL SYLLABLE NUBS +B217;B217;1102 116E 11BA;B217;1102 116E 11BA; # (눗; 눗; 눗; 눗; 눗; ) HANGUL SYLLABLE NUS +B218;B218;1102 116E 11BB;B218;1102 116E 11BB; # (눘; 눘; 눘; 눘; 눘; ) HANGUL SYLLABLE NUSS +B219;B219;1102 116E 11BC;B219;1102 116E 11BC; # (눙; 눙; 눙; 눙; 눙; ) HANGUL SYLLABLE NUNG +B21A;B21A;1102 116E 11BD;B21A;1102 116E 11BD; # (눚; 눚; 눚; 눚; 눚; ) HANGUL SYLLABLE NUJ +B21B;B21B;1102 116E 11BE;B21B;1102 116E 11BE; # (눛; 눛; 눛; 눛; 눛; ) HANGUL SYLLABLE NUC +B21C;B21C;1102 116E 11BF;B21C;1102 116E 11BF; # (눜; 눜; 눜; 눜; 눜; ) HANGUL SYLLABLE NUK +B21D;B21D;1102 116E 11C0;B21D;1102 116E 11C0; # (눝; 눝; 눝; 눝; 눝; ) HANGUL SYLLABLE NUT +B21E;B21E;1102 116E 11C1;B21E;1102 116E 11C1; # (눞; 눞; 눞; 눞; 눞; ) HANGUL SYLLABLE NUP +B21F;B21F;1102 116E 11C2;B21F;1102 116E 11C2; # (눟; 눟; 눟; 눟; 눟; ) HANGUL SYLLABLE NUH +B220;B220;1102 116F;B220;1102 116F; # (눠; 눠; 눠; 눠; 눠; ) HANGUL SYLLABLE NWEO +B221;B221;1102 116F 11A8;B221;1102 116F 11A8; # (눡; 눡; 눡; 눡; 눡; ) HANGUL SYLLABLE NWEOG +B222;B222;1102 116F 11A9;B222;1102 116F 11A9; # (눢; 눢; 눢; 눢; 눢; ) HANGUL SYLLABLE NWEOGG +B223;B223;1102 116F 11AA;B223;1102 116F 11AA; # (눣; 눣; 눣; 눣; 눣; ) HANGUL SYLLABLE NWEOGS +B224;B224;1102 116F 11AB;B224;1102 116F 11AB; # (눤; 눤; 눤; 눤; 눤; ) HANGUL SYLLABLE NWEON +B225;B225;1102 116F 11AC;B225;1102 116F 11AC; # (눥; 눥; 눥; 눥; 눥; ) HANGUL SYLLABLE NWEONJ +B226;B226;1102 116F 11AD;B226;1102 116F 11AD; # (눦; 눦; 눦; 눦; 눦; ) HANGUL SYLLABLE NWEONH +B227;B227;1102 116F 11AE;B227;1102 116F 11AE; # (눧; 눧; 눧; 눧; 눧; ) HANGUL SYLLABLE NWEOD +B228;B228;1102 116F 11AF;B228;1102 116F 11AF; # (눨; 눨; 눨; 눨; 눨; ) HANGUL SYLLABLE NWEOL +B229;B229;1102 116F 11B0;B229;1102 116F 11B0; # (눩; 눩; 눩; 눩; 눩; ) HANGUL SYLLABLE NWEOLG +B22A;B22A;1102 116F 11B1;B22A;1102 116F 11B1; # (눪; 눪; 눪; 눪; 눪; ) HANGUL SYLLABLE NWEOLM +B22B;B22B;1102 116F 11B2;B22B;1102 116F 11B2; # (눫; 눫; 눫; 눫; 눫; ) HANGUL SYLLABLE NWEOLB +B22C;B22C;1102 116F 11B3;B22C;1102 116F 11B3; # (눬; 눬; 눬; 눬; 눬; ) HANGUL SYLLABLE NWEOLS +B22D;B22D;1102 116F 11B4;B22D;1102 116F 11B4; # (눭; 눭; 눭; 눭; 눭; ) HANGUL SYLLABLE NWEOLT +B22E;B22E;1102 116F 11B5;B22E;1102 116F 11B5; # (눮; 눮; 눮; 눮; 눮; ) HANGUL SYLLABLE NWEOLP +B22F;B22F;1102 116F 11B6;B22F;1102 116F 11B6; # (눯; 눯; 눯; 눯; 눯; ) HANGUL SYLLABLE NWEOLH +B230;B230;1102 116F 11B7;B230;1102 116F 11B7; # (눰; 눰; 눰; 눰; 눰; ) HANGUL SYLLABLE NWEOM +B231;B231;1102 116F 11B8;B231;1102 116F 11B8; # (눱; 눱; 눱; 눱; 눱; ) HANGUL SYLLABLE NWEOB +B232;B232;1102 116F 11B9;B232;1102 116F 11B9; # (눲; 눲; 눲; 눲; 눲; ) HANGUL SYLLABLE NWEOBS +B233;B233;1102 116F 11BA;B233;1102 116F 11BA; # (눳; 눳; 눳; 눳; 눳; ) HANGUL SYLLABLE NWEOS +B234;B234;1102 116F 11BB;B234;1102 116F 11BB; # (눴; 눴; 눴; 눴; 눴; ) HANGUL SYLLABLE NWEOSS +B235;B235;1102 116F 11BC;B235;1102 116F 11BC; # (눵; 눵; 눵; 눵; 눵; ) HANGUL SYLLABLE NWEONG +B236;B236;1102 116F 11BD;B236;1102 116F 11BD; # (눶; 눶; 눶; 눶; 눶; ) HANGUL SYLLABLE NWEOJ +B237;B237;1102 116F 11BE;B237;1102 116F 11BE; # (눷; 눷; 눷; 눷; 눷; ) HANGUL SYLLABLE NWEOC +B238;B238;1102 116F 11BF;B238;1102 116F 11BF; # (눸; 눸; 눸; 눸; 눸; ) HANGUL SYLLABLE NWEOK +B239;B239;1102 116F 11C0;B239;1102 116F 11C0; # (눹; 눹; 눹; 눹; 눹; ) HANGUL SYLLABLE NWEOT +B23A;B23A;1102 116F 11C1;B23A;1102 116F 11C1; # (눺; 눺; 눺; 눺; 눺; ) HANGUL SYLLABLE NWEOP +B23B;B23B;1102 116F 11C2;B23B;1102 116F 11C2; # (눻; 눻; 눻; 눻; 눻; ) HANGUL SYLLABLE NWEOH +B23C;B23C;1102 1170;B23C;1102 1170; # (눼; 눼; 눼; 눼; 눼; ) HANGUL SYLLABLE NWE +B23D;B23D;1102 1170 11A8;B23D;1102 1170 11A8; # (눽; 눽; 눽; 눽; 눽; ) HANGUL SYLLABLE NWEG +B23E;B23E;1102 1170 11A9;B23E;1102 1170 11A9; # (눾; 눾; 눾; 눾; 눾; ) HANGUL SYLLABLE NWEGG +B23F;B23F;1102 1170 11AA;B23F;1102 1170 11AA; # (눿; 눿; 눿; 눿; 눿; ) HANGUL SYLLABLE NWEGS +B240;B240;1102 1170 11AB;B240;1102 1170 11AB; # (뉀; 뉀; 뉀; 뉀; 뉀; ) HANGUL SYLLABLE NWEN +B241;B241;1102 1170 11AC;B241;1102 1170 11AC; # (뉁; 뉁; 뉁; 뉁; 뉁; ) HANGUL SYLLABLE NWENJ +B242;B242;1102 1170 11AD;B242;1102 1170 11AD; # (뉂; 뉂; 뉂; 뉂; 뉂; ) HANGUL SYLLABLE NWENH +B243;B243;1102 1170 11AE;B243;1102 1170 11AE; # (뉃; 뉃; 뉃; 뉃; 뉃; ) HANGUL SYLLABLE NWED +B244;B244;1102 1170 11AF;B244;1102 1170 11AF; # (뉄; 뉄; 뉄; 뉄; 뉄; ) HANGUL SYLLABLE NWEL +B245;B245;1102 1170 11B0;B245;1102 1170 11B0; # (뉅; 뉅; 뉅; 뉅; 뉅; ) HANGUL SYLLABLE NWELG +B246;B246;1102 1170 11B1;B246;1102 1170 11B1; # (뉆; 뉆; 뉆; 뉆; 뉆; ) HANGUL SYLLABLE NWELM +B247;B247;1102 1170 11B2;B247;1102 1170 11B2; # (뉇; 뉇; 뉇; 뉇; 뉇; ) HANGUL SYLLABLE NWELB +B248;B248;1102 1170 11B3;B248;1102 1170 11B3; # (뉈; 뉈; 뉈; 뉈; 뉈; ) HANGUL SYLLABLE NWELS +B249;B249;1102 1170 11B4;B249;1102 1170 11B4; # (뉉; 뉉; 뉉; 뉉; 뉉; ) HANGUL SYLLABLE NWELT +B24A;B24A;1102 1170 11B5;B24A;1102 1170 11B5; # (뉊; 뉊; 뉊; 뉊; 뉊; ) HANGUL SYLLABLE NWELP +B24B;B24B;1102 1170 11B6;B24B;1102 1170 11B6; # (뉋; 뉋; 뉋; 뉋; 뉋; ) HANGUL SYLLABLE NWELH +B24C;B24C;1102 1170 11B7;B24C;1102 1170 11B7; # (뉌; 뉌; 뉌; 뉌; 뉌; ) HANGUL SYLLABLE NWEM +B24D;B24D;1102 1170 11B8;B24D;1102 1170 11B8; # (뉍; 뉍; 뉍; 뉍; 뉍; ) HANGUL SYLLABLE NWEB +B24E;B24E;1102 1170 11B9;B24E;1102 1170 11B9; # (뉎; 뉎; 뉎; 뉎; 뉎; ) HANGUL SYLLABLE NWEBS +B24F;B24F;1102 1170 11BA;B24F;1102 1170 11BA; # (뉏; 뉏; 뉏; 뉏; 뉏; ) HANGUL SYLLABLE NWES +B250;B250;1102 1170 11BB;B250;1102 1170 11BB; # (뉐; 뉐; 뉐; 뉐; 뉐; ) HANGUL SYLLABLE NWESS +B251;B251;1102 1170 11BC;B251;1102 1170 11BC; # (뉑; 뉑; 뉑; 뉑; 뉑; ) HANGUL SYLLABLE NWENG +B252;B252;1102 1170 11BD;B252;1102 1170 11BD; # (뉒; 뉒; 뉒; 뉒; 뉒; ) HANGUL SYLLABLE NWEJ +B253;B253;1102 1170 11BE;B253;1102 1170 11BE; # (뉓; 뉓; 뉓; 뉓; 뉓; ) HANGUL SYLLABLE NWEC +B254;B254;1102 1170 11BF;B254;1102 1170 11BF; # (뉔; 뉔; 뉔; 뉔; 뉔; ) HANGUL SYLLABLE NWEK +B255;B255;1102 1170 11C0;B255;1102 1170 11C0; # (뉕; 뉕; 뉕; 뉕; 뉕; ) HANGUL SYLLABLE NWET +B256;B256;1102 1170 11C1;B256;1102 1170 11C1; # (뉖; 뉖; 뉖; 뉖; 뉖; ) HANGUL SYLLABLE NWEP +B257;B257;1102 1170 11C2;B257;1102 1170 11C2; # (뉗; 뉗; 뉗; 뉗; 뉗; ) HANGUL SYLLABLE NWEH +B258;B258;1102 1171;B258;1102 1171; # (뉘; 뉘; 뉘; 뉘; 뉘; ) HANGUL SYLLABLE NWI +B259;B259;1102 1171 11A8;B259;1102 1171 11A8; # (뉙; 뉙; 뉙; 뉙; 뉙; ) HANGUL SYLLABLE NWIG +B25A;B25A;1102 1171 11A9;B25A;1102 1171 11A9; # (뉚; 뉚; 뉚; 뉚; 뉚; ) HANGUL SYLLABLE NWIGG +B25B;B25B;1102 1171 11AA;B25B;1102 1171 11AA; # (뉛; 뉛; 뉛; 뉛; 뉛; ) HANGUL SYLLABLE NWIGS +B25C;B25C;1102 1171 11AB;B25C;1102 1171 11AB; # (뉜; 뉜; 뉜; 뉜; 뉜; ) HANGUL SYLLABLE NWIN +B25D;B25D;1102 1171 11AC;B25D;1102 1171 11AC; # (뉝; 뉝; 뉝; 뉝; 뉝; ) HANGUL SYLLABLE NWINJ +B25E;B25E;1102 1171 11AD;B25E;1102 1171 11AD; # (뉞; 뉞; 뉞; 뉞; 뉞; ) HANGUL SYLLABLE NWINH +B25F;B25F;1102 1171 11AE;B25F;1102 1171 11AE; # (뉟; 뉟; 뉟; 뉟; 뉟; ) HANGUL SYLLABLE NWID +B260;B260;1102 1171 11AF;B260;1102 1171 11AF; # (뉠; 뉠; 뉠; 뉠; 뉠; ) HANGUL SYLLABLE NWIL +B261;B261;1102 1171 11B0;B261;1102 1171 11B0; # (뉡; 뉡; 뉡; 뉡; 뉡; ) HANGUL SYLLABLE NWILG +B262;B262;1102 1171 11B1;B262;1102 1171 11B1; # (뉢; 뉢; 뉢; 뉢; 뉢; ) HANGUL SYLLABLE NWILM +B263;B263;1102 1171 11B2;B263;1102 1171 11B2; # (뉣; 뉣; 뉣; 뉣; 뉣; ) HANGUL SYLLABLE NWILB +B264;B264;1102 1171 11B3;B264;1102 1171 11B3; # (뉤; 뉤; 뉤; 뉤; 뉤; ) HANGUL SYLLABLE NWILS +B265;B265;1102 1171 11B4;B265;1102 1171 11B4; # (뉥; 뉥; 뉥; 뉥; 뉥; ) HANGUL SYLLABLE NWILT +B266;B266;1102 1171 11B5;B266;1102 1171 11B5; # (뉦; 뉦; 뉦; 뉦; 뉦; ) HANGUL SYLLABLE NWILP +B267;B267;1102 1171 11B6;B267;1102 1171 11B6; # (뉧; 뉧; 뉧; 뉧; 뉧; ) HANGUL SYLLABLE NWILH +B268;B268;1102 1171 11B7;B268;1102 1171 11B7; # (뉨; 뉨; 뉨; 뉨; 뉨; ) HANGUL SYLLABLE NWIM +B269;B269;1102 1171 11B8;B269;1102 1171 11B8; # (뉩; 뉩; 뉩; 뉩; 뉩; ) HANGUL SYLLABLE NWIB +B26A;B26A;1102 1171 11B9;B26A;1102 1171 11B9; # (뉪; 뉪; 뉪; 뉪; 뉪; ) HANGUL SYLLABLE NWIBS +B26B;B26B;1102 1171 11BA;B26B;1102 1171 11BA; # (뉫; 뉫; 뉫; 뉫; 뉫; ) HANGUL SYLLABLE NWIS +B26C;B26C;1102 1171 11BB;B26C;1102 1171 11BB; # (뉬; 뉬; 뉬; 뉬; 뉬; ) HANGUL SYLLABLE NWISS +B26D;B26D;1102 1171 11BC;B26D;1102 1171 11BC; # (뉭; 뉭; 뉭; 뉭; 뉭; ) HANGUL SYLLABLE NWING +B26E;B26E;1102 1171 11BD;B26E;1102 1171 11BD; # (뉮; 뉮; 뉮; 뉮; 뉮; ) HANGUL SYLLABLE NWIJ +B26F;B26F;1102 1171 11BE;B26F;1102 1171 11BE; # (뉯; 뉯; 뉯; 뉯; 뉯; ) HANGUL SYLLABLE NWIC +B270;B270;1102 1171 11BF;B270;1102 1171 11BF; # (뉰; 뉰; 뉰; 뉰; 뉰; ) HANGUL SYLLABLE NWIK +B271;B271;1102 1171 11C0;B271;1102 1171 11C0; # (뉱; 뉱; 뉱; 뉱; 뉱; ) HANGUL SYLLABLE NWIT +B272;B272;1102 1171 11C1;B272;1102 1171 11C1; # (뉲; 뉲; 뉲; 뉲; 뉲; ) HANGUL SYLLABLE NWIP +B273;B273;1102 1171 11C2;B273;1102 1171 11C2; # (뉳; 뉳; 뉳; 뉳; 뉳; ) HANGUL SYLLABLE NWIH +B274;B274;1102 1172;B274;1102 1172; # (뉴; 뉴; 뉴; 뉴; 뉴; ) HANGUL SYLLABLE NYU +B275;B275;1102 1172 11A8;B275;1102 1172 11A8; # (뉵; 뉵; 뉵; 뉵; 뉵; ) HANGUL SYLLABLE NYUG +B276;B276;1102 1172 11A9;B276;1102 1172 11A9; # (뉶; 뉶; 뉶; 뉶; 뉶; ) HANGUL SYLLABLE NYUGG +B277;B277;1102 1172 11AA;B277;1102 1172 11AA; # (뉷; 뉷; 뉷; 뉷; 뉷; ) HANGUL SYLLABLE NYUGS +B278;B278;1102 1172 11AB;B278;1102 1172 11AB; # (뉸; 뉸; 뉸; 뉸; 뉸; ) HANGUL SYLLABLE NYUN +B279;B279;1102 1172 11AC;B279;1102 1172 11AC; # (뉹; 뉹; 뉹; 뉹; 뉹; ) HANGUL SYLLABLE NYUNJ +B27A;B27A;1102 1172 11AD;B27A;1102 1172 11AD; # (뉺; 뉺; 뉺; 뉺; 뉺; ) HANGUL SYLLABLE NYUNH +B27B;B27B;1102 1172 11AE;B27B;1102 1172 11AE; # (뉻; 뉻; 뉻; 뉻; 뉻; ) HANGUL SYLLABLE NYUD +B27C;B27C;1102 1172 11AF;B27C;1102 1172 11AF; # (뉼; 뉼; 뉼; 뉼; 뉼; ) HANGUL SYLLABLE NYUL +B27D;B27D;1102 1172 11B0;B27D;1102 1172 11B0; # (뉽; 뉽; 뉽; 뉽; 뉽; ) HANGUL SYLLABLE NYULG +B27E;B27E;1102 1172 11B1;B27E;1102 1172 11B1; # (뉾; 뉾; 뉾; 뉾; 뉾; ) HANGUL SYLLABLE NYULM +B27F;B27F;1102 1172 11B2;B27F;1102 1172 11B2; # (뉿; 뉿; 뉿; 뉿; 뉿; ) HANGUL SYLLABLE NYULB +B280;B280;1102 1172 11B3;B280;1102 1172 11B3; # (늀; 늀; 늀; 늀; 늀; ) HANGUL SYLLABLE NYULS +B281;B281;1102 1172 11B4;B281;1102 1172 11B4; # (늁; 늁; 늁; 늁; 늁; ) HANGUL SYLLABLE NYULT +B282;B282;1102 1172 11B5;B282;1102 1172 11B5; # (늂; 늂; 늂; 늂; 늂; ) HANGUL SYLLABLE NYULP +B283;B283;1102 1172 11B6;B283;1102 1172 11B6; # (늃; 늃; 늃; 늃; 늃; ) HANGUL SYLLABLE NYULH +B284;B284;1102 1172 11B7;B284;1102 1172 11B7; # (늄; 늄; 늄; 늄; 늄; ) HANGUL SYLLABLE NYUM +B285;B285;1102 1172 11B8;B285;1102 1172 11B8; # (늅; 늅; 늅; 늅; 늅; ) HANGUL SYLLABLE NYUB +B286;B286;1102 1172 11B9;B286;1102 1172 11B9; # (늆; 늆; 늆; 늆; 늆; ) HANGUL SYLLABLE NYUBS +B287;B287;1102 1172 11BA;B287;1102 1172 11BA; # (늇; 늇; 늇; 늇; 늇; ) HANGUL SYLLABLE NYUS +B288;B288;1102 1172 11BB;B288;1102 1172 11BB; # (늈; 늈; 늈; 늈; 늈; ) HANGUL SYLLABLE NYUSS +B289;B289;1102 1172 11BC;B289;1102 1172 11BC; # (늉; 늉; 늉; 늉; 늉; ) HANGUL SYLLABLE NYUNG +B28A;B28A;1102 1172 11BD;B28A;1102 1172 11BD; # (늊; 늊; 늊; 늊; 늊; ) HANGUL SYLLABLE NYUJ +B28B;B28B;1102 1172 11BE;B28B;1102 1172 11BE; # (늋; 늋; 늋; 늋; 늋; ) HANGUL SYLLABLE NYUC +B28C;B28C;1102 1172 11BF;B28C;1102 1172 11BF; # (늌; 늌; 늌; 늌; 늌; ) HANGUL SYLLABLE NYUK +B28D;B28D;1102 1172 11C0;B28D;1102 1172 11C0; # (늍; 늍; 늍; 늍; 늍; ) HANGUL SYLLABLE NYUT +B28E;B28E;1102 1172 11C1;B28E;1102 1172 11C1; # (늎; 늎; 늎; 늎; 늎; ) HANGUL SYLLABLE NYUP +B28F;B28F;1102 1172 11C2;B28F;1102 1172 11C2; # (늏; 늏; 늏; 늏; 늏; ) HANGUL SYLLABLE NYUH +B290;B290;1102 1173;B290;1102 1173; # (느; 느; 느; 느; 느; ) HANGUL SYLLABLE NEU +B291;B291;1102 1173 11A8;B291;1102 1173 11A8; # (늑; 늑; 늑; 늑; 늑; ) HANGUL SYLLABLE NEUG +B292;B292;1102 1173 11A9;B292;1102 1173 11A9; # (늒; 늒; 늒; 늒; 늒; ) HANGUL SYLLABLE NEUGG +B293;B293;1102 1173 11AA;B293;1102 1173 11AA; # (늓; 늓; 늓; 늓; 늓; ) HANGUL SYLLABLE NEUGS +B294;B294;1102 1173 11AB;B294;1102 1173 11AB; # (는; 는; 는; 는; 는; ) HANGUL SYLLABLE NEUN +B295;B295;1102 1173 11AC;B295;1102 1173 11AC; # (늕; 늕; 늕; 늕; 늕; ) HANGUL SYLLABLE NEUNJ +B296;B296;1102 1173 11AD;B296;1102 1173 11AD; # (늖; 늖; 늖; 늖; 늖; ) HANGUL SYLLABLE NEUNH +B297;B297;1102 1173 11AE;B297;1102 1173 11AE; # (늗; 늗; 늗; 늗; 늗; ) HANGUL SYLLABLE NEUD +B298;B298;1102 1173 11AF;B298;1102 1173 11AF; # (늘; 늘; 늘; 늘; 늘; ) HANGUL SYLLABLE NEUL +B299;B299;1102 1173 11B0;B299;1102 1173 11B0; # (늙; 늙; 늙; 늙; 늙; ) HANGUL SYLLABLE NEULG +B29A;B29A;1102 1173 11B1;B29A;1102 1173 11B1; # (늚; 늚; 늚; 늚; 늚; ) HANGUL SYLLABLE NEULM +B29B;B29B;1102 1173 11B2;B29B;1102 1173 11B2; # (늛; 늛; 늛; 늛; 늛; ) HANGUL SYLLABLE NEULB +B29C;B29C;1102 1173 11B3;B29C;1102 1173 11B3; # (늜; 늜; 늜; 늜; 늜; ) HANGUL SYLLABLE NEULS +B29D;B29D;1102 1173 11B4;B29D;1102 1173 11B4; # (늝; 늝; 늝; 늝; 늝; ) HANGUL SYLLABLE NEULT +B29E;B29E;1102 1173 11B5;B29E;1102 1173 11B5; # (늞; 늞; 늞; 늞; 늞; ) HANGUL SYLLABLE NEULP +B29F;B29F;1102 1173 11B6;B29F;1102 1173 11B6; # (늟; 늟; 늟; 늟; 늟; ) HANGUL SYLLABLE NEULH +B2A0;B2A0;1102 1173 11B7;B2A0;1102 1173 11B7; # (늠; 늠; 늠; 늠; 늠; ) HANGUL SYLLABLE NEUM +B2A1;B2A1;1102 1173 11B8;B2A1;1102 1173 11B8; # (늡; 늡; 늡; 늡; 늡; ) HANGUL SYLLABLE NEUB +B2A2;B2A2;1102 1173 11B9;B2A2;1102 1173 11B9; # (늢; 늢; 늢; 늢; 늢; ) HANGUL SYLLABLE NEUBS +B2A3;B2A3;1102 1173 11BA;B2A3;1102 1173 11BA; # (늣; 늣; 늣; 늣; 늣; ) HANGUL SYLLABLE NEUS +B2A4;B2A4;1102 1173 11BB;B2A4;1102 1173 11BB; # (늤; 늤; 늤; 늤; 늤; ) HANGUL SYLLABLE NEUSS +B2A5;B2A5;1102 1173 11BC;B2A5;1102 1173 11BC; # (능; 능; 능; 능; 능; ) HANGUL SYLLABLE NEUNG +B2A6;B2A6;1102 1173 11BD;B2A6;1102 1173 11BD; # (늦; 늦; 늦; 늦; 늦; ) HANGUL SYLLABLE NEUJ +B2A7;B2A7;1102 1173 11BE;B2A7;1102 1173 11BE; # (늧; 늧; 늧; 늧; 늧; ) HANGUL SYLLABLE NEUC +B2A8;B2A8;1102 1173 11BF;B2A8;1102 1173 11BF; # (늨; 늨; 늨; 늨; 늨; ) HANGUL SYLLABLE NEUK +B2A9;B2A9;1102 1173 11C0;B2A9;1102 1173 11C0; # (늩; 늩; 늩; 늩; 늩; ) HANGUL SYLLABLE NEUT +B2AA;B2AA;1102 1173 11C1;B2AA;1102 1173 11C1; # (늪; 늪; 늪; 늪; 늪; ) HANGUL SYLLABLE NEUP +B2AB;B2AB;1102 1173 11C2;B2AB;1102 1173 11C2; # (늫; 늫; 늫; 늫; 늫; ) HANGUL SYLLABLE NEUH +B2AC;B2AC;1102 1174;B2AC;1102 1174; # (늬; 늬; 늬; 늬; 늬; ) HANGUL SYLLABLE NYI +B2AD;B2AD;1102 1174 11A8;B2AD;1102 1174 11A8; # (늭; 늭; 늭; 늭; 늭; ) HANGUL SYLLABLE NYIG +B2AE;B2AE;1102 1174 11A9;B2AE;1102 1174 11A9; # (늮; 늮; 늮; 늮; 늮; ) HANGUL SYLLABLE NYIGG +B2AF;B2AF;1102 1174 11AA;B2AF;1102 1174 11AA; # (늯; 늯; 늯; 늯; 늯; ) HANGUL SYLLABLE NYIGS +B2B0;B2B0;1102 1174 11AB;B2B0;1102 1174 11AB; # (늰; 늰; 늰; 늰; 늰; ) HANGUL SYLLABLE NYIN +B2B1;B2B1;1102 1174 11AC;B2B1;1102 1174 11AC; # (늱; 늱; 늱; 늱; 늱; ) HANGUL SYLLABLE NYINJ +B2B2;B2B2;1102 1174 11AD;B2B2;1102 1174 11AD; # (늲; 늲; 늲; 늲; 늲; ) HANGUL SYLLABLE NYINH +B2B3;B2B3;1102 1174 11AE;B2B3;1102 1174 11AE; # (늳; 늳; 늳; 늳; 늳; ) HANGUL SYLLABLE NYID +B2B4;B2B4;1102 1174 11AF;B2B4;1102 1174 11AF; # (늴; 늴; 늴; 늴; 늴; ) HANGUL SYLLABLE NYIL +B2B5;B2B5;1102 1174 11B0;B2B5;1102 1174 11B0; # (늵; 늵; 늵; 늵; 늵; ) HANGUL SYLLABLE NYILG +B2B6;B2B6;1102 1174 11B1;B2B6;1102 1174 11B1; # (늶; 늶; 늶; 늶; 늶; ) HANGUL SYLLABLE NYILM +B2B7;B2B7;1102 1174 11B2;B2B7;1102 1174 11B2; # (늷; 늷; 늷; 늷; 늷; ) HANGUL SYLLABLE NYILB +B2B8;B2B8;1102 1174 11B3;B2B8;1102 1174 11B3; # (늸; 늸; 늸; 늸; 늸; ) HANGUL SYLLABLE NYILS +B2B9;B2B9;1102 1174 11B4;B2B9;1102 1174 11B4; # (늹; 늹; 늹; 늹; 늹; ) HANGUL SYLLABLE NYILT +B2BA;B2BA;1102 1174 11B5;B2BA;1102 1174 11B5; # (늺; 늺; 늺; 늺; 늺; ) HANGUL SYLLABLE NYILP +B2BB;B2BB;1102 1174 11B6;B2BB;1102 1174 11B6; # (늻; 늻; 늻; 늻; 늻; ) HANGUL SYLLABLE NYILH +B2BC;B2BC;1102 1174 11B7;B2BC;1102 1174 11B7; # (늼; 늼; 늼; 늼; 늼; ) HANGUL SYLLABLE NYIM +B2BD;B2BD;1102 1174 11B8;B2BD;1102 1174 11B8; # (늽; 늽; 늽; 늽; 늽; ) HANGUL SYLLABLE NYIB +B2BE;B2BE;1102 1174 11B9;B2BE;1102 1174 11B9; # (늾; 늾; 늾; 늾; 늾; ) HANGUL SYLLABLE NYIBS +B2BF;B2BF;1102 1174 11BA;B2BF;1102 1174 11BA; # (늿; 늿; 늿; 늿; 늿; ) HANGUL SYLLABLE NYIS +B2C0;B2C0;1102 1174 11BB;B2C0;1102 1174 11BB; # (닀; 닀; 닀; 닀; 닀; ) HANGUL SYLLABLE NYISS +B2C1;B2C1;1102 1174 11BC;B2C1;1102 1174 11BC; # (닁; 닁; 닁; 닁; 닁; ) HANGUL SYLLABLE NYING +B2C2;B2C2;1102 1174 11BD;B2C2;1102 1174 11BD; # (닂; 닂; 닂; 닂; 닂; ) HANGUL SYLLABLE NYIJ +B2C3;B2C3;1102 1174 11BE;B2C3;1102 1174 11BE; # (닃; 닃; 닃; 닃; 닃; ) HANGUL SYLLABLE NYIC +B2C4;B2C4;1102 1174 11BF;B2C4;1102 1174 11BF; # (닄; 닄; 닄; 닄; 닄; ) HANGUL SYLLABLE NYIK +B2C5;B2C5;1102 1174 11C0;B2C5;1102 1174 11C0; # (닅; 닅; 닅; 닅; 닅; ) HANGUL SYLLABLE NYIT +B2C6;B2C6;1102 1174 11C1;B2C6;1102 1174 11C1; # (닆; 닆; 닆; 닆; 닆; ) HANGUL SYLLABLE NYIP +B2C7;B2C7;1102 1174 11C2;B2C7;1102 1174 11C2; # (닇; 닇; 닇; 닇; 닇; ) HANGUL SYLLABLE NYIH +B2C8;B2C8;1102 1175;B2C8;1102 1175; # (니; 니; 니; 니; 니; ) HANGUL SYLLABLE NI +B2C9;B2C9;1102 1175 11A8;B2C9;1102 1175 11A8; # (닉; 닉; 닉; 닉; 닉; ) HANGUL SYLLABLE NIG +B2CA;B2CA;1102 1175 11A9;B2CA;1102 1175 11A9; # (닊; 닊; 닊; 닊; 닊; ) HANGUL SYLLABLE NIGG +B2CB;B2CB;1102 1175 11AA;B2CB;1102 1175 11AA; # (닋; 닋; 닋; 닋; 닋; ) HANGUL SYLLABLE NIGS +B2CC;B2CC;1102 1175 11AB;B2CC;1102 1175 11AB; # (닌; 닌; 닌; 닌; 닌; ) HANGUL SYLLABLE NIN +B2CD;B2CD;1102 1175 11AC;B2CD;1102 1175 11AC; # (닍; 닍; 닍; 닍; 닍; ) HANGUL SYLLABLE NINJ +B2CE;B2CE;1102 1175 11AD;B2CE;1102 1175 11AD; # (닎; 닎; 닎; 닎; 닎; ) HANGUL SYLLABLE NINH +B2CF;B2CF;1102 1175 11AE;B2CF;1102 1175 11AE; # (닏; 닏; 닏; 닏; 닏; ) HANGUL SYLLABLE NID +B2D0;B2D0;1102 1175 11AF;B2D0;1102 1175 11AF; # (닐; 닐; 닐; 닐; 닐; ) HANGUL SYLLABLE NIL +B2D1;B2D1;1102 1175 11B0;B2D1;1102 1175 11B0; # (닑; 닑; 닑; 닑; 닑; ) HANGUL SYLLABLE NILG +B2D2;B2D2;1102 1175 11B1;B2D2;1102 1175 11B1; # (닒; 닒; 닒; 닒; 닒; ) HANGUL SYLLABLE NILM +B2D3;B2D3;1102 1175 11B2;B2D3;1102 1175 11B2; # (닓; 닓; 닓; 닓; 닓; ) HANGUL SYLLABLE NILB +B2D4;B2D4;1102 1175 11B3;B2D4;1102 1175 11B3; # (닔; 닔; 닔; 닔; 닔; ) HANGUL SYLLABLE NILS +B2D5;B2D5;1102 1175 11B4;B2D5;1102 1175 11B4; # (닕; 닕; 닕; 닕; 닕; ) HANGUL SYLLABLE NILT +B2D6;B2D6;1102 1175 11B5;B2D6;1102 1175 11B5; # (닖; 닖; 닖; 닖; 닖; ) HANGUL SYLLABLE NILP +B2D7;B2D7;1102 1175 11B6;B2D7;1102 1175 11B6; # (닗; 닗; 닗; 닗; 닗; ) HANGUL SYLLABLE NILH +B2D8;B2D8;1102 1175 11B7;B2D8;1102 1175 11B7; # (님; 님; 님; 님; 님; ) HANGUL SYLLABLE NIM +B2D9;B2D9;1102 1175 11B8;B2D9;1102 1175 11B8; # (닙; 닙; 닙; 닙; 닙; ) HANGUL SYLLABLE NIB +B2DA;B2DA;1102 1175 11B9;B2DA;1102 1175 11B9; # (닚; 닚; 닚; 닚; 닚; ) HANGUL SYLLABLE NIBS +B2DB;B2DB;1102 1175 11BA;B2DB;1102 1175 11BA; # (닛; 닛; 닛; 닛; 닛; ) HANGUL SYLLABLE NIS +B2DC;B2DC;1102 1175 11BB;B2DC;1102 1175 11BB; # (닜; 닜; 닜; 닜; 닜; ) HANGUL SYLLABLE NISS +B2DD;B2DD;1102 1175 11BC;B2DD;1102 1175 11BC; # (닝; 닝; 닝; 닝; 닝; ) HANGUL SYLLABLE NING +B2DE;B2DE;1102 1175 11BD;B2DE;1102 1175 11BD; # (닞; 닞; 닞; 닞; 닞; ) HANGUL SYLLABLE NIJ +B2DF;B2DF;1102 1175 11BE;B2DF;1102 1175 11BE; # (닟; 닟; 닟; 닟; 닟; ) HANGUL SYLLABLE NIC +B2E0;B2E0;1102 1175 11BF;B2E0;1102 1175 11BF; # (닠; 닠; 닠; 닠; 닠; ) HANGUL SYLLABLE NIK +B2E1;B2E1;1102 1175 11C0;B2E1;1102 1175 11C0; # (닡; 닡; 닡; 닡; 닡; ) HANGUL SYLLABLE NIT +B2E2;B2E2;1102 1175 11C1;B2E2;1102 1175 11C1; # (닢; 닢; 닢; 닢; 닢; ) HANGUL SYLLABLE NIP +B2E3;B2E3;1102 1175 11C2;B2E3;1102 1175 11C2; # (닣; 닣; 닣; 닣; 닣; ) HANGUL SYLLABLE NIH +B2E4;B2E4;1103 1161;B2E4;1103 1161; # (다; 다; 다; 다; 다; ) HANGUL SYLLABLE DA +B2E5;B2E5;1103 1161 11A8;B2E5;1103 1161 11A8; # (닥; 닥; 닥; 닥; 닥; ) HANGUL SYLLABLE DAG +B2E6;B2E6;1103 1161 11A9;B2E6;1103 1161 11A9; # (닦; 닦; 닦; 닦; 닦; ) HANGUL SYLLABLE DAGG +B2E7;B2E7;1103 1161 11AA;B2E7;1103 1161 11AA; # (닧; 닧; 닧; 닧; 닧; ) HANGUL SYLLABLE DAGS +B2E8;B2E8;1103 1161 11AB;B2E8;1103 1161 11AB; # (단; 단; 단; 단; 단; ) HANGUL SYLLABLE DAN +B2E9;B2E9;1103 1161 11AC;B2E9;1103 1161 11AC; # (닩; 닩; 닩; 닩; 닩; ) HANGUL SYLLABLE DANJ +B2EA;B2EA;1103 1161 11AD;B2EA;1103 1161 11AD; # (닪; 닪; 닪; 닪; 닪; ) HANGUL SYLLABLE DANH +B2EB;B2EB;1103 1161 11AE;B2EB;1103 1161 11AE; # (닫; 닫; 닫; 닫; 닫; ) HANGUL SYLLABLE DAD +B2EC;B2EC;1103 1161 11AF;B2EC;1103 1161 11AF; # (달; 달; 달; 달; 달; ) HANGUL SYLLABLE DAL +B2ED;B2ED;1103 1161 11B0;B2ED;1103 1161 11B0; # (닭; 닭; 닭; 닭; 닭; ) HANGUL SYLLABLE DALG +B2EE;B2EE;1103 1161 11B1;B2EE;1103 1161 11B1; # (닮; 닮; 닮; 닮; 닮; ) HANGUL SYLLABLE DALM +B2EF;B2EF;1103 1161 11B2;B2EF;1103 1161 11B2; # (닯; 닯; 닯; 닯; 닯; ) HANGUL SYLLABLE DALB +B2F0;B2F0;1103 1161 11B3;B2F0;1103 1161 11B3; # (닰; 닰; 닰; 닰; 닰; ) HANGUL SYLLABLE DALS +B2F1;B2F1;1103 1161 11B4;B2F1;1103 1161 11B4; # (닱; 닱; 닱; 닱; 닱; ) HANGUL SYLLABLE DALT +B2F2;B2F2;1103 1161 11B5;B2F2;1103 1161 11B5; # (닲; 닲; 닲; 닲; 닲; ) HANGUL SYLLABLE DALP +B2F3;B2F3;1103 1161 11B6;B2F3;1103 1161 11B6; # (닳; 닳; 닳; 닳; 닳; ) HANGUL SYLLABLE DALH +B2F4;B2F4;1103 1161 11B7;B2F4;1103 1161 11B7; # (담; 담; 담; 담; 담; ) HANGUL SYLLABLE DAM +B2F5;B2F5;1103 1161 11B8;B2F5;1103 1161 11B8; # (답; 답; 답; 답; 답; ) HANGUL SYLLABLE DAB +B2F6;B2F6;1103 1161 11B9;B2F6;1103 1161 11B9; # (닶; 닶; 닶; 닶; 닶; ) HANGUL SYLLABLE DABS +B2F7;B2F7;1103 1161 11BA;B2F7;1103 1161 11BA; # (닷; 닷; 닷; 닷; 닷; ) HANGUL SYLLABLE DAS +B2F8;B2F8;1103 1161 11BB;B2F8;1103 1161 11BB; # (닸; 닸; 닸; 닸; 닸; ) HANGUL SYLLABLE DASS +B2F9;B2F9;1103 1161 11BC;B2F9;1103 1161 11BC; # (당; 당; 당; 당; 당; ) HANGUL SYLLABLE DANG +B2FA;B2FA;1103 1161 11BD;B2FA;1103 1161 11BD; # (닺; 닺; 닺; 닺; 닺; ) HANGUL SYLLABLE DAJ +B2FB;B2FB;1103 1161 11BE;B2FB;1103 1161 11BE; # (닻; 닻; 닻; 닻; 닻; ) HANGUL SYLLABLE DAC +B2FC;B2FC;1103 1161 11BF;B2FC;1103 1161 11BF; # (닼; 닼; 닼; 닼; 닼; ) HANGUL SYLLABLE DAK +B2FD;B2FD;1103 1161 11C0;B2FD;1103 1161 11C0; # (닽; 닽; 닽; 닽; 닽; ) HANGUL SYLLABLE DAT +B2FE;B2FE;1103 1161 11C1;B2FE;1103 1161 11C1; # (닾; 닾; 닾; 닾; 닾; ) HANGUL SYLLABLE DAP +B2FF;B2FF;1103 1161 11C2;B2FF;1103 1161 11C2; # (닿; 닿; 닿; 닿; 닿; ) HANGUL SYLLABLE DAH +B300;B300;1103 1162;B300;1103 1162; # (대; 대; 대; 대; 대; ) HANGUL SYLLABLE DAE +B301;B301;1103 1162 11A8;B301;1103 1162 11A8; # (댁; 댁; 댁; 댁; 댁; ) HANGUL SYLLABLE DAEG +B302;B302;1103 1162 11A9;B302;1103 1162 11A9; # (댂; 댂; 댂; 댂; 댂; ) HANGUL SYLLABLE DAEGG +B303;B303;1103 1162 11AA;B303;1103 1162 11AA; # (댃; 댃; 댃; 댃; 댃; ) HANGUL SYLLABLE DAEGS +B304;B304;1103 1162 11AB;B304;1103 1162 11AB; # (댄; 댄; 댄; 댄; 댄; ) HANGUL SYLLABLE DAEN +B305;B305;1103 1162 11AC;B305;1103 1162 11AC; # (댅; 댅; 댅; 댅; 댅; ) HANGUL SYLLABLE DAENJ +B306;B306;1103 1162 11AD;B306;1103 1162 11AD; # (댆; 댆; 댆; 댆; 댆; ) HANGUL SYLLABLE DAENH +B307;B307;1103 1162 11AE;B307;1103 1162 11AE; # (댇; 댇; 댇; 댇; 댇; ) HANGUL SYLLABLE DAED +B308;B308;1103 1162 11AF;B308;1103 1162 11AF; # (댈; 댈; 댈; 댈; 댈; ) HANGUL SYLLABLE DAEL +B309;B309;1103 1162 11B0;B309;1103 1162 11B0; # (댉; 댉; 댉; 댉; 댉; ) HANGUL SYLLABLE DAELG +B30A;B30A;1103 1162 11B1;B30A;1103 1162 11B1; # (댊; 댊; 댊; 댊; 댊; ) HANGUL SYLLABLE DAELM +B30B;B30B;1103 1162 11B2;B30B;1103 1162 11B2; # (댋; 댋; 댋; 댋; 댋; ) HANGUL SYLLABLE DAELB +B30C;B30C;1103 1162 11B3;B30C;1103 1162 11B3; # (댌; 댌; 댌; 댌; 댌; ) HANGUL SYLLABLE DAELS +B30D;B30D;1103 1162 11B4;B30D;1103 1162 11B4; # (댍; 댍; 댍; 댍; 댍; ) HANGUL SYLLABLE DAELT +B30E;B30E;1103 1162 11B5;B30E;1103 1162 11B5; # (댎; 댎; 댎; 댎; 댎; ) HANGUL SYLLABLE DAELP +B30F;B30F;1103 1162 11B6;B30F;1103 1162 11B6; # (댏; 댏; 댏; 댏; 댏; ) HANGUL SYLLABLE DAELH +B310;B310;1103 1162 11B7;B310;1103 1162 11B7; # (댐; 댐; 댐; 댐; 댐; ) HANGUL SYLLABLE DAEM +B311;B311;1103 1162 11B8;B311;1103 1162 11B8; # (댑; 댑; 댑; 댑; 댑; ) HANGUL SYLLABLE DAEB +B312;B312;1103 1162 11B9;B312;1103 1162 11B9; # (댒; 댒; 댒; 댒; 댒; ) HANGUL SYLLABLE DAEBS +B313;B313;1103 1162 11BA;B313;1103 1162 11BA; # (댓; 댓; 댓; 댓; 댓; ) HANGUL SYLLABLE DAES +B314;B314;1103 1162 11BB;B314;1103 1162 11BB; # (댔; 댔; 댔; 댔; 댔; ) HANGUL SYLLABLE DAESS +B315;B315;1103 1162 11BC;B315;1103 1162 11BC; # (댕; 댕; 댕; 댕; 댕; ) HANGUL SYLLABLE DAENG +B316;B316;1103 1162 11BD;B316;1103 1162 11BD; # (댖; 댖; 댖; 댖; 댖; ) HANGUL SYLLABLE DAEJ +B317;B317;1103 1162 11BE;B317;1103 1162 11BE; # (댗; 댗; 댗; 댗; 댗; ) HANGUL SYLLABLE DAEC +B318;B318;1103 1162 11BF;B318;1103 1162 11BF; # (댘; 댘; 댘; 댘; 댘; ) HANGUL SYLLABLE DAEK +B319;B319;1103 1162 11C0;B319;1103 1162 11C0; # (댙; 댙; 댙; 댙; 댙; ) HANGUL SYLLABLE DAET +B31A;B31A;1103 1162 11C1;B31A;1103 1162 11C1; # (댚; 댚; 댚; 댚; 댚; ) HANGUL SYLLABLE DAEP +B31B;B31B;1103 1162 11C2;B31B;1103 1162 11C2; # (댛; 댛; 댛; 댛; 댛; ) HANGUL SYLLABLE DAEH +B31C;B31C;1103 1163;B31C;1103 1163; # (댜; 댜; 댜; 댜; 댜; ) HANGUL SYLLABLE DYA +B31D;B31D;1103 1163 11A8;B31D;1103 1163 11A8; # (댝; 댝; 댝; 댝; 댝; ) HANGUL SYLLABLE DYAG +B31E;B31E;1103 1163 11A9;B31E;1103 1163 11A9; # (댞; 댞; 댞; 댞; 댞; ) HANGUL SYLLABLE DYAGG +B31F;B31F;1103 1163 11AA;B31F;1103 1163 11AA; # (댟; 댟; 댟; 댟; 댟; ) HANGUL SYLLABLE DYAGS +B320;B320;1103 1163 11AB;B320;1103 1163 11AB; # (댠; 댠; 댠; 댠; 댠; ) HANGUL SYLLABLE DYAN +B321;B321;1103 1163 11AC;B321;1103 1163 11AC; # (댡; 댡; 댡; 댡; 댡; ) HANGUL SYLLABLE DYANJ +B322;B322;1103 1163 11AD;B322;1103 1163 11AD; # (댢; 댢; 댢; 댢; 댢; ) HANGUL SYLLABLE DYANH +B323;B323;1103 1163 11AE;B323;1103 1163 11AE; # (댣; 댣; 댣; 댣; 댣; ) HANGUL SYLLABLE DYAD +B324;B324;1103 1163 11AF;B324;1103 1163 11AF; # (댤; 댤; 댤; 댤; 댤; ) HANGUL SYLLABLE DYAL +B325;B325;1103 1163 11B0;B325;1103 1163 11B0; # (댥; 댥; 댥; 댥; 댥; ) HANGUL SYLLABLE DYALG +B326;B326;1103 1163 11B1;B326;1103 1163 11B1; # (댦; 댦; 댦; 댦; 댦; ) HANGUL SYLLABLE DYALM +B327;B327;1103 1163 11B2;B327;1103 1163 11B2; # (댧; 댧; 댧; 댧; 댧; ) HANGUL SYLLABLE DYALB +B328;B328;1103 1163 11B3;B328;1103 1163 11B3; # (댨; 댨; 댨; 댨; 댨; ) HANGUL SYLLABLE DYALS +B329;B329;1103 1163 11B4;B329;1103 1163 11B4; # (댩; 댩; 댩; 댩; 댩; ) HANGUL SYLLABLE DYALT +B32A;B32A;1103 1163 11B5;B32A;1103 1163 11B5; # (댪; 댪; 댪; 댪; 댪; ) HANGUL SYLLABLE DYALP +B32B;B32B;1103 1163 11B6;B32B;1103 1163 11B6; # (댫; 댫; 댫; 댫; 댫; ) HANGUL SYLLABLE DYALH +B32C;B32C;1103 1163 11B7;B32C;1103 1163 11B7; # (댬; 댬; 댬; 댬; 댬; ) HANGUL SYLLABLE DYAM +B32D;B32D;1103 1163 11B8;B32D;1103 1163 11B8; # (댭; 댭; 댭; 댭; 댭; ) HANGUL SYLLABLE DYAB +B32E;B32E;1103 1163 11B9;B32E;1103 1163 11B9; # (댮; 댮; 댮; 댮; 댮; ) HANGUL SYLLABLE DYABS +B32F;B32F;1103 1163 11BA;B32F;1103 1163 11BA; # (댯; 댯; 댯; 댯; 댯; ) HANGUL SYLLABLE DYAS +B330;B330;1103 1163 11BB;B330;1103 1163 11BB; # (댰; 댰; 댰; 댰; 댰; ) HANGUL SYLLABLE DYASS +B331;B331;1103 1163 11BC;B331;1103 1163 11BC; # (댱; 댱; 댱; 댱; 댱; ) HANGUL SYLLABLE DYANG +B332;B332;1103 1163 11BD;B332;1103 1163 11BD; # (댲; 댲; 댲; 댲; 댲; ) HANGUL SYLLABLE DYAJ +B333;B333;1103 1163 11BE;B333;1103 1163 11BE; # (댳; 댳; 댳; 댳; 댳; ) HANGUL SYLLABLE DYAC +B334;B334;1103 1163 11BF;B334;1103 1163 11BF; # (댴; 댴; 댴; 댴; 댴; ) HANGUL SYLLABLE DYAK +B335;B335;1103 1163 11C0;B335;1103 1163 11C0; # (댵; 댵; 댵; 댵; 댵; ) HANGUL SYLLABLE DYAT +B336;B336;1103 1163 11C1;B336;1103 1163 11C1; # (댶; 댶; 댶; 댶; 댶; ) HANGUL SYLLABLE DYAP +B337;B337;1103 1163 11C2;B337;1103 1163 11C2; # (댷; 댷; 댷; 댷; 댷; ) HANGUL SYLLABLE DYAH +B338;B338;1103 1164;B338;1103 1164; # (댸; 댸; 댸; 댸; 댸; ) HANGUL SYLLABLE DYAE +B339;B339;1103 1164 11A8;B339;1103 1164 11A8; # (댹; 댹; 댹; 댹; 댹; ) HANGUL SYLLABLE DYAEG +B33A;B33A;1103 1164 11A9;B33A;1103 1164 11A9; # (댺; 댺; 댺; 댺; 댺; ) HANGUL SYLLABLE DYAEGG +B33B;B33B;1103 1164 11AA;B33B;1103 1164 11AA; # (댻; 댻; 댻; 댻; 댻; ) HANGUL SYLLABLE DYAEGS +B33C;B33C;1103 1164 11AB;B33C;1103 1164 11AB; # (댼; 댼; 댼; 댼; 댼; ) HANGUL SYLLABLE DYAEN +B33D;B33D;1103 1164 11AC;B33D;1103 1164 11AC; # (댽; 댽; 댽; 댽; 댽; ) HANGUL SYLLABLE DYAENJ +B33E;B33E;1103 1164 11AD;B33E;1103 1164 11AD; # (댾; 댾; 댾; 댾; 댾; ) HANGUL SYLLABLE DYAENH +B33F;B33F;1103 1164 11AE;B33F;1103 1164 11AE; # (댿; 댿; 댿; 댿; 댿; ) HANGUL SYLLABLE DYAED +B340;B340;1103 1164 11AF;B340;1103 1164 11AF; # (덀; 덀; 덀; 덀; 덀; ) HANGUL SYLLABLE DYAEL +B341;B341;1103 1164 11B0;B341;1103 1164 11B0; # (덁; 덁; 덁; 덁; 덁; ) HANGUL SYLLABLE DYAELG +B342;B342;1103 1164 11B1;B342;1103 1164 11B1; # (덂; 덂; 덂; 덂; 덂; ) HANGUL SYLLABLE DYAELM +B343;B343;1103 1164 11B2;B343;1103 1164 11B2; # (덃; 덃; 덃; 덃; 덃; ) HANGUL SYLLABLE DYAELB +B344;B344;1103 1164 11B3;B344;1103 1164 11B3; # (덄; 덄; 덄; 덄; 덄; ) HANGUL SYLLABLE DYAELS +B345;B345;1103 1164 11B4;B345;1103 1164 11B4; # (덅; 덅; 덅; 덅; 덅; ) HANGUL SYLLABLE DYAELT +B346;B346;1103 1164 11B5;B346;1103 1164 11B5; # (덆; 덆; 덆; 덆; 덆; ) HANGUL SYLLABLE DYAELP +B347;B347;1103 1164 11B6;B347;1103 1164 11B6; # (덇; 덇; 덇; 덇; 덇; ) HANGUL SYLLABLE DYAELH +B348;B348;1103 1164 11B7;B348;1103 1164 11B7; # (덈; 덈; 덈; 덈; 덈; ) HANGUL SYLLABLE DYAEM +B349;B349;1103 1164 11B8;B349;1103 1164 11B8; # (덉; 덉; 덉; 덉; 덉; ) HANGUL SYLLABLE DYAEB +B34A;B34A;1103 1164 11B9;B34A;1103 1164 11B9; # (덊; 덊; 덊; 덊; 덊; ) HANGUL SYLLABLE DYAEBS +B34B;B34B;1103 1164 11BA;B34B;1103 1164 11BA; # (덋; 덋; 덋; 덋; 덋; ) HANGUL SYLLABLE DYAES +B34C;B34C;1103 1164 11BB;B34C;1103 1164 11BB; # (덌; 덌; 덌; 덌; 덌; ) HANGUL SYLLABLE DYAESS +B34D;B34D;1103 1164 11BC;B34D;1103 1164 11BC; # (덍; 덍; 덍; 덍; 덍; ) HANGUL SYLLABLE DYAENG +B34E;B34E;1103 1164 11BD;B34E;1103 1164 11BD; # (덎; 덎; 덎; 덎; 덎; ) HANGUL SYLLABLE DYAEJ +B34F;B34F;1103 1164 11BE;B34F;1103 1164 11BE; # (덏; 덏; 덏; 덏; 덏; ) HANGUL SYLLABLE DYAEC +B350;B350;1103 1164 11BF;B350;1103 1164 11BF; # (덐; 덐; 덐; 덐; 덐; ) HANGUL SYLLABLE DYAEK +B351;B351;1103 1164 11C0;B351;1103 1164 11C0; # (덑; 덑; 덑; 덑; 덑; ) HANGUL SYLLABLE DYAET +B352;B352;1103 1164 11C1;B352;1103 1164 11C1; # (덒; 덒; 덒; 덒; 덒; ) HANGUL SYLLABLE DYAEP +B353;B353;1103 1164 11C2;B353;1103 1164 11C2; # (덓; 덓; 덓; 덓; 덓; ) HANGUL SYLLABLE DYAEH +B354;B354;1103 1165;B354;1103 1165; # (더; 더; 더; 더; 더; ) HANGUL SYLLABLE DEO +B355;B355;1103 1165 11A8;B355;1103 1165 11A8; # (덕; 덕; 덕; 덕; 덕; ) HANGUL SYLLABLE DEOG +B356;B356;1103 1165 11A9;B356;1103 1165 11A9; # (덖; 덖; 덖; 덖; 덖; ) HANGUL SYLLABLE DEOGG +B357;B357;1103 1165 11AA;B357;1103 1165 11AA; # (덗; 덗; 덗; 덗; 덗; ) HANGUL SYLLABLE DEOGS +B358;B358;1103 1165 11AB;B358;1103 1165 11AB; # (던; 던; 던; 던; 던; ) HANGUL SYLLABLE DEON +B359;B359;1103 1165 11AC;B359;1103 1165 11AC; # (덙; 덙; 덙; 덙; 덙; ) HANGUL SYLLABLE DEONJ +B35A;B35A;1103 1165 11AD;B35A;1103 1165 11AD; # (덚; 덚; 덚; 덚; 덚; ) HANGUL SYLLABLE DEONH +B35B;B35B;1103 1165 11AE;B35B;1103 1165 11AE; # (덛; 덛; 덛; 덛; 덛; ) HANGUL SYLLABLE DEOD +B35C;B35C;1103 1165 11AF;B35C;1103 1165 11AF; # (덜; 덜; 덜; 덜; 덜; ) HANGUL SYLLABLE DEOL +B35D;B35D;1103 1165 11B0;B35D;1103 1165 11B0; # (덝; 덝; 덝; 덝; 덝; ) HANGUL SYLLABLE DEOLG +B35E;B35E;1103 1165 11B1;B35E;1103 1165 11B1; # (덞; 덞; 덞; 덞; 덞; ) HANGUL SYLLABLE DEOLM +B35F;B35F;1103 1165 11B2;B35F;1103 1165 11B2; # (덟; 덟; 덟; 덟; 덟; ) HANGUL SYLLABLE DEOLB +B360;B360;1103 1165 11B3;B360;1103 1165 11B3; # (덠; 덠; 덠; 덠; 덠; ) HANGUL SYLLABLE DEOLS +B361;B361;1103 1165 11B4;B361;1103 1165 11B4; # (덡; 덡; 덡; 덡; 덡; ) HANGUL SYLLABLE DEOLT +B362;B362;1103 1165 11B5;B362;1103 1165 11B5; # (덢; 덢; 덢; 덢; 덢; ) HANGUL SYLLABLE DEOLP +B363;B363;1103 1165 11B6;B363;1103 1165 11B6; # (덣; 덣; 덣; 덣; 덣; ) HANGUL SYLLABLE DEOLH +B364;B364;1103 1165 11B7;B364;1103 1165 11B7; # (덤; 덤; 덤; 덤; 덤; ) HANGUL SYLLABLE DEOM +B365;B365;1103 1165 11B8;B365;1103 1165 11B8; # (덥; 덥; 덥; 덥; 덥; ) HANGUL SYLLABLE DEOB +B366;B366;1103 1165 11B9;B366;1103 1165 11B9; # (덦; 덦; 덦; 덦; 덦; ) HANGUL SYLLABLE DEOBS +B367;B367;1103 1165 11BA;B367;1103 1165 11BA; # (덧; 덧; 덧; 덧; 덧; ) HANGUL SYLLABLE DEOS +B368;B368;1103 1165 11BB;B368;1103 1165 11BB; # (덨; 덨; 덨; 덨; 덨; ) HANGUL SYLLABLE DEOSS +B369;B369;1103 1165 11BC;B369;1103 1165 11BC; # (덩; 덩; 덩; 덩; 덩; ) HANGUL SYLLABLE DEONG +B36A;B36A;1103 1165 11BD;B36A;1103 1165 11BD; # (덪; 덪; 덪; 덪; 덪; ) HANGUL SYLLABLE DEOJ +B36B;B36B;1103 1165 11BE;B36B;1103 1165 11BE; # (덫; 덫; 덫; 덫; 덫; ) HANGUL SYLLABLE DEOC +B36C;B36C;1103 1165 11BF;B36C;1103 1165 11BF; # (덬; 덬; 덬; 덬; 덬; ) HANGUL SYLLABLE DEOK +B36D;B36D;1103 1165 11C0;B36D;1103 1165 11C0; # (덭; 덭; 덭; 덭; 덭; ) HANGUL SYLLABLE DEOT +B36E;B36E;1103 1165 11C1;B36E;1103 1165 11C1; # (덮; 덮; 덮; 덮; 덮; ) HANGUL SYLLABLE DEOP +B36F;B36F;1103 1165 11C2;B36F;1103 1165 11C2; # (덯; 덯; 덯; 덯; 덯; ) HANGUL SYLLABLE DEOH +B370;B370;1103 1166;B370;1103 1166; # (데; 데; 데; 데; 데; ) HANGUL SYLLABLE DE +B371;B371;1103 1166 11A8;B371;1103 1166 11A8; # (덱; 덱; 덱; 덱; 덱; ) HANGUL SYLLABLE DEG +B372;B372;1103 1166 11A9;B372;1103 1166 11A9; # (덲; 덲; 덲; 덲; 덲; ) HANGUL SYLLABLE DEGG +B373;B373;1103 1166 11AA;B373;1103 1166 11AA; # (덳; 덳; 덳; 덳; 덳; ) HANGUL SYLLABLE DEGS +B374;B374;1103 1166 11AB;B374;1103 1166 11AB; # (덴; 덴; 덴; 덴; 덴; ) HANGUL SYLLABLE DEN +B375;B375;1103 1166 11AC;B375;1103 1166 11AC; # (덵; 덵; 덵; 덵; 덵; ) HANGUL SYLLABLE DENJ +B376;B376;1103 1166 11AD;B376;1103 1166 11AD; # (덶; 덶; 덶; 덶; 덶; ) HANGUL SYLLABLE DENH +B377;B377;1103 1166 11AE;B377;1103 1166 11AE; # (덷; 덷; 덷; 덷; 덷; ) HANGUL SYLLABLE DED +B378;B378;1103 1166 11AF;B378;1103 1166 11AF; # (델; 델; 델; 델; 델; ) HANGUL SYLLABLE DEL +B379;B379;1103 1166 11B0;B379;1103 1166 11B0; # (덹; 덹; 덹; 덹; 덹; ) HANGUL SYLLABLE DELG +B37A;B37A;1103 1166 11B1;B37A;1103 1166 11B1; # (덺; 덺; 덺; 덺; 덺; ) HANGUL SYLLABLE DELM +B37B;B37B;1103 1166 11B2;B37B;1103 1166 11B2; # (덻; 덻; 덻; 덻; 덻; ) HANGUL SYLLABLE DELB +B37C;B37C;1103 1166 11B3;B37C;1103 1166 11B3; # (덼; 덼; 덼; 덼; 덼; ) HANGUL SYLLABLE DELS +B37D;B37D;1103 1166 11B4;B37D;1103 1166 11B4; # (덽; 덽; 덽; 덽; 덽; ) HANGUL SYLLABLE DELT +B37E;B37E;1103 1166 11B5;B37E;1103 1166 11B5; # (덾; 덾; 덾; 덾; 덾; ) HANGUL SYLLABLE DELP +B37F;B37F;1103 1166 11B6;B37F;1103 1166 11B6; # (덿; 덿; 덿; 덿; 덿; ) HANGUL SYLLABLE DELH +B380;B380;1103 1166 11B7;B380;1103 1166 11B7; # (뎀; 뎀; 뎀; 뎀; 뎀; ) HANGUL SYLLABLE DEM +B381;B381;1103 1166 11B8;B381;1103 1166 11B8; # (뎁; 뎁; 뎁; 뎁; 뎁; ) HANGUL SYLLABLE DEB +B382;B382;1103 1166 11B9;B382;1103 1166 11B9; # (뎂; 뎂; 뎂; 뎂; 뎂; ) HANGUL SYLLABLE DEBS +B383;B383;1103 1166 11BA;B383;1103 1166 11BA; # (뎃; 뎃; 뎃; 뎃; 뎃; ) HANGUL SYLLABLE DES +B384;B384;1103 1166 11BB;B384;1103 1166 11BB; # (뎄; 뎄; 뎄; 뎄; 뎄; ) HANGUL SYLLABLE DESS +B385;B385;1103 1166 11BC;B385;1103 1166 11BC; # (뎅; 뎅; 뎅; 뎅; 뎅; ) HANGUL SYLLABLE DENG +B386;B386;1103 1166 11BD;B386;1103 1166 11BD; # (뎆; 뎆; 뎆; 뎆; 뎆; ) HANGUL SYLLABLE DEJ +B387;B387;1103 1166 11BE;B387;1103 1166 11BE; # (뎇; 뎇; 뎇; 뎇; 뎇; ) HANGUL SYLLABLE DEC +B388;B388;1103 1166 11BF;B388;1103 1166 11BF; # (뎈; 뎈; 뎈; 뎈; 뎈; ) HANGUL SYLLABLE DEK +B389;B389;1103 1166 11C0;B389;1103 1166 11C0; # (뎉; 뎉; 뎉; 뎉; 뎉; ) HANGUL SYLLABLE DET +B38A;B38A;1103 1166 11C1;B38A;1103 1166 11C1; # (뎊; 뎊; 뎊; 뎊; 뎊; ) HANGUL SYLLABLE DEP +B38B;B38B;1103 1166 11C2;B38B;1103 1166 11C2; # (뎋; 뎋; 뎋; 뎋; 뎋; ) HANGUL SYLLABLE DEH +B38C;B38C;1103 1167;B38C;1103 1167; # (뎌; 뎌; 뎌; 뎌; 뎌; ) HANGUL SYLLABLE DYEO +B38D;B38D;1103 1167 11A8;B38D;1103 1167 11A8; # (뎍; 뎍; 뎍; 뎍; 뎍; ) HANGUL SYLLABLE DYEOG +B38E;B38E;1103 1167 11A9;B38E;1103 1167 11A9; # (뎎; 뎎; 뎎; 뎎; 뎎; ) HANGUL SYLLABLE DYEOGG +B38F;B38F;1103 1167 11AA;B38F;1103 1167 11AA; # (뎏; 뎏; 뎏; 뎏; 뎏; ) HANGUL SYLLABLE DYEOGS +B390;B390;1103 1167 11AB;B390;1103 1167 11AB; # (뎐; 뎐; 뎐; 뎐; 뎐; ) HANGUL SYLLABLE DYEON +B391;B391;1103 1167 11AC;B391;1103 1167 11AC; # (뎑; 뎑; 뎑; 뎑; 뎑; ) HANGUL SYLLABLE DYEONJ +B392;B392;1103 1167 11AD;B392;1103 1167 11AD; # (뎒; 뎒; 뎒; 뎒; 뎒; ) HANGUL SYLLABLE DYEONH +B393;B393;1103 1167 11AE;B393;1103 1167 11AE; # (뎓; 뎓; 뎓; 뎓; 뎓; ) HANGUL SYLLABLE DYEOD +B394;B394;1103 1167 11AF;B394;1103 1167 11AF; # (뎔; 뎔; 뎔; 뎔; 뎔; ) HANGUL SYLLABLE DYEOL +B395;B395;1103 1167 11B0;B395;1103 1167 11B0; # (뎕; 뎕; 뎕; 뎕; 뎕; ) HANGUL SYLLABLE DYEOLG +B396;B396;1103 1167 11B1;B396;1103 1167 11B1; # (뎖; 뎖; 뎖; 뎖; 뎖; ) HANGUL SYLLABLE DYEOLM +B397;B397;1103 1167 11B2;B397;1103 1167 11B2; # (뎗; 뎗; 뎗; 뎗; 뎗; ) HANGUL SYLLABLE DYEOLB +B398;B398;1103 1167 11B3;B398;1103 1167 11B3; # (뎘; 뎘; 뎘; 뎘; 뎘; ) HANGUL SYLLABLE DYEOLS +B399;B399;1103 1167 11B4;B399;1103 1167 11B4; # (뎙; 뎙; 뎙; 뎙; 뎙; ) HANGUL SYLLABLE DYEOLT +B39A;B39A;1103 1167 11B5;B39A;1103 1167 11B5; # (뎚; 뎚; 뎚; 뎚; 뎚; ) HANGUL SYLLABLE DYEOLP +B39B;B39B;1103 1167 11B6;B39B;1103 1167 11B6; # (뎛; 뎛; 뎛; 뎛; 뎛; ) HANGUL SYLLABLE DYEOLH +B39C;B39C;1103 1167 11B7;B39C;1103 1167 11B7; # (뎜; 뎜; 뎜; 뎜; 뎜; ) HANGUL SYLLABLE DYEOM +B39D;B39D;1103 1167 11B8;B39D;1103 1167 11B8; # (뎝; 뎝; 뎝; 뎝; 뎝; ) HANGUL SYLLABLE DYEOB +B39E;B39E;1103 1167 11B9;B39E;1103 1167 11B9; # (뎞; 뎞; 뎞; 뎞; 뎞; ) HANGUL SYLLABLE DYEOBS +B39F;B39F;1103 1167 11BA;B39F;1103 1167 11BA; # (뎟; 뎟; 뎟; 뎟; 뎟; ) HANGUL SYLLABLE DYEOS +B3A0;B3A0;1103 1167 11BB;B3A0;1103 1167 11BB; # (뎠; 뎠; 뎠; 뎠; 뎠; ) HANGUL SYLLABLE DYEOSS +B3A1;B3A1;1103 1167 11BC;B3A1;1103 1167 11BC; # (뎡; 뎡; 뎡; 뎡; 뎡; ) HANGUL SYLLABLE DYEONG +B3A2;B3A2;1103 1167 11BD;B3A2;1103 1167 11BD; # (뎢; 뎢; 뎢; 뎢; 뎢; ) HANGUL SYLLABLE DYEOJ +B3A3;B3A3;1103 1167 11BE;B3A3;1103 1167 11BE; # (뎣; 뎣; 뎣; 뎣; 뎣; ) HANGUL SYLLABLE DYEOC +B3A4;B3A4;1103 1167 11BF;B3A4;1103 1167 11BF; # (뎤; 뎤; 뎤; 뎤; 뎤; ) HANGUL SYLLABLE DYEOK +B3A5;B3A5;1103 1167 11C0;B3A5;1103 1167 11C0; # (뎥; 뎥; 뎥; 뎥; 뎥; ) HANGUL SYLLABLE DYEOT +B3A6;B3A6;1103 1167 11C1;B3A6;1103 1167 11C1; # (뎦; 뎦; 뎦; 뎦; 뎦; ) HANGUL SYLLABLE DYEOP +B3A7;B3A7;1103 1167 11C2;B3A7;1103 1167 11C2; # (뎧; 뎧; 뎧; 뎧; 뎧; ) HANGUL SYLLABLE DYEOH +B3A8;B3A8;1103 1168;B3A8;1103 1168; # (뎨; 뎨; 뎨; 뎨; 뎨; ) HANGUL SYLLABLE DYE +B3A9;B3A9;1103 1168 11A8;B3A9;1103 1168 11A8; # (뎩; 뎩; 뎩; 뎩; 뎩; ) HANGUL SYLLABLE DYEG +B3AA;B3AA;1103 1168 11A9;B3AA;1103 1168 11A9; # (뎪; 뎪; 뎪; 뎪; 뎪; ) HANGUL SYLLABLE DYEGG +B3AB;B3AB;1103 1168 11AA;B3AB;1103 1168 11AA; # (뎫; 뎫; 뎫; 뎫; 뎫; ) HANGUL SYLLABLE DYEGS +B3AC;B3AC;1103 1168 11AB;B3AC;1103 1168 11AB; # (뎬; 뎬; 뎬; 뎬; 뎬; ) HANGUL SYLLABLE DYEN +B3AD;B3AD;1103 1168 11AC;B3AD;1103 1168 11AC; # (뎭; 뎭; 뎭; 뎭; 뎭; ) HANGUL SYLLABLE DYENJ +B3AE;B3AE;1103 1168 11AD;B3AE;1103 1168 11AD; # (뎮; 뎮; 뎮; 뎮; 뎮; ) HANGUL SYLLABLE DYENH +B3AF;B3AF;1103 1168 11AE;B3AF;1103 1168 11AE; # (뎯; 뎯; 뎯; 뎯; 뎯; ) HANGUL SYLLABLE DYED +B3B0;B3B0;1103 1168 11AF;B3B0;1103 1168 11AF; # (뎰; 뎰; 뎰; 뎰; 뎰; ) HANGUL SYLLABLE DYEL +B3B1;B3B1;1103 1168 11B0;B3B1;1103 1168 11B0; # (뎱; 뎱; 뎱; 뎱; 뎱; ) HANGUL SYLLABLE DYELG +B3B2;B3B2;1103 1168 11B1;B3B2;1103 1168 11B1; # (뎲; 뎲; 뎲; 뎲; 뎲; ) HANGUL SYLLABLE DYELM +B3B3;B3B3;1103 1168 11B2;B3B3;1103 1168 11B2; # (뎳; 뎳; 뎳; 뎳; 뎳; ) HANGUL SYLLABLE DYELB +B3B4;B3B4;1103 1168 11B3;B3B4;1103 1168 11B3; # (뎴; 뎴; 뎴; 뎴; 뎴; ) HANGUL SYLLABLE DYELS +B3B5;B3B5;1103 1168 11B4;B3B5;1103 1168 11B4; # (뎵; 뎵; 뎵; 뎵; 뎵; ) HANGUL SYLLABLE DYELT +B3B6;B3B6;1103 1168 11B5;B3B6;1103 1168 11B5; # (뎶; 뎶; 뎶; 뎶; 뎶; ) HANGUL SYLLABLE DYELP +B3B7;B3B7;1103 1168 11B6;B3B7;1103 1168 11B6; # (뎷; 뎷; 뎷; 뎷; 뎷; ) HANGUL SYLLABLE DYELH +B3B8;B3B8;1103 1168 11B7;B3B8;1103 1168 11B7; # (뎸; 뎸; 뎸; 뎸; 뎸; ) HANGUL SYLLABLE DYEM +B3B9;B3B9;1103 1168 11B8;B3B9;1103 1168 11B8; # (뎹; 뎹; 뎹; 뎹; 뎹; ) HANGUL SYLLABLE DYEB +B3BA;B3BA;1103 1168 11B9;B3BA;1103 1168 11B9; # (뎺; 뎺; 뎺; 뎺; 뎺; ) HANGUL SYLLABLE DYEBS +B3BB;B3BB;1103 1168 11BA;B3BB;1103 1168 11BA; # (뎻; 뎻; 뎻; 뎻; 뎻; ) HANGUL SYLLABLE DYES +B3BC;B3BC;1103 1168 11BB;B3BC;1103 1168 11BB; # (뎼; 뎼; 뎼; 뎼; 뎼; ) HANGUL SYLLABLE DYESS +B3BD;B3BD;1103 1168 11BC;B3BD;1103 1168 11BC; # (뎽; 뎽; 뎽; 뎽; 뎽; ) HANGUL SYLLABLE DYENG +B3BE;B3BE;1103 1168 11BD;B3BE;1103 1168 11BD; # (뎾; 뎾; 뎾; 뎾; 뎾; ) HANGUL SYLLABLE DYEJ +B3BF;B3BF;1103 1168 11BE;B3BF;1103 1168 11BE; # (뎿; 뎿; 뎿; 뎿; 뎿; ) HANGUL SYLLABLE DYEC +B3C0;B3C0;1103 1168 11BF;B3C0;1103 1168 11BF; # (돀; 돀; 돀; 돀; 돀; ) HANGUL SYLLABLE DYEK +B3C1;B3C1;1103 1168 11C0;B3C1;1103 1168 11C0; # (돁; 돁; 돁; 돁; 돁; ) HANGUL SYLLABLE DYET +B3C2;B3C2;1103 1168 11C1;B3C2;1103 1168 11C1; # (돂; 돂; 돂; 돂; 돂; ) HANGUL SYLLABLE DYEP +B3C3;B3C3;1103 1168 11C2;B3C3;1103 1168 11C2; # (돃; 돃; 돃; 돃; 돃; ) HANGUL SYLLABLE DYEH +B3C4;B3C4;1103 1169;B3C4;1103 1169; # (도; 도; 도; 도; 도; ) HANGUL SYLLABLE DO +B3C5;B3C5;1103 1169 11A8;B3C5;1103 1169 11A8; # (독; 독; 독; 독; 독; ) HANGUL SYLLABLE DOG +B3C6;B3C6;1103 1169 11A9;B3C6;1103 1169 11A9; # (돆; 돆; 돆; 돆; 돆; ) HANGUL SYLLABLE DOGG +B3C7;B3C7;1103 1169 11AA;B3C7;1103 1169 11AA; # (돇; 돇; 돇; 돇; 돇; ) HANGUL SYLLABLE DOGS +B3C8;B3C8;1103 1169 11AB;B3C8;1103 1169 11AB; # (돈; 돈; 돈; 돈; 돈; ) HANGUL SYLLABLE DON +B3C9;B3C9;1103 1169 11AC;B3C9;1103 1169 11AC; # (돉; 돉; 돉; 돉; 돉; ) HANGUL SYLLABLE DONJ +B3CA;B3CA;1103 1169 11AD;B3CA;1103 1169 11AD; # (돊; 돊; 돊; 돊; 돊; ) HANGUL SYLLABLE DONH +B3CB;B3CB;1103 1169 11AE;B3CB;1103 1169 11AE; # (돋; 돋; 돋; 돋; 돋; ) HANGUL SYLLABLE DOD +B3CC;B3CC;1103 1169 11AF;B3CC;1103 1169 11AF; # (돌; 돌; 돌; 돌; 돌; ) HANGUL SYLLABLE DOL +B3CD;B3CD;1103 1169 11B0;B3CD;1103 1169 11B0; # (돍; 돍; 돍; 돍; 돍; ) HANGUL SYLLABLE DOLG +B3CE;B3CE;1103 1169 11B1;B3CE;1103 1169 11B1; # (돎; 돎; 돎; 돎; 돎; ) HANGUL SYLLABLE DOLM +B3CF;B3CF;1103 1169 11B2;B3CF;1103 1169 11B2; # (돏; 돏; 돏; 돏; 돏; ) HANGUL SYLLABLE DOLB +B3D0;B3D0;1103 1169 11B3;B3D0;1103 1169 11B3; # (돐; 돐; 돐; 돐; 돐; ) HANGUL SYLLABLE DOLS +B3D1;B3D1;1103 1169 11B4;B3D1;1103 1169 11B4; # (돑; 돑; 돑; 돑; 돑; ) HANGUL SYLLABLE DOLT +B3D2;B3D2;1103 1169 11B5;B3D2;1103 1169 11B5; # (돒; 돒; 돒; 돒; 돒; ) HANGUL SYLLABLE DOLP +B3D3;B3D3;1103 1169 11B6;B3D3;1103 1169 11B6; # (돓; 돓; 돓; 돓; 돓; ) HANGUL SYLLABLE DOLH +B3D4;B3D4;1103 1169 11B7;B3D4;1103 1169 11B7; # (돔; 돔; 돔; 돔; 돔; ) HANGUL SYLLABLE DOM +B3D5;B3D5;1103 1169 11B8;B3D5;1103 1169 11B8; # (돕; 돕; 돕; 돕; 돕; ) HANGUL SYLLABLE DOB +B3D6;B3D6;1103 1169 11B9;B3D6;1103 1169 11B9; # (돖; 돖; 돖; 돖; 돖; ) HANGUL SYLLABLE DOBS +B3D7;B3D7;1103 1169 11BA;B3D7;1103 1169 11BA; # (돗; 돗; 돗; 돗; 돗; ) HANGUL SYLLABLE DOS +B3D8;B3D8;1103 1169 11BB;B3D8;1103 1169 11BB; # (돘; 돘; 돘; 돘; 돘; ) HANGUL SYLLABLE DOSS +B3D9;B3D9;1103 1169 11BC;B3D9;1103 1169 11BC; # (동; 동; 동; 동; 동; ) HANGUL SYLLABLE DONG +B3DA;B3DA;1103 1169 11BD;B3DA;1103 1169 11BD; # (돚; 돚; 돚; 돚; 돚; ) HANGUL SYLLABLE DOJ +B3DB;B3DB;1103 1169 11BE;B3DB;1103 1169 11BE; # (돛; 돛; 돛; 돛; 돛; ) HANGUL SYLLABLE DOC +B3DC;B3DC;1103 1169 11BF;B3DC;1103 1169 11BF; # (돜; 돜; 돜; 돜; 돜; ) HANGUL SYLLABLE DOK +B3DD;B3DD;1103 1169 11C0;B3DD;1103 1169 11C0; # (돝; 돝; 돝; 돝; 돝; ) HANGUL SYLLABLE DOT +B3DE;B3DE;1103 1169 11C1;B3DE;1103 1169 11C1; # (돞; 돞; 돞; 돞; 돞; ) HANGUL SYLLABLE DOP +B3DF;B3DF;1103 1169 11C2;B3DF;1103 1169 11C2; # (돟; 돟; 돟; 돟; 돟; ) HANGUL SYLLABLE DOH +B3E0;B3E0;1103 116A;B3E0;1103 116A; # (돠; 돠; 돠; 돠; 돠; ) HANGUL SYLLABLE DWA +B3E1;B3E1;1103 116A 11A8;B3E1;1103 116A 11A8; # (돡; 돡; 돡; 돡; 돡; ) HANGUL SYLLABLE DWAG +B3E2;B3E2;1103 116A 11A9;B3E2;1103 116A 11A9; # (돢; 돢; 돢; 돢; 돢; ) HANGUL SYLLABLE DWAGG +B3E3;B3E3;1103 116A 11AA;B3E3;1103 116A 11AA; # (돣; 돣; 돣; 돣; 돣; ) HANGUL SYLLABLE DWAGS +B3E4;B3E4;1103 116A 11AB;B3E4;1103 116A 11AB; # (돤; 돤; 돤; 돤; 돤; ) HANGUL SYLLABLE DWAN +B3E5;B3E5;1103 116A 11AC;B3E5;1103 116A 11AC; # (돥; 돥; 돥; 돥; 돥; ) HANGUL SYLLABLE DWANJ +B3E6;B3E6;1103 116A 11AD;B3E6;1103 116A 11AD; # (돦; 돦; 돦; 돦; 돦; ) HANGUL SYLLABLE DWANH +B3E7;B3E7;1103 116A 11AE;B3E7;1103 116A 11AE; # (돧; 돧; 돧; 돧; 돧; ) HANGUL SYLLABLE DWAD +B3E8;B3E8;1103 116A 11AF;B3E8;1103 116A 11AF; # (돨; 돨; 돨; 돨; 돨; ) HANGUL SYLLABLE DWAL +B3E9;B3E9;1103 116A 11B0;B3E9;1103 116A 11B0; # (돩; 돩; 돩; 돩; 돩; ) HANGUL SYLLABLE DWALG +B3EA;B3EA;1103 116A 11B1;B3EA;1103 116A 11B1; # (돪; 돪; 돪; 돪; 돪; ) HANGUL SYLLABLE DWALM +B3EB;B3EB;1103 116A 11B2;B3EB;1103 116A 11B2; # (돫; 돫; 돫; 돫; 돫; ) HANGUL SYLLABLE DWALB +B3EC;B3EC;1103 116A 11B3;B3EC;1103 116A 11B3; # (돬; 돬; 돬; 돬; 돬; ) HANGUL SYLLABLE DWALS +B3ED;B3ED;1103 116A 11B4;B3ED;1103 116A 11B4; # (돭; 돭; 돭; 돭; 돭; ) HANGUL SYLLABLE DWALT +B3EE;B3EE;1103 116A 11B5;B3EE;1103 116A 11B5; # (돮; 돮; 돮; 돮; 돮; ) HANGUL SYLLABLE DWALP +B3EF;B3EF;1103 116A 11B6;B3EF;1103 116A 11B6; # (돯; 돯; 돯; 돯; 돯; ) HANGUL SYLLABLE DWALH +B3F0;B3F0;1103 116A 11B7;B3F0;1103 116A 11B7; # (돰; 돰; 돰; 돰; 돰; ) HANGUL SYLLABLE DWAM +B3F1;B3F1;1103 116A 11B8;B3F1;1103 116A 11B8; # (돱; 돱; 돱; 돱; 돱; ) HANGUL SYLLABLE DWAB +B3F2;B3F2;1103 116A 11B9;B3F2;1103 116A 11B9; # (돲; 돲; 돲; 돲; 돲; ) HANGUL SYLLABLE DWABS +B3F3;B3F3;1103 116A 11BA;B3F3;1103 116A 11BA; # (돳; 돳; 돳; 돳; 돳; ) HANGUL SYLLABLE DWAS +B3F4;B3F4;1103 116A 11BB;B3F4;1103 116A 11BB; # (돴; 돴; 돴; 돴; 돴; ) HANGUL SYLLABLE DWASS +B3F5;B3F5;1103 116A 11BC;B3F5;1103 116A 11BC; # (돵; 돵; 돵; 돵; 돵; ) HANGUL SYLLABLE DWANG +B3F6;B3F6;1103 116A 11BD;B3F6;1103 116A 11BD; # (돶; 돶; 돶; 돶; 돶; ) HANGUL SYLLABLE DWAJ +B3F7;B3F7;1103 116A 11BE;B3F7;1103 116A 11BE; # (돷; 돷; 돷; 돷; 돷; ) HANGUL SYLLABLE DWAC +B3F8;B3F8;1103 116A 11BF;B3F8;1103 116A 11BF; # (돸; 돸; 돸; 돸; 돸; ) HANGUL SYLLABLE DWAK +B3F9;B3F9;1103 116A 11C0;B3F9;1103 116A 11C0; # (돹; 돹; 돹; 돹; 돹; ) HANGUL SYLLABLE DWAT +B3FA;B3FA;1103 116A 11C1;B3FA;1103 116A 11C1; # (돺; 돺; 돺; 돺; 돺; ) HANGUL SYLLABLE DWAP +B3FB;B3FB;1103 116A 11C2;B3FB;1103 116A 11C2; # (돻; 돻; 돻; 돻; 돻; ) HANGUL SYLLABLE DWAH +B3FC;B3FC;1103 116B;B3FC;1103 116B; # (돼; 돼; 돼; 돼; 돼; ) HANGUL SYLLABLE DWAE +B3FD;B3FD;1103 116B 11A8;B3FD;1103 116B 11A8; # (돽; 돽; 돽; 돽; 돽; ) HANGUL SYLLABLE DWAEG +B3FE;B3FE;1103 116B 11A9;B3FE;1103 116B 11A9; # (돾; 돾; 돾; 돾; 돾; ) HANGUL SYLLABLE DWAEGG +B3FF;B3FF;1103 116B 11AA;B3FF;1103 116B 11AA; # (돿; 돿; 돿; 돿; 돿; ) HANGUL SYLLABLE DWAEGS +B400;B400;1103 116B 11AB;B400;1103 116B 11AB; # (됀; 됀; 됀; 됀; 됀; ) HANGUL SYLLABLE DWAEN +B401;B401;1103 116B 11AC;B401;1103 116B 11AC; # (됁; 됁; 됁; 됁; 됁; ) HANGUL SYLLABLE DWAENJ +B402;B402;1103 116B 11AD;B402;1103 116B 11AD; # (됂; 됂; 됂; 됂; 됂; ) HANGUL SYLLABLE DWAENH +B403;B403;1103 116B 11AE;B403;1103 116B 11AE; # (됃; 됃; 됃; 됃; 됃; ) HANGUL SYLLABLE DWAED +B404;B404;1103 116B 11AF;B404;1103 116B 11AF; # (됄; 됄; 됄; 됄; 됄; ) HANGUL SYLLABLE DWAEL +B405;B405;1103 116B 11B0;B405;1103 116B 11B0; # (됅; 됅; 됅; 됅; 됅; ) HANGUL SYLLABLE DWAELG +B406;B406;1103 116B 11B1;B406;1103 116B 11B1; # (됆; 됆; 됆; 됆; 됆; ) HANGUL SYLLABLE DWAELM +B407;B407;1103 116B 11B2;B407;1103 116B 11B2; # (됇; 됇; 됇; 됇; 됇; ) HANGUL SYLLABLE DWAELB +B408;B408;1103 116B 11B3;B408;1103 116B 11B3; # (됈; 됈; 됈; 됈; 됈; ) HANGUL SYLLABLE DWAELS +B409;B409;1103 116B 11B4;B409;1103 116B 11B4; # (됉; 됉; 됉; 됉; 됉; ) HANGUL SYLLABLE DWAELT +B40A;B40A;1103 116B 11B5;B40A;1103 116B 11B5; # (됊; 됊; 됊; 됊; 됊; ) HANGUL SYLLABLE DWAELP +B40B;B40B;1103 116B 11B6;B40B;1103 116B 11B6; # (됋; 됋; 됋; 됋; 됋; ) HANGUL SYLLABLE DWAELH +B40C;B40C;1103 116B 11B7;B40C;1103 116B 11B7; # (됌; 됌; 됌; 됌; 됌; ) HANGUL SYLLABLE DWAEM +B40D;B40D;1103 116B 11B8;B40D;1103 116B 11B8; # (됍; 됍; 됍; 됍; 됍; ) HANGUL SYLLABLE DWAEB +B40E;B40E;1103 116B 11B9;B40E;1103 116B 11B9; # (됎; 됎; 됎; 됎; 됎; ) HANGUL SYLLABLE DWAEBS +B40F;B40F;1103 116B 11BA;B40F;1103 116B 11BA; # (됏; 됏; 됏; 됏; 됏; ) HANGUL SYLLABLE DWAES +B410;B410;1103 116B 11BB;B410;1103 116B 11BB; # (됐; 됐; 됐; 됐; 됐; ) HANGUL SYLLABLE DWAESS +B411;B411;1103 116B 11BC;B411;1103 116B 11BC; # (됑; 됑; 됑; 됑; 됑; ) HANGUL SYLLABLE DWAENG +B412;B412;1103 116B 11BD;B412;1103 116B 11BD; # (됒; 됒; 됒; 됒; 됒; ) HANGUL SYLLABLE DWAEJ +B413;B413;1103 116B 11BE;B413;1103 116B 11BE; # (됓; 됓; 됓; 됓; 됓; ) HANGUL SYLLABLE DWAEC +B414;B414;1103 116B 11BF;B414;1103 116B 11BF; # (됔; 됔; 됔; 됔; 됔; ) HANGUL SYLLABLE DWAEK +B415;B415;1103 116B 11C0;B415;1103 116B 11C0; # (됕; 됕; 됕; 됕; 됕; ) HANGUL SYLLABLE DWAET +B416;B416;1103 116B 11C1;B416;1103 116B 11C1; # (됖; 됖; 됖; 됖; 됖; ) HANGUL SYLLABLE DWAEP +B417;B417;1103 116B 11C2;B417;1103 116B 11C2; # (됗; 됗; 됗; 됗; 됗; ) HANGUL SYLLABLE DWAEH +B418;B418;1103 116C;B418;1103 116C; # (되; 되; 되; 되; 되; ) HANGUL SYLLABLE DOE +B419;B419;1103 116C 11A8;B419;1103 116C 11A8; # (됙; 됙; 됙; 됙; 됙; ) HANGUL SYLLABLE DOEG +B41A;B41A;1103 116C 11A9;B41A;1103 116C 11A9; # (됚; 됚; 됚; 됚; 됚; ) HANGUL SYLLABLE DOEGG +B41B;B41B;1103 116C 11AA;B41B;1103 116C 11AA; # (됛; 됛; 됛; 됛; 됛; ) HANGUL SYLLABLE DOEGS +B41C;B41C;1103 116C 11AB;B41C;1103 116C 11AB; # (된; 된; 된; 된; 된; ) HANGUL SYLLABLE DOEN +B41D;B41D;1103 116C 11AC;B41D;1103 116C 11AC; # (됝; 됝; 됝; 됝; 됝; ) HANGUL SYLLABLE DOENJ +B41E;B41E;1103 116C 11AD;B41E;1103 116C 11AD; # (됞; 됞; 됞; 됞; 됞; ) HANGUL SYLLABLE DOENH +B41F;B41F;1103 116C 11AE;B41F;1103 116C 11AE; # (됟; 됟; 됟; 됟; 됟; ) HANGUL SYLLABLE DOED +B420;B420;1103 116C 11AF;B420;1103 116C 11AF; # (될; 될; 될; 될; 될; ) HANGUL SYLLABLE DOEL +B421;B421;1103 116C 11B0;B421;1103 116C 11B0; # (됡; 됡; 됡; 됡; 됡; ) HANGUL SYLLABLE DOELG +B422;B422;1103 116C 11B1;B422;1103 116C 11B1; # (됢; 됢; 됢; 됢; 됢; ) HANGUL SYLLABLE DOELM +B423;B423;1103 116C 11B2;B423;1103 116C 11B2; # (됣; 됣; 됣; 됣; 됣; ) HANGUL SYLLABLE DOELB +B424;B424;1103 116C 11B3;B424;1103 116C 11B3; # (됤; 됤; 됤; 됤; 됤; ) HANGUL SYLLABLE DOELS +B425;B425;1103 116C 11B4;B425;1103 116C 11B4; # (됥; 됥; 됥; 됥; 됥; ) HANGUL SYLLABLE DOELT +B426;B426;1103 116C 11B5;B426;1103 116C 11B5; # (됦; 됦; 됦; 됦; 됦; ) HANGUL SYLLABLE DOELP +B427;B427;1103 116C 11B6;B427;1103 116C 11B6; # (됧; 됧; 됧; 됧; 됧; ) HANGUL SYLLABLE DOELH +B428;B428;1103 116C 11B7;B428;1103 116C 11B7; # (됨; 됨; 됨; 됨; 됨; ) HANGUL SYLLABLE DOEM +B429;B429;1103 116C 11B8;B429;1103 116C 11B8; # (됩; 됩; 됩; 됩; 됩; ) HANGUL SYLLABLE DOEB +B42A;B42A;1103 116C 11B9;B42A;1103 116C 11B9; # (됪; 됪; 됪; 됪; 됪; ) HANGUL SYLLABLE DOEBS +B42B;B42B;1103 116C 11BA;B42B;1103 116C 11BA; # (됫; 됫; 됫; 됫; 됫; ) HANGUL SYLLABLE DOES +B42C;B42C;1103 116C 11BB;B42C;1103 116C 11BB; # (됬; 됬; 됬; 됬; 됬; ) HANGUL SYLLABLE DOESS +B42D;B42D;1103 116C 11BC;B42D;1103 116C 11BC; # (됭; 됭; 됭; 됭; 됭; ) HANGUL SYLLABLE DOENG +B42E;B42E;1103 116C 11BD;B42E;1103 116C 11BD; # (됮; 됮; 됮; 됮; 됮; ) HANGUL SYLLABLE DOEJ +B42F;B42F;1103 116C 11BE;B42F;1103 116C 11BE; # (됯; 됯; 됯; 됯; 됯; ) HANGUL SYLLABLE DOEC +B430;B430;1103 116C 11BF;B430;1103 116C 11BF; # (됰; 됰; 됰; 됰; 됰; ) HANGUL SYLLABLE DOEK +B431;B431;1103 116C 11C0;B431;1103 116C 11C0; # (됱; 됱; 됱; 됱; 됱; ) HANGUL SYLLABLE DOET +B432;B432;1103 116C 11C1;B432;1103 116C 11C1; # (됲; 됲; 됲; 됲; 됲; ) HANGUL SYLLABLE DOEP +B433;B433;1103 116C 11C2;B433;1103 116C 11C2; # (됳; 됳; 됳; 됳; 됳; ) HANGUL SYLLABLE DOEH +B434;B434;1103 116D;B434;1103 116D; # (됴; 됴; 됴; 됴; 됴; ) HANGUL SYLLABLE DYO +B435;B435;1103 116D 11A8;B435;1103 116D 11A8; # (됵; 됵; 됵; 됵; 됵; ) HANGUL SYLLABLE DYOG +B436;B436;1103 116D 11A9;B436;1103 116D 11A9; # (됶; 됶; 됶; 됶; 됶; ) HANGUL SYLLABLE DYOGG +B437;B437;1103 116D 11AA;B437;1103 116D 11AA; # (됷; 됷; 됷; 됷; 됷; ) HANGUL SYLLABLE DYOGS +B438;B438;1103 116D 11AB;B438;1103 116D 11AB; # (됸; 됸; 됸; 됸; 됸; ) HANGUL SYLLABLE DYON +B439;B439;1103 116D 11AC;B439;1103 116D 11AC; # (됹; 됹; 됹; 됹; 됹; ) HANGUL SYLLABLE DYONJ +B43A;B43A;1103 116D 11AD;B43A;1103 116D 11AD; # (됺; 됺; 됺; 됺; 됺; ) HANGUL SYLLABLE DYONH +B43B;B43B;1103 116D 11AE;B43B;1103 116D 11AE; # (됻; 됻; 됻; 됻; 됻; ) HANGUL SYLLABLE DYOD +B43C;B43C;1103 116D 11AF;B43C;1103 116D 11AF; # (됼; 됼; 됼; 됼; 됼; ) HANGUL SYLLABLE DYOL +B43D;B43D;1103 116D 11B0;B43D;1103 116D 11B0; # (됽; 됽; 됽; 됽; 됽; ) HANGUL SYLLABLE DYOLG +B43E;B43E;1103 116D 11B1;B43E;1103 116D 11B1; # (됾; 됾; 됾; 됾; 됾; ) HANGUL SYLLABLE DYOLM +B43F;B43F;1103 116D 11B2;B43F;1103 116D 11B2; # (됿; 됿; 됿; 됿; 됿; ) HANGUL SYLLABLE DYOLB +B440;B440;1103 116D 11B3;B440;1103 116D 11B3; # (둀; 둀; 둀; 둀; 둀; ) HANGUL SYLLABLE DYOLS +B441;B441;1103 116D 11B4;B441;1103 116D 11B4; # (둁; 둁; 둁; 둁; 둁; ) HANGUL SYLLABLE DYOLT +B442;B442;1103 116D 11B5;B442;1103 116D 11B5; # (둂; 둂; 둂; 둂; 둂; ) HANGUL SYLLABLE DYOLP +B443;B443;1103 116D 11B6;B443;1103 116D 11B6; # (둃; 둃; 둃; 둃; 둃; ) HANGUL SYLLABLE DYOLH +B444;B444;1103 116D 11B7;B444;1103 116D 11B7; # (둄; 둄; 둄; 둄; 둄; ) HANGUL SYLLABLE DYOM +B445;B445;1103 116D 11B8;B445;1103 116D 11B8; # (둅; 둅; 둅; 둅; 둅; ) HANGUL SYLLABLE DYOB +B446;B446;1103 116D 11B9;B446;1103 116D 11B9; # (둆; 둆; 둆; 둆; 둆; ) HANGUL SYLLABLE DYOBS +B447;B447;1103 116D 11BA;B447;1103 116D 11BA; # (둇; 둇; 둇; 둇; 둇; ) HANGUL SYLLABLE DYOS +B448;B448;1103 116D 11BB;B448;1103 116D 11BB; # (둈; 둈; 둈; 둈; 둈; ) HANGUL SYLLABLE DYOSS +B449;B449;1103 116D 11BC;B449;1103 116D 11BC; # (둉; 둉; 둉; 둉; 둉; ) HANGUL SYLLABLE DYONG +B44A;B44A;1103 116D 11BD;B44A;1103 116D 11BD; # (둊; 둊; 둊; 둊; 둊; ) HANGUL SYLLABLE DYOJ +B44B;B44B;1103 116D 11BE;B44B;1103 116D 11BE; # (둋; 둋; 둋; 둋; 둋; ) HANGUL SYLLABLE DYOC +B44C;B44C;1103 116D 11BF;B44C;1103 116D 11BF; # (둌; 둌; 둌; 둌; 둌; ) HANGUL SYLLABLE DYOK +B44D;B44D;1103 116D 11C0;B44D;1103 116D 11C0; # (둍; 둍; 둍; 둍; 둍; ) HANGUL SYLLABLE DYOT +B44E;B44E;1103 116D 11C1;B44E;1103 116D 11C1; # (둎; 둎; 둎; 둎; 둎; ) HANGUL SYLLABLE DYOP +B44F;B44F;1103 116D 11C2;B44F;1103 116D 11C2; # (둏; 둏; 둏; 둏; 둏; ) HANGUL SYLLABLE DYOH +B450;B450;1103 116E;B450;1103 116E; # (두; 두; 두; 두; 두; ) HANGUL SYLLABLE DU +B451;B451;1103 116E 11A8;B451;1103 116E 11A8; # (둑; 둑; 둑; 둑; 둑; ) HANGUL SYLLABLE DUG +B452;B452;1103 116E 11A9;B452;1103 116E 11A9; # (둒; 둒; 둒; 둒; 둒; ) HANGUL SYLLABLE DUGG +B453;B453;1103 116E 11AA;B453;1103 116E 11AA; # (둓; 둓; 둓; 둓; 둓; ) HANGUL SYLLABLE DUGS +B454;B454;1103 116E 11AB;B454;1103 116E 11AB; # (둔; 둔; 둔; 둔; 둔; ) HANGUL SYLLABLE DUN +B455;B455;1103 116E 11AC;B455;1103 116E 11AC; # (둕; 둕; 둕; 둕; 둕; ) HANGUL SYLLABLE DUNJ +B456;B456;1103 116E 11AD;B456;1103 116E 11AD; # (둖; 둖; 둖; 둖; 둖; ) HANGUL SYLLABLE DUNH +B457;B457;1103 116E 11AE;B457;1103 116E 11AE; # (둗; 둗; 둗; 둗; 둗; ) HANGUL SYLLABLE DUD +B458;B458;1103 116E 11AF;B458;1103 116E 11AF; # (둘; 둘; 둘; 둘; 둘; ) HANGUL SYLLABLE DUL +B459;B459;1103 116E 11B0;B459;1103 116E 11B0; # (둙; 둙; 둙; 둙; 둙; ) HANGUL SYLLABLE DULG +B45A;B45A;1103 116E 11B1;B45A;1103 116E 11B1; # (둚; 둚; 둚; 둚; 둚; ) HANGUL SYLLABLE DULM +B45B;B45B;1103 116E 11B2;B45B;1103 116E 11B2; # (둛; 둛; 둛; 둛; 둛; ) HANGUL SYLLABLE DULB +B45C;B45C;1103 116E 11B3;B45C;1103 116E 11B3; # (둜; 둜; 둜; 둜; 둜; ) HANGUL SYLLABLE DULS +B45D;B45D;1103 116E 11B4;B45D;1103 116E 11B4; # (둝; 둝; 둝; 둝; 둝; ) HANGUL SYLLABLE DULT +B45E;B45E;1103 116E 11B5;B45E;1103 116E 11B5; # (둞; 둞; 둞; 둞; 둞; ) HANGUL SYLLABLE DULP +B45F;B45F;1103 116E 11B6;B45F;1103 116E 11B6; # (둟; 둟; 둟; 둟; 둟; ) HANGUL SYLLABLE DULH +B460;B460;1103 116E 11B7;B460;1103 116E 11B7; # (둠; 둠; 둠; 둠; 둠; ) HANGUL SYLLABLE DUM +B461;B461;1103 116E 11B8;B461;1103 116E 11B8; # (둡; 둡; 둡; 둡; 둡; ) HANGUL SYLLABLE DUB +B462;B462;1103 116E 11B9;B462;1103 116E 11B9; # (둢; 둢; 둢; 둢; 둢; ) HANGUL SYLLABLE DUBS +B463;B463;1103 116E 11BA;B463;1103 116E 11BA; # (둣; 둣; 둣; 둣; 둣; ) HANGUL SYLLABLE DUS +B464;B464;1103 116E 11BB;B464;1103 116E 11BB; # (둤; 둤; 둤; 둤; 둤; ) HANGUL SYLLABLE DUSS +B465;B465;1103 116E 11BC;B465;1103 116E 11BC; # (둥; 둥; 둥; 둥; 둥; ) HANGUL SYLLABLE DUNG +B466;B466;1103 116E 11BD;B466;1103 116E 11BD; # (둦; 둦; 둦; 둦; 둦; ) HANGUL SYLLABLE DUJ +B467;B467;1103 116E 11BE;B467;1103 116E 11BE; # (둧; 둧; 둧; 둧; 둧; ) HANGUL SYLLABLE DUC +B468;B468;1103 116E 11BF;B468;1103 116E 11BF; # (둨; 둨; 둨; 둨; 둨; ) HANGUL SYLLABLE DUK +B469;B469;1103 116E 11C0;B469;1103 116E 11C0; # (둩; 둩; 둩; 둩; 둩; ) HANGUL SYLLABLE DUT +B46A;B46A;1103 116E 11C1;B46A;1103 116E 11C1; # (둪; 둪; 둪; 둪; 둪; ) HANGUL SYLLABLE DUP +B46B;B46B;1103 116E 11C2;B46B;1103 116E 11C2; # (둫; 둫; 둫; 둫; 둫; ) HANGUL SYLLABLE DUH +B46C;B46C;1103 116F;B46C;1103 116F; # (둬; 둬; 둬; 둬; 둬; ) HANGUL SYLLABLE DWEO +B46D;B46D;1103 116F 11A8;B46D;1103 116F 11A8; # (둭; 둭; 둭; 둭; 둭; ) HANGUL SYLLABLE DWEOG +B46E;B46E;1103 116F 11A9;B46E;1103 116F 11A9; # (둮; 둮; 둮; 둮; 둮; ) HANGUL SYLLABLE DWEOGG +B46F;B46F;1103 116F 11AA;B46F;1103 116F 11AA; # (둯; 둯; 둯; 둯; 둯; ) HANGUL SYLLABLE DWEOGS +B470;B470;1103 116F 11AB;B470;1103 116F 11AB; # (둰; 둰; 둰; 둰; 둰; ) HANGUL SYLLABLE DWEON +B471;B471;1103 116F 11AC;B471;1103 116F 11AC; # (둱; 둱; 둱; 둱; 둱; ) HANGUL SYLLABLE DWEONJ +B472;B472;1103 116F 11AD;B472;1103 116F 11AD; # (둲; 둲; 둲; 둲; 둲; ) HANGUL SYLLABLE DWEONH +B473;B473;1103 116F 11AE;B473;1103 116F 11AE; # (둳; 둳; 둳; 둳; 둳; ) HANGUL SYLLABLE DWEOD +B474;B474;1103 116F 11AF;B474;1103 116F 11AF; # (둴; 둴; 둴; 둴; 둴; ) HANGUL SYLLABLE DWEOL +B475;B475;1103 116F 11B0;B475;1103 116F 11B0; # (둵; 둵; 둵; 둵; 둵; ) HANGUL SYLLABLE DWEOLG +B476;B476;1103 116F 11B1;B476;1103 116F 11B1; # (둶; 둶; 둶; 둶; 둶; ) HANGUL SYLLABLE DWEOLM +B477;B477;1103 116F 11B2;B477;1103 116F 11B2; # (둷; 둷; 둷; 둷; 둷; ) HANGUL SYLLABLE DWEOLB +B478;B478;1103 116F 11B3;B478;1103 116F 11B3; # (둸; 둸; 둸; 둸; 둸; ) HANGUL SYLLABLE DWEOLS +B479;B479;1103 116F 11B4;B479;1103 116F 11B4; # (둹; 둹; 둹; 둹; 둹; ) HANGUL SYLLABLE DWEOLT +B47A;B47A;1103 116F 11B5;B47A;1103 116F 11B5; # (둺; 둺; 둺; 둺; 둺; ) HANGUL SYLLABLE DWEOLP +B47B;B47B;1103 116F 11B6;B47B;1103 116F 11B6; # (둻; 둻; 둻; 둻; 둻; ) HANGUL SYLLABLE DWEOLH +B47C;B47C;1103 116F 11B7;B47C;1103 116F 11B7; # (둼; 둼; 둼; 둼; 둼; ) HANGUL SYLLABLE DWEOM +B47D;B47D;1103 116F 11B8;B47D;1103 116F 11B8; # (둽; 둽; 둽; 둽; 둽; ) HANGUL SYLLABLE DWEOB +B47E;B47E;1103 116F 11B9;B47E;1103 116F 11B9; # (둾; 둾; 둾; 둾; 둾; ) HANGUL SYLLABLE DWEOBS +B47F;B47F;1103 116F 11BA;B47F;1103 116F 11BA; # (둿; 둿; 둿; 둿; 둿; ) HANGUL SYLLABLE DWEOS +B480;B480;1103 116F 11BB;B480;1103 116F 11BB; # (뒀; 뒀; 뒀; 뒀; 뒀; ) HANGUL SYLLABLE DWEOSS +B481;B481;1103 116F 11BC;B481;1103 116F 11BC; # (뒁; 뒁; 뒁; 뒁; 뒁; ) HANGUL SYLLABLE DWEONG +B482;B482;1103 116F 11BD;B482;1103 116F 11BD; # (뒂; 뒂; 뒂; 뒂; 뒂; ) HANGUL SYLLABLE DWEOJ +B483;B483;1103 116F 11BE;B483;1103 116F 11BE; # (뒃; 뒃; 뒃; 뒃; 뒃; ) HANGUL SYLLABLE DWEOC +B484;B484;1103 116F 11BF;B484;1103 116F 11BF; # (뒄; 뒄; 뒄; 뒄; 뒄; ) HANGUL SYLLABLE DWEOK +B485;B485;1103 116F 11C0;B485;1103 116F 11C0; # (뒅; 뒅; 뒅; 뒅; 뒅; ) HANGUL SYLLABLE DWEOT +B486;B486;1103 116F 11C1;B486;1103 116F 11C1; # (뒆; 뒆; 뒆; 뒆; 뒆; ) HANGUL SYLLABLE DWEOP +B487;B487;1103 116F 11C2;B487;1103 116F 11C2; # (뒇; 뒇; 뒇; 뒇; 뒇; ) HANGUL SYLLABLE DWEOH +B488;B488;1103 1170;B488;1103 1170; # (뒈; 뒈; 뒈; 뒈; 뒈; ) HANGUL SYLLABLE DWE +B489;B489;1103 1170 11A8;B489;1103 1170 11A8; # (뒉; 뒉; 뒉; 뒉; 뒉; ) HANGUL SYLLABLE DWEG +B48A;B48A;1103 1170 11A9;B48A;1103 1170 11A9; # (뒊; 뒊; 뒊; 뒊; 뒊; ) HANGUL SYLLABLE DWEGG +B48B;B48B;1103 1170 11AA;B48B;1103 1170 11AA; # (뒋; 뒋; 뒋; 뒋; 뒋; ) HANGUL SYLLABLE DWEGS +B48C;B48C;1103 1170 11AB;B48C;1103 1170 11AB; # (뒌; 뒌; 뒌; 뒌; 뒌; ) HANGUL SYLLABLE DWEN +B48D;B48D;1103 1170 11AC;B48D;1103 1170 11AC; # (뒍; 뒍; 뒍; 뒍; 뒍; ) HANGUL SYLLABLE DWENJ +B48E;B48E;1103 1170 11AD;B48E;1103 1170 11AD; # (뒎; 뒎; 뒎; 뒎; 뒎; ) HANGUL SYLLABLE DWENH +B48F;B48F;1103 1170 11AE;B48F;1103 1170 11AE; # (뒏; 뒏; 뒏; 뒏; 뒏; ) HANGUL SYLLABLE DWED +B490;B490;1103 1170 11AF;B490;1103 1170 11AF; # (뒐; 뒐; 뒐; 뒐; 뒐; ) HANGUL SYLLABLE DWEL +B491;B491;1103 1170 11B0;B491;1103 1170 11B0; # (뒑; 뒑; 뒑; 뒑; 뒑; ) HANGUL SYLLABLE DWELG +B492;B492;1103 1170 11B1;B492;1103 1170 11B1; # (뒒; 뒒; 뒒; 뒒; 뒒; ) HANGUL SYLLABLE DWELM +B493;B493;1103 1170 11B2;B493;1103 1170 11B2; # (뒓; 뒓; 뒓; 뒓; 뒓; ) HANGUL SYLLABLE DWELB +B494;B494;1103 1170 11B3;B494;1103 1170 11B3; # (뒔; 뒔; 뒔; 뒔; 뒔; ) HANGUL SYLLABLE DWELS +B495;B495;1103 1170 11B4;B495;1103 1170 11B4; # (뒕; 뒕; 뒕; 뒕; 뒕; ) HANGUL SYLLABLE DWELT +B496;B496;1103 1170 11B5;B496;1103 1170 11B5; # (뒖; 뒖; 뒖; 뒖; 뒖; ) HANGUL SYLLABLE DWELP +B497;B497;1103 1170 11B6;B497;1103 1170 11B6; # (뒗; 뒗; 뒗; 뒗; 뒗; ) HANGUL SYLLABLE DWELH +B498;B498;1103 1170 11B7;B498;1103 1170 11B7; # (뒘; 뒘; 뒘; 뒘; 뒘; ) HANGUL SYLLABLE DWEM +B499;B499;1103 1170 11B8;B499;1103 1170 11B8; # (뒙; 뒙; 뒙; 뒙; 뒙; ) HANGUL SYLLABLE DWEB +B49A;B49A;1103 1170 11B9;B49A;1103 1170 11B9; # (뒚; 뒚; 뒚; 뒚; 뒚; ) HANGUL SYLLABLE DWEBS +B49B;B49B;1103 1170 11BA;B49B;1103 1170 11BA; # (뒛; 뒛; 뒛; 뒛; 뒛; ) HANGUL SYLLABLE DWES +B49C;B49C;1103 1170 11BB;B49C;1103 1170 11BB; # (뒜; 뒜; 뒜; 뒜; 뒜; ) HANGUL SYLLABLE DWESS +B49D;B49D;1103 1170 11BC;B49D;1103 1170 11BC; # (뒝; 뒝; 뒝; 뒝; 뒝; ) HANGUL SYLLABLE DWENG +B49E;B49E;1103 1170 11BD;B49E;1103 1170 11BD; # (뒞; 뒞; 뒞; 뒞; 뒞; ) HANGUL SYLLABLE DWEJ +B49F;B49F;1103 1170 11BE;B49F;1103 1170 11BE; # (뒟; 뒟; 뒟; 뒟; 뒟; ) HANGUL SYLLABLE DWEC +B4A0;B4A0;1103 1170 11BF;B4A0;1103 1170 11BF; # (뒠; 뒠; 뒠; 뒠; 뒠; ) HANGUL SYLLABLE DWEK +B4A1;B4A1;1103 1170 11C0;B4A1;1103 1170 11C0; # (뒡; 뒡; 뒡; 뒡; 뒡; ) HANGUL SYLLABLE DWET +B4A2;B4A2;1103 1170 11C1;B4A2;1103 1170 11C1; # (뒢; 뒢; 뒢; 뒢; 뒢; ) HANGUL SYLLABLE DWEP +B4A3;B4A3;1103 1170 11C2;B4A3;1103 1170 11C2; # (뒣; 뒣; 뒣; 뒣; 뒣; ) HANGUL SYLLABLE DWEH +B4A4;B4A4;1103 1171;B4A4;1103 1171; # (뒤; 뒤; 뒤; 뒤; 뒤; ) HANGUL SYLLABLE DWI +B4A5;B4A5;1103 1171 11A8;B4A5;1103 1171 11A8; # (뒥; 뒥; 뒥; 뒥; 뒥; ) HANGUL SYLLABLE DWIG +B4A6;B4A6;1103 1171 11A9;B4A6;1103 1171 11A9; # (뒦; 뒦; 뒦; 뒦; 뒦; ) HANGUL SYLLABLE DWIGG +B4A7;B4A7;1103 1171 11AA;B4A7;1103 1171 11AA; # (뒧; 뒧; 뒧; 뒧; 뒧; ) HANGUL SYLLABLE DWIGS +B4A8;B4A8;1103 1171 11AB;B4A8;1103 1171 11AB; # (뒨; 뒨; 뒨; 뒨; 뒨; ) HANGUL SYLLABLE DWIN +B4A9;B4A9;1103 1171 11AC;B4A9;1103 1171 11AC; # (뒩; 뒩; 뒩; 뒩; 뒩; ) HANGUL SYLLABLE DWINJ +B4AA;B4AA;1103 1171 11AD;B4AA;1103 1171 11AD; # (뒪; 뒪; 뒪; 뒪; 뒪; ) HANGUL SYLLABLE DWINH +B4AB;B4AB;1103 1171 11AE;B4AB;1103 1171 11AE; # (뒫; 뒫; 뒫; 뒫; 뒫; ) HANGUL SYLLABLE DWID +B4AC;B4AC;1103 1171 11AF;B4AC;1103 1171 11AF; # (뒬; 뒬; 뒬; 뒬; 뒬; ) HANGUL SYLLABLE DWIL +B4AD;B4AD;1103 1171 11B0;B4AD;1103 1171 11B0; # (뒭; 뒭; 뒭; 뒭; 뒭; ) HANGUL SYLLABLE DWILG +B4AE;B4AE;1103 1171 11B1;B4AE;1103 1171 11B1; # (뒮; 뒮; 뒮; 뒮; 뒮; ) HANGUL SYLLABLE DWILM +B4AF;B4AF;1103 1171 11B2;B4AF;1103 1171 11B2; # (뒯; 뒯; 뒯; 뒯; 뒯; ) HANGUL SYLLABLE DWILB +B4B0;B4B0;1103 1171 11B3;B4B0;1103 1171 11B3; # (뒰; 뒰; 뒰; 뒰; 뒰; ) HANGUL SYLLABLE DWILS +B4B1;B4B1;1103 1171 11B4;B4B1;1103 1171 11B4; # (뒱; 뒱; 뒱; 뒱; 뒱; ) HANGUL SYLLABLE DWILT +B4B2;B4B2;1103 1171 11B5;B4B2;1103 1171 11B5; # (뒲; 뒲; 뒲; 뒲; 뒲; ) HANGUL SYLLABLE DWILP +B4B3;B4B3;1103 1171 11B6;B4B3;1103 1171 11B6; # (뒳; 뒳; 뒳; 뒳; 뒳; ) HANGUL SYLLABLE DWILH +B4B4;B4B4;1103 1171 11B7;B4B4;1103 1171 11B7; # (뒴; 뒴; 뒴; 뒴; 뒴; ) HANGUL SYLLABLE DWIM +B4B5;B4B5;1103 1171 11B8;B4B5;1103 1171 11B8; # (뒵; 뒵; 뒵; 뒵; 뒵; ) HANGUL SYLLABLE DWIB +B4B6;B4B6;1103 1171 11B9;B4B6;1103 1171 11B9; # (뒶; 뒶; 뒶; 뒶; 뒶; ) HANGUL SYLLABLE DWIBS +B4B7;B4B7;1103 1171 11BA;B4B7;1103 1171 11BA; # (뒷; 뒷; 뒷; 뒷; 뒷; ) HANGUL SYLLABLE DWIS +B4B8;B4B8;1103 1171 11BB;B4B8;1103 1171 11BB; # (뒸; 뒸; 뒸; 뒸; 뒸; ) HANGUL SYLLABLE DWISS +B4B9;B4B9;1103 1171 11BC;B4B9;1103 1171 11BC; # (뒹; 뒹; 뒹; 뒹; 뒹; ) HANGUL SYLLABLE DWING +B4BA;B4BA;1103 1171 11BD;B4BA;1103 1171 11BD; # (뒺; 뒺; 뒺; 뒺; 뒺; ) HANGUL SYLLABLE DWIJ +B4BB;B4BB;1103 1171 11BE;B4BB;1103 1171 11BE; # (뒻; 뒻; 뒻; 뒻; 뒻; ) HANGUL SYLLABLE DWIC +B4BC;B4BC;1103 1171 11BF;B4BC;1103 1171 11BF; # (뒼; 뒼; 뒼; 뒼; 뒼; ) HANGUL SYLLABLE DWIK +B4BD;B4BD;1103 1171 11C0;B4BD;1103 1171 11C0; # (뒽; 뒽; 뒽; 뒽; 뒽; ) HANGUL SYLLABLE DWIT +B4BE;B4BE;1103 1171 11C1;B4BE;1103 1171 11C1; # (뒾; 뒾; 뒾; 뒾; 뒾; ) HANGUL SYLLABLE DWIP +B4BF;B4BF;1103 1171 11C2;B4BF;1103 1171 11C2; # (뒿; 뒿; 뒿; 뒿; 뒿; ) HANGUL SYLLABLE DWIH +B4C0;B4C0;1103 1172;B4C0;1103 1172; # (듀; 듀; 듀; 듀; 듀; ) HANGUL SYLLABLE DYU +B4C1;B4C1;1103 1172 11A8;B4C1;1103 1172 11A8; # (듁; 듁; 듁; 듁; 듁; ) HANGUL SYLLABLE DYUG +B4C2;B4C2;1103 1172 11A9;B4C2;1103 1172 11A9; # (듂; 듂; 듂; 듂; 듂; ) HANGUL SYLLABLE DYUGG +B4C3;B4C3;1103 1172 11AA;B4C3;1103 1172 11AA; # (듃; 듃; 듃; 듃; 듃; ) HANGUL SYLLABLE DYUGS +B4C4;B4C4;1103 1172 11AB;B4C4;1103 1172 11AB; # (듄; 듄; 듄; 듄; 듄; ) HANGUL SYLLABLE DYUN +B4C5;B4C5;1103 1172 11AC;B4C5;1103 1172 11AC; # (듅; 듅; 듅; 듅; 듅; ) HANGUL SYLLABLE DYUNJ +B4C6;B4C6;1103 1172 11AD;B4C6;1103 1172 11AD; # (듆; 듆; 듆; 듆; 듆; ) HANGUL SYLLABLE DYUNH +B4C7;B4C7;1103 1172 11AE;B4C7;1103 1172 11AE; # (듇; 듇; 듇; 듇; 듇; ) HANGUL SYLLABLE DYUD +B4C8;B4C8;1103 1172 11AF;B4C8;1103 1172 11AF; # (듈; 듈; 듈; 듈; 듈; ) HANGUL SYLLABLE DYUL +B4C9;B4C9;1103 1172 11B0;B4C9;1103 1172 11B0; # (듉; 듉; 듉; 듉; 듉; ) HANGUL SYLLABLE DYULG +B4CA;B4CA;1103 1172 11B1;B4CA;1103 1172 11B1; # (듊; 듊; 듊; 듊; 듊; ) HANGUL SYLLABLE DYULM +B4CB;B4CB;1103 1172 11B2;B4CB;1103 1172 11B2; # (듋; 듋; 듋; 듋; 듋; ) HANGUL SYLLABLE DYULB +B4CC;B4CC;1103 1172 11B3;B4CC;1103 1172 11B3; # (듌; 듌; 듌; 듌; 듌; ) HANGUL SYLLABLE DYULS +B4CD;B4CD;1103 1172 11B4;B4CD;1103 1172 11B4; # (듍; 듍; 듍; 듍; 듍; ) HANGUL SYLLABLE DYULT +B4CE;B4CE;1103 1172 11B5;B4CE;1103 1172 11B5; # (듎; 듎; 듎; 듎; 듎; ) HANGUL SYLLABLE DYULP +B4CF;B4CF;1103 1172 11B6;B4CF;1103 1172 11B6; # (듏; 듏; 듏; 듏; 듏; ) HANGUL SYLLABLE DYULH +B4D0;B4D0;1103 1172 11B7;B4D0;1103 1172 11B7; # (듐; 듐; 듐; 듐; 듐; ) HANGUL SYLLABLE DYUM +B4D1;B4D1;1103 1172 11B8;B4D1;1103 1172 11B8; # (듑; 듑; 듑; 듑; 듑; ) HANGUL SYLLABLE DYUB +B4D2;B4D2;1103 1172 11B9;B4D2;1103 1172 11B9; # (듒; 듒; 듒; 듒; 듒; ) HANGUL SYLLABLE DYUBS +B4D3;B4D3;1103 1172 11BA;B4D3;1103 1172 11BA; # (듓; 듓; 듓; 듓; 듓; ) HANGUL SYLLABLE DYUS +B4D4;B4D4;1103 1172 11BB;B4D4;1103 1172 11BB; # (듔; 듔; 듔; 듔; 듔; ) HANGUL SYLLABLE DYUSS +B4D5;B4D5;1103 1172 11BC;B4D5;1103 1172 11BC; # (듕; 듕; 듕; 듕; 듕; ) HANGUL SYLLABLE DYUNG +B4D6;B4D6;1103 1172 11BD;B4D6;1103 1172 11BD; # (듖; 듖; 듖; 듖; 듖; ) HANGUL SYLLABLE DYUJ +B4D7;B4D7;1103 1172 11BE;B4D7;1103 1172 11BE; # (듗; 듗; 듗; 듗; 듗; ) HANGUL SYLLABLE DYUC +B4D8;B4D8;1103 1172 11BF;B4D8;1103 1172 11BF; # (듘; 듘; 듘; 듘; 듘; ) HANGUL SYLLABLE DYUK +B4D9;B4D9;1103 1172 11C0;B4D9;1103 1172 11C0; # (듙; 듙; 듙; 듙; 듙; ) HANGUL SYLLABLE DYUT +B4DA;B4DA;1103 1172 11C1;B4DA;1103 1172 11C1; # (듚; 듚; 듚; 듚; 듚; ) HANGUL SYLLABLE DYUP +B4DB;B4DB;1103 1172 11C2;B4DB;1103 1172 11C2; # (듛; 듛; 듛; 듛; 듛; ) HANGUL SYLLABLE DYUH +B4DC;B4DC;1103 1173;B4DC;1103 1173; # (드; 드; 드; 드; 드; ) HANGUL SYLLABLE DEU +B4DD;B4DD;1103 1173 11A8;B4DD;1103 1173 11A8; # (득; 득; 득; 득; 득; ) HANGUL SYLLABLE DEUG +B4DE;B4DE;1103 1173 11A9;B4DE;1103 1173 11A9; # (듞; 듞; 듞; 듞; 듞; ) HANGUL SYLLABLE DEUGG +B4DF;B4DF;1103 1173 11AA;B4DF;1103 1173 11AA; # (듟; 듟; 듟; 듟; 듟; ) HANGUL SYLLABLE DEUGS +B4E0;B4E0;1103 1173 11AB;B4E0;1103 1173 11AB; # (든; 든; 든; 든; 든; ) HANGUL SYLLABLE DEUN +B4E1;B4E1;1103 1173 11AC;B4E1;1103 1173 11AC; # (듡; 듡; 듡; 듡; 듡; ) HANGUL SYLLABLE DEUNJ +B4E2;B4E2;1103 1173 11AD;B4E2;1103 1173 11AD; # (듢; 듢; 듢; 듢; 듢; ) HANGUL SYLLABLE DEUNH +B4E3;B4E3;1103 1173 11AE;B4E3;1103 1173 11AE; # (듣; 듣; 듣; 듣; 듣; ) HANGUL SYLLABLE DEUD +B4E4;B4E4;1103 1173 11AF;B4E4;1103 1173 11AF; # (들; 들; 들; 들; 들; ) HANGUL SYLLABLE DEUL +B4E5;B4E5;1103 1173 11B0;B4E5;1103 1173 11B0; # (듥; 듥; 듥; 듥; 듥; ) HANGUL SYLLABLE DEULG +B4E6;B4E6;1103 1173 11B1;B4E6;1103 1173 11B1; # (듦; 듦; 듦; 듦; 듦; ) HANGUL SYLLABLE DEULM +B4E7;B4E7;1103 1173 11B2;B4E7;1103 1173 11B2; # (듧; 듧; 듧; 듧; 듧; ) HANGUL SYLLABLE DEULB +B4E8;B4E8;1103 1173 11B3;B4E8;1103 1173 11B3; # (듨; 듨; 듨; 듨; 듨; ) HANGUL SYLLABLE DEULS +B4E9;B4E9;1103 1173 11B4;B4E9;1103 1173 11B4; # (듩; 듩; 듩; 듩; 듩; ) HANGUL SYLLABLE DEULT +B4EA;B4EA;1103 1173 11B5;B4EA;1103 1173 11B5; # (듪; 듪; 듪; 듪; 듪; ) HANGUL SYLLABLE DEULP +B4EB;B4EB;1103 1173 11B6;B4EB;1103 1173 11B6; # (듫; 듫; 듫; 듫; 듫; ) HANGUL SYLLABLE DEULH +B4EC;B4EC;1103 1173 11B7;B4EC;1103 1173 11B7; # (듬; 듬; 듬; 듬; 듬; ) HANGUL SYLLABLE DEUM +B4ED;B4ED;1103 1173 11B8;B4ED;1103 1173 11B8; # (듭; 듭; 듭; 듭; 듭; ) HANGUL SYLLABLE DEUB +B4EE;B4EE;1103 1173 11B9;B4EE;1103 1173 11B9; # (듮; 듮; 듮; 듮; 듮; ) HANGUL SYLLABLE DEUBS +B4EF;B4EF;1103 1173 11BA;B4EF;1103 1173 11BA; # (듯; 듯; 듯; 듯; 듯; ) HANGUL SYLLABLE DEUS +B4F0;B4F0;1103 1173 11BB;B4F0;1103 1173 11BB; # (듰; 듰; 듰; 듰; 듰; ) HANGUL SYLLABLE DEUSS +B4F1;B4F1;1103 1173 11BC;B4F1;1103 1173 11BC; # (등; 등; 등; 등; 등; ) HANGUL SYLLABLE DEUNG +B4F2;B4F2;1103 1173 11BD;B4F2;1103 1173 11BD; # (듲; 듲; 듲; 듲; 듲; ) HANGUL SYLLABLE DEUJ +B4F3;B4F3;1103 1173 11BE;B4F3;1103 1173 11BE; # (듳; 듳; 듳; 듳; 듳; ) HANGUL SYLLABLE DEUC +B4F4;B4F4;1103 1173 11BF;B4F4;1103 1173 11BF; # (듴; 듴; 듴; 듴; 듴; ) HANGUL SYLLABLE DEUK +B4F5;B4F5;1103 1173 11C0;B4F5;1103 1173 11C0; # (듵; 듵; 듵; 듵; 듵; ) HANGUL SYLLABLE DEUT +B4F6;B4F6;1103 1173 11C1;B4F6;1103 1173 11C1; # (듶; 듶; 듶; 듶; 듶; ) HANGUL SYLLABLE DEUP +B4F7;B4F7;1103 1173 11C2;B4F7;1103 1173 11C2; # (듷; 듷; 듷; 듷; 듷; ) HANGUL SYLLABLE DEUH +B4F8;B4F8;1103 1174;B4F8;1103 1174; # (듸; 듸; 듸; 듸; 듸; ) HANGUL SYLLABLE DYI +B4F9;B4F9;1103 1174 11A8;B4F9;1103 1174 11A8; # (듹; 듹; 듹; 듹; 듹; ) HANGUL SYLLABLE DYIG +B4FA;B4FA;1103 1174 11A9;B4FA;1103 1174 11A9; # (듺; 듺; 듺; 듺; 듺; ) HANGUL SYLLABLE DYIGG +B4FB;B4FB;1103 1174 11AA;B4FB;1103 1174 11AA; # (듻; 듻; 듻; 듻; 듻; ) HANGUL SYLLABLE DYIGS +B4FC;B4FC;1103 1174 11AB;B4FC;1103 1174 11AB; # (듼; 듼; 듼; 듼; 듼; ) HANGUL SYLLABLE DYIN +B4FD;B4FD;1103 1174 11AC;B4FD;1103 1174 11AC; # (듽; 듽; 듽; 듽; 듽; ) HANGUL SYLLABLE DYINJ +B4FE;B4FE;1103 1174 11AD;B4FE;1103 1174 11AD; # (듾; 듾; 듾; 듾; 듾; ) HANGUL SYLLABLE DYINH +B4FF;B4FF;1103 1174 11AE;B4FF;1103 1174 11AE; # (듿; 듿; 듿; 듿; 듿; ) HANGUL SYLLABLE DYID +B500;B500;1103 1174 11AF;B500;1103 1174 11AF; # (딀; 딀; 딀; 딀; 딀; ) HANGUL SYLLABLE DYIL +B501;B501;1103 1174 11B0;B501;1103 1174 11B0; # (딁; 딁; 딁; 딁; 딁; ) HANGUL SYLLABLE DYILG +B502;B502;1103 1174 11B1;B502;1103 1174 11B1; # (딂; 딂; 딂; 딂; 딂; ) HANGUL SYLLABLE DYILM +B503;B503;1103 1174 11B2;B503;1103 1174 11B2; # (딃; 딃; 딃; 딃; 딃; ) HANGUL SYLLABLE DYILB +B504;B504;1103 1174 11B3;B504;1103 1174 11B3; # (딄; 딄; 딄; 딄; 딄; ) HANGUL SYLLABLE DYILS +B505;B505;1103 1174 11B4;B505;1103 1174 11B4; # (딅; 딅; 딅; 딅; 딅; ) HANGUL SYLLABLE DYILT +B506;B506;1103 1174 11B5;B506;1103 1174 11B5; # (딆; 딆; 딆; 딆; 딆; ) HANGUL SYLLABLE DYILP +B507;B507;1103 1174 11B6;B507;1103 1174 11B6; # (딇; 딇; 딇; 딇; 딇; ) HANGUL SYLLABLE DYILH +B508;B508;1103 1174 11B7;B508;1103 1174 11B7; # (딈; 딈; 딈; 딈; 딈; ) HANGUL SYLLABLE DYIM +B509;B509;1103 1174 11B8;B509;1103 1174 11B8; # (딉; 딉; 딉; 딉; 딉; ) HANGUL SYLLABLE DYIB +B50A;B50A;1103 1174 11B9;B50A;1103 1174 11B9; # (딊; 딊; 딊; 딊; 딊; ) HANGUL SYLLABLE DYIBS +B50B;B50B;1103 1174 11BA;B50B;1103 1174 11BA; # (딋; 딋; 딋; 딋; 딋; ) HANGUL SYLLABLE DYIS +B50C;B50C;1103 1174 11BB;B50C;1103 1174 11BB; # (딌; 딌; 딌; 딌; 딌; ) HANGUL SYLLABLE DYISS +B50D;B50D;1103 1174 11BC;B50D;1103 1174 11BC; # (딍; 딍; 딍; 딍; 딍; ) HANGUL SYLLABLE DYING +B50E;B50E;1103 1174 11BD;B50E;1103 1174 11BD; # (딎; 딎; 딎; 딎; 딎; ) HANGUL SYLLABLE DYIJ +B50F;B50F;1103 1174 11BE;B50F;1103 1174 11BE; # (딏; 딏; 딏; 딏; 딏; ) HANGUL SYLLABLE DYIC +B510;B510;1103 1174 11BF;B510;1103 1174 11BF; # (딐; 딐; 딐; 딐; 딐; ) HANGUL SYLLABLE DYIK +B511;B511;1103 1174 11C0;B511;1103 1174 11C0; # (딑; 딑; 딑; 딑; 딑; ) HANGUL SYLLABLE DYIT +B512;B512;1103 1174 11C1;B512;1103 1174 11C1; # (딒; 딒; 딒; 딒; 딒; ) HANGUL SYLLABLE DYIP +B513;B513;1103 1174 11C2;B513;1103 1174 11C2; # (딓; 딓; 딓; 딓; 딓; ) HANGUL SYLLABLE DYIH +B514;B514;1103 1175;B514;1103 1175; # (디; 디; 디; 디; 디; ) HANGUL SYLLABLE DI +B515;B515;1103 1175 11A8;B515;1103 1175 11A8; # (딕; 딕; 딕; 딕; 딕; ) HANGUL SYLLABLE DIG +B516;B516;1103 1175 11A9;B516;1103 1175 11A9; # (딖; 딖; 딖; 딖; 딖; ) HANGUL SYLLABLE DIGG +B517;B517;1103 1175 11AA;B517;1103 1175 11AA; # (딗; 딗; 딗; 딗; 딗; ) HANGUL SYLLABLE DIGS +B518;B518;1103 1175 11AB;B518;1103 1175 11AB; # (딘; 딘; 딘; 딘; 딘; ) HANGUL SYLLABLE DIN +B519;B519;1103 1175 11AC;B519;1103 1175 11AC; # (딙; 딙; 딙; 딙; 딙; ) HANGUL SYLLABLE DINJ +B51A;B51A;1103 1175 11AD;B51A;1103 1175 11AD; # (딚; 딚; 딚; 딚; 딚; ) HANGUL SYLLABLE DINH +B51B;B51B;1103 1175 11AE;B51B;1103 1175 11AE; # (딛; 딛; 딛; 딛; 딛; ) HANGUL SYLLABLE DID +B51C;B51C;1103 1175 11AF;B51C;1103 1175 11AF; # (딜; 딜; 딜; 딜; 딜; ) HANGUL SYLLABLE DIL +B51D;B51D;1103 1175 11B0;B51D;1103 1175 11B0; # (딝; 딝; 딝; 딝; 딝; ) HANGUL SYLLABLE DILG +B51E;B51E;1103 1175 11B1;B51E;1103 1175 11B1; # (딞; 딞; 딞; 딞; 딞; ) HANGUL SYLLABLE DILM +B51F;B51F;1103 1175 11B2;B51F;1103 1175 11B2; # (딟; 딟; 딟; 딟; 딟; ) HANGUL SYLLABLE DILB +B520;B520;1103 1175 11B3;B520;1103 1175 11B3; # (딠; 딠; 딠; 딠; 딠; ) HANGUL SYLLABLE DILS +B521;B521;1103 1175 11B4;B521;1103 1175 11B4; # (딡; 딡; 딡; 딡; 딡; ) HANGUL SYLLABLE DILT +B522;B522;1103 1175 11B5;B522;1103 1175 11B5; # (딢; 딢; 딢; 딢; 딢; ) HANGUL SYLLABLE DILP +B523;B523;1103 1175 11B6;B523;1103 1175 11B6; # (딣; 딣; 딣; 딣; 딣; ) HANGUL SYLLABLE DILH +B524;B524;1103 1175 11B7;B524;1103 1175 11B7; # (딤; 딤; 딤; 딤; 딤; ) HANGUL SYLLABLE DIM +B525;B525;1103 1175 11B8;B525;1103 1175 11B8; # (딥; 딥; 딥; 딥; 딥; ) HANGUL SYLLABLE DIB +B526;B526;1103 1175 11B9;B526;1103 1175 11B9; # (딦; 딦; 딦; 딦; 딦; ) HANGUL SYLLABLE DIBS +B527;B527;1103 1175 11BA;B527;1103 1175 11BA; # (딧; 딧; 딧; 딧; 딧; ) HANGUL SYLLABLE DIS +B528;B528;1103 1175 11BB;B528;1103 1175 11BB; # (딨; 딨; 딨; 딨; 딨; ) HANGUL SYLLABLE DISS +B529;B529;1103 1175 11BC;B529;1103 1175 11BC; # (딩; 딩; 딩; 딩; 딩; ) HANGUL SYLLABLE DING +B52A;B52A;1103 1175 11BD;B52A;1103 1175 11BD; # (딪; 딪; 딪; 딪; 딪; ) HANGUL SYLLABLE DIJ +B52B;B52B;1103 1175 11BE;B52B;1103 1175 11BE; # (딫; 딫; 딫; 딫; 딫; ) HANGUL SYLLABLE DIC +B52C;B52C;1103 1175 11BF;B52C;1103 1175 11BF; # (딬; 딬; 딬; 딬; 딬; ) HANGUL SYLLABLE DIK +B52D;B52D;1103 1175 11C0;B52D;1103 1175 11C0; # (딭; 딭; 딭; 딭; 딭; ) HANGUL SYLLABLE DIT +B52E;B52E;1103 1175 11C1;B52E;1103 1175 11C1; # (딮; 딮; 딮; 딮; 딮; ) HANGUL SYLLABLE DIP +B52F;B52F;1103 1175 11C2;B52F;1103 1175 11C2; # (딯; 딯; 딯; 딯; 딯; ) HANGUL SYLLABLE DIH +B530;B530;1104 1161;B530;1104 1161; # (따; 따; 따; 따; 따; ) HANGUL SYLLABLE DDA +B531;B531;1104 1161 11A8;B531;1104 1161 11A8; # (딱; 딱; 딱; 딱; 딱; ) HANGUL SYLLABLE DDAG +B532;B532;1104 1161 11A9;B532;1104 1161 11A9; # (딲; 딲; 딲; 딲; 딲; ) HANGUL SYLLABLE DDAGG +B533;B533;1104 1161 11AA;B533;1104 1161 11AA; # (딳; 딳; 딳; 딳; 딳; ) HANGUL SYLLABLE DDAGS +B534;B534;1104 1161 11AB;B534;1104 1161 11AB; # (딴; 딴; 딴; 딴; 딴; ) HANGUL SYLLABLE DDAN +B535;B535;1104 1161 11AC;B535;1104 1161 11AC; # (딵; 딵; 딵; 딵; 딵; ) HANGUL SYLLABLE DDANJ +B536;B536;1104 1161 11AD;B536;1104 1161 11AD; # (딶; 딶; 딶; 딶; 딶; ) HANGUL SYLLABLE DDANH +B537;B537;1104 1161 11AE;B537;1104 1161 11AE; # (딷; 딷; 딷; 딷; 딷; ) HANGUL SYLLABLE DDAD +B538;B538;1104 1161 11AF;B538;1104 1161 11AF; # (딸; 딸; 딸; 딸; 딸; ) HANGUL SYLLABLE DDAL +B539;B539;1104 1161 11B0;B539;1104 1161 11B0; # (딹; 딹; 딹; 딹; 딹; ) HANGUL SYLLABLE DDALG +B53A;B53A;1104 1161 11B1;B53A;1104 1161 11B1; # (딺; 딺; 딺; 딺; 딺; ) HANGUL SYLLABLE DDALM +B53B;B53B;1104 1161 11B2;B53B;1104 1161 11B2; # (딻; 딻; 딻; 딻; 딻; ) HANGUL SYLLABLE DDALB +B53C;B53C;1104 1161 11B3;B53C;1104 1161 11B3; # (딼; 딼; 딼; 딼; 딼; ) HANGUL SYLLABLE DDALS +B53D;B53D;1104 1161 11B4;B53D;1104 1161 11B4; # (딽; 딽; 딽; 딽; 딽; ) HANGUL SYLLABLE DDALT +B53E;B53E;1104 1161 11B5;B53E;1104 1161 11B5; # (딾; 딾; 딾; 딾; 딾; ) HANGUL SYLLABLE DDALP +B53F;B53F;1104 1161 11B6;B53F;1104 1161 11B6; # (딿; 딿; 딿; 딿; 딿; ) HANGUL SYLLABLE DDALH +B540;B540;1104 1161 11B7;B540;1104 1161 11B7; # (땀; 땀; 땀; 땀; 땀; ) HANGUL SYLLABLE DDAM +B541;B541;1104 1161 11B8;B541;1104 1161 11B8; # (땁; 땁; 땁; 땁; 땁; ) HANGUL SYLLABLE DDAB +B542;B542;1104 1161 11B9;B542;1104 1161 11B9; # (땂; 땂; 땂; 땂; 땂; ) HANGUL SYLLABLE DDABS +B543;B543;1104 1161 11BA;B543;1104 1161 11BA; # (땃; 땃; 땃; 땃; 땃; ) HANGUL SYLLABLE DDAS +B544;B544;1104 1161 11BB;B544;1104 1161 11BB; # (땄; 땄; 땄; 땄; 땄; ) HANGUL SYLLABLE DDASS +B545;B545;1104 1161 11BC;B545;1104 1161 11BC; # (땅; 땅; 땅; 땅; 땅; ) HANGUL SYLLABLE DDANG +B546;B546;1104 1161 11BD;B546;1104 1161 11BD; # (땆; 땆; 땆; 땆; 땆; ) HANGUL SYLLABLE DDAJ +B547;B547;1104 1161 11BE;B547;1104 1161 11BE; # (땇; 땇; 땇; 땇; 땇; ) HANGUL SYLLABLE DDAC +B548;B548;1104 1161 11BF;B548;1104 1161 11BF; # (땈; 땈; 땈; 땈; 땈; ) HANGUL SYLLABLE DDAK +B549;B549;1104 1161 11C0;B549;1104 1161 11C0; # (땉; 땉; 땉; 땉; 땉; ) HANGUL SYLLABLE DDAT +B54A;B54A;1104 1161 11C1;B54A;1104 1161 11C1; # (땊; 땊; 땊; 땊; 땊; ) HANGUL SYLLABLE DDAP +B54B;B54B;1104 1161 11C2;B54B;1104 1161 11C2; # (땋; 땋; 땋; 땋; 땋; ) HANGUL SYLLABLE DDAH +B54C;B54C;1104 1162;B54C;1104 1162; # (때; 때; 때; 때; 때; ) HANGUL SYLLABLE DDAE +B54D;B54D;1104 1162 11A8;B54D;1104 1162 11A8; # (땍; 땍; 땍; 땍; 땍; ) HANGUL SYLLABLE DDAEG +B54E;B54E;1104 1162 11A9;B54E;1104 1162 11A9; # (땎; 땎; 땎; 땎; 땎; ) HANGUL SYLLABLE DDAEGG +B54F;B54F;1104 1162 11AA;B54F;1104 1162 11AA; # (땏; 땏; 땏; 땏; 땏; ) HANGUL SYLLABLE DDAEGS +B550;B550;1104 1162 11AB;B550;1104 1162 11AB; # (땐; 땐; 땐; 땐; 땐; ) HANGUL SYLLABLE DDAEN +B551;B551;1104 1162 11AC;B551;1104 1162 11AC; # (땑; 땑; 땑; 땑; 땑; ) HANGUL SYLLABLE DDAENJ +B552;B552;1104 1162 11AD;B552;1104 1162 11AD; # (땒; 땒; 땒; 땒; 땒; ) HANGUL SYLLABLE DDAENH +B553;B553;1104 1162 11AE;B553;1104 1162 11AE; # (땓; 땓; 땓; 땓; 땓; ) HANGUL SYLLABLE DDAED +B554;B554;1104 1162 11AF;B554;1104 1162 11AF; # (땔; 땔; 땔; 땔; 땔; ) HANGUL SYLLABLE DDAEL +B555;B555;1104 1162 11B0;B555;1104 1162 11B0; # (땕; 땕; 땕; 땕; 땕; ) HANGUL SYLLABLE DDAELG +B556;B556;1104 1162 11B1;B556;1104 1162 11B1; # (땖; 땖; 땖; 땖; 땖; ) HANGUL SYLLABLE DDAELM +B557;B557;1104 1162 11B2;B557;1104 1162 11B2; # (땗; 땗; 땗; 땗; 땗; ) HANGUL SYLLABLE DDAELB +B558;B558;1104 1162 11B3;B558;1104 1162 11B3; # (땘; 땘; 땘; 땘; 땘; ) HANGUL SYLLABLE DDAELS +B559;B559;1104 1162 11B4;B559;1104 1162 11B4; # (땙; 땙; 땙; 땙; 땙; ) HANGUL SYLLABLE DDAELT +B55A;B55A;1104 1162 11B5;B55A;1104 1162 11B5; # (땚; 땚; 땚; 땚; 땚; ) HANGUL SYLLABLE DDAELP +B55B;B55B;1104 1162 11B6;B55B;1104 1162 11B6; # (땛; 땛; 땛; 땛; 땛; ) HANGUL SYLLABLE DDAELH +B55C;B55C;1104 1162 11B7;B55C;1104 1162 11B7; # (땜; 땜; 땜; 땜; 땜; ) HANGUL SYLLABLE DDAEM +B55D;B55D;1104 1162 11B8;B55D;1104 1162 11B8; # (땝; 땝; 땝; 땝; 땝; ) HANGUL SYLLABLE DDAEB +B55E;B55E;1104 1162 11B9;B55E;1104 1162 11B9; # (땞; 땞; 땞; 땞; 땞; ) HANGUL SYLLABLE DDAEBS +B55F;B55F;1104 1162 11BA;B55F;1104 1162 11BA; # (땟; 땟; 땟; 땟; 땟; ) HANGUL SYLLABLE DDAES +B560;B560;1104 1162 11BB;B560;1104 1162 11BB; # (땠; 땠; 땠; 땠; 땠; ) HANGUL SYLLABLE DDAESS +B561;B561;1104 1162 11BC;B561;1104 1162 11BC; # (땡; 땡; 땡; 땡; 땡; ) HANGUL SYLLABLE DDAENG +B562;B562;1104 1162 11BD;B562;1104 1162 11BD; # (땢; 땢; 땢; 땢; 땢; ) HANGUL SYLLABLE DDAEJ +B563;B563;1104 1162 11BE;B563;1104 1162 11BE; # (땣; 땣; 땣; 땣; 땣; ) HANGUL SYLLABLE DDAEC +B564;B564;1104 1162 11BF;B564;1104 1162 11BF; # (땤; 땤; 땤; 땤; 땤; ) HANGUL SYLLABLE DDAEK +B565;B565;1104 1162 11C0;B565;1104 1162 11C0; # (땥; 땥; 땥; 땥; 땥; ) HANGUL SYLLABLE DDAET +B566;B566;1104 1162 11C1;B566;1104 1162 11C1; # (땦; 땦; 땦; 땦; 땦; ) HANGUL SYLLABLE DDAEP +B567;B567;1104 1162 11C2;B567;1104 1162 11C2; # (땧; 땧; 땧; 땧; 땧; ) HANGUL SYLLABLE DDAEH +B568;B568;1104 1163;B568;1104 1163; # (땨; 땨; 땨; 땨; 땨; ) HANGUL SYLLABLE DDYA +B569;B569;1104 1163 11A8;B569;1104 1163 11A8; # (땩; 땩; 땩; 땩; 땩; ) HANGUL SYLLABLE DDYAG +B56A;B56A;1104 1163 11A9;B56A;1104 1163 11A9; # (땪; 땪; 땪; 땪; 땪; ) HANGUL SYLLABLE DDYAGG +B56B;B56B;1104 1163 11AA;B56B;1104 1163 11AA; # (땫; 땫; 땫; 땫; 땫; ) HANGUL SYLLABLE DDYAGS +B56C;B56C;1104 1163 11AB;B56C;1104 1163 11AB; # (땬; 땬; 땬; 땬; 땬; ) HANGUL SYLLABLE DDYAN +B56D;B56D;1104 1163 11AC;B56D;1104 1163 11AC; # (땭; 땭; 땭; 땭; 땭; ) HANGUL SYLLABLE DDYANJ +B56E;B56E;1104 1163 11AD;B56E;1104 1163 11AD; # (땮; 땮; 땮; 땮; 땮; ) HANGUL SYLLABLE DDYANH +B56F;B56F;1104 1163 11AE;B56F;1104 1163 11AE; # (땯; 땯; 땯; 땯; 땯; ) HANGUL SYLLABLE DDYAD +B570;B570;1104 1163 11AF;B570;1104 1163 11AF; # (땰; 땰; 땰; 땰; 땰; ) HANGUL SYLLABLE DDYAL +B571;B571;1104 1163 11B0;B571;1104 1163 11B0; # (땱; 땱; 땱; 땱; 땱; ) HANGUL SYLLABLE DDYALG +B572;B572;1104 1163 11B1;B572;1104 1163 11B1; # (땲; 땲; 땲; 땲; 땲; ) HANGUL SYLLABLE DDYALM +B573;B573;1104 1163 11B2;B573;1104 1163 11B2; # (땳; 땳; 땳; 땳; 땳; ) HANGUL SYLLABLE DDYALB +B574;B574;1104 1163 11B3;B574;1104 1163 11B3; # (땴; 땴; 땴; 땴; 땴; ) HANGUL SYLLABLE DDYALS +B575;B575;1104 1163 11B4;B575;1104 1163 11B4; # (땵; 땵; 땵; 땵; 땵; ) HANGUL SYLLABLE DDYALT +B576;B576;1104 1163 11B5;B576;1104 1163 11B5; # (땶; 땶; 땶; 땶; 땶; ) HANGUL SYLLABLE DDYALP +B577;B577;1104 1163 11B6;B577;1104 1163 11B6; # (땷; 땷; 땷; 땷; 땷; ) HANGUL SYLLABLE DDYALH +B578;B578;1104 1163 11B7;B578;1104 1163 11B7; # (땸; 땸; 땸; 땸; 땸; ) HANGUL SYLLABLE DDYAM +B579;B579;1104 1163 11B8;B579;1104 1163 11B8; # (땹; 땹; 땹; 땹; 땹; ) HANGUL SYLLABLE DDYAB +B57A;B57A;1104 1163 11B9;B57A;1104 1163 11B9; # (땺; 땺; 땺; 땺; 땺; ) HANGUL SYLLABLE DDYABS +B57B;B57B;1104 1163 11BA;B57B;1104 1163 11BA; # (땻; 땻; 땻; 땻; 땻; ) HANGUL SYLLABLE DDYAS +B57C;B57C;1104 1163 11BB;B57C;1104 1163 11BB; # (땼; 땼; 땼; 땼; 땼; ) HANGUL SYLLABLE DDYASS +B57D;B57D;1104 1163 11BC;B57D;1104 1163 11BC; # (땽; 땽; 땽; 땽; 땽; ) HANGUL SYLLABLE DDYANG +B57E;B57E;1104 1163 11BD;B57E;1104 1163 11BD; # (땾; 땾; 땾; 땾; 땾; ) HANGUL SYLLABLE DDYAJ +B57F;B57F;1104 1163 11BE;B57F;1104 1163 11BE; # (땿; 땿; 땿; 땿; 땿; ) HANGUL SYLLABLE DDYAC +B580;B580;1104 1163 11BF;B580;1104 1163 11BF; # (떀; 떀; 떀; 떀; 떀; ) HANGUL SYLLABLE DDYAK +B581;B581;1104 1163 11C0;B581;1104 1163 11C0; # (떁; 떁; 떁; 떁; 떁; ) HANGUL SYLLABLE DDYAT +B582;B582;1104 1163 11C1;B582;1104 1163 11C1; # (떂; 떂; 떂; 떂; 떂; ) HANGUL SYLLABLE DDYAP +B583;B583;1104 1163 11C2;B583;1104 1163 11C2; # (떃; 떃; 떃; 떃; 떃; ) HANGUL SYLLABLE DDYAH +B584;B584;1104 1164;B584;1104 1164; # (떄; 떄; 떄; 떄; 떄; ) HANGUL SYLLABLE DDYAE +B585;B585;1104 1164 11A8;B585;1104 1164 11A8; # (떅; 떅; 떅; 떅; 떅; ) HANGUL SYLLABLE DDYAEG +B586;B586;1104 1164 11A9;B586;1104 1164 11A9; # (떆; 떆; 떆; 떆; 떆; ) HANGUL SYLLABLE DDYAEGG +B587;B587;1104 1164 11AA;B587;1104 1164 11AA; # (떇; 떇; 떇; 떇; 떇; ) HANGUL SYLLABLE DDYAEGS +B588;B588;1104 1164 11AB;B588;1104 1164 11AB; # (떈; 떈; 떈; 떈; 떈; ) HANGUL SYLLABLE DDYAEN +B589;B589;1104 1164 11AC;B589;1104 1164 11AC; # (떉; 떉; 떉; 떉; 떉; ) HANGUL SYLLABLE DDYAENJ +B58A;B58A;1104 1164 11AD;B58A;1104 1164 11AD; # (떊; 떊; 떊; 떊; 떊; ) HANGUL SYLLABLE DDYAENH +B58B;B58B;1104 1164 11AE;B58B;1104 1164 11AE; # (떋; 떋; 떋; 떋; 떋; ) HANGUL SYLLABLE DDYAED +B58C;B58C;1104 1164 11AF;B58C;1104 1164 11AF; # (떌; 떌; 떌; 떌; 떌; ) HANGUL SYLLABLE DDYAEL +B58D;B58D;1104 1164 11B0;B58D;1104 1164 11B0; # (떍; 떍; 떍; 떍; 떍; ) HANGUL SYLLABLE DDYAELG +B58E;B58E;1104 1164 11B1;B58E;1104 1164 11B1; # (떎; 떎; 떎; 떎; 떎; ) HANGUL SYLLABLE DDYAELM +B58F;B58F;1104 1164 11B2;B58F;1104 1164 11B2; # (떏; 떏; 떏; 떏; 떏; ) HANGUL SYLLABLE DDYAELB +B590;B590;1104 1164 11B3;B590;1104 1164 11B3; # (떐; 떐; 떐; 떐; 떐; ) HANGUL SYLLABLE DDYAELS +B591;B591;1104 1164 11B4;B591;1104 1164 11B4; # (떑; 떑; 떑; 떑; 떑; ) HANGUL SYLLABLE DDYAELT +B592;B592;1104 1164 11B5;B592;1104 1164 11B5; # (떒; 떒; 떒; 떒; 떒; ) HANGUL SYLLABLE DDYAELP +B593;B593;1104 1164 11B6;B593;1104 1164 11B6; # (떓; 떓; 떓; 떓; 떓; ) HANGUL SYLLABLE DDYAELH +B594;B594;1104 1164 11B7;B594;1104 1164 11B7; # (떔; 떔; 떔; 떔; 떔; ) HANGUL SYLLABLE DDYAEM +B595;B595;1104 1164 11B8;B595;1104 1164 11B8; # (떕; 떕; 떕; 떕; 떕; ) HANGUL SYLLABLE DDYAEB +B596;B596;1104 1164 11B9;B596;1104 1164 11B9; # (떖; 떖; 떖; 떖; 떖; ) HANGUL SYLLABLE DDYAEBS +B597;B597;1104 1164 11BA;B597;1104 1164 11BA; # (떗; 떗; 떗; 떗; 떗; ) HANGUL SYLLABLE DDYAES +B598;B598;1104 1164 11BB;B598;1104 1164 11BB; # (떘; 떘; 떘; 떘; 떘; ) HANGUL SYLLABLE DDYAESS +B599;B599;1104 1164 11BC;B599;1104 1164 11BC; # (떙; 떙; 떙; 떙; 떙; ) HANGUL SYLLABLE DDYAENG +B59A;B59A;1104 1164 11BD;B59A;1104 1164 11BD; # (떚; 떚; 떚; 떚; 떚; ) HANGUL SYLLABLE DDYAEJ +B59B;B59B;1104 1164 11BE;B59B;1104 1164 11BE; # (떛; 떛; 떛; 떛; 떛; ) HANGUL SYLLABLE DDYAEC +B59C;B59C;1104 1164 11BF;B59C;1104 1164 11BF; # (떜; 떜; 떜; 떜; 떜; ) HANGUL SYLLABLE DDYAEK +B59D;B59D;1104 1164 11C0;B59D;1104 1164 11C0; # (떝; 떝; 떝; 떝; 떝; ) HANGUL SYLLABLE DDYAET +B59E;B59E;1104 1164 11C1;B59E;1104 1164 11C1; # (떞; 떞; 떞; 떞; 떞; ) HANGUL SYLLABLE DDYAEP +B59F;B59F;1104 1164 11C2;B59F;1104 1164 11C2; # (떟; 떟; 떟; 떟; 떟; ) HANGUL SYLLABLE DDYAEH +B5A0;B5A0;1104 1165;B5A0;1104 1165; # (떠; 떠; 떠; 떠; 떠; ) HANGUL SYLLABLE DDEO +B5A1;B5A1;1104 1165 11A8;B5A1;1104 1165 11A8; # (떡; 떡; 떡; 떡; 떡; ) HANGUL SYLLABLE DDEOG +B5A2;B5A2;1104 1165 11A9;B5A2;1104 1165 11A9; # (떢; 떢; 떢; 떢; 떢; ) HANGUL SYLLABLE DDEOGG +B5A3;B5A3;1104 1165 11AA;B5A3;1104 1165 11AA; # (떣; 떣; 떣; 떣; 떣; ) HANGUL SYLLABLE DDEOGS +B5A4;B5A4;1104 1165 11AB;B5A4;1104 1165 11AB; # (떤; 떤; 떤; 떤; 떤; ) HANGUL SYLLABLE DDEON +B5A5;B5A5;1104 1165 11AC;B5A5;1104 1165 11AC; # (떥; 떥; 떥; 떥; 떥; ) HANGUL SYLLABLE DDEONJ +B5A6;B5A6;1104 1165 11AD;B5A6;1104 1165 11AD; # (떦; 떦; 떦; 떦; 떦; ) HANGUL SYLLABLE DDEONH +B5A7;B5A7;1104 1165 11AE;B5A7;1104 1165 11AE; # (떧; 떧; 떧; 떧; 떧; ) HANGUL SYLLABLE DDEOD +B5A8;B5A8;1104 1165 11AF;B5A8;1104 1165 11AF; # (떨; 떨; 떨; 떨; 떨; ) HANGUL SYLLABLE DDEOL +B5A9;B5A9;1104 1165 11B0;B5A9;1104 1165 11B0; # (떩; 떩; 떩; 떩; 떩; ) HANGUL SYLLABLE DDEOLG +B5AA;B5AA;1104 1165 11B1;B5AA;1104 1165 11B1; # (떪; 떪; 떪; 떪; 떪; ) HANGUL SYLLABLE DDEOLM +B5AB;B5AB;1104 1165 11B2;B5AB;1104 1165 11B2; # (떫; 떫; 떫; 떫; 떫; ) HANGUL SYLLABLE DDEOLB +B5AC;B5AC;1104 1165 11B3;B5AC;1104 1165 11B3; # (떬; 떬; 떬; 떬; 떬; ) HANGUL SYLLABLE DDEOLS +B5AD;B5AD;1104 1165 11B4;B5AD;1104 1165 11B4; # (떭; 떭; 떭; 떭; 떭; ) HANGUL SYLLABLE DDEOLT +B5AE;B5AE;1104 1165 11B5;B5AE;1104 1165 11B5; # (떮; 떮; 떮; 떮; 떮; ) HANGUL SYLLABLE DDEOLP +B5AF;B5AF;1104 1165 11B6;B5AF;1104 1165 11B6; # (떯; 떯; 떯; 떯; 떯; ) HANGUL SYLLABLE DDEOLH +B5B0;B5B0;1104 1165 11B7;B5B0;1104 1165 11B7; # (떰; 떰; 떰; 떰; 떰; ) HANGUL SYLLABLE DDEOM +B5B1;B5B1;1104 1165 11B8;B5B1;1104 1165 11B8; # (떱; 떱; 떱; 떱; 떱; ) HANGUL SYLLABLE DDEOB +B5B2;B5B2;1104 1165 11B9;B5B2;1104 1165 11B9; # (떲; 떲; 떲; 떲; 떲; ) HANGUL SYLLABLE DDEOBS +B5B3;B5B3;1104 1165 11BA;B5B3;1104 1165 11BA; # (떳; 떳; 떳; 떳; 떳; ) HANGUL SYLLABLE DDEOS +B5B4;B5B4;1104 1165 11BB;B5B4;1104 1165 11BB; # (떴; 떴; 떴; 떴; 떴; ) HANGUL SYLLABLE DDEOSS +B5B5;B5B5;1104 1165 11BC;B5B5;1104 1165 11BC; # (떵; 떵; 떵; 떵; 떵; ) HANGUL SYLLABLE DDEONG +B5B6;B5B6;1104 1165 11BD;B5B6;1104 1165 11BD; # (떶; 떶; 떶; 떶; 떶; ) HANGUL SYLLABLE DDEOJ +B5B7;B5B7;1104 1165 11BE;B5B7;1104 1165 11BE; # (떷; 떷; 떷; 떷; 떷; ) HANGUL SYLLABLE DDEOC +B5B8;B5B8;1104 1165 11BF;B5B8;1104 1165 11BF; # (떸; 떸; 떸; 떸; 떸; ) HANGUL SYLLABLE DDEOK +B5B9;B5B9;1104 1165 11C0;B5B9;1104 1165 11C0; # (떹; 떹; 떹; 떹; 떹; ) HANGUL SYLLABLE DDEOT +B5BA;B5BA;1104 1165 11C1;B5BA;1104 1165 11C1; # (떺; 떺; 떺; 떺; 떺; ) HANGUL SYLLABLE DDEOP +B5BB;B5BB;1104 1165 11C2;B5BB;1104 1165 11C2; # (떻; 떻; 떻; 떻; 떻; ) HANGUL SYLLABLE DDEOH +B5BC;B5BC;1104 1166;B5BC;1104 1166; # (떼; 떼; 떼; 떼; 떼; ) HANGUL SYLLABLE DDE +B5BD;B5BD;1104 1166 11A8;B5BD;1104 1166 11A8; # (떽; 떽; 떽; 떽; 떽; ) HANGUL SYLLABLE DDEG +B5BE;B5BE;1104 1166 11A9;B5BE;1104 1166 11A9; # (떾; 떾; 떾; 떾; 떾; ) HANGUL SYLLABLE DDEGG +B5BF;B5BF;1104 1166 11AA;B5BF;1104 1166 11AA; # (떿; 떿; 떿; 떿; 떿; ) HANGUL SYLLABLE DDEGS +B5C0;B5C0;1104 1166 11AB;B5C0;1104 1166 11AB; # (뗀; 뗀; 뗀; 뗀; 뗀; ) HANGUL SYLLABLE DDEN +B5C1;B5C1;1104 1166 11AC;B5C1;1104 1166 11AC; # (뗁; 뗁; 뗁; 뗁; 뗁; ) HANGUL SYLLABLE DDENJ +B5C2;B5C2;1104 1166 11AD;B5C2;1104 1166 11AD; # (뗂; 뗂; 뗂; 뗂; 뗂; ) HANGUL SYLLABLE DDENH +B5C3;B5C3;1104 1166 11AE;B5C3;1104 1166 11AE; # (뗃; 뗃; 뗃; 뗃; 뗃; ) HANGUL SYLLABLE DDED +B5C4;B5C4;1104 1166 11AF;B5C4;1104 1166 11AF; # (뗄; 뗄; 뗄; 뗄; 뗄; ) HANGUL SYLLABLE DDEL +B5C5;B5C5;1104 1166 11B0;B5C5;1104 1166 11B0; # (뗅; 뗅; 뗅; 뗅; 뗅; ) HANGUL SYLLABLE DDELG +B5C6;B5C6;1104 1166 11B1;B5C6;1104 1166 11B1; # (뗆; 뗆; 뗆; 뗆; 뗆; ) HANGUL SYLLABLE DDELM +B5C7;B5C7;1104 1166 11B2;B5C7;1104 1166 11B2; # (뗇; 뗇; 뗇; 뗇; 뗇; ) HANGUL SYLLABLE DDELB +B5C8;B5C8;1104 1166 11B3;B5C8;1104 1166 11B3; # (뗈; 뗈; 뗈; 뗈; 뗈; ) HANGUL SYLLABLE DDELS +B5C9;B5C9;1104 1166 11B4;B5C9;1104 1166 11B4; # (뗉; 뗉; 뗉; 뗉; 뗉; ) HANGUL SYLLABLE DDELT +B5CA;B5CA;1104 1166 11B5;B5CA;1104 1166 11B5; # (뗊; 뗊; 뗊; 뗊; 뗊; ) HANGUL SYLLABLE DDELP +B5CB;B5CB;1104 1166 11B6;B5CB;1104 1166 11B6; # (뗋; 뗋; 뗋; 뗋; 뗋; ) HANGUL SYLLABLE DDELH +B5CC;B5CC;1104 1166 11B7;B5CC;1104 1166 11B7; # (뗌; 뗌; 뗌; 뗌; 뗌; ) HANGUL SYLLABLE DDEM +B5CD;B5CD;1104 1166 11B8;B5CD;1104 1166 11B8; # (뗍; 뗍; 뗍; 뗍; 뗍; ) HANGUL SYLLABLE DDEB +B5CE;B5CE;1104 1166 11B9;B5CE;1104 1166 11B9; # (뗎; 뗎; 뗎; 뗎; 뗎; ) HANGUL SYLLABLE DDEBS +B5CF;B5CF;1104 1166 11BA;B5CF;1104 1166 11BA; # (뗏; 뗏; 뗏; 뗏; 뗏; ) HANGUL SYLLABLE DDES +B5D0;B5D0;1104 1166 11BB;B5D0;1104 1166 11BB; # (뗐; 뗐; 뗐; 뗐; 뗐; ) HANGUL SYLLABLE DDESS +B5D1;B5D1;1104 1166 11BC;B5D1;1104 1166 11BC; # (뗑; 뗑; 뗑; 뗑; 뗑; ) HANGUL SYLLABLE DDENG +B5D2;B5D2;1104 1166 11BD;B5D2;1104 1166 11BD; # (뗒; 뗒; 뗒; 뗒; 뗒; ) HANGUL SYLLABLE DDEJ +B5D3;B5D3;1104 1166 11BE;B5D3;1104 1166 11BE; # (뗓; 뗓; 뗓; 뗓; 뗓; ) HANGUL SYLLABLE DDEC +B5D4;B5D4;1104 1166 11BF;B5D4;1104 1166 11BF; # (뗔; 뗔; 뗔; 뗔; 뗔; ) HANGUL SYLLABLE DDEK +B5D5;B5D5;1104 1166 11C0;B5D5;1104 1166 11C0; # (뗕; 뗕; 뗕; 뗕; 뗕; ) HANGUL SYLLABLE DDET +B5D6;B5D6;1104 1166 11C1;B5D6;1104 1166 11C1; # (뗖; 뗖; 뗖; 뗖; 뗖; ) HANGUL SYLLABLE DDEP +B5D7;B5D7;1104 1166 11C2;B5D7;1104 1166 11C2; # (뗗; 뗗; 뗗; 뗗; 뗗; ) HANGUL SYLLABLE DDEH +B5D8;B5D8;1104 1167;B5D8;1104 1167; # (뗘; 뗘; 뗘; 뗘; 뗘; ) HANGUL SYLLABLE DDYEO +B5D9;B5D9;1104 1167 11A8;B5D9;1104 1167 11A8; # (뗙; 뗙; 뗙; 뗙; 뗙; ) HANGUL SYLLABLE DDYEOG +B5DA;B5DA;1104 1167 11A9;B5DA;1104 1167 11A9; # (뗚; 뗚; 뗚; 뗚; 뗚; ) HANGUL SYLLABLE DDYEOGG +B5DB;B5DB;1104 1167 11AA;B5DB;1104 1167 11AA; # (뗛; 뗛; 뗛; 뗛; 뗛; ) HANGUL SYLLABLE DDYEOGS +B5DC;B5DC;1104 1167 11AB;B5DC;1104 1167 11AB; # (뗜; 뗜; 뗜; 뗜; 뗜; ) HANGUL SYLLABLE DDYEON +B5DD;B5DD;1104 1167 11AC;B5DD;1104 1167 11AC; # (뗝; 뗝; 뗝; 뗝; 뗝; ) HANGUL SYLLABLE DDYEONJ +B5DE;B5DE;1104 1167 11AD;B5DE;1104 1167 11AD; # (뗞; 뗞; 뗞; 뗞; 뗞; ) HANGUL SYLLABLE DDYEONH +B5DF;B5DF;1104 1167 11AE;B5DF;1104 1167 11AE; # (뗟; 뗟; 뗟; 뗟; 뗟; ) HANGUL SYLLABLE DDYEOD +B5E0;B5E0;1104 1167 11AF;B5E0;1104 1167 11AF; # (뗠; 뗠; 뗠; 뗠; 뗠; ) HANGUL SYLLABLE DDYEOL +B5E1;B5E1;1104 1167 11B0;B5E1;1104 1167 11B0; # (뗡; 뗡; 뗡; 뗡; 뗡; ) HANGUL SYLLABLE DDYEOLG +B5E2;B5E2;1104 1167 11B1;B5E2;1104 1167 11B1; # (뗢; 뗢; 뗢; 뗢; 뗢; ) HANGUL SYLLABLE DDYEOLM +B5E3;B5E3;1104 1167 11B2;B5E3;1104 1167 11B2; # (뗣; 뗣; 뗣; 뗣; 뗣; ) HANGUL SYLLABLE DDYEOLB +B5E4;B5E4;1104 1167 11B3;B5E4;1104 1167 11B3; # (뗤; 뗤; 뗤; 뗤; 뗤; ) HANGUL SYLLABLE DDYEOLS +B5E5;B5E5;1104 1167 11B4;B5E5;1104 1167 11B4; # (뗥; 뗥; 뗥; 뗥; 뗥; ) HANGUL SYLLABLE DDYEOLT +B5E6;B5E6;1104 1167 11B5;B5E6;1104 1167 11B5; # (뗦; 뗦; 뗦; 뗦; 뗦; ) HANGUL SYLLABLE DDYEOLP +B5E7;B5E7;1104 1167 11B6;B5E7;1104 1167 11B6; # (뗧; 뗧; 뗧; 뗧; 뗧; ) HANGUL SYLLABLE DDYEOLH +B5E8;B5E8;1104 1167 11B7;B5E8;1104 1167 11B7; # (뗨; 뗨; 뗨; 뗨; 뗨; ) HANGUL SYLLABLE DDYEOM +B5E9;B5E9;1104 1167 11B8;B5E9;1104 1167 11B8; # (뗩; 뗩; 뗩; 뗩; 뗩; ) HANGUL SYLLABLE DDYEOB +B5EA;B5EA;1104 1167 11B9;B5EA;1104 1167 11B9; # (뗪; 뗪; 뗪; 뗪; 뗪; ) HANGUL SYLLABLE DDYEOBS +B5EB;B5EB;1104 1167 11BA;B5EB;1104 1167 11BA; # (뗫; 뗫; 뗫; 뗫; 뗫; ) HANGUL SYLLABLE DDYEOS +B5EC;B5EC;1104 1167 11BB;B5EC;1104 1167 11BB; # (뗬; 뗬; 뗬; 뗬; 뗬; ) HANGUL SYLLABLE DDYEOSS +B5ED;B5ED;1104 1167 11BC;B5ED;1104 1167 11BC; # (뗭; 뗭; 뗭; 뗭; 뗭; ) HANGUL SYLLABLE DDYEONG +B5EE;B5EE;1104 1167 11BD;B5EE;1104 1167 11BD; # (뗮; 뗮; 뗮; 뗮; 뗮; ) HANGUL SYLLABLE DDYEOJ +B5EF;B5EF;1104 1167 11BE;B5EF;1104 1167 11BE; # (뗯; 뗯; 뗯; 뗯; 뗯; ) HANGUL SYLLABLE DDYEOC +B5F0;B5F0;1104 1167 11BF;B5F0;1104 1167 11BF; # (뗰; 뗰; 뗰; 뗰; 뗰; ) HANGUL SYLLABLE DDYEOK +B5F1;B5F1;1104 1167 11C0;B5F1;1104 1167 11C0; # (뗱; 뗱; 뗱; 뗱; 뗱; ) HANGUL SYLLABLE DDYEOT +B5F2;B5F2;1104 1167 11C1;B5F2;1104 1167 11C1; # (뗲; 뗲; 뗲; 뗲; 뗲; ) HANGUL SYLLABLE DDYEOP +B5F3;B5F3;1104 1167 11C2;B5F3;1104 1167 11C2; # (뗳; 뗳; 뗳; 뗳; 뗳; ) HANGUL SYLLABLE DDYEOH +B5F4;B5F4;1104 1168;B5F4;1104 1168; # (뗴; 뗴; 뗴; 뗴; 뗴; ) HANGUL SYLLABLE DDYE +B5F5;B5F5;1104 1168 11A8;B5F5;1104 1168 11A8; # (뗵; 뗵; 뗵; 뗵; 뗵; ) HANGUL SYLLABLE DDYEG +B5F6;B5F6;1104 1168 11A9;B5F6;1104 1168 11A9; # (뗶; 뗶; 뗶; 뗶; 뗶; ) HANGUL SYLLABLE DDYEGG +B5F7;B5F7;1104 1168 11AA;B5F7;1104 1168 11AA; # (뗷; 뗷; 뗷; 뗷; 뗷; ) HANGUL SYLLABLE DDYEGS +B5F8;B5F8;1104 1168 11AB;B5F8;1104 1168 11AB; # (뗸; 뗸; 뗸; 뗸; 뗸; ) HANGUL SYLLABLE DDYEN +B5F9;B5F9;1104 1168 11AC;B5F9;1104 1168 11AC; # (뗹; 뗹; 뗹; 뗹; 뗹; ) HANGUL SYLLABLE DDYENJ +B5FA;B5FA;1104 1168 11AD;B5FA;1104 1168 11AD; # (뗺; 뗺; 뗺; 뗺; 뗺; ) HANGUL SYLLABLE DDYENH +B5FB;B5FB;1104 1168 11AE;B5FB;1104 1168 11AE; # (뗻; 뗻; 뗻; 뗻; 뗻; ) HANGUL SYLLABLE DDYED +B5FC;B5FC;1104 1168 11AF;B5FC;1104 1168 11AF; # (뗼; 뗼; 뗼; 뗼; 뗼; ) HANGUL SYLLABLE DDYEL +B5FD;B5FD;1104 1168 11B0;B5FD;1104 1168 11B0; # (뗽; 뗽; 뗽; 뗽; 뗽; ) HANGUL SYLLABLE DDYELG +B5FE;B5FE;1104 1168 11B1;B5FE;1104 1168 11B1; # (뗾; 뗾; 뗾; 뗾; 뗾; ) HANGUL SYLLABLE DDYELM +B5FF;B5FF;1104 1168 11B2;B5FF;1104 1168 11B2; # (뗿; 뗿; 뗿; 뗿; 뗿; ) HANGUL SYLLABLE DDYELB +B600;B600;1104 1168 11B3;B600;1104 1168 11B3; # (똀; 똀; 똀; 똀; 똀; ) HANGUL SYLLABLE DDYELS +B601;B601;1104 1168 11B4;B601;1104 1168 11B4; # (똁; 똁; 똁; 똁; 똁; ) HANGUL SYLLABLE DDYELT +B602;B602;1104 1168 11B5;B602;1104 1168 11B5; # (똂; 똂; 똂; 똂; 똂; ) HANGUL SYLLABLE DDYELP +B603;B603;1104 1168 11B6;B603;1104 1168 11B6; # (똃; 똃; 똃; 똃; 똃; ) HANGUL SYLLABLE DDYELH +B604;B604;1104 1168 11B7;B604;1104 1168 11B7; # (똄; 똄; 똄; 똄; 똄; ) HANGUL SYLLABLE DDYEM +B605;B605;1104 1168 11B8;B605;1104 1168 11B8; # (똅; 똅; 똅; 똅; 똅; ) HANGUL SYLLABLE DDYEB +B606;B606;1104 1168 11B9;B606;1104 1168 11B9; # (똆; 똆; 똆; 똆; 똆; ) HANGUL SYLLABLE DDYEBS +B607;B607;1104 1168 11BA;B607;1104 1168 11BA; # (똇; 똇; 똇; 똇; 똇; ) HANGUL SYLLABLE DDYES +B608;B608;1104 1168 11BB;B608;1104 1168 11BB; # (똈; 똈; 똈; 똈; 똈; ) HANGUL SYLLABLE DDYESS +B609;B609;1104 1168 11BC;B609;1104 1168 11BC; # (똉; 똉; 똉; 똉; 똉; ) HANGUL SYLLABLE DDYENG +B60A;B60A;1104 1168 11BD;B60A;1104 1168 11BD; # (똊; 똊; 똊; 똊; 똊; ) HANGUL SYLLABLE DDYEJ +B60B;B60B;1104 1168 11BE;B60B;1104 1168 11BE; # (똋; 똋; 똋; 똋; 똋; ) HANGUL SYLLABLE DDYEC +B60C;B60C;1104 1168 11BF;B60C;1104 1168 11BF; # (똌; 똌; 똌; 똌; 똌; ) HANGUL SYLLABLE DDYEK +B60D;B60D;1104 1168 11C0;B60D;1104 1168 11C0; # (똍; 똍; 똍; 똍; 똍; ) HANGUL SYLLABLE DDYET +B60E;B60E;1104 1168 11C1;B60E;1104 1168 11C1; # (똎; 똎; 똎; 똎; 똎; ) HANGUL SYLLABLE DDYEP +B60F;B60F;1104 1168 11C2;B60F;1104 1168 11C2; # (똏; 똏; 똏; 똏; 똏; ) HANGUL SYLLABLE DDYEH +B610;B610;1104 1169;B610;1104 1169; # (또; 또; 또; 또; 또; ) HANGUL SYLLABLE DDO +B611;B611;1104 1169 11A8;B611;1104 1169 11A8; # (똑; 똑; 똑; 똑; 똑; ) HANGUL SYLLABLE DDOG +B612;B612;1104 1169 11A9;B612;1104 1169 11A9; # (똒; 똒; 똒; 똒; 똒; ) HANGUL SYLLABLE DDOGG +B613;B613;1104 1169 11AA;B613;1104 1169 11AA; # (똓; 똓; 똓; 똓; 똓; ) HANGUL SYLLABLE DDOGS +B614;B614;1104 1169 11AB;B614;1104 1169 11AB; # (똔; 똔; 똔; 똔; 똔; ) HANGUL SYLLABLE DDON +B615;B615;1104 1169 11AC;B615;1104 1169 11AC; # (똕; 똕; 똕; 똕; 똕; ) HANGUL SYLLABLE DDONJ +B616;B616;1104 1169 11AD;B616;1104 1169 11AD; # (똖; 똖; 똖; 똖; 똖; ) HANGUL SYLLABLE DDONH +B617;B617;1104 1169 11AE;B617;1104 1169 11AE; # (똗; 똗; 똗; 똗; 똗; ) HANGUL SYLLABLE DDOD +B618;B618;1104 1169 11AF;B618;1104 1169 11AF; # (똘; 똘; 똘; 똘; 똘; ) HANGUL SYLLABLE DDOL +B619;B619;1104 1169 11B0;B619;1104 1169 11B0; # (똙; 똙; 똙; 똙; 똙; ) HANGUL SYLLABLE DDOLG +B61A;B61A;1104 1169 11B1;B61A;1104 1169 11B1; # (똚; 똚; 똚; 똚; 똚; ) HANGUL SYLLABLE DDOLM +B61B;B61B;1104 1169 11B2;B61B;1104 1169 11B2; # (똛; 똛; 똛; 똛; 똛; ) HANGUL SYLLABLE DDOLB +B61C;B61C;1104 1169 11B3;B61C;1104 1169 11B3; # (똜; 똜; 똜; 똜; 똜; ) HANGUL SYLLABLE DDOLS +B61D;B61D;1104 1169 11B4;B61D;1104 1169 11B4; # (똝; 똝; 똝; 똝; 똝; ) HANGUL SYLLABLE DDOLT +B61E;B61E;1104 1169 11B5;B61E;1104 1169 11B5; # (똞; 똞; 똞; 똞; 똞; ) HANGUL SYLLABLE DDOLP +B61F;B61F;1104 1169 11B6;B61F;1104 1169 11B6; # (똟; 똟; 똟; 똟; 똟; ) HANGUL SYLLABLE DDOLH +B620;B620;1104 1169 11B7;B620;1104 1169 11B7; # (똠; 똠; 똠; 똠; 똠; ) HANGUL SYLLABLE DDOM +B621;B621;1104 1169 11B8;B621;1104 1169 11B8; # (똡; 똡; 똡; 똡; 똡; ) HANGUL SYLLABLE DDOB +B622;B622;1104 1169 11B9;B622;1104 1169 11B9; # (똢; 똢; 똢; 똢; 똢; ) HANGUL SYLLABLE DDOBS +B623;B623;1104 1169 11BA;B623;1104 1169 11BA; # (똣; 똣; 똣; 똣; 똣; ) HANGUL SYLLABLE DDOS +B624;B624;1104 1169 11BB;B624;1104 1169 11BB; # (똤; 똤; 똤; 똤; 똤; ) HANGUL SYLLABLE DDOSS +B625;B625;1104 1169 11BC;B625;1104 1169 11BC; # (똥; 똥; 똥; 똥; 똥; ) HANGUL SYLLABLE DDONG +B626;B626;1104 1169 11BD;B626;1104 1169 11BD; # (똦; 똦; 똦; 똦; 똦; ) HANGUL SYLLABLE DDOJ +B627;B627;1104 1169 11BE;B627;1104 1169 11BE; # (똧; 똧; 똧; 똧; 똧; ) HANGUL SYLLABLE DDOC +B628;B628;1104 1169 11BF;B628;1104 1169 11BF; # (똨; 똨; 똨; 똨; 똨; ) HANGUL SYLLABLE DDOK +B629;B629;1104 1169 11C0;B629;1104 1169 11C0; # (똩; 똩; 똩; 똩; 똩; ) HANGUL SYLLABLE DDOT +B62A;B62A;1104 1169 11C1;B62A;1104 1169 11C1; # (똪; 똪; 똪; 똪; 똪; ) HANGUL SYLLABLE DDOP +B62B;B62B;1104 1169 11C2;B62B;1104 1169 11C2; # (똫; 똫; 똫; 똫; 똫; ) HANGUL SYLLABLE DDOH +B62C;B62C;1104 116A;B62C;1104 116A; # (똬; 똬; 똬; 똬; 똬; ) HANGUL SYLLABLE DDWA +B62D;B62D;1104 116A 11A8;B62D;1104 116A 11A8; # (똭; 똭; 똭; 똭; 똭; ) HANGUL SYLLABLE DDWAG +B62E;B62E;1104 116A 11A9;B62E;1104 116A 11A9; # (똮; 똮; 똮; 똮; 똮; ) HANGUL SYLLABLE DDWAGG +B62F;B62F;1104 116A 11AA;B62F;1104 116A 11AA; # (똯; 똯; 똯; 똯; 똯; ) HANGUL SYLLABLE DDWAGS +B630;B630;1104 116A 11AB;B630;1104 116A 11AB; # (똰; 똰; 똰; 똰; 똰; ) HANGUL SYLLABLE DDWAN +B631;B631;1104 116A 11AC;B631;1104 116A 11AC; # (똱; 똱; 똱; 똱; 똱; ) HANGUL SYLLABLE DDWANJ +B632;B632;1104 116A 11AD;B632;1104 116A 11AD; # (똲; 똲; 똲; 똲; 똲; ) HANGUL SYLLABLE DDWANH +B633;B633;1104 116A 11AE;B633;1104 116A 11AE; # (똳; 똳; 똳; 똳; 똳; ) HANGUL SYLLABLE DDWAD +B634;B634;1104 116A 11AF;B634;1104 116A 11AF; # (똴; 똴; 똴; 똴; 똴; ) HANGUL SYLLABLE DDWAL +B635;B635;1104 116A 11B0;B635;1104 116A 11B0; # (똵; 똵; 똵; 똵; 똵; ) HANGUL SYLLABLE DDWALG +B636;B636;1104 116A 11B1;B636;1104 116A 11B1; # (똶; 똶; 똶; 똶; 똶; ) HANGUL SYLLABLE DDWALM +B637;B637;1104 116A 11B2;B637;1104 116A 11B2; # (똷; 똷; 똷; 똷; 똷; ) HANGUL SYLLABLE DDWALB +B638;B638;1104 116A 11B3;B638;1104 116A 11B3; # (똸; 똸; 똸; 똸; 똸; ) HANGUL SYLLABLE DDWALS +B639;B639;1104 116A 11B4;B639;1104 116A 11B4; # (똹; 똹; 똹; 똹; 똹; ) HANGUL SYLLABLE DDWALT +B63A;B63A;1104 116A 11B5;B63A;1104 116A 11B5; # (똺; 똺; 똺; 똺; 똺; ) HANGUL SYLLABLE DDWALP +B63B;B63B;1104 116A 11B6;B63B;1104 116A 11B6; # (똻; 똻; 똻; 똻; 똻; ) HANGUL SYLLABLE DDWALH +B63C;B63C;1104 116A 11B7;B63C;1104 116A 11B7; # (똼; 똼; 똼; 똼; 똼; ) HANGUL SYLLABLE DDWAM +B63D;B63D;1104 116A 11B8;B63D;1104 116A 11B8; # (똽; 똽; 똽; 똽; 똽; ) HANGUL SYLLABLE DDWAB +B63E;B63E;1104 116A 11B9;B63E;1104 116A 11B9; # (똾; 똾; 똾; 똾; 똾; ) HANGUL SYLLABLE DDWABS +B63F;B63F;1104 116A 11BA;B63F;1104 116A 11BA; # (똿; 똿; 똿; 똿; 똿; ) HANGUL SYLLABLE DDWAS +B640;B640;1104 116A 11BB;B640;1104 116A 11BB; # (뙀; 뙀; 뙀; 뙀; 뙀; ) HANGUL SYLLABLE DDWASS +B641;B641;1104 116A 11BC;B641;1104 116A 11BC; # (뙁; 뙁; 뙁; 뙁; 뙁; ) HANGUL SYLLABLE DDWANG +B642;B642;1104 116A 11BD;B642;1104 116A 11BD; # (뙂; 뙂; 뙂; 뙂; 뙂; ) HANGUL SYLLABLE DDWAJ +B643;B643;1104 116A 11BE;B643;1104 116A 11BE; # (뙃; 뙃; 뙃; 뙃; 뙃; ) HANGUL SYLLABLE DDWAC +B644;B644;1104 116A 11BF;B644;1104 116A 11BF; # (뙄; 뙄; 뙄; 뙄; 뙄; ) HANGUL SYLLABLE DDWAK +B645;B645;1104 116A 11C0;B645;1104 116A 11C0; # (뙅; 뙅; 뙅; 뙅; 뙅; ) HANGUL SYLLABLE DDWAT +B646;B646;1104 116A 11C1;B646;1104 116A 11C1; # (뙆; 뙆; 뙆; 뙆; 뙆; ) HANGUL SYLLABLE DDWAP +B647;B647;1104 116A 11C2;B647;1104 116A 11C2; # (뙇; 뙇; 뙇; 뙇; 뙇; ) HANGUL SYLLABLE DDWAH +B648;B648;1104 116B;B648;1104 116B; # (뙈; 뙈; 뙈; 뙈; 뙈; ) HANGUL SYLLABLE DDWAE +B649;B649;1104 116B 11A8;B649;1104 116B 11A8; # (뙉; 뙉; 뙉; 뙉; 뙉; ) HANGUL SYLLABLE DDWAEG +B64A;B64A;1104 116B 11A9;B64A;1104 116B 11A9; # (뙊; 뙊; 뙊; 뙊; 뙊; ) HANGUL SYLLABLE DDWAEGG +B64B;B64B;1104 116B 11AA;B64B;1104 116B 11AA; # (뙋; 뙋; 뙋; 뙋; 뙋; ) HANGUL SYLLABLE DDWAEGS +B64C;B64C;1104 116B 11AB;B64C;1104 116B 11AB; # (뙌; 뙌; 뙌; 뙌; 뙌; ) HANGUL SYLLABLE DDWAEN +B64D;B64D;1104 116B 11AC;B64D;1104 116B 11AC; # (뙍; 뙍; 뙍; 뙍; 뙍; ) HANGUL SYLLABLE DDWAENJ +B64E;B64E;1104 116B 11AD;B64E;1104 116B 11AD; # (뙎; 뙎; 뙎; 뙎; 뙎; ) HANGUL SYLLABLE DDWAENH +B64F;B64F;1104 116B 11AE;B64F;1104 116B 11AE; # (뙏; 뙏; 뙏; 뙏; 뙏; ) HANGUL SYLLABLE DDWAED +B650;B650;1104 116B 11AF;B650;1104 116B 11AF; # (뙐; 뙐; 뙐; 뙐; 뙐; ) HANGUL SYLLABLE DDWAEL +B651;B651;1104 116B 11B0;B651;1104 116B 11B0; # (뙑; 뙑; 뙑; 뙑; 뙑; ) HANGUL SYLLABLE DDWAELG +B652;B652;1104 116B 11B1;B652;1104 116B 11B1; # (뙒; 뙒; 뙒; 뙒; 뙒; ) HANGUL SYLLABLE DDWAELM +B653;B653;1104 116B 11B2;B653;1104 116B 11B2; # (뙓; 뙓; 뙓; 뙓; 뙓; ) HANGUL SYLLABLE DDWAELB +B654;B654;1104 116B 11B3;B654;1104 116B 11B3; # (뙔; 뙔; 뙔; 뙔; 뙔; ) HANGUL SYLLABLE DDWAELS +B655;B655;1104 116B 11B4;B655;1104 116B 11B4; # (뙕; 뙕; 뙕; 뙕; 뙕; ) HANGUL SYLLABLE DDWAELT +B656;B656;1104 116B 11B5;B656;1104 116B 11B5; # (뙖; 뙖; 뙖; 뙖; 뙖; ) HANGUL SYLLABLE DDWAELP +B657;B657;1104 116B 11B6;B657;1104 116B 11B6; # (뙗; 뙗; 뙗; 뙗; 뙗; ) HANGUL SYLLABLE DDWAELH +B658;B658;1104 116B 11B7;B658;1104 116B 11B7; # (뙘; 뙘; 뙘; 뙘; 뙘; ) HANGUL SYLLABLE DDWAEM +B659;B659;1104 116B 11B8;B659;1104 116B 11B8; # (뙙; 뙙; 뙙; 뙙; 뙙; ) HANGUL SYLLABLE DDWAEB +B65A;B65A;1104 116B 11B9;B65A;1104 116B 11B9; # (뙚; 뙚; 뙚; 뙚; 뙚; ) HANGUL SYLLABLE DDWAEBS +B65B;B65B;1104 116B 11BA;B65B;1104 116B 11BA; # (뙛; 뙛; 뙛; 뙛; 뙛; ) HANGUL SYLLABLE DDWAES +B65C;B65C;1104 116B 11BB;B65C;1104 116B 11BB; # (뙜; 뙜; 뙜; 뙜; 뙜; ) HANGUL SYLLABLE DDWAESS +B65D;B65D;1104 116B 11BC;B65D;1104 116B 11BC; # (뙝; 뙝; 뙝; 뙝; 뙝; ) HANGUL SYLLABLE DDWAENG +B65E;B65E;1104 116B 11BD;B65E;1104 116B 11BD; # (뙞; 뙞; 뙞; 뙞; 뙞; ) HANGUL SYLLABLE DDWAEJ +B65F;B65F;1104 116B 11BE;B65F;1104 116B 11BE; # (뙟; 뙟; 뙟; 뙟; 뙟; ) HANGUL SYLLABLE DDWAEC +B660;B660;1104 116B 11BF;B660;1104 116B 11BF; # (뙠; 뙠; 뙠; 뙠; 뙠; ) HANGUL SYLLABLE DDWAEK +B661;B661;1104 116B 11C0;B661;1104 116B 11C0; # (뙡; 뙡; 뙡; 뙡; 뙡; ) HANGUL SYLLABLE DDWAET +B662;B662;1104 116B 11C1;B662;1104 116B 11C1; # (뙢; 뙢; 뙢; 뙢; 뙢; ) HANGUL SYLLABLE DDWAEP +B663;B663;1104 116B 11C2;B663;1104 116B 11C2; # (뙣; 뙣; 뙣; 뙣; 뙣; ) HANGUL SYLLABLE DDWAEH +B664;B664;1104 116C;B664;1104 116C; # (뙤; 뙤; 뙤; 뙤; 뙤; ) HANGUL SYLLABLE DDOE +B665;B665;1104 116C 11A8;B665;1104 116C 11A8; # (뙥; 뙥; 뙥; 뙥; 뙥; ) HANGUL SYLLABLE DDOEG +B666;B666;1104 116C 11A9;B666;1104 116C 11A9; # (뙦; 뙦; 뙦; 뙦; 뙦; ) HANGUL SYLLABLE DDOEGG +B667;B667;1104 116C 11AA;B667;1104 116C 11AA; # (뙧; 뙧; 뙧; 뙧; 뙧; ) HANGUL SYLLABLE DDOEGS +B668;B668;1104 116C 11AB;B668;1104 116C 11AB; # (뙨; 뙨; 뙨; 뙨; 뙨; ) HANGUL SYLLABLE DDOEN +B669;B669;1104 116C 11AC;B669;1104 116C 11AC; # (뙩; 뙩; 뙩; 뙩; 뙩; ) HANGUL SYLLABLE DDOENJ +B66A;B66A;1104 116C 11AD;B66A;1104 116C 11AD; # (뙪; 뙪; 뙪; 뙪; 뙪; ) HANGUL SYLLABLE DDOENH +B66B;B66B;1104 116C 11AE;B66B;1104 116C 11AE; # (뙫; 뙫; 뙫; 뙫; 뙫; ) HANGUL SYLLABLE DDOED +B66C;B66C;1104 116C 11AF;B66C;1104 116C 11AF; # (뙬; 뙬; 뙬; 뙬; 뙬; ) HANGUL SYLLABLE DDOEL +B66D;B66D;1104 116C 11B0;B66D;1104 116C 11B0; # (뙭; 뙭; 뙭; 뙭; 뙭; ) HANGUL SYLLABLE DDOELG +B66E;B66E;1104 116C 11B1;B66E;1104 116C 11B1; # (뙮; 뙮; 뙮; 뙮; 뙮; ) HANGUL SYLLABLE DDOELM +B66F;B66F;1104 116C 11B2;B66F;1104 116C 11B2; # (뙯; 뙯; 뙯; 뙯; 뙯; ) HANGUL SYLLABLE DDOELB +B670;B670;1104 116C 11B3;B670;1104 116C 11B3; # (뙰; 뙰; 뙰; 뙰; 뙰; ) HANGUL SYLLABLE DDOELS +B671;B671;1104 116C 11B4;B671;1104 116C 11B4; # (뙱; 뙱; 뙱; 뙱; 뙱; ) HANGUL SYLLABLE DDOELT +B672;B672;1104 116C 11B5;B672;1104 116C 11B5; # (뙲; 뙲; 뙲; 뙲; 뙲; ) HANGUL SYLLABLE DDOELP +B673;B673;1104 116C 11B6;B673;1104 116C 11B6; # (뙳; 뙳; 뙳; 뙳; 뙳; ) HANGUL SYLLABLE DDOELH +B674;B674;1104 116C 11B7;B674;1104 116C 11B7; # (뙴; 뙴; 뙴; 뙴; 뙴; ) HANGUL SYLLABLE DDOEM +B675;B675;1104 116C 11B8;B675;1104 116C 11B8; # (뙵; 뙵; 뙵; 뙵; 뙵; ) HANGUL SYLLABLE DDOEB +B676;B676;1104 116C 11B9;B676;1104 116C 11B9; # (뙶; 뙶; 뙶; 뙶; 뙶; ) HANGUL SYLLABLE DDOEBS +B677;B677;1104 116C 11BA;B677;1104 116C 11BA; # (뙷; 뙷; 뙷; 뙷; 뙷; ) HANGUL SYLLABLE DDOES +B678;B678;1104 116C 11BB;B678;1104 116C 11BB; # (뙸; 뙸; 뙸; 뙸; 뙸; ) HANGUL SYLLABLE DDOESS +B679;B679;1104 116C 11BC;B679;1104 116C 11BC; # (뙹; 뙹; 뙹; 뙹; 뙹; ) HANGUL SYLLABLE DDOENG +B67A;B67A;1104 116C 11BD;B67A;1104 116C 11BD; # (뙺; 뙺; 뙺; 뙺; 뙺; ) HANGUL SYLLABLE DDOEJ +B67B;B67B;1104 116C 11BE;B67B;1104 116C 11BE; # (뙻; 뙻; 뙻; 뙻; 뙻; ) HANGUL SYLLABLE DDOEC +B67C;B67C;1104 116C 11BF;B67C;1104 116C 11BF; # (뙼; 뙼; 뙼; 뙼; 뙼; ) HANGUL SYLLABLE DDOEK +B67D;B67D;1104 116C 11C0;B67D;1104 116C 11C0; # (뙽; 뙽; 뙽; 뙽; 뙽; ) HANGUL SYLLABLE DDOET +B67E;B67E;1104 116C 11C1;B67E;1104 116C 11C1; # (뙾; 뙾; 뙾; 뙾; 뙾; ) HANGUL SYLLABLE DDOEP +B67F;B67F;1104 116C 11C2;B67F;1104 116C 11C2; # (뙿; 뙿; 뙿; 뙿; 뙿; ) HANGUL SYLLABLE DDOEH +B680;B680;1104 116D;B680;1104 116D; # (뚀; 뚀; 뚀; 뚀; 뚀; ) HANGUL SYLLABLE DDYO +B681;B681;1104 116D 11A8;B681;1104 116D 11A8; # (뚁; 뚁; 뚁; 뚁; 뚁; ) HANGUL SYLLABLE DDYOG +B682;B682;1104 116D 11A9;B682;1104 116D 11A9; # (뚂; 뚂; 뚂; 뚂; 뚂; ) HANGUL SYLLABLE DDYOGG +B683;B683;1104 116D 11AA;B683;1104 116D 11AA; # (뚃; 뚃; 뚃; 뚃; 뚃; ) HANGUL SYLLABLE DDYOGS +B684;B684;1104 116D 11AB;B684;1104 116D 11AB; # (뚄; 뚄; 뚄; 뚄; 뚄; ) HANGUL SYLLABLE DDYON +B685;B685;1104 116D 11AC;B685;1104 116D 11AC; # (뚅; 뚅; 뚅; 뚅; 뚅; ) HANGUL SYLLABLE DDYONJ +B686;B686;1104 116D 11AD;B686;1104 116D 11AD; # (뚆; 뚆; 뚆; 뚆; 뚆; ) HANGUL SYLLABLE DDYONH +B687;B687;1104 116D 11AE;B687;1104 116D 11AE; # (뚇; 뚇; 뚇; 뚇; 뚇; ) HANGUL SYLLABLE DDYOD +B688;B688;1104 116D 11AF;B688;1104 116D 11AF; # (뚈; 뚈; 뚈; 뚈; 뚈; ) HANGUL SYLLABLE DDYOL +B689;B689;1104 116D 11B0;B689;1104 116D 11B0; # (뚉; 뚉; 뚉; 뚉; 뚉; ) HANGUL SYLLABLE DDYOLG +B68A;B68A;1104 116D 11B1;B68A;1104 116D 11B1; # (뚊; 뚊; 뚊; 뚊; 뚊; ) HANGUL SYLLABLE DDYOLM +B68B;B68B;1104 116D 11B2;B68B;1104 116D 11B2; # (뚋; 뚋; 뚋; 뚋; 뚋; ) HANGUL SYLLABLE DDYOLB +B68C;B68C;1104 116D 11B3;B68C;1104 116D 11B3; # (뚌; 뚌; 뚌; 뚌; 뚌; ) HANGUL SYLLABLE DDYOLS +B68D;B68D;1104 116D 11B4;B68D;1104 116D 11B4; # (뚍; 뚍; 뚍; 뚍; 뚍; ) HANGUL SYLLABLE DDYOLT +B68E;B68E;1104 116D 11B5;B68E;1104 116D 11B5; # (뚎; 뚎; 뚎; 뚎; 뚎; ) HANGUL SYLLABLE DDYOLP +B68F;B68F;1104 116D 11B6;B68F;1104 116D 11B6; # (뚏; 뚏; 뚏; 뚏; 뚏; ) HANGUL SYLLABLE DDYOLH +B690;B690;1104 116D 11B7;B690;1104 116D 11B7; # (뚐; 뚐; 뚐; 뚐; 뚐; ) HANGUL SYLLABLE DDYOM +B691;B691;1104 116D 11B8;B691;1104 116D 11B8; # (뚑; 뚑; 뚑; 뚑; 뚑; ) HANGUL SYLLABLE DDYOB +B692;B692;1104 116D 11B9;B692;1104 116D 11B9; # (뚒; 뚒; 뚒; 뚒; 뚒; ) HANGUL SYLLABLE DDYOBS +B693;B693;1104 116D 11BA;B693;1104 116D 11BA; # (뚓; 뚓; 뚓; 뚓; 뚓; ) HANGUL SYLLABLE DDYOS +B694;B694;1104 116D 11BB;B694;1104 116D 11BB; # (뚔; 뚔; 뚔; 뚔; 뚔; ) HANGUL SYLLABLE DDYOSS +B695;B695;1104 116D 11BC;B695;1104 116D 11BC; # (뚕; 뚕; 뚕; 뚕; 뚕; ) HANGUL SYLLABLE DDYONG +B696;B696;1104 116D 11BD;B696;1104 116D 11BD; # (뚖; 뚖; 뚖; 뚖; 뚖; ) HANGUL SYLLABLE DDYOJ +B697;B697;1104 116D 11BE;B697;1104 116D 11BE; # (뚗; 뚗; 뚗; 뚗; 뚗; ) HANGUL SYLLABLE DDYOC +B698;B698;1104 116D 11BF;B698;1104 116D 11BF; # (뚘; 뚘; 뚘; 뚘; 뚘; ) HANGUL SYLLABLE DDYOK +B699;B699;1104 116D 11C0;B699;1104 116D 11C0; # (뚙; 뚙; 뚙; 뚙; 뚙; ) HANGUL SYLLABLE DDYOT +B69A;B69A;1104 116D 11C1;B69A;1104 116D 11C1; # (뚚; 뚚; 뚚; 뚚; 뚚; ) HANGUL SYLLABLE DDYOP +B69B;B69B;1104 116D 11C2;B69B;1104 116D 11C2; # (뚛; 뚛; 뚛; 뚛; 뚛; ) HANGUL SYLLABLE DDYOH +B69C;B69C;1104 116E;B69C;1104 116E; # (뚜; 뚜; 뚜; 뚜; 뚜; ) HANGUL SYLLABLE DDU +B69D;B69D;1104 116E 11A8;B69D;1104 116E 11A8; # (뚝; 뚝; 뚝; 뚝; 뚝; ) HANGUL SYLLABLE DDUG +B69E;B69E;1104 116E 11A9;B69E;1104 116E 11A9; # (뚞; 뚞; 뚞; 뚞; 뚞; ) HANGUL SYLLABLE DDUGG +B69F;B69F;1104 116E 11AA;B69F;1104 116E 11AA; # (뚟; 뚟; 뚟; 뚟; 뚟; ) HANGUL SYLLABLE DDUGS +B6A0;B6A0;1104 116E 11AB;B6A0;1104 116E 11AB; # (뚠; 뚠; 뚠; 뚠; 뚠; ) HANGUL SYLLABLE DDUN +B6A1;B6A1;1104 116E 11AC;B6A1;1104 116E 11AC; # (뚡; 뚡; 뚡; 뚡; 뚡; ) HANGUL SYLLABLE DDUNJ +B6A2;B6A2;1104 116E 11AD;B6A2;1104 116E 11AD; # (뚢; 뚢; 뚢; 뚢; 뚢; ) HANGUL SYLLABLE DDUNH +B6A3;B6A3;1104 116E 11AE;B6A3;1104 116E 11AE; # (뚣; 뚣; 뚣; 뚣; 뚣; ) HANGUL SYLLABLE DDUD +B6A4;B6A4;1104 116E 11AF;B6A4;1104 116E 11AF; # (뚤; 뚤; 뚤; 뚤; 뚤; ) HANGUL SYLLABLE DDUL +B6A5;B6A5;1104 116E 11B0;B6A5;1104 116E 11B0; # (뚥; 뚥; 뚥; 뚥; 뚥; ) HANGUL SYLLABLE DDULG +B6A6;B6A6;1104 116E 11B1;B6A6;1104 116E 11B1; # (뚦; 뚦; 뚦; 뚦; 뚦; ) HANGUL SYLLABLE DDULM +B6A7;B6A7;1104 116E 11B2;B6A7;1104 116E 11B2; # (뚧; 뚧; 뚧; 뚧; 뚧; ) HANGUL SYLLABLE DDULB +B6A8;B6A8;1104 116E 11B3;B6A8;1104 116E 11B3; # (뚨; 뚨; 뚨; 뚨; 뚨; ) HANGUL SYLLABLE DDULS +B6A9;B6A9;1104 116E 11B4;B6A9;1104 116E 11B4; # (뚩; 뚩; 뚩; 뚩; 뚩; ) HANGUL SYLLABLE DDULT +B6AA;B6AA;1104 116E 11B5;B6AA;1104 116E 11B5; # (뚪; 뚪; 뚪; 뚪; 뚪; ) HANGUL SYLLABLE DDULP +B6AB;B6AB;1104 116E 11B6;B6AB;1104 116E 11B6; # (뚫; 뚫; 뚫; 뚫; 뚫; ) HANGUL SYLLABLE DDULH +B6AC;B6AC;1104 116E 11B7;B6AC;1104 116E 11B7; # (뚬; 뚬; 뚬; 뚬; 뚬; ) HANGUL SYLLABLE DDUM +B6AD;B6AD;1104 116E 11B8;B6AD;1104 116E 11B8; # (뚭; 뚭; 뚭; 뚭; 뚭; ) HANGUL SYLLABLE DDUB +B6AE;B6AE;1104 116E 11B9;B6AE;1104 116E 11B9; # (뚮; 뚮; 뚮; 뚮; 뚮; ) HANGUL SYLLABLE DDUBS +B6AF;B6AF;1104 116E 11BA;B6AF;1104 116E 11BA; # (뚯; 뚯; 뚯; 뚯; 뚯; ) HANGUL SYLLABLE DDUS +B6B0;B6B0;1104 116E 11BB;B6B0;1104 116E 11BB; # (뚰; 뚰; 뚰; 뚰; 뚰; ) HANGUL SYLLABLE DDUSS +B6B1;B6B1;1104 116E 11BC;B6B1;1104 116E 11BC; # (뚱; 뚱; 뚱; 뚱; 뚱; ) HANGUL SYLLABLE DDUNG +B6B2;B6B2;1104 116E 11BD;B6B2;1104 116E 11BD; # (뚲; 뚲; 뚲; 뚲; 뚲; ) HANGUL SYLLABLE DDUJ +B6B3;B6B3;1104 116E 11BE;B6B3;1104 116E 11BE; # (뚳; 뚳; 뚳; 뚳; 뚳; ) HANGUL SYLLABLE DDUC +B6B4;B6B4;1104 116E 11BF;B6B4;1104 116E 11BF; # (뚴; 뚴; 뚴; 뚴; 뚴; ) HANGUL SYLLABLE DDUK +B6B5;B6B5;1104 116E 11C0;B6B5;1104 116E 11C0; # (뚵; 뚵; 뚵; 뚵; 뚵; ) HANGUL SYLLABLE DDUT +B6B6;B6B6;1104 116E 11C1;B6B6;1104 116E 11C1; # (뚶; 뚶; 뚶; 뚶; 뚶; ) HANGUL SYLLABLE DDUP +B6B7;B6B7;1104 116E 11C2;B6B7;1104 116E 11C2; # (뚷; 뚷; 뚷; 뚷; 뚷; ) HANGUL SYLLABLE DDUH +B6B8;B6B8;1104 116F;B6B8;1104 116F; # (뚸; 뚸; 뚸; 뚸; 뚸; ) HANGUL SYLLABLE DDWEO +B6B9;B6B9;1104 116F 11A8;B6B9;1104 116F 11A8; # (뚹; 뚹; 뚹; 뚹; 뚹; ) HANGUL SYLLABLE DDWEOG +B6BA;B6BA;1104 116F 11A9;B6BA;1104 116F 11A9; # (뚺; 뚺; 뚺; 뚺; 뚺; ) HANGUL SYLLABLE DDWEOGG +B6BB;B6BB;1104 116F 11AA;B6BB;1104 116F 11AA; # (뚻; 뚻; 뚻; 뚻; 뚻; ) HANGUL SYLLABLE DDWEOGS +B6BC;B6BC;1104 116F 11AB;B6BC;1104 116F 11AB; # (뚼; 뚼; 뚼; 뚼; 뚼; ) HANGUL SYLLABLE DDWEON +B6BD;B6BD;1104 116F 11AC;B6BD;1104 116F 11AC; # (뚽; 뚽; 뚽; 뚽; 뚽; ) HANGUL SYLLABLE DDWEONJ +B6BE;B6BE;1104 116F 11AD;B6BE;1104 116F 11AD; # (뚾; 뚾; 뚾; 뚾; 뚾; ) HANGUL SYLLABLE DDWEONH +B6BF;B6BF;1104 116F 11AE;B6BF;1104 116F 11AE; # (뚿; 뚿; 뚿; 뚿; 뚿; ) HANGUL SYLLABLE DDWEOD +B6C0;B6C0;1104 116F 11AF;B6C0;1104 116F 11AF; # (뛀; 뛀; 뛀; 뛀; 뛀; ) HANGUL SYLLABLE DDWEOL +B6C1;B6C1;1104 116F 11B0;B6C1;1104 116F 11B0; # (뛁; 뛁; 뛁; 뛁; 뛁; ) HANGUL SYLLABLE DDWEOLG +B6C2;B6C2;1104 116F 11B1;B6C2;1104 116F 11B1; # (뛂; 뛂; 뛂; 뛂; 뛂; ) HANGUL SYLLABLE DDWEOLM +B6C3;B6C3;1104 116F 11B2;B6C3;1104 116F 11B2; # (뛃; 뛃; 뛃; 뛃; 뛃; ) HANGUL SYLLABLE DDWEOLB +B6C4;B6C4;1104 116F 11B3;B6C4;1104 116F 11B3; # (뛄; 뛄; 뛄; 뛄; 뛄; ) HANGUL SYLLABLE DDWEOLS +B6C5;B6C5;1104 116F 11B4;B6C5;1104 116F 11B4; # (뛅; 뛅; 뛅; 뛅; 뛅; ) HANGUL SYLLABLE DDWEOLT +B6C6;B6C6;1104 116F 11B5;B6C6;1104 116F 11B5; # (뛆; 뛆; 뛆; 뛆; 뛆; ) HANGUL SYLLABLE DDWEOLP +B6C7;B6C7;1104 116F 11B6;B6C7;1104 116F 11B6; # (뛇; 뛇; 뛇; 뛇; 뛇; ) HANGUL SYLLABLE DDWEOLH +B6C8;B6C8;1104 116F 11B7;B6C8;1104 116F 11B7; # (뛈; 뛈; 뛈; 뛈; 뛈; ) HANGUL SYLLABLE DDWEOM +B6C9;B6C9;1104 116F 11B8;B6C9;1104 116F 11B8; # (뛉; 뛉; 뛉; 뛉; 뛉; ) HANGUL SYLLABLE DDWEOB +B6CA;B6CA;1104 116F 11B9;B6CA;1104 116F 11B9; # (뛊; 뛊; 뛊; 뛊; 뛊; ) HANGUL SYLLABLE DDWEOBS +B6CB;B6CB;1104 116F 11BA;B6CB;1104 116F 11BA; # (뛋; 뛋; 뛋; 뛋; 뛋; ) HANGUL SYLLABLE DDWEOS +B6CC;B6CC;1104 116F 11BB;B6CC;1104 116F 11BB; # (뛌; 뛌; 뛌; 뛌; 뛌; ) HANGUL SYLLABLE DDWEOSS +B6CD;B6CD;1104 116F 11BC;B6CD;1104 116F 11BC; # (뛍; 뛍; 뛍; 뛍; 뛍; ) HANGUL SYLLABLE DDWEONG +B6CE;B6CE;1104 116F 11BD;B6CE;1104 116F 11BD; # (뛎; 뛎; 뛎; 뛎; 뛎; ) HANGUL SYLLABLE DDWEOJ +B6CF;B6CF;1104 116F 11BE;B6CF;1104 116F 11BE; # (뛏; 뛏; 뛏; 뛏; 뛏; ) HANGUL SYLLABLE DDWEOC +B6D0;B6D0;1104 116F 11BF;B6D0;1104 116F 11BF; # (뛐; 뛐; 뛐; 뛐; 뛐; ) HANGUL SYLLABLE DDWEOK +B6D1;B6D1;1104 116F 11C0;B6D1;1104 116F 11C0; # (뛑; 뛑; 뛑; 뛑; 뛑; ) HANGUL SYLLABLE DDWEOT +B6D2;B6D2;1104 116F 11C1;B6D2;1104 116F 11C1; # (뛒; 뛒; 뛒; 뛒; 뛒; ) HANGUL SYLLABLE DDWEOP +B6D3;B6D3;1104 116F 11C2;B6D3;1104 116F 11C2; # (뛓; 뛓; 뛓; 뛓; 뛓; ) HANGUL SYLLABLE DDWEOH +B6D4;B6D4;1104 1170;B6D4;1104 1170; # (뛔; 뛔; 뛔; 뛔; 뛔; ) HANGUL SYLLABLE DDWE +B6D5;B6D5;1104 1170 11A8;B6D5;1104 1170 11A8; # (뛕; 뛕; 뛕; 뛕; 뛕; ) HANGUL SYLLABLE DDWEG +B6D6;B6D6;1104 1170 11A9;B6D6;1104 1170 11A9; # (뛖; 뛖; 뛖; 뛖; 뛖; ) HANGUL SYLLABLE DDWEGG +B6D7;B6D7;1104 1170 11AA;B6D7;1104 1170 11AA; # (뛗; 뛗; 뛗; 뛗; 뛗; ) HANGUL SYLLABLE DDWEGS +B6D8;B6D8;1104 1170 11AB;B6D8;1104 1170 11AB; # (뛘; 뛘; 뛘; 뛘; 뛘; ) HANGUL SYLLABLE DDWEN +B6D9;B6D9;1104 1170 11AC;B6D9;1104 1170 11AC; # (뛙; 뛙; 뛙; 뛙; 뛙; ) HANGUL SYLLABLE DDWENJ +B6DA;B6DA;1104 1170 11AD;B6DA;1104 1170 11AD; # (뛚; 뛚; 뛚; 뛚; 뛚; ) HANGUL SYLLABLE DDWENH +B6DB;B6DB;1104 1170 11AE;B6DB;1104 1170 11AE; # (뛛; 뛛; 뛛; 뛛; 뛛; ) HANGUL SYLLABLE DDWED +B6DC;B6DC;1104 1170 11AF;B6DC;1104 1170 11AF; # (뛜; 뛜; 뛜; 뛜; 뛜; ) HANGUL SYLLABLE DDWEL +B6DD;B6DD;1104 1170 11B0;B6DD;1104 1170 11B0; # (뛝; 뛝; 뛝; 뛝; 뛝; ) HANGUL SYLLABLE DDWELG +B6DE;B6DE;1104 1170 11B1;B6DE;1104 1170 11B1; # (뛞; 뛞; 뛞; 뛞; 뛞; ) HANGUL SYLLABLE DDWELM +B6DF;B6DF;1104 1170 11B2;B6DF;1104 1170 11B2; # (뛟; 뛟; 뛟; 뛟; 뛟; ) HANGUL SYLLABLE DDWELB +B6E0;B6E0;1104 1170 11B3;B6E0;1104 1170 11B3; # (뛠; 뛠; 뛠; 뛠; 뛠; ) HANGUL SYLLABLE DDWELS +B6E1;B6E1;1104 1170 11B4;B6E1;1104 1170 11B4; # (뛡; 뛡; 뛡; 뛡; 뛡; ) HANGUL SYLLABLE DDWELT +B6E2;B6E2;1104 1170 11B5;B6E2;1104 1170 11B5; # (뛢; 뛢; 뛢; 뛢; 뛢; ) HANGUL SYLLABLE DDWELP +B6E3;B6E3;1104 1170 11B6;B6E3;1104 1170 11B6; # (뛣; 뛣; 뛣; 뛣; 뛣; ) HANGUL SYLLABLE DDWELH +B6E4;B6E4;1104 1170 11B7;B6E4;1104 1170 11B7; # (뛤; 뛤; 뛤; 뛤; 뛤; ) HANGUL SYLLABLE DDWEM +B6E5;B6E5;1104 1170 11B8;B6E5;1104 1170 11B8; # (뛥; 뛥; 뛥; 뛥; 뛥; ) HANGUL SYLLABLE DDWEB +B6E6;B6E6;1104 1170 11B9;B6E6;1104 1170 11B9; # (뛦; 뛦; 뛦; 뛦; 뛦; ) HANGUL SYLLABLE DDWEBS +B6E7;B6E7;1104 1170 11BA;B6E7;1104 1170 11BA; # (뛧; 뛧; 뛧; 뛧; 뛧; ) HANGUL SYLLABLE DDWES +B6E8;B6E8;1104 1170 11BB;B6E8;1104 1170 11BB; # (뛨; 뛨; 뛨; 뛨; 뛨; ) HANGUL SYLLABLE DDWESS +B6E9;B6E9;1104 1170 11BC;B6E9;1104 1170 11BC; # (뛩; 뛩; 뛩; 뛩; 뛩; ) HANGUL SYLLABLE DDWENG +B6EA;B6EA;1104 1170 11BD;B6EA;1104 1170 11BD; # (뛪; 뛪; 뛪; 뛪; 뛪; ) HANGUL SYLLABLE DDWEJ +B6EB;B6EB;1104 1170 11BE;B6EB;1104 1170 11BE; # (뛫; 뛫; 뛫; 뛫; 뛫; ) HANGUL SYLLABLE DDWEC +B6EC;B6EC;1104 1170 11BF;B6EC;1104 1170 11BF; # (뛬; 뛬; 뛬; 뛬; 뛬; ) HANGUL SYLLABLE DDWEK +B6ED;B6ED;1104 1170 11C0;B6ED;1104 1170 11C0; # (뛭; 뛭; 뛭; 뛭; 뛭; ) HANGUL SYLLABLE DDWET +B6EE;B6EE;1104 1170 11C1;B6EE;1104 1170 11C1; # (뛮; 뛮; 뛮; 뛮; 뛮; ) HANGUL SYLLABLE DDWEP +B6EF;B6EF;1104 1170 11C2;B6EF;1104 1170 11C2; # (뛯; 뛯; 뛯; 뛯; 뛯; ) HANGUL SYLLABLE DDWEH +B6F0;B6F0;1104 1171;B6F0;1104 1171; # (뛰; 뛰; 뛰; 뛰; 뛰; ) HANGUL SYLLABLE DDWI +B6F1;B6F1;1104 1171 11A8;B6F1;1104 1171 11A8; # (뛱; 뛱; 뛱; 뛱; 뛱; ) HANGUL SYLLABLE DDWIG +B6F2;B6F2;1104 1171 11A9;B6F2;1104 1171 11A9; # (뛲; 뛲; 뛲; 뛲; 뛲; ) HANGUL SYLLABLE DDWIGG +B6F3;B6F3;1104 1171 11AA;B6F3;1104 1171 11AA; # (뛳; 뛳; 뛳; 뛳; 뛳; ) HANGUL SYLLABLE DDWIGS +B6F4;B6F4;1104 1171 11AB;B6F4;1104 1171 11AB; # (뛴; 뛴; 뛴; 뛴; 뛴; ) HANGUL SYLLABLE DDWIN +B6F5;B6F5;1104 1171 11AC;B6F5;1104 1171 11AC; # (뛵; 뛵; 뛵; 뛵; 뛵; ) HANGUL SYLLABLE DDWINJ +B6F6;B6F6;1104 1171 11AD;B6F6;1104 1171 11AD; # (뛶; 뛶; 뛶; 뛶; 뛶; ) HANGUL SYLLABLE DDWINH +B6F7;B6F7;1104 1171 11AE;B6F7;1104 1171 11AE; # (뛷; 뛷; 뛷; 뛷; 뛷; ) HANGUL SYLLABLE DDWID +B6F8;B6F8;1104 1171 11AF;B6F8;1104 1171 11AF; # (뛸; 뛸; 뛸; 뛸; 뛸; ) HANGUL SYLLABLE DDWIL +B6F9;B6F9;1104 1171 11B0;B6F9;1104 1171 11B0; # (뛹; 뛹; 뛹; 뛹; 뛹; ) HANGUL SYLLABLE DDWILG +B6FA;B6FA;1104 1171 11B1;B6FA;1104 1171 11B1; # (뛺; 뛺; 뛺; 뛺; 뛺; ) HANGUL SYLLABLE DDWILM +B6FB;B6FB;1104 1171 11B2;B6FB;1104 1171 11B2; # (뛻; 뛻; 뛻; 뛻; 뛻; ) HANGUL SYLLABLE DDWILB +B6FC;B6FC;1104 1171 11B3;B6FC;1104 1171 11B3; # (뛼; 뛼; 뛼; 뛼; 뛼; ) HANGUL SYLLABLE DDWILS +B6FD;B6FD;1104 1171 11B4;B6FD;1104 1171 11B4; # (뛽; 뛽; 뛽; 뛽; 뛽; ) HANGUL SYLLABLE DDWILT +B6FE;B6FE;1104 1171 11B5;B6FE;1104 1171 11B5; # (뛾; 뛾; 뛾; 뛾; 뛾; ) HANGUL SYLLABLE DDWILP +B6FF;B6FF;1104 1171 11B6;B6FF;1104 1171 11B6; # (뛿; 뛿; 뛿; 뛿; 뛿; ) HANGUL SYLLABLE DDWILH +B700;B700;1104 1171 11B7;B700;1104 1171 11B7; # (뜀; 뜀; 뜀; 뜀; 뜀; ) HANGUL SYLLABLE DDWIM +B701;B701;1104 1171 11B8;B701;1104 1171 11B8; # (뜁; 뜁; 뜁; 뜁; 뜁; ) HANGUL SYLLABLE DDWIB +B702;B702;1104 1171 11B9;B702;1104 1171 11B9; # (뜂; 뜂; 뜂; 뜂; 뜂; ) HANGUL SYLLABLE DDWIBS +B703;B703;1104 1171 11BA;B703;1104 1171 11BA; # (뜃; 뜃; 뜃; 뜃; 뜃; ) HANGUL SYLLABLE DDWIS +B704;B704;1104 1171 11BB;B704;1104 1171 11BB; # (뜄; 뜄; 뜄; 뜄; 뜄; ) HANGUL SYLLABLE DDWISS +B705;B705;1104 1171 11BC;B705;1104 1171 11BC; # (뜅; 뜅; 뜅; 뜅; 뜅; ) HANGUL SYLLABLE DDWING +B706;B706;1104 1171 11BD;B706;1104 1171 11BD; # (뜆; 뜆; 뜆; 뜆; 뜆; ) HANGUL SYLLABLE DDWIJ +B707;B707;1104 1171 11BE;B707;1104 1171 11BE; # (뜇; 뜇; 뜇; 뜇; 뜇; ) HANGUL SYLLABLE DDWIC +B708;B708;1104 1171 11BF;B708;1104 1171 11BF; # (뜈; 뜈; 뜈; 뜈; 뜈; ) HANGUL SYLLABLE DDWIK +B709;B709;1104 1171 11C0;B709;1104 1171 11C0; # (뜉; 뜉; 뜉; 뜉; 뜉; ) HANGUL SYLLABLE DDWIT +B70A;B70A;1104 1171 11C1;B70A;1104 1171 11C1; # (뜊; 뜊; 뜊; 뜊; 뜊; ) HANGUL SYLLABLE DDWIP +B70B;B70B;1104 1171 11C2;B70B;1104 1171 11C2; # (뜋; 뜋; 뜋; 뜋; 뜋; ) HANGUL SYLLABLE DDWIH +B70C;B70C;1104 1172;B70C;1104 1172; # (뜌; 뜌; 뜌; 뜌; 뜌; ) HANGUL SYLLABLE DDYU +B70D;B70D;1104 1172 11A8;B70D;1104 1172 11A8; # (뜍; 뜍; 뜍; 뜍; 뜍; ) HANGUL SYLLABLE DDYUG +B70E;B70E;1104 1172 11A9;B70E;1104 1172 11A9; # (뜎; 뜎; 뜎; 뜎; 뜎; ) HANGUL SYLLABLE DDYUGG +B70F;B70F;1104 1172 11AA;B70F;1104 1172 11AA; # (뜏; 뜏; 뜏; 뜏; 뜏; ) HANGUL SYLLABLE DDYUGS +B710;B710;1104 1172 11AB;B710;1104 1172 11AB; # (뜐; 뜐; 뜐; 뜐; 뜐; ) HANGUL SYLLABLE DDYUN +B711;B711;1104 1172 11AC;B711;1104 1172 11AC; # (뜑; 뜑; 뜑; 뜑; 뜑; ) HANGUL SYLLABLE DDYUNJ +B712;B712;1104 1172 11AD;B712;1104 1172 11AD; # (뜒; 뜒; 뜒; 뜒; 뜒; ) HANGUL SYLLABLE DDYUNH +B713;B713;1104 1172 11AE;B713;1104 1172 11AE; # (뜓; 뜓; 뜓; 뜓; 뜓; ) HANGUL SYLLABLE DDYUD +B714;B714;1104 1172 11AF;B714;1104 1172 11AF; # (뜔; 뜔; 뜔; 뜔; 뜔; ) HANGUL SYLLABLE DDYUL +B715;B715;1104 1172 11B0;B715;1104 1172 11B0; # (뜕; 뜕; 뜕; 뜕; 뜕; ) HANGUL SYLLABLE DDYULG +B716;B716;1104 1172 11B1;B716;1104 1172 11B1; # (뜖; 뜖; 뜖; 뜖; 뜖; ) HANGUL SYLLABLE DDYULM +B717;B717;1104 1172 11B2;B717;1104 1172 11B2; # (뜗; 뜗; 뜗; 뜗; 뜗; ) HANGUL SYLLABLE DDYULB +B718;B718;1104 1172 11B3;B718;1104 1172 11B3; # (뜘; 뜘; 뜘; 뜘; 뜘; ) HANGUL SYLLABLE DDYULS +B719;B719;1104 1172 11B4;B719;1104 1172 11B4; # (뜙; 뜙; 뜙; 뜙; 뜙; ) HANGUL SYLLABLE DDYULT +B71A;B71A;1104 1172 11B5;B71A;1104 1172 11B5; # (뜚; 뜚; 뜚; 뜚; 뜚; ) HANGUL SYLLABLE DDYULP +B71B;B71B;1104 1172 11B6;B71B;1104 1172 11B6; # (뜛; 뜛; 뜛; 뜛; 뜛; ) HANGUL SYLLABLE DDYULH +B71C;B71C;1104 1172 11B7;B71C;1104 1172 11B7; # (뜜; 뜜; 뜜; 뜜; 뜜; ) HANGUL SYLLABLE DDYUM +B71D;B71D;1104 1172 11B8;B71D;1104 1172 11B8; # (뜝; 뜝; 뜝; 뜝; 뜝; ) HANGUL SYLLABLE DDYUB +B71E;B71E;1104 1172 11B9;B71E;1104 1172 11B9; # (뜞; 뜞; 뜞; 뜞; 뜞; ) HANGUL SYLLABLE DDYUBS +B71F;B71F;1104 1172 11BA;B71F;1104 1172 11BA; # (뜟; 뜟; 뜟; 뜟; 뜟; ) HANGUL SYLLABLE DDYUS +B720;B720;1104 1172 11BB;B720;1104 1172 11BB; # (뜠; 뜠; 뜠; 뜠; 뜠; ) HANGUL SYLLABLE DDYUSS +B721;B721;1104 1172 11BC;B721;1104 1172 11BC; # (뜡; 뜡; 뜡; 뜡; 뜡; ) HANGUL SYLLABLE DDYUNG +B722;B722;1104 1172 11BD;B722;1104 1172 11BD; # (뜢; 뜢; 뜢; 뜢; 뜢; ) HANGUL SYLLABLE DDYUJ +B723;B723;1104 1172 11BE;B723;1104 1172 11BE; # (뜣; 뜣; 뜣; 뜣; 뜣; ) HANGUL SYLLABLE DDYUC +B724;B724;1104 1172 11BF;B724;1104 1172 11BF; # (뜤; 뜤; 뜤; 뜤; 뜤; ) HANGUL SYLLABLE DDYUK +B725;B725;1104 1172 11C0;B725;1104 1172 11C0; # (뜥; 뜥; 뜥; 뜥; 뜥; ) HANGUL SYLLABLE DDYUT +B726;B726;1104 1172 11C1;B726;1104 1172 11C1; # (뜦; 뜦; 뜦; 뜦; 뜦; ) HANGUL SYLLABLE DDYUP +B727;B727;1104 1172 11C2;B727;1104 1172 11C2; # (뜧; 뜧; 뜧; 뜧; 뜧; ) HANGUL SYLLABLE DDYUH +B728;B728;1104 1173;B728;1104 1173; # (뜨; 뜨; 뜨; 뜨; 뜨; ) HANGUL SYLLABLE DDEU +B729;B729;1104 1173 11A8;B729;1104 1173 11A8; # (뜩; 뜩; 뜩; 뜩; 뜩; ) HANGUL SYLLABLE DDEUG +B72A;B72A;1104 1173 11A9;B72A;1104 1173 11A9; # (뜪; 뜪; 뜪; 뜪; 뜪; ) HANGUL SYLLABLE DDEUGG +B72B;B72B;1104 1173 11AA;B72B;1104 1173 11AA; # (뜫; 뜫; 뜫; 뜫; 뜫; ) HANGUL SYLLABLE DDEUGS +B72C;B72C;1104 1173 11AB;B72C;1104 1173 11AB; # (뜬; 뜬; 뜬; 뜬; 뜬; ) HANGUL SYLLABLE DDEUN +B72D;B72D;1104 1173 11AC;B72D;1104 1173 11AC; # (뜭; 뜭; 뜭; 뜭; 뜭; ) HANGUL SYLLABLE DDEUNJ +B72E;B72E;1104 1173 11AD;B72E;1104 1173 11AD; # (뜮; 뜮; 뜮; 뜮; 뜮; ) HANGUL SYLLABLE DDEUNH +B72F;B72F;1104 1173 11AE;B72F;1104 1173 11AE; # (뜯; 뜯; 뜯; 뜯; 뜯; ) HANGUL SYLLABLE DDEUD +B730;B730;1104 1173 11AF;B730;1104 1173 11AF; # (뜰; 뜰; 뜰; 뜰; 뜰; ) HANGUL SYLLABLE DDEUL +B731;B731;1104 1173 11B0;B731;1104 1173 11B0; # (뜱; 뜱; 뜱; 뜱; 뜱; ) HANGUL SYLLABLE DDEULG +B732;B732;1104 1173 11B1;B732;1104 1173 11B1; # (뜲; 뜲; 뜲; 뜲; 뜲; ) HANGUL SYLLABLE DDEULM +B733;B733;1104 1173 11B2;B733;1104 1173 11B2; # (뜳; 뜳; 뜳; 뜳; 뜳; ) HANGUL SYLLABLE DDEULB +B734;B734;1104 1173 11B3;B734;1104 1173 11B3; # (뜴; 뜴; 뜴; 뜴; 뜴; ) HANGUL SYLLABLE DDEULS +B735;B735;1104 1173 11B4;B735;1104 1173 11B4; # (뜵; 뜵; 뜵; 뜵; 뜵; ) HANGUL SYLLABLE DDEULT +B736;B736;1104 1173 11B5;B736;1104 1173 11B5; # (뜶; 뜶; 뜶; 뜶; 뜶; ) HANGUL SYLLABLE DDEULP +B737;B737;1104 1173 11B6;B737;1104 1173 11B6; # (뜷; 뜷; 뜷; 뜷; 뜷; ) HANGUL SYLLABLE DDEULH +B738;B738;1104 1173 11B7;B738;1104 1173 11B7; # (뜸; 뜸; 뜸; 뜸; 뜸; ) HANGUL SYLLABLE DDEUM +B739;B739;1104 1173 11B8;B739;1104 1173 11B8; # (뜹; 뜹; 뜹; 뜹; 뜹; ) HANGUL SYLLABLE DDEUB +B73A;B73A;1104 1173 11B9;B73A;1104 1173 11B9; # (뜺; 뜺; 뜺; 뜺; 뜺; ) HANGUL SYLLABLE DDEUBS +B73B;B73B;1104 1173 11BA;B73B;1104 1173 11BA; # (뜻; 뜻; 뜻; 뜻; 뜻; ) HANGUL SYLLABLE DDEUS +B73C;B73C;1104 1173 11BB;B73C;1104 1173 11BB; # (뜼; 뜼; 뜼; 뜼; 뜼; ) HANGUL SYLLABLE DDEUSS +B73D;B73D;1104 1173 11BC;B73D;1104 1173 11BC; # (뜽; 뜽; 뜽; 뜽; 뜽; ) HANGUL SYLLABLE DDEUNG +B73E;B73E;1104 1173 11BD;B73E;1104 1173 11BD; # (뜾; 뜾; 뜾; 뜾; 뜾; ) HANGUL SYLLABLE DDEUJ +B73F;B73F;1104 1173 11BE;B73F;1104 1173 11BE; # (뜿; 뜿; 뜿; 뜿; 뜿; ) HANGUL SYLLABLE DDEUC +B740;B740;1104 1173 11BF;B740;1104 1173 11BF; # (띀; 띀; 띀; 띀; 띀; ) HANGUL SYLLABLE DDEUK +B741;B741;1104 1173 11C0;B741;1104 1173 11C0; # (띁; 띁; 띁; 띁; 띁; ) HANGUL SYLLABLE DDEUT +B742;B742;1104 1173 11C1;B742;1104 1173 11C1; # (띂; 띂; 띂; 띂; 띂; ) HANGUL SYLLABLE DDEUP +B743;B743;1104 1173 11C2;B743;1104 1173 11C2; # (띃; 띃; 띃; 띃; 띃; ) HANGUL SYLLABLE DDEUH +B744;B744;1104 1174;B744;1104 1174; # (띄; 띄; 띄; 띄; 띄; ) HANGUL SYLLABLE DDYI +B745;B745;1104 1174 11A8;B745;1104 1174 11A8; # (띅; 띅; 띅; 띅; 띅; ) HANGUL SYLLABLE DDYIG +B746;B746;1104 1174 11A9;B746;1104 1174 11A9; # (띆; 띆; 띆; 띆; 띆; ) HANGUL SYLLABLE DDYIGG +B747;B747;1104 1174 11AA;B747;1104 1174 11AA; # (띇; 띇; 띇; 띇; 띇; ) HANGUL SYLLABLE DDYIGS +B748;B748;1104 1174 11AB;B748;1104 1174 11AB; # (띈; 띈; 띈; 띈; 띈; ) HANGUL SYLLABLE DDYIN +B749;B749;1104 1174 11AC;B749;1104 1174 11AC; # (띉; 띉; 띉; 띉; 띉; ) HANGUL SYLLABLE DDYINJ +B74A;B74A;1104 1174 11AD;B74A;1104 1174 11AD; # (띊; 띊; 띊; 띊; 띊; ) HANGUL SYLLABLE DDYINH +B74B;B74B;1104 1174 11AE;B74B;1104 1174 11AE; # (띋; 띋; 띋; 띋; 띋; ) HANGUL SYLLABLE DDYID +B74C;B74C;1104 1174 11AF;B74C;1104 1174 11AF; # (띌; 띌; 띌; 띌; 띌; ) HANGUL SYLLABLE DDYIL +B74D;B74D;1104 1174 11B0;B74D;1104 1174 11B0; # (띍; 띍; 띍; 띍; 띍; ) HANGUL SYLLABLE DDYILG +B74E;B74E;1104 1174 11B1;B74E;1104 1174 11B1; # (띎; 띎; 띎; 띎; 띎; ) HANGUL SYLLABLE DDYILM +B74F;B74F;1104 1174 11B2;B74F;1104 1174 11B2; # (띏; 띏; 띏; 띏; 띏; ) HANGUL SYLLABLE DDYILB +B750;B750;1104 1174 11B3;B750;1104 1174 11B3; # (띐; 띐; 띐; 띐; 띐; ) HANGUL SYLLABLE DDYILS +B751;B751;1104 1174 11B4;B751;1104 1174 11B4; # (띑; 띑; 띑; 띑; 띑; ) HANGUL SYLLABLE DDYILT +B752;B752;1104 1174 11B5;B752;1104 1174 11B5; # (띒; 띒; 띒; 띒; 띒; ) HANGUL SYLLABLE DDYILP +B753;B753;1104 1174 11B6;B753;1104 1174 11B6; # (띓; 띓; 띓; 띓; 띓; ) HANGUL SYLLABLE DDYILH +B754;B754;1104 1174 11B7;B754;1104 1174 11B7; # (띔; 띔; 띔; 띔; 띔; ) HANGUL SYLLABLE DDYIM +B755;B755;1104 1174 11B8;B755;1104 1174 11B8; # (띕; 띕; 띕; 띕; 띕; ) HANGUL SYLLABLE DDYIB +B756;B756;1104 1174 11B9;B756;1104 1174 11B9; # (띖; 띖; 띖; 띖; 띖; ) HANGUL SYLLABLE DDYIBS +B757;B757;1104 1174 11BA;B757;1104 1174 11BA; # (띗; 띗; 띗; 띗; 띗; ) HANGUL SYLLABLE DDYIS +B758;B758;1104 1174 11BB;B758;1104 1174 11BB; # (띘; 띘; 띘; 띘; 띘; ) HANGUL SYLLABLE DDYISS +B759;B759;1104 1174 11BC;B759;1104 1174 11BC; # (띙; 띙; 띙; 띙; 띙; ) HANGUL SYLLABLE DDYING +B75A;B75A;1104 1174 11BD;B75A;1104 1174 11BD; # (띚; 띚; 띚; 띚; 띚; ) HANGUL SYLLABLE DDYIJ +B75B;B75B;1104 1174 11BE;B75B;1104 1174 11BE; # (띛; 띛; 띛; 띛; 띛; ) HANGUL SYLLABLE DDYIC +B75C;B75C;1104 1174 11BF;B75C;1104 1174 11BF; # (띜; 띜; 띜; 띜; 띜; ) HANGUL SYLLABLE DDYIK +B75D;B75D;1104 1174 11C0;B75D;1104 1174 11C0; # (띝; 띝; 띝; 띝; 띝; ) HANGUL SYLLABLE DDYIT +B75E;B75E;1104 1174 11C1;B75E;1104 1174 11C1; # (띞; 띞; 띞; 띞; 띞; ) HANGUL SYLLABLE DDYIP +B75F;B75F;1104 1174 11C2;B75F;1104 1174 11C2; # (띟; 띟; 띟; 띟; 띟; ) HANGUL SYLLABLE DDYIH +B760;B760;1104 1175;B760;1104 1175; # (띠; 띠; 띠; 띠; 띠; ) HANGUL SYLLABLE DDI +B761;B761;1104 1175 11A8;B761;1104 1175 11A8; # (띡; 띡; 띡; 띡; 띡; ) HANGUL SYLLABLE DDIG +B762;B762;1104 1175 11A9;B762;1104 1175 11A9; # (띢; 띢; 띢; 띢; 띢; ) HANGUL SYLLABLE DDIGG +B763;B763;1104 1175 11AA;B763;1104 1175 11AA; # (띣; 띣; 띣; 띣; 띣; ) HANGUL SYLLABLE DDIGS +B764;B764;1104 1175 11AB;B764;1104 1175 11AB; # (띤; 띤; 띤; 띤; 띤; ) HANGUL SYLLABLE DDIN +B765;B765;1104 1175 11AC;B765;1104 1175 11AC; # (띥; 띥; 띥; 띥; 띥; ) HANGUL SYLLABLE DDINJ +B766;B766;1104 1175 11AD;B766;1104 1175 11AD; # (띦; 띦; 띦; 띦; 띦; ) HANGUL SYLLABLE DDINH +B767;B767;1104 1175 11AE;B767;1104 1175 11AE; # (띧; 띧; 띧; 띧; 띧; ) HANGUL SYLLABLE DDID +B768;B768;1104 1175 11AF;B768;1104 1175 11AF; # (띨; 띨; 띨; 띨; 띨; ) HANGUL SYLLABLE DDIL +B769;B769;1104 1175 11B0;B769;1104 1175 11B0; # (띩; 띩; 띩; 띩; 띩; ) HANGUL SYLLABLE DDILG +B76A;B76A;1104 1175 11B1;B76A;1104 1175 11B1; # (띪; 띪; 띪; 띪; 띪; ) HANGUL SYLLABLE DDILM +B76B;B76B;1104 1175 11B2;B76B;1104 1175 11B2; # (띫; 띫; 띫; 띫; 띫; ) HANGUL SYLLABLE DDILB +B76C;B76C;1104 1175 11B3;B76C;1104 1175 11B3; # (띬; 띬; 띬; 띬; 띬; ) HANGUL SYLLABLE DDILS +B76D;B76D;1104 1175 11B4;B76D;1104 1175 11B4; # (띭; 띭; 띭; 띭; 띭; ) HANGUL SYLLABLE DDILT +B76E;B76E;1104 1175 11B5;B76E;1104 1175 11B5; # (띮; 띮; 띮; 띮; 띮; ) HANGUL SYLLABLE DDILP +B76F;B76F;1104 1175 11B6;B76F;1104 1175 11B6; # (띯; 띯; 띯; 띯; 띯; ) HANGUL SYLLABLE DDILH +B770;B770;1104 1175 11B7;B770;1104 1175 11B7; # (띰; 띰; 띰; 띰; 띰; ) HANGUL SYLLABLE DDIM +B771;B771;1104 1175 11B8;B771;1104 1175 11B8; # (띱; 띱; 띱; 띱; 띱; ) HANGUL SYLLABLE DDIB +B772;B772;1104 1175 11B9;B772;1104 1175 11B9; # (띲; 띲; 띲; 띲; 띲; ) HANGUL SYLLABLE DDIBS +B773;B773;1104 1175 11BA;B773;1104 1175 11BA; # (띳; 띳; 띳; 띳; 띳; ) HANGUL SYLLABLE DDIS +B774;B774;1104 1175 11BB;B774;1104 1175 11BB; # (띴; 띴; 띴; 띴; 띴; ) HANGUL SYLLABLE DDISS +B775;B775;1104 1175 11BC;B775;1104 1175 11BC; # (띵; 띵; 띵; 띵; 띵; ) HANGUL SYLLABLE DDING +B776;B776;1104 1175 11BD;B776;1104 1175 11BD; # (띶; 띶; 띶; 띶; 띶; ) HANGUL SYLLABLE DDIJ +B777;B777;1104 1175 11BE;B777;1104 1175 11BE; # (띷; 띷; 띷; 띷; 띷; ) HANGUL SYLLABLE DDIC +B778;B778;1104 1175 11BF;B778;1104 1175 11BF; # (띸; 띸; 띸; 띸; 띸; ) HANGUL SYLLABLE DDIK +B779;B779;1104 1175 11C0;B779;1104 1175 11C0; # (띹; 띹; 띹; 띹; 띹; ) HANGUL SYLLABLE DDIT +B77A;B77A;1104 1175 11C1;B77A;1104 1175 11C1; # (띺; 띺; 띺; 띺; 띺; ) HANGUL SYLLABLE DDIP +B77B;B77B;1104 1175 11C2;B77B;1104 1175 11C2; # (띻; 띻; 띻; 띻; 띻; ) HANGUL SYLLABLE DDIH +B77C;B77C;1105 1161;B77C;1105 1161; # (라; 라; 라; 라; 라; ) HANGUL SYLLABLE RA +B77D;B77D;1105 1161 11A8;B77D;1105 1161 11A8; # (락; 락; 락; 락; 락; ) HANGUL SYLLABLE RAG +B77E;B77E;1105 1161 11A9;B77E;1105 1161 11A9; # (띾; 띾; 띾; 띾; 띾; ) HANGUL SYLLABLE RAGG +B77F;B77F;1105 1161 11AA;B77F;1105 1161 11AA; # (띿; 띿; 띿; 띿; 띿; ) HANGUL SYLLABLE RAGS +B780;B780;1105 1161 11AB;B780;1105 1161 11AB; # (란; 란; 란; 란; 란; ) HANGUL SYLLABLE RAN +B781;B781;1105 1161 11AC;B781;1105 1161 11AC; # (랁; 랁; 랁; 랁; 랁; ) HANGUL SYLLABLE RANJ +B782;B782;1105 1161 11AD;B782;1105 1161 11AD; # (랂; 랂; 랂; 랂; 랂; ) HANGUL SYLLABLE RANH +B783;B783;1105 1161 11AE;B783;1105 1161 11AE; # (랃; 랃; 랃; 랃; 랃; ) HANGUL SYLLABLE RAD +B784;B784;1105 1161 11AF;B784;1105 1161 11AF; # (랄; 랄; 랄; 랄; 랄; ) HANGUL SYLLABLE RAL +B785;B785;1105 1161 11B0;B785;1105 1161 11B0; # (랅; 랅; 랅; 랅; 랅; ) HANGUL SYLLABLE RALG +B786;B786;1105 1161 11B1;B786;1105 1161 11B1; # (랆; 랆; 랆; 랆; 랆; ) HANGUL SYLLABLE RALM +B787;B787;1105 1161 11B2;B787;1105 1161 11B2; # (랇; 랇; 랇; 랇; 랇; ) HANGUL SYLLABLE RALB +B788;B788;1105 1161 11B3;B788;1105 1161 11B3; # (랈; 랈; 랈; 랈; 랈; ) HANGUL SYLLABLE RALS +B789;B789;1105 1161 11B4;B789;1105 1161 11B4; # (랉; 랉; 랉; 랉; 랉; ) HANGUL SYLLABLE RALT +B78A;B78A;1105 1161 11B5;B78A;1105 1161 11B5; # (랊; 랊; 랊; 랊; 랊; ) HANGUL SYLLABLE RALP +B78B;B78B;1105 1161 11B6;B78B;1105 1161 11B6; # (랋; 랋; 랋; 랋; 랋; ) HANGUL SYLLABLE RALH +B78C;B78C;1105 1161 11B7;B78C;1105 1161 11B7; # (람; 람; 람; 람; 람; ) HANGUL SYLLABLE RAM +B78D;B78D;1105 1161 11B8;B78D;1105 1161 11B8; # (랍; 랍; 랍; 랍; 랍; ) HANGUL SYLLABLE RAB +B78E;B78E;1105 1161 11B9;B78E;1105 1161 11B9; # (랎; 랎; 랎; 랎; 랎; ) HANGUL SYLLABLE RABS +B78F;B78F;1105 1161 11BA;B78F;1105 1161 11BA; # (랏; 랏; 랏; 랏; 랏; ) HANGUL SYLLABLE RAS +B790;B790;1105 1161 11BB;B790;1105 1161 11BB; # (랐; 랐; 랐; 랐; 랐; ) HANGUL SYLLABLE RASS +B791;B791;1105 1161 11BC;B791;1105 1161 11BC; # (랑; 랑; 랑; 랑; 랑; ) HANGUL SYLLABLE RANG +B792;B792;1105 1161 11BD;B792;1105 1161 11BD; # (랒; 랒; 랒; 랒; 랒; ) HANGUL SYLLABLE RAJ +B793;B793;1105 1161 11BE;B793;1105 1161 11BE; # (랓; 랓; 랓; 랓; 랓; ) HANGUL SYLLABLE RAC +B794;B794;1105 1161 11BF;B794;1105 1161 11BF; # (랔; 랔; 랔; 랔; 랔; ) HANGUL SYLLABLE RAK +B795;B795;1105 1161 11C0;B795;1105 1161 11C0; # (랕; 랕; 랕; 랕; 랕; ) HANGUL SYLLABLE RAT +B796;B796;1105 1161 11C1;B796;1105 1161 11C1; # (랖; 랖; 랖; 랖; 랖; ) HANGUL SYLLABLE RAP +B797;B797;1105 1161 11C2;B797;1105 1161 11C2; # (랗; 랗; 랗; 랗; 랗; ) HANGUL SYLLABLE RAH +B798;B798;1105 1162;B798;1105 1162; # (래; 래; 래; 래; 래; ) HANGUL SYLLABLE RAE +B799;B799;1105 1162 11A8;B799;1105 1162 11A8; # (랙; 랙; 랙; 랙; 랙; ) HANGUL SYLLABLE RAEG +B79A;B79A;1105 1162 11A9;B79A;1105 1162 11A9; # (랚; 랚; 랚; 랚; 랚; ) HANGUL SYLLABLE RAEGG +B79B;B79B;1105 1162 11AA;B79B;1105 1162 11AA; # (랛; 랛; 랛; 랛; 랛; ) HANGUL SYLLABLE RAEGS +B79C;B79C;1105 1162 11AB;B79C;1105 1162 11AB; # (랜; 랜; 랜; 랜; 랜; ) HANGUL SYLLABLE RAEN +B79D;B79D;1105 1162 11AC;B79D;1105 1162 11AC; # (랝; 랝; 랝; 랝; 랝; ) HANGUL SYLLABLE RAENJ +B79E;B79E;1105 1162 11AD;B79E;1105 1162 11AD; # (랞; 랞; 랞; 랞; 랞; ) HANGUL SYLLABLE RAENH +B79F;B79F;1105 1162 11AE;B79F;1105 1162 11AE; # (랟; 랟; 랟; 랟; 랟; ) HANGUL SYLLABLE RAED +B7A0;B7A0;1105 1162 11AF;B7A0;1105 1162 11AF; # (랠; 랠; 랠; 랠; 랠; ) HANGUL SYLLABLE RAEL +B7A1;B7A1;1105 1162 11B0;B7A1;1105 1162 11B0; # (랡; 랡; 랡; 랡; 랡; ) HANGUL SYLLABLE RAELG +B7A2;B7A2;1105 1162 11B1;B7A2;1105 1162 11B1; # (랢; 랢; 랢; 랢; 랢; ) HANGUL SYLLABLE RAELM +B7A3;B7A3;1105 1162 11B2;B7A3;1105 1162 11B2; # (랣; 랣; 랣; 랣; 랣; ) HANGUL SYLLABLE RAELB +B7A4;B7A4;1105 1162 11B3;B7A4;1105 1162 11B3; # (랤; 랤; 랤; 랤; 랤; ) HANGUL SYLLABLE RAELS +B7A5;B7A5;1105 1162 11B4;B7A5;1105 1162 11B4; # (랥; 랥; 랥; 랥; 랥; ) HANGUL SYLLABLE RAELT +B7A6;B7A6;1105 1162 11B5;B7A6;1105 1162 11B5; # (랦; 랦; 랦; 랦; 랦; ) HANGUL SYLLABLE RAELP +B7A7;B7A7;1105 1162 11B6;B7A7;1105 1162 11B6; # (랧; 랧; 랧; 랧; 랧; ) HANGUL SYLLABLE RAELH +B7A8;B7A8;1105 1162 11B7;B7A8;1105 1162 11B7; # (램; 램; 램; 램; 램; ) HANGUL SYLLABLE RAEM +B7A9;B7A9;1105 1162 11B8;B7A9;1105 1162 11B8; # (랩; 랩; 랩; 랩; 랩; ) HANGUL SYLLABLE RAEB +B7AA;B7AA;1105 1162 11B9;B7AA;1105 1162 11B9; # (랪; 랪; 랪; 랪; 랪; ) HANGUL SYLLABLE RAEBS +B7AB;B7AB;1105 1162 11BA;B7AB;1105 1162 11BA; # (랫; 랫; 랫; 랫; 랫; ) HANGUL SYLLABLE RAES +B7AC;B7AC;1105 1162 11BB;B7AC;1105 1162 11BB; # (랬; 랬; 랬; 랬; 랬; ) HANGUL SYLLABLE RAESS +B7AD;B7AD;1105 1162 11BC;B7AD;1105 1162 11BC; # (랭; 랭; 랭; 랭; 랭; ) HANGUL SYLLABLE RAENG +B7AE;B7AE;1105 1162 11BD;B7AE;1105 1162 11BD; # (랮; 랮; 랮; 랮; 랮; ) HANGUL SYLLABLE RAEJ +B7AF;B7AF;1105 1162 11BE;B7AF;1105 1162 11BE; # (랯; 랯; 랯; 랯; 랯; ) HANGUL SYLLABLE RAEC +B7B0;B7B0;1105 1162 11BF;B7B0;1105 1162 11BF; # (랰; 랰; 랰; 랰; 랰; ) HANGUL SYLLABLE RAEK +B7B1;B7B1;1105 1162 11C0;B7B1;1105 1162 11C0; # (랱; 랱; 랱; 랱; 랱; ) HANGUL SYLLABLE RAET +B7B2;B7B2;1105 1162 11C1;B7B2;1105 1162 11C1; # (랲; 랲; 랲; 랲; 랲; ) HANGUL SYLLABLE RAEP +B7B3;B7B3;1105 1162 11C2;B7B3;1105 1162 11C2; # (랳; 랳; 랳; 랳; 랳; ) HANGUL SYLLABLE RAEH +B7B4;B7B4;1105 1163;B7B4;1105 1163; # (랴; 랴; 랴; 랴; 랴; ) HANGUL SYLLABLE RYA +B7B5;B7B5;1105 1163 11A8;B7B5;1105 1163 11A8; # (략; 략; 략; 략; 략; ) HANGUL SYLLABLE RYAG +B7B6;B7B6;1105 1163 11A9;B7B6;1105 1163 11A9; # (랶; 랶; 랶; 랶; 랶; ) HANGUL SYLLABLE RYAGG +B7B7;B7B7;1105 1163 11AA;B7B7;1105 1163 11AA; # (랷; 랷; 랷; 랷; 랷; ) HANGUL SYLLABLE RYAGS +B7B8;B7B8;1105 1163 11AB;B7B8;1105 1163 11AB; # (랸; 랸; 랸; 랸; 랸; ) HANGUL SYLLABLE RYAN +B7B9;B7B9;1105 1163 11AC;B7B9;1105 1163 11AC; # (랹; 랹; 랹; 랹; 랹; ) HANGUL SYLLABLE RYANJ +B7BA;B7BA;1105 1163 11AD;B7BA;1105 1163 11AD; # (랺; 랺; 랺; 랺; 랺; ) HANGUL SYLLABLE RYANH +B7BB;B7BB;1105 1163 11AE;B7BB;1105 1163 11AE; # (랻; 랻; 랻; 랻; 랻; ) HANGUL SYLLABLE RYAD +B7BC;B7BC;1105 1163 11AF;B7BC;1105 1163 11AF; # (랼; 랼; 랼; 랼; 랼; ) HANGUL SYLLABLE RYAL +B7BD;B7BD;1105 1163 11B0;B7BD;1105 1163 11B0; # (랽; 랽; 랽; 랽; 랽; ) HANGUL SYLLABLE RYALG +B7BE;B7BE;1105 1163 11B1;B7BE;1105 1163 11B1; # (랾; 랾; 랾; 랾; 랾; ) HANGUL SYLLABLE RYALM +B7BF;B7BF;1105 1163 11B2;B7BF;1105 1163 11B2; # (랿; 랿; 랿; 랿; 랿; ) HANGUL SYLLABLE RYALB +B7C0;B7C0;1105 1163 11B3;B7C0;1105 1163 11B3; # (럀; 럀; 럀; 럀; 럀; ) HANGUL SYLLABLE RYALS +B7C1;B7C1;1105 1163 11B4;B7C1;1105 1163 11B4; # (럁; 럁; 럁; 럁; 럁; ) HANGUL SYLLABLE RYALT +B7C2;B7C2;1105 1163 11B5;B7C2;1105 1163 11B5; # (럂; 럂; 럂; 럂; 럂; ) HANGUL SYLLABLE RYALP +B7C3;B7C3;1105 1163 11B6;B7C3;1105 1163 11B6; # (럃; 럃; 럃; 럃; 럃; ) HANGUL SYLLABLE RYALH +B7C4;B7C4;1105 1163 11B7;B7C4;1105 1163 11B7; # (럄; 럄; 럄; 럄; 럄; ) HANGUL SYLLABLE RYAM +B7C5;B7C5;1105 1163 11B8;B7C5;1105 1163 11B8; # (럅; 럅; 럅; 럅; 럅; ) HANGUL SYLLABLE RYAB +B7C6;B7C6;1105 1163 11B9;B7C6;1105 1163 11B9; # (럆; 럆; 럆; 럆; 럆; ) HANGUL SYLLABLE RYABS +B7C7;B7C7;1105 1163 11BA;B7C7;1105 1163 11BA; # (럇; 럇; 럇; 럇; 럇; ) HANGUL SYLLABLE RYAS +B7C8;B7C8;1105 1163 11BB;B7C8;1105 1163 11BB; # (럈; 럈; 럈; 럈; 럈; ) HANGUL SYLLABLE RYASS +B7C9;B7C9;1105 1163 11BC;B7C9;1105 1163 11BC; # (량; 량; 량; 량; 량; ) HANGUL SYLLABLE RYANG +B7CA;B7CA;1105 1163 11BD;B7CA;1105 1163 11BD; # (럊; 럊; 럊; 럊; 럊; ) HANGUL SYLLABLE RYAJ +B7CB;B7CB;1105 1163 11BE;B7CB;1105 1163 11BE; # (럋; 럋; 럋; 럋; 럋; ) HANGUL SYLLABLE RYAC +B7CC;B7CC;1105 1163 11BF;B7CC;1105 1163 11BF; # (럌; 럌; 럌; 럌; 럌; ) HANGUL SYLLABLE RYAK +B7CD;B7CD;1105 1163 11C0;B7CD;1105 1163 11C0; # (럍; 럍; 럍; 럍; 럍; ) HANGUL SYLLABLE RYAT +B7CE;B7CE;1105 1163 11C1;B7CE;1105 1163 11C1; # (럎; 럎; 럎; 럎; 럎; ) HANGUL SYLLABLE RYAP +B7CF;B7CF;1105 1163 11C2;B7CF;1105 1163 11C2; # (럏; 럏; 럏; 럏; 럏; ) HANGUL SYLLABLE RYAH +B7D0;B7D0;1105 1164;B7D0;1105 1164; # (럐; 럐; 럐; 럐; 럐; ) HANGUL SYLLABLE RYAE +B7D1;B7D1;1105 1164 11A8;B7D1;1105 1164 11A8; # (럑; 럑; 럑; 럑; 럑; ) HANGUL SYLLABLE RYAEG +B7D2;B7D2;1105 1164 11A9;B7D2;1105 1164 11A9; # (럒; 럒; 럒; 럒; 럒; ) HANGUL SYLLABLE RYAEGG +B7D3;B7D3;1105 1164 11AA;B7D3;1105 1164 11AA; # (럓; 럓; 럓; 럓; 럓; ) HANGUL SYLLABLE RYAEGS +B7D4;B7D4;1105 1164 11AB;B7D4;1105 1164 11AB; # (럔; 럔; 럔; 럔; 럔; ) HANGUL SYLLABLE RYAEN +B7D5;B7D5;1105 1164 11AC;B7D5;1105 1164 11AC; # (럕; 럕; 럕; 럕; 럕; ) HANGUL SYLLABLE RYAENJ +B7D6;B7D6;1105 1164 11AD;B7D6;1105 1164 11AD; # (럖; 럖; 럖; 럖; 럖; ) HANGUL SYLLABLE RYAENH +B7D7;B7D7;1105 1164 11AE;B7D7;1105 1164 11AE; # (럗; 럗; 럗; 럗; 럗; ) HANGUL SYLLABLE RYAED +B7D8;B7D8;1105 1164 11AF;B7D8;1105 1164 11AF; # (럘; 럘; 럘; 럘; 럘; ) HANGUL SYLLABLE RYAEL +B7D9;B7D9;1105 1164 11B0;B7D9;1105 1164 11B0; # (럙; 럙; 럙; 럙; 럙; ) HANGUL SYLLABLE RYAELG +B7DA;B7DA;1105 1164 11B1;B7DA;1105 1164 11B1; # (럚; 럚; 럚; 럚; 럚; ) HANGUL SYLLABLE RYAELM +B7DB;B7DB;1105 1164 11B2;B7DB;1105 1164 11B2; # (럛; 럛; 럛; 럛; 럛; ) HANGUL SYLLABLE RYAELB +B7DC;B7DC;1105 1164 11B3;B7DC;1105 1164 11B3; # (럜; 럜; 럜; 럜; 럜; ) HANGUL SYLLABLE RYAELS +B7DD;B7DD;1105 1164 11B4;B7DD;1105 1164 11B4; # (럝; 럝; 럝; 럝; 럝; ) HANGUL SYLLABLE RYAELT +B7DE;B7DE;1105 1164 11B5;B7DE;1105 1164 11B5; # (럞; 럞; 럞; 럞; 럞; ) HANGUL SYLLABLE RYAELP +B7DF;B7DF;1105 1164 11B6;B7DF;1105 1164 11B6; # (럟; 럟; 럟; 럟; 럟; ) HANGUL SYLLABLE RYAELH +B7E0;B7E0;1105 1164 11B7;B7E0;1105 1164 11B7; # (럠; 럠; 럠; 럠; 럠; ) HANGUL SYLLABLE RYAEM +B7E1;B7E1;1105 1164 11B8;B7E1;1105 1164 11B8; # (럡; 럡; 럡; 럡; 럡; ) HANGUL SYLLABLE RYAEB +B7E2;B7E2;1105 1164 11B9;B7E2;1105 1164 11B9; # (럢; 럢; 럢; 럢; 럢; ) HANGUL SYLLABLE RYAEBS +B7E3;B7E3;1105 1164 11BA;B7E3;1105 1164 11BA; # (럣; 럣; 럣; 럣; 럣; ) HANGUL SYLLABLE RYAES +B7E4;B7E4;1105 1164 11BB;B7E4;1105 1164 11BB; # (럤; 럤; 럤; 럤; 럤; ) HANGUL SYLLABLE RYAESS +B7E5;B7E5;1105 1164 11BC;B7E5;1105 1164 11BC; # (럥; 럥; 럥; 럥; 럥; ) HANGUL SYLLABLE RYAENG +B7E6;B7E6;1105 1164 11BD;B7E6;1105 1164 11BD; # (럦; 럦; 럦; 럦; 럦; ) HANGUL SYLLABLE RYAEJ +B7E7;B7E7;1105 1164 11BE;B7E7;1105 1164 11BE; # (럧; 럧; 럧; 럧; 럧; ) HANGUL SYLLABLE RYAEC +B7E8;B7E8;1105 1164 11BF;B7E8;1105 1164 11BF; # (럨; 럨; 럨; 럨; 럨; ) HANGUL SYLLABLE RYAEK +B7E9;B7E9;1105 1164 11C0;B7E9;1105 1164 11C0; # (럩; 럩; 럩; 럩; 럩; ) HANGUL SYLLABLE RYAET +B7EA;B7EA;1105 1164 11C1;B7EA;1105 1164 11C1; # (럪; 럪; 럪; 럪; 럪; ) HANGUL SYLLABLE RYAEP +B7EB;B7EB;1105 1164 11C2;B7EB;1105 1164 11C2; # (럫; 럫; 럫; 럫; 럫; ) HANGUL SYLLABLE RYAEH +B7EC;B7EC;1105 1165;B7EC;1105 1165; # (러; 러; 러; 러; 러; ) HANGUL SYLLABLE REO +B7ED;B7ED;1105 1165 11A8;B7ED;1105 1165 11A8; # (럭; 럭; 럭; 럭; 럭; ) HANGUL SYLLABLE REOG +B7EE;B7EE;1105 1165 11A9;B7EE;1105 1165 11A9; # (럮; 럮; 럮; 럮; 럮; ) HANGUL SYLLABLE REOGG +B7EF;B7EF;1105 1165 11AA;B7EF;1105 1165 11AA; # (럯; 럯; 럯; 럯; 럯; ) HANGUL SYLLABLE REOGS +B7F0;B7F0;1105 1165 11AB;B7F0;1105 1165 11AB; # (런; 런; 런; 런; 런; ) HANGUL SYLLABLE REON +B7F1;B7F1;1105 1165 11AC;B7F1;1105 1165 11AC; # (럱; 럱; 럱; 럱; 럱; ) HANGUL SYLLABLE REONJ +B7F2;B7F2;1105 1165 11AD;B7F2;1105 1165 11AD; # (럲; 럲; 럲; 럲; 럲; ) HANGUL SYLLABLE REONH +B7F3;B7F3;1105 1165 11AE;B7F3;1105 1165 11AE; # (럳; 럳; 럳; 럳; 럳; ) HANGUL SYLLABLE REOD +B7F4;B7F4;1105 1165 11AF;B7F4;1105 1165 11AF; # (럴; 럴; 럴; 럴; 럴; ) HANGUL SYLLABLE REOL +B7F5;B7F5;1105 1165 11B0;B7F5;1105 1165 11B0; # (럵; 럵; 럵; 럵; 럵; ) HANGUL SYLLABLE REOLG +B7F6;B7F6;1105 1165 11B1;B7F6;1105 1165 11B1; # (럶; 럶; 럶; 럶; 럶; ) HANGUL SYLLABLE REOLM +B7F7;B7F7;1105 1165 11B2;B7F7;1105 1165 11B2; # (럷; 럷; 럷; 럷; 럷; ) HANGUL SYLLABLE REOLB +B7F8;B7F8;1105 1165 11B3;B7F8;1105 1165 11B3; # (럸; 럸; 럸; 럸; 럸; ) HANGUL SYLLABLE REOLS +B7F9;B7F9;1105 1165 11B4;B7F9;1105 1165 11B4; # (럹; 럹; 럹; 럹; 럹; ) HANGUL SYLLABLE REOLT +B7FA;B7FA;1105 1165 11B5;B7FA;1105 1165 11B5; # (럺; 럺; 럺; 럺; 럺; ) HANGUL SYLLABLE REOLP +B7FB;B7FB;1105 1165 11B6;B7FB;1105 1165 11B6; # (럻; 럻; 럻; 럻; 럻; ) HANGUL SYLLABLE REOLH +B7FC;B7FC;1105 1165 11B7;B7FC;1105 1165 11B7; # (럼; 럼; 럼; 럼; 럼; ) HANGUL SYLLABLE REOM +B7FD;B7FD;1105 1165 11B8;B7FD;1105 1165 11B8; # (럽; 럽; 럽; 럽; 럽; ) HANGUL SYLLABLE REOB +B7FE;B7FE;1105 1165 11B9;B7FE;1105 1165 11B9; # (럾; 럾; 럾; 럾; 럾; ) HANGUL SYLLABLE REOBS +B7FF;B7FF;1105 1165 11BA;B7FF;1105 1165 11BA; # (럿; 럿; 럿; 럿; 럿; ) HANGUL SYLLABLE REOS +B800;B800;1105 1165 11BB;B800;1105 1165 11BB; # (렀; 렀; 렀; 렀; 렀; ) HANGUL SYLLABLE REOSS +B801;B801;1105 1165 11BC;B801;1105 1165 11BC; # (렁; 렁; 렁; 렁; 렁; ) HANGUL SYLLABLE REONG +B802;B802;1105 1165 11BD;B802;1105 1165 11BD; # (렂; 렂; 렂; 렂; 렂; ) HANGUL SYLLABLE REOJ +B803;B803;1105 1165 11BE;B803;1105 1165 11BE; # (렃; 렃; 렃; 렃; 렃; ) HANGUL SYLLABLE REOC +B804;B804;1105 1165 11BF;B804;1105 1165 11BF; # (렄; 렄; 렄; 렄; 렄; ) HANGUL SYLLABLE REOK +B805;B805;1105 1165 11C0;B805;1105 1165 11C0; # (렅; 렅; 렅; 렅; 렅; ) HANGUL SYLLABLE REOT +B806;B806;1105 1165 11C1;B806;1105 1165 11C1; # (렆; 렆; 렆; 렆; 렆; ) HANGUL SYLLABLE REOP +B807;B807;1105 1165 11C2;B807;1105 1165 11C2; # (렇; 렇; 렇; 렇; 렇; ) HANGUL SYLLABLE REOH +B808;B808;1105 1166;B808;1105 1166; # (레; 레; 레; 레; 레; ) HANGUL SYLLABLE RE +B809;B809;1105 1166 11A8;B809;1105 1166 11A8; # (렉; 렉; 렉; 렉; 렉; ) HANGUL SYLLABLE REG +B80A;B80A;1105 1166 11A9;B80A;1105 1166 11A9; # (렊; 렊; 렊; 렊; 렊; ) HANGUL SYLLABLE REGG +B80B;B80B;1105 1166 11AA;B80B;1105 1166 11AA; # (렋; 렋; 렋; 렋; 렋; ) HANGUL SYLLABLE REGS +B80C;B80C;1105 1166 11AB;B80C;1105 1166 11AB; # (렌; 렌; 렌; 렌; 렌; ) HANGUL SYLLABLE REN +B80D;B80D;1105 1166 11AC;B80D;1105 1166 11AC; # (렍; 렍; 렍; 렍; 렍; ) HANGUL SYLLABLE RENJ +B80E;B80E;1105 1166 11AD;B80E;1105 1166 11AD; # (렎; 렎; 렎; 렎; 렎; ) HANGUL SYLLABLE RENH +B80F;B80F;1105 1166 11AE;B80F;1105 1166 11AE; # (렏; 렏; 렏; 렏; 렏; ) HANGUL SYLLABLE RED +B810;B810;1105 1166 11AF;B810;1105 1166 11AF; # (렐; 렐; 렐; 렐; 렐; ) HANGUL SYLLABLE REL +B811;B811;1105 1166 11B0;B811;1105 1166 11B0; # (렑; 렑; 렑; 렑; 렑; ) HANGUL SYLLABLE RELG +B812;B812;1105 1166 11B1;B812;1105 1166 11B1; # (렒; 렒; 렒; 렒; 렒; ) HANGUL SYLLABLE RELM +B813;B813;1105 1166 11B2;B813;1105 1166 11B2; # (렓; 렓; 렓; 렓; 렓; ) HANGUL SYLLABLE RELB +B814;B814;1105 1166 11B3;B814;1105 1166 11B3; # (렔; 렔; 렔; 렔; 렔; ) HANGUL SYLLABLE RELS +B815;B815;1105 1166 11B4;B815;1105 1166 11B4; # (렕; 렕; 렕; 렕; 렕; ) HANGUL SYLLABLE RELT +B816;B816;1105 1166 11B5;B816;1105 1166 11B5; # (렖; 렖; 렖; 렖; 렖; ) HANGUL SYLLABLE RELP +B817;B817;1105 1166 11B6;B817;1105 1166 11B6; # (렗; 렗; 렗; 렗; 렗; ) HANGUL SYLLABLE RELH +B818;B818;1105 1166 11B7;B818;1105 1166 11B7; # (렘; 렘; 렘; 렘; 렘; ) HANGUL SYLLABLE REM +B819;B819;1105 1166 11B8;B819;1105 1166 11B8; # (렙; 렙; 렙; 렙; 렙; ) HANGUL SYLLABLE REB +B81A;B81A;1105 1166 11B9;B81A;1105 1166 11B9; # (렚; 렚; 렚; 렚; 렚; ) HANGUL SYLLABLE REBS +B81B;B81B;1105 1166 11BA;B81B;1105 1166 11BA; # (렛; 렛; 렛; 렛; 렛; ) HANGUL SYLLABLE RES +B81C;B81C;1105 1166 11BB;B81C;1105 1166 11BB; # (렜; 렜; 렜; 렜; 렜; ) HANGUL SYLLABLE RESS +B81D;B81D;1105 1166 11BC;B81D;1105 1166 11BC; # (렝; 렝; 렝; 렝; 렝; ) HANGUL SYLLABLE RENG +B81E;B81E;1105 1166 11BD;B81E;1105 1166 11BD; # (렞; 렞; 렞; 렞; 렞; ) HANGUL SYLLABLE REJ +B81F;B81F;1105 1166 11BE;B81F;1105 1166 11BE; # (렟; 렟; 렟; 렟; 렟; ) HANGUL SYLLABLE REC +B820;B820;1105 1166 11BF;B820;1105 1166 11BF; # (렠; 렠; 렠; 렠; 렠; ) HANGUL SYLLABLE REK +B821;B821;1105 1166 11C0;B821;1105 1166 11C0; # (렡; 렡; 렡; 렡; 렡; ) HANGUL SYLLABLE RET +B822;B822;1105 1166 11C1;B822;1105 1166 11C1; # (렢; 렢; 렢; 렢; 렢; ) HANGUL SYLLABLE REP +B823;B823;1105 1166 11C2;B823;1105 1166 11C2; # (렣; 렣; 렣; 렣; 렣; ) HANGUL SYLLABLE REH +B824;B824;1105 1167;B824;1105 1167; # (려; 려; 려; 려; 려; ) HANGUL SYLLABLE RYEO +B825;B825;1105 1167 11A8;B825;1105 1167 11A8; # (력; 력; 력; 력; 력; ) HANGUL SYLLABLE RYEOG +B826;B826;1105 1167 11A9;B826;1105 1167 11A9; # (렦; 렦; 렦; 렦; 렦; ) HANGUL SYLLABLE RYEOGG +B827;B827;1105 1167 11AA;B827;1105 1167 11AA; # (렧; 렧; 렧; 렧; 렧; ) HANGUL SYLLABLE RYEOGS +B828;B828;1105 1167 11AB;B828;1105 1167 11AB; # (련; 련; 련; 련; 련; ) HANGUL SYLLABLE RYEON +B829;B829;1105 1167 11AC;B829;1105 1167 11AC; # (렩; 렩; 렩; 렩; 렩; ) HANGUL SYLLABLE RYEONJ +B82A;B82A;1105 1167 11AD;B82A;1105 1167 11AD; # (렪; 렪; 렪; 렪; 렪; ) HANGUL SYLLABLE RYEONH +B82B;B82B;1105 1167 11AE;B82B;1105 1167 11AE; # (렫; 렫; 렫; 렫; 렫; ) HANGUL SYLLABLE RYEOD +B82C;B82C;1105 1167 11AF;B82C;1105 1167 11AF; # (렬; 렬; 렬; 렬; 렬; ) HANGUL SYLLABLE RYEOL +B82D;B82D;1105 1167 11B0;B82D;1105 1167 11B0; # (렭; 렭; 렭; 렭; 렭; ) HANGUL SYLLABLE RYEOLG +B82E;B82E;1105 1167 11B1;B82E;1105 1167 11B1; # (렮; 렮; 렮; 렮; 렮; ) HANGUL SYLLABLE RYEOLM +B82F;B82F;1105 1167 11B2;B82F;1105 1167 11B2; # (렯; 렯; 렯; 렯; 렯; ) HANGUL SYLLABLE RYEOLB +B830;B830;1105 1167 11B3;B830;1105 1167 11B3; # (렰; 렰; 렰; 렰; 렰; ) HANGUL SYLLABLE RYEOLS +B831;B831;1105 1167 11B4;B831;1105 1167 11B4; # (렱; 렱; 렱; 렱; 렱; ) HANGUL SYLLABLE RYEOLT +B832;B832;1105 1167 11B5;B832;1105 1167 11B5; # (렲; 렲; 렲; 렲; 렲; ) HANGUL SYLLABLE RYEOLP +B833;B833;1105 1167 11B6;B833;1105 1167 11B6; # (렳; 렳; 렳; 렳; 렳; ) HANGUL SYLLABLE RYEOLH +B834;B834;1105 1167 11B7;B834;1105 1167 11B7; # (렴; 렴; 렴; 렴; 렴; ) HANGUL SYLLABLE RYEOM +B835;B835;1105 1167 11B8;B835;1105 1167 11B8; # (렵; 렵; 렵; 렵; 렵; ) HANGUL SYLLABLE RYEOB +B836;B836;1105 1167 11B9;B836;1105 1167 11B9; # (렶; 렶; 렶; 렶; 렶; ) HANGUL SYLLABLE RYEOBS +B837;B837;1105 1167 11BA;B837;1105 1167 11BA; # (렷; 렷; 렷; 렷; 렷; ) HANGUL SYLLABLE RYEOS +B838;B838;1105 1167 11BB;B838;1105 1167 11BB; # (렸; 렸; 렸; 렸; 렸; ) HANGUL SYLLABLE RYEOSS +B839;B839;1105 1167 11BC;B839;1105 1167 11BC; # (령; 령; 령; 령; 령; ) HANGUL SYLLABLE RYEONG +B83A;B83A;1105 1167 11BD;B83A;1105 1167 11BD; # (렺; 렺; 렺; 렺; 렺; ) HANGUL SYLLABLE RYEOJ +B83B;B83B;1105 1167 11BE;B83B;1105 1167 11BE; # (렻; 렻; 렻; 렻; 렻; ) HANGUL SYLLABLE RYEOC +B83C;B83C;1105 1167 11BF;B83C;1105 1167 11BF; # (렼; 렼; 렼; 렼; 렼; ) HANGUL SYLLABLE RYEOK +B83D;B83D;1105 1167 11C0;B83D;1105 1167 11C0; # (렽; 렽; 렽; 렽; 렽; ) HANGUL SYLLABLE RYEOT +B83E;B83E;1105 1167 11C1;B83E;1105 1167 11C1; # (렾; 렾; 렾; 렾; 렾; ) HANGUL SYLLABLE RYEOP +B83F;B83F;1105 1167 11C2;B83F;1105 1167 11C2; # (렿; 렿; 렿; 렿; 렿; ) HANGUL SYLLABLE RYEOH +B840;B840;1105 1168;B840;1105 1168; # (례; 례; 례; 례; 례; ) HANGUL SYLLABLE RYE +B841;B841;1105 1168 11A8;B841;1105 1168 11A8; # (롁; 롁; 롁; 롁; 롁; ) HANGUL SYLLABLE RYEG +B842;B842;1105 1168 11A9;B842;1105 1168 11A9; # (롂; 롂; 롂; 롂; 롂; ) HANGUL SYLLABLE RYEGG +B843;B843;1105 1168 11AA;B843;1105 1168 11AA; # (롃; 롃; 롃; 롃; 롃; ) HANGUL SYLLABLE RYEGS +B844;B844;1105 1168 11AB;B844;1105 1168 11AB; # (롄; 롄; 롄; 롄; 롄; ) HANGUL SYLLABLE RYEN +B845;B845;1105 1168 11AC;B845;1105 1168 11AC; # (롅; 롅; 롅; 롅; 롅; ) HANGUL SYLLABLE RYENJ +B846;B846;1105 1168 11AD;B846;1105 1168 11AD; # (롆; 롆; 롆; 롆; 롆; ) HANGUL SYLLABLE RYENH +B847;B847;1105 1168 11AE;B847;1105 1168 11AE; # (롇; 롇; 롇; 롇; 롇; ) HANGUL SYLLABLE RYED +B848;B848;1105 1168 11AF;B848;1105 1168 11AF; # (롈; 롈; 롈; 롈; 롈; ) HANGUL SYLLABLE RYEL +B849;B849;1105 1168 11B0;B849;1105 1168 11B0; # (롉; 롉; 롉; 롉; 롉; ) HANGUL SYLLABLE RYELG +B84A;B84A;1105 1168 11B1;B84A;1105 1168 11B1; # (롊; 롊; 롊; 롊; 롊; ) HANGUL SYLLABLE RYELM +B84B;B84B;1105 1168 11B2;B84B;1105 1168 11B2; # (롋; 롋; 롋; 롋; 롋; ) HANGUL SYLLABLE RYELB +B84C;B84C;1105 1168 11B3;B84C;1105 1168 11B3; # (롌; 롌; 롌; 롌; 롌; ) HANGUL SYLLABLE RYELS +B84D;B84D;1105 1168 11B4;B84D;1105 1168 11B4; # (롍; 롍; 롍; 롍; 롍; ) HANGUL SYLLABLE RYELT +B84E;B84E;1105 1168 11B5;B84E;1105 1168 11B5; # (롎; 롎; 롎; 롎; 롎; ) HANGUL SYLLABLE RYELP +B84F;B84F;1105 1168 11B6;B84F;1105 1168 11B6; # (롏; 롏; 롏; 롏; 롏; ) HANGUL SYLLABLE RYELH +B850;B850;1105 1168 11B7;B850;1105 1168 11B7; # (롐; 롐; 롐; 롐; 롐; ) HANGUL SYLLABLE RYEM +B851;B851;1105 1168 11B8;B851;1105 1168 11B8; # (롑; 롑; 롑; 롑; 롑; ) HANGUL SYLLABLE RYEB +B852;B852;1105 1168 11B9;B852;1105 1168 11B9; # (롒; 롒; 롒; 롒; 롒; ) HANGUL SYLLABLE RYEBS +B853;B853;1105 1168 11BA;B853;1105 1168 11BA; # (롓; 롓; 롓; 롓; 롓; ) HANGUL SYLLABLE RYES +B854;B854;1105 1168 11BB;B854;1105 1168 11BB; # (롔; 롔; 롔; 롔; 롔; ) HANGUL SYLLABLE RYESS +B855;B855;1105 1168 11BC;B855;1105 1168 11BC; # (롕; 롕; 롕; 롕; 롕; ) HANGUL SYLLABLE RYENG +B856;B856;1105 1168 11BD;B856;1105 1168 11BD; # (롖; 롖; 롖; 롖; 롖; ) HANGUL SYLLABLE RYEJ +B857;B857;1105 1168 11BE;B857;1105 1168 11BE; # (롗; 롗; 롗; 롗; 롗; ) HANGUL SYLLABLE RYEC +B858;B858;1105 1168 11BF;B858;1105 1168 11BF; # (롘; 롘; 롘; 롘; 롘; ) HANGUL SYLLABLE RYEK +B859;B859;1105 1168 11C0;B859;1105 1168 11C0; # (롙; 롙; 롙; 롙; 롙; ) HANGUL SYLLABLE RYET +B85A;B85A;1105 1168 11C1;B85A;1105 1168 11C1; # (롚; 롚; 롚; 롚; 롚; ) HANGUL SYLLABLE RYEP +B85B;B85B;1105 1168 11C2;B85B;1105 1168 11C2; # (롛; 롛; 롛; 롛; 롛; ) HANGUL SYLLABLE RYEH +B85C;B85C;1105 1169;B85C;1105 1169; # (로; 로; 로; 로; 로; ) HANGUL SYLLABLE RO +B85D;B85D;1105 1169 11A8;B85D;1105 1169 11A8; # (록; 록; 록; 록; 록; ) HANGUL SYLLABLE ROG +B85E;B85E;1105 1169 11A9;B85E;1105 1169 11A9; # (롞; 롞; 롞; 롞; 롞; ) HANGUL SYLLABLE ROGG +B85F;B85F;1105 1169 11AA;B85F;1105 1169 11AA; # (롟; 롟; 롟; 롟; 롟; ) HANGUL SYLLABLE ROGS +B860;B860;1105 1169 11AB;B860;1105 1169 11AB; # (론; 론; 론; 론; 론; ) HANGUL SYLLABLE RON +B861;B861;1105 1169 11AC;B861;1105 1169 11AC; # (롡; 롡; 롡; 롡; 롡; ) HANGUL SYLLABLE RONJ +B862;B862;1105 1169 11AD;B862;1105 1169 11AD; # (롢; 롢; 롢; 롢; 롢; ) HANGUL SYLLABLE RONH +B863;B863;1105 1169 11AE;B863;1105 1169 11AE; # (롣; 롣; 롣; 롣; 롣; ) HANGUL SYLLABLE ROD +B864;B864;1105 1169 11AF;B864;1105 1169 11AF; # (롤; 롤; 롤; 롤; 롤; ) HANGUL SYLLABLE ROL +B865;B865;1105 1169 11B0;B865;1105 1169 11B0; # (롥; 롥; 롥; 롥; 롥; ) HANGUL SYLLABLE ROLG +B866;B866;1105 1169 11B1;B866;1105 1169 11B1; # (롦; 롦; 롦; 롦; 롦; ) HANGUL SYLLABLE ROLM +B867;B867;1105 1169 11B2;B867;1105 1169 11B2; # (롧; 롧; 롧; 롧; 롧; ) HANGUL SYLLABLE ROLB +B868;B868;1105 1169 11B3;B868;1105 1169 11B3; # (롨; 롨; 롨; 롨; 롨; ) HANGUL SYLLABLE ROLS +B869;B869;1105 1169 11B4;B869;1105 1169 11B4; # (롩; 롩; 롩; 롩; 롩; ) HANGUL SYLLABLE ROLT +B86A;B86A;1105 1169 11B5;B86A;1105 1169 11B5; # (롪; 롪; 롪; 롪; 롪; ) HANGUL SYLLABLE ROLP +B86B;B86B;1105 1169 11B6;B86B;1105 1169 11B6; # (롫; 롫; 롫; 롫; 롫; ) HANGUL SYLLABLE ROLH +B86C;B86C;1105 1169 11B7;B86C;1105 1169 11B7; # (롬; 롬; 롬; 롬; 롬; ) HANGUL SYLLABLE ROM +B86D;B86D;1105 1169 11B8;B86D;1105 1169 11B8; # (롭; 롭; 롭; 롭; 롭; ) HANGUL SYLLABLE ROB +B86E;B86E;1105 1169 11B9;B86E;1105 1169 11B9; # (롮; 롮; 롮; 롮; 롮; ) HANGUL SYLLABLE ROBS +B86F;B86F;1105 1169 11BA;B86F;1105 1169 11BA; # (롯; 롯; 롯; 롯; 롯; ) HANGUL SYLLABLE ROS +B870;B870;1105 1169 11BB;B870;1105 1169 11BB; # (롰; 롰; 롰; 롰; 롰; ) HANGUL SYLLABLE ROSS +B871;B871;1105 1169 11BC;B871;1105 1169 11BC; # (롱; 롱; 롱; 롱; 롱; ) HANGUL SYLLABLE RONG +B872;B872;1105 1169 11BD;B872;1105 1169 11BD; # (롲; 롲; 롲; 롲; 롲; ) HANGUL SYLLABLE ROJ +B873;B873;1105 1169 11BE;B873;1105 1169 11BE; # (롳; 롳; 롳; 롳; 롳; ) HANGUL SYLLABLE ROC +B874;B874;1105 1169 11BF;B874;1105 1169 11BF; # (롴; 롴; 롴; 롴; 롴; ) HANGUL SYLLABLE ROK +B875;B875;1105 1169 11C0;B875;1105 1169 11C0; # (롵; 롵; 롵; 롵; 롵; ) HANGUL SYLLABLE ROT +B876;B876;1105 1169 11C1;B876;1105 1169 11C1; # (롶; 롶; 롶; 롶; 롶; ) HANGUL SYLLABLE ROP +B877;B877;1105 1169 11C2;B877;1105 1169 11C2; # (롷; 롷; 롷; 롷; 롷; ) HANGUL SYLLABLE ROH +B878;B878;1105 116A;B878;1105 116A; # (롸; 롸; 롸; 롸; 롸; ) HANGUL SYLLABLE RWA +B879;B879;1105 116A 11A8;B879;1105 116A 11A8; # (롹; 롹; 롹; 롹; 롹; ) HANGUL SYLLABLE RWAG +B87A;B87A;1105 116A 11A9;B87A;1105 116A 11A9; # (롺; 롺; 롺; 롺; 롺; ) HANGUL SYLLABLE RWAGG +B87B;B87B;1105 116A 11AA;B87B;1105 116A 11AA; # (롻; 롻; 롻; 롻; 롻; ) HANGUL SYLLABLE RWAGS +B87C;B87C;1105 116A 11AB;B87C;1105 116A 11AB; # (롼; 롼; 롼; 롼; 롼; ) HANGUL SYLLABLE RWAN +B87D;B87D;1105 116A 11AC;B87D;1105 116A 11AC; # (롽; 롽; 롽; 롽; 롽; ) HANGUL SYLLABLE RWANJ +B87E;B87E;1105 116A 11AD;B87E;1105 116A 11AD; # (롾; 롾; 롾; 롾; 롾; ) HANGUL SYLLABLE RWANH +B87F;B87F;1105 116A 11AE;B87F;1105 116A 11AE; # (롿; 롿; 롿; 롿; 롿; ) HANGUL SYLLABLE RWAD +B880;B880;1105 116A 11AF;B880;1105 116A 11AF; # (뢀; 뢀; 뢀; 뢀; 뢀; ) HANGUL SYLLABLE RWAL +B881;B881;1105 116A 11B0;B881;1105 116A 11B0; # (뢁; 뢁; 뢁; 뢁; 뢁; ) HANGUL SYLLABLE RWALG +B882;B882;1105 116A 11B1;B882;1105 116A 11B1; # (뢂; 뢂; 뢂; 뢂; 뢂; ) HANGUL SYLLABLE RWALM +B883;B883;1105 116A 11B2;B883;1105 116A 11B2; # (뢃; 뢃; 뢃; 뢃; 뢃; ) HANGUL SYLLABLE RWALB +B884;B884;1105 116A 11B3;B884;1105 116A 11B3; # (뢄; 뢄; 뢄; 뢄; 뢄; ) HANGUL SYLLABLE RWALS +B885;B885;1105 116A 11B4;B885;1105 116A 11B4; # (뢅; 뢅; 뢅; 뢅; 뢅; ) HANGUL SYLLABLE RWALT +B886;B886;1105 116A 11B5;B886;1105 116A 11B5; # (뢆; 뢆; 뢆; 뢆; 뢆; ) HANGUL SYLLABLE RWALP +B887;B887;1105 116A 11B6;B887;1105 116A 11B6; # (뢇; 뢇; 뢇; 뢇; 뢇; ) HANGUL SYLLABLE RWALH +B888;B888;1105 116A 11B7;B888;1105 116A 11B7; # (뢈; 뢈; 뢈; 뢈; 뢈; ) HANGUL SYLLABLE RWAM +B889;B889;1105 116A 11B8;B889;1105 116A 11B8; # (뢉; 뢉; 뢉; 뢉; 뢉; ) HANGUL SYLLABLE RWAB +B88A;B88A;1105 116A 11B9;B88A;1105 116A 11B9; # (뢊; 뢊; 뢊; 뢊; 뢊; ) HANGUL SYLLABLE RWABS +B88B;B88B;1105 116A 11BA;B88B;1105 116A 11BA; # (뢋; 뢋; 뢋; 뢋; 뢋; ) HANGUL SYLLABLE RWAS +B88C;B88C;1105 116A 11BB;B88C;1105 116A 11BB; # (뢌; 뢌; 뢌; 뢌; 뢌; ) HANGUL SYLLABLE RWASS +B88D;B88D;1105 116A 11BC;B88D;1105 116A 11BC; # (뢍; 뢍; 뢍; 뢍; 뢍; ) HANGUL SYLLABLE RWANG +B88E;B88E;1105 116A 11BD;B88E;1105 116A 11BD; # (뢎; 뢎; 뢎; 뢎; 뢎; ) HANGUL SYLLABLE RWAJ +B88F;B88F;1105 116A 11BE;B88F;1105 116A 11BE; # (뢏; 뢏; 뢏; 뢏; 뢏; ) HANGUL SYLLABLE RWAC +B890;B890;1105 116A 11BF;B890;1105 116A 11BF; # (뢐; 뢐; 뢐; 뢐; 뢐; ) HANGUL SYLLABLE RWAK +B891;B891;1105 116A 11C0;B891;1105 116A 11C0; # (뢑; 뢑; 뢑; 뢑; 뢑; ) HANGUL SYLLABLE RWAT +B892;B892;1105 116A 11C1;B892;1105 116A 11C1; # (뢒; 뢒; 뢒; 뢒; 뢒; ) HANGUL SYLLABLE RWAP +B893;B893;1105 116A 11C2;B893;1105 116A 11C2; # (뢓; 뢓; 뢓; 뢓; 뢓; ) HANGUL SYLLABLE RWAH +B894;B894;1105 116B;B894;1105 116B; # (뢔; 뢔; 뢔; 뢔; 뢔; ) HANGUL SYLLABLE RWAE +B895;B895;1105 116B 11A8;B895;1105 116B 11A8; # (뢕; 뢕; 뢕; 뢕; 뢕; ) HANGUL SYLLABLE RWAEG +B896;B896;1105 116B 11A9;B896;1105 116B 11A9; # (뢖; 뢖; 뢖; 뢖; 뢖; ) HANGUL SYLLABLE RWAEGG +B897;B897;1105 116B 11AA;B897;1105 116B 11AA; # (뢗; 뢗; 뢗; 뢗; 뢗; ) HANGUL SYLLABLE RWAEGS +B898;B898;1105 116B 11AB;B898;1105 116B 11AB; # (뢘; 뢘; 뢘; 뢘; 뢘; ) HANGUL SYLLABLE RWAEN +B899;B899;1105 116B 11AC;B899;1105 116B 11AC; # (뢙; 뢙; 뢙; 뢙; 뢙; ) HANGUL SYLLABLE RWAENJ +B89A;B89A;1105 116B 11AD;B89A;1105 116B 11AD; # (뢚; 뢚; 뢚; 뢚; 뢚; ) HANGUL SYLLABLE RWAENH +B89B;B89B;1105 116B 11AE;B89B;1105 116B 11AE; # (뢛; 뢛; 뢛; 뢛; 뢛; ) HANGUL SYLLABLE RWAED +B89C;B89C;1105 116B 11AF;B89C;1105 116B 11AF; # (뢜; 뢜; 뢜; 뢜; 뢜; ) HANGUL SYLLABLE RWAEL +B89D;B89D;1105 116B 11B0;B89D;1105 116B 11B0; # (뢝; 뢝; 뢝; 뢝; 뢝; ) HANGUL SYLLABLE RWAELG +B89E;B89E;1105 116B 11B1;B89E;1105 116B 11B1; # (뢞; 뢞; 뢞; 뢞; 뢞; ) HANGUL SYLLABLE RWAELM +B89F;B89F;1105 116B 11B2;B89F;1105 116B 11B2; # (뢟; 뢟; 뢟; 뢟; 뢟; ) HANGUL SYLLABLE RWAELB +B8A0;B8A0;1105 116B 11B3;B8A0;1105 116B 11B3; # (뢠; 뢠; 뢠; 뢠; 뢠; ) HANGUL SYLLABLE RWAELS +B8A1;B8A1;1105 116B 11B4;B8A1;1105 116B 11B4; # (뢡; 뢡; 뢡; 뢡; 뢡; ) HANGUL SYLLABLE RWAELT +B8A2;B8A2;1105 116B 11B5;B8A2;1105 116B 11B5; # (뢢; 뢢; 뢢; 뢢; 뢢; ) HANGUL SYLLABLE RWAELP +B8A3;B8A3;1105 116B 11B6;B8A3;1105 116B 11B6; # (뢣; 뢣; 뢣; 뢣; 뢣; ) HANGUL SYLLABLE RWAELH +B8A4;B8A4;1105 116B 11B7;B8A4;1105 116B 11B7; # (뢤; 뢤; 뢤; 뢤; 뢤; ) HANGUL SYLLABLE RWAEM +B8A5;B8A5;1105 116B 11B8;B8A5;1105 116B 11B8; # (뢥; 뢥; 뢥; 뢥; 뢥; ) HANGUL SYLLABLE RWAEB +B8A6;B8A6;1105 116B 11B9;B8A6;1105 116B 11B9; # (뢦; 뢦; 뢦; 뢦; 뢦; ) HANGUL SYLLABLE RWAEBS +B8A7;B8A7;1105 116B 11BA;B8A7;1105 116B 11BA; # (뢧; 뢧; 뢧; 뢧; 뢧; ) HANGUL SYLLABLE RWAES +B8A8;B8A8;1105 116B 11BB;B8A8;1105 116B 11BB; # (뢨; 뢨; 뢨; 뢨; 뢨; ) HANGUL SYLLABLE RWAESS +B8A9;B8A9;1105 116B 11BC;B8A9;1105 116B 11BC; # (뢩; 뢩; 뢩; 뢩; 뢩; ) HANGUL SYLLABLE RWAENG +B8AA;B8AA;1105 116B 11BD;B8AA;1105 116B 11BD; # (뢪; 뢪; 뢪; 뢪; 뢪; ) HANGUL SYLLABLE RWAEJ +B8AB;B8AB;1105 116B 11BE;B8AB;1105 116B 11BE; # (뢫; 뢫; 뢫; 뢫; 뢫; ) HANGUL SYLLABLE RWAEC +B8AC;B8AC;1105 116B 11BF;B8AC;1105 116B 11BF; # (뢬; 뢬; 뢬; 뢬; 뢬; ) HANGUL SYLLABLE RWAEK +B8AD;B8AD;1105 116B 11C0;B8AD;1105 116B 11C0; # (뢭; 뢭; 뢭; 뢭; 뢭; ) HANGUL SYLLABLE RWAET +B8AE;B8AE;1105 116B 11C1;B8AE;1105 116B 11C1; # (뢮; 뢮; 뢮; 뢮; 뢮; ) HANGUL SYLLABLE RWAEP +B8AF;B8AF;1105 116B 11C2;B8AF;1105 116B 11C2; # (뢯; 뢯; 뢯; 뢯; 뢯; ) HANGUL SYLLABLE RWAEH +B8B0;B8B0;1105 116C;B8B0;1105 116C; # (뢰; 뢰; 뢰; 뢰; 뢰; ) HANGUL SYLLABLE ROE +B8B1;B8B1;1105 116C 11A8;B8B1;1105 116C 11A8; # (뢱; 뢱; 뢱; 뢱; 뢱; ) HANGUL SYLLABLE ROEG +B8B2;B8B2;1105 116C 11A9;B8B2;1105 116C 11A9; # (뢲; 뢲; 뢲; 뢲; 뢲; ) HANGUL SYLLABLE ROEGG +B8B3;B8B3;1105 116C 11AA;B8B3;1105 116C 11AA; # (뢳; 뢳; 뢳; 뢳; 뢳; ) HANGUL SYLLABLE ROEGS +B8B4;B8B4;1105 116C 11AB;B8B4;1105 116C 11AB; # (뢴; 뢴; 뢴; 뢴; 뢴; ) HANGUL SYLLABLE ROEN +B8B5;B8B5;1105 116C 11AC;B8B5;1105 116C 11AC; # (뢵; 뢵; 뢵; 뢵; 뢵; ) HANGUL SYLLABLE ROENJ +B8B6;B8B6;1105 116C 11AD;B8B6;1105 116C 11AD; # (뢶; 뢶; 뢶; 뢶; 뢶; ) HANGUL SYLLABLE ROENH +B8B7;B8B7;1105 116C 11AE;B8B7;1105 116C 11AE; # (뢷; 뢷; 뢷; 뢷; 뢷; ) HANGUL SYLLABLE ROED +B8B8;B8B8;1105 116C 11AF;B8B8;1105 116C 11AF; # (뢸; 뢸; 뢸; 뢸; 뢸; ) HANGUL SYLLABLE ROEL +B8B9;B8B9;1105 116C 11B0;B8B9;1105 116C 11B0; # (뢹; 뢹; 뢹; 뢹; 뢹; ) HANGUL SYLLABLE ROELG +B8BA;B8BA;1105 116C 11B1;B8BA;1105 116C 11B1; # (뢺; 뢺; 뢺; 뢺; 뢺; ) HANGUL SYLLABLE ROELM +B8BB;B8BB;1105 116C 11B2;B8BB;1105 116C 11B2; # (뢻; 뢻; 뢻; 뢻; 뢻; ) HANGUL SYLLABLE ROELB +B8BC;B8BC;1105 116C 11B3;B8BC;1105 116C 11B3; # (뢼; 뢼; 뢼; 뢼; 뢼; ) HANGUL SYLLABLE ROELS +B8BD;B8BD;1105 116C 11B4;B8BD;1105 116C 11B4; # (뢽; 뢽; 뢽; 뢽; 뢽; ) HANGUL SYLLABLE ROELT +B8BE;B8BE;1105 116C 11B5;B8BE;1105 116C 11B5; # (뢾; 뢾; 뢾; 뢾; 뢾; ) HANGUL SYLLABLE ROELP +B8BF;B8BF;1105 116C 11B6;B8BF;1105 116C 11B6; # (뢿; 뢿; 뢿; 뢿; 뢿; ) HANGUL SYLLABLE ROELH +B8C0;B8C0;1105 116C 11B7;B8C0;1105 116C 11B7; # (룀; 룀; 룀; 룀; 룀; ) HANGUL SYLLABLE ROEM +B8C1;B8C1;1105 116C 11B8;B8C1;1105 116C 11B8; # (룁; 룁; 룁; 룁; 룁; ) HANGUL SYLLABLE ROEB +B8C2;B8C2;1105 116C 11B9;B8C2;1105 116C 11B9; # (룂; 룂; 룂; 룂; 룂; ) HANGUL SYLLABLE ROEBS +B8C3;B8C3;1105 116C 11BA;B8C3;1105 116C 11BA; # (룃; 룃; 룃; 룃; 룃; ) HANGUL SYLLABLE ROES +B8C4;B8C4;1105 116C 11BB;B8C4;1105 116C 11BB; # (룄; 룄; 룄; 룄; 룄; ) HANGUL SYLLABLE ROESS +B8C5;B8C5;1105 116C 11BC;B8C5;1105 116C 11BC; # (룅; 룅; 룅; 룅; 룅; ) HANGUL SYLLABLE ROENG +B8C6;B8C6;1105 116C 11BD;B8C6;1105 116C 11BD; # (룆; 룆; 룆; 룆; 룆; ) HANGUL SYLLABLE ROEJ +B8C7;B8C7;1105 116C 11BE;B8C7;1105 116C 11BE; # (룇; 룇; 룇; 룇; 룇; ) HANGUL SYLLABLE ROEC +B8C8;B8C8;1105 116C 11BF;B8C8;1105 116C 11BF; # (룈; 룈; 룈; 룈; 룈; ) HANGUL SYLLABLE ROEK +B8C9;B8C9;1105 116C 11C0;B8C9;1105 116C 11C0; # (룉; 룉; 룉; 룉; 룉; ) HANGUL SYLLABLE ROET +B8CA;B8CA;1105 116C 11C1;B8CA;1105 116C 11C1; # (룊; 룊; 룊; 룊; 룊; ) HANGUL SYLLABLE ROEP +B8CB;B8CB;1105 116C 11C2;B8CB;1105 116C 11C2; # (룋; 룋; 룋; 룋; 룋; ) HANGUL SYLLABLE ROEH +B8CC;B8CC;1105 116D;B8CC;1105 116D; # (료; 료; 료; 료; 료; ) HANGUL SYLLABLE RYO +B8CD;B8CD;1105 116D 11A8;B8CD;1105 116D 11A8; # (룍; 룍; 룍; 룍; 룍; ) HANGUL SYLLABLE RYOG +B8CE;B8CE;1105 116D 11A9;B8CE;1105 116D 11A9; # (룎; 룎; 룎; 룎; 룎; ) HANGUL SYLLABLE RYOGG +B8CF;B8CF;1105 116D 11AA;B8CF;1105 116D 11AA; # (룏; 룏; 룏; 룏; 룏; ) HANGUL SYLLABLE RYOGS +B8D0;B8D0;1105 116D 11AB;B8D0;1105 116D 11AB; # (룐; 룐; 룐; 룐; 룐; ) HANGUL SYLLABLE RYON +B8D1;B8D1;1105 116D 11AC;B8D1;1105 116D 11AC; # (룑; 룑; 룑; 룑; 룑; ) HANGUL SYLLABLE RYONJ +B8D2;B8D2;1105 116D 11AD;B8D2;1105 116D 11AD; # (룒; 룒; 룒; 룒; 룒; ) HANGUL SYLLABLE RYONH +B8D3;B8D3;1105 116D 11AE;B8D3;1105 116D 11AE; # (룓; 룓; 룓; 룓; 룓; ) HANGUL SYLLABLE RYOD +B8D4;B8D4;1105 116D 11AF;B8D4;1105 116D 11AF; # (룔; 룔; 룔; 룔; 룔; ) HANGUL SYLLABLE RYOL +B8D5;B8D5;1105 116D 11B0;B8D5;1105 116D 11B0; # (룕; 룕; 룕; 룕; 룕; ) HANGUL SYLLABLE RYOLG +B8D6;B8D6;1105 116D 11B1;B8D6;1105 116D 11B1; # (룖; 룖; 룖; 룖; 룖; ) HANGUL SYLLABLE RYOLM +B8D7;B8D7;1105 116D 11B2;B8D7;1105 116D 11B2; # (룗; 룗; 룗; 룗; 룗; ) HANGUL SYLLABLE RYOLB +B8D8;B8D8;1105 116D 11B3;B8D8;1105 116D 11B3; # (룘; 룘; 룘; 룘; 룘; ) HANGUL SYLLABLE RYOLS +B8D9;B8D9;1105 116D 11B4;B8D9;1105 116D 11B4; # (룙; 룙; 룙; 룙; 룙; ) HANGUL SYLLABLE RYOLT +B8DA;B8DA;1105 116D 11B5;B8DA;1105 116D 11B5; # (룚; 룚; 룚; 룚; 룚; ) HANGUL SYLLABLE RYOLP +B8DB;B8DB;1105 116D 11B6;B8DB;1105 116D 11B6; # (룛; 룛; 룛; 룛; 룛; ) HANGUL SYLLABLE RYOLH +B8DC;B8DC;1105 116D 11B7;B8DC;1105 116D 11B7; # (룜; 룜; 룜; 룜; 룜; ) HANGUL SYLLABLE RYOM +B8DD;B8DD;1105 116D 11B8;B8DD;1105 116D 11B8; # (룝; 룝; 룝; 룝; 룝; ) HANGUL SYLLABLE RYOB +B8DE;B8DE;1105 116D 11B9;B8DE;1105 116D 11B9; # (룞; 룞; 룞; 룞; 룞; ) HANGUL SYLLABLE RYOBS +B8DF;B8DF;1105 116D 11BA;B8DF;1105 116D 11BA; # (룟; 룟; 룟; 룟; 룟; ) HANGUL SYLLABLE RYOS +B8E0;B8E0;1105 116D 11BB;B8E0;1105 116D 11BB; # (룠; 룠; 룠; 룠; 룠; ) HANGUL SYLLABLE RYOSS +B8E1;B8E1;1105 116D 11BC;B8E1;1105 116D 11BC; # (룡; 룡; 룡; 룡; 룡; ) HANGUL SYLLABLE RYONG +B8E2;B8E2;1105 116D 11BD;B8E2;1105 116D 11BD; # (룢; 룢; 룢; 룢; 룢; ) HANGUL SYLLABLE RYOJ +B8E3;B8E3;1105 116D 11BE;B8E3;1105 116D 11BE; # (룣; 룣; 룣; 룣; 룣; ) HANGUL SYLLABLE RYOC +B8E4;B8E4;1105 116D 11BF;B8E4;1105 116D 11BF; # (룤; 룤; 룤; 룤; 룤; ) HANGUL SYLLABLE RYOK +B8E5;B8E5;1105 116D 11C0;B8E5;1105 116D 11C0; # (룥; 룥; 룥; 룥; 룥; ) HANGUL SYLLABLE RYOT +B8E6;B8E6;1105 116D 11C1;B8E6;1105 116D 11C1; # (룦; 룦; 룦; 룦; 룦; ) HANGUL SYLLABLE RYOP +B8E7;B8E7;1105 116D 11C2;B8E7;1105 116D 11C2; # (룧; 룧; 룧; 룧; 룧; ) HANGUL SYLLABLE RYOH +B8E8;B8E8;1105 116E;B8E8;1105 116E; # (루; 루; 루; 루; 루; ) HANGUL SYLLABLE RU +B8E9;B8E9;1105 116E 11A8;B8E9;1105 116E 11A8; # (룩; 룩; 룩; 룩; 룩; ) HANGUL SYLLABLE RUG +B8EA;B8EA;1105 116E 11A9;B8EA;1105 116E 11A9; # (룪; 룪; 룪; 룪; 룪; ) HANGUL SYLLABLE RUGG +B8EB;B8EB;1105 116E 11AA;B8EB;1105 116E 11AA; # (룫; 룫; 룫; 룫; 룫; ) HANGUL SYLLABLE RUGS +B8EC;B8EC;1105 116E 11AB;B8EC;1105 116E 11AB; # (룬; 룬; 룬; 룬; 룬; ) HANGUL SYLLABLE RUN +B8ED;B8ED;1105 116E 11AC;B8ED;1105 116E 11AC; # (룭; 룭; 룭; 룭; 룭; ) HANGUL SYLLABLE RUNJ +B8EE;B8EE;1105 116E 11AD;B8EE;1105 116E 11AD; # (룮; 룮; 룮; 룮; 룮; ) HANGUL SYLLABLE RUNH +B8EF;B8EF;1105 116E 11AE;B8EF;1105 116E 11AE; # (룯; 룯; 룯; 룯; 룯; ) HANGUL SYLLABLE RUD +B8F0;B8F0;1105 116E 11AF;B8F0;1105 116E 11AF; # (룰; 룰; 룰; 룰; 룰; ) HANGUL SYLLABLE RUL +B8F1;B8F1;1105 116E 11B0;B8F1;1105 116E 11B0; # (룱; 룱; 룱; 룱; 룱; ) HANGUL SYLLABLE RULG +B8F2;B8F2;1105 116E 11B1;B8F2;1105 116E 11B1; # (룲; 룲; 룲; 룲; 룲; ) HANGUL SYLLABLE RULM +B8F3;B8F3;1105 116E 11B2;B8F3;1105 116E 11B2; # (룳; 룳; 룳; 룳; 룳; ) HANGUL SYLLABLE RULB +B8F4;B8F4;1105 116E 11B3;B8F4;1105 116E 11B3; # (룴; 룴; 룴; 룴; 룴; ) HANGUL SYLLABLE RULS +B8F5;B8F5;1105 116E 11B4;B8F5;1105 116E 11B4; # (룵; 룵; 룵; 룵; 룵; ) HANGUL SYLLABLE RULT +B8F6;B8F6;1105 116E 11B5;B8F6;1105 116E 11B5; # (룶; 룶; 룶; 룶; 룶; ) HANGUL SYLLABLE RULP +B8F7;B8F7;1105 116E 11B6;B8F7;1105 116E 11B6; # (룷; 룷; 룷; 룷; 룷; ) HANGUL SYLLABLE RULH +B8F8;B8F8;1105 116E 11B7;B8F8;1105 116E 11B7; # (룸; 룸; 룸; 룸; 룸; ) HANGUL SYLLABLE RUM +B8F9;B8F9;1105 116E 11B8;B8F9;1105 116E 11B8; # (룹; 룹; 룹; 룹; 룹; ) HANGUL SYLLABLE RUB +B8FA;B8FA;1105 116E 11B9;B8FA;1105 116E 11B9; # (룺; 룺; 룺; 룺; 룺; ) HANGUL SYLLABLE RUBS +B8FB;B8FB;1105 116E 11BA;B8FB;1105 116E 11BA; # (룻; 룻; 룻; 룻; 룻; ) HANGUL SYLLABLE RUS +B8FC;B8FC;1105 116E 11BB;B8FC;1105 116E 11BB; # (룼; 룼; 룼; 룼; 룼; ) HANGUL SYLLABLE RUSS +B8FD;B8FD;1105 116E 11BC;B8FD;1105 116E 11BC; # (룽; 룽; 룽; 룽; 룽; ) HANGUL SYLLABLE RUNG +B8FE;B8FE;1105 116E 11BD;B8FE;1105 116E 11BD; # (룾; 룾; 룾; 룾; 룾; ) HANGUL SYLLABLE RUJ +B8FF;B8FF;1105 116E 11BE;B8FF;1105 116E 11BE; # (룿; 룿; 룿; 룿; 룿; ) HANGUL SYLLABLE RUC +B900;B900;1105 116E 11BF;B900;1105 116E 11BF; # (뤀; 뤀; 뤀; 뤀; 뤀; ) HANGUL SYLLABLE RUK +B901;B901;1105 116E 11C0;B901;1105 116E 11C0; # (뤁; 뤁; 뤁; 뤁; 뤁; ) HANGUL SYLLABLE RUT +B902;B902;1105 116E 11C1;B902;1105 116E 11C1; # (뤂; 뤂; 뤂; 뤂; 뤂; ) HANGUL SYLLABLE RUP +B903;B903;1105 116E 11C2;B903;1105 116E 11C2; # (뤃; 뤃; 뤃; 뤃; 뤃; ) HANGUL SYLLABLE RUH +B904;B904;1105 116F;B904;1105 116F; # (뤄; 뤄; 뤄; 뤄; 뤄; ) HANGUL SYLLABLE RWEO +B905;B905;1105 116F 11A8;B905;1105 116F 11A8; # (뤅; 뤅; 뤅; 뤅; 뤅; ) HANGUL SYLLABLE RWEOG +B906;B906;1105 116F 11A9;B906;1105 116F 11A9; # (뤆; 뤆; 뤆; 뤆; 뤆; ) HANGUL SYLLABLE RWEOGG +B907;B907;1105 116F 11AA;B907;1105 116F 11AA; # (뤇; 뤇; 뤇; 뤇; 뤇; ) HANGUL SYLLABLE RWEOGS +B908;B908;1105 116F 11AB;B908;1105 116F 11AB; # (뤈; 뤈; 뤈; 뤈; 뤈; ) HANGUL SYLLABLE RWEON +B909;B909;1105 116F 11AC;B909;1105 116F 11AC; # (뤉; 뤉; 뤉; 뤉; 뤉; ) HANGUL SYLLABLE RWEONJ +B90A;B90A;1105 116F 11AD;B90A;1105 116F 11AD; # (뤊; 뤊; 뤊; 뤊; 뤊; ) HANGUL SYLLABLE RWEONH +B90B;B90B;1105 116F 11AE;B90B;1105 116F 11AE; # (뤋; 뤋; 뤋; 뤋; 뤋; ) HANGUL SYLLABLE RWEOD +B90C;B90C;1105 116F 11AF;B90C;1105 116F 11AF; # (뤌; 뤌; 뤌; 뤌; 뤌; ) HANGUL SYLLABLE RWEOL +B90D;B90D;1105 116F 11B0;B90D;1105 116F 11B0; # (뤍; 뤍; 뤍; 뤍; 뤍; ) HANGUL SYLLABLE RWEOLG +B90E;B90E;1105 116F 11B1;B90E;1105 116F 11B1; # (뤎; 뤎; 뤎; 뤎; 뤎; ) HANGUL SYLLABLE RWEOLM +B90F;B90F;1105 116F 11B2;B90F;1105 116F 11B2; # (뤏; 뤏; 뤏; 뤏; 뤏; ) HANGUL SYLLABLE RWEOLB +B910;B910;1105 116F 11B3;B910;1105 116F 11B3; # (뤐; 뤐; 뤐; 뤐; 뤐; ) HANGUL SYLLABLE RWEOLS +B911;B911;1105 116F 11B4;B911;1105 116F 11B4; # (뤑; 뤑; 뤑; 뤑; 뤑; ) HANGUL SYLLABLE RWEOLT +B912;B912;1105 116F 11B5;B912;1105 116F 11B5; # (뤒; 뤒; 뤒; 뤒; 뤒; ) HANGUL SYLLABLE RWEOLP +B913;B913;1105 116F 11B6;B913;1105 116F 11B6; # (뤓; 뤓; 뤓; 뤓; 뤓; ) HANGUL SYLLABLE RWEOLH +B914;B914;1105 116F 11B7;B914;1105 116F 11B7; # (뤔; 뤔; 뤔; 뤔; 뤔; ) HANGUL SYLLABLE RWEOM +B915;B915;1105 116F 11B8;B915;1105 116F 11B8; # (뤕; 뤕; 뤕; 뤕; 뤕; ) HANGUL SYLLABLE RWEOB +B916;B916;1105 116F 11B9;B916;1105 116F 11B9; # (뤖; 뤖; 뤖; 뤖; 뤖; ) HANGUL SYLLABLE RWEOBS +B917;B917;1105 116F 11BA;B917;1105 116F 11BA; # (뤗; 뤗; 뤗; 뤗; 뤗; ) HANGUL SYLLABLE RWEOS +B918;B918;1105 116F 11BB;B918;1105 116F 11BB; # (뤘; 뤘; 뤘; 뤘; 뤘; ) HANGUL SYLLABLE RWEOSS +B919;B919;1105 116F 11BC;B919;1105 116F 11BC; # (뤙; 뤙; 뤙; 뤙; 뤙; ) HANGUL SYLLABLE RWEONG +B91A;B91A;1105 116F 11BD;B91A;1105 116F 11BD; # (뤚; 뤚; 뤚; 뤚; 뤚; ) HANGUL SYLLABLE RWEOJ +B91B;B91B;1105 116F 11BE;B91B;1105 116F 11BE; # (뤛; 뤛; 뤛; 뤛; 뤛; ) HANGUL SYLLABLE RWEOC +B91C;B91C;1105 116F 11BF;B91C;1105 116F 11BF; # (뤜; 뤜; 뤜; 뤜; 뤜; ) HANGUL SYLLABLE RWEOK +B91D;B91D;1105 116F 11C0;B91D;1105 116F 11C0; # (뤝; 뤝; 뤝; 뤝; 뤝; ) HANGUL SYLLABLE RWEOT +B91E;B91E;1105 116F 11C1;B91E;1105 116F 11C1; # (뤞; 뤞; 뤞; 뤞; 뤞; ) HANGUL SYLLABLE RWEOP +B91F;B91F;1105 116F 11C2;B91F;1105 116F 11C2; # (뤟; 뤟; 뤟; 뤟; 뤟; ) HANGUL SYLLABLE RWEOH +B920;B920;1105 1170;B920;1105 1170; # (뤠; 뤠; 뤠; 뤠; 뤠; ) HANGUL SYLLABLE RWE +B921;B921;1105 1170 11A8;B921;1105 1170 11A8; # (뤡; 뤡; 뤡; 뤡; 뤡; ) HANGUL SYLLABLE RWEG +B922;B922;1105 1170 11A9;B922;1105 1170 11A9; # (뤢; 뤢; 뤢; 뤢; 뤢; ) HANGUL SYLLABLE RWEGG +B923;B923;1105 1170 11AA;B923;1105 1170 11AA; # (뤣; 뤣; 뤣; 뤣; 뤣; ) HANGUL SYLLABLE RWEGS +B924;B924;1105 1170 11AB;B924;1105 1170 11AB; # (뤤; 뤤; 뤤; 뤤; 뤤; ) HANGUL SYLLABLE RWEN +B925;B925;1105 1170 11AC;B925;1105 1170 11AC; # (뤥; 뤥; 뤥; 뤥; 뤥; ) HANGUL SYLLABLE RWENJ +B926;B926;1105 1170 11AD;B926;1105 1170 11AD; # (뤦; 뤦; 뤦; 뤦; 뤦; ) HANGUL SYLLABLE RWENH +B927;B927;1105 1170 11AE;B927;1105 1170 11AE; # (뤧; 뤧; 뤧; 뤧; 뤧; ) HANGUL SYLLABLE RWED +B928;B928;1105 1170 11AF;B928;1105 1170 11AF; # (뤨; 뤨; 뤨; 뤨; 뤨; ) HANGUL SYLLABLE RWEL +B929;B929;1105 1170 11B0;B929;1105 1170 11B0; # (뤩; 뤩; 뤩; 뤩; 뤩; ) HANGUL SYLLABLE RWELG +B92A;B92A;1105 1170 11B1;B92A;1105 1170 11B1; # (뤪; 뤪; 뤪; 뤪; 뤪; ) HANGUL SYLLABLE RWELM +B92B;B92B;1105 1170 11B2;B92B;1105 1170 11B2; # (뤫; 뤫; 뤫; 뤫; 뤫; ) HANGUL SYLLABLE RWELB +B92C;B92C;1105 1170 11B3;B92C;1105 1170 11B3; # (뤬; 뤬; 뤬; 뤬; 뤬; ) HANGUL SYLLABLE RWELS +B92D;B92D;1105 1170 11B4;B92D;1105 1170 11B4; # (뤭; 뤭; 뤭; 뤭; 뤭; ) HANGUL SYLLABLE RWELT +B92E;B92E;1105 1170 11B5;B92E;1105 1170 11B5; # (뤮; 뤮; 뤮; 뤮; 뤮; ) HANGUL SYLLABLE RWELP +B92F;B92F;1105 1170 11B6;B92F;1105 1170 11B6; # (뤯; 뤯; 뤯; 뤯; 뤯; ) HANGUL SYLLABLE RWELH +B930;B930;1105 1170 11B7;B930;1105 1170 11B7; # (뤰; 뤰; 뤰; 뤰; 뤰; ) HANGUL SYLLABLE RWEM +B931;B931;1105 1170 11B8;B931;1105 1170 11B8; # (뤱; 뤱; 뤱; 뤱; 뤱; ) HANGUL SYLLABLE RWEB +B932;B932;1105 1170 11B9;B932;1105 1170 11B9; # (뤲; 뤲; 뤲; 뤲; 뤲; ) HANGUL SYLLABLE RWEBS +B933;B933;1105 1170 11BA;B933;1105 1170 11BA; # (뤳; 뤳; 뤳; 뤳; 뤳; ) HANGUL SYLLABLE RWES +B934;B934;1105 1170 11BB;B934;1105 1170 11BB; # (뤴; 뤴; 뤴; 뤴; 뤴; ) HANGUL SYLLABLE RWESS +B935;B935;1105 1170 11BC;B935;1105 1170 11BC; # (뤵; 뤵; 뤵; 뤵; 뤵; ) HANGUL SYLLABLE RWENG +B936;B936;1105 1170 11BD;B936;1105 1170 11BD; # (뤶; 뤶; 뤶; 뤶; 뤶; ) HANGUL SYLLABLE RWEJ +B937;B937;1105 1170 11BE;B937;1105 1170 11BE; # (뤷; 뤷; 뤷; 뤷; 뤷; ) HANGUL SYLLABLE RWEC +B938;B938;1105 1170 11BF;B938;1105 1170 11BF; # (뤸; 뤸; 뤸; 뤸; 뤸; ) HANGUL SYLLABLE RWEK +B939;B939;1105 1170 11C0;B939;1105 1170 11C0; # (뤹; 뤹; 뤹; 뤹; 뤹; ) HANGUL SYLLABLE RWET +B93A;B93A;1105 1170 11C1;B93A;1105 1170 11C1; # (뤺; 뤺; 뤺; 뤺; 뤺; ) HANGUL SYLLABLE RWEP +B93B;B93B;1105 1170 11C2;B93B;1105 1170 11C2; # (뤻; 뤻; 뤻; 뤻; 뤻; ) HANGUL SYLLABLE RWEH +B93C;B93C;1105 1171;B93C;1105 1171; # (뤼; 뤼; 뤼; 뤼; 뤼; ) HANGUL SYLLABLE RWI +B93D;B93D;1105 1171 11A8;B93D;1105 1171 11A8; # (뤽; 뤽; 뤽; 뤽; 뤽; ) HANGUL SYLLABLE RWIG +B93E;B93E;1105 1171 11A9;B93E;1105 1171 11A9; # (뤾; 뤾; 뤾; 뤾; 뤾; ) HANGUL SYLLABLE RWIGG +B93F;B93F;1105 1171 11AA;B93F;1105 1171 11AA; # (뤿; 뤿; 뤿; 뤿; 뤿; ) HANGUL SYLLABLE RWIGS +B940;B940;1105 1171 11AB;B940;1105 1171 11AB; # (륀; 륀; 륀; 륀; 륀; ) HANGUL SYLLABLE RWIN +B941;B941;1105 1171 11AC;B941;1105 1171 11AC; # (륁; 륁; 륁; 륁; 륁; ) HANGUL SYLLABLE RWINJ +B942;B942;1105 1171 11AD;B942;1105 1171 11AD; # (륂; 륂; 륂; 륂; 륂; ) HANGUL SYLLABLE RWINH +B943;B943;1105 1171 11AE;B943;1105 1171 11AE; # (륃; 륃; 륃; 륃; 륃; ) HANGUL SYLLABLE RWID +B944;B944;1105 1171 11AF;B944;1105 1171 11AF; # (륄; 륄; 륄; 륄; 륄; ) HANGUL SYLLABLE RWIL +B945;B945;1105 1171 11B0;B945;1105 1171 11B0; # (륅; 륅; 륅; 륅; 륅; ) HANGUL SYLLABLE RWILG +B946;B946;1105 1171 11B1;B946;1105 1171 11B1; # (륆; 륆; 륆; 륆; 륆; ) HANGUL SYLLABLE RWILM +B947;B947;1105 1171 11B2;B947;1105 1171 11B2; # (륇; 륇; 륇; 륇; 륇; ) HANGUL SYLLABLE RWILB +B948;B948;1105 1171 11B3;B948;1105 1171 11B3; # (륈; 륈; 륈; 륈; 륈; ) HANGUL SYLLABLE RWILS +B949;B949;1105 1171 11B4;B949;1105 1171 11B4; # (륉; 륉; 륉; 륉; 륉; ) HANGUL SYLLABLE RWILT +B94A;B94A;1105 1171 11B5;B94A;1105 1171 11B5; # (륊; 륊; 륊; 륊; 륊; ) HANGUL SYLLABLE RWILP +B94B;B94B;1105 1171 11B6;B94B;1105 1171 11B6; # (륋; 륋; 륋; 륋; 륋; ) HANGUL SYLLABLE RWILH +B94C;B94C;1105 1171 11B7;B94C;1105 1171 11B7; # (륌; 륌; 륌; 륌; 륌; ) HANGUL SYLLABLE RWIM +B94D;B94D;1105 1171 11B8;B94D;1105 1171 11B8; # (륍; 륍; 륍; 륍; 륍; ) HANGUL SYLLABLE RWIB +B94E;B94E;1105 1171 11B9;B94E;1105 1171 11B9; # (륎; 륎; 륎; 륎; 륎; ) HANGUL SYLLABLE RWIBS +B94F;B94F;1105 1171 11BA;B94F;1105 1171 11BA; # (륏; 륏; 륏; 륏; 륏; ) HANGUL SYLLABLE RWIS +B950;B950;1105 1171 11BB;B950;1105 1171 11BB; # (륐; 륐; 륐; 륐; 륐; ) HANGUL SYLLABLE RWISS +B951;B951;1105 1171 11BC;B951;1105 1171 11BC; # (륑; 륑; 륑; 륑; 륑; ) HANGUL SYLLABLE RWING +B952;B952;1105 1171 11BD;B952;1105 1171 11BD; # (륒; 륒; 륒; 륒; 륒; ) HANGUL SYLLABLE RWIJ +B953;B953;1105 1171 11BE;B953;1105 1171 11BE; # (륓; 륓; 륓; 륓; 륓; ) HANGUL SYLLABLE RWIC +B954;B954;1105 1171 11BF;B954;1105 1171 11BF; # (륔; 륔; 륔; 륔; 륔; ) HANGUL SYLLABLE RWIK +B955;B955;1105 1171 11C0;B955;1105 1171 11C0; # (륕; 륕; 륕; 륕; 륕; ) HANGUL SYLLABLE RWIT +B956;B956;1105 1171 11C1;B956;1105 1171 11C1; # (륖; 륖; 륖; 륖; 륖; ) HANGUL SYLLABLE RWIP +B957;B957;1105 1171 11C2;B957;1105 1171 11C2; # (륗; 륗; 륗; 륗; 륗; ) HANGUL SYLLABLE RWIH +B958;B958;1105 1172;B958;1105 1172; # (류; 류; 류; 류; 류; ) HANGUL SYLLABLE RYU +B959;B959;1105 1172 11A8;B959;1105 1172 11A8; # (륙; 륙; 륙; 륙; 륙; ) HANGUL SYLLABLE RYUG +B95A;B95A;1105 1172 11A9;B95A;1105 1172 11A9; # (륚; 륚; 륚; 륚; 륚; ) HANGUL SYLLABLE RYUGG +B95B;B95B;1105 1172 11AA;B95B;1105 1172 11AA; # (륛; 륛; 륛; 륛; 륛; ) HANGUL SYLLABLE RYUGS +B95C;B95C;1105 1172 11AB;B95C;1105 1172 11AB; # (륜; 륜; 륜; 륜; 륜; ) HANGUL SYLLABLE RYUN +B95D;B95D;1105 1172 11AC;B95D;1105 1172 11AC; # (륝; 륝; 륝; 륝; 륝; ) HANGUL SYLLABLE RYUNJ +B95E;B95E;1105 1172 11AD;B95E;1105 1172 11AD; # (륞; 륞; 륞; 륞; 륞; ) HANGUL SYLLABLE RYUNH +B95F;B95F;1105 1172 11AE;B95F;1105 1172 11AE; # (륟; 륟; 륟; 륟; 륟; ) HANGUL SYLLABLE RYUD +B960;B960;1105 1172 11AF;B960;1105 1172 11AF; # (률; 률; 률; 률; 률; ) HANGUL SYLLABLE RYUL +B961;B961;1105 1172 11B0;B961;1105 1172 11B0; # (륡; 륡; 륡; 륡; 륡; ) HANGUL SYLLABLE RYULG +B962;B962;1105 1172 11B1;B962;1105 1172 11B1; # (륢; 륢; 륢; 륢; 륢; ) HANGUL SYLLABLE RYULM +B963;B963;1105 1172 11B2;B963;1105 1172 11B2; # (륣; 륣; 륣; 륣; 륣; ) HANGUL SYLLABLE RYULB +B964;B964;1105 1172 11B3;B964;1105 1172 11B3; # (륤; 륤; 륤; 륤; 륤; ) HANGUL SYLLABLE RYULS +B965;B965;1105 1172 11B4;B965;1105 1172 11B4; # (륥; 륥; 륥; 륥; 륥; ) HANGUL SYLLABLE RYULT +B966;B966;1105 1172 11B5;B966;1105 1172 11B5; # (륦; 륦; 륦; 륦; 륦; ) HANGUL SYLLABLE RYULP +B967;B967;1105 1172 11B6;B967;1105 1172 11B6; # (륧; 륧; 륧; 륧; 륧; ) HANGUL SYLLABLE RYULH +B968;B968;1105 1172 11B7;B968;1105 1172 11B7; # (륨; 륨; 륨; 륨; 륨; ) HANGUL SYLLABLE RYUM +B969;B969;1105 1172 11B8;B969;1105 1172 11B8; # (륩; 륩; 륩; 륩; 륩; ) HANGUL SYLLABLE RYUB +B96A;B96A;1105 1172 11B9;B96A;1105 1172 11B9; # (륪; 륪; 륪; 륪; 륪; ) HANGUL SYLLABLE RYUBS +B96B;B96B;1105 1172 11BA;B96B;1105 1172 11BA; # (륫; 륫; 륫; 륫; 륫; ) HANGUL SYLLABLE RYUS +B96C;B96C;1105 1172 11BB;B96C;1105 1172 11BB; # (륬; 륬; 륬; 륬; 륬; ) HANGUL SYLLABLE RYUSS +B96D;B96D;1105 1172 11BC;B96D;1105 1172 11BC; # (륭; 륭; 륭; 륭; 륭; ) HANGUL SYLLABLE RYUNG +B96E;B96E;1105 1172 11BD;B96E;1105 1172 11BD; # (륮; 륮; 륮; 륮; 륮; ) HANGUL SYLLABLE RYUJ +B96F;B96F;1105 1172 11BE;B96F;1105 1172 11BE; # (륯; 륯; 륯; 륯; 륯; ) HANGUL SYLLABLE RYUC +B970;B970;1105 1172 11BF;B970;1105 1172 11BF; # (륰; 륰; 륰; 륰; 륰; ) HANGUL SYLLABLE RYUK +B971;B971;1105 1172 11C0;B971;1105 1172 11C0; # (륱; 륱; 륱; 륱; 륱; ) HANGUL SYLLABLE RYUT +B972;B972;1105 1172 11C1;B972;1105 1172 11C1; # (륲; 륲; 륲; 륲; 륲; ) HANGUL SYLLABLE RYUP +B973;B973;1105 1172 11C2;B973;1105 1172 11C2; # (륳; 륳; 륳; 륳; 륳; ) HANGUL SYLLABLE RYUH +B974;B974;1105 1173;B974;1105 1173; # (르; 르; 르; 르; 르; ) HANGUL SYLLABLE REU +B975;B975;1105 1173 11A8;B975;1105 1173 11A8; # (륵; 륵; 륵; 륵; 륵; ) HANGUL SYLLABLE REUG +B976;B976;1105 1173 11A9;B976;1105 1173 11A9; # (륶; 륶; 륶; 륶; 륶; ) HANGUL SYLLABLE REUGG +B977;B977;1105 1173 11AA;B977;1105 1173 11AA; # (륷; 륷; 륷; 륷; 륷; ) HANGUL SYLLABLE REUGS +B978;B978;1105 1173 11AB;B978;1105 1173 11AB; # (른; 른; 른; 른; 른; ) HANGUL SYLLABLE REUN +B979;B979;1105 1173 11AC;B979;1105 1173 11AC; # (륹; 륹; 륹; 륹; 륹; ) HANGUL SYLLABLE REUNJ +B97A;B97A;1105 1173 11AD;B97A;1105 1173 11AD; # (륺; 륺; 륺; 륺; 륺; ) HANGUL SYLLABLE REUNH +B97B;B97B;1105 1173 11AE;B97B;1105 1173 11AE; # (륻; 륻; 륻; 륻; 륻; ) HANGUL SYLLABLE REUD +B97C;B97C;1105 1173 11AF;B97C;1105 1173 11AF; # (를; 를; 를; 를; 를; ) HANGUL SYLLABLE REUL +B97D;B97D;1105 1173 11B0;B97D;1105 1173 11B0; # (륽; 륽; 륽; 륽; 륽; ) HANGUL SYLLABLE REULG +B97E;B97E;1105 1173 11B1;B97E;1105 1173 11B1; # (륾; 륾; 륾; 륾; 륾; ) HANGUL SYLLABLE REULM +B97F;B97F;1105 1173 11B2;B97F;1105 1173 11B2; # (륿; 륿; 륿; 륿; 륿; ) HANGUL SYLLABLE REULB +B980;B980;1105 1173 11B3;B980;1105 1173 11B3; # (릀; 릀; 릀; 릀; 릀; ) HANGUL SYLLABLE REULS +B981;B981;1105 1173 11B4;B981;1105 1173 11B4; # (릁; 릁; 릁; 릁; 릁; ) HANGUL SYLLABLE REULT +B982;B982;1105 1173 11B5;B982;1105 1173 11B5; # (릂; 릂; 릂; 릂; 릂; ) HANGUL SYLLABLE REULP +B983;B983;1105 1173 11B6;B983;1105 1173 11B6; # (릃; 릃; 릃; 릃; 릃; ) HANGUL SYLLABLE REULH +B984;B984;1105 1173 11B7;B984;1105 1173 11B7; # (름; 름; 름; 름; 름; ) HANGUL SYLLABLE REUM +B985;B985;1105 1173 11B8;B985;1105 1173 11B8; # (릅; 릅; 릅; 릅; 릅; ) HANGUL SYLLABLE REUB +B986;B986;1105 1173 11B9;B986;1105 1173 11B9; # (릆; 릆; 릆; 릆; 릆; ) HANGUL SYLLABLE REUBS +B987;B987;1105 1173 11BA;B987;1105 1173 11BA; # (릇; 릇; 릇; 릇; 릇; ) HANGUL SYLLABLE REUS +B988;B988;1105 1173 11BB;B988;1105 1173 11BB; # (릈; 릈; 릈; 릈; 릈; ) HANGUL SYLLABLE REUSS +B989;B989;1105 1173 11BC;B989;1105 1173 11BC; # (릉; 릉; 릉; 릉; 릉; ) HANGUL SYLLABLE REUNG +B98A;B98A;1105 1173 11BD;B98A;1105 1173 11BD; # (릊; 릊; 릊; 릊; 릊; ) HANGUL SYLLABLE REUJ +B98B;B98B;1105 1173 11BE;B98B;1105 1173 11BE; # (릋; 릋; 릋; 릋; 릋; ) HANGUL SYLLABLE REUC +B98C;B98C;1105 1173 11BF;B98C;1105 1173 11BF; # (릌; 릌; 릌; 릌; 릌; ) HANGUL SYLLABLE REUK +B98D;B98D;1105 1173 11C0;B98D;1105 1173 11C0; # (릍; 릍; 릍; 릍; 릍; ) HANGUL SYLLABLE REUT +B98E;B98E;1105 1173 11C1;B98E;1105 1173 11C1; # (릎; 릎; 릎; 릎; 릎; ) HANGUL SYLLABLE REUP +B98F;B98F;1105 1173 11C2;B98F;1105 1173 11C2; # (릏; 릏; 릏; 릏; 릏; ) HANGUL SYLLABLE REUH +B990;B990;1105 1174;B990;1105 1174; # (릐; 릐; 릐; 릐; 릐; ) HANGUL SYLLABLE RYI +B991;B991;1105 1174 11A8;B991;1105 1174 11A8; # (릑; 릑; 릑; 릑; 릑; ) HANGUL SYLLABLE RYIG +B992;B992;1105 1174 11A9;B992;1105 1174 11A9; # (릒; 릒; 릒; 릒; 릒; ) HANGUL SYLLABLE RYIGG +B993;B993;1105 1174 11AA;B993;1105 1174 11AA; # (릓; 릓; 릓; 릓; 릓; ) HANGUL SYLLABLE RYIGS +B994;B994;1105 1174 11AB;B994;1105 1174 11AB; # (릔; 릔; 릔; 릔; 릔; ) HANGUL SYLLABLE RYIN +B995;B995;1105 1174 11AC;B995;1105 1174 11AC; # (릕; 릕; 릕; 릕; 릕; ) HANGUL SYLLABLE RYINJ +B996;B996;1105 1174 11AD;B996;1105 1174 11AD; # (릖; 릖; 릖; 릖; 릖; ) HANGUL SYLLABLE RYINH +B997;B997;1105 1174 11AE;B997;1105 1174 11AE; # (릗; 릗; 릗; 릗; 릗; ) HANGUL SYLLABLE RYID +B998;B998;1105 1174 11AF;B998;1105 1174 11AF; # (릘; 릘; 릘; 릘; 릘; ) HANGUL SYLLABLE RYIL +B999;B999;1105 1174 11B0;B999;1105 1174 11B0; # (릙; 릙; 릙; 릙; 릙; ) HANGUL SYLLABLE RYILG +B99A;B99A;1105 1174 11B1;B99A;1105 1174 11B1; # (릚; 릚; 릚; 릚; 릚; ) HANGUL SYLLABLE RYILM +B99B;B99B;1105 1174 11B2;B99B;1105 1174 11B2; # (릛; 릛; 릛; 릛; 릛; ) HANGUL SYLLABLE RYILB +B99C;B99C;1105 1174 11B3;B99C;1105 1174 11B3; # (릜; 릜; 릜; 릜; 릜; ) HANGUL SYLLABLE RYILS +B99D;B99D;1105 1174 11B4;B99D;1105 1174 11B4; # (릝; 릝; 릝; 릝; 릝; ) HANGUL SYLLABLE RYILT +B99E;B99E;1105 1174 11B5;B99E;1105 1174 11B5; # (릞; 릞; 릞; 릞; 릞; ) HANGUL SYLLABLE RYILP +B99F;B99F;1105 1174 11B6;B99F;1105 1174 11B6; # (릟; 릟; 릟; 릟; 릟; ) HANGUL SYLLABLE RYILH +B9A0;B9A0;1105 1174 11B7;B9A0;1105 1174 11B7; # (릠; 릠; 릠; 릠; 릠; ) HANGUL SYLLABLE RYIM +B9A1;B9A1;1105 1174 11B8;B9A1;1105 1174 11B8; # (릡; 릡; 릡; 릡; 릡; ) HANGUL SYLLABLE RYIB +B9A2;B9A2;1105 1174 11B9;B9A2;1105 1174 11B9; # (릢; 릢; 릢; 릢; 릢; ) HANGUL SYLLABLE RYIBS +B9A3;B9A3;1105 1174 11BA;B9A3;1105 1174 11BA; # (릣; 릣; 릣; 릣; 릣; ) HANGUL SYLLABLE RYIS +B9A4;B9A4;1105 1174 11BB;B9A4;1105 1174 11BB; # (릤; 릤; 릤; 릤; 릤; ) HANGUL SYLLABLE RYISS +B9A5;B9A5;1105 1174 11BC;B9A5;1105 1174 11BC; # (릥; 릥; 릥; 릥; 릥; ) HANGUL SYLLABLE RYING +B9A6;B9A6;1105 1174 11BD;B9A6;1105 1174 11BD; # (릦; 릦; 릦; 릦; 릦; ) HANGUL SYLLABLE RYIJ +B9A7;B9A7;1105 1174 11BE;B9A7;1105 1174 11BE; # (릧; 릧; 릧; 릧; 릧; ) HANGUL SYLLABLE RYIC +B9A8;B9A8;1105 1174 11BF;B9A8;1105 1174 11BF; # (릨; 릨; 릨; 릨; 릨; ) HANGUL SYLLABLE RYIK +B9A9;B9A9;1105 1174 11C0;B9A9;1105 1174 11C0; # (릩; 릩; 릩; 릩; 릩; ) HANGUL SYLLABLE RYIT +B9AA;B9AA;1105 1174 11C1;B9AA;1105 1174 11C1; # (릪; 릪; 릪; 릪; 릪; ) HANGUL SYLLABLE RYIP +B9AB;B9AB;1105 1174 11C2;B9AB;1105 1174 11C2; # (릫; 릫; 릫; 릫; 릫; ) HANGUL SYLLABLE RYIH +B9AC;B9AC;1105 1175;B9AC;1105 1175; # (리; 리; 리; 리; 리; ) HANGUL SYLLABLE RI +B9AD;B9AD;1105 1175 11A8;B9AD;1105 1175 11A8; # (릭; 릭; 릭; 릭; 릭; ) HANGUL SYLLABLE RIG +B9AE;B9AE;1105 1175 11A9;B9AE;1105 1175 11A9; # (릮; 릮; 릮; 릮; 릮; ) HANGUL SYLLABLE RIGG +B9AF;B9AF;1105 1175 11AA;B9AF;1105 1175 11AA; # (릯; 릯; 릯; 릯; 릯; ) HANGUL SYLLABLE RIGS +B9B0;B9B0;1105 1175 11AB;B9B0;1105 1175 11AB; # (린; 린; 린; 린; 린; ) HANGUL SYLLABLE RIN +B9B1;B9B1;1105 1175 11AC;B9B1;1105 1175 11AC; # (릱; 릱; 릱; 릱; 릱; ) HANGUL SYLLABLE RINJ +B9B2;B9B2;1105 1175 11AD;B9B2;1105 1175 11AD; # (릲; 릲; 릲; 릲; 릲; ) HANGUL SYLLABLE RINH +B9B3;B9B3;1105 1175 11AE;B9B3;1105 1175 11AE; # (릳; 릳; 릳; 릳; 릳; ) HANGUL SYLLABLE RID +B9B4;B9B4;1105 1175 11AF;B9B4;1105 1175 11AF; # (릴; 릴; 릴; 릴; 릴; ) HANGUL SYLLABLE RIL +B9B5;B9B5;1105 1175 11B0;B9B5;1105 1175 11B0; # (릵; 릵; 릵; 릵; 릵; ) HANGUL SYLLABLE RILG +B9B6;B9B6;1105 1175 11B1;B9B6;1105 1175 11B1; # (릶; 릶; 릶; 릶; 릶; ) HANGUL SYLLABLE RILM +B9B7;B9B7;1105 1175 11B2;B9B7;1105 1175 11B2; # (릷; 릷; 릷; 릷; 릷; ) HANGUL SYLLABLE RILB +B9B8;B9B8;1105 1175 11B3;B9B8;1105 1175 11B3; # (릸; 릸; 릸; 릸; 릸; ) HANGUL SYLLABLE RILS +B9B9;B9B9;1105 1175 11B4;B9B9;1105 1175 11B4; # (릹; 릹; 릹; 릹; 릹; ) HANGUL SYLLABLE RILT +B9BA;B9BA;1105 1175 11B5;B9BA;1105 1175 11B5; # (릺; 릺; 릺; 릺; 릺; ) HANGUL SYLLABLE RILP +B9BB;B9BB;1105 1175 11B6;B9BB;1105 1175 11B6; # (릻; 릻; 릻; 릻; 릻; ) HANGUL SYLLABLE RILH +B9BC;B9BC;1105 1175 11B7;B9BC;1105 1175 11B7; # (림; 림; 림; 림; 림; ) HANGUL SYLLABLE RIM +B9BD;B9BD;1105 1175 11B8;B9BD;1105 1175 11B8; # (립; 립; 립; 립; 립; ) HANGUL SYLLABLE RIB +B9BE;B9BE;1105 1175 11B9;B9BE;1105 1175 11B9; # (릾; 릾; 릾; 릾; 릾; ) HANGUL SYLLABLE RIBS +B9BF;B9BF;1105 1175 11BA;B9BF;1105 1175 11BA; # (릿; 릿; 릿; 릿; 릿; ) HANGUL SYLLABLE RIS +B9C0;B9C0;1105 1175 11BB;B9C0;1105 1175 11BB; # (맀; 맀; 맀; 맀; 맀; ) HANGUL SYLLABLE RISS +B9C1;B9C1;1105 1175 11BC;B9C1;1105 1175 11BC; # (링; 링; 링; 링; 링; ) HANGUL SYLLABLE RING +B9C2;B9C2;1105 1175 11BD;B9C2;1105 1175 11BD; # (맂; 맂; 맂; 맂; 맂; ) HANGUL SYLLABLE RIJ +B9C3;B9C3;1105 1175 11BE;B9C3;1105 1175 11BE; # (맃; 맃; 맃; 맃; 맃; ) HANGUL SYLLABLE RIC +B9C4;B9C4;1105 1175 11BF;B9C4;1105 1175 11BF; # (맄; 맄; 맄; 맄; 맄; ) HANGUL SYLLABLE RIK +B9C5;B9C5;1105 1175 11C0;B9C5;1105 1175 11C0; # (맅; 맅; 맅; 맅; 맅; ) HANGUL SYLLABLE RIT +B9C6;B9C6;1105 1175 11C1;B9C6;1105 1175 11C1; # (맆; 맆; 맆; 맆; 맆; ) HANGUL SYLLABLE RIP +B9C7;B9C7;1105 1175 11C2;B9C7;1105 1175 11C2; # (맇; 맇; 맇; 맇; 맇; ) HANGUL SYLLABLE RIH +B9C8;B9C8;1106 1161;B9C8;1106 1161; # (마; 마; 마; 마; 마; ) HANGUL SYLLABLE MA +B9C9;B9C9;1106 1161 11A8;B9C9;1106 1161 11A8; # (막; 막; 막; 막; 막; ) HANGUL SYLLABLE MAG +B9CA;B9CA;1106 1161 11A9;B9CA;1106 1161 11A9; # (맊; 맊; 맊; 맊; 맊; ) HANGUL SYLLABLE MAGG +B9CB;B9CB;1106 1161 11AA;B9CB;1106 1161 11AA; # (맋; 맋; 맋; 맋; 맋; ) HANGUL SYLLABLE MAGS +B9CC;B9CC;1106 1161 11AB;B9CC;1106 1161 11AB; # (만; 만; 만; 만; 만; ) HANGUL SYLLABLE MAN +B9CD;B9CD;1106 1161 11AC;B9CD;1106 1161 11AC; # (맍; 맍; 맍; 맍; 맍; ) HANGUL SYLLABLE MANJ +B9CE;B9CE;1106 1161 11AD;B9CE;1106 1161 11AD; # (많; 많; 많; 많; 많; ) HANGUL SYLLABLE MANH +B9CF;B9CF;1106 1161 11AE;B9CF;1106 1161 11AE; # (맏; 맏; 맏; 맏; 맏; ) HANGUL SYLLABLE MAD +B9D0;B9D0;1106 1161 11AF;B9D0;1106 1161 11AF; # (말; 말; 말; 말; 말; ) HANGUL SYLLABLE MAL +B9D1;B9D1;1106 1161 11B0;B9D1;1106 1161 11B0; # (맑; 맑; 맑; 맑; 맑; ) HANGUL SYLLABLE MALG +B9D2;B9D2;1106 1161 11B1;B9D2;1106 1161 11B1; # (맒; 맒; 맒; 맒; 맒; ) HANGUL SYLLABLE MALM +B9D3;B9D3;1106 1161 11B2;B9D3;1106 1161 11B2; # (맓; 맓; 맓; 맓; 맓; ) HANGUL SYLLABLE MALB +B9D4;B9D4;1106 1161 11B3;B9D4;1106 1161 11B3; # (맔; 맔; 맔; 맔; 맔; ) HANGUL SYLLABLE MALS +B9D5;B9D5;1106 1161 11B4;B9D5;1106 1161 11B4; # (맕; 맕; 맕; 맕; 맕; ) HANGUL SYLLABLE MALT +B9D6;B9D6;1106 1161 11B5;B9D6;1106 1161 11B5; # (맖; 맖; 맖; 맖; 맖; ) HANGUL SYLLABLE MALP +B9D7;B9D7;1106 1161 11B6;B9D7;1106 1161 11B6; # (맗; 맗; 맗; 맗; 맗; ) HANGUL SYLLABLE MALH +B9D8;B9D8;1106 1161 11B7;B9D8;1106 1161 11B7; # (맘; 맘; 맘; 맘; 맘; ) HANGUL SYLLABLE MAM +B9D9;B9D9;1106 1161 11B8;B9D9;1106 1161 11B8; # (맙; 맙; 맙; 맙; 맙; ) HANGUL SYLLABLE MAB +B9DA;B9DA;1106 1161 11B9;B9DA;1106 1161 11B9; # (맚; 맚; 맚; 맚; 맚; ) HANGUL SYLLABLE MABS +B9DB;B9DB;1106 1161 11BA;B9DB;1106 1161 11BA; # (맛; 맛; 맛; 맛; 맛; ) HANGUL SYLLABLE MAS +B9DC;B9DC;1106 1161 11BB;B9DC;1106 1161 11BB; # (맜; 맜; 맜; 맜; 맜; ) HANGUL SYLLABLE MASS +B9DD;B9DD;1106 1161 11BC;B9DD;1106 1161 11BC; # (망; 망; 망; 망; 망; ) HANGUL SYLLABLE MANG +B9DE;B9DE;1106 1161 11BD;B9DE;1106 1161 11BD; # (맞; 맞; 맞; 맞; 맞; ) HANGUL SYLLABLE MAJ +B9DF;B9DF;1106 1161 11BE;B9DF;1106 1161 11BE; # (맟; 맟; 맟; 맟; 맟; ) HANGUL SYLLABLE MAC +B9E0;B9E0;1106 1161 11BF;B9E0;1106 1161 11BF; # (맠; 맠; 맠; 맠; 맠; ) HANGUL SYLLABLE MAK +B9E1;B9E1;1106 1161 11C0;B9E1;1106 1161 11C0; # (맡; 맡; 맡; 맡; 맡; ) HANGUL SYLLABLE MAT +B9E2;B9E2;1106 1161 11C1;B9E2;1106 1161 11C1; # (맢; 맢; 맢; 맢; 맢; ) HANGUL SYLLABLE MAP +B9E3;B9E3;1106 1161 11C2;B9E3;1106 1161 11C2; # (맣; 맣; 맣; 맣; 맣; ) HANGUL SYLLABLE MAH +B9E4;B9E4;1106 1162;B9E4;1106 1162; # (매; 매; 매; 매; 매; ) HANGUL SYLLABLE MAE +B9E5;B9E5;1106 1162 11A8;B9E5;1106 1162 11A8; # (맥; 맥; 맥; 맥; 맥; ) HANGUL SYLLABLE MAEG +B9E6;B9E6;1106 1162 11A9;B9E6;1106 1162 11A9; # (맦; 맦; 맦; 맦; 맦; ) HANGUL SYLLABLE MAEGG +B9E7;B9E7;1106 1162 11AA;B9E7;1106 1162 11AA; # (맧; 맧; 맧; 맧; 맧; ) HANGUL SYLLABLE MAEGS +B9E8;B9E8;1106 1162 11AB;B9E8;1106 1162 11AB; # (맨; 맨; 맨; 맨; 맨; ) HANGUL SYLLABLE MAEN +B9E9;B9E9;1106 1162 11AC;B9E9;1106 1162 11AC; # (맩; 맩; 맩; 맩; 맩; ) HANGUL SYLLABLE MAENJ +B9EA;B9EA;1106 1162 11AD;B9EA;1106 1162 11AD; # (맪; 맪; 맪; 맪; 맪; ) HANGUL SYLLABLE MAENH +B9EB;B9EB;1106 1162 11AE;B9EB;1106 1162 11AE; # (맫; 맫; 맫; 맫; 맫; ) HANGUL SYLLABLE MAED +B9EC;B9EC;1106 1162 11AF;B9EC;1106 1162 11AF; # (맬; 맬; 맬; 맬; 맬; ) HANGUL SYLLABLE MAEL +B9ED;B9ED;1106 1162 11B0;B9ED;1106 1162 11B0; # (맭; 맭; 맭; 맭; 맭; ) HANGUL SYLLABLE MAELG +B9EE;B9EE;1106 1162 11B1;B9EE;1106 1162 11B1; # (맮; 맮; 맮; 맮; 맮; ) HANGUL SYLLABLE MAELM +B9EF;B9EF;1106 1162 11B2;B9EF;1106 1162 11B2; # (맯; 맯; 맯; 맯; 맯; ) HANGUL SYLLABLE MAELB +B9F0;B9F0;1106 1162 11B3;B9F0;1106 1162 11B3; # (맰; 맰; 맰; 맰; 맰; ) HANGUL SYLLABLE MAELS +B9F1;B9F1;1106 1162 11B4;B9F1;1106 1162 11B4; # (맱; 맱; 맱; 맱; 맱; ) HANGUL SYLLABLE MAELT +B9F2;B9F2;1106 1162 11B5;B9F2;1106 1162 11B5; # (맲; 맲; 맲; 맲; 맲; ) HANGUL SYLLABLE MAELP +B9F3;B9F3;1106 1162 11B6;B9F3;1106 1162 11B6; # (맳; 맳; 맳; 맳; 맳; ) HANGUL SYLLABLE MAELH +B9F4;B9F4;1106 1162 11B7;B9F4;1106 1162 11B7; # (맴; 맴; 맴; 맴; 맴; ) HANGUL SYLLABLE MAEM +B9F5;B9F5;1106 1162 11B8;B9F5;1106 1162 11B8; # (맵; 맵; 맵; 맵; 맵; ) HANGUL SYLLABLE MAEB +B9F6;B9F6;1106 1162 11B9;B9F6;1106 1162 11B9; # (맶; 맶; 맶; 맶; 맶; ) HANGUL SYLLABLE MAEBS +B9F7;B9F7;1106 1162 11BA;B9F7;1106 1162 11BA; # (맷; 맷; 맷; 맷; 맷; ) HANGUL SYLLABLE MAES +B9F8;B9F8;1106 1162 11BB;B9F8;1106 1162 11BB; # (맸; 맸; 맸; 맸; 맸; ) HANGUL SYLLABLE MAESS +B9F9;B9F9;1106 1162 11BC;B9F9;1106 1162 11BC; # (맹; 맹; 맹; 맹; 맹; ) HANGUL SYLLABLE MAENG +B9FA;B9FA;1106 1162 11BD;B9FA;1106 1162 11BD; # (맺; 맺; 맺; 맺; 맺; ) HANGUL SYLLABLE MAEJ +B9FB;B9FB;1106 1162 11BE;B9FB;1106 1162 11BE; # (맻; 맻; 맻; 맻; 맻; ) HANGUL SYLLABLE MAEC +B9FC;B9FC;1106 1162 11BF;B9FC;1106 1162 11BF; # (맼; 맼; 맼; 맼; 맼; ) HANGUL SYLLABLE MAEK +B9FD;B9FD;1106 1162 11C0;B9FD;1106 1162 11C0; # (맽; 맽; 맽; 맽; 맽; ) HANGUL SYLLABLE MAET +B9FE;B9FE;1106 1162 11C1;B9FE;1106 1162 11C1; # (맾; 맾; 맾; 맾; 맾; ) HANGUL SYLLABLE MAEP +B9FF;B9FF;1106 1162 11C2;B9FF;1106 1162 11C2; # (맿; 맿; 맿; 맿; 맿; ) HANGUL SYLLABLE MAEH +BA00;BA00;1106 1163;BA00;1106 1163; # (먀; 먀; 먀; 먀; 먀; ) HANGUL SYLLABLE MYA +BA01;BA01;1106 1163 11A8;BA01;1106 1163 11A8; # (먁; 먁; 먁; 먁; 먁; ) HANGUL SYLLABLE MYAG +BA02;BA02;1106 1163 11A9;BA02;1106 1163 11A9; # (먂; 먂; 먂; 먂; 먂; ) HANGUL SYLLABLE MYAGG +BA03;BA03;1106 1163 11AA;BA03;1106 1163 11AA; # (먃; 먃; 먃; 먃; 먃; ) HANGUL SYLLABLE MYAGS +BA04;BA04;1106 1163 11AB;BA04;1106 1163 11AB; # (먄; 먄; 먄; 먄; 먄; ) HANGUL SYLLABLE MYAN +BA05;BA05;1106 1163 11AC;BA05;1106 1163 11AC; # (먅; 먅; 먅; 먅; 먅; ) HANGUL SYLLABLE MYANJ +BA06;BA06;1106 1163 11AD;BA06;1106 1163 11AD; # (먆; 먆; 먆; 먆; 먆; ) HANGUL SYLLABLE MYANH +BA07;BA07;1106 1163 11AE;BA07;1106 1163 11AE; # (먇; 먇; 먇; 먇; 먇; ) HANGUL SYLLABLE MYAD +BA08;BA08;1106 1163 11AF;BA08;1106 1163 11AF; # (먈; 먈; 먈; 먈; 먈; ) HANGUL SYLLABLE MYAL +BA09;BA09;1106 1163 11B0;BA09;1106 1163 11B0; # (먉; 먉; 먉; 먉; 먉; ) HANGUL SYLLABLE MYALG +BA0A;BA0A;1106 1163 11B1;BA0A;1106 1163 11B1; # (먊; 먊; 먊; 먊; 먊; ) HANGUL SYLLABLE MYALM +BA0B;BA0B;1106 1163 11B2;BA0B;1106 1163 11B2; # (먋; 먋; 먋; 먋; 먋; ) HANGUL SYLLABLE MYALB +BA0C;BA0C;1106 1163 11B3;BA0C;1106 1163 11B3; # (먌; 먌; 먌; 먌; 먌; ) HANGUL SYLLABLE MYALS +BA0D;BA0D;1106 1163 11B4;BA0D;1106 1163 11B4; # (먍; 먍; 먍; 먍; 먍; ) HANGUL SYLLABLE MYALT +BA0E;BA0E;1106 1163 11B5;BA0E;1106 1163 11B5; # (먎; 먎; 먎; 먎; 먎; ) HANGUL SYLLABLE MYALP +BA0F;BA0F;1106 1163 11B6;BA0F;1106 1163 11B6; # (먏; 먏; 먏; 먏; 먏; ) HANGUL SYLLABLE MYALH +BA10;BA10;1106 1163 11B7;BA10;1106 1163 11B7; # (먐; 먐; 먐; 먐; 먐; ) HANGUL SYLLABLE MYAM +BA11;BA11;1106 1163 11B8;BA11;1106 1163 11B8; # (먑; 먑; 먑; 먑; 먑; ) HANGUL SYLLABLE MYAB +BA12;BA12;1106 1163 11B9;BA12;1106 1163 11B9; # (먒; 먒; 먒; 먒; 먒; ) HANGUL SYLLABLE MYABS +BA13;BA13;1106 1163 11BA;BA13;1106 1163 11BA; # (먓; 먓; 먓; 먓; 먓; ) HANGUL SYLLABLE MYAS +BA14;BA14;1106 1163 11BB;BA14;1106 1163 11BB; # (먔; 먔; 먔; 먔; 먔; ) HANGUL SYLLABLE MYASS +BA15;BA15;1106 1163 11BC;BA15;1106 1163 11BC; # (먕; 먕; 먕; 먕; 먕; ) HANGUL SYLLABLE MYANG +BA16;BA16;1106 1163 11BD;BA16;1106 1163 11BD; # (먖; 먖; 먖; 먖; 먖; ) HANGUL SYLLABLE MYAJ +BA17;BA17;1106 1163 11BE;BA17;1106 1163 11BE; # (먗; 먗; 먗; 먗; 먗; ) HANGUL SYLLABLE MYAC +BA18;BA18;1106 1163 11BF;BA18;1106 1163 11BF; # (먘; 먘; 먘; 먘; 먘; ) HANGUL SYLLABLE MYAK +BA19;BA19;1106 1163 11C0;BA19;1106 1163 11C0; # (먙; 먙; 먙; 먙; 먙; ) HANGUL SYLLABLE MYAT +BA1A;BA1A;1106 1163 11C1;BA1A;1106 1163 11C1; # (먚; 먚; 먚; 먚; 먚; ) HANGUL SYLLABLE MYAP +BA1B;BA1B;1106 1163 11C2;BA1B;1106 1163 11C2; # (먛; 먛; 먛; 먛; 먛; ) HANGUL SYLLABLE MYAH +BA1C;BA1C;1106 1164;BA1C;1106 1164; # (먜; 먜; 먜; 먜; 먜; ) HANGUL SYLLABLE MYAE +BA1D;BA1D;1106 1164 11A8;BA1D;1106 1164 11A8; # (먝; 먝; 먝; 먝; 먝; ) HANGUL SYLLABLE MYAEG +BA1E;BA1E;1106 1164 11A9;BA1E;1106 1164 11A9; # (먞; 먞; 먞; 먞; 먞; ) HANGUL SYLLABLE MYAEGG +BA1F;BA1F;1106 1164 11AA;BA1F;1106 1164 11AA; # (먟; 먟; 먟; 먟; 먟; ) HANGUL SYLLABLE MYAEGS +BA20;BA20;1106 1164 11AB;BA20;1106 1164 11AB; # (먠; 먠; 먠; 먠; 먠; ) HANGUL SYLLABLE MYAEN +BA21;BA21;1106 1164 11AC;BA21;1106 1164 11AC; # (먡; 먡; 먡; 먡; 먡; ) HANGUL SYLLABLE MYAENJ +BA22;BA22;1106 1164 11AD;BA22;1106 1164 11AD; # (먢; 먢; 먢; 먢; 먢; ) HANGUL SYLLABLE MYAENH +BA23;BA23;1106 1164 11AE;BA23;1106 1164 11AE; # (먣; 먣; 먣; 먣; 먣; ) HANGUL SYLLABLE MYAED +BA24;BA24;1106 1164 11AF;BA24;1106 1164 11AF; # (먤; 먤; 먤; 먤; 먤; ) HANGUL SYLLABLE MYAEL +BA25;BA25;1106 1164 11B0;BA25;1106 1164 11B0; # (먥; 먥; 먥; 먥; 먥; ) HANGUL SYLLABLE MYAELG +BA26;BA26;1106 1164 11B1;BA26;1106 1164 11B1; # (먦; 먦; 먦; 먦; 먦; ) HANGUL SYLLABLE MYAELM +BA27;BA27;1106 1164 11B2;BA27;1106 1164 11B2; # (먧; 먧; 먧; 먧; 먧; ) HANGUL SYLLABLE MYAELB +BA28;BA28;1106 1164 11B3;BA28;1106 1164 11B3; # (먨; 먨; 먨; 먨; 먨; ) HANGUL SYLLABLE MYAELS +BA29;BA29;1106 1164 11B4;BA29;1106 1164 11B4; # (먩; 먩; 먩; 먩; 먩; ) HANGUL SYLLABLE MYAELT +BA2A;BA2A;1106 1164 11B5;BA2A;1106 1164 11B5; # (먪; 먪; 먪; 먪; 먪; ) HANGUL SYLLABLE MYAELP +BA2B;BA2B;1106 1164 11B6;BA2B;1106 1164 11B6; # (먫; 먫; 먫; 먫; 먫; ) HANGUL SYLLABLE MYAELH +BA2C;BA2C;1106 1164 11B7;BA2C;1106 1164 11B7; # (먬; 먬; 먬; 먬; 먬; ) HANGUL SYLLABLE MYAEM +BA2D;BA2D;1106 1164 11B8;BA2D;1106 1164 11B8; # (먭; 먭; 먭; 먭; 먭; ) HANGUL SYLLABLE MYAEB +BA2E;BA2E;1106 1164 11B9;BA2E;1106 1164 11B9; # (먮; 먮; 먮; 먮; 먮; ) HANGUL SYLLABLE MYAEBS +BA2F;BA2F;1106 1164 11BA;BA2F;1106 1164 11BA; # (먯; 먯; 먯; 먯; 먯; ) HANGUL SYLLABLE MYAES +BA30;BA30;1106 1164 11BB;BA30;1106 1164 11BB; # (먰; 먰; 먰; 먰; 먰; ) HANGUL SYLLABLE MYAESS +BA31;BA31;1106 1164 11BC;BA31;1106 1164 11BC; # (먱; 먱; 먱; 먱; 먱; ) HANGUL SYLLABLE MYAENG +BA32;BA32;1106 1164 11BD;BA32;1106 1164 11BD; # (먲; 먲; 먲; 먲; 먲; ) HANGUL SYLLABLE MYAEJ +BA33;BA33;1106 1164 11BE;BA33;1106 1164 11BE; # (먳; 먳; 먳; 먳; 먳; ) HANGUL SYLLABLE MYAEC +BA34;BA34;1106 1164 11BF;BA34;1106 1164 11BF; # (먴; 먴; 먴; 먴; 먴; ) HANGUL SYLLABLE MYAEK +BA35;BA35;1106 1164 11C0;BA35;1106 1164 11C0; # (먵; 먵; 먵; 먵; 먵; ) HANGUL SYLLABLE MYAET +BA36;BA36;1106 1164 11C1;BA36;1106 1164 11C1; # (먶; 먶; 먶; 먶; 먶; ) HANGUL SYLLABLE MYAEP +BA37;BA37;1106 1164 11C2;BA37;1106 1164 11C2; # (먷; 먷; 먷; 먷; 먷; ) HANGUL SYLLABLE MYAEH +BA38;BA38;1106 1165;BA38;1106 1165; # (머; 머; 머; 머; 머; ) HANGUL SYLLABLE MEO +BA39;BA39;1106 1165 11A8;BA39;1106 1165 11A8; # (먹; 먹; 먹; 먹; 먹; ) HANGUL SYLLABLE MEOG +BA3A;BA3A;1106 1165 11A9;BA3A;1106 1165 11A9; # (먺; 먺; 먺; 먺; 먺; ) HANGUL SYLLABLE MEOGG +BA3B;BA3B;1106 1165 11AA;BA3B;1106 1165 11AA; # (먻; 먻; 먻; 먻; 먻; ) HANGUL SYLLABLE MEOGS +BA3C;BA3C;1106 1165 11AB;BA3C;1106 1165 11AB; # (먼; 먼; 먼; 먼; 먼; ) HANGUL SYLLABLE MEON +BA3D;BA3D;1106 1165 11AC;BA3D;1106 1165 11AC; # (먽; 먽; 먽; 먽; 먽; ) HANGUL SYLLABLE MEONJ +BA3E;BA3E;1106 1165 11AD;BA3E;1106 1165 11AD; # (먾; 먾; 먾; 먾; 먾; ) HANGUL SYLLABLE MEONH +BA3F;BA3F;1106 1165 11AE;BA3F;1106 1165 11AE; # (먿; 먿; 먿; 먿; 먿; ) HANGUL SYLLABLE MEOD +BA40;BA40;1106 1165 11AF;BA40;1106 1165 11AF; # (멀; 멀; 멀; 멀; 멀; ) HANGUL SYLLABLE MEOL +BA41;BA41;1106 1165 11B0;BA41;1106 1165 11B0; # (멁; 멁; 멁; 멁; 멁; ) HANGUL SYLLABLE MEOLG +BA42;BA42;1106 1165 11B1;BA42;1106 1165 11B1; # (멂; 멂; 멂; 멂; 멂; ) HANGUL SYLLABLE MEOLM +BA43;BA43;1106 1165 11B2;BA43;1106 1165 11B2; # (멃; 멃; 멃; 멃; 멃; ) HANGUL SYLLABLE MEOLB +BA44;BA44;1106 1165 11B3;BA44;1106 1165 11B3; # (멄; 멄; 멄; 멄; 멄; ) HANGUL SYLLABLE MEOLS +BA45;BA45;1106 1165 11B4;BA45;1106 1165 11B4; # (멅; 멅; 멅; 멅; 멅; ) HANGUL SYLLABLE MEOLT +BA46;BA46;1106 1165 11B5;BA46;1106 1165 11B5; # (멆; 멆; 멆; 멆; 멆; ) HANGUL SYLLABLE MEOLP +BA47;BA47;1106 1165 11B6;BA47;1106 1165 11B6; # (멇; 멇; 멇; 멇; 멇; ) HANGUL SYLLABLE MEOLH +BA48;BA48;1106 1165 11B7;BA48;1106 1165 11B7; # (멈; 멈; 멈; 멈; 멈; ) HANGUL SYLLABLE MEOM +BA49;BA49;1106 1165 11B8;BA49;1106 1165 11B8; # (멉; 멉; 멉; 멉; 멉; ) HANGUL SYLLABLE MEOB +BA4A;BA4A;1106 1165 11B9;BA4A;1106 1165 11B9; # (멊; 멊; 멊; 멊; 멊; ) HANGUL SYLLABLE MEOBS +BA4B;BA4B;1106 1165 11BA;BA4B;1106 1165 11BA; # (멋; 멋; 멋; 멋; 멋; ) HANGUL SYLLABLE MEOS +BA4C;BA4C;1106 1165 11BB;BA4C;1106 1165 11BB; # (멌; 멌; 멌; 멌; 멌; ) HANGUL SYLLABLE MEOSS +BA4D;BA4D;1106 1165 11BC;BA4D;1106 1165 11BC; # (멍; 멍; 멍; 멍; 멍; ) HANGUL SYLLABLE MEONG +BA4E;BA4E;1106 1165 11BD;BA4E;1106 1165 11BD; # (멎; 멎; 멎; 멎; 멎; ) HANGUL SYLLABLE MEOJ +BA4F;BA4F;1106 1165 11BE;BA4F;1106 1165 11BE; # (멏; 멏; 멏; 멏; 멏; ) HANGUL SYLLABLE MEOC +BA50;BA50;1106 1165 11BF;BA50;1106 1165 11BF; # (멐; 멐; 멐; 멐; 멐; ) HANGUL SYLLABLE MEOK +BA51;BA51;1106 1165 11C0;BA51;1106 1165 11C0; # (멑; 멑; 멑; 멑; 멑; ) HANGUL SYLLABLE MEOT +BA52;BA52;1106 1165 11C1;BA52;1106 1165 11C1; # (멒; 멒; 멒; 멒; 멒; ) HANGUL SYLLABLE MEOP +BA53;BA53;1106 1165 11C2;BA53;1106 1165 11C2; # (멓; 멓; 멓; 멓; 멓; ) HANGUL SYLLABLE MEOH +BA54;BA54;1106 1166;BA54;1106 1166; # (메; 메; 메; 메; 메; ) HANGUL SYLLABLE ME +BA55;BA55;1106 1166 11A8;BA55;1106 1166 11A8; # (멕; 멕; 멕; 멕; 멕; ) HANGUL SYLLABLE MEG +BA56;BA56;1106 1166 11A9;BA56;1106 1166 11A9; # (멖; 멖; 멖; 멖; 멖; ) HANGUL SYLLABLE MEGG +BA57;BA57;1106 1166 11AA;BA57;1106 1166 11AA; # (멗; 멗; 멗; 멗; 멗; ) HANGUL SYLLABLE MEGS +BA58;BA58;1106 1166 11AB;BA58;1106 1166 11AB; # (멘; 멘; 멘; 멘; 멘; ) HANGUL SYLLABLE MEN +BA59;BA59;1106 1166 11AC;BA59;1106 1166 11AC; # (멙; 멙; 멙; 멙; 멙; ) HANGUL SYLLABLE MENJ +BA5A;BA5A;1106 1166 11AD;BA5A;1106 1166 11AD; # (멚; 멚; 멚; 멚; 멚; ) HANGUL SYLLABLE MENH +BA5B;BA5B;1106 1166 11AE;BA5B;1106 1166 11AE; # (멛; 멛; 멛; 멛; 멛; ) HANGUL SYLLABLE MED +BA5C;BA5C;1106 1166 11AF;BA5C;1106 1166 11AF; # (멜; 멜; 멜; 멜; 멜; ) HANGUL SYLLABLE MEL +BA5D;BA5D;1106 1166 11B0;BA5D;1106 1166 11B0; # (멝; 멝; 멝; 멝; 멝; ) HANGUL SYLLABLE MELG +BA5E;BA5E;1106 1166 11B1;BA5E;1106 1166 11B1; # (멞; 멞; 멞; 멞; 멞; ) HANGUL SYLLABLE MELM +BA5F;BA5F;1106 1166 11B2;BA5F;1106 1166 11B2; # (멟; 멟; 멟; 멟; 멟; ) HANGUL SYLLABLE MELB +BA60;BA60;1106 1166 11B3;BA60;1106 1166 11B3; # (멠; 멠; 멠; 멠; 멠; ) HANGUL SYLLABLE MELS +BA61;BA61;1106 1166 11B4;BA61;1106 1166 11B4; # (멡; 멡; 멡; 멡; 멡; ) HANGUL SYLLABLE MELT +BA62;BA62;1106 1166 11B5;BA62;1106 1166 11B5; # (멢; 멢; 멢; 멢; 멢; ) HANGUL SYLLABLE MELP +BA63;BA63;1106 1166 11B6;BA63;1106 1166 11B6; # (멣; 멣; 멣; 멣; 멣; ) HANGUL SYLLABLE MELH +BA64;BA64;1106 1166 11B7;BA64;1106 1166 11B7; # (멤; 멤; 멤; 멤; 멤; ) HANGUL SYLLABLE MEM +BA65;BA65;1106 1166 11B8;BA65;1106 1166 11B8; # (멥; 멥; 멥; 멥; 멥; ) HANGUL SYLLABLE MEB +BA66;BA66;1106 1166 11B9;BA66;1106 1166 11B9; # (멦; 멦; 멦; 멦; 멦; ) HANGUL SYLLABLE MEBS +BA67;BA67;1106 1166 11BA;BA67;1106 1166 11BA; # (멧; 멧; 멧; 멧; 멧; ) HANGUL SYLLABLE MES +BA68;BA68;1106 1166 11BB;BA68;1106 1166 11BB; # (멨; 멨; 멨; 멨; 멨; ) HANGUL SYLLABLE MESS +BA69;BA69;1106 1166 11BC;BA69;1106 1166 11BC; # (멩; 멩; 멩; 멩; 멩; ) HANGUL SYLLABLE MENG +BA6A;BA6A;1106 1166 11BD;BA6A;1106 1166 11BD; # (멪; 멪; 멪; 멪; 멪; ) HANGUL SYLLABLE MEJ +BA6B;BA6B;1106 1166 11BE;BA6B;1106 1166 11BE; # (멫; 멫; 멫; 멫; 멫; ) HANGUL SYLLABLE MEC +BA6C;BA6C;1106 1166 11BF;BA6C;1106 1166 11BF; # (멬; 멬; 멬; 멬; 멬; ) HANGUL SYLLABLE MEK +BA6D;BA6D;1106 1166 11C0;BA6D;1106 1166 11C0; # (멭; 멭; 멭; 멭; 멭; ) HANGUL SYLLABLE MET +BA6E;BA6E;1106 1166 11C1;BA6E;1106 1166 11C1; # (멮; 멮; 멮; 멮; 멮; ) HANGUL SYLLABLE MEP +BA6F;BA6F;1106 1166 11C2;BA6F;1106 1166 11C2; # (멯; 멯; 멯; 멯; 멯; ) HANGUL SYLLABLE MEH +BA70;BA70;1106 1167;BA70;1106 1167; # (며; 며; 며; 며; 며; ) HANGUL SYLLABLE MYEO +BA71;BA71;1106 1167 11A8;BA71;1106 1167 11A8; # (멱; 멱; 멱; 멱; 멱; ) HANGUL SYLLABLE MYEOG +BA72;BA72;1106 1167 11A9;BA72;1106 1167 11A9; # (멲; 멲; 멲; 멲; 멲; ) HANGUL SYLLABLE MYEOGG +BA73;BA73;1106 1167 11AA;BA73;1106 1167 11AA; # (멳; 멳; 멳; 멳; 멳; ) HANGUL SYLLABLE MYEOGS +BA74;BA74;1106 1167 11AB;BA74;1106 1167 11AB; # (면; 면; 면; 면; 면; ) HANGUL SYLLABLE MYEON +BA75;BA75;1106 1167 11AC;BA75;1106 1167 11AC; # (멵; 멵; 멵; 멵; 멵; ) HANGUL SYLLABLE MYEONJ +BA76;BA76;1106 1167 11AD;BA76;1106 1167 11AD; # (멶; 멶; 멶; 멶; 멶; ) HANGUL SYLLABLE MYEONH +BA77;BA77;1106 1167 11AE;BA77;1106 1167 11AE; # (멷; 멷; 멷; 멷; 멷; ) HANGUL SYLLABLE MYEOD +BA78;BA78;1106 1167 11AF;BA78;1106 1167 11AF; # (멸; 멸; 멸; 멸; 멸; ) HANGUL SYLLABLE MYEOL +BA79;BA79;1106 1167 11B0;BA79;1106 1167 11B0; # (멹; 멹; 멹; 멹; 멹; ) HANGUL SYLLABLE MYEOLG +BA7A;BA7A;1106 1167 11B1;BA7A;1106 1167 11B1; # (멺; 멺; 멺; 멺; 멺; ) HANGUL SYLLABLE MYEOLM +BA7B;BA7B;1106 1167 11B2;BA7B;1106 1167 11B2; # (멻; 멻; 멻; 멻; 멻; ) HANGUL SYLLABLE MYEOLB +BA7C;BA7C;1106 1167 11B3;BA7C;1106 1167 11B3; # (멼; 멼; 멼; 멼; 멼; ) HANGUL SYLLABLE MYEOLS +BA7D;BA7D;1106 1167 11B4;BA7D;1106 1167 11B4; # (멽; 멽; 멽; 멽; 멽; ) HANGUL SYLLABLE MYEOLT +BA7E;BA7E;1106 1167 11B5;BA7E;1106 1167 11B5; # (멾; 멾; 멾; 멾; 멾; ) HANGUL SYLLABLE MYEOLP +BA7F;BA7F;1106 1167 11B6;BA7F;1106 1167 11B6; # (멿; 멿; 멿; 멿; 멿; ) HANGUL SYLLABLE MYEOLH +BA80;BA80;1106 1167 11B7;BA80;1106 1167 11B7; # (몀; 몀; 몀; 몀; 몀; ) HANGUL SYLLABLE MYEOM +BA81;BA81;1106 1167 11B8;BA81;1106 1167 11B8; # (몁; 몁; 몁; 몁; 몁; ) HANGUL SYLLABLE MYEOB +BA82;BA82;1106 1167 11B9;BA82;1106 1167 11B9; # (몂; 몂; 몂; 몂; 몂; ) HANGUL SYLLABLE MYEOBS +BA83;BA83;1106 1167 11BA;BA83;1106 1167 11BA; # (몃; 몃; 몃; 몃; 몃; ) HANGUL SYLLABLE MYEOS +BA84;BA84;1106 1167 11BB;BA84;1106 1167 11BB; # (몄; 몄; 몄; 몄; 몄; ) HANGUL SYLLABLE MYEOSS +BA85;BA85;1106 1167 11BC;BA85;1106 1167 11BC; # (명; 명; 명; 명; 명; ) HANGUL SYLLABLE MYEONG +BA86;BA86;1106 1167 11BD;BA86;1106 1167 11BD; # (몆; 몆; 몆; 몆; 몆; ) HANGUL SYLLABLE MYEOJ +BA87;BA87;1106 1167 11BE;BA87;1106 1167 11BE; # (몇; 몇; 몇; 몇; 몇; ) HANGUL SYLLABLE MYEOC +BA88;BA88;1106 1167 11BF;BA88;1106 1167 11BF; # (몈; 몈; 몈; 몈; 몈; ) HANGUL SYLLABLE MYEOK +BA89;BA89;1106 1167 11C0;BA89;1106 1167 11C0; # (몉; 몉; 몉; 몉; 몉; ) HANGUL SYLLABLE MYEOT +BA8A;BA8A;1106 1167 11C1;BA8A;1106 1167 11C1; # (몊; 몊; 몊; 몊; 몊; ) HANGUL SYLLABLE MYEOP +BA8B;BA8B;1106 1167 11C2;BA8B;1106 1167 11C2; # (몋; 몋; 몋; 몋; 몋; ) HANGUL SYLLABLE MYEOH +BA8C;BA8C;1106 1168;BA8C;1106 1168; # (몌; 몌; 몌; 몌; 몌; ) HANGUL SYLLABLE MYE +BA8D;BA8D;1106 1168 11A8;BA8D;1106 1168 11A8; # (몍; 몍; 몍; 몍; 몍; ) HANGUL SYLLABLE MYEG +BA8E;BA8E;1106 1168 11A9;BA8E;1106 1168 11A9; # (몎; 몎; 몎; 몎; 몎; ) HANGUL SYLLABLE MYEGG +BA8F;BA8F;1106 1168 11AA;BA8F;1106 1168 11AA; # (몏; 몏; 몏; 몏; 몏; ) HANGUL SYLLABLE MYEGS +BA90;BA90;1106 1168 11AB;BA90;1106 1168 11AB; # (몐; 몐; 몐; 몐; 몐; ) HANGUL SYLLABLE MYEN +BA91;BA91;1106 1168 11AC;BA91;1106 1168 11AC; # (몑; 몑; 몑; 몑; 몑; ) HANGUL SYLLABLE MYENJ +BA92;BA92;1106 1168 11AD;BA92;1106 1168 11AD; # (몒; 몒; 몒; 몒; 몒; ) HANGUL SYLLABLE MYENH +BA93;BA93;1106 1168 11AE;BA93;1106 1168 11AE; # (몓; 몓; 몓; 몓; 몓; ) HANGUL SYLLABLE MYED +BA94;BA94;1106 1168 11AF;BA94;1106 1168 11AF; # (몔; 몔; 몔; 몔; 몔; ) HANGUL SYLLABLE MYEL +BA95;BA95;1106 1168 11B0;BA95;1106 1168 11B0; # (몕; 몕; 몕; 몕; 몕; ) HANGUL SYLLABLE MYELG +BA96;BA96;1106 1168 11B1;BA96;1106 1168 11B1; # (몖; 몖; 몖; 몖; 몖; ) HANGUL SYLLABLE MYELM +BA97;BA97;1106 1168 11B2;BA97;1106 1168 11B2; # (몗; 몗; 몗; 몗; 몗; ) HANGUL SYLLABLE MYELB +BA98;BA98;1106 1168 11B3;BA98;1106 1168 11B3; # (몘; 몘; 몘; 몘; 몘; ) HANGUL SYLLABLE MYELS +BA99;BA99;1106 1168 11B4;BA99;1106 1168 11B4; # (몙; 몙; 몙; 몙; 몙; ) HANGUL SYLLABLE MYELT +BA9A;BA9A;1106 1168 11B5;BA9A;1106 1168 11B5; # (몚; 몚; 몚; 몚; 몚; ) HANGUL SYLLABLE MYELP +BA9B;BA9B;1106 1168 11B6;BA9B;1106 1168 11B6; # (몛; 몛; 몛; 몛; 몛; ) HANGUL SYLLABLE MYELH +BA9C;BA9C;1106 1168 11B7;BA9C;1106 1168 11B7; # (몜; 몜; 몜; 몜; 몜; ) HANGUL SYLLABLE MYEM +BA9D;BA9D;1106 1168 11B8;BA9D;1106 1168 11B8; # (몝; 몝; 몝; 몝; 몝; ) HANGUL SYLLABLE MYEB +BA9E;BA9E;1106 1168 11B9;BA9E;1106 1168 11B9; # (몞; 몞; 몞; 몞; 몞; ) HANGUL SYLLABLE MYEBS +BA9F;BA9F;1106 1168 11BA;BA9F;1106 1168 11BA; # (몟; 몟; 몟; 몟; 몟; ) HANGUL SYLLABLE MYES +BAA0;BAA0;1106 1168 11BB;BAA0;1106 1168 11BB; # (몠; 몠; 몠; 몠; 몠; ) HANGUL SYLLABLE MYESS +BAA1;BAA1;1106 1168 11BC;BAA1;1106 1168 11BC; # (몡; 몡; 몡; 몡; 몡; ) HANGUL SYLLABLE MYENG +BAA2;BAA2;1106 1168 11BD;BAA2;1106 1168 11BD; # (몢; 몢; 몢; 몢; 몢; ) HANGUL SYLLABLE MYEJ +BAA3;BAA3;1106 1168 11BE;BAA3;1106 1168 11BE; # (몣; 몣; 몣; 몣; 몣; ) HANGUL SYLLABLE MYEC +BAA4;BAA4;1106 1168 11BF;BAA4;1106 1168 11BF; # (몤; 몤; 몤; 몤; 몤; ) HANGUL SYLLABLE MYEK +BAA5;BAA5;1106 1168 11C0;BAA5;1106 1168 11C0; # (몥; 몥; 몥; 몥; 몥; ) HANGUL SYLLABLE MYET +BAA6;BAA6;1106 1168 11C1;BAA6;1106 1168 11C1; # (몦; 몦; 몦; 몦; 몦; ) HANGUL SYLLABLE MYEP +BAA7;BAA7;1106 1168 11C2;BAA7;1106 1168 11C2; # (몧; 몧; 몧; 몧; 몧; ) HANGUL SYLLABLE MYEH +BAA8;BAA8;1106 1169;BAA8;1106 1169; # (모; 모; 모; 모; 모; ) HANGUL SYLLABLE MO +BAA9;BAA9;1106 1169 11A8;BAA9;1106 1169 11A8; # (목; 목; 목; 목; 목; ) HANGUL SYLLABLE MOG +BAAA;BAAA;1106 1169 11A9;BAAA;1106 1169 11A9; # (몪; 몪; 몪; 몪; 몪; ) HANGUL SYLLABLE MOGG +BAAB;BAAB;1106 1169 11AA;BAAB;1106 1169 11AA; # (몫; 몫; 몫; 몫; 몫; ) HANGUL SYLLABLE MOGS +BAAC;BAAC;1106 1169 11AB;BAAC;1106 1169 11AB; # (몬; 몬; 몬; 몬; 몬; ) HANGUL SYLLABLE MON +BAAD;BAAD;1106 1169 11AC;BAAD;1106 1169 11AC; # (몭; 몭; 몭; 몭; 몭; ) HANGUL SYLLABLE MONJ +BAAE;BAAE;1106 1169 11AD;BAAE;1106 1169 11AD; # (몮; 몮; 몮; 몮; 몮; ) HANGUL SYLLABLE MONH +BAAF;BAAF;1106 1169 11AE;BAAF;1106 1169 11AE; # (몯; 몯; 몯; 몯; 몯; ) HANGUL SYLLABLE MOD +BAB0;BAB0;1106 1169 11AF;BAB0;1106 1169 11AF; # (몰; 몰; 몰; 몰; 몰; ) HANGUL SYLLABLE MOL +BAB1;BAB1;1106 1169 11B0;BAB1;1106 1169 11B0; # (몱; 몱; 몱; 몱; 몱; ) HANGUL SYLLABLE MOLG +BAB2;BAB2;1106 1169 11B1;BAB2;1106 1169 11B1; # (몲; 몲; 몲; 몲; 몲; ) HANGUL SYLLABLE MOLM +BAB3;BAB3;1106 1169 11B2;BAB3;1106 1169 11B2; # (몳; 몳; 몳; 몳; 몳; ) HANGUL SYLLABLE MOLB +BAB4;BAB4;1106 1169 11B3;BAB4;1106 1169 11B3; # (몴; 몴; 몴; 몴; 몴; ) HANGUL SYLLABLE MOLS +BAB5;BAB5;1106 1169 11B4;BAB5;1106 1169 11B4; # (몵; 몵; 몵; 몵; 몵; ) HANGUL SYLLABLE MOLT +BAB6;BAB6;1106 1169 11B5;BAB6;1106 1169 11B5; # (몶; 몶; 몶; 몶; 몶; ) HANGUL SYLLABLE MOLP +BAB7;BAB7;1106 1169 11B6;BAB7;1106 1169 11B6; # (몷; 몷; 몷; 몷; 몷; ) HANGUL SYLLABLE MOLH +BAB8;BAB8;1106 1169 11B7;BAB8;1106 1169 11B7; # (몸; 몸; 몸; 몸; 몸; ) HANGUL SYLLABLE MOM +BAB9;BAB9;1106 1169 11B8;BAB9;1106 1169 11B8; # (몹; 몹; 몹; 몹; 몹; ) HANGUL SYLLABLE MOB +BABA;BABA;1106 1169 11B9;BABA;1106 1169 11B9; # (몺; 몺; 몺; 몺; 몺; ) HANGUL SYLLABLE MOBS +BABB;BABB;1106 1169 11BA;BABB;1106 1169 11BA; # (못; 못; 못; 못; 못; ) HANGUL SYLLABLE MOS +BABC;BABC;1106 1169 11BB;BABC;1106 1169 11BB; # (몼; 몼; 몼; 몼; 몼; ) HANGUL SYLLABLE MOSS +BABD;BABD;1106 1169 11BC;BABD;1106 1169 11BC; # (몽; 몽; 몽; 몽; 몽; ) HANGUL SYLLABLE MONG +BABE;BABE;1106 1169 11BD;BABE;1106 1169 11BD; # (몾; 몾; 몾; 몾; 몾; ) HANGUL SYLLABLE MOJ +BABF;BABF;1106 1169 11BE;BABF;1106 1169 11BE; # (몿; 몿; 몿; 몿; 몿; ) HANGUL SYLLABLE MOC +BAC0;BAC0;1106 1169 11BF;BAC0;1106 1169 11BF; # (뫀; 뫀; 뫀; 뫀; 뫀; ) HANGUL SYLLABLE MOK +BAC1;BAC1;1106 1169 11C0;BAC1;1106 1169 11C0; # (뫁; 뫁; 뫁; 뫁; 뫁; ) HANGUL SYLLABLE MOT +BAC2;BAC2;1106 1169 11C1;BAC2;1106 1169 11C1; # (뫂; 뫂; 뫂; 뫂; 뫂; ) HANGUL SYLLABLE MOP +BAC3;BAC3;1106 1169 11C2;BAC3;1106 1169 11C2; # (뫃; 뫃; 뫃; 뫃; 뫃; ) HANGUL SYLLABLE MOH +BAC4;BAC4;1106 116A;BAC4;1106 116A; # (뫄; 뫄; 뫄; 뫄; 뫄; ) HANGUL SYLLABLE MWA +BAC5;BAC5;1106 116A 11A8;BAC5;1106 116A 11A8; # (뫅; 뫅; 뫅; 뫅; 뫅; ) HANGUL SYLLABLE MWAG +BAC6;BAC6;1106 116A 11A9;BAC6;1106 116A 11A9; # (뫆; 뫆; 뫆; 뫆; 뫆; ) HANGUL SYLLABLE MWAGG +BAC7;BAC7;1106 116A 11AA;BAC7;1106 116A 11AA; # (뫇; 뫇; 뫇; 뫇; 뫇; ) HANGUL SYLLABLE MWAGS +BAC8;BAC8;1106 116A 11AB;BAC8;1106 116A 11AB; # (뫈; 뫈; 뫈; 뫈; 뫈; ) HANGUL SYLLABLE MWAN +BAC9;BAC9;1106 116A 11AC;BAC9;1106 116A 11AC; # (뫉; 뫉; 뫉; 뫉; 뫉; ) HANGUL SYLLABLE MWANJ +BACA;BACA;1106 116A 11AD;BACA;1106 116A 11AD; # (뫊; 뫊; 뫊; 뫊; 뫊; ) HANGUL SYLLABLE MWANH +BACB;BACB;1106 116A 11AE;BACB;1106 116A 11AE; # (뫋; 뫋; 뫋; 뫋; 뫋; ) HANGUL SYLLABLE MWAD +BACC;BACC;1106 116A 11AF;BACC;1106 116A 11AF; # (뫌; 뫌; 뫌; 뫌; 뫌; ) HANGUL SYLLABLE MWAL +BACD;BACD;1106 116A 11B0;BACD;1106 116A 11B0; # (뫍; 뫍; 뫍; 뫍; 뫍; ) HANGUL SYLLABLE MWALG +BACE;BACE;1106 116A 11B1;BACE;1106 116A 11B1; # (뫎; 뫎; 뫎; 뫎; 뫎; ) HANGUL SYLLABLE MWALM +BACF;BACF;1106 116A 11B2;BACF;1106 116A 11B2; # (뫏; 뫏; 뫏; 뫏; 뫏; ) HANGUL SYLLABLE MWALB +BAD0;BAD0;1106 116A 11B3;BAD0;1106 116A 11B3; # (뫐; 뫐; 뫐; 뫐; 뫐; ) HANGUL SYLLABLE MWALS +BAD1;BAD1;1106 116A 11B4;BAD1;1106 116A 11B4; # (뫑; 뫑; 뫑; 뫑; 뫑; ) HANGUL SYLLABLE MWALT +BAD2;BAD2;1106 116A 11B5;BAD2;1106 116A 11B5; # (뫒; 뫒; 뫒; 뫒; 뫒; ) HANGUL SYLLABLE MWALP +BAD3;BAD3;1106 116A 11B6;BAD3;1106 116A 11B6; # (뫓; 뫓; 뫓; 뫓; 뫓; ) HANGUL SYLLABLE MWALH +BAD4;BAD4;1106 116A 11B7;BAD4;1106 116A 11B7; # (뫔; 뫔; 뫔; 뫔; 뫔; ) HANGUL SYLLABLE MWAM +BAD5;BAD5;1106 116A 11B8;BAD5;1106 116A 11B8; # (뫕; 뫕; 뫕; 뫕; 뫕; ) HANGUL SYLLABLE MWAB +BAD6;BAD6;1106 116A 11B9;BAD6;1106 116A 11B9; # (뫖; 뫖; 뫖; 뫖; 뫖; ) HANGUL SYLLABLE MWABS +BAD7;BAD7;1106 116A 11BA;BAD7;1106 116A 11BA; # (뫗; 뫗; 뫗; 뫗; 뫗; ) HANGUL SYLLABLE MWAS +BAD8;BAD8;1106 116A 11BB;BAD8;1106 116A 11BB; # (뫘; 뫘; 뫘; 뫘; 뫘; ) HANGUL SYLLABLE MWASS +BAD9;BAD9;1106 116A 11BC;BAD9;1106 116A 11BC; # (뫙; 뫙; 뫙; 뫙; 뫙; ) HANGUL SYLLABLE MWANG +BADA;BADA;1106 116A 11BD;BADA;1106 116A 11BD; # (뫚; 뫚; 뫚; 뫚; 뫚; ) HANGUL SYLLABLE MWAJ +BADB;BADB;1106 116A 11BE;BADB;1106 116A 11BE; # (뫛; 뫛; 뫛; 뫛; 뫛; ) HANGUL SYLLABLE MWAC +BADC;BADC;1106 116A 11BF;BADC;1106 116A 11BF; # (뫜; 뫜; 뫜; 뫜; 뫜; ) HANGUL SYLLABLE MWAK +BADD;BADD;1106 116A 11C0;BADD;1106 116A 11C0; # (뫝; 뫝; 뫝; 뫝; 뫝; ) HANGUL SYLLABLE MWAT +BADE;BADE;1106 116A 11C1;BADE;1106 116A 11C1; # (뫞; 뫞; 뫞; 뫞; 뫞; ) HANGUL SYLLABLE MWAP +BADF;BADF;1106 116A 11C2;BADF;1106 116A 11C2; # (뫟; 뫟; 뫟; 뫟; 뫟; ) HANGUL SYLLABLE MWAH +BAE0;BAE0;1106 116B;BAE0;1106 116B; # (뫠; 뫠; 뫠; 뫠; 뫠; ) HANGUL SYLLABLE MWAE +BAE1;BAE1;1106 116B 11A8;BAE1;1106 116B 11A8; # (뫡; 뫡; 뫡; 뫡; 뫡; ) HANGUL SYLLABLE MWAEG +BAE2;BAE2;1106 116B 11A9;BAE2;1106 116B 11A9; # (뫢; 뫢; 뫢; 뫢; 뫢; ) HANGUL SYLLABLE MWAEGG +BAE3;BAE3;1106 116B 11AA;BAE3;1106 116B 11AA; # (뫣; 뫣; 뫣; 뫣; 뫣; ) HANGUL SYLLABLE MWAEGS +BAE4;BAE4;1106 116B 11AB;BAE4;1106 116B 11AB; # (뫤; 뫤; 뫤; 뫤; 뫤; ) HANGUL SYLLABLE MWAEN +BAE5;BAE5;1106 116B 11AC;BAE5;1106 116B 11AC; # (뫥; 뫥; 뫥; 뫥; 뫥; ) HANGUL SYLLABLE MWAENJ +BAE6;BAE6;1106 116B 11AD;BAE6;1106 116B 11AD; # (뫦; 뫦; 뫦; 뫦; 뫦; ) HANGUL SYLLABLE MWAENH +BAE7;BAE7;1106 116B 11AE;BAE7;1106 116B 11AE; # (뫧; 뫧; 뫧; 뫧; 뫧; ) HANGUL SYLLABLE MWAED +BAE8;BAE8;1106 116B 11AF;BAE8;1106 116B 11AF; # (뫨; 뫨; 뫨; 뫨; 뫨; ) HANGUL SYLLABLE MWAEL +BAE9;BAE9;1106 116B 11B0;BAE9;1106 116B 11B0; # (뫩; 뫩; 뫩; 뫩; 뫩; ) HANGUL SYLLABLE MWAELG +BAEA;BAEA;1106 116B 11B1;BAEA;1106 116B 11B1; # (뫪; 뫪; 뫪; 뫪; 뫪; ) HANGUL SYLLABLE MWAELM +BAEB;BAEB;1106 116B 11B2;BAEB;1106 116B 11B2; # (뫫; 뫫; 뫫; 뫫; 뫫; ) HANGUL SYLLABLE MWAELB +BAEC;BAEC;1106 116B 11B3;BAEC;1106 116B 11B3; # (뫬; 뫬; 뫬; 뫬; 뫬; ) HANGUL SYLLABLE MWAELS +BAED;BAED;1106 116B 11B4;BAED;1106 116B 11B4; # (뫭; 뫭; 뫭; 뫭; 뫭; ) HANGUL SYLLABLE MWAELT +BAEE;BAEE;1106 116B 11B5;BAEE;1106 116B 11B5; # (뫮; 뫮; 뫮; 뫮; 뫮; ) HANGUL SYLLABLE MWAELP +BAEF;BAEF;1106 116B 11B6;BAEF;1106 116B 11B6; # (뫯; 뫯; 뫯; 뫯; 뫯; ) HANGUL SYLLABLE MWAELH +BAF0;BAF0;1106 116B 11B7;BAF0;1106 116B 11B7; # (뫰; 뫰; 뫰; 뫰; 뫰; ) HANGUL SYLLABLE MWAEM +BAF1;BAF1;1106 116B 11B8;BAF1;1106 116B 11B8; # (뫱; 뫱; 뫱; 뫱; 뫱; ) HANGUL SYLLABLE MWAEB +BAF2;BAF2;1106 116B 11B9;BAF2;1106 116B 11B9; # (뫲; 뫲; 뫲; 뫲; 뫲; ) HANGUL SYLLABLE MWAEBS +BAF3;BAF3;1106 116B 11BA;BAF3;1106 116B 11BA; # (뫳; 뫳; 뫳; 뫳; 뫳; ) HANGUL SYLLABLE MWAES +BAF4;BAF4;1106 116B 11BB;BAF4;1106 116B 11BB; # (뫴; 뫴; 뫴; 뫴; 뫴; ) HANGUL SYLLABLE MWAESS +BAF5;BAF5;1106 116B 11BC;BAF5;1106 116B 11BC; # (뫵; 뫵; 뫵; 뫵; 뫵; ) HANGUL SYLLABLE MWAENG +BAF6;BAF6;1106 116B 11BD;BAF6;1106 116B 11BD; # (뫶; 뫶; 뫶; 뫶; 뫶; ) HANGUL SYLLABLE MWAEJ +BAF7;BAF7;1106 116B 11BE;BAF7;1106 116B 11BE; # (뫷; 뫷; 뫷; 뫷; 뫷; ) HANGUL SYLLABLE MWAEC +BAF8;BAF8;1106 116B 11BF;BAF8;1106 116B 11BF; # (뫸; 뫸; 뫸; 뫸; 뫸; ) HANGUL SYLLABLE MWAEK +BAF9;BAF9;1106 116B 11C0;BAF9;1106 116B 11C0; # (뫹; 뫹; 뫹; 뫹; 뫹; ) HANGUL SYLLABLE MWAET +BAFA;BAFA;1106 116B 11C1;BAFA;1106 116B 11C1; # (뫺; 뫺; 뫺; 뫺; 뫺; ) HANGUL SYLLABLE MWAEP +BAFB;BAFB;1106 116B 11C2;BAFB;1106 116B 11C2; # (뫻; 뫻; 뫻; 뫻; 뫻; ) HANGUL SYLLABLE MWAEH +BAFC;BAFC;1106 116C;BAFC;1106 116C; # (뫼; 뫼; 뫼; 뫼; 뫼; ) HANGUL SYLLABLE MOE +BAFD;BAFD;1106 116C 11A8;BAFD;1106 116C 11A8; # (뫽; 뫽; 뫽; 뫽; 뫽; ) HANGUL SYLLABLE MOEG +BAFE;BAFE;1106 116C 11A9;BAFE;1106 116C 11A9; # (뫾; 뫾; 뫾; 뫾; 뫾; ) HANGUL SYLLABLE MOEGG +BAFF;BAFF;1106 116C 11AA;BAFF;1106 116C 11AA; # (뫿; 뫿; 뫿; 뫿; 뫿; ) HANGUL SYLLABLE MOEGS +BB00;BB00;1106 116C 11AB;BB00;1106 116C 11AB; # (묀; 묀; 묀; 묀; 묀; ) HANGUL SYLLABLE MOEN +BB01;BB01;1106 116C 11AC;BB01;1106 116C 11AC; # (묁; 묁; 묁; 묁; 묁; ) HANGUL SYLLABLE MOENJ +BB02;BB02;1106 116C 11AD;BB02;1106 116C 11AD; # (묂; 묂; 묂; 묂; 묂; ) HANGUL SYLLABLE MOENH +BB03;BB03;1106 116C 11AE;BB03;1106 116C 11AE; # (묃; 묃; 묃; 묃; 묃; ) HANGUL SYLLABLE MOED +BB04;BB04;1106 116C 11AF;BB04;1106 116C 11AF; # (묄; 묄; 묄; 묄; 묄; ) HANGUL SYLLABLE MOEL +BB05;BB05;1106 116C 11B0;BB05;1106 116C 11B0; # (묅; 묅; 묅; 묅; 묅; ) HANGUL SYLLABLE MOELG +BB06;BB06;1106 116C 11B1;BB06;1106 116C 11B1; # (묆; 묆; 묆; 묆; 묆; ) HANGUL SYLLABLE MOELM +BB07;BB07;1106 116C 11B2;BB07;1106 116C 11B2; # (묇; 묇; 묇; 묇; 묇; ) HANGUL SYLLABLE MOELB +BB08;BB08;1106 116C 11B3;BB08;1106 116C 11B3; # (묈; 묈; 묈; 묈; 묈; ) HANGUL SYLLABLE MOELS +BB09;BB09;1106 116C 11B4;BB09;1106 116C 11B4; # (묉; 묉; 묉; 묉; 묉; ) HANGUL SYLLABLE MOELT +BB0A;BB0A;1106 116C 11B5;BB0A;1106 116C 11B5; # (묊; 묊; 묊; 묊; 묊; ) HANGUL SYLLABLE MOELP +BB0B;BB0B;1106 116C 11B6;BB0B;1106 116C 11B6; # (묋; 묋; 묋; 묋; 묋; ) HANGUL SYLLABLE MOELH +BB0C;BB0C;1106 116C 11B7;BB0C;1106 116C 11B7; # (묌; 묌; 묌; 묌; 묌; ) HANGUL SYLLABLE MOEM +BB0D;BB0D;1106 116C 11B8;BB0D;1106 116C 11B8; # (묍; 묍; 묍; 묍; 묍; ) HANGUL SYLLABLE MOEB +BB0E;BB0E;1106 116C 11B9;BB0E;1106 116C 11B9; # (묎; 묎; 묎; 묎; 묎; ) HANGUL SYLLABLE MOEBS +BB0F;BB0F;1106 116C 11BA;BB0F;1106 116C 11BA; # (묏; 묏; 묏; 묏; 묏; ) HANGUL SYLLABLE MOES +BB10;BB10;1106 116C 11BB;BB10;1106 116C 11BB; # (묐; 묐; 묐; 묐; 묐; ) HANGUL SYLLABLE MOESS +BB11;BB11;1106 116C 11BC;BB11;1106 116C 11BC; # (묑; 묑; 묑; 묑; 묑; ) HANGUL SYLLABLE MOENG +BB12;BB12;1106 116C 11BD;BB12;1106 116C 11BD; # (묒; 묒; 묒; 묒; 묒; ) HANGUL SYLLABLE MOEJ +BB13;BB13;1106 116C 11BE;BB13;1106 116C 11BE; # (묓; 묓; 묓; 묓; 묓; ) HANGUL SYLLABLE MOEC +BB14;BB14;1106 116C 11BF;BB14;1106 116C 11BF; # (묔; 묔; 묔; 묔; 묔; ) HANGUL SYLLABLE MOEK +BB15;BB15;1106 116C 11C0;BB15;1106 116C 11C0; # (묕; 묕; 묕; 묕; 묕; ) HANGUL SYLLABLE MOET +BB16;BB16;1106 116C 11C1;BB16;1106 116C 11C1; # (묖; 묖; 묖; 묖; 묖; ) HANGUL SYLLABLE MOEP +BB17;BB17;1106 116C 11C2;BB17;1106 116C 11C2; # (묗; 묗; 묗; 묗; 묗; ) HANGUL SYLLABLE MOEH +BB18;BB18;1106 116D;BB18;1106 116D; # (묘; 묘; 묘; 묘; 묘; ) HANGUL SYLLABLE MYO +BB19;BB19;1106 116D 11A8;BB19;1106 116D 11A8; # (묙; 묙; 묙; 묙; 묙; ) HANGUL SYLLABLE MYOG +BB1A;BB1A;1106 116D 11A9;BB1A;1106 116D 11A9; # (묚; 묚; 묚; 묚; 묚; ) HANGUL SYLLABLE MYOGG +BB1B;BB1B;1106 116D 11AA;BB1B;1106 116D 11AA; # (묛; 묛; 묛; 묛; 묛; ) HANGUL SYLLABLE MYOGS +BB1C;BB1C;1106 116D 11AB;BB1C;1106 116D 11AB; # (묜; 묜; 묜; 묜; 묜; ) HANGUL SYLLABLE MYON +BB1D;BB1D;1106 116D 11AC;BB1D;1106 116D 11AC; # (묝; 묝; 묝; 묝; 묝; ) HANGUL SYLLABLE MYONJ +BB1E;BB1E;1106 116D 11AD;BB1E;1106 116D 11AD; # (묞; 묞; 묞; 묞; 묞; ) HANGUL SYLLABLE MYONH +BB1F;BB1F;1106 116D 11AE;BB1F;1106 116D 11AE; # (묟; 묟; 묟; 묟; 묟; ) HANGUL SYLLABLE MYOD +BB20;BB20;1106 116D 11AF;BB20;1106 116D 11AF; # (묠; 묠; 묠; 묠; 묠; ) HANGUL SYLLABLE MYOL +BB21;BB21;1106 116D 11B0;BB21;1106 116D 11B0; # (묡; 묡; 묡; 묡; 묡; ) HANGUL SYLLABLE MYOLG +BB22;BB22;1106 116D 11B1;BB22;1106 116D 11B1; # (묢; 묢; 묢; 묢; 묢; ) HANGUL SYLLABLE MYOLM +BB23;BB23;1106 116D 11B2;BB23;1106 116D 11B2; # (묣; 묣; 묣; 묣; 묣; ) HANGUL SYLLABLE MYOLB +BB24;BB24;1106 116D 11B3;BB24;1106 116D 11B3; # (묤; 묤; 묤; 묤; 묤; ) HANGUL SYLLABLE MYOLS +BB25;BB25;1106 116D 11B4;BB25;1106 116D 11B4; # (묥; 묥; 묥; 묥; 묥; ) HANGUL SYLLABLE MYOLT +BB26;BB26;1106 116D 11B5;BB26;1106 116D 11B5; # (묦; 묦; 묦; 묦; 묦; ) HANGUL SYLLABLE MYOLP +BB27;BB27;1106 116D 11B6;BB27;1106 116D 11B6; # (묧; 묧; 묧; 묧; 묧; ) HANGUL SYLLABLE MYOLH +BB28;BB28;1106 116D 11B7;BB28;1106 116D 11B7; # (묨; 묨; 묨; 묨; 묨; ) HANGUL SYLLABLE MYOM +BB29;BB29;1106 116D 11B8;BB29;1106 116D 11B8; # (묩; 묩; 묩; 묩; 묩; ) HANGUL SYLLABLE MYOB +BB2A;BB2A;1106 116D 11B9;BB2A;1106 116D 11B9; # (묪; 묪; 묪; 묪; 묪; ) HANGUL SYLLABLE MYOBS +BB2B;BB2B;1106 116D 11BA;BB2B;1106 116D 11BA; # (묫; 묫; 묫; 묫; 묫; ) HANGUL SYLLABLE MYOS +BB2C;BB2C;1106 116D 11BB;BB2C;1106 116D 11BB; # (묬; 묬; 묬; 묬; 묬; ) HANGUL SYLLABLE MYOSS +BB2D;BB2D;1106 116D 11BC;BB2D;1106 116D 11BC; # (묭; 묭; 묭; 묭; 묭; ) HANGUL SYLLABLE MYONG +BB2E;BB2E;1106 116D 11BD;BB2E;1106 116D 11BD; # (묮; 묮; 묮; 묮; 묮; ) HANGUL SYLLABLE MYOJ +BB2F;BB2F;1106 116D 11BE;BB2F;1106 116D 11BE; # (묯; 묯; 묯; 묯; 묯; ) HANGUL SYLLABLE MYOC +BB30;BB30;1106 116D 11BF;BB30;1106 116D 11BF; # (묰; 묰; 묰; 묰; 묰; ) HANGUL SYLLABLE MYOK +BB31;BB31;1106 116D 11C0;BB31;1106 116D 11C0; # (묱; 묱; 묱; 묱; 묱; ) HANGUL SYLLABLE MYOT +BB32;BB32;1106 116D 11C1;BB32;1106 116D 11C1; # (묲; 묲; 묲; 묲; 묲; ) HANGUL SYLLABLE MYOP +BB33;BB33;1106 116D 11C2;BB33;1106 116D 11C2; # (묳; 묳; 묳; 묳; 묳; ) HANGUL SYLLABLE MYOH +BB34;BB34;1106 116E;BB34;1106 116E; # (무; 무; 무; 무; 무; ) HANGUL SYLLABLE MU +BB35;BB35;1106 116E 11A8;BB35;1106 116E 11A8; # (묵; 묵; 묵; 묵; 묵; ) HANGUL SYLLABLE MUG +BB36;BB36;1106 116E 11A9;BB36;1106 116E 11A9; # (묶; 묶; 묶; 묶; 묶; ) HANGUL SYLLABLE MUGG +BB37;BB37;1106 116E 11AA;BB37;1106 116E 11AA; # (묷; 묷; 묷; 묷; 묷; ) HANGUL SYLLABLE MUGS +BB38;BB38;1106 116E 11AB;BB38;1106 116E 11AB; # (문; 문; 문; 문; 문; ) HANGUL SYLLABLE MUN +BB39;BB39;1106 116E 11AC;BB39;1106 116E 11AC; # (묹; 묹; 묹; 묹; 묹; ) HANGUL SYLLABLE MUNJ +BB3A;BB3A;1106 116E 11AD;BB3A;1106 116E 11AD; # (묺; 묺; 묺; 묺; 묺; ) HANGUL SYLLABLE MUNH +BB3B;BB3B;1106 116E 11AE;BB3B;1106 116E 11AE; # (묻; 묻; 묻; 묻; 묻; ) HANGUL SYLLABLE MUD +BB3C;BB3C;1106 116E 11AF;BB3C;1106 116E 11AF; # (물; 물; 물; 물; 물; ) HANGUL SYLLABLE MUL +BB3D;BB3D;1106 116E 11B0;BB3D;1106 116E 11B0; # (묽; 묽; 묽; 묽; 묽; ) HANGUL SYLLABLE MULG +BB3E;BB3E;1106 116E 11B1;BB3E;1106 116E 11B1; # (묾; 묾; 묾; 묾; 묾; ) HANGUL SYLLABLE MULM +BB3F;BB3F;1106 116E 11B2;BB3F;1106 116E 11B2; # (묿; 묿; 묿; 묿; 묿; ) HANGUL SYLLABLE MULB +BB40;BB40;1106 116E 11B3;BB40;1106 116E 11B3; # (뭀; 뭀; 뭀; 뭀; 뭀; ) HANGUL SYLLABLE MULS +BB41;BB41;1106 116E 11B4;BB41;1106 116E 11B4; # (뭁; 뭁; 뭁; 뭁; 뭁; ) HANGUL SYLLABLE MULT +BB42;BB42;1106 116E 11B5;BB42;1106 116E 11B5; # (뭂; 뭂; 뭂; 뭂; 뭂; ) HANGUL SYLLABLE MULP +BB43;BB43;1106 116E 11B6;BB43;1106 116E 11B6; # (뭃; 뭃; 뭃; 뭃; 뭃; ) HANGUL SYLLABLE MULH +BB44;BB44;1106 116E 11B7;BB44;1106 116E 11B7; # (뭄; 뭄; 뭄; 뭄; 뭄; ) HANGUL SYLLABLE MUM +BB45;BB45;1106 116E 11B8;BB45;1106 116E 11B8; # (뭅; 뭅; 뭅; 뭅; 뭅; ) HANGUL SYLLABLE MUB +BB46;BB46;1106 116E 11B9;BB46;1106 116E 11B9; # (뭆; 뭆; 뭆; 뭆; 뭆; ) HANGUL SYLLABLE MUBS +BB47;BB47;1106 116E 11BA;BB47;1106 116E 11BA; # (뭇; 뭇; 뭇; 뭇; 뭇; ) HANGUL SYLLABLE MUS +BB48;BB48;1106 116E 11BB;BB48;1106 116E 11BB; # (뭈; 뭈; 뭈; 뭈; 뭈; ) HANGUL SYLLABLE MUSS +BB49;BB49;1106 116E 11BC;BB49;1106 116E 11BC; # (뭉; 뭉; 뭉; 뭉; 뭉; ) HANGUL SYLLABLE MUNG +BB4A;BB4A;1106 116E 11BD;BB4A;1106 116E 11BD; # (뭊; 뭊; 뭊; 뭊; 뭊; ) HANGUL SYLLABLE MUJ +BB4B;BB4B;1106 116E 11BE;BB4B;1106 116E 11BE; # (뭋; 뭋; 뭋; 뭋; 뭋; ) HANGUL SYLLABLE MUC +BB4C;BB4C;1106 116E 11BF;BB4C;1106 116E 11BF; # (뭌; 뭌; 뭌; 뭌; 뭌; ) HANGUL SYLLABLE MUK +BB4D;BB4D;1106 116E 11C0;BB4D;1106 116E 11C0; # (뭍; 뭍; 뭍; 뭍; 뭍; ) HANGUL SYLLABLE MUT +BB4E;BB4E;1106 116E 11C1;BB4E;1106 116E 11C1; # (뭎; 뭎; 뭎; 뭎; 뭎; ) HANGUL SYLLABLE MUP +BB4F;BB4F;1106 116E 11C2;BB4F;1106 116E 11C2; # (뭏; 뭏; 뭏; 뭏; 뭏; ) HANGUL SYLLABLE MUH +BB50;BB50;1106 116F;BB50;1106 116F; # (뭐; 뭐; 뭐; 뭐; 뭐; ) HANGUL SYLLABLE MWEO +BB51;BB51;1106 116F 11A8;BB51;1106 116F 11A8; # (뭑; 뭑; 뭑; 뭑; 뭑; ) HANGUL SYLLABLE MWEOG +BB52;BB52;1106 116F 11A9;BB52;1106 116F 11A9; # (뭒; 뭒; 뭒; 뭒; 뭒; ) HANGUL SYLLABLE MWEOGG +BB53;BB53;1106 116F 11AA;BB53;1106 116F 11AA; # (뭓; 뭓; 뭓; 뭓; 뭓; ) HANGUL SYLLABLE MWEOGS +BB54;BB54;1106 116F 11AB;BB54;1106 116F 11AB; # (뭔; 뭔; 뭔; 뭔; 뭔; ) HANGUL SYLLABLE MWEON +BB55;BB55;1106 116F 11AC;BB55;1106 116F 11AC; # (뭕; 뭕; 뭕; 뭕; 뭕; ) HANGUL SYLLABLE MWEONJ +BB56;BB56;1106 116F 11AD;BB56;1106 116F 11AD; # (뭖; 뭖; 뭖; 뭖; 뭖; ) HANGUL SYLLABLE MWEONH +BB57;BB57;1106 116F 11AE;BB57;1106 116F 11AE; # (뭗; 뭗; 뭗; 뭗; 뭗; ) HANGUL SYLLABLE MWEOD +BB58;BB58;1106 116F 11AF;BB58;1106 116F 11AF; # (뭘; 뭘; 뭘; 뭘; 뭘; ) HANGUL SYLLABLE MWEOL +BB59;BB59;1106 116F 11B0;BB59;1106 116F 11B0; # (뭙; 뭙; 뭙; 뭙; 뭙; ) HANGUL SYLLABLE MWEOLG +BB5A;BB5A;1106 116F 11B1;BB5A;1106 116F 11B1; # (뭚; 뭚; 뭚; 뭚; 뭚; ) HANGUL SYLLABLE MWEOLM +BB5B;BB5B;1106 116F 11B2;BB5B;1106 116F 11B2; # (뭛; 뭛; 뭛; 뭛; 뭛; ) HANGUL SYLLABLE MWEOLB +BB5C;BB5C;1106 116F 11B3;BB5C;1106 116F 11B3; # (뭜; 뭜; 뭜; 뭜; 뭜; ) HANGUL SYLLABLE MWEOLS +BB5D;BB5D;1106 116F 11B4;BB5D;1106 116F 11B4; # (뭝; 뭝; 뭝; 뭝; 뭝; ) HANGUL SYLLABLE MWEOLT +BB5E;BB5E;1106 116F 11B5;BB5E;1106 116F 11B5; # (뭞; 뭞; 뭞; 뭞; 뭞; ) HANGUL SYLLABLE MWEOLP +BB5F;BB5F;1106 116F 11B6;BB5F;1106 116F 11B6; # (뭟; 뭟; 뭟; 뭟; 뭟; ) HANGUL SYLLABLE MWEOLH +BB60;BB60;1106 116F 11B7;BB60;1106 116F 11B7; # (뭠; 뭠; 뭠; 뭠; 뭠; ) HANGUL SYLLABLE MWEOM +BB61;BB61;1106 116F 11B8;BB61;1106 116F 11B8; # (뭡; 뭡; 뭡; 뭡; 뭡; ) HANGUL SYLLABLE MWEOB +BB62;BB62;1106 116F 11B9;BB62;1106 116F 11B9; # (뭢; 뭢; 뭢; 뭢; 뭢; ) HANGUL SYLLABLE MWEOBS +BB63;BB63;1106 116F 11BA;BB63;1106 116F 11BA; # (뭣; 뭣; 뭣; 뭣; 뭣; ) HANGUL SYLLABLE MWEOS +BB64;BB64;1106 116F 11BB;BB64;1106 116F 11BB; # (뭤; 뭤; 뭤; 뭤; 뭤; ) HANGUL SYLLABLE MWEOSS +BB65;BB65;1106 116F 11BC;BB65;1106 116F 11BC; # (뭥; 뭥; 뭥; 뭥; 뭥; ) HANGUL SYLLABLE MWEONG +BB66;BB66;1106 116F 11BD;BB66;1106 116F 11BD; # (뭦; 뭦; 뭦; 뭦; 뭦; ) HANGUL SYLLABLE MWEOJ +BB67;BB67;1106 116F 11BE;BB67;1106 116F 11BE; # (뭧; 뭧; 뭧; 뭧; 뭧; ) HANGUL SYLLABLE MWEOC +BB68;BB68;1106 116F 11BF;BB68;1106 116F 11BF; # (뭨; 뭨; 뭨; 뭨; 뭨; ) HANGUL SYLLABLE MWEOK +BB69;BB69;1106 116F 11C0;BB69;1106 116F 11C0; # (뭩; 뭩; 뭩; 뭩; 뭩; ) HANGUL SYLLABLE MWEOT +BB6A;BB6A;1106 116F 11C1;BB6A;1106 116F 11C1; # (뭪; 뭪; 뭪; 뭪; 뭪; ) HANGUL SYLLABLE MWEOP +BB6B;BB6B;1106 116F 11C2;BB6B;1106 116F 11C2; # (뭫; 뭫; 뭫; 뭫; 뭫; ) HANGUL SYLLABLE MWEOH +BB6C;BB6C;1106 1170;BB6C;1106 1170; # (뭬; 뭬; 뭬; 뭬; 뭬; ) HANGUL SYLLABLE MWE +BB6D;BB6D;1106 1170 11A8;BB6D;1106 1170 11A8; # (뭭; 뭭; 뭭; 뭭; 뭭; ) HANGUL SYLLABLE MWEG +BB6E;BB6E;1106 1170 11A9;BB6E;1106 1170 11A9; # (뭮; 뭮; 뭮; 뭮; 뭮; ) HANGUL SYLLABLE MWEGG +BB6F;BB6F;1106 1170 11AA;BB6F;1106 1170 11AA; # (뭯; 뭯; 뭯; 뭯; 뭯; ) HANGUL SYLLABLE MWEGS +BB70;BB70;1106 1170 11AB;BB70;1106 1170 11AB; # (뭰; 뭰; 뭰; 뭰; 뭰; ) HANGUL SYLLABLE MWEN +BB71;BB71;1106 1170 11AC;BB71;1106 1170 11AC; # (뭱; 뭱; 뭱; 뭱; 뭱; ) HANGUL SYLLABLE MWENJ +BB72;BB72;1106 1170 11AD;BB72;1106 1170 11AD; # (뭲; 뭲; 뭲; 뭲; 뭲; ) HANGUL SYLLABLE MWENH +BB73;BB73;1106 1170 11AE;BB73;1106 1170 11AE; # (뭳; 뭳; 뭳; 뭳; 뭳; ) HANGUL SYLLABLE MWED +BB74;BB74;1106 1170 11AF;BB74;1106 1170 11AF; # (뭴; 뭴; 뭴; 뭴; 뭴; ) HANGUL SYLLABLE MWEL +BB75;BB75;1106 1170 11B0;BB75;1106 1170 11B0; # (뭵; 뭵; 뭵; 뭵; 뭵; ) HANGUL SYLLABLE MWELG +BB76;BB76;1106 1170 11B1;BB76;1106 1170 11B1; # (뭶; 뭶; 뭶; 뭶; 뭶; ) HANGUL SYLLABLE MWELM +BB77;BB77;1106 1170 11B2;BB77;1106 1170 11B2; # (뭷; 뭷; 뭷; 뭷; 뭷; ) HANGUL SYLLABLE MWELB +BB78;BB78;1106 1170 11B3;BB78;1106 1170 11B3; # (뭸; 뭸; 뭸; 뭸; 뭸; ) HANGUL SYLLABLE MWELS +BB79;BB79;1106 1170 11B4;BB79;1106 1170 11B4; # (뭹; 뭹; 뭹; 뭹; 뭹; ) HANGUL SYLLABLE MWELT +BB7A;BB7A;1106 1170 11B5;BB7A;1106 1170 11B5; # (뭺; 뭺; 뭺; 뭺; 뭺; ) HANGUL SYLLABLE MWELP +BB7B;BB7B;1106 1170 11B6;BB7B;1106 1170 11B6; # (뭻; 뭻; 뭻; 뭻; 뭻; ) HANGUL SYLLABLE MWELH +BB7C;BB7C;1106 1170 11B7;BB7C;1106 1170 11B7; # (뭼; 뭼; 뭼; 뭼; 뭼; ) HANGUL SYLLABLE MWEM +BB7D;BB7D;1106 1170 11B8;BB7D;1106 1170 11B8; # (뭽; 뭽; 뭽; 뭽; 뭽; ) HANGUL SYLLABLE MWEB +BB7E;BB7E;1106 1170 11B9;BB7E;1106 1170 11B9; # (뭾; 뭾; 뭾; 뭾; 뭾; ) HANGUL SYLLABLE MWEBS +BB7F;BB7F;1106 1170 11BA;BB7F;1106 1170 11BA; # (뭿; 뭿; 뭿; 뭿; 뭿; ) HANGUL SYLLABLE MWES +BB80;BB80;1106 1170 11BB;BB80;1106 1170 11BB; # (뮀; 뮀; 뮀; 뮀; 뮀; ) HANGUL SYLLABLE MWESS +BB81;BB81;1106 1170 11BC;BB81;1106 1170 11BC; # (뮁; 뮁; 뮁; 뮁; 뮁; ) HANGUL SYLLABLE MWENG +BB82;BB82;1106 1170 11BD;BB82;1106 1170 11BD; # (뮂; 뮂; 뮂; 뮂; 뮂; ) HANGUL SYLLABLE MWEJ +BB83;BB83;1106 1170 11BE;BB83;1106 1170 11BE; # (뮃; 뮃; 뮃; 뮃; 뮃; ) HANGUL SYLLABLE MWEC +BB84;BB84;1106 1170 11BF;BB84;1106 1170 11BF; # (뮄; 뮄; 뮄; 뮄; 뮄; ) HANGUL SYLLABLE MWEK +BB85;BB85;1106 1170 11C0;BB85;1106 1170 11C0; # (뮅; 뮅; 뮅; 뮅; 뮅; ) HANGUL SYLLABLE MWET +BB86;BB86;1106 1170 11C1;BB86;1106 1170 11C1; # (뮆; 뮆; 뮆; 뮆; 뮆; ) HANGUL SYLLABLE MWEP +BB87;BB87;1106 1170 11C2;BB87;1106 1170 11C2; # (뮇; 뮇; 뮇; 뮇; 뮇; ) HANGUL SYLLABLE MWEH +BB88;BB88;1106 1171;BB88;1106 1171; # (뮈; 뮈; 뮈; 뮈; 뮈; ) HANGUL SYLLABLE MWI +BB89;BB89;1106 1171 11A8;BB89;1106 1171 11A8; # (뮉; 뮉; 뮉; 뮉; 뮉; ) HANGUL SYLLABLE MWIG +BB8A;BB8A;1106 1171 11A9;BB8A;1106 1171 11A9; # (뮊; 뮊; 뮊; 뮊; 뮊; ) HANGUL SYLLABLE MWIGG +BB8B;BB8B;1106 1171 11AA;BB8B;1106 1171 11AA; # (뮋; 뮋; 뮋; 뮋; 뮋; ) HANGUL SYLLABLE MWIGS +BB8C;BB8C;1106 1171 11AB;BB8C;1106 1171 11AB; # (뮌; 뮌; 뮌; 뮌; 뮌; ) HANGUL SYLLABLE MWIN +BB8D;BB8D;1106 1171 11AC;BB8D;1106 1171 11AC; # (뮍; 뮍; 뮍; 뮍; 뮍; ) HANGUL SYLLABLE MWINJ +BB8E;BB8E;1106 1171 11AD;BB8E;1106 1171 11AD; # (뮎; 뮎; 뮎; 뮎; 뮎; ) HANGUL SYLLABLE MWINH +BB8F;BB8F;1106 1171 11AE;BB8F;1106 1171 11AE; # (뮏; 뮏; 뮏; 뮏; 뮏; ) HANGUL SYLLABLE MWID +BB90;BB90;1106 1171 11AF;BB90;1106 1171 11AF; # (뮐; 뮐; 뮐; 뮐; 뮐; ) HANGUL SYLLABLE MWIL +BB91;BB91;1106 1171 11B0;BB91;1106 1171 11B0; # (뮑; 뮑; 뮑; 뮑; 뮑; ) HANGUL SYLLABLE MWILG +BB92;BB92;1106 1171 11B1;BB92;1106 1171 11B1; # (뮒; 뮒; 뮒; 뮒; 뮒; ) HANGUL SYLLABLE MWILM +BB93;BB93;1106 1171 11B2;BB93;1106 1171 11B2; # (뮓; 뮓; 뮓; 뮓; 뮓; ) HANGUL SYLLABLE MWILB +BB94;BB94;1106 1171 11B3;BB94;1106 1171 11B3; # (뮔; 뮔; 뮔; 뮔; 뮔; ) HANGUL SYLLABLE MWILS +BB95;BB95;1106 1171 11B4;BB95;1106 1171 11B4; # (뮕; 뮕; 뮕; 뮕; 뮕; ) HANGUL SYLLABLE MWILT +BB96;BB96;1106 1171 11B5;BB96;1106 1171 11B5; # (뮖; 뮖; 뮖; 뮖; 뮖; ) HANGUL SYLLABLE MWILP +BB97;BB97;1106 1171 11B6;BB97;1106 1171 11B6; # (뮗; 뮗; 뮗; 뮗; 뮗; ) HANGUL SYLLABLE MWILH +BB98;BB98;1106 1171 11B7;BB98;1106 1171 11B7; # (뮘; 뮘; 뮘; 뮘; 뮘; ) HANGUL SYLLABLE MWIM +BB99;BB99;1106 1171 11B8;BB99;1106 1171 11B8; # (뮙; 뮙; 뮙; 뮙; 뮙; ) HANGUL SYLLABLE MWIB +BB9A;BB9A;1106 1171 11B9;BB9A;1106 1171 11B9; # (뮚; 뮚; 뮚; 뮚; 뮚; ) HANGUL SYLLABLE MWIBS +BB9B;BB9B;1106 1171 11BA;BB9B;1106 1171 11BA; # (뮛; 뮛; 뮛; 뮛; 뮛; ) HANGUL SYLLABLE MWIS +BB9C;BB9C;1106 1171 11BB;BB9C;1106 1171 11BB; # (뮜; 뮜; 뮜; 뮜; 뮜; ) HANGUL SYLLABLE MWISS +BB9D;BB9D;1106 1171 11BC;BB9D;1106 1171 11BC; # (뮝; 뮝; 뮝; 뮝; 뮝; ) HANGUL SYLLABLE MWING +BB9E;BB9E;1106 1171 11BD;BB9E;1106 1171 11BD; # (뮞; 뮞; 뮞; 뮞; 뮞; ) HANGUL SYLLABLE MWIJ +BB9F;BB9F;1106 1171 11BE;BB9F;1106 1171 11BE; # (뮟; 뮟; 뮟; 뮟; 뮟; ) HANGUL SYLLABLE MWIC +BBA0;BBA0;1106 1171 11BF;BBA0;1106 1171 11BF; # (뮠; 뮠; 뮠; 뮠; 뮠; ) HANGUL SYLLABLE MWIK +BBA1;BBA1;1106 1171 11C0;BBA1;1106 1171 11C0; # (뮡; 뮡; 뮡; 뮡; 뮡; ) HANGUL SYLLABLE MWIT +BBA2;BBA2;1106 1171 11C1;BBA2;1106 1171 11C1; # (뮢; 뮢; 뮢; 뮢; 뮢; ) HANGUL SYLLABLE MWIP +BBA3;BBA3;1106 1171 11C2;BBA3;1106 1171 11C2; # (뮣; 뮣; 뮣; 뮣; 뮣; ) HANGUL SYLLABLE MWIH +BBA4;BBA4;1106 1172;BBA4;1106 1172; # (뮤; 뮤; 뮤; 뮤; 뮤; ) HANGUL SYLLABLE MYU +BBA5;BBA5;1106 1172 11A8;BBA5;1106 1172 11A8; # (뮥; 뮥; 뮥; 뮥; 뮥; ) HANGUL SYLLABLE MYUG +BBA6;BBA6;1106 1172 11A9;BBA6;1106 1172 11A9; # (뮦; 뮦; 뮦; 뮦; 뮦; ) HANGUL SYLLABLE MYUGG +BBA7;BBA7;1106 1172 11AA;BBA7;1106 1172 11AA; # (뮧; 뮧; 뮧; 뮧; 뮧; ) HANGUL SYLLABLE MYUGS +BBA8;BBA8;1106 1172 11AB;BBA8;1106 1172 11AB; # (뮨; 뮨; 뮨; 뮨; 뮨; ) HANGUL SYLLABLE MYUN +BBA9;BBA9;1106 1172 11AC;BBA9;1106 1172 11AC; # (뮩; 뮩; 뮩; 뮩; 뮩; ) HANGUL SYLLABLE MYUNJ +BBAA;BBAA;1106 1172 11AD;BBAA;1106 1172 11AD; # (뮪; 뮪; 뮪; 뮪; 뮪; ) HANGUL SYLLABLE MYUNH +BBAB;BBAB;1106 1172 11AE;BBAB;1106 1172 11AE; # (뮫; 뮫; 뮫; 뮫; 뮫; ) HANGUL SYLLABLE MYUD +BBAC;BBAC;1106 1172 11AF;BBAC;1106 1172 11AF; # (뮬; 뮬; 뮬; 뮬; 뮬; ) HANGUL SYLLABLE MYUL +BBAD;BBAD;1106 1172 11B0;BBAD;1106 1172 11B0; # (뮭; 뮭; 뮭; 뮭; 뮭; ) HANGUL SYLLABLE MYULG +BBAE;BBAE;1106 1172 11B1;BBAE;1106 1172 11B1; # (뮮; 뮮; 뮮; 뮮; 뮮; ) HANGUL SYLLABLE MYULM +BBAF;BBAF;1106 1172 11B2;BBAF;1106 1172 11B2; # (뮯; 뮯; 뮯; 뮯; 뮯; ) HANGUL SYLLABLE MYULB +BBB0;BBB0;1106 1172 11B3;BBB0;1106 1172 11B3; # (뮰; 뮰; 뮰; 뮰; 뮰; ) HANGUL SYLLABLE MYULS +BBB1;BBB1;1106 1172 11B4;BBB1;1106 1172 11B4; # (뮱; 뮱; 뮱; 뮱; 뮱; ) HANGUL SYLLABLE MYULT +BBB2;BBB2;1106 1172 11B5;BBB2;1106 1172 11B5; # (뮲; 뮲; 뮲; 뮲; 뮲; ) HANGUL SYLLABLE MYULP +BBB3;BBB3;1106 1172 11B6;BBB3;1106 1172 11B6; # (뮳; 뮳; 뮳; 뮳; 뮳; ) HANGUL SYLLABLE MYULH +BBB4;BBB4;1106 1172 11B7;BBB4;1106 1172 11B7; # (뮴; 뮴; 뮴; 뮴; 뮴; ) HANGUL SYLLABLE MYUM +BBB5;BBB5;1106 1172 11B8;BBB5;1106 1172 11B8; # (뮵; 뮵; 뮵; 뮵; 뮵; ) HANGUL SYLLABLE MYUB +BBB6;BBB6;1106 1172 11B9;BBB6;1106 1172 11B9; # (뮶; 뮶; 뮶; 뮶; 뮶; ) HANGUL SYLLABLE MYUBS +BBB7;BBB7;1106 1172 11BA;BBB7;1106 1172 11BA; # (뮷; 뮷; 뮷; 뮷; 뮷; ) HANGUL SYLLABLE MYUS +BBB8;BBB8;1106 1172 11BB;BBB8;1106 1172 11BB; # (뮸; 뮸; 뮸; 뮸; 뮸; ) HANGUL SYLLABLE MYUSS +BBB9;BBB9;1106 1172 11BC;BBB9;1106 1172 11BC; # (뮹; 뮹; 뮹; 뮹; 뮹; ) HANGUL SYLLABLE MYUNG +BBBA;BBBA;1106 1172 11BD;BBBA;1106 1172 11BD; # (뮺; 뮺; 뮺; 뮺; 뮺; ) HANGUL SYLLABLE MYUJ +BBBB;BBBB;1106 1172 11BE;BBBB;1106 1172 11BE; # (뮻; 뮻; 뮻; 뮻; 뮻; ) HANGUL SYLLABLE MYUC +BBBC;BBBC;1106 1172 11BF;BBBC;1106 1172 11BF; # (뮼; 뮼; 뮼; 뮼; 뮼; ) HANGUL SYLLABLE MYUK +BBBD;BBBD;1106 1172 11C0;BBBD;1106 1172 11C0; # (뮽; 뮽; 뮽; 뮽; 뮽; ) HANGUL SYLLABLE MYUT +BBBE;BBBE;1106 1172 11C1;BBBE;1106 1172 11C1; # (뮾; 뮾; 뮾; 뮾; 뮾; ) HANGUL SYLLABLE MYUP +BBBF;BBBF;1106 1172 11C2;BBBF;1106 1172 11C2; # (뮿; 뮿; 뮿; 뮿; 뮿; ) HANGUL SYLLABLE MYUH +BBC0;BBC0;1106 1173;BBC0;1106 1173; # (므; 므; 므; 므; 므; ) HANGUL SYLLABLE MEU +BBC1;BBC1;1106 1173 11A8;BBC1;1106 1173 11A8; # (믁; 믁; 믁; 믁; 믁; ) HANGUL SYLLABLE MEUG +BBC2;BBC2;1106 1173 11A9;BBC2;1106 1173 11A9; # (믂; 믂; 믂; 믂; 믂; ) HANGUL SYLLABLE MEUGG +BBC3;BBC3;1106 1173 11AA;BBC3;1106 1173 11AA; # (믃; 믃; 믃; 믃; 믃; ) HANGUL SYLLABLE MEUGS +BBC4;BBC4;1106 1173 11AB;BBC4;1106 1173 11AB; # (믄; 믄; 믄; 믄; 믄; ) HANGUL SYLLABLE MEUN +BBC5;BBC5;1106 1173 11AC;BBC5;1106 1173 11AC; # (믅; 믅; 믅; 믅; 믅; ) HANGUL SYLLABLE MEUNJ +BBC6;BBC6;1106 1173 11AD;BBC6;1106 1173 11AD; # (믆; 믆; 믆; 믆; 믆; ) HANGUL SYLLABLE MEUNH +BBC7;BBC7;1106 1173 11AE;BBC7;1106 1173 11AE; # (믇; 믇; 믇; 믇; 믇; ) HANGUL SYLLABLE MEUD +BBC8;BBC8;1106 1173 11AF;BBC8;1106 1173 11AF; # (믈; 믈; 믈; 믈; 믈; ) HANGUL SYLLABLE MEUL +BBC9;BBC9;1106 1173 11B0;BBC9;1106 1173 11B0; # (믉; 믉; 믉; 믉; 믉; ) HANGUL SYLLABLE MEULG +BBCA;BBCA;1106 1173 11B1;BBCA;1106 1173 11B1; # (믊; 믊; 믊; 믊; 믊; ) HANGUL SYLLABLE MEULM +BBCB;BBCB;1106 1173 11B2;BBCB;1106 1173 11B2; # (믋; 믋; 믋; 믋; 믋; ) HANGUL SYLLABLE MEULB +BBCC;BBCC;1106 1173 11B3;BBCC;1106 1173 11B3; # (믌; 믌; 믌; 믌; 믌; ) HANGUL SYLLABLE MEULS +BBCD;BBCD;1106 1173 11B4;BBCD;1106 1173 11B4; # (믍; 믍; 믍; 믍; 믍; ) HANGUL SYLLABLE MEULT +BBCE;BBCE;1106 1173 11B5;BBCE;1106 1173 11B5; # (믎; 믎; 믎; 믎; 믎; ) HANGUL SYLLABLE MEULP +BBCF;BBCF;1106 1173 11B6;BBCF;1106 1173 11B6; # (믏; 믏; 믏; 믏; 믏; ) HANGUL SYLLABLE MEULH +BBD0;BBD0;1106 1173 11B7;BBD0;1106 1173 11B7; # (믐; 믐; 믐; 믐; 믐; ) HANGUL SYLLABLE MEUM +BBD1;BBD1;1106 1173 11B8;BBD1;1106 1173 11B8; # (믑; 믑; 믑; 믑; 믑; ) HANGUL SYLLABLE MEUB +BBD2;BBD2;1106 1173 11B9;BBD2;1106 1173 11B9; # (믒; 믒; 믒; 믒; 믒; ) HANGUL SYLLABLE MEUBS +BBD3;BBD3;1106 1173 11BA;BBD3;1106 1173 11BA; # (믓; 믓; 믓; 믓; 믓; ) HANGUL SYLLABLE MEUS +BBD4;BBD4;1106 1173 11BB;BBD4;1106 1173 11BB; # (믔; 믔; 믔; 믔; 믔; ) HANGUL SYLLABLE MEUSS +BBD5;BBD5;1106 1173 11BC;BBD5;1106 1173 11BC; # (믕; 믕; 믕; 믕; 믕; ) HANGUL SYLLABLE MEUNG +BBD6;BBD6;1106 1173 11BD;BBD6;1106 1173 11BD; # (믖; 믖; 믖; 믖; 믖; ) HANGUL SYLLABLE MEUJ +BBD7;BBD7;1106 1173 11BE;BBD7;1106 1173 11BE; # (믗; 믗; 믗; 믗; 믗; ) HANGUL SYLLABLE MEUC +BBD8;BBD8;1106 1173 11BF;BBD8;1106 1173 11BF; # (믘; 믘; 믘; 믘; 믘; ) HANGUL SYLLABLE MEUK +BBD9;BBD9;1106 1173 11C0;BBD9;1106 1173 11C0; # (믙; 믙; 믙; 믙; 믙; ) HANGUL SYLLABLE MEUT +BBDA;BBDA;1106 1173 11C1;BBDA;1106 1173 11C1; # (믚; 믚; 믚; 믚; 믚; ) HANGUL SYLLABLE MEUP +BBDB;BBDB;1106 1173 11C2;BBDB;1106 1173 11C2; # (믛; 믛; 믛; 믛; 믛; ) HANGUL SYLLABLE MEUH +BBDC;BBDC;1106 1174;BBDC;1106 1174; # (믜; 믜; 믜; 믜; 믜; ) HANGUL SYLLABLE MYI +BBDD;BBDD;1106 1174 11A8;BBDD;1106 1174 11A8; # (믝; 믝; 믝; 믝; 믝; ) HANGUL SYLLABLE MYIG +BBDE;BBDE;1106 1174 11A9;BBDE;1106 1174 11A9; # (믞; 믞; 믞; 믞; 믞; ) HANGUL SYLLABLE MYIGG +BBDF;BBDF;1106 1174 11AA;BBDF;1106 1174 11AA; # (믟; 믟; 믟; 믟; 믟; ) HANGUL SYLLABLE MYIGS +BBE0;BBE0;1106 1174 11AB;BBE0;1106 1174 11AB; # (믠; 믠; 믠; 믠; 믠; ) HANGUL SYLLABLE MYIN +BBE1;BBE1;1106 1174 11AC;BBE1;1106 1174 11AC; # (믡; 믡; 믡; 믡; 믡; ) HANGUL SYLLABLE MYINJ +BBE2;BBE2;1106 1174 11AD;BBE2;1106 1174 11AD; # (믢; 믢; 믢; 믢; 믢; ) HANGUL SYLLABLE MYINH +BBE3;BBE3;1106 1174 11AE;BBE3;1106 1174 11AE; # (믣; 믣; 믣; 믣; 믣; ) HANGUL SYLLABLE MYID +BBE4;BBE4;1106 1174 11AF;BBE4;1106 1174 11AF; # (믤; 믤; 믤; 믤; 믤; ) HANGUL SYLLABLE MYIL +BBE5;BBE5;1106 1174 11B0;BBE5;1106 1174 11B0; # (믥; 믥; 믥; 믥; 믥; ) HANGUL SYLLABLE MYILG +BBE6;BBE6;1106 1174 11B1;BBE6;1106 1174 11B1; # (믦; 믦; 믦; 믦; 믦; ) HANGUL SYLLABLE MYILM +BBE7;BBE7;1106 1174 11B2;BBE7;1106 1174 11B2; # (믧; 믧; 믧; 믧; 믧; ) HANGUL SYLLABLE MYILB +BBE8;BBE8;1106 1174 11B3;BBE8;1106 1174 11B3; # (믨; 믨; 믨; 믨; 믨; ) HANGUL SYLLABLE MYILS +BBE9;BBE9;1106 1174 11B4;BBE9;1106 1174 11B4; # (믩; 믩; 믩; 믩; 믩; ) HANGUL SYLLABLE MYILT +BBEA;BBEA;1106 1174 11B5;BBEA;1106 1174 11B5; # (믪; 믪; 믪; 믪; 믪; ) HANGUL SYLLABLE MYILP +BBEB;BBEB;1106 1174 11B6;BBEB;1106 1174 11B6; # (믫; 믫; 믫; 믫; 믫; ) HANGUL SYLLABLE MYILH +BBEC;BBEC;1106 1174 11B7;BBEC;1106 1174 11B7; # (믬; 믬; 믬; 믬; 믬; ) HANGUL SYLLABLE MYIM +BBED;BBED;1106 1174 11B8;BBED;1106 1174 11B8; # (믭; 믭; 믭; 믭; 믭; ) HANGUL SYLLABLE MYIB +BBEE;BBEE;1106 1174 11B9;BBEE;1106 1174 11B9; # (믮; 믮; 믮; 믮; 믮; ) HANGUL SYLLABLE MYIBS +BBEF;BBEF;1106 1174 11BA;BBEF;1106 1174 11BA; # (믯; 믯; 믯; 믯; 믯; ) HANGUL SYLLABLE MYIS +BBF0;BBF0;1106 1174 11BB;BBF0;1106 1174 11BB; # (믰; 믰; 믰; 믰; 믰; ) HANGUL SYLLABLE MYISS +BBF1;BBF1;1106 1174 11BC;BBF1;1106 1174 11BC; # (믱; 믱; 믱; 믱; 믱; ) HANGUL SYLLABLE MYING +BBF2;BBF2;1106 1174 11BD;BBF2;1106 1174 11BD; # (믲; 믲; 믲; 믲; 믲; ) HANGUL SYLLABLE MYIJ +BBF3;BBF3;1106 1174 11BE;BBF3;1106 1174 11BE; # (믳; 믳; 믳; 믳; 믳; ) HANGUL SYLLABLE MYIC +BBF4;BBF4;1106 1174 11BF;BBF4;1106 1174 11BF; # (믴; 믴; 믴; 믴; 믴; ) HANGUL SYLLABLE MYIK +BBF5;BBF5;1106 1174 11C0;BBF5;1106 1174 11C0; # (믵; 믵; 믵; 믵; 믵; ) HANGUL SYLLABLE MYIT +BBF6;BBF6;1106 1174 11C1;BBF6;1106 1174 11C1; # (믶; 믶; 믶; 믶; 믶; ) HANGUL SYLLABLE MYIP +BBF7;BBF7;1106 1174 11C2;BBF7;1106 1174 11C2; # (믷; 믷; 믷; 믷; 믷; ) HANGUL SYLLABLE MYIH +BBF8;BBF8;1106 1175;BBF8;1106 1175; # (미; 미; 미; 미; 미; ) HANGUL SYLLABLE MI +BBF9;BBF9;1106 1175 11A8;BBF9;1106 1175 11A8; # (믹; 믹; 믹; 믹; 믹; ) HANGUL SYLLABLE MIG +BBFA;BBFA;1106 1175 11A9;BBFA;1106 1175 11A9; # (믺; 믺; 믺; 믺; 믺; ) HANGUL SYLLABLE MIGG +BBFB;BBFB;1106 1175 11AA;BBFB;1106 1175 11AA; # (믻; 믻; 믻; 믻; 믻; ) HANGUL SYLLABLE MIGS +BBFC;BBFC;1106 1175 11AB;BBFC;1106 1175 11AB; # (민; 민; 민; 민; 민; ) HANGUL SYLLABLE MIN +BBFD;BBFD;1106 1175 11AC;BBFD;1106 1175 11AC; # (믽; 믽; 믽; 믽; 믽; ) HANGUL SYLLABLE MINJ +BBFE;BBFE;1106 1175 11AD;BBFE;1106 1175 11AD; # (믾; 믾; 믾; 믾; 믾; ) HANGUL SYLLABLE MINH +BBFF;BBFF;1106 1175 11AE;BBFF;1106 1175 11AE; # (믿; 믿; 믿; 믿; 믿; ) HANGUL SYLLABLE MID +BC00;BC00;1106 1175 11AF;BC00;1106 1175 11AF; # (밀; 밀; 밀; 밀; 밀; ) HANGUL SYLLABLE MIL +BC01;BC01;1106 1175 11B0;BC01;1106 1175 11B0; # (밁; 밁; 밁; 밁; 밁; ) HANGUL SYLLABLE MILG +BC02;BC02;1106 1175 11B1;BC02;1106 1175 11B1; # (밂; 밂; 밂; 밂; 밂; ) HANGUL SYLLABLE MILM +BC03;BC03;1106 1175 11B2;BC03;1106 1175 11B2; # (밃; 밃; 밃; 밃; 밃; ) HANGUL SYLLABLE MILB +BC04;BC04;1106 1175 11B3;BC04;1106 1175 11B3; # (밄; 밄; 밄; 밄; 밄; ) HANGUL SYLLABLE MILS +BC05;BC05;1106 1175 11B4;BC05;1106 1175 11B4; # (밅; 밅; 밅; 밅; 밅; ) HANGUL SYLLABLE MILT +BC06;BC06;1106 1175 11B5;BC06;1106 1175 11B5; # (밆; 밆; 밆; 밆; 밆; ) HANGUL SYLLABLE MILP +BC07;BC07;1106 1175 11B6;BC07;1106 1175 11B6; # (밇; 밇; 밇; 밇; 밇; ) HANGUL SYLLABLE MILH +BC08;BC08;1106 1175 11B7;BC08;1106 1175 11B7; # (밈; 밈; 밈; 밈; 밈; ) HANGUL SYLLABLE MIM +BC09;BC09;1106 1175 11B8;BC09;1106 1175 11B8; # (밉; 밉; 밉; 밉; 밉; ) HANGUL SYLLABLE MIB +BC0A;BC0A;1106 1175 11B9;BC0A;1106 1175 11B9; # (밊; 밊; 밊; 밊; 밊; ) HANGUL SYLLABLE MIBS +BC0B;BC0B;1106 1175 11BA;BC0B;1106 1175 11BA; # (밋; 밋; 밋; 밋; 밋; ) HANGUL SYLLABLE MIS +BC0C;BC0C;1106 1175 11BB;BC0C;1106 1175 11BB; # (밌; 밌; 밌; 밌; 밌; ) HANGUL SYLLABLE MISS +BC0D;BC0D;1106 1175 11BC;BC0D;1106 1175 11BC; # (밍; 밍; 밍; 밍; 밍; ) HANGUL SYLLABLE MING +BC0E;BC0E;1106 1175 11BD;BC0E;1106 1175 11BD; # (밎; 밎; 밎; 밎; 밎; ) HANGUL SYLLABLE MIJ +BC0F;BC0F;1106 1175 11BE;BC0F;1106 1175 11BE; # (및; 및; 및; 및; 및; ) HANGUL SYLLABLE MIC +BC10;BC10;1106 1175 11BF;BC10;1106 1175 11BF; # (밐; 밐; 밐; 밐; 밐; ) HANGUL SYLLABLE MIK +BC11;BC11;1106 1175 11C0;BC11;1106 1175 11C0; # (밑; 밑; 밑; 밑; 밑; ) HANGUL SYLLABLE MIT +BC12;BC12;1106 1175 11C1;BC12;1106 1175 11C1; # (밒; 밒; 밒; 밒; 밒; ) HANGUL SYLLABLE MIP +BC13;BC13;1106 1175 11C2;BC13;1106 1175 11C2; # (밓; 밓; 밓; 밓; 밓; ) HANGUL SYLLABLE MIH +BC14;BC14;1107 1161;BC14;1107 1161; # (바; 바; 바; 바; 바; ) HANGUL SYLLABLE BA +BC15;BC15;1107 1161 11A8;BC15;1107 1161 11A8; # (박; 박; 박; 박; 박; ) HANGUL SYLLABLE BAG +BC16;BC16;1107 1161 11A9;BC16;1107 1161 11A9; # (밖; 밖; 밖; 밖; 밖; ) HANGUL SYLLABLE BAGG +BC17;BC17;1107 1161 11AA;BC17;1107 1161 11AA; # (밗; 밗; 밗; 밗; 밗; ) HANGUL SYLLABLE BAGS +BC18;BC18;1107 1161 11AB;BC18;1107 1161 11AB; # (반; 반; 반; 반; 반; ) HANGUL SYLLABLE BAN +BC19;BC19;1107 1161 11AC;BC19;1107 1161 11AC; # (밙; 밙; 밙; 밙; 밙; ) HANGUL SYLLABLE BANJ +BC1A;BC1A;1107 1161 11AD;BC1A;1107 1161 11AD; # (밚; 밚; 밚; 밚; 밚; ) HANGUL SYLLABLE BANH +BC1B;BC1B;1107 1161 11AE;BC1B;1107 1161 11AE; # (받; 받; 받; 받; 받; ) HANGUL SYLLABLE BAD +BC1C;BC1C;1107 1161 11AF;BC1C;1107 1161 11AF; # (발; 발; 발; 발; 발; ) HANGUL SYLLABLE BAL +BC1D;BC1D;1107 1161 11B0;BC1D;1107 1161 11B0; # (밝; 밝; 밝; 밝; 밝; ) HANGUL SYLLABLE BALG +BC1E;BC1E;1107 1161 11B1;BC1E;1107 1161 11B1; # (밞; 밞; 밞; 밞; 밞; ) HANGUL SYLLABLE BALM +BC1F;BC1F;1107 1161 11B2;BC1F;1107 1161 11B2; # (밟; 밟; 밟; 밟; 밟; ) HANGUL SYLLABLE BALB +BC20;BC20;1107 1161 11B3;BC20;1107 1161 11B3; # (밠; 밠; 밠; 밠; 밠; ) HANGUL SYLLABLE BALS +BC21;BC21;1107 1161 11B4;BC21;1107 1161 11B4; # (밡; 밡; 밡; 밡; 밡; ) HANGUL SYLLABLE BALT +BC22;BC22;1107 1161 11B5;BC22;1107 1161 11B5; # (밢; 밢; 밢; 밢; 밢; ) HANGUL SYLLABLE BALP +BC23;BC23;1107 1161 11B6;BC23;1107 1161 11B6; # (밣; 밣; 밣; 밣; 밣; ) HANGUL SYLLABLE BALH +BC24;BC24;1107 1161 11B7;BC24;1107 1161 11B7; # (밤; 밤; 밤; 밤; 밤; ) HANGUL SYLLABLE BAM +BC25;BC25;1107 1161 11B8;BC25;1107 1161 11B8; # (밥; 밥; 밥; 밥; 밥; ) HANGUL SYLLABLE BAB +BC26;BC26;1107 1161 11B9;BC26;1107 1161 11B9; # (밦; 밦; 밦; 밦; 밦; ) HANGUL SYLLABLE BABS +BC27;BC27;1107 1161 11BA;BC27;1107 1161 11BA; # (밧; 밧; 밧; 밧; 밧; ) HANGUL SYLLABLE BAS +BC28;BC28;1107 1161 11BB;BC28;1107 1161 11BB; # (밨; 밨; 밨; 밨; 밨; ) HANGUL SYLLABLE BASS +BC29;BC29;1107 1161 11BC;BC29;1107 1161 11BC; # (방; 방; 방; 방; 방; ) HANGUL SYLLABLE BANG +BC2A;BC2A;1107 1161 11BD;BC2A;1107 1161 11BD; # (밪; 밪; 밪; 밪; 밪; ) HANGUL SYLLABLE BAJ +BC2B;BC2B;1107 1161 11BE;BC2B;1107 1161 11BE; # (밫; 밫; 밫; 밫; 밫; ) HANGUL SYLLABLE BAC +BC2C;BC2C;1107 1161 11BF;BC2C;1107 1161 11BF; # (밬; 밬; 밬; 밬; 밬; ) HANGUL SYLLABLE BAK +BC2D;BC2D;1107 1161 11C0;BC2D;1107 1161 11C0; # (밭; 밭; 밭; 밭; 밭; ) HANGUL SYLLABLE BAT +BC2E;BC2E;1107 1161 11C1;BC2E;1107 1161 11C1; # (밮; 밮; 밮; 밮; 밮; ) HANGUL SYLLABLE BAP +BC2F;BC2F;1107 1161 11C2;BC2F;1107 1161 11C2; # (밯; 밯; 밯; 밯; 밯; ) HANGUL SYLLABLE BAH +BC30;BC30;1107 1162;BC30;1107 1162; # (배; 배; 배; 배; 배; ) HANGUL SYLLABLE BAE +BC31;BC31;1107 1162 11A8;BC31;1107 1162 11A8; # (백; 백; 백; 백; 백; ) HANGUL SYLLABLE BAEG +BC32;BC32;1107 1162 11A9;BC32;1107 1162 11A9; # (밲; 밲; 밲; 밲; 밲; ) HANGUL SYLLABLE BAEGG +BC33;BC33;1107 1162 11AA;BC33;1107 1162 11AA; # (밳; 밳; 밳; 밳; 밳; ) HANGUL SYLLABLE BAEGS +BC34;BC34;1107 1162 11AB;BC34;1107 1162 11AB; # (밴; 밴; 밴; 밴; 밴; ) HANGUL SYLLABLE BAEN +BC35;BC35;1107 1162 11AC;BC35;1107 1162 11AC; # (밵; 밵; 밵; 밵; 밵; ) HANGUL SYLLABLE BAENJ +BC36;BC36;1107 1162 11AD;BC36;1107 1162 11AD; # (밶; 밶; 밶; 밶; 밶; ) HANGUL SYLLABLE BAENH +BC37;BC37;1107 1162 11AE;BC37;1107 1162 11AE; # (밷; 밷; 밷; 밷; 밷; ) HANGUL SYLLABLE BAED +BC38;BC38;1107 1162 11AF;BC38;1107 1162 11AF; # (밸; 밸; 밸; 밸; 밸; ) HANGUL SYLLABLE BAEL +BC39;BC39;1107 1162 11B0;BC39;1107 1162 11B0; # (밹; 밹; 밹; 밹; 밹; ) HANGUL SYLLABLE BAELG +BC3A;BC3A;1107 1162 11B1;BC3A;1107 1162 11B1; # (밺; 밺; 밺; 밺; 밺; ) HANGUL SYLLABLE BAELM +BC3B;BC3B;1107 1162 11B2;BC3B;1107 1162 11B2; # (밻; 밻; 밻; 밻; 밻; ) HANGUL SYLLABLE BAELB +BC3C;BC3C;1107 1162 11B3;BC3C;1107 1162 11B3; # (밼; 밼; 밼; 밼; 밼; ) HANGUL SYLLABLE BAELS +BC3D;BC3D;1107 1162 11B4;BC3D;1107 1162 11B4; # (밽; 밽; 밽; 밽; 밽; ) HANGUL SYLLABLE BAELT +BC3E;BC3E;1107 1162 11B5;BC3E;1107 1162 11B5; # (밾; 밾; 밾; 밾; 밾; ) HANGUL SYLLABLE BAELP +BC3F;BC3F;1107 1162 11B6;BC3F;1107 1162 11B6; # (밿; 밿; 밿; 밿; 밿; ) HANGUL SYLLABLE BAELH +BC40;BC40;1107 1162 11B7;BC40;1107 1162 11B7; # (뱀; 뱀; 뱀; 뱀; 뱀; ) HANGUL SYLLABLE BAEM +BC41;BC41;1107 1162 11B8;BC41;1107 1162 11B8; # (뱁; 뱁; 뱁; 뱁; 뱁; ) HANGUL SYLLABLE BAEB +BC42;BC42;1107 1162 11B9;BC42;1107 1162 11B9; # (뱂; 뱂; 뱂; 뱂; 뱂; ) HANGUL SYLLABLE BAEBS +BC43;BC43;1107 1162 11BA;BC43;1107 1162 11BA; # (뱃; 뱃; 뱃; 뱃; 뱃; ) HANGUL SYLLABLE BAES +BC44;BC44;1107 1162 11BB;BC44;1107 1162 11BB; # (뱄; 뱄; 뱄; 뱄; 뱄; ) HANGUL SYLLABLE BAESS +BC45;BC45;1107 1162 11BC;BC45;1107 1162 11BC; # (뱅; 뱅; 뱅; 뱅; 뱅; ) HANGUL SYLLABLE BAENG +BC46;BC46;1107 1162 11BD;BC46;1107 1162 11BD; # (뱆; 뱆; 뱆; 뱆; 뱆; ) HANGUL SYLLABLE BAEJ +BC47;BC47;1107 1162 11BE;BC47;1107 1162 11BE; # (뱇; 뱇; 뱇; 뱇; 뱇; ) HANGUL SYLLABLE BAEC +BC48;BC48;1107 1162 11BF;BC48;1107 1162 11BF; # (뱈; 뱈; 뱈; 뱈; 뱈; ) HANGUL SYLLABLE BAEK +BC49;BC49;1107 1162 11C0;BC49;1107 1162 11C0; # (뱉; 뱉; 뱉; 뱉; 뱉; ) HANGUL SYLLABLE BAET +BC4A;BC4A;1107 1162 11C1;BC4A;1107 1162 11C1; # (뱊; 뱊; 뱊; 뱊; 뱊; ) HANGUL SYLLABLE BAEP +BC4B;BC4B;1107 1162 11C2;BC4B;1107 1162 11C2; # (뱋; 뱋; 뱋; 뱋; 뱋; ) HANGUL SYLLABLE BAEH +BC4C;BC4C;1107 1163;BC4C;1107 1163; # (뱌; 뱌; 뱌; 뱌; 뱌; ) HANGUL SYLLABLE BYA +BC4D;BC4D;1107 1163 11A8;BC4D;1107 1163 11A8; # (뱍; 뱍; 뱍; 뱍; 뱍; ) HANGUL SYLLABLE BYAG +BC4E;BC4E;1107 1163 11A9;BC4E;1107 1163 11A9; # (뱎; 뱎; 뱎; 뱎; 뱎; ) HANGUL SYLLABLE BYAGG +BC4F;BC4F;1107 1163 11AA;BC4F;1107 1163 11AA; # (뱏; 뱏; 뱏; 뱏; 뱏; ) HANGUL SYLLABLE BYAGS +BC50;BC50;1107 1163 11AB;BC50;1107 1163 11AB; # (뱐; 뱐; 뱐; 뱐; 뱐; ) HANGUL SYLLABLE BYAN +BC51;BC51;1107 1163 11AC;BC51;1107 1163 11AC; # (뱑; 뱑; 뱑; 뱑; 뱑; ) HANGUL SYLLABLE BYANJ +BC52;BC52;1107 1163 11AD;BC52;1107 1163 11AD; # (뱒; 뱒; 뱒; 뱒; 뱒; ) HANGUL SYLLABLE BYANH +BC53;BC53;1107 1163 11AE;BC53;1107 1163 11AE; # (뱓; 뱓; 뱓; 뱓; 뱓; ) HANGUL SYLLABLE BYAD +BC54;BC54;1107 1163 11AF;BC54;1107 1163 11AF; # (뱔; 뱔; 뱔; 뱔; 뱔; ) HANGUL SYLLABLE BYAL +BC55;BC55;1107 1163 11B0;BC55;1107 1163 11B0; # (뱕; 뱕; 뱕; 뱕; 뱕; ) HANGUL SYLLABLE BYALG +BC56;BC56;1107 1163 11B1;BC56;1107 1163 11B1; # (뱖; 뱖; 뱖; 뱖; 뱖; ) HANGUL SYLLABLE BYALM +BC57;BC57;1107 1163 11B2;BC57;1107 1163 11B2; # (뱗; 뱗; 뱗; 뱗; 뱗; ) HANGUL SYLLABLE BYALB +BC58;BC58;1107 1163 11B3;BC58;1107 1163 11B3; # (뱘; 뱘; 뱘; 뱘; 뱘; ) HANGUL SYLLABLE BYALS +BC59;BC59;1107 1163 11B4;BC59;1107 1163 11B4; # (뱙; 뱙; 뱙; 뱙; 뱙; ) HANGUL SYLLABLE BYALT +BC5A;BC5A;1107 1163 11B5;BC5A;1107 1163 11B5; # (뱚; 뱚; 뱚; 뱚; 뱚; ) HANGUL SYLLABLE BYALP +BC5B;BC5B;1107 1163 11B6;BC5B;1107 1163 11B6; # (뱛; 뱛; 뱛; 뱛; 뱛; ) HANGUL SYLLABLE BYALH +BC5C;BC5C;1107 1163 11B7;BC5C;1107 1163 11B7; # (뱜; 뱜; 뱜; 뱜; 뱜; ) HANGUL SYLLABLE BYAM +BC5D;BC5D;1107 1163 11B8;BC5D;1107 1163 11B8; # (뱝; 뱝; 뱝; 뱝; 뱝; ) HANGUL SYLLABLE BYAB +BC5E;BC5E;1107 1163 11B9;BC5E;1107 1163 11B9; # (뱞; 뱞; 뱞; 뱞; 뱞; ) HANGUL SYLLABLE BYABS +BC5F;BC5F;1107 1163 11BA;BC5F;1107 1163 11BA; # (뱟; 뱟; 뱟; 뱟; 뱟; ) HANGUL SYLLABLE BYAS +BC60;BC60;1107 1163 11BB;BC60;1107 1163 11BB; # (뱠; 뱠; 뱠; 뱠; 뱠; ) HANGUL SYLLABLE BYASS +BC61;BC61;1107 1163 11BC;BC61;1107 1163 11BC; # (뱡; 뱡; 뱡; 뱡; 뱡; ) HANGUL SYLLABLE BYANG +BC62;BC62;1107 1163 11BD;BC62;1107 1163 11BD; # (뱢; 뱢; 뱢; 뱢; 뱢; ) HANGUL SYLLABLE BYAJ +BC63;BC63;1107 1163 11BE;BC63;1107 1163 11BE; # (뱣; 뱣; 뱣; 뱣; 뱣; ) HANGUL SYLLABLE BYAC +BC64;BC64;1107 1163 11BF;BC64;1107 1163 11BF; # (뱤; 뱤; 뱤; 뱤; 뱤; ) HANGUL SYLLABLE BYAK +BC65;BC65;1107 1163 11C0;BC65;1107 1163 11C0; # (뱥; 뱥; 뱥; 뱥; 뱥; ) HANGUL SYLLABLE BYAT +BC66;BC66;1107 1163 11C1;BC66;1107 1163 11C1; # (뱦; 뱦; 뱦; 뱦; 뱦; ) HANGUL SYLLABLE BYAP +BC67;BC67;1107 1163 11C2;BC67;1107 1163 11C2; # (뱧; 뱧; 뱧; 뱧; 뱧; ) HANGUL SYLLABLE BYAH +BC68;BC68;1107 1164;BC68;1107 1164; # (뱨; 뱨; 뱨; 뱨; 뱨; ) HANGUL SYLLABLE BYAE +BC69;BC69;1107 1164 11A8;BC69;1107 1164 11A8; # (뱩; 뱩; 뱩; 뱩; 뱩; ) HANGUL SYLLABLE BYAEG +BC6A;BC6A;1107 1164 11A9;BC6A;1107 1164 11A9; # (뱪; 뱪; 뱪; 뱪; 뱪; ) HANGUL SYLLABLE BYAEGG +BC6B;BC6B;1107 1164 11AA;BC6B;1107 1164 11AA; # (뱫; 뱫; 뱫; 뱫; 뱫; ) HANGUL SYLLABLE BYAEGS +BC6C;BC6C;1107 1164 11AB;BC6C;1107 1164 11AB; # (뱬; 뱬; 뱬; 뱬; 뱬; ) HANGUL SYLLABLE BYAEN +BC6D;BC6D;1107 1164 11AC;BC6D;1107 1164 11AC; # (뱭; 뱭; 뱭; 뱭; 뱭; ) HANGUL SYLLABLE BYAENJ +BC6E;BC6E;1107 1164 11AD;BC6E;1107 1164 11AD; # (뱮; 뱮; 뱮; 뱮; 뱮; ) HANGUL SYLLABLE BYAENH +BC6F;BC6F;1107 1164 11AE;BC6F;1107 1164 11AE; # (뱯; 뱯; 뱯; 뱯; 뱯; ) HANGUL SYLLABLE BYAED +BC70;BC70;1107 1164 11AF;BC70;1107 1164 11AF; # (뱰; 뱰; 뱰; 뱰; 뱰; ) HANGUL SYLLABLE BYAEL +BC71;BC71;1107 1164 11B0;BC71;1107 1164 11B0; # (뱱; 뱱; 뱱; 뱱; 뱱; ) HANGUL SYLLABLE BYAELG +BC72;BC72;1107 1164 11B1;BC72;1107 1164 11B1; # (뱲; 뱲; 뱲; 뱲; 뱲; ) HANGUL SYLLABLE BYAELM +BC73;BC73;1107 1164 11B2;BC73;1107 1164 11B2; # (뱳; 뱳; 뱳; 뱳; 뱳; ) HANGUL SYLLABLE BYAELB +BC74;BC74;1107 1164 11B3;BC74;1107 1164 11B3; # (뱴; 뱴; 뱴; 뱴; 뱴; ) HANGUL SYLLABLE BYAELS +BC75;BC75;1107 1164 11B4;BC75;1107 1164 11B4; # (뱵; 뱵; 뱵; 뱵; 뱵; ) HANGUL SYLLABLE BYAELT +BC76;BC76;1107 1164 11B5;BC76;1107 1164 11B5; # (뱶; 뱶; 뱶; 뱶; 뱶; ) HANGUL SYLLABLE BYAELP +BC77;BC77;1107 1164 11B6;BC77;1107 1164 11B6; # (뱷; 뱷; 뱷; 뱷; 뱷; ) HANGUL SYLLABLE BYAELH +BC78;BC78;1107 1164 11B7;BC78;1107 1164 11B7; # (뱸; 뱸; 뱸; 뱸; 뱸; ) HANGUL SYLLABLE BYAEM +BC79;BC79;1107 1164 11B8;BC79;1107 1164 11B8; # (뱹; 뱹; 뱹; 뱹; 뱹; ) HANGUL SYLLABLE BYAEB +BC7A;BC7A;1107 1164 11B9;BC7A;1107 1164 11B9; # (뱺; 뱺; 뱺; 뱺; 뱺; ) HANGUL SYLLABLE BYAEBS +BC7B;BC7B;1107 1164 11BA;BC7B;1107 1164 11BA; # (뱻; 뱻; 뱻; 뱻; 뱻; ) HANGUL SYLLABLE BYAES +BC7C;BC7C;1107 1164 11BB;BC7C;1107 1164 11BB; # (뱼; 뱼; 뱼; 뱼; 뱼; ) HANGUL SYLLABLE BYAESS +BC7D;BC7D;1107 1164 11BC;BC7D;1107 1164 11BC; # (뱽; 뱽; 뱽; 뱽; 뱽; ) HANGUL SYLLABLE BYAENG +BC7E;BC7E;1107 1164 11BD;BC7E;1107 1164 11BD; # (뱾; 뱾; 뱾; 뱾; 뱾; ) HANGUL SYLLABLE BYAEJ +BC7F;BC7F;1107 1164 11BE;BC7F;1107 1164 11BE; # (뱿; 뱿; 뱿; 뱿; 뱿; ) HANGUL SYLLABLE BYAEC +BC80;BC80;1107 1164 11BF;BC80;1107 1164 11BF; # (벀; 벀; 벀; 벀; 벀; ) HANGUL SYLLABLE BYAEK +BC81;BC81;1107 1164 11C0;BC81;1107 1164 11C0; # (벁; 벁; 벁; 벁; 벁; ) HANGUL SYLLABLE BYAET +BC82;BC82;1107 1164 11C1;BC82;1107 1164 11C1; # (벂; 벂; 벂; 벂; 벂; ) HANGUL SYLLABLE BYAEP +BC83;BC83;1107 1164 11C2;BC83;1107 1164 11C2; # (벃; 벃; 벃; 벃; 벃; ) HANGUL SYLLABLE BYAEH +BC84;BC84;1107 1165;BC84;1107 1165; # (버; 버; 버; 버; 버; ) HANGUL SYLLABLE BEO +BC85;BC85;1107 1165 11A8;BC85;1107 1165 11A8; # (벅; 벅; 벅; 벅; 벅; ) HANGUL SYLLABLE BEOG +BC86;BC86;1107 1165 11A9;BC86;1107 1165 11A9; # (벆; 벆; 벆; 벆; 벆; ) HANGUL SYLLABLE BEOGG +BC87;BC87;1107 1165 11AA;BC87;1107 1165 11AA; # (벇; 벇; 벇; 벇; 벇; ) HANGUL SYLLABLE BEOGS +BC88;BC88;1107 1165 11AB;BC88;1107 1165 11AB; # (번; 번; 번; 번; 번; ) HANGUL SYLLABLE BEON +BC89;BC89;1107 1165 11AC;BC89;1107 1165 11AC; # (벉; 벉; 벉; 벉; 벉; ) HANGUL SYLLABLE BEONJ +BC8A;BC8A;1107 1165 11AD;BC8A;1107 1165 11AD; # (벊; 벊; 벊; 벊; 벊; ) HANGUL SYLLABLE BEONH +BC8B;BC8B;1107 1165 11AE;BC8B;1107 1165 11AE; # (벋; 벋; 벋; 벋; 벋; ) HANGUL SYLLABLE BEOD +BC8C;BC8C;1107 1165 11AF;BC8C;1107 1165 11AF; # (벌; 벌; 벌; 벌; 벌; ) HANGUL SYLLABLE BEOL +BC8D;BC8D;1107 1165 11B0;BC8D;1107 1165 11B0; # (벍; 벍; 벍; 벍; 벍; ) HANGUL SYLLABLE BEOLG +BC8E;BC8E;1107 1165 11B1;BC8E;1107 1165 11B1; # (벎; 벎; 벎; 벎; 벎; ) HANGUL SYLLABLE BEOLM +BC8F;BC8F;1107 1165 11B2;BC8F;1107 1165 11B2; # (벏; 벏; 벏; 벏; 벏; ) HANGUL SYLLABLE BEOLB +BC90;BC90;1107 1165 11B3;BC90;1107 1165 11B3; # (벐; 벐; 벐; 벐; 벐; ) HANGUL SYLLABLE BEOLS +BC91;BC91;1107 1165 11B4;BC91;1107 1165 11B4; # (벑; 벑; 벑; 벑; 벑; ) HANGUL SYLLABLE BEOLT +BC92;BC92;1107 1165 11B5;BC92;1107 1165 11B5; # (벒; 벒; 벒; 벒; 벒; ) HANGUL SYLLABLE BEOLP +BC93;BC93;1107 1165 11B6;BC93;1107 1165 11B6; # (벓; 벓; 벓; 벓; 벓; ) HANGUL SYLLABLE BEOLH +BC94;BC94;1107 1165 11B7;BC94;1107 1165 11B7; # (범; 범; 범; 범; 범; ) HANGUL SYLLABLE BEOM +BC95;BC95;1107 1165 11B8;BC95;1107 1165 11B8; # (법; 법; 법; 법; 법; ) HANGUL SYLLABLE BEOB +BC96;BC96;1107 1165 11B9;BC96;1107 1165 11B9; # (벖; 벖; 벖; 벖; 벖; ) HANGUL SYLLABLE BEOBS +BC97;BC97;1107 1165 11BA;BC97;1107 1165 11BA; # (벗; 벗; 벗; 벗; 벗; ) HANGUL SYLLABLE BEOS +BC98;BC98;1107 1165 11BB;BC98;1107 1165 11BB; # (벘; 벘; 벘; 벘; 벘; ) HANGUL SYLLABLE BEOSS +BC99;BC99;1107 1165 11BC;BC99;1107 1165 11BC; # (벙; 벙; 벙; 벙; 벙; ) HANGUL SYLLABLE BEONG +BC9A;BC9A;1107 1165 11BD;BC9A;1107 1165 11BD; # (벚; 벚; 벚; 벚; 벚; ) HANGUL SYLLABLE BEOJ +BC9B;BC9B;1107 1165 11BE;BC9B;1107 1165 11BE; # (벛; 벛; 벛; 벛; 벛; ) HANGUL SYLLABLE BEOC +BC9C;BC9C;1107 1165 11BF;BC9C;1107 1165 11BF; # (벜; 벜; 벜; 벜; 벜; ) HANGUL SYLLABLE BEOK +BC9D;BC9D;1107 1165 11C0;BC9D;1107 1165 11C0; # (벝; 벝; 벝; 벝; 벝; ) HANGUL SYLLABLE BEOT +BC9E;BC9E;1107 1165 11C1;BC9E;1107 1165 11C1; # (벞; 벞; 벞; 벞; 벞; ) HANGUL SYLLABLE BEOP +BC9F;BC9F;1107 1165 11C2;BC9F;1107 1165 11C2; # (벟; 벟; 벟; 벟; 벟; ) HANGUL SYLLABLE BEOH +BCA0;BCA0;1107 1166;BCA0;1107 1166; # (베; 베; 베; 베; 베; ) HANGUL SYLLABLE BE +BCA1;BCA1;1107 1166 11A8;BCA1;1107 1166 11A8; # (벡; 벡; 벡; 벡; 벡; ) HANGUL SYLLABLE BEG +BCA2;BCA2;1107 1166 11A9;BCA2;1107 1166 11A9; # (벢; 벢; 벢; 벢; 벢; ) HANGUL SYLLABLE BEGG +BCA3;BCA3;1107 1166 11AA;BCA3;1107 1166 11AA; # (벣; 벣; 벣; 벣; 벣; ) HANGUL SYLLABLE BEGS +BCA4;BCA4;1107 1166 11AB;BCA4;1107 1166 11AB; # (벤; 벤; 벤; 벤; 벤; ) HANGUL SYLLABLE BEN +BCA5;BCA5;1107 1166 11AC;BCA5;1107 1166 11AC; # (벥; 벥; 벥; 벥; 벥; ) HANGUL SYLLABLE BENJ +BCA6;BCA6;1107 1166 11AD;BCA6;1107 1166 11AD; # (벦; 벦; 벦; 벦; 벦; ) HANGUL SYLLABLE BENH +BCA7;BCA7;1107 1166 11AE;BCA7;1107 1166 11AE; # (벧; 벧; 벧; 벧; 벧; ) HANGUL SYLLABLE BED +BCA8;BCA8;1107 1166 11AF;BCA8;1107 1166 11AF; # (벨; 벨; 벨; 벨; 벨; ) HANGUL SYLLABLE BEL +BCA9;BCA9;1107 1166 11B0;BCA9;1107 1166 11B0; # (벩; 벩; 벩; 벩; 벩; ) HANGUL SYLLABLE BELG +BCAA;BCAA;1107 1166 11B1;BCAA;1107 1166 11B1; # (벪; 벪; 벪; 벪; 벪; ) HANGUL SYLLABLE BELM +BCAB;BCAB;1107 1166 11B2;BCAB;1107 1166 11B2; # (벫; 벫; 벫; 벫; 벫; ) HANGUL SYLLABLE BELB +BCAC;BCAC;1107 1166 11B3;BCAC;1107 1166 11B3; # (벬; 벬; 벬; 벬; 벬; ) HANGUL SYLLABLE BELS +BCAD;BCAD;1107 1166 11B4;BCAD;1107 1166 11B4; # (벭; 벭; 벭; 벭; 벭; ) HANGUL SYLLABLE BELT +BCAE;BCAE;1107 1166 11B5;BCAE;1107 1166 11B5; # (벮; 벮; 벮; 벮; 벮; ) HANGUL SYLLABLE BELP +BCAF;BCAF;1107 1166 11B6;BCAF;1107 1166 11B6; # (벯; 벯; 벯; 벯; 벯; ) HANGUL SYLLABLE BELH +BCB0;BCB0;1107 1166 11B7;BCB0;1107 1166 11B7; # (벰; 벰; 벰; 벰; 벰; ) HANGUL SYLLABLE BEM +BCB1;BCB1;1107 1166 11B8;BCB1;1107 1166 11B8; # (벱; 벱; 벱; 벱; 벱; ) HANGUL SYLLABLE BEB +BCB2;BCB2;1107 1166 11B9;BCB2;1107 1166 11B9; # (벲; 벲; 벲; 벲; 벲; ) HANGUL SYLLABLE BEBS +BCB3;BCB3;1107 1166 11BA;BCB3;1107 1166 11BA; # (벳; 벳; 벳; 벳; 벳; ) HANGUL SYLLABLE BES +BCB4;BCB4;1107 1166 11BB;BCB4;1107 1166 11BB; # (벴; 벴; 벴; 벴; 벴; ) HANGUL SYLLABLE BESS +BCB5;BCB5;1107 1166 11BC;BCB5;1107 1166 11BC; # (벵; 벵; 벵; 벵; 벵; ) HANGUL SYLLABLE BENG +BCB6;BCB6;1107 1166 11BD;BCB6;1107 1166 11BD; # (벶; 벶; 벶; 벶; 벶; ) HANGUL SYLLABLE BEJ +BCB7;BCB7;1107 1166 11BE;BCB7;1107 1166 11BE; # (벷; 벷; 벷; 벷; 벷; ) HANGUL SYLLABLE BEC +BCB8;BCB8;1107 1166 11BF;BCB8;1107 1166 11BF; # (벸; 벸; 벸; 벸; 벸; ) HANGUL SYLLABLE BEK +BCB9;BCB9;1107 1166 11C0;BCB9;1107 1166 11C0; # (벹; 벹; 벹; 벹; 벹; ) HANGUL SYLLABLE BET +BCBA;BCBA;1107 1166 11C1;BCBA;1107 1166 11C1; # (벺; 벺; 벺; 벺; 벺; ) HANGUL SYLLABLE BEP +BCBB;BCBB;1107 1166 11C2;BCBB;1107 1166 11C2; # (벻; 벻; 벻; 벻; 벻; ) HANGUL SYLLABLE BEH +BCBC;BCBC;1107 1167;BCBC;1107 1167; # (벼; 벼; 벼; 벼; 벼; ) HANGUL SYLLABLE BYEO +BCBD;BCBD;1107 1167 11A8;BCBD;1107 1167 11A8; # (벽; 벽; 벽; 벽; 벽; ) HANGUL SYLLABLE BYEOG +BCBE;BCBE;1107 1167 11A9;BCBE;1107 1167 11A9; # (벾; 벾; 벾; 벾; 벾; ) HANGUL SYLLABLE BYEOGG +BCBF;BCBF;1107 1167 11AA;BCBF;1107 1167 11AA; # (벿; 벿; 벿; 벿; 벿; ) HANGUL SYLLABLE BYEOGS +BCC0;BCC0;1107 1167 11AB;BCC0;1107 1167 11AB; # (변; 변; 변; 변; 변; ) HANGUL SYLLABLE BYEON +BCC1;BCC1;1107 1167 11AC;BCC1;1107 1167 11AC; # (볁; 볁; 볁; 볁; 볁; ) HANGUL SYLLABLE BYEONJ +BCC2;BCC2;1107 1167 11AD;BCC2;1107 1167 11AD; # (볂; 볂; 볂; 볂; 볂; ) HANGUL SYLLABLE BYEONH +BCC3;BCC3;1107 1167 11AE;BCC3;1107 1167 11AE; # (볃; 볃; 볃; 볃; 볃; ) HANGUL SYLLABLE BYEOD +BCC4;BCC4;1107 1167 11AF;BCC4;1107 1167 11AF; # (별; 별; 별; 별; 별; ) HANGUL SYLLABLE BYEOL +BCC5;BCC5;1107 1167 11B0;BCC5;1107 1167 11B0; # (볅; 볅; 볅; 볅; 볅; ) HANGUL SYLLABLE BYEOLG +BCC6;BCC6;1107 1167 11B1;BCC6;1107 1167 11B1; # (볆; 볆; 볆; 볆; 볆; ) HANGUL SYLLABLE BYEOLM +BCC7;BCC7;1107 1167 11B2;BCC7;1107 1167 11B2; # (볇; 볇; 볇; 볇; 볇; ) HANGUL SYLLABLE BYEOLB +BCC8;BCC8;1107 1167 11B3;BCC8;1107 1167 11B3; # (볈; 볈; 볈; 볈; 볈; ) HANGUL SYLLABLE BYEOLS +BCC9;BCC9;1107 1167 11B4;BCC9;1107 1167 11B4; # (볉; 볉; 볉; 볉; 볉; ) HANGUL SYLLABLE BYEOLT +BCCA;BCCA;1107 1167 11B5;BCCA;1107 1167 11B5; # (볊; 볊; 볊; 볊; 볊; ) HANGUL SYLLABLE BYEOLP +BCCB;BCCB;1107 1167 11B6;BCCB;1107 1167 11B6; # (볋; 볋; 볋; 볋; 볋; ) HANGUL SYLLABLE BYEOLH +BCCC;BCCC;1107 1167 11B7;BCCC;1107 1167 11B7; # (볌; 볌; 볌; 볌; 볌; ) HANGUL SYLLABLE BYEOM +BCCD;BCCD;1107 1167 11B8;BCCD;1107 1167 11B8; # (볍; 볍; 볍; 볍; 볍; ) HANGUL SYLLABLE BYEOB +BCCE;BCCE;1107 1167 11B9;BCCE;1107 1167 11B9; # (볎; 볎; 볎; 볎; 볎; ) HANGUL SYLLABLE BYEOBS +BCCF;BCCF;1107 1167 11BA;BCCF;1107 1167 11BA; # (볏; 볏; 볏; 볏; 볏; ) HANGUL SYLLABLE BYEOS +BCD0;BCD0;1107 1167 11BB;BCD0;1107 1167 11BB; # (볐; 볐; 볐; 볐; 볐; ) HANGUL SYLLABLE BYEOSS +BCD1;BCD1;1107 1167 11BC;BCD1;1107 1167 11BC; # (병; 병; 병; 병; 병; ) HANGUL SYLLABLE BYEONG +BCD2;BCD2;1107 1167 11BD;BCD2;1107 1167 11BD; # (볒; 볒; 볒; 볒; 볒; ) HANGUL SYLLABLE BYEOJ +BCD3;BCD3;1107 1167 11BE;BCD3;1107 1167 11BE; # (볓; 볓; 볓; 볓; 볓; ) HANGUL SYLLABLE BYEOC +BCD4;BCD4;1107 1167 11BF;BCD4;1107 1167 11BF; # (볔; 볔; 볔; 볔; 볔; ) HANGUL SYLLABLE BYEOK +BCD5;BCD5;1107 1167 11C0;BCD5;1107 1167 11C0; # (볕; 볕; 볕; 볕; 볕; ) HANGUL SYLLABLE BYEOT +BCD6;BCD6;1107 1167 11C1;BCD6;1107 1167 11C1; # (볖; 볖; 볖; 볖; 볖; ) HANGUL SYLLABLE BYEOP +BCD7;BCD7;1107 1167 11C2;BCD7;1107 1167 11C2; # (볗; 볗; 볗; 볗; 볗; ) HANGUL SYLLABLE BYEOH +BCD8;BCD8;1107 1168;BCD8;1107 1168; # (볘; 볘; 볘; 볘; 볘; ) HANGUL SYLLABLE BYE +BCD9;BCD9;1107 1168 11A8;BCD9;1107 1168 11A8; # (볙; 볙; 볙; 볙; 볙; ) HANGUL SYLLABLE BYEG +BCDA;BCDA;1107 1168 11A9;BCDA;1107 1168 11A9; # (볚; 볚; 볚; 볚; 볚; ) HANGUL SYLLABLE BYEGG +BCDB;BCDB;1107 1168 11AA;BCDB;1107 1168 11AA; # (볛; 볛; 볛; 볛; 볛; ) HANGUL SYLLABLE BYEGS +BCDC;BCDC;1107 1168 11AB;BCDC;1107 1168 11AB; # (볜; 볜; 볜; 볜; 볜; ) HANGUL SYLLABLE BYEN +BCDD;BCDD;1107 1168 11AC;BCDD;1107 1168 11AC; # (볝; 볝; 볝; 볝; 볝; ) HANGUL SYLLABLE BYENJ +BCDE;BCDE;1107 1168 11AD;BCDE;1107 1168 11AD; # (볞; 볞; 볞; 볞; 볞; ) HANGUL SYLLABLE BYENH +BCDF;BCDF;1107 1168 11AE;BCDF;1107 1168 11AE; # (볟; 볟; 볟; 볟; 볟; ) HANGUL SYLLABLE BYED +BCE0;BCE0;1107 1168 11AF;BCE0;1107 1168 11AF; # (볠; 볠; 볠; 볠; 볠; ) HANGUL SYLLABLE BYEL +BCE1;BCE1;1107 1168 11B0;BCE1;1107 1168 11B0; # (볡; 볡; 볡; 볡; 볡; ) HANGUL SYLLABLE BYELG +BCE2;BCE2;1107 1168 11B1;BCE2;1107 1168 11B1; # (볢; 볢; 볢; 볢; 볢; ) HANGUL SYLLABLE BYELM +BCE3;BCE3;1107 1168 11B2;BCE3;1107 1168 11B2; # (볣; 볣; 볣; 볣; 볣; ) HANGUL SYLLABLE BYELB +BCE4;BCE4;1107 1168 11B3;BCE4;1107 1168 11B3; # (볤; 볤; 볤; 볤; 볤; ) HANGUL SYLLABLE BYELS +BCE5;BCE5;1107 1168 11B4;BCE5;1107 1168 11B4; # (볥; 볥; 볥; 볥; 볥; ) HANGUL SYLLABLE BYELT +BCE6;BCE6;1107 1168 11B5;BCE6;1107 1168 11B5; # (볦; 볦; 볦; 볦; 볦; ) HANGUL SYLLABLE BYELP +BCE7;BCE7;1107 1168 11B6;BCE7;1107 1168 11B6; # (볧; 볧; 볧; 볧; 볧; ) HANGUL SYLLABLE BYELH +BCE8;BCE8;1107 1168 11B7;BCE8;1107 1168 11B7; # (볨; 볨; 볨; 볨; 볨; ) HANGUL SYLLABLE BYEM +BCE9;BCE9;1107 1168 11B8;BCE9;1107 1168 11B8; # (볩; 볩; 볩; 볩; 볩; ) HANGUL SYLLABLE BYEB +BCEA;BCEA;1107 1168 11B9;BCEA;1107 1168 11B9; # (볪; 볪; 볪; 볪; 볪; ) HANGUL SYLLABLE BYEBS +BCEB;BCEB;1107 1168 11BA;BCEB;1107 1168 11BA; # (볫; 볫; 볫; 볫; 볫; ) HANGUL SYLLABLE BYES +BCEC;BCEC;1107 1168 11BB;BCEC;1107 1168 11BB; # (볬; 볬; 볬; 볬; 볬; ) HANGUL SYLLABLE BYESS +BCED;BCED;1107 1168 11BC;BCED;1107 1168 11BC; # (볭; 볭; 볭; 볭; 볭; ) HANGUL SYLLABLE BYENG +BCEE;BCEE;1107 1168 11BD;BCEE;1107 1168 11BD; # (볮; 볮; 볮; 볮; 볮; ) HANGUL SYLLABLE BYEJ +BCEF;BCEF;1107 1168 11BE;BCEF;1107 1168 11BE; # (볯; 볯; 볯; 볯; 볯; ) HANGUL SYLLABLE BYEC +BCF0;BCF0;1107 1168 11BF;BCF0;1107 1168 11BF; # (볰; 볰; 볰; 볰; 볰; ) HANGUL SYLLABLE BYEK +BCF1;BCF1;1107 1168 11C0;BCF1;1107 1168 11C0; # (볱; 볱; 볱; 볱; 볱; ) HANGUL SYLLABLE BYET +BCF2;BCF2;1107 1168 11C1;BCF2;1107 1168 11C1; # (볲; 볲; 볲; 볲; 볲; ) HANGUL SYLLABLE BYEP +BCF3;BCF3;1107 1168 11C2;BCF3;1107 1168 11C2; # (볳; 볳; 볳; 볳; 볳; ) HANGUL SYLLABLE BYEH +BCF4;BCF4;1107 1169;BCF4;1107 1169; # (보; 보; 보; 보; 보; ) HANGUL SYLLABLE BO +BCF5;BCF5;1107 1169 11A8;BCF5;1107 1169 11A8; # (복; 복; 복; 복; 복; ) HANGUL SYLLABLE BOG +BCF6;BCF6;1107 1169 11A9;BCF6;1107 1169 11A9; # (볶; 볶; 볶; 볶; 볶; ) HANGUL SYLLABLE BOGG +BCF7;BCF7;1107 1169 11AA;BCF7;1107 1169 11AA; # (볷; 볷; 볷; 볷; 볷; ) HANGUL SYLLABLE BOGS +BCF8;BCF8;1107 1169 11AB;BCF8;1107 1169 11AB; # (본; 본; 본; 본; 본; ) HANGUL SYLLABLE BON +BCF9;BCF9;1107 1169 11AC;BCF9;1107 1169 11AC; # (볹; 볹; 볹; 볹; 볹; ) HANGUL SYLLABLE BONJ +BCFA;BCFA;1107 1169 11AD;BCFA;1107 1169 11AD; # (볺; 볺; 볺; 볺; 볺; ) HANGUL SYLLABLE BONH +BCFB;BCFB;1107 1169 11AE;BCFB;1107 1169 11AE; # (볻; 볻; 볻; 볻; 볻; ) HANGUL SYLLABLE BOD +BCFC;BCFC;1107 1169 11AF;BCFC;1107 1169 11AF; # (볼; 볼; 볼; 볼; 볼; ) HANGUL SYLLABLE BOL +BCFD;BCFD;1107 1169 11B0;BCFD;1107 1169 11B0; # (볽; 볽; 볽; 볽; 볽; ) HANGUL SYLLABLE BOLG +BCFE;BCFE;1107 1169 11B1;BCFE;1107 1169 11B1; # (볾; 볾; 볾; 볾; 볾; ) HANGUL SYLLABLE BOLM +BCFF;BCFF;1107 1169 11B2;BCFF;1107 1169 11B2; # (볿; 볿; 볿; 볿; 볿; ) HANGUL SYLLABLE BOLB +BD00;BD00;1107 1169 11B3;BD00;1107 1169 11B3; # (봀; 봀; 봀; 봀; 봀; ) HANGUL SYLLABLE BOLS +BD01;BD01;1107 1169 11B4;BD01;1107 1169 11B4; # (봁; 봁; 봁; 봁; 봁; ) HANGUL SYLLABLE BOLT +BD02;BD02;1107 1169 11B5;BD02;1107 1169 11B5; # (봂; 봂; 봂; 봂; 봂; ) HANGUL SYLLABLE BOLP +BD03;BD03;1107 1169 11B6;BD03;1107 1169 11B6; # (봃; 봃; 봃; 봃; 봃; ) HANGUL SYLLABLE BOLH +BD04;BD04;1107 1169 11B7;BD04;1107 1169 11B7; # (봄; 봄; 봄; 봄; 봄; ) HANGUL SYLLABLE BOM +BD05;BD05;1107 1169 11B8;BD05;1107 1169 11B8; # (봅; 봅; 봅; 봅; 봅; ) HANGUL SYLLABLE BOB +BD06;BD06;1107 1169 11B9;BD06;1107 1169 11B9; # (봆; 봆; 봆; 봆; 봆; ) HANGUL SYLLABLE BOBS +BD07;BD07;1107 1169 11BA;BD07;1107 1169 11BA; # (봇; 봇; 봇; 봇; 봇; ) HANGUL SYLLABLE BOS +BD08;BD08;1107 1169 11BB;BD08;1107 1169 11BB; # (봈; 봈; 봈; 봈; 봈; ) HANGUL SYLLABLE BOSS +BD09;BD09;1107 1169 11BC;BD09;1107 1169 11BC; # (봉; 봉; 봉; 봉; 봉; ) HANGUL SYLLABLE BONG +BD0A;BD0A;1107 1169 11BD;BD0A;1107 1169 11BD; # (봊; 봊; 봊; 봊; 봊; ) HANGUL SYLLABLE BOJ +BD0B;BD0B;1107 1169 11BE;BD0B;1107 1169 11BE; # (봋; 봋; 봋; 봋; 봋; ) HANGUL SYLLABLE BOC +BD0C;BD0C;1107 1169 11BF;BD0C;1107 1169 11BF; # (봌; 봌; 봌; 봌; 봌; ) HANGUL SYLLABLE BOK +BD0D;BD0D;1107 1169 11C0;BD0D;1107 1169 11C0; # (봍; 봍; 봍; 봍; 봍; ) HANGUL SYLLABLE BOT +BD0E;BD0E;1107 1169 11C1;BD0E;1107 1169 11C1; # (봎; 봎; 봎; 봎; 봎; ) HANGUL SYLLABLE BOP +BD0F;BD0F;1107 1169 11C2;BD0F;1107 1169 11C2; # (봏; 봏; 봏; 봏; 봏; ) HANGUL SYLLABLE BOH +BD10;BD10;1107 116A;BD10;1107 116A; # (봐; 봐; 봐; 봐; 봐; ) HANGUL SYLLABLE BWA +BD11;BD11;1107 116A 11A8;BD11;1107 116A 11A8; # (봑; 봑; 봑; 봑; 봑; ) HANGUL SYLLABLE BWAG +BD12;BD12;1107 116A 11A9;BD12;1107 116A 11A9; # (봒; 봒; 봒; 봒; 봒; ) HANGUL SYLLABLE BWAGG +BD13;BD13;1107 116A 11AA;BD13;1107 116A 11AA; # (봓; 봓; 봓; 봓; 봓; ) HANGUL SYLLABLE BWAGS +BD14;BD14;1107 116A 11AB;BD14;1107 116A 11AB; # (봔; 봔; 봔; 봔; 봔; ) HANGUL SYLLABLE BWAN +BD15;BD15;1107 116A 11AC;BD15;1107 116A 11AC; # (봕; 봕; 봕; 봕; 봕; ) HANGUL SYLLABLE BWANJ +BD16;BD16;1107 116A 11AD;BD16;1107 116A 11AD; # (봖; 봖; 봖; 봖; 봖; ) HANGUL SYLLABLE BWANH +BD17;BD17;1107 116A 11AE;BD17;1107 116A 11AE; # (봗; 봗; 봗; 봗; 봗; ) HANGUL SYLLABLE BWAD +BD18;BD18;1107 116A 11AF;BD18;1107 116A 11AF; # (봘; 봘; 봘; 봘; 봘; ) HANGUL SYLLABLE BWAL +BD19;BD19;1107 116A 11B0;BD19;1107 116A 11B0; # (봙; 봙; 봙; 봙; 봙; ) HANGUL SYLLABLE BWALG +BD1A;BD1A;1107 116A 11B1;BD1A;1107 116A 11B1; # (봚; 봚; 봚; 봚; 봚; ) HANGUL SYLLABLE BWALM +BD1B;BD1B;1107 116A 11B2;BD1B;1107 116A 11B2; # (봛; 봛; 봛; 봛; 봛; ) HANGUL SYLLABLE BWALB +BD1C;BD1C;1107 116A 11B3;BD1C;1107 116A 11B3; # (봜; 봜; 봜; 봜; 봜; ) HANGUL SYLLABLE BWALS +BD1D;BD1D;1107 116A 11B4;BD1D;1107 116A 11B4; # (봝; 봝; 봝; 봝; 봝; ) HANGUL SYLLABLE BWALT +BD1E;BD1E;1107 116A 11B5;BD1E;1107 116A 11B5; # (봞; 봞; 봞; 봞; 봞; ) HANGUL SYLLABLE BWALP +BD1F;BD1F;1107 116A 11B6;BD1F;1107 116A 11B6; # (봟; 봟; 봟; 봟; 봟; ) HANGUL SYLLABLE BWALH +BD20;BD20;1107 116A 11B7;BD20;1107 116A 11B7; # (봠; 봠; 봠; 봠; 봠; ) HANGUL SYLLABLE BWAM +BD21;BD21;1107 116A 11B8;BD21;1107 116A 11B8; # (봡; 봡; 봡; 봡; 봡; ) HANGUL SYLLABLE BWAB +BD22;BD22;1107 116A 11B9;BD22;1107 116A 11B9; # (봢; 봢; 봢; 봢; 봢; ) HANGUL SYLLABLE BWABS +BD23;BD23;1107 116A 11BA;BD23;1107 116A 11BA; # (봣; 봣; 봣; 봣; 봣; ) HANGUL SYLLABLE BWAS +BD24;BD24;1107 116A 11BB;BD24;1107 116A 11BB; # (봤; 봤; 봤; 봤; 봤; ) HANGUL SYLLABLE BWASS +BD25;BD25;1107 116A 11BC;BD25;1107 116A 11BC; # (봥; 봥; 봥; 봥; 봥; ) HANGUL SYLLABLE BWANG +BD26;BD26;1107 116A 11BD;BD26;1107 116A 11BD; # (봦; 봦; 봦; 봦; 봦; ) HANGUL SYLLABLE BWAJ +BD27;BD27;1107 116A 11BE;BD27;1107 116A 11BE; # (봧; 봧; 봧; 봧; 봧; ) HANGUL SYLLABLE BWAC +BD28;BD28;1107 116A 11BF;BD28;1107 116A 11BF; # (봨; 봨; 봨; 봨; 봨; ) HANGUL SYLLABLE BWAK +BD29;BD29;1107 116A 11C0;BD29;1107 116A 11C0; # (봩; 봩; 봩; 봩; 봩; ) HANGUL SYLLABLE BWAT +BD2A;BD2A;1107 116A 11C1;BD2A;1107 116A 11C1; # (봪; 봪; 봪; 봪; 봪; ) HANGUL SYLLABLE BWAP +BD2B;BD2B;1107 116A 11C2;BD2B;1107 116A 11C2; # (봫; 봫; 봫; 봫; 봫; ) HANGUL SYLLABLE BWAH +BD2C;BD2C;1107 116B;BD2C;1107 116B; # (봬; 봬; 봬; 봬; 봬; ) HANGUL SYLLABLE BWAE +BD2D;BD2D;1107 116B 11A8;BD2D;1107 116B 11A8; # (봭; 봭; 봭; 봭; 봭; ) HANGUL SYLLABLE BWAEG +BD2E;BD2E;1107 116B 11A9;BD2E;1107 116B 11A9; # (봮; 봮; 봮; 봮; 봮; ) HANGUL SYLLABLE BWAEGG +BD2F;BD2F;1107 116B 11AA;BD2F;1107 116B 11AA; # (봯; 봯; 봯; 봯; 봯; ) HANGUL SYLLABLE BWAEGS +BD30;BD30;1107 116B 11AB;BD30;1107 116B 11AB; # (봰; 봰; 봰; 봰; 봰; ) HANGUL SYLLABLE BWAEN +BD31;BD31;1107 116B 11AC;BD31;1107 116B 11AC; # (봱; 봱; 봱; 봱; 봱; ) HANGUL SYLLABLE BWAENJ +BD32;BD32;1107 116B 11AD;BD32;1107 116B 11AD; # (봲; 봲; 봲; 봲; 봲; ) HANGUL SYLLABLE BWAENH +BD33;BD33;1107 116B 11AE;BD33;1107 116B 11AE; # (봳; 봳; 봳; 봳; 봳; ) HANGUL SYLLABLE BWAED +BD34;BD34;1107 116B 11AF;BD34;1107 116B 11AF; # (봴; 봴; 봴; 봴; 봴; ) HANGUL SYLLABLE BWAEL +BD35;BD35;1107 116B 11B0;BD35;1107 116B 11B0; # (봵; 봵; 봵; 봵; 봵; ) HANGUL SYLLABLE BWAELG +BD36;BD36;1107 116B 11B1;BD36;1107 116B 11B1; # (봶; 봶; 봶; 봶; 봶; ) HANGUL SYLLABLE BWAELM +BD37;BD37;1107 116B 11B2;BD37;1107 116B 11B2; # (봷; 봷; 봷; 봷; 봷; ) HANGUL SYLLABLE BWAELB +BD38;BD38;1107 116B 11B3;BD38;1107 116B 11B3; # (봸; 봸; 봸; 봸; 봸; ) HANGUL SYLLABLE BWAELS +BD39;BD39;1107 116B 11B4;BD39;1107 116B 11B4; # (봹; 봹; 봹; 봹; 봹; ) HANGUL SYLLABLE BWAELT +BD3A;BD3A;1107 116B 11B5;BD3A;1107 116B 11B5; # (봺; 봺; 봺; 봺; 봺; ) HANGUL SYLLABLE BWAELP +BD3B;BD3B;1107 116B 11B6;BD3B;1107 116B 11B6; # (봻; 봻; 봻; 봻; 봻; ) HANGUL SYLLABLE BWAELH +BD3C;BD3C;1107 116B 11B7;BD3C;1107 116B 11B7; # (봼; 봼; 봼; 봼; 봼; ) HANGUL SYLLABLE BWAEM +BD3D;BD3D;1107 116B 11B8;BD3D;1107 116B 11B8; # (봽; 봽; 봽; 봽; 봽; ) HANGUL SYLLABLE BWAEB +BD3E;BD3E;1107 116B 11B9;BD3E;1107 116B 11B9; # (봾; 봾; 봾; 봾; 봾; ) HANGUL SYLLABLE BWAEBS +BD3F;BD3F;1107 116B 11BA;BD3F;1107 116B 11BA; # (봿; 봿; 봿; 봿; 봿; ) HANGUL SYLLABLE BWAES +BD40;BD40;1107 116B 11BB;BD40;1107 116B 11BB; # (뵀; 뵀; 뵀; 뵀; 뵀; ) HANGUL SYLLABLE BWAESS +BD41;BD41;1107 116B 11BC;BD41;1107 116B 11BC; # (뵁; 뵁; 뵁; 뵁; 뵁; ) HANGUL SYLLABLE BWAENG +BD42;BD42;1107 116B 11BD;BD42;1107 116B 11BD; # (뵂; 뵂; 뵂; 뵂; 뵂; ) HANGUL SYLLABLE BWAEJ +BD43;BD43;1107 116B 11BE;BD43;1107 116B 11BE; # (뵃; 뵃; 뵃; 뵃; 뵃; ) HANGUL SYLLABLE BWAEC +BD44;BD44;1107 116B 11BF;BD44;1107 116B 11BF; # (뵄; 뵄; 뵄; 뵄; 뵄; ) HANGUL SYLLABLE BWAEK +BD45;BD45;1107 116B 11C0;BD45;1107 116B 11C0; # (뵅; 뵅; 뵅; 뵅; 뵅; ) HANGUL SYLLABLE BWAET +BD46;BD46;1107 116B 11C1;BD46;1107 116B 11C1; # (뵆; 뵆; 뵆; 뵆; 뵆; ) HANGUL SYLLABLE BWAEP +BD47;BD47;1107 116B 11C2;BD47;1107 116B 11C2; # (뵇; 뵇; 뵇; 뵇; 뵇; ) HANGUL SYLLABLE BWAEH +BD48;BD48;1107 116C;BD48;1107 116C; # (뵈; 뵈; 뵈; 뵈; 뵈; ) HANGUL SYLLABLE BOE +BD49;BD49;1107 116C 11A8;BD49;1107 116C 11A8; # (뵉; 뵉; 뵉; 뵉; 뵉; ) HANGUL SYLLABLE BOEG +BD4A;BD4A;1107 116C 11A9;BD4A;1107 116C 11A9; # (뵊; 뵊; 뵊; 뵊; 뵊; ) HANGUL SYLLABLE BOEGG +BD4B;BD4B;1107 116C 11AA;BD4B;1107 116C 11AA; # (뵋; 뵋; 뵋; 뵋; 뵋; ) HANGUL SYLLABLE BOEGS +BD4C;BD4C;1107 116C 11AB;BD4C;1107 116C 11AB; # (뵌; 뵌; 뵌; 뵌; 뵌; ) HANGUL SYLLABLE BOEN +BD4D;BD4D;1107 116C 11AC;BD4D;1107 116C 11AC; # (뵍; 뵍; 뵍; 뵍; 뵍; ) HANGUL SYLLABLE BOENJ +BD4E;BD4E;1107 116C 11AD;BD4E;1107 116C 11AD; # (뵎; 뵎; 뵎; 뵎; 뵎; ) HANGUL SYLLABLE BOENH +BD4F;BD4F;1107 116C 11AE;BD4F;1107 116C 11AE; # (뵏; 뵏; 뵏; 뵏; 뵏; ) HANGUL SYLLABLE BOED +BD50;BD50;1107 116C 11AF;BD50;1107 116C 11AF; # (뵐; 뵐; 뵐; 뵐; 뵐; ) HANGUL SYLLABLE BOEL +BD51;BD51;1107 116C 11B0;BD51;1107 116C 11B0; # (뵑; 뵑; 뵑; 뵑; 뵑; ) HANGUL SYLLABLE BOELG +BD52;BD52;1107 116C 11B1;BD52;1107 116C 11B1; # (뵒; 뵒; 뵒; 뵒; 뵒; ) HANGUL SYLLABLE BOELM +BD53;BD53;1107 116C 11B2;BD53;1107 116C 11B2; # (뵓; 뵓; 뵓; 뵓; 뵓; ) HANGUL SYLLABLE BOELB +BD54;BD54;1107 116C 11B3;BD54;1107 116C 11B3; # (뵔; 뵔; 뵔; 뵔; 뵔; ) HANGUL SYLLABLE BOELS +BD55;BD55;1107 116C 11B4;BD55;1107 116C 11B4; # (뵕; 뵕; 뵕; 뵕; 뵕; ) HANGUL SYLLABLE BOELT +BD56;BD56;1107 116C 11B5;BD56;1107 116C 11B5; # (뵖; 뵖; 뵖; 뵖; 뵖; ) HANGUL SYLLABLE BOELP +BD57;BD57;1107 116C 11B6;BD57;1107 116C 11B6; # (뵗; 뵗; 뵗; 뵗; 뵗; ) HANGUL SYLLABLE BOELH +BD58;BD58;1107 116C 11B7;BD58;1107 116C 11B7; # (뵘; 뵘; 뵘; 뵘; 뵘; ) HANGUL SYLLABLE BOEM +BD59;BD59;1107 116C 11B8;BD59;1107 116C 11B8; # (뵙; 뵙; 뵙; 뵙; 뵙; ) HANGUL SYLLABLE BOEB +BD5A;BD5A;1107 116C 11B9;BD5A;1107 116C 11B9; # (뵚; 뵚; 뵚; 뵚; 뵚; ) HANGUL SYLLABLE BOEBS +BD5B;BD5B;1107 116C 11BA;BD5B;1107 116C 11BA; # (뵛; 뵛; 뵛; 뵛; 뵛; ) HANGUL SYLLABLE BOES +BD5C;BD5C;1107 116C 11BB;BD5C;1107 116C 11BB; # (뵜; 뵜; 뵜; 뵜; 뵜; ) HANGUL SYLLABLE BOESS +BD5D;BD5D;1107 116C 11BC;BD5D;1107 116C 11BC; # (뵝; 뵝; 뵝; 뵝; 뵝; ) HANGUL SYLLABLE BOENG +BD5E;BD5E;1107 116C 11BD;BD5E;1107 116C 11BD; # (뵞; 뵞; 뵞; 뵞; 뵞; ) HANGUL SYLLABLE BOEJ +BD5F;BD5F;1107 116C 11BE;BD5F;1107 116C 11BE; # (뵟; 뵟; 뵟; 뵟; 뵟; ) HANGUL SYLLABLE BOEC +BD60;BD60;1107 116C 11BF;BD60;1107 116C 11BF; # (뵠; 뵠; 뵠; 뵠; 뵠; ) HANGUL SYLLABLE BOEK +BD61;BD61;1107 116C 11C0;BD61;1107 116C 11C0; # (뵡; 뵡; 뵡; 뵡; 뵡; ) HANGUL SYLLABLE BOET +BD62;BD62;1107 116C 11C1;BD62;1107 116C 11C1; # (뵢; 뵢; 뵢; 뵢; 뵢; ) HANGUL SYLLABLE BOEP +BD63;BD63;1107 116C 11C2;BD63;1107 116C 11C2; # (뵣; 뵣; 뵣; 뵣; 뵣; ) HANGUL SYLLABLE BOEH +BD64;BD64;1107 116D;BD64;1107 116D; # (뵤; 뵤; 뵤; 뵤; 뵤; ) HANGUL SYLLABLE BYO +BD65;BD65;1107 116D 11A8;BD65;1107 116D 11A8; # (뵥; 뵥; 뵥; 뵥; 뵥; ) HANGUL SYLLABLE BYOG +BD66;BD66;1107 116D 11A9;BD66;1107 116D 11A9; # (뵦; 뵦; 뵦; 뵦; 뵦; ) HANGUL SYLLABLE BYOGG +BD67;BD67;1107 116D 11AA;BD67;1107 116D 11AA; # (뵧; 뵧; 뵧; 뵧; 뵧; ) HANGUL SYLLABLE BYOGS +BD68;BD68;1107 116D 11AB;BD68;1107 116D 11AB; # (뵨; 뵨; 뵨; 뵨; 뵨; ) HANGUL SYLLABLE BYON +BD69;BD69;1107 116D 11AC;BD69;1107 116D 11AC; # (뵩; 뵩; 뵩; 뵩; 뵩; ) HANGUL SYLLABLE BYONJ +BD6A;BD6A;1107 116D 11AD;BD6A;1107 116D 11AD; # (뵪; 뵪; 뵪; 뵪; 뵪; ) HANGUL SYLLABLE BYONH +BD6B;BD6B;1107 116D 11AE;BD6B;1107 116D 11AE; # (뵫; 뵫; 뵫; 뵫; 뵫; ) HANGUL SYLLABLE BYOD +BD6C;BD6C;1107 116D 11AF;BD6C;1107 116D 11AF; # (뵬; 뵬; 뵬; 뵬; 뵬; ) HANGUL SYLLABLE BYOL +BD6D;BD6D;1107 116D 11B0;BD6D;1107 116D 11B0; # (뵭; 뵭; 뵭; 뵭; 뵭; ) HANGUL SYLLABLE BYOLG +BD6E;BD6E;1107 116D 11B1;BD6E;1107 116D 11B1; # (뵮; 뵮; 뵮; 뵮; 뵮; ) HANGUL SYLLABLE BYOLM +BD6F;BD6F;1107 116D 11B2;BD6F;1107 116D 11B2; # (뵯; 뵯; 뵯; 뵯; 뵯; ) HANGUL SYLLABLE BYOLB +BD70;BD70;1107 116D 11B3;BD70;1107 116D 11B3; # (뵰; 뵰; 뵰; 뵰; 뵰; ) HANGUL SYLLABLE BYOLS +BD71;BD71;1107 116D 11B4;BD71;1107 116D 11B4; # (뵱; 뵱; 뵱; 뵱; 뵱; ) HANGUL SYLLABLE BYOLT +BD72;BD72;1107 116D 11B5;BD72;1107 116D 11B5; # (뵲; 뵲; 뵲; 뵲; 뵲; ) HANGUL SYLLABLE BYOLP +BD73;BD73;1107 116D 11B6;BD73;1107 116D 11B6; # (뵳; 뵳; 뵳; 뵳; 뵳; ) HANGUL SYLLABLE BYOLH +BD74;BD74;1107 116D 11B7;BD74;1107 116D 11B7; # (뵴; 뵴; 뵴; 뵴; 뵴; ) HANGUL SYLLABLE BYOM +BD75;BD75;1107 116D 11B8;BD75;1107 116D 11B8; # (뵵; 뵵; 뵵; 뵵; 뵵; ) HANGUL SYLLABLE BYOB +BD76;BD76;1107 116D 11B9;BD76;1107 116D 11B9; # (뵶; 뵶; 뵶; 뵶; 뵶; ) HANGUL SYLLABLE BYOBS +BD77;BD77;1107 116D 11BA;BD77;1107 116D 11BA; # (뵷; 뵷; 뵷; 뵷; 뵷; ) HANGUL SYLLABLE BYOS +BD78;BD78;1107 116D 11BB;BD78;1107 116D 11BB; # (뵸; 뵸; 뵸; 뵸; 뵸; ) HANGUL SYLLABLE BYOSS +BD79;BD79;1107 116D 11BC;BD79;1107 116D 11BC; # (뵹; 뵹; 뵹; 뵹; 뵹; ) HANGUL SYLLABLE BYONG +BD7A;BD7A;1107 116D 11BD;BD7A;1107 116D 11BD; # (뵺; 뵺; 뵺; 뵺; 뵺; ) HANGUL SYLLABLE BYOJ +BD7B;BD7B;1107 116D 11BE;BD7B;1107 116D 11BE; # (뵻; 뵻; 뵻; 뵻; 뵻; ) HANGUL SYLLABLE BYOC +BD7C;BD7C;1107 116D 11BF;BD7C;1107 116D 11BF; # (뵼; 뵼; 뵼; 뵼; 뵼; ) HANGUL SYLLABLE BYOK +BD7D;BD7D;1107 116D 11C0;BD7D;1107 116D 11C0; # (뵽; 뵽; 뵽; 뵽; 뵽; ) HANGUL SYLLABLE BYOT +BD7E;BD7E;1107 116D 11C1;BD7E;1107 116D 11C1; # (뵾; 뵾; 뵾; 뵾; 뵾; ) HANGUL SYLLABLE BYOP +BD7F;BD7F;1107 116D 11C2;BD7F;1107 116D 11C2; # (뵿; 뵿; 뵿; 뵿; 뵿; ) HANGUL SYLLABLE BYOH +BD80;BD80;1107 116E;BD80;1107 116E; # (부; 부; 부; 부; 부; ) HANGUL SYLLABLE BU +BD81;BD81;1107 116E 11A8;BD81;1107 116E 11A8; # (북; 북; 북; 북; 북; ) HANGUL SYLLABLE BUG +BD82;BD82;1107 116E 11A9;BD82;1107 116E 11A9; # (붂; 붂; 붂; 붂; 붂; ) HANGUL SYLLABLE BUGG +BD83;BD83;1107 116E 11AA;BD83;1107 116E 11AA; # (붃; 붃; 붃; 붃; 붃; ) HANGUL SYLLABLE BUGS +BD84;BD84;1107 116E 11AB;BD84;1107 116E 11AB; # (분; 분; 분; 분; 분; ) HANGUL SYLLABLE BUN +BD85;BD85;1107 116E 11AC;BD85;1107 116E 11AC; # (붅; 붅; 붅; 붅; 붅; ) HANGUL SYLLABLE BUNJ +BD86;BD86;1107 116E 11AD;BD86;1107 116E 11AD; # (붆; 붆; 붆; 붆; 붆; ) HANGUL SYLLABLE BUNH +BD87;BD87;1107 116E 11AE;BD87;1107 116E 11AE; # (붇; 붇; 붇; 붇; 붇; ) HANGUL SYLLABLE BUD +BD88;BD88;1107 116E 11AF;BD88;1107 116E 11AF; # (불; 불; 불; 불; 불; ) HANGUL SYLLABLE BUL +BD89;BD89;1107 116E 11B0;BD89;1107 116E 11B0; # (붉; 붉; 붉; 붉; 붉; ) HANGUL SYLLABLE BULG +BD8A;BD8A;1107 116E 11B1;BD8A;1107 116E 11B1; # (붊; 붊; 붊; 붊; 붊; ) HANGUL SYLLABLE BULM +BD8B;BD8B;1107 116E 11B2;BD8B;1107 116E 11B2; # (붋; 붋; 붋; 붋; 붋; ) HANGUL SYLLABLE BULB +BD8C;BD8C;1107 116E 11B3;BD8C;1107 116E 11B3; # (붌; 붌; 붌; 붌; 붌; ) HANGUL SYLLABLE BULS +BD8D;BD8D;1107 116E 11B4;BD8D;1107 116E 11B4; # (붍; 붍; 붍; 붍; 붍; ) HANGUL SYLLABLE BULT +BD8E;BD8E;1107 116E 11B5;BD8E;1107 116E 11B5; # (붎; 붎; 붎; 붎; 붎; ) HANGUL SYLLABLE BULP +BD8F;BD8F;1107 116E 11B6;BD8F;1107 116E 11B6; # (붏; 붏; 붏; 붏; 붏; ) HANGUL SYLLABLE BULH +BD90;BD90;1107 116E 11B7;BD90;1107 116E 11B7; # (붐; 붐; 붐; 붐; 붐; ) HANGUL SYLLABLE BUM +BD91;BD91;1107 116E 11B8;BD91;1107 116E 11B8; # (붑; 붑; 붑; 붑; 붑; ) HANGUL SYLLABLE BUB +BD92;BD92;1107 116E 11B9;BD92;1107 116E 11B9; # (붒; 붒; 붒; 붒; 붒; ) HANGUL SYLLABLE BUBS +BD93;BD93;1107 116E 11BA;BD93;1107 116E 11BA; # (붓; 붓; 붓; 붓; 붓; ) HANGUL SYLLABLE BUS +BD94;BD94;1107 116E 11BB;BD94;1107 116E 11BB; # (붔; 붔; 붔; 붔; 붔; ) HANGUL SYLLABLE BUSS +BD95;BD95;1107 116E 11BC;BD95;1107 116E 11BC; # (붕; 붕; 붕; 붕; 붕; ) HANGUL SYLLABLE BUNG +BD96;BD96;1107 116E 11BD;BD96;1107 116E 11BD; # (붖; 붖; 붖; 붖; 붖; ) HANGUL SYLLABLE BUJ +BD97;BD97;1107 116E 11BE;BD97;1107 116E 11BE; # (붗; 붗; 붗; 붗; 붗; ) HANGUL SYLLABLE BUC +BD98;BD98;1107 116E 11BF;BD98;1107 116E 11BF; # (붘; 붘; 붘; 붘; 붘; ) HANGUL SYLLABLE BUK +BD99;BD99;1107 116E 11C0;BD99;1107 116E 11C0; # (붙; 붙; 붙; 붙; 붙; ) HANGUL SYLLABLE BUT +BD9A;BD9A;1107 116E 11C1;BD9A;1107 116E 11C1; # (붚; 붚; 붚; 붚; 붚; ) HANGUL SYLLABLE BUP +BD9B;BD9B;1107 116E 11C2;BD9B;1107 116E 11C2; # (붛; 붛; 붛; 붛; 붛; ) HANGUL SYLLABLE BUH +BD9C;BD9C;1107 116F;BD9C;1107 116F; # (붜; 붜; 붜; 붜; 붜; ) HANGUL SYLLABLE BWEO +BD9D;BD9D;1107 116F 11A8;BD9D;1107 116F 11A8; # (붝; 붝; 붝; 붝; 붝; ) HANGUL SYLLABLE BWEOG +BD9E;BD9E;1107 116F 11A9;BD9E;1107 116F 11A9; # (붞; 붞; 붞; 붞; 붞; ) HANGUL SYLLABLE BWEOGG +BD9F;BD9F;1107 116F 11AA;BD9F;1107 116F 11AA; # (붟; 붟; 붟; 붟; 붟; ) HANGUL SYLLABLE BWEOGS +BDA0;BDA0;1107 116F 11AB;BDA0;1107 116F 11AB; # (붠; 붠; 붠; 붠; 붠; ) HANGUL SYLLABLE BWEON +BDA1;BDA1;1107 116F 11AC;BDA1;1107 116F 11AC; # (붡; 붡; 붡; 붡; 붡; ) HANGUL SYLLABLE BWEONJ +BDA2;BDA2;1107 116F 11AD;BDA2;1107 116F 11AD; # (붢; 붢; 붢; 붢; 붢; ) HANGUL SYLLABLE BWEONH +BDA3;BDA3;1107 116F 11AE;BDA3;1107 116F 11AE; # (붣; 붣; 붣; 붣; 붣; ) HANGUL SYLLABLE BWEOD +BDA4;BDA4;1107 116F 11AF;BDA4;1107 116F 11AF; # (붤; 붤; 붤; 붤; 붤; ) HANGUL SYLLABLE BWEOL +BDA5;BDA5;1107 116F 11B0;BDA5;1107 116F 11B0; # (붥; 붥; 붥; 붥; 붥; ) HANGUL SYLLABLE BWEOLG +BDA6;BDA6;1107 116F 11B1;BDA6;1107 116F 11B1; # (붦; 붦; 붦; 붦; 붦; ) HANGUL SYLLABLE BWEOLM +BDA7;BDA7;1107 116F 11B2;BDA7;1107 116F 11B2; # (붧; 붧; 붧; 붧; 붧; ) HANGUL SYLLABLE BWEOLB +BDA8;BDA8;1107 116F 11B3;BDA8;1107 116F 11B3; # (붨; 붨; 붨; 붨; 붨; ) HANGUL SYLLABLE BWEOLS +BDA9;BDA9;1107 116F 11B4;BDA9;1107 116F 11B4; # (붩; 붩; 붩; 붩; 붩; ) HANGUL SYLLABLE BWEOLT +BDAA;BDAA;1107 116F 11B5;BDAA;1107 116F 11B5; # (붪; 붪; 붪; 붪; 붪; ) HANGUL SYLLABLE BWEOLP +BDAB;BDAB;1107 116F 11B6;BDAB;1107 116F 11B6; # (붫; 붫; 붫; 붫; 붫; ) HANGUL SYLLABLE BWEOLH +BDAC;BDAC;1107 116F 11B7;BDAC;1107 116F 11B7; # (붬; 붬; 붬; 붬; 붬; ) HANGUL SYLLABLE BWEOM +BDAD;BDAD;1107 116F 11B8;BDAD;1107 116F 11B8; # (붭; 붭; 붭; 붭; 붭; ) HANGUL SYLLABLE BWEOB +BDAE;BDAE;1107 116F 11B9;BDAE;1107 116F 11B9; # (붮; 붮; 붮; 붮; 붮; ) HANGUL SYLLABLE BWEOBS +BDAF;BDAF;1107 116F 11BA;BDAF;1107 116F 11BA; # (붯; 붯; 붯; 붯; 붯; ) HANGUL SYLLABLE BWEOS +BDB0;BDB0;1107 116F 11BB;BDB0;1107 116F 11BB; # (붰; 붰; 붰; 붰; 붰; ) HANGUL SYLLABLE BWEOSS +BDB1;BDB1;1107 116F 11BC;BDB1;1107 116F 11BC; # (붱; 붱; 붱; 붱; 붱; ) HANGUL SYLLABLE BWEONG +BDB2;BDB2;1107 116F 11BD;BDB2;1107 116F 11BD; # (붲; 붲; 붲; 붲; 붲; ) HANGUL SYLLABLE BWEOJ +BDB3;BDB3;1107 116F 11BE;BDB3;1107 116F 11BE; # (붳; 붳; 붳; 붳; 붳; ) HANGUL SYLLABLE BWEOC +BDB4;BDB4;1107 116F 11BF;BDB4;1107 116F 11BF; # (붴; 붴; 붴; 붴; 붴; ) HANGUL SYLLABLE BWEOK +BDB5;BDB5;1107 116F 11C0;BDB5;1107 116F 11C0; # (붵; 붵; 붵; 붵; 붵; ) HANGUL SYLLABLE BWEOT +BDB6;BDB6;1107 116F 11C1;BDB6;1107 116F 11C1; # (붶; 붶; 붶; 붶; 붶; ) HANGUL SYLLABLE BWEOP +BDB7;BDB7;1107 116F 11C2;BDB7;1107 116F 11C2; # (붷; 붷; 붷; 붷; 붷; ) HANGUL SYLLABLE BWEOH +BDB8;BDB8;1107 1170;BDB8;1107 1170; # (붸; 붸; 붸; 붸; 붸; ) HANGUL SYLLABLE BWE +BDB9;BDB9;1107 1170 11A8;BDB9;1107 1170 11A8; # (붹; 붹; 붹; 붹; 붹; ) HANGUL SYLLABLE BWEG +BDBA;BDBA;1107 1170 11A9;BDBA;1107 1170 11A9; # (붺; 붺; 붺; 붺; 붺; ) HANGUL SYLLABLE BWEGG +BDBB;BDBB;1107 1170 11AA;BDBB;1107 1170 11AA; # (붻; 붻; 붻; 붻; 붻; ) HANGUL SYLLABLE BWEGS +BDBC;BDBC;1107 1170 11AB;BDBC;1107 1170 11AB; # (붼; 붼; 붼; 붼; 붼; ) HANGUL SYLLABLE BWEN +BDBD;BDBD;1107 1170 11AC;BDBD;1107 1170 11AC; # (붽; 붽; 붽; 붽; 붽; ) HANGUL SYLLABLE BWENJ +BDBE;BDBE;1107 1170 11AD;BDBE;1107 1170 11AD; # (붾; 붾; 붾; 붾; 붾; ) HANGUL SYLLABLE BWENH +BDBF;BDBF;1107 1170 11AE;BDBF;1107 1170 11AE; # (붿; 붿; 붿; 붿; 붿; ) HANGUL SYLLABLE BWED +BDC0;BDC0;1107 1170 11AF;BDC0;1107 1170 11AF; # (뷀; 뷀; 뷀; 뷀; 뷀; ) HANGUL SYLLABLE BWEL +BDC1;BDC1;1107 1170 11B0;BDC1;1107 1170 11B0; # (뷁; 뷁; 뷁; 뷁; 뷁; ) HANGUL SYLLABLE BWELG +BDC2;BDC2;1107 1170 11B1;BDC2;1107 1170 11B1; # (뷂; 뷂; 뷂; 뷂; 뷂; ) HANGUL SYLLABLE BWELM +BDC3;BDC3;1107 1170 11B2;BDC3;1107 1170 11B2; # (뷃; 뷃; 뷃; 뷃; 뷃; ) HANGUL SYLLABLE BWELB +BDC4;BDC4;1107 1170 11B3;BDC4;1107 1170 11B3; # (뷄; 뷄; 뷄; 뷄; 뷄; ) HANGUL SYLLABLE BWELS +BDC5;BDC5;1107 1170 11B4;BDC5;1107 1170 11B4; # (뷅; 뷅; 뷅; 뷅; 뷅; ) HANGUL SYLLABLE BWELT +BDC6;BDC6;1107 1170 11B5;BDC6;1107 1170 11B5; # (뷆; 뷆; 뷆; 뷆; 뷆; ) HANGUL SYLLABLE BWELP +BDC7;BDC7;1107 1170 11B6;BDC7;1107 1170 11B6; # (뷇; 뷇; 뷇; 뷇; 뷇; ) HANGUL SYLLABLE BWELH +BDC8;BDC8;1107 1170 11B7;BDC8;1107 1170 11B7; # (뷈; 뷈; 뷈; 뷈; 뷈; ) HANGUL SYLLABLE BWEM +BDC9;BDC9;1107 1170 11B8;BDC9;1107 1170 11B8; # (뷉; 뷉; 뷉; 뷉; 뷉; ) HANGUL SYLLABLE BWEB +BDCA;BDCA;1107 1170 11B9;BDCA;1107 1170 11B9; # (뷊; 뷊; 뷊; 뷊; 뷊; ) HANGUL SYLLABLE BWEBS +BDCB;BDCB;1107 1170 11BA;BDCB;1107 1170 11BA; # (뷋; 뷋; 뷋; 뷋; 뷋; ) HANGUL SYLLABLE BWES +BDCC;BDCC;1107 1170 11BB;BDCC;1107 1170 11BB; # (뷌; 뷌; 뷌; 뷌; 뷌; ) HANGUL SYLLABLE BWESS +BDCD;BDCD;1107 1170 11BC;BDCD;1107 1170 11BC; # (뷍; 뷍; 뷍; 뷍; 뷍; ) HANGUL SYLLABLE BWENG +BDCE;BDCE;1107 1170 11BD;BDCE;1107 1170 11BD; # (뷎; 뷎; 뷎; 뷎; 뷎; ) HANGUL SYLLABLE BWEJ +BDCF;BDCF;1107 1170 11BE;BDCF;1107 1170 11BE; # (뷏; 뷏; 뷏; 뷏; 뷏; ) HANGUL SYLLABLE BWEC +BDD0;BDD0;1107 1170 11BF;BDD0;1107 1170 11BF; # (뷐; 뷐; 뷐; 뷐; 뷐; ) HANGUL SYLLABLE BWEK +BDD1;BDD1;1107 1170 11C0;BDD1;1107 1170 11C0; # (뷑; 뷑; 뷑; 뷑; 뷑; ) HANGUL SYLLABLE BWET +BDD2;BDD2;1107 1170 11C1;BDD2;1107 1170 11C1; # (뷒; 뷒; 뷒; 뷒; 뷒; ) HANGUL SYLLABLE BWEP +BDD3;BDD3;1107 1170 11C2;BDD3;1107 1170 11C2; # (뷓; 뷓; 뷓; 뷓; 뷓; ) HANGUL SYLLABLE BWEH +BDD4;BDD4;1107 1171;BDD4;1107 1171; # (뷔; 뷔; 뷔; 뷔; 뷔; ) HANGUL SYLLABLE BWI +BDD5;BDD5;1107 1171 11A8;BDD5;1107 1171 11A8; # (뷕; 뷕; 뷕; 뷕; 뷕; ) HANGUL SYLLABLE BWIG +BDD6;BDD6;1107 1171 11A9;BDD6;1107 1171 11A9; # (뷖; 뷖; 뷖; 뷖; 뷖; ) HANGUL SYLLABLE BWIGG +BDD7;BDD7;1107 1171 11AA;BDD7;1107 1171 11AA; # (뷗; 뷗; 뷗; 뷗; 뷗; ) HANGUL SYLLABLE BWIGS +BDD8;BDD8;1107 1171 11AB;BDD8;1107 1171 11AB; # (뷘; 뷘; 뷘; 뷘; 뷘; ) HANGUL SYLLABLE BWIN +BDD9;BDD9;1107 1171 11AC;BDD9;1107 1171 11AC; # (뷙; 뷙; 뷙; 뷙; 뷙; ) HANGUL SYLLABLE BWINJ +BDDA;BDDA;1107 1171 11AD;BDDA;1107 1171 11AD; # (뷚; 뷚; 뷚; 뷚; 뷚; ) HANGUL SYLLABLE BWINH +BDDB;BDDB;1107 1171 11AE;BDDB;1107 1171 11AE; # (뷛; 뷛; 뷛; 뷛; 뷛; ) HANGUL SYLLABLE BWID +BDDC;BDDC;1107 1171 11AF;BDDC;1107 1171 11AF; # (뷜; 뷜; 뷜; 뷜; 뷜; ) HANGUL SYLLABLE BWIL +BDDD;BDDD;1107 1171 11B0;BDDD;1107 1171 11B0; # (뷝; 뷝; 뷝; 뷝; 뷝; ) HANGUL SYLLABLE BWILG +BDDE;BDDE;1107 1171 11B1;BDDE;1107 1171 11B1; # (뷞; 뷞; 뷞; 뷞; 뷞; ) HANGUL SYLLABLE BWILM +BDDF;BDDF;1107 1171 11B2;BDDF;1107 1171 11B2; # (뷟; 뷟; 뷟; 뷟; 뷟; ) HANGUL SYLLABLE BWILB +BDE0;BDE0;1107 1171 11B3;BDE0;1107 1171 11B3; # (뷠; 뷠; 뷠; 뷠; 뷠; ) HANGUL SYLLABLE BWILS +BDE1;BDE1;1107 1171 11B4;BDE1;1107 1171 11B4; # (뷡; 뷡; 뷡; 뷡; 뷡; ) HANGUL SYLLABLE BWILT +BDE2;BDE2;1107 1171 11B5;BDE2;1107 1171 11B5; # (뷢; 뷢; 뷢; 뷢; 뷢; ) HANGUL SYLLABLE BWILP +BDE3;BDE3;1107 1171 11B6;BDE3;1107 1171 11B6; # (뷣; 뷣; 뷣; 뷣; 뷣; ) HANGUL SYLLABLE BWILH +BDE4;BDE4;1107 1171 11B7;BDE4;1107 1171 11B7; # (뷤; 뷤; 뷤; 뷤; 뷤; ) HANGUL SYLLABLE BWIM +BDE5;BDE5;1107 1171 11B8;BDE5;1107 1171 11B8; # (뷥; 뷥; 뷥; 뷥; 뷥; ) HANGUL SYLLABLE BWIB +BDE6;BDE6;1107 1171 11B9;BDE6;1107 1171 11B9; # (뷦; 뷦; 뷦; 뷦; 뷦; ) HANGUL SYLLABLE BWIBS +BDE7;BDE7;1107 1171 11BA;BDE7;1107 1171 11BA; # (뷧; 뷧; 뷧; 뷧; 뷧; ) HANGUL SYLLABLE BWIS +BDE8;BDE8;1107 1171 11BB;BDE8;1107 1171 11BB; # (뷨; 뷨; 뷨; 뷨; 뷨; ) HANGUL SYLLABLE BWISS +BDE9;BDE9;1107 1171 11BC;BDE9;1107 1171 11BC; # (뷩; 뷩; 뷩; 뷩; 뷩; ) HANGUL SYLLABLE BWING +BDEA;BDEA;1107 1171 11BD;BDEA;1107 1171 11BD; # (뷪; 뷪; 뷪; 뷪; 뷪; ) HANGUL SYLLABLE BWIJ +BDEB;BDEB;1107 1171 11BE;BDEB;1107 1171 11BE; # (뷫; 뷫; 뷫; 뷫; 뷫; ) HANGUL SYLLABLE BWIC +BDEC;BDEC;1107 1171 11BF;BDEC;1107 1171 11BF; # (뷬; 뷬; 뷬; 뷬; 뷬; ) HANGUL SYLLABLE BWIK +BDED;BDED;1107 1171 11C0;BDED;1107 1171 11C0; # (뷭; 뷭; 뷭; 뷭; 뷭; ) HANGUL SYLLABLE BWIT +BDEE;BDEE;1107 1171 11C1;BDEE;1107 1171 11C1; # (뷮; 뷮; 뷮; 뷮; 뷮; ) HANGUL SYLLABLE BWIP +BDEF;BDEF;1107 1171 11C2;BDEF;1107 1171 11C2; # (뷯; 뷯; 뷯; 뷯; 뷯; ) HANGUL SYLLABLE BWIH +BDF0;BDF0;1107 1172;BDF0;1107 1172; # (뷰; 뷰; 뷰; 뷰; 뷰; ) HANGUL SYLLABLE BYU +BDF1;BDF1;1107 1172 11A8;BDF1;1107 1172 11A8; # (뷱; 뷱; 뷱; 뷱; 뷱; ) HANGUL SYLLABLE BYUG +BDF2;BDF2;1107 1172 11A9;BDF2;1107 1172 11A9; # (뷲; 뷲; 뷲; 뷲; 뷲; ) HANGUL SYLLABLE BYUGG +BDF3;BDF3;1107 1172 11AA;BDF3;1107 1172 11AA; # (뷳; 뷳; 뷳; 뷳; 뷳; ) HANGUL SYLLABLE BYUGS +BDF4;BDF4;1107 1172 11AB;BDF4;1107 1172 11AB; # (뷴; 뷴; 뷴; 뷴; 뷴; ) HANGUL SYLLABLE BYUN +BDF5;BDF5;1107 1172 11AC;BDF5;1107 1172 11AC; # (뷵; 뷵; 뷵; 뷵; 뷵; ) HANGUL SYLLABLE BYUNJ +BDF6;BDF6;1107 1172 11AD;BDF6;1107 1172 11AD; # (뷶; 뷶; 뷶; 뷶; 뷶; ) HANGUL SYLLABLE BYUNH +BDF7;BDF7;1107 1172 11AE;BDF7;1107 1172 11AE; # (뷷; 뷷; 뷷; 뷷; 뷷; ) HANGUL SYLLABLE BYUD +BDF8;BDF8;1107 1172 11AF;BDF8;1107 1172 11AF; # (뷸; 뷸; 뷸; 뷸; 뷸; ) HANGUL SYLLABLE BYUL +BDF9;BDF9;1107 1172 11B0;BDF9;1107 1172 11B0; # (뷹; 뷹; 뷹; 뷹; 뷹; ) HANGUL SYLLABLE BYULG +BDFA;BDFA;1107 1172 11B1;BDFA;1107 1172 11B1; # (뷺; 뷺; 뷺; 뷺; 뷺; ) HANGUL SYLLABLE BYULM +BDFB;BDFB;1107 1172 11B2;BDFB;1107 1172 11B2; # (뷻; 뷻; 뷻; 뷻; 뷻; ) HANGUL SYLLABLE BYULB +BDFC;BDFC;1107 1172 11B3;BDFC;1107 1172 11B3; # (뷼; 뷼; 뷼; 뷼; 뷼; ) HANGUL SYLLABLE BYULS +BDFD;BDFD;1107 1172 11B4;BDFD;1107 1172 11B4; # (뷽; 뷽; 뷽; 뷽; 뷽; ) HANGUL SYLLABLE BYULT +BDFE;BDFE;1107 1172 11B5;BDFE;1107 1172 11B5; # (뷾; 뷾; 뷾; 뷾; 뷾; ) HANGUL SYLLABLE BYULP +BDFF;BDFF;1107 1172 11B6;BDFF;1107 1172 11B6; # (뷿; 뷿; 뷿; 뷿; 뷿; ) HANGUL SYLLABLE BYULH +BE00;BE00;1107 1172 11B7;BE00;1107 1172 11B7; # (븀; 븀; 븀; 븀; 븀; ) HANGUL SYLLABLE BYUM +BE01;BE01;1107 1172 11B8;BE01;1107 1172 11B8; # (븁; 븁; 븁; 븁; 븁; ) HANGUL SYLLABLE BYUB +BE02;BE02;1107 1172 11B9;BE02;1107 1172 11B9; # (븂; 븂; 븂; 븂; 븂; ) HANGUL SYLLABLE BYUBS +BE03;BE03;1107 1172 11BA;BE03;1107 1172 11BA; # (븃; 븃; 븃; 븃; 븃; ) HANGUL SYLLABLE BYUS +BE04;BE04;1107 1172 11BB;BE04;1107 1172 11BB; # (븄; 븄; 븄; 븄; 븄; ) HANGUL SYLLABLE BYUSS +BE05;BE05;1107 1172 11BC;BE05;1107 1172 11BC; # (븅; 븅; 븅; 븅; 븅; ) HANGUL SYLLABLE BYUNG +BE06;BE06;1107 1172 11BD;BE06;1107 1172 11BD; # (븆; 븆; 븆; 븆; 븆; ) HANGUL SYLLABLE BYUJ +BE07;BE07;1107 1172 11BE;BE07;1107 1172 11BE; # (븇; 븇; 븇; 븇; 븇; ) HANGUL SYLLABLE BYUC +BE08;BE08;1107 1172 11BF;BE08;1107 1172 11BF; # (븈; 븈; 븈; 븈; 븈; ) HANGUL SYLLABLE BYUK +BE09;BE09;1107 1172 11C0;BE09;1107 1172 11C0; # (븉; 븉; 븉; 븉; 븉; ) HANGUL SYLLABLE BYUT +BE0A;BE0A;1107 1172 11C1;BE0A;1107 1172 11C1; # (븊; 븊; 븊; 븊; 븊; ) HANGUL SYLLABLE BYUP +BE0B;BE0B;1107 1172 11C2;BE0B;1107 1172 11C2; # (븋; 븋; 븋; 븋; 븋; ) HANGUL SYLLABLE BYUH +BE0C;BE0C;1107 1173;BE0C;1107 1173; # (브; 브; 브; 브; 브; ) HANGUL SYLLABLE BEU +BE0D;BE0D;1107 1173 11A8;BE0D;1107 1173 11A8; # (븍; 븍; 븍; 븍; 븍; ) HANGUL SYLLABLE BEUG +BE0E;BE0E;1107 1173 11A9;BE0E;1107 1173 11A9; # (븎; 븎; 븎; 븎; 븎; ) HANGUL SYLLABLE BEUGG +BE0F;BE0F;1107 1173 11AA;BE0F;1107 1173 11AA; # (븏; 븏; 븏; 븏; 븏; ) HANGUL SYLLABLE BEUGS +BE10;BE10;1107 1173 11AB;BE10;1107 1173 11AB; # (븐; 븐; 븐; 븐; 븐; ) HANGUL SYLLABLE BEUN +BE11;BE11;1107 1173 11AC;BE11;1107 1173 11AC; # (븑; 븑; 븑; 븑; 븑; ) HANGUL SYLLABLE BEUNJ +BE12;BE12;1107 1173 11AD;BE12;1107 1173 11AD; # (븒; 븒; 븒; 븒; 븒; ) HANGUL SYLLABLE BEUNH +BE13;BE13;1107 1173 11AE;BE13;1107 1173 11AE; # (븓; 븓; 븓; 븓; 븓; ) HANGUL SYLLABLE BEUD +BE14;BE14;1107 1173 11AF;BE14;1107 1173 11AF; # (블; 블; 블; 블; 블; ) HANGUL SYLLABLE BEUL +BE15;BE15;1107 1173 11B0;BE15;1107 1173 11B0; # (븕; 븕; 븕; 븕; 븕; ) HANGUL SYLLABLE BEULG +BE16;BE16;1107 1173 11B1;BE16;1107 1173 11B1; # (븖; 븖; 븖; 븖; 븖; ) HANGUL SYLLABLE BEULM +BE17;BE17;1107 1173 11B2;BE17;1107 1173 11B2; # (븗; 븗; 븗; 븗; 븗; ) HANGUL SYLLABLE BEULB +BE18;BE18;1107 1173 11B3;BE18;1107 1173 11B3; # (븘; 븘; 븘; 븘; 븘; ) HANGUL SYLLABLE BEULS +BE19;BE19;1107 1173 11B4;BE19;1107 1173 11B4; # (븙; 븙; 븙; 븙; 븙; ) HANGUL SYLLABLE BEULT +BE1A;BE1A;1107 1173 11B5;BE1A;1107 1173 11B5; # (븚; 븚; 븚; 븚; 븚; ) HANGUL SYLLABLE BEULP +BE1B;BE1B;1107 1173 11B6;BE1B;1107 1173 11B6; # (븛; 븛; 븛; 븛; 븛; ) HANGUL SYLLABLE BEULH +BE1C;BE1C;1107 1173 11B7;BE1C;1107 1173 11B7; # (븜; 븜; 븜; 븜; 븜; ) HANGUL SYLLABLE BEUM +BE1D;BE1D;1107 1173 11B8;BE1D;1107 1173 11B8; # (븝; 븝; 븝; 븝; 븝; ) HANGUL SYLLABLE BEUB +BE1E;BE1E;1107 1173 11B9;BE1E;1107 1173 11B9; # (븞; 븞; 븞; 븞; 븞; ) HANGUL SYLLABLE BEUBS +BE1F;BE1F;1107 1173 11BA;BE1F;1107 1173 11BA; # (븟; 븟; 븟; 븟; 븟; ) HANGUL SYLLABLE BEUS +BE20;BE20;1107 1173 11BB;BE20;1107 1173 11BB; # (븠; 븠; 븠; 븠; 븠; ) HANGUL SYLLABLE BEUSS +BE21;BE21;1107 1173 11BC;BE21;1107 1173 11BC; # (븡; 븡; 븡; 븡; 븡; ) HANGUL SYLLABLE BEUNG +BE22;BE22;1107 1173 11BD;BE22;1107 1173 11BD; # (븢; 븢; 븢; 븢; 븢; ) HANGUL SYLLABLE BEUJ +BE23;BE23;1107 1173 11BE;BE23;1107 1173 11BE; # (븣; 븣; 븣; 븣; 븣; ) HANGUL SYLLABLE BEUC +BE24;BE24;1107 1173 11BF;BE24;1107 1173 11BF; # (븤; 븤; 븤; 븤; 븤; ) HANGUL SYLLABLE BEUK +BE25;BE25;1107 1173 11C0;BE25;1107 1173 11C0; # (븥; 븥; 븥; 븥; 븥; ) HANGUL SYLLABLE BEUT +BE26;BE26;1107 1173 11C1;BE26;1107 1173 11C1; # (븦; 븦; 븦; 븦; 븦; ) HANGUL SYLLABLE BEUP +BE27;BE27;1107 1173 11C2;BE27;1107 1173 11C2; # (븧; 븧; 븧; 븧; 븧; ) HANGUL SYLLABLE BEUH +BE28;BE28;1107 1174;BE28;1107 1174; # (븨; 븨; 븨; 븨; 븨; ) HANGUL SYLLABLE BYI +BE29;BE29;1107 1174 11A8;BE29;1107 1174 11A8; # (븩; 븩; 븩; 븩; 븩; ) HANGUL SYLLABLE BYIG +BE2A;BE2A;1107 1174 11A9;BE2A;1107 1174 11A9; # (븪; 븪; 븪; 븪; 븪; ) HANGUL SYLLABLE BYIGG +BE2B;BE2B;1107 1174 11AA;BE2B;1107 1174 11AA; # (븫; 븫; 븫; 븫; 븫; ) HANGUL SYLLABLE BYIGS +BE2C;BE2C;1107 1174 11AB;BE2C;1107 1174 11AB; # (븬; 븬; 븬; 븬; 븬; ) HANGUL SYLLABLE BYIN +BE2D;BE2D;1107 1174 11AC;BE2D;1107 1174 11AC; # (븭; 븭; 븭; 븭; 븭; ) HANGUL SYLLABLE BYINJ +BE2E;BE2E;1107 1174 11AD;BE2E;1107 1174 11AD; # (븮; 븮; 븮; 븮; 븮; ) HANGUL SYLLABLE BYINH +BE2F;BE2F;1107 1174 11AE;BE2F;1107 1174 11AE; # (븯; 븯; 븯; 븯; 븯; ) HANGUL SYLLABLE BYID +BE30;BE30;1107 1174 11AF;BE30;1107 1174 11AF; # (븰; 븰; 븰; 븰; 븰; ) HANGUL SYLLABLE BYIL +BE31;BE31;1107 1174 11B0;BE31;1107 1174 11B0; # (븱; 븱; 븱; 븱; 븱; ) HANGUL SYLLABLE BYILG +BE32;BE32;1107 1174 11B1;BE32;1107 1174 11B1; # (븲; 븲; 븲; 븲; 븲; ) HANGUL SYLLABLE BYILM +BE33;BE33;1107 1174 11B2;BE33;1107 1174 11B2; # (븳; 븳; 븳; 븳; 븳; ) HANGUL SYLLABLE BYILB +BE34;BE34;1107 1174 11B3;BE34;1107 1174 11B3; # (븴; 븴; 븴; 븴; 븴; ) HANGUL SYLLABLE BYILS +BE35;BE35;1107 1174 11B4;BE35;1107 1174 11B4; # (븵; 븵; 븵; 븵; 븵; ) HANGUL SYLLABLE BYILT +BE36;BE36;1107 1174 11B5;BE36;1107 1174 11B5; # (븶; 븶; 븶; 븶; 븶; ) HANGUL SYLLABLE BYILP +BE37;BE37;1107 1174 11B6;BE37;1107 1174 11B6; # (븷; 븷; 븷; 븷; 븷; ) HANGUL SYLLABLE BYILH +BE38;BE38;1107 1174 11B7;BE38;1107 1174 11B7; # (븸; 븸; 븸; 븸; 븸; ) HANGUL SYLLABLE BYIM +BE39;BE39;1107 1174 11B8;BE39;1107 1174 11B8; # (븹; 븹; 븹; 븹; 븹; ) HANGUL SYLLABLE BYIB +BE3A;BE3A;1107 1174 11B9;BE3A;1107 1174 11B9; # (븺; 븺; 븺; 븺; 븺; ) HANGUL SYLLABLE BYIBS +BE3B;BE3B;1107 1174 11BA;BE3B;1107 1174 11BA; # (븻; 븻; 븻; 븻; 븻; ) HANGUL SYLLABLE BYIS +BE3C;BE3C;1107 1174 11BB;BE3C;1107 1174 11BB; # (븼; 븼; 븼; 븼; 븼; ) HANGUL SYLLABLE BYISS +BE3D;BE3D;1107 1174 11BC;BE3D;1107 1174 11BC; # (븽; 븽; 븽; 븽; 븽; ) HANGUL SYLLABLE BYING +BE3E;BE3E;1107 1174 11BD;BE3E;1107 1174 11BD; # (븾; 븾; 븾; 븾; 븾; ) HANGUL SYLLABLE BYIJ +BE3F;BE3F;1107 1174 11BE;BE3F;1107 1174 11BE; # (븿; 븿; 븿; 븿; 븿; ) HANGUL SYLLABLE BYIC +BE40;BE40;1107 1174 11BF;BE40;1107 1174 11BF; # (빀; 빀; 빀; 빀; 빀; ) HANGUL SYLLABLE BYIK +BE41;BE41;1107 1174 11C0;BE41;1107 1174 11C0; # (빁; 빁; 빁; 빁; 빁; ) HANGUL SYLLABLE BYIT +BE42;BE42;1107 1174 11C1;BE42;1107 1174 11C1; # (빂; 빂; 빂; 빂; 빂; ) HANGUL SYLLABLE BYIP +BE43;BE43;1107 1174 11C2;BE43;1107 1174 11C2; # (빃; 빃; 빃; 빃; 빃; ) HANGUL SYLLABLE BYIH +BE44;BE44;1107 1175;BE44;1107 1175; # (비; 비; 비; 비; 비; ) HANGUL SYLLABLE BI +BE45;BE45;1107 1175 11A8;BE45;1107 1175 11A8; # (빅; 빅; 빅; 빅; 빅; ) HANGUL SYLLABLE BIG +BE46;BE46;1107 1175 11A9;BE46;1107 1175 11A9; # (빆; 빆; 빆; 빆; 빆; ) HANGUL SYLLABLE BIGG +BE47;BE47;1107 1175 11AA;BE47;1107 1175 11AA; # (빇; 빇; 빇; 빇; 빇; ) HANGUL SYLLABLE BIGS +BE48;BE48;1107 1175 11AB;BE48;1107 1175 11AB; # (빈; 빈; 빈; 빈; 빈; ) HANGUL SYLLABLE BIN +BE49;BE49;1107 1175 11AC;BE49;1107 1175 11AC; # (빉; 빉; 빉; 빉; 빉; ) HANGUL SYLLABLE BINJ +BE4A;BE4A;1107 1175 11AD;BE4A;1107 1175 11AD; # (빊; 빊; 빊; 빊; 빊; ) HANGUL SYLLABLE BINH +BE4B;BE4B;1107 1175 11AE;BE4B;1107 1175 11AE; # (빋; 빋; 빋; 빋; 빋; ) HANGUL SYLLABLE BID +BE4C;BE4C;1107 1175 11AF;BE4C;1107 1175 11AF; # (빌; 빌; 빌; 빌; 빌; ) HANGUL SYLLABLE BIL +BE4D;BE4D;1107 1175 11B0;BE4D;1107 1175 11B0; # (빍; 빍; 빍; 빍; 빍; ) HANGUL SYLLABLE BILG +BE4E;BE4E;1107 1175 11B1;BE4E;1107 1175 11B1; # (빎; 빎; 빎; 빎; 빎; ) HANGUL SYLLABLE BILM +BE4F;BE4F;1107 1175 11B2;BE4F;1107 1175 11B2; # (빏; 빏; 빏; 빏; 빏; ) HANGUL SYLLABLE BILB +BE50;BE50;1107 1175 11B3;BE50;1107 1175 11B3; # (빐; 빐; 빐; 빐; 빐; ) HANGUL SYLLABLE BILS +BE51;BE51;1107 1175 11B4;BE51;1107 1175 11B4; # (빑; 빑; 빑; 빑; 빑; ) HANGUL SYLLABLE BILT +BE52;BE52;1107 1175 11B5;BE52;1107 1175 11B5; # (빒; 빒; 빒; 빒; 빒; ) HANGUL SYLLABLE BILP +BE53;BE53;1107 1175 11B6;BE53;1107 1175 11B6; # (빓; 빓; 빓; 빓; 빓; ) HANGUL SYLLABLE BILH +BE54;BE54;1107 1175 11B7;BE54;1107 1175 11B7; # (빔; 빔; 빔; 빔; 빔; ) HANGUL SYLLABLE BIM +BE55;BE55;1107 1175 11B8;BE55;1107 1175 11B8; # (빕; 빕; 빕; 빕; 빕; ) HANGUL SYLLABLE BIB +BE56;BE56;1107 1175 11B9;BE56;1107 1175 11B9; # (빖; 빖; 빖; 빖; 빖; ) HANGUL SYLLABLE BIBS +BE57;BE57;1107 1175 11BA;BE57;1107 1175 11BA; # (빗; 빗; 빗; 빗; 빗; ) HANGUL SYLLABLE BIS +BE58;BE58;1107 1175 11BB;BE58;1107 1175 11BB; # (빘; 빘; 빘; 빘; 빘; ) HANGUL SYLLABLE BISS +BE59;BE59;1107 1175 11BC;BE59;1107 1175 11BC; # (빙; 빙; 빙; 빙; 빙; ) HANGUL SYLLABLE BING +BE5A;BE5A;1107 1175 11BD;BE5A;1107 1175 11BD; # (빚; 빚; 빚; 빚; 빚; ) HANGUL SYLLABLE BIJ +BE5B;BE5B;1107 1175 11BE;BE5B;1107 1175 11BE; # (빛; 빛; 빛; 빛; 빛; ) HANGUL SYLLABLE BIC +BE5C;BE5C;1107 1175 11BF;BE5C;1107 1175 11BF; # (빜; 빜; 빜; 빜; 빜; ) HANGUL SYLLABLE BIK +BE5D;BE5D;1107 1175 11C0;BE5D;1107 1175 11C0; # (빝; 빝; 빝; 빝; 빝; ) HANGUL SYLLABLE BIT +BE5E;BE5E;1107 1175 11C1;BE5E;1107 1175 11C1; # (빞; 빞; 빞; 빞; 빞; ) HANGUL SYLLABLE BIP +BE5F;BE5F;1107 1175 11C2;BE5F;1107 1175 11C2; # (빟; 빟; 빟; 빟; 빟; ) HANGUL SYLLABLE BIH +BE60;BE60;1108 1161;BE60;1108 1161; # (빠; 빠; 빠; 빠; 빠; ) HANGUL SYLLABLE BBA +BE61;BE61;1108 1161 11A8;BE61;1108 1161 11A8; # (빡; 빡; 빡; 빡; 빡; ) HANGUL SYLLABLE BBAG +BE62;BE62;1108 1161 11A9;BE62;1108 1161 11A9; # (빢; 빢; 빢; 빢; 빢; ) HANGUL SYLLABLE BBAGG +BE63;BE63;1108 1161 11AA;BE63;1108 1161 11AA; # (빣; 빣; 빣; 빣; 빣; ) HANGUL SYLLABLE BBAGS +BE64;BE64;1108 1161 11AB;BE64;1108 1161 11AB; # (빤; 빤; 빤; 빤; 빤; ) HANGUL SYLLABLE BBAN +BE65;BE65;1108 1161 11AC;BE65;1108 1161 11AC; # (빥; 빥; 빥; 빥; 빥; ) HANGUL SYLLABLE BBANJ +BE66;BE66;1108 1161 11AD;BE66;1108 1161 11AD; # (빦; 빦; 빦; 빦; 빦; ) HANGUL SYLLABLE BBANH +BE67;BE67;1108 1161 11AE;BE67;1108 1161 11AE; # (빧; 빧; 빧; 빧; 빧; ) HANGUL SYLLABLE BBAD +BE68;BE68;1108 1161 11AF;BE68;1108 1161 11AF; # (빨; 빨; 빨; 빨; 빨; ) HANGUL SYLLABLE BBAL +BE69;BE69;1108 1161 11B0;BE69;1108 1161 11B0; # (빩; 빩; 빩; 빩; 빩; ) HANGUL SYLLABLE BBALG +BE6A;BE6A;1108 1161 11B1;BE6A;1108 1161 11B1; # (빪; 빪; 빪; 빪; 빪; ) HANGUL SYLLABLE BBALM +BE6B;BE6B;1108 1161 11B2;BE6B;1108 1161 11B2; # (빫; 빫; 빫; 빫; 빫; ) HANGUL SYLLABLE BBALB +BE6C;BE6C;1108 1161 11B3;BE6C;1108 1161 11B3; # (빬; 빬; 빬; 빬; 빬; ) HANGUL SYLLABLE BBALS +BE6D;BE6D;1108 1161 11B4;BE6D;1108 1161 11B4; # (빭; 빭; 빭; 빭; 빭; ) HANGUL SYLLABLE BBALT +BE6E;BE6E;1108 1161 11B5;BE6E;1108 1161 11B5; # (빮; 빮; 빮; 빮; 빮; ) HANGUL SYLLABLE BBALP +BE6F;BE6F;1108 1161 11B6;BE6F;1108 1161 11B6; # (빯; 빯; 빯; 빯; 빯; ) HANGUL SYLLABLE BBALH +BE70;BE70;1108 1161 11B7;BE70;1108 1161 11B7; # (빰; 빰; 빰; 빰; 빰; ) HANGUL SYLLABLE BBAM +BE71;BE71;1108 1161 11B8;BE71;1108 1161 11B8; # (빱; 빱; 빱; 빱; 빱; ) HANGUL SYLLABLE BBAB +BE72;BE72;1108 1161 11B9;BE72;1108 1161 11B9; # (빲; 빲; 빲; 빲; 빲; ) HANGUL SYLLABLE BBABS +BE73;BE73;1108 1161 11BA;BE73;1108 1161 11BA; # (빳; 빳; 빳; 빳; 빳; ) HANGUL SYLLABLE BBAS +BE74;BE74;1108 1161 11BB;BE74;1108 1161 11BB; # (빴; 빴; 빴; 빴; 빴; ) HANGUL SYLLABLE BBASS +BE75;BE75;1108 1161 11BC;BE75;1108 1161 11BC; # (빵; 빵; 빵; 빵; 빵; ) HANGUL SYLLABLE BBANG +BE76;BE76;1108 1161 11BD;BE76;1108 1161 11BD; # (빶; 빶; 빶; 빶; 빶; ) HANGUL SYLLABLE BBAJ +BE77;BE77;1108 1161 11BE;BE77;1108 1161 11BE; # (빷; 빷; 빷; 빷; 빷; ) HANGUL SYLLABLE BBAC +BE78;BE78;1108 1161 11BF;BE78;1108 1161 11BF; # (빸; 빸; 빸; 빸; 빸; ) HANGUL SYLLABLE BBAK +BE79;BE79;1108 1161 11C0;BE79;1108 1161 11C0; # (빹; 빹; 빹; 빹; 빹; ) HANGUL SYLLABLE BBAT +BE7A;BE7A;1108 1161 11C1;BE7A;1108 1161 11C1; # (빺; 빺; 빺; 빺; 빺; ) HANGUL SYLLABLE BBAP +BE7B;BE7B;1108 1161 11C2;BE7B;1108 1161 11C2; # (빻; 빻; 빻; 빻; 빻; ) HANGUL SYLLABLE BBAH +BE7C;BE7C;1108 1162;BE7C;1108 1162; # (빼; 빼; 빼; 빼; 빼; ) HANGUL SYLLABLE BBAE +BE7D;BE7D;1108 1162 11A8;BE7D;1108 1162 11A8; # (빽; 빽; 빽; 빽; 빽; ) HANGUL SYLLABLE BBAEG +BE7E;BE7E;1108 1162 11A9;BE7E;1108 1162 11A9; # (빾; 빾; 빾; 빾; 빾; ) HANGUL SYLLABLE BBAEGG +BE7F;BE7F;1108 1162 11AA;BE7F;1108 1162 11AA; # (빿; 빿; 빿; 빿; 빿; ) HANGUL SYLLABLE BBAEGS +BE80;BE80;1108 1162 11AB;BE80;1108 1162 11AB; # (뺀; 뺀; 뺀; 뺀; 뺀; ) HANGUL SYLLABLE BBAEN +BE81;BE81;1108 1162 11AC;BE81;1108 1162 11AC; # (뺁; 뺁; 뺁; 뺁; 뺁; ) HANGUL SYLLABLE BBAENJ +BE82;BE82;1108 1162 11AD;BE82;1108 1162 11AD; # (뺂; 뺂; 뺂; 뺂; 뺂; ) HANGUL SYLLABLE BBAENH +BE83;BE83;1108 1162 11AE;BE83;1108 1162 11AE; # (뺃; 뺃; 뺃; 뺃; 뺃; ) HANGUL SYLLABLE BBAED +BE84;BE84;1108 1162 11AF;BE84;1108 1162 11AF; # (뺄; 뺄; 뺄; 뺄; 뺄; ) HANGUL SYLLABLE BBAEL +BE85;BE85;1108 1162 11B0;BE85;1108 1162 11B0; # (뺅; 뺅; 뺅; 뺅; 뺅; ) HANGUL SYLLABLE BBAELG +BE86;BE86;1108 1162 11B1;BE86;1108 1162 11B1; # (뺆; 뺆; 뺆; 뺆; 뺆; ) HANGUL SYLLABLE BBAELM +BE87;BE87;1108 1162 11B2;BE87;1108 1162 11B2; # (뺇; 뺇; 뺇; 뺇; 뺇; ) HANGUL SYLLABLE BBAELB +BE88;BE88;1108 1162 11B3;BE88;1108 1162 11B3; # (뺈; 뺈; 뺈; 뺈; 뺈; ) HANGUL SYLLABLE BBAELS +BE89;BE89;1108 1162 11B4;BE89;1108 1162 11B4; # (뺉; 뺉; 뺉; 뺉; 뺉; ) HANGUL SYLLABLE BBAELT +BE8A;BE8A;1108 1162 11B5;BE8A;1108 1162 11B5; # (뺊; 뺊; 뺊; 뺊; 뺊; ) HANGUL SYLLABLE BBAELP +BE8B;BE8B;1108 1162 11B6;BE8B;1108 1162 11B6; # (뺋; 뺋; 뺋; 뺋; 뺋; ) HANGUL SYLLABLE BBAELH +BE8C;BE8C;1108 1162 11B7;BE8C;1108 1162 11B7; # (뺌; 뺌; 뺌; 뺌; 뺌; ) HANGUL SYLLABLE BBAEM +BE8D;BE8D;1108 1162 11B8;BE8D;1108 1162 11B8; # (뺍; 뺍; 뺍; 뺍; 뺍; ) HANGUL SYLLABLE BBAEB +BE8E;BE8E;1108 1162 11B9;BE8E;1108 1162 11B9; # (뺎; 뺎; 뺎; 뺎; 뺎; ) HANGUL SYLLABLE BBAEBS +BE8F;BE8F;1108 1162 11BA;BE8F;1108 1162 11BA; # (뺏; 뺏; 뺏; 뺏; 뺏; ) HANGUL SYLLABLE BBAES +BE90;BE90;1108 1162 11BB;BE90;1108 1162 11BB; # (뺐; 뺐; 뺐; 뺐; 뺐; ) HANGUL SYLLABLE BBAESS +BE91;BE91;1108 1162 11BC;BE91;1108 1162 11BC; # (뺑; 뺑; 뺑; 뺑; 뺑; ) HANGUL SYLLABLE BBAENG +BE92;BE92;1108 1162 11BD;BE92;1108 1162 11BD; # (뺒; 뺒; 뺒; 뺒; 뺒; ) HANGUL SYLLABLE BBAEJ +BE93;BE93;1108 1162 11BE;BE93;1108 1162 11BE; # (뺓; 뺓; 뺓; 뺓; 뺓; ) HANGUL SYLLABLE BBAEC +BE94;BE94;1108 1162 11BF;BE94;1108 1162 11BF; # (뺔; 뺔; 뺔; 뺔; 뺔; ) HANGUL SYLLABLE BBAEK +BE95;BE95;1108 1162 11C0;BE95;1108 1162 11C0; # (뺕; 뺕; 뺕; 뺕; 뺕; ) HANGUL SYLLABLE BBAET +BE96;BE96;1108 1162 11C1;BE96;1108 1162 11C1; # (뺖; 뺖; 뺖; 뺖; 뺖; ) HANGUL SYLLABLE BBAEP +BE97;BE97;1108 1162 11C2;BE97;1108 1162 11C2; # (뺗; 뺗; 뺗; 뺗; 뺗; ) HANGUL SYLLABLE BBAEH +BE98;BE98;1108 1163;BE98;1108 1163; # (뺘; 뺘; 뺘; 뺘; 뺘; ) HANGUL SYLLABLE BBYA +BE99;BE99;1108 1163 11A8;BE99;1108 1163 11A8; # (뺙; 뺙; 뺙; 뺙; 뺙; ) HANGUL SYLLABLE BBYAG +BE9A;BE9A;1108 1163 11A9;BE9A;1108 1163 11A9; # (뺚; 뺚; 뺚; 뺚; 뺚; ) HANGUL SYLLABLE BBYAGG +BE9B;BE9B;1108 1163 11AA;BE9B;1108 1163 11AA; # (뺛; 뺛; 뺛; 뺛; 뺛; ) HANGUL SYLLABLE BBYAGS +BE9C;BE9C;1108 1163 11AB;BE9C;1108 1163 11AB; # (뺜; 뺜; 뺜; 뺜; 뺜; ) HANGUL SYLLABLE BBYAN +BE9D;BE9D;1108 1163 11AC;BE9D;1108 1163 11AC; # (뺝; 뺝; 뺝; 뺝; 뺝; ) HANGUL SYLLABLE BBYANJ +BE9E;BE9E;1108 1163 11AD;BE9E;1108 1163 11AD; # (뺞; 뺞; 뺞; 뺞; 뺞; ) HANGUL SYLLABLE BBYANH +BE9F;BE9F;1108 1163 11AE;BE9F;1108 1163 11AE; # (뺟; 뺟; 뺟; 뺟; 뺟; ) HANGUL SYLLABLE BBYAD +BEA0;BEA0;1108 1163 11AF;BEA0;1108 1163 11AF; # (뺠; 뺠; 뺠; 뺠; 뺠; ) HANGUL SYLLABLE BBYAL +BEA1;BEA1;1108 1163 11B0;BEA1;1108 1163 11B0; # (뺡; 뺡; 뺡; 뺡; 뺡; ) HANGUL SYLLABLE BBYALG +BEA2;BEA2;1108 1163 11B1;BEA2;1108 1163 11B1; # (뺢; 뺢; 뺢; 뺢; 뺢; ) HANGUL SYLLABLE BBYALM +BEA3;BEA3;1108 1163 11B2;BEA3;1108 1163 11B2; # (뺣; 뺣; 뺣; 뺣; 뺣; ) HANGUL SYLLABLE BBYALB +BEA4;BEA4;1108 1163 11B3;BEA4;1108 1163 11B3; # (뺤; 뺤; 뺤; 뺤; 뺤; ) HANGUL SYLLABLE BBYALS +BEA5;BEA5;1108 1163 11B4;BEA5;1108 1163 11B4; # (뺥; 뺥; 뺥; 뺥; 뺥; ) HANGUL SYLLABLE BBYALT +BEA6;BEA6;1108 1163 11B5;BEA6;1108 1163 11B5; # (뺦; 뺦; 뺦; 뺦; 뺦; ) HANGUL SYLLABLE BBYALP +BEA7;BEA7;1108 1163 11B6;BEA7;1108 1163 11B6; # (뺧; 뺧; 뺧; 뺧; 뺧; ) HANGUL SYLLABLE BBYALH +BEA8;BEA8;1108 1163 11B7;BEA8;1108 1163 11B7; # (뺨; 뺨; 뺨; 뺨; 뺨; ) HANGUL SYLLABLE BBYAM +BEA9;BEA9;1108 1163 11B8;BEA9;1108 1163 11B8; # (뺩; 뺩; 뺩; 뺩; 뺩; ) HANGUL SYLLABLE BBYAB +BEAA;BEAA;1108 1163 11B9;BEAA;1108 1163 11B9; # (뺪; 뺪; 뺪; 뺪; 뺪; ) HANGUL SYLLABLE BBYABS +BEAB;BEAB;1108 1163 11BA;BEAB;1108 1163 11BA; # (뺫; 뺫; 뺫; 뺫; 뺫; ) HANGUL SYLLABLE BBYAS +BEAC;BEAC;1108 1163 11BB;BEAC;1108 1163 11BB; # (뺬; 뺬; 뺬; 뺬; 뺬; ) HANGUL SYLLABLE BBYASS +BEAD;BEAD;1108 1163 11BC;BEAD;1108 1163 11BC; # (뺭; 뺭; 뺭; 뺭; 뺭; ) HANGUL SYLLABLE BBYANG +BEAE;BEAE;1108 1163 11BD;BEAE;1108 1163 11BD; # (뺮; 뺮; 뺮; 뺮; 뺮; ) HANGUL SYLLABLE BBYAJ +BEAF;BEAF;1108 1163 11BE;BEAF;1108 1163 11BE; # (뺯; 뺯; 뺯; 뺯; 뺯; ) HANGUL SYLLABLE BBYAC +BEB0;BEB0;1108 1163 11BF;BEB0;1108 1163 11BF; # (뺰; 뺰; 뺰; 뺰; 뺰; ) HANGUL SYLLABLE BBYAK +BEB1;BEB1;1108 1163 11C0;BEB1;1108 1163 11C0; # (뺱; 뺱; 뺱; 뺱; 뺱; ) HANGUL SYLLABLE BBYAT +BEB2;BEB2;1108 1163 11C1;BEB2;1108 1163 11C1; # (뺲; 뺲; 뺲; 뺲; 뺲; ) HANGUL SYLLABLE BBYAP +BEB3;BEB3;1108 1163 11C2;BEB3;1108 1163 11C2; # (뺳; 뺳; 뺳; 뺳; 뺳; ) HANGUL SYLLABLE BBYAH +BEB4;BEB4;1108 1164;BEB4;1108 1164; # (뺴; 뺴; 뺴; 뺴; 뺴; ) HANGUL SYLLABLE BBYAE +BEB5;BEB5;1108 1164 11A8;BEB5;1108 1164 11A8; # (뺵; 뺵; 뺵; 뺵; 뺵; ) HANGUL SYLLABLE BBYAEG +BEB6;BEB6;1108 1164 11A9;BEB6;1108 1164 11A9; # (뺶; 뺶; 뺶; 뺶; 뺶; ) HANGUL SYLLABLE BBYAEGG +BEB7;BEB7;1108 1164 11AA;BEB7;1108 1164 11AA; # (뺷; 뺷; 뺷; 뺷; 뺷; ) HANGUL SYLLABLE BBYAEGS +BEB8;BEB8;1108 1164 11AB;BEB8;1108 1164 11AB; # (뺸; 뺸; 뺸; 뺸; 뺸; ) HANGUL SYLLABLE BBYAEN +BEB9;BEB9;1108 1164 11AC;BEB9;1108 1164 11AC; # (뺹; 뺹; 뺹; 뺹; 뺹; ) HANGUL SYLLABLE BBYAENJ +BEBA;BEBA;1108 1164 11AD;BEBA;1108 1164 11AD; # (뺺; 뺺; 뺺; 뺺; 뺺; ) HANGUL SYLLABLE BBYAENH +BEBB;BEBB;1108 1164 11AE;BEBB;1108 1164 11AE; # (뺻; 뺻; 뺻; 뺻; 뺻; ) HANGUL SYLLABLE BBYAED +BEBC;BEBC;1108 1164 11AF;BEBC;1108 1164 11AF; # (뺼; 뺼; 뺼; 뺼; 뺼; ) HANGUL SYLLABLE BBYAEL +BEBD;BEBD;1108 1164 11B0;BEBD;1108 1164 11B0; # (뺽; 뺽; 뺽; 뺽; 뺽; ) HANGUL SYLLABLE BBYAELG +BEBE;BEBE;1108 1164 11B1;BEBE;1108 1164 11B1; # (뺾; 뺾; 뺾; 뺾; 뺾; ) HANGUL SYLLABLE BBYAELM +BEBF;BEBF;1108 1164 11B2;BEBF;1108 1164 11B2; # (뺿; 뺿; 뺿; 뺿; 뺿; ) HANGUL SYLLABLE BBYAELB +BEC0;BEC0;1108 1164 11B3;BEC0;1108 1164 11B3; # (뻀; 뻀; 뻀; 뻀; 뻀; ) HANGUL SYLLABLE BBYAELS +BEC1;BEC1;1108 1164 11B4;BEC1;1108 1164 11B4; # (뻁; 뻁; 뻁; 뻁; 뻁; ) HANGUL SYLLABLE BBYAELT +BEC2;BEC2;1108 1164 11B5;BEC2;1108 1164 11B5; # (뻂; 뻂; 뻂; 뻂; 뻂; ) HANGUL SYLLABLE BBYAELP +BEC3;BEC3;1108 1164 11B6;BEC3;1108 1164 11B6; # (뻃; 뻃; 뻃; 뻃; 뻃; ) HANGUL SYLLABLE BBYAELH +BEC4;BEC4;1108 1164 11B7;BEC4;1108 1164 11B7; # (뻄; 뻄; 뻄; 뻄; 뻄; ) HANGUL SYLLABLE BBYAEM +BEC5;BEC5;1108 1164 11B8;BEC5;1108 1164 11B8; # (뻅; 뻅; 뻅; 뻅; 뻅; ) HANGUL SYLLABLE BBYAEB +BEC6;BEC6;1108 1164 11B9;BEC6;1108 1164 11B9; # (뻆; 뻆; 뻆; 뻆; 뻆; ) HANGUL SYLLABLE BBYAEBS +BEC7;BEC7;1108 1164 11BA;BEC7;1108 1164 11BA; # (뻇; 뻇; 뻇; 뻇; 뻇; ) HANGUL SYLLABLE BBYAES +BEC8;BEC8;1108 1164 11BB;BEC8;1108 1164 11BB; # (뻈; 뻈; 뻈; 뻈; 뻈; ) HANGUL SYLLABLE BBYAESS +BEC9;BEC9;1108 1164 11BC;BEC9;1108 1164 11BC; # (뻉; 뻉; 뻉; 뻉; 뻉; ) HANGUL SYLLABLE BBYAENG +BECA;BECA;1108 1164 11BD;BECA;1108 1164 11BD; # (뻊; 뻊; 뻊; 뻊; 뻊; ) HANGUL SYLLABLE BBYAEJ +BECB;BECB;1108 1164 11BE;BECB;1108 1164 11BE; # (뻋; 뻋; 뻋; 뻋; 뻋; ) HANGUL SYLLABLE BBYAEC +BECC;BECC;1108 1164 11BF;BECC;1108 1164 11BF; # (뻌; 뻌; 뻌; 뻌; 뻌; ) HANGUL SYLLABLE BBYAEK +BECD;BECD;1108 1164 11C0;BECD;1108 1164 11C0; # (뻍; 뻍; 뻍; 뻍; 뻍; ) HANGUL SYLLABLE BBYAET +BECE;BECE;1108 1164 11C1;BECE;1108 1164 11C1; # (뻎; 뻎; 뻎; 뻎; 뻎; ) HANGUL SYLLABLE BBYAEP +BECF;BECF;1108 1164 11C2;BECF;1108 1164 11C2; # (뻏; 뻏; 뻏; 뻏; 뻏; ) HANGUL SYLLABLE BBYAEH +BED0;BED0;1108 1165;BED0;1108 1165; # (뻐; 뻐; 뻐; 뻐; 뻐; ) HANGUL SYLLABLE BBEO +BED1;BED1;1108 1165 11A8;BED1;1108 1165 11A8; # (뻑; 뻑; 뻑; 뻑; 뻑; ) HANGUL SYLLABLE BBEOG +BED2;BED2;1108 1165 11A9;BED2;1108 1165 11A9; # (뻒; 뻒; 뻒; 뻒; 뻒; ) HANGUL SYLLABLE BBEOGG +BED3;BED3;1108 1165 11AA;BED3;1108 1165 11AA; # (뻓; 뻓; 뻓; 뻓; 뻓; ) HANGUL SYLLABLE BBEOGS +BED4;BED4;1108 1165 11AB;BED4;1108 1165 11AB; # (뻔; 뻔; 뻔; 뻔; 뻔; ) HANGUL SYLLABLE BBEON +BED5;BED5;1108 1165 11AC;BED5;1108 1165 11AC; # (뻕; 뻕; 뻕; 뻕; 뻕; ) HANGUL SYLLABLE BBEONJ +BED6;BED6;1108 1165 11AD;BED6;1108 1165 11AD; # (뻖; 뻖; 뻖; 뻖; 뻖; ) HANGUL SYLLABLE BBEONH +BED7;BED7;1108 1165 11AE;BED7;1108 1165 11AE; # (뻗; 뻗; 뻗; 뻗; 뻗; ) HANGUL SYLLABLE BBEOD +BED8;BED8;1108 1165 11AF;BED8;1108 1165 11AF; # (뻘; 뻘; 뻘; 뻘; 뻘; ) HANGUL SYLLABLE BBEOL +BED9;BED9;1108 1165 11B0;BED9;1108 1165 11B0; # (뻙; 뻙; 뻙; 뻙; 뻙; ) HANGUL SYLLABLE BBEOLG +BEDA;BEDA;1108 1165 11B1;BEDA;1108 1165 11B1; # (뻚; 뻚; 뻚; 뻚; 뻚; ) HANGUL SYLLABLE BBEOLM +BEDB;BEDB;1108 1165 11B2;BEDB;1108 1165 11B2; # (뻛; 뻛; 뻛; 뻛; 뻛; ) HANGUL SYLLABLE BBEOLB +BEDC;BEDC;1108 1165 11B3;BEDC;1108 1165 11B3; # (뻜; 뻜; 뻜; 뻜; 뻜; ) HANGUL SYLLABLE BBEOLS +BEDD;BEDD;1108 1165 11B4;BEDD;1108 1165 11B4; # (뻝; 뻝; 뻝; 뻝; 뻝; ) HANGUL SYLLABLE BBEOLT +BEDE;BEDE;1108 1165 11B5;BEDE;1108 1165 11B5; # (뻞; 뻞; 뻞; 뻞; 뻞; ) HANGUL SYLLABLE BBEOLP +BEDF;BEDF;1108 1165 11B6;BEDF;1108 1165 11B6; # (뻟; 뻟; 뻟; 뻟; 뻟; ) HANGUL SYLLABLE BBEOLH +BEE0;BEE0;1108 1165 11B7;BEE0;1108 1165 11B7; # (뻠; 뻠; 뻠; 뻠; 뻠; ) HANGUL SYLLABLE BBEOM +BEE1;BEE1;1108 1165 11B8;BEE1;1108 1165 11B8; # (뻡; 뻡; 뻡; 뻡; 뻡; ) HANGUL SYLLABLE BBEOB +BEE2;BEE2;1108 1165 11B9;BEE2;1108 1165 11B9; # (뻢; 뻢; 뻢; 뻢; 뻢; ) HANGUL SYLLABLE BBEOBS +BEE3;BEE3;1108 1165 11BA;BEE3;1108 1165 11BA; # (뻣; 뻣; 뻣; 뻣; 뻣; ) HANGUL SYLLABLE BBEOS +BEE4;BEE4;1108 1165 11BB;BEE4;1108 1165 11BB; # (뻤; 뻤; 뻤; 뻤; 뻤; ) HANGUL SYLLABLE BBEOSS +BEE5;BEE5;1108 1165 11BC;BEE5;1108 1165 11BC; # (뻥; 뻥; 뻥; 뻥; 뻥; ) HANGUL SYLLABLE BBEONG +BEE6;BEE6;1108 1165 11BD;BEE6;1108 1165 11BD; # (뻦; 뻦; 뻦; 뻦; 뻦; ) HANGUL SYLLABLE BBEOJ +BEE7;BEE7;1108 1165 11BE;BEE7;1108 1165 11BE; # (뻧; 뻧; 뻧; 뻧; 뻧; ) HANGUL SYLLABLE BBEOC +BEE8;BEE8;1108 1165 11BF;BEE8;1108 1165 11BF; # (뻨; 뻨; 뻨; 뻨; 뻨; ) HANGUL SYLLABLE BBEOK +BEE9;BEE9;1108 1165 11C0;BEE9;1108 1165 11C0; # (뻩; 뻩; 뻩; 뻩; 뻩; ) HANGUL SYLLABLE BBEOT +BEEA;BEEA;1108 1165 11C1;BEEA;1108 1165 11C1; # (뻪; 뻪; 뻪; 뻪; 뻪; ) HANGUL SYLLABLE BBEOP +BEEB;BEEB;1108 1165 11C2;BEEB;1108 1165 11C2; # (뻫; 뻫; 뻫; 뻫; 뻫; ) HANGUL SYLLABLE BBEOH +BEEC;BEEC;1108 1166;BEEC;1108 1166; # (뻬; 뻬; 뻬; 뻬; 뻬; ) HANGUL SYLLABLE BBE +BEED;BEED;1108 1166 11A8;BEED;1108 1166 11A8; # (뻭; 뻭; 뻭; 뻭; 뻭; ) HANGUL SYLLABLE BBEG +BEEE;BEEE;1108 1166 11A9;BEEE;1108 1166 11A9; # (뻮; 뻮; 뻮; 뻮; 뻮; ) HANGUL SYLLABLE BBEGG +BEEF;BEEF;1108 1166 11AA;BEEF;1108 1166 11AA; # (뻯; 뻯; 뻯; 뻯; 뻯; ) HANGUL SYLLABLE BBEGS +BEF0;BEF0;1108 1166 11AB;BEF0;1108 1166 11AB; # (뻰; 뻰; 뻰; 뻰; 뻰; ) HANGUL SYLLABLE BBEN +BEF1;BEF1;1108 1166 11AC;BEF1;1108 1166 11AC; # (뻱; 뻱; 뻱; 뻱; 뻱; ) HANGUL SYLLABLE BBENJ +BEF2;BEF2;1108 1166 11AD;BEF2;1108 1166 11AD; # (뻲; 뻲; 뻲; 뻲; 뻲; ) HANGUL SYLLABLE BBENH +BEF3;BEF3;1108 1166 11AE;BEF3;1108 1166 11AE; # (뻳; 뻳; 뻳; 뻳; 뻳; ) HANGUL SYLLABLE BBED +BEF4;BEF4;1108 1166 11AF;BEF4;1108 1166 11AF; # (뻴; 뻴; 뻴; 뻴; 뻴; ) HANGUL SYLLABLE BBEL +BEF5;BEF5;1108 1166 11B0;BEF5;1108 1166 11B0; # (뻵; 뻵; 뻵; 뻵; 뻵; ) HANGUL SYLLABLE BBELG +BEF6;BEF6;1108 1166 11B1;BEF6;1108 1166 11B1; # (뻶; 뻶; 뻶; 뻶; 뻶; ) HANGUL SYLLABLE BBELM +BEF7;BEF7;1108 1166 11B2;BEF7;1108 1166 11B2; # (뻷; 뻷; 뻷; 뻷; 뻷; ) HANGUL SYLLABLE BBELB +BEF8;BEF8;1108 1166 11B3;BEF8;1108 1166 11B3; # (뻸; 뻸; 뻸; 뻸; 뻸; ) HANGUL SYLLABLE BBELS +BEF9;BEF9;1108 1166 11B4;BEF9;1108 1166 11B4; # (뻹; 뻹; 뻹; 뻹; 뻹; ) HANGUL SYLLABLE BBELT +BEFA;BEFA;1108 1166 11B5;BEFA;1108 1166 11B5; # (뻺; 뻺; 뻺; 뻺; 뻺; ) HANGUL SYLLABLE BBELP +BEFB;BEFB;1108 1166 11B6;BEFB;1108 1166 11B6; # (뻻; 뻻; 뻻; 뻻; 뻻; ) HANGUL SYLLABLE BBELH +BEFC;BEFC;1108 1166 11B7;BEFC;1108 1166 11B7; # (뻼; 뻼; 뻼; 뻼; 뻼; ) HANGUL SYLLABLE BBEM +BEFD;BEFD;1108 1166 11B8;BEFD;1108 1166 11B8; # (뻽; 뻽; 뻽; 뻽; 뻽; ) HANGUL SYLLABLE BBEB +BEFE;BEFE;1108 1166 11B9;BEFE;1108 1166 11B9; # (뻾; 뻾; 뻾; 뻾; 뻾; ) HANGUL SYLLABLE BBEBS +BEFF;BEFF;1108 1166 11BA;BEFF;1108 1166 11BA; # (뻿; 뻿; 뻿; 뻿; 뻿; ) HANGUL SYLLABLE BBES +BF00;BF00;1108 1166 11BB;BF00;1108 1166 11BB; # (뼀; 뼀; 뼀; 뼀; 뼀; ) HANGUL SYLLABLE BBESS +BF01;BF01;1108 1166 11BC;BF01;1108 1166 11BC; # (뼁; 뼁; 뼁; 뼁; 뼁; ) HANGUL SYLLABLE BBENG +BF02;BF02;1108 1166 11BD;BF02;1108 1166 11BD; # (뼂; 뼂; 뼂; 뼂; 뼂; ) HANGUL SYLLABLE BBEJ +BF03;BF03;1108 1166 11BE;BF03;1108 1166 11BE; # (뼃; 뼃; 뼃; 뼃; 뼃; ) HANGUL SYLLABLE BBEC +BF04;BF04;1108 1166 11BF;BF04;1108 1166 11BF; # (뼄; 뼄; 뼄; 뼄; 뼄; ) HANGUL SYLLABLE BBEK +BF05;BF05;1108 1166 11C0;BF05;1108 1166 11C0; # (뼅; 뼅; 뼅; 뼅; 뼅; ) HANGUL SYLLABLE BBET +BF06;BF06;1108 1166 11C1;BF06;1108 1166 11C1; # (뼆; 뼆; 뼆; 뼆; 뼆; ) HANGUL SYLLABLE BBEP +BF07;BF07;1108 1166 11C2;BF07;1108 1166 11C2; # (뼇; 뼇; 뼇; 뼇; 뼇; ) HANGUL SYLLABLE BBEH +BF08;BF08;1108 1167;BF08;1108 1167; # (뼈; 뼈; 뼈; 뼈; 뼈; ) HANGUL SYLLABLE BBYEO +BF09;BF09;1108 1167 11A8;BF09;1108 1167 11A8; # (뼉; 뼉; 뼉; 뼉; 뼉; ) HANGUL SYLLABLE BBYEOG +BF0A;BF0A;1108 1167 11A9;BF0A;1108 1167 11A9; # (뼊; 뼊; 뼊; 뼊; 뼊; ) HANGUL SYLLABLE BBYEOGG +BF0B;BF0B;1108 1167 11AA;BF0B;1108 1167 11AA; # (뼋; 뼋; 뼋; 뼋; 뼋; ) HANGUL SYLLABLE BBYEOGS +BF0C;BF0C;1108 1167 11AB;BF0C;1108 1167 11AB; # (뼌; 뼌; 뼌; 뼌; 뼌; ) HANGUL SYLLABLE BBYEON +BF0D;BF0D;1108 1167 11AC;BF0D;1108 1167 11AC; # (뼍; 뼍; 뼍; 뼍; 뼍; ) HANGUL SYLLABLE BBYEONJ +BF0E;BF0E;1108 1167 11AD;BF0E;1108 1167 11AD; # (뼎; 뼎; 뼎; 뼎; 뼎; ) HANGUL SYLLABLE BBYEONH +BF0F;BF0F;1108 1167 11AE;BF0F;1108 1167 11AE; # (뼏; 뼏; 뼏; 뼏; 뼏; ) HANGUL SYLLABLE BBYEOD +BF10;BF10;1108 1167 11AF;BF10;1108 1167 11AF; # (뼐; 뼐; 뼐; 뼐; 뼐; ) HANGUL SYLLABLE BBYEOL +BF11;BF11;1108 1167 11B0;BF11;1108 1167 11B0; # (뼑; 뼑; 뼑; 뼑; 뼑; ) HANGUL SYLLABLE BBYEOLG +BF12;BF12;1108 1167 11B1;BF12;1108 1167 11B1; # (뼒; 뼒; 뼒; 뼒; 뼒; ) HANGUL SYLLABLE BBYEOLM +BF13;BF13;1108 1167 11B2;BF13;1108 1167 11B2; # (뼓; 뼓; 뼓; 뼓; 뼓; ) HANGUL SYLLABLE BBYEOLB +BF14;BF14;1108 1167 11B3;BF14;1108 1167 11B3; # (뼔; 뼔; 뼔; 뼔; 뼔; ) HANGUL SYLLABLE BBYEOLS +BF15;BF15;1108 1167 11B4;BF15;1108 1167 11B4; # (뼕; 뼕; 뼕; 뼕; 뼕; ) HANGUL SYLLABLE BBYEOLT +BF16;BF16;1108 1167 11B5;BF16;1108 1167 11B5; # (뼖; 뼖; 뼖; 뼖; 뼖; ) HANGUL SYLLABLE BBYEOLP +BF17;BF17;1108 1167 11B6;BF17;1108 1167 11B6; # (뼗; 뼗; 뼗; 뼗; 뼗; ) HANGUL SYLLABLE BBYEOLH +BF18;BF18;1108 1167 11B7;BF18;1108 1167 11B7; # (뼘; 뼘; 뼘; 뼘; 뼘; ) HANGUL SYLLABLE BBYEOM +BF19;BF19;1108 1167 11B8;BF19;1108 1167 11B8; # (뼙; 뼙; 뼙; 뼙; 뼙; ) HANGUL SYLLABLE BBYEOB +BF1A;BF1A;1108 1167 11B9;BF1A;1108 1167 11B9; # (뼚; 뼚; 뼚; 뼚; 뼚; ) HANGUL SYLLABLE BBYEOBS +BF1B;BF1B;1108 1167 11BA;BF1B;1108 1167 11BA; # (뼛; 뼛; 뼛; 뼛; 뼛; ) HANGUL SYLLABLE BBYEOS +BF1C;BF1C;1108 1167 11BB;BF1C;1108 1167 11BB; # (뼜; 뼜; 뼜; 뼜; 뼜; ) HANGUL SYLLABLE BBYEOSS +BF1D;BF1D;1108 1167 11BC;BF1D;1108 1167 11BC; # (뼝; 뼝; 뼝; 뼝; 뼝; ) HANGUL SYLLABLE BBYEONG +BF1E;BF1E;1108 1167 11BD;BF1E;1108 1167 11BD; # (뼞; 뼞; 뼞; 뼞; 뼞; ) HANGUL SYLLABLE BBYEOJ +BF1F;BF1F;1108 1167 11BE;BF1F;1108 1167 11BE; # (뼟; 뼟; 뼟; 뼟; 뼟; ) HANGUL SYLLABLE BBYEOC +BF20;BF20;1108 1167 11BF;BF20;1108 1167 11BF; # (뼠; 뼠; 뼠; 뼠; 뼠; ) HANGUL SYLLABLE BBYEOK +BF21;BF21;1108 1167 11C0;BF21;1108 1167 11C0; # (뼡; 뼡; 뼡; 뼡; 뼡; ) HANGUL SYLLABLE BBYEOT +BF22;BF22;1108 1167 11C1;BF22;1108 1167 11C1; # (뼢; 뼢; 뼢; 뼢; 뼢; ) HANGUL SYLLABLE BBYEOP +BF23;BF23;1108 1167 11C2;BF23;1108 1167 11C2; # (뼣; 뼣; 뼣; 뼣; 뼣; ) HANGUL SYLLABLE BBYEOH +BF24;BF24;1108 1168;BF24;1108 1168; # (뼤; 뼤; 뼤; 뼤; 뼤; ) HANGUL SYLLABLE BBYE +BF25;BF25;1108 1168 11A8;BF25;1108 1168 11A8; # (뼥; 뼥; 뼥; 뼥; 뼥; ) HANGUL SYLLABLE BBYEG +BF26;BF26;1108 1168 11A9;BF26;1108 1168 11A9; # (뼦; 뼦; 뼦; 뼦; 뼦; ) HANGUL SYLLABLE BBYEGG +BF27;BF27;1108 1168 11AA;BF27;1108 1168 11AA; # (뼧; 뼧; 뼧; 뼧; 뼧; ) HANGUL SYLLABLE BBYEGS +BF28;BF28;1108 1168 11AB;BF28;1108 1168 11AB; # (뼨; 뼨; 뼨; 뼨; 뼨; ) HANGUL SYLLABLE BBYEN +BF29;BF29;1108 1168 11AC;BF29;1108 1168 11AC; # (뼩; 뼩; 뼩; 뼩; 뼩; ) HANGUL SYLLABLE BBYENJ +BF2A;BF2A;1108 1168 11AD;BF2A;1108 1168 11AD; # (뼪; 뼪; 뼪; 뼪; 뼪; ) HANGUL SYLLABLE BBYENH +BF2B;BF2B;1108 1168 11AE;BF2B;1108 1168 11AE; # (뼫; 뼫; 뼫; 뼫; 뼫; ) HANGUL SYLLABLE BBYED +BF2C;BF2C;1108 1168 11AF;BF2C;1108 1168 11AF; # (뼬; 뼬; 뼬; 뼬; 뼬; ) HANGUL SYLLABLE BBYEL +BF2D;BF2D;1108 1168 11B0;BF2D;1108 1168 11B0; # (뼭; 뼭; 뼭; 뼭; 뼭; ) HANGUL SYLLABLE BBYELG +BF2E;BF2E;1108 1168 11B1;BF2E;1108 1168 11B1; # (뼮; 뼮; 뼮; 뼮; 뼮; ) HANGUL SYLLABLE BBYELM +BF2F;BF2F;1108 1168 11B2;BF2F;1108 1168 11B2; # (뼯; 뼯; 뼯; 뼯; 뼯; ) HANGUL SYLLABLE BBYELB +BF30;BF30;1108 1168 11B3;BF30;1108 1168 11B3; # (뼰; 뼰; 뼰; 뼰; 뼰; ) HANGUL SYLLABLE BBYELS +BF31;BF31;1108 1168 11B4;BF31;1108 1168 11B4; # (뼱; 뼱; 뼱; 뼱; 뼱; ) HANGUL SYLLABLE BBYELT +BF32;BF32;1108 1168 11B5;BF32;1108 1168 11B5; # (뼲; 뼲; 뼲; 뼲; 뼲; ) HANGUL SYLLABLE BBYELP +BF33;BF33;1108 1168 11B6;BF33;1108 1168 11B6; # (뼳; 뼳; 뼳; 뼳; 뼳; ) HANGUL SYLLABLE BBYELH +BF34;BF34;1108 1168 11B7;BF34;1108 1168 11B7; # (뼴; 뼴; 뼴; 뼴; 뼴; ) HANGUL SYLLABLE BBYEM +BF35;BF35;1108 1168 11B8;BF35;1108 1168 11B8; # (뼵; 뼵; 뼵; 뼵; 뼵; ) HANGUL SYLLABLE BBYEB +BF36;BF36;1108 1168 11B9;BF36;1108 1168 11B9; # (뼶; 뼶; 뼶; 뼶; 뼶; ) HANGUL SYLLABLE BBYEBS +BF37;BF37;1108 1168 11BA;BF37;1108 1168 11BA; # (뼷; 뼷; 뼷; 뼷; 뼷; ) HANGUL SYLLABLE BBYES +BF38;BF38;1108 1168 11BB;BF38;1108 1168 11BB; # (뼸; 뼸; 뼸; 뼸; 뼸; ) HANGUL SYLLABLE BBYESS +BF39;BF39;1108 1168 11BC;BF39;1108 1168 11BC; # (뼹; 뼹; 뼹; 뼹; 뼹; ) HANGUL SYLLABLE BBYENG +BF3A;BF3A;1108 1168 11BD;BF3A;1108 1168 11BD; # (뼺; 뼺; 뼺; 뼺; 뼺; ) HANGUL SYLLABLE BBYEJ +BF3B;BF3B;1108 1168 11BE;BF3B;1108 1168 11BE; # (뼻; 뼻; 뼻; 뼻; 뼻; ) HANGUL SYLLABLE BBYEC +BF3C;BF3C;1108 1168 11BF;BF3C;1108 1168 11BF; # (뼼; 뼼; 뼼; 뼼; 뼼; ) HANGUL SYLLABLE BBYEK +BF3D;BF3D;1108 1168 11C0;BF3D;1108 1168 11C0; # (뼽; 뼽; 뼽; 뼽; 뼽; ) HANGUL SYLLABLE BBYET +BF3E;BF3E;1108 1168 11C1;BF3E;1108 1168 11C1; # (뼾; 뼾; 뼾; 뼾; 뼾; ) HANGUL SYLLABLE BBYEP +BF3F;BF3F;1108 1168 11C2;BF3F;1108 1168 11C2; # (뼿; 뼿; 뼿; 뼿; 뼿; ) HANGUL SYLLABLE BBYEH +BF40;BF40;1108 1169;BF40;1108 1169; # (뽀; 뽀; 뽀; 뽀; 뽀; ) HANGUL SYLLABLE BBO +BF41;BF41;1108 1169 11A8;BF41;1108 1169 11A8; # (뽁; 뽁; 뽁; 뽁; 뽁; ) HANGUL SYLLABLE BBOG +BF42;BF42;1108 1169 11A9;BF42;1108 1169 11A9; # (뽂; 뽂; 뽂; 뽂; 뽂; ) HANGUL SYLLABLE BBOGG +BF43;BF43;1108 1169 11AA;BF43;1108 1169 11AA; # (뽃; 뽃; 뽃; 뽃; 뽃; ) HANGUL SYLLABLE BBOGS +BF44;BF44;1108 1169 11AB;BF44;1108 1169 11AB; # (뽄; 뽄; 뽄; 뽄; 뽄; ) HANGUL SYLLABLE BBON +BF45;BF45;1108 1169 11AC;BF45;1108 1169 11AC; # (뽅; 뽅; 뽅; 뽅; 뽅; ) HANGUL SYLLABLE BBONJ +BF46;BF46;1108 1169 11AD;BF46;1108 1169 11AD; # (뽆; 뽆; 뽆; 뽆; 뽆; ) HANGUL SYLLABLE BBONH +BF47;BF47;1108 1169 11AE;BF47;1108 1169 11AE; # (뽇; 뽇; 뽇; 뽇; 뽇; ) HANGUL SYLLABLE BBOD +BF48;BF48;1108 1169 11AF;BF48;1108 1169 11AF; # (뽈; 뽈; 뽈; 뽈; 뽈; ) HANGUL SYLLABLE BBOL +BF49;BF49;1108 1169 11B0;BF49;1108 1169 11B0; # (뽉; 뽉; 뽉; 뽉; 뽉; ) HANGUL SYLLABLE BBOLG +BF4A;BF4A;1108 1169 11B1;BF4A;1108 1169 11B1; # (뽊; 뽊; 뽊; 뽊; 뽊; ) HANGUL SYLLABLE BBOLM +BF4B;BF4B;1108 1169 11B2;BF4B;1108 1169 11B2; # (뽋; 뽋; 뽋; 뽋; 뽋; ) HANGUL SYLLABLE BBOLB +BF4C;BF4C;1108 1169 11B3;BF4C;1108 1169 11B3; # (뽌; 뽌; 뽌; 뽌; 뽌; ) HANGUL SYLLABLE BBOLS +BF4D;BF4D;1108 1169 11B4;BF4D;1108 1169 11B4; # (뽍; 뽍; 뽍; 뽍; 뽍; ) HANGUL SYLLABLE BBOLT +BF4E;BF4E;1108 1169 11B5;BF4E;1108 1169 11B5; # (뽎; 뽎; 뽎; 뽎; 뽎; ) HANGUL SYLLABLE BBOLP +BF4F;BF4F;1108 1169 11B6;BF4F;1108 1169 11B6; # (뽏; 뽏; 뽏; 뽏; 뽏; ) HANGUL SYLLABLE BBOLH +BF50;BF50;1108 1169 11B7;BF50;1108 1169 11B7; # (뽐; 뽐; 뽐; 뽐; 뽐; ) HANGUL SYLLABLE BBOM +BF51;BF51;1108 1169 11B8;BF51;1108 1169 11B8; # (뽑; 뽑; 뽑; 뽑; 뽑; ) HANGUL SYLLABLE BBOB +BF52;BF52;1108 1169 11B9;BF52;1108 1169 11B9; # (뽒; 뽒; 뽒; 뽒; 뽒; ) HANGUL SYLLABLE BBOBS +BF53;BF53;1108 1169 11BA;BF53;1108 1169 11BA; # (뽓; 뽓; 뽓; 뽓; 뽓; ) HANGUL SYLLABLE BBOS +BF54;BF54;1108 1169 11BB;BF54;1108 1169 11BB; # (뽔; 뽔; 뽔; 뽔; 뽔; ) HANGUL SYLLABLE BBOSS +BF55;BF55;1108 1169 11BC;BF55;1108 1169 11BC; # (뽕; 뽕; 뽕; 뽕; 뽕; ) HANGUL SYLLABLE BBONG +BF56;BF56;1108 1169 11BD;BF56;1108 1169 11BD; # (뽖; 뽖; 뽖; 뽖; 뽖; ) HANGUL SYLLABLE BBOJ +BF57;BF57;1108 1169 11BE;BF57;1108 1169 11BE; # (뽗; 뽗; 뽗; 뽗; 뽗; ) HANGUL SYLLABLE BBOC +BF58;BF58;1108 1169 11BF;BF58;1108 1169 11BF; # (뽘; 뽘; 뽘; 뽘; 뽘; ) HANGUL SYLLABLE BBOK +BF59;BF59;1108 1169 11C0;BF59;1108 1169 11C0; # (뽙; 뽙; 뽙; 뽙; 뽙; ) HANGUL SYLLABLE BBOT +BF5A;BF5A;1108 1169 11C1;BF5A;1108 1169 11C1; # (뽚; 뽚; 뽚; 뽚; 뽚; ) HANGUL SYLLABLE BBOP +BF5B;BF5B;1108 1169 11C2;BF5B;1108 1169 11C2; # (뽛; 뽛; 뽛; 뽛; 뽛; ) HANGUL SYLLABLE BBOH +BF5C;BF5C;1108 116A;BF5C;1108 116A; # (뽜; 뽜; 뽜; 뽜; 뽜; ) HANGUL SYLLABLE BBWA +BF5D;BF5D;1108 116A 11A8;BF5D;1108 116A 11A8; # (뽝; 뽝; 뽝; 뽝; 뽝; ) HANGUL SYLLABLE BBWAG +BF5E;BF5E;1108 116A 11A9;BF5E;1108 116A 11A9; # (뽞; 뽞; 뽞; 뽞; 뽞; ) HANGUL SYLLABLE BBWAGG +BF5F;BF5F;1108 116A 11AA;BF5F;1108 116A 11AA; # (뽟; 뽟; 뽟; 뽟; 뽟; ) HANGUL SYLLABLE BBWAGS +BF60;BF60;1108 116A 11AB;BF60;1108 116A 11AB; # (뽠; 뽠; 뽠; 뽠; 뽠; ) HANGUL SYLLABLE BBWAN +BF61;BF61;1108 116A 11AC;BF61;1108 116A 11AC; # (뽡; 뽡; 뽡; 뽡; 뽡; ) HANGUL SYLLABLE BBWANJ +BF62;BF62;1108 116A 11AD;BF62;1108 116A 11AD; # (뽢; 뽢; 뽢; 뽢; 뽢; ) HANGUL SYLLABLE BBWANH +BF63;BF63;1108 116A 11AE;BF63;1108 116A 11AE; # (뽣; 뽣; 뽣; 뽣; 뽣; ) HANGUL SYLLABLE BBWAD +BF64;BF64;1108 116A 11AF;BF64;1108 116A 11AF; # (뽤; 뽤; 뽤; 뽤; 뽤; ) HANGUL SYLLABLE BBWAL +BF65;BF65;1108 116A 11B0;BF65;1108 116A 11B0; # (뽥; 뽥; 뽥; 뽥; 뽥; ) HANGUL SYLLABLE BBWALG +BF66;BF66;1108 116A 11B1;BF66;1108 116A 11B1; # (뽦; 뽦; 뽦; 뽦; 뽦; ) HANGUL SYLLABLE BBWALM +BF67;BF67;1108 116A 11B2;BF67;1108 116A 11B2; # (뽧; 뽧; 뽧; 뽧; 뽧; ) HANGUL SYLLABLE BBWALB +BF68;BF68;1108 116A 11B3;BF68;1108 116A 11B3; # (뽨; 뽨; 뽨; 뽨; 뽨; ) HANGUL SYLLABLE BBWALS +BF69;BF69;1108 116A 11B4;BF69;1108 116A 11B4; # (뽩; 뽩; 뽩; 뽩; 뽩; ) HANGUL SYLLABLE BBWALT +BF6A;BF6A;1108 116A 11B5;BF6A;1108 116A 11B5; # (뽪; 뽪; 뽪; 뽪; 뽪; ) HANGUL SYLLABLE BBWALP +BF6B;BF6B;1108 116A 11B6;BF6B;1108 116A 11B6; # (뽫; 뽫; 뽫; 뽫; 뽫; ) HANGUL SYLLABLE BBWALH +BF6C;BF6C;1108 116A 11B7;BF6C;1108 116A 11B7; # (뽬; 뽬; 뽬; 뽬; 뽬; ) HANGUL SYLLABLE BBWAM +BF6D;BF6D;1108 116A 11B8;BF6D;1108 116A 11B8; # (뽭; 뽭; 뽭; 뽭; 뽭; ) HANGUL SYLLABLE BBWAB +BF6E;BF6E;1108 116A 11B9;BF6E;1108 116A 11B9; # (뽮; 뽮; 뽮; 뽮; 뽮; ) HANGUL SYLLABLE BBWABS +BF6F;BF6F;1108 116A 11BA;BF6F;1108 116A 11BA; # (뽯; 뽯; 뽯; 뽯; 뽯; ) HANGUL SYLLABLE BBWAS +BF70;BF70;1108 116A 11BB;BF70;1108 116A 11BB; # (뽰; 뽰; 뽰; 뽰; 뽰; ) HANGUL SYLLABLE BBWASS +BF71;BF71;1108 116A 11BC;BF71;1108 116A 11BC; # (뽱; 뽱; 뽱; 뽱; 뽱; ) HANGUL SYLLABLE BBWANG +BF72;BF72;1108 116A 11BD;BF72;1108 116A 11BD; # (뽲; 뽲; 뽲; 뽲; 뽲; ) HANGUL SYLLABLE BBWAJ +BF73;BF73;1108 116A 11BE;BF73;1108 116A 11BE; # (뽳; 뽳; 뽳; 뽳; 뽳; ) HANGUL SYLLABLE BBWAC +BF74;BF74;1108 116A 11BF;BF74;1108 116A 11BF; # (뽴; 뽴; 뽴; 뽴; 뽴; ) HANGUL SYLLABLE BBWAK +BF75;BF75;1108 116A 11C0;BF75;1108 116A 11C0; # (뽵; 뽵; 뽵; 뽵; 뽵; ) HANGUL SYLLABLE BBWAT +BF76;BF76;1108 116A 11C1;BF76;1108 116A 11C1; # (뽶; 뽶; 뽶; 뽶; 뽶; ) HANGUL SYLLABLE BBWAP +BF77;BF77;1108 116A 11C2;BF77;1108 116A 11C2; # (뽷; 뽷; 뽷; 뽷; 뽷; ) HANGUL SYLLABLE BBWAH +BF78;BF78;1108 116B;BF78;1108 116B; # (뽸; 뽸; 뽸; 뽸; 뽸; ) HANGUL SYLLABLE BBWAE +BF79;BF79;1108 116B 11A8;BF79;1108 116B 11A8; # (뽹; 뽹; 뽹; 뽹; 뽹; ) HANGUL SYLLABLE BBWAEG +BF7A;BF7A;1108 116B 11A9;BF7A;1108 116B 11A9; # (뽺; 뽺; 뽺; 뽺; 뽺; ) HANGUL SYLLABLE BBWAEGG +BF7B;BF7B;1108 116B 11AA;BF7B;1108 116B 11AA; # (뽻; 뽻; 뽻; 뽻; 뽻; ) HANGUL SYLLABLE BBWAEGS +BF7C;BF7C;1108 116B 11AB;BF7C;1108 116B 11AB; # (뽼; 뽼; 뽼; 뽼; 뽼; ) HANGUL SYLLABLE BBWAEN +BF7D;BF7D;1108 116B 11AC;BF7D;1108 116B 11AC; # (뽽; 뽽; 뽽; 뽽; 뽽; ) HANGUL SYLLABLE BBWAENJ +BF7E;BF7E;1108 116B 11AD;BF7E;1108 116B 11AD; # (뽾; 뽾; 뽾; 뽾; 뽾; ) HANGUL SYLLABLE BBWAENH +BF7F;BF7F;1108 116B 11AE;BF7F;1108 116B 11AE; # (뽿; 뽿; 뽿; 뽿; 뽿; ) HANGUL SYLLABLE BBWAED +BF80;BF80;1108 116B 11AF;BF80;1108 116B 11AF; # (뾀; 뾀; 뾀; 뾀; 뾀; ) HANGUL SYLLABLE BBWAEL +BF81;BF81;1108 116B 11B0;BF81;1108 116B 11B0; # (뾁; 뾁; 뾁; 뾁; 뾁; ) HANGUL SYLLABLE BBWAELG +BF82;BF82;1108 116B 11B1;BF82;1108 116B 11B1; # (뾂; 뾂; 뾂; 뾂; 뾂; ) HANGUL SYLLABLE BBWAELM +BF83;BF83;1108 116B 11B2;BF83;1108 116B 11B2; # (뾃; 뾃; 뾃; 뾃; 뾃; ) HANGUL SYLLABLE BBWAELB +BF84;BF84;1108 116B 11B3;BF84;1108 116B 11B3; # (뾄; 뾄; 뾄; 뾄; 뾄; ) HANGUL SYLLABLE BBWAELS +BF85;BF85;1108 116B 11B4;BF85;1108 116B 11B4; # (뾅; 뾅; 뾅; 뾅; 뾅; ) HANGUL SYLLABLE BBWAELT +BF86;BF86;1108 116B 11B5;BF86;1108 116B 11B5; # (뾆; 뾆; 뾆; 뾆; 뾆; ) HANGUL SYLLABLE BBWAELP +BF87;BF87;1108 116B 11B6;BF87;1108 116B 11B6; # (뾇; 뾇; 뾇; 뾇; 뾇; ) HANGUL SYLLABLE BBWAELH +BF88;BF88;1108 116B 11B7;BF88;1108 116B 11B7; # (뾈; 뾈; 뾈; 뾈; 뾈; ) HANGUL SYLLABLE BBWAEM +BF89;BF89;1108 116B 11B8;BF89;1108 116B 11B8; # (뾉; 뾉; 뾉; 뾉; 뾉; ) HANGUL SYLLABLE BBWAEB +BF8A;BF8A;1108 116B 11B9;BF8A;1108 116B 11B9; # (뾊; 뾊; 뾊; 뾊; 뾊; ) HANGUL SYLLABLE BBWAEBS +BF8B;BF8B;1108 116B 11BA;BF8B;1108 116B 11BA; # (뾋; 뾋; 뾋; 뾋; 뾋; ) HANGUL SYLLABLE BBWAES +BF8C;BF8C;1108 116B 11BB;BF8C;1108 116B 11BB; # (뾌; 뾌; 뾌; 뾌; 뾌; ) HANGUL SYLLABLE BBWAESS +BF8D;BF8D;1108 116B 11BC;BF8D;1108 116B 11BC; # (뾍; 뾍; 뾍; 뾍; 뾍; ) HANGUL SYLLABLE BBWAENG +BF8E;BF8E;1108 116B 11BD;BF8E;1108 116B 11BD; # (뾎; 뾎; 뾎; 뾎; 뾎; ) HANGUL SYLLABLE BBWAEJ +BF8F;BF8F;1108 116B 11BE;BF8F;1108 116B 11BE; # (뾏; 뾏; 뾏; 뾏; 뾏; ) HANGUL SYLLABLE BBWAEC +BF90;BF90;1108 116B 11BF;BF90;1108 116B 11BF; # (뾐; 뾐; 뾐; 뾐; 뾐; ) HANGUL SYLLABLE BBWAEK +BF91;BF91;1108 116B 11C0;BF91;1108 116B 11C0; # (뾑; 뾑; 뾑; 뾑; 뾑; ) HANGUL SYLLABLE BBWAET +BF92;BF92;1108 116B 11C1;BF92;1108 116B 11C1; # (뾒; 뾒; 뾒; 뾒; 뾒; ) HANGUL SYLLABLE BBWAEP +BF93;BF93;1108 116B 11C2;BF93;1108 116B 11C2; # (뾓; 뾓; 뾓; 뾓; 뾓; ) HANGUL SYLLABLE BBWAEH +BF94;BF94;1108 116C;BF94;1108 116C; # (뾔; 뾔; 뾔; 뾔; 뾔; ) HANGUL SYLLABLE BBOE +BF95;BF95;1108 116C 11A8;BF95;1108 116C 11A8; # (뾕; 뾕; 뾕; 뾕; 뾕; ) HANGUL SYLLABLE BBOEG +BF96;BF96;1108 116C 11A9;BF96;1108 116C 11A9; # (뾖; 뾖; 뾖; 뾖; 뾖; ) HANGUL SYLLABLE BBOEGG +BF97;BF97;1108 116C 11AA;BF97;1108 116C 11AA; # (뾗; 뾗; 뾗; 뾗; 뾗; ) HANGUL SYLLABLE BBOEGS +BF98;BF98;1108 116C 11AB;BF98;1108 116C 11AB; # (뾘; 뾘; 뾘; 뾘; 뾘; ) HANGUL SYLLABLE BBOEN +BF99;BF99;1108 116C 11AC;BF99;1108 116C 11AC; # (뾙; 뾙; 뾙; 뾙; 뾙; ) HANGUL SYLLABLE BBOENJ +BF9A;BF9A;1108 116C 11AD;BF9A;1108 116C 11AD; # (뾚; 뾚; 뾚; 뾚; 뾚; ) HANGUL SYLLABLE BBOENH +BF9B;BF9B;1108 116C 11AE;BF9B;1108 116C 11AE; # (뾛; 뾛; 뾛; 뾛; 뾛; ) HANGUL SYLLABLE BBOED +BF9C;BF9C;1108 116C 11AF;BF9C;1108 116C 11AF; # (뾜; 뾜; 뾜; 뾜; 뾜; ) HANGUL SYLLABLE BBOEL +BF9D;BF9D;1108 116C 11B0;BF9D;1108 116C 11B0; # (뾝; 뾝; 뾝; 뾝; 뾝; ) HANGUL SYLLABLE BBOELG +BF9E;BF9E;1108 116C 11B1;BF9E;1108 116C 11B1; # (뾞; 뾞; 뾞; 뾞; 뾞; ) HANGUL SYLLABLE BBOELM +BF9F;BF9F;1108 116C 11B2;BF9F;1108 116C 11B2; # (뾟; 뾟; 뾟; 뾟; 뾟; ) HANGUL SYLLABLE BBOELB +BFA0;BFA0;1108 116C 11B3;BFA0;1108 116C 11B3; # (뾠; 뾠; 뾠; 뾠; 뾠; ) HANGUL SYLLABLE BBOELS +BFA1;BFA1;1108 116C 11B4;BFA1;1108 116C 11B4; # (뾡; 뾡; 뾡; 뾡; 뾡; ) HANGUL SYLLABLE BBOELT +BFA2;BFA2;1108 116C 11B5;BFA2;1108 116C 11B5; # (뾢; 뾢; 뾢; 뾢; 뾢; ) HANGUL SYLLABLE BBOELP +BFA3;BFA3;1108 116C 11B6;BFA3;1108 116C 11B6; # (뾣; 뾣; 뾣; 뾣; 뾣; ) HANGUL SYLLABLE BBOELH +BFA4;BFA4;1108 116C 11B7;BFA4;1108 116C 11B7; # (뾤; 뾤; 뾤; 뾤; 뾤; ) HANGUL SYLLABLE BBOEM +BFA5;BFA5;1108 116C 11B8;BFA5;1108 116C 11B8; # (뾥; 뾥; 뾥; 뾥; 뾥; ) HANGUL SYLLABLE BBOEB +BFA6;BFA6;1108 116C 11B9;BFA6;1108 116C 11B9; # (뾦; 뾦; 뾦; 뾦; 뾦; ) HANGUL SYLLABLE BBOEBS +BFA7;BFA7;1108 116C 11BA;BFA7;1108 116C 11BA; # (뾧; 뾧; 뾧; 뾧; 뾧; ) HANGUL SYLLABLE BBOES +BFA8;BFA8;1108 116C 11BB;BFA8;1108 116C 11BB; # (뾨; 뾨; 뾨; 뾨; 뾨; ) HANGUL SYLLABLE BBOESS +BFA9;BFA9;1108 116C 11BC;BFA9;1108 116C 11BC; # (뾩; 뾩; 뾩; 뾩; 뾩; ) HANGUL SYLLABLE BBOENG +BFAA;BFAA;1108 116C 11BD;BFAA;1108 116C 11BD; # (뾪; 뾪; 뾪; 뾪; 뾪; ) HANGUL SYLLABLE BBOEJ +BFAB;BFAB;1108 116C 11BE;BFAB;1108 116C 11BE; # (뾫; 뾫; 뾫; 뾫; 뾫; ) HANGUL SYLLABLE BBOEC +BFAC;BFAC;1108 116C 11BF;BFAC;1108 116C 11BF; # (뾬; 뾬; 뾬; 뾬; 뾬; ) HANGUL SYLLABLE BBOEK +BFAD;BFAD;1108 116C 11C0;BFAD;1108 116C 11C0; # (뾭; 뾭; 뾭; 뾭; 뾭; ) HANGUL SYLLABLE BBOET +BFAE;BFAE;1108 116C 11C1;BFAE;1108 116C 11C1; # (뾮; 뾮; 뾮; 뾮; 뾮; ) HANGUL SYLLABLE BBOEP +BFAF;BFAF;1108 116C 11C2;BFAF;1108 116C 11C2; # (뾯; 뾯; 뾯; 뾯; 뾯; ) HANGUL SYLLABLE BBOEH +BFB0;BFB0;1108 116D;BFB0;1108 116D; # (뾰; 뾰; 뾰; 뾰; 뾰; ) HANGUL SYLLABLE BBYO +BFB1;BFB1;1108 116D 11A8;BFB1;1108 116D 11A8; # (뾱; 뾱; 뾱; 뾱; 뾱; ) HANGUL SYLLABLE BBYOG +BFB2;BFB2;1108 116D 11A9;BFB2;1108 116D 11A9; # (뾲; 뾲; 뾲; 뾲; 뾲; ) HANGUL SYLLABLE BBYOGG +BFB3;BFB3;1108 116D 11AA;BFB3;1108 116D 11AA; # (뾳; 뾳; 뾳; 뾳; 뾳; ) HANGUL SYLLABLE BBYOGS +BFB4;BFB4;1108 116D 11AB;BFB4;1108 116D 11AB; # (뾴; 뾴; 뾴; 뾴; 뾴; ) HANGUL SYLLABLE BBYON +BFB5;BFB5;1108 116D 11AC;BFB5;1108 116D 11AC; # (뾵; 뾵; 뾵; 뾵; 뾵; ) HANGUL SYLLABLE BBYONJ +BFB6;BFB6;1108 116D 11AD;BFB6;1108 116D 11AD; # (뾶; 뾶; 뾶; 뾶; 뾶; ) HANGUL SYLLABLE BBYONH +BFB7;BFB7;1108 116D 11AE;BFB7;1108 116D 11AE; # (뾷; 뾷; 뾷; 뾷; 뾷; ) HANGUL SYLLABLE BBYOD +BFB8;BFB8;1108 116D 11AF;BFB8;1108 116D 11AF; # (뾸; 뾸; 뾸; 뾸; 뾸; ) HANGUL SYLLABLE BBYOL +BFB9;BFB9;1108 116D 11B0;BFB9;1108 116D 11B0; # (뾹; 뾹; 뾹; 뾹; 뾹; ) HANGUL SYLLABLE BBYOLG +BFBA;BFBA;1108 116D 11B1;BFBA;1108 116D 11B1; # (뾺; 뾺; 뾺; 뾺; 뾺; ) HANGUL SYLLABLE BBYOLM +BFBB;BFBB;1108 116D 11B2;BFBB;1108 116D 11B2; # (뾻; 뾻; 뾻; 뾻; 뾻; ) HANGUL SYLLABLE BBYOLB +BFBC;BFBC;1108 116D 11B3;BFBC;1108 116D 11B3; # (뾼; 뾼; 뾼; 뾼; 뾼; ) HANGUL SYLLABLE BBYOLS +BFBD;BFBD;1108 116D 11B4;BFBD;1108 116D 11B4; # (뾽; 뾽; 뾽; 뾽; 뾽; ) HANGUL SYLLABLE BBYOLT +BFBE;BFBE;1108 116D 11B5;BFBE;1108 116D 11B5; # (뾾; 뾾; 뾾; 뾾; 뾾; ) HANGUL SYLLABLE BBYOLP +BFBF;BFBF;1108 116D 11B6;BFBF;1108 116D 11B6; # (뾿; 뾿; 뾿; 뾿; 뾿; ) HANGUL SYLLABLE BBYOLH +BFC0;BFC0;1108 116D 11B7;BFC0;1108 116D 11B7; # (뿀; 뿀; 뿀; 뿀; 뿀; ) HANGUL SYLLABLE BBYOM +BFC1;BFC1;1108 116D 11B8;BFC1;1108 116D 11B8; # (뿁; 뿁; 뿁; 뿁; 뿁; ) HANGUL SYLLABLE BBYOB +BFC2;BFC2;1108 116D 11B9;BFC2;1108 116D 11B9; # (뿂; 뿂; 뿂; 뿂; 뿂; ) HANGUL SYLLABLE BBYOBS +BFC3;BFC3;1108 116D 11BA;BFC3;1108 116D 11BA; # (뿃; 뿃; 뿃; 뿃; 뿃; ) HANGUL SYLLABLE BBYOS +BFC4;BFC4;1108 116D 11BB;BFC4;1108 116D 11BB; # (뿄; 뿄; 뿄; 뿄; 뿄; ) HANGUL SYLLABLE BBYOSS +BFC5;BFC5;1108 116D 11BC;BFC5;1108 116D 11BC; # (뿅; 뿅; 뿅; 뿅; 뿅; ) HANGUL SYLLABLE BBYONG +BFC6;BFC6;1108 116D 11BD;BFC6;1108 116D 11BD; # (뿆; 뿆; 뿆; 뿆; 뿆; ) HANGUL SYLLABLE BBYOJ +BFC7;BFC7;1108 116D 11BE;BFC7;1108 116D 11BE; # (뿇; 뿇; 뿇; 뿇; 뿇; ) HANGUL SYLLABLE BBYOC +BFC8;BFC8;1108 116D 11BF;BFC8;1108 116D 11BF; # (뿈; 뿈; 뿈; 뿈; 뿈; ) HANGUL SYLLABLE BBYOK +BFC9;BFC9;1108 116D 11C0;BFC9;1108 116D 11C0; # (뿉; 뿉; 뿉; 뿉; 뿉; ) HANGUL SYLLABLE BBYOT +BFCA;BFCA;1108 116D 11C1;BFCA;1108 116D 11C1; # (뿊; 뿊; 뿊; 뿊; 뿊; ) HANGUL SYLLABLE BBYOP +BFCB;BFCB;1108 116D 11C2;BFCB;1108 116D 11C2; # (뿋; 뿋; 뿋; 뿋; 뿋; ) HANGUL SYLLABLE BBYOH +BFCC;BFCC;1108 116E;BFCC;1108 116E; # (뿌; 뿌; 뿌; 뿌; 뿌; ) HANGUL SYLLABLE BBU +BFCD;BFCD;1108 116E 11A8;BFCD;1108 116E 11A8; # (뿍; 뿍; 뿍; 뿍; 뿍; ) HANGUL SYLLABLE BBUG +BFCE;BFCE;1108 116E 11A9;BFCE;1108 116E 11A9; # (뿎; 뿎; 뿎; 뿎; 뿎; ) HANGUL SYLLABLE BBUGG +BFCF;BFCF;1108 116E 11AA;BFCF;1108 116E 11AA; # (뿏; 뿏; 뿏; 뿏; 뿏; ) HANGUL SYLLABLE BBUGS +BFD0;BFD0;1108 116E 11AB;BFD0;1108 116E 11AB; # (뿐; 뿐; 뿐; 뿐; 뿐; ) HANGUL SYLLABLE BBUN +BFD1;BFD1;1108 116E 11AC;BFD1;1108 116E 11AC; # (뿑; 뿑; 뿑; 뿑; 뿑; ) HANGUL SYLLABLE BBUNJ +BFD2;BFD2;1108 116E 11AD;BFD2;1108 116E 11AD; # (뿒; 뿒; 뿒; 뿒; 뿒; ) HANGUL SYLLABLE BBUNH +BFD3;BFD3;1108 116E 11AE;BFD3;1108 116E 11AE; # (뿓; 뿓; 뿓; 뿓; 뿓; ) HANGUL SYLLABLE BBUD +BFD4;BFD4;1108 116E 11AF;BFD4;1108 116E 11AF; # (뿔; 뿔; 뿔; 뿔; 뿔; ) HANGUL SYLLABLE BBUL +BFD5;BFD5;1108 116E 11B0;BFD5;1108 116E 11B0; # (뿕; 뿕; 뿕; 뿕; 뿕; ) HANGUL SYLLABLE BBULG +BFD6;BFD6;1108 116E 11B1;BFD6;1108 116E 11B1; # (뿖; 뿖; 뿖; 뿖; 뿖; ) HANGUL SYLLABLE BBULM +BFD7;BFD7;1108 116E 11B2;BFD7;1108 116E 11B2; # (뿗; 뿗; 뿗; 뿗; 뿗; ) HANGUL SYLLABLE BBULB +BFD8;BFD8;1108 116E 11B3;BFD8;1108 116E 11B3; # (뿘; 뿘; 뿘; 뿘; 뿘; ) HANGUL SYLLABLE BBULS +BFD9;BFD9;1108 116E 11B4;BFD9;1108 116E 11B4; # (뿙; 뿙; 뿙; 뿙; 뿙; ) HANGUL SYLLABLE BBULT +BFDA;BFDA;1108 116E 11B5;BFDA;1108 116E 11B5; # (뿚; 뿚; 뿚; 뿚; 뿚; ) HANGUL SYLLABLE BBULP +BFDB;BFDB;1108 116E 11B6;BFDB;1108 116E 11B6; # (뿛; 뿛; 뿛; 뿛; 뿛; ) HANGUL SYLLABLE BBULH +BFDC;BFDC;1108 116E 11B7;BFDC;1108 116E 11B7; # (뿜; 뿜; 뿜; 뿜; 뿜; ) HANGUL SYLLABLE BBUM +BFDD;BFDD;1108 116E 11B8;BFDD;1108 116E 11B8; # (뿝; 뿝; 뿝; 뿝; 뿝; ) HANGUL SYLLABLE BBUB +BFDE;BFDE;1108 116E 11B9;BFDE;1108 116E 11B9; # (뿞; 뿞; 뿞; 뿞; 뿞; ) HANGUL SYLLABLE BBUBS +BFDF;BFDF;1108 116E 11BA;BFDF;1108 116E 11BA; # (뿟; 뿟; 뿟; 뿟; 뿟; ) HANGUL SYLLABLE BBUS +BFE0;BFE0;1108 116E 11BB;BFE0;1108 116E 11BB; # (뿠; 뿠; 뿠; 뿠; 뿠; ) HANGUL SYLLABLE BBUSS +BFE1;BFE1;1108 116E 11BC;BFE1;1108 116E 11BC; # (뿡; 뿡; 뿡; 뿡; 뿡; ) HANGUL SYLLABLE BBUNG +BFE2;BFE2;1108 116E 11BD;BFE2;1108 116E 11BD; # (뿢; 뿢; 뿢; 뿢; 뿢; ) HANGUL SYLLABLE BBUJ +BFE3;BFE3;1108 116E 11BE;BFE3;1108 116E 11BE; # (뿣; 뿣; 뿣; 뿣; 뿣; ) HANGUL SYLLABLE BBUC +BFE4;BFE4;1108 116E 11BF;BFE4;1108 116E 11BF; # (뿤; 뿤; 뿤; 뿤; 뿤; ) HANGUL SYLLABLE BBUK +BFE5;BFE5;1108 116E 11C0;BFE5;1108 116E 11C0; # (뿥; 뿥; 뿥; 뿥; 뿥; ) HANGUL SYLLABLE BBUT +BFE6;BFE6;1108 116E 11C1;BFE6;1108 116E 11C1; # (뿦; 뿦; 뿦; 뿦; 뿦; ) HANGUL SYLLABLE BBUP +BFE7;BFE7;1108 116E 11C2;BFE7;1108 116E 11C2; # (뿧; 뿧; 뿧; 뿧; 뿧; ) HANGUL SYLLABLE BBUH +BFE8;BFE8;1108 116F;BFE8;1108 116F; # (뿨; 뿨; 뿨; 뿨; 뿨; ) HANGUL SYLLABLE BBWEO +BFE9;BFE9;1108 116F 11A8;BFE9;1108 116F 11A8; # (뿩; 뿩; 뿩; 뿩; 뿩; ) HANGUL SYLLABLE BBWEOG +BFEA;BFEA;1108 116F 11A9;BFEA;1108 116F 11A9; # (뿪; 뿪; 뿪; 뿪; 뿪; ) HANGUL SYLLABLE BBWEOGG +BFEB;BFEB;1108 116F 11AA;BFEB;1108 116F 11AA; # (뿫; 뿫; 뿫; 뿫; 뿫; ) HANGUL SYLLABLE BBWEOGS +BFEC;BFEC;1108 116F 11AB;BFEC;1108 116F 11AB; # (뿬; 뿬; 뿬; 뿬; 뿬; ) HANGUL SYLLABLE BBWEON +BFED;BFED;1108 116F 11AC;BFED;1108 116F 11AC; # (뿭; 뿭; 뿭; 뿭; 뿭; ) HANGUL SYLLABLE BBWEONJ +BFEE;BFEE;1108 116F 11AD;BFEE;1108 116F 11AD; # (뿮; 뿮; 뿮; 뿮; 뿮; ) HANGUL SYLLABLE BBWEONH +BFEF;BFEF;1108 116F 11AE;BFEF;1108 116F 11AE; # (뿯; 뿯; 뿯; 뿯; 뿯; ) HANGUL SYLLABLE BBWEOD +BFF0;BFF0;1108 116F 11AF;BFF0;1108 116F 11AF; # (뿰; 뿰; 뿰; 뿰; 뿰; ) HANGUL SYLLABLE BBWEOL +BFF1;BFF1;1108 116F 11B0;BFF1;1108 116F 11B0; # (뿱; 뿱; 뿱; 뿱; 뿱; ) HANGUL SYLLABLE BBWEOLG +BFF2;BFF2;1108 116F 11B1;BFF2;1108 116F 11B1; # (뿲; 뿲; 뿲; 뿲; 뿲; ) HANGUL SYLLABLE BBWEOLM +BFF3;BFF3;1108 116F 11B2;BFF3;1108 116F 11B2; # (뿳; 뿳; 뿳; 뿳; 뿳; ) HANGUL SYLLABLE BBWEOLB +BFF4;BFF4;1108 116F 11B3;BFF4;1108 116F 11B3; # (뿴; 뿴; 뿴; 뿴; 뿴; ) HANGUL SYLLABLE BBWEOLS +BFF5;BFF5;1108 116F 11B4;BFF5;1108 116F 11B4; # (뿵; 뿵; 뿵; 뿵; 뿵; ) HANGUL SYLLABLE BBWEOLT +BFF6;BFF6;1108 116F 11B5;BFF6;1108 116F 11B5; # (뿶; 뿶; 뿶; 뿶; 뿶; ) HANGUL SYLLABLE BBWEOLP +BFF7;BFF7;1108 116F 11B6;BFF7;1108 116F 11B6; # (뿷; 뿷; 뿷; 뿷; 뿷; ) HANGUL SYLLABLE BBWEOLH +BFF8;BFF8;1108 116F 11B7;BFF8;1108 116F 11B7; # (뿸; 뿸; 뿸; 뿸; 뿸; ) HANGUL SYLLABLE BBWEOM +BFF9;BFF9;1108 116F 11B8;BFF9;1108 116F 11B8; # (뿹; 뿹; 뿹; 뿹; 뿹; ) HANGUL SYLLABLE BBWEOB +BFFA;BFFA;1108 116F 11B9;BFFA;1108 116F 11B9; # (뿺; 뿺; 뿺; 뿺; 뿺; ) HANGUL SYLLABLE BBWEOBS +BFFB;BFFB;1108 116F 11BA;BFFB;1108 116F 11BA; # (뿻; 뿻; 뿻; 뿻; 뿻; ) HANGUL SYLLABLE BBWEOS +BFFC;BFFC;1108 116F 11BB;BFFC;1108 116F 11BB; # (뿼; 뿼; 뿼; 뿼; 뿼; ) HANGUL SYLLABLE BBWEOSS +BFFD;BFFD;1108 116F 11BC;BFFD;1108 116F 11BC; # (뿽; 뿽; 뿽; 뿽; 뿽; ) HANGUL SYLLABLE BBWEONG +BFFE;BFFE;1108 116F 11BD;BFFE;1108 116F 11BD; # (뿾; 뿾; 뿾; 뿾; 뿾; ) HANGUL SYLLABLE BBWEOJ +BFFF;BFFF;1108 116F 11BE;BFFF;1108 116F 11BE; # (뿿; 뿿; 뿿; 뿿; 뿿; ) HANGUL SYLLABLE BBWEOC +C000;C000;1108 116F 11BF;C000;1108 116F 11BF; # (쀀; 쀀; 쀀; 쀀; 쀀; ) HANGUL SYLLABLE BBWEOK +C001;C001;1108 116F 11C0;C001;1108 116F 11C0; # (쀁; 쀁; 쀁; 쀁; 쀁; ) HANGUL SYLLABLE BBWEOT +C002;C002;1108 116F 11C1;C002;1108 116F 11C1; # (쀂; 쀂; 쀂; 쀂; 쀂; ) HANGUL SYLLABLE BBWEOP +C003;C003;1108 116F 11C2;C003;1108 116F 11C2; # (쀃; 쀃; 쀃; 쀃; 쀃; ) HANGUL SYLLABLE BBWEOH +C004;C004;1108 1170;C004;1108 1170; # (쀄; 쀄; 쀄; 쀄; 쀄; ) HANGUL SYLLABLE BBWE +C005;C005;1108 1170 11A8;C005;1108 1170 11A8; # (쀅; 쀅; 쀅; 쀅; 쀅; ) HANGUL SYLLABLE BBWEG +C006;C006;1108 1170 11A9;C006;1108 1170 11A9; # (쀆; 쀆; 쀆; 쀆; 쀆; ) HANGUL SYLLABLE BBWEGG +C007;C007;1108 1170 11AA;C007;1108 1170 11AA; # (쀇; 쀇; 쀇; 쀇; 쀇; ) HANGUL SYLLABLE BBWEGS +C008;C008;1108 1170 11AB;C008;1108 1170 11AB; # (쀈; 쀈; 쀈; 쀈; 쀈; ) HANGUL SYLLABLE BBWEN +C009;C009;1108 1170 11AC;C009;1108 1170 11AC; # (쀉; 쀉; 쀉; 쀉; 쀉; ) HANGUL SYLLABLE BBWENJ +C00A;C00A;1108 1170 11AD;C00A;1108 1170 11AD; # (쀊; 쀊; 쀊; 쀊; 쀊; ) HANGUL SYLLABLE BBWENH +C00B;C00B;1108 1170 11AE;C00B;1108 1170 11AE; # (쀋; 쀋; 쀋; 쀋; 쀋; ) HANGUL SYLLABLE BBWED +C00C;C00C;1108 1170 11AF;C00C;1108 1170 11AF; # (쀌; 쀌; 쀌; 쀌; 쀌; ) HANGUL SYLLABLE BBWEL +C00D;C00D;1108 1170 11B0;C00D;1108 1170 11B0; # (쀍; 쀍; 쀍; 쀍; 쀍; ) HANGUL SYLLABLE BBWELG +C00E;C00E;1108 1170 11B1;C00E;1108 1170 11B1; # (쀎; 쀎; 쀎; 쀎; 쀎; ) HANGUL SYLLABLE BBWELM +C00F;C00F;1108 1170 11B2;C00F;1108 1170 11B2; # (쀏; 쀏; 쀏; 쀏; 쀏; ) HANGUL SYLLABLE BBWELB +C010;C010;1108 1170 11B3;C010;1108 1170 11B3; # (쀐; 쀐; 쀐; 쀐; 쀐; ) HANGUL SYLLABLE BBWELS +C011;C011;1108 1170 11B4;C011;1108 1170 11B4; # (쀑; 쀑; 쀑; 쀑; 쀑; ) HANGUL SYLLABLE BBWELT +C012;C012;1108 1170 11B5;C012;1108 1170 11B5; # (쀒; 쀒; 쀒; 쀒; 쀒; ) HANGUL SYLLABLE BBWELP +C013;C013;1108 1170 11B6;C013;1108 1170 11B6; # (쀓; 쀓; 쀓; 쀓; 쀓; ) HANGUL SYLLABLE BBWELH +C014;C014;1108 1170 11B7;C014;1108 1170 11B7; # (쀔; 쀔; 쀔; 쀔; 쀔; ) HANGUL SYLLABLE BBWEM +C015;C015;1108 1170 11B8;C015;1108 1170 11B8; # (쀕; 쀕; 쀕; 쀕; 쀕; ) HANGUL SYLLABLE BBWEB +C016;C016;1108 1170 11B9;C016;1108 1170 11B9; # (쀖; 쀖; 쀖; 쀖; 쀖; ) HANGUL SYLLABLE BBWEBS +C017;C017;1108 1170 11BA;C017;1108 1170 11BA; # (쀗; 쀗; 쀗; 쀗; 쀗; ) HANGUL SYLLABLE BBWES +C018;C018;1108 1170 11BB;C018;1108 1170 11BB; # (쀘; 쀘; 쀘; 쀘; 쀘; ) HANGUL SYLLABLE BBWESS +C019;C019;1108 1170 11BC;C019;1108 1170 11BC; # (쀙; 쀙; 쀙; 쀙; 쀙; ) HANGUL SYLLABLE BBWENG +C01A;C01A;1108 1170 11BD;C01A;1108 1170 11BD; # (쀚; 쀚; 쀚; 쀚; 쀚; ) HANGUL SYLLABLE BBWEJ +C01B;C01B;1108 1170 11BE;C01B;1108 1170 11BE; # (쀛; 쀛; 쀛; 쀛; 쀛; ) HANGUL SYLLABLE BBWEC +C01C;C01C;1108 1170 11BF;C01C;1108 1170 11BF; # (쀜; 쀜; 쀜; 쀜; 쀜; ) HANGUL SYLLABLE BBWEK +C01D;C01D;1108 1170 11C0;C01D;1108 1170 11C0; # (쀝; 쀝; 쀝; 쀝; 쀝; ) HANGUL SYLLABLE BBWET +C01E;C01E;1108 1170 11C1;C01E;1108 1170 11C1; # (쀞; 쀞; 쀞; 쀞; 쀞; ) HANGUL SYLLABLE BBWEP +C01F;C01F;1108 1170 11C2;C01F;1108 1170 11C2; # (쀟; 쀟; 쀟; 쀟; 쀟; ) HANGUL SYLLABLE BBWEH +C020;C020;1108 1171;C020;1108 1171; # (쀠; 쀠; 쀠; 쀠; 쀠; ) HANGUL SYLLABLE BBWI +C021;C021;1108 1171 11A8;C021;1108 1171 11A8; # (쀡; 쀡; 쀡; 쀡; 쀡; ) HANGUL SYLLABLE BBWIG +C022;C022;1108 1171 11A9;C022;1108 1171 11A9; # (쀢; 쀢; 쀢; 쀢; 쀢; ) HANGUL SYLLABLE BBWIGG +C023;C023;1108 1171 11AA;C023;1108 1171 11AA; # (쀣; 쀣; 쀣; 쀣; 쀣; ) HANGUL SYLLABLE BBWIGS +C024;C024;1108 1171 11AB;C024;1108 1171 11AB; # (쀤; 쀤; 쀤; 쀤; 쀤; ) HANGUL SYLLABLE BBWIN +C025;C025;1108 1171 11AC;C025;1108 1171 11AC; # (쀥; 쀥; 쀥; 쀥; 쀥; ) HANGUL SYLLABLE BBWINJ +C026;C026;1108 1171 11AD;C026;1108 1171 11AD; # (쀦; 쀦; 쀦; 쀦; 쀦; ) HANGUL SYLLABLE BBWINH +C027;C027;1108 1171 11AE;C027;1108 1171 11AE; # (쀧; 쀧; 쀧; 쀧; 쀧; ) HANGUL SYLLABLE BBWID +C028;C028;1108 1171 11AF;C028;1108 1171 11AF; # (쀨; 쀨; 쀨; 쀨; 쀨; ) HANGUL SYLLABLE BBWIL +C029;C029;1108 1171 11B0;C029;1108 1171 11B0; # (쀩; 쀩; 쀩; 쀩; 쀩; ) HANGUL SYLLABLE BBWILG +C02A;C02A;1108 1171 11B1;C02A;1108 1171 11B1; # (쀪; 쀪; 쀪; 쀪; 쀪; ) HANGUL SYLLABLE BBWILM +C02B;C02B;1108 1171 11B2;C02B;1108 1171 11B2; # (쀫; 쀫; 쀫; 쀫; 쀫; ) HANGUL SYLLABLE BBWILB +C02C;C02C;1108 1171 11B3;C02C;1108 1171 11B3; # (쀬; 쀬; 쀬; 쀬; 쀬; ) HANGUL SYLLABLE BBWILS +C02D;C02D;1108 1171 11B4;C02D;1108 1171 11B4; # (쀭; 쀭; 쀭; 쀭; 쀭; ) HANGUL SYLLABLE BBWILT +C02E;C02E;1108 1171 11B5;C02E;1108 1171 11B5; # (쀮; 쀮; 쀮; 쀮; 쀮; ) HANGUL SYLLABLE BBWILP +C02F;C02F;1108 1171 11B6;C02F;1108 1171 11B6; # (쀯; 쀯; 쀯; 쀯; 쀯; ) HANGUL SYLLABLE BBWILH +C030;C030;1108 1171 11B7;C030;1108 1171 11B7; # (쀰; 쀰; 쀰; 쀰; 쀰; ) HANGUL SYLLABLE BBWIM +C031;C031;1108 1171 11B8;C031;1108 1171 11B8; # (쀱; 쀱; 쀱; 쀱; 쀱; ) HANGUL SYLLABLE BBWIB +C032;C032;1108 1171 11B9;C032;1108 1171 11B9; # (쀲; 쀲; 쀲; 쀲; 쀲; ) HANGUL SYLLABLE BBWIBS +C033;C033;1108 1171 11BA;C033;1108 1171 11BA; # (쀳; 쀳; 쀳; 쀳; 쀳; ) HANGUL SYLLABLE BBWIS +C034;C034;1108 1171 11BB;C034;1108 1171 11BB; # (쀴; 쀴; 쀴; 쀴; 쀴; ) HANGUL SYLLABLE BBWISS +C035;C035;1108 1171 11BC;C035;1108 1171 11BC; # (쀵; 쀵; 쀵; 쀵; 쀵; ) HANGUL SYLLABLE BBWING +C036;C036;1108 1171 11BD;C036;1108 1171 11BD; # (쀶; 쀶; 쀶; 쀶; 쀶; ) HANGUL SYLLABLE BBWIJ +C037;C037;1108 1171 11BE;C037;1108 1171 11BE; # (쀷; 쀷; 쀷; 쀷; 쀷; ) HANGUL SYLLABLE BBWIC +C038;C038;1108 1171 11BF;C038;1108 1171 11BF; # (쀸; 쀸; 쀸; 쀸; 쀸; ) HANGUL SYLLABLE BBWIK +C039;C039;1108 1171 11C0;C039;1108 1171 11C0; # (쀹; 쀹; 쀹; 쀹; 쀹; ) HANGUL SYLLABLE BBWIT +C03A;C03A;1108 1171 11C1;C03A;1108 1171 11C1; # (쀺; 쀺; 쀺; 쀺; 쀺; ) HANGUL SYLLABLE BBWIP +C03B;C03B;1108 1171 11C2;C03B;1108 1171 11C2; # (쀻; 쀻; 쀻; 쀻; 쀻; ) HANGUL SYLLABLE BBWIH +C03C;C03C;1108 1172;C03C;1108 1172; # (쀼; 쀼; 쀼; 쀼; 쀼; ) HANGUL SYLLABLE BBYU +C03D;C03D;1108 1172 11A8;C03D;1108 1172 11A8; # (쀽; 쀽; 쀽; 쀽; 쀽; ) HANGUL SYLLABLE BBYUG +C03E;C03E;1108 1172 11A9;C03E;1108 1172 11A9; # (쀾; 쀾; 쀾; 쀾; 쀾; ) HANGUL SYLLABLE BBYUGG +C03F;C03F;1108 1172 11AA;C03F;1108 1172 11AA; # (쀿; 쀿; 쀿; 쀿; 쀿; ) HANGUL SYLLABLE BBYUGS +C040;C040;1108 1172 11AB;C040;1108 1172 11AB; # (쁀; 쁀; 쁀; 쁀; 쁀; ) HANGUL SYLLABLE BBYUN +C041;C041;1108 1172 11AC;C041;1108 1172 11AC; # (쁁; 쁁; 쁁; 쁁; 쁁; ) HANGUL SYLLABLE BBYUNJ +C042;C042;1108 1172 11AD;C042;1108 1172 11AD; # (쁂; 쁂; 쁂; 쁂; 쁂; ) HANGUL SYLLABLE BBYUNH +C043;C043;1108 1172 11AE;C043;1108 1172 11AE; # (쁃; 쁃; 쁃; 쁃; 쁃; ) HANGUL SYLLABLE BBYUD +C044;C044;1108 1172 11AF;C044;1108 1172 11AF; # (쁄; 쁄; 쁄; 쁄; 쁄; ) HANGUL SYLLABLE BBYUL +C045;C045;1108 1172 11B0;C045;1108 1172 11B0; # (쁅; 쁅; 쁅; 쁅; 쁅; ) HANGUL SYLLABLE BBYULG +C046;C046;1108 1172 11B1;C046;1108 1172 11B1; # (쁆; 쁆; 쁆; 쁆; 쁆; ) HANGUL SYLLABLE BBYULM +C047;C047;1108 1172 11B2;C047;1108 1172 11B2; # (쁇; 쁇; 쁇; 쁇; 쁇; ) HANGUL SYLLABLE BBYULB +C048;C048;1108 1172 11B3;C048;1108 1172 11B3; # (쁈; 쁈; 쁈; 쁈; 쁈; ) HANGUL SYLLABLE BBYULS +C049;C049;1108 1172 11B4;C049;1108 1172 11B4; # (쁉; 쁉; 쁉; 쁉; 쁉; ) HANGUL SYLLABLE BBYULT +C04A;C04A;1108 1172 11B5;C04A;1108 1172 11B5; # (쁊; 쁊; 쁊; 쁊; 쁊; ) HANGUL SYLLABLE BBYULP +C04B;C04B;1108 1172 11B6;C04B;1108 1172 11B6; # (쁋; 쁋; 쁋; 쁋; 쁋; ) HANGUL SYLLABLE BBYULH +C04C;C04C;1108 1172 11B7;C04C;1108 1172 11B7; # (쁌; 쁌; 쁌; 쁌; 쁌; ) HANGUL SYLLABLE BBYUM +C04D;C04D;1108 1172 11B8;C04D;1108 1172 11B8; # (쁍; 쁍; 쁍; 쁍; 쁍; ) HANGUL SYLLABLE BBYUB +C04E;C04E;1108 1172 11B9;C04E;1108 1172 11B9; # (쁎; 쁎; 쁎; 쁎; 쁎; ) HANGUL SYLLABLE BBYUBS +C04F;C04F;1108 1172 11BA;C04F;1108 1172 11BA; # (쁏; 쁏; 쁏; 쁏; 쁏; ) HANGUL SYLLABLE BBYUS +C050;C050;1108 1172 11BB;C050;1108 1172 11BB; # (쁐; 쁐; 쁐; 쁐; 쁐; ) HANGUL SYLLABLE BBYUSS +C051;C051;1108 1172 11BC;C051;1108 1172 11BC; # (쁑; 쁑; 쁑; 쁑; 쁑; ) HANGUL SYLLABLE BBYUNG +C052;C052;1108 1172 11BD;C052;1108 1172 11BD; # (쁒; 쁒; 쁒; 쁒; 쁒; ) HANGUL SYLLABLE BBYUJ +C053;C053;1108 1172 11BE;C053;1108 1172 11BE; # (쁓; 쁓; 쁓; 쁓; 쁓; ) HANGUL SYLLABLE BBYUC +C054;C054;1108 1172 11BF;C054;1108 1172 11BF; # (쁔; 쁔; 쁔; 쁔; 쁔; ) HANGUL SYLLABLE BBYUK +C055;C055;1108 1172 11C0;C055;1108 1172 11C0; # (쁕; 쁕; 쁕; 쁕; 쁕; ) HANGUL SYLLABLE BBYUT +C056;C056;1108 1172 11C1;C056;1108 1172 11C1; # (쁖; 쁖; 쁖; 쁖; 쁖; ) HANGUL SYLLABLE BBYUP +C057;C057;1108 1172 11C2;C057;1108 1172 11C2; # (쁗; 쁗; 쁗; 쁗; 쁗; ) HANGUL SYLLABLE BBYUH +C058;C058;1108 1173;C058;1108 1173; # (쁘; 쁘; 쁘; 쁘; 쁘; ) HANGUL SYLLABLE BBEU +C059;C059;1108 1173 11A8;C059;1108 1173 11A8; # (쁙; 쁙; 쁙; 쁙; 쁙; ) HANGUL SYLLABLE BBEUG +C05A;C05A;1108 1173 11A9;C05A;1108 1173 11A9; # (쁚; 쁚; 쁚; 쁚; 쁚; ) HANGUL SYLLABLE BBEUGG +C05B;C05B;1108 1173 11AA;C05B;1108 1173 11AA; # (쁛; 쁛; 쁛; 쁛; 쁛; ) HANGUL SYLLABLE BBEUGS +C05C;C05C;1108 1173 11AB;C05C;1108 1173 11AB; # (쁜; 쁜; 쁜; 쁜; 쁜; ) HANGUL SYLLABLE BBEUN +C05D;C05D;1108 1173 11AC;C05D;1108 1173 11AC; # (쁝; 쁝; 쁝; 쁝; 쁝; ) HANGUL SYLLABLE BBEUNJ +C05E;C05E;1108 1173 11AD;C05E;1108 1173 11AD; # (쁞; 쁞; 쁞; 쁞; 쁞; ) HANGUL SYLLABLE BBEUNH +C05F;C05F;1108 1173 11AE;C05F;1108 1173 11AE; # (쁟; 쁟; 쁟; 쁟; 쁟; ) HANGUL SYLLABLE BBEUD +C060;C060;1108 1173 11AF;C060;1108 1173 11AF; # (쁠; 쁠; 쁠; 쁠; 쁠; ) HANGUL SYLLABLE BBEUL +C061;C061;1108 1173 11B0;C061;1108 1173 11B0; # (쁡; 쁡; 쁡; 쁡; 쁡; ) HANGUL SYLLABLE BBEULG +C062;C062;1108 1173 11B1;C062;1108 1173 11B1; # (쁢; 쁢; 쁢; 쁢; 쁢; ) HANGUL SYLLABLE BBEULM +C063;C063;1108 1173 11B2;C063;1108 1173 11B2; # (쁣; 쁣; 쁣; 쁣; 쁣; ) HANGUL SYLLABLE BBEULB +C064;C064;1108 1173 11B3;C064;1108 1173 11B3; # (쁤; 쁤; 쁤; 쁤; 쁤; ) HANGUL SYLLABLE BBEULS +C065;C065;1108 1173 11B4;C065;1108 1173 11B4; # (쁥; 쁥; 쁥; 쁥; 쁥; ) HANGUL SYLLABLE BBEULT +C066;C066;1108 1173 11B5;C066;1108 1173 11B5; # (쁦; 쁦; 쁦; 쁦; 쁦; ) HANGUL SYLLABLE BBEULP +C067;C067;1108 1173 11B6;C067;1108 1173 11B6; # (쁧; 쁧; 쁧; 쁧; 쁧; ) HANGUL SYLLABLE BBEULH +C068;C068;1108 1173 11B7;C068;1108 1173 11B7; # (쁨; 쁨; 쁨; 쁨; 쁨; ) HANGUL SYLLABLE BBEUM +C069;C069;1108 1173 11B8;C069;1108 1173 11B8; # (쁩; 쁩; 쁩; 쁩; 쁩; ) HANGUL SYLLABLE BBEUB +C06A;C06A;1108 1173 11B9;C06A;1108 1173 11B9; # (쁪; 쁪; 쁪; 쁪; 쁪; ) HANGUL SYLLABLE BBEUBS +C06B;C06B;1108 1173 11BA;C06B;1108 1173 11BA; # (쁫; 쁫; 쁫; 쁫; 쁫; ) HANGUL SYLLABLE BBEUS +C06C;C06C;1108 1173 11BB;C06C;1108 1173 11BB; # (쁬; 쁬; 쁬; 쁬; 쁬; ) HANGUL SYLLABLE BBEUSS +C06D;C06D;1108 1173 11BC;C06D;1108 1173 11BC; # (쁭; 쁭; 쁭; 쁭; 쁭; ) HANGUL SYLLABLE BBEUNG +C06E;C06E;1108 1173 11BD;C06E;1108 1173 11BD; # (쁮; 쁮; 쁮; 쁮; 쁮; ) HANGUL SYLLABLE BBEUJ +C06F;C06F;1108 1173 11BE;C06F;1108 1173 11BE; # (쁯; 쁯; 쁯; 쁯; 쁯; ) HANGUL SYLLABLE BBEUC +C070;C070;1108 1173 11BF;C070;1108 1173 11BF; # (쁰; 쁰; 쁰; 쁰; 쁰; ) HANGUL SYLLABLE BBEUK +C071;C071;1108 1173 11C0;C071;1108 1173 11C0; # (쁱; 쁱; 쁱; 쁱; 쁱; ) HANGUL SYLLABLE BBEUT +C072;C072;1108 1173 11C1;C072;1108 1173 11C1; # (쁲; 쁲; 쁲; 쁲; 쁲; ) HANGUL SYLLABLE BBEUP +C073;C073;1108 1173 11C2;C073;1108 1173 11C2; # (쁳; 쁳; 쁳; 쁳; 쁳; ) HANGUL SYLLABLE BBEUH +C074;C074;1108 1174;C074;1108 1174; # (쁴; 쁴; 쁴; 쁴; 쁴; ) HANGUL SYLLABLE BBYI +C075;C075;1108 1174 11A8;C075;1108 1174 11A8; # (쁵; 쁵; 쁵; 쁵; 쁵; ) HANGUL SYLLABLE BBYIG +C076;C076;1108 1174 11A9;C076;1108 1174 11A9; # (쁶; 쁶; 쁶; 쁶; 쁶; ) HANGUL SYLLABLE BBYIGG +C077;C077;1108 1174 11AA;C077;1108 1174 11AA; # (쁷; 쁷; 쁷; 쁷; 쁷; ) HANGUL SYLLABLE BBYIGS +C078;C078;1108 1174 11AB;C078;1108 1174 11AB; # (쁸; 쁸; 쁸; 쁸; 쁸; ) HANGUL SYLLABLE BBYIN +C079;C079;1108 1174 11AC;C079;1108 1174 11AC; # (쁹; 쁹; 쁹; 쁹; 쁹; ) HANGUL SYLLABLE BBYINJ +C07A;C07A;1108 1174 11AD;C07A;1108 1174 11AD; # (쁺; 쁺; 쁺; 쁺; 쁺; ) HANGUL SYLLABLE BBYINH +C07B;C07B;1108 1174 11AE;C07B;1108 1174 11AE; # (쁻; 쁻; 쁻; 쁻; 쁻; ) HANGUL SYLLABLE BBYID +C07C;C07C;1108 1174 11AF;C07C;1108 1174 11AF; # (쁼; 쁼; 쁼; 쁼; 쁼; ) HANGUL SYLLABLE BBYIL +C07D;C07D;1108 1174 11B0;C07D;1108 1174 11B0; # (쁽; 쁽; 쁽; 쁽; 쁽; ) HANGUL SYLLABLE BBYILG +C07E;C07E;1108 1174 11B1;C07E;1108 1174 11B1; # (쁾; 쁾; 쁾; 쁾; 쁾; ) HANGUL SYLLABLE BBYILM +C07F;C07F;1108 1174 11B2;C07F;1108 1174 11B2; # (쁿; 쁿; 쁿; 쁿; 쁿; ) HANGUL SYLLABLE BBYILB +C080;C080;1108 1174 11B3;C080;1108 1174 11B3; # (삀; 삀; 삀; 삀; 삀; ) HANGUL SYLLABLE BBYILS +C081;C081;1108 1174 11B4;C081;1108 1174 11B4; # (삁; 삁; 삁; 삁; 삁; ) HANGUL SYLLABLE BBYILT +C082;C082;1108 1174 11B5;C082;1108 1174 11B5; # (삂; 삂; 삂; 삂; 삂; ) HANGUL SYLLABLE BBYILP +C083;C083;1108 1174 11B6;C083;1108 1174 11B6; # (삃; 삃; 삃; 삃; 삃; ) HANGUL SYLLABLE BBYILH +C084;C084;1108 1174 11B7;C084;1108 1174 11B7; # (삄; 삄; 삄; 삄; 삄; ) HANGUL SYLLABLE BBYIM +C085;C085;1108 1174 11B8;C085;1108 1174 11B8; # (삅; 삅; 삅; 삅; 삅; ) HANGUL SYLLABLE BBYIB +C086;C086;1108 1174 11B9;C086;1108 1174 11B9; # (삆; 삆; 삆; 삆; 삆; ) HANGUL SYLLABLE BBYIBS +C087;C087;1108 1174 11BA;C087;1108 1174 11BA; # (삇; 삇; 삇; 삇; 삇; ) HANGUL SYLLABLE BBYIS +C088;C088;1108 1174 11BB;C088;1108 1174 11BB; # (삈; 삈; 삈; 삈; 삈; ) HANGUL SYLLABLE BBYISS +C089;C089;1108 1174 11BC;C089;1108 1174 11BC; # (삉; 삉; 삉; 삉; 삉; ) HANGUL SYLLABLE BBYING +C08A;C08A;1108 1174 11BD;C08A;1108 1174 11BD; # (삊; 삊; 삊; 삊; 삊; ) HANGUL SYLLABLE BBYIJ +C08B;C08B;1108 1174 11BE;C08B;1108 1174 11BE; # (삋; 삋; 삋; 삋; 삋; ) HANGUL SYLLABLE BBYIC +C08C;C08C;1108 1174 11BF;C08C;1108 1174 11BF; # (삌; 삌; 삌; 삌; 삌; ) HANGUL SYLLABLE BBYIK +C08D;C08D;1108 1174 11C0;C08D;1108 1174 11C0; # (삍; 삍; 삍; 삍; 삍; ) HANGUL SYLLABLE BBYIT +C08E;C08E;1108 1174 11C1;C08E;1108 1174 11C1; # (삎; 삎; 삎; 삎; 삎; ) HANGUL SYLLABLE BBYIP +C08F;C08F;1108 1174 11C2;C08F;1108 1174 11C2; # (삏; 삏; 삏; 삏; 삏; ) HANGUL SYLLABLE BBYIH +C090;C090;1108 1175;C090;1108 1175; # (삐; 삐; 삐; 삐; 삐; ) HANGUL SYLLABLE BBI +C091;C091;1108 1175 11A8;C091;1108 1175 11A8; # (삑; 삑; 삑; 삑; 삑; ) HANGUL SYLLABLE BBIG +C092;C092;1108 1175 11A9;C092;1108 1175 11A9; # (삒; 삒; 삒; 삒; 삒; ) HANGUL SYLLABLE BBIGG +C093;C093;1108 1175 11AA;C093;1108 1175 11AA; # (삓; 삓; 삓; 삓; 삓; ) HANGUL SYLLABLE BBIGS +C094;C094;1108 1175 11AB;C094;1108 1175 11AB; # (삔; 삔; 삔; 삔; 삔; ) HANGUL SYLLABLE BBIN +C095;C095;1108 1175 11AC;C095;1108 1175 11AC; # (삕; 삕; 삕; 삕; 삕; ) HANGUL SYLLABLE BBINJ +C096;C096;1108 1175 11AD;C096;1108 1175 11AD; # (삖; 삖; 삖; 삖; 삖; ) HANGUL SYLLABLE BBINH +C097;C097;1108 1175 11AE;C097;1108 1175 11AE; # (삗; 삗; 삗; 삗; 삗; ) HANGUL SYLLABLE BBID +C098;C098;1108 1175 11AF;C098;1108 1175 11AF; # (삘; 삘; 삘; 삘; 삘; ) HANGUL SYLLABLE BBIL +C099;C099;1108 1175 11B0;C099;1108 1175 11B0; # (삙; 삙; 삙; 삙; 삙; ) HANGUL SYLLABLE BBILG +C09A;C09A;1108 1175 11B1;C09A;1108 1175 11B1; # (삚; 삚; 삚; 삚; 삚; ) HANGUL SYLLABLE BBILM +C09B;C09B;1108 1175 11B2;C09B;1108 1175 11B2; # (삛; 삛; 삛; 삛; 삛; ) HANGUL SYLLABLE BBILB +C09C;C09C;1108 1175 11B3;C09C;1108 1175 11B3; # (삜; 삜; 삜; 삜; 삜; ) HANGUL SYLLABLE BBILS +C09D;C09D;1108 1175 11B4;C09D;1108 1175 11B4; # (삝; 삝; 삝; 삝; 삝; ) HANGUL SYLLABLE BBILT +C09E;C09E;1108 1175 11B5;C09E;1108 1175 11B5; # (삞; 삞; 삞; 삞; 삞; ) HANGUL SYLLABLE BBILP +C09F;C09F;1108 1175 11B6;C09F;1108 1175 11B6; # (삟; 삟; 삟; 삟; 삟; ) HANGUL SYLLABLE BBILH +C0A0;C0A0;1108 1175 11B7;C0A0;1108 1175 11B7; # (삠; 삠; 삠; 삠; 삠; ) HANGUL SYLLABLE BBIM +C0A1;C0A1;1108 1175 11B8;C0A1;1108 1175 11B8; # (삡; 삡; 삡; 삡; 삡; ) HANGUL SYLLABLE BBIB +C0A2;C0A2;1108 1175 11B9;C0A2;1108 1175 11B9; # (삢; 삢; 삢; 삢; 삢; ) HANGUL SYLLABLE BBIBS +C0A3;C0A3;1108 1175 11BA;C0A3;1108 1175 11BA; # (삣; 삣; 삣; 삣; 삣; ) HANGUL SYLLABLE BBIS +C0A4;C0A4;1108 1175 11BB;C0A4;1108 1175 11BB; # (삤; 삤; 삤; 삤; 삤; ) HANGUL SYLLABLE BBISS +C0A5;C0A5;1108 1175 11BC;C0A5;1108 1175 11BC; # (삥; 삥; 삥; 삥; 삥; ) HANGUL SYLLABLE BBING +C0A6;C0A6;1108 1175 11BD;C0A6;1108 1175 11BD; # (삦; 삦; 삦; 삦; 삦; ) HANGUL SYLLABLE BBIJ +C0A7;C0A7;1108 1175 11BE;C0A7;1108 1175 11BE; # (삧; 삧; 삧; 삧; 삧; ) HANGUL SYLLABLE BBIC +C0A8;C0A8;1108 1175 11BF;C0A8;1108 1175 11BF; # (삨; 삨; 삨; 삨; 삨; ) HANGUL SYLLABLE BBIK +C0A9;C0A9;1108 1175 11C0;C0A9;1108 1175 11C0; # (삩; 삩; 삩; 삩; 삩; ) HANGUL SYLLABLE BBIT +C0AA;C0AA;1108 1175 11C1;C0AA;1108 1175 11C1; # (삪; 삪; 삪; 삪; 삪; ) HANGUL SYLLABLE BBIP +C0AB;C0AB;1108 1175 11C2;C0AB;1108 1175 11C2; # (삫; 삫; 삫; 삫; 삫; ) HANGUL SYLLABLE BBIH +C0AC;C0AC;1109 1161;C0AC;1109 1161; # (사; 사; 사; 사; 사; ) HANGUL SYLLABLE SA +C0AD;C0AD;1109 1161 11A8;C0AD;1109 1161 11A8; # (삭; 삭; 삭; 삭; 삭; ) HANGUL SYLLABLE SAG +C0AE;C0AE;1109 1161 11A9;C0AE;1109 1161 11A9; # (삮; 삮; 삮; 삮; 삮; ) HANGUL SYLLABLE SAGG +C0AF;C0AF;1109 1161 11AA;C0AF;1109 1161 11AA; # (삯; 삯; 삯; 삯; 삯; ) HANGUL SYLLABLE SAGS +C0B0;C0B0;1109 1161 11AB;C0B0;1109 1161 11AB; # (산; 산; 산; 산; 산; ) HANGUL SYLLABLE SAN +C0B1;C0B1;1109 1161 11AC;C0B1;1109 1161 11AC; # (삱; 삱; 삱; 삱; 삱; ) HANGUL SYLLABLE SANJ +C0B2;C0B2;1109 1161 11AD;C0B2;1109 1161 11AD; # (삲; 삲; 삲; 삲; 삲; ) HANGUL SYLLABLE SANH +C0B3;C0B3;1109 1161 11AE;C0B3;1109 1161 11AE; # (삳; 삳; 삳; 삳; 삳; ) HANGUL SYLLABLE SAD +C0B4;C0B4;1109 1161 11AF;C0B4;1109 1161 11AF; # (살; 살; 살; 살; 살; ) HANGUL SYLLABLE SAL +C0B5;C0B5;1109 1161 11B0;C0B5;1109 1161 11B0; # (삵; 삵; 삵; 삵; 삵; ) HANGUL SYLLABLE SALG +C0B6;C0B6;1109 1161 11B1;C0B6;1109 1161 11B1; # (삶; 삶; 삶; 삶; 삶; ) HANGUL SYLLABLE SALM +C0B7;C0B7;1109 1161 11B2;C0B7;1109 1161 11B2; # (삷; 삷; 삷; 삷; 삷; ) HANGUL SYLLABLE SALB +C0B8;C0B8;1109 1161 11B3;C0B8;1109 1161 11B3; # (삸; 삸; 삸; 삸; 삸; ) HANGUL SYLLABLE SALS +C0B9;C0B9;1109 1161 11B4;C0B9;1109 1161 11B4; # (삹; 삹; 삹; 삹; 삹; ) HANGUL SYLLABLE SALT +C0BA;C0BA;1109 1161 11B5;C0BA;1109 1161 11B5; # (삺; 삺; 삺; 삺; 삺; ) HANGUL SYLLABLE SALP +C0BB;C0BB;1109 1161 11B6;C0BB;1109 1161 11B6; # (삻; 삻; 삻; 삻; 삻; ) HANGUL SYLLABLE SALH +C0BC;C0BC;1109 1161 11B7;C0BC;1109 1161 11B7; # (삼; 삼; 삼; 삼; 삼; ) HANGUL SYLLABLE SAM +C0BD;C0BD;1109 1161 11B8;C0BD;1109 1161 11B8; # (삽; 삽; 삽; 삽; 삽; ) HANGUL SYLLABLE SAB +C0BE;C0BE;1109 1161 11B9;C0BE;1109 1161 11B9; # (삾; 삾; 삾; 삾; 삾; ) HANGUL SYLLABLE SABS +C0BF;C0BF;1109 1161 11BA;C0BF;1109 1161 11BA; # (삿; 삿; 삿; 삿; 삿; ) HANGUL SYLLABLE SAS +C0C0;C0C0;1109 1161 11BB;C0C0;1109 1161 11BB; # (샀; 샀; 샀; 샀; 샀; ) HANGUL SYLLABLE SASS +C0C1;C0C1;1109 1161 11BC;C0C1;1109 1161 11BC; # (상; 상; 상; 상; 상; ) HANGUL SYLLABLE SANG +C0C2;C0C2;1109 1161 11BD;C0C2;1109 1161 11BD; # (샂; 샂; 샂; 샂; 샂; ) HANGUL SYLLABLE SAJ +C0C3;C0C3;1109 1161 11BE;C0C3;1109 1161 11BE; # (샃; 샃; 샃; 샃; 샃; ) HANGUL SYLLABLE SAC +C0C4;C0C4;1109 1161 11BF;C0C4;1109 1161 11BF; # (샄; 샄; 샄; 샄; 샄; ) HANGUL SYLLABLE SAK +C0C5;C0C5;1109 1161 11C0;C0C5;1109 1161 11C0; # (샅; 샅; 샅; 샅; 샅; ) HANGUL SYLLABLE SAT +C0C6;C0C6;1109 1161 11C1;C0C6;1109 1161 11C1; # (샆; 샆; 샆; 샆; 샆; ) HANGUL SYLLABLE SAP +C0C7;C0C7;1109 1161 11C2;C0C7;1109 1161 11C2; # (샇; 샇; 샇; 샇; 샇; ) HANGUL SYLLABLE SAH +C0C8;C0C8;1109 1162;C0C8;1109 1162; # (새; 새; 새; 새; 새; ) HANGUL SYLLABLE SAE +C0C9;C0C9;1109 1162 11A8;C0C9;1109 1162 11A8; # (색; 색; 색; 색; 색; ) HANGUL SYLLABLE SAEG +C0CA;C0CA;1109 1162 11A9;C0CA;1109 1162 11A9; # (샊; 샊; 샊; 샊; 샊; ) HANGUL SYLLABLE SAEGG +C0CB;C0CB;1109 1162 11AA;C0CB;1109 1162 11AA; # (샋; 샋; 샋; 샋; 샋; ) HANGUL SYLLABLE SAEGS +C0CC;C0CC;1109 1162 11AB;C0CC;1109 1162 11AB; # (샌; 샌; 샌; 샌; 샌; ) HANGUL SYLLABLE SAEN +C0CD;C0CD;1109 1162 11AC;C0CD;1109 1162 11AC; # (샍; 샍; 샍; 샍; 샍; ) HANGUL SYLLABLE SAENJ +C0CE;C0CE;1109 1162 11AD;C0CE;1109 1162 11AD; # (샎; 샎; 샎; 샎; 샎; ) HANGUL SYLLABLE SAENH +C0CF;C0CF;1109 1162 11AE;C0CF;1109 1162 11AE; # (샏; 샏; 샏; 샏; 샏; ) HANGUL SYLLABLE SAED +C0D0;C0D0;1109 1162 11AF;C0D0;1109 1162 11AF; # (샐; 샐; 샐; 샐; 샐; ) HANGUL SYLLABLE SAEL +C0D1;C0D1;1109 1162 11B0;C0D1;1109 1162 11B0; # (샑; 샑; 샑; 샑; 샑; ) HANGUL SYLLABLE SAELG +C0D2;C0D2;1109 1162 11B1;C0D2;1109 1162 11B1; # (샒; 샒; 샒; 샒; 샒; ) HANGUL SYLLABLE SAELM +C0D3;C0D3;1109 1162 11B2;C0D3;1109 1162 11B2; # (샓; 샓; 샓; 샓; 샓; ) HANGUL SYLLABLE SAELB +C0D4;C0D4;1109 1162 11B3;C0D4;1109 1162 11B3; # (샔; 샔; 샔; 샔; 샔; ) HANGUL SYLLABLE SAELS +C0D5;C0D5;1109 1162 11B4;C0D5;1109 1162 11B4; # (샕; 샕; 샕; 샕; 샕; ) HANGUL SYLLABLE SAELT +C0D6;C0D6;1109 1162 11B5;C0D6;1109 1162 11B5; # (샖; 샖; 샖; 샖; 샖; ) HANGUL SYLLABLE SAELP +C0D7;C0D7;1109 1162 11B6;C0D7;1109 1162 11B6; # (샗; 샗; 샗; 샗; 샗; ) HANGUL SYLLABLE SAELH +C0D8;C0D8;1109 1162 11B7;C0D8;1109 1162 11B7; # (샘; 샘; 샘; 샘; 샘; ) HANGUL SYLLABLE SAEM +C0D9;C0D9;1109 1162 11B8;C0D9;1109 1162 11B8; # (샙; 샙; 샙; 샙; 샙; ) HANGUL SYLLABLE SAEB +C0DA;C0DA;1109 1162 11B9;C0DA;1109 1162 11B9; # (샚; 샚; 샚; 샚; 샚; ) HANGUL SYLLABLE SAEBS +C0DB;C0DB;1109 1162 11BA;C0DB;1109 1162 11BA; # (샛; 샛; 샛; 샛; 샛; ) HANGUL SYLLABLE SAES +C0DC;C0DC;1109 1162 11BB;C0DC;1109 1162 11BB; # (샜; 샜; 샜; 샜; 샜; ) HANGUL SYLLABLE SAESS +C0DD;C0DD;1109 1162 11BC;C0DD;1109 1162 11BC; # (생; 생; 생; 생; 생; ) HANGUL SYLLABLE SAENG +C0DE;C0DE;1109 1162 11BD;C0DE;1109 1162 11BD; # (샞; 샞; 샞; 샞; 샞; ) HANGUL SYLLABLE SAEJ +C0DF;C0DF;1109 1162 11BE;C0DF;1109 1162 11BE; # (샟; 샟; 샟; 샟; 샟; ) HANGUL SYLLABLE SAEC +C0E0;C0E0;1109 1162 11BF;C0E0;1109 1162 11BF; # (샠; 샠; 샠; 샠; 샠; ) HANGUL SYLLABLE SAEK +C0E1;C0E1;1109 1162 11C0;C0E1;1109 1162 11C0; # (샡; 샡; 샡; 샡; 샡; ) HANGUL SYLLABLE SAET +C0E2;C0E2;1109 1162 11C1;C0E2;1109 1162 11C1; # (샢; 샢; 샢; 샢; 샢; ) HANGUL SYLLABLE SAEP +C0E3;C0E3;1109 1162 11C2;C0E3;1109 1162 11C2; # (샣; 샣; 샣; 샣; 샣; ) HANGUL SYLLABLE SAEH +C0E4;C0E4;1109 1163;C0E4;1109 1163; # (샤; 샤; 샤; 샤; 샤; ) HANGUL SYLLABLE SYA +C0E5;C0E5;1109 1163 11A8;C0E5;1109 1163 11A8; # (샥; 샥; 샥; 샥; 샥; ) HANGUL SYLLABLE SYAG +C0E6;C0E6;1109 1163 11A9;C0E6;1109 1163 11A9; # (샦; 샦; 샦; 샦; 샦; ) HANGUL SYLLABLE SYAGG +C0E7;C0E7;1109 1163 11AA;C0E7;1109 1163 11AA; # (샧; 샧; 샧; 샧; 샧; ) HANGUL SYLLABLE SYAGS +C0E8;C0E8;1109 1163 11AB;C0E8;1109 1163 11AB; # (샨; 샨; 샨; 샨; 샨; ) HANGUL SYLLABLE SYAN +C0E9;C0E9;1109 1163 11AC;C0E9;1109 1163 11AC; # (샩; 샩; 샩; 샩; 샩; ) HANGUL SYLLABLE SYANJ +C0EA;C0EA;1109 1163 11AD;C0EA;1109 1163 11AD; # (샪; 샪; 샪; 샪; 샪; ) HANGUL SYLLABLE SYANH +C0EB;C0EB;1109 1163 11AE;C0EB;1109 1163 11AE; # (샫; 샫; 샫; 샫; 샫; ) HANGUL SYLLABLE SYAD +C0EC;C0EC;1109 1163 11AF;C0EC;1109 1163 11AF; # (샬; 샬; 샬; 샬; 샬; ) HANGUL SYLLABLE SYAL +C0ED;C0ED;1109 1163 11B0;C0ED;1109 1163 11B0; # (샭; 샭; 샭; 샭; 샭; ) HANGUL SYLLABLE SYALG +C0EE;C0EE;1109 1163 11B1;C0EE;1109 1163 11B1; # (샮; 샮; 샮; 샮; 샮; ) HANGUL SYLLABLE SYALM +C0EF;C0EF;1109 1163 11B2;C0EF;1109 1163 11B2; # (샯; 샯; 샯; 샯; 샯; ) HANGUL SYLLABLE SYALB +C0F0;C0F0;1109 1163 11B3;C0F0;1109 1163 11B3; # (샰; 샰; 샰; 샰; 샰; ) HANGUL SYLLABLE SYALS +C0F1;C0F1;1109 1163 11B4;C0F1;1109 1163 11B4; # (샱; 샱; 샱; 샱; 샱; ) HANGUL SYLLABLE SYALT +C0F2;C0F2;1109 1163 11B5;C0F2;1109 1163 11B5; # (샲; 샲; 샲; 샲; 샲; ) HANGUL SYLLABLE SYALP +C0F3;C0F3;1109 1163 11B6;C0F3;1109 1163 11B6; # (샳; 샳; 샳; 샳; 샳; ) HANGUL SYLLABLE SYALH +C0F4;C0F4;1109 1163 11B7;C0F4;1109 1163 11B7; # (샴; 샴; 샴; 샴; 샴; ) HANGUL SYLLABLE SYAM +C0F5;C0F5;1109 1163 11B8;C0F5;1109 1163 11B8; # (샵; 샵; 샵; 샵; 샵; ) HANGUL SYLLABLE SYAB +C0F6;C0F6;1109 1163 11B9;C0F6;1109 1163 11B9; # (샶; 샶; 샶; 샶; 샶; ) HANGUL SYLLABLE SYABS +C0F7;C0F7;1109 1163 11BA;C0F7;1109 1163 11BA; # (샷; 샷; 샷; 샷; 샷; ) HANGUL SYLLABLE SYAS +C0F8;C0F8;1109 1163 11BB;C0F8;1109 1163 11BB; # (샸; 샸; 샸; 샸; 샸; ) HANGUL SYLLABLE SYASS +C0F9;C0F9;1109 1163 11BC;C0F9;1109 1163 11BC; # (샹; 샹; 샹; 샹; 샹; ) HANGUL SYLLABLE SYANG +C0FA;C0FA;1109 1163 11BD;C0FA;1109 1163 11BD; # (샺; 샺; 샺; 샺; 샺; ) HANGUL SYLLABLE SYAJ +C0FB;C0FB;1109 1163 11BE;C0FB;1109 1163 11BE; # (샻; 샻; 샻; 샻; 샻; ) HANGUL SYLLABLE SYAC +C0FC;C0FC;1109 1163 11BF;C0FC;1109 1163 11BF; # (샼; 샼; 샼; 샼; 샼; ) HANGUL SYLLABLE SYAK +C0FD;C0FD;1109 1163 11C0;C0FD;1109 1163 11C0; # (샽; 샽; 샽; 샽; 샽; ) HANGUL SYLLABLE SYAT +C0FE;C0FE;1109 1163 11C1;C0FE;1109 1163 11C1; # (샾; 샾; 샾; 샾; 샾; ) HANGUL SYLLABLE SYAP +C0FF;C0FF;1109 1163 11C2;C0FF;1109 1163 11C2; # (샿; 샿; 샿; 샿; 샿; ) HANGUL SYLLABLE SYAH +C100;C100;1109 1164;C100;1109 1164; # (섀; 섀; 섀; 섀; 섀; ) HANGUL SYLLABLE SYAE +C101;C101;1109 1164 11A8;C101;1109 1164 11A8; # (섁; 섁; 섁; 섁; 섁; ) HANGUL SYLLABLE SYAEG +C102;C102;1109 1164 11A9;C102;1109 1164 11A9; # (섂; 섂; 섂; 섂; 섂; ) HANGUL SYLLABLE SYAEGG +C103;C103;1109 1164 11AA;C103;1109 1164 11AA; # (섃; 섃; 섃; 섃; 섃; ) HANGUL SYLLABLE SYAEGS +C104;C104;1109 1164 11AB;C104;1109 1164 11AB; # (섄; 섄; 섄; 섄; 섄; ) HANGUL SYLLABLE SYAEN +C105;C105;1109 1164 11AC;C105;1109 1164 11AC; # (섅; 섅; 섅; 섅; 섅; ) HANGUL SYLLABLE SYAENJ +C106;C106;1109 1164 11AD;C106;1109 1164 11AD; # (섆; 섆; 섆; 섆; 섆; ) HANGUL SYLLABLE SYAENH +C107;C107;1109 1164 11AE;C107;1109 1164 11AE; # (섇; 섇; 섇; 섇; 섇; ) HANGUL SYLLABLE SYAED +C108;C108;1109 1164 11AF;C108;1109 1164 11AF; # (섈; 섈; 섈; 섈; 섈; ) HANGUL SYLLABLE SYAEL +C109;C109;1109 1164 11B0;C109;1109 1164 11B0; # (섉; 섉; 섉; 섉; 섉; ) HANGUL SYLLABLE SYAELG +C10A;C10A;1109 1164 11B1;C10A;1109 1164 11B1; # (섊; 섊; 섊; 섊; 섊; ) HANGUL SYLLABLE SYAELM +C10B;C10B;1109 1164 11B2;C10B;1109 1164 11B2; # (섋; 섋; 섋; 섋; 섋; ) HANGUL SYLLABLE SYAELB +C10C;C10C;1109 1164 11B3;C10C;1109 1164 11B3; # (섌; 섌; 섌; 섌; 섌; ) HANGUL SYLLABLE SYAELS +C10D;C10D;1109 1164 11B4;C10D;1109 1164 11B4; # (섍; 섍; 섍; 섍; 섍; ) HANGUL SYLLABLE SYAELT +C10E;C10E;1109 1164 11B5;C10E;1109 1164 11B5; # (섎; 섎; 섎; 섎; 섎; ) HANGUL SYLLABLE SYAELP +C10F;C10F;1109 1164 11B6;C10F;1109 1164 11B6; # (섏; 섏; 섏; 섏; 섏; ) HANGUL SYLLABLE SYAELH +C110;C110;1109 1164 11B7;C110;1109 1164 11B7; # (섐; 섐; 섐; 섐; 섐; ) HANGUL SYLLABLE SYAEM +C111;C111;1109 1164 11B8;C111;1109 1164 11B8; # (섑; 섑; 섑; 섑; 섑; ) HANGUL SYLLABLE SYAEB +C112;C112;1109 1164 11B9;C112;1109 1164 11B9; # (섒; 섒; 섒; 섒; 섒; ) HANGUL SYLLABLE SYAEBS +C113;C113;1109 1164 11BA;C113;1109 1164 11BA; # (섓; 섓; 섓; 섓; 섓; ) HANGUL SYLLABLE SYAES +C114;C114;1109 1164 11BB;C114;1109 1164 11BB; # (섔; 섔; 섔; 섔; 섔; ) HANGUL SYLLABLE SYAESS +C115;C115;1109 1164 11BC;C115;1109 1164 11BC; # (섕; 섕; 섕; 섕; 섕; ) HANGUL SYLLABLE SYAENG +C116;C116;1109 1164 11BD;C116;1109 1164 11BD; # (섖; 섖; 섖; 섖; 섖; ) HANGUL SYLLABLE SYAEJ +C117;C117;1109 1164 11BE;C117;1109 1164 11BE; # (섗; 섗; 섗; 섗; 섗; ) HANGUL SYLLABLE SYAEC +C118;C118;1109 1164 11BF;C118;1109 1164 11BF; # (섘; 섘; 섘; 섘; 섘; ) HANGUL SYLLABLE SYAEK +C119;C119;1109 1164 11C0;C119;1109 1164 11C0; # (섙; 섙; 섙; 섙; 섙; ) HANGUL SYLLABLE SYAET +C11A;C11A;1109 1164 11C1;C11A;1109 1164 11C1; # (섚; 섚; 섚; 섚; 섚; ) HANGUL SYLLABLE SYAEP +C11B;C11B;1109 1164 11C2;C11B;1109 1164 11C2; # (섛; 섛; 섛; 섛; 섛; ) HANGUL SYLLABLE SYAEH +C11C;C11C;1109 1165;C11C;1109 1165; # (서; 서; 서; 서; 서; ) HANGUL SYLLABLE SEO +C11D;C11D;1109 1165 11A8;C11D;1109 1165 11A8; # (석; 석; 석; 석; 석; ) HANGUL SYLLABLE SEOG +C11E;C11E;1109 1165 11A9;C11E;1109 1165 11A9; # (섞; 섞; 섞; 섞; 섞; ) HANGUL SYLLABLE SEOGG +C11F;C11F;1109 1165 11AA;C11F;1109 1165 11AA; # (섟; 섟; 섟; 섟; 섟; ) HANGUL SYLLABLE SEOGS +C120;C120;1109 1165 11AB;C120;1109 1165 11AB; # (선; 선; 선; 선; 선; ) HANGUL SYLLABLE SEON +C121;C121;1109 1165 11AC;C121;1109 1165 11AC; # (섡; 섡; 섡; 섡; 섡; ) HANGUL SYLLABLE SEONJ +C122;C122;1109 1165 11AD;C122;1109 1165 11AD; # (섢; 섢; 섢; 섢; 섢; ) HANGUL SYLLABLE SEONH +C123;C123;1109 1165 11AE;C123;1109 1165 11AE; # (섣; 섣; 섣; 섣; 섣; ) HANGUL SYLLABLE SEOD +C124;C124;1109 1165 11AF;C124;1109 1165 11AF; # (설; 설; 설; 설; 설; ) HANGUL SYLLABLE SEOL +C125;C125;1109 1165 11B0;C125;1109 1165 11B0; # (섥; 섥; 섥; 섥; 섥; ) HANGUL SYLLABLE SEOLG +C126;C126;1109 1165 11B1;C126;1109 1165 11B1; # (섦; 섦; 섦; 섦; 섦; ) HANGUL SYLLABLE SEOLM +C127;C127;1109 1165 11B2;C127;1109 1165 11B2; # (섧; 섧; 섧; 섧; 섧; ) HANGUL SYLLABLE SEOLB +C128;C128;1109 1165 11B3;C128;1109 1165 11B3; # (섨; 섨; 섨; 섨; 섨; ) HANGUL SYLLABLE SEOLS +C129;C129;1109 1165 11B4;C129;1109 1165 11B4; # (섩; 섩; 섩; 섩; 섩; ) HANGUL SYLLABLE SEOLT +C12A;C12A;1109 1165 11B5;C12A;1109 1165 11B5; # (섪; 섪; 섪; 섪; 섪; ) HANGUL SYLLABLE SEOLP +C12B;C12B;1109 1165 11B6;C12B;1109 1165 11B6; # (섫; 섫; 섫; 섫; 섫; ) HANGUL SYLLABLE SEOLH +C12C;C12C;1109 1165 11B7;C12C;1109 1165 11B7; # (섬; 섬; 섬; 섬; 섬; ) HANGUL SYLLABLE SEOM +C12D;C12D;1109 1165 11B8;C12D;1109 1165 11B8; # (섭; 섭; 섭; 섭; 섭; ) HANGUL SYLLABLE SEOB +C12E;C12E;1109 1165 11B9;C12E;1109 1165 11B9; # (섮; 섮; 섮; 섮; 섮; ) HANGUL SYLLABLE SEOBS +C12F;C12F;1109 1165 11BA;C12F;1109 1165 11BA; # (섯; 섯; 섯; 섯; 섯; ) HANGUL SYLLABLE SEOS +C130;C130;1109 1165 11BB;C130;1109 1165 11BB; # (섰; 섰; 섰; 섰; 섰; ) HANGUL SYLLABLE SEOSS +C131;C131;1109 1165 11BC;C131;1109 1165 11BC; # (성; 성; 성; 성; 성; ) HANGUL SYLLABLE SEONG +C132;C132;1109 1165 11BD;C132;1109 1165 11BD; # (섲; 섲; 섲; 섲; 섲; ) HANGUL SYLLABLE SEOJ +C133;C133;1109 1165 11BE;C133;1109 1165 11BE; # (섳; 섳; 섳; 섳; 섳; ) HANGUL SYLLABLE SEOC +C134;C134;1109 1165 11BF;C134;1109 1165 11BF; # (섴; 섴; 섴; 섴; 섴; ) HANGUL SYLLABLE SEOK +C135;C135;1109 1165 11C0;C135;1109 1165 11C0; # (섵; 섵; 섵; 섵; 섵; ) HANGUL SYLLABLE SEOT +C136;C136;1109 1165 11C1;C136;1109 1165 11C1; # (섶; 섶; 섶; 섶; 섶; ) HANGUL SYLLABLE SEOP +C137;C137;1109 1165 11C2;C137;1109 1165 11C2; # (섷; 섷; 섷; 섷; 섷; ) HANGUL SYLLABLE SEOH +C138;C138;1109 1166;C138;1109 1166; # (세; 세; 세; 세; 세; ) HANGUL SYLLABLE SE +C139;C139;1109 1166 11A8;C139;1109 1166 11A8; # (섹; 섹; 섹; 섹; 섹; ) HANGUL SYLLABLE SEG +C13A;C13A;1109 1166 11A9;C13A;1109 1166 11A9; # (섺; 섺; 섺; 섺; 섺; ) HANGUL SYLLABLE SEGG +C13B;C13B;1109 1166 11AA;C13B;1109 1166 11AA; # (섻; 섻; 섻; 섻; 섻; ) HANGUL SYLLABLE SEGS +C13C;C13C;1109 1166 11AB;C13C;1109 1166 11AB; # (센; 센; 센; 센; 센; ) HANGUL SYLLABLE SEN +C13D;C13D;1109 1166 11AC;C13D;1109 1166 11AC; # (섽; 섽; 섽; 섽; 섽; ) HANGUL SYLLABLE SENJ +C13E;C13E;1109 1166 11AD;C13E;1109 1166 11AD; # (섾; 섾; 섾; 섾; 섾; ) HANGUL SYLLABLE SENH +C13F;C13F;1109 1166 11AE;C13F;1109 1166 11AE; # (섿; 섿; 섿; 섿; 섿; ) HANGUL SYLLABLE SED +C140;C140;1109 1166 11AF;C140;1109 1166 11AF; # (셀; 셀; 셀; 셀; 셀; ) HANGUL SYLLABLE SEL +C141;C141;1109 1166 11B0;C141;1109 1166 11B0; # (셁; 셁; 셁; 셁; 셁; ) HANGUL SYLLABLE SELG +C142;C142;1109 1166 11B1;C142;1109 1166 11B1; # (셂; 셂; 셂; 셂; 셂; ) HANGUL SYLLABLE SELM +C143;C143;1109 1166 11B2;C143;1109 1166 11B2; # (셃; 셃; 셃; 셃; 셃; ) HANGUL SYLLABLE SELB +C144;C144;1109 1166 11B3;C144;1109 1166 11B3; # (셄; 셄; 셄; 셄; 셄; ) HANGUL SYLLABLE SELS +C145;C145;1109 1166 11B4;C145;1109 1166 11B4; # (셅; 셅; 셅; 셅; 셅; ) HANGUL SYLLABLE SELT +C146;C146;1109 1166 11B5;C146;1109 1166 11B5; # (셆; 셆; 셆; 셆; 셆; ) HANGUL SYLLABLE SELP +C147;C147;1109 1166 11B6;C147;1109 1166 11B6; # (셇; 셇; 셇; 셇; 셇; ) HANGUL SYLLABLE SELH +C148;C148;1109 1166 11B7;C148;1109 1166 11B7; # (셈; 셈; 셈; 셈; 셈; ) HANGUL SYLLABLE SEM +C149;C149;1109 1166 11B8;C149;1109 1166 11B8; # (셉; 셉; 셉; 셉; 셉; ) HANGUL SYLLABLE SEB +C14A;C14A;1109 1166 11B9;C14A;1109 1166 11B9; # (셊; 셊; 셊; 셊; 셊; ) HANGUL SYLLABLE SEBS +C14B;C14B;1109 1166 11BA;C14B;1109 1166 11BA; # (셋; 셋; 셋; 셋; 셋; ) HANGUL SYLLABLE SES +C14C;C14C;1109 1166 11BB;C14C;1109 1166 11BB; # (셌; 셌; 셌; 셌; 셌; ) HANGUL SYLLABLE SESS +C14D;C14D;1109 1166 11BC;C14D;1109 1166 11BC; # (셍; 셍; 셍; 셍; 셍; ) HANGUL SYLLABLE SENG +C14E;C14E;1109 1166 11BD;C14E;1109 1166 11BD; # (셎; 셎; 셎; 셎; 셎; ) HANGUL SYLLABLE SEJ +C14F;C14F;1109 1166 11BE;C14F;1109 1166 11BE; # (셏; 셏; 셏; 셏; 셏; ) HANGUL SYLLABLE SEC +C150;C150;1109 1166 11BF;C150;1109 1166 11BF; # (셐; 셐; 셐; 셐; 셐; ) HANGUL SYLLABLE SEK +C151;C151;1109 1166 11C0;C151;1109 1166 11C0; # (셑; 셑; 셑; 셑; 셑; ) HANGUL SYLLABLE SET +C152;C152;1109 1166 11C1;C152;1109 1166 11C1; # (셒; 셒; 셒; 셒; 셒; ) HANGUL SYLLABLE SEP +C153;C153;1109 1166 11C2;C153;1109 1166 11C2; # (셓; 셓; 셓; 셓; 셓; ) HANGUL SYLLABLE SEH +C154;C154;1109 1167;C154;1109 1167; # (셔; 셔; 셔; 셔; 셔; ) HANGUL SYLLABLE SYEO +C155;C155;1109 1167 11A8;C155;1109 1167 11A8; # (셕; 셕; 셕; 셕; 셕; ) HANGUL SYLLABLE SYEOG +C156;C156;1109 1167 11A9;C156;1109 1167 11A9; # (셖; 셖; 셖; 셖; 셖; ) HANGUL SYLLABLE SYEOGG +C157;C157;1109 1167 11AA;C157;1109 1167 11AA; # (셗; 셗; 셗; 셗; 셗; ) HANGUL SYLLABLE SYEOGS +C158;C158;1109 1167 11AB;C158;1109 1167 11AB; # (션; 션; 션; 션; 션; ) HANGUL SYLLABLE SYEON +C159;C159;1109 1167 11AC;C159;1109 1167 11AC; # (셙; 셙; 셙; 셙; 셙; ) HANGUL SYLLABLE SYEONJ +C15A;C15A;1109 1167 11AD;C15A;1109 1167 11AD; # (셚; 셚; 셚; 셚; 셚; ) HANGUL SYLLABLE SYEONH +C15B;C15B;1109 1167 11AE;C15B;1109 1167 11AE; # (셛; 셛; 셛; 셛; 셛; ) HANGUL SYLLABLE SYEOD +C15C;C15C;1109 1167 11AF;C15C;1109 1167 11AF; # (셜; 셜; 셜; 셜; 셜; ) HANGUL SYLLABLE SYEOL +C15D;C15D;1109 1167 11B0;C15D;1109 1167 11B0; # (셝; 셝; 셝; 셝; 셝; ) HANGUL SYLLABLE SYEOLG +C15E;C15E;1109 1167 11B1;C15E;1109 1167 11B1; # (셞; 셞; 셞; 셞; 셞; ) HANGUL SYLLABLE SYEOLM +C15F;C15F;1109 1167 11B2;C15F;1109 1167 11B2; # (셟; 셟; 셟; 셟; 셟; ) HANGUL SYLLABLE SYEOLB +C160;C160;1109 1167 11B3;C160;1109 1167 11B3; # (셠; 셠; 셠; 셠; 셠; ) HANGUL SYLLABLE SYEOLS +C161;C161;1109 1167 11B4;C161;1109 1167 11B4; # (셡; 셡; 셡; 셡; 셡; ) HANGUL SYLLABLE SYEOLT +C162;C162;1109 1167 11B5;C162;1109 1167 11B5; # (셢; 셢; 셢; 셢; 셢; ) HANGUL SYLLABLE SYEOLP +C163;C163;1109 1167 11B6;C163;1109 1167 11B6; # (셣; 셣; 셣; 셣; 셣; ) HANGUL SYLLABLE SYEOLH +C164;C164;1109 1167 11B7;C164;1109 1167 11B7; # (셤; 셤; 셤; 셤; 셤; ) HANGUL SYLLABLE SYEOM +C165;C165;1109 1167 11B8;C165;1109 1167 11B8; # (셥; 셥; 셥; 셥; 셥; ) HANGUL SYLLABLE SYEOB +C166;C166;1109 1167 11B9;C166;1109 1167 11B9; # (셦; 셦; 셦; 셦; 셦; ) HANGUL SYLLABLE SYEOBS +C167;C167;1109 1167 11BA;C167;1109 1167 11BA; # (셧; 셧; 셧; 셧; 셧; ) HANGUL SYLLABLE SYEOS +C168;C168;1109 1167 11BB;C168;1109 1167 11BB; # (셨; 셨; 셨; 셨; 셨; ) HANGUL SYLLABLE SYEOSS +C169;C169;1109 1167 11BC;C169;1109 1167 11BC; # (셩; 셩; 셩; 셩; 셩; ) HANGUL SYLLABLE SYEONG +C16A;C16A;1109 1167 11BD;C16A;1109 1167 11BD; # (셪; 셪; 셪; 셪; 셪; ) HANGUL SYLLABLE SYEOJ +C16B;C16B;1109 1167 11BE;C16B;1109 1167 11BE; # (셫; 셫; 셫; 셫; 셫; ) HANGUL SYLLABLE SYEOC +C16C;C16C;1109 1167 11BF;C16C;1109 1167 11BF; # (셬; 셬; 셬; 셬; 셬; ) HANGUL SYLLABLE SYEOK +C16D;C16D;1109 1167 11C0;C16D;1109 1167 11C0; # (셭; 셭; 셭; 셭; 셭; ) HANGUL SYLLABLE SYEOT +C16E;C16E;1109 1167 11C1;C16E;1109 1167 11C1; # (셮; 셮; 셮; 셮; 셮; ) HANGUL SYLLABLE SYEOP +C16F;C16F;1109 1167 11C2;C16F;1109 1167 11C2; # (셯; 셯; 셯; 셯; 셯; ) HANGUL SYLLABLE SYEOH +C170;C170;1109 1168;C170;1109 1168; # (셰; 셰; 셰; 셰; 셰; ) HANGUL SYLLABLE SYE +C171;C171;1109 1168 11A8;C171;1109 1168 11A8; # (셱; 셱; 셱; 셱; 셱; ) HANGUL SYLLABLE SYEG +C172;C172;1109 1168 11A9;C172;1109 1168 11A9; # (셲; 셲; 셲; 셲; 셲; ) HANGUL SYLLABLE SYEGG +C173;C173;1109 1168 11AA;C173;1109 1168 11AA; # (셳; 셳; 셳; 셳; 셳; ) HANGUL SYLLABLE SYEGS +C174;C174;1109 1168 11AB;C174;1109 1168 11AB; # (셴; 셴; 셴; 셴; 셴; ) HANGUL SYLLABLE SYEN +C175;C175;1109 1168 11AC;C175;1109 1168 11AC; # (셵; 셵; 셵; 셵; 셵; ) HANGUL SYLLABLE SYENJ +C176;C176;1109 1168 11AD;C176;1109 1168 11AD; # (셶; 셶; 셶; 셶; 셶; ) HANGUL SYLLABLE SYENH +C177;C177;1109 1168 11AE;C177;1109 1168 11AE; # (셷; 셷; 셷; 셷; 셷; ) HANGUL SYLLABLE SYED +C178;C178;1109 1168 11AF;C178;1109 1168 11AF; # (셸; 셸; 셸; 셸; 셸; ) HANGUL SYLLABLE SYEL +C179;C179;1109 1168 11B0;C179;1109 1168 11B0; # (셹; 셹; 셹; 셹; 셹; ) HANGUL SYLLABLE SYELG +C17A;C17A;1109 1168 11B1;C17A;1109 1168 11B1; # (셺; 셺; 셺; 셺; 셺; ) HANGUL SYLLABLE SYELM +C17B;C17B;1109 1168 11B2;C17B;1109 1168 11B2; # (셻; 셻; 셻; 셻; 셻; ) HANGUL SYLLABLE SYELB +C17C;C17C;1109 1168 11B3;C17C;1109 1168 11B3; # (셼; 셼; 셼; 셼; 셼; ) HANGUL SYLLABLE SYELS +C17D;C17D;1109 1168 11B4;C17D;1109 1168 11B4; # (셽; 셽; 셽; 셽; 셽; ) HANGUL SYLLABLE SYELT +C17E;C17E;1109 1168 11B5;C17E;1109 1168 11B5; # (셾; 셾; 셾; 셾; 셾; ) HANGUL SYLLABLE SYELP +C17F;C17F;1109 1168 11B6;C17F;1109 1168 11B6; # (셿; 셿; 셿; 셿; 셿; ) HANGUL SYLLABLE SYELH +C180;C180;1109 1168 11B7;C180;1109 1168 11B7; # (솀; 솀; 솀; 솀; 솀; ) HANGUL SYLLABLE SYEM +C181;C181;1109 1168 11B8;C181;1109 1168 11B8; # (솁; 솁; 솁; 솁; 솁; ) HANGUL SYLLABLE SYEB +C182;C182;1109 1168 11B9;C182;1109 1168 11B9; # (솂; 솂; 솂; 솂; 솂; ) HANGUL SYLLABLE SYEBS +C183;C183;1109 1168 11BA;C183;1109 1168 11BA; # (솃; 솃; 솃; 솃; 솃; ) HANGUL SYLLABLE SYES +C184;C184;1109 1168 11BB;C184;1109 1168 11BB; # (솄; 솄; 솄; 솄; 솄; ) HANGUL SYLLABLE SYESS +C185;C185;1109 1168 11BC;C185;1109 1168 11BC; # (솅; 솅; 솅; 솅; 솅; ) HANGUL SYLLABLE SYENG +C186;C186;1109 1168 11BD;C186;1109 1168 11BD; # (솆; 솆; 솆; 솆; 솆; ) HANGUL SYLLABLE SYEJ +C187;C187;1109 1168 11BE;C187;1109 1168 11BE; # (솇; 솇; 솇; 솇; 솇; ) HANGUL SYLLABLE SYEC +C188;C188;1109 1168 11BF;C188;1109 1168 11BF; # (솈; 솈; 솈; 솈; 솈; ) HANGUL SYLLABLE SYEK +C189;C189;1109 1168 11C0;C189;1109 1168 11C0; # (솉; 솉; 솉; 솉; 솉; ) HANGUL SYLLABLE SYET +C18A;C18A;1109 1168 11C1;C18A;1109 1168 11C1; # (솊; 솊; 솊; 솊; 솊; ) HANGUL SYLLABLE SYEP +C18B;C18B;1109 1168 11C2;C18B;1109 1168 11C2; # (솋; 솋; 솋; 솋; 솋; ) HANGUL SYLLABLE SYEH +C18C;C18C;1109 1169;C18C;1109 1169; # (소; 소; 소; 소; 소; ) HANGUL SYLLABLE SO +C18D;C18D;1109 1169 11A8;C18D;1109 1169 11A8; # (속; 속; 속; 속; 속; ) HANGUL SYLLABLE SOG +C18E;C18E;1109 1169 11A9;C18E;1109 1169 11A9; # (솎; 솎; 솎; 솎; 솎; ) HANGUL SYLLABLE SOGG +C18F;C18F;1109 1169 11AA;C18F;1109 1169 11AA; # (솏; 솏; 솏; 솏; 솏; ) HANGUL SYLLABLE SOGS +C190;C190;1109 1169 11AB;C190;1109 1169 11AB; # (손; 손; 손; 손; 손; ) HANGUL SYLLABLE SON +C191;C191;1109 1169 11AC;C191;1109 1169 11AC; # (솑; 솑; 솑; 솑; 솑; ) HANGUL SYLLABLE SONJ +C192;C192;1109 1169 11AD;C192;1109 1169 11AD; # (솒; 솒; 솒; 솒; 솒; ) HANGUL SYLLABLE SONH +C193;C193;1109 1169 11AE;C193;1109 1169 11AE; # (솓; 솓; 솓; 솓; 솓; ) HANGUL SYLLABLE SOD +C194;C194;1109 1169 11AF;C194;1109 1169 11AF; # (솔; 솔; 솔; 솔; 솔; ) HANGUL SYLLABLE SOL +C195;C195;1109 1169 11B0;C195;1109 1169 11B0; # (솕; 솕; 솕; 솕; 솕; ) HANGUL SYLLABLE SOLG +C196;C196;1109 1169 11B1;C196;1109 1169 11B1; # (솖; 솖; 솖; 솖; 솖; ) HANGUL SYLLABLE SOLM +C197;C197;1109 1169 11B2;C197;1109 1169 11B2; # (솗; 솗; 솗; 솗; 솗; ) HANGUL SYLLABLE SOLB +C198;C198;1109 1169 11B3;C198;1109 1169 11B3; # (솘; 솘; 솘; 솘; 솘; ) HANGUL SYLLABLE SOLS +C199;C199;1109 1169 11B4;C199;1109 1169 11B4; # (솙; 솙; 솙; 솙; 솙; ) HANGUL SYLLABLE SOLT +C19A;C19A;1109 1169 11B5;C19A;1109 1169 11B5; # (솚; 솚; 솚; 솚; 솚; ) HANGUL SYLLABLE SOLP +C19B;C19B;1109 1169 11B6;C19B;1109 1169 11B6; # (솛; 솛; 솛; 솛; 솛; ) HANGUL SYLLABLE SOLH +C19C;C19C;1109 1169 11B7;C19C;1109 1169 11B7; # (솜; 솜; 솜; 솜; 솜; ) HANGUL SYLLABLE SOM +C19D;C19D;1109 1169 11B8;C19D;1109 1169 11B8; # (솝; 솝; 솝; 솝; 솝; ) HANGUL SYLLABLE SOB +C19E;C19E;1109 1169 11B9;C19E;1109 1169 11B9; # (솞; 솞; 솞; 솞; 솞; ) HANGUL SYLLABLE SOBS +C19F;C19F;1109 1169 11BA;C19F;1109 1169 11BA; # (솟; 솟; 솟; 솟; 솟; ) HANGUL SYLLABLE SOS +C1A0;C1A0;1109 1169 11BB;C1A0;1109 1169 11BB; # (솠; 솠; 솠; 솠; 솠; ) HANGUL SYLLABLE SOSS +C1A1;C1A1;1109 1169 11BC;C1A1;1109 1169 11BC; # (송; 송; 송; 송; 송; ) HANGUL SYLLABLE SONG +C1A2;C1A2;1109 1169 11BD;C1A2;1109 1169 11BD; # (솢; 솢; 솢; 솢; 솢; ) HANGUL SYLLABLE SOJ +C1A3;C1A3;1109 1169 11BE;C1A3;1109 1169 11BE; # (솣; 솣; 솣; 솣; 솣; ) HANGUL SYLLABLE SOC +C1A4;C1A4;1109 1169 11BF;C1A4;1109 1169 11BF; # (솤; 솤; 솤; 솤; 솤; ) HANGUL SYLLABLE SOK +C1A5;C1A5;1109 1169 11C0;C1A5;1109 1169 11C0; # (솥; 솥; 솥; 솥; 솥; ) HANGUL SYLLABLE SOT +C1A6;C1A6;1109 1169 11C1;C1A6;1109 1169 11C1; # (솦; 솦; 솦; 솦; 솦; ) HANGUL SYLLABLE SOP +C1A7;C1A7;1109 1169 11C2;C1A7;1109 1169 11C2; # (솧; 솧; 솧; 솧; 솧; ) HANGUL SYLLABLE SOH +C1A8;C1A8;1109 116A;C1A8;1109 116A; # (솨; 솨; 솨; 솨; 솨; ) HANGUL SYLLABLE SWA +C1A9;C1A9;1109 116A 11A8;C1A9;1109 116A 11A8; # (솩; 솩; 솩; 솩; 솩; ) HANGUL SYLLABLE SWAG +C1AA;C1AA;1109 116A 11A9;C1AA;1109 116A 11A9; # (솪; 솪; 솪; 솪; 솪; ) HANGUL SYLLABLE SWAGG +C1AB;C1AB;1109 116A 11AA;C1AB;1109 116A 11AA; # (솫; 솫; 솫; 솫; 솫; ) HANGUL SYLLABLE SWAGS +C1AC;C1AC;1109 116A 11AB;C1AC;1109 116A 11AB; # (솬; 솬; 솬; 솬; 솬; ) HANGUL SYLLABLE SWAN +C1AD;C1AD;1109 116A 11AC;C1AD;1109 116A 11AC; # (솭; 솭; 솭; 솭; 솭; ) HANGUL SYLLABLE SWANJ +C1AE;C1AE;1109 116A 11AD;C1AE;1109 116A 11AD; # (솮; 솮; 솮; 솮; 솮; ) HANGUL SYLLABLE SWANH +C1AF;C1AF;1109 116A 11AE;C1AF;1109 116A 11AE; # (솯; 솯; 솯; 솯; 솯; ) HANGUL SYLLABLE SWAD +C1B0;C1B0;1109 116A 11AF;C1B0;1109 116A 11AF; # (솰; 솰; 솰; 솰; 솰; ) HANGUL SYLLABLE SWAL +C1B1;C1B1;1109 116A 11B0;C1B1;1109 116A 11B0; # (솱; 솱; 솱; 솱; 솱; ) HANGUL SYLLABLE SWALG +C1B2;C1B2;1109 116A 11B1;C1B2;1109 116A 11B1; # (솲; 솲; 솲; 솲; 솲; ) HANGUL SYLLABLE SWALM +C1B3;C1B3;1109 116A 11B2;C1B3;1109 116A 11B2; # (솳; 솳; 솳; 솳; 솳; ) HANGUL SYLLABLE SWALB +C1B4;C1B4;1109 116A 11B3;C1B4;1109 116A 11B3; # (솴; 솴; 솴; 솴; 솴; ) HANGUL SYLLABLE SWALS +C1B5;C1B5;1109 116A 11B4;C1B5;1109 116A 11B4; # (솵; 솵; 솵; 솵; 솵; ) HANGUL SYLLABLE SWALT +C1B6;C1B6;1109 116A 11B5;C1B6;1109 116A 11B5; # (솶; 솶; 솶; 솶; 솶; ) HANGUL SYLLABLE SWALP +C1B7;C1B7;1109 116A 11B6;C1B7;1109 116A 11B6; # (솷; 솷; 솷; 솷; 솷; ) HANGUL SYLLABLE SWALH +C1B8;C1B8;1109 116A 11B7;C1B8;1109 116A 11B7; # (솸; 솸; 솸; 솸; 솸; ) HANGUL SYLLABLE SWAM +C1B9;C1B9;1109 116A 11B8;C1B9;1109 116A 11B8; # (솹; 솹; 솹; 솹; 솹; ) HANGUL SYLLABLE SWAB +C1BA;C1BA;1109 116A 11B9;C1BA;1109 116A 11B9; # (솺; 솺; 솺; 솺; 솺; ) HANGUL SYLLABLE SWABS +C1BB;C1BB;1109 116A 11BA;C1BB;1109 116A 11BA; # (솻; 솻; 솻; 솻; 솻; ) HANGUL SYLLABLE SWAS +C1BC;C1BC;1109 116A 11BB;C1BC;1109 116A 11BB; # (솼; 솼; 솼; 솼; 솼; ) HANGUL SYLLABLE SWASS +C1BD;C1BD;1109 116A 11BC;C1BD;1109 116A 11BC; # (솽; 솽; 솽; 솽; 솽; ) HANGUL SYLLABLE SWANG +C1BE;C1BE;1109 116A 11BD;C1BE;1109 116A 11BD; # (솾; 솾; 솾; 솾; 솾; ) HANGUL SYLLABLE SWAJ +C1BF;C1BF;1109 116A 11BE;C1BF;1109 116A 11BE; # (솿; 솿; 솿; 솿; 솿; ) HANGUL SYLLABLE SWAC +C1C0;C1C0;1109 116A 11BF;C1C0;1109 116A 11BF; # (쇀; 쇀; 쇀; 쇀; 쇀; ) HANGUL SYLLABLE SWAK +C1C1;C1C1;1109 116A 11C0;C1C1;1109 116A 11C0; # (쇁; 쇁; 쇁; 쇁; 쇁; ) HANGUL SYLLABLE SWAT +C1C2;C1C2;1109 116A 11C1;C1C2;1109 116A 11C1; # (쇂; 쇂; 쇂; 쇂; 쇂; ) HANGUL SYLLABLE SWAP +C1C3;C1C3;1109 116A 11C2;C1C3;1109 116A 11C2; # (쇃; 쇃; 쇃; 쇃; 쇃; ) HANGUL SYLLABLE SWAH +C1C4;C1C4;1109 116B;C1C4;1109 116B; # (쇄; 쇄; 쇄; 쇄; 쇄; ) HANGUL SYLLABLE SWAE +C1C5;C1C5;1109 116B 11A8;C1C5;1109 116B 11A8; # (쇅; 쇅; 쇅; 쇅; 쇅; ) HANGUL SYLLABLE SWAEG +C1C6;C1C6;1109 116B 11A9;C1C6;1109 116B 11A9; # (쇆; 쇆; 쇆; 쇆; 쇆; ) HANGUL SYLLABLE SWAEGG +C1C7;C1C7;1109 116B 11AA;C1C7;1109 116B 11AA; # (쇇; 쇇; 쇇; 쇇; 쇇; ) HANGUL SYLLABLE SWAEGS +C1C8;C1C8;1109 116B 11AB;C1C8;1109 116B 11AB; # (쇈; 쇈; 쇈; 쇈; 쇈; ) HANGUL SYLLABLE SWAEN +C1C9;C1C9;1109 116B 11AC;C1C9;1109 116B 11AC; # (쇉; 쇉; 쇉; 쇉; 쇉; ) HANGUL SYLLABLE SWAENJ +C1CA;C1CA;1109 116B 11AD;C1CA;1109 116B 11AD; # (쇊; 쇊; 쇊; 쇊; 쇊; ) HANGUL SYLLABLE SWAENH +C1CB;C1CB;1109 116B 11AE;C1CB;1109 116B 11AE; # (쇋; 쇋; 쇋; 쇋; 쇋; ) HANGUL SYLLABLE SWAED +C1CC;C1CC;1109 116B 11AF;C1CC;1109 116B 11AF; # (쇌; 쇌; 쇌; 쇌; 쇌; ) HANGUL SYLLABLE SWAEL +C1CD;C1CD;1109 116B 11B0;C1CD;1109 116B 11B0; # (쇍; 쇍; 쇍; 쇍; 쇍; ) HANGUL SYLLABLE SWAELG +C1CE;C1CE;1109 116B 11B1;C1CE;1109 116B 11B1; # (쇎; 쇎; 쇎; 쇎; 쇎; ) HANGUL SYLLABLE SWAELM +C1CF;C1CF;1109 116B 11B2;C1CF;1109 116B 11B2; # (쇏; 쇏; 쇏; 쇏; 쇏; ) HANGUL SYLLABLE SWAELB +C1D0;C1D0;1109 116B 11B3;C1D0;1109 116B 11B3; # (쇐; 쇐; 쇐; 쇐; 쇐; ) HANGUL SYLLABLE SWAELS +C1D1;C1D1;1109 116B 11B4;C1D1;1109 116B 11B4; # (쇑; 쇑; 쇑; 쇑; 쇑; ) HANGUL SYLLABLE SWAELT +C1D2;C1D2;1109 116B 11B5;C1D2;1109 116B 11B5; # (쇒; 쇒; 쇒; 쇒; 쇒; ) HANGUL SYLLABLE SWAELP +C1D3;C1D3;1109 116B 11B6;C1D3;1109 116B 11B6; # (쇓; 쇓; 쇓; 쇓; 쇓; ) HANGUL SYLLABLE SWAELH +C1D4;C1D4;1109 116B 11B7;C1D4;1109 116B 11B7; # (쇔; 쇔; 쇔; 쇔; 쇔; ) HANGUL SYLLABLE SWAEM +C1D5;C1D5;1109 116B 11B8;C1D5;1109 116B 11B8; # (쇕; 쇕; 쇕; 쇕; 쇕; ) HANGUL SYLLABLE SWAEB +C1D6;C1D6;1109 116B 11B9;C1D6;1109 116B 11B9; # (쇖; 쇖; 쇖; 쇖; 쇖; ) HANGUL SYLLABLE SWAEBS +C1D7;C1D7;1109 116B 11BA;C1D7;1109 116B 11BA; # (쇗; 쇗; 쇗; 쇗; 쇗; ) HANGUL SYLLABLE SWAES +C1D8;C1D8;1109 116B 11BB;C1D8;1109 116B 11BB; # (쇘; 쇘; 쇘; 쇘; 쇘; ) HANGUL SYLLABLE SWAESS +C1D9;C1D9;1109 116B 11BC;C1D9;1109 116B 11BC; # (쇙; 쇙; 쇙; 쇙; 쇙; ) HANGUL SYLLABLE SWAENG +C1DA;C1DA;1109 116B 11BD;C1DA;1109 116B 11BD; # (쇚; 쇚; 쇚; 쇚; 쇚; ) HANGUL SYLLABLE SWAEJ +C1DB;C1DB;1109 116B 11BE;C1DB;1109 116B 11BE; # (쇛; 쇛; 쇛; 쇛; 쇛; ) HANGUL SYLLABLE SWAEC +C1DC;C1DC;1109 116B 11BF;C1DC;1109 116B 11BF; # (쇜; 쇜; 쇜; 쇜; 쇜; ) HANGUL SYLLABLE SWAEK +C1DD;C1DD;1109 116B 11C0;C1DD;1109 116B 11C0; # (쇝; 쇝; 쇝; 쇝; 쇝; ) HANGUL SYLLABLE SWAET +C1DE;C1DE;1109 116B 11C1;C1DE;1109 116B 11C1; # (쇞; 쇞; 쇞; 쇞; 쇞; ) HANGUL SYLLABLE SWAEP +C1DF;C1DF;1109 116B 11C2;C1DF;1109 116B 11C2; # (쇟; 쇟; 쇟; 쇟; 쇟; ) HANGUL SYLLABLE SWAEH +C1E0;C1E0;1109 116C;C1E0;1109 116C; # (쇠; 쇠; 쇠; 쇠; 쇠; ) HANGUL SYLLABLE SOE +C1E1;C1E1;1109 116C 11A8;C1E1;1109 116C 11A8; # (쇡; 쇡; 쇡; 쇡; 쇡; ) HANGUL SYLLABLE SOEG +C1E2;C1E2;1109 116C 11A9;C1E2;1109 116C 11A9; # (쇢; 쇢; 쇢; 쇢; 쇢; ) HANGUL SYLLABLE SOEGG +C1E3;C1E3;1109 116C 11AA;C1E3;1109 116C 11AA; # (쇣; 쇣; 쇣; 쇣; 쇣; ) HANGUL SYLLABLE SOEGS +C1E4;C1E4;1109 116C 11AB;C1E4;1109 116C 11AB; # (쇤; 쇤; 쇤; 쇤; 쇤; ) HANGUL SYLLABLE SOEN +C1E5;C1E5;1109 116C 11AC;C1E5;1109 116C 11AC; # (쇥; 쇥; 쇥; 쇥; 쇥; ) HANGUL SYLLABLE SOENJ +C1E6;C1E6;1109 116C 11AD;C1E6;1109 116C 11AD; # (쇦; 쇦; 쇦; 쇦; 쇦; ) HANGUL SYLLABLE SOENH +C1E7;C1E7;1109 116C 11AE;C1E7;1109 116C 11AE; # (쇧; 쇧; 쇧; 쇧; 쇧; ) HANGUL SYLLABLE SOED +C1E8;C1E8;1109 116C 11AF;C1E8;1109 116C 11AF; # (쇨; 쇨; 쇨; 쇨; 쇨; ) HANGUL SYLLABLE SOEL +C1E9;C1E9;1109 116C 11B0;C1E9;1109 116C 11B0; # (쇩; 쇩; 쇩; 쇩; 쇩; ) HANGUL SYLLABLE SOELG +C1EA;C1EA;1109 116C 11B1;C1EA;1109 116C 11B1; # (쇪; 쇪; 쇪; 쇪; 쇪; ) HANGUL SYLLABLE SOELM +C1EB;C1EB;1109 116C 11B2;C1EB;1109 116C 11B2; # (쇫; 쇫; 쇫; 쇫; 쇫; ) HANGUL SYLLABLE SOELB +C1EC;C1EC;1109 116C 11B3;C1EC;1109 116C 11B3; # (쇬; 쇬; 쇬; 쇬; 쇬; ) HANGUL SYLLABLE SOELS +C1ED;C1ED;1109 116C 11B4;C1ED;1109 116C 11B4; # (쇭; 쇭; 쇭; 쇭; 쇭; ) HANGUL SYLLABLE SOELT +C1EE;C1EE;1109 116C 11B5;C1EE;1109 116C 11B5; # (쇮; 쇮; 쇮; 쇮; 쇮; ) HANGUL SYLLABLE SOELP +C1EF;C1EF;1109 116C 11B6;C1EF;1109 116C 11B6; # (쇯; 쇯; 쇯; 쇯; 쇯; ) HANGUL SYLLABLE SOELH +C1F0;C1F0;1109 116C 11B7;C1F0;1109 116C 11B7; # (쇰; 쇰; 쇰; 쇰; 쇰; ) HANGUL SYLLABLE SOEM +C1F1;C1F1;1109 116C 11B8;C1F1;1109 116C 11B8; # (쇱; 쇱; 쇱; 쇱; 쇱; ) HANGUL SYLLABLE SOEB +C1F2;C1F2;1109 116C 11B9;C1F2;1109 116C 11B9; # (쇲; 쇲; 쇲; 쇲; 쇲; ) HANGUL SYLLABLE SOEBS +C1F3;C1F3;1109 116C 11BA;C1F3;1109 116C 11BA; # (쇳; 쇳; 쇳; 쇳; 쇳; ) HANGUL SYLLABLE SOES +C1F4;C1F4;1109 116C 11BB;C1F4;1109 116C 11BB; # (쇴; 쇴; 쇴; 쇴; 쇴; ) HANGUL SYLLABLE SOESS +C1F5;C1F5;1109 116C 11BC;C1F5;1109 116C 11BC; # (쇵; 쇵; 쇵; 쇵; 쇵; ) HANGUL SYLLABLE SOENG +C1F6;C1F6;1109 116C 11BD;C1F6;1109 116C 11BD; # (쇶; 쇶; 쇶; 쇶; 쇶; ) HANGUL SYLLABLE SOEJ +C1F7;C1F7;1109 116C 11BE;C1F7;1109 116C 11BE; # (쇷; 쇷; 쇷; 쇷; 쇷; ) HANGUL SYLLABLE SOEC +C1F8;C1F8;1109 116C 11BF;C1F8;1109 116C 11BF; # (쇸; 쇸; 쇸; 쇸; 쇸; ) HANGUL SYLLABLE SOEK +C1F9;C1F9;1109 116C 11C0;C1F9;1109 116C 11C0; # (쇹; 쇹; 쇹; 쇹; 쇹; ) HANGUL SYLLABLE SOET +C1FA;C1FA;1109 116C 11C1;C1FA;1109 116C 11C1; # (쇺; 쇺; 쇺; 쇺; 쇺; ) HANGUL SYLLABLE SOEP +C1FB;C1FB;1109 116C 11C2;C1FB;1109 116C 11C2; # (쇻; 쇻; 쇻; 쇻; 쇻; ) HANGUL SYLLABLE SOEH +C1FC;C1FC;1109 116D;C1FC;1109 116D; # (쇼; 쇼; 쇼; 쇼; 쇼; ) HANGUL SYLLABLE SYO +C1FD;C1FD;1109 116D 11A8;C1FD;1109 116D 11A8; # (쇽; 쇽; 쇽; 쇽; 쇽; ) HANGUL SYLLABLE SYOG +C1FE;C1FE;1109 116D 11A9;C1FE;1109 116D 11A9; # (쇾; 쇾; 쇾; 쇾; 쇾; ) HANGUL SYLLABLE SYOGG +C1FF;C1FF;1109 116D 11AA;C1FF;1109 116D 11AA; # (쇿; 쇿; 쇿; 쇿; 쇿; ) HANGUL SYLLABLE SYOGS +C200;C200;1109 116D 11AB;C200;1109 116D 11AB; # (숀; 숀; 숀; 숀; 숀; ) HANGUL SYLLABLE SYON +C201;C201;1109 116D 11AC;C201;1109 116D 11AC; # (숁; 숁; 숁; 숁; 숁; ) HANGUL SYLLABLE SYONJ +C202;C202;1109 116D 11AD;C202;1109 116D 11AD; # (숂; 숂; 숂; 숂; 숂; ) HANGUL SYLLABLE SYONH +C203;C203;1109 116D 11AE;C203;1109 116D 11AE; # (숃; 숃; 숃; 숃; 숃; ) HANGUL SYLLABLE SYOD +C204;C204;1109 116D 11AF;C204;1109 116D 11AF; # (숄; 숄; 숄; 숄; 숄; ) HANGUL SYLLABLE SYOL +C205;C205;1109 116D 11B0;C205;1109 116D 11B0; # (숅; 숅; 숅; 숅; 숅; ) HANGUL SYLLABLE SYOLG +C206;C206;1109 116D 11B1;C206;1109 116D 11B1; # (숆; 숆; 숆; 숆; 숆; ) HANGUL SYLLABLE SYOLM +C207;C207;1109 116D 11B2;C207;1109 116D 11B2; # (숇; 숇; 숇; 숇; 숇; ) HANGUL SYLLABLE SYOLB +C208;C208;1109 116D 11B3;C208;1109 116D 11B3; # (숈; 숈; 숈; 숈; 숈; ) HANGUL SYLLABLE SYOLS +C209;C209;1109 116D 11B4;C209;1109 116D 11B4; # (숉; 숉; 숉; 숉; 숉; ) HANGUL SYLLABLE SYOLT +C20A;C20A;1109 116D 11B5;C20A;1109 116D 11B5; # (숊; 숊; 숊; 숊; 숊; ) HANGUL SYLLABLE SYOLP +C20B;C20B;1109 116D 11B6;C20B;1109 116D 11B6; # (숋; 숋; 숋; 숋; 숋; ) HANGUL SYLLABLE SYOLH +C20C;C20C;1109 116D 11B7;C20C;1109 116D 11B7; # (숌; 숌; 숌; 숌; 숌; ) HANGUL SYLLABLE SYOM +C20D;C20D;1109 116D 11B8;C20D;1109 116D 11B8; # (숍; 숍; 숍; 숍; 숍; ) HANGUL SYLLABLE SYOB +C20E;C20E;1109 116D 11B9;C20E;1109 116D 11B9; # (숎; 숎; 숎; 숎; 숎; ) HANGUL SYLLABLE SYOBS +C20F;C20F;1109 116D 11BA;C20F;1109 116D 11BA; # (숏; 숏; 숏; 숏; 숏; ) HANGUL SYLLABLE SYOS +C210;C210;1109 116D 11BB;C210;1109 116D 11BB; # (숐; 숐; 숐; 숐; 숐; ) HANGUL SYLLABLE SYOSS +C211;C211;1109 116D 11BC;C211;1109 116D 11BC; # (숑; 숑; 숑; 숑; 숑; ) HANGUL SYLLABLE SYONG +C212;C212;1109 116D 11BD;C212;1109 116D 11BD; # (숒; 숒; 숒; 숒; 숒; ) HANGUL SYLLABLE SYOJ +C213;C213;1109 116D 11BE;C213;1109 116D 11BE; # (숓; 숓; 숓; 숓; 숓; ) HANGUL SYLLABLE SYOC +C214;C214;1109 116D 11BF;C214;1109 116D 11BF; # (숔; 숔; 숔; 숔; 숔; ) HANGUL SYLLABLE SYOK +C215;C215;1109 116D 11C0;C215;1109 116D 11C0; # (숕; 숕; 숕; 숕; 숕; ) HANGUL SYLLABLE SYOT +C216;C216;1109 116D 11C1;C216;1109 116D 11C1; # (숖; 숖; 숖; 숖; 숖; ) HANGUL SYLLABLE SYOP +C217;C217;1109 116D 11C2;C217;1109 116D 11C2; # (숗; 숗; 숗; 숗; 숗; ) HANGUL SYLLABLE SYOH +C218;C218;1109 116E;C218;1109 116E; # (수; 수; 수; 수; 수; ) HANGUL SYLLABLE SU +C219;C219;1109 116E 11A8;C219;1109 116E 11A8; # (숙; 숙; 숙; 숙; 숙; ) HANGUL SYLLABLE SUG +C21A;C21A;1109 116E 11A9;C21A;1109 116E 11A9; # (숚; 숚; 숚; 숚; 숚; ) HANGUL SYLLABLE SUGG +C21B;C21B;1109 116E 11AA;C21B;1109 116E 11AA; # (숛; 숛; 숛; 숛; 숛; ) HANGUL SYLLABLE SUGS +C21C;C21C;1109 116E 11AB;C21C;1109 116E 11AB; # (순; 순; 순; 순; 순; ) HANGUL SYLLABLE SUN +C21D;C21D;1109 116E 11AC;C21D;1109 116E 11AC; # (숝; 숝; 숝; 숝; 숝; ) HANGUL SYLLABLE SUNJ +C21E;C21E;1109 116E 11AD;C21E;1109 116E 11AD; # (숞; 숞; 숞; 숞; 숞; ) HANGUL SYLLABLE SUNH +C21F;C21F;1109 116E 11AE;C21F;1109 116E 11AE; # (숟; 숟; 숟; 숟; 숟; ) HANGUL SYLLABLE SUD +C220;C220;1109 116E 11AF;C220;1109 116E 11AF; # (술; 술; 술; 술; 술; ) HANGUL SYLLABLE SUL +C221;C221;1109 116E 11B0;C221;1109 116E 11B0; # (숡; 숡; 숡; 숡; 숡; ) HANGUL SYLLABLE SULG +C222;C222;1109 116E 11B1;C222;1109 116E 11B1; # (숢; 숢; 숢; 숢; 숢; ) HANGUL SYLLABLE SULM +C223;C223;1109 116E 11B2;C223;1109 116E 11B2; # (숣; 숣; 숣; 숣; 숣; ) HANGUL SYLLABLE SULB +C224;C224;1109 116E 11B3;C224;1109 116E 11B3; # (숤; 숤; 숤; 숤; 숤; ) HANGUL SYLLABLE SULS +C225;C225;1109 116E 11B4;C225;1109 116E 11B4; # (숥; 숥; 숥; 숥; 숥; ) HANGUL SYLLABLE SULT +C226;C226;1109 116E 11B5;C226;1109 116E 11B5; # (숦; 숦; 숦; 숦; 숦; ) HANGUL SYLLABLE SULP +C227;C227;1109 116E 11B6;C227;1109 116E 11B6; # (숧; 숧; 숧; 숧; 숧; ) HANGUL SYLLABLE SULH +C228;C228;1109 116E 11B7;C228;1109 116E 11B7; # (숨; 숨; 숨; 숨; 숨; ) HANGUL SYLLABLE SUM +C229;C229;1109 116E 11B8;C229;1109 116E 11B8; # (숩; 숩; 숩; 숩; 숩; ) HANGUL SYLLABLE SUB +C22A;C22A;1109 116E 11B9;C22A;1109 116E 11B9; # (숪; 숪; 숪; 숪; 숪; ) HANGUL SYLLABLE SUBS +C22B;C22B;1109 116E 11BA;C22B;1109 116E 11BA; # (숫; 숫; 숫; 숫; 숫; ) HANGUL SYLLABLE SUS +C22C;C22C;1109 116E 11BB;C22C;1109 116E 11BB; # (숬; 숬; 숬; 숬; 숬; ) HANGUL SYLLABLE SUSS +C22D;C22D;1109 116E 11BC;C22D;1109 116E 11BC; # (숭; 숭; 숭; 숭; 숭; ) HANGUL SYLLABLE SUNG +C22E;C22E;1109 116E 11BD;C22E;1109 116E 11BD; # (숮; 숮; 숮; 숮; 숮; ) HANGUL SYLLABLE SUJ +C22F;C22F;1109 116E 11BE;C22F;1109 116E 11BE; # (숯; 숯; 숯; 숯; 숯; ) HANGUL SYLLABLE SUC +C230;C230;1109 116E 11BF;C230;1109 116E 11BF; # (숰; 숰; 숰; 숰; 숰; ) HANGUL SYLLABLE SUK +C231;C231;1109 116E 11C0;C231;1109 116E 11C0; # (숱; 숱; 숱; 숱; 숱; ) HANGUL SYLLABLE SUT +C232;C232;1109 116E 11C1;C232;1109 116E 11C1; # (숲; 숲; 숲; 숲; 숲; ) HANGUL SYLLABLE SUP +C233;C233;1109 116E 11C2;C233;1109 116E 11C2; # (숳; 숳; 숳; 숳; 숳; ) HANGUL SYLLABLE SUH +C234;C234;1109 116F;C234;1109 116F; # (숴; 숴; 숴; 숴; 숴; ) HANGUL SYLLABLE SWEO +C235;C235;1109 116F 11A8;C235;1109 116F 11A8; # (숵; 숵; 숵; 숵; 숵; ) HANGUL SYLLABLE SWEOG +C236;C236;1109 116F 11A9;C236;1109 116F 11A9; # (숶; 숶; 숶; 숶; 숶; ) HANGUL SYLLABLE SWEOGG +C237;C237;1109 116F 11AA;C237;1109 116F 11AA; # (숷; 숷; 숷; 숷; 숷; ) HANGUL SYLLABLE SWEOGS +C238;C238;1109 116F 11AB;C238;1109 116F 11AB; # (숸; 숸; 숸; 숸; 숸; ) HANGUL SYLLABLE SWEON +C239;C239;1109 116F 11AC;C239;1109 116F 11AC; # (숹; 숹; 숹; 숹; 숹; ) HANGUL SYLLABLE SWEONJ +C23A;C23A;1109 116F 11AD;C23A;1109 116F 11AD; # (숺; 숺; 숺; 숺; 숺; ) HANGUL SYLLABLE SWEONH +C23B;C23B;1109 116F 11AE;C23B;1109 116F 11AE; # (숻; 숻; 숻; 숻; 숻; ) HANGUL SYLLABLE SWEOD +C23C;C23C;1109 116F 11AF;C23C;1109 116F 11AF; # (숼; 숼; 숼; 숼; 숼; ) HANGUL SYLLABLE SWEOL +C23D;C23D;1109 116F 11B0;C23D;1109 116F 11B0; # (숽; 숽; 숽; 숽; 숽; ) HANGUL SYLLABLE SWEOLG +C23E;C23E;1109 116F 11B1;C23E;1109 116F 11B1; # (숾; 숾; 숾; 숾; 숾; ) HANGUL SYLLABLE SWEOLM +C23F;C23F;1109 116F 11B2;C23F;1109 116F 11B2; # (숿; 숿; 숿; 숿; 숿; ) HANGUL SYLLABLE SWEOLB +C240;C240;1109 116F 11B3;C240;1109 116F 11B3; # (쉀; 쉀; 쉀; 쉀; 쉀; ) HANGUL SYLLABLE SWEOLS +C241;C241;1109 116F 11B4;C241;1109 116F 11B4; # (쉁; 쉁; 쉁; 쉁; 쉁; ) HANGUL SYLLABLE SWEOLT +C242;C242;1109 116F 11B5;C242;1109 116F 11B5; # (쉂; 쉂; 쉂; 쉂; 쉂; ) HANGUL SYLLABLE SWEOLP +C243;C243;1109 116F 11B6;C243;1109 116F 11B6; # (쉃; 쉃; 쉃; 쉃; 쉃; ) HANGUL SYLLABLE SWEOLH +C244;C244;1109 116F 11B7;C244;1109 116F 11B7; # (쉄; 쉄; 쉄; 쉄; 쉄; ) HANGUL SYLLABLE SWEOM +C245;C245;1109 116F 11B8;C245;1109 116F 11B8; # (쉅; 쉅; 쉅; 쉅; 쉅; ) HANGUL SYLLABLE SWEOB +C246;C246;1109 116F 11B9;C246;1109 116F 11B9; # (쉆; 쉆; 쉆; 쉆; 쉆; ) HANGUL SYLLABLE SWEOBS +C247;C247;1109 116F 11BA;C247;1109 116F 11BA; # (쉇; 쉇; 쉇; 쉇; 쉇; ) HANGUL SYLLABLE SWEOS +C248;C248;1109 116F 11BB;C248;1109 116F 11BB; # (쉈; 쉈; 쉈; 쉈; 쉈; ) HANGUL SYLLABLE SWEOSS +C249;C249;1109 116F 11BC;C249;1109 116F 11BC; # (쉉; 쉉; 쉉; 쉉; 쉉; ) HANGUL SYLLABLE SWEONG +C24A;C24A;1109 116F 11BD;C24A;1109 116F 11BD; # (쉊; 쉊; 쉊; 쉊; 쉊; ) HANGUL SYLLABLE SWEOJ +C24B;C24B;1109 116F 11BE;C24B;1109 116F 11BE; # (쉋; 쉋; 쉋; 쉋; 쉋; ) HANGUL SYLLABLE SWEOC +C24C;C24C;1109 116F 11BF;C24C;1109 116F 11BF; # (쉌; 쉌; 쉌; 쉌; 쉌; ) HANGUL SYLLABLE SWEOK +C24D;C24D;1109 116F 11C0;C24D;1109 116F 11C0; # (쉍; 쉍; 쉍; 쉍; 쉍; ) HANGUL SYLLABLE SWEOT +C24E;C24E;1109 116F 11C1;C24E;1109 116F 11C1; # (쉎; 쉎; 쉎; 쉎; 쉎; ) HANGUL SYLLABLE SWEOP +C24F;C24F;1109 116F 11C2;C24F;1109 116F 11C2; # (쉏; 쉏; 쉏; 쉏; 쉏; ) HANGUL SYLLABLE SWEOH +C250;C250;1109 1170;C250;1109 1170; # (쉐; 쉐; 쉐; 쉐; 쉐; ) HANGUL SYLLABLE SWE +C251;C251;1109 1170 11A8;C251;1109 1170 11A8; # (쉑; 쉑; 쉑; 쉑; 쉑; ) HANGUL SYLLABLE SWEG +C252;C252;1109 1170 11A9;C252;1109 1170 11A9; # (쉒; 쉒; 쉒; 쉒; 쉒; ) HANGUL SYLLABLE SWEGG +C253;C253;1109 1170 11AA;C253;1109 1170 11AA; # (쉓; 쉓; 쉓; 쉓; 쉓; ) HANGUL SYLLABLE SWEGS +C254;C254;1109 1170 11AB;C254;1109 1170 11AB; # (쉔; 쉔; 쉔; 쉔; 쉔; ) HANGUL SYLLABLE SWEN +C255;C255;1109 1170 11AC;C255;1109 1170 11AC; # (쉕; 쉕; 쉕; 쉕; 쉕; ) HANGUL SYLLABLE SWENJ +C256;C256;1109 1170 11AD;C256;1109 1170 11AD; # (쉖; 쉖; 쉖; 쉖; 쉖; ) HANGUL SYLLABLE SWENH +C257;C257;1109 1170 11AE;C257;1109 1170 11AE; # (쉗; 쉗; 쉗; 쉗; 쉗; ) HANGUL SYLLABLE SWED +C258;C258;1109 1170 11AF;C258;1109 1170 11AF; # (쉘; 쉘; 쉘; 쉘; 쉘; ) HANGUL SYLLABLE SWEL +C259;C259;1109 1170 11B0;C259;1109 1170 11B0; # (쉙; 쉙; 쉙; 쉙; 쉙; ) HANGUL SYLLABLE SWELG +C25A;C25A;1109 1170 11B1;C25A;1109 1170 11B1; # (쉚; 쉚; 쉚; 쉚; 쉚; ) HANGUL SYLLABLE SWELM +C25B;C25B;1109 1170 11B2;C25B;1109 1170 11B2; # (쉛; 쉛; 쉛; 쉛; 쉛; ) HANGUL SYLLABLE SWELB +C25C;C25C;1109 1170 11B3;C25C;1109 1170 11B3; # (쉜; 쉜; 쉜; 쉜; 쉜; ) HANGUL SYLLABLE SWELS +C25D;C25D;1109 1170 11B4;C25D;1109 1170 11B4; # (쉝; 쉝; 쉝; 쉝; 쉝; ) HANGUL SYLLABLE SWELT +C25E;C25E;1109 1170 11B5;C25E;1109 1170 11B5; # (쉞; 쉞; 쉞; 쉞; 쉞; ) HANGUL SYLLABLE SWELP +C25F;C25F;1109 1170 11B6;C25F;1109 1170 11B6; # (쉟; 쉟; 쉟; 쉟; 쉟; ) HANGUL SYLLABLE SWELH +C260;C260;1109 1170 11B7;C260;1109 1170 11B7; # (쉠; 쉠; 쉠; 쉠; 쉠; ) HANGUL SYLLABLE SWEM +C261;C261;1109 1170 11B8;C261;1109 1170 11B8; # (쉡; 쉡; 쉡; 쉡; 쉡; ) HANGUL SYLLABLE SWEB +C262;C262;1109 1170 11B9;C262;1109 1170 11B9; # (쉢; 쉢; 쉢; 쉢; 쉢; ) HANGUL SYLLABLE SWEBS +C263;C263;1109 1170 11BA;C263;1109 1170 11BA; # (쉣; 쉣; 쉣; 쉣; 쉣; ) HANGUL SYLLABLE SWES +C264;C264;1109 1170 11BB;C264;1109 1170 11BB; # (쉤; 쉤; 쉤; 쉤; 쉤; ) HANGUL SYLLABLE SWESS +C265;C265;1109 1170 11BC;C265;1109 1170 11BC; # (쉥; 쉥; 쉥; 쉥; 쉥; ) HANGUL SYLLABLE SWENG +C266;C266;1109 1170 11BD;C266;1109 1170 11BD; # (쉦; 쉦; 쉦; 쉦; 쉦; ) HANGUL SYLLABLE SWEJ +C267;C267;1109 1170 11BE;C267;1109 1170 11BE; # (쉧; 쉧; 쉧; 쉧; 쉧; ) HANGUL SYLLABLE SWEC +C268;C268;1109 1170 11BF;C268;1109 1170 11BF; # (쉨; 쉨; 쉨; 쉨; 쉨; ) HANGUL SYLLABLE SWEK +C269;C269;1109 1170 11C0;C269;1109 1170 11C0; # (쉩; 쉩; 쉩; 쉩; 쉩; ) HANGUL SYLLABLE SWET +C26A;C26A;1109 1170 11C1;C26A;1109 1170 11C1; # (쉪; 쉪; 쉪; 쉪; 쉪; ) HANGUL SYLLABLE SWEP +C26B;C26B;1109 1170 11C2;C26B;1109 1170 11C2; # (쉫; 쉫; 쉫; 쉫; 쉫; ) HANGUL SYLLABLE SWEH +C26C;C26C;1109 1171;C26C;1109 1171; # (쉬; 쉬; 쉬; 쉬; 쉬; ) HANGUL SYLLABLE SWI +C26D;C26D;1109 1171 11A8;C26D;1109 1171 11A8; # (쉭; 쉭; 쉭; 쉭; 쉭; ) HANGUL SYLLABLE SWIG +C26E;C26E;1109 1171 11A9;C26E;1109 1171 11A9; # (쉮; 쉮; 쉮; 쉮; 쉮; ) HANGUL SYLLABLE SWIGG +C26F;C26F;1109 1171 11AA;C26F;1109 1171 11AA; # (쉯; 쉯; 쉯; 쉯; 쉯; ) HANGUL SYLLABLE SWIGS +C270;C270;1109 1171 11AB;C270;1109 1171 11AB; # (쉰; 쉰; 쉰; 쉰; 쉰; ) HANGUL SYLLABLE SWIN +C271;C271;1109 1171 11AC;C271;1109 1171 11AC; # (쉱; 쉱; 쉱; 쉱; 쉱; ) HANGUL SYLLABLE SWINJ +C272;C272;1109 1171 11AD;C272;1109 1171 11AD; # (쉲; 쉲; 쉲; 쉲; 쉲; ) HANGUL SYLLABLE SWINH +C273;C273;1109 1171 11AE;C273;1109 1171 11AE; # (쉳; 쉳; 쉳; 쉳; 쉳; ) HANGUL SYLLABLE SWID +C274;C274;1109 1171 11AF;C274;1109 1171 11AF; # (쉴; 쉴; 쉴; 쉴; 쉴; ) HANGUL SYLLABLE SWIL +C275;C275;1109 1171 11B0;C275;1109 1171 11B0; # (쉵; 쉵; 쉵; 쉵; 쉵; ) HANGUL SYLLABLE SWILG +C276;C276;1109 1171 11B1;C276;1109 1171 11B1; # (쉶; 쉶; 쉶; 쉶; 쉶; ) HANGUL SYLLABLE SWILM +C277;C277;1109 1171 11B2;C277;1109 1171 11B2; # (쉷; 쉷; 쉷; 쉷; 쉷; ) HANGUL SYLLABLE SWILB +C278;C278;1109 1171 11B3;C278;1109 1171 11B3; # (쉸; 쉸; 쉸; 쉸; 쉸; ) HANGUL SYLLABLE SWILS +C279;C279;1109 1171 11B4;C279;1109 1171 11B4; # (쉹; 쉹; 쉹; 쉹; 쉹; ) HANGUL SYLLABLE SWILT +C27A;C27A;1109 1171 11B5;C27A;1109 1171 11B5; # (쉺; 쉺; 쉺; 쉺; 쉺; ) HANGUL SYLLABLE SWILP +C27B;C27B;1109 1171 11B6;C27B;1109 1171 11B6; # (쉻; 쉻; 쉻; 쉻; 쉻; ) HANGUL SYLLABLE SWILH +C27C;C27C;1109 1171 11B7;C27C;1109 1171 11B7; # (쉼; 쉼; 쉼; 쉼; 쉼; ) HANGUL SYLLABLE SWIM +C27D;C27D;1109 1171 11B8;C27D;1109 1171 11B8; # (쉽; 쉽; 쉽; 쉽; 쉽; ) HANGUL SYLLABLE SWIB +C27E;C27E;1109 1171 11B9;C27E;1109 1171 11B9; # (쉾; 쉾; 쉾; 쉾; 쉾; ) HANGUL SYLLABLE SWIBS +C27F;C27F;1109 1171 11BA;C27F;1109 1171 11BA; # (쉿; 쉿; 쉿; 쉿; 쉿; ) HANGUL SYLLABLE SWIS +C280;C280;1109 1171 11BB;C280;1109 1171 11BB; # (슀; 슀; 슀; 슀; 슀; ) HANGUL SYLLABLE SWISS +C281;C281;1109 1171 11BC;C281;1109 1171 11BC; # (슁; 슁; 슁; 슁; 슁; ) HANGUL SYLLABLE SWING +C282;C282;1109 1171 11BD;C282;1109 1171 11BD; # (슂; 슂; 슂; 슂; 슂; ) HANGUL SYLLABLE SWIJ +C283;C283;1109 1171 11BE;C283;1109 1171 11BE; # (슃; 슃; 슃; 슃; 슃; ) HANGUL SYLLABLE SWIC +C284;C284;1109 1171 11BF;C284;1109 1171 11BF; # (슄; 슄; 슄; 슄; 슄; ) HANGUL SYLLABLE SWIK +C285;C285;1109 1171 11C0;C285;1109 1171 11C0; # (슅; 슅; 슅; 슅; 슅; ) HANGUL SYLLABLE SWIT +C286;C286;1109 1171 11C1;C286;1109 1171 11C1; # (슆; 슆; 슆; 슆; 슆; ) HANGUL SYLLABLE SWIP +C287;C287;1109 1171 11C2;C287;1109 1171 11C2; # (슇; 슇; 슇; 슇; 슇; ) HANGUL SYLLABLE SWIH +C288;C288;1109 1172;C288;1109 1172; # (슈; 슈; 슈; 슈; 슈; ) HANGUL SYLLABLE SYU +C289;C289;1109 1172 11A8;C289;1109 1172 11A8; # (슉; 슉; 슉; 슉; 슉; ) HANGUL SYLLABLE SYUG +C28A;C28A;1109 1172 11A9;C28A;1109 1172 11A9; # (슊; 슊; 슊; 슊; 슊; ) HANGUL SYLLABLE SYUGG +C28B;C28B;1109 1172 11AA;C28B;1109 1172 11AA; # (슋; 슋; 슋; 슋; 슋; ) HANGUL SYLLABLE SYUGS +C28C;C28C;1109 1172 11AB;C28C;1109 1172 11AB; # (슌; 슌; 슌; 슌; 슌; ) HANGUL SYLLABLE SYUN +C28D;C28D;1109 1172 11AC;C28D;1109 1172 11AC; # (슍; 슍; 슍; 슍; 슍; ) HANGUL SYLLABLE SYUNJ +C28E;C28E;1109 1172 11AD;C28E;1109 1172 11AD; # (슎; 슎; 슎; 슎; 슎; ) HANGUL SYLLABLE SYUNH +C28F;C28F;1109 1172 11AE;C28F;1109 1172 11AE; # (슏; 슏; 슏; 슏; 슏; ) HANGUL SYLLABLE SYUD +C290;C290;1109 1172 11AF;C290;1109 1172 11AF; # (슐; 슐; 슐; 슐; 슐; ) HANGUL SYLLABLE SYUL +C291;C291;1109 1172 11B0;C291;1109 1172 11B0; # (슑; 슑; 슑; 슑; 슑; ) HANGUL SYLLABLE SYULG +C292;C292;1109 1172 11B1;C292;1109 1172 11B1; # (슒; 슒; 슒; 슒; 슒; ) HANGUL SYLLABLE SYULM +C293;C293;1109 1172 11B2;C293;1109 1172 11B2; # (슓; 슓; 슓; 슓; 슓; ) HANGUL SYLLABLE SYULB +C294;C294;1109 1172 11B3;C294;1109 1172 11B3; # (슔; 슔; 슔; 슔; 슔; ) HANGUL SYLLABLE SYULS +C295;C295;1109 1172 11B4;C295;1109 1172 11B4; # (슕; 슕; 슕; 슕; 슕; ) HANGUL SYLLABLE SYULT +C296;C296;1109 1172 11B5;C296;1109 1172 11B5; # (슖; 슖; 슖; 슖; 슖; ) HANGUL SYLLABLE SYULP +C297;C297;1109 1172 11B6;C297;1109 1172 11B6; # (슗; 슗; 슗; 슗; 슗; ) HANGUL SYLLABLE SYULH +C298;C298;1109 1172 11B7;C298;1109 1172 11B7; # (슘; 슘; 슘; 슘; 슘; ) HANGUL SYLLABLE SYUM +C299;C299;1109 1172 11B8;C299;1109 1172 11B8; # (슙; 슙; 슙; 슙; 슙; ) HANGUL SYLLABLE SYUB +C29A;C29A;1109 1172 11B9;C29A;1109 1172 11B9; # (슚; 슚; 슚; 슚; 슚; ) HANGUL SYLLABLE SYUBS +C29B;C29B;1109 1172 11BA;C29B;1109 1172 11BA; # (슛; 슛; 슛; 슛; 슛; ) HANGUL SYLLABLE SYUS +C29C;C29C;1109 1172 11BB;C29C;1109 1172 11BB; # (슜; 슜; 슜; 슜; 슜; ) HANGUL SYLLABLE SYUSS +C29D;C29D;1109 1172 11BC;C29D;1109 1172 11BC; # (슝; 슝; 슝; 슝; 슝; ) HANGUL SYLLABLE SYUNG +C29E;C29E;1109 1172 11BD;C29E;1109 1172 11BD; # (슞; 슞; 슞; 슞; 슞; ) HANGUL SYLLABLE SYUJ +C29F;C29F;1109 1172 11BE;C29F;1109 1172 11BE; # (슟; 슟; 슟; 슟; 슟; ) HANGUL SYLLABLE SYUC +C2A0;C2A0;1109 1172 11BF;C2A0;1109 1172 11BF; # (슠; 슠; 슠; 슠; 슠; ) HANGUL SYLLABLE SYUK +C2A1;C2A1;1109 1172 11C0;C2A1;1109 1172 11C0; # (슡; 슡; 슡; 슡; 슡; ) HANGUL SYLLABLE SYUT +C2A2;C2A2;1109 1172 11C1;C2A2;1109 1172 11C1; # (슢; 슢; 슢; 슢; 슢; ) HANGUL SYLLABLE SYUP +C2A3;C2A3;1109 1172 11C2;C2A3;1109 1172 11C2; # (슣; 슣; 슣; 슣; 슣; ) HANGUL SYLLABLE SYUH +C2A4;C2A4;1109 1173;C2A4;1109 1173; # (스; 스; 스; 스; 스; ) HANGUL SYLLABLE SEU +C2A5;C2A5;1109 1173 11A8;C2A5;1109 1173 11A8; # (슥; 슥; 슥; 슥; 슥; ) HANGUL SYLLABLE SEUG +C2A6;C2A6;1109 1173 11A9;C2A6;1109 1173 11A9; # (슦; 슦; 슦; 슦; 슦; ) HANGUL SYLLABLE SEUGG +C2A7;C2A7;1109 1173 11AA;C2A7;1109 1173 11AA; # (슧; 슧; 슧; 슧; 슧; ) HANGUL SYLLABLE SEUGS +C2A8;C2A8;1109 1173 11AB;C2A8;1109 1173 11AB; # (슨; 슨; 슨; 슨; 슨; ) HANGUL SYLLABLE SEUN +C2A9;C2A9;1109 1173 11AC;C2A9;1109 1173 11AC; # (슩; 슩; 슩; 슩; 슩; ) HANGUL SYLLABLE SEUNJ +C2AA;C2AA;1109 1173 11AD;C2AA;1109 1173 11AD; # (슪; 슪; 슪; 슪; 슪; ) HANGUL SYLLABLE SEUNH +C2AB;C2AB;1109 1173 11AE;C2AB;1109 1173 11AE; # (슫; 슫; 슫; 슫; 슫; ) HANGUL SYLLABLE SEUD +C2AC;C2AC;1109 1173 11AF;C2AC;1109 1173 11AF; # (슬; 슬; 슬; 슬; 슬; ) HANGUL SYLLABLE SEUL +C2AD;C2AD;1109 1173 11B0;C2AD;1109 1173 11B0; # (슭; 슭; 슭; 슭; 슭; ) HANGUL SYLLABLE SEULG +C2AE;C2AE;1109 1173 11B1;C2AE;1109 1173 11B1; # (슮; 슮; 슮; 슮; 슮; ) HANGUL SYLLABLE SEULM +C2AF;C2AF;1109 1173 11B2;C2AF;1109 1173 11B2; # (슯; 슯; 슯; 슯; 슯; ) HANGUL SYLLABLE SEULB +C2B0;C2B0;1109 1173 11B3;C2B0;1109 1173 11B3; # (슰; 슰; 슰; 슰; 슰; ) HANGUL SYLLABLE SEULS +C2B1;C2B1;1109 1173 11B4;C2B1;1109 1173 11B4; # (슱; 슱; 슱; 슱; 슱; ) HANGUL SYLLABLE SEULT +C2B2;C2B2;1109 1173 11B5;C2B2;1109 1173 11B5; # (슲; 슲; 슲; 슲; 슲; ) HANGUL SYLLABLE SEULP +C2B3;C2B3;1109 1173 11B6;C2B3;1109 1173 11B6; # (슳; 슳; 슳; 슳; 슳; ) HANGUL SYLLABLE SEULH +C2B4;C2B4;1109 1173 11B7;C2B4;1109 1173 11B7; # (슴; 슴; 슴; 슴; 슴; ) HANGUL SYLLABLE SEUM +C2B5;C2B5;1109 1173 11B8;C2B5;1109 1173 11B8; # (습; 습; 습; 습; 습; ) HANGUL SYLLABLE SEUB +C2B6;C2B6;1109 1173 11B9;C2B6;1109 1173 11B9; # (슶; 슶; 슶; 슶; 슶; ) HANGUL SYLLABLE SEUBS +C2B7;C2B7;1109 1173 11BA;C2B7;1109 1173 11BA; # (슷; 슷; 슷; 슷; 슷; ) HANGUL SYLLABLE SEUS +C2B8;C2B8;1109 1173 11BB;C2B8;1109 1173 11BB; # (슸; 슸; 슸; 슸; 슸; ) HANGUL SYLLABLE SEUSS +C2B9;C2B9;1109 1173 11BC;C2B9;1109 1173 11BC; # (승; 승; 승; 승; 승; ) HANGUL SYLLABLE SEUNG +C2BA;C2BA;1109 1173 11BD;C2BA;1109 1173 11BD; # (슺; 슺; 슺; 슺; 슺; ) HANGUL SYLLABLE SEUJ +C2BB;C2BB;1109 1173 11BE;C2BB;1109 1173 11BE; # (슻; 슻; 슻; 슻; 슻; ) HANGUL SYLLABLE SEUC +C2BC;C2BC;1109 1173 11BF;C2BC;1109 1173 11BF; # (슼; 슼; 슼; 슼; 슼; ) HANGUL SYLLABLE SEUK +C2BD;C2BD;1109 1173 11C0;C2BD;1109 1173 11C0; # (슽; 슽; 슽; 슽; 슽; ) HANGUL SYLLABLE SEUT +C2BE;C2BE;1109 1173 11C1;C2BE;1109 1173 11C1; # (슾; 슾; 슾; 슾; 슾; ) HANGUL SYLLABLE SEUP +C2BF;C2BF;1109 1173 11C2;C2BF;1109 1173 11C2; # (슿; 슿; 슿; 슿; 슿; ) HANGUL SYLLABLE SEUH +C2C0;C2C0;1109 1174;C2C0;1109 1174; # (싀; 싀; 싀; 싀; 싀; ) HANGUL SYLLABLE SYI +C2C1;C2C1;1109 1174 11A8;C2C1;1109 1174 11A8; # (싁; 싁; 싁; 싁; 싁; ) HANGUL SYLLABLE SYIG +C2C2;C2C2;1109 1174 11A9;C2C2;1109 1174 11A9; # (싂; 싂; 싂; 싂; 싂; ) HANGUL SYLLABLE SYIGG +C2C3;C2C3;1109 1174 11AA;C2C3;1109 1174 11AA; # (싃; 싃; 싃; 싃; 싃; ) HANGUL SYLLABLE SYIGS +C2C4;C2C4;1109 1174 11AB;C2C4;1109 1174 11AB; # (싄; 싄; 싄; 싄; 싄; ) HANGUL SYLLABLE SYIN +C2C5;C2C5;1109 1174 11AC;C2C5;1109 1174 11AC; # (싅; 싅; 싅; 싅; 싅; ) HANGUL SYLLABLE SYINJ +C2C6;C2C6;1109 1174 11AD;C2C6;1109 1174 11AD; # (싆; 싆; 싆; 싆; 싆; ) HANGUL SYLLABLE SYINH +C2C7;C2C7;1109 1174 11AE;C2C7;1109 1174 11AE; # (싇; 싇; 싇; 싇; 싇; ) HANGUL SYLLABLE SYID +C2C8;C2C8;1109 1174 11AF;C2C8;1109 1174 11AF; # (싈; 싈; 싈; 싈; 싈; ) HANGUL SYLLABLE SYIL +C2C9;C2C9;1109 1174 11B0;C2C9;1109 1174 11B0; # (싉; 싉; 싉; 싉; 싉; ) HANGUL SYLLABLE SYILG +C2CA;C2CA;1109 1174 11B1;C2CA;1109 1174 11B1; # (싊; 싊; 싊; 싊; 싊; ) HANGUL SYLLABLE SYILM +C2CB;C2CB;1109 1174 11B2;C2CB;1109 1174 11B2; # (싋; 싋; 싋; 싋; 싋; ) HANGUL SYLLABLE SYILB +C2CC;C2CC;1109 1174 11B3;C2CC;1109 1174 11B3; # (싌; 싌; 싌; 싌; 싌; ) HANGUL SYLLABLE SYILS +C2CD;C2CD;1109 1174 11B4;C2CD;1109 1174 11B4; # (싍; 싍; 싍; 싍; 싍; ) HANGUL SYLLABLE SYILT +C2CE;C2CE;1109 1174 11B5;C2CE;1109 1174 11B5; # (싎; 싎; 싎; 싎; 싎; ) HANGUL SYLLABLE SYILP +C2CF;C2CF;1109 1174 11B6;C2CF;1109 1174 11B6; # (싏; 싏; 싏; 싏; 싏; ) HANGUL SYLLABLE SYILH +C2D0;C2D0;1109 1174 11B7;C2D0;1109 1174 11B7; # (싐; 싐; 싐; 싐; 싐; ) HANGUL SYLLABLE SYIM +C2D1;C2D1;1109 1174 11B8;C2D1;1109 1174 11B8; # (싑; 싑; 싑; 싑; 싑; ) HANGUL SYLLABLE SYIB +C2D2;C2D2;1109 1174 11B9;C2D2;1109 1174 11B9; # (싒; 싒; 싒; 싒; 싒; ) HANGUL SYLLABLE SYIBS +C2D3;C2D3;1109 1174 11BA;C2D3;1109 1174 11BA; # (싓; 싓; 싓; 싓; 싓; ) HANGUL SYLLABLE SYIS +C2D4;C2D4;1109 1174 11BB;C2D4;1109 1174 11BB; # (싔; 싔; 싔; 싔; 싔; ) HANGUL SYLLABLE SYISS +C2D5;C2D5;1109 1174 11BC;C2D5;1109 1174 11BC; # (싕; 싕; 싕; 싕; 싕; ) HANGUL SYLLABLE SYING +C2D6;C2D6;1109 1174 11BD;C2D6;1109 1174 11BD; # (싖; 싖; 싖; 싖; 싖; ) HANGUL SYLLABLE SYIJ +C2D7;C2D7;1109 1174 11BE;C2D7;1109 1174 11BE; # (싗; 싗; 싗; 싗; 싗; ) HANGUL SYLLABLE SYIC +C2D8;C2D8;1109 1174 11BF;C2D8;1109 1174 11BF; # (싘; 싘; 싘; 싘; 싘; ) HANGUL SYLLABLE SYIK +C2D9;C2D9;1109 1174 11C0;C2D9;1109 1174 11C0; # (싙; 싙; 싙; 싙; 싙; ) HANGUL SYLLABLE SYIT +C2DA;C2DA;1109 1174 11C1;C2DA;1109 1174 11C1; # (싚; 싚; 싚; 싚; 싚; ) HANGUL SYLLABLE SYIP +C2DB;C2DB;1109 1174 11C2;C2DB;1109 1174 11C2; # (싛; 싛; 싛; 싛; 싛; ) HANGUL SYLLABLE SYIH +C2DC;C2DC;1109 1175;C2DC;1109 1175; # (시; 시; 시; 시; 시; ) HANGUL SYLLABLE SI +C2DD;C2DD;1109 1175 11A8;C2DD;1109 1175 11A8; # (식; 식; 식; 식; 식; ) HANGUL SYLLABLE SIG +C2DE;C2DE;1109 1175 11A9;C2DE;1109 1175 11A9; # (싞; 싞; 싞; 싞; 싞; ) HANGUL SYLLABLE SIGG +C2DF;C2DF;1109 1175 11AA;C2DF;1109 1175 11AA; # (싟; 싟; 싟; 싟; 싟; ) HANGUL SYLLABLE SIGS +C2E0;C2E0;1109 1175 11AB;C2E0;1109 1175 11AB; # (신; 신; 신; 신; 신; ) HANGUL SYLLABLE SIN +C2E1;C2E1;1109 1175 11AC;C2E1;1109 1175 11AC; # (싡; 싡; 싡; 싡; 싡; ) HANGUL SYLLABLE SINJ +C2E2;C2E2;1109 1175 11AD;C2E2;1109 1175 11AD; # (싢; 싢; 싢; 싢; 싢; ) HANGUL SYLLABLE SINH +C2E3;C2E3;1109 1175 11AE;C2E3;1109 1175 11AE; # (싣; 싣; 싣; 싣; 싣; ) HANGUL SYLLABLE SID +C2E4;C2E4;1109 1175 11AF;C2E4;1109 1175 11AF; # (실; 실; 실; 실; 실; ) HANGUL SYLLABLE SIL +C2E5;C2E5;1109 1175 11B0;C2E5;1109 1175 11B0; # (싥; 싥; 싥; 싥; 싥; ) HANGUL SYLLABLE SILG +C2E6;C2E6;1109 1175 11B1;C2E6;1109 1175 11B1; # (싦; 싦; 싦; 싦; 싦; ) HANGUL SYLLABLE SILM +C2E7;C2E7;1109 1175 11B2;C2E7;1109 1175 11B2; # (싧; 싧; 싧; 싧; 싧; ) HANGUL SYLLABLE SILB +C2E8;C2E8;1109 1175 11B3;C2E8;1109 1175 11B3; # (싨; 싨; 싨; 싨; 싨; ) HANGUL SYLLABLE SILS +C2E9;C2E9;1109 1175 11B4;C2E9;1109 1175 11B4; # (싩; 싩; 싩; 싩; 싩; ) HANGUL SYLLABLE SILT +C2EA;C2EA;1109 1175 11B5;C2EA;1109 1175 11B5; # (싪; 싪; 싪; 싪; 싪; ) HANGUL SYLLABLE SILP +C2EB;C2EB;1109 1175 11B6;C2EB;1109 1175 11B6; # (싫; 싫; 싫; 싫; 싫; ) HANGUL SYLLABLE SILH +C2EC;C2EC;1109 1175 11B7;C2EC;1109 1175 11B7; # (심; 심; 심; 심; 심; ) HANGUL SYLLABLE SIM +C2ED;C2ED;1109 1175 11B8;C2ED;1109 1175 11B8; # (십; 십; 십; 십; 십; ) HANGUL SYLLABLE SIB +C2EE;C2EE;1109 1175 11B9;C2EE;1109 1175 11B9; # (싮; 싮; 싮; 싮; 싮; ) HANGUL SYLLABLE SIBS +C2EF;C2EF;1109 1175 11BA;C2EF;1109 1175 11BA; # (싯; 싯; 싯; 싯; 싯; ) HANGUL SYLLABLE SIS +C2F0;C2F0;1109 1175 11BB;C2F0;1109 1175 11BB; # (싰; 싰; 싰; 싰; 싰; ) HANGUL SYLLABLE SISS +C2F1;C2F1;1109 1175 11BC;C2F1;1109 1175 11BC; # (싱; 싱; 싱; 싱; 싱; ) HANGUL SYLLABLE SING +C2F2;C2F2;1109 1175 11BD;C2F2;1109 1175 11BD; # (싲; 싲; 싲; 싲; 싲; ) HANGUL SYLLABLE SIJ +C2F3;C2F3;1109 1175 11BE;C2F3;1109 1175 11BE; # (싳; 싳; 싳; 싳; 싳; ) HANGUL SYLLABLE SIC +C2F4;C2F4;1109 1175 11BF;C2F4;1109 1175 11BF; # (싴; 싴; 싴; 싴; 싴; ) HANGUL SYLLABLE SIK +C2F5;C2F5;1109 1175 11C0;C2F5;1109 1175 11C0; # (싵; 싵; 싵; 싵; 싵; ) HANGUL SYLLABLE SIT +C2F6;C2F6;1109 1175 11C1;C2F6;1109 1175 11C1; # (싶; 싶; 싶; 싶; 싶; ) HANGUL SYLLABLE SIP +C2F7;C2F7;1109 1175 11C2;C2F7;1109 1175 11C2; # (싷; 싷; 싷; 싷; 싷; ) HANGUL SYLLABLE SIH +C2F8;C2F8;110A 1161;C2F8;110A 1161; # (싸; 싸; 싸; 싸; 싸; ) HANGUL SYLLABLE SSA +C2F9;C2F9;110A 1161 11A8;C2F9;110A 1161 11A8; # (싹; 싹; 싹; 싹; 싹; ) HANGUL SYLLABLE SSAG +C2FA;C2FA;110A 1161 11A9;C2FA;110A 1161 11A9; # (싺; 싺; 싺; 싺; 싺; ) HANGUL SYLLABLE SSAGG +C2FB;C2FB;110A 1161 11AA;C2FB;110A 1161 11AA; # (싻; 싻; 싻; 싻; 싻; ) HANGUL SYLLABLE SSAGS +C2FC;C2FC;110A 1161 11AB;C2FC;110A 1161 11AB; # (싼; 싼; 싼; 싼; 싼; ) HANGUL SYLLABLE SSAN +C2FD;C2FD;110A 1161 11AC;C2FD;110A 1161 11AC; # (싽; 싽; 싽; 싽; 싽; ) HANGUL SYLLABLE SSANJ +C2FE;C2FE;110A 1161 11AD;C2FE;110A 1161 11AD; # (싾; 싾; 싾; 싾; 싾; ) HANGUL SYLLABLE SSANH +C2FF;C2FF;110A 1161 11AE;C2FF;110A 1161 11AE; # (싿; 싿; 싿; 싿; 싿; ) HANGUL SYLLABLE SSAD +C300;C300;110A 1161 11AF;C300;110A 1161 11AF; # (쌀; 쌀; 쌀; 쌀; 쌀; ) HANGUL SYLLABLE SSAL +C301;C301;110A 1161 11B0;C301;110A 1161 11B0; # (쌁; 쌁; 쌁; 쌁; 쌁; ) HANGUL SYLLABLE SSALG +C302;C302;110A 1161 11B1;C302;110A 1161 11B1; # (쌂; 쌂; 쌂; 쌂; 쌂; ) HANGUL SYLLABLE SSALM +C303;C303;110A 1161 11B2;C303;110A 1161 11B2; # (쌃; 쌃; 쌃; 쌃; 쌃; ) HANGUL SYLLABLE SSALB +C304;C304;110A 1161 11B3;C304;110A 1161 11B3; # (쌄; 쌄; 쌄; 쌄; 쌄; ) HANGUL SYLLABLE SSALS +C305;C305;110A 1161 11B4;C305;110A 1161 11B4; # (쌅; 쌅; 쌅; 쌅; 쌅; ) HANGUL SYLLABLE SSALT +C306;C306;110A 1161 11B5;C306;110A 1161 11B5; # (쌆; 쌆; 쌆; 쌆; 쌆; ) HANGUL SYLLABLE SSALP +C307;C307;110A 1161 11B6;C307;110A 1161 11B6; # (쌇; 쌇; 쌇; 쌇; 쌇; ) HANGUL SYLLABLE SSALH +C308;C308;110A 1161 11B7;C308;110A 1161 11B7; # (쌈; 쌈; 쌈; 쌈; 쌈; ) HANGUL SYLLABLE SSAM +C309;C309;110A 1161 11B8;C309;110A 1161 11B8; # (쌉; 쌉; 쌉; 쌉; 쌉; ) HANGUL SYLLABLE SSAB +C30A;C30A;110A 1161 11B9;C30A;110A 1161 11B9; # (쌊; 쌊; 쌊; 쌊; 쌊; ) HANGUL SYLLABLE SSABS +C30B;C30B;110A 1161 11BA;C30B;110A 1161 11BA; # (쌋; 쌋; 쌋; 쌋; 쌋; ) HANGUL SYLLABLE SSAS +C30C;C30C;110A 1161 11BB;C30C;110A 1161 11BB; # (쌌; 쌌; 쌌; 쌌; 쌌; ) HANGUL SYLLABLE SSASS +C30D;C30D;110A 1161 11BC;C30D;110A 1161 11BC; # (쌍; 쌍; 쌍; 쌍; 쌍; ) HANGUL SYLLABLE SSANG +C30E;C30E;110A 1161 11BD;C30E;110A 1161 11BD; # (쌎; 쌎; 쌎; 쌎; 쌎; ) HANGUL SYLLABLE SSAJ +C30F;C30F;110A 1161 11BE;C30F;110A 1161 11BE; # (쌏; 쌏; 쌏; 쌏; 쌏; ) HANGUL SYLLABLE SSAC +C310;C310;110A 1161 11BF;C310;110A 1161 11BF; # (쌐; 쌐; 쌐; 쌐; 쌐; ) HANGUL SYLLABLE SSAK +C311;C311;110A 1161 11C0;C311;110A 1161 11C0; # (쌑; 쌑; 쌑; 쌑; 쌑; ) HANGUL SYLLABLE SSAT +C312;C312;110A 1161 11C1;C312;110A 1161 11C1; # (쌒; 쌒; 쌒; 쌒; 쌒; ) HANGUL SYLLABLE SSAP +C313;C313;110A 1161 11C2;C313;110A 1161 11C2; # (쌓; 쌓; 쌓; 쌓; 쌓; ) HANGUL SYLLABLE SSAH +C314;C314;110A 1162;C314;110A 1162; # (쌔; 쌔; 쌔; 쌔; 쌔; ) HANGUL SYLLABLE SSAE +C315;C315;110A 1162 11A8;C315;110A 1162 11A8; # (쌕; 쌕; 쌕; 쌕; 쌕; ) HANGUL SYLLABLE SSAEG +C316;C316;110A 1162 11A9;C316;110A 1162 11A9; # (쌖; 쌖; 쌖; 쌖; 쌖; ) HANGUL SYLLABLE SSAEGG +C317;C317;110A 1162 11AA;C317;110A 1162 11AA; # (쌗; 쌗; 쌗; 쌗; 쌗; ) HANGUL SYLLABLE SSAEGS +C318;C318;110A 1162 11AB;C318;110A 1162 11AB; # (쌘; 쌘; 쌘; 쌘; 쌘; ) HANGUL SYLLABLE SSAEN +C319;C319;110A 1162 11AC;C319;110A 1162 11AC; # (쌙; 쌙; 쌙; 쌙; 쌙; ) HANGUL SYLLABLE SSAENJ +C31A;C31A;110A 1162 11AD;C31A;110A 1162 11AD; # (쌚; 쌚; 쌚; 쌚; 쌚; ) HANGUL SYLLABLE SSAENH +C31B;C31B;110A 1162 11AE;C31B;110A 1162 11AE; # (쌛; 쌛; 쌛; 쌛; 쌛; ) HANGUL SYLLABLE SSAED +C31C;C31C;110A 1162 11AF;C31C;110A 1162 11AF; # (쌜; 쌜; 쌜; 쌜; 쌜; ) HANGUL SYLLABLE SSAEL +C31D;C31D;110A 1162 11B0;C31D;110A 1162 11B0; # (쌝; 쌝; 쌝; 쌝; 쌝; ) HANGUL SYLLABLE SSAELG +C31E;C31E;110A 1162 11B1;C31E;110A 1162 11B1; # (쌞; 쌞; 쌞; 쌞; 쌞; ) HANGUL SYLLABLE SSAELM +C31F;C31F;110A 1162 11B2;C31F;110A 1162 11B2; # (쌟; 쌟; 쌟; 쌟; 쌟; ) HANGUL SYLLABLE SSAELB +C320;C320;110A 1162 11B3;C320;110A 1162 11B3; # (쌠; 쌠; 쌠; 쌠; 쌠; ) HANGUL SYLLABLE SSAELS +C321;C321;110A 1162 11B4;C321;110A 1162 11B4; # (쌡; 쌡; 쌡; 쌡; 쌡; ) HANGUL SYLLABLE SSAELT +C322;C322;110A 1162 11B5;C322;110A 1162 11B5; # (쌢; 쌢; 쌢; 쌢; 쌢; ) HANGUL SYLLABLE SSAELP +C323;C323;110A 1162 11B6;C323;110A 1162 11B6; # (쌣; 쌣; 쌣; 쌣; 쌣; ) HANGUL SYLLABLE SSAELH +C324;C324;110A 1162 11B7;C324;110A 1162 11B7; # (쌤; 쌤; 쌤; 쌤; 쌤; ) HANGUL SYLLABLE SSAEM +C325;C325;110A 1162 11B8;C325;110A 1162 11B8; # (쌥; 쌥; 쌥; 쌥; 쌥; ) HANGUL SYLLABLE SSAEB +C326;C326;110A 1162 11B9;C326;110A 1162 11B9; # (쌦; 쌦; 쌦; 쌦; 쌦; ) HANGUL SYLLABLE SSAEBS +C327;C327;110A 1162 11BA;C327;110A 1162 11BA; # (쌧; 쌧; 쌧; 쌧; 쌧; ) HANGUL SYLLABLE SSAES +C328;C328;110A 1162 11BB;C328;110A 1162 11BB; # (쌨; 쌨; 쌨; 쌨; 쌨; ) HANGUL SYLLABLE SSAESS +C329;C329;110A 1162 11BC;C329;110A 1162 11BC; # (쌩; 쌩; 쌩; 쌩; 쌩; ) HANGUL SYLLABLE SSAENG +C32A;C32A;110A 1162 11BD;C32A;110A 1162 11BD; # (쌪; 쌪; 쌪; 쌪; 쌪; ) HANGUL SYLLABLE SSAEJ +C32B;C32B;110A 1162 11BE;C32B;110A 1162 11BE; # (쌫; 쌫; 쌫; 쌫; 쌫; ) HANGUL SYLLABLE SSAEC +C32C;C32C;110A 1162 11BF;C32C;110A 1162 11BF; # (쌬; 쌬; 쌬; 쌬; 쌬; ) HANGUL SYLLABLE SSAEK +C32D;C32D;110A 1162 11C0;C32D;110A 1162 11C0; # (쌭; 쌭; 쌭; 쌭; 쌭; ) HANGUL SYLLABLE SSAET +C32E;C32E;110A 1162 11C1;C32E;110A 1162 11C1; # (쌮; 쌮; 쌮; 쌮; 쌮; ) HANGUL SYLLABLE SSAEP +C32F;C32F;110A 1162 11C2;C32F;110A 1162 11C2; # (쌯; 쌯; 쌯; 쌯; 쌯; ) HANGUL SYLLABLE SSAEH +C330;C330;110A 1163;C330;110A 1163; # (쌰; 쌰; 쌰; 쌰; 쌰; ) HANGUL SYLLABLE SSYA +C331;C331;110A 1163 11A8;C331;110A 1163 11A8; # (쌱; 쌱; 쌱; 쌱; 쌱; ) HANGUL SYLLABLE SSYAG +C332;C332;110A 1163 11A9;C332;110A 1163 11A9; # (쌲; 쌲; 쌲; 쌲; 쌲; ) HANGUL SYLLABLE SSYAGG +C333;C333;110A 1163 11AA;C333;110A 1163 11AA; # (쌳; 쌳; 쌳; 쌳; 쌳; ) HANGUL SYLLABLE SSYAGS +C334;C334;110A 1163 11AB;C334;110A 1163 11AB; # (쌴; 쌴; 쌴; 쌴; 쌴; ) HANGUL SYLLABLE SSYAN +C335;C335;110A 1163 11AC;C335;110A 1163 11AC; # (쌵; 쌵; 쌵; 쌵; 쌵; ) HANGUL SYLLABLE SSYANJ +C336;C336;110A 1163 11AD;C336;110A 1163 11AD; # (쌶; 쌶; 쌶; 쌶; 쌶; ) HANGUL SYLLABLE SSYANH +C337;C337;110A 1163 11AE;C337;110A 1163 11AE; # (쌷; 쌷; 쌷; 쌷; 쌷; ) HANGUL SYLLABLE SSYAD +C338;C338;110A 1163 11AF;C338;110A 1163 11AF; # (쌸; 쌸; 쌸; 쌸; 쌸; ) HANGUL SYLLABLE SSYAL +C339;C339;110A 1163 11B0;C339;110A 1163 11B0; # (쌹; 쌹; 쌹; 쌹; 쌹; ) HANGUL SYLLABLE SSYALG +C33A;C33A;110A 1163 11B1;C33A;110A 1163 11B1; # (쌺; 쌺; 쌺; 쌺; 쌺; ) HANGUL SYLLABLE SSYALM +C33B;C33B;110A 1163 11B2;C33B;110A 1163 11B2; # (쌻; 쌻; 쌻; 쌻; 쌻; ) HANGUL SYLLABLE SSYALB +C33C;C33C;110A 1163 11B3;C33C;110A 1163 11B3; # (쌼; 쌼; 쌼; 쌼; 쌼; ) HANGUL SYLLABLE SSYALS +C33D;C33D;110A 1163 11B4;C33D;110A 1163 11B4; # (쌽; 쌽; 쌽; 쌽; 쌽; ) HANGUL SYLLABLE SSYALT +C33E;C33E;110A 1163 11B5;C33E;110A 1163 11B5; # (쌾; 쌾; 쌾; 쌾; 쌾; ) HANGUL SYLLABLE SSYALP +C33F;C33F;110A 1163 11B6;C33F;110A 1163 11B6; # (쌿; 쌿; 쌿; 쌿; 쌿; ) HANGUL SYLLABLE SSYALH +C340;C340;110A 1163 11B7;C340;110A 1163 11B7; # (썀; 썀; 썀; 썀; 썀; ) HANGUL SYLLABLE SSYAM +C341;C341;110A 1163 11B8;C341;110A 1163 11B8; # (썁; 썁; 썁; 썁; 썁; ) HANGUL SYLLABLE SSYAB +C342;C342;110A 1163 11B9;C342;110A 1163 11B9; # (썂; 썂; 썂; 썂; 썂; ) HANGUL SYLLABLE SSYABS +C343;C343;110A 1163 11BA;C343;110A 1163 11BA; # (썃; 썃; 썃; 썃; 썃; ) HANGUL SYLLABLE SSYAS +C344;C344;110A 1163 11BB;C344;110A 1163 11BB; # (썄; 썄; 썄; 썄; 썄; ) HANGUL SYLLABLE SSYASS +C345;C345;110A 1163 11BC;C345;110A 1163 11BC; # (썅; 썅; 썅; 썅; 썅; ) HANGUL SYLLABLE SSYANG +C346;C346;110A 1163 11BD;C346;110A 1163 11BD; # (썆; 썆; 썆; 썆; 썆; ) HANGUL SYLLABLE SSYAJ +C347;C347;110A 1163 11BE;C347;110A 1163 11BE; # (썇; 썇; 썇; 썇; 썇; ) HANGUL SYLLABLE SSYAC +C348;C348;110A 1163 11BF;C348;110A 1163 11BF; # (썈; 썈; 썈; 썈; 썈; ) HANGUL SYLLABLE SSYAK +C349;C349;110A 1163 11C0;C349;110A 1163 11C0; # (썉; 썉; 썉; 썉; 썉; ) HANGUL SYLLABLE SSYAT +C34A;C34A;110A 1163 11C1;C34A;110A 1163 11C1; # (썊; 썊; 썊; 썊; 썊; ) HANGUL SYLLABLE SSYAP +C34B;C34B;110A 1163 11C2;C34B;110A 1163 11C2; # (썋; 썋; 썋; 썋; 썋; ) HANGUL SYLLABLE SSYAH +C34C;C34C;110A 1164;C34C;110A 1164; # (썌; 썌; 썌; 썌; 썌; ) HANGUL SYLLABLE SSYAE +C34D;C34D;110A 1164 11A8;C34D;110A 1164 11A8; # (썍; 썍; 썍; 썍; 썍; ) HANGUL SYLLABLE SSYAEG +C34E;C34E;110A 1164 11A9;C34E;110A 1164 11A9; # (썎; 썎; 썎; 썎; 썎; ) HANGUL SYLLABLE SSYAEGG +C34F;C34F;110A 1164 11AA;C34F;110A 1164 11AA; # (썏; 썏; 썏; 썏; 썏; ) HANGUL SYLLABLE SSYAEGS +C350;C350;110A 1164 11AB;C350;110A 1164 11AB; # (썐; 썐; 썐; 썐; 썐; ) HANGUL SYLLABLE SSYAEN +C351;C351;110A 1164 11AC;C351;110A 1164 11AC; # (썑; 썑; 썑; 썑; 썑; ) HANGUL SYLLABLE SSYAENJ +C352;C352;110A 1164 11AD;C352;110A 1164 11AD; # (썒; 썒; 썒; 썒; 썒; ) HANGUL SYLLABLE SSYAENH +C353;C353;110A 1164 11AE;C353;110A 1164 11AE; # (썓; 썓; 썓; 썓; 썓; ) HANGUL SYLLABLE SSYAED +C354;C354;110A 1164 11AF;C354;110A 1164 11AF; # (썔; 썔; 썔; 썔; 썔; ) HANGUL SYLLABLE SSYAEL +C355;C355;110A 1164 11B0;C355;110A 1164 11B0; # (썕; 썕; 썕; 썕; 썕; ) HANGUL SYLLABLE SSYAELG +C356;C356;110A 1164 11B1;C356;110A 1164 11B1; # (썖; 썖; 썖; 썖; 썖; ) HANGUL SYLLABLE SSYAELM +C357;C357;110A 1164 11B2;C357;110A 1164 11B2; # (썗; 썗; 썗; 썗; 썗; ) HANGUL SYLLABLE SSYAELB +C358;C358;110A 1164 11B3;C358;110A 1164 11B3; # (썘; 썘; 썘; 썘; 썘; ) HANGUL SYLLABLE SSYAELS +C359;C359;110A 1164 11B4;C359;110A 1164 11B4; # (썙; 썙; 썙; 썙; 썙; ) HANGUL SYLLABLE SSYAELT +C35A;C35A;110A 1164 11B5;C35A;110A 1164 11B5; # (썚; 썚; 썚; 썚; 썚; ) HANGUL SYLLABLE SSYAELP +C35B;C35B;110A 1164 11B6;C35B;110A 1164 11B6; # (썛; 썛; 썛; 썛; 썛; ) HANGUL SYLLABLE SSYAELH +C35C;C35C;110A 1164 11B7;C35C;110A 1164 11B7; # (썜; 썜; 썜; 썜; 썜; ) HANGUL SYLLABLE SSYAEM +C35D;C35D;110A 1164 11B8;C35D;110A 1164 11B8; # (썝; 썝; 썝; 썝; 썝; ) HANGUL SYLLABLE SSYAEB +C35E;C35E;110A 1164 11B9;C35E;110A 1164 11B9; # (썞; 썞; 썞; 썞; 썞; ) HANGUL SYLLABLE SSYAEBS +C35F;C35F;110A 1164 11BA;C35F;110A 1164 11BA; # (썟; 썟; 썟; 썟; 썟; ) HANGUL SYLLABLE SSYAES +C360;C360;110A 1164 11BB;C360;110A 1164 11BB; # (썠; 썠; 썠; 썠; 썠; ) HANGUL SYLLABLE SSYAESS +C361;C361;110A 1164 11BC;C361;110A 1164 11BC; # (썡; 썡; 썡; 썡; 썡; ) HANGUL SYLLABLE SSYAENG +C362;C362;110A 1164 11BD;C362;110A 1164 11BD; # (썢; 썢; 썢; 썢; 썢; ) HANGUL SYLLABLE SSYAEJ +C363;C363;110A 1164 11BE;C363;110A 1164 11BE; # (썣; 썣; 썣; 썣; 썣; ) HANGUL SYLLABLE SSYAEC +C364;C364;110A 1164 11BF;C364;110A 1164 11BF; # (썤; 썤; 썤; 썤; 썤; ) HANGUL SYLLABLE SSYAEK +C365;C365;110A 1164 11C0;C365;110A 1164 11C0; # (썥; 썥; 썥; 썥; 썥; ) HANGUL SYLLABLE SSYAET +C366;C366;110A 1164 11C1;C366;110A 1164 11C1; # (썦; 썦; 썦; 썦; 썦; ) HANGUL SYLLABLE SSYAEP +C367;C367;110A 1164 11C2;C367;110A 1164 11C2; # (썧; 썧; 썧; 썧; 썧; ) HANGUL SYLLABLE SSYAEH +C368;C368;110A 1165;C368;110A 1165; # (써; 써; 써; 써; 써; ) HANGUL SYLLABLE SSEO +C369;C369;110A 1165 11A8;C369;110A 1165 11A8; # (썩; 썩; 썩; 썩; 썩; ) HANGUL SYLLABLE SSEOG +C36A;C36A;110A 1165 11A9;C36A;110A 1165 11A9; # (썪; 썪; 썪; 썪; 썪; ) HANGUL SYLLABLE SSEOGG +C36B;C36B;110A 1165 11AA;C36B;110A 1165 11AA; # (썫; 썫; 썫; 썫; 썫; ) HANGUL SYLLABLE SSEOGS +C36C;C36C;110A 1165 11AB;C36C;110A 1165 11AB; # (썬; 썬; 썬; 썬; 썬; ) HANGUL SYLLABLE SSEON +C36D;C36D;110A 1165 11AC;C36D;110A 1165 11AC; # (썭; 썭; 썭; 썭; 썭; ) HANGUL SYLLABLE SSEONJ +C36E;C36E;110A 1165 11AD;C36E;110A 1165 11AD; # (썮; 썮; 썮; 썮; 썮; ) HANGUL SYLLABLE SSEONH +C36F;C36F;110A 1165 11AE;C36F;110A 1165 11AE; # (썯; 썯; 썯; 썯; 썯; ) HANGUL SYLLABLE SSEOD +C370;C370;110A 1165 11AF;C370;110A 1165 11AF; # (썰; 썰; 썰; 썰; 썰; ) HANGUL SYLLABLE SSEOL +C371;C371;110A 1165 11B0;C371;110A 1165 11B0; # (썱; 썱; 썱; 썱; 썱; ) HANGUL SYLLABLE SSEOLG +C372;C372;110A 1165 11B1;C372;110A 1165 11B1; # (썲; 썲; 썲; 썲; 썲; ) HANGUL SYLLABLE SSEOLM +C373;C373;110A 1165 11B2;C373;110A 1165 11B2; # (썳; 썳; 썳; 썳; 썳; ) HANGUL SYLLABLE SSEOLB +C374;C374;110A 1165 11B3;C374;110A 1165 11B3; # (썴; 썴; 썴; 썴; 썴; ) HANGUL SYLLABLE SSEOLS +C375;C375;110A 1165 11B4;C375;110A 1165 11B4; # (썵; 썵; 썵; 썵; 썵; ) HANGUL SYLLABLE SSEOLT +C376;C376;110A 1165 11B5;C376;110A 1165 11B5; # (썶; 썶; 썶; 썶; 썶; ) HANGUL SYLLABLE SSEOLP +C377;C377;110A 1165 11B6;C377;110A 1165 11B6; # (썷; 썷; 썷; 썷; 썷; ) HANGUL SYLLABLE SSEOLH +C378;C378;110A 1165 11B7;C378;110A 1165 11B7; # (썸; 썸; 썸; 썸; 썸; ) HANGUL SYLLABLE SSEOM +C379;C379;110A 1165 11B8;C379;110A 1165 11B8; # (썹; 썹; 썹; 썹; 썹; ) HANGUL SYLLABLE SSEOB +C37A;C37A;110A 1165 11B9;C37A;110A 1165 11B9; # (썺; 썺; 썺; 썺; 썺; ) HANGUL SYLLABLE SSEOBS +C37B;C37B;110A 1165 11BA;C37B;110A 1165 11BA; # (썻; 썻; 썻; 썻; 썻; ) HANGUL SYLLABLE SSEOS +C37C;C37C;110A 1165 11BB;C37C;110A 1165 11BB; # (썼; 썼; 썼; 썼; 썼; ) HANGUL SYLLABLE SSEOSS +C37D;C37D;110A 1165 11BC;C37D;110A 1165 11BC; # (썽; 썽; 썽; 썽; 썽; ) HANGUL SYLLABLE SSEONG +C37E;C37E;110A 1165 11BD;C37E;110A 1165 11BD; # (썾; 썾; 썾; 썾; 썾; ) HANGUL SYLLABLE SSEOJ +C37F;C37F;110A 1165 11BE;C37F;110A 1165 11BE; # (썿; 썿; 썿; 썿; 썿; ) HANGUL SYLLABLE SSEOC +C380;C380;110A 1165 11BF;C380;110A 1165 11BF; # (쎀; 쎀; 쎀; 쎀; 쎀; ) HANGUL SYLLABLE SSEOK +C381;C381;110A 1165 11C0;C381;110A 1165 11C0; # (쎁; 쎁; 쎁; 쎁; 쎁; ) HANGUL SYLLABLE SSEOT +C382;C382;110A 1165 11C1;C382;110A 1165 11C1; # (쎂; 쎂; 쎂; 쎂; 쎂; ) HANGUL SYLLABLE SSEOP +C383;C383;110A 1165 11C2;C383;110A 1165 11C2; # (쎃; 쎃; 쎃; 쎃; 쎃; ) HANGUL SYLLABLE SSEOH +C384;C384;110A 1166;C384;110A 1166; # (쎄; 쎄; 쎄; 쎄; 쎄; ) HANGUL SYLLABLE SSE +C385;C385;110A 1166 11A8;C385;110A 1166 11A8; # (쎅; 쎅; 쎅; 쎅; 쎅; ) HANGUL SYLLABLE SSEG +C386;C386;110A 1166 11A9;C386;110A 1166 11A9; # (쎆; 쎆; 쎆; 쎆; 쎆; ) HANGUL SYLLABLE SSEGG +C387;C387;110A 1166 11AA;C387;110A 1166 11AA; # (쎇; 쎇; 쎇; 쎇; 쎇; ) HANGUL SYLLABLE SSEGS +C388;C388;110A 1166 11AB;C388;110A 1166 11AB; # (쎈; 쎈; 쎈; 쎈; 쎈; ) HANGUL SYLLABLE SSEN +C389;C389;110A 1166 11AC;C389;110A 1166 11AC; # (쎉; 쎉; 쎉; 쎉; 쎉; ) HANGUL SYLLABLE SSENJ +C38A;C38A;110A 1166 11AD;C38A;110A 1166 11AD; # (쎊; 쎊; 쎊; 쎊; 쎊; ) HANGUL SYLLABLE SSENH +C38B;C38B;110A 1166 11AE;C38B;110A 1166 11AE; # (쎋; 쎋; 쎋; 쎋; 쎋; ) HANGUL SYLLABLE SSED +C38C;C38C;110A 1166 11AF;C38C;110A 1166 11AF; # (쎌; 쎌; 쎌; 쎌; 쎌; ) HANGUL SYLLABLE SSEL +C38D;C38D;110A 1166 11B0;C38D;110A 1166 11B0; # (쎍; 쎍; 쎍; 쎍; 쎍; ) HANGUL SYLLABLE SSELG +C38E;C38E;110A 1166 11B1;C38E;110A 1166 11B1; # (쎎; 쎎; 쎎; 쎎; 쎎; ) HANGUL SYLLABLE SSELM +C38F;C38F;110A 1166 11B2;C38F;110A 1166 11B2; # (쎏; 쎏; 쎏; 쎏; 쎏; ) HANGUL SYLLABLE SSELB +C390;C390;110A 1166 11B3;C390;110A 1166 11B3; # (쎐; 쎐; 쎐; 쎐; 쎐; ) HANGUL SYLLABLE SSELS +C391;C391;110A 1166 11B4;C391;110A 1166 11B4; # (쎑; 쎑; 쎑; 쎑; 쎑; ) HANGUL SYLLABLE SSELT +C392;C392;110A 1166 11B5;C392;110A 1166 11B5; # (쎒; 쎒; 쎒; 쎒; 쎒; ) HANGUL SYLLABLE SSELP +C393;C393;110A 1166 11B6;C393;110A 1166 11B6; # (쎓; 쎓; 쎓; 쎓; 쎓; ) HANGUL SYLLABLE SSELH +C394;C394;110A 1166 11B7;C394;110A 1166 11B7; # (쎔; 쎔; 쎔; 쎔; 쎔; ) HANGUL SYLLABLE SSEM +C395;C395;110A 1166 11B8;C395;110A 1166 11B8; # (쎕; 쎕; 쎕; 쎕; 쎕; ) HANGUL SYLLABLE SSEB +C396;C396;110A 1166 11B9;C396;110A 1166 11B9; # (쎖; 쎖; 쎖; 쎖; 쎖; ) HANGUL SYLLABLE SSEBS +C397;C397;110A 1166 11BA;C397;110A 1166 11BA; # (쎗; 쎗; 쎗; 쎗; 쎗; ) HANGUL SYLLABLE SSES +C398;C398;110A 1166 11BB;C398;110A 1166 11BB; # (쎘; 쎘; 쎘; 쎘; 쎘; ) HANGUL SYLLABLE SSESS +C399;C399;110A 1166 11BC;C399;110A 1166 11BC; # (쎙; 쎙; 쎙; 쎙; 쎙; ) HANGUL SYLLABLE SSENG +C39A;C39A;110A 1166 11BD;C39A;110A 1166 11BD; # (쎚; 쎚; 쎚; 쎚; 쎚; ) HANGUL SYLLABLE SSEJ +C39B;C39B;110A 1166 11BE;C39B;110A 1166 11BE; # (쎛; 쎛; 쎛; 쎛; 쎛; ) HANGUL SYLLABLE SSEC +C39C;C39C;110A 1166 11BF;C39C;110A 1166 11BF; # (쎜; 쎜; 쎜; 쎜; 쎜; ) HANGUL SYLLABLE SSEK +C39D;C39D;110A 1166 11C0;C39D;110A 1166 11C0; # (쎝; 쎝; 쎝; 쎝; 쎝; ) HANGUL SYLLABLE SSET +C39E;C39E;110A 1166 11C1;C39E;110A 1166 11C1; # (쎞; 쎞; 쎞; 쎞; 쎞; ) HANGUL SYLLABLE SSEP +C39F;C39F;110A 1166 11C2;C39F;110A 1166 11C2; # (쎟; 쎟; 쎟; 쎟; 쎟; ) HANGUL SYLLABLE SSEH +C3A0;C3A0;110A 1167;C3A0;110A 1167; # (쎠; 쎠; 쎠; 쎠; 쎠; ) HANGUL SYLLABLE SSYEO +C3A1;C3A1;110A 1167 11A8;C3A1;110A 1167 11A8; # (쎡; 쎡; 쎡; 쎡; 쎡; ) HANGUL SYLLABLE SSYEOG +C3A2;C3A2;110A 1167 11A9;C3A2;110A 1167 11A9; # (쎢; 쎢; 쎢; 쎢; 쎢; ) HANGUL SYLLABLE SSYEOGG +C3A3;C3A3;110A 1167 11AA;C3A3;110A 1167 11AA; # (쎣; 쎣; 쎣; 쎣; 쎣; ) HANGUL SYLLABLE SSYEOGS +C3A4;C3A4;110A 1167 11AB;C3A4;110A 1167 11AB; # (쎤; 쎤; 쎤; 쎤; 쎤; ) HANGUL SYLLABLE SSYEON +C3A5;C3A5;110A 1167 11AC;C3A5;110A 1167 11AC; # (쎥; 쎥; 쎥; 쎥; 쎥; ) HANGUL SYLLABLE SSYEONJ +C3A6;C3A6;110A 1167 11AD;C3A6;110A 1167 11AD; # (쎦; 쎦; 쎦; 쎦; 쎦; ) HANGUL SYLLABLE SSYEONH +C3A7;C3A7;110A 1167 11AE;C3A7;110A 1167 11AE; # (쎧; 쎧; 쎧; 쎧; 쎧; ) HANGUL SYLLABLE SSYEOD +C3A8;C3A8;110A 1167 11AF;C3A8;110A 1167 11AF; # (쎨; 쎨; 쎨; 쎨; 쎨; ) HANGUL SYLLABLE SSYEOL +C3A9;C3A9;110A 1167 11B0;C3A9;110A 1167 11B0; # (쎩; 쎩; 쎩; 쎩; 쎩; ) HANGUL SYLLABLE SSYEOLG +C3AA;C3AA;110A 1167 11B1;C3AA;110A 1167 11B1; # (쎪; 쎪; 쎪; 쎪; 쎪; ) HANGUL SYLLABLE SSYEOLM +C3AB;C3AB;110A 1167 11B2;C3AB;110A 1167 11B2; # (쎫; 쎫; 쎫; 쎫; 쎫; ) HANGUL SYLLABLE SSYEOLB +C3AC;C3AC;110A 1167 11B3;C3AC;110A 1167 11B3; # (쎬; 쎬; 쎬; 쎬; 쎬; ) HANGUL SYLLABLE SSYEOLS +C3AD;C3AD;110A 1167 11B4;C3AD;110A 1167 11B4; # (쎭; 쎭; 쎭; 쎭; 쎭; ) HANGUL SYLLABLE SSYEOLT +C3AE;C3AE;110A 1167 11B5;C3AE;110A 1167 11B5; # (쎮; 쎮; 쎮; 쎮; 쎮; ) HANGUL SYLLABLE SSYEOLP +C3AF;C3AF;110A 1167 11B6;C3AF;110A 1167 11B6; # (쎯; 쎯; 쎯; 쎯; 쎯; ) HANGUL SYLLABLE SSYEOLH +C3B0;C3B0;110A 1167 11B7;C3B0;110A 1167 11B7; # (쎰; 쎰; 쎰; 쎰; 쎰; ) HANGUL SYLLABLE SSYEOM +C3B1;C3B1;110A 1167 11B8;C3B1;110A 1167 11B8; # (쎱; 쎱; 쎱; 쎱; 쎱; ) HANGUL SYLLABLE SSYEOB +C3B2;C3B2;110A 1167 11B9;C3B2;110A 1167 11B9; # (쎲; 쎲; 쎲; 쎲; 쎲; ) HANGUL SYLLABLE SSYEOBS +C3B3;C3B3;110A 1167 11BA;C3B3;110A 1167 11BA; # (쎳; 쎳; 쎳; 쎳; 쎳; ) HANGUL SYLLABLE SSYEOS +C3B4;C3B4;110A 1167 11BB;C3B4;110A 1167 11BB; # (쎴; 쎴; 쎴; 쎴; 쎴; ) HANGUL SYLLABLE SSYEOSS +C3B5;C3B5;110A 1167 11BC;C3B5;110A 1167 11BC; # (쎵; 쎵; 쎵; 쎵; 쎵; ) HANGUL SYLLABLE SSYEONG +C3B6;C3B6;110A 1167 11BD;C3B6;110A 1167 11BD; # (쎶; 쎶; 쎶; 쎶; 쎶; ) HANGUL SYLLABLE SSYEOJ +C3B7;C3B7;110A 1167 11BE;C3B7;110A 1167 11BE; # (쎷; 쎷; 쎷; 쎷; 쎷; ) HANGUL SYLLABLE SSYEOC +C3B8;C3B8;110A 1167 11BF;C3B8;110A 1167 11BF; # (쎸; 쎸; 쎸; 쎸; 쎸; ) HANGUL SYLLABLE SSYEOK +C3B9;C3B9;110A 1167 11C0;C3B9;110A 1167 11C0; # (쎹; 쎹; 쎹; 쎹; 쎹; ) HANGUL SYLLABLE SSYEOT +C3BA;C3BA;110A 1167 11C1;C3BA;110A 1167 11C1; # (쎺; 쎺; 쎺; 쎺; 쎺; ) HANGUL SYLLABLE SSYEOP +C3BB;C3BB;110A 1167 11C2;C3BB;110A 1167 11C2; # (쎻; 쎻; 쎻; 쎻; 쎻; ) HANGUL SYLLABLE SSYEOH +C3BC;C3BC;110A 1168;C3BC;110A 1168; # (쎼; 쎼; 쎼; 쎼; 쎼; ) HANGUL SYLLABLE SSYE +C3BD;C3BD;110A 1168 11A8;C3BD;110A 1168 11A8; # (쎽; 쎽; 쎽; 쎽; 쎽; ) HANGUL SYLLABLE SSYEG +C3BE;C3BE;110A 1168 11A9;C3BE;110A 1168 11A9; # (쎾; 쎾; 쎾; 쎾; 쎾; ) HANGUL SYLLABLE SSYEGG +C3BF;C3BF;110A 1168 11AA;C3BF;110A 1168 11AA; # (쎿; 쎿; 쎿; 쎿; 쎿; ) HANGUL SYLLABLE SSYEGS +C3C0;C3C0;110A 1168 11AB;C3C0;110A 1168 11AB; # (쏀; 쏀; 쏀; 쏀; 쏀; ) HANGUL SYLLABLE SSYEN +C3C1;C3C1;110A 1168 11AC;C3C1;110A 1168 11AC; # (쏁; 쏁; 쏁; 쏁; 쏁; ) HANGUL SYLLABLE SSYENJ +C3C2;C3C2;110A 1168 11AD;C3C2;110A 1168 11AD; # (쏂; 쏂; 쏂; 쏂; 쏂; ) HANGUL SYLLABLE SSYENH +C3C3;C3C3;110A 1168 11AE;C3C3;110A 1168 11AE; # (쏃; 쏃; 쏃; 쏃; 쏃; ) HANGUL SYLLABLE SSYED +C3C4;C3C4;110A 1168 11AF;C3C4;110A 1168 11AF; # (쏄; 쏄; 쏄; 쏄; 쏄; ) HANGUL SYLLABLE SSYEL +C3C5;C3C5;110A 1168 11B0;C3C5;110A 1168 11B0; # (쏅; 쏅; 쏅; 쏅; 쏅; ) HANGUL SYLLABLE SSYELG +C3C6;C3C6;110A 1168 11B1;C3C6;110A 1168 11B1; # (쏆; 쏆; 쏆; 쏆; 쏆; ) HANGUL SYLLABLE SSYELM +C3C7;C3C7;110A 1168 11B2;C3C7;110A 1168 11B2; # (쏇; 쏇; 쏇; 쏇; 쏇; ) HANGUL SYLLABLE SSYELB +C3C8;C3C8;110A 1168 11B3;C3C8;110A 1168 11B3; # (쏈; 쏈; 쏈; 쏈; 쏈; ) HANGUL SYLLABLE SSYELS +C3C9;C3C9;110A 1168 11B4;C3C9;110A 1168 11B4; # (쏉; 쏉; 쏉; 쏉; 쏉; ) HANGUL SYLLABLE SSYELT +C3CA;C3CA;110A 1168 11B5;C3CA;110A 1168 11B5; # (쏊; 쏊; 쏊; 쏊; 쏊; ) HANGUL SYLLABLE SSYELP +C3CB;C3CB;110A 1168 11B6;C3CB;110A 1168 11B6; # (쏋; 쏋; 쏋; 쏋; 쏋; ) HANGUL SYLLABLE SSYELH +C3CC;C3CC;110A 1168 11B7;C3CC;110A 1168 11B7; # (쏌; 쏌; 쏌; 쏌; 쏌; ) HANGUL SYLLABLE SSYEM +C3CD;C3CD;110A 1168 11B8;C3CD;110A 1168 11B8; # (쏍; 쏍; 쏍; 쏍; 쏍; ) HANGUL SYLLABLE SSYEB +C3CE;C3CE;110A 1168 11B9;C3CE;110A 1168 11B9; # (쏎; 쏎; 쏎; 쏎; 쏎; ) HANGUL SYLLABLE SSYEBS +C3CF;C3CF;110A 1168 11BA;C3CF;110A 1168 11BA; # (쏏; 쏏; 쏏; 쏏; 쏏; ) HANGUL SYLLABLE SSYES +C3D0;C3D0;110A 1168 11BB;C3D0;110A 1168 11BB; # (쏐; 쏐; 쏐; 쏐; 쏐; ) HANGUL SYLLABLE SSYESS +C3D1;C3D1;110A 1168 11BC;C3D1;110A 1168 11BC; # (쏑; 쏑; 쏑; 쏑; 쏑; ) HANGUL SYLLABLE SSYENG +C3D2;C3D2;110A 1168 11BD;C3D2;110A 1168 11BD; # (쏒; 쏒; 쏒; 쏒; 쏒; ) HANGUL SYLLABLE SSYEJ +C3D3;C3D3;110A 1168 11BE;C3D3;110A 1168 11BE; # (쏓; 쏓; 쏓; 쏓; 쏓; ) HANGUL SYLLABLE SSYEC +C3D4;C3D4;110A 1168 11BF;C3D4;110A 1168 11BF; # (쏔; 쏔; 쏔; 쏔; 쏔; ) HANGUL SYLLABLE SSYEK +C3D5;C3D5;110A 1168 11C0;C3D5;110A 1168 11C0; # (쏕; 쏕; 쏕; 쏕; 쏕; ) HANGUL SYLLABLE SSYET +C3D6;C3D6;110A 1168 11C1;C3D6;110A 1168 11C1; # (쏖; 쏖; 쏖; 쏖; 쏖; ) HANGUL SYLLABLE SSYEP +C3D7;C3D7;110A 1168 11C2;C3D7;110A 1168 11C2; # (쏗; 쏗; 쏗; 쏗; 쏗; ) HANGUL SYLLABLE SSYEH +C3D8;C3D8;110A 1169;C3D8;110A 1169; # (쏘; 쏘; 쏘; 쏘; 쏘; ) HANGUL SYLLABLE SSO +C3D9;C3D9;110A 1169 11A8;C3D9;110A 1169 11A8; # (쏙; 쏙; 쏙; 쏙; 쏙; ) HANGUL SYLLABLE SSOG +C3DA;C3DA;110A 1169 11A9;C3DA;110A 1169 11A9; # (쏚; 쏚; 쏚; 쏚; 쏚; ) HANGUL SYLLABLE SSOGG +C3DB;C3DB;110A 1169 11AA;C3DB;110A 1169 11AA; # (쏛; 쏛; 쏛; 쏛; 쏛; ) HANGUL SYLLABLE SSOGS +C3DC;C3DC;110A 1169 11AB;C3DC;110A 1169 11AB; # (쏜; 쏜; 쏜; 쏜; 쏜; ) HANGUL SYLLABLE SSON +C3DD;C3DD;110A 1169 11AC;C3DD;110A 1169 11AC; # (쏝; 쏝; 쏝; 쏝; 쏝; ) HANGUL SYLLABLE SSONJ +C3DE;C3DE;110A 1169 11AD;C3DE;110A 1169 11AD; # (쏞; 쏞; 쏞; 쏞; 쏞; ) HANGUL SYLLABLE SSONH +C3DF;C3DF;110A 1169 11AE;C3DF;110A 1169 11AE; # (쏟; 쏟; 쏟; 쏟; 쏟; ) HANGUL SYLLABLE SSOD +C3E0;C3E0;110A 1169 11AF;C3E0;110A 1169 11AF; # (쏠; 쏠; 쏠; 쏠; 쏠; ) HANGUL SYLLABLE SSOL +C3E1;C3E1;110A 1169 11B0;C3E1;110A 1169 11B0; # (쏡; 쏡; 쏡; 쏡; 쏡; ) HANGUL SYLLABLE SSOLG +C3E2;C3E2;110A 1169 11B1;C3E2;110A 1169 11B1; # (쏢; 쏢; 쏢; 쏢; 쏢; ) HANGUL SYLLABLE SSOLM +C3E3;C3E3;110A 1169 11B2;C3E3;110A 1169 11B2; # (쏣; 쏣; 쏣; 쏣; 쏣; ) HANGUL SYLLABLE SSOLB +C3E4;C3E4;110A 1169 11B3;C3E4;110A 1169 11B3; # (쏤; 쏤; 쏤; 쏤; 쏤; ) HANGUL SYLLABLE SSOLS +C3E5;C3E5;110A 1169 11B4;C3E5;110A 1169 11B4; # (쏥; 쏥; 쏥; 쏥; 쏥; ) HANGUL SYLLABLE SSOLT +C3E6;C3E6;110A 1169 11B5;C3E6;110A 1169 11B5; # (쏦; 쏦; 쏦; 쏦; 쏦; ) HANGUL SYLLABLE SSOLP +C3E7;C3E7;110A 1169 11B6;C3E7;110A 1169 11B6; # (쏧; 쏧; 쏧; 쏧; 쏧; ) HANGUL SYLLABLE SSOLH +C3E8;C3E8;110A 1169 11B7;C3E8;110A 1169 11B7; # (쏨; 쏨; 쏨; 쏨; 쏨; ) HANGUL SYLLABLE SSOM +C3E9;C3E9;110A 1169 11B8;C3E9;110A 1169 11B8; # (쏩; 쏩; 쏩; 쏩; 쏩; ) HANGUL SYLLABLE SSOB +C3EA;C3EA;110A 1169 11B9;C3EA;110A 1169 11B9; # (쏪; 쏪; 쏪; 쏪; 쏪; ) HANGUL SYLLABLE SSOBS +C3EB;C3EB;110A 1169 11BA;C3EB;110A 1169 11BA; # (쏫; 쏫; 쏫; 쏫; 쏫; ) HANGUL SYLLABLE SSOS +C3EC;C3EC;110A 1169 11BB;C3EC;110A 1169 11BB; # (쏬; 쏬; 쏬; 쏬; 쏬; ) HANGUL SYLLABLE SSOSS +C3ED;C3ED;110A 1169 11BC;C3ED;110A 1169 11BC; # (쏭; 쏭; 쏭; 쏭; 쏭; ) HANGUL SYLLABLE SSONG +C3EE;C3EE;110A 1169 11BD;C3EE;110A 1169 11BD; # (쏮; 쏮; 쏮; 쏮; 쏮; ) HANGUL SYLLABLE SSOJ +C3EF;C3EF;110A 1169 11BE;C3EF;110A 1169 11BE; # (쏯; 쏯; 쏯; 쏯; 쏯; ) HANGUL SYLLABLE SSOC +C3F0;C3F0;110A 1169 11BF;C3F0;110A 1169 11BF; # (쏰; 쏰; 쏰; 쏰; 쏰; ) HANGUL SYLLABLE SSOK +C3F1;C3F1;110A 1169 11C0;C3F1;110A 1169 11C0; # (쏱; 쏱; 쏱; 쏱; 쏱; ) HANGUL SYLLABLE SSOT +C3F2;C3F2;110A 1169 11C1;C3F2;110A 1169 11C1; # (쏲; 쏲; 쏲; 쏲; 쏲; ) HANGUL SYLLABLE SSOP +C3F3;C3F3;110A 1169 11C2;C3F3;110A 1169 11C2; # (쏳; 쏳; 쏳; 쏳; 쏳; ) HANGUL SYLLABLE SSOH +C3F4;C3F4;110A 116A;C3F4;110A 116A; # (쏴; 쏴; 쏴; 쏴; 쏴; ) HANGUL SYLLABLE SSWA +C3F5;C3F5;110A 116A 11A8;C3F5;110A 116A 11A8; # (쏵; 쏵; 쏵; 쏵; 쏵; ) HANGUL SYLLABLE SSWAG +C3F6;C3F6;110A 116A 11A9;C3F6;110A 116A 11A9; # (쏶; 쏶; 쏶; 쏶; 쏶; ) HANGUL SYLLABLE SSWAGG +C3F7;C3F7;110A 116A 11AA;C3F7;110A 116A 11AA; # (쏷; 쏷; 쏷; 쏷; 쏷; ) HANGUL SYLLABLE SSWAGS +C3F8;C3F8;110A 116A 11AB;C3F8;110A 116A 11AB; # (쏸; 쏸; 쏸; 쏸; 쏸; ) HANGUL SYLLABLE SSWAN +C3F9;C3F9;110A 116A 11AC;C3F9;110A 116A 11AC; # (쏹; 쏹; 쏹; 쏹; 쏹; ) HANGUL SYLLABLE SSWANJ +C3FA;C3FA;110A 116A 11AD;C3FA;110A 116A 11AD; # (쏺; 쏺; 쏺; 쏺; 쏺; ) HANGUL SYLLABLE SSWANH +C3FB;C3FB;110A 116A 11AE;C3FB;110A 116A 11AE; # (쏻; 쏻; 쏻; 쏻; 쏻; ) HANGUL SYLLABLE SSWAD +C3FC;C3FC;110A 116A 11AF;C3FC;110A 116A 11AF; # (쏼; 쏼; 쏼; 쏼; 쏼; ) HANGUL SYLLABLE SSWAL +C3FD;C3FD;110A 116A 11B0;C3FD;110A 116A 11B0; # (쏽; 쏽; 쏽; 쏽; 쏽; ) HANGUL SYLLABLE SSWALG +C3FE;C3FE;110A 116A 11B1;C3FE;110A 116A 11B1; # (쏾; 쏾; 쏾; 쏾; 쏾; ) HANGUL SYLLABLE SSWALM +C3FF;C3FF;110A 116A 11B2;C3FF;110A 116A 11B2; # (쏿; 쏿; 쏿; 쏿; 쏿; ) HANGUL SYLLABLE SSWALB +C400;C400;110A 116A 11B3;C400;110A 116A 11B3; # (쐀; 쐀; 쐀; 쐀; 쐀; ) HANGUL SYLLABLE SSWALS +C401;C401;110A 116A 11B4;C401;110A 116A 11B4; # (쐁; 쐁; 쐁; 쐁; 쐁; ) HANGUL SYLLABLE SSWALT +C402;C402;110A 116A 11B5;C402;110A 116A 11B5; # (쐂; 쐂; 쐂; 쐂; 쐂; ) HANGUL SYLLABLE SSWALP +C403;C403;110A 116A 11B6;C403;110A 116A 11B6; # (쐃; 쐃; 쐃; 쐃; 쐃; ) HANGUL SYLLABLE SSWALH +C404;C404;110A 116A 11B7;C404;110A 116A 11B7; # (쐄; 쐄; 쐄; 쐄; 쐄; ) HANGUL SYLLABLE SSWAM +C405;C405;110A 116A 11B8;C405;110A 116A 11B8; # (쐅; 쐅; 쐅; 쐅; 쐅; ) HANGUL SYLLABLE SSWAB +C406;C406;110A 116A 11B9;C406;110A 116A 11B9; # (쐆; 쐆; 쐆; 쐆; 쐆; ) HANGUL SYLLABLE SSWABS +C407;C407;110A 116A 11BA;C407;110A 116A 11BA; # (쐇; 쐇; 쐇; 쐇; 쐇; ) HANGUL SYLLABLE SSWAS +C408;C408;110A 116A 11BB;C408;110A 116A 11BB; # (쐈; 쐈; 쐈; 쐈; 쐈; ) HANGUL SYLLABLE SSWASS +C409;C409;110A 116A 11BC;C409;110A 116A 11BC; # (쐉; 쐉; 쐉; 쐉; 쐉; ) HANGUL SYLLABLE SSWANG +C40A;C40A;110A 116A 11BD;C40A;110A 116A 11BD; # (쐊; 쐊; 쐊; 쐊; 쐊; ) HANGUL SYLLABLE SSWAJ +C40B;C40B;110A 116A 11BE;C40B;110A 116A 11BE; # (쐋; 쐋; 쐋; 쐋; 쐋; ) HANGUL SYLLABLE SSWAC +C40C;C40C;110A 116A 11BF;C40C;110A 116A 11BF; # (쐌; 쐌; 쐌; 쐌; 쐌; ) HANGUL SYLLABLE SSWAK +C40D;C40D;110A 116A 11C0;C40D;110A 116A 11C0; # (쐍; 쐍; 쐍; 쐍; 쐍; ) HANGUL SYLLABLE SSWAT +C40E;C40E;110A 116A 11C1;C40E;110A 116A 11C1; # (쐎; 쐎; 쐎; 쐎; 쐎; ) HANGUL SYLLABLE SSWAP +C40F;C40F;110A 116A 11C2;C40F;110A 116A 11C2; # (쐏; 쐏; 쐏; 쐏; 쐏; ) HANGUL SYLLABLE SSWAH +C410;C410;110A 116B;C410;110A 116B; # (쐐; 쐐; 쐐; 쐐; 쐐; ) HANGUL SYLLABLE SSWAE +C411;C411;110A 116B 11A8;C411;110A 116B 11A8; # (쐑; 쐑; 쐑; 쐑; 쐑; ) HANGUL SYLLABLE SSWAEG +C412;C412;110A 116B 11A9;C412;110A 116B 11A9; # (쐒; 쐒; 쐒; 쐒; 쐒; ) HANGUL SYLLABLE SSWAEGG +C413;C413;110A 116B 11AA;C413;110A 116B 11AA; # (쐓; 쐓; 쐓; 쐓; 쐓; ) HANGUL SYLLABLE SSWAEGS +C414;C414;110A 116B 11AB;C414;110A 116B 11AB; # (쐔; 쐔; 쐔; 쐔; 쐔; ) HANGUL SYLLABLE SSWAEN +C415;C415;110A 116B 11AC;C415;110A 116B 11AC; # (쐕; 쐕; 쐕; 쐕; 쐕; ) HANGUL SYLLABLE SSWAENJ +C416;C416;110A 116B 11AD;C416;110A 116B 11AD; # (쐖; 쐖; 쐖; 쐖; 쐖; ) HANGUL SYLLABLE SSWAENH +C417;C417;110A 116B 11AE;C417;110A 116B 11AE; # (쐗; 쐗; 쐗; 쐗; 쐗; ) HANGUL SYLLABLE SSWAED +C418;C418;110A 116B 11AF;C418;110A 116B 11AF; # (쐘; 쐘; 쐘; 쐘; 쐘; ) HANGUL SYLLABLE SSWAEL +C419;C419;110A 116B 11B0;C419;110A 116B 11B0; # (쐙; 쐙; 쐙; 쐙; 쐙; ) HANGUL SYLLABLE SSWAELG +C41A;C41A;110A 116B 11B1;C41A;110A 116B 11B1; # (쐚; 쐚; 쐚; 쐚; 쐚; ) HANGUL SYLLABLE SSWAELM +C41B;C41B;110A 116B 11B2;C41B;110A 116B 11B2; # (쐛; 쐛; 쐛; 쐛; 쐛; ) HANGUL SYLLABLE SSWAELB +C41C;C41C;110A 116B 11B3;C41C;110A 116B 11B3; # (쐜; 쐜; 쐜; 쐜; 쐜; ) HANGUL SYLLABLE SSWAELS +C41D;C41D;110A 116B 11B4;C41D;110A 116B 11B4; # (쐝; 쐝; 쐝; 쐝; 쐝; ) HANGUL SYLLABLE SSWAELT +C41E;C41E;110A 116B 11B5;C41E;110A 116B 11B5; # (쐞; 쐞; 쐞; 쐞; 쐞; ) HANGUL SYLLABLE SSWAELP +C41F;C41F;110A 116B 11B6;C41F;110A 116B 11B6; # (쐟; 쐟; 쐟; 쐟; 쐟; ) HANGUL SYLLABLE SSWAELH +C420;C420;110A 116B 11B7;C420;110A 116B 11B7; # (쐠; 쐠; 쐠; 쐠; 쐠; ) HANGUL SYLLABLE SSWAEM +C421;C421;110A 116B 11B8;C421;110A 116B 11B8; # (쐡; 쐡; 쐡; 쐡; 쐡; ) HANGUL SYLLABLE SSWAEB +C422;C422;110A 116B 11B9;C422;110A 116B 11B9; # (쐢; 쐢; 쐢; 쐢; 쐢; ) HANGUL SYLLABLE SSWAEBS +C423;C423;110A 116B 11BA;C423;110A 116B 11BA; # (쐣; 쐣; 쐣; 쐣; 쐣; ) HANGUL SYLLABLE SSWAES +C424;C424;110A 116B 11BB;C424;110A 116B 11BB; # (쐤; 쐤; 쐤; 쐤; 쐤; ) HANGUL SYLLABLE SSWAESS +C425;C425;110A 116B 11BC;C425;110A 116B 11BC; # (쐥; 쐥; 쐥; 쐥; 쐥; ) HANGUL SYLLABLE SSWAENG +C426;C426;110A 116B 11BD;C426;110A 116B 11BD; # (쐦; 쐦; 쐦; 쐦; 쐦; ) HANGUL SYLLABLE SSWAEJ +C427;C427;110A 116B 11BE;C427;110A 116B 11BE; # (쐧; 쐧; 쐧; 쐧; 쐧; ) HANGUL SYLLABLE SSWAEC +C428;C428;110A 116B 11BF;C428;110A 116B 11BF; # (쐨; 쐨; 쐨; 쐨; 쐨; ) HANGUL SYLLABLE SSWAEK +C429;C429;110A 116B 11C0;C429;110A 116B 11C0; # (쐩; 쐩; 쐩; 쐩; 쐩; ) HANGUL SYLLABLE SSWAET +C42A;C42A;110A 116B 11C1;C42A;110A 116B 11C1; # (쐪; 쐪; 쐪; 쐪; 쐪; ) HANGUL SYLLABLE SSWAEP +C42B;C42B;110A 116B 11C2;C42B;110A 116B 11C2; # (쐫; 쐫; 쐫; 쐫; 쐫; ) HANGUL SYLLABLE SSWAEH +C42C;C42C;110A 116C;C42C;110A 116C; # (쐬; 쐬; 쐬; 쐬; 쐬; ) HANGUL SYLLABLE SSOE +C42D;C42D;110A 116C 11A8;C42D;110A 116C 11A8; # (쐭; 쐭; 쐭; 쐭; 쐭; ) HANGUL SYLLABLE SSOEG +C42E;C42E;110A 116C 11A9;C42E;110A 116C 11A9; # (쐮; 쐮; 쐮; 쐮; 쐮; ) HANGUL SYLLABLE SSOEGG +C42F;C42F;110A 116C 11AA;C42F;110A 116C 11AA; # (쐯; 쐯; 쐯; 쐯; 쐯; ) HANGUL SYLLABLE SSOEGS +C430;C430;110A 116C 11AB;C430;110A 116C 11AB; # (쐰; 쐰; 쐰; 쐰; 쐰; ) HANGUL SYLLABLE SSOEN +C431;C431;110A 116C 11AC;C431;110A 116C 11AC; # (쐱; 쐱; 쐱; 쐱; 쐱; ) HANGUL SYLLABLE SSOENJ +C432;C432;110A 116C 11AD;C432;110A 116C 11AD; # (쐲; 쐲; 쐲; 쐲; 쐲; ) HANGUL SYLLABLE SSOENH +C433;C433;110A 116C 11AE;C433;110A 116C 11AE; # (쐳; 쐳; 쐳; 쐳; 쐳; ) HANGUL SYLLABLE SSOED +C434;C434;110A 116C 11AF;C434;110A 116C 11AF; # (쐴; 쐴; 쐴; 쐴; 쐴; ) HANGUL SYLLABLE SSOEL +C435;C435;110A 116C 11B0;C435;110A 116C 11B0; # (쐵; 쐵; 쐵; 쐵; 쐵; ) HANGUL SYLLABLE SSOELG +C436;C436;110A 116C 11B1;C436;110A 116C 11B1; # (쐶; 쐶; 쐶; 쐶; 쐶; ) HANGUL SYLLABLE SSOELM +C437;C437;110A 116C 11B2;C437;110A 116C 11B2; # (쐷; 쐷; 쐷; 쐷; 쐷; ) HANGUL SYLLABLE SSOELB +C438;C438;110A 116C 11B3;C438;110A 116C 11B3; # (쐸; 쐸; 쐸; 쐸; 쐸; ) HANGUL SYLLABLE SSOELS +C439;C439;110A 116C 11B4;C439;110A 116C 11B4; # (쐹; 쐹; 쐹; 쐹; 쐹; ) HANGUL SYLLABLE SSOELT +C43A;C43A;110A 116C 11B5;C43A;110A 116C 11B5; # (쐺; 쐺; 쐺; 쐺; 쐺; ) HANGUL SYLLABLE SSOELP +C43B;C43B;110A 116C 11B6;C43B;110A 116C 11B6; # (쐻; 쐻; 쐻; 쐻; 쐻; ) HANGUL SYLLABLE SSOELH +C43C;C43C;110A 116C 11B7;C43C;110A 116C 11B7; # (쐼; 쐼; 쐼; 쐼; 쐼; ) HANGUL SYLLABLE SSOEM +C43D;C43D;110A 116C 11B8;C43D;110A 116C 11B8; # (쐽; 쐽; 쐽; 쐽; 쐽; ) HANGUL SYLLABLE SSOEB +C43E;C43E;110A 116C 11B9;C43E;110A 116C 11B9; # (쐾; 쐾; 쐾; 쐾; 쐾; ) HANGUL SYLLABLE SSOEBS +C43F;C43F;110A 116C 11BA;C43F;110A 116C 11BA; # (쐿; 쐿; 쐿; 쐿; 쐿; ) HANGUL SYLLABLE SSOES +C440;C440;110A 116C 11BB;C440;110A 116C 11BB; # (쑀; 쑀; 쑀; 쑀; 쑀; ) HANGUL SYLLABLE SSOESS +C441;C441;110A 116C 11BC;C441;110A 116C 11BC; # (쑁; 쑁; 쑁; 쑁; 쑁; ) HANGUL SYLLABLE SSOENG +C442;C442;110A 116C 11BD;C442;110A 116C 11BD; # (쑂; 쑂; 쑂; 쑂; 쑂; ) HANGUL SYLLABLE SSOEJ +C443;C443;110A 116C 11BE;C443;110A 116C 11BE; # (쑃; 쑃; 쑃; 쑃; 쑃; ) HANGUL SYLLABLE SSOEC +C444;C444;110A 116C 11BF;C444;110A 116C 11BF; # (쑄; 쑄; 쑄; 쑄; 쑄; ) HANGUL SYLLABLE SSOEK +C445;C445;110A 116C 11C0;C445;110A 116C 11C0; # (쑅; 쑅; 쑅; 쑅; 쑅; ) HANGUL SYLLABLE SSOET +C446;C446;110A 116C 11C1;C446;110A 116C 11C1; # (쑆; 쑆; 쑆; 쑆; 쑆; ) HANGUL SYLLABLE SSOEP +C447;C447;110A 116C 11C2;C447;110A 116C 11C2; # (쑇; 쑇; 쑇; 쑇; 쑇; ) HANGUL SYLLABLE SSOEH +C448;C448;110A 116D;C448;110A 116D; # (쑈; 쑈; 쑈; 쑈; 쑈; ) HANGUL SYLLABLE SSYO +C449;C449;110A 116D 11A8;C449;110A 116D 11A8; # (쑉; 쑉; 쑉; 쑉; 쑉; ) HANGUL SYLLABLE SSYOG +C44A;C44A;110A 116D 11A9;C44A;110A 116D 11A9; # (쑊; 쑊; 쑊; 쑊; 쑊; ) HANGUL SYLLABLE SSYOGG +C44B;C44B;110A 116D 11AA;C44B;110A 116D 11AA; # (쑋; 쑋; 쑋; 쑋; 쑋; ) HANGUL SYLLABLE SSYOGS +C44C;C44C;110A 116D 11AB;C44C;110A 116D 11AB; # (쑌; 쑌; 쑌; 쑌; 쑌; ) HANGUL SYLLABLE SSYON +C44D;C44D;110A 116D 11AC;C44D;110A 116D 11AC; # (쑍; 쑍; 쑍; 쑍; 쑍; ) HANGUL SYLLABLE SSYONJ +C44E;C44E;110A 116D 11AD;C44E;110A 116D 11AD; # (쑎; 쑎; 쑎; 쑎; 쑎; ) HANGUL SYLLABLE SSYONH +C44F;C44F;110A 116D 11AE;C44F;110A 116D 11AE; # (쑏; 쑏; 쑏; 쑏; 쑏; ) HANGUL SYLLABLE SSYOD +C450;C450;110A 116D 11AF;C450;110A 116D 11AF; # (쑐; 쑐; 쑐; 쑐; 쑐; ) HANGUL SYLLABLE SSYOL +C451;C451;110A 116D 11B0;C451;110A 116D 11B0; # (쑑; 쑑; 쑑; 쑑; 쑑; ) HANGUL SYLLABLE SSYOLG +C452;C452;110A 116D 11B1;C452;110A 116D 11B1; # (쑒; 쑒; 쑒; 쑒; 쑒; ) HANGUL SYLLABLE SSYOLM +C453;C453;110A 116D 11B2;C453;110A 116D 11B2; # (쑓; 쑓; 쑓; 쑓; 쑓; ) HANGUL SYLLABLE SSYOLB +C454;C454;110A 116D 11B3;C454;110A 116D 11B3; # (쑔; 쑔; 쑔; 쑔; 쑔; ) HANGUL SYLLABLE SSYOLS +C455;C455;110A 116D 11B4;C455;110A 116D 11B4; # (쑕; 쑕; 쑕; 쑕; 쑕; ) HANGUL SYLLABLE SSYOLT +C456;C456;110A 116D 11B5;C456;110A 116D 11B5; # (쑖; 쑖; 쑖; 쑖; 쑖; ) HANGUL SYLLABLE SSYOLP +C457;C457;110A 116D 11B6;C457;110A 116D 11B6; # (쑗; 쑗; 쑗; 쑗; 쑗; ) HANGUL SYLLABLE SSYOLH +C458;C458;110A 116D 11B7;C458;110A 116D 11B7; # (쑘; 쑘; 쑘; 쑘; 쑘; ) HANGUL SYLLABLE SSYOM +C459;C459;110A 116D 11B8;C459;110A 116D 11B8; # (쑙; 쑙; 쑙; 쑙; 쑙; ) HANGUL SYLLABLE SSYOB +C45A;C45A;110A 116D 11B9;C45A;110A 116D 11B9; # (쑚; 쑚; 쑚; 쑚; 쑚; ) HANGUL SYLLABLE SSYOBS +C45B;C45B;110A 116D 11BA;C45B;110A 116D 11BA; # (쑛; 쑛; 쑛; 쑛; 쑛; ) HANGUL SYLLABLE SSYOS +C45C;C45C;110A 116D 11BB;C45C;110A 116D 11BB; # (쑜; 쑜; 쑜; 쑜; 쑜; ) HANGUL SYLLABLE SSYOSS +C45D;C45D;110A 116D 11BC;C45D;110A 116D 11BC; # (쑝; 쑝; 쑝; 쑝; 쑝; ) HANGUL SYLLABLE SSYONG +C45E;C45E;110A 116D 11BD;C45E;110A 116D 11BD; # (쑞; 쑞; 쑞; 쑞; 쑞; ) HANGUL SYLLABLE SSYOJ +C45F;C45F;110A 116D 11BE;C45F;110A 116D 11BE; # (쑟; 쑟; 쑟; 쑟; 쑟; ) HANGUL SYLLABLE SSYOC +C460;C460;110A 116D 11BF;C460;110A 116D 11BF; # (쑠; 쑠; 쑠; 쑠; 쑠; ) HANGUL SYLLABLE SSYOK +C461;C461;110A 116D 11C0;C461;110A 116D 11C0; # (쑡; 쑡; 쑡; 쑡; 쑡; ) HANGUL SYLLABLE SSYOT +C462;C462;110A 116D 11C1;C462;110A 116D 11C1; # (쑢; 쑢; 쑢; 쑢; 쑢; ) HANGUL SYLLABLE SSYOP +C463;C463;110A 116D 11C2;C463;110A 116D 11C2; # (쑣; 쑣; 쑣; 쑣; 쑣; ) HANGUL SYLLABLE SSYOH +C464;C464;110A 116E;C464;110A 116E; # (쑤; 쑤; 쑤; 쑤; 쑤; ) HANGUL SYLLABLE SSU +C465;C465;110A 116E 11A8;C465;110A 116E 11A8; # (쑥; 쑥; 쑥; 쑥; 쑥; ) HANGUL SYLLABLE SSUG +C466;C466;110A 116E 11A9;C466;110A 116E 11A9; # (쑦; 쑦; 쑦; 쑦; 쑦; ) HANGUL SYLLABLE SSUGG +C467;C467;110A 116E 11AA;C467;110A 116E 11AA; # (쑧; 쑧; 쑧; 쑧; 쑧; ) HANGUL SYLLABLE SSUGS +C468;C468;110A 116E 11AB;C468;110A 116E 11AB; # (쑨; 쑨; 쑨; 쑨; 쑨; ) HANGUL SYLLABLE SSUN +C469;C469;110A 116E 11AC;C469;110A 116E 11AC; # (쑩; 쑩; 쑩; 쑩; 쑩; ) HANGUL SYLLABLE SSUNJ +C46A;C46A;110A 116E 11AD;C46A;110A 116E 11AD; # (쑪; 쑪; 쑪; 쑪; 쑪; ) HANGUL SYLLABLE SSUNH +C46B;C46B;110A 116E 11AE;C46B;110A 116E 11AE; # (쑫; 쑫; 쑫; 쑫; 쑫; ) HANGUL SYLLABLE SSUD +C46C;C46C;110A 116E 11AF;C46C;110A 116E 11AF; # (쑬; 쑬; 쑬; 쑬; 쑬; ) HANGUL SYLLABLE SSUL +C46D;C46D;110A 116E 11B0;C46D;110A 116E 11B0; # (쑭; 쑭; 쑭; 쑭; 쑭; ) HANGUL SYLLABLE SSULG +C46E;C46E;110A 116E 11B1;C46E;110A 116E 11B1; # (쑮; 쑮; 쑮; 쑮; 쑮; ) HANGUL SYLLABLE SSULM +C46F;C46F;110A 116E 11B2;C46F;110A 116E 11B2; # (쑯; 쑯; 쑯; 쑯; 쑯; ) HANGUL SYLLABLE SSULB +C470;C470;110A 116E 11B3;C470;110A 116E 11B3; # (쑰; 쑰; 쑰; 쑰; 쑰; ) HANGUL SYLLABLE SSULS +C471;C471;110A 116E 11B4;C471;110A 116E 11B4; # (쑱; 쑱; 쑱; 쑱; 쑱; ) HANGUL SYLLABLE SSULT +C472;C472;110A 116E 11B5;C472;110A 116E 11B5; # (쑲; 쑲; 쑲; 쑲; 쑲; ) HANGUL SYLLABLE SSULP +C473;C473;110A 116E 11B6;C473;110A 116E 11B6; # (쑳; 쑳; 쑳; 쑳; 쑳; ) HANGUL SYLLABLE SSULH +C474;C474;110A 116E 11B7;C474;110A 116E 11B7; # (쑴; 쑴; 쑴; 쑴; 쑴; ) HANGUL SYLLABLE SSUM +C475;C475;110A 116E 11B8;C475;110A 116E 11B8; # (쑵; 쑵; 쑵; 쑵; 쑵; ) HANGUL SYLLABLE SSUB +C476;C476;110A 116E 11B9;C476;110A 116E 11B9; # (쑶; 쑶; 쑶; 쑶; 쑶; ) HANGUL SYLLABLE SSUBS +C477;C477;110A 116E 11BA;C477;110A 116E 11BA; # (쑷; 쑷; 쑷; 쑷; 쑷; ) HANGUL SYLLABLE SSUS +C478;C478;110A 116E 11BB;C478;110A 116E 11BB; # (쑸; 쑸; 쑸; 쑸; 쑸; ) HANGUL SYLLABLE SSUSS +C479;C479;110A 116E 11BC;C479;110A 116E 11BC; # (쑹; 쑹; 쑹; 쑹; 쑹; ) HANGUL SYLLABLE SSUNG +C47A;C47A;110A 116E 11BD;C47A;110A 116E 11BD; # (쑺; 쑺; 쑺; 쑺; 쑺; ) HANGUL SYLLABLE SSUJ +C47B;C47B;110A 116E 11BE;C47B;110A 116E 11BE; # (쑻; 쑻; 쑻; 쑻; 쑻; ) HANGUL SYLLABLE SSUC +C47C;C47C;110A 116E 11BF;C47C;110A 116E 11BF; # (쑼; 쑼; 쑼; 쑼; 쑼; ) HANGUL SYLLABLE SSUK +C47D;C47D;110A 116E 11C0;C47D;110A 116E 11C0; # (쑽; 쑽; 쑽; 쑽; 쑽; ) HANGUL SYLLABLE SSUT +C47E;C47E;110A 116E 11C1;C47E;110A 116E 11C1; # (쑾; 쑾; 쑾; 쑾; 쑾; ) HANGUL SYLLABLE SSUP +C47F;C47F;110A 116E 11C2;C47F;110A 116E 11C2; # (쑿; 쑿; 쑿; 쑿; 쑿; ) HANGUL SYLLABLE SSUH +C480;C480;110A 116F;C480;110A 116F; # (쒀; 쒀; 쒀; 쒀; 쒀; ) HANGUL SYLLABLE SSWEO +C481;C481;110A 116F 11A8;C481;110A 116F 11A8; # (쒁; 쒁; 쒁; 쒁; 쒁; ) HANGUL SYLLABLE SSWEOG +C482;C482;110A 116F 11A9;C482;110A 116F 11A9; # (쒂; 쒂; 쒂; 쒂; 쒂; ) HANGUL SYLLABLE SSWEOGG +C483;C483;110A 116F 11AA;C483;110A 116F 11AA; # (쒃; 쒃; 쒃; 쒃; 쒃; ) HANGUL SYLLABLE SSWEOGS +C484;C484;110A 116F 11AB;C484;110A 116F 11AB; # (쒄; 쒄; 쒄; 쒄; 쒄; ) HANGUL SYLLABLE SSWEON +C485;C485;110A 116F 11AC;C485;110A 116F 11AC; # (쒅; 쒅; 쒅; 쒅; 쒅; ) HANGUL SYLLABLE SSWEONJ +C486;C486;110A 116F 11AD;C486;110A 116F 11AD; # (쒆; 쒆; 쒆; 쒆; 쒆; ) HANGUL SYLLABLE SSWEONH +C487;C487;110A 116F 11AE;C487;110A 116F 11AE; # (쒇; 쒇; 쒇; 쒇; 쒇; ) HANGUL SYLLABLE SSWEOD +C488;C488;110A 116F 11AF;C488;110A 116F 11AF; # (쒈; 쒈; 쒈; 쒈; 쒈; ) HANGUL SYLLABLE SSWEOL +C489;C489;110A 116F 11B0;C489;110A 116F 11B0; # (쒉; 쒉; 쒉; 쒉; 쒉; ) HANGUL SYLLABLE SSWEOLG +C48A;C48A;110A 116F 11B1;C48A;110A 116F 11B1; # (쒊; 쒊; 쒊; 쒊; 쒊; ) HANGUL SYLLABLE SSWEOLM +C48B;C48B;110A 116F 11B2;C48B;110A 116F 11B2; # (쒋; 쒋; 쒋; 쒋; 쒋; ) HANGUL SYLLABLE SSWEOLB +C48C;C48C;110A 116F 11B3;C48C;110A 116F 11B3; # (쒌; 쒌; 쒌; 쒌; 쒌; ) HANGUL SYLLABLE SSWEOLS +C48D;C48D;110A 116F 11B4;C48D;110A 116F 11B4; # (쒍; 쒍; 쒍; 쒍; 쒍; ) HANGUL SYLLABLE SSWEOLT +C48E;C48E;110A 116F 11B5;C48E;110A 116F 11B5; # (쒎; 쒎; 쒎; 쒎; 쒎; ) HANGUL SYLLABLE SSWEOLP +C48F;C48F;110A 116F 11B6;C48F;110A 116F 11B6; # (쒏; 쒏; 쒏; 쒏; 쒏; ) HANGUL SYLLABLE SSWEOLH +C490;C490;110A 116F 11B7;C490;110A 116F 11B7; # (쒐; 쒐; 쒐; 쒐; 쒐; ) HANGUL SYLLABLE SSWEOM +C491;C491;110A 116F 11B8;C491;110A 116F 11B8; # (쒑; 쒑; 쒑; 쒑; 쒑; ) HANGUL SYLLABLE SSWEOB +C492;C492;110A 116F 11B9;C492;110A 116F 11B9; # (쒒; 쒒; 쒒; 쒒; 쒒; ) HANGUL SYLLABLE SSWEOBS +C493;C493;110A 116F 11BA;C493;110A 116F 11BA; # (쒓; 쒓; 쒓; 쒓; 쒓; ) HANGUL SYLLABLE SSWEOS +C494;C494;110A 116F 11BB;C494;110A 116F 11BB; # (쒔; 쒔; 쒔; 쒔; 쒔; ) HANGUL SYLLABLE SSWEOSS +C495;C495;110A 116F 11BC;C495;110A 116F 11BC; # (쒕; 쒕; 쒕; 쒕; 쒕; ) HANGUL SYLLABLE SSWEONG +C496;C496;110A 116F 11BD;C496;110A 116F 11BD; # (쒖; 쒖; 쒖; 쒖; 쒖; ) HANGUL SYLLABLE SSWEOJ +C497;C497;110A 116F 11BE;C497;110A 116F 11BE; # (쒗; 쒗; 쒗; 쒗; 쒗; ) HANGUL SYLLABLE SSWEOC +C498;C498;110A 116F 11BF;C498;110A 116F 11BF; # (쒘; 쒘; 쒘; 쒘; 쒘; ) HANGUL SYLLABLE SSWEOK +C499;C499;110A 116F 11C0;C499;110A 116F 11C0; # (쒙; 쒙; 쒙; 쒙; 쒙; ) HANGUL SYLLABLE SSWEOT +C49A;C49A;110A 116F 11C1;C49A;110A 116F 11C1; # (쒚; 쒚; 쒚; 쒚; 쒚; ) HANGUL SYLLABLE SSWEOP +C49B;C49B;110A 116F 11C2;C49B;110A 116F 11C2; # (쒛; 쒛; 쒛; 쒛; 쒛; ) HANGUL SYLLABLE SSWEOH +C49C;C49C;110A 1170;C49C;110A 1170; # (쒜; 쒜; 쒜; 쒜; 쒜; ) HANGUL SYLLABLE SSWE +C49D;C49D;110A 1170 11A8;C49D;110A 1170 11A8; # (쒝; 쒝; 쒝; 쒝; 쒝; ) HANGUL SYLLABLE SSWEG +C49E;C49E;110A 1170 11A9;C49E;110A 1170 11A9; # (쒞; 쒞; 쒞; 쒞; 쒞; ) HANGUL SYLLABLE SSWEGG +C49F;C49F;110A 1170 11AA;C49F;110A 1170 11AA; # (쒟; 쒟; 쒟; 쒟; 쒟; ) HANGUL SYLLABLE SSWEGS +C4A0;C4A0;110A 1170 11AB;C4A0;110A 1170 11AB; # (쒠; 쒠; 쒠; 쒠; 쒠; ) HANGUL SYLLABLE SSWEN +C4A1;C4A1;110A 1170 11AC;C4A1;110A 1170 11AC; # (쒡; 쒡; 쒡; 쒡; 쒡; ) HANGUL SYLLABLE SSWENJ +C4A2;C4A2;110A 1170 11AD;C4A2;110A 1170 11AD; # (쒢; 쒢; 쒢; 쒢; 쒢; ) HANGUL SYLLABLE SSWENH +C4A3;C4A3;110A 1170 11AE;C4A3;110A 1170 11AE; # (쒣; 쒣; 쒣; 쒣; 쒣; ) HANGUL SYLLABLE SSWED +C4A4;C4A4;110A 1170 11AF;C4A4;110A 1170 11AF; # (쒤; 쒤; 쒤; 쒤; 쒤; ) HANGUL SYLLABLE SSWEL +C4A5;C4A5;110A 1170 11B0;C4A5;110A 1170 11B0; # (쒥; 쒥; 쒥; 쒥; 쒥; ) HANGUL SYLLABLE SSWELG +C4A6;C4A6;110A 1170 11B1;C4A6;110A 1170 11B1; # (쒦; 쒦; 쒦; 쒦; 쒦; ) HANGUL SYLLABLE SSWELM +C4A7;C4A7;110A 1170 11B2;C4A7;110A 1170 11B2; # (쒧; 쒧; 쒧; 쒧; 쒧; ) HANGUL SYLLABLE SSWELB +C4A8;C4A8;110A 1170 11B3;C4A8;110A 1170 11B3; # (쒨; 쒨; 쒨; 쒨; 쒨; ) HANGUL SYLLABLE SSWELS +C4A9;C4A9;110A 1170 11B4;C4A9;110A 1170 11B4; # (쒩; 쒩; 쒩; 쒩; 쒩; ) HANGUL SYLLABLE SSWELT +C4AA;C4AA;110A 1170 11B5;C4AA;110A 1170 11B5; # (쒪; 쒪; 쒪; 쒪; 쒪; ) HANGUL SYLLABLE SSWELP +C4AB;C4AB;110A 1170 11B6;C4AB;110A 1170 11B6; # (쒫; 쒫; 쒫; 쒫; 쒫; ) HANGUL SYLLABLE SSWELH +C4AC;C4AC;110A 1170 11B7;C4AC;110A 1170 11B7; # (쒬; 쒬; 쒬; 쒬; 쒬; ) HANGUL SYLLABLE SSWEM +C4AD;C4AD;110A 1170 11B8;C4AD;110A 1170 11B8; # (쒭; 쒭; 쒭; 쒭; 쒭; ) HANGUL SYLLABLE SSWEB +C4AE;C4AE;110A 1170 11B9;C4AE;110A 1170 11B9; # (쒮; 쒮; 쒮; 쒮; 쒮; ) HANGUL SYLLABLE SSWEBS +C4AF;C4AF;110A 1170 11BA;C4AF;110A 1170 11BA; # (쒯; 쒯; 쒯; 쒯; 쒯; ) HANGUL SYLLABLE SSWES +C4B0;C4B0;110A 1170 11BB;C4B0;110A 1170 11BB; # (쒰; 쒰; 쒰; 쒰; 쒰; ) HANGUL SYLLABLE SSWESS +C4B1;C4B1;110A 1170 11BC;C4B1;110A 1170 11BC; # (쒱; 쒱; 쒱; 쒱; 쒱; ) HANGUL SYLLABLE SSWENG +C4B2;C4B2;110A 1170 11BD;C4B2;110A 1170 11BD; # (쒲; 쒲; 쒲; 쒲; 쒲; ) HANGUL SYLLABLE SSWEJ +C4B3;C4B3;110A 1170 11BE;C4B3;110A 1170 11BE; # (쒳; 쒳; 쒳; 쒳; 쒳; ) HANGUL SYLLABLE SSWEC +C4B4;C4B4;110A 1170 11BF;C4B4;110A 1170 11BF; # (쒴; 쒴; 쒴; 쒴; 쒴; ) HANGUL SYLLABLE SSWEK +C4B5;C4B5;110A 1170 11C0;C4B5;110A 1170 11C0; # (쒵; 쒵; 쒵; 쒵; 쒵; ) HANGUL SYLLABLE SSWET +C4B6;C4B6;110A 1170 11C1;C4B6;110A 1170 11C1; # (쒶; 쒶; 쒶; 쒶; 쒶; ) HANGUL SYLLABLE SSWEP +C4B7;C4B7;110A 1170 11C2;C4B7;110A 1170 11C2; # (쒷; 쒷; 쒷; 쒷; 쒷; ) HANGUL SYLLABLE SSWEH +C4B8;C4B8;110A 1171;C4B8;110A 1171; # (쒸; 쒸; 쒸; 쒸; 쒸; ) HANGUL SYLLABLE SSWI +C4B9;C4B9;110A 1171 11A8;C4B9;110A 1171 11A8; # (쒹; 쒹; 쒹; 쒹; 쒹; ) HANGUL SYLLABLE SSWIG +C4BA;C4BA;110A 1171 11A9;C4BA;110A 1171 11A9; # (쒺; 쒺; 쒺; 쒺; 쒺; ) HANGUL SYLLABLE SSWIGG +C4BB;C4BB;110A 1171 11AA;C4BB;110A 1171 11AA; # (쒻; 쒻; 쒻; 쒻; 쒻; ) HANGUL SYLLABLE SSWIGS +C4BC;C4BC;110A 1171 11AB;C4BC;110A 1171 11AB; # (쒼; 쒼; 쒼; 쒼; 쒼; ) HANGUL SYLLABLE SSWIN +C4BD;C4BD;110A 1171 11AC;C4BD;110A 1171 11AC; # (쒽; 쒽; 쒽; 쒽; 쒽; ) HANGUL SYLLABLE SSWINJ +C4BE;C4BE;110A 1171 11AD;C4BE;110A 1171 11AD; # (쒾; 쒾; 쒾; 쒾; 쒾; ) HANGUL SYLLABLE SSWINH +C4BF;C4BF;110A 1171 11AE;C4BF;110A 1171 11AE; # (쒿; 쒿; 쒿; 쒿; 쒿; ) HANGUL SYLLABLE SSWID +C4C0;C4C0;110A 1171 11AF;C4C0;110A 1171 11AF; # (쓀; 쓀; 쓀; 쓀; 쓀; ) HANGUL SYLLABLE SSWIL +C4C1;C4C1;110A 1171 11B0;C4C1;110A 1171 11B0; # (쓁; 쓁; 쓁; 쓁; 쓁; ) HANGUL SYLLABLE SSWILG +C4C2;C4C2;110A 1171 11B1;C4C2;110A 1171 11B1; # (쓂; 쓂; 쓂; 쓂; 쓂; ) HANGUL SYLLABLE SSWILM +C4C3;C4C3;110A 1171 11B2;C4C3;110A 1171 11B2; # (쓃; 쓃; 쓃; 쓃; 쓃; ) HANGUL SYLLABLE SSWILB +C4C4;C4C4;110A 1171 11B3;C4C4;110A 1171 11B3; # (쓄; 쓄; 쓄; 쓄; 쓄; ) HANGUL SYLLABLE SSWILS +C4C5;C4C5;110A 1171 11B4;C4C5;110A 1171 11B4; # (쓅; 쓅; 쓅; 쓅; 쓅; ) HANGUL SYLLABLE SSWILT +C4C6;C4C6;110A 1171 11B5;C4C6;110A 1171 11B5; # (쓆; 쓆; 쓆; 쓆; 쓆; ) HANGUL SYLLABLE SSWILP +C4C7;C4C7;110A 1171 11B6;C4C7;110A 1171 11B6; # (쓇; 쓇; 쓇; 쓇; 쓇; ) HANGUL SYLLABLE SSWILH +C4C8;C4C8;110A 1171 11B7;C4C8;110A 1171 11B7; # (쓈; 쓈; 쓈; 쓈; 쓈; ) HANGUL SYLLABLE SSWIM +C4C9;C4C9;110A 1171 11B8;C4C9;110A 1171 11B8; # (쓉; 쓉; 쓉; 쓉; 쓉; ) HANGUL SYLLABLE SSWIB +C4CA;C4CA;110A 1171 11B9;C4CA;110A 1171 11B9; # (쓊; 쓊; 쓊; 쓊; 쓊; ) HANGUL SYLLABLE SSWIBS +C4CB;C4CB;110A 1171 11BA;C4CB;110A 1171 11BA; # (쓋; 쓋; 쓋; 쓋; 쓋; ) HANGUL SYLLABLE SSWIS +C4CC;C4CC;110A 1171 11BB;C4CC;110A 1171 11BB; # (쓌; 쓌; 쓌; 쓌; 쓌; ) HANGUL SYLLABLE SSWISS +C4CD;C4CD;110A 1171 11BC;C4CD;110A 1171 11BC; # (쓍; 쓍; 쓍; 쓍; 쓍; ) HANGUL SYLLABLE SSWING +C4CE;C4CE;110A 1171 11BD;C4CE;110A 1171 11BD; # (쓎; 쓎; 쓎; 쓎; 쓎; ) HANGUL SYLLABLE SSWIJ +C4CF;C4CF;110A 1171 11BE;C4CF;110A 1171 11BE; # (쓏; 쓏; 쓏; 쓏; 쓏; ) HANGUL SYLLABLE SSWIC +C4D0;C4D0;110A 1171 11BF;C4D0;110A 1171 11BF; # (쓐; 쓐; 쓐; 쓐; 쓐; ) HANGUL SYLLABLE SSWIK +C4D1;C4D1;110A 1171 11C0;C4D1;110A 1171 11C0; # (쓑; 쓑; 쓑; 쓑; 쓑; ) HANGUL SYLLABLE SSWIT +C4D2;C4D2;110A 1171 11C1;C4D2;110A 1171 11C1; # (쓒; 쓒; 쓒; 쓒; 쓒; ) HANGUL SYLLABLE SSWIP +C4D3;C4D3;110A 1171 11C2;C4D3;110A 1171 11C2; # (쓓; 쓓; 쓓; 쓓; 쓓; ) HANGUL SYLLABLE SSWIH +C4D4;C4D4;110A 1172;C4D4;110A 1172; # (쓔; 쓔; 쓔; 쓔; 쓔; ) HANGUL SYLLABLE SSYU +C4D5;C4D5;110A 1172 11A8;C4D5;110A 1172 11A8; # (쓕; 쓕; 쓕; 쓕; 쓕; ) HANGUL SYLLABLE SSYUG +C4D6;C4D6;110A 1172 11A9;C4D6;110A 1172 11A9; # (쓖; 쓖; 쓖; 쓖; 쓖; ) HANGUL SYLLABLE SSYUGG +C4D7;C4D7;110A 1172 11AA;C4D7;110A 1172 11AA; # (쓗; 쓗; 쓗; 쓗; 쓗; ) HANGUL SYLLABLE SSYUGS +C4D8;C4D8;110A 1172 11AB;C4D8;110A 1172 11AB; # (쓘; 쓘; 쓘; 쓘; 쓘; ) HANGUL SYLLABLE SSYUN +C4D9;C4D9;110A 1172 11AC;C4D9;110A 1172 11AC; # (쓙; 쓙; 쓙; 쓙; 쓙; ) HANGUL SYLLABLE SSYUNJ +C4DA;C4DA;110A 1172 11AD;C4DA;110A 1172 11AD; # (쓚; 쓚; 쓚; 쓚; 쓚; ) HANGUL SYLLABLE SSYUNH +C4DB;C4DB;110A 1172 11AE;C4DB;110A 1172 11AE; # (쓛; 쓛; 쓛; 쓛; 쓛; ) HANGUL SYLLABLE SSYUD +C4DC;C4DC;110A 1172 11AF;C4DC;110A 1172 11AF; # (쓜; 쓜; 쓜; 쓜; 쓜; ) HANGUL SYLLABLE SSYUL +C4DD;C4DD;110A 1172 11B0;C4DD;110A 1172 11B0; # (쓝; 쓝; 쓝; 쓝; 쓝; ) HANGUL SYLLABLE SSYULG +C4DE;C4DE;110A 1172 11B1;C4DE;110A 1172 11B1; # (쓞; 쓞; 쓞; 쓞; 쓞; ) HANGUL SYLLABLE SSYULM +C4DF;C4DF;110A 1172 11B2;C4DF;110A 1172 11B2; # (쓟; 쓟; 쓟; 쓟; 쓟; ) HANGUL SYLLABLE SSYULB +C4E0;C4E0;110A 1172 11B3;C4E0;110A 1172 11B3; # (쓠; 쓠; 쓠; 쓠; 쓠; ) HANGUL SYLLABLE SSYULS +C4E1;C4E1;110A 1172 11B4;C4E1;110A 1172 11B4; # (쓡; 쓡; 쓡; 쓡; 쓡; ) HANGUL SYLLABLE SSYULT +C4E2;C4E2;110A 1172 11B5;C4E2;110A 1172 11B5; # (쓢; 쓢; 쓢; 쓢; 쓢; ) HANGUL SYLLABLE SSYULP +C4E3;C4E3;110A 1172 11B6;C4E3;110A 1172 11B6; # (쓣; 쓣; 쓣; 쓣; 쓣; ) HANGUL SYLLABLE SSYULH +C4E4;C4E4;110A 1172 11B7;C4E4;110A 1172 11B7; # (쓤; 쓤; 쓤; 쓤; 쓤; ) HANGUL SYLLABLE SSYUM +C4E5;C4E5;110A 1172 11B8;C4E5;110A 1172 11B8; # (쓥; 쓥; 쓥; 쓥; 쓥; ) HANGUL SYLLABLE SSYUB +C4E6;C4E6;110A 1172 11B9;C4E6;110A 1172 11B9; # (쓦; 쓦; 쓦; 쓦; 쓦; ) HANGUL SYLLABLE SSYUBS +C4E7;C4E7;110A 1172 11BA;C4E7;110A 1172 11BA; # (쓧; 쓧; 쓧; 쓧; 쓧; ) HANGUL SYLLABLE SSYUS +C4E8;C4E8;110A 1172 11BB;C4E8;110A 1172 11BB; # (쓨; 쓨; 쓨; 쓨; 쓨; ) HANGUL SYLLABLE SSYUSS +C4E9;C4E9;110A 1172 11BC;C4E9;110A 1172 11BC; # (쓩; 쓩; 쓩; 쓩; 쓩; ) HANGUL SYLLABLE SSYUNG +C4EA;C4EA;110A 1172 11BD;C4EA;110A 1172 11BD; # (쓪; 쓪; 쓪; 쓪; 쓪; ) HANGUL SYLLABLE SSYUJ +C4EB;C4EB;110A 1172 11BE;C4EB;110A 1172 11BE; # (쓫; 쓫; 쓫; 쓫; 쓫; ) HANGUL SYLLABLE SSYUC +C4EC;C4EC;110A 1172 11BF;C4EC;110A 1172 11BF; # (쓬; 쓬; 쓬; 쓬; 쓬; ) HANGUL SYLLABLE SSYUK +C4ED;C4ED;110A 1172 11C0;C4ED;110A 1172 11C0; # (쓭; 쓭; 쓭; 쓭; 쓭; ) HANGUL SYLLABLE SSYUT +C4EE;C4EE;110A 1172 11C1;C4EE;110A 1172 11C1; # (쓮; 쓮; 쓮; 쓮; 쓮; ) HANGUL SYLLABLE SSYUP +C4EF;C4EF;110A 1172 11C2;C4EF;110A 1172 11C2; # (쓯; 쓯; 쓯; 쓯; 쓯; ) HANGUL SYLLABLE SSYUH +C4F0;C4F0;110A 1173;C4F0;110A 1173; # (쓰; 쓰; 쓰; 쓰; 쓰; ) HANGUL SYLLABLE SSEU +C4F1;C4F1;110A 1173 11A8;C4F1;110A 1173 11A8; # (쓱; 쓱; 쓱; 쓱; 쓱; ) HANGUL SYLLABLE SSEUG +C4F2;C4F2;110A 1173 11A9;C4F2;110A 1173 11A9; # (쓲; 쓲; 쓲; 쓲; 쓲; ) HANGUL SYLLABLE SSEUGG +C4F3;C4F3;110A 1173 11AA;C4F3;110A 1173 11AA; # (쓳; 쓳; 쓳; 쓳; 쓳; ) HANGUL SYLLABLE SSEUGS +C4F4;C4F4;110A 1173 11AB;C4F4;110A 1173 11AB; # (쓴; 쓴; 쓴; 쓴; 쓴; ) HANGUL SYLLABLE SSEUN +C4F5;C4F5;110A 1173 11AC;C4F5;110A 1173 11AC; # (쓵; 쓵; 쓵; 쓵; 쓵; ) HANGUL SYLLABLE SSEUNJ +C4F6;C4F6;110A 1173 11AD;C4F6;110A 1173 11AD; # (쓶; 쓶; 쓶; 쓶; 쓶; ) HANGUL SYLLABLE SSEUNH +C4F7;C4F7;110A 1173 11AE;C4F7;110A 1173 11AE; # (쓷; 쓷; 쓷; 쓷; 쓷; ) HANGUL SYLLABLE SSEUD +C4F8;C4F8;110A 1173 11AF;C4F8;110A 1173 11AF; # (쓸; 쓸; 쓸; 쓸; 쓸; ) HANGUL SYLLABLE SSEUL +C4F9;C4F9;110A 1173 11B0;C4F9;110A 1173 11B0; # (쓹; 쓹; 쓹; 쓹; 쓹; ) HANGUL SYLLABLE SSEULG +C4FA;C4FA;110A 1173 11B1;C4FA;110A 1173 11B1; # (쓺; 쓺; 쓺; 쓺; 쓺; ) HANGUL SYLLABLE SSEULM +C4FB;C4FB;110A 1173 11B2;C4FB;110A 1173 11B2; # (쓻; 쓻; 쓻; 쓻; 쓻; ) HANGUL SYLLABLE SSEULB +C4FC;C4FC;110A 1173 11B3;C4FC;110A 1173 11B3; # (쓼; 쓼; 쓼; 쓼; 쓼; ) HANGUL SYLLABLE SSEULS +C4FD;C4FD;110A 1173 11B4;C4FD;110A 1173 11B4; # (쓽; 쓽; 쓽; 쓽; 쓽; ) HANGUL SYLLABLE SSEULT +C4FE;C4FE;110A 1173 11B5;C4FE;110A 1173 11B5; # (쓾; 쓾; 쓾; 쓾; 쓾; ) HANGUL SYLLABLE SSEULP +C4FF;C4FF;110A 1173 11B6;C4FF;110A 1173 11B6; # (쓿; 쓿; 쓿; 쓿; 쓿; ) HANGUL SYLLABLE SSEULH +C500;C500;110A 1173 11B7;C500;110A 1173 11B7; # (씀; 씀; 씀; 씀; 씀; ) HANGUL SYLLABLE SSEUM +C501;C501;110A 1173 11B8;C501;110A 1173 11B8; # (씁; 씁; 씁; 씁; 씁; ) HANGUL SYLLABLE SSEUB +C502;C502;110A 1173 11B9;C502;110A 1173 11B9; # (씂; 씂; 씂; 씂; 씂; ) HANGUL SYLLABLE SSEUBS +C503;C503;110A 1173 11BA;C503;110A 1173 11BA; # (씃; 씃; 씃; 씃; 씃; ) HANGUL SYLLABLE SSEUS +C504;C504;110A 1173 11BB;C504;110A 1173 11BB; # (씄; 씄; 씄; 씄; 씄; ) HANGUL SYLLABLE SSEUSS +C505;C505;110A 1173 11BC;C505;110A 1173 11BC; # (씅; 씅; 씅; 씅; 씅; ) HANGUL SYLLABLE SSEUNG +C506;C506;110A 1173 11BD;C506;110A 1173 11BD; # (씆; 씆; 씆; 씆; 씆; ) HANGUL SYLLABLE SSEUJ +C507;C507;110A 1173 11BE;C507;110A 1173 11BE; # (씇; 씇; 씇; 씇; 씇; ) HANGUL SYLLABLE SSEUC +C508;C508;110A 1173 11BF;C508;110A 1173 11BF; # (씈; 씈; 씈; 씈; 씈; ) HANGUL SYLLABLE SSEUK +C509;C509;110A 1173 11C0;C509;110A 1173 11C0; # (씉; 씉; 씉; 씉; 씉; ) HANGUL SYLLABLE SSEUT +C50A;C50A;110A 1173 11C1;C50A;110A 1173 11C1; # (씊; 씊; 씊; 씊; 씊; ) HANGUL SYLLABLE SSEUP +C50B;C50B;110A 1173 11C2;C50B;110A 1173 11C2; # (씋; 씋; 씋; 씋; 씋; ) HANGUL SYLLABLE SSEUH +C50C;C50C;110A 1174;C50C;110A 1174; # (씌; 씌; 씌; 씌; 씌; ) HANGUL SYLLABLE SSYI +C50D;C50D;110A 1174 11A8;C50D;110A 1174 11A8; # (씍; 씍; 씍; 씍; 씍; ) HANGUL SYLLABLE SSYIG +C50E;C50E;110A 1174 11A9;C50E;110A 1174 11A9; # (씎; 씎; 씎; 씎; 씎; ) HANGUL SYLLABLE SSYIGG +C50F;C50F;110A 1174 11AA;C50F;110A 1174 11AA; # (씏; 씏; 씏; 씏; 씏; ) HANGUL SYLLABLE SSYIGS +C510;C510;110A 1174 11AB;C510;110A 1174 11AB; # (씐; 씐; 씐; 씐; 씐; ) HANGUL SYLLABLE SSYIN +C511;C511;110A 1174 11AC;C511;110A 1174 11AC; # (씑; 씑; 씑; 씑; 씑; ) HANGUL SYLLABLE SSYINJ +C512;C512;110A 1174 11AD;C512;110A 1174 11AD; # (씒; 씒; 씒; 씒; 씒; ) HANGUL SYLLABLE SSYINH +C513;C513;110A 1174 11AE;C513;110A 1174 11AE; # (씓; 씓; 씓; 씓; 씓; ) HANGUL SYLLABLE SSYID +C514;C514;110A 1174 11AF;C514;110A 1174 11AF; # (씔; 씔; 씔; 씔; 씔; ) HANGUL SYLLABLE SSYIL +C515;C515;110A 1174 11B0;C515;110A 1174 11B0; # (씕; 씕; 씕; 씕; 씕; ) HANGUL SYLLABLE SSYILG +C516;C516;110A 1174 11B1;C516;110A 1174 11B1; # (씖; 씖; 씖; 씖; 씖; ) HANGUL SYLLABLE SSYILM +C517;C517;110A 1174 11B2;C517;110A 1174 11B2; # (씗; 씗; 씗; 씗; 씗; ) HANGUL SYLLABLE SSYILB +C518;C518;110A 1174 11B3;C518;110A 1174 11B3; # (씘; 씘; 씘; 씘; 씘; ) HANGUL SYLLABLE SSYILS +C519;C519;110A 1174 11B4;C519;110A 1174 11B4; # (씙; 씙; 씙; 씙; 씙; ) HANGUL SYLLABLE SSYILT +C51A;C51A;110A 1174 11B5;C51A;110A 1174 11B5; # (씚; 씚; 씚; 씚; 씚; ) HANGUL SYLLABLE SSYILP +C51B;C51B;110A 1174 11B6;C51B;110A 1174 11B6; # (씛; 씛; 씛; 씛; 씛; ) HANGUL SYLLABLE SSYILH +C51C;C51C;110A 1174 11B7;C51C;110A 1174 11B7; # (씜; 씜; 씜; 씜; 씜; ) HANGUL SYLLABLE SSYIM +C51D;C51D;110A 1174 11B8;C51D;110A 1174 11B8; # (씝; 씝; 씝; 씝; 씝; ) HANGUL SYLLABLE SSYIB +C51E;C51E;110A 1174 11B9;C51E;110A 1174 11B9; # (씞; 씞; 씞; 씞; 씞; ) HANGUL SYLLABLE SSYIBS +C51F;C51F;110A 1174 11BA;C51F;110A 1174 11BA; # (씟; 씟; 씟; 씟; 씟; ) HANGUL SYLLABLE SSYIS +C520;C520;110A 1174 11BB;C520;110A 1174 11BB; # (씠; 씠; 씠; 씠; 씠; ) HANGUL SYLLABLE SSYISS +C521;C521;110A 1174 11BC;C521;110A 1174 11BC; # (씡; 씡; 씡; 씡; 씡; ) HANGUL SYLLABLE SSYING +C522;C522;110A 1174 11BD;C522;110A 1174 11BD; # (씢; 씢; 씢; 씢; 씢; ) HANGUL SYLLABLE SSYIJ +C523;C523;110A 1174 11BE;C523;110A 1174 11BE; # (씣; 씣; 씣; 씣; 씣; ) HANGUL SYLLABLE SSYIC +C524;C524;110A 1174 11BF;C524;110A 1174 11BF; # (씤; 씤; 씤; 씤; 씤; ) HANGUL SYLLABLE SSYIK +C525;C525;110A 1174 11C0;C525;110A 1174 11C0; # (씥; 씥; 씥; 씥; 씥; ) HANGUL SYLLABLE SSYIT +C526;C526;110A 1174 11C1;C526;110A 1174 11C1; # (씦; 씦; 씦; 씦; 씦; ) HANGUL SYLLABLE SSYIP +C527;C527;110A 1174 11C2;C527;110A 1174 11C2; # (씧; 씧; 씧; 씧; 씧; ) HANGUL SYLLABLE SSYIH +C528;C528;110A 1175;C528;110A 1175; # (씨; 씨; 씨; 씨; 씨; ) HANGUL SYLLABLE SSI +C529;C529;110A 1175 11A8;C529;110A 1175 11A8; # (씩; 씩; 씩; 씩; 씩; ) HANGUL SYLLABLE SSIG +C52A;C52A;110A 1175 11A9;C52A;110A 1175 11A9; # (씪; 씪; 씪; 씪; 씪; ) HANGUL SYLLABLE SSIGG +C52B;C52B;110A 1175 11AA;C52B;110A 1175 11AA; # (씫; 씫; 씫; 씫; 씫; ) HANGUL SYLLABLE SSIGS +C52C;C52C;110A 1175 11AB;C52C;110A 1175 11AB; # (씬; 씬; 씬; 씬; 씬; ) HANGUL SYLLABLE SSIN +C52D;C52D;110A 1175 11AC;C52D;110A 1175 11AC; # (씭; 씭; 씭; 씭; 씭; ) HANGUL SYLLABLE SSINJ +C52E;C52E;110A 1175 11AD;C52E;110A 1175 11AD; # (씮; 씮; 씮; 씮; 씮; ) HANGUL SYLLABLE SSINH +C52F;C52F;110A 1175 11AE;C52F;110A 1175 11AE; # (씯; 씯; 씯; 씯; 씯; ) HANGUL SYLLABLE SSID +C530;C530;110A 1175 11AF;C530;110A 1175 11AF; # (씰; 씰; 씰; 씰; 씰; ) HANGUL SYLLABLE SSIL +C531;C531;110A 1175 11B0;C531;110A 1175 11B0; # (씱; 씱; 씱; 씱; 씱; ) HANGUL SYLLABLE SSILG +C532;C532;110A 1175 11B1;C532;110A 1175 11B1; # (씲; 씲; 씲; 씲; 씲; ) HANGUL SYLLABLE SSILM +C533;C533;110A 1175 11B2;C533;110A 1175 11B2; # (씳; 씳; 씳; 씳; 씳; ) HANGUL SYLLABLE SSILB +C534;C534;110A 1175 11B3;C534;110A 1175 11B3; # (씴; 씴; 씴; 씴; 씴; ) HANGUL SYLLABLE SSILS +C535;C535;110A 1175 11B4;C535;110A 1175 11B4; # (씵; 씵; 씵; 씵; 씵; ) HANGUL SYLLABLE SSILT +C536;C536;110A 1175 11B5;C536;110A 1175 11B5; # (씶; 씶; 씶; 씶; 씶; ) HANGUL SYLLABLE SSILP +C537;C537;110A 1175 11B6;C537;110A 1175 11B6; # (씷; 씷; 씷; 씷; 씷; ) HANGUL SYLLABLE SSILH +C538;C538;110A 1175 11B7;C538;110A 1175 11B7; # (씸; 씸; 씸; 씸; 씸; ) HANGUL SYLLABLE SSIM +C539;C539;110A 1175 11B8;C539;110A 1175 11B8; # (씹; 씹; 씹; 씹; 씹; ) HANGUL SYLLABLE SSIB +C53A;C53A;110A 1175 11B9;C53A;110A 1175 11B9; # (씺; 씺; 씺; 씺; 씺; ) HANGUL SYLLABLE SSIBS +C53B;C53B;110A 1175 11BA;C53B;110A 1175 11BA; # (씻; 씻; 씻; 씻; 씻; ) HANGUL SYLLABLE SSIS +C53C;C53C;110A 1175 11BB;C53C;110A 1175 11BB; # (씼; 씼; 씼; 씼; 씼; ) HANGUL SYLLABLE SSISS +C53D;C53D;110A 1175 11BC;C53D;110A 1175 11BC; # (씽; 씽; 씽; 씽; 씽; ) HANGUL SYLLABLE SSING +C53E;C53E;110A 1175 11BD;C53E;110A 1175 11BD; # (씾; 씾; 씾; 씾; 씾; ) HANGUL SYLLABLE SSIJ +C53F;C53F;110A 1175 11BE;C53F;110A 1175 11BE; # (씿; 씿; 씿; 씿; 씿; ) HANGUL SYLLABLE SSIC +C540;C540;110A 1175 11BF;C540;110A 1175 11BF; # (앀; 앀; 앀; 앀; 앀; ) HANGUL SYLLABLE SSIK +C541;C541;110A 1175 11C0;C541;110A 1175 11C0; # (앁; 앁; 앁; 앁; 앁; ) HANGUL SYLLABLE SSIT +C542;C542;110A 1175 11C1;C542;110A 1175 11C1; # (앂; 앂; 앂; 앂; 앂; ) HANGUL SYLLABLE SSIP +C543;C543;110A 1175 11C2;C543;110A 1175 11C2; # (앃; 앃; 앃; 앃; 앃; ) HANGUL SYLLABLE SSIH +C544;C544;110B 1161;C544;110B 1161; # (아; 아; 아; 아; 아; ) HANGUL SYLLABLE A +C545;C545;110B 1161 11A8;C545;110B 1161 11A8; # (악; 악; 악; 악; 악; ) HANGUL SYLLABLE AG +C546;C546;110B 1161 11A9;C546;110B 1161 11A9; # (앆; 앆; 앆; 앆; 앆; ) HANGUL SYLLABLE AGG +C547;C547;110B 1161 11AA;C547;110B 1161 11AA; # (앇; 앇; 앇; 앇; 앇; ) HANGUL SYLLABLE AGS +C548;C548;110B 1161 11AB;C548;110B 1161 11AB; # (안; 안; 안; 안; 안; ) HANGUL SYLLABLE AN +C549;C549;110B 1161 11AC;C549;110B 1161 11AC; # (앉; 앉; 앉; 앉; 앉; ) HANGUL SYLLABLE ANJ +C54A;C54A;110B 1161 11AD;C54A;110B 1161 11AD; # (않; 않; 않; 않; 않; ) HANGUL SYLLABLE ANH +C54B;C54B;110B 1161 11AE;C54B;110B 1161 11AE; # (앋; 앋; 앋; 앋; 앋; ) HANGUL SYLLABLE AD +C54C;C54C;110B 1161 11AF;C54C;110B 1161 11AF; # (알; 알; 알; 알; 알; ) HANGUL SYLLABLE AL +C54D;C54D;110B 1161 11B0;C54D;110B 1161 11B0; # (앍; 앍; 앍; 앍; 앍; ) HANGUL SYLLABLE ALG +C54E;C54E;110B 1161 11B1;C54E;110B 1161 11B1; # (앎; 앎; 앎; 앎; 앎; ) HANGUL SYLLABLE ALM +C54F;C54F;110B 1161 11B2;C54F;110B 1161 11B2; # (앏; 앏; 앏; 앏; 앏; ) HANGUL SYLLABLE ALB +C550;C550;110B 1161 11B3;C550;110B 1161 11B3; # (앐; 앐; 앐; 앐; 앐; ) HANGUL SYLLABLE ALS +C551;C551;110B 1161 11B4;C551;110B 1161 11B4; # (앑; 앑; 앑; 앑; 앑; ) HANGUL SYLLABLE ALT +C552;C552;110B 1161 11B5;C552;110B 1161 11B5; # (앒; 앒; 앒; 앒; 앒; ) HANGUL SYLLABLE ALP +C553;C553;110B 1161 11B6;C553;110B 1161 11B6; # (앓; 앓; 앓; 앓; 앓; ) HANGUL SYLLABLE ALH +C554;C554;110B 1161 11B7;C554;110B 1161 11B7; # (암; 암; 암; 암; 암; ) HANGUL SYLLABLE AM +C555;C555;110B 1161 11B8;C555;110B 1161 11B8; # (압; 압; 압; 압; 압; ) HANGUL SYLLABLE AB +C556;C556;110B 1161 11B9;C556;110B 1161 11B9; # (앖; 앖; 앖; 앖; 앖; ) HANGUL SYLLABLE ABS +C557;C557;110B 1161 11BA;C557;110B 1161 11BA; # (앗; 앗; 앗; 앗; 앗; ) HANGUL SYLLABLE AS +C558;C558;110B 1161 11BB;C558;110B 1161 11BB; # (았; 았; 았; 았; 았; ) HANGUL SYLLABLE ASS +C559;C559;110B 1161 11BC;C559;110B 1161 11BC; # (앙; 앙; 앙; 앙; 앙; ) HANGUL SYLLABLE ANG +C55A;C55A;110B 1161 11BD;C55A;110B 1161 11BD; # (앚; 앚; 앚; 앚; 앚; ) HANGUL SYLLABLE AJ +C55B;C55B;110B 1161 11BE;C55B;110B 1161 11BE; # (앛; 앛; 앛; 앛; 앛; ) HANGUL SYLLABLE AC +C55C;C55C;110B 1161 11BF;C55C;110B 1161 11BF; # (앜; 앜; 앜; 앜; 앜; ) HANGUL SYLLABLE AK +C55D;C55D;110B 1161 11C0;C55D;110B 1161 11C0; # (앝; 앝; 앝; 앝; 앝; ) HANGUL SYLLABLE AT +C55E;C55E;110B 1161 11C1;C55E;110B 1161 11C1; # (앞; 앞; 앞; 앞; 앞; ) HANGUL SYLLABLE AP +C55F;C55F;110B 1161 11C2;C55F;110B 1161 11C2; # (앟; 앟; 앟; 앟; 앟; ) HANGUL SYLLABLE AH +C560;C560;110B 1162;C560;110B 1162; # (애; 애; 애; 애; 애; ) HANGUL SYLLABLE AE +C561;C561;110B 1162 11A8;C561;110B 1162 11A8; # (액; 액; 액; 액; 액; ) HANGUL SYLLABLE AEG +C562;C562;110B 1162 11A9;C562;110B 1162 11A9; # (앢; 앢; 앢; 앢; 앢; ) HANGUL SYLLABLE AEGG +C563;C563;110B 1162 11AA;C563;110B 1162 11AA; # (앣; 앣; 앣; 앣; 앣; ) HANGUL SYLLABLE AEGS +C564;C564;110B 1162 11AB;C564;110B 1162 11AB; # (앤; 앤; 앤; 앤; 앤; ) HANGUL SYLLABLE AEN +C565;C565;110B 1162 11AC;C565;110B 1162 11AC; # (앥; 앥; 앥; 앥; 앥; ) HANGUL SYLLABLE AENJ +C566;C566;110B 1162 11AD;C566;110B 1162 11AD; # (앦; 앦; 앦; 앦; 앦; ) HANGUL SYLLABLE AENH +C567;C567;110B 1162 11AE;C567;110B 1162 11AE; # (앧; 앧; 앧; 앧; 앧; ) HANGUL SYLLABLE AED +C568;C568;110B 1162 11AF;C568;110B 1162 11AF; # (앨; 앨; 앨; 앨; 앨; ) HANGUL SYLLABLE AEL +C569;C569;110B 1162 11B0;C569;110B 1162 11B0; # (앩; 앩; 앩; 앩; 앩; ) HANGUL SYLLABLE AELG +C56A;C56A;110B 1162 11B1;C56A;110B 1162 11B1; # (앪; 앪; 앪; 앪; 앪; ) HANGUL SYLLABLE AELM +C56B;C56B;110B 1162 11B2;C56B;110B 1162 11B2; # (앫; 앫; 앫; 앫; 앫; ) HANGUL SYLLABLE AELB +C56C;C56C;110B 1162 11B3;C56C;110B 1162 11B3; # (앬; 앬; 앬; 앬; 앬; ) HANGUL SYLLABLE AELS +C56D;C56D;110B 1162 11B4;C56D;110B 1162 11B4; # (앭; 앭; 앭; 앭; 앭; ) HANGUL SYLLABLE AELT +C56E;C56E;110B 1162 11B5;C56E;110B 1162 11B5; # (앮; 앮; 앮; 앮; 앮; ) HANGUL SYLLABLE AELP +C56F;C56F;110B 1162 11B6;C56F;110B 1162 11B6; # (앯; 앯; 앯; 앯; 앯; ) HANGUL SYLLABLE AELH +C570;C570;110B 1162 11B7;C570;110B 1162 11B7; # (앰; 앰; 앰; 앰; 앰; ) HANGUL SYLLABLE AEM +C571;C571;110B 1162 11B8;C571;110B 1162 11B8; # (앱; 앱; 앱; 앱; 앱; ) HANGUL SYLLABLE AEB +C572;C572;110B 1162 11B9;C572;110B 1162 11B9; # (앲; 앲; 앲; 앲; 앲; ) HANGUL SYLLABLE AEBS +C573;C573;110B 1162 11BA;C573;110B 1162 11BA; # (앳; 앳; 앳; 앳; 앳; ) HANGUL SYLLABLE AES +C574;C574;110B 1162 11BB;C574;110B 1162 11BB; # (앴; 앴; 앴; 앴; 앴; ) HANGUL SYLLABLE AESS +C575;C575;110B 1162 11BC;C575;110B 1162 11BC; # (앵; 앵; 앵; 앵; 앵; ) HANGUL SYLLABLE AENG +C576;C576;110B 1162 11BD;C576;110B 1162 11BD; # (앶; 앶; 앶; 앶; 앶; ) HANGUL SYLLABLE AEJ +C577;C577;110B 1162 11BE;C577;110B 1162 11BE; # (앷; 앷; 앷; 앷; 앷; ) HANGUL SYLLABLE AEC +C578;C578;110B 1162 11BF;C578;110B 1162 11BF; # (앸; 앸; 앸; 앸; 앸; ) HANGUL SYLLABLE AEK +C579;C579;110B 1162 11C0;C579;110B 1162 11C0; # (앹; 앹; 앹; 앹; 앹; ) HANGUL SYLLABLE AET +C57A;C57A;110B 1162 11C1;C57A;110B 1162 11C1; # (앺; 앺; 앺; 앺; 앺; ) HANGUL SYLLABLE AEP +C57B;C57B;110B 1162 11C2;C57B;110B 1162 11C2; # (앻; 앻; 앻; 앻; 앻; ) HANGUL SYLLABLE AEH +C57C;C57C;110B 1163;C57C;110B 1163; # (야; 야; 야; 야; 야; ) HANGUL SYLLABLE YA +C57D;C57D;110B 1163 11A8;C57D;110B 1163 11A8; # (약; 약; 약; 약; 약; ) HANGUL SYLLABLE YAG +C57E;C57E;110B 1163 11A9;C57E;110B 1163 11A9; # (앾; 앾; 앾; 앾; 앾; ) HANGUL SYLLABLE YAGG +C57F;C57F;110B 1163 11AA;C57F;110B 1163 11AA; # (앿; 앿; 앿; 앿; 앿; ) HANGUL SYLLABLE YAGS +C580;C580;110B 1163 11AB;C580;110B 1163 11AB; # (얀; 얀; 얀; 얀; 얀; ) HANGUL SYLLABLE YAN +C581;C581;110B 1163 11AC;C581;110B 1163 11AC; # (얁; 얁; 얁; 얁; 얁; ) HANGUL SYLLABLE YANJ +C582;C582;110B 1163 11AD;C582;110B 1163 11AD; # (얂; 얂; 얂; 얂; 얂; ) HANGUL SYLLABLE YANH +C583;C583;110B 1163 11AE;C583;110B 1163 11AE; # (얃; 얃; 얃; 얃; 얃; ) HANGUL SYLLABLE YAD +C584;C584;110B 1163 11AF;C584;110B 1163 11AF; # (얄; 얄; 얄; 얄; 얄; ) HANGUL SYLLABLE YAL +C585;C585;110B 1163 11B0;C585;110B 1163 11B0; # (얅; 얅; 얅; 얅; 얅; ) HANGUL SYLLABLE YALG +C586;C586;110B 1163 11B1;C586;110B 1163 11B1; # (얆; 얆; 얆; 얆; 얆; ) HANGUL SYLLABLE YALM +C587;C587;110B 1163 11B2;C587;110B 1163 11B2; # (얇; 얇; 얇; 얇; 얇; ) HANGUL SYLLABLE YALB +C588;C588;110B 1163 11B3;C588;110B 1163 11B3; # (얈; 얈; 얈; 얈; 얈; ) HANGUL SYLLABLE YALS +C589;C589;110B 1163 11B4;C589;110B 1163 11B4; # (얉; 얉; 얉; 얉; 얉; ) HANGUL SYLLABLE YALT +C58A;C58A;110B 1163 11B5;C58A;110B 1163 11B5; # (얊; 얊; 얊; 얊; 얊; ) HANGUL SYLLABLE YALP +C58B;C58B;110B 1163 11B6;C58B;110B 1163 11B6; # (얋; 얋; 얋; 얋; 얋; ) HANGUL SYLLABLE YALH +C58C;C58C;110B 1163 11B7;C58C;110B 1163 11B7; # (얌; 얌; 얌; 얌; 얌; ) HANGUL SYLLABLE YAM +C58D;C58D;110B 1163 11B8;C58D;110B 1163 11B8; # (얍; 얍; 얍; 얍; 얍; ) HANGUL SYLLABLE YAB +C58E;C58E;110B 1163 11B9;C58E;110B 1163 11B9; # (얎; 얎; 얎; 얎; 얎; ) HANGUL SYLLABLE YABS +C58F;C58F;110B 1163 11BA;C58F;110B 1163 11BA; # (얏; 얏; 얏; 얏; 얏; ) HANGUL SYLLABLE YAS +C590;C590;110B 1163 11BB;C590;110B 1163 11BB; # (얐; 얐; 얐; 얐; 얐; ) HANGUL SYLLABLE YASS +C591;C591;110B 1163 11BC;C591;110B 1163 11BC; # (양; 양; 양; 양; 양; ) HANGUL SYLLABLE YANG +C592;C592;110B 1163 11BD;C592;110B 1163 11BD; # (얒; 얒; 얒; 얒; 얒; ) HANGUL SYLLABLE YAJ +C593;C593;110B 1163 11BE;C593;110B 1163 11BE; # (얓; 얓; 얓; 얓; 얓; ) HANGUL SYLLABLE YAC +C594;C594;110B 1163 11BF;C594;110B 1163 11BF; # (얔; 얔; 얔; 얔; 얔; ) HANGUL SYLLABLE YAK +C595;C595;110B 1163 11C0;C595;110B 1163 11C0; # (얕; 얕; 얕; 얕; 얕; ) HANGUL SYLLABLE YAT +C596;C596;110B 1163 11C1;C596;110B 1163 11C1; # (얖; 얖; 얖; 얖; 얖; ) HANGUL SYLLABLE YAP +C597;C597;110B 1163 11C2;C597;110B 1163 11C2; # (얗; 얗; 얗; 얗; 얗; ) HANGUL SYLLABLE YAH +C598;C598;110B 1164;C598;110B 1164; # (얘; 얘; 얘; 얘; 얘; ) HANGUL SYLLABLE YAE +C599;C599;110B 1164 11A8;C599;110B 1164 11A8; # (얙; 얙; 얙; 얙; 얙; ) HANGUL SYLLABLE YAEG +C59A;C59A;110B 1164 11A9;C59A;110B 1164 11A9; # (얚; 얚; 얚; 얚; 얚; ) HANGUL SYLLABLE YAEGG +C59B;C59B;110B 1164 11AA;C59B;110B 1164 11AA; # (얛; 얛; 얛; 얛; 얛; ) HANGUL SYLLABLE YAEGS +C59C;C59C;110B 1164 11AB;C59C;110B 1164 11AB; # (얜; 얜; 얜; 얜; 얜; ) HANGUL SYLLABLE YAEN +C59D;C59D;110B 1164 11AC;C59D;110B 1164 11AC; # (얝; 얝; 얝; 얝; 얝; ) HANGUL SYLLABLE YAENJ +C59E;C59E;110B 1164 11AD;C59E;110B 1164 11AD; # (얞; 얞; 얞; 얞; 얞; ) HANGUL SYLLABLE YAENH +C59F;C59F;110B 1164 11AE;C59F;110B 1164 11AE; # (얟; 얟; 얟; 얟; 얟; ) HANGUL SYLLABLE YAED +C5A0;C5A0;110B 1164 11AF;C5A0;110B 1164 11AF; # (얠; 얠; 얠; 얠; 얠; ) HANGUL SYLLABLE YAEL +C5A1;C5A1;110B 1164 11B0;C5A1;110B 1164 11B0; # (얡; 얡; 얡; 얡; 얡; ) HANGUL SYLLABLE YAELG +C5A2;C5A2;110B 1164 11B1;C5A2;110B 1164 11B1; # (얢; 얢; 얢; 얢; 얢; ) HANGUL SYLLABLE YAELM +C5A3;C5A3;110B 1164 11B2;C5A3;110B 1164 11B2; # (얣; 얣; 얣; 얣; 얣; ) HANGUL SYLLABLE YAELB +C5A4;C5A4;110B 1164 11B3;C5A4;110B 1164 11B3; # (얤; 얤; 얤; 얤; 얤; ) HANGUL SYLLABLE YAELS +C5A5;C5A5;110B 1164 11B4;C5A5;110B 1164 11B4; # (얥; 얥; 얥; 얥; 얥; ) HANGUL SYLLABLE YAELT +C5A6;C5A6;110B 1164 11B5;C5A6;110B 1164 11B5; # (얦; 얦; 얦; 얦; 얦; ) HANGUL SYLLABLE YAELP +C5A7;C5A7;110B 1164 11B6;C5A7;110B 1164 11B6; # (얧; 얧; 얧; 얧; 얧; ) HANGUL SYLLABLE YAELH +C5A8;C5A8;110B 1164 11B7;C5A8;110B 1164 11B7; # (얨; 얨; 얨; 얨; 얨; ) HANGUL SYLLABLE YAEM +C5A9;C5A9;110B 1164 11B8;C5A9;110B 1164 11B8; # (얩; 얩; 얩; 얩; 얩; ) HANGUL SYLLABLE YAEB +C5AA;C5AA;110B 1164 11B9;C5AA;110B 1164 11B9; # (얪; 얪; 얪; 얪; 얪; ) HANGUL SYLLABLE YAEBS +C5AB;C5AB;110B 1164 11BA;C5AB;110B 1164 11BA; # (얫; 얫; 얫; 얫; 얫; ) HANGUL SYLLABLE YAES +C5AC;C5AC;110B 1164 11BB;C5AC;110B 1164 11BB; # (얬; 얬; 얬; 얬; 얬; ) HANGUL SYLLABLE YAESS +C5AD;C5AD;110B 1164 11BC;C5AD;110B 1164 11BC; # (얭; 얭; 얭; 얭; 얭; ) HANGUL SYLLABLE YAENG +C5AE;C5AE;110B 1164 11BD;C5AE;110B 1164 11BD; # (얮; 얮; 얮; 얮; 얮; ) HANGUL SYLLABLE YAEJ +C5AF;C5AF;110B 1164 11BE;C5AF;110B 1164 11BE; # (얯; 얯; 얯; 얯; 얯; ) HANGUL SYLLABLE YAEC +C5B0;C5B0;110B 1164 11BF;C5B0;110B 1164 11BF; # (얰; 얰; 얰; 얰; 얰; ) HANGUL SYLLABLE YAEK +C5B1;C5B1;110B 1164 11C0;C5B1;110B 1164 11C0; # (얱; 얱; 얱; 얱; 얱; ) HANGUL SYLLABLE YAET +C5B2;C5B2;110B 1164 11C1;C5B2;110B 1164 11C1; # (얲; 얲; 얲; 얲; 얲; ) HANGUL SYLLABLE YAEP +C5B3;C5B3;110B 1164 11C2;C5B3;110B 1164 11C2; # (얳; 얳; 얳; 얳; 얳; ) HANGUL SYLLABLE YAEH +C5B4;C5B4;110B 1165;C5B4;110B 1165; # (어; 어; 어; 어; 어; ) HANGUL SYLLABLE EO +C5B5;C5B5;110B 1165 11A8;C5B5;110B 1165 11A8; # (억; 억; 억; 억; 억; ) HANGUL SYLLABLE EOG +C5B6;C5B6;110B 1165 11A9;C5B6;110B 1165 11A9; # (얶; 얶; 얶; 얶; 얶; ) HANGUL SYLLABLE EOGG +C5B7;C5B7;110B 1165 11AA;C5B7;110B 1165 11AA; # (얷; 얷; 얷; 얷; 얷; ) HANGUL SYLLABLE EOGS +C5B8;C5B8;110B 1165 11AB;C5B8;110B 1165 11AB; # (언; 언; 언; 언; 언; ) HANGUL SYLLABLE EON +C5B9;C5B9;110B 1165 11AC;C5B9;110B 1165 11AC; # (얹; 얹; 얹; 얹; 얹; ) HANGUL SYLLABLE EONJ +C5BA;C5BA;110B 1165 11AD;C5BA;110B 1165 11AD; # (얺; 얺; 얺; 얺; 얺; ) HANGUL SYLLABLE EONH +C5BB;C5BB;110B 1165 11AE;C5BB;110B 1165 11AE; # (얻; 얻; 얻; 얻; 얻; ) HANGUL SYLLABLE EOD +C5BC;C5BC;110B 1165 11AF;C5BC;110B 1165 11AF; # (얼; 얼; 얼; 얼; 얼; ) HANGUL SYLLABLE EOL +C5BD;C5BD;110B 1165 11B0;C5BD;110B 1165 11B0; # (얽; 얽; 얽; 얽; 얽; ) HANGUL SYLLABLE EOLG +C5BE;C5BE;110B 1165 11B1;C5BE;110B 1165 11B1; # (얾; 얾; 얾; 얾; 얾; ) HANGUL SYLLABLE EOLM +C5BF;C5BF;110B 1165 11B2;C5BF;110B 1165 11B2; # (얿; 얿; 얿; 얿; 얿; ) HANGUL SYLLABLE EOLB +C5C0;C5C0;110B 1165 11B3;C5C0;110B 1165 11B3; # (엀; 엀; 엀; 엀; 엀; ) HANGUL SYLLABLE EOLS +C5C1;C5C1;110B 1165 11B4;C5C1;110B 1165 11B4; # (엁; 엁; 엁; 엁; 엁; ) HANGUL SYLLABLE EOLT +C5C2;C5C2;110B 1165 11B5;C5C2;110B 1165 11B5; # (엂; 엂; 엂; 엂; 엂; ) HANGUL SYLLABLE EOLP +C5C3;C5C3;110B 1165 11B6;C5C3;110B 1165 11B6; # (엃; 엃; 엃; 엃; 엃; ) HANGUL SYLLABLE EOLH +C5C4;C5C4;110B 1165 11B7;C5C4;110B 1165 11B7; # (엄; 엄; 엄; 엄; 엄; ) HANGUL SYLLABLE EOM +C5C5;C5C5;110B 1165 11B8;C5C5;110B 1165 11B8; # (업; 업; 업; 업; 업; ) HANGUL SYLLABLE EOB +C5C6;C5C6;110B 1165 11B9;C5C6;110B 1165 11B9; # (없; 없; 없; 없; 없; ) HANGUL SYLLABLE EOBS +C5C7;C5C7;110B 1165 11BA;C5C7;110B 1165 11BA; # (엇; 엇; 엇; 엇; 엇; ) HANGUL SYLLABLE EOS +C5C8;C5C8;110B 1165 11BB;C5C8;110B 1165 11BB; # (었; 었; 었; 었; 었; ) HANGUL SYLLABLE EOSS +C5C9;C5C9;110B 1165 11BC;C5C9;110B 1165 11BC; # (엉; 엉; 엉; 엉; 엉; ) HANGUL SYLLABLE EONG +C5CA;C5CA;110B 1165 11BD;C5CA;110B 1165 11BD; # (엊; 엊; 엊; 엊; 엊; ) HANGUL SYLLABLE EOJ +C5CB;C5CB;110B 1165 11BE;C5CB;110B 1165 11BE; # (엋; 엋; 엋; 엋; 엋; ) HANGUL SYLLABLE EOC +C5CC;C5CC;110B 1165 11BF;C5CC;110B 1165 11BF; # (엌; 엌; 엌; 엌; 엌; ) HANGUL SYLLABLE EOK +C5CD;C5CD;110B 1165 11C0;C5CD;110B 1165 11C0; # (엍; 엍; 엍; 엍; 엍; ) HANGUL SYLLABLE EOT +C5CE;C5CE;110B 1165 11C1;C5CE;110B 1165 11C1; # (엎; 엎; 엎; 엎; 엎; ) HANGUL SYLLABLE EOP +C5CF;C5CF;110B 1165 11C2;C5CF;110B 1165 11C2; # (엏; 엏; 엏; 엏; 엏; ) HANGUL SYLLABLE EOH +C5D0;C5D0;110B 1166;C5D0;110B 1166; # (에; 에; 에; 에; 에; ) HANGUL SYLLABLE E +C5D1;C5D1;110B 1166 11A8;C5D1;110B 1166 11A8; # (엑; 엑; 엑; 엑; 엑; ) HANGUL SYLLABLE EG +C5D2;C5D2;110B 1166 11A9;C5D2;110B 1166 11A9; # (엒; 엒; 엒; 엒; 엒; ) HANGUL SYLLABLE EGG +C5D3;C5D3;110B 1166 11AA;C5D3;110B 1166 11AA; # (엓; 엓; 엓; 엓; 엓; ) HANGUL SYLLABLE EGS +C5D4;C5D4;110B 1166 11AB;C5D4;110B 1166 11AB; # (엔; 엔; 엔; 엔; 엔; ) HANGUL SYLLABLE EN +C5D5;C5D5;110B 1166 11AC;C5D5;110B 1166 11AC; # (엕; 엕; 엕; 엕; 엕; ) HANGUL SYLLABLE ENJ +C5D6;C5D6;110B 1166 11AD;C5D6;110B 1166 11AD; # (엖; 엖; 엖; 엖; 엖; ) HANGUL SYLLABLE ENH +C5D7;C5D7;110B 1166 11AE;C5D7;110B 1166 11AE; # (엗; 엗; 엗; 엗; 엗; ) HANGUL SYLLABLE ED +C5D8;C5D8;110B 1166 11AF;C5D8;110B 1166 11AF; # (엘; 엘; 엘; 엘; 엘; ) HANGUL SYLLABLE EL +C5D9;C5D9;110B 1166 11B0;C5D9;110B 1166 11B0; # (엙; 엙; 엙; 엙; 엙; ) HANGUL SYLLABLE ELG +C5DA;C5DA;110B 1166 11B1;C5DA;110B 1166 11B1; # (엚; 엚; 엚; 엚; 엚; ) HANGUL SYLLABLE ELM +C5DB;C5DB;110B 1166 11B2;C5DB;110B 1166 11B2; # (엛; 엛; 엛; 엛; 엛; ) HANGUL SYLLABLE ELB +C5DC;C5DC;110B 1166 11B3;C5DC;110B 1166 11B3; # (엜; 엜; 엜; 엜; 엜; ) HANGUL SYLLABLE ELS +C5DD;C5DD;110B 1166 11B4;C5DD;110B 1166 11B4; # (엝; 엝; 엝; 엝; 엝; ) HANGUL SYLLABLE ELT +C5DE;C5DE;110B 1166 11B5;C5DE;110B 1166 11B5; # (엞; 엞; 엞; 엞; 엞; ) HANGUL SYLLABLE ELP +C5DF;C5DF;110B 1166 11B6;C5DF;110B 1166 11B6; # (엟; 엟; 엟; 엟; 엟; ) HANGUL SYLLABLE ELH +C5E0;C5E0;110B 1166 11B7;C5E0;110B 1166 11B7; # (엠; 엠; 엠; 엠; 엠; ) HANGUL SYLLABLE EM +C5E1;C5E1;110B 1166 11B8;C5E1;110B 1166 11B8; # (엡; 엡; 엡; 엡; 엡; ) HANGUL SYLLABLE EB +C5E2;C5E2;110B 1166 11B9;C5E2;110B 1166 11B9; # (엢; 엢; 엢; 엢; 엢; ) HANGUL SYLLABLE EBS +C5E3;C5E3;110B 1166 11BA;C5E3;110B 1166 11BA; # (엣; 엣; 엣; 엣; 엣; ) HANGUL SYLLABLE ES +C5E4;C5E4;110B 1166 11BB;C5E4;110B 1166 11BB; # (엤; 엤; 엤; 엤; 엤; ) HANGUL SYLLABLE ESS +C5E5;C5E5;110B 1166 11BC;C5E5;110B 1166 11BC; # (엥; 엥; 엥; 엥; 엥; ) HANGUL SYLLABLE ENG +C5E6;C5E6;110B 1166 11BD;C5E6;110B 1166 11BD; # (엦; 엦; 엦; 엦; 엦; ) HANGUL SYLLABLE EJ +C5E7;C5E7;110B 1166 11BE;C5E7;110B 1166 11BE; # (엧; 엧; 엧; 엧; 엧; ) HANGUL SYLLABLE EC +C5E8;C5E8;110B 1166 11BF;C5E8;110B 1166 11BF; # (엨; 엨; 엨; 엨; 엨; ) HANGUL SYLLABLE EK +C5E9;C5E9;110B 1166 11C0;C5E9;110B 1166 11C0; # (엩; 엩; 엩; 엩; 엩; ) HANGUL SYLLABLE ET +C5EA;C5EA;110B 1166 11C1;C5EA;110B 1166 11C1; # (엪; 엪; 엪; 엪; 엪; ) HANGUL SYLLABLE EP +C5EB;C5EB;110B 1166 11C2;C5EB;110B 1166 11C2; # (엫; 엫; 엫; 엫; 엫; ) HANGUL SYLLABLE EH +C5EC;C5EC;110B 1167;C5EC;110B 1167; # (여; 여; 여; 여; 여; ) HANGUL SYLLABLE YEO +C5ED;C5ED;110B 1167 11A8;C5ED;110B 1167 11A8; # (역; 역; 역; 역; 역; ) HANGUL SYLLABLE YEOG +C5EE;C5EE;110B 1167 11A9;C5EE;110B 1167 11A9; # (엮; 엮; 엮; 엮; 엮; ) HANGUL SYLLABLE YEOGG +C5EF;C5EF;110B 1167 11AA;C5EF;110B 1167 11AA; # (엯; 엯; 엯; 엯; 엯; ) HANGUL SYLLABLE YEOGS +C5F0;C5F0;110B 1167 11AB;C5F0;110B 1167 11AB; # (연; 연; 연; 연; 연; ) HANGUL SYLLABLE YEON +C5F1;C5F1;110B 1167 11AC;C5F1;110B 1167 11AC; # (엱; 엱; 엱; 엱; 엱; ) HANGUL SYLLABLE YEONJ +C5F2;C5F2;110B 1167 11AD;C5F2;110B 1167 11AD; # (엲; 엲; 엲; 엲; 엲; ) HANGUL SYLLABLE YEONH +C5F3;C5F3;110B 1167 11AE;C5F3;110B 1167 11AE; # (엳; 엳; 엳; 엳; 엳; ) HANGUL SYLLABLE YEOD +C5F4;C5F4;110B 1167 11AF;C5F4;110B 1167 11AF; # (열; 열; 열; 열; 열; ) HANGUL SYLLABLE YEOL +C5F5;C5F5;110B 1167 11B0;C5F5;110B 1167 11B0; # (엵; 엵; 엵; 엵; 엵; ) HANGUL SYLLABLE YEOLG +C5F6;C5F6;110B 1167 11B1;C5F6;110B 1167 11B1; # (엶; 엶; 엶; 엶; 엶; ) HANGUL SYLLABLE YEOLM +C5F7;C5F7;110B 1167 11B2;C5F7;110B 1167 11B2; # (엷; 엷; 엷; 엷; 엷; ) HANGUL SYLLABLE YEOLB +C5F8;C5F8;110B 1167 11B3;C5F8;110B 1167 11B3; # (엸; 엸; 엸; 엸; 엸; ) HANGUL SYLLABLE YEOLS +C5F9;C5F9;110B 1167 11B4;C5F9;110B 1167 11B4; # (엹; 엹; 엹; 엹; 엹; ) HANGUL SYLLABLE YEOLT +C5FA;C5FA;110B 1167 11B5;C5FA;110B 1167 11B5; # (엺; 엺; 엺; 엺; 엺; ) HANGUL SYLLABLE YEOLP +C5FB;C5FB;110B 1167 11B6;C5FB;110B 1167 11B6; # (엻; 엻; 엻; 엻; 엻; ) HANGUL SYLLABLE YEOLH +C5FC;C5FC;110B 1167 11B7;C5FC;110B 1167 11B7; # (염; 염; 염; 염; 염; ) HANGUL SYLLABLE YEOM +C5FD;C5FD;110B 1167 11B8;C5FD;110B 1167 11B8; # (엽; 엽; 엽; 엽; 엽; ) HANGUL SYLLABLE YEOB +C5FE;C5FE;110B 1167 11B9;C5FE;110B 1167 11B9; # (엾; 엾; 엾; 엾; 엾; ) HANGUL SYLLABLE YEOBS +C5FF;C5FF;110B 1167 11BA;C5FF;110B 1167 11BA; # (엿; 엿; 엿; 엿; 엿; ) HANGUL SYLLABLE YEOS +C600;C600;110B 1167 11BB;C600;110B 1167 11BB; # (였; 였; 였; 였; 였; ) HANGUL SYLLABLE YEOSS +C601;C601;110B 1167 11BC;C601;110B 1167 11BC; # (영; 영; 영; 영; 영; ) HANGUL SYLLABLE YEONG +C602;C602;110B 1167 11BD;C602;110B 1167 11BD; # (옂; 옂; 옂; 옂; 옂; ) HANGUL SYLLABLE YEOJ +C603;C603;110B 1167 11BE;C603;110B 1167 11BE; # (옃; 옃; 옃; 옃; 옃; ) HANGUL SYLLABLE YEOC +C604;C604;110B 1167 11BF;C604;110B 1167 11BF; # (옄; 옄; 옄; 옄; 옄; ) HANGUL SYLLABLE YEOK +C605;C605;110B 1167 11C0;C605;110B 1167 11C0; # (옅; 옅; 옅; 옅; 옅; ) HANGUL SYLLABLE YEOT +C606;C606;110B 1167 11C1;C606;110B 1167 11C1; # (옆; 옆; 옆; 옆; 옆; ) HANGUL SYLLABLE YEOP +C607;C607;110B 1167 11C2;C607;110B 1167 11C2; # (옇; 옇; 옇; 옇; 옇; ) HANGUL SYLLABLE YEOH +C608;C608;110B 1168;C608;110B 1168; # (예; 예; 예; 예; 예; ) HANGUL SYLLABLE YE +C609;C609;110B 1168 11A8;C609;110B 1168 11A8; # (옉; 옉; 옉; 옉; 옉; ) HANGUL SYLLABLE YEG +C60A;C60A;110B 1168 11A9;C60A;110B 1168 11A9; # (옊; 옊; 옊; 옊; 옊; ) HANGUL SYLLABLE YEGG +C60B;C60B;110B 1168 11AA;C60B;110B 1168 11AA; # (옋; 옋; 옋; 옋; 옋; ) HANGUL SYLLABLE YEGS +C60C;C60C;110B 1168 11AB;C60C;110B 1168 11AB; # (옌; 옌; 옌; 옌; 옌; ) HANGUL SYLLABLE YEN +C60D;C60D;110B 1168 11AC;C60D;110B 1168 11AC; # (옍; 옍; 옍; 옍; 옍; ) HANGUL SYLLABLE YENJ +C60E;C60E;110B 1168 11AD;C60E;110B 1168 11AD; # (옎; 옎; 옎; 옎; 옎; ) HANGUL SYLLABLE YENH +C60F;C60F;110B 1168 11AE;C60F;110B 1168 11AE; # (옏; 옏; 옏; 옏; 옏; ) HANGUL SYLLABLE YED +C610;C610;110B 1168 11AF;C610;110B 1168 11AF; # (옐; 옐; 옐; 옐; 옐; ) HANGUL SYLLABLE YEL +C611;C611;110B 1168 11B0;C611;110B 1168 11B0; # (옑; 옑; 옑; 옑; 옑; ) HANGUL SYLLABLE YELG +C612;C612;110B 1168 11B1;C612;110B 1168 11B1; # (옒; 옒; 옒; 옒; 옒; ) HANGUL SYLLABLE YELM +C613;C613;110B 1168 11B2;C613;110B 1168 11B2; # (옓; 옓; 옓; 옓; 옓; ) HANGUL SYLLABLE YELB +C614;C614;110B 1168 11B3;C614;110B 1168 11B3; # (옔; 옔; 옔; 옔; 옔; ) HANGUL SYLLABLE YELS +C615;C615;110B 1168 11B4;C615;110B 1168 11B4; # (옕; 옕; 옕; 옕; 옕; ) HANGUL SYLLABLE YELT +C616;C616;110B 1168 11B5;C616;110B 1168 11B5; # (옖; 옖; 옖; 옖; 옖; ) HANGUL SYLLABLE YELP +C617;C617;110B 1168 11B6;C617;110B 1168 11B6; # (옗; 옗; 옗; 옗; 옗; ) HANGUL SYLLABLE YELH +C618;C618;110B 1168 11B7;C618;110B 1168 11B7; # (옘; 옘; 옘; 옘; 옘; ) HANGUL SYLLABLE YEM +C619;C619;110B 1168 11B8;C619;110B 1168 11B8; # (옙; 옙; 옙; 옙; 옙; ) HANGUL SYLLABLE YEB +C61A;C61A;110B 1168 11B9;C61A;110B 1168 11B9; # (옚; 옚; 옚; 옚; 옚; ) HANGUL SYLLABLE YEBS +C61B;C61B;110B 1168 11BA;C61B;110B 1168 11BA; # (옛; 옛; 옛; 옛; 옛; ) HANGUL SYLLABLE YES +C61C;C61C;110B 1168 11BB;C61C;110B 1168 11BB; # (옜; 옜; 옜; 옜; 옜; ) HANGUL SYLLABLE YESS +C61D;C61D;110B 1168 11BC;C61D;110B 1168 11BC; # (옝; 옝; 옝; 옝; 옝; ) HANGUL SYLLABLE YENG +C61E;C61E;110B 1168 11BD;C61E;110B 1168 11BD; # (옞; 옞; 옞; 옞; 옞; ) HANGUL SYLLABLE YEJ +C61F;C61F;110B 1168 11BE;C61F;110B 1168 11BE; # (옟; 옟; 옟; 옟; 옟; ) HANGUL SYLLABLE YEC +C620;C620;110B 1168 11BF;C620;110B 1168 11BF; # (옠; 옠; 옠; 옠; 옠; ) HANGUL SYLLABLE YEK +C621;C621;110B 1168 11C0;C621;110B 1168 11C0; # (옡; 옡; 옡; 옡; 옡; ) HANGUL SYLLABLE YET +C622;C622;110B 1168 11C1;C622;110B 1168 11C1; # (옢; 옢; 옢; 옢; 옢; ) HANGUL SYLLABLE YEP +C623;C623;110B 1168 11C2;C623;110B 1168 11C2; # (옣; 옣; 옣; 옣; 옣; ) HANGUL SYLLABLE YEH +C624;C624;110B 1169;C624;110B 1169; # (오; 오; 오; 오; 오; ) HANGUL SYLLABLE O +C625;C625;110B 1169 11A8;C625;110B 1169 11A8; # (옥; 옥; 옥; 옥; 옥; ) HANGUL SYLLABLE OG +C626;C626;110B 1169 11A9;C626;110B 1169 11A9; # (옦; 옦; 옦; 옦; 옦; ) HANGUL SYLLABLE OGG +C627;C627;110B 1169 11AA;C627;110B 1169 11AA; # (옧; 옧; 옧; 옧; 옧; ) HANGUL SYLLABLE OGS +C628;C628;110B 1169 11AB;C628;110B 1169 11AB; # (온; 온; 온; 온; 온; ) HANGUL SYLLABLE ON +C629;C629;110B 1169 11AC;C629;110B 1169 11AC; # (옩; 옩; 옩; 옩; 옩; ) HANGUL SYLLABLE ONJ +C62A;C62A;110B 1169 11AD;C62A;110B 1169 11AD; # (옪; 옪; 옪; 옪; 옪; ) HANGUL SYLLABLE ONH +C62B;C62B;110B 1169 11AE;C62B;110B 1169 11AE; # (옫; 옫; 옫; 옫; 옫; ) HANGUL SYLLABLE OD +C62C;C62C;110B 1169 11AF;C62C;110B 1169 11AF; # (올; 올; 올; 올; 올; ) HANGUL SYLLABLE OL +C62D;C62D;110B 1169 11B0;C62D;110B 1169 11B0; # (옭; 옭; 옭; 옭; 옭; ) HANGUL SYLLABLE OLG +C62E;C62E;110B 1169 11B1;C62E;110B 1169 11B1; # (옮; 옮; 옮; 옮; 옮; ) HANGUL SYLLABLE OLM +C62F;C62F;110B 1169 11B2;C62F;110B 1169 11B2; # (옯; 옯; 옯; 옯; 옯; ) HANGUL SYLLABLE OLB +C630;C630;110B 1169 11B3;C630;110B 1169 11B3; # (옰; 옰; 옰; 옰; 옰; ) HANGUL SYLLABLE OLS +C631;C631;110B 1169 11B4;C631;110B 1169 11B4; # (옱; 옱; 옱; 옱; 옱; ) HANGUL SYLLABLE OLT +C632;C632;110B 1169 11B5;C632;110B 1169 11B5; # (옲; 옲; 옲; 옲; 옲; ) HANGUL SYLLABLE OLP +C633;C633;110B 1169 11B6;C633;110B 1169 11B6; # (옳; 옳; 옳; 옳; 옳; ) HANGUL SYLLABLE OLH +C634;C634;110B 1169 11B7;C634;110B 1169 11B7; # (옴; 옴; 옴; 옴; 옴; ) HANGUL SYLLABLE OM +C635;C635;110B 1169 11B8;C635;110B 1169 11B8; # (옵; 옵; 옵; 옵; 옵; ) HANGUL SYLLABLE OB +C636;C636;110B 1169 11B9;C636;110B 1169 11B9; # (옶; 옶; 옶; 옶; 옶; ) HANGUL SYLLABLE OBS +C637;C637;110B 1169 11BA;C637;110B 1169 11BA; # (옷; 옷; 옷; 옷; 옷; ) HANGUL SYLLABLE OS +C638;C638;110B 1169 11BB;C638;110B 1169 11BB; # (옸; 옸; 옸; 옸; 옸; ) HANGUL SYLLABLE OSS +C639;C639;110B 1169 11BC;C639;110B 1169 11BC; # (옹; 옹; 옹; 옹; 옹; ) HANGUL SYLLABLE ONG +C63A;C63A;110B 1169 11BD;C63A;110B 1169 11BD; # (옺; 옺; 옺; 옺; 옺; ) HANGUL SYLLABLE OJ +C63B;C63B;110B 1169 11BE;C63B;110B 1169 11BE; # (옻; 옻; 옻; 옻; 옻; ) HANGUL SYLLABLE OC +C63C;C63C;110B 1169 11BF;C63C;110B 1169 11BF; # (옼; 옼; 옼; 옼; 옼; ) HANGUL SYLLABLE OK +C63D;C63D;110B 1169 11C0;C63D;110B 1169 11C0; # (옽; 옽; 옽; 옽; 옽; ) HANGUL SYLLABLE OT +C63E;C63E;110B 1169 11C1;C63E;110B 1169 11C1; # (옾; 옾; 옾; 옾; 옾; ) HANGUL SYLLABLE OP +C63F;C63F;110B 1169 11C2;C63F;110B 1169 11C2; # (옿; 옿; 옿; 옿; 옿; ) HANGUL SYLLABLE OH +C640;C640;110B 116A;C640;110B 116A; # (와; 와; 와; 와; 와; ) HANGUL SYLLABLE WA +C641;C641;110B 116A 11A8;C641;110B 116A 11A8; # (왁; 왁; 왁; 왁; 왁; ) HANGUL SYLLABLE WAG +C642;C642;110B 116A 11A9;C642;110B 116A 11A9; # (왂; 왂; 왂; 왂; 왂; ) HANGUL SYLLABLE WAGG +C643;C643;110B 116A 11AA;C643;110B 116A 11AA; # (왃; 왃; 왃; 왃; 왃; ) HANGUL SYLLABLE WAGS +C644;C644;110B 116A 11AB;C644;110B 116A 11AB; # (완; 완; 완; 완; 완; ) HANGUL SYLLABLE WAN +C645;C645;110B 116A 11AC;C645;110B 116A 11AC; # (왅; 왅; 왅; 왅; 왅; ) HANGUL SYLLABLE WANJ +C646;C646;110B 116A 11AD;C646;110B 116A 11AD; # (왆; 왆; 왆; 왆; 왆; ) HANGUL SYLLABLE WANH +C647;C647;110B 116A 11AE;C647;110B 116A 11AE; # (왇; 왇; 왇; 왇; 왇; ) HANGUL SYLLABLE WAD +C648;C648;110B 116A 11AF;C648;110B 116A 11AF; # (왈; 왈; 왈; 왈; 왈; ) HANGUL SYLLABLE WAL +C649;C649;110B 116A 11B0;C649;110B 116A 11B0; # (왉; 왉; 왉; 왉; 왉; ) HANGUL SYLLABLE WALG +C64A;C64A;110B 116A 11B1;C64A;110B 116A 11B1; # (왊; 왊; 왊; 왊; 왊; ) HANGUL SYLLABLE WALM +C64B;C64B;110B 116A 11B2;C64B;110B 116A 11B2; # (왋; 왋; 왋; 왋; 왋; ) HANGUL SYLLABLE WALB +C64C;C64C;110B 116A 11B3;C64C;110B 116A 11B3; # (왌; 왌; 왌; 왌; 왌; ) HANGUL SYLLABLE WALS +C64D;C64D;110B 116A 11B4;C64D;110B 116A 11B4; # (왍; 왍; 왍; 왍; 왍; ) HANGUL SYLLABLE WALT +C64E;C64E;110B 116A 11B5;C64E;110B 116A 11B5; # (왎; 왎; 왎; 왎; 왎; ) HANGUL SYLLABLE WALP +C64F;C64F;110B 116A 11B6;C64F;110B 116A 11B6; # (왏; 왏; 왏; 왏; 왏; ) HANGUL SYLLABLE WALH +C650;C650;110B 116A 11B7;C650;110B 116A 11B7; # (왐; 왐; 왐; 왐; 왐; ) HANGUL SYLLABLE WAM +C651;C651;110B 116A 11B8;C651;110B 116A 11B8; # (왑; 왑; 왑; 왑; 왑; ) HANGUL SYLLABLE WAB +C652;C652;110B 116A 11B9;C652;110B 116A 11B9; # (왒; 왒; 왒; 왒; 왒; ) HANGUL SYLLABLE WABS +C653;C653;110B 116A 11BA;C653;110B 116A 11BA; # (왓; 왓; 왓; 왓; 왓; ) HANGUL SYLLABLE WAS +C654;C654;110B 116A 11BB;C654;110B 116A 11BB; # (왔; 왔; 왔; 왔; 왔; ) HANGUL SYLLABLE WASS +C655;C655;110B 116A 11BC;C655;110B 116A 11BC; # (왕; 왕; 왕; 왕; 왕; ) HANGUL SYLLABLE WANG +C656;C656;110B 116A 11BD;C656;110B 116A 11BD; # (왖; 왖; 왖; 왖; 왖; ) HANGUL SYLLABLE WAJ +C657;C657;110B 116A 11BE;C657;110B 116A 11BE; # (왗; 왗; 왗; 왗; 왗; ) HANGUL SYLLABLE WAC +C658;C658;110B 116A 11BF;C658;110B 116A 11BF; # (왘; 왘; 왘; 왘; 왘; ) HANGUL SYLLABLE WAK +C659;C659;110B 116A 11C0;C659;110B 116A 11C0; # (왙; 왙; 왙; 왙; 왙; ) HANGUL SYLLABLE WAT +C65A;C65A;110B 116A 11C1;C65A;110B 116A 11C1; # (왚; 왚; 왚; 왚; 왚; ) HANGUL SYLLABLE WAP +C65B;C65B;110B 116A 11C2;C65B;110B 116A 11C2; # (왛; 왛; 왛; 왛; 왛; ) HANGUL SYLLABLE WAH +C65C;C65C;110B 116B;C65C;110B 116B; # (왜; 왜; 왜; 왜; 왜; ) HANGUL SYLLABLE WAE +C65D;C65D;110B 116B 11A8;C65D;110B 116B 11A8; # (왝; 왝; 왝; 왝; 왝; ) HANGUL SYLLABLE WAEG +C65E;C65E;110B 116B 11A9;C65E;110B 116B 11A9; # (왞; 왞; 왞; 왞; 왞; ) HANGUL SYLLABLE WAEGG +C65F;C65F;110B 116B 11AA;C65F;110B 116B 11AA; # (왟; 왟; 왟; 왟; 왟; ) HANGUL SYLLABLE WAEGS +C660;C660;110B 116B 11AB;C660;110B 116B 11AB; # (왠; 왠; 왠; 왠; 왠; ) HANGUL SYLLABLE WAEN +C661;C661;110B 116B 11AC;C661;110B 116B 11AC; # (왡; 왡; 왡; 왡; 왡; ) HANGUL SYLLABLE WAENJ +C662;C662;110B 116B 11AD;C662;110B 116B 11AD; # (왢; 왢; 왢; 왢; 왢; ) HANGUL SYLLABLE WAENH +C663;C663;110B 116B 11AE;C663;110B 116B 11AE; # (왣; 왣; 왣; 왣; 왣; ) HANGUL SYLLABLE WAED +C664;C664;110B 116B 11AF;C664;110B 116B 11AF; # (왤; 왤; 왤; 왤; 왤; ) HANGUL SYLLABLE WAEL +C665;C665;110B 116B 11B0;C665;110B 116B 11B0; # (왥; 왥; 왥; 왥; 왥; ) HANGUL SYLLABLE WAELG +C666;C666;110B 116B 11B1;C666;110B 116B 11B1; # (왦; 왦; 왦; 왦; 왦; ) HANGUL SYLLABLE WAELM +C667;C667;110B 116B 11B2;C667;110B 116B 11B2; # (왧; 왧; 왧; 왧; 왧; ) HANGUL SYLLABLE WAELB +C668;C668;110B 116B 11B3;C668;110B 116B 11B3; # (왨; 왨; 왨; 왨; 왨; ) HANGUL SYLLABLE WAELS +C669;C669;110B 116B 11B4;C669;110B 116B 11B4; # (왩; 왩; 왩; 왩; 왩; ) HANGUL SYLLABLE WAELT +C66A;C66A;110B 116B 11B5;C66A;110B 116B 11B5; # (왪; 왪; 왪; 왪; 왪; ) HANGUL SYLLABLE WAELP +C66B;C66B;110B 116B 11B6;C66B;110B 116B 11B6; # (왫; 왫; 왫; 왫; 왫; ) HANGUL SYLLABLE WAELH +C66C;C66C;110B 116B 11B7;C66C;110B 116B 11B7; # (왬; 왬; 왬; 왬; 왬; ) HANGUL SYLLABLE WAEM +C66D;C66D;110B 116B 11B8;C66D;110B 116B 11B8; # (왭; 왭; 왭; 왭; 왭; ) HANGUL SYLLABLE WAEB +C66E;C66E;110B 116B 11B9;C66E;110B 116B 11B9; # (왮; 왮; 왮; 왮; 왮; ) HANGUL SYLLABLE WAEBS +C66F;C66F;110B 116B 11BA;C66F;110B 116B 11BA; # (왯; 왯; 왯; 왯; 왯; ) HANGUL SYLLABLE WAES +C670;C670;110B 116B 11BB;C670;110B 116B 11BB; # (왰; 왰; 왰; 왰; 왰; ) HANGUL SYLLABLE WAESS +C671;C671;110B 116B 11BC;C671;110B 116B 11BC; # (왱; 왱; 왱; 왱; 왱; ) HANGUL SYLLABLE WAENG +C672;C672;110B 116B 11BD;C672;110B 116B 11BD; # (왲; 왲; 왲; 왲; 왲; ) HANGUL SYLLABLE WAEJ +C673;C673;110B 116B 11BE;C673;110B 116B 11BE; # (왳; 왳; 왳; 왳; 왳; ) HANGUL SYLLABLE WAEC +C674;C674;110B 116B 11BF;C674;110B 116B 11BF; # (왴; 왴; 왴; 왴; 왴; ) HANGUL SYLLABLE WAEK +C675;C675;110B 116B 11C0;C675;110B 116B 11C0; # (왵; 왵; 왵; 왵; 왵; ) HANGUL SYLLABLE WAET +C676;C676;110B 116B 11C1;C676;110B 116B 11C1; # (왶; 왶; 왶; 왶; 왶; ) HANGUL SYLLABLE WAEP +C677;C677;110B 116B 11C2;C677;110B 116B 11C2; # (왷; 왷; 왷; 왷; 왷; ) HANGUL SYLLABLE WAEH +C678;C678;110B 116C;C678;110B 116C; # (외; 외; 외; 외; 외; ) HANGUL SYLLABLE OE +C679;C679;110B 116C 11A8;C679;110B 116C 11A8; # (왹; 왹; 왹; 왹; 왹; ) HANGUL SYLLABLE OEG +C67A;C67A;110B 116C 11A9;C67A;110B 116C 11A9; # (왺; 왺; 왺; 왺; 왺; ) HANGUL SYLLABLE OEGG +C67B;C67B;110B 116C 11AA;C67B;110B 116C 11AA; # (왻; 왻; 왻; 왻; 왻; ) HANGUL SYLLABLE OEGS +C67C;C67C;110B 116C 11AB;C67C;110B 116C 11AB; # (왼; 왼; 왼; 왼; 왼; ) HANGUL SYLLABLE OEN +C67D;C67D;110B 116C 11AC;C67D;110B 116C 11AC; # (왽; 왽; 왽; 왽; 왽; ) HANGUL SYLLABLE OENJ +C67E;C67E;110B 116C 11AD;C67E;110B 116C 11AD; # (왾; 왾; 왾; 왾; 왾; ) HANGUL SYLLABLE OENH +C67F;C67F;110B 116C 11AE;C67F;110B 116C 11AE; # (왿; 왿; 왿; 왿; 왿; ) HANGUL SYLLABLE OED +C680;C680;110B 116C 11AF;C680;110B 116C 11AF; # (욀; 욀; 욀; 욀; 욀; ) HANGUL SYLLABLE OEL +C681;C681;110B 116C 11B0;C681;110B 116C 11B0; # (욁; 욁; 욁; 욁; 욁; ) HANGUL SYLLABLE OELG +C682;C682;110B 116C 11B1;C682;110B 116C 11B1; # (욂; 욂; 욂; 욂; 욂; ) HANGUL SYLLABLE OELM +C683;C683;110B 116C 11B2;C683;110B 116C 11B2; # (욃; 욃; 욃; 욃; 욃; ) HANGUL SYLLABLE OELB +C684;C684;110B 116C 11B3;C684;110B 116C 11B3; # (욄; 욄; 욄; 욄; 욄; ) HANGUL SYLLABLE OELS +C685;C685;110B 116C 11B4;C685;110B 116C 11B4; # (욅; 욅; 욅; 욅; 욅; ) HANGUL SYLLABLE OELT +C686;C686;110B 116C 11B5;C686;110B 116C 11B5; # (욆; 욆; 욆; 욆; 욆; ) HANGUL SYLLABLE OELP +C687;C687;110B 116C 11B6;C687;110B 116C 11B6; # (욇; 욇; 욇; 욇; 욇; ) HANGUL SYLLABLE OELH +C688;C688;110B 116C 11B7;C688;110B 116C 11B7; # (욈; 욈; 욈; 욈; 욈; ) HANGUL SYLLABLE OEM +C689;C689;110B 116C 11B8;C689;110B 116C 11B8; # (욉; 욉; 욉; 욉; 욉; ) HANGUL SYLLABLE OEB +C68A;C68A;110B 116C 11B9;C68A;110B 116C 11B9; # (욊; 욊; 욊; 욊; 욊; ) HANGUL SYLLABLE OEBS +C68B;C68B;110B 116C 11BA;C68B;110B 116C 11BA; # (욋; 욋; 욋; 욋; 욋; ) HANGUL SYLLABLE OES +C68C;C68C;110B 116C 11BB;C68C;110B 116C 11BB; # (욌; 욌; 욌; 욌; 욌; ) HANGUL SYLLABLE OESS +C68D;C68D;110B 116C 11BC;C68D;110B 116C 11BC; # (욍; 욍; 욍; 욍; 욍; ) HANGUL SYLLABLE OENG +C68E;C68E;110B 116C 11BD;C68E;110B 116C 11BD; # (욎; 욎; 욎; 욎; 욎; ) HANGUL SYLLABLE OEJ +C68F;C68F;110B 116C 11BE;C68F;110B 116C 11BE; # (욏; 욏; 욏; 욏; 욏; ) HANGUL SYLLABLE OEC +C690;C690;110B 116C 11BF;C690;110B 116C 11BF; # (욐; 욐; 욐; 욐; 욐; ) HANGUL SYLLABLE OEK +C691;C691;110B 116C 11C0;C691;110B 116C 11C0; # (욑; 욑; 욑; 욑; 욑; ) HANGUL SYLLABLE OET +C692;C692;110B 116C 11C1;C692;110B 116C 11C1; # (욒; 욒; 욒; 욒; 욒; ) HANGUL SYLLABLE OEP +C693;C693;110B 116C 11C2;C693;110B 116C 11C2; # (욓; 욓; 욓; 욓; 욓; ) HANGUL SYLLABLE OEH +C694;C694;110B 116D;C694;110B 116D; # (요; 요; 요; 요; 요; ) HANGUL SYLLABLE YO +C695;C695;110B 116D 11A8;C695;110B 116D 11A8; # (욕; 욕; 욕; 욕; 욕; ) HANGUL SYLLABLE YOG +C696;C696;110B 116D 11A9;C696;110B 116D 11A9; # (욖; 욖; 욖; 욖; 욖; ) HANGUL SYLLABLE YOGG +C697;C697;110B 116D 11AA;C697;110B 116D 11AA; # (욗; 욗; 욗; 욗; 욗; ) HANGUL SYLLABLE YOGS +C698;C698;110B 116D 11AB;C698;110B 116D 11AB; # (욘; 욘; 욘; 욘; 욘; ) HANGUL SYLLABLE YON +C699;C699;110B 116D 11AC;C699;110B 116D 11AC; # (욙; 욙; 욙; 욙; 욙; ) HANGUL SYLLABLE YONJ +C69A;C69A;110B 116D 11AD;C69A;110B 116D 11AD; # (욚; 욚; 욚; 욚; 욚; ) HANGUL SYLLABLE YONH +C69B;C69B;110B 116D 11AE;C69B;110B 116D 11AE; # (욛; 욛; 욛; 욛; 욛; ) HANGUL SYLLABLE YOD +C69C;C69C;110B 116D 11AF;C69C;110B 116D 11AF; # (욜; 욜; 욜; 욜; 욜; ) HANGUL SYLLABLE YOL +C69D;C69D;110B 116D 11B0;C69D;110B 116D 11B0; # (욝; 욝; 욝; 욝; 욝; ) HANGUL SYLLABLE YOLG +C69E;C69E;110B 116D 11B1;C69E;110B 116D 11B1; # (욞; 욞; 욞; 욞; 욞; ) HANGUL SYLLABLE YOLM +C69F;C69F;110B 116D 11B2;C69F;110B 116D 11B2; # (욟; 욟; 욟; 욟; 욟; ) HANGUL SYLLABLE YOLB +C6A0;C6A0;110B 116D 11B3;C6A0;110B 116D 11B3; # (욠; 욠; 욠; 욠; 욠; ) HANGUL SYLLABLE YOLS +C6A1;C6A1;110B 116D 11B4;C6A1;110B 116D 11B4; # (욡; 욡; 욡; 욡; 욡; ) HANGUL SYLLABLE YOLT +C6A2;C6A2;110B 116D 11B5;C6A2;110B 116D 11B5; # (욢; 욢; 욢; 욢; 욢; ) HANGUL SYLLABLE YOLP +C6A3;C6A3;110B 116D 11B6;C6A3;110B 116D 11B6; # (욣; 욣; 욣; 욣; 욣; ) HANGUL SYLLABLE YOLH +C6A4;C6A4;110B 116D 11B7;C6A4;110B 116D 11B7; # (욤; 욤; 욤; 욤; 욤; ) HANGUL SYLLABLE YOM +C6A5;C6A5;110B 116D 11B8;C6A5;110B 116D 11B8; # (욥; 욥; 욥; 욥; 욥; ) HANGUL SYLLABLE YOB +C6A6;C6A6;110B 116D 11B9;C6A6;110B 116D 11B9; # (욦; 욦; 욦; 욦; 욦; ) HANGUL SYLLABLE YOBS +C6A7;C6A7;110B 116D 11BA;C6A7;110B 116D 11BA; # (욧; 욧; 욧; 욧; 욧; ) HANGUL SYLLABLE YOS +C6A8;C6A8;110B 116D 11BB;C6A8;110B 116D 11BB; # (욨; 욨; 욨; 욨; 욨; ) HANGUL SYLLABLE YOSS +C6A9;C6A9;110B 116D 11BC;C6A9;110B 116D 11BC; # (용; 용; 용; 용; 용; ) HANGUL SYLLABLE YONG +C6AA;C6AA;110B 116D 11BD;C6AA;110B 116D 11BD; # (욪; 욪; 욪; 욪; 욪; ) HANGUL SYLLABLE YOJ +C6AB;C6AB;110B 116D 11BE;C6AB;110B 116D 11BE; # (욫; 욫; 욫; 욫; 욫; ) HANGUL SYLLABLE YOC +C6AC;C6AC;110B 116D 11BF;C6AC;110B 116D 11BF; # (욬; 욬; 욬; 욬; 욬; ) HANGUL SYLLABLE YOK +C6AD;C6AD;110B 116D 11C0;C6AD;110B 116D 11C0; # (욭; 욭; 욭; 욭; 욭; ) HANGUL SYLLABLE YOT +C6AE;C6AE;110B 116D 11C1;C6AE;110B 116D 11C1; # (욮; 욮; 욮; 욮; 욮; ) HANGUL SYLLABLE YOP +C6AF;C6AF;110B 116D 11C2;C6AF;110B 116D 11C2; # (욯; 욯; 욯; 욯; 욯; ) HANGUL SYLLABLE YOH +C6B0;C6B0;110B 116E;C6B0;110B 116E; # (우; 우; 우; 우; 우; ) HANGUL SYLLABLE U +C6B1;C6B1;110B 116E 11A8;C6B1;110B 116E 11A8; # (욱; 욱; 욱; 욱; 욱; ) HANGUL SYLLABLE UG +C6B2;C6B2;110B 116E 11A9;C6B2;110B 116E 11A9; # (욲; 욲; 욲; 욲; 욲; ) HANGUL SYLLABLE UGG +C6B3;C6B3;110B 116E 11AA;C6B3;110B 116E 11AA; # (욳; 욳; 욳; 욳; 욳; ) HANGUL SYLLABLE UGS +C6B4;C6B4;110B 116E 11AB;C6B4;110B 116E 11AB; # (운; 운; 운; 운; 운; ) HANGUL SYLLABLE UN +C6B5;C6B5;110B 116E 11AC;C6B5;110B 116E 11AC; # (욵; 욵; 욵; 욵; 욵; ) HANGUL SYLLABLE UNJ +C6B6;C6B6;110B 116E 11AD;C6B6;110B 116E 11AD; # (욶; 욶; 욶; 욶; 욶; ) HANGUL SYLLABLE UNH +C6B7;C6B7;110B 116E 11AE;C6B7;110B 116E 11AE; # (욷; 욷; 욷; 욷; 욷; ) HANGUL SYLLABLE UD +C6B8;C6B8;110B 116E 11AF;C6B8;110B 116E 11AF; # (울; 울; 울; 울; 울; ) HANGUL SYLLABLE UL +C6B9;C6B9;110B 116E 11B0;C6B9;110B 116E 11B0; # (욹; 욹; 욹; 욹; 욹; ) HANGUL SYLLABLE ULG +C6BA;C6BA;110B 116E 11B1;C6BA;110B 116E 11B1; # (욺; 욺; 욺; 욺; 욺; ) HANGUL SYLLABLE ULM +C6BB;C6BB;110B 116E 11B2;C6BB;110B 116E 11B2; # (욻; 욻; 욻; 욻; 욻; ) HANGUL SYLLABLE ULB +C6BC;C6BC;110B 116E 11B3;C6BC;110B 116E 11B3; # (욼; 욼; 욼; 욼; 욼; ) HANGUL SYLLABLE ULS +C6BD;C6BD;110B 116E 11B4;C6BD;110B 116E 11B4; # (욽; 욽; 욽; 욽; 욽; ) HANGUL SYLLABLE ULT +C6BE;C6BE;110B 116E 11B5;C6BE;110B 116E 11B5; # (욾; 욾; 욾; 욾; 욾; ) HANGUL SYLLABLE ULP +C6BF;C6BF;110B 116E 11B6;C6BF;110B 116E 11B6; # (욿; 욿; 욿; 욿; 욿; ) HANGUL SYLLABLE ULH +C6C0;C6C0;110B 116E 11B7;C6C0;110B 116E 11B7; # (움; 움; 움; 움; 움; ) HANGUL SYLLABLE UM +C6C1;C6C1;110B 116E 11B8;C6C1;110B 116E 11B8; # (웁; 웁; 웁; 웁; 웁; ) HANGUL SYLLABLE UB +C6C2;C6C2;110B 116E 11B9;C6C2;110B 116E 11B9; # (웂; 웂; 웂; 웂; 웂; ) HANGUL SYLLABLE UBS +C6C3;C6C3;110B 116E 11BA;C6C3;110B 116E 11BA; # (웃; 웃; 웃; 웃; 웃; ) HANGUL SYLLABLE US +C6C4;C6C4;110B 116E 11BB;C6C4;110B 116E 11BB; # (웄; 웄; 웄; 웄; 웄; ) HANGUL SYLLABLE USS +C6C5;C6C5;110B 116E 11BC;C6C5;110B 116E 11BC; # (웅; 웅; 웅; 웅; 웅; ) HANGUL SYLLABLE UNG +C6C6;C6C6;110B 116E 11BD;C6C6;110B 116E 11BD; # (웆; 웆; 웆; 웆; 웆; ) HANGUL SYLLABLE UJ +C6C7;C6C7;110B 116E 11BE;C6C7;110B 116E 11BE; # (웇; 웇; 웇; 웇; 웇; ) HANGUL SYLLABLE UC +C6C8;C6C8;110B 116E 11BF;C6C8;110B 116E 11BF; # (웈; 웈; 웈; 웈; 웈; ) HANGUL SYLLABLE UK +C6C9;C6C9;110B 116E 11C0;C6C9;110B 116E 11C0; # (웉; 웉; 웉; 웉; 웉; ) HANGUL SYLLABLE UT +C6CA;C6CA;110B 116E 11C1;C6CA;110B 116E 11C1; # (웊; 웊; 웊; 웊; 웊; ) HANGUL SYLLABLE UP +C6CB;C6CB;110B 116E 11C2;C6CB;110B 116E 11C2; # (웋; 웋; 웋; 웋; 웋; ) HANGUL SYLLABLE UH +C6CC;C6CC;110B 116F;C6CC;110B 116F; # (워; 워; 워; 워; 워; ) HANGUL SYLLABLE WEO +C6CD;C6CD;110B 116F 11A8;C6CD;110B 116F 11A8; # (웍; 웍; 웍; 웍; 웍; ) HANGUL SYLLABLE WEOG +C6CE;C6CE;110B 116F 11A9;C6CE;110B 116F 11A9; # (웎; 웎; 웎; 웎; 웎; ) HANGUL SYLLABLE WEOGG +C6CF;C6CF;110B 116F 11AA;C6CF;110B 116F 11AA; # (웏; 웏; 웏; 웏; 웏; ) HANGUL SYLLABLE WEOGS +C6D0;C6D0;110B 116F 11AB;C6D0;110B 116F 11AB; # (원; 원; 원; 원; 원; ) HANGUL SYLLABLE WEON +C6D1;C6D1;110B 116F 11AC;C6D1;110B 116F 11AC; # (웑; 웑; 웑; 웑; 웑; ) HANGUL SYLLABLE WEONJ +C6D2;C6D2;110B 116F 11AD;C6D2;110B 116F 11AD; # (웒; 웒; 웒; 웒; 웒; ) HANGUL SYLLABLE WEONH +C6D3;C6D3;110B 116F 11AE;C6D3;110B 116F 11AE; # (웓; 웓; 웓; 웓; 웓; ) HANGUL SYLLABLE WEOD +C6D4;C6D4;110B 116F 11AF;C6D4;110B 116F 11AF; # (월; 월; 월; 월; 월; ) HANGUL SYLLABLE WEOL +C6D5;C6D5;110B 116F 11B0;C6D5;110B 116F 11B0; # (웕; 웕; 웕; 웕; 웕; ) HANGUL SYLLABLE WEOLG +C6D6;C6D6;110B 116F 11B1;C6D6;110B 116F 11B1; # (웖; 웖; 웖; 웖; 웖; ) HANGUL SYLLABLE WEOLM +C6D7;C6D7;110B 116F 11B2;C6D7;110B 116F 11B2; # (웗; 웗; 웗; 웗; 웗; ) HANGUL SYLLABLE WEOLB +C6D8;C6D8;110B 116F 11B3;C6D8;110B 116F 11B3; # (웘; 웘; 웘; 웘; 웘; ) HANGUL SYLLABLE WEOLS +C6D9;C6D9;110B 116F 11B4;C6D9;110B 116F 11B4; # (웙; 웙; 웙; 웙; 웙; ) HANGUL SYLLABLE WEOLT +C6DA;C6DA;110B 116F 11B5;C6DA;110B 116F 11B5; # (웚; 웚; 웚; 웚; 웚; ) HANGUL SYLLABLE WEOLP +C6DB;C6DB;110B 116F 11B6;C6DB;110B 116F 11B6; # (웛; 웛; 웛; 웛; 웛; ) HANGUL SYLLABLE WEOLH +C6DC;C6DC;110B 116F 11B7;C6DC;110B 116F 11B7; # (웜; 웜; 웜; 웜; 웜; ) HANGUL SYLLABLE WEOM +C6DD;C6DD;110B 116F 11B8;C6DD;110B 116F 11B8; # (웝; 웝; 웝; 웝; 웝; ) HANGUL SYLLABLE WEOB +C6DE;C6DE;110B 116F 11B9;C6DE;110B 116F 11B9; # (웞; 웞; 웞; 웞; 웞; ) HANGUL SYLLABLE WEOBS +C6DF;C6DF;110B 116F 11BA;C6DF;110B 116F 11BA; # (웟; 웟; 웟; 웟; 웟; ) HANGUL SYLLABLE WEOS +C6E0;C6E0;110B 116F 11BB;C6E0;110B 116F 11BB; # (웠; 웠; 웠; 웠; 웠; ) HANGUL SYLLABLE WEOSS +C6E1;C6E1;110B 116F 11BC;C6E1;110B 116F 11BC; # (웡; 웡; 웡; 웡; 웡; ) HANGUL SYLLABLE WEONG +C6E2;C6E2;110B 116F 11BD;C6E2;110B 116F 11BD; # (웢; 웢; 웢; 웢; 웢; ) HANGUL SYLLABLE WEOJ +C6E3;C6E3;110B 116F 11BE;C6E3;110B 116F 11BE; # (웣; 웣; 웣; 웣; 웣; ) HANGUL SYLLABLE WEOC +C6E4;C6E4;110B 116F 11BF;C6E4;110B 116F 11BF; # (웤; 웤; 웤; 웤; 웤; ) HANGUL SYLLABLE WEOK +C6E5;C6E5;110B 116F 11C0;C6E5;110B 116F 11C0; # (웥; 웥; 웥; 웥; 웥; ) HANGUL SYLLABLE WEOT +C6E6;C6E6;110B 116F 11C1;C6E6;110B 116F 11C1; # (웦; 웦; 웦; 웦; 웦; ) HANGUL SYLLABLE WEOP +C6E7;C6E7;110B 116F 11C2;C6E7;110B 116F 11C2; # (웧; 웧; 웧; 웧; 웧; ) HANGUL SYLLABLE WEOH +C6E8;C6E8;110B 1170;C6E8;110B 1170; # (웨; 웨; 웨; 웨; 웨; ) HANGUL SYLLABLE WE +C6E9;C6E9;110B 1170 11A8;C6E9;110B 1170 11A8; # (웩; 웩; 웩; 웩; 웩; ) HANGUL SYLLABLE WEG +C6EA;C6EA;110B 1170 11A9;C6EA;110B 1170 11A9; # (웪; 웪; 웪; 웪; 웪; ) HANGUL SYLLABLE WEGG +C6EB;C6EB;110B 1170 11AA;C6EB;110B 1170 11AA; # (웫; 웫; 웫; 웫; 웫; ) HANGUL SYLLABLE WEGS +C6EC;C6EC;110B 1170 11AB;C6EC;110B 1170 11AB; # (웬; 웬; 웬; 웬; 웬; ) HANGUL SYLLABLE WEN +C6ED;C6ED;110B 1170 11AC;C6ED;110B 1170 11AC; # (웭; 웭; 웭; 웭; 웭; ) HANGUL SYLLABLE WENJ +C6EE;C6EE;110B 1170 11AD;C6EE;110B 1170 11AD; # (웮; 웮; 웮; 웮; 웮; ) HANGUL SYLLABLE WENH +C6EF;C6EF;110B 1170 11AE;C6EF;110B 1170 11AE; # (웯; 웯; 웯; 웯; 웯; ) HANGUL SYLLABLE WED +C6F0;C6F0;110B 1170 11AF;C6F0;110B 1170 11AF; # (웰; 웰; 웰; 웰; 웰; ) HANGUL SYLLABLE WEL +C6F1;C6F1;110B 1170 11B0;C6F1;110B 1170 11B0; # (웱; 웱; 웱; 웱; 웱; ) HANGUL SYLLABLE WELG +C6F2;C6F2;110B 1170 11B1;C6F2;110B 1170 11B1; # (웲; 웲; 웲; 웲; 웲; ) HANGUL SYLLABLE WELM +C6F3;C6F3;110B 1170 11B2;C6F3;110B 1170 11B2; # (웳; 웳; 웳; 웳; 웳; ) HANGUL SYLLABLE WELB +C6F4;C6F4;110B 1170 11B3;C6F4;110B 1170 11B3; # (웴; 웴; 웴; 웴; 웴; ) HANGUL SYLLABLE WELS +C6F5;C6F5;110B 1170 11B4;C6F5;110B 1170 11B4; # (웵; 웵; 웵; 웵; 웵; ) HANGUL SYLLABLE WELT +C6F6;C6F6;110B 1170 11B5;C6F6;110B 1170 11B5; # (웶; 웶; 웶; 웶; 웶; ) HANGUL SYLLABLE WELP +C6F7;C6F7;110B 1170 11B6;C6F7;110B 1170 11B6; # (웷; 웷; 웷; 웷; 웷; ) HANGUL SYLLABLE WELH +C6F8;C6F8;110B 1170 11B7;C6F8;110B 1170 11B7; # (웸; 웸; 웸; 웸; 웸; ) HANGUL SYLLABLE WEM +C6F9;C6F9;110B 1170 11B8;C6F9;110B 1170 11B8; # (웹; 웹; 웹; 웹; 웹; ) HANGUL SYLLABLE WEB +C6FA;C6FA;110B 1170 11B9;C6FA;110B 1170 11B9; # (웺; 웺; 웺; 웺; 웺; ) HANGUL SYLLABLE WEBS +C6FB;C6FB;110B 1170 11BA;C6FB;110B 1170 11BA; # (웻; 웻; 웻; 웻; 웻; ) HANGUL SYLLABLE WES +C6FC;C6FC;110B 1170 11BB;C6FC;110B 1170 11BB; # (웼; 웼; 웼; 웼; 웼; ) HANGUL SYLLABLE WESS +C6FD;C6FD;110B 1170 11BC;C6FD;110B 1170 11BC; # (웽; 웽; 웽; 웽; 웽; ) HANGUL SYLLABLE WENG +C6FE;C6FE;110B 1170 11BD;C6FE;110B 1170 11BD; # (웾; 웾; 웾; 웾; 웾; ) HANGUL SYLLABLE WEJ +C6FF;C6FF;110B 1170 11BE;C6FF;110B 1170 11BE; # (웿; 웿; 웿; 웿; 웿; ) HANGUL SYLLABLE WEC +C700;C700;110B 1170 11BF;C700;110B 1170 11BF; # (윀; 윀; 윀; 윀; 윀; ) HANGUL SYLLABLE WEK +C701;C701;110B 1170 11C0;C701;110B 1170 11C0; # (윁; 윁; 윁; 윁; 윁; ) HANGUL SYLLABLE WET +C702;C702;110B 1170 11C1;C702;110B 1170 11C1; # (윂; 윂; 윂; 윂; 윂; ) HANGUL SYLLABLE WEP +C703;C703;110B 1170 11C2;C703;110B 1170 11C2; # (윃; 윃; 윃; 윃; 윃; ) HANGUL SYLLABLE WEH +C704;C704;110B 1171;C704;110B 1171; # (위; 위; 위; 위; 위; ) HANGUL SYLLABLE WI +C705;C705;110B 1171 11A8;C705;110B 1171 11A8; # (윅; 윅; 윅; 윅; 윅; ) HANGUL SYLLABLE WIG +C706;C706;110B 1171 11A9;C706;110B 1171 11A9; # (윆; 윆; 윆; 윆; 윆; ) HANGUL SYLLABLE WIGG +C707;C707;110B 1171 11AA;C707;110B 1171 11AA; # (윇; 윇; 윇; 윇; 윇; ) HANGUL SYLLABLE WIGS +C708;C708;110B 1171 11AB;C708;110B 1171 11AB; # (윈; 윈; 윈; 윈; 윈; ) HANGUL SYLLABLE WIN +C709;C709;110B 1171 11AC;C709;110B 1171 11AC; # (윉; 윉; 윉; 윉; 윉; ) HANGUL SYLLABLE WINJ +C70A;C70A;110B 1171 11AD;C70A;110B 1171 11AD; # (윊; 윊; 윊; 윊; 윊; ) HANGUL SYLLABLE WINH +C70B;C70B;110B 1171 11AE;C70B;110B 1171 11AE; # (윋; 윋; 윋; 윋; 윋; ) HANGUL SYLLABLE WID +C70C;C70C;110B 1171 11AF;C70C;110B 1171 11AF; # (윌; 윌; 윌; 윌; 윌; ) HANGUL SYLLABLE WIL +C70D;C70D;110B 1171 11B0;C70D;110B 1171 11B0; # (윍; 윍; 윍; 윍; 윍; ) HANGUL SYLLABLE WILG +C70E;C70E;110B 1171 11B1;C70E;110B 1171 11B1; # (윎; 윎; 윎; 윎; 윎; ) HANGUL SYLLABLE WILM +C70F;C70F;110B 1171 11B2;C70F;110B 1171 11B2; # (윏; 윏; 윏; 윏; 윏; ) HANGUL SYLLABLE WILB +C710;C710;110B 1171 11B3;C710;110B 1171 11B3; # (윐; 윐; 윐; 윐; 윐; ) HANGUL SYLLABLE WILS +C711;C711;110B 1171 11B4;C711;110B 1171 11B4; # (윑; 윑; 윑; 윑; 윑; ) HANGUL SYLLABLE WILT +C712;C712;110B 1171 11B5;C712;110B 1171 11B5; # (윒; 윒; 윒; 윒; 윒; ) HANGUL SYLLABLE WILP +C713;C713;110B 1171 11B6;C713;110B 1171 11B6; # (윓; 윓; 윓; 윓; 윓; ) HANGUL SYLLABLE WILH +C714;C714;110B 1171 11B7;C714;110B 1171 11B7; # (윔; 윔; 윔; 윔; 윔; ) HANGUL SYLLABLE WIM +C715;C715;110B 1171 11B8;C715;110B 1171 11B8; # (윕; 윕; 윕; 윕; 윕; ) HANGUL SYLLABLE WIB +C716;C716;110B 1171 11B9;C716;110B 1171 11B9; # (윖; 윖; 윖; 윖; 윖; ) HANGUL SYLLABLE WIBS +C717;C717;110B 1171 11BA;C717;110B 1171 11BA; # (윗; 윗; 윗; 윗; 윗; ) HANGUL SYLLABLE WIS +C718;C718;110B 1171 11BB;C718;110B 1171 11BB; # (윘; 윘; 윘; 윘; 윘; ) HANGUL SYLLABLE WISS +C719;C719;110B 1171 11BC;C719;110B 1171 11BC; # (윙; 윙; 윙; 윙; 윙; ) HANGUL SYLLABLE WING +C71A;C71A;110B 1171 11BD;C71A;110B 1171 11BD; # (윚; 윚; 윚; 윚; 윚; ) HANGUL SYLLABLE WIJ +C71B;C71B;110B 1171 11BE;C71B;110B 1171 11BE; # (윛; 윛; 윛; 윛; 윛; ) HANGUL SYLLABLE WIC +C71C;C71C;110B 1171 11BF;C71C;110B 1171 11BF; # (윜; 윜; 윜; 윜; 윜; ) HANGUL SYLLABLE WIK +C71D;C71D;110B 1171 11C0;C71D;110B 1171 11C0; # (윝; 윝; 윝; 윝; 윝; ) HANGUL SYLLABLE WIT +C71E;C71E;110B 1171 11C1;C71E;110B 1171 11C1; # (윞; 윞; 윞; 윞; 윞; ) HANGUL SYLLABLE WIP +C71F;C71F;110B 1171 11C2;C71F;110B 1171 11C2; # (윟; 윟; 윟; 윟; 윟; ) HANGUL SYLLABLE WIH +C720;C720;110B 1172;C720;110B 1172; # (유; 유; 유; 유; 유; ) HANGUL SYLLABLE YU +C721;C721;110B 1172 11A8;C721;110B 1172 11A8; # (육; 육; 육; 육; 육; ) HANGUL SYLLABLE YUG +C722;C722;110B 1172 11A9;C722;110B 1172 11A9; # (윢; 윢; 윢; 윢; 윢; ) HANGUL SYLLABLE YUGG +C723;C723;110B 1172 11AA;C723;110B 1172 11AA; # (윣; 윣; 윣; 윣; 윣; ) HANGUL SYLLABLE YUGS +C724;C724;110B 1172 11AB;C724;110B 1172 11AB; # (윤; 윤; 윤; 윤; 윤; ) HANGUL SYLLABLE YUN +C725;C725;110B 1172 11AC;C725;110B 1172 11AC; # (윥; 윥; 윥; 윥; 윥; ) HANGUL SYLLABLE YUNJ +C726;C726;110B 1172 11AD;C726;110B 1172 11AD; # (윦; 윦; 윦; 윦; 윦; ) HANGUL SYLLABLE YUNH +C727;C727;110B 1172 11AE;C727;110B 1172 11AE; # (윧; 윧; 윧; 윧; 윧; ) HANGUL SYLLABLE YUD +C728;C728;110B 1172 11AF;C728;110B 1172 11AF; # (율; 율; 율; 율; 율; ) HANGUL SYLLABLE YUL +C729;C729;110B 1172 11B0;C729;110B 1172 11B0; # (윩; 윩; 윩; 윩; 윩; ) HANGUL SYLLABLE YULG +C72A;C72A;110B 1172 11B1;C72A;110B 1172 11B1; # (윪; 윪; 윪; 윪; 윪; ) HANGUL SYLLABLE YULM +C72B;C72B;110B 1172 11B2;C72B;110B 1172 11B2; # (윫; 윫; 윫; 윫; 윫; ) HANGUL SYLLABLE YULB +C72C;C72C;110B 1172 11B3;C72C;110B 1172 11B3; # (윬; 윬; 윬; 윬; 윬; ) HANGUL SYLLABLE YULS +C72D;C72D;110B 1172 11B4;C72D;110B 1172 11B4; # (윭; 윭; 윭; 윭; 윭; ) HANGUL SYLLABLE YULT +C72E;C72E;110B 1172 11B5;C72E;110B 1172 11B5; # (윮; 윮; 윮; 윮; 윮; ) HANGUL SYLLABLE YULP +C72F;C72F;110B 1172 11B6;C72F;110B 1172 11B6; # (윯; 윯; 윯; 윯; 윯; ) HANGUL SYLLABLE YULH +C730;C730;110B 1172 11B7;C730;110B 1172 11B7; # (윰; 윰; 윰; 윰; 윰; ) HANGUL SYLLABLE YUM +C731;C731;110B 1172 11B8;C731;110B 1172 11B8; # (윱; 윱; 윱; 윱; 윱; ) HANGUL SYLLABLE YUB +C732;C732;110B 1172 11B9;C732;110B 1172 11B9; # (윲; 윲; 윲; 윲; 윲; ) HANGUL SYLLABLE YUBS +C733;C733;110B 1172 11BA;C733;110B 1172 11BA; # (윳; 윳; 윳; 윳; 윳; ) HANGUL SYLLABLE YUS +C734;C734;110B 1172 11BB;C734;110B 1172 11BB; # (윴; 윴; 윴; 윴; 윴; ) HANGUL SYLLABLE YUSS +C735;C735;110B 1172 11BC;C735;110B 1172 11BC; # (융; 융; 융; 융; 융; ) HANGUL SYLLABLE YUNG +C736;C736;110B 1172 11BD;C736;110B 1172 11BD; # (윶; 윶; 윶; 윶; 윶; ) HANGUL SYLLABLE YUJ +C737;C737;110B 1172 11BE;C737;110B 1172 11BE; # (윷; 윷; 윷; 윷; 윷; ) HANGUL SYLLABLE YUC +C738;C738;110B 1172 11BF;C738;110B 1172 11BF; # (윸; 윸; 윸; 윸; 윸; ) HANGUL SYLLABLE YUK +C739;C739;110B 1172 11C0;C739;110B 1172 11C0; # (윹; 윹; 윹; 윹; 윹; ) HANGUL SYLLABLE YUT +C73A;C73A;110B 1172 11C1;C73A;110B 1172 11C1; # (윺; 윺; 윺; 윺; 윺; ) HANGUL SYLLABLE YUP +C73B;C73B;110B 1172 11C2;C73B;110B 1172 11C2; # (윻; 윻; 윻; 윻; 윻; ) HANGUL SYLLABLE YUH +C73C;C73C;110B 1173;C73C;110B 1173; # (으; 으; 으; 으; 으; ) HANGUL SYLLABLE EU +C73D;C73D;110B 1173 11A8;C73D;110B 1173 11A8; # (윽; 윽; 윽; 윽; 윽; ) HANGUL SYLLABLE EUG +C73E;C73E;110B 1173 11A9;C73E;110B 1173 11A9; # (윾; 윾; 윾; 윾; 윾; ) HANGUL SYLLABLE EUGG +C73F;C73F;110B 1173 11AA;C73F;110B 1173 11AA; # (윿; 윿; 윿; 윿; 윿; ) HANGUL SYLLABLE EUGS +C740;C740;110B 1173 11AB;C740;110B 1173 11AB; # (은; 은; 은; 은; 은; ) HANGUL SYLLABLE EUN +C741;C741;110B 1173 11AC;C741;110B 1173 11AC; # (읁; 읁; 읁; 읁; 읁; ) HANGUL SYLLABLE EUNJ +C742;C742;110B 1173 11AD;C742;110B 1173 11AD; # (읂; 읂; 읂; 읂; 읂; ) HANGUL SYLLABLE EUNH +C743;C743;110B 1173 11AE;C743;110B 1173 11AE; # (읃; 읃; 읃; 읃; 읃; ) HANGUL SYLLABLE EUD +C744;C744;110B 1173 11AF;C744;110B 1173 11AF; # (을; 을; 을; 을; 을; ) HANGUL SYLLABLE EUL +C745;C745;110B 1173 11B0;C745;110B 1173 11B0; # (읅; 읅; 읅; 읅; 읅; ) HANGUL SYLLABLE EULG +C746;C746;110B 1173 11B1;C746;110B 1173 11B1; # (읆; 읆; 읆; 읆; 읆; ) HANGUL SYLLABLE EULM +C747;C747;110B 1173 11B2;C747;110B 1173 11B2; # (읇; 읇; 읇; 읇; 읇; ) HANGUL SYLLABLE EULB +C748;C748;110B 1173 11B3;C748;110B 1173 11B3; # (읈; 읈; 읈; 읈; 읈; ) HANGUL SYLLABLE EULS +C749;C749;110B 1173 11B4;C749;110B 1173 11B4; # (읉; 읉; 읉; 읉; 읉; ) HANGUL SYLLABLE EULT +C74A;C74A;110B 1173 11B5;C74A;110B 1173 11B5; # (읊; 읊; 읊; 읊; 읊; ) HANGUL SYLLABLE EULP +C74B;C74B;110B 1173 11B6;C74B;110B 1173 11B6; # (읋; 읋; 읋; 읋; 읋; ) HANGUL SYLLABLE EULH +C74C;C74C;110B 1173 11B7;C74C;110B 1173 11B7; # (음; 음; 음; 음; 음; ) HANGUL SYLLABLE EUM +C74D;C74D;110B 1173 11B8;C74D;110B 1173 11B8; # (읍; 읍; 읍; 읍; 읍; ) HANGUL SYLLABLE EUB +C74E;C74E;110B 1173 11B9;C74E;110B 1173 11B9; # (읎; 읎; 읎; 읎; 읎; ) HANGUL SYLLABLE EUBS +C74F;C74F;110B 1173 11BA;C74F;110B 1173 11BA; # (읏; 읏; 읏; 읏; 읏; ) HANGUL SYLLABLE EUS +C750;C750;110B 1173 11BB;C750;110B 1173 11BB; # (읐; 읐; 읐; 읐; 읐; ) HANGUL SYLLABLE EUSS +C751;C751;110B 1173 11BC;C751;110B 1173 11BC; # (응; 응; 응; 응; 응; ) HANGUL SYLLABLE EUNG +C752;C752;110B 1173 11BD;C752;110B 1173 11BD; # (읒; 읒; 읒; 읒; 읒; ) HANGUL SYLLABLE EUJ +C753;C753;110B 1173 11BE;C753;110B 1173 11BE; # (읓; 읓; 읓; 읓; 읓; ) HANGUL SYLLABLE EUC +C754;C754;110B 1173 11BF;C754;110B 1173 11BF; # (읔; 읔; 읔; 읔; 읔; ) HANGUL SYLLABLE EUK +C755;C755;110B 1173 11C0;C755;110B 1173 11C0; # (읕; 읕; 읕; 읕; 읕; ) HANGUL SYLLABLE EUT +C756;C756;110B 1173 11C1;C756;110B 1173 11C1; # (읖; 읖; 읖; 읖; 읖; ) HANGUL SYLLABLE EUP +C757;C757;110B 1173 11C2;C757;110B 1173 11C2; # (읗; 읗; 읗; 읗; 읗; ) HANGUL SYLLABLE EUH +C758;C758;110B 1174;C758;110B 1174; # (의; 의; 의; 의; 의; ) HANGUL SYLLABLE YI +C759;C759;110B 1174 11A8;C759;110B 1174 11A8; # (읙; 읙; 읙; 읙; 읙; ) HANGUL SYLLABLE YIG +C75A;C75A;110B 1174 11A9;C75A;110B 1174 11A9; # (읚; 읚; 읚; 읚; 읚; ) HANGUL SYLLABLE YIGG +C75B;C75B;110B 1174 11AA;C75B;110B 1174 11AA; # (읛; 읛; 읛; 읛; 읛; ) HANGUL SYLLABLE YIGS +C75C;C75C;110B 1174 11AB;C75C;110B 1174 11AB; # (읜; 읜; 읜; 읜; 읜; ) HANGUL SYLLABLE YIN +C75D;C75D;110B 1174 11AC;C75D;110B 1174 11AC; # (읝; 읝; 읝; 읝; 읝; ) HANGUL SYLLABLE YINJ +C75E;C75E;110B 1174 11AD;C75E;110B 1174 11AD; # (읞; 읞; 읞; 읞; 읞; ) HANGUL SYLLABLE YINH +C75F;C75F;110B 1174 11AE;C75F;110B 1174 11AE; # (읟; 읟; 읟; 읟; 읟; ) HANGUL SYLLABLE YID +C760;C760;110B 1174 11AF;C760;110B 1174 11AF; # (읠; 읠; 읠; 읠; 읠; ) HANGUL SYLLABLE YIL +C761;C761;110B 1174 11B0;C761;110B 1174 11B0; # (읡; 읡; 읡; 읡; 읡; ) HANGUL SYLLABLE YILG +C762;C762;110B 1174 11B1;C762;110B 1174 11B1; # (읢; 읢; 읢; 읢; 읢; ) HANGUL SYLLABLE YILM +C763;C763;110B 1174 11B2;C763;110B 1174 11B2; # (읣; 읣; 읣; 읣; 읣; ) HANGUL SYLLABLE YILB +C764;C764;110B 1174 11B3;C764;110B 1174 11B3; # (읤; 읤; 읤; 읤; 읤; ) HANGUL SYLLABLE YILS +C765;C765;110B 1174 11B4;C765;110B 1174 11B4; # (읥; 읥; 읥; 읥; 읥; ) HANGUL SYLLABLE YILT +C766;C766;110B 1174 11B5;C766;110B 1174 11B5; # (읦; 읦; 읦; 읦; 읦; ) HANGUL SYLLABLE YILP +C767;C767;110B 1174 11B6;C767;110B 1174 11B6; # (읧; 읧; 읧; 읧; 읧; ) HANGUL SYLLABLE YILH +C768;C768;110B 1174 11B7;C768;110B 1174 11B7; # (읨; 읨; 읨; 읨; 읨; ) HANGUL SYLLABLE YIM +C769;C769;110B 1174 11B8;C769;110B 1174 11B8; # (읩; 읩; 읩; 읩; 읩; ) HANGUL SYLLABLE YIB +C76A;C76A;110B 1174 11B9;C76A;110B 1174 11B9; # (읪; 읪; 읪; 읪; 읪; ) HANGUL SYLLABLE YIBS +C76B;C76B;110B 1174 11BA;C76B;110B 1174 11BA; # (읫; 읫; 읫; 읫; 읫; ) HANGUL SYLLABLE YIS +C76C;C76C;110B 1174 11BB;C76C;110B 1174 11BB; # (읬; 읬; 읬; 읬; 읬; ) HANGUL SYLLABLE YISS +C76D;C76D;110B 1174 11BC;C76D;110B 1174 11BC; # (읭; 읭; 읭; 읭; 읭; ) HANGUL SYLLABLE YING +C76E;C76E;110B 1174 11BD;C76E;110B 1174 11BD; # (읮; 읮; 읮; 읮; 읮; ) HANGUL SYLLABLE YIJ +C76F;C76F;110B 1174 11BE;C76F;110B 1174 11BE; # (읯; 읯; 읯; 읯; 읯; ) HANGUL SYLLABLE YIC +C770;C770;110B 1174 11BF;C770;110B 1174 11BF; # (읰; 읰; 읰; 읰; 읰; ) HANGUL SYLLABLE YIK +C771;C771;110B 1174 11C0;C771;110B 1174 11C0; # (읱; 읱; 읱; 읱; 읱; ) HANGUL SYLLABLE YIT +C772;C772;110B 1174 11C1;C772;110B 1174 11C1; # (읲; 읲; 읲; 읲; 읲; ) HANGUL SYLLABLE YIP +C773;C773;110B 1174 11C2;C773;110B 1174 11C2; # (읳; 읳; 읳; 읳; 읳; ) HANGUL SYLLABLE YIH +C774;C774;110B 1175;C774;110B 1175; # (이; 이; 이; 이; 이; ) HANGUL SYLLABLE I +C775;C775;110B 1175 11A8;C775;110B 1175 11A8; # (익; 익; 익; 익; 익; ) HANGUL SYLLABLE IG +C776;C776;110B 1175 11A9;C776;110B 1175 11A9; # (읶; 읶; 읶; 읶; 읶; ) HANGUL SYLLABLE IGG +C777;C777;110B 1175 11AA;C777;110B 1175 11AA; # (읷; 읷; 읷; 읷; 읷; ) HANGUL SYLLABLE IGS +C778;C778;110B 1175 11AB;C778;110B 1175 11AB; # (인; 인; 인; 인; 인; ) HANGUL SYLLABLE IN +C779;C779;110B 1175 11AC;C779;110B 1175 11AC; # (읹; 읹; 읹; 읹; 읹; ) HANGUL SYLLABLE INJ +C77A;C77A;110B 1175 11AD;C77A;110B 1175 11AD; # (읺; 읺; 읺; 읺; 읺; ) HANGUL SYLLABLE INH +C77B;C77B;110B 1175 11AE;C77B;110B 1175 11AE; # (읻; 읻; 읻; 읻; 읻; ) HANGUL SYLLABLE ID +C77C;C77C;110B 1175 11AF;C77C;110B 1175 11AF; # (일; 일; 일; 일; 일; ) HANGUL SYLLABLE IL +C77D;C77D;110B 1175 11B0;C77D;110B 1175 11B0; # (읽; 읽; 읽; 읽; 읽; ) HANGUL SYLLABLE ILG +C77E;C77E;110B 1175 11B1;C77E;110B 1175 11B1; # (읾; 읾; 읾; 읾; 읾; ) HANGUL SYLLABLE ILM +C77F;C77F;110B 1175 11B2;C77F;110B 1175 11B2; # (읿; 읿; 읿; 읿; 읿; ) HANGUL SYLLABLE ILB +C780;C780;110B 1175 11B3;C780;110B 1175 11B3; # (잀; 잀; 잀; 잀; 잀; ) HANGUL SYLLABLE ILS +C781;C781;110B 1175 11B4;C781;110B 1175 11B4; # (잁; 잁; 잁; 잁; 잁; ) HANGUL SYLLABLE ILT +C782;C782;110B 1175 11B5;C782;110B 1175 11B5; # (잂; 잂; 잂; 잂; 잂; ) HANGUL SYLLABLE ILP +C783;C783;110B 1175 11B6;C783;110B 1175 11B6; # (잃; 잃; 잃; 잃; 잃; ) HANGUL SYLLABLE ILH +C784;C784;110B 1175 11B7;C784;110B 1175 11B7; # (임; 임; 임; 임; 임; ) HANGUL SYLLABLE IM +C785;C785;110B 1175 11B8;C785;110B 1175 11B8; # (입; 입; 입; 입; 입; ) HANGUL SYLLABLE IB +C786;C786;110B 1175 11B9;C786;110B 1175 11B9; # (잆; 잆; 잆; 잆; 잆; ) HANGUL SYLLABLE IBS +C787;C787;110B 1175 11BA;C787;110B 1175 11BA; # (잇; 잇; 잇; 잇; 잇; ) HANGUL SYLLABLE IS +C788;C788;110B 1175 11BB;C788;110B 1175 11BB; # (있; 있; 있; 있; 있; ) HANGUL SYLLABLE ISS +C789;C789;110B 1175 11BC;C789;110B 1175 11BC; # (잉; 잉; 잉; 잉; 잉; ) HANGUL SYLLABLE ING +C78A;C78A;110B 1175 11BD;C78A;110B 1175 11BD; # (잊; 잊; 잊; 잊; 잊; ) HANGUL SYLLABLE IJ +C78B;C78B;110B 1175 11BE;C78B;110B 1175 11BE; # (잋; 잋; 잋; 잋; 잋; ) HANGUL SYLLABLE IC +C78C;C78C;110B 1175 11BF;C78C;110B 1175 11BF; # (잌; 잌; 잌; 잌; 잌; ) HANGUL SYLLABLE IK +C78D;C78D;110B 1175 11C0;C78D;110B 1175 11C0; # (잍; 잍; 잍; 잍; 잍; ) HANGUL SYLLABLE IT +C78E;C78E;110B 1175 11C1;C78E;110B 1175 11C1; # (잎; 잎; 잎; 잎; 잎; ) HANGUL SYLLABLE IP +C78F;C78F;110B 1175 11C2;C78F;110B 1175 11C2; # (잏; 잏; 잏; 잏; 잏; ) HANGUL SYLLABLE IH +C790;C790;110C 1161;C790;110C 1161; # (자; 자; 자; 자; 자; ) HANGUL SYLLABLE JA +C791;C791;110C 1161 11A8;C791;110C 1161 11A8; # (작; 작; 작; 작; 작; ) HANGUL SYLLABLE JAG +C792;C792;110C 1161 11A9;C792;110C 1161 11A9; # (잒; 잒; 잒; 잒; 잒; ) HANGUL SYLLABLE JAGG +C793;C793;110C 1161 11AA;C793;110C 1161 11AA; # (잓; 잓; 잓; 잓; 잓; ) HANGUL SYLLABLE JAGS +C794;C794;110C 1161 11AB;C794;110C 1161 11AB; # (잔; 잔; 잔; 잔; 잔; ) HANGUL SYLLABLE JAN +C795;C795;110C 1161 11AC;C795;110C 1161 11AC; # (잕; 잕; 잕; 잕; 잕; ) HANGUL SYLLABLE JANJ +C796;C796;110C 1161 11AD;C796;110C 1161 11AD; # (잖; 잖; 잖; 잖; 잖; ) HANGUL SYLLABLE JANH +C797;C797;110C 1161 11AE;C797;110C 1161 11AE; # (잗; 잗; 잗; 잗; 잗; ) HANGUL SYLLABLE JAD +C798;C798;110C 1161 11AF;C798;110C 1161 11AF; # (잘; 잘; 잘; 잘; 잘; ) HANGUL SYLLABLE JAL +C799;C799;110C 1161 11B0;C799;110C 1161 11B0; # (잙; 잙; 잙; 잙; 잙; ) HANGUL SYLLABLE JALG +C79A;C79A;110C 1161 11B1;C79A;110C 1161 11B1; # (잚; 잚; 잚; 잚; 잚; ) HANGUL SYLLABLE JALM +C79B;C79B;110C 1161 11B2;C79B;110C 1161 11B2; # (잛; 잛; 잛; 잛; 잛; ) HANGUL SYLLABLE JALB +C79C;C79C;110C 1161 11B3;C79C;110C 1161 11B3; # (잜; 잜; 잜; 잜; 잜; ) HANGUL SYLLABLE JALS +C79D;C79D;110C 1161 11B4;C79D;110C 1161 11B4; # (잝; 잝; 잝; 잝; 잝; ) HANGUL SYLLABLE JALT +C79E;C79E;110C 1161 11B5;C79E;110C 1161 11B5; # (잞; 잞; 잞; 잞; 잞; ) HANGUL SYLLABLE JALP +C79F;C79F;110C 1161 11B6;C79F;110C 1161 11B6; # (잟; 잟; 잟; 잟; 잟; ) HANGUL SYLLABLE JALH +C7A0;C7A0;110C 1161 11B7;C7A0;110C 1161 11B7; # (잠; 잠; 잠; 잠; 잠; ) HANGUL SYLLABLE JAM +C7A1;C7A1;110C 1161 11B8;C7A1;110C 1161 11B8; # (잡; 잡; 잡; 잡; 잡; ) HANGUL SYLLABLE JAB +C7A2;C7A2;110C 1161 11B9;C7A2;110C 1161 11B9; # (잢; 잢; 잢; 잢; 잢; ) HANGUL SYLLABLE JABS +C7A3;C7A3;110C 1161 11BA;C7A3;110C 1161 11BA; # (잣; 잣; 잣; 잣; 잣; ) HANGUL SYLLABLE JAS +C7A4;C7A4;110C 1161 11BB;C7A4;110C 1161 11BB; # (잤; 잤; 잤; 잤; 잤; ) HANGUL SYLLABLE JASS +C7A5;C7A5;110C 1161 11BC;C7A5;110C 1161 11BC; # (장; 장; 장; 장; 장; ) HANGUL SYLLABLE JANG +C7A6;C7A6;110C 1161 11BD;C7A6;110C 1161 11BD; # (잦; 잦; 잦; 잦; 잦; ) HANGUL SYLLABLE JAJ +C7A7;C7A7;110C 1161 11BE;C7A7;110C 1161 11BE; # (잧; 잧; 잧; 잧; 잧; ) HANGUL SYLLABLE JAC +C7A8;C7A8;110C 1161 11BF;C7A8;110C 1161 11BF; # (잨; 잨; 잨; 잨; 잨; ) HANGUL SYLLABLE JAK +C7A9;C7A9;110C 1161 11C0;C7A9;110C 1161 11C0; # (잩; 잩; 잩; 잩; 잩; ) HANGUL SYLLABLE JAT +C7AA;C7AA;110C 1161 11C1;C7AA;110C 1161 11C1; # (잪; 잪; 잪; 잪; 잪; ) HANGUL SYLLABLE JAP +C7AB;C7AB;110C 1161 11C2;C7AB;110C 1161 11C2; # (잫; 잫; 잫; 잫; 잫; ) HANGUL SYLLABLE JAH +C7AC;C7AC;110C 1162;C7AC;110C 1162; # (재; 재; 재; 재; 재; ) HANGUL SYLLABLE JAE +C7AD;C7AD;110C 1162 11A8;C7AD;110C 1162 11A8; # (잭; 잭; 잭; 잭; 잭; ) HANGUL SYLLABLE JAEG +C7AE;C7AE;110C 1162 11A9;C7AE;110C 1162 11A9; # (잮; 잮; 잮; 잮; 잮; ) HANGUL SYLLABLE JAEGG +C7AF;C7AF;110C 1162 11AA;C7AF;110C 1162 11AA; # (잯; 잯; 잯; 잯; 잯; ) HANGUL SYLLABLE JAEGS +C7B0;C7B0;110C 1162 11AB;C7B0;110C 1162 11AB; # (잰; 잰; 잰; 잰; 잰; ) HANGUL SYLLABLE JAEN +C7B1;C7B1;110C 1162 11AC;C7B1;110C 1162 11AC; # (잱; 잱; 잱; 잱; 잱; ) HANGUL SYLLABLE JAENJ +C7B2;C7B2;110C 1162 11AD;C7B2;110C 1162 11AD; # (잲; 잲; 잲; 잲; 잲; ) HANGUL SYLLABLE JAENH +C7B3;C7B3;110C 1162 11AE;C7B3;110C 1162 11AE; # (잳; 잳; 잳; 잳; 잳; ) HANGUL SYLLABLE JAED +C7B4;C7B4;110C 1162 11AF;C7B4;110C 1162 11AF; # (잴; 잴; 잴; 잴; 잴; ) HANGUL SYLLABLE JAEL +C7B5;C7B5;110C 1162 11B0;C7B5;110C 1162 11B0; # (잵; 잵; 잵; 잵; 잵; ) HANGUL SYLLABLE JAELG +C7B6;C7B6;110C 1162 11B1;C7B6;110C 1162 11B1; # (잶; 잶; 잶; 잶; 잶; ) HANGUL SYLLABLE JAELM +C7B7;C7B7;110C 1162 11B2;C7B7;110C 1162 11B2; # (잷; 잷; 잷; 잷; 잷; ) HANGUL SYLLABLE JAELB +C7B8;C7B8;110C 1162 11B3;C7B8;110C 1162 11B3; # (잸; 잸; 잸; 잸; 잸; ) HANGUL SYLLABLE JAELS +C7B9;C7B9;110C 1162 11B4;C7B9;110C 1162 11B4; # (잹; 잹; 잹; 잹; 잹; ) HANGUL SYLLABLE JAELT +C7BA;C7BA;110C 1162 11B5;C7BA;110C 1162 11B5; # (잺; 잺; 잺; 잺; 잺; ) HANGUL SYLLABLE JAELP +C7BB;C7BB;110C 1162 11B6;C7BB;110C 1162 11B6; # (잻; 잻; 잻; 잻; 잻; ) HANGUL SYLLABLE JAELH +C7BC;C7BC;110C 1162 11B7;C7BC;110C 1162 11B7; # (잼; 잼; 잼; 잼; 잼; ) HANGUL SYLLABLE JAEM +C7BD;C7BD;110C 1162 11B8;C7BD;110C 1162 11B8; # (잽; 잽; 잽; 잽; 잽; ) HANGUL SYLLABLE JAEB +C7BE;C7BE;110C 1162 11B9;C7BE;110C 1162 11B9; # (잾; 잾; 잾; 잾; 잾; ) HANGUL SYLLABLE JAEBS +C7BF;C7BF;110C 1162 11BA;C7BF;110C 1162 11BA; # (잿; 잿; 잿; 잿; 잿; ) HANGUL SYLLABLE JAES +C7C0;C7C0;110C 1162 11BB;C7C0;110C 1162 11BB; # (쟀; 쟀; 쟀; 쟀; 쟀; ) HANGUL SYLLABLE JAESS +C7C1;C7C1;110C 1162 11BC;C7C1;110C 1162 11BC; # (쟁; 쟁; 쟁; 쟁; 쟁; ) HANGUL SYLLABLE JAENG +C7C2;C7C2;110C 1162 11BD;C7C2;110C 1162 11BD; # (쟂; 쟂; 쟂; 쟂; 쟂; ) HANGUL SYLLABLE JAEJ +C7C3;C7C3;110C 1162 11BE;C7C3;110C 1162 11BE; # (쟃; 쟃; 쟃; 쟃; 쟃; ) HANGUL SYLLABLE JAEC +C7C4;C7C4;110C 1162 11BF;C7C4;110C 1162 11BF; # (쟄; 쟄; 쟄; 쟄; 쟄; ) HANGUL SYLLABLE JAEK +C7C5;C7C5;110C 1162 11C0;C7C5;110C 1162 11C0; # (쟅; 쟅; 쟅; 쟅; 쟅; ) HANGUL SYLLABLE JAET +C7C6;C7C6;110C 1162 11C1;C7C6;110C 1162 11C1; # (쟆; 쟆; 쟆; 쟆; 쟆; ) HANGUL SYLLABLE JAEP +C7C7;C7C7;110C 1162 11C2;C7C7;110C 1162 11C2; # (쟇; 쟇; 쟇; 쟇; 쟇; ) HANGUL SYLLABLE JAEH +C7C8;C7C8;110C 1163;C7C8;110C 1163; # (쟈; 쟈; 쟈; 쟈; 쟈; ) HANGUL SYLLABLE JYA +C7C9;C7C9;110C 1163 11A8;C7C9;110C 1163 11A8; # (쟉; 쟉; 쟉; 쟉; 쟉; ) HANGUL SYLLABLE JYAG +C7CA;C7CA;110C 1163 11A9;C7CA;110C 1163 11A9; # (쟊; 쟊; 쟊; 쟊; 쟊; ) HANGUL SYLLABLE JYAGG +C7CB;C7CB;110C 1163 11AA;C7CB;110C 1163 11AA; # (쟋; 쟋; 쟋; 쟋; 쟋; ) HANGUL SYLLABLE JYAGS +C7CC;C7CC;110C 1163 11AB;C7CC;110C 1163 11AB; # (쟌; 쟌; 쟌; 쟌; 쟌; ) HANGUL SYLLABLE JYAN +C7CD;C7CD;110C 1163 11AC;C7CD;110C 1163 11AC; # (쟍; 쟍; 쟍; 쟍; 쟍; ) HANGUL SYLLABLE JYANJ +C7CE;C7CE;110C 1163 11AD;C7CE;110C 1163 11AD; # (쟎; 쟎; 쟎; 쟎; 쟎; ) HANGUL SYLLABLE JYANH +C7CF;C7CF;110C 1163 11AE;C7CF;110C 1163 11AE; # (쟏; 쟏; 쟏; 쟏; 쟏; ) HANGUL SYLLABLE JYAD +C7D0;C7D0;110C 1163 11AF;C7D0;110C 1163 11AF; # (쟐; 쟐; 쟐; 쟐; 쟐; ) HANGUL SYLLABLE JYAL +C7D1;C7D1;110C 1163 11B0;C7D1;110C 1163 11B0; # (쟑; 쟑; 쟑; 쟑; 쟑; ) HANGUL SYLLABLE JYALG +C7D2;C7D2;110C 1163 11B1;C7D2;110C 1163 11B1; # (쟒; 쟒; 쟒; 쟒; 쟒; ) HANGUL SYLLABLE JYALM +C7D3;C7D3;110C 1163 11B2;C7D3;110C 1163 11B2; # (쟓; 쟓; 쟓; 쟓; 쟓; ) HANGUL SYLLABLE JYALB +C7D4;C7D4;110C 1163 11B3;C7D4;110C 1163 11B3; # (쟔; 쟔; 쟔; 쟔; 쟔; ) HANGUL SYLLABLE JYALS +C7D5;C7D5;110C 1163 11B4;C7D5;110C 1163 11B4; # (쟕; 쟕; 쟕; 쟕; 쟕; ) HANGUL SYLLABLE JYALT +C7D6;C7D6;110C 1163 11B5;C7D6;110C 1163 11B5; # (쟖; 쟖; 쟖; 쟖; 쟖; ) HANGUL SYLLABLE JYALP +C7D7;C7D7;110C 1163 11B6;C7D7;110C 1163 11B6; # (쟗; 쟗; 쟗; 쟗; 쟗; ) HANGUL SYLLABLE JYALH +C7D8;C7D8;110C 1163 11B7;C7D8;110C 1163 11B7; # (쟘; 쟘; 쟘; 쟘; 쟘; ) HANGUL SYLLABLE JYAM +C7D9;C7D9;110C 1163 11B8;C7D9;110C 1163 11B8; # (쟙; 쟙; 쟙; 쟙; 쟙; ) HANGUL SYLLABLE JYAB +C7DA;C7DA;110C 1163 11B9;C7DA;110C 1163 11B9; # (쟚; 쟚; 쟚; 쟚; 쟚; ) HANGUL SYLLABLE JYABS +C7DB;C7DB;110C 1163 11BA;C7DB;110C 1163 11BA; # (쟛; 쟛; 쟛; 쟛; 쟛; ) HANGUL SYLLABLE JYAS +C7DC;C7DC;110C 1163 11BB;C7DC;110C 1163 11BB; # (쟜; 쟜; 쟜; 쟜; 쟜; ) HANGUL SYLLABLE JYASS +C7DD;C7DD;110C 1163 11BC;C7DD;110C 1163 11BC; # (쟝; 쟝; 쟝; 쟝; 쟝; ) HANGUL SYLLABLE JYANG +C7DE;C7DE;110C 1163 11BD;C7DE;110C 1163 11BD; # (쟞; 쟞; 쟞; 쟞; 쟞; ) HANGUL SYLLABLE JYAJ +C7DF;C7DF;110C 1163 11BE;C7DF;110C 1163 11BE; # (쟟; 쟟; 쟟; 쟟; 쟟; ) HANGUL SYLLABLE JYAC +C7E0;C7E0;110C 1163 11BF;C7E0;110C 1163 11BF; # (쟠; 쟠; 쟠; 쟠; 쟠; ) HANGUL SYLLABLE JYAK +C7E1;C7E1;110C 1163 11C0;C7E1;110C 1163 11C0; # (쟡; 쟡; 쟡; 쟡; 쟡; ) HANGUL SYLLABLE JYAT +C7E2;C7E2;110C 1163 11C1;C7E2;110C 1163 11C1; # (쟢; 쟢; 쟢; 쟢; 쟢; ) HANGUL SYLLABLE JYAP +C7E3;C7E3;110C 1163 11C2;C7E3;110C 1163 11C2; # (쟣; 쟣; 쟣; 쟣; 쟣; ) HANGUL SYLLABLE JYAH +C7E4;C7E4;110C 1164;C7E4;110C 1164; # (쟤; 쟤; 쟤; 쟤; 쟤; ) HANGUL SYLLABLE JYAE +C7E5;C7E5;110C 1164 11A8;C7E5;110C 1164 11A8; # (쟥; 쟥; 쟥; 쟥; 쟥; ) HANGUL SYLLABLE JYAEG +C7E6;C7E6;110C 1164 11A9;C7E6;110C 1164 11A9; # (쟦; 쟦; 쟦; 쟦; 쟦; ) HANGUL SYLLABLE JYAEGG +C7E7;C7E7;110C 1164 11AA;C7E7;110C 1164 11AA; # (쟧; 쟧; 쟧; 쟧; 쟧; ) HANGUL SYLLABLE JYAEGS +C7E8;C7E8;110C 1164 11AB;C7E8;110C 1164 11AB; # (쟨; 쟨; 쟨; 쟨; 쟨; ) HANGUL SYLLABLE JYAEN +C7E9;C7E9;110C 1164 11AC;C7E9;110C 1164 11AC; # (쟩; 쟩; 쟩; 쟩; 쟩; ) HANGUL SYLLABLE JYAENJ +C7EA;C7EA;110C 1164 11AD;C7EA;110C 1164 11AD; # (쟪; 쟪; 쟪; 쟪; 쟪; ) HANGUL SYLLABLE JYAENH +C7EB;C7EB;110C 1164 11AE;C7EB;110C 1164 11AE; # (쟫; 쟫; 쟫; 쟫; 쟫; ) HANGUL SYLLABLE JYAED +C7EC;C7EC;110C 1164 11AF;C7EC;110C 1164 11AF; # (쟬; 쟬; 쟬; 쟬; 쟬; ) HANGUL SYLLABLE JYAEL +C7ED;C7ED;110C 1164 11B0;C7ED;110C 1164 11B0; # (쟭; 쟭; 쟭; 쟭; 쟭; ) HANGUL SYLLABLE JYAELG +C7EE;C7EE;110C 1164 11B1;C7EE;110C 1164 11B1; # (쟮; 쟮; 쟮; 쟮; 쟮; ) HANGUL SYLLABLE JYAELM +C7EF;C7EF;110C 1164 11B2;C7EF;110C 1164 11B2; # (쟯; 쟯; 쟯; 쟯; 쟯; ) HANGUL SYLLABLE JYAELB +C7F0;C7F0;110C 1164 11B3;C7F0;110C 1164 11B3; # (쟰; 쟰; 쟰; 쟰; 쟰; ) HANGUL SYLLABLE JYAELS +C7F1;C7F1;110C 1164 11B4;C7F1;110C 1164 11B4; # (쟱; 쟱; 쟱; 쟱; 쟱; ) HANGUL SYLLABLE JYAELT +C7F2;C7F2;110C 1164 11B5;C7F2;110C 1164 11B5; # (쟲; 쟲; 쟲; 쟲; 쟲; ) HANGUL SYLLABLE JYAELP +C7F3;C7F3;110C 1164 11B6;C7F3;110C 1164 11B6; # (쟳; 쟳; 쟳; 쟳; 쟳; ) HANGUL SYLLABLE JYAELH +C7F4;C7F4;110C 1164 11B7;C7F4;110C 1164 11B7; # (쟴; 쟴; 쟴; 쟴; 쟴; ) HANGUL SYLLABLE JYAEM +C7F5;C7F5;110C 1164 11B8;C7F5;110C 1164 11B8; # (쟵; 쟵; 쟵; 쟵; 쟵; ) HANGUL SYLLABLE JYAEB +C7F6;C7F6;110C 1164 11B9;C7F6;110C 1164 11B9; # (쟶; 쟶; 쟶; 쟶; 쟶; ) HANGUL SYLLABLE JYAEBS +C7F7;C7F7;110C 1164 11BA;C7F7;110C 1164 11BA; # (쟷; 쟷; 쟷; 쟷; 쟷; ) HANGUL SYLLABLE JYAES +C7F8;C7F8;110C 1164 11BB;C7F8;110C 1164 11BB; # (쟸; 쟸; 쟸; 쟸; 쟸; ) HANGUL SYLLABLE JYAESS +C7F9;C7F9;110C 1164 11BC;C7F9;110C 1164 11BC; # (쟹; 쟹; 쟹; 쟹; 쟹; ) HANGUL SYLLABLE JYAENG +C7FA;C7FA;110C 1164 11BD;C7FA;110C 1164 11BD; # (쟺; 쟺; 쟺; 쟺; 쟺; ) HANGUL SYLLABLE JYAEJ +C7FB;C7FB;110C 1164 11BE;C7FB;110C 1164 11BE; # (쟻; 쟻; 쟻; 쟻; 쟻; ) HANGUL SYLLABLE JYAEC +C7FC;C7FC;110C 1164 11BF;C7FC;110C 1164 11BF; # (쟼; 쟼; 쟼; 쟼; 쟼; ) HANGUL SYLLABLE JYAEK +C7FD;C7FD;110C 1164 11C0;C7FD;110C 1164 11C0; # (쟽; 쟽; 쟽; 쟽; 쟽; ) HANGUL SYLLABLE JYAET +C7FE;C7FE;110C 1164 11C1;C7FE;110C 1164 11C1; # (쟾; 쟾; 쟾; 쟾; 쟾; ) HANGUL SYLLABLE JYAEP +C7FF;C7FF;110C 1164 11C2;C7FF;110C 1164 11C2; # (쟿; 쟿; 쟿; 쟿; 쟿; ) HANGUL SYLLABLE JYAEH +C800;C800;110C 1165;C800;110C 1165; # (저; 저; 저; 저; 저; ) HANGUL SYLLABLE JEO +C801;C801;110C 1165 11A8;C801;110C 1165 11A8; # (적; 적; 적; 적; 적; ) HANGUL SYLLABLE JEOG +C802;C802;110C 1165 11A9;C802;110C 1165 11A9; # (젂; 젂; 젂; 젂; 젂; ) HANGUL SYLLABLE JEOGG +C803;C803;110C 1165 11AA;C803;110C 1165 11AA; # (젃; 젃; 젃; 젃; 젃; ) HANGUL SYLLABLE JEOGS +C804;C804;110C 1165 11AB;C804;110C 1165 11AB; # (전; 전; 전; 전; 전; ) HANGUL SYLLABLE JEON +C805;C805;110C 1165 11AC;C805;110C 1165 11AC; # (젅; 젅; 젅; 젅; 젅; ) HANGUL SYLLABLE JEONJ +C806;C806;110C 1165 11AD;C806;110C 1165 11AD; # (젆; 젆; 젆; 젆; 젆; ) HANGUL SYLLABLE JEONH +C807;C807;110C 1165 11AE;C807;110C 1165 11AE; # (젇; 젇; 젇; 젇; 젇; ) HANGUL SYLLABLE JEOD +C808;C808;110C 1165 11AF;C808;110C 1165 11AF; # (절; 절; 절; 절; 절; ) HANGUL SYLLABLE JEOL +C809;C809;110C 1165 11B0;C809;110C 1165 11B0; # (젉; 젉; 젉; 젉; 젉; ) HANGUL SYLLABLE JEOLG +C80A;C80A;110C 1165 11B1;C80A;110C 1165 11B1; # (젊; 젊; 젊; 젊; 젊; ) HANGUL SYLLABLE JEOLM +C80B;C80B;110C 1165 11B2;C80B;110C 1165 11B2; # (젋; 젋; 젋; 젋; 젋; ) HANGUL SYLLABLE JEOLB +C80C;C80C;110C 1165 11B3;C80C;110C 1165 11B3; # (젌; 젌; 젌; 젌; 젌; ) HANGUL SYLLABLE JEOLS +C80D;C80D;110C 1165 11B4;C80D;110C 1165 11B4; # (젍; 젍; 젍; 젍; 젍; ) HANGUL SYLLABLE JEOLT +C80E;C80E;110C 1165 11B5;C80E;110C 1165 11B5; # (젎; 젎; 젎; 젎; 젎; ) HANGUL SYLLABLE JEOLP +C80F;C80F;110C 1165 11B6;C80F;110C 1165 11B6; # (젏; 젏; 젏; 젏; 젏; ) HANGUL SYLLABLE JEOLH +C810;C810;110C 1165 11B7;C810;110C 1165 11B7; # (점; 점; 점; 점; 점; ) HANGUL SYLLABLE JEOM +C811;C811;110C 1165 11B8;C811;110C 1165 11B8; # (접; 접; 접; 접; 접; ) HANGUL SYLLABLE JEOB +C812;C812;110C 1165 11B9;C812;110C 1165 11B9; # (젒; 젒; 젒; 젒; 젒; ) HANGUL SYLLABLE JEOBS +C813;C813;110C 1165 11BA;C813;110C 1165 11BA; # (젓; 젓; 젓; 젓; 젓; ) HANGUL SYLLABLE JEOS +C814;C814;110C 1165 11BB;C814;110C 1165 11BB; # (젔; 젔; 젔; 젔; 젔; ) HANGUL SYLLABLE JEOSS +C815;C815;110C 1165 11BC;C815;110C 1165 11BC; # (정; 정; 정; 정; 정; ) HANGUL SYLLABLE JEONG +C816;C816;110C 1165 11BD;C816;110C 1165 11BD; # (젖; 젖; 젖; 젖; 젖; ) HANGUL SYLLABLE JEOJ +C817;C817;110C 1165 11BE;C817;110C 1165 11BE; # (젗; 젗; 젗; 젗; 젗; ) HANGUL SYLLABLE JEOC +C818;C818;110C 1165 11BF;C818;110C 1165 11BF; # (젘; 젘; 젘; 젘; 젘; ) HANGUL SYLLABLE JEOK +C819;C819;110C 1165 11C0;C819;110C 1165 11C0; # (젙; 젙; 젙; 젙; 젙; ) HANGUL SYLLABLE JEOT +C81A;C81A;110C 1165 11C1;C81A;110C 1165 11C1; # (젚; 젚; 젚; 젚; 젚; ) HANGUL SYLLABLE JEOP +C81B;C81B;110C 1165 11C2;C81B;110C 1165 11C2; # (젛; 젛; 젛; 젛; 젛; ) HANGUL SYLLABLE JEOH +C81C;C81C;110C 1166;C81C;110C 1166; # (제; 제; 제; 제; 제; ) HANGUL SYLLABLE JE +C81D;C81D;110C 1166 11A8;C81D;110C 1166 11A8; # (젝; 젝; 젝; 젝; 젝; ) HANGUL SYLLABLE JEG +C81E;C81E;110C 1166 11A9;C81E;110C 1166 11A9; # (젞; 젞; 젞; 젞; 젞; ) HANGUL SYLLABLE JEGG +C81F;C81F;110C 1166 11AA;C81F;110C 1166 11AA; # (젟; 젟; 젟; 젟; 젟; ) HANGUL SYLLABLE JEGS +C820;C820;110C 1166 11AB;C820;110C 1166 11AB; # (젠; 젠; 젠; 젠; 젠; ) HANGUL SYLLABLE JEN +C821;C821;110C 1166 11AC;C821;110C 1166 11AC; # (젡; 젡; 젡; 젡; 젡; ) HANGUL SYLLABLE JENJ +C822;C822;110C 1166 11AD;C822;110C 1166 11AD; # (젢; 젢; 젢; 젢; 젢; ) HANGUL SYLLABLE JENH +C823;C823;110C 1166 11AE;C823;110C 1166 11AE; # (젣; 젣; 젣; 젣; 젣; ) HANGUL SYLLABLE JED +C824;C824;110C 1166 11AF;C824;110C 1166 11AF; # (젤; 젤; 젤; 젤; 젤; ) HANGUL SYLLABLE JEL +C825;C825;110C 1166 11B0;C825;110C 1166 11B0; # (젥; 젥; 젥; 젥; 젥; ) HANGUL SYLLABLE JELG +C826;C826;110C 1166 11B1;C826;110C 1166 11B1; # (젦; 젦; 젦; 젦; 젦; ) HANGUL SYLLABLE JELM +C827;C827;110C 1166 11B2;C827;110C 1166 11B2; # (젧; 젧; 젧; 젧; 젧; ) HANGUL SYLLABLE JELB +C828;C828;110C 1166 11B3;C828;110C 1166 11B3; # (젨; 젨; 젨; 젨; 젨; ) HANGUL SYLLABLE JELS +C829;C829;110C 1166 11B4;C829;110C 1166 11B4; # (젩; 젩; 젩; 젩; 젩; ) HANGUL SYLLABLE JELT +C82A;C82A;110C 1166 11B5;C82A;110C 1166 11B5; # (젪; 젪; 젪; 젪; 젪; ) HANGUL SYLLABLE JELP +C82B;C82B;110C 1166 11B6;C82B;110C 1166 11B6; # (젫; 젫; 젫; 젫; 젫; ) HANGUL SYLLABLE JELH +C82C;C82C;110C 1166 11B7;C82C;110C 1166 11B7; # (젬; 젬; 젬; 젬; 젬; ) HANGUL SYLLABLE JEM +C82D;C82D;110C 1166 11B8;C82D;110C 1166 11B8; # (젭; 젭; 젭; 젭; 젭; ) HANGUL SYLLABLE JEB +C82E;C82E;110C 1166 11B9;C82E;110C 1166 11B9; # (젮; 젮; 젮; 젮; 젮; ) HANGUL SYLLABLE JEBS +C82F;C82F;110C 1166 11BA;C82F;110C 1166 11BA; # (젯; 젯; 젯; 젯; 젯; ) HANGUL SYLLABLE JES +C830;C830;110C 1166 11BB;C830;110C 1166 11BB; # (젰; 젰; 젰; 젰; 젰; ) HANGUL SYLLABLE JESS +C831;C831;110C 1166 11BC;C831;110C 1166 11BC; # (젱; 젱; 젱; 젱; 젱; ) HANGUL SYLLABLE JENG +C832;C832;110C 1166 11BD;C832;110C 1166 11BD; # (젲; 젲; 젲; 젲; 젲; ) HANGUL SYLLABLE JEJ +C833;C833;110C 1166 11BE;C833;110C 1166 11BE; # (젳; 젳; 젳; 젳; 젳; ) HANGUL SYLLABLE JEC +C834;C834;110C 1166 11BF;C834;110C 1166 11BF; # (젴; 젴; 젴; 젴; 젴; ) HANGUL SYLLABLE JEK +C835;C835;110C 1166 11C0;C835;110C 1166 11C0; # (젵; 젵; 젵; 젵; 젵; ) HANGUL SYLLABLE JET +C836;C836;110C 1166 11C1;C836;110C 1166 11C1; # (젶; 젶; 젶; 젶; 젶; ) HANGUL SYLLABLE JEP +C837;C837;110C 1166 11C2;C837;110C 1166 11C2; # (젷; 젷; 젷; 젷; 젷; ) HANGUL SYLLABLE JEH +C838;C838;110C 1167;C838;110C 1167; # (져; 져; 져; 져; 져; ) HANGUL SYLLABLE JYEO +C839;C839;110C 1167 11A8;C839;110C 1167 11A8; # (젹; 젹; 젹; 젹; 젹; ) HANGUL SYLLABLE JYEOG +C83A;C83A;110C 1167 11A9;C83A;110C 1167 11A9; # (젺; 젺; 젺; 젺; 젺; ) HANGUL SYLLABLE JYEOGG +C83B;C83B;110C 1167 11AA;C83B;110C 1167 11AA; # (젻; 젻; 젻; 젻; 젻; ) HANGUL SYLLABLE JYEOGS +C83C;C83C;110C 1167 11AB;C83C;110C 1167 11AB; # (젼; 젼; 젼; 젼; 젼; ) HANGUL SYLLABLE JYEON +C83D;C83D;110C 1167 11AC;C83D;110C 1167 11AC; # (젽; 젽; 젽; 젽; 젽; ) HANGUL SYLLABLE JYEONJ +C83E;C83E;110C 1167 11AD;C83E;110C 1167 11AD; # (젾; 젾; 젾; 젾; 젾; ) HANGUL SYLLABLE JYEONH +C83F;C83F;110C 1167 11AE;C83F;110C 1167 11AE; # (젿; 젿; 젿; 젿; 젿; ) HANGUL SYLLABLE JYEOD +C840;C840;110C 1167 11AF;C840;110C 1167 11AF; # (졀; 졀; 졀; 졀; 졀; ) HANGUL SYLLABLE JYEOL +C841;C841;110C 1167 11B0;C841;110C 1167 11B0; # (졁; 졁; 졁; 졁; 졁; ) HANGUL SYLLABLE JYEOLG +C842;C842;110C 1167 11B1;C842;110C 1167 11B1; # (졂; 졂; 졂; 졂; 졂; ) HANGUL SYLLABLE JYEOLM +C843;C843;110C 1167 11B2;C843;110C 1167 11B2; # (졃; 졃; 졃; 졃; 졃; ) HANGUL SYLLABLE JYEOLB +C844;C844;110C 1167 11B3;C844;110C 1167 11B3; # (졄; 졄; 졄; 졄; 졄; ) HANGUL SYLLABLE JYEOLS +C845;C845;110C 1167 11B4;C845;110C 1167 11B4; # (졅; 졅; 졅; 졅; 졅; ) HANGUL SYLLABLE JYEOLT +C846;C846;110C 1167 11B5;C846;110C 1167 11B5; # (졆; 졆; 졆; 졆; 졆; ) HANGUL SYLLABLE JYEOLP +C847;C847;110C 1167 11B6;C847;110C 1167 11B6; # (졇; 졇; 졇; 졇; 졇; ) HANGUL SYLLABLE JYEOLH +C848;C848;110C 1167 11B7;C848;110C 1167 11B7; # (졈; 졈; 졈; 졈; 졈; ) HANGUL SYLLABLE JYEOM +C849;C849;110C 1167 11B8;C849;110C 1167 11B8; # (졉; 졉; 졉; 졉; 졉; ) HANGUL SYLLABLE JYEOB +C84A;C84A;110C 1167 11B9;C84A;110C 1167 11B9; # (졊; 졊; 졊; 졊; 졊; ) HANGUL SYLLABLE JYEOBS +C84B;C84B;110C 1167 11BA;C84B;110C 1167 11BA; # (졋; 졋; 졋; 졋; 졋; ) HANGUL SYLLABLE JYEOS +C84C;C84C;110C 1167 11BB;C84C;110C 1167 11BB; # (졌; 졌; 졌; 졌; 졌; ) HANGUL SYLLABLE JYEOSS +C84D;C84D;110C 1167 11BC;C84D;110C 1167 11BC; # (졍; 졍; 졍; 졍; 졍; ) HANGUL SYLLABLE JYEONG +C84E;C84E;110C 1167 11BD;C84E;110C 1167 11BD; # (졎; 졎; 졎; 졎; 졎; ) HANGUL SYLLABLE JYEOJ +C84F;C84F;110C 1167 11BE;C84F;110C 1167 11BE; # (졏; 졏; 졏; 졏; 졏; ) HANGUL SYLLABLE JYEOC +C850;C850;110C 1167 11BF;C850;110C 1167 11BF; # (졐; 졐; 졐; 졐; 졐; ) HANGUL SYLLABLE JYEOK +C851;C851;110C 1167 11C0;C851;110C 1167 11C0; # (졑; 졑; 졑; 졑; 졑; ) HANGUL SYLLABLE JYEOT +C852;C852;110C 1167 11C1;C852;110C 1167 11C1; # (졒; 졒; 졒; 졒; 졒; ) HANGUL SYLLABLE JYEOP +C853;C853;110C 1167 11C2;C853;110C 1167 11C2; # (졓; 졓; 졓; 졓; 졓; ) HANGUL SYLLABLE JYEOH +C854;C854;110C 1168;C854;110C 1168; # (졔; 졔; 졔; 졔; 졔; ) HANGUL SYLLABLE JYE +C855;C855;110C 1168 11A8;C855;110C 1168 11A8; # (졕; 졕; 졕; 졕; 졕; ) HANGUL SYLLABLE JYEG +C856;C856;110C 1168 11A9;C856;110C 1168 11A9; # (졖; 졖; 졖; 졖; 졖; ) HANGUL SYLLABLE JYEGG +C857;C857;110C 1168 11AA;C857;110C 1168 11AA; # (졗; 졗; 졗; 졗; 졗; ) HANGUL SYLLABLE JYEGS +C858;C858;110C 1168 11AB;C858;110C 1168 11AB; # (졘; 졘; 졘; 졘; 졘; ) HANGUL SYLLABLE JYEN +C859;C859;110C 1168 11AC;C859;110C 1168 11AC; # (졙; 졙; 졙; 졙; 졙; ) HANGUL SYLLABLE JYENJ +C85A;C85A;110C 1168 11AD;C85A;110C 1168 11AD; # (졚; 졚; 졚; 졚; 졚; ) HANGUL SYLLABLE JYENH +C85B;C85B;110C 1168 11AE;C85B;110C 1168 11AE; # (졛; 졛; 졛; 졛; 졛; ) HANGUL SYLLABLE JYED +C85C;C85C;110C 1168 11AF;C85C;110C 1168 11AF; # (졜; 졜; 졜; 졜; 졜; ) HANGUL SYLLABLE JYEL +C85D;C85D;110C 1168 11B0;C85D;110C 1168 11B0; # (졝; 졝; 졝; 졝; 졝; ) HANGUL SYLLABLE JYELG +C85E;C85E;110C 1168 11B1;C85E;110C 1168 11B1; # (졞; 졞; 졞; 졞; 졞; ) HANGUL SYLLABLE JYELM +C85F;C85F;110C 1168 11B2;C85F;110C 1168 11B2; # (졟; 졟; 졟; 졟; 졟; ) HANGUL SYLLABLE JYELB +C860;C860;110C 1168 11B3;C860;110C 1168 11B3; # (졠; 졠; 졠; 졠; 졠; ) HANGUL SYLLABLE JYELS +C861;C861;110C 1168 11B4;C861;110C 1168 11B4; # (졡; 졡; 졡; 졡; 졡; ) HANGUL SYLLABLE JYELT +C862;C862;110C 1168 11B5;C862;110C 1168 11B5; # (졢; 졢; 졢; 졢; 졢; ) HANGUL SYLLABLE JYELP +C863;C863;110C 1168 11B6;C863;110C 1168 11B6; # (졣; 졣; 졣; 졣; 졣; ) HANGUL SYLLABLE JYELH +C864;C864;110C 1168 11B7;C864;110C 1168 11B7; # (졤; 졤; 졤; 졤; 졤; ) HANGUL SYLLABLE JYEM +C865;C865;110C 1168 11B8;C865;110C 1168 11B8; # (졥; 졥; 졥; 졥; 졥; ) HANGUL SYLLABLE JYEB +C866;C866;110C 1168 11B9;C866;110C 1168 11B9; # (졦; 졦; 졦; 졦; 졦; ) HANGUL SYLLABLE JYEBS +C867;C867;110C 1168 11BA;C867;110C 1168 11BA; # (졧; 졧; 졧; 졧; 졧; ) HANGUL SYLLABLE JYES +C868;C868;110C 1168 11BB;C868;110C 1168 11BB; # (졨; 졨; 졨; 졨; 졨; ) HANGUL SYLLABLE JYESS +C869;C869;110C 1168 11BC;C869;110C 1168 11BC; # (졩; 졩; 졩; 졩; 졩; ) HANGUL SYLLABLE JYENG +C86A;C86A;110C 1168 11BD;C86A;110C 1168 11BD; # (졪; 졪; 졪; 졪; 졪; ) HANGUL SYLLABLE JYEJ +C86B;C86B;110C 1168 11BE;C86B;110C 1168 11BE; # (졫; 졫; 졫; 졫; 졫; ) HANGUL SYLLABLE JYEC +C86C;C86C;110C 1168 11BF;C86C;110C 1168 11BF; # (졬; 졬; 졬; 졬; 졬; ) HANGUL SYLLABLE JYEK +C86D;C86D;110C 1168 11C0;C86D;110C 1168 11C0; # (졭; 졭; 졭; 졭; 졭; ) HANGUL SYLLABLE JYET +C86E;C86E;110C 1168 11C1;C86E;110C 1168 11C1; # (졮; 졮; 졮; 졮; 졮; ) HANGUL SYLLABLE JYEP +C86F;C86F;110C 1168 11C2;C86F;110C 1168 11C2; # (졯; 졯; 졯; 졯; 졯; ) HANGUL SYLLABLE JYEH +C870;C870;110C 1169;C870;110C 1169; # (조; 조; 조; 조; 조; ) HANGUL SYLLABLE JO +C871;C871;110C 1169 11A8;C871;110C 1169 11A8; # (족; 족; 족; 족; 족; ) HANGUL SYLLABLE JOG +C872;C872;110C 1169 11A9;C872;110C 1169 11A9; # (졲; 졲; 졲; 졲; 졲; ) HANGUL SYLLABLE JOGG +C873;C873;110C 1169 11AA;C873;110C 1169 11AA; # (졳; 졳; 졳; 졳; 졳; ) HANGUL SYLLABLE JOGS +C874;C874;110C 1169 11AB;C874;110C 1169 11AB; # (존; 존; 존; 존; 존; ) HANGUL SYLLABLE JON +C875;C875;110C 1169 11AC;C875;110C 1169 11AC; # (졵; 졵; 졵; 졵; 졵; ) HANGUL SYLLABLE JONJ +C876;C876;110C 1169 11AD;C876;110C 1169 11AD; # (졶; 졶; 졶; 졶; 졶; ) HANGUL SYLLABLE JONH +C877;C877;110C 1169 11AE;C877;110C 1169 11AE; # (졷; 졷; 졷; 졷; 졷; ) HANGUL SYLLABLE JOD +C878;C878;110C 1169 11AF;C878;110C 1169 11AF; # (졸; 졸; 졸; 졸; 졸; ) HANGUL SYLLABLE JOL +C879;C879;110C 1169 11B0;C879;110C 1169 11B0; # (졹; 졹; 졹; 졹; 졹; ) HANGUL SYLLABLE JOLG +C87A;C87A;110C 1169 11B1;C87A;110C 1169 11B1; # (졺; 졺; 졺; 졺; 졺; ) HANGUL SYLLABLE JOLM +C87B;C87B;110C 1169 11B2;C87B;110C 1169 11B2; # (졻; 졻; 졻; 졻; 졻; ) HANGUL SYLLABLE JOLB +C87C;C87C;110C 1169 11B3;C87C;110C 1169 11B3; # (졼; 졼; 졼; 졼; 졼; ) HANGUL SYLLABLE JOLS +C87D;C87D;110C 1169 11B4;C87D;110C 1169 11B4; # (졽; 졽; 졽; 졽; 졽; ) HANGUL SYLLABLE JOLT +C87E;C87E;110C 1169 11B5;C87E;110C 1169 11B5; # (졾; 졾; 졾; 졾; 졾; ) HANGUL SYLLABLE JOLP +C87F;C87F;110C 1169 11B6;C87F;110C 1169 11B6; # (졿; 졿; 졿; 졿; 졿; ) HANGUL SYLLABLE JOLH +C880;C880;110C 1169 11B7;C880;110C 1169 11B7; # (좀; 좀; 좀; 좀; 좀; ) HANGUL SYLLABLE JOM +C881;C881;110C 1169 11B8;C881;110C 1169 11B8; # (좁; 좁; 좁; 좁; 좁; ) HANGUL SYLLABLE JOB +C882;C882;110C 1169 11B9;C882;110C 1169 11B9; # (좂; 좂; 좂; 좂; 좂; ) HANGUL SYLLABLE JOBS +C883;C883;110C 1169 11BA;C883;110C 1169 11BA; # (좃; 좃; 좃; 좃; 좃; ) HANGUL SYLLABLE JOS +C884;C884;110C 1169 11BB;C884;110C 1169 11BB; # (좄; 좄; 좄; 좄; 좄; ) HANGUL SYLLABLE JOSS +C885;C885;110C 1169 11BC;C885;110C 1169 11BC; # (종; 종; 종; 종; 종; ) HANGUL SYLLABLE JONG +C886;C886;110C 1169 11BD;C886;110C 1169 11BD; # (좆; 좆; 좆; 좆; 좆; ) HANGUL SYLLABLE JOJ +C887;C887;110C 1169 11BE;C887;110C 1169 11BE; # (좇; 좇; 좇; 좇; 좇; ) HANGUL SYLLABLE JOC +C888;C888;110C 1169 11BF;C888;110C 1169 11BF; # (좈; 좈; 좈; 좈; 좈; ) HANGUL SYLLABLE JOK +C889;C889;110C 1169 11C0;C889;110C 1169 11C0; # (좉; 좉; 좉; 좉; 좉; ) HANGUL SYLLABLE JOT +C88A;C88A;110C 1169 11C1;C88A;110C 1169 11C1; # (좊; 좊; 좊; 좊; 좊; ) HANGUL SYLLABLE JOP +C88B;C88B;110C 1169 11C2;C88B;110C 1169 11C2; # (좋; 좋; 좋; 좋; 좋; ) HANGUL SYLLABLE JOH +C88C;C88C;110C 116A;C88C;110C 116A; # (좌; 좌; 좌; 좌; 좌; ) HANGUL SYLLABLE JWA +C88D;C88D;110C 116A 11A8;C88D;110C 116A 11A8; # (좍; 좍; 좍; 좍; 좍; ) HANGUL SYLLABLE JWAG +C88E;C88E;110C 116A 11A9;C88E;110C 116A 11A9; # (좎; 좎; 좎; 좎; 좎; ) HANGUL SYLLABLE JWAGG +C88F;C88F;110C 116A 11AA;C88F;110C 116A 11AA; # (좏; 좏; 좏; 좏; 좏; ) HANGUL SYLLABLE JWAGS +C890;C890;110C 116A 11AB;C890;110C 116A 11AB; # (좐; 좐; 좐; 좐; 좐; ) HANGUL SYLLABLE JWAN +C891;C891;110C 116A 11AC;C891;110C 116A 11AC; # (좑; 좑; 좑; 좑; 좑; ) HANGUL SYLLABLE JWANJ +C892;C892;110C 116A 11AD;C892;110C 116A 11AD; # (좒; 좒; 좒; 좒; 좒; ) HANGUL SYLLABLE JWANH +C893;C893;110C 116A 11AE;C893;110C 116A 11AE; # (좓; 좓; 좓; 좓; 좓; ) HANGUL SYLLABLE JWAD +C894;C894;110C 116A 11AF;C894;110C 116A 11AF; # (좔; 좔; 좔; 좔; 좔; ) HANGUL SYLLABLE JWAL +C895;C895;110C 116A 11B0;C895;110C 116A 11B0; # (좕; 좕; 좕; 좕; 좕; ) HANGUL SYLLABLE JWALG +C896;C896;110C 116A 11B1;C896;110C 116A 11B1; # (좖; 좖; 좖; 좖; 좖; ) HANGUL SYLLABLE JWALM +C897;C897;110C 116A 11B2;C897;110C 116A 11B2; # (좗; 좗; 좗; 좗; 좗; ) HANGUL SYLLABLE JWALB +C898;C898;110C 116A 11B3;C898;110C 116A 11B3; # (좘; 좘; 좘; 좘; 좘; ) HANGUL SYLLABLE JWALS +C899;C899;110C 116A 11B4;C899;110C 116A 11B4; # (좙; 좙; 좙; 좙; 좙; ) HANGUL SYLLABLE JWALT +C89A;C89A;110C 116A 11B5;C89A;110C 116A 11B5; # (좚; 좚; 좚; 좚; 좚; ) HANGUL SYLLABLE JWALP +C89B;C89B;110C 116A 11B6;C89B;110C 116A 11B6; # (좛; 좛; 좛; 좛; 좛; ) HANGUL SYLLABLE JWALH +C89C;C89C;110C 116A 11B7;C89C;110C 116A 11B7; # (좜; 좜; 좜; 좜; 좜; ) HANGUL SYLLABLE JWAM +C89D;C89D;110C 116A 11B8;C89D;110C 116A 11B8; # (좝; 좝; 좝; 좝; 좝; ) HANGUL SYLLABLE JWAB +C89E;C89E;110C 116A 11B9;C89E;110C 116A 11B9; # (좞; 좞; 좞; 좞; 좞; ) HANGUL SYLLABLE JWABS +C89F;C89F;110C 116A 11BA;C89F;110C 116A 11BA; # (좟; 좟; 좟; 좟; 좟; ) HANGUL SYLLABLE JWAS +C8A0;C8A0;110C 116A 11BB;C8A0;110C 116A 11BB; # (좠; 좠; 좠; 좠; 좠; ) HANGUL SYLLABLE JWASS +C8A1;C8A1;110C 116A 11BC;C8A1;110C 116A 11BC; # (좡; 좡; 좡; 좡; 좡; ) HANGUL SYLLABLE JWANG +C8A2;C8A2;110C 116A 11BD;C8A2;110C 116A 11BD; # (좢; 좢; 좢; 좢; 좢; ) HANGUL SYLLABLE JWAJ +C8A3;C8A3;110C 116A 11BE;C8A3;110C 116A 11BE; # (좣; 좣; 좣; 좣; 좣; ) HANGUL SYLLABLE JWAC +C8A4;C8A4;110C 116A 11BF;C8A4;110C 116A 11BF; # (좤; 좤; 좤; 좤; 좤; ) HANGUL SYLLABLE JWAK +C8A5;C8A5;110C 116A 11C0;C8A5;110C 116A 11C0; # (좥; 좥; 좥; 좥; 좥; ) HANGUL SYLLABLE JWAT +C8A6;C8A6;110C 116A 11C1;C8A6;110C 116A 11C1; # (좦; 좦; 좦; 좦; 좦; ) HANGUL SYLLABLE JWAP +C8A7;C8A7;110C 116A 11C2;C8A7;110C 116A 11C2; # (좧; 좧; 좧; 좧; 좧; ) HANGUL SYLLABLE JWAH +C8A8;C8A8;110C 116B;C8A8;110C 116B; # (좨; 좨; 좨; 좨; 좨; ) HANGUL SYLLABLE JWAE +C8A9;C8A9;110C 116B 11A8;C8A9;110C 116B 11A8; # (좩; 좩; 좩; 좩; 좩; ) HANGUL SYLLABLE JWAEG +C8AA;C8AA;110C 116B 11A9;C8AA;110C 116B 11A9; # (좪; 좪; 좪; 좪; 좪; ) HANGUL SYLLABLE JWAEGG +C8AB;C8AB;110C 116B 11AA;C8AB;110C 116B 11AA; # (좫; 좫; 좫; 좫; 좫; ) HANGUL SYLLABLE JWAEGS +C8AC;C8AC;110C 116B 11AB;C8AC;110C 116B 11AB; # (좬; 좬; 좬; 좬; 좬; ) HANGUL SYLLABLE JWAEN +C8AD;C8AD;110C 116B 11AC;C8AD;110C 116B 11AC; # (좭; 좭; 좭; 좭; 좭; ) HANGUL SYLLABLE JWAENJ +C8AE;C8AE;110C 116B 11AD;C8AE;110C 116B 11AD; # (좮; 좮; 좮; 좮; 좮; ) HANGUL SYLLABLE JWAENH +C8AF;C8AF;110C 116B 11AE;C8AF;110C 116B 11AE; # (좯; 좯; 좯; 좯; 좯; ) HANGUL SYLLABLE JWAED +C8B0;C8B0;110C 116B 11AF;C8B0;110C 116B 11AF; # (좰; 좰; 좰; 좰; 좰; ) HANGUL SYLLABLE JWAEL +C8B1;C8B1;110C 116B 11B0;C8B1;110C 116B 11B0; # (좱; 좱; 좱; 좱; 좱; ) HANGUL SYLLABLE JWAELG +C8B2;C8B2;110C 116B 11B1;C8B2;110C 116B 11B1; # (좲; 좲; 좲; 좲; 좲; ) HANGUL SYLLABLE JWAELM +C8B3;C8B3;110C 116B 11B2;C8B3;110C 116B 11B2; # (좳; 좳; 좳; 좳; 좳; ) HANGUL SYLLABLE JWAELB +C8B4;C8B4;110C 116B 11B3;C8B4;110C 116B 11B3; # (좴; 좴; 좴; 좴; 좴; ) HANGUL SYLLABLE JWAELS +C8B5;C8B5;110C 116B 11B4;C8B5;110C 116B 11B4; # (좵; 좵; 좵; 좵; 좵; ) HANGUL SYLLABLE JWAELT +C8B6;C8B6;110C 116B 11B5;C8B6;110C 116B 11B5; # (좶; 좶; 좶; 좶; 좶; ) HANGUL SYLLABLE JWAELP +C8B7;C8B7;110C 116B 11B6;C8B7;110C 116B 11B6; # (좷; 좷; 좷; 좷; 좷; ) HANGUL SYLLABLE JWAELH +C8B8;C8B8;110C 116B 11B7;C8B8;110C 116B 11B7; # (좸; 좸; 좸; 좸; 좸; ) HANGUL SYLLABLE JWAEM +C8B9;C8B9;110C 116B 11B8;C8B9;110C 116B 11B8; # (좹; 좹; 좹; 좹; 좹; ) HANGUL SYLLABLE JWAEB +C8BA;C8BA;110C 116B 11B9;C8BA;110C 116B 11B9; # (좺; 좺; 좺; 좺; 좺; ) HANGUL SYLLABLE JWAEBS +C8BB;C8BB;110C 116B 11BA;C8BB;110C 116B 11BA; # (좻; 좻; 좻; 좻; 좻; ) HANGUL SYLLABLE JWAES +C8BC;C8BC;110C 116B 11BB;C8BC;110C 116B 11BB; # (좼; 좼; 좼; 좼; 좼; ) HANGUL SYLLABLE JWAESS +C8BD;C8BD;110C 116B 11BC;C8BD;110C 116B 11BC; # (좽; 좽; 좽; 좽; 좽; ) HANGUL SYLLABLE JWAENG +C8BE;C8BE;110C 116B 11BD;C8BE;110C 116B 11BD; # (좾; 좾; 좾; 좾; 좾; ) HANGUL SYLLABLE JWAEJ +C8BF;C8BF;110C 116B 11BE;C8BF;110C 116B 11BE; # (좿; 좿; 좿; 좿; 좿; ) HANGUL SYLLABLE JWAEC +C8C0;C8C0;110C 116B 11BF;C8C0;110C 116B 11BF; # (죀; 죀; 죀; 죀; 죀; ) HANGUL SYLLABLE JWAEK +C8C1;C8C1;110C 116B 11C0;C8C1;110C 116B 11C0; # (죁; 죁; 죁; 죁; 죁; ) HANGUL SYLLABLE JWAET +C8C2;C8C2;110C 116B 11C1;C8C2;110C 116B 11C1; # (죂; 죂; 죂; 죂; 죂; ) HANGUL SYLLABLE JWAEP +C8C3;C8C3;110C 116B 11C2;C8C3;110C 116B 11C2; # (죃; 죃; 죃; 죃; 죃; ) HANGUL SYLLABLE JWAEH +C8C4;C8C4;110C 116C;C8C4;110C 116C; # (죄; 죄; 죄; 죄; 죄; ) HANGUL SYLLABLE JOE +C8C5;C8C5;110C 116C 11A8;C8C5;110C 116C 11A8; # (죅; 죅; 죅; 죅; 죅; ) HANGUL SYLLABLE JOEG +C8C6;C8C6;110C 116C 11A9;C8C6;110C 116C 11A9; # (죆; 죆; 죆; 죆; 죆; ) HANGUL SYLLABLE JOEGG +C8C7;C8C7;110C 116C 11AA;C8C7;110C 116C 11AA; # (죇; 죇; 죇; 죇; 죇; ) HANGUL SYLLABLE JOEGS +C8C8;C8C8;110C 116C 11AB;C8C8;110C 116C 11AB; # (죈; 죈; 죈; 죈; 죈; ) HANGUL SYLLABLE JOEN +C8C9;C8C9;110C 116C 11AC;C8C9;110C 116C 11AC; # (죉; 죉; 죉; 죉; 죉; ) HANGUL SYLLABLE JOENJ +C8CA;C8CA;110C 116C 11AD;C8CA;110C 116C 11AD; # (죊; 죊; 죊; 죊; 죊; ) HANGUL SYLLABLE JOENH +C8CB;C8CB;110C 116C 11AE;C8CB;110C 116C 11AE; # (죋; 죋; 죋; 죋; 죋; ) HANGUL SYLLABLE JOED +C8CC;C8CC;110C 116C 11AF;C8CC;110C 116C 11AF; # (죌; 죌; 죌; 죌; 죌; ) HANGUL SYLLABLE JOEL +C8CD;C8CD;110C 116C 11B0;C8CD;110C 116C 11B0; # (죍; 죍; 죍; 죍; 죍; ) HANGUL SYLLABLE JOELG +C8CE;C8CE;110C 116C 11B1;C8CE;110C 116C 11B1; # (죎; 죎; 죎; 죎; 죎; ) HANGUL SYLLABLE JOELM +C8CF;C8CF;110C 116C 11B2;C8CF;110C 116C 11B2; # (죏; 죏; 죏; 죏; 죏; ) HANGUL SYLLABLE JOELB +C8D0;C8D0;110C 116C 11B3;C8D0;110C 116C 11B3; # (죐; 죐; 죐; 죐; 죐; ) HANGUL SYLLABLE JOELS +C8D1;C8D1;110C 116C 11B4;C8D1;110C 116C 11B4; # (죑; 죑; 죑; 죑; 죑; ) HANGUL SYLLABLE JOELT +C8D2;C8D2;110C 116C 11B5;C8D2;110C 116C 11B5; # (죒; 죒; 죒; 죒; 죒; ) HANGUL SYLLABLE JOELP +C8D3;C8D3;110C 116C 11B6;C8D3;110C 116C 11B6; # (죓; 죓; 죓; 죓; 죓; ) HANGUL SYLLABLE JOELH +C8D4;C8D4;110C 116C 11B7;C8D4;110C 116C 11B7; # (죔; 죔; 죔; 죔; 죔; ) HANGUL SYLLABLE JOEM +C8D5;C8D5;110C 116C 11B8;C8D5;110C 116C 11B8; # (죕; 죕; 죕; 죕; 죕; ) HANGUL SYLLABLE JOEB +C8D6;C8D6;110C 116C 11B9;C8D6;110C 116C 11B9; # (죖; 죖; 죖; 죖; 죖; ) HANGUL SYLLABLE JOEBS +C8D7;C8D7;110C 116C 11BA;C8D7;110C 116C 11BA; # (죗; 죗; 죗; 죗; 죗; ) HANGUL SYLLABLE JOES +C8D8;C8D8;110C 116C 11BB;C8D8;110C 116C 11BB; # (죘; 죘; 죘; 죘; 죘; ) HANGUL SYLLABLE JOESS +C8D9;C8D9;110C 116C 11BC;C8D9;110C 116C 11BC; # (죙; 죙; 죙; 죙; 죙; ) HANGUL SYLLABLE JOENG +C8DA;C8DA;110C 116C 11BD;C8DA;110C 116C 11BD; # (죚; 죚; 죚; 죚; 죚; ) HANGUL SYLLABLE JOEJ +C8DB;C8DB;110C 116C 11BE;C8DB;110C 116C 11BE; # (죛; 죛; 죛; 죛; 죛; ) HANGUL SYLLABLE JOEC +C8DC;C8DC;110C 116C 11BF;C8DC;110C 116C 11BF; # (죜; 죜; 죜; 죜; 죜; ) HANGUL SYLLABLE JOEK +C8DD;C8DD;110C 116C 11C0;C8DD;110C 116C 11C0; # (죝; 죝; 죝; 죝; 죝; ) HANGUL SYLLABLE JOET +C8DE;C8DE;110C 116C 11C1;C8DE;110C 116C 11C1; # (죞; 죞; 죞; 죞; 죞; ) HANGUL SYLLABLE JOEP +C8DF;C8DF;110C 116C 11C2;C8DF;110C 116C 11C2; # (죟; 죟; 죟; 죟; 죟; ) HANGUL SYLLABLE JOEH +C8E0;C8E0;110C 116D;C8E0;110C 116D; # (죠; 죠; 죠; 죠; 죠; ) HANGUL SYLLABLE JYO +C8E1;C8E1;110C 116D 11A8;C8E1;110C 116D 11A8; # (죡; 죡; 죡; 죡; 죡; ) HANGUL SYLLABLE JYOG +C8E2;C8E2;110C 116D 11A9;C8E2;110C 116D 11A9; # (죢; 죢; 죢; 죢; 죢; ) HANGUL SYLLABLE JYOGG +C8E3;C8E3;110C 116D 11AA;C8E3;110C 116D 11AA; # (죣; 죣; 죣; 죣; 죣; ) HANGUL SYLLABLE JYOGS +C8E4;C8E4;110C 116D 11AB;C8E4;110C 116D 11AB; # (죤; 죤; 죤; 죤; 죤; ) HANGUL SYLLABLE JYON +C8E5;C8E5;110C 116D 11AC;C8E5;110C 116D 11AC; # (죥; 죥; 죥; 죥; 죥; ) HANGUL SYLLABLE JYONJ +C8E6;C8E6;110C 116D 11AD;C8E6;110C 116D 11AD; # (죦; 죦; 죦; 죦; 죦; ) HANGUL SYLLABLE JYONH +C8E7;C8E7;110C 116D 11AE;C8E7;110C 116D 11AE; # (죧; 죧; 죧; 죧; 죧; ) HANGUL SYLLABLE JYOD +C8E8;C8E8;110C 116D 11AF;C8E8;110C 116D 11AF; # (죨; 죨; 죨; 죨; 죨; ) HANGUL SYLLABLE JYOL +C8E9;C8E9;110C 116D 11B0;C8E9;110C 116D 11B0; # (죩; 죩; 죩; 죩; 죩; ) HANGUL SYLLABLE JYOLG +C8EA;C8EA;110C 116D 11B1;C8EA;110C 116D 11B1; # (죪; 죪; 죪; 죪; 죪; ) HANGUL SYLLABLE JYOLM +C8EB;C8EB;110C 116D 11B2;C8EB;110C 116D 11B2; # (죫; 죫; 죫; 죫; 죫; ) HANGUL SYLLABLE JYOLB +C8EC;C8EC;110C 116D 11B3;C8EC;110C 116D 11B3; # (죬; 죬; 죬; 죬; 죬; ) HANGUL SYLLABLE JYOLS +C8ED;C8ED;110C 116D 11B4;C8ED;110C 116D 11B4; # (죭; 죭; 죭; 죭; 죭; ) HANGUL SYLLABLE JYOLT +C8EE;C8EE;110C 116D 11B5;C8EE;110C 116D 11B5; # (죮; 죮; 죮; 죮; 죮; ) HANGUL SYLLABLE JYOLP +C8EF;C8EF;110C 116D 11B6;C8EF;110C 116D 11B6; # (죯; 죯; 죯; 죯; 죯; ) HANGUL SYLLABLE JYOLH +C8F0;C8F0;110C 116D 11B7;C8F0;110C 116D 11B7; # (죰; 죰; 죰; 죰; 죰; ) HANGUL SYLLABLE JYOM +C8F1;C8F1;110C 116D 11B8;C8F1;110C 116D 11B8; # (죱; 죱; 죱; 죱; 죱; ) HANGUL SYLLABLE JYOB +C8F2;C8F2;110C 116D 11B9;C8F2;110C 116D 11B9; # (죲; 죲; 죲; 죲; 죲; ) HANGUL SYLLABLE JYOBS +C8F3;C8F3;110C 116D 11BA;C8F3;110C 116D 11BA; # (죳; 죳; 죳; 죳; 죳; ) HANGUL SYLLABLE JYOS +C8F4;C8F4;110C 116D 11BB;C8F4;110C 116D 11BB; # (죴; 죴; 죴; 죴; 죴; ) HANGUL SYLLABLE JYOSS +C8F5;C8F5;110C 116D 11BC;C8F5;110C 116D 11BC; # (죵; 죵; 죵; 죵; 죵; ) HANGUL SYLLABLE JYONG +C8F6;C8F6;110C 116D 11BD;C8F6;110C 116D 11BD; # (죶; 죶; 죶; 죶; 죶; ) HANGUL SYLLABLE JYOJ +C8F7;C8F7;110C 116D 11BE;C8F7;110C 116D 11BE; # (죷; 죷; 죷; 죷; 죷; ) HANGUL SYLLABLE JYOC +C8F8;C8F8;110C 116D 11BF;C8F8;110C 116D 11BF; # (죸; 죸; 죸; 죸; 죸; ) HANGUL SYLLABLE JYOK +C8F9;C8F9;110C 116D 11C0;C8F9;110C 116D 11C0; # (죹; 죹; 죹; 죹; 죹; ) HANGUL SYLLABLE JYOT +C8FA;C8FA;110C 116D 11C1;C8FA;110C 116D 11C1; # (죺; 죺; 죺; 죺; 죺; ) HANGUL SYLLABLE JYOP +C8FB;C8FB;110C 116D 11C2;C8FB;110C 116D 11C2; # (죻; 죻; 죻; 죻; 죻; ) HANGUL SYLLABLE JYOH +C8FC;C8FC;110C 116E;C8FC;110C 116E; # (주; 주; 주; 주; 주; ) HANGUL SYLLABLE JU +C8FD;C8FD;110C 116E 11A8;C8FD;110C 116E 11A8; # (죽; 죽; 죽; 죽; 죽; ) HANGUL SYLLABLE JUG +C8FE;C8FE;110C 116E 11A9;C8FE;110C 116E 11A9; # (죾; 죾; 죾; 죾; 죾; ) HANGUL SYLLABLE JUGG +C8FF;C8FF;110C 116E 11AA;C8FF;110C 116E 11AA; # (죿; 죿; 죿; 죿; 죿; ) HANGUL SYLLABLE JUGS +C900;C900;110C 116E 11AB;C900;110C 116E 11AB; # (준; 준; 준; 준; 준; ) HANGUL SYLLABLE JUN +C901;C901;110C 116E 11AC;C901;110C 116E 11AC; # (줁; 줁; 줁; 줁; 줁; ) HANGUL SYLLABLE JUNJ +C902;C902;110C 116E 11AD;C902;110C 116E 11AD; # (줂; 줂; 줂; 줂; 줂; ) HANGUL SYLLABLE JUNH +C903;C903;110C 116E 11AE;C903;110C 116E 11AE; # (줃; 줃; 줃; 줃; 줃; ) HANGUL SYLLABLE JUD +C904;C904;110C 116E 11AF;C904;110C 116E 11AF; # (줄; 줄; 줄; 줄; 줄; ) HANGUL SYLLABLE JUL +C905;C905;110C 116E 11B0;C905;110C 116E 11B0; # (줅; 줅; 줅; 줅; 줅; ) HANGUL SYLLABLE JULG +C906;C906;110C 116E 11B1;C906;110C 116E 11B1; # (줆; 줆; 줆; 줆; 줆; ) HANGUL SYLLABLE JULM +C907;C907;110C 116E 11B2;C907;110C 116E 11B2; # (줇; 줇; 줇; 줇; 줇; ) HANGUL SYLLABLE JULB +C908;C908;110C 116E 11B3;C908;110C 116E 11B3; # (줈; 줈; 줈; 줈; 줈; ) HANGUL SYLLABLE JULS +C909;C909;110C 116E 11B4;C909;110C 116E 11B4; # (줉; 줉; 줉; 줉; 줉; ) HANGUL SYLLABLE JULT +C90A;C90A;110C 116E 11B5;C90A;110C 116E 11B5; # (줊; 줊; 줊; 줊; 줊; ) HANGUL SYLLABLE JULP +C90B;C90B;110C 116E 11B6;C90B;110C 116E 11B6; # (줋; 줋; 줋; 줋; 줋; ) HANGUL SYLLABLE JULH +C90C;C90C;110C 116E 11B7;C90C;110C 116E 11B7; # (줌; 줌; 줌; 줌; 줌; ) HANGUL SYLLABLE JUM +C90D;C90D;110C 116E 11B8;C90D;110C 116E 11B8; # (줍; 줍; 줍; 줍; 줍; ) HANGUL SYLLABLE JUB +C90E;C90E;110C 116E 11B9;C90E;110C 116E 11B9; # (줎; 줎; 줎; 줎; 줎; ) HANGUL SYLLABLE JUBS +C90F;C90F;110C 116E 11BA;C90F;110C 116E 11BA; # (줏; 줏; 줏; 줏; 줏; ) HANGUL SYLLABLE JUS +C910;C910;110C 116E 11BB;C910;110C 116E 11BB; # (줐; 줐; 줐; 줐; 줐; ) HANGUL SYLLABLE JUSS +C911;C911;110C 116E 11BC;C911;110C 116E 11BC; # (중; 중; 중; 중; 중; ) HANGUL SYLLABLE JUNG +C912;C912;110C 116E 11BD;C912;110C 116E 11BD; # (줒; 줒; 줒; 줒; 줒; ) HANGUL SYLLABLE JUJ +C913;C913;110C 116E 11BE;C913;110C 116E 11BE; # (줓; 줓; 줓; 줓; 줓; ) HANGUL SYLLABLE JUC +C914;C914;110C 116E 11BF;C914;110C 116E 11BF; # (줔; 줔; 줔; 줔; 줔; ) HANGUL SYLLABLE JUK +C915;C915;110C 116E 11C0;C915;110C 116E 11C0; # (줕; 줕; 줕; 줕; 줕; ) HANGUL SYLLABLE JUT +C916;C916;110C 116E 11C1;C916;110C 116E 11C1; # (줖; 줖; 줖; 줖; 줖; ) HANGUL SYLLABLE JUP +C917;C917;110C 116E 11C2;C917;110C 116E 11C2; # (줗; 줗; 줗; 줗; 줗; ) HANGUL SYLLABLE JUH +C918;C918;110C 116F;C918;110C 116F; # (줘; 줘; 줘; 줘; 줘; ) HANGUL SYLLABLE JWEO +C919;C919;110C 116F 11A8;C919;110C 116F 11A8; # (줙; 줙; 줙; 줙; 줙; ) HANGUL SYLLABLE JWEOG +C91A;C91A;110C 116F 11A9;C91A;110C 116F 11A9; # (줚; 줚; 줚; 줚; 줚; ) HANGUL SYLLABLE JWEOGG +C91B;C91B;110C 116F 11AA;C91B;110C 116F 11AA; # (줛; 줛; 줛; 줛; 줛; ) HANGUL SYLLABLE JWEOGS +C91C;C91C;110C 116F 11AB;C91C;110C 116F 11AB; # (줜; 줜; 줜; 줜; 줜; ) HANGUL SYLLABLE JWEON +C91D;C91D;110C 116F 11AC;C91D;110C 116F 11AC; # (줝; 줝; 줝; 줝; 줝; ) HANGUL SYLLABLE JWEONJ +C91E;C91E;110C 116F 11AD;C91E;110C 116F 11AD; # (줞; 줞; 줞; 줞; 줞; ) HANGUL SYLLABLE JWEONH +C91F;C91F;110C 116F 11AE;C91F;110C 116F 11AE; # (줟; 줟; 줟; 줟; 줟; ) HANGUL SYLLABLE JWEOD +C920;C920;110C 116F 11AF;C920;110C 116F 11AF; # (줠; 줠; 줠; 줠; 줠; ) HANGUL SYLLABLE JWEOL +C921;C921;110C 116F 11B0;C921;110C 116F 11B0; # (줡; 줡; 줡; 줡; 줡; ) HANGUL SYLLABLE JWEOLG +C922;C922;110C 116F 11B1;C922;110C 116F 11B1; # (줢; 줢; 줢; 줢; 줢; ) HANGUL SYLLABLE JWEOLM +C923;C923;110C 116F 11B2;C923;110C 116F 11B2; # (줣; 줣; 줣; 줣; 줣; ) HANGUL SYLLABLE JWEOLB +C924;C924;110C 116F 11B3;C924;110C 116F 11B3; # (줤; 줤; 줤; 줤; 줤; ) HANGUL SYLLABLE JWEOLS +C925;C925;110C 116F 11B4;C925;110C 116F 11B4; # (줥; 줥; 줥; 줥; 줥; ) HANGUL SYLLABLE JWEOLT +C926;C926;110C 116F 11B5;C926;110C 116F 11B5; # (줦; 줦; 줦; 줦; 줦; ) HANGUL SYLLABLE JWEOLP +C927;C927;110C 116F 11B6;C927;110C 116F 11B6; # (줧; 줧; 줧; 줧; 줧; ) HANGUL SYLLABLE JWEOLH +C928;C928;110C 116F 11B7;C928;110C 116F 11B7; # (줨; 줨; 줨; 줨; 줨; ) HANGUL SYLLABLE JWEOM +C929;C929;110C 116F 11B8;C929;110C 116F 11B8; # (줩; 줩; 줩; 줩; 줩; ) HANGUL SYLLABLE JWEOB +C92A;C92A;110C 116F 11B9;C92A;110C 116F 11B9; # (줪; 줪; 줪; 줪; 줪; ) HANGUL SYLLABLE JWEOBS +C92B;C92B;110C 116F 11BA;C92B;110C 116F 11BA; # (줫; 줫; 줫; 줫; 줫; ) HANGUL SYLLABLE JWEOS +C92C;C92C;110C 116F 11BB;C92C;110C 116F 11BB; # (줬; 줬; 줬; 줬; 줬; ) HANGUL SYLLABLE JWEOSS +C92D;C92D;110C 116F 11BC;C92D;110C 116F 11BC; # (줭; 줭; 줭; 줭; 줭; ) HANGUL SYLLABLE JWEONG +C92E;C92E;110C 116F 11BD;C92E;110C 116F 11BD; # (줮; 줮; 줮; 줮; 줮; ) HANGUL SYLLABLE JWEOJ +C92F;C92F;110C 116F 11BE;C92F;110C 116F 11BE; # (줯; 줯; 줯; 줯; 줯; ) HANGUL SYLLABLE JWEOC +C930;C930;110C 116F 11BF;C930;110C 116F 11BF; # (줰; 줰; 줰; 줰; 줰; ) HANGUL SYLLABLE JWEOK +C931;C931;110C 116F 11C0;C931;110C 116F 11C0; # (줱; 줱; 줱; 줱; 줱; ) HANGUL SYLLABLE JWEOT +C932;C932;110C 116F 11C1;C932;110C 116F 11C1; # (줲; 줲; 줲; 줲; 줲; ) HANGUL SYLLABLE JWEOP +C933;C933;110C 116F 11C2;C933;110C 116F 11C2; # (줳; 줳; 줳; 줳; 줳; ) HANGUL SYLLABLE JWEOH +C934;C934;110C 1170;C934;110C 1170; # (줴; 줴; 줴; 줴; 줴; ) HANGUL SYLLABLE JWE +C935;C935;110C 1170 11A8;C935;110C 1170 11A8; # (줵; 줵; 줵; 줵; 줵; ) HANGUL SYLLABLE JWEG +C936;C936;110C 1170 11A9;C936;110C 1170 11A9; # (줶; 줶; 줶; 줶; 줶; ) HANGUL SYLLABLE JWEGG +C937;C937;110C 1170 11AA;C937;110C 1170 11AA; # (줷; 줷; 줷; 줷; 줷; ) HANGUL SYLLABLE JWEGS +C938;C938;110C 1170 11AB;C938;110C 1170 11AB; # (줸; 줸; 줸; 줸; 줸; ) HANGUL SYLLABLE JWEN +C939;C939;110C 1170 11AC;C939;110C 1170 11AC; # (줹; 줹; 줹; 줹; 줹; ) HANGUL SYLLABLE JWENJ +C93A;C93A;110C 1170 11AD;C93A;110C 1170 11AD; # (줺; 줺; 줺; 줺; 줺; ) HANGUL SYLLABLE JWENH +C93B;C93B;110C 1170 11AE;C93B;110C 1170 11AE; # (줻; 줻; 줻; 줻; 줻; ) HANGUL SYLLABLE JWED +C93C;C93C;110C 1170 11AF;C93C;110C 1170 11AF; # (줼; 줼; 줼; 줼; 줼; ) HANGUL SYLLABLE JWEL +C93D;C93D;110C 1170 11B0;C93D;110C 1170 11B0; # (줽; 줽; 줽; 줽; 줽; ) HANGUL SYLLABLE JWELG +C93E;C93E;110C 1170 11B1;C93E;110C 1170 11B1; # (줾; 줾; 줾; 줾; 줾; ) HANGUL SYLLABLE JWELM +C93F;C93F;110C 1170 11B2;C93F;110C 1170 11B2; # (줿; 줿; 줿; 줿; 줿; ) HANGUL SYLLABLE JWELB +C940;C940;110C 1170 11B3;C940;110C 1170 11B3; # (쥀; 쥀; 쥀; 쥀; 쥀; ) HANGUL SYLLABLE JWELS +C941;C941;110C 1170 11B4;C941;110C 1170 11B4; # (쥁; 쥁; 쥁; 쥁; 쥁; ) HANGUL SYLLABLE JWELT +C942;C942;110C 1170 11B5;C942;110C 1170 11B5; # (쥂; 쥂; 쥂; 쥂; 쥂; ) HANGUL SYLLABLE JWELP +C943;C943;110C 1170 11B6;C943;110C 1170 11B6; # (쥃; 쥃; 쥃; 쥃; 쥃; ) HANGUL SYLLABLE JWELH +C944;C944;110C 1170 11B7;C944;110C 1170 11B7; # (쥄; 쥄; 쥄; 쥄; 쥄; ) HANGUL SYLLABLE JWEM +C945;C945;110C 1170 11B8;C945;110C 1170 11B8; # (쥅; 쥅; 쥅; 쥅; 쥅; ) HANGUL SYLLABLE JWEB +C946;C946;110C 1170 11B9;C946;110C 1170 11B9; # (쥆; 쥆; 쥆; 쥆; 쥆; ) HANGUL SYLLABLE JWEBS +C947;C947;110C 1170 11BA;C947;110C 1170 11BA; # (쥇; 쥇; 쥇; 쥇; 쥇; ) HANGUL SYLLABLE JWES +C948;C948;110C 1170 11BB;C948;110C 1170 11BB; # (쥈; 쥈; 쥈; 쥈; 쥈; ) HANGUL SYLLABLE JWESS +C949;C949;110C 1170 11BC;C949;110C 1170 11BC; # (쥉; 쥉; 쥉; 쥉; 쥉; ) HANGUL SYLLABLE JWENG +C94A;C94A;110C 1170 11BD;C94A;110C 1170 11BD; # (쥊; 쥊; 쥊; 쥊; 쥊; ) HANGUL SYLLABLE JWEJ +C94B;C94B;110C 1170 11BE;C94B;110C 1170 11BE; # (쥋; 쥋; 쥋; 쥋; 쥋; ) HANGUL SYLLABLE JWEC +C94C;C94C;110C 1170 11BF;C94C;110C 1170 11BF; # (쥌; 쥌; 쥌; 쥌; 쥌; ) HANGUL SYLLABLE JWEK +C94D;C94D;110C 1170 11C0;C94D;110C 1170 11C0; # (쥍; 쥍; 쥍; 쥍; 쥍; ) HANGUL SYLLABLE JWET +C94E;C94E;110C 1170 11C1;C94E;110C 1170 11C1; # (쥎; 쥎; 쥎; 쥎; 쥎; ) HANGUL SYLLABLE JWEP +C94F;C94F;110C 1170 11C2;C94F;110C 1170 11C2; # (쥏; 쥏; 쥏; 쥏; 쥏; ) HANGUL SYLLABLE JWEH +C950;C950;110C 1171;C950;110C 1171; # (쥐; 쥐; 쥐; 쥐; 쥐; ) HANGUL SYLLABLE JWI +C951;C951;110C 1171 11A8;C951;110C 1171 11A8; # (쥑; 쥑; 쥑; 쥑; 쥑; ) HANGUL SYLLABLE JWIG +C952;C952;110C 1171 11A9;C952;110C 1171 11A9; # (쥒; 쥒; 쥒; 쥒; 쥒; ) HANGUL SYLLABLE JWIGG +C953;C953;110C 1171 11AA;C953;110C 1171 11AA; # (쥓; 쥓; 쥓; 쥓; 쥓; ) HANGUL SYLLABLE JWIGS +C954;C954;110C 1171 11AB;C954;110C 1171 11AB; # (쥔; 쥔; 쥔; 쥔; 쥔; ) HANGUL SYLLABLE JWIN +C955;C955;110C 1171 11AC;C955;110C 1171 11AC; # (쥕; 쥕; 쥕; 쥕; 쥕; ) HANGUL SYLLABLE JWINJ +C956;C956;110C 1171 11AD;C956;110C 1171 11AD; # (쥖; 쥖; 쥖; 쥖; 쥖; ) HANGUL SYLLABLE JWINH +C957;C957;110C 1171 11AE;C957;110C 1171 11AE; # (쥗; 쥗; 쥗; 쥗; 쥗; ) HANGUL SYLLABLE JWID +C958;C958;110C 1171 11AF;C958;110C 1171 11AF; # (쥘; 쥘; 쥘; 쥘; 쥘; ) HANGUL SYLLABLE JWIL +C959;C959;110C 1171 11B0;C959;110C 1171 11B0; # (쥙; 쥙; 쥙; 쥙; 쥙; ) HANGUL SYLLABLE JWILG +C95A;C95A;110C 1171 11B1;C95A;110C 1171 11B1; # (쥚; 쥚; 쥚; 쥚; 쥚; ) HANGUL SYLLABLE JWILM +C95B;C95B;110C 1171 11B2;C95B;110C 1171 11B2; # (쥛; 쥛; 쥛; 쥛; 쥛; ) HANGUL SYLLABLE JWILB +C95C;C95C;110C 1171 11B3;C95C;110C 1171 11B3; # (쥜; 쥜; 쥜; 쥜; 쥜; ) HANGUL SYLLABLE JWILS +C95D;C95D;110C 1171 11B4;C95D;110C 1171 11B4; # (쥝; 쥝; 쥝; 쥝; 쥝; ) HANGUL SYLLABLE JWILT +C95E;C95E;110C 1171 11B5;C95E;110C 1171 11B5; # (쥞; 쥞; 쥞; 쥞; 쥞; ) HANGUL SYLLABLE JWILP +C95F;C95F;110C 1171 11B6;C95F;110C 1171 11B6; # (쥟; 쥟; 쥟; 쥟; 쥟; ) HANGUL SYLLABLE JWILH +C960;C960;110C 1171 11B7;C960;110C 1171 11B7; # (쥠; 쥠; 쥠; 쥠; 쥠; ) HANGUL SYLLABLE JWIM +C961;C961;110C 1171 11B8;C961;110C 1171 11B8; # (쥡; 쥡; 쥡; 쥡; 쥡; ) HANGUL SYLLABLE JWIB +C962;C962;110C 1171 11B9;C962;110C 1171 11B9; # (쥢; 쥢; 쥢; 쥢; 쥢; ) HANGUL SYLLABLE JWIBS +C963;C963;110C 1171 11BA;C963;110C 1171 11BA; # (쥣; 쥣; 쥣; 쥣; 쥣; ) HANGUL SYLLABLE JWIS +C964;C964;110C 1171 11BB;C964;110C 1171 11BB; # (쥤; 쥤; 쥤; 쥤; 쥤; ) HANGUL SYLLABLE JWISS +C965;C965;110C 1171 11BC;C965;110C 1171 11BC; # (쥥; 쥥; 쥥; 쥥; 쥥; ) HANGUL SYLLABLE JWING +C966;C966;110C 1171 11BD;C966;110C 1171 11BD; # (쥦; 쥦; 쥦; 쥦; 쥦; ) HANGUL SYLLABLE JWIJ +C967;C967;110C 1171 11BE;C967;110C 1171 11BE; # (쥧; 쥧; 쥧; 쥧; 쥧; ) HANGUL SYLLABLE JWIC +C968;C968;110C 1171 11BF;C968;110C 1171 11BF; # (쥨; 쥨; 쥨; 쥨; 쥨; ) HANGUL SYLLABLE JWIK +C969;C969;110C 1171 11C0;C969;110C 1171 11C0; # (쥩; 쥩; 쥩; 쥩; 쥩; ) HANGUL SYLLABLE JWIT +C96A;C96A;110C 1171 11C1;C96A;110C 1171 11C1; # (쥪; 쥪; 쥪; 쥪; 쥪; ) HANGUL SYLLABLE JWIP +C96B;C96B;110C 1171 11C2;C96B;110C 1171 11C2; # (쥫; 쥫; 쥫; 쥫; 쥫; ) HANGUL SYLLABLE JWIH +C96C;C96C;110C 1172;C96C;110C 1172; # (쥬; 쥬; 쥬; 쥬; 쥬; ) HANGUL SYLLABLE JYU +C96D;C96D;110C 1172 11A8;C96D;110C 1172 11A8; # (쥭; 쥭; 쥭; 쥭; 쥭; ) HANGUL SYLLABLE JYUG +C96E;C96E;110C 1172 11A9;C96E;110C 1172 11A9; # (쥮; 쥮; 쥮; 쥮; 쥮; ) HANGUL SYLLABLE JYUGG +C96F;C96F;110C 1172 11AA;C96F;110C 1172 11AA; # (쥯; 쥯; 쥯; 쥯; 쥯; ) HANGUL SYLLABLE JYUGS +C970;C970;110C 1172 11AB;C970;110C 1172 11AB; # (쥰; 쥰; 쥰; 쥰; 쥰; ) HANGUL SYLLABLE JYUN +C971;C971;110C 1172 11AC;C971;110C 1172 11AC; # (쥱; 쥱; 쥱; 쥱; 쥱; ) HANGUL SYLLABLE JYUNJ +C972;C972;110C 1172 11AD;C972;110C 1172 11AD; # (쥲; 쥲; 쥲; 쥲; 쥲; ) HANGUL SYLLABLE JYUNH +C973;C973;110C 1172 11AE;C973;110C 1172 11AE; # (쥳; 쥳; 쥳; 쥳; 쥳; ) HANGUL SYLLABLE JYUD +C974;C974;110C 1172 11AF;C974;110C 1172 11AF; # (쥴; 쥴; 쥴; 쥴; 쥴; ) HANGUL SYLLABLE JYUL +C975;C975;110C 1172 11B0;C975;110C 1172 11B0; # (쥵; 쥵; 쥵; 쥵; 쥵; ) HANGUL SYLLABLE JYULG +C976;C976;110C 1172 11B1;C976;110C 1172 11B1; # (쥶; 쥶; 쥶; 쥶; 쥶; ) HANGUL SYLLABLE JYULM +C977;C977;110C 1172 11B2;C977;110C 1172 11B2; # (쥷; 쥷; 쥷; 쥷; 쥷; ) HANGUL SYLLABLE JYULB +C978;C978;110C 1172 11B3;C978;110C 1172 11B3; # (쥸; 쥸; 쥸; 쥸; 쥸; ) HANGUL SYLLABLE JYULS +C979;C979;110C 1172 11B4;C979;110C 1172 11B4; # (쥹; 쥹; 쥹; 쥹; 쥹; ) HANGUL SYLLABLE JYULT +C97A;C97A;110C 1172 11B5;C97A;110C 1172 11B5; # (쥺; 쥺; 쥺; 쥺; 쥺; ) HANGUL SYLLABLE JYULP +C97B;C97B;110C 1172 11B6;C97B;110C 1172 11B6; # (쥻; 쥻; 쥻; 쥻; 쥻; ) HANGUL SYLLABLE JYULH +C97C;C97C;110C 1172 11B7;C97C;110C 1172 11B7; # (쥼; 쥼; 쥼; 쥼; 쥼; ) HANGUL SYLLABLE JYUM +C97D;C97D;110C 1172 11B8;C97D;110C 1172 11B8; # (쥽; 쥽; 쥽; 쥽; 쥽; ) HANGUL SYLLABLE JYUB +C97E;C97E;110C 1172 11B9;C97E;110C 1172 11B9; # (쥾; 쥾; 쥾; 쥾; 쥾; ) HANGUL SYLLABLE JYUBS +C97F;C97F;110C 1172 11BA;C97F;110C 1172 11BA; # (쥿; 쥿; 쥿; 쥿; 쥿; ) HANGUL SYLLABLE JYUS +C980;C980;110C 1172 11BB;C980;110C 1172 11BB; # (즀; 즀; 즀; 즀; 즀; ) HANGUL SYLLABLE JYUSS +C981;C981;110C 1172 11BC;C981;110C 1172 11BC; # (즁; 즁; 즁; 즁; 즁; ) HANGUL SYLLABLE JYUNG +C982;C982;110C 1172 11BD;C982;110C 1172 11BD; # (즂; 즂; 즂; 즂; 즂; ) HANGUL SYLLABLE JYUJ +C983;C983;110C 1172 11BE;C983;110C 1172 11BE; # (즃; 즃; 즃; 즃; 즃; ) HANGUL SYLLABLE JYUC +C984;C984;110C 1172 11BF;C984;110C 1172 11BF; # (즄; 즄; 즄; 즄; 즄; ) HANGUL SYLLABLE JYUK +C985;C985;110C 1172 11C0;C985;110C 1172 11C0; # (즅; 즅; 즅; 즅; 즅; ) HANGUL SYLLABLE JYUT +C986;C986;110C 1172 11C1;C986;110C 1172 11C1; # (즆; 즆; 즆; 즆; 즆; ) HANGUL SYLLABLE JYUP +C987;C987;110C 1172 11C2;C987;110C 1172 11C2; # (즇; 즇; 즇; 즇; 즇; ) HANGUL SYLLABLE JYUH +C988;C988;110C 1173;C988;110C 1173; # (즈; 즈; 즈; 즈; 즈; ) HANGUL SYLLABLE JEU +C989;C989;110C 1173 11A8;C989;110C 1173 11A8; # (즉; 즉; 즉; 즉; 즉; ) HANGUL SYLLABLE JEUG +C98A;C98A;110C 1173 11A9;C98A;110C 1173 11A9; # (즊; 즊; 즊; 즊; 즊; ) HANGUL SYLLABLE JEUGG +C98B;C98B;110C 1173 11AA;C98B;110C 1173 11AA; # (즋; 즋; 즋; 즋; 즋; ) HANGUL SYLLABLE JEUGS +C98C;C98C;110C 1173 11AB;C98C;110C 1173 11AB; # (즌; 즌; 즌; 즌; 즌; ) HANGUL SYLLABLE JEUN +C98D;C98D;110C 1173 11AC;C98D;110C 1173 11AC; # (즍; 즍; 즍; 즍; 즍; ) HANGUL SYLLABLE JEUNJ +C98E;C98E;110C 1173 11AD;C98E;110C 1173 11AD; # (즎; 즎; 즎; 즎; 즎; ) HANGUL SYLLABLE JEUNH +C98F;C98F;110C 1173 11AE;C98F;110C 1173 11AE; # (즏; 즏; 즏; 즏; 즏; ) HANGUL SYLLABLE JEUD +C990;C990;110C 1173 11AF;C990;110C 1173 11AF; # (즐; 즐; 즐; 즐; 즐; ) HANGUL SYLLABLE JEUL +C991;C991;110C 1173 11B0;C991;110C 1173 11B0; # (즑; 즑; 즑; 즑; 즑; ) HANGUL SYLLABLE JEULG +C992;C992;110C 1173 11B1;C992;110C 1173 11B1; # (즒; 즒; 즒; 즒; 즒; ) HANGUL SYLLABLE JEULM +C993;C993;110C 1173 11B2;C993;110C 1173 11B2; # (즓; 즓; 즓; 즓; 즓; ) HANGUL SYLLABLE JEULB +C994;C994;110C 1173 11B3;C994;110C 1173 11B3; # (즔; 즔; 즔; 즔; 즔; ) HANGUL SYLLABLE JEULS +C995;C995;110C 1173 11B4;C995;110C 1173 11B4; # (즕; 즕; 즕; 즕; 즕; ) HANGUL SYLLABLE JEULT +C996;C996;110C 1173 11B5;C996;110C 1173 11B5; # (즖; 즖; 즖; 즖; 즖; ) HANGUL SYLLABLE JEULP +C997;C997;110C 1173 11B6;C997;110C 1173 11B6; # (즗; 즗; 즗; 즗; 즗; ) HANGUL SYLLABLE JEULH +C998;C998;110C 1173 11B7;C998;110C 1173 11B7; # (즘; 즘; 즘; 즘; 즘; ) HANGUL SYLLABLE JEUM +C999;C999;110C 1173 11B8;C999;110C 1173 11B8; # (즙; 즙; 즙; 즙; 즙; ) HANGUL SYLLABLE JEUB +C99A;C99A;110C 1173 11B9;C99A;110C 1173 11B9; # (즚; 즚; 즚; 즚; 즚; ) HANGUL SYLLABLE JEUBS +C99B;C99B;110C 1173 11BA;C99B;110C 1173 11BA; # (즛; 즛; 즛; 즛; 즛; ) HANGUL SYLLABLE JEUS +C99C;C99C;110C 1173 11BB;C99C;110C 1173 11BB; # (즜; 즜; 즜; 즜; 즜; ) HANGUL SYLLABLE JEUSS +C99D;C99D;110C 1173 11BC;C99D;110C 1173 11BC; # (증; 증; 증; 증; 증; ) HANGUL SYLLABLE JEUNG +C99E;C99E;110C 1173 11BD;C99E;110C 1173 11BD; # (즞; 즞; 즞; 즞; 즞; ) HANGUL SYLLABLE JEUJ +C99F;C99F;110C 1173 11BE;C99F;110C 1173 11BE; # (즟; 즟; 즟; 즟; 즟; ) HANGUL SYLLABLE JEUC +C9A0;C9A0;110C 1173 11BF;C9A0;110C 1173 11BF; # (즠; 즠; 즠; 즠; 즠; ) HANGUL SYLLABLE JEUK +C9A1;C9A1;110C 1173 11C0;C9A1;110C 1173 11C0; # (즡; 즡; 즡; 즡; 즡; ) HANGUL SYLLABLE JEUT +C9A2;C9A2;110C 1173 11C1;C9A2;110C 1173 11C1; # (즢; 즢; 즢; 즢; 즢; ) HANGUL SYLLABLE JEUP +C9A3;C9A3;110C 1173 11C2;C9A3;110C 1173 11C2; # (즣; 즣; 즣; 즣; 즣; ) HANGUL SYLLABLE JEUH +C9A4;C9A4;110C 1174;C9A4;110C 1174; # (즤; 즤; 즤; 즤; 즤; ) HANGUL SYLLABLE JYI +C9A5;C9A5;110C 1174 11A8;C9A5;110C 1174 11A8; # (즥; 즥; 즥; 즥; 즥; ) HANGUL SYLLABLE JYIG +C9A6;C9A6;110C 1174 11A9;C9A6;110C 1174 11A9; # (즦; 즦; 즦; 즦; 즦; ) HANGUL SYLLABLE JYIGG +C9A7;C9A7;110C 1174 11AA;C9A7;110C 1174 11AA; # (즧; 즧; 즧; 즧; 즧; ) HANGUL SYLLABLE JYIGS +C9A8;C9A8;110C 1174 11AB;C9A8;110C 1174 11AB; # (즨; 즨; 즨; 즨; 즨; ) HANGUL SYLLABLE JYIN +C9A9;C9A9;110C 1174 11AC;C9A9;110C 1174 11AC; # (즩; 즩; 즩; 즩; 즩; ) HANGUL SYLLABLE JYINJ +C9AA;C9AA;110C 1174 11AD;C9AA;110C 1174 11AD; # (즪; 즪; 즪; 즪; 즪; ) HANGUL SYLLABLE JYINH +C9AB;C9AB;110C 1174 11AE;C9AB;110C 1174 11AE; # (즫; 즫; 즫; 즫; 즫; ) HANGUL SYLLABLE JYID +C9AC;C9AC;110C 1174 11AF;C9AC;110C 1174 11AF; # (즬; 즬; 즬; 즬; 즬; ) HANGUL SYLLABLE JYIL +C9AD;C9AD;110C 1174 11B0;C9AD;110C 1174 11B0; # (즭; 즭; 즭; 즭; 즭; ) HANGUL SYLLABLE JYILG +C9AE;C9AE;110C 1174 11B1;C9AE;110C 1174 11B1; # (즮; 즮; 즮; 즮; 즮; ) HANGUL SYLLABLE JYILM +C9AF;C9AF;110C 1174 11B2;C9AF;110C 1174 11B2; # (즯; 즯; 즯; 즯; 즯; ) HANGUL SYLLABLE JYILB +C9B0;C9B0;110C 1174 11B3;C9B0;110C 1174 11B3; # (즰; 즰; 즰; 즰; 즰; ) HANGUL SYLLABLE JYILS +C9B1;C9B1;110C 1174 11B4;C9B1;110C 1174 11B4; # (즱; 즱; 즱; 즱; 즱; ) HANGUL SYLLABLE JYILT +C9B2;C9B2;110C 1174 11B5;C9B2;110C 1174 11B5; # (즲; 즲; 즲; 즲; 즲; ) HANGUL SYLLABLE JYILP +C9B3;C9B3;110C 1174 11B6;C9B3;110C 1174 11B6; # (즳; 즳; 즳; 즳; 즳; ) HANGUL SYLLABLE JYILH +C9B4;C9B4;110C 1174 11B7;C9B4;110C 1174 11B7; # (즴; 즴; 즴; 즴; 즴; ) HANGUL SYLLABLE JYIM +C9B5;C9B5;110C 1174 11B8;C9B5;110C 1174 11B8; # (즵; 즵; 즵; 즵; 즵; ) HANGUL SYLLABLE JYIB +C9B6;C9B6;110C 1174 11B9;C9B6;110C 1174 11B9; # (즶; 즶; 즶; 즶; 즶; ) HANGUL SYLLABLE JYIBS +C9B7;C9B7;110C 1174 11BA;C9B7;110C 1174 11BA; # (즷; 즷; 즷; 즷; 즷; ) HANGUL SYLLABLE JYIS +C9B8;C9B8;110C 1174 11BB;C9B8;110C 1174 11BB; # (즸; 즸; 즸; 즸; 즸; ) HANGUL SYLLABLE JYISS +C9B9;C9B9;110C 1174 11BC;C9B9;110C 1174 11BC; # (즹; 즹; 즹; 즹; 즹; ) HANGUL SYLLABLE JYING +C9BA;C9BA;110C 1174 11BD;C9BA;110C 1174 11BD; # (즺; 즺; 즺; 즺; 즺; ) HANGUL SYLLABLE JYIJ +C9BB;C9BB;110C 1174 11BE;C9BB;110C 1174 11BE; # (즻; 즻; 즻; 즻; 즻; ) HANGUL SYLLABLE JYIC +C9BC;C9BC;110C 1174 11BF;C9BC;110C 1174 11BF; # (즼; 즼; 즼; 즼; 즼; ) HANGUL SYLLABLE JYIK +C9BD;C9BD;110C 1174 11C0;C9BD;110C 1174 11C0; # (즽; 즽; 즽; 즽; 즽; ) HANGUL SYLLABLE JYIT +C9BE;C9BE;110C 1174 11C1;C9BE;110C 1174 11C1; # (즾; 즾; 즾; 즾; 즾; ) HANGUL SYLLABLE JYIP +C9BF;C9BF;110C 1174 11C2;C9BF;110C 1174 11C2; # (즿; 즿; 즿; 즿; 즿; ) HANGUL SYLLABLE JYIH +C9C0;C9C0;110C 1175;C9C0;110C 1175; # (지; 지; 지; 지; 지; ) HANGUL SYLLABLE JI +C9C1;C9C1;110C 1175 11A8;C9C1;110C 1175 11A8; # (직; 직; 직; 직; 직; ) HANGUL SYLLABLE JIG +C9C2;C9C2;110C 1175 11A9;C9C2;110C 1175 11A9; # (짂; 짂; 짂; 짂; 짂; ) HANGUL SYLLABLE JIGG +C9C3;C9C3;110C 1175 11AA;C9C3;110C 1175 11AA; # (짃; 짃; 짃; 짃; 짃; ) HANGUL SYLLABLE JIGS +C9C4;C9C4;110C 1175 11AB;C9C4;110C 1175 11AB; # (진; 진; 진; 진; 진; ) HANGUL SYLLABLE JIN +C9C5;C9C5;110C 1175 11AC;C9C5;110C 1175 11AC; # (짅; 짅; 짅; 짅; 짅; ) HANGUL SYLLABLE JINJ +C9C6;C9C6;110C 1175 11AD;C9C6;110C 1175 11AD; # (짆; 짆; 짆; 짆; 짆; ) HANGUL SYLLABLE JINH +C9C7;C9C7;110C 1175 11AE;C9C7;110C 1175 11AE; # (짇; 짇; 짇; 짇; 짇; ) HANGUL SYLLABLE JID +C9C8;C9C8;110C 1175 11AF;C9C8;110C 1175 11AF; # (질; 질; 질; 질; 질; ) HANGUL SYLLABLE JIL +C9C9;C9C9;110C 1175 11B0;C9C9;110C 1175 11B0; # (짉; 짉; 짉; 짉; 짉; ) HANGUL SYLLABLE JILG +C9CA;C9CA;110C 1175 11B1;C9CA;110C 1175 11B1; # (짊; 짊; 짊; 짊; 짊; ) HANGUL SYLLABLE JILM +C9CB;C9CB;110C 1175 11B2;C9CB;110C 1175 11B2; # (짋; 짋; 짋; 짋; 짋; ) HANGUL SYLLABLE JILB +C9CC;C9CC;110C 1175 11B3;C9CC;110C 1175 11B3; # (짌; 짌; 짌; 짌; 짌; ) HANGUL SYLLABLE JILS +C9CD;C9CD;110C 1175 11B4;C9CD;110C 1175 11B4; # (짍; 짍; 짍; 짍; 짍; ) HANGUL SYLLABLE JILT +C9CE;C9CE;110C 1175 11B5;C9CE;110C 1175 11B5; # (짎; 짎; 짎; 짎; 짎; ) HANGUL SYLLABLE JILP +C9CF;C9CF;110C 1175 11B6;C9CF;110C 1175 11B6; # (짏; 짏; 짏; 짏; 짏; ) HANGUL SYLLABLE JILH +C9D0;C9D0;110C 1175 11B7;C9D0;110C 1175 11B7; # (짐; 짐; 짐; 짐; 짐; ) HANGUL SYLLABLE JIM +C9D1;C9D1;110C 1175 11B8;C9D1;110C 1175 11B8; # (집; 집; 집; 집; 집; ) HANGUL SYLLABLE JIB +C9D2;C9D2;110C 1175 11B9;C9D2;110C 1175 11B9; # (짒; 짒; 짒; 짒; 짒; ) HANGUL SYLLABLE JIBS +C9D3;C9D3;110C 1175 11BA;C9D3;110C 1175 11BA; # (짓; 짓; 짓; 짓; 짓; ) HANGUL SYLLABLE JIS +C9D4;C9D4;110C 1175 11BB;C9D4;110C 1175 11BB; # (짔; 짔; 짔; 짔; 짔; ) HANGUL SYLLABLE JISS +C9D5;C9D5;110C 1175 11BC;C9D5;110C 1175 11BC; # (징; 징; 징; 징; 징; ) HANGUL SYLLABLE JING +C9D6;C9D6;110C 1175 11BD;C9D6;110C 1175 11BD; # (짖; 짖; 짖; 짖; 짖; ) HANGUL SYLLABLE JIJ +C9D7;C9D7;110C 1175 11BE;C9D7;110C 1175 11BE; # (짗; 짗; 짗; 짗; 짗; ) HANGUL SYLLABLE JIC +C9D8;C9D8;110C 1175 11BF;C9D8;110C 1175 11BF; # (짘; 짘; 짘; 짘; 짘; ) HANGUL SYLLABLE JIK +C9D9;C9D9;110C 1175 11C0;C9D9;110C 1175 11C0; # (짙; 짙; 짙; 짙; 짙; ) HANGUL SYLLABLE JIT +C9DA;C9DA;110C 1175 11C1;C9DA;110C 1175 11C1; # (짚; 짚; 짚; 짚; 짚; ) HANGUL SYLLABLE JIP +C9DB;C9DB;110C 1175 11C2;C9DB;110C 1175 11C2; # (짛; 짛; 짛; 짛; 짛; ) HANGUL SYLLABLE JIH +C9DC;C9DC;110D 1161;C9DC;110D 1161; # (짜; 짜; 짜; 짜; 짜; ) HANGUL SYLLABLE JJA +C9DD;C9DD;110D 1161 11A8;C9DD;110D 1161 11A8; # (짝; 짝; 짝; 짝; 짝; ) HANGUL SYLLABLE JJAG +C9DE;C9DE;110D 1161 11A9;C9DE;110D 1161 11A9; # (짞; 짞; 짞; 짞; 짞; ) HANGUL SYLLABLE JJAGG +C9DF;C9DF;110D 1161 11AA;C9DF;110D 1161 11AA; # (짟; 짟; 짟; 짟; 짟; ) HANGUL SYLLABLE JJAGS +C9E0;C9E0;110D 1161 11AB;C9E0;110D 1161 11AB; # (짠; 짠; 짠; 짠; 짠; ) HANGUL SYLLABLE JJAN +C9E1;C9E1;110D 1161 11AC;C9E1;110D 1161 11AC; # (짡; 짡; 짡; 짡; 짡; ) HANGUL SYLLABLE JJANJ +C9E2;C9E2;110D 1161 11AD;C9E2;110D 1161 11AD; # (짢; 짢; 짢; 짢; 짢; ) HANGUL SYLLABLE JJANH +C9E3;C9E3;110D 1161 11AE;C9E3;110D 1161 11AE; # (짣; 짣; 짣; 짣; 짣; ) HANGUL SYLLABLE JJAD +C9E4;C9E4;110D 1161 11AF;C9E4;110D 1161 11AF; # (짤; 짤; 짤; 짤; 짤; ) HANGUL SYLLABLE JJAL +C9E5;C9E5;110D 1161 11B0;C9E5;110D 1161 11B0; # (짥; 짥; 짥; 짥; 짥; ) HANGUL SYLLABLE JJALG +C9E6;C9E6;110D 1161 11B1;C9E6;110D 1161 11B1; # (짦; 짦; 짦; 짦; 짦; ) HANGUL SYLLABLE JJALM +C9E7;C9E7;110D 1161 11B2;C9E7;110D 1161 11B2; # (짧; 짧; 짧; 짧; 짧; ) HANGUL SYLLABLE JJALB +C9E8;C9E8;110D 1161 11B3;C9E8;110D 1161 11B3; # (짨; 짨; 짨; 짨; 짨; ) HANGUL SYLLABLE JJALS +C9E9;C9E9;110D 1161 11B4;C9E9;110D 1161 11B4; # (짩; 짩; 짩; 짩; 짩; ) HANGUL SYLLABLE JJALT +C9EA;C9EA;110D 1161 11B5;C9EA;110D 1161 11B5; # (짪; 짪; 짪; 짪; 짪; ) HANGUL SYLLABLE JJALP +C9EB;C9EB;110D 1161 11B6;C9EB;110D 1161 11B6; # (짫; 짫; 짫; 짫; 짫; ) HANGUL SYLLABLE JJALH +C9EC;C9EC;110D 1161 11B7;C9EC;110D 1161 11B7; # (짬; 짬; 짬; 짬; 짬; ) HANGUL SYLLABLE JJAM +C9ED;C9ED;110D 1161 11B8;C9ED;110D 1161 11B8; # (짭; 짭; 짭; 짭; 짭; ) HANGUL SYLLABLE JJAB +C9EE;C9EE;110D 1161 11B9;C9EE;110D 1161 11B9; # (짮; 짮; 짮; 짮; 짮; ) HANGUL SYLLABLE JJABS +C9EF;C9EF;110D 1161 11BA;C9EF;110D 1161 11BA; # (짯; 짯; 짯; 짯; 짯; ) HANGUL SYLLABLE JJAS +C9F0;C9F0;110D 1161 11BB;C9F0;110D 1161 11BB; # (짰; 짰; 짰; 짰; 짰; ) HANGUL SYLLABLE JJASS +C9F1;C9F1;110D 1161 11BC;C9F1;110D 1161 11BC; # (짱; 짱; 짱; 짱; 짱; ) HANGUL SYLLABLE JJANG +C9F2;C9F2;110D 1161 11BD;C9F2;110D 1161 11BD; # (짲; 짲; 짲; 짲; 짲; ) HANGUL SYLLABLE JJAJ +C9F3;C9F3;110D 1161 11BE;C9F3;110D 1161 11BE; # (짳; 짳; 짳; 짳; 짳; ) HANGUL SYLLABLE JJAC +C9F4;C9F4;110D 1161 11BF;C9F4;110D 1161 11BF; # (짴; 짴; 짴; 짴; 짴; ) HANGUL SYLLABLE JJAK +C9F5;C9F5;110D 1161 11C0;C9F5;110D 1161 11C0; # (짵; 짵; 짵; 짵; 짵; ) HANGUL SYLLABLE JJAT +C9F6;C9F6;110D 1161 11C1;C9F6;110D 1161 11C1; # (짶; 짶; 짶; 짶; 짶; ) HANGUL SYLLABLE JJAP +C9F7;C9F7;110D 1161 11C2;C9F7;110D 1161 11C2; # (짷; 짷; 짷; 짷; 짷; ) HANGUL SYLLABLE JJAH +C9F8;C9F8;110D 1162;C9F8;110D 1162; # (째; 째; 째; 째; 째; ) HANGUL SYLLABLE JJAE +C9F9;C9F9;110D 1162 11A8;C9F9;110D 1162 11A8; # (짹; 짹; 짹; 짹; 짹; ) HANGUL SYLLABLE JJAEG +C9FA;C9FA;110D 1162 11A9;C9FA;110D 1162 11A9; # (짺; 짺; 짺; 짺; 짺; ) HANGUL SYLLABLE JJAEGG +C9FB;C9FB;110D 1162 11AA;C9FB;110D 1162 11AA; # (짻; 짻; 짻; 짻; 짻; ) HANGUL SYLLABLE JJAEGS +C9FC;C9FC;110D 1162 11AB;C9FC;110D 1162 11AB; # (짼; 짼; 짼; 짼; 짼; ) HANGUL SYLLABLE JJAEN +C9FD;C9FD;110D 1162 11AC;C9FD;110D 1162 11AC; # (짽; 짽; 짽; 짽; 짽; ) HANGUL SYLLABLE JJAENJ +C9FE;C9FE;110D 1162 11AD;C9FE;110D 1162 11AD; # (짾; 짾; 짾; 짾; 짾; ) HANGUL SYLLABLE JJAENH +C9FF;C9FF;110D 1162 11AE;C9FF;110D 1162 11AE; # (짿; 짿; 짿; 짿; 짿; ) HANGUL SYLLABLE JJAED +CA00;CA00;110D 1162 11AF;CA00;110D 1162 11AF; # (쨀; 쨀; 쨀; 쨀; 쨀; ) HANGUL SYLLABLE JJAEL +CA01;CA01;110D 1162 11B0;CA01;110D 1162 11B0; # (쨁; 쨁; 쨁; 쨁; 쨁; ) HANGUL SYLLABLE JJAELG +CA02;CA02;110D 1162 11B1;CA02;110D 1162 11B1; # (쨂; 쨂; 쨂; 쨂; 쨂; ) HANGUL SYLLABLE JJAELM +CA03;CA03;110D 1162 11B2;CA03;110D 1162 11B2; # (쨃; 쨃; 쨃; 쨃; 쨃; ) HANGUL SYLLABLE JJAELB +CA04;CA04;110D 1162 11B3;CA04;110D 1162 11B3; # (쨄; 쨄; 쨄; 쨄; 쨄; ) HANGUL SYLLABLE JJAELS +CA05;CA05;110D 1162 11B4;CA05;110D 1162 11B4; # (쨅; 쨅; 쨅; 쨅; 쨅; ) HANGUL SYLLABLE JJAELT +CA06;CA06;110D 1162 11B5;CA06;110D 1162 11B5; # (쨆; 쨆; 쨆; 쨆; 쨆; ) HANGUL SYLLABLE JJAELP +CA07;CA07;110D 1162 11B6;CA07;110D 1162 11B6; # (쨇; 쨇; 쨇; 쨇; 쨇; ) HANGUL SYLLABLE JJAELH +CA08;CA08;110D 1162 11B7;CA08;110D 1162 11B7; # (쨈; 쨈; 쨈; 쨈; 쨈; ) HANGUL SYLLABLE JJAEM +CA09;CA09;110D 1162 11B8;CA09;110D 1162 11B8; # (쨉; 쨉; 쨉; 쨉; 쨉; ) HANGUL SYLLABLE JJAEB +CA0A;CA0A;110D 1162 11B9;CA0A;110D 1162 11B9; # (쨊; 쨊; 쨊; 쨊; 쨊; ) HANGUL SYLLABLE JJAEBS +CA0B;CA0B;110D 1162 11BA;CA0B;110D 1162 11BA; # (쨋; 쨋; 쨋; 쨋; 쨋; ) HANGUL SYLLABLE JJAES +CA0C;CA0C;110D 1162 11BB;CA0C;110D 1162 11BB; # (쨌; 쨌; 쨌; 쨌; 쨌; ) HANGUL SYLLABLE JJAESS +CA0D;CA0D;110D 1162 11BC;CA0D;110D 1162 11BC; # (쨍; 쨍; 쨍; 쨍; 쨍; ) HANGUL SYLLABLE JJAENG +CA0E;CA0E;110D 1162 11BD;CA0E;110D 1162 11BD; # (쨎; 쨎; 쨎; 쨎; 쨎; ) HANGUL SYLLABLE JJAEJ +CA0F;CA0F;110D 1162 11BE;CA0F;110D 1162 11BE; # (쨏; 쨏; 쨏; 쨏; 쨏; ) HANGUL SYLLABLE JJAEC +CA10;CA10;110D 1162 11BF;CA10;110D 1162 11BF; # (쨐; 쨐; 쨐; 쨐; 쨐; ) HANGUL SYLLABLE JJAEK +CA11;CA11;110D 1162 11C0;CA11;110D 1162 11C0; # (쨑; 쨑; 쨑; 쨑; 쨑; ) HANGUL SYLLABLE JJAET +CA12;CA12;110D 1162 11C1;CA12;110D 1162 11C1; # (쨒; 쨒; 쨒; 쨒; 쨒; ) HANGUL SYLLABLE JJAEP +CA13;CA13;110D 1162 11C2;CA13;110D 1162 11C2; # (쨓; 쨓; 쨓; 쨓; 쨓; ) HANGUL SYLLABLE JJAEH +CA14;CA14;110D 1163;CA14;110D 1163; # (쨔; 쨔; 쨔; 쨔; 쨔; ) HANGUL SYLLABLE JJYA +CA15;CA15;110D 1163 11A8;CA15;110D 1163 11A8; # (쨕; 쨕; 쨕; 쨕; 쨕; ) HANGUL SYLLABLE JJYAG +CA16;CA16;110D 1163 11A9;CA16;110D 1163 11A9; # (쨖; 쨖; 쨖; 쨖; 쨖; ) HANGUL SYLLABLE JJYAGG +CA17;CA17;110D 1163 11AA;CA17;110D 1163 11AA; # (쨗; 쨗; 쨗; 쨗; 쨗; ) HANGUL SYLLABLE JJYAGS +CA18;CA18;110D 1163 11AB;CA18;110D 1163 11AB; # (쨘; 쨘; 쨘; 쨘; 쨘; ) HANGUL SYLLABLE JJYAN +CA19;CA19;110D 1163 11AC;CA19;110D 1163 11AC; # (쨙; 쨙; 쨙; 쨙; 쨙; ) HANGUL SYLLABLE JJYANJ +CA1A;CA1A;110D 1163 11AD;CA1A;110D 1163 11AD; # (쨚; 쨚; 쨚; 쨚; 쨚; ) HANGUL SYLLABLE JJYANH +CA1B;CA1B;110D 1163 11AE;CA1B;110D 1163 11AE; # (쨛; 쨛; 쨛; 쨛; 쨛; ) HANGUL SYLLABLE JJYAD +CA1C;CA1C;110D 1163 11AF;CA1C;110D 1163 11AF; # (쨜; 쨜; 쨜; 쨜; 쨜; ) HANGUL SYLLABLE JJYAL +CA1D;CA1D;110D 1163 11B0;CA1D;110D 1163 11B0; # (쨝; 쨝; 쨝; 쨝; 쨝; ) HANGUL SYLLABLE JJYALG +CA1E;CA1E;110D 1163 11B1;CA1E;110D 1163 11B1; # (쨞; 쨞; 쨞; 쨞; 쨞; ) HANGUL SYLLABLE JJYALM +CA1F;CA1F;110D 1163 11B2;CA1F;110D 1163 11B2; # (쨟; 쨟; 쨟; 쨟; 쨟; ) HANGUL SYLLABLE JJYALB +CA20;CA20;110D 1163 11B3;CA20;110D 1163 11B3; # (쨠; 쨠; 쨠; 쨠; 쨠; ) HANGUL SYLLABLE JJYALS +CA21;CA21;110D 1163 11B4;CA21;110D 1163 11B4; # (쨡; 쨡; 쨡; 쨡; 쨡; ) HANGUL SYLLABLE JJYALT +CA22;CA22;110D 1163 11B5;CA22;110D 1163 11B5; # (쨢; 쨢; 쨢; 쨢; 쨢; ) HANGUL SYLLABLE JJYALP +CA23;CA23;110D 1163 11B6;CA23;110D 1163 11B6; # (쨣; 쨣; 쨣; 쨣; 쨣; ) HANGUL SYLLABLE JJYALH +CA24;CA24;110D 1163 11B7;CA24;110D 1163 11B7; # (쨤; 쨤; 쨤; 쨤; 쨤; ) HANGUL SYLLABLE JJYAM +CA25;CA25;110D 1163 11B8;CA25;110D 1163 11B8; # (쨥; 쨥; 쨥; 쨥; 쨥; ) HANGUL SYLLABLE JJYAB +CA26;CA26;110D 1163 11B9;CA26;110D 1163 11B9; # (쨦; 쨦; 쨦; 쨦; 쨦; ) HANGUL SYLLABLE JJYABS +CA27;CA27;110D 1163 11BA;CA27;110D 1163 11BA; # (쨧; 쨧; 쨧; 쨧; 쨧; ) HANGUL SYLLABLE JJYAS +CA28;CA28;110D 1163 11BB;CA28;110D 1163 11BB; # (쨨; 쨨; 쨨; 쨨; 쨨; ) HANGUL SYLLABLE JJYASS +CA29;CA29;110D 1163 11BC;CA29;110D 1163 11BC; # (쨩; 쨩; 쨩; 쨩; 쨩; ) HANGUL SYLLABLE JJYANG +CA2A;CA2A;110D 1163 11BD;CA2A;110D 1163 11BD; # (쨪; 쨪; 쨪; 쨪; 쨪; ) HANGUL SYLLABLE JJYAJ +CA2B;CA2B;110D 1163 11BE;CA2B;110D 1163 11BE; # (쨫; 쨫; 쨫; 쨫; 쨫; ) HANGUL SYLLABLE JJYAC +CA2C;CA2C;110D 1163 11BF;CA2C;110D 1163 11BF; # (쨬; 쨬; 쨬; 쨬; 쨬; ) HANGUL SYLLABLE JJYAK +CA2D;CA2D;110D 1163 11C0;CA2D;110D 1163 11C0; # (쨭; 쨭; 쨭; 쨭; 쨭; ) HANGUL SYLLABLE JJYAT +CA2E;CA2E;110D 1163 11C1;CA2E;110D 1163 11C1; # (쨮; 쨮; 쨮; 쨮; 쨮; ) HANGUL SYLLABLE JJYAP +CA2F;CA2F;110D 1163 11C2;CA2F;110D 1163 11C2; # (쨯; 쨯; 쨯; 쨯; 쨯; ) HANGUL SYLLABLE JJYAH +CA30;CA30;110D 1164;CA30;110D 1164; # (쨰; 쨰; 쨰; 쨰; 쨰; ) HANGUL SYLLABLE JJYAE +CA31;CA31;110D 1164 11A8;CA31;110D 1164 11A8; # (쨱; 쨱; 쨱; 쨱; 쨱; ) HANGUL SYLLABLE JJYAEG +CA32;CA32;110D 1164 11A9;CA32;110D 1164 11A9; # (쨲; 쨲; 쨲; 쨲; 쨲; ) HANGUL SYLLABLE JJYAEGG +CA33;CA33;110D 1164 11AA;CA33;110D 1164 11AA; # (쨳; 쨳; 쨳; 쨳; 쨳; ) HANGUL SYLLABLE JJYAEGS +CA34;CA34;110D 1164 11AB;CA34;110D 1164 11AB; # (쨴; 쨴; 쨴; 쨴; 쨴; ) HANGUL SYLLABLE JJYAEN +CA35;CA35;110D 1164 11AC;CA35;110D 1164 11AC; # (쨵; 쨵; 쨵; 쨵; 쨵; ) HANGUL SYLLABLE JJYAENJ +CA36;CA36;110D 1164 11AD;CA36;110D 1164 11AD; # (쨶; 쨶; 쨶; 쨶; 쨶; ) HANGUL SYLLABLE JJYAENH +CA37;CA37;110D 1164 11AE;CA37;110D 1164 11AE; # (쨷; 쨷; 쨷; 쨷; 쨷; ) HANGUL SYLLABLE JJYAED +CA38;CA38;110D 1164 11AF;CA38;110D 1164 11AF; # (쨸; 쨸; 쨸; 쨸; 쨸; ) HANGUL SYLLABLE JJYAEL +CA39;CA39;110D 1164 11B0;CA39;110D 1164 11B0; # (쨹; 쨹; 쨹; 쨹; 쨹; ) HANGUL SYLLABLE JJYAELG +CA3A;CA3A;110D 1164 11B1;CA3A;110D 1164 11B1; # (쨺; 쨺; 쨺; 쨺; 쨺; ) HANGUL SYLLABLE JJYAELM +CA3B;CA3B;110D 1164 11B2;CA3B;110D 1164 11B2; # (쨻; 쨻; 쨻; 쨻; 쨻; ) HANGUL SYLLABLE JJYAELB +CA3C;CA3C;110D 1164 11B3;CA3C;110D 1164 11B3; # (쨼; 쨼; 쨼; 쨼; 쨼; ) HANGUL SYLLABLE JJYAELS +CA3D;CA3D;110D 1164 11B4;CA3D;110D 1164 11B4; # (쨽; 쨽; 쨽; 쨽; 쨽; ) HANGUL SYLLABLE JJYAELT +CA3E;CA3E;110D 1164 11B5;CA3E;110D 1164 11B5; # (쨾; 쨾; 쨾; 쨾; 쨾; ) HANGUL SYLLABLE JJYAELP +CA3F;CA3F;110D 1164 11B6;CA3F;110D 1164 11B6; # (쨿; 쨿; 쨿; 쨿; 쨿; ) HANGUL SYLLABLE JJYAELH +CA40;CA40;110D 1164 11B7;CA40;110D 1164 11B7; # (쩀; 쩀; 쩀; 쩀; 쩀; ) HANGUL SYLLABLE JJYAEM +CA41;CA41;110D 1164 11B8;CA41;110D 1164 11B8; # (쩁; 쩁; 쩁; 쩁; 쩁; ) HANGUL SYLLABLE JJYAEB +CA42;CA42;110D 1164 11B9;CA42;110D 1164 11B9; # (쩂; 쩂; 쩂; 쩂; 쩂; ) HANGUL SYLLABLE JJYAEBS +CA43;CA43;110D 1164 11BA;CA43;110D 1164 11BA; # (쩃; 쩃; 쩃; 쩃; 쩃; ) HANGUL SYLLABLE JJYAES +CA44;CA44;110D 1164 11BB;CA44;110D 1164 11BB; # (쩄; 쩄; 쩄; 쩄; 쩄; ) HANGUL SYLLABLE JJYAESS +CA45;CA45;110D 1164 11BC;CA45;110D 1164 11BC; # (쩅; 쩅; 쩅; 쩅; 쩅; ) HANGUL SYLLABLE JJYAENG +CA46;CA46;110D 1164 11BD;CA46;110D 1164 11BD; # (쩆; 쩆; 쩆; 쩆; 쩆; ) HANGUL SYLLABLE JJYAEJ +CA47;CA47;110D 1164 11BE;CA47;110D 1164 11BE; # (쩇; 쩇; 쩇; 쩇; 쩇; ) HANGUL SYLLABLE JJYAEC +CA48;CA48;110D 1164 11BF;CA48;110D 1164 11BF; # (쩈; 쩈; 쩈; 쩈; 쩈; ) HANGUL SYLLABLE JJYAEK +CA49;CA49;110D 1164 11C0;CA49;110D 1164 11C0; # (쩉; 쩉; 쩉; 쩉; 쩉; ) HANGUL SYLLABLE JJYAET +CA4A;CA4A;110D 1164 11C1;CA4A;110D 1164 11C1; # (쩊; 쩊; 쩊; 쩊; 쩊; ) HANGUL SYLLABLE JJYAEP +CA4B;CA4B;110D 1164 11C2;CA4B;110D 1164 11C2; # (쩋; 쩋; 쩋; 쩋; 쩋; ) HANGUL SYLLABLE JJYAEH +CA4C;CA4C;110D 1165;CA4C;110D 1165; # (쩌; 쩌; 쩌; 쩌; 쩌; ) HANGUL SYLLABLE JJEO +CA4D;CA4D;110D 1165 11A8;CA4D;110D 1165 11A8; # (쩍; 쩍; 쩍; 쩍; 쩍; ) HANGUL SYLLABLE JJEOG +CA4E;CA4E;110D 1165 11A9;CA4E;110D 1165 11A9; # (쩎; 쩎; 쩎; 쩎; 쩎; ) HANGUL SYLLABLE JJEOGG +CA4F;CA4F;110D 1165 11AA;CA4F;110D 1165 11AA; # (쩏; 쩏; 쩏; 쩏; 쩏; ) HANGUL SYLLABLE JJEOGS +CA50;CA50;110D 1165 11AB;CA50;110D 1165 11AB; # (쩐; 쩐; 쩐; 쩐; 쩐; ) HANGUL SYLLABLE JJEON +CA51;CA51;110D 1165 11AC;CA51;110D 1165 11AC; # (쩑; 쩑; 쩑; 쩑; 쩑; ) HANGUL SYLLABLE JJEONJ +CA52;CA52;110D 1165 11AD;CA52;110D 1165 11AD; # (쩒; 쩒; 쩒; 쩒; 쩒; ) HANGUL SYLLABLE JJEONH +CA53;CA53;110D 1165 11AE;CA53;110D 1165 11AE; # (쩓; 쩓; 쩓; 쩓; 쩓; ) HANGUL SYLLABLE JJEOD +CA54;CA54;110D 1165 11AF;CA54;110D 1165 11AF; # (쩔; 쩔; 쩔; 쩔; 쩔; ) HANGUL SYLLABLE JJEOL +CA55;CA55;110D 1165 11B0;CA55;110D 1165 11B0; # (쩕; 쩕; 쩕; 쩕; 쩕; ) HANGUL SYLLABLE JJEOLG +CA56;CA56;110D 1165 11B1;CA56;110D 1165 11B1; # (쩖; 쩖; 쩖; 쩖; 쩖; ) HANGUL SYLLABLE JJEOLM +CA57;CA57;110D 1165 11B2;CA57;110D 1165 11B2; # (쩗; 쩗; 쩗; 쩗; 쩗; ) HANGUL SYLLABLE JJEOLB +CA58;CA58;110D 1165 11B3;CA58;110D 1165 11B3; # (쩘; 쩘; 쩘; 쩘; 쩘; ) HANGUL SYLLABLE JJEOLS +CA59;CA59;110D 1165 11B4;CA59;110D 1165 11B4; # (쩙; 쩙; 쩙; 쩙; 쩙; ) HANGUL SYLLABLE JJEOLT +CA5A;CA5A;110D 1165 11B5;CA5A;110D 1165 11B5; # (쩚; 쩚; 쩚; 쩚; 쩚; ) HANGUL SYLLABLE JJEOLP +CA5B;CA5B;110D 1165 11B6;CA5B;110D 1165 11B6; # (쩛; 쩛; 쩛; 쩛; 쩛; ) HANGUL SYLLABLE JJEOLH +CA5C;CA5C;110D 1165 11B7;CA5C;110D 1165 11B7; # (쩜; 쩜; 쩜; 쩜; 쩜; ) HANGUL SYLLABLE JJEOM +CA5D;CA5D;110D 1165 11B8;CA5D;110D 1165 11B8; # (쩝; 쩝; 쩝; 쩝; 쩝; ) HANGUL SYLLABLE JJEOB +CA5E;CA5E;110D 1165 11B9;CA5E;110D 1165 11B9; # (쩞; 쩞; 쩞; 쩞; 쩞; ) HANGUL SYLLABLE JJEOBS +CA5F;CA5F;110D 1165 11BA;CA5F;110D 1165 11BA; # (쩟; 쩟; 쩟; 쩟; 쩟; ) HANGUL SYLLABLE JJEOS +CA60;CA60;110D 1165 11BB;CA60;110D 1165 11BB; # (쩠; 쩠; 쩠; 쩠; 쩠; ) HANGUL SYLLABLE JJEOSS +CA61;CA61;110D 1165 11BC;CA61;110D 1165 11BC; # (쩡; 쩡; 쩡; 쩡; 쩡; ) HANGUL SYLLABLE JJEONG +CA62;CA62;110D 1165 11BD;CA62;110D 1165 11BD; # (쩢; 쩢; 쩢; 쩢; 쩢; ) HANGUL SYLLABLE JJEOJ +CA63;CA63;110D 1165 11BE;CA63;110D 1165 11BE; # (쩣; 쩣; 쩣; 쩣; 쩣; ) HANGUL SYLLABLE JJEOC +CA64;CA64;110D 1165 11BF;CA64;110D 1165 11BF; # (쩤; 쩤; 쩤; 쩤; 쩤; ) HANGUL SYLLABLE JJEOK +CA65;CA65;110D 1165 11C0;CA65;110D 1165 11C0; # (쩥; 쩥; 쩥; 쩥; 쩥; ) HANGUL SYLLABLE JJEOT +CA66;CA66;110D 1165 11C1;CA66;110D 1165 11C1; # (쩦; 쩦; 쩦; 쩦; 쩦; ) HANGUL SYLLABLE JJEOP +CA67;CA67;110D 1165 11C2;CA67;110D 1165 11C2; # (쩧; 쩧; 쩧; 쩧; 쩧; ) HANGUL SYLLABLE JJEOH +CA68;CA68;110D 1166;CA68;110D 1166; # (쩨; 쩨; 쩨; 쩨; 쩨; ) HANGUL SYLLABLE JJE +CA69;CA69;110D 1166 11A8;CA69;110D 1166 11A8; # (쩩; 쩩; 쩩; 쩩; 쩩; ) HANGUL SYLLABLE JJEG +CA6A;CA6A;110D 1166 11A9;CA6A;110D 1166 11A9; # (쩪; 쩪; 쩪; 쩪; 쩪; ) HANGUL SYLLABLE JJEGG +CA6B;CA6B;110D 1166 11AA;CA6B;110D 1166 11AA; # (쩫; 쩫; 쩫; 쩫; 쩫; ) HANGUL SYLLABLE JJEGS +CA6C;CA6C;110D 1166 11AB;CA6C;110D 1166 11AB; # (쩬; 쩬; 쩬; 쩬; 쩬; ) HANGUL SYLLABLE JJEN +CA6D;CA6D;110D 1166 11AC;CA6D;110D 1166 11AC; # (쩭; 쩭; 쩭; 쩭; 쩭; ) HANGUL SYLLABLE JJENJ +CA6E;CA6E;110D 1166 11AD;CA6E;110D 1166 11AD; # (쩮; 쩮; 쩮; 쩮; 쩮; ) HANGUL SYLLABLE JJENH +CA6F;CA6F;110D 1166 11AE;CA6F;110D 1166 11AE; # (쩯; 쩯; 쩯; 쩯; 쩯; ) HANGUL SYLLABLE JJED +CA70;CA70;110D 1166 11AF;CA70;110D 1166 11AF; # (쩰; 쩰; 쩰; 쩰; 쩰; ) HANGUL SYLLABLE JJEL +CA71;CA71;110D 1166 11B0;CA71;110D 1166 11B0; # (쩱; 쩱; 쩱; 쩱; 쩱; ) HANGUL SYLLABLE JJELG +CA72;CA72;110D 1166 11B1;CA72;110D 1166 11B1; # (쩲; 쩲; 쩲; 쩲; 쩲; ) HANGUL SYLLABLE JJELM +CA73;CA73;110D 1166 11B2;CA73;110D 1166 11B2; # (쩳; 쩳; 쩳; 쩳; 쩳; ) HANGUL SYLLABLE JJELB +CA74;CA74;110D 1166 11B3;CA74;110D 1166 11B3; # (쩴; 쩴; 쩴; 쩴; 쩴; ) HANGUL SYLLABLE JJELS +CA75;CA75;110D 1166 11B4;CA75;110D 1166 11B4; # (쩵; 쩵; 쩵; 쩵; 쩵; ) HANGUL SYLLABLE JJELT +CA76;CA76;110D 1166 11B5;CA76;110D 1166 11B5; # (쩶; 쩶; 쩶; 쩶; 쩶; ) HANGUL SYLLABLE JJELP +CA77;CA77;110D 1166 11B6;CA77;110D 1166 11B6; # (쩷; 쩷; 쩷; 쩷; 쩷; ) HANGUL SYLLABLE JJELH +CA78;CA78;110D 1166 11B7;CA78;110D 1166 11B7; # (쩸; 쩸; 쩸; 쩸; 쩸; ) HANGUL SYLLABLE JJEM +CA79;CA79;110D 1166 11B8;CA79;110D 1166 11B8; # (쩹; 쩹; 쩹; 쩹; 쩹; ) HANGUL SYLLABLE JJEB +CA7A;CA7A;110D 1166 11B9;CA7A;110D 1166 11B9; # (쩺; 쩺; 쩺; 쩺; 쩺; ) HANGUL SYLLABLE JJEBS +CA7B;CA7B;110D 1166 11BA;CA7B;110D 1166 11BA; # (쩻; 쩻; 쩻; 쩻; 쩻; ) HANGUL SYLLABLE JJES +CA7C;CA7C;110D 1166 11BB;CA7C;110D 1166 11BB; # (쩼; 쩼; 쩼; 쩼; 쩼; ) HANGUL SYLLABLE JJESS +CA7D;CA7D;110D 1166 11BC;CA7D;110D 1166 11BC; # (쩽; 쩽; 쩽; 쩽; 쩽; ) HANGUL SYLLABLE JJENG +CA7E;CA7E;110D 1166 11BD;CA7E;110D 1166 11BD; # (쩾; 쩾; 쩾; 쩾; 쩾; ) HANGUL SYLLABLE JJEJ +CA7F;CA7F;110D 1166 11BE;CA7F;110D 1166 11BE; # (쩿; 쩿; 쩿; 쩿; 쩿; ) HANGUL SYLLABLE JJEC +CA80;CA80;110D 1166 11BF;CA80;110D 1166 11BF; # (쪀; 쪀; 쪀; 쪀; 쪀; ) HANGUL SYLLABLE JJEK +CA81;CA81;110D 1166 11C0;CA81;110D 1166 11C0; # (쪁; 쪁; 쪁; 쪁; 쪁; ) HANGUL SYLLABLE JJET +CA82;CA82;110D 1166 11C1;CA82;110D 1166 11C1; # (쪂; 쪂; 쪂; 쪂; 쪂; ) HANGUL SYLLABLE JJEP +CA83;CA83;110D 1166 11C2;CA83;110D 1166 11C2; # (쪃; 쪃; 쪃; 쪃; 쪃; ) HANGUL SYLLABLE JJEH +CA84;CA84;110D 1167;CA84;110D 1167; # (쪄; 쪄; 쪄; 쪄; 쪄; ) HANGUL SYLLABLE JJYEO +CA85;CA85;110D 1167 11A8;CA85;110D 1167 11A8; # (쪅; 쪅; 쪅; 쪅; 쪅; ) HANGUL SYLLABLE JJYEOG +CA86;CA86;110D 1167 11A9;CA86;110D 1167 11A9; # (쪆; 쪆; 쪆; 쪆; 쪆; ) HANGUL SYLLABLE JJYEOGG +CA87;CA87;110D 1167 11AA;CA87;110D 1167 11AA; # (쪇; 쪇; 쪇; 쪇; 쪇; ) HANGUL SYLLABLE JJYEOGS +CA88;CA88;110D 1167 11AB;CA88;110D 1167 11AB; # (쪈; 쪈; 쪈; 쪈; 쪈; ) HANGUL SYLLABLE JJYEON +CA89;CA89;110D 1167 11AC;CA89;110D 1167 11AC; # (쪉; 쪉; 쪉; 쪉; 쪉; ) HANGUL SYLLABLE JJYEONJ +CA8A;CA8A;110D 1167 11AD;CA8A;110D 1167 11AD; # (쪊; 쪊; 쪊; 쪊; 쪊; ) HANGUL SYLLABLE JJYEONH +CA8B;CA8B;110D 1167 11AE;CA8B;110D 1167 11AE; # (쪋; 쪋; 쪋; 쪋; 쪋; ) HANGUL SYLLABLE JJYEOD +CA8C;CA8C;110D 1167 11AF;CA8C;110D 1167 11AF; # (쪌; 쪌; 쪌; 쪌; 쪌; ) HANGUL SYLLABLE JJYEOL +CA8D;CA8D;110D 1167 11B0;CA8D;110D 1167 11B0; # (쪍; 쪍; 쪍; 쪍; 쪍; ) HANGUL SYLLABLE JJYEOLG +CA8E;CA8E;110D 1167 11B1;CA8E;110D 1167 11B1; # (쪎; 쪎; 쪎; 쪎; 쪎; ) HANGUL SYLLABLE JJYEOLM +CA8F;CA8F;110D 1167 11B2;CA8F;110D 1167 11B2; # (쪏; 쪏; 쪏; 쪏; 쪏; ) HANGUL SYLLABLE JJYEOLB +CA90;CA90;110D 1167 11B3;CA90;110D 1167 11B3; # (쪐; 쪐; 쪐; 쪐; 쪐; ) HANGUL SYLLABLE JJYEOLS +CA91;CA91;110D 1167 11B4;CA91;110D 1167 11B4; # (쪑; 쪑; 쪑; 쪑; 쪑; ) HANGUL SYLLABLE JJYEOLT +CA92;CA92;110D 1167 11B5;CA92;110D 1167 11B5; # (쪒; 쪒; 쪒; 쪒; 쪒; ) HANGUL SYLLABLE JJYEOLP +CA93;CA93;110D 1167 11B6;CA93;110D 1167 11B6; # (쪓; 쪓; 쪓; 쪓; 쪓; ) HANGUL SYLLABLE JJYEOLH +CA94;CA94;110D 1167 11B7;CA94;110D 1167 11B7; # (쪔; 쪔; 쪔; 쪔; 쪔; ) HANGUL SYLLABLE JJYEOM +CA95;CA95;110D 1167 11B8;CA95;110D 1167 11B8; # (쪕; 쪕; 쪕; 쪕; 쪕; ) HANGUL SYLLABLE JJYEOB +CA96;CA96;110D 1167 11B9;CA96;110D 1167 11B9; # (쪖; 쪖; 쪖; 쪖; 쪖; ) HANGUL SYLLABLE JJYEOBS +CA97;CA97;110D 1167 11BA;CA97;110D 1167 11BA; # (쪗; 쪗; 쪗; 쪗; 쪗; ) HANGUL SYLLABLE JJYEOS +CA98;CA98;110D 1167 11BB;CA98;110D 1167 11BB; # (쪘; 쪘; 쪘; 쪘; 쪘; ) HANGUL SYLLABLE JJYEOSS +CA99;CA99;110D 1167 11BC;CA99;110D 1167 11BC; # (쪙; 쪙; 쪙; 쪙; 쪙; ) HANGUL SYLLABLE JJYEONG +CA9A;CA9A;110D 1167 11BD;CA9A;110D 1167 11BD; # (쪚; 쪚; 쪚; 쪚; 쪚; ) HANGUL SYLLABLE JJYEOJ +CA9B;CA9B;110D 1167 11BE;CA9B;110D 1167 11BE; # (쪛; 쪛; 쪛; 쪛; 쪛; ) HANGUL SYLLABLE JJYEOC +CA9C;CA9C;110D 1167 11BF;CA9C;110D 1167 11BF; # (쪜; 쪜; 쪜; 쪜; 쪜; ) HANGUL SYLLABLE JJYEOK +CA9D;CA9D;110D 1167 11C0;CA9D;110D 1167 11C0; # (쪝; 쪝; 쪝; 쪝; 쪝; ) HANGUL SYLLABLE JJYEOT +CA9E;CA9E;110D 1167 11C1;CA9E;110D 1167 11C1; # (쪞; 쪞; 쪞; 쪞; 쪞; ) HANGUL SYLLABLE JJYEOP +CA9F;CA9F;110D 1167 11C2;CA9F;110D 1167 11C2; # (쪟; 쪟; 쪟; 쪟; 쪟; ) HANGUL SYLLABLE JJYEOH +CAA0;CAA0;110D 1168;CAA0;110D 1168; # (쪠; 쪠; 쪠; 쪠; 쪠; ) HANGUL SYLLABLE JJYE +CAA1;CAA1;110D 1168 11A8;CAA1;110D 1168 11A8; # (쪡; 쪡; 쪡; 쪡; 쪡; ) HANGUL SYLLABLE JJYEG +CAA2;CAA2;110D 1168 11A9;CAA2;110D 1168 11A9; # (쪢; 쪢; 쪢; 쪢; 쪢; ) HANGUL SYLLABLE JJYEGG +CAA3;CAA3;110D 1168 11AA;CAA3;110D 1168 11AA; # (쪣; 쪣; 쪣; 쪣; 쪣; ) HANGUL SYLLABLE JJYEGS +CAA4;CAA4;110D 1168 11AB;CAA4;110D 1168 11AB; # (쪤; 쪤; 쪤; 쪤; 쪤; ) HANGUL SYLLABLE JJYEN +CAA5;CAA5;110D 1168 11AC;CAA5;110D 1168 11AC; # (쪥; 쪥; 쪥; 쪥; 쪥; ) HANGUL SYLLABLE JJYENJ +CAA6;CAA6;110D 1168 11AD;CAA6;110D 1168 11AD; # (쪦; 쪦; 쪦; 쪦; 쪦; ) HANGUL SYLLABLE JJYENH +CAA7;CAA7;110D 1168 11AE;CAA7;110D 1168 11AE; # (쪧; 쪧; 쪧; 쪧; 쪧; ) HANGUL SYLLABLE JJYED +CAA8;CAA8;110D 1168 11AF;CAA8;110D 1168 11AF; # (쪨; 쪨; 쪨; 쪨; 쪨; ) HANGUL SYLLABLE JJYEL +CAA9;CAA9;110D 1168 11B0;CAA9;110D 1168 11B0; # (쪩; 쪩; 쪩; 쪩; 쪩; ) HANGUL SYLLABLE JJYELG +CAAA;CAAA;110D 1168 11B1;CAAA;110D 1168 11B1; # (쪪; 쪪; 쪪; 쪪; 쪪; ) HANGUL SYLLABLE JJYELM +CAAB;CAAB;110D 1168 11B2;CAAB;110D 1168 11B2; # (쪫; 쪫; 쪫; 쪫; 쪫; ) HANGUL SYLLABLE JJYELB +CAAC;CAAC;110D 1168 11B3;CAAC;110D 1168 11B3; # (쪬; 쪬; 쪬; 쪬; 쪬; ) HANGUL SYLLABLE JJYELS +CAAD;CAAD;110D 1168 11B4;CAAD;110D 1168 11B4; # (쪭; 쪭; 쪭; 쪭; 쪭; ) HANGUL SYLLABLE JJYELT +CAAE;CAAE;110D 1168 11B5;CAAE;110D 1168 11B5; # (쪮; 쪮; 쪮; 쪮; 쪮; ) HANGUL SYLLABLE JJYELP +CAAF;CAAF;110D 1168 11B6;CAAF;110D 1168 11B6; # (쪯; 쪯; 쪯; 쪯; 쪯; ) HANGUL SYLLABLE JJYELH +CAB0;CAB0;110D 1168 11B7;CAB0;110D 1168 11B7; # (쪰; 쪰; 쪰; 쪰; 쪰; ) HANGUL SYLLABLE JJYEM +CAB1;CAB1;110D 1168 11B8;CAB1;110D 1168 11B8; # (쪱; 쪱; 쪱; 쪱; 쪱; ) HANGUL SYLLABLE JJYEB +CAB2;CAB2;110D 1168 11B9;CAB2;110D 1168 11B9; # (쪲; 쪲; 쪲; 쪲; 쪲; ) HANGUL SYLLABLE JJYEBS +CAB3;CAB3;110D 1168 11BA;CAB3;110D 1168 11BA; # (쪳; 쪳; 쪳; 쪳; 쪳; ) HANGUL SYLLABLE JJYES +CAB4;CAB4;110D 1168 11BB;CAB4;110D 1168 11BB; # (쪴; 쪴; 쪴; 쪴; 쪴; ) HANGUL SYLLABLE JJYESS +CAB5;CAB5;110D 1168 11BC;CAB5;110D 1168 11BC; # (쪵; 쪵; 쪵; 쪵; 쪵; ) HANGUL SYLLABLE JJYENG +CAB6;CAB6;110D 1168 11BD;CAB6;110D 1168 11BD; # (쪶; 쪶; 쪶; 쪶; 쪶; ) HANGUL SYLLABLE JJYEJ +CAB7;CAB7;110D 1168 11BE;CAB7;110D 1168 11BE; # (쪷; 쪷; 쪷; 쪷; 쪷; ) HANGUL SYLLABLE JJYEC +CAB8;CAB8;110D 1168 11BF;CAB8;110D 1168 11BF; # (쪸; 쪸; 쪸; 쪸; 쪸; ) HANGUL SYLLABLE JJYEK +CAB9;CAB9;110D 1168 11C0;CAB9;110D 1168 11C0; # (쪹; 쪹; 쪹; 쪹; 쪹; ) HANGUL SYLLABLE JJYET +CABA;CABA;110D 1168 11C1;CABA;110D 1168 11C1; # (쪺; 쪺; 쪺; 쪺; 쪺; ) HANGUL SYLLABLE JJYEP +CABB;CABB;110D 1168 11C2;CABB;110D 1168 11C2; # (쪻; 쪻; 쪻; 쪻; 쪻; ) HANGUL SYLLABLE JJYEH +CABC;CABC;110D 1169;CABC;110D 1169; # (쪼; 쪼; 쪼; 쪼; 쪼; ) HANGUL SYLLABLE JJO +CABD;CABD;110D 1169 11A8;CABD;110D 1169 11A8; # (쪽; 쪽; 쪽; 쪽; 쪽; ) HANGUL SYLLABLE JJOG +CABE;CABE;110D 1169 11A9;CABE;110D 1169 11A9; # (쪾; 쪾; 쪾; 쪾; 쪾; ) HANGUL SYLLABLE JJOGG +CABF;CABF;110D 1169 11AA;CABF;110D 1169 11AA; # (쪿; 쪿; 쪿; 쪿; 쪿; ) HANGUL SYLLABLE JJOGS +CAC0;CAC0;110D 1169 11AB;CAC0;110D 1169 11AB; # (쫀; 쫀; 쫀; 쫀; 쫀; ) HANGUL SYLLABLE JJON +CAC1;CAC1;110D 1169 11AC;CAC1;110D 1169 11AC; # (쫁; 쫁; 쫁; 쫁; 쫁; ) HANGUL SYLLABLE JJONJ +CAC2;CAC2;110D 1169 11AD;CAC2;110D 1169 11AD; # (쫂; 쫂; 쫂; 쫂; 쫂; ) HANGUL SYLLABLE JJONH +CAC3;CAC3;110D 1169 11AE;CAC3;110D 1169 11AE; # (쫃; 쫃; 쫃; 쫃; 쫃; ) HANGUL SYLLABLE JJOD +CAC4;CAC4;110D 1169 11AF;CAC4;110D 1169 11AF; # (쫄; 쫄; 쫄; 쫄; 쫄; ) HANGUL SYLLABLE JJOL +CAC5;CAC5;110D 1169 11B0;CAC5;110D 1169 11B0; # (쫅; 쫅; 쫅; 쫅; 쫅; ) HANGUL SYLLABLE JJOLG +CAC6;CAC6;110D 1169 11B1;CAC6;110D 1169 11B1; # (쫆; 쫆; 쫆; 쫆; 쫆; ) HANGUL SYLLABLE JJOLM +CAC7;CAC7;110D 1169 11B2;CAC7;110D 1169 11B2; # (쫇; 쫇; 쫇; 쫇; 쫇; ) HANGUL SYLLABLE JJOLB +CAC8;CAC8;110D 1169 11B3;CAC8;110D 1169 11B3; # (쫈; 쫈; 쫈; 쫈; 쫈; ) HANGUL SYLLABLE JJOLS +CAC9;CAC9;110D 1169 11B4;CAC9;110D 1169 11B4; # (쫉; 쫉; 쫉; 쫉; 쫉; ) HANGUL SYLLABLE JJOLT +CACA;CACA;110D 1169 11B5;CACA;110D 1169 11B5; # (쫊; 쫊; 쫊; 쫊; 쫊; ) HANGUL SYLLABLE JJOLP +CACB;CACB;110D 1169 11B6;CACB;110D 1169 11B6; # (쫋; 쫋; 쫋; 쫋; 쫋; ) HANGUL SYLLABLE JJOLH +CACC;CACC;110D 1169 11B7;CACC;110D 1169 11B7; # (쫌; 쫌; 쫌; 쫌; 쫌; ) HANGUL SYLLABLE JJOM +CACD;CACD;110D 1169 11B8;CACD;110D 1169 11B8; # (쫍; 쫍; 쫍; 쫍; 쫍; ) HANGUL SYLLABLE JJOB +CACE;CACE;110D 1169 11B9;CACE;110D 1169 11B9; # (쫎; 쫎; 쫎; 쫎; 쫎; ) HANGUL SYLLABLE JJOBS +CACF;CACF;110D 1169 11BA;CACF;110D 1169 11BA; # (쫏; 쫏; 쫏; 쫏; 쫏; ) HANGUL SYLLABLE JJOS +CAD0;CAD0;110D 1169 11BB;CAD0;110D 1169 11BB; # (쫐; 쫐; 쫐; 쫐; 쫐; ) HANGUL SYLLABLE JJOSS +CAD1;CAD1;110D 1169 11BC;CAD1;110D 1169 11BC; # (쫑; 쫑; 쫑; 쫑; 쫑; ) HANGUL SYLLABLE JJONG +CAD2;CAD2;110D 1169 11BD;CAD2;110D 1169 11BD; # (쫒; 쫒; 쫒; 쫒; 쫒; ) HANGUL SYLLABLE JJOJ +CAD3;CAD3;110D 1169 11BE;CAD3;110D 1169 11BE; # (쫓; 쫓; 쫓; 쫓; 쫓; ) HANGUL SYLLABLE JJOC +CAD4;CAD4;110D 1169 11BF;CAD4;110D 1169 11BF; # (쫔; 쫔; 쫔; 쫔; 쫔; ) HANGUL SYLLABLE JJOK +CAD5;CAD5;110D 1169 11C0;CAD5;110D 1169 11C0; # (쫕; 쫕; 쫕; 쫕; 쫕; ) HANGUL SYLLABLE JJOT +CAD6;CAD6;110D 1169 11C1;CAD6;110D 1169 11C1; # (쫖; 쫖; 쫖; 쫖; 쫖; ) HANGUL SYLLABLE JJOP +CAD7;CAD7;110D 1169 11C2;CAD7;110D 1169 11C2; # (쫗; 쫗; 쫗; 쫗; 쫗; ) HANGUL SYLLABLE JJOH +CAD8;CAD8;110D 116A;CAD8;110D 116A; # (쫘; 쫘; 쫘; 쫘; 쫘; ) HANGUL SYLLABLE JJWA +CAD9;CAD9;110D 116A 11A8;CAD9;110D 116A 11A8; # (쫙; 쫙; 쫙; 쫙; 쫙; ) HANGUL SYLLABLE JJWAG +CADA;CADA;110D 116A 11A9;CADA;110D 116A 11A9; # (쫚; 쫚; 쫚; 쫚; 쫚; ) HANGUL SYLLABLE JJWAGG +CADB;CADB;110D 116A 11AA;CADB;110D 116A 11AA; # (쫛; 쫛; 쫛; 쫛; 쫛; ) HANGUL SYLLABLE JJWAGS +CADC;CADC;110D 116A 11AB;CADC;110D 116A 11AB; # (쫜; 쫜; 쫜; 쫜; 쫜; ) HANGUL SYLLABLE JJWAN +CADD;CADD;110D 116A 11AC;CADD;110D 116A 11AC; # (쫝; 쫝; 쫝; 쫝; 쫝; ) HANGUL SYLLABLE JJWANJ +CADE;CADE;110D 116A 11AD;CADE;110D 116A 11AD; # (쫞; 쫞; 쫞; 쫞; 쫞; ) HANGUL SYLLABLE JJWANH +CADF;CADF;110D 116A 11AE;CADF;110D 116A 11AE; # (쫟; 쫟; 쫟; 쫟; 쫟; ) HANGUL SYLLABLE JJWAD +CAE0;CAE0;110D 116A 11AF;CAE0;110D 116A 11AF; # (쫠; 쫠; 쫠; 쫠; 쫠; ) HANGUL SYLLABLE JJWAL +CAE1;CAE1;110D 116A 11B0;CAE1;110D 116A 11B0; # (쫡; 쫡; 쫡; 쫡; 쫡; ) HANGUL SYLLABLE JJWALG +CAE2;CAE2;110D 116A 11B1;CAE2;110D 116A 11B1; # (쫢; 쫢; 쫢; 쫢; 쫢; ) HANGUL SYLLABLE JJWALM +CAE3;CAE3;110D 116A 11B2;CAE3;110D 116A 11B2; # (쫣; 쫣; 쫣; 쫣; 쫣; ) HANGUL SYLLABLE JJWALB +CAE4;CAE4;110D 116A 11B3;CAE4;110D 116A 11B3; # (쫤; 쫤; 쫤; 쫤; 쫤; ) HANGUL SYLLABLE JJWALS +CAE5;CAE5;110D 116A 11B4;CAE5;110D 116A 11B4; # (쫥; 쫥; 쫥; 쫥; 쫥; ) HANGUL SYLLABLE JJWALT +CAE6;CAE6;110D 116A 11B5;CAE6;110D 116A 11B5; # (쫦; 쫦; 쫦; 쫦; 쫦; ) HANGUL SYLLABLE JJWALP +CAE7;CAE7;110D 116A 11B6;CAE7;110D 116A 11B6; # (쫧; 쫧; 쫧; 쫧; 쫧; ) HANGUL SYLLABLE JJWALH +CAE8;CAE8;110D 116A 11B7;CAE8;110D 116A 11B7; # (쫨; 쫨; 쫨; 쫨; 쫨; ) HANGUL SYLLABLE JJWAM +CAE9;CAE9;110D 116A 11B8;CAE9;110D 116A 11B8; # (쫩; 쫩; 쫩; 쫩; 쫩; ) HANGUL SYLLABLE JJWAB +CAEA;CAEA;110D 116A 11B9;CAEA;110D 116A 11B9; # (쫪; 쫪; 쫪; 쫪; 쫪; ) HANGUL SYLLABLE JJWABS +CAEB;CAEB;110D 116A 11BA;CAEB;110D 116A 11BA; # (쫫; 쫫; 쫫; 쫫; 쫫; ) HANGUL SYLLABLE JJWAS +CAEC;CAEC;110D 116A 11BB;CAEC;110D 116A 11BB; # (쫬; 쫬; 쫬; 쫬; 쫬; ) HANGUL SYLLABLE JJWASS +CAED;CAED;110D 116A 11BC;CAED;110D 116A 11BC; # (쫭; 쫭; 쫭; 쫭; 쫭; ) HANGUL SYLLABLE JJWANG +CAEE;CAEE;110D 116A 11BD;CAEE;110D 116A 11BD; # (쫮; 쫮; 쫮; 쫮; 쫮; ) HANGUL SYLLABLE JJWAJ +CAEF;CAEF;110D 116A 11BE;CAEF;110D 116A 11BE; # (쫯; 쫯; 쫯; 쫯; 쫯; ) HANGUL SYLLABLE JJWAC +CAF0;CAF0;110D 116A 11BF;CAF0;110D 116A 11BF; # (쫰; 쫰; 쫰; 쫰; 쫰; ) HANGUL SYLLABLE JJWAK +CAF1;CAF1;110D 116A 11C0;CAF1;110D 116A 11C0; # (쫱; 쫱; 쫱; 쫱; 쫱; ) HANGUL SYLLABLE JJWAT +CAF2;CAF2;110D 116A 11C1;CAF2;110D 116A 11C1; # (쫲; 쫲; 쫲; 쫲; 쫲; ) HANGUL SYLLABLE JJWAP +CAF3;CAF3;110D 116A 11C2;CAF3;110D 116A 11C2; # (쫳; 쫳; 쫳; 쫳; 쫳; ) HANGUL SYLLABLE JJWAH +CAF4;CAF4;110D 116B;CAF4;110D 116B; # (쫴; 쫴; 쫴; 쫴; 쫴; ) HANGUL SYLLABLE JJWAE +CAF5;CAF5;110D 116B 11A8;CAF5;110D 116B 11A8; # (쫵; 쫵; 쫵; 쫵; 쫵; ) HANGUL SYLLABLE JJWAEG +CAF6;CAF6;110D 116B 11A9;CAF6;110D 116B 11A9; # (쫶; 쫶; 쫶; 쫶; 쫶; ) HANGUL SYLLABLE JJWAEGG +CAF7;CAF7;110D 116B 11AA;CAF7;110D 116B 11AA; # (쫷; 쫷; 쫷; 쫷; 쫷; ) HANGUL SYLLABLE JJWAEGS +CAF8;CAF8;110D 116B 11AB;CAF8;110D 116B 11AB; # (쫸; 쫸; 쫸; 쫸; 쫸; ) HANGUL SYLLABLE JJWAEN +CAF9;CAF9;110D 116B 11AC;CAF9;110D 116B 11AC; # (쫹; 쫹; 쫹; 쫹; 쫹; ) HANGUL SYLLABLE JJWAENJ +CAFA;CAFA;110D 116B 11AD;CAFA;110D 116B 11AD; # (쫺; 쫺; 쫺; 쫺; 쫺; ) HANGUL SYLLABLE JJWAENH +CAFB;CAFB;110D 116B 11AE;CAFB;110D 116B 11AE; # (쫻; 쫻; 쫻; 쫻; 쫻; ) HANGUL SYLLABLE JJWAED +CAFC;CAFC;110D 116B 11AF;CAFC;110D 116B 11AF; # (쫼; 쫼; 쫼; 쫼; 쫼; ) HANGUL SYLLABLE JJWAEL +CAFD;CAFD;110D 116B 11B0;CAFD;110D 116B 11B0; # (쫽; 쫽; 쫽; 쫽; 쫽; ) HANGUL SYLLABLE JJWAELG +CAFE;CAFE;110D 116B 11B1;CAFE;110D 116B 11B1; # (쫾; 쫾; 쫾; 쫾; 쫾; ) HANGUL SYLLABLE JJWAELM +CAFF;CAFF;110D 116B 11B2;CAFF;110D 116B 11B2; # (쫿; 쫿; 쫿; 쫿; 쫿; ) HANGUL SYLLABLE JJWAELB +CB00;CB00;110D 116B 11B3;CB00;110D 116B 11B3; # (쬀; 쬀; 쬀; 쬀; 쬀; ) HANGUL SYLLABLE JJWAELS +CB01;CB01;110D 116B 11B4;CB01;110D 116B 11B4; # (쬁; 쬁; 쬁; 쬁; 쬁; ) HANGUL SYLLABLE JJWAELT +CB02;CB02;110D 116B 11B5;CB02;110D 116B 11B5; # (쬂; 쬂; 쬂; 쬂; 쬂; ) HANGUL SYLLABLE JJWAELP +CB03;CB03;110D 116B 11B6;CB03;110D 116B 11B6; # (쬃; 쬃; 쬃; 쬃; 쬃; ) HANGUL SYLLABLE JJWAELH +CB04;CB04;110D 116B 11B7;CB04;110D 116B 11B7; # (쬄; 쬄; 쬄; 쬄; 쬄; ) HANGUL SYLLABLE JJWAEM +CB05;CB05;110D 116B 11B8;CB05;110D 116B 11B8; # (쬅; 쬅; 쬅; 쬅; 쬅; ) HANGUL SYLLABLE JJWAEB +CB06;CB06;110D 116B 11B9;CB06;110D 116B 11B9; # (쬆; 쬆; 쬆; 쬆; 쬆; ) HANGUL SYLLABLE JJWAEBS +CB07;CB07;110D 116B 11BA;CB07;110D 116B 11BA; # (쬇; 쬇; 쬇; 쬇; 쬇; ) HANGUL SYLLABLE JJWAES +CB08;CB08;110D 116B 11BB;CB08;110D 116B 11BB; # (쬈; 쬈; 쬈; 쬈; 쬈; ) HANGUL SYLLABLE JJWAESS +CB09;CB09;110D 116B 11BC;CB09;110D 116B 11BC; # (쬉; 쬉; 쬉; 쬉; 쬉; ) HANGUL SYLLABLE JJWAENG +CB0A;CB0A;110D 116B 11BD;CB0A;110D 116B 11BD; # (쬊; 쬊; 쬊; 쬊; 쬊; ) HANGUL SYLLABLE JJWAEJ +CB0B;CB0B;110D 116B 11BE;CB0B;110D 116B 11BE; # (쬋; 쬋; 쬋; 쬋; 쬋; ) HANGUL SYLLABLE JJWAEC +CB0C;CB0C;110D 116B 11BF;CB0C;110D 116B 11BF; # (쬌; 쬌; 쬌; 쬌; 쬌; ) HANGUL SYLLABLE JJWAEK +CB0D;CB0D;110D 116B 11C0;CB0D;110D 116B 11C0; # (쬍; 쬍; 쬍; 쬍; 쬍; ) HANGUL SYLLABLE JJWAET +CB0E;CB0E;110D 116B 11C1;CB0E;110D 116B 11C1; # (쬎; 쬎; 쬎; 쬎; 쬎; ) HANGUL SYLLABLE JJWAEP +CB0F;CB0F;110D 116B 11C2;CB0F;110D 116B 11C2; # (쬏; 쬏; 쬏; 쬏; 쬏; ) HANGUL SYLLABLE JJWAEH +CB10;CB10;110D 116C;CB10;110D 116C; # (쬐; 쬐; 쬐; 쬐; 쬐; ) HANGUL SYLLABLE JJOE +CB11;CB11;110D 116C 11A8;CB11;110D 116C 11A8; # (쬑; 쬑; 쬑; 쬑; 쬑; ) HANGUL SYLLABLE JJOEG +CB12;CB12;110D 116C 11A9;CB12;110D 116C 11A9; # (쬒; 쬒; 쬒; 쬒; 쬒; ) HANGUL SYLLABLE JJOEGG +CB13;CB13;110D 116C 11AA;CB13;110D 116C 11AA; # (쬓; 쬓; 쬓; 쬓; 쬓; ) HANGUL SYLLABLE JJOEGS +CB14;CB14;110D 116C 11AB;CB14;110D 116C 11AB; # (쬔; 쬔; 쬔; 쬔; 쬔; ) HANGUL SYLLABLE JJOEN +CB15;CB15;110D 116C 11AC;CB15;110D 116C 11AC; # (쬕; 쬕; 쬕; 쬕; 쬕; ) HANGUL SYLLABLE JJOENJ +CB16;CB16;110D 116C 11AD;CB16;110D 116C 11AD; # (쬖; 쬖; 쬖; 쬖; 쬖; ) HANGUL SYLLABLE JJOENH +CB17;CB17;110D 116C 11AE;CB17;110D 116C 11AE; # (쬗; 쬗; 쬗; 쬗; 쬗; ) HANGUL SYLLABLE JJOED +CB18;CB18;110D 116C 11AF;CB18;110D 116C 11AF; # (쬘; 쬘; 쬘; 쬘; 쬘; ) HANGUL SYLLABLE JJOEL +CB19;CB19;110D 116C 11B0;CB19;110D 116C 11B0; # (쬙; 쬙; 쬙; 쬙; 쬙; ) HANGUL SYLLABLE JJOELG +CB1A;CB1A;110D 116C 11B1;CB1A;110D 116C 11B1; # (쬚; 쬚; 쬚; 쬚; 쬚; ) HANGUL SYLLABLE JJOELM +CB1B;CB1B;110D 116C 11B2;CB1B;110D 116C 11B2; # (쬛; 쬛; 쬛; 쬛; 쬛; ) HANGUL SYLLABLE JJOELB +CB1C;CB1C;110D 116C 11B3;CB1C;110D 116C 11B3; # (쬜; 쬜; 쬜; 쬜; 쬜; ) HANGUL SYLLABLE JJOELS +CB1D;CB1D;110D 116C 11B4;CB1D;110D 116C 11B4; # (쬝; 쬝; 쬝; 쬝; 쬝; ) HANGUL SYLLABLE JJOELT +CB1E;CB1E;110D 116C 11B5;CB1E;110D 116C 11B5; # (쬞; 쬞; 쬞; 쬞; 쬞; ) HANGUL SYLLABLE JJOELP +CB1F;CB1F;110D 116C 11B6;CB1F;110D 116C 11B6; # (쬟; 쬟; 쬟; 쬟; 쬟; ) HANGUL SYLLABLE JJOELH +CB20;CB20;110D 116C 11B7;CB20;110D 116C 11B7; # (쬠; 쬠; 쬠; 쬠; 쬠; ) HANGUL SYLLABLE JJOEM +CB21;CB21;110D 116C 11B8;CB21;110D 116C 11B8; # (쬡; 쬡; 쬡; 쬡; 쬡; ) HANGUL SYLLABLE JJOEB +CB22;CB22;110D 116C 11B9;CB22;110D 116C 11B9; # (쬢; 쬢; 쬢; 쬢; 쬢; ) HANGUL SYLLABLE JJOEBS +CB23;CB23;110D 116C 11BA;CB23;110D 116C 11BA; # (쬣; 쬣; 쬣; 쬣; 쬣; ) HANGUL SYLLABLE JJOES +CB24;CB24;110D 116C 11BB;CB24;110D 116C 11BB; # (쬤; 쬤; 쬤; 쬤; 쬤; ) HANGUL SYLLABLE JJOESS +CB25;CB25;110D 116C 11BC;CB25;110D 116C 11BC; # (쬥; 쬥; 쬥; 쬥; 쬥; ) HANGUL SYLLABLE JJOENG +CB26;CB26;110D 116C 11BD;CB26;110D 116C 11BD; # (쬦; 쬦; 쬦; 쬦; 쬦; ) HANGUL SYLLABLE JJOEJ +CB27;CB27;110D 116C 11BE;CB27;110D 116C 11BE; # (쬧; 쬧; 쬧; 쬧; 쬧; ) HANGUL SYLLABLE JJOEC +CB28;CB28;110D 116C 11BF;CB28;110D 116C 11BF; # (쬨; 쬨; 쬨; 쬨; 쬨; ) HANGUL SYLLABLE JJOEK +CB29;CB29;110D 116C 11C0;CB29;110D 116C 11C0; # (쬩; 쬩; 쬩; 쬩; 쬩; ) HANGUL SYLLABLE JJOET +CB2A;CB2A;110D 116C 11C1;CB2A;110D 116C 11C1; # (쬪; 쬪; 쬪; 쬪; 쬪; ) HANGUL SYLLABLE JJOEP +CB2B;CB2B;110D 116C 11C2;CB2B;110D 116C 11C2; # (쬫; 쬫; 쬫; 쬫; 쬫; ) HANGUL SYLLABLE JJOEH +CB2C;CB2C;110D 116D;CB2C;110D 116D; # (쬬; 쬬; 쬬; 쬬; 쬬; ) HANGUL SYLLABLE JJYO +CB2D;CB2D;110D 116D 11A8;CB2D;110D 116D 11A8; # (쬭; 쬭; 쬭; 쬭; 쬭; ) HANGUL SYLLABLE JJYOG +CB2E;CB2E;110D 116D 11A9;CB2E;110D 116D 11A9; # (쬮; 쬮; 쬮; 쬮; 쬮; ) HANGUL SYLLABLE JJYOGG +CB2F;CB2F;110D 116D 11AA;CB2F;110D 116D 11AA; # (쬯; 쬯; 쬯; 쬯; 쬯; ) HANGUL SYLLABLE JJYOGS +CB30;CB30;110D 116D 11AB;CB30;110D 116D 11AB; # (쬰; 쬰; 쬰; 쬰; 쬰; ) HANGUL SYLLABLE JJYON +CB31;CB31;110D 116D 11AC;CB31;110D 116D 11AC; # (쬱; 쬱; 쬱; 쬱; 쬱; ) HANGUL SYLLABLE JJYONJ +CB32;CB32;110D 116D 11AD;CB32;110D 116D 11AD; # (쬲; 쬲; 쬲; 쬲; 쬲; ) HANGUL SYLLABLE JJYONH +CB33;CB33;110D 116D 11AE;CB33;110D 116D 11AE; # (쬳; 쬳; 쬳; 쬳; 쬳; ) HANGUL SYLLABLE JJYOD +CB34;CB34;110D 116D 11AF;CB34;110D 116D 11AF; # (쬴; 쬴; 쬴; 쬴; 쬴; ) HANGUL SYLLABLE JJYOL +CB35;CB35;110D 116D 11B0;CB35;110D 116D 11B0; # (쬵; 쬵; 쬵; 쬵; 쬵; ) HANGUL SYLLABLE JJYOLG +CB36;CB36;110D 116D 11B1;CB36;110D 116D 11B1; # (쬶; 쬶; 쬶; 쬶; 쬶; ) HANGUL SYLLABLE JJYOLM +CB37;CB37;110D 116D 11B2;CB37;110D 116D 11B2; # (쬷; 쬷; 쬷; 쬷; 쬷; ) HANGUL SYLLABLE JJYOLB +CB38;CB38;110D 116D 11B3;CB38;110D 116D 11B3; # (쬸; 쬸; 쬸; 쬸; 쬸; ) HANGUL SYLLABLE JJYOLS +CB39;CB39;110D 116D 11B4;CB39;110D 116D 11B4; # (쬹; 쬹; 쬹; 쬹; 쬹; ) HANGUL SYLLABLE JJYOLT +CB3A;CB3A;110D 116D 11B5;CB3A;110D 116D 11B5; # (쬺; 쬺; 쬺; 쬺; 쬺; ) HANGUL SYLLABLE JJYOLP +CB3B;CB3B;110D 116D 11B6;CB3B;110D 116D 11B6; # (쬻; 쬻; 쬻; 쬻; 쬻; ) HANGUL SYLLABLE JJYOLH +CB3C;CB3C;110D 116D 11B7;CB3C;110D 116D 11B7; # (쬼; 쬼; 쬼; 쬼; 쬼; ) HANGUL SYLLABLE JJYOM +CB3D;CB3D;110D 116D 11B8;CB3D;110D 116D 11B8; # (쬽; 쬽; 쬽; 쬽; 쬽; ) HANGUL SYLLABLE JJYOB +CB3E;CB3E;110D 116D 11B9;CB3E;110D 116D 11B9; # (쬾; 쬾; 쬾; 쬾; 쬾; ) HANGUL SYLLABLE JJYOBS +CB3F;CB3F;110D 116D 11BA;CB3F;110D 116D 11BA; # (쬿; 쬿; 쬿; 쬿; 쬿; ) HANGUL SYLLABLE JJYOS +CB40;CB40;110D 116D 11BB;CB40;110D 116D 11BB; # (쭀; 쭀; 쭀; 쭀; 쭀; ) HANGUL SYLLABLE JJYOSS +CB41;CB41;110D 116D 11BC;CB41;110D 116D 11BC; # (쭁; 쭁; 쭁; 쭁; 쭁; ) HANGUL SYLLABLE JJYONG +CB42;CB42;110D 116D 11BD;CB42;110D 116D 11BD; # (쭂; 쭂; 쭂; 쭂; 쭂; ) HANGUL SYLLABLE JJYOJ +CB43;CB43;110D 116D 11BE;CB43;110D 116D 11BE; # (쭃; 쭃; 쭃; 쭃; 쭃; ) HANGUL SYLLABLE JJYOC +CB44;CB44;110D 116D 11BF;CB44;110D 116D 11BF; # (쭄; 쭄; 쭄; 쭄; 쭄; ) HANGUL SYLLABLE JJYOK +CB45;CB45;110D 116D 11C0;CB45;110D 116D 11C0; # (쭅; 쭅; 쭅; 쭅; 쭅; ) HANGUL SYLLABLE JJYOT +CB46;CB46;110D 116D 11C1;CB46;110D 116D 11C1; # (쭆; 쭆; 쭆; 쭆; 쭆; ) HANGUL SYLLABLE JJYOP +CB47;CB47;110D 116D 11C2;CB47;110D 116D 11C2; # (쭇; 쭇; 쭇; 쭇; 쭇; ) HANGUL SYLLABLE JJYOH +CB48;CB48;110D 116E;CB48;110D 116E; # (쭈; 쭈; 쭈; 쭈; 쭈; ) HANGUL SYLLABLE JJU +CB49;CB49;110D 116E 11A8;CB49;110D 116E 11A8; # (쭉; 쭉; 쭉; 쭉; 쭉; ) HANGUL SYLLABLE JJUG +CB4A;CB4A;110D 116E 11A9;CB4A;110D 116E 11A9; # (쭊; 쭊; 쭊; 쭊; 쭊; ) HANGUL SYLLABLE JJUGG +CB4B;CB4B;110D 116E 11AA;CB4B;110D 116E 11AA; # (쭋; 쭋; 쭋; 쭋; 쭋; ) HANGUL SYLLABLE JJUGS +CB4C;CB4C;110D 116E 11AB;CB4C;110D 116E 11AB; # (쭌; 쭌; 쭌; 쭌; 쭌; ) HANGUL SYLLABLE JJUN +CB4D;CB4D;110D 116E 11AC;CB4D;110D 116E 11AC; # (쭍; 쭍; 쭍; 쭍; 쭍; ) HANGUL SYLLABLE JJUNJ +CB4E;CB4E;110D 116E 11AD;CB4E;110D 116E 11AD; # (쭎; 쭎; 쭎; 쭎; 쭎; ) HANGUL SYLLABLE JJUNH +CB4F;CB4F;110D 116E 11AE;CB4F;110D 116E 11AE; # (쭏; 쭏; 쭏; 쭏; 쭏; ) HANGUL SYLLABLE JJUD +CB50;CB50;110D 116E 11AF;CB50;110D 116E 11AF; # (쭐; 쭐; 쭐; 쭐; 쭐; ) HANGUL SYLLABLE JJUL +CB51;CB51;110D 116E 11B0;CB51;110D 116E 11B0; # (쭑; 쭑; 쭑; 쭑; 쭑; ) HANGUL SYLLABLE JJULG +CB52;CB52;110D 116E 11B1;CB52;110D 116E 11B1; # (쭒; 쭒; 쭒; 쭒; 쭒; ) HANGUL SYLLABLE JJULM +CB53;CB53;110D 116E 11B2;CB53;110D 116E 11B2; # (쭓; 쭓; 쭓; 쭓; 쭓; ) HANGUL SYLLABLE JJULB +CB54;CB54;110D 116E 11B3;CB54;110D 116E 11B3; # (쭔; 쭔; 쭔; 쭔; 쭔; ) HANGUL SYLLABLE JJULS +CB55;CB55;110D 116E 11B4;CB55;110D 116E 11B4; # (쭕; 쭕; 쭕; 쭕; 쭕; ) HANGUL SYLLABLE JJULT +CB56;CB56;110D 116E 11B5;CB56;110D 116E 11B5; # (쭖; 쭖; 쭖; 쭖; 쭖; ) HANGUL SYLLABLE JJULP +CB57;CB57;110D 116E 11B6;CB57;110D 116E 11B6; # (쭗; 쭗; 쭗; 쭗; 쭗; ) HANGUL SYLLABLE JJULH +CB58;CB58;110D 116E 11B7;CB58;110D 116E 11B7; # (쭘; 쭘; 쭘; 쭘; 쭘; ) HANGUL SYLLABLE JJUM +CB59;CB59;110D 116E 11B8;CB59;110D 116E 11B8; # (쭙; 쭙; 쭙; 쭙; 쭙; ) HANGUL SYLLABLE JJUB +CB5A;CB5A;110D 116E 11B9;CB5A;110D 116E 11B9; # (쭚; 쭚; 쭚; 쭚; 쭚; ) HANGUL SYLLABLE JJUBS +CB5B;CB5B;110D 116E 11BA;CB5B;110D 116E 11BA; # (쭛; 쭛; 쭛; 쭛; 쭛; ) HANGUL SYLLABLE JJUS +CB5C;CB5C;110D 116E 11BB;CB5C;110D 116E 11BB; # (쭜; 쭜; 쭜; 쭜; 쭜; ) HANGUL SYLLABLE JJUSS +CB5D;CB5D;110D 116E 11BC;CB5D;110D 116E 11BC; # (쭝; 쭝; 쭝; 쭝; 쭝; ) HANGUL SYLLABLE JJUNG +CB5E;CB5E;110D 116E 11BD;CB5E;110D 116E 11BD; # (쭞; 쭞; 쭞; 쭞; 쭞; ) HANGUL SYLLABLE JJUJ +CB5F;CB5F;110D 116E 11BE;CB5F;110D 116E 11BE; # (쭟; 쭟; 쭟; 쭟; 쭟; ) HANGUL SYLLABLE JJUC +CB60;CB60;110D 116E 11BF;CB60;110D 116E 11BF; # (쭠; 쭠; 쭠; 쭠; 쭠; ) HANGUL SYLLABLE JJUK +CB61;CB61;110D 116E 11C0;CB61;110D 116E 11C0; # (쭡; 쭡; 쭡; 쭡; 쭡; ) HANGUL SYLLABLE JJUT +CB62;CB62;110D 116E 11C1;CB62;110D 116E 11C1; # (쭢; 쭢; 쭢; 쭢; 쭢; ) HANGUL SYLLABLE JJUP +CB63;CB63;110D 116E 11C2;CB63;110D 116E 11C2; # (쭣; 쭣; 쭣; 쭣; 쭣; ) HANGUL SYLLABLE JJUH +CB64;CB64;110D 116F;CB64;110D 116F; # (쭤; 쭤; 쭤; 쭤; 쭤; ) HANGUL SYLLABLE JJWEO +CB65;CB65;110D 116F 11A8;CB65;110D 116F 11A8; # (쭥; 쭥; 쭥; 쭥; 쭥; ) HANGUL SYLLABLE JJWEOG +CB66;CB66;110D 116F 11A9;CB66;110D 116F 11A9; # (쭦; 쭦; 쭦; 쭦; 쭦; ) HANGUL SYLLABLE JJWEOGG +CB67;CB67;110D 116F 11AA;CB67;110D 116F 11AA; # (쭧; 쭧; 쭧; 쭧; 쭧; ) HANGUL SYLLABLE JJWEOGS +CB68;CB68;110D 116F 11AB;CB68;110D 116F 11AB; # (쭨; 쭨; 쭨; 쭨; 쭨; ) HANGUL SYLLABLE JJWEON +CB69;CB69;110D 116F 11AC;CB69;110D 116F 11AC; # (쭩; 쭩; 쭩; 쭩; 쭩; ) HANGUL SYLLABLE JJWEONJ +CB6A;CB6A;110D 116F 11AD;CB6A;110D 116F 11AD; # (쭪; 쭪; 쭪; 쭪; 쭪; ) HANGUL SYLLABLE JJWEONH +CB6B;CB6B;110D 116F 11AE;CB6B;110D 116F 11AE; # (쭫; 쭫; 쭫; 쭫; 쭫; ) HANGUL SYLLABLE JJWEOD +CB6C;CB6C;110D 116F 11AF;CB6C;110D 116F 11AF; # (쭬; 쭬; 쭬; 쭬; 쭬; ) HANGUL SYLLABLE JJWEOL +CB6D;CB6D;110D 116F 11B0;CB6D;110D 116F 11B0; # (쭭; 쭭; 쭭; 쭭; 쭭; ) HANGUL SYLLABLE JJWEOLG +CB6E;CB6E;110D 116F 11B1;CB6E;110D 116F 11B1; # (쭮; 쭮; 쭮; 쭮; 쭮; ) HANGUL SYLLABLE JJWEOLM +CB6F;CB6F;110D 116F 11B2;CB6F;110D 116F 11B2; # (쭯; 쭯; 쭯; 쭯; 쭯; ) HANGUL SYLLABLE JJWEOLB +CB70;CB70;110D 116F 11B3;CB70;110D 116F 11B3; # (쭰; 쭰; 쭰; 쭰; 쭰; ) HANGUL SYLLABLE JJWEOLS +CB71;CB71;110D 116F 11B4;CB71;110D 116F 11B4; # (쭱; 쭱; 쭱; 쭱; 쭱; ) HANGUL SYLLABLE JJWEOLT +CB72;CB72;110D 116F 11B5;CB72;110D 116F 11B5; # (쭲; 쭲; 쭲; 쭲; 쭲; ) HANGUL SYLLABLE JJWEOLP +CB73;CB73;110D 116F 11B6;CB73;110D 116F 11B6; # (쭳; 쭳; 쭳; 쭳; 쭳; ) HANGUL SYLLABLE JJWEOLH +CB74;CB74;110D 116F 11B7;CB74;110D 116F 11B7; # (쭴; 쭴; 쭴; 쭴; 쭴; ) HANGUL SYLLABLE JJWEOM +CB75;CB75;110D 116F 11B8;CB75;110D 116F 11B8; # (쭵; 쭵; 쭵; 쭵; 쭵; ) HANGUL SYLLABLE JJWEOB +CB76;CB76;110D 116F 11B9;CB76;110D 116F 11B9; # (쭶; 쭶; 쭶; 쭶; 쭶; ) HANGUL SYLLABLE JJWEOBS +CB77;CB77;110D 116F 11BA;CB77;110D 116F 11BA; # (쭷; 쭷; 쭷; 쭷; 쭷; ) HANGUL SYLLABLE JJWEOS +CB78;CB78;110D 116F 11BB;CB78;110D 116F 11BB; # (쭸; 쭸; 쭸; 쭸; 쭸; ) HANGUL SYLLABLE JJWEOSS +CB79;CB79;110D 116F 11BC;CB79;110D 116F 11BC; # (쭹; 쭹; 쭹; 쭹; 쭹; ) HANGUL SYLLABLE JJWEONG +CB7A;CB7A;110D 116F 11BD;CB7A;110D 116F 11BD; # (쭺; 쭺; 쭺; 쭺; 쭺; ) HANGUL SYLLABLE JJWEOJ +CB7B;CB7B;110D 116F 11BE;CB7B;110D 116F 11BE; # (쭻; 쭻; 쭻; 쭻; 쭻; ) HANGUL SYLLABLE JJWEOC +CB7C;CB7C;110D 116F 11BF;CB7C;110D 116F 11BF; # (쭼; 쭼; 쭼; 쭼; 쭼; ) HANGUL SYLLABLE JJWEOK +CB7D;CB7D;110D 116F 11C0;CB7D;110D 116F 11C0; # (쭽; 쭽; 쭽; 쭽; 쭽; ) HANGUL SYLLABLE JJWEOT +CB7E;CB7E;110D 116F 11C1;CB7E;110D 116F 11C1; # (쭾; 쭾; 쭾; 쭾; 쭾; ) HANGUL SYLLABLE JJWEOP +CB7F;CB7F;110D 116F 11C2;CB7F;110D 116F 11C2; # (쭿; 쭿; 쭿; 쭿; 쭿; ) HANGUL SYLLABLE JJWEOH +CB80;CB80;110D 1170;CB80;110D 1170; # (쮀; 쮀; 쮀; 쮀; 쮀; ) HANGUL SYLLABLE JJWE +CB81;CB81;110D 1170 11A8;CB81;110D 1170 11A8; # (쮁; 쮁; 쮁; 쮁; 쮁; ) HANGUL SYLLABLE JJWEG +CB82;CB82;110D 1170 11A9;CB82;110D 1170 11A9; # (쮂; 쮂; 쮂; 쮂; 쮂; ) HANGUL SYLLABLE JJWEGG +CB83;CB83;110D 1170 11AA;CB83;110D 1170 11AA; # (쮃; 쮃; 쮃; 쮃; 쮃; ) HANGUL SYLLABLE JJWEGS +CB84;CB84;110D 1170 11AB;CB84;110D 1170 11AB; # (쮄; 쮄; 쮄; 쮄; 쮄; ) HANGUL SYLLABLE JJWEN +CB85;CB85;110D 1170 11AC;CB85;110D 1170 11AC; # (쮅; 쮅; 쮅; 쮅; 쮅; ) HANGUL SYLLABLE JJWENJ +CB86;CB86;110D 1170 11AD;CB86;110D 1170 11AD; # (쮆; 쮆; 쮆; 쮆; 쮆; ) HANGUL SYLLABLE JJWENH +CB87;CB87;110D 1170 11AE;CB87;110D 1170 11AE; # (쮇; 쮇; 쮇; 쮇; 쮇; ) HANGUL SYLLABLE JJWED +CB88;CB88;110D 1170 11AF;CB88;110D 1170 11AF; # (쮈; 쮈; 쮈; 쮈; 쮈; ) HANGUL SYLLABLE JJWEL +CB89;CB89;110D 1170 11B0;CB89;110D 1170 11B0; # (쮉; 쮉; 쮉; 쮉; 쮉; ) HANGUL SYLLABLE JJWELG +CB8A;CB8A;110D 1170 11B1;CB8A;110D 1170 11B1; # (쮊; 쮊; 쮊; 쮊; 쮊; ) HANGUL SYLLABLE JJWELM +CB8B;CB8B;110D 1170 11B2;CB8B;110D 1170 11B2; # (쮋; 쮋; 쮋; 쮋; 쮋; ) HANGUL SYLLABLE JJWELB +CB8C;CB8C;110D 1170 11B3;CB8C;110D 1170 11B3; # (쮌; 쮌; 쮌; 쮌; 쮌; ) HANGUL SYLLABLE JJWELS +CB8D;CB8D;110D 1170 11B4;CB8D;110D 1170 11B4; # (쮍; 쮍; 쮍; 쮍; 쮍; ) HANGUL SYLLABLE JJWELT +CB8E;CB8E;110D 1170 11B5;CB8E;110D 1170 11B5; # (쮎; 쮎; 쮎; 쮎; 쮎; ) HANGUL SYLLABLE JJWELP +CB8F;CB8F;110D 1170 11B6;CB8F;110D 1170 11B6; # (쮏; 쮏; 쮏; 쮏; 쮏; ) HANGUL SYLLABLE JJWELH +CB90;CB90;110D 1170 11B7;CB90;110D 1170 11B7; # (쮐; 쮐; 쮐; 쮐; 쮐; ) HANGUL SYLLABLE JJWEM +CB91;CB91;110D 1170 11B8;CB91;110D 1170 11B8; # (쮑; 쮑; 쮑; 쮑; 쮑; ) HANGUL SYLLABLE JJWEB +CB92;CB92;110D 1170 11B9;CB92;110D 1170 11B9; # (쮒; 쮒; 쮒; 쮒; 쮒; ) HANGUL SYLLABLE JJWEBS +CB93;CB93;110D 1170 11BA;CB93;110D 1170 11BA; # (쮓; 쮓; 쮓; 쮓; 쮓; ) HANGUL SYLLABLE JJWES +CB94;CB94;110D 1170 11BB;CB94;110D 1170 11BB; # (쮔; 쮔; 쮔; 쮔; 쮔; ) HANGUL SYLLABLE JJWESS +CB95;CB95;110D 1170 11BC;CB95;110D 1170 11BC; # (쮕; 쮕; 쮕; 쮕; 쮕; ) HANGUL SYLLABLE JJWENG +CB96;CB96;110D 1170 11BD;CB96;110D 1170 11BD; # (쮖; 쮖; 쮖; 쮖; 쮖; ) HANGUL SYLLABLE JJWEJ +CB97;CB97;110D 1170 11BE;CB97;110D 1170 11BE; # (쮗; 쮗; 쮗; 쮗; 쮗; ) HANGUL SYLLABLE JJWEC +CB98;CB98;110D 1170 11BF;CB98;110D 1170 11BF; # (쮘; 쮘; 쮘; 쮘; 쮘; ) HANGUL SYLLABLE JJWEK +CB99;CB99;110D 1170 11C0;CB99;110D 1170 11C0; # (쮙; 쮙; 쮙; 쮙; 쮙; ) HANGUL SYLLABLE JJWET +CB9A;CB9A;110D 1170 11C1;CB9A;110D 1170 11C1; # (쮚; 쮚; 쮚; 쮚; 쮚; ) HANGUL SYLLABLE JJWEP +CB9B;CB9B;110D 1170 11C2;CB9B;110D 1170 11C2; # (쮛; 쮛; 쮛; 쮛; 쮛; ) HANGUL SYLLABLE JJWEH +CB9C;CB9C;110D 1171;CB9C;110D 1171; # (쮜; 쮜; 쮜; 쮜; 쮜; ) HANGUL SYLLABLE JJWI +CB9D;CB9D;110D 1171 11A8;CB9D;110D 1171 11A8; # (쮝; 쮝; 쮝; 쮝; 쮝; ) HANGUL SYLLABLE JJWIG +CB9E;CB9E;110D 1171 11A9;CB9E;110D 1171 11A9; # (쮞; 쮞; 쮞; 쮞; 쮞; ) HANGUL SYLLABLE JJWIGG +CB9F;CB9F;110D 1171 11AA;CB9F;110D 1171 11AA; # (쮟; 쮟; 쮟; 쮟; 쮟; ) HANGUL SYLLABLE JJWIGS +CBA0;CBA0;110D 1171 11AB;CBA0;110D 1171 11AB; # (쮠; 쮠; 쮠; 쮠; 쮠; ) HANGUL SYLLABLE JJWIN +CBA1;CBA1;110D 1171 11AC;CBA1;110D 1171 11AC; # (쮡; 쮡; 쮡; 쮡; 쮡; ) HANGUL SYLLABLE JJWINJ +CBA2;CBA2;110D 1171 11AD;CBA2;110D 1171 11AD; # (쮢; 쮢; 쮢; 쮢; 쮢; ) HANGUL SYLLABLE JJWINH +CBA3;CBA3;110D 1171 11AE;CBA3;110D 1171 11AE; # (쮣; 쮣; 쮣; 쮣; 쮣; ) HANGUL SYLLABLE JJWID +CBA4;CBA4;110D 1171 11AF;CBA4;110D 1171 11AF; # (쮤; 쮤; 쮤; 쮤; 쮤; ) HANGUL SYLLABLE JJWIL +CBA5;CBA5;110D 1171 11B0;CBA5;110D 1171 11B0; # (쮥; 쮥; 쮥; 쮥; 쮥; ) HANGUL SYLLABLE JJWILG +CBA6;CBA6;110D 1171 11B1;CBA6;110D 1171 11B1; # (쮦; 쮦; 쮦; 쮦; 쮦; ) HANGUL SYLLABLE JJWILM +CBA7;CBA7;110D 1171 11B2;CBA7;110D 1171 11B2; # (쮧; 쮧; 쮧; 쮧; 쮧; ) HANGUL SYLLABLE JJWILB +CBA8;CBA8;110D 1171 11B3;CBA8;110D 1171 11B3; # (쮨; 쮨; 쮨; 쮨; 쮨; ) HANGUL SYLLABLE JJWILS +CBA9;CBA9;110D 1171 11B4;CBA9;110D 1171 11B4; # (쮩; 쮩; 쮩; 쮩; 쮩; ) HANGUL SYLLABLE JJWILT +CBAA;CBAA;110D 1171 11B5;CBAA;110D 1171 11B5; # (쮪; 쮪; 쮪; 쮪; 쮪; ) HANGUL SYLLABLE JJWILP +CBAB;CBAB;110D 1171 11B6;CBAB;110D 1171 11B6; # (쮫; 쮫; 쮫; 쮫; 쮫; ) HANGUL SYLLABLE JJWILH +CBAC;CBAC;110D 1171 11B7;CBAC;110D 1171 11B7; # (쮬; 쮬; 쮬; 쮬; 쮬; ) HANGUL SYLLABLE JJWIM +CBAD;CBAD;110D 1171 11B8;CBAD;110D 1171 11B8; # (쮭; 쮭; 쮭; 쮭; 쮭; ) HANGUL SYLLABLE JJWIB +CBAE;CBAE;110D 1171 11B9;CBAE;110D 1171 11B9; # (쮮; 쮮; 쮮; 쮮; 쮮; ) HANGUL SYLLABLE JJWIBS +CBAF;CBAF;110D 1171 11BA;CBAF;110D 1171 11BA; # (쮯; 쮯; 쮯; 쮯; 쮯; ) HANGUL SYLLABLE JJWIS +CBB0;CBB0;110D 1171 11BB;CBB0;110D 1171 11BB; # (쮰; 쮰; 쮰; 쮰; 쮰; ) HANGUL SYLLABLE JJWISS +CBB1;CBB1;110D 1171 11BC;CBB1;110D 1171 11BC; # (쮱; 쮱; 쮱; 쮱; 쮱; ) HANGUL SYLLABLE JJWING +CBB2;CBB2;110D 1171 11BD;CBB2;110D 1171 11BD; # (쮲; 쮲; 쮲; 쮲; 쮲; ) HANGUL SYLLABLE JJWIJ +CBB3;CBB3;110D 1171 11BE;CBB3;110D 1171 11BE; # (쮳; 쮳; 쮳; 쮳; 쮳; ) HANGUL SYLLABLE JJWIC +CBB4;CBB4;110D 1171 11BF;CBB4;110D 1171 11BF; # (쮴; 쮴; 쮴; 쮴; 쮴; ) HANGUL SYLLABLE JJWIK +CBB5;CBB5;110D 1171 11C0;CBB5;110D 1171 11C0; # (쮵; 쮵; 쮵; 쮵; 쮵; ) HANGUL SYLLABLE JJWIT +CBB6;CBB6;110D 1171 11C1;CBB6;110D 1171 11C1; # (쮶; 쮶; 쮶; 쮶; 쮶; ) HANGUL SYLLABLE JJWIP +CBB7;CBB7;110D 1171 11C2;CBB7;110D 1171 11C2; # (쮷; 쮷; 쮷; 쮷; 쮷; ) HANGUL SYLLABLE JJWIH +CBB8;CBB8;110D 1172;CBB8;110D 1172; # (쮸; 쮸; 쮸; 쮸; 쮸; ) HANGUL SYLLABLE JJYU +CBB9;CBB9;110D 1172 11A8;CBB9;110D 1172 11A8; # (쮹; 쮹; 쮹; 쮹; 쮹; ) HANGUL SYLLABLE JJYUG +CBBA;CBBA;110D 1172 11A9;CBBA;110D 1172 11A9; # (쮺; 쮺; 쮺; 쮺; 쮺; ) HANGUL SYLLABLE JJYUGG +CBBB;CBBB;110D 1172 11AA;CBBB;110D 1172 11AA; # (쮻; 쮻; 쮻; 쮻; 쮻; ) HANGUL SYLLABLE JJYUGS +CBBC;CBBC;110D 1172 11AB;CBBC;110D 1172 11AB; # (쮼; 쮼; 쮼; 쮼; 쮼; ) HANGUL SYLLABLE JJYUN +CBBD;CBBD;110D 1172 11AC;CBBD;110D 1172 11AC; # (쮽; 쮽; 쮽; 쮽; 쮽; ) HANGUL SYLLABLE JJYUNJ +CBBE;CBBE;110D 1172 11AD;CBBE;110D 1172 11AD; # (쮾; 쮾; 쮾; 쮾; 쮾; ) HANGUL SYLLABLE JJYUNH +CBBF;CBBF;110D 1172 11AE;CBBF;110D 1172 11AE; # (쮿; 쮿; 쮿; 쮿; 쮿; ) HANGUL SYLLABLE JJYUD +CBC0;CBC0;110D 1172 11AF;CBC0;110D 1172 11AF; # (쯀; 쯀; 쯀; 쯀; 쯀; ) HANGUL SYLLABLE JJYUL +CBC1;CBC1;110D 1172 11B0;CBC1;110D 1172 11B0; # (쯁; 쯁; 쯁; 쯁; 쯁; ) HANGUL SYLLABLE JJYULG +CBC2;CBC2;110D 1172 11B1;CBC2;110D 1172 11B1; # (쯂; 쯂; 쯂; 쯂; 쯂; ) HANGUL SYLLABLE JJYULM +CBC3;CBC3;110D 1172 11B2;CBC3;110D 1172 11B2; # (쯃; 쯃; 쯃; 쯃; 쯃; ) HANGUL SYLLABLE JJYULB +CBC4;CBC4;110D 1172 11B3;CBC4;110D 1172 11B3; # (쯄; 쯄; 쯄; 쯄; 쯄; ) HANGUL SYLLABLE JJYULS +CBC5;CBC5;110D 1172 11B4;CBC5;110D 1172 11B4; # (쯅; 쯅; 쯅; 쯅; 쯅; ) HANGUL SYLLABLE JJYULT +CBC6;CBC6;110D 1172 11B5;CBC6;110D 1172 11B5; # (쯆; 쯆; 쯆; 쯆; 쯆; ) HANGUL SYLLABLE JJYULP +CBC7;CBC7;110D 1172 11B6;CBC7;110D 1172 11B6; # (쯇; 쯇; 쯇; 쯇; 쯇; ) HANGUL SYLLABLE JJYULH +CBC8;CBC8;110D 1172 11B7;CBC8;110D 1172 11B7; # (쯈; 쯈; 쯈; 쯈; 쯈; ) HANGUL SYLLABLE JJYUM +CBC9;CBC9;110D 1172 11B8;CBC9;110D 1172 11B8; # (쯉; 쯉; 쯉; 쯉; 쯉; ) HANGUL SYLLABLE JJYUB +CBCA;CBCA;110D 1172 11B9;CBCA;110D 1172 11B9; # (쯊; 쯊; 쯊; 쯊; 쯊; ) HANGUL SYLLABLE JJYUBS +CBCB;CBCB;110D 1172 11BA;CBCB;110D 1172 11BA; # (쯋; 쯋; 쯋; 쯋; 쯋; ) HANGUL SYLLABLE JJYUS +CBCC;CBCC;110D 1172 11BB;CBCC;110D 1172 11BB; # (쯌; 쯌; 쯌; 쯌; 쯌; ) HANGUL SYLLABLE JJYUSS +CBCD;CBCD;110D 1172 11BC;CBCD;110D 1172 11BC; # (쯍; 쯍; 쯍; 쯍; 쯍; ) HANGUL SYLLABLE JJYUNG +CBCE;CBCE;110D 1172 11BD;CBCE;110D 1172 11BD; # (쯎; 쯎; 쯎; 쯎; 쯎; ) HANGUL SYLLABLE JJYUJ +CBCF;CBCF;110D 1172 11BE;CBCF;110D 1172 11BE; # (쯏; 쯏; 쯏; 쯏; 쯏; ) HANGUL SYLLABLE JJYUC +CBD0;CBD0;110D 1172 11BF;CBD0;110D 1172 11BF; # (쯐; 쯐; 쯐; 쯐; 쯐; ) HANGUL SYLLABLE JJYUK +CBD1;CBD1;110D 1172 11C0;CBD1;110D 1172 11C0; # (쯑; 쯑; 쯑; 쯑; 쯑; ) HANGUL SYLLABLE JJYUT +CBD2;CBD2;110D 1172 11C1;CBD2;110D 1172 11C1; # (쯒; 쯒; 쯒; 쯒; 쯒; ) HANGUL SYLLABLE JJYUP +CBD3;CBD3;110D 1172 11C2;CBD3;110D 1172 11C2; # (쯓; 쯓; 쯓; 쯓; 쯓; ) HANGUL SYLLABLE JJYUH +CBD4;CBD4;110D 1173;CBD4;110D 1173; # (쯔; 쯔; 쯔; 쯔; 쯔; ) HANGUL SYLLABLE JJEU +CBD5;CBD5;110D 1173 11A8;CBD5;110D 1173 11A8; # (쯕; 쯕; 쯕; 쯕; 쯕; ) HANGUL SYLLABLE JJEUG +CBD6;CBD6;110D 1173 11A9;CBD6;110D 1173 11A9; # (쯖; 쯖; 쯖; 쯖; 쯖; ) HANGUL SYLLABLE JJEUGG +CBD7;CBD7;110D 1173 11AA;CBD7;110D 1173 11AA; # (쯗; 쯗; 쯗; 쯗; 쯗; ) HANGUL SYLLABLE JJEUGS +CBD8;CBD8;110D 1173 11AB;CBD8;110D 1173 11AB; # (쯘; 쯘; 쯘; 쯘; 쯘; ) HANGUL SYLLABLE JJEUN +CBD9;CBD9;110D 1173 11AC;CBD9;110D 1173 11AC; # (쯙; 쯙; 쯙; 쯙; 쯙; ) HANGUL SYLLABLE JJEUNJ +CBDA;CBDA;110D 1173 11AD;CBDA;110D 1173 11AD; # (쯚; 쯚; 쯚; 쯚; 쯚; ) HANGUL SYLLABLE JJEUNH +CBDB;CBDB;110D 1173 11AE;CBDB;110D 1173 11AE; # (쯛; 쯛; 쯛; 쯛; 쯛; ) HANGUL SYLLABLE JJEUD +CBDC;CBDC;110D 1173 11AF;CBDC;110D 1173 11AF; # (쯜; 쯜; 쯜; 쯜; 쯜; ) HANGUL SYLLABLE JJEUL +CBDD;CBDD;110D 1173 11B0;CBDD;110D 1173 11B0; # (쯝; 쯝; 쯝; 쯝; 쯝; ) HANGUL SYLLABLE JJEULG +CBDE;CBDE;110D 1173 11B1;CBDE;110D 1173 11B1; # (쯞; 쯞; 쯞; 쯞; 쯞; ) HANGUL SYLLABLE JJEULM +CBDF;CBDF;110D 1173 11B2;CBDF;110D 1173 11B2; # (쯟; 쯟; 쯟; 쯟; 쯟; ) HANGUL SYLLABLE JJEULB +CBE0;CBE0;110D 1173 11B3;CBE0;110D 1173 11B3; # (쯠; 쯠; 쯠; 쯠; 쯠; ) HANGUL SYLLABLE JJEULS +CBE1;CBE1;110D 1173 11B4;CBE1;110D 1173 11B4; # (쯡; 쯡; 쯡; 쯡; 쯡; ) HANGUL SYLLABLE JJEULT +CBE2;CBE2;110D 1173 11B5;CBE2;110D 1173 11B5; # (쯢; 쯢; 쯢; 쯢; 쯢; ) HANGUL SYLLABLE JJEULP +CBE3;CBE3;110D 1173 11B6;CBE3;110D 1173 11B6; # (쯣; 쯣; 쯣; 쯣; 쯣; ) HANGUL SYLLABLE JJEULH +CBE4;CBE4;110D 1173 11B7;CBE4;110D 1173 11B7; # (쯤; 쯤; 쯤; 쯤; 쯤; ) HANGUL SYLLABLE JJEUM +CBE5;CBE5;110D 1173 11B8;CBE5;110D 1173 11B8; # (쯥; 쯥; 쯥; 쯥; 쯥; ) HANGUL SYLLABLE JJEUB +CBE6;CBE6;110D 1173 11B9;CBE6;110D 1173 11B9; # (쯦; 쯦; 쯦; 쯦; 쯦; ) HANGUL SYLLABLE JJEUBS +CBE7;CBE7;110D 1173 11BA;CBE7;110D 1173 11BA; # (쯧; 쯧; 쯧; 쯧; 쯧; ) HANGUL SYLLABLE JJEUS +CBE8;CBE8;110D 1173 11BB;CBE8;110D 1173 11BB; # (쯨; 쯨; 쯨; 쯨; 쯨; ) HANGUL SYLLABLE JJEUSS +CBE9;CBE9;110D 1173 11BC;CBE9;110D 1173 11BC; # (쯩; 쯩; 쯩; 쯩; 쯩; ) HANGUL SYLLABLE JJEUNG +CBEA;CBEA;110D 1173 11BD;CBEA;110D 1173 11BD; # (쯪; 쯪; 쯪; 쯪; 쯪; ) HANGUL SYLLABLE JJEUJ +CBEB;CBEB;110D 1173 11BE;CBEB;110D 1173 11BE; # (쯫; 쯫; 쯫; 쯫; 쯫; ) HANGUL SYLLABLE JJEUC +CBEC;CBEC;110D 1173 11BF;CBEC;110D 1173 11BF; # (쯬; 쯬; 쯬; 쯬; 쯬; ) HANGUL SYLLABLE JJEUK +CBED;CBED;110D 1173 11C0;CBED;110D 1173 11C0; # (쯭; 쯭; 쯭; 쯭; 쯭; ) HANGUL SYLLABLE JJEUT +CBEE;CBEE;110D 1173 11C1;CBEE;110D 1173 11C1; # (쯮; 쯮; 쯮; 쯮; 쯮; ) HANGUL SYLLABLE JJEUP +CBEF;CBEF;110D 1173 11C2;CBEF;110D 1173 11C2; # (쯯; 쯯; 쯯; 쯯; 쯯; ) HANGUL SYLLABLE JJEUH +CBF0;CBF0;110D 1174;CBF0;110D 1174; # (쯰; 쯰; 쯰; 쯰; 쯰; ) HANGUL SYLLABLE JJYI +CBF1;CBF1;110D 1174 11A8;CBF1;110D 1174 11A8; # (쯱; 쯱; 쯱; 쯱; 쯱; ) HANGUL SYLLABLE JJYIG +CBF2;CBF2;110D 1174 11A9;CBF2;110D 1174 11A9; # (쯲; 쯲; 쯲; 쯲; 쯲; ) HANGUL SYLLABLE JJYIGG +CBF3;CBF3;110D 1174 11AA;CBF3;110D 1174 11AA; # (쯳; 쯳; 쯳; 쯳; 쯳; ) HANGUL SYLLABLE JJYIGS +CBF4;CBF4;110D 1174 11AB;CBF4;110D 1174 11AB; # (쯴; 쯴; 쯴; 쯴; 쯴; ) HANGUL SYLLABLE JJYIN +CBF5;CBF5;110D 1174 11AC;CBF5;110D 1174 11AC; # (쯵; 쯵; 쯵; 쯵; 쯵; ) HANGUL SYLLABLE JJYINJ +CBF6;CBF6;110D 1174 11AD;CBF6;110D 1174 11AD; # (쯶; 쯶; 쯶; 쯶; 쯶; ) HANGUL SYLLABLE JJYINH +CBF7;CBF7;110D 1174 11AE;CBF7;110D 1174 11AE; # (쯷; 쯷; 쯷; 쯷; 쯷; ) HANGUL SYLLABLE JJYID +CBF8;CBF8;110D 1174 11AF;CBF8;110D 1174 11AF; # (쯸; 쯸; 쯸; 쯸; 쯸; ) HANGUL SYLLABLE JJYIL +CBF9;CBF9;110D 1174 11B0;CBF9;110D 1174 11B0; # (쯹; 쯹; 쯹; 쯹; 쯹; ) HANGUL SYLLABLE JJYILG +CBFA;CBFA;110D 1174 11B1;CBFA;110D 1174 11B1; # (쯺; 쯺; 쯺; 쯺; 쯺; ) HANGUL SYLLABLE JJYILM +CBFB;CBFB;110D 1174 11B2;CBFB;110D 1174 11B2; # (쯻; 쯻; 쯻; 쯻; 쯻; ) HANGUL SYLLABLE JJYILB +CBFC;CBFC;110D 1174 11B3;CBFC;110D 1174 11B3; # (쯼; 쯼; 쯼; 쯼; 쯼; ) HANGUL SYLLABLE JJYILS +CBFD;CBFD;110D 1174 11B4;CBFD;110D 1174 11B4; # (쯽; 쯽; 쯽; 쯽; 쯽; ) HANGUL SYLLABLE JJYILT +CBFE;CBFE;110D 1174 11B5;CBFE;110D 1174 11B5; # (쯾; 쯾; 쯾; 쯾; 쯾; ) HANGUL SYLLABLE JJYILP +CBFF;CBFF;110D 1174 11B6;CBFF;110D 1174 11B6; # (쯿; 쯿; 쯿; 쯿; 쯿; ) HANGUL SYLLABLE JJYILH +CC00;CC00;110D 1174 11B7;CC00;110D 1174 11B7; # (찀; 찀; 찀; 찀; 찀; ) HANGUL SYLLABLE JJYIM +CC01;CC01;110D 1174 11B8;CC01;110D 1174 11B8; # (찁; 찁; 찁; 찁; 찁; ) HANGUL SYLLABLE JJYIB +CC02;CC02;110D 1174 11B9;CC02;110D 1174 11B9; # (찂; 찂; 찂; 찂; 찂; ) HANGUL SYLLABLE JJYIBS +CC03;CC03;110D 1174 11BA;CC03;110D 1174 11BA; # (찃; 찃; 찃; 찃; 찃; ) HANGUL SYLLABLE JJYIS +CC04;CC04;110D 1174 11BB;CC04;110D 1174 11BB; # (찄; 찄; 찄; 찄; 찄; ) HANGUL SYLLABLE JJYISS +CC05;CC05;110D 1174 11BC;CC05;110D 1174 11BC; # (찅; 찅; 찅; 찅; 찅; ) HANGUL SYLLABLE JJYING +CC06;CC06;110D 1174 11BD;CC06;110D 1174 11BD; # (찆; 찆; 찆; 찆; 찆; ) HANGUL SYLLABLE JJYIJ +CC07;CC07;110D 1174 11BE;CC07;110D 1174 11BE; # (찇; 찇; 찇; 찇; 찇; ) HANGUL SYLLABLE JJYIC +CC08;CC08;110D 1174 11BF;CC08;110D 1174 11BF; # (찈; 찈; 찈; 찈; 찈; ) HANGUL SYLLABLE JJYIK +CC09;CC09;110D 1174 11C0;CC09;110D 1174 11C0; # (찉; 찉; 찉; 찉; 찉; ) HANGUL SYLLABLE JJYIT +CC0A;CC0A;110D 1174 11C1;CC0A;110D 1174 11C1; # (찊; 찊; 찊; 찊; 찊; ) HANGUL SYLLABLE JJYIP +CC0B;CC0B;110D 1174 11C2;CC0B;110D 1174 11C2; # (찋; 찋; 찋; 찋; 찋; ) HANGUL SYLLABLE JJYIH +CC0C;CC0C;110D 1175;CC0C;110D 1175; # (찌; 찌; 찌; 찌; 찌; ) HANGUL SYLLABLE JJI +CC0D;CC0D;110D 1175 11A8;CC0D;110D 1175 11A8; # (찍; 찍; 찍; 찍; 찍; ) HANGUL SYLLABLE JJIG +CC0E;CC0E;110D 1175 11A9;CC0E;110D 1175 11A9; # (찎; 찎; 찎; 찎; 찎; ) HANGUL SYLLABLE JJIGG +CC0F;CC0F;110D 1175 11AA;CC0F;110D 1175 11AA; # (찏; 찏; 찏; 찏; 찏; ) HANGUL SYLLABLE JJIGS +CC10;CC10;110D 1175 11AB;CC10;110D 1175 11AB; # (찐; 찐; 찐; 찐; 찐; ) HANGUL SYLLABLE JJIN +CC11;CC11;110D 1175 11AC;CC11;110D 1175 11AC; # (찑; 찑; 찑; 찑; 찑; ) HANGUL SYLLABLE JJINJ +CC12;CC12;110D 1175 11AD;CC12;110D 1175 11AD; # (찒; 찒; 찒; 찒; 찒; ) HANGUL SYLLABLE JJINH +CC13;CC13;110D 1175 11AE;CC13;110D 1175 11AE; # (찓; 찓; 찓; 찓; 찓; ) HANGUL SYLLABLE JJID +CC14;CC14;110D 1175 11AF;CC14;110D 1175 11AF; # (찔; 찔; 찔; 찔; 찔; ) HANGUL SYLLABLE JJIL +CC15;CC15;110D 1175 11B0;CC15;110D 1175 11B0; # (찕; 찕; 찕; 찕; 찕; ) HANGUL SYLLABLE JJILG +CC16;CC16;110D 1175 11B1;CC16;110D 1175 11B1; # (찖; 찖; 찖; 찖; 찖; ) HANGUL SYLLABLE JJILM +CC17;CC17;110D 1175 11B2;CC17;110D 1175 11B2; # (찗; 찗; 찗; 찗; 찗; ) HANGUL SYLLABLE JJILB +CC18;CC18;110D 1175 11B3;CC18;110D 1175 11B3; # (찘; 찘; 찘; 찘; 찘; ) HANGUL SYLLABLE JJILS +CC19;CC19;110D 1175 11B4;CC19;110D 1175 11B4; # (찙; 찙; 찙; 찙; 찙; ) HANGUL SYLLABLE JJILT +CC1A;CC1A;110D 1175 11B5;CC1A;110D 1175 11B5; # (찚; 찚; 찚; 찚; 찚; ) HANGUL SYLLABLE JJILP +CC1B;CC1B;110D 1175 11B6;CC1B;110D 1175 11B6; # (찛; 찛; 찛; 찛; 찛; ) HANGUL SYLLABLE JJILH +CC1C;CC1C;110D 1175 11B7;CC1C;110D 1175 11B7; # (찜; 찜; 찜; 찜; 찜; ) HANGUL SYLLABLE JJIM +CC1D;CC1D;110D 1175 11B8;CC1D;110D 1175 11B8; # (찝; 찝; 찝; 찝; 찝; ) HANGUL SYLLABLE JJIB +CC1E;CC1E;110D 1175 11B9;CC1E;110D 1175 11B9; # (찞; 찞; 찞; 찞; 찞; ) HANGUL SYLLABLE JJIBS +CC1F;CC1F;110D 1175 11BA;CC1F;110D 1175 11BA; # (찟; 찟; 찟; 찟; 찟; ) HANGUL SYLLABLE JJIS +CC20;CC20;110D 1175 11BB;CC20;110D 1175 11BB; # (찠; 찠; 찠; 찠; 찠; ) HANGUL SYLLABLE JJISS +CC21;CC21;110D 1175 11BC;CC21;110D 1175 11BC; # (찡; 찡; 찡; 찡; 찡; ) HANGUL SYLLABLE JJING +CC22;CC22;110D 1175 11BD;CC22;110D 1175 11BD; # (찢; 찢; 찢; 찢; 찢; ) HANGUL SYLLABLE JJIJ +CC23;CC23;110D 1175 11BE;CC23;110D 1175 11BE; # (찣; 찣; 찣; 찣; 찣; ) HANGUL SYLLABLE JJIC +CC24;CC24;110D 1175 11BF;CC24;110D 1175 11BF; # (찤; 찤; 찤; 찤; 찤; ) HANGUL SYLLABLE JJIK +CC25;CC25;110D 1175 11C0;CC25;110D 1175 11C0; # (찥; 찥; 찥; 찥; 찥; ) HANGUL SYLLABLE JJIT +CC26;CC26;110D 1175 11C1;CC26;110D 1175 11C1; # (찦; 찦; 찦; 찦; 찦; ) HANGUL SYLLABLE JJIP +CC27;CC27;110D 1175 11C2;CC27;110D 1175 11C2; # (찧; 찧; 찧; 찧; 찧; ) HANGUL SYLLABLE JJIH +CC28;CC28;110E 1161;CC28;110E 1161; # (차; 차; 차; 차; 차; ) HANGUL SYLLABLE CA +CC29;CC29;110E 1161 11A8;CC29;110E 1161 11A8; # (착; 착; 착; 착; 착; ) HANGUL SYLLABLE CAG +CC2A;CC2A;110E 1161 11A9;CC2A;110E 1161 11A9; # (찪; 찪; 찪; 찪; 찪; ) HANGUL SYLLABLE CAGG +CC2B;CC2B;110E 1161 11AA;CC2B;110E 1161 11AA; # (찫; 찫; 찫; 찫; 찫; ) HANGUL SYLLABLE CAGS +CC2C;CC2C;110E 1161 11AB;CC2C;110E 1161 11AB; # (찬; 찬; 찬; 찬; 찬; ) HANGUL SYLLABLE CAN +CC2D;CC2D;110E 1161 11AC;CC2D;110E 1161 11AC; # (찭; 찭; 찭; 찭; 찭; ) HANGUL SYLLABLE CANJ +CC2E;CC2E;110E 1161 11AD;CC2E;110E 1161 11AD; # (찮; 찮; 찮; 찮; 찮; ) HANGUL SYLLABLE CANH +CC2F;CC2F;110E 1161 11AE;CC2F;110E 1161 11AE; # (찯; 찯; 찯; 찯; 찯; ) HANGUL SYLLABLE CAD +CC30;CC30;110E 1161 11AF;CC30;110E 1161 11AF; # (찰; 찰; 찰; 찰; 찰; ) HANGUL SYLLABLE CAL +CC31;CC31;110E 1161 11B0;CC31;110E 1161 11B0; # (찱; 찱; 찱; 찱; 찱; ) HANGUL SYLLABLE CALG +CC32;CC32;110E 1161 11B1;CC32;110E 1161 11B1; # (찲; 찲; 찲; 찲; 찲; ) HANGUL SYLLABLE CALM +CC33;CC33;110E 1161 11B2;CC33;110E 1161 11B2; # (찳; 찳; 찳; 찳; 찳; ) HANGUL SYLLABLE CALB +CC34;CC34;110E 1161 11B3;CC34;110E 1161 11B3; # (찴; 찴; 찴; 찴; 찴; ) HANGUL SYLLABLE CALS +CC35;CC35;110E 1161 11B4;CC35;110E 1161 11B4; # (찵; 찵; 찵; 찵; 찵; ) HANGUL SYLLABLE CALT +CC36;CC36;110E 1161 11B5;CC36;110E 1161 11B5; # (찶; 찶; 찶; 찶; 찶; ) HANGUL SYLLABLE CALP +CC37;CC37;110E 1161 11B6;CC37;110E 1161 11B6; # (찷; 찷; 찷; 찷; 찷; ) HANGUL SYLLABLE CALH +CC38;CC38;110E 1161 11B7;CC38;110E 1161 11B7; # (참; 참; 참; 참; 참; ) HANGUL SYLLABLE CAM +CC39;CC39;110E 1161 11B8;CC39;110E 1161 11B8; # (찹; 찹; 찹; 찹; 찹; ) HANGUL SYLLABLE CAB +CC3A;CC3A;110E 1161 11B9;CC3A;110E 1161 11B9; # (찺; 찺; 찺; 찺; 찺; ) HANGUL SYLLABLE CABS +CC3B;CC3B;110E 1161 11BA;CC3B;110E 1161 11BA; # (찻; 찻; 찻; 찻; 찻; ) HANGUL SYLLABLE CAS +CC3C;CC3C;110E 1161 11BB;CC3C;110E 1161 11BB; # (찼; 찼; 찼; 찼; 찼; ) HANGUL SYLLABLE CASS +CC3D;CC3D;110E 1161 11BC;CC3D;110E 1161 11BC; # (창; 창; 창; 창; 창; ) HANGUL SYLLABLE CANG +CC3E;CC3E;110E 1161 11BD;CC3E;110E 1161 11BD; # (찾; 찾; 찾; 찾; 찾; ) HANGUL SYLLABLE CAJ +CC3F;CC3F;110E 1161 11BE;CC3F;110E 1161 11BE; # (찿; 찿; 찿; 찿; 찿; ) HANGUL SYLLABLE CAC +CC40;CC40;110E 1161 11BF;CC40;110E 1161 11BF; # (챀; 챀; 챀; 챀; 챀; ) HANGUL SYLLABLE CAK +CC41;CC41;110E 1161 11C0;CC41;110E 1161 11C0; # (챁; 챁; 챁; 챁; 챁; ) HANGUL SYLLABLE CAT +CC42;CC42;110E 1161 11C1;CC42;110E 1161 11C1; # (챂; 챂; 챂; 챂; 챂; ) HANGUL SYLLABLE CAP +CC43;CC43;110E 1161 11C2;CC43;110E 1161 11C2; # (챃; 챃; 챃; 챃; 챃; ) HANGUL SYLLABLE CAH +CC44;CC44;110E 1162;CC44;110E 1162; # (채; 채; 채; 채; 채; ) HANGUL SYLLABLE CAE +CC45;CC45;110E 1162 11A8;CC45;110E 1162 11A8; # (책; 책; 책; 책; 책; ) HANGUL SYLLABLE CAEG +CC46;CC46;110E 1162 11A9;CC46;110E 1162 11A9; # (챆; 챆; 챆; 챆; 챆; ) HANGUL SYLLABLE CAEGG +CC47;CC47;110E 1162 11AA;CC47;110E 1162 11AA; # (챇; 챇; 챇; 챇; 챇; ) HANGUL SYLLABLE CAEGS +CC48;CC48;110E 1162 11AB;CC48;110E 1162 11AB; # (챈; 챈; 챈; 챈; 챈; ) HANGUL SYLLABLE CAEN +CC49;CC49;110E 1162 11AC;CC49;110E 1162 11AC; # (챉; 챉; 챉; 챉; 챉; ) HANGUL SYLLABLE CAENJ +CC4A;CC4A;110E 1162 11AD;CC4A;110E 1162 11AD; # (챊; 챊; 챊; 챊; 챊; ) HANGUL SYLLABLE CAENH +CC4B;CC4B;110E 1162 11AE;CC4B;110E 1162 11AE; # (챋; 챋; 챋; 챋; 챋; ) HANGUL SYLLABLE CAED +CC4C;CC4C;110E 1162 11AF;CC4C;110E 1162 11AF; # (챌; 챌; 챌; 챌; 챌; ) HANGUL SYLLABLE CAEL +CC4D;CC4D;110E 1162 11B0;CC4D;110E 1162 11B0; # (챍; 챍; 챍; 챍; 챍; ) HANGUL SYLLABLE CAELG +CC4E;CC4E;110E 1162 11B1;CC4E;110E 1162 11B1; # (챎; 챎; 챎; 챎; 챎; ) HANGUL SYLLABLE CAELM +CC4F;CC4F;110E 1162 11B2;CC4F;110E 1162 11B2; # (챏; 챏; 챏; 챏; 챏; ) HANGUL SYLLABLE CAELB +CC50;CC50;110E 1162 11B3;CC50;110E 1162 11B3; # (챐; 챐; 챐; 챐; 챐; ) HANGUL SYLLABLE CAELS +CC51;CC51;110E 1162 11B4;CC51;110E 1162 11B4; # (챑; 챑; 챑; 챑; 챑; ) HANGUL SYLLABLE CAELT +CC52;CC52;110E 1162 11B5;CC52;110E 1162 11B5; # (챒; 챒; 챒; 챒; 챒; ) HANGUL SYLLABLE CAELP +CC53;CC53;110E 1162 11B6;CC53;110E 1162 11B6; # (챓; 챓; 챓; 챓; 챓; ) HANGUL SYLLABLE CAELH +CC54;CC54;110E 1162 11B7;CC54;110E 1162 11B7; # (챔; 챔; 챔; 챔; 챔; ) HANGUL SYLLABLE CAEM +CC55;CC55;110E 1162 11B8;CC55;110E 1162 11B8; # (챕; 챕; 챕; 챕; 챕; ) HANGUL SYLLABLE CAEB +CC56;CC56;110E 1162 11B9;CC56;110E 1162 11B9; # (챖; 챖; 챖; 챖; 챖; ) HANGUL SYLLABLE CAEBS +CC57;CC57;110E 1162 11BA;CC57;110E 1162 11BA; # (챗; 챗; 챗; 챗; 챗; ) HANGUL SYLLABLE CAES +CC58;CC58;110E 1162 11BB;CC58;110E 1162 11BB; # (챘; 챘; 챘; 챘; 챘; ) HANGUL SYLLABLE CAESS +CC59;CC59;110E 1162 11BC;CC59;110E 1162 11BC; # (챙; 챙; 챙; 챙; 챙; ) HANGUL SYLLABLE CAENG +CC5A;CC5A;110E 1162 11BD;CC5A;110E 1162 11BD; # (챚; 챚; 챚; 챚; 챚; ) HANGUL SYLLABLE CAEJ +CC5B;CC5B;110E 1162 11BE;CC5B;110E 1162 11BE; # (챛; 챛; 챛; 챛; 챛; ) HANGUL SYLLABLE CAEC +CC5C;CC5C;110E 1162 11BF;CC5C;110E 1162 11BF; # (챜; 챜; 챜; 챜; 챜; ) HANGUL SYLLABLE CAEK +CC5D;CC5D;110E 1162 11C0;CC5D;110E 1162 11C0; # (챝; 챝; 챝; 챝; 챝; ) HANGUL SYLLABLE CAET +CC5E;CC5E;110E 1162 11C1;CC5E;110E 1162 11C1; # (챞; 챞; 챞; 챞; 챞; ) HANGUL SYLLABLE CAEP +CC5F;CC5F;110E 1162 11C2;CC5F;110E 1162 11C2; # (챟; 챟; 챟; 챟; 챟; ) HANGUL SYLLABLE CAEH +CC60;CC60;110E 1163;CC60;110E 1163; # (챠; 챠; 챠; 챠; 챠; ) HANGUL SYLLABLE CYA +CC61;CC61;110E 1163 11A8;CC61;110E 1163 11A8; # (챡; 챡; 챡; 챡; 챡; ) HANGUL SYLLABLE CYAG +CC62;CC62;110E 1163 11A9;CC62;110E 1163 11A9; # (챢; 챢; 챢; 챢; 챢; ) HANGUL SYLLABLE CYAGG +CC63;CC63;110E 1163 11AA;CC63;110E 1163 11AA; # (챣; 챣; 챣; 챣; 챣; ) HANGUL SYLLABLE CYAGS +CC64;CC64;110E 1163 11AB;CC64;110E 1163 11AB; # (챤; 챤; 챤; 챤; 챤; ) HANGUL SYLLABLE CYAN +CC65;CC65;110E 1163 11AC;CC65;110E 1163 11AC; # (챥; 챥; 챥; 챥; 챥; ) HANGUL SYLLABLE CYANJ +CC66;CC66;110E 1163 11AD;CC66;110E 1163 11AD; # (챦; 챦; 챦; 챦; 챦; ) HANGUL SYLLABLE CYANH +CC67;CC67;110E 1163 11AE;CC67;110E 1163 11AE; # (챧; 챧; 챧; 챧; 챧; ) HANGUL SYLLABLE CYAD +CC68;CC68;110E 1163 11AF;CC68;110E 1163 11AF; # (챨; 챨; 챨; 챨; 챨; ) HANGUL SYLLABLE CYAL +CC69;CC69;110E 1163 11B0;CC69;110E 1163 11B0; # (챩; 챩; 챩; 챩; 챩; ) HANGUL SYLLABLE CYALG +CC6A;CC6A;110E 1163 11B1;CC6A;110E 1163 11B1; # (챪; 챪; 챪; 챪; 챪; ) HANGUL SYLLABLE CYALM +CC6B;CC6B;110E 1163 11B2;CC6B;110E 1163 11B2; # (챫; 챫; 챫; 챫; 챫; ) HANGUL SYLLABLE CYALB +CC6C;CC6C;110E 1163 11B3;CC6C;110E 1163 11B3; # (챬; 챬; 챬; 챬; 챬; ) HANGUL SYLLABLE CYALS +CC6D;CC6D;110E 1163 11B4;CC6D;110E 1163 11B4; # (챭; 챭; 챭; 챭; 챭; ) HANGUL SYLLABLE CYALT +CC6E;CC6E;110E 1163 11B5;CC6E;110E 1163 11B5; # (챮; 챮; 챮; 챮; 챮; ) HANGUL SYLLABLE CYALP +CC6F;CC6F;110E 1163 11B6;CC6F;110E 1163 11B6; # (챯; 챯; 챯; 챯; 챯; ) HANGUL SYLLABLE CYALH +CC70;CC70;110E 1163 11B7;CC70;110E 1163 11B7; # (챰; 챰; 챰; 챰; 챰; ) HANGUL SYLLABLE CYAM +CC71;CC71;110E 1163 11B8;CC71;110E 1163 11B8; # (챱; 챱; 챱; 챱; 챱; ) HANGUL SYLLABLE CYAB +CC72;CC72;110E 1163 11B9;CC72;110E 1163 11B9; # (챲; 챲; 챲; 챲; 챲; ) HANGUL SYLLABLE CYABS +CC73;CC73;110E 1163 11BA;CC73;110E 1163 11BA; # (챳; 챳; 챳; 챳; 챳; ) HANGUL SYLLABLE CYAS +CC74;CC74;110E 1163 11BB;CC74;110E 1163 11BB; # (챴; 챴; 챴; 챴; 챴; ) HANGUL SYLLABLE CYASS +CC75;CC75;110E 1163 11BC;CC75;110E 1163 11BC; # (챵; 챵; 챵; 챵; 챵; ) HANGUL SYLLABLE CYANG +CC76;CC76;110E 1163 11BD;CC76;110E 1163 11BD; # (챶; 챶; 챶; 챶; 챶; ) HANGUL SYLLABLE CYAJ +CC77;CC77;110E 1163 11BE;CC77;110E 1163 11BE; # (챷; 챷; 챷; 챷; 챷; ) HANGUL SYLLABLE CYAC +CC78;CC78;110E 1163 11BF;CC78;110E 1163 11BF; # (챸; 챸; 챸; 챸; 챸; ) HANGUL SYLLABLE CYAK +CC79;CC79;110E 1163 11C0;CC79;110E 1163 11C0; # (챹; 챹; 챹; 챹; 챹; ) HANGUL SYLLABLE CYAT +CC7A;CC7A;110E 1163 11C1;CC7A;110E 1163 11C1; # (챺; 챺; 챺; 챺; 챺; ) HANGUL SYLLABLE CYAP +CC7B;CC7B;110E 1163 11C2;CC7B;110E 1163 11C2; # (챻; 챻; 챻; 챻; 챻; ) HANGUL SYLLABLE CYAH +CC7C;CC7C;110E 1164;CC7C;110E 1164; # (챼; 챼; 챼; 챼; 챼; ) HANGUL SYLLABLE CYAE +CC7D;CC7D;110E 1164 11A8;CC7D;110E 1164 11A8; # (챽; 챽; 챽; 챽; 챽; ) HANGUL SYLLABLE CYAEG +CC7E;CC7E;110E 1164 11A9;CC7E;110E 1164 11A9; # (챾; 챾; 챾; 챾; 챾; ) HANGUL SYLLABLE CYAEGG +CC7F;CC7F;110E 1164 11AA;CC7F;110E 1164 11AA; # (챿; 챿; 챿; 챿; 챿; ) HANGUL SYLLABLE CYAEGS +CC80;CC80;110E 1164 11AB;CC80;110E 1164 11AB; # (첀; 첀; 첀; 첀; 첀; ) HANGUL SYLLABLE CYAEN +CC81;CC81;110E 1164 11AC;CC81;110E 1164 11AC; # (첁; 첁; 첁; 첁; 첁; ) HANGUL SYLLABLE CYAENJ +CC82;CC82;110E 1164 11AD;CC82;110E 1164 11AD; # (첂; 첂; 첂; 첂; 첂; ) HANGUL SYLLABLE CYAENH +CC83;CC83;110E 1164 11AE;CC83;110E 1164 11AE; # (첃; 첃; 첃; 첃; 첃; ) HANGUL SYLLABLE CYAED +CC84;CC84;110E 1164 11AF;CC84;110E 1164 11AF; # (첄; 첄; 첄; 첄; 첄; ) HANGUL SYLLABLE CYAEL +CC85;CC85;110E 1164 11B0;CC85;110E 1164 11B0; # (첅; 첅; 첅; 첅; 첅; ) HANGUL SYLLABLE CYAELG +CC86;CC86;110E 1164 11B1;CC86;110E 1164 11B1; # (첆; 첆; 첆; 첆; 첆; ) HANGUL SYLLABLE CYAELM +CC87;CC87;110E 1164 11B2;CC87;110E 1164 11B2; # (첇; 첇; 첇; 첇; 첇; ) HANGUL SYLLABLE CYAELB +CC88;CC88;110E 1164 11B3;CC88;110E 1164 11B3; # (첈; 첈; 첈; 첈; 첈; ) HANGUL SYLLABLE CYAELS +CC89;CC89;110E 1164 11B4;CC89;110E 1164 11B4; # (첉; 첉; 첉; 첉; 첉; ) HANGUL SYLLABLE CYAELT +CC8A;CC8A;110E 1164 11B5;CC8A;110E 1164 11B5; # (첊; 첊; 첊; 첊; 첊; ) HANGUL SYLLABLE CYAELP +CC8B;CC8B;110E 1164 11B6;CC8B;110E 1164 11B6; # (첋; 첋; 첋; 첋; 첋; ) HANGUL SYLLABLE CYAELH +CC8C;CC8C;110E 1164 11B7;CC8C;110E 1164 11B7; # (첌; 첌; 첌; 첌; 첌; ) HANGUL SYLLABLE CYAEM +CC8D;CC8D;110E 1164 11B8;CC8D;110E 1164 11B8; # (첍; 첍; 첍; 첍; 첍; ) HANGUL SYLLABLE CYAEB +CC8E;CC8E;110E 1164 11B9;CC8E;110E 1164 11B9; # (첎; 첎; 첎; 첎; 첎; ) HANGUL SYLLABLE CYAEBS +CC8F;CC8F;110E 1164 11BA;CC8F;110E 1164 11BA; # (첏; 첏; 첏; 첏; 첏; ) HANGUL SYLLABLE CYAES +CC90;CC90;110E 1164 11BB;CC90;110E 1164 11BB; # (첐; 첐; 첐; 첐; 첐; ) HANGUL SYLLABLE CYAESS +CC91;CC91;110E 1164 11BC;CC91;110E 1164 11BC; # (첑; 첑; 첑; 첑; 첑; ) HANGUL SYLLABLE CYAENG +CC92;CC92;110E 1164 11BD;CC92;110E 1164 11BD; # (첒; 첒; 첒; 첒; 첒; ) HANGUL SYLLABLE CYAEJ +CC93;CC93;110E 1164 11BE;CC93;110E 1164 11BE; # (첓; 첓; 첓; 첓; 첓; ) HANGUL SYLLABLE CYAEC +CC94;CC94;110E 1164 11BF;CC94;110E 1164 11BF; # (첔; 첔; 첔; 첔; 첔; ) HANGUL SYLLABLE CYAEK +CC95;CC95;110E 1164 11C0;CC95;110E 1164 11C0; # (첕; 첕; 첕; 첕; 첕; ) HANGUL SYLLABLE CYAET +CC96;CC96;110E 1164 11C1;CC96;110E 1164 11C1; # (첖; 첖; 첖; 첖; 첖; ) HANGUL SYLLABLE CYAEP +CC97;CC97;110E 1164 11C2;CC97;110E 1164 11C2; # (첗; 첗; 첗; 첗; 첗; ) HANGUL SYLLABLE CYAEH +CC98;CC98;110E 1165;CC98;110E 1165; # (처; 처; 처; 처; 처; ) HANGUL SYLLABLE CEO +CC99;CC99;110E 1165 11A8;CC99;110E 1165 11A8; # (척; 척; 척; 척; 척; ) HANGUL SYLLABLE CEOG +CC9A;CC9A;110E 1165 11A9;CC9A;110E 1165 11A9; # (첚; 첚; 첚; 첚; 첚; ) HANGUL SYLLABLE CEOGG +CC9B;CC9B;110E 1165 11AA;CC9B;110E 1165 11AA; # (첛; 첛; 첛; 첛; 첛; ) HANGUL SYLLABLE CEOGS +CC9C;CC9C;110E 1165 11AB;CC9C;110E 1165 11AB; # (천; 천; 천; 천; 천; ) HANGUL SYLLABLE CEON +CC9D;CC9D;110E 1165 11AC;CC9D;110E 1165 11AC; # (첝; 첝; 첝; 첝; 첝; ) HANGUL SYLLABLE CEONJ +CC9E;CC9E;110E 1165 11AD;CC9E;110E 1165 11AD; # (첞; 첞; 첞; 첞; 첞; ) HANGUL SYLLABLE CEONH +CC9F;CC9F;110E 1165 11AE;CC9F;110E 1165 11AE; # (첟; 첟; 첟; 첟; 첟; ) HANGUL SYLLABLE CEOD +CCA0;CCA0;110E 1165 11AF;CCA0;110E 1165 11AF; # (철; 철; 철; 철; 철; ) HANGUL SYLLABLE CEOL +CCA1;CCA1;110E 1165 11B0;CCA1;110E 1165 11B0; # (첡; 첡; 첡; 첡; 첡; ) HANGUL SYLLABLE CEOLG +CCA2;CCA2;110E 1165 11B1;CCA2;110E 1165 11B1; # (첢; 첢; 첢; 첢; 첢; ) HANGUL SYLLABLE CEOLM +CCA3;CCA3;110E 1165 11B2;CCA3;110E 1165 11B2; # (첣; 첣; 첣; 첣; 첣; ) HANGUL SYLLABLE CEOLB +CCA4;CCA4;110E 1165 11B3;CCA4;110E 1165 11B3; # (첤; 첤; 첤; 첤; 첤; ) HANGUL SYLLABLE CEOLS +CCA5;CCA5;110E 1165 11B4;CCA5;110E 1165 11B4; # (첥; 첥; 첥; 첥; 첥; ) HANGUL SYLLABLE CEOLT +CCA6;CCA6;110E 1165 11B5;CCA6;110E 1165 11B5; # (첦; 첦; 첦; 첦; 첦; ) HANGUL SYLLABLE CEOLP +CCA7;CCA7;110E 1165 11B6;CCA7;110E 1165 11B6; # (첧; 첧; 첧; 첧; 첧; ) HANGUL SYLLABLE CEOLH +CCA8;CCA8;110E 1165 11B7;CCA8;110E 1165 11B7; # (첨; 첨; 첨; 첨; 첨; ) HANGUL SYLLABLE CEOM +CCA9;CCA9;110E 1165 11B8;CCA9;110E 1165 11B8; # (첩; 첩; 첩; 첩; 첩; ) HANGUL SYLLABLE CEOB +CCAA;CCAA;110E 1165 11B9;CCAA;110E 1165 11B9; # (첪; 첪; 첪; 첪; 첪; ) HANGUL SYLLABLE CEOBS +CCAB;CCAB;110E 1165 11BA;CCAB;110E 1165 11BA; # (첫; 첫; 첫; 첫; 첫; ) HANGUL SYLLABLE CEOS +CCAC;CCAC;110E 1165 11BB;CCAC;110E 1165 11BB; # (첬; 첬; 첬; 첬; 첬; ) HANGUL SYLLABLE CEOSS +CCAD;CCAD;110E 1165 11BC;CCAD;110E 1165 11BC; # (청; 청; 청; 청; 청; ) HANGUL SYLLABLE CEONG +CCAE;CCAE;110E 1165 11BD;CCAE;110E 1165 11BD; # (첮; 첮; 첮; 첮; 첮; ) HANGUL SYLLABLE CEOJ +CCAF;CCAF;110E 1165 11BE;CCAF;110E 1165 11BE; # (첯; 첯; 첯; 첯; 첯; ) HANGUL SYLLABLE CEOC +CCB0;CCB0;110E 1165 11BF;CCB0;110E 1165 11BF; # (첰; 첰; 첰; 첰; 첰; ) HANGUL SYLLABLE CEOK +CCB1;CCB1;110E 1165 11C0;CCB1;110E 1165 11C0; # (첱; 첱; 첱; 첱; 첱; ) HANGUL SYLLABLE CEOT +CCB2;CCB2;110E 1165 11C1;CCB2;110E 1165 11C1; # (첲; 첲; 첲; 첲; 첲; ) HANGUL SYLLABLE CEOP +CCB3;CCB3;110E 1165 11C2;CCB3;110E 1165 11C2; # (첳; 첳; 첳; 첳; 첳; ) HANGUL SYLLABLE CEOH +CCB4;CCB4;110E 1166;CCB4;110E 1166; # (체; 체; 체; 체; 체; ) HANGUL SYLLABLE CE +CCB5;CCB5;110E 1166 11A8;CCB5;110E 1166 11A8; # (첵; 첵; 첵; 첵; 첵; ) HANGUL SYLLABLE CEG +CCB6;CCB6;110E 1166 11A9;CCB6;110E 1166 11A9; # (첶; 첶; 첶; 첶; 첶; ) HANGUL SYLLABLE CEGG +CCB7;CCB7;110E 1166 11AA;CCB7;110E 1166 11AA; # (첷; 첷; 첷; 첷; 첷; ) HANGUL SYLLABLE CEGS +CCB8;CCB8;110E 1166 11AB;CCB8;110E 1166 11AB; # (첸; 첸; 첸; 첸; 첸; ) HANGUL SYLLABLE CEN +CCB9;CCB9;110E 1166 11AC;CCB9;110E 1166 11AC; # (첹; 첹; 첹; 첹; 첹; ) HANGUL SYLLABLE CENJ +CCBA;CCBA;110E 1166 11AD;CCBA;110E 1166 11AD; # (첺; 첺; 첺; 첺; 첺; ) HANGUL SYLLABLE CENH +CCBB;CCBB;110E 1166 11AE;CCBB;110E 1166 11AE; # (첻; 첻; 첻; 첻; 첻; ) HANGUL SYLLABLE CED +CCBC;CCBC;110E 1166 11AF;CCBC;110E 1166 11AF; # (첼; 첼; 첼; 첼; 첼; ) HANGUL SYLLABLE CEL +CCBD;CCBD;110E 1166 11B0;CCBD;110E 1166 11B0; # (첽; 첽; 첽; 첽; 첽; ) HANGUL SYLLABLE CELG +CCBE;CCBE;110E 1166 11B1;CCBE;110E 1166 11B1; # (첾; 첾; 첾; 첾; 첾; ) HANGUL SYLLABLE CELM +CCBF;CCBF;110E 1166 11B2;CCBF;110E 1166 11B2; # (첿; 첿; 첿; 첿; 첿; ) HANGUL SYLLABLE CELB +CCC0;CCC0;110E 1166 11B3;CCC0;110E 1166 11B3; # (쳀; 쳀; 쳀; 쳀; 쳀; ) HANGUL SYLLABLE CELS +CCC1;CCC1;110E 1166 11B4;CCC1;110E 1166 11B4; # (쳁; 쳁; 쳁; 쳁; 쳁; ) HANGUL SYLLABLE CELT +CCC2;CCC2;110E 1166 11B5;CCC2;110E 1166 11B5; # (쳂; 쳂; 쳂; 쳂; 쳂; ) HANGUL SYLLABLE CELP +CCC3;CCC3;110E 1166 11B6;CCC3;110E 1166 11B6; # (쳃; 쳃; 쳃; 쳃; 쳃; ) HANGUL SYLLABLE CELH +CCC4;CCC4;110E 1166 11B7;CCC4;110E 1166 11B7; # (쳄; 쳄; 쳄; 쳄; 쳄; ) HANGUL SYLLABLE CEM +CCC5;CCC5;110E 1166 11B8;CCC5;110E 1166 11B8; # (쳅; 쳅; 쳅; 쳅; 쳅; ) HANGUL SYLLABLE CEB +CCC6;CCC6;110E 1166 11B9;CCC6;110E 1166 11B9; # (쳆; 쳆; 쳆; 쳆; 쳆; ) HANGUL SYLLABLE CEBS +CCC7;CCC7;110E 1166 11BA;CCC7;110E 1166 11BA; # (쳇; 쳇; 쳇; 쳇; 쳇; ) HANGUL SYLLABLE CES +CCC8;CCC8;110E 1166 11BB;CCC8;110E 1166 11BB; # (쳈; 쳈; 쳈; 쳈; 쳈; ) HANGUL SYLLABLE CESS +CCC9;CCC9;110E 1166 11BC;CCC9;110E 1166 11BC; # (쳉; 쳉; 쳉; 쳉; 쳉; ) HANGUL SYLLABLE CENG +CCCA;CCCA;110E 1166 11BD;CCCA;110E 1166 11BD; # (쳊; 쳊; 쳊; 쳊; 쳊; ) HANGUL SYLLABLE CEJ +CCCB;CCCB;110E 1166 11BE;CCCB;110E 1166 11BE; # (쳋; 쳋; 쳋; 쳋; 쳋; ) HANGUL SYLLABLE CEC +CCCC;CCCC;110E 1166 11BF;CCCC;110E 1166 11BF; # (쳌; 쳌; 쳌; 쳌; 쳌; ) HANGUL SYLLABLE CEK +CCCD;CCCD;110E 1166 11C0;CCCD;110E 1166 11C0; # (쳍; 쳍; 쳍; 쳍; 쳍; ) HANGUL SYLLABLE CET +CCCE;CCCE;110E 1166 11C1;CCCE;110E 1166 11C1; # (쳎; 쳎; 쳎; 쳎; 쳎; ) HANGUL SYLLABLE CEP +CCCF;CCCF;110E 1166 11C2;CCCF;110E 1166 11C2; # (쳏; 쳏; 쳏; 쳏; 쳏; ) HANGUL SYLLABLE CEH +CCD0;CCD0;110E 1167;CCD0;110E 1167; # (쳐; 쳐; 쳐; 쳐; 쳐; ) HANGUL SYLLABLE CYEO +CCD1;CCD1;110E 1167 11A8;CCD1;110E 1167 11A8; # (쳑; 쳑; 쳑; 쳑; 쳑; ) HANGUL SYLLABLE CYEOG +CCD2;CCD2;110E 1167 11A9;CCD2;110E 1167 11A9; # (쳒; 쳒; 쳒; 쳒; 쳒; ) HANGUL SYLLABLE CYEOGG +CCD3;CCD3;110E 1167 11AA;CCD3;110E 1167 11AA; # (쳓; 쳓; 쳓; 쳓; 쳓; ) HANGUL SYLLABLE CYEOGS +CCD4;CCD4;110E 1167 11AB;CCD4;110E 1167 11AB; # (쳔; 쳔; 쳔; 쳔; 쳔; ) HANGUL SYLLABLE CYEON +CCD5;CCD5;110E 1167 11AC;CCD5;110E 1167 11AC; # (쳕; 쳕; 쳕; 쳕; 쳕; ) HANGUL SYLLABLE CYEONJ +CCD6;CCD6;110E 1167 11AD;CCD6;110E 1167 11AD; # (쳖; 쳖; 쳖; 쳖; 쳖; ) HANGUL SYLLABLE CYEONH +CCD7;CCD7;110E 1167 11AE;CCD7;110E 1167 11AE; # (쳗; 쳗; 쳗; 쳗; 쳗; ) HANGUL SYLLABLE CYEOD +CCD8;CCD8;110E 1167 11AF;CCD8;110E 1167 11AF; # (쳘; 쳘; 쳘; 쳘; 쳘; ) HANGUL SYLLABLE CYEOL +CCD9;CCD9;110E 1167 11B0;CCD9;110E 1167 11B0; # (쳙; 쳙; 쳙; 쳙; 쳙; ) HANGUL SYLLABLE CYEOLG +CCDA;CCDA;110E 1167 11B1;CCDA;110E 1167 11B1; # (쳚; 쳚; 쳚; 쳚; 쳚; ) HANGUL SYLLABLE CYEOLM +CCDB;CCDB;110E 1167 11B2;CCDB;110E 1167 11B2; # (쳛; 쳛; 쳛; 쳛; 쳛; ) HANGUL SYLLABLE CYEOLB +CCDC;CCDC;110E 1167 11B3;CCDC;110E 1167 11B3; # (쳜; 쳜; 쳜; 쳜; 쳜; ) HANGUL SYLLABLE CYEOLS +CCDD;CCDD;110E 1167 11B4;CCDD;110E 1167 11B4; # (쳝; 쳝; 쳝; 쳝; 쳝; ) HANGUL SYLLABLE CYEOLT +CCDE;CCDE;110E 1167 11B5;CCDE;110E 1167 11B5; # (쳞; 쳞; 쳞; 쳞; 쳞; ) HANGUL SYLLABLE CYEOLP +CCDF;CCDF;110E 1167 11B6;CCDF;110E 1167 11B6; # (쳟; 쳟; 쳟; 쳟; 쳟; ) HANGUL SYLLABLE CYEOLH +CCE0;CCE0;110E 1167 11B7;CCE0;110E 1167 11B7; # (쳠; 쳠; 쳠; 쳠; 쳠; ) HANGUL SYLLABLE CYEOM +CCE1;CCE1;110E 1167 11B8;CCE1;110E 1167 11B8; # (쳡; 쳡; 쳡; 쳡; 쳡; ) HANGUL SYLLABLE CYEOB +CCE2;CCE2;110E 1167 11B9;CCE2;110E 1167 11B9; # (쳢; 쳢; 쳢; 쳢; 쳢; ) HANGUL SYLLABLE CYEOBS +CCE3;CCE3;110E 1167 11BA;CCE3;110E 1167 11BA; # (쳣; 쳣; 쳣; 쳣; 쳣; ) HANGUL SYLLABLE CYEOS +CCE4;CCE4;110E 1167 11BB;CCE4;110E 1167 11BB; # (쳤; 쳤; 쳤; 쳤; 쳤; ) HANGUL SYLLABLE CYEOSS +CCE5;CCE5;110E 1167 11BC;CCE5;110E 1167 11BC; # (쳥; 쳥; 쳥; 쳥; 쳥; ) HANGUL SYLLABLE CYEONG +CCE6;CCE6;110E 1167 11BD;CCE6;110E 1167 11BD; # (쳦; 쳦; 쳦; 쳦; 쳦; ) HANGUL SYLLABLE CYEOJ +CCE7;CCE7;110E 1167 11BE;CCE7;110E 1167 11BE; # (쳧; 쳧; 쳧; 쳧; 쳧; ) HANGUL SYLLABLE CYEOC +CCE8;CCE8;110E 1167 11BF;CCE8;110E 1167 11BF; # (쳨; 쳨; 쳨; 쳨; 쳨; ) HANGUL SYLLABLE CYEOK +CCE9;CCE9;110E 1167 11C0;CCE9;110E 1167 11C0; # (쳩; 쳩; 쳩; 쳩; 쳩; ) HANGUL SYLLABLE CYEOT +CCEA;CCEA;110E 1167 11C1;CCEA;110E 1167 11C1; # (쳪; 쳪; 쳪; 쳪; 쳪; ) HANGUL SYLLABLE CYEOP +CCEB;CCEB;110E 1167 11C2;CCEB;110E 1167 11C2; # (쳫; 쳫; 쳫; 쳫; 쳫; ) HANGUL SYLLABLE CYEOH +CCEC;CCEC;110E 1168;CCEC;110E 1168; # (쳬; 쳬; 쳬; 쳬; 쳬; ) HANGUL SYLLABLE CYE +CCED;CCED;110E 1168 11A8;CCED;110E 1168 11A8; # (쳭; 쳭; 쳭; 쳭; 쳭; ) HANGUL SYLLABLE CYEG +CCEE;CCEE;110E 1168 11A9;CCEE;110E 1168 11A9; # (쳮; 쳮; 쳮; 쳮; 쳮; ) HANGUL SYLLABLE CYEGG +CCEF;CCEF;110E 1168 11AA;CCEF;110E 1168 11AA; # (쳯; 쳯; 쳯; 쳯; 쳯; ) HANGUL SYLLABLE CYEGS +CCF0;CCF0;110E 1168 11AB;CCF0;110E 1168 11AB; # (쳰; 쳰; 쳰; 쳰; 쳰; ) HANGUL SYLLABLE CYEN +CCF1;CCF1;110E 1168 11AC;CCF1;110E 1168 11AC; # (쳱; 쳱; 쳱; 쳱; 쳱; ) HANGUL SYLLABLE CYENJ +CCF2;CCF2;110E 1168 11AD;CCF2;110E 1168 11AD; # (쳲; 쳲; 쳲; 쳲; 쳲; ) HANGUL SYLLABLE CYENH +CCF3;CCF3;110E 1168 11AE;CCF3;110E 1168 11AE; # (쳳; 쳳; 쳳; 쳳; 쳳; ) HANGUL SYLLABLE CYED +CCF4;CCF4;110E 1168 11AF;CCF4;110E 1168 11AF; # (쳴; 쳴; 쳴; 쳴; 쳴; ) HANGUL SYLLABLE CYEL +CCF5;CCF5;110E 1168 11B0;CCF5;110E 1168 11B0; # (쳵; 쳵; 쳵; 쳵; 쳵; ) HANGUL SYLLABLE CYELG +CCF6;CCF6;110E 1168 11B1;CCF6;110E 1168 11B1; # (쳶; 쳶; 쳶; 쳶; 쳶; ) HANGUL SYLLABLE CYELM +CCF7;CCF7;110E 1168 11B2;CCF7;110E 1168 11B2; # (쳷; 쳷; 쳷; 쳷; 쳷; ) HANGUL SYLLABLE CYELB +CCF8;CCF8;110E 1168 11B3;CCF8;110E 1168 11B3; # (쳸; 쳸; 쳸; 쳸; 쳸; ) HANGUL SYLLABLE CYELS +CCF9;CCF9;110E 1168 11B4;CCF9;110E 1168 11B4; # (쳹; 쳹; 쳹; 쳹; 쳹; ) HANGUL SYLLABLE CYELT +CCFA;CCFA;110E 1168 11B5;CCFA;110E 1168 11B5; # (쳺; 쳺; 쳺; 쳺; 쳺; ) HANGUL SYLLABLE CYELP +CCFB;CCFB;110E 1168 11B6;CCFB;110E 1168 11B6; # (쳻; 쳻; 쳻; 쳻; 쳻; ) HANGUL SYLLABLE CYELH +CCFC;CCFC;110E 1168 11B7;CCFC;110E 1168 11B7; # (쳼; 쳼; 쳼; 쳼; 쳼; ) HANGUL SYLLABLE CYEM +CCFD;CCFD;110E 1168 11B8;CCFD;110E 1168 11B8; # (쳽; 쳽; 쳽; 쳽; 쳽; ) HANGUL SYLLABLE CYEB +CCFE;CCFE;110E 1168 11B9;CCFE;110E 1168 11B9; # (쳾; 쳾; 쳾; 쳾; 쳾; ) HANGUL SYLLABLE CYEBS +CCFF;CCFF;110E 1168 11BA;CCFF;110E 1168 11BA; # (쳿; 쳿; 쳿; 쳿; 쳿; ) HANGUL SYLLABLE CYES +CD00;CD00;110E 1168 11BB;CD00;110E 1168 11BB; # (촀; 촀; 촀; 촀; 촀; ) HANGUL SYLLABLE CYESS +CD01;CD01;110E 1168 11BC;CD01;110E 1168 11BC; # (촁; 촁; 촁; 촁; 촁; ) HANGUL SYLLABLE CYENG +CD02;CD02;110E 1168 11BD;CD02;110E 1168 11BD; # (촂; 촂; 촂; 촂; 촂; ) HANGUL SYLLABLE CYEJ +CD03;CD03;110E 1168 11BE;CD03;110E 1168 11BE; # (촃; 촃; 촃; 촃; 촃; ) HANGUL SYLLABLE CYEC +CD04;CD04;110E 1168 11BF;CD04;110E 1168 11BF; # (촄; 촄; 촄; 촄; 촄; ) HANGUL SYLLABLE CYEK +CD05;CD05;110E 1168 11C0;CD05;110E 1168 11C0; # (촅; 촅; 촅; 촅; 촅; ) HANGUL SYLLABLE CYET +CD06;CD06;110E 1168 11C1;CD06;110E 1168 11C1; # (촆; 촆; 촆; 촆; 촆; ) HANGUL SYLLABLE CYEP +CD07;CD07;110E 1168 11C2;CD07;110E 1168 11C2; # (촇; 촇; 촇; 촇; 촇; ) HANGUL SYLLABLE CYEH +CD08;CD08;110E 1169;CD08;110E 1169; # (초; 초; 초; 초; 초; ) HANGUL SYLLABLE CO +CD09;CD09;110E 1169 11A8;CD09;110E 1169 11A8; # (촉; 촉; 촉; 촉; 촉; ) HANGUL SYLLABLE COG +CD0A;CD0A;110E 1169 11A9;CD0A;110E 1169 11A9; # (촊; 촊; 촊; 촊; 촊; ) HANGUL SYLLABLE COGG +CD0B;CD0B;110E 1169 11AA;CD0B;110E 1169 11AA; # (촋; 촋; 촋; 촋; 촋; ) HANGUL SYLLABLE COGS +CD0C;CD0C;110E 1169 11AB;CD0C;110E 1169 11AB; # (촌; 촌; 촌; 촌; 촌; ) HANGUL SYLLABLE CON +CD0D;CD0D;110E 1169 11AC;CD0D;110E 1169 11AC; # (촍; 촍; 촍; 촍; 촍; ) HANGUL SYLLABLE CONJ +CD0E;CD0E;110E 1169 11AD;CD0E;110E 1169 11AD; # (촎; 촎; 촎; 촎; 촎; ) HANGUL SYLLABLE CONH +CD0F;CD0F;110E 1169 11AE;CD0F;110E 1169 11AE; # (촏; 촏; 촏; 촏; 촏; ) HANGUL SYLLABLE COD +CD10;CD10;110E 1169 11AF;CD10;110E 1169 11AF; # (촐; 촐; 촐; 촐; 촐; ) HANGUL SYLLABLE COL +CD11;CD11;110E 1169 11B0;CD11;110E 1169 11B0; # (촑; 촑; 촑; 촑; 촑; ) HANGUL SYLLABLE COLG +CD12;CD12;110E 1169 11B1;CD12;110E 1169 11B1; # (촒; 촒; 촒; 촒; 촒; ) HANGUL SYLLABLE COLM +CD13;CD13;110E 1169 11B2;CD13;110E 1169 11B2; # (촓; 촓; 촓; 촓; 촓; ) HANGUL SYLLABLE COLB +CD14;CD14;110E 1169 11B3;CD14;110E 1169 11B3; # (촔; 촔; 촔; 촔; 촔; ) HANGUL SYLLABLE COLS +CD15;CD15;110E 1169 11B4;CD15;110E 1169 11B4; # (촕; 촕; 촕; 촕; 촕; ) HANGUL SYLLABLE COLT +CD16;CD16;110E 1169 11B5;CD16;110E 1169 11B5; # (촖; 촖; 촖; 촖; 촖; ) HANGUL SYLLABLE COLP +CD17;CD17;110E 1169 11B6;CD17;110E 1169 11B6; # (촗; 촗; 촗; 촗; 촗; ) HANGUL SYLLABLE COLH +CD18;CD18;110E 1169 11B7;CD18;110E 1169 11B7; # (촘; 촘; 촘; 촘; 촘; ) HANGUL SYLLABLE COM +CD19;CD19;110E 1169 11B8;CD19;110E 1169 11B8; # (촙; 촙; 촙; 촙; 촙; ) HANGUL SYLLABLE COB +CD1A;CD1A;110E 1169 11B9;CD1A;110E 1169 11B9; # (촚; 촚; 촚; 촚; 촚; ) HANGUL SYLLABLE COBS +CD1B;CD1B;110E 1169 11BA;CD1B;110E 1169 11BA; # (촛; 촛; 촛; 촛; 촛; ) HANGUL SYLLABLE COS +CD1C;CD1C;110E 1169 11BB;CD1C;110E 1169 11BB; # (촜; 촜; 촜; 촜; 촜; ) HANGUL SYLLABLE COSS +CD1D;CD1D;110E 1169 11BC;CD1D;110E 1169 11BC; # (총; 총; 총; 총; 총; ) HANGUL SYLLABLE CONG +CD1E;CD1E;110E 1169 11BD;CD1E;110E 1169 11BD; # (촞; 촞; 촞; 촞; 촞; ) HANGUL SYLLABLE COJ +CD1F;CD1F;110E 1169 11BE;CD1F;110E 1169 11BE; # (촟; 촟; 촟; 촟; 촟; ) HANGUL SYLLABLE COC +CD20;CD20;110E 1169 11BF;CD20;110E 1169 11BF; # (촠; 촠; 촠; 촠; 촠; ) HANGUL SYLLABLE COK +CD21;CD21;110E 1169 11C0;CD21;110E 1169 11C0; # (촡; 촡; 촡; 촡; 촡; ) HANGUL SYLLABLE COT +CD22;CD22;110E 1169 11C1;CD22;110E 1169 11C1; # (촢; 촢; 촢; 촢; 촢; ) HANGUL SYLLABLE COP +CD23;CD23;110E 1169 11C2;CD23;110E 1169 11C2; # (촣; 촣; 촣; 촣; 촣; ) HANGUL SYLLABLE COH +CD24;CD24;110E 116A;CD24;110E 116A; # (촤; 촤; 촤; 촤; 촤; ) HANGUL SYLLABLE CWA +CD25;CD25;110E 116A 11A8;CD25;110E 116A 11A8; # (촥; 촥; 촥; 촥; 촥; ) HANGUL SYLLABLE CWAG +CD26;CD26;110E 116A 11A9;CD26;110E 116A 11A9; # (촦; 촦; 촦; 촦; 촦; ) HANGUL SYLLABLE CWAGG +CD27;CD27;110E 116A 11AA;CD27;110E 116A 11AA; # (촧; 촧; 촧; 촧; 촧; ) HANGUL SYLLABLE CWAGS +CD28;CD28;110E 116A 11AB;CD28;110E 116A 11AB; # (촨; 촨; 촨; 촨; 촨; ) HANGUL SYLLABLE CWAN +CD29;CD29;110E 116A 11AC;CD29;110E 116A 11AC; # (촩; 촩; 촩; 촩; 촩; ) HANGUL SYLLABLE CWANJ +CD2A;CD2A;110E 116A 11AD;CD2A;110E 116A 11AD; # (촪; 촪; 촪; 촪; 촪; ) HANGUL SYLLABLE CWANH +CD2B;CD2B;110E 116A 11AE;CD2B;110E 116A 11AE; # (촫; 촫; 촫; 촫; 촫; ) HANGUL SYLLABLE CWAD +CD2C;CD2C;110E 116A 11AF;CD2C;110E 116A 11AF; # (촬; 촬; 촬; 촬; 촬; ) HANGUL SYLLABLE CWAL +CD2D;CD2D;110E 116A 11B0;CD2D;110E 116A 11B0; # (촭; 촭; 촭; 촭; 촭; ) HANGUL SYLLABLE CWALG +CD2E;CD2E;110E 116A 11B1;CD2E;110E 116A 11B1; # (촮; 촮; 촮; 촮; 촮; ) HANGUL SYLLABLE CWALM +CD2F;CD2F;110E 116A 11B2;CD2F;110E 116A 11B2; # (촯; 촯; 촯; 촯; 촯; ) HANGUL SYLLABLE CWALB +CD30;CD30;110E 116A 11B3;CD30;110E 116A 11B3; # (촰; 촰; 촰; 촰; 촰; ) HANGUL SYLLABLE CWALS +CD31;CD31;110E 116A 11B4;CD31;110E 116A 11B4; # (촱; 촱; 촱; 촱; 촱; ) HANGUL SYLLABLE CWALT +CD32;CD32;110E 116A 11B5;CD32;110E 116A 11B5; # (촲; 촲; 촲; 촲; 촲; ) HANGUL SYLLABLE CWALP +CD33;CD33;110E 116A 11B6;CD33;110E 116A 11B6; # (촳; 촳; 촳; 촳; 촳; ) HANGUL SYLLABLE CWALH +CD34;CD34;110E 116A 11B7;CD34;110E 116A 11B7; # (촴; 촴; 촴; 촴; 촴; ) HANGUL SYLLABLE CWAM +CD35;CD35;110E 116A 11B8;CD35;110E 116A 11B8; # (촵; 촵; 촵; 촵; 촵; ) HANGUL SYLLABLE CWAB +CD36;CD36;110E 116A 11B9;CD36;110E 116A 11B9; # (촶; 촶; 촶; 촶; 촶; ) HANGUL SYLLABLE CWABS +CD37;CD37;110E 116A 11BA;CD37;110E 116A 11BA; # (촷; 촷; 촷; 촷; 촷; ) HANGUL SYLLABLE CWAS +CD38;CD38;110E 116A 11BB;CD38;110E 116A 11BB; # (촸; 촸; 촸; 촸; 촸; ) HANGUL SYLLABLE CWASS +CD39;CD39;110E 116A 11BC;CD39;110E 116A 11BC; # (촹; 촹; 촹; 촹; 촹; ) HANGUL SYLLABLE CWANG +CD3A;CD3A;110E 116A 11BD;CD3A;110E 116A 11BD; # (촺; 촺; 촺; 촺; 촺; ) HANGUL SYLLABLE CWAJ +CD3B;CD3B;110E 116A 11BE;CD3B;110E 116A 11BE; # (촻; 촻; 촻; 촻; 촻; ) HANGUL SYLLABLE CWAC +CD3C;CD3C;110E 116A 11BF;CD3C;110E 116A 11BF; # (촼; 촼; 촼; 촼; 촼; ) HANGUL SYLLABLE CWAK +CD3D;CD3D;110E 116A 11C0;CD3D;110E 116A 11C0; # (촽; 촽; 촽; 촽; 촽; ) HANGUL SYLLABLE CWAT +CD3E;CD3E;110E 116A 11C1;CD3E;110E 116A 11C1; # (촾; 촾; 촾; 촾; 촾; ) HANGUL SYLLABLE CWAP +CD3F;CD3F;110E 116A 11C2;CD3F;110E 116A 11C2; # (촿; 촿; 촿; 촿; 촿; ) HANGUL SYLLABLE CWAH +CD40;CD40;110E 116B;CD40;110E 116B; # (쵀; 쵀; 쵀; 쵀; 쵀; ) HANGUL SYLLABLE CWAE +CD41;CD41;110E 116B 11A8;CD41;110E 116B 11A8; # (쵁; 쵁; 쵁; 쵁; 쵁; ) HANGUL SYLLABLE CWAEG +CD42;CD42;110E 116B 11A9;CD42;110E 116B 11A9; # (쵂; 쵂; 쵂; 쵂; 쵂; ) HANGUL SYLLABLE CWAEGG +CD43;CD43;110E 116B 11AA;CD43;110E 116B 11AA; # (쵃; 쵃; 쵃; 쵃; 쵃; ) HANGUL SYLLABLE CWAEGS +CD44;CD44;110E 116B 11AB;CD44;110E 116B 11AB; # (쵄; 쵄; 쵄; 쵄; 쵄; ) HANGUL SYLLABLE CWAEN +CD45;CD45;110E 116B 11AC;CD45;110E 116B 11AC; # (쵅; 쵅; 쵅; 쵅; 쵅; ) HANGUL SYLLABLE CWAENJ +CD46;CD46;110E 116B 11AD;CD46;110E 116B 11AD; # (쵆; 쵆; 쵆; 쵆; 쵆; ) HANGUL SYLLABLE CWAENH +CD47;CD47;110E 116B 11AE;CD47;110E 116B 11AE; # (쵇; 쵇; 쵇; 쵇; 쵇; ) HANGUL SYLLABLE CWAED +CD48;CD48;110E 116B 11AF;CD48;110E 116B 11AF; # (쵈; 쵈; 쵈; 쵈; 쵈; ) HANGUL SYLLABLE CWAEL +CD49;CD49;110E 116B 11B0;CD49;110E 116B 11B0; # (쵉; 쵉; 쵉; 쵉; 쵉; ) HANGUL SYLLABLE CWAELG +CD4A;CD4A;110E 116B 11B1;CD4A;110E 116B 11B1; # (쵊; 쵊; 쵊; 쵊; 쵊; ) HANGUL SYLLABLE CWAELM +CD4B;CD4B;110E 116B 11B2;CD4B;110E 116B 11B2; # (쵋; 쵋; 쵋; 쵋; 쵋; ) HANGUL SYLLABLE CWAELB +CD4C;CD4C;110E 116B 11B3;CD4C;110E 116B 11B3; # (쵌; 쵌; 쵌; 쵌; 쵌; ) HANGUL SYLLABLE CWAELS +CD4D;CD4D;110E 116B 11B4;CD4D;110E 116B 11B4; # (쵍; 쵍; 쵍; 쵍; 쵍; ) HANGUL SYLLABLE CWAELT +CD4E;CD4E;110E 116B 11B5;CD4E;110E 116B 11B5; # (쵎; 쵎; 쵎; 쵎; 쵎; ) HANGUL SYLLABLE CWAELP +CD4F;CD4F;110E 116B 11B6;CD4F;110E 116B 11B6; # (쵏; 쵏; 쵏; 쵏; 쵏; ) HANGUL SYLLABLE CWAELH +CD50;CD50;110E 116B 11B7;CD50;110E 116B 11B7; # (쵐; 쵐; 쵐; 쵐; 쵐; ) HANGUL SYLLABLE CWAEM +CD51;CD51;110E 116B 11B8;CD51;110E 116B 11B8; # (쵑; 쵑; 쵑; 쵑; 쵑; ) HANGUL SYLLABLE CWAEB +CD52;CD52;110E 116B 11B9;CD52;110E 116B 11B9; # (쵒; 쵒; 쵒; 쵒; 쵒; ) HANGUL SYLLABLE CWAEBS +CD53;CD53;110E 116B 11BA;CD53;110E 116B 11BA; # (쵓; 쵓; 쵓; 쵓; 쵓; ) HANGUL SYLLABLE CWAES +CD54;CD54;110E 116B 11BB;CD54;110E 116B 11BB; # (쵔; 쵔; 쵔; 쵔; 쵔; ) HANGUL SYLLABLE CWAESS +CD55;CD55;110E 116B 11BC;CD55;110E 116B 11BC; # (쵕; 쵕; 쵕; 쵕; 쵕; ) HANGUL SYLLABLE CWAENG +CD56;CD56;110E 116B 11BD;CD56;110E 116B 11BD; # (쵖; 쵖; 쵖; 쵖; 쵖; ) HANGUL SYLLABLE CWAEJ +CD57;CD57;110E 116B 11BE;CD57;110E 116B 11BE; # (쵗; 쵗; 쵗; 쵗; 쵗; ) HANGUL SYLLABLE CWAEC +CD58;CD58;110E 116B 11BF;CD58;110E 116B 11BF; # (쵘; 쵘; 쵘; 쵘; 쵘; ) HANGUL SYLLABLE CWAEK +CD59;CD59;110E 116B 11C0;CD59;110E 116B 11C0; # (쵙; 쵙; 쵙; 쵙; 쵙; ) HANGUL SYLLABLE CWAET +CD5A;CD5A;110E 116B 11C1;CD5A;110E 116B 11C1; # (쵚; 쵚; 쵚; 쵚; 쵚; ) HANGUL SYLLABLE CWAEP +CD5B;CD5B;110E 116B 11C2;CD5B;110E 116B 11C2; # (쵛; 쵛; 쵛; 쵛; 쵛; ) HANGUL SYLLABLE CWAEH +CD5C;CD5C;110E 116C;CD5C;110E 116C; # (최; 최; 최; 최; 최; ) HANGUL SYLLABLE COE +CD5D;CD5D;110E 116C 11A8;CD5D;110E 116C 11A8; # (쵝; 쵝; 쵝; 쵝; 쵝; ) HANGUL SYLLABLE COEG +CD5E;CD5E;110E 116C 11A9;CD5E;110E 116C 11A9; # (쵞; 쵞; 쵞; 쵞; 쵞; ) HANGUL SYLLABLE COEGG +CD5F;CD5F;110E 116C 11AA;CD5F;110E 116C 11AA; # (쵟; 쵟; 쵟; 쵟; 쵟; ) HANGUL SYLLABLE COEGS +CD60;CD60;110E 116C 11AB;CD60;110E 116C 11AB; # (쵠; 쵠; 쵠; 쵠; 쵠; ) HANGUL SYLLABLE COEN +CD61;CD61;110E 116C 11AC;CD61;110E 116C 11AC; # (쵡; 쵡; 쵡; 쵡; 쵡; ) HANGUL SYLLABLE COENJ +CD62;CD62;110E 116C 11AD;CD62;110E 116C 11AD; # (쵢; 쵢; 쵢; 쵢; 쵢; ) HANGUL SYLLABLE COENH +CD63;CD63;110E 116C 11AE;CD63;110E 116C 11AE; # (쵣; 쵣; 쵣; 쵣; 쵣; ) HANGUL SYLLABLE COED +CD64;CD64;110E 116C 11AF;CD64;110E 116C 11AF; # (쵤; 쵤; 쵤; 쵤; 쵤; ) HANGUL SYLLABLE COEL +CD65;CD65;110E 116C 11B0;CD65;110E 116C 11B0; # (쵥; 쵥; 쵥; 쵥; 쵥; ) HANGUL SYLLABLE COELG +CD66;CD66;110E 116C 11B1;CD66;110E 116C 11B1; # (쵦; 쵦; 쵦; 쵦; 쵦; ) HANGUL SYLLABLE COELM +CD67;CD67;110E 116C 11B2;CD67;110E 116C 11B2; # (쵧; 쵧; 쵧; 쵧; 쵧; ) HANGUL SYLLABLE COELB +CD68;CD68;110E 116C 11B3;CD68;110E 116C 11B3; # (쵨; 쵨; 쵨; 쵨; 쵨; ) HANGUL SYLLABLE COELS +CD69;CD69;110E 116C 11B4;CD69;110E 116C 11B4; # (쵩; 쵩; 쵩; 쵩; 쵩; ) HANGUL SYLLABLE COELT +CD6A;CD6A;110E 116C 11B5;CD6A;110E 116C 11B5; # (쵪; 쵪; 쵪; 쵪; 쵪; ) HANGUL SYLLABLE COELP +CD6B;CD6B;110E 116C 11B6;CD6B;110E 116C 11B6; # (쵫; 쵫; 쵫; 쵫; 쵫; ) HANGUL SYLLABLE COELH +CD6C;CD6C;110E 116C 11B7;CD6C;110E 116C 11B7; # (쵬; 쵬; 쵬; 쵬; 쵬; ) HANGUL SYLLABLE COEM +CD6D;CD6D;110E 116C 11B8;CD6D;110E 116C 11B8; # (쵭; 쵭; 쵭; 쵭; 쵭; ) HANGUL SYLLABLE COEB +CD6E;CD6E;110E 116C 11B9;CD6E;110E 116C 11B9; # (쵮; 쵮; 쵮; 쵮; 쵮; ) HANGUL SYLLABLE COEBS +CD6F;CD6F;110E 116C 11BA;CD6F;110E 116C 11BA; # (쵯; 쵯; 쵯; 쵯; 쵯; ) HANGUL SYLLABLE COES +CD70;CD70;110E 116C 11BB;CD70;110E 116C 11BB; # (쵰; 쵰; 쵰; 쵰; 쵰; ) HANGUL SYLLABLE COESS +CD71;CD71;110E 116C 11BC;CD71;110E 116C 11BC; # (쵱; 쵱; 쵱; 쵱; 쵱; ) HANGUL SYLLABLE COENG +CD72;CD72;110E 116C 11BD;CD72;110E 116C 11BD; # (쵲; 쵲; 쵲; 쵲; 쵲; ) HANGUL SYLLABLE COEJ +CD73;CD73;110E 116C 11BE;CD73;110E 116C 11BE; # (쵳; 쵳; 쵳; 쵳; 쵳; ) HANGUL SYLLABLE COEC +CD74;CD74;110E 116C 11BF;CD74;110E 116C 11BF; # (쵴; 쵴; 쵴; 쵴; 쵴; ) HANGUL SYLLABLE COEK +CD75;CD75;110E 116C 11C0;CD75;110E 116C 11C0; # (쵵; 쵵; 쵵; 쵵; 쵵; ) HANGUL SYLLABLE COET +CD76;CD76;110E 116C 11C1;CD76;110E 116C 11C1; # (쵶; 쵶; 쵶; 쵶; 쵶; ) HANGUL SYLLABLE COEP +CD77;CD77;110E 116C 11C2;CD77;110E 116C 11C2; # (쵷; 쵷; 쵷; 쵷; 쵷; ) HANGUL SYLLABLE COEH +CD78;CD78;110E 116D;CD78;110E 116D; # (쵸; 쵸; 쵸; 쵸; 쵸; ) HANGUL SYLLABLE CYO +CD79;CD79;110E 116D 11A8;CD79;110E 116D 11A8; # (쵹; 쵹; 쵹; 쵹; 쵹; ) HANGUL SYLLABLE CYOG +CD7A;CD7A;110E 116D 11A9;CD7A;110E 116D 11A9; # (쵺; 쵺; 쵺; 쵺; 쵺; ) HANGUL SYLLABLE CYOGG +CD7B;CD7B;110E 116D 11AA;CD7B;110E 116D 11AA; # (쵻; 쵻; 쵻; 쵻; 쵻; ) HANGUL SYLLABLE CYOGS +CD7C;CD7C;110E 116D 11AB;CD7C;110E 116D 11AB; # (쵼; 쵼; 쵼; 쵼; 쵼; ) HANGUL SYLLABLE CYON +CD7D;CD7D;110E 116D 11AC;CD7D;110E 116D 11AC; # (쵽; 쵽; 쵽; 쵽; 쵽; ) HANGUL SYLLABLE CYONJ +CD7E;CD7E;110E 116D 11AD;CD7E;110E 116D 11AD; # (쵾; 쵾; 쵾; 쵾; 쵾; ) HANGUL SYLLABLE CYONH +CD7F;CD7F;110E 116D 11AE;CD7F;110E 116D 11AE; # (쵿; 쵿; 쵿; 쵿; 쵿; ) HANGUL SYLLABLE CYOD +CD80;CD80;110E 116D 11AF;CD80;110E 116D 11AF; # (춀; 춀; 춀; 춀; 춀; ) HANGUL SYLLABLE CYOL +CD81;CD81;110E 116D 11B0;CD81;110E 116D 11B0; # (춁; 춁; 춁; 춁; 춁; ) HANGUL SYLLABLE CYOLG +CD82;CD82;110E 116D 11B1;CD82;110E 116D 11B1; # (춂; 춂; 춂; 춂; 춂; ) HANGUL SYLLABLE CYOLM +CD83;CD83;110E 116D 11B2;CD83;110E 116D 11B2; # (춃; 춃; 춃; 춃; 춃; ) HANGUL SYLLABLE CYOLB +CD84;CD84;110E 116D 11B3;CD84;110E 116D 11B3; # (춄; 춄; 춄; 춄; 춄; ) HANGUL SYLLABLE CYOLS +CD85;CD85;110E 116D 11B4;CD85;110E 116D 11B4; # (춅; 춅; 춅; 춅; 춅; ) HANGUL SYLLABLE CYOLT +CD86;CD86;110E 116D 11B5;CD86;110E 116D 11B5; # (춆; 춆; 춆; 춆; 춆; ) HANGUL SYLLABLE CYOLP +CD87;CD87;110E 116D 11B6;CD87;110E 116D 11B6; # (춇; 춇; 춇; 춇; 춇; ) HANGUL SYLLABLE CYOLH +CD88;CD88;110E 116D 11B7;CD88;110E 116D 11B7; # (춈; 춈; 춈; 춈; 춈; ) HANGUL SYLLABLE CYOM +CD89;CD89;110E 116D 11B8;CD89;110E 116D 11B8; # (춉; 춉; 춉; 춉; 춉; ) HANGUL SYLLABLE CYOB +CD8A;CD8A;110E 116D 11B9;CD8A;110E 116D 11B9; # (춊; 춊; 춊; 춊; 춊; ) HANGUL SYLLABLE CYOBS +CD8B;CD8B;110E 116D 11BA;CD8B;110E 116D 11BA; # (춋; 춋; 춋; 춋; 춋; ) HANGUL SYLLABLE CYOS +CD8C;CD8C;110E 116D 11BB;CD8C;110E 116D 11BB; # (춌; 춌; 춌; 춌; 춌; ) HANGUL SYLLABLE CYOSS +CD8D;CD8D;110E 116D 11BC;CD8D;110E 116D 11BC; # (춍; 춍; 춍; 춍; 춍; ) HANGUL SYLLABLE CYONG +CD8E;CD8E;110E 116D 11BD;CD8E;110E 116D 11BD; # (춎; 춎; 춎; 춎; 춎; ) HANGUL SYLLABLE CYOJ +CD8F;CD8F;110E 116D 11BE;CD8F;110E 116D 11BE; # (춏; 춏; 춏; 춏; 춏; ) HANGUL SYLLABLE CYOC +CD90;CD90;110E 116D 11BF;CD90;110E 116D 11BF; # (춐; 춐; 춐; 춐; 춐; ) HANGUL SYLLABLE CYOK +CD91;CD91;110E 116D 11C0;CD91;110E 116D 11C0; # (춑; 춑; 춑; 춑; 춑; ) HANGUL SYLLABLE CYOT +CD92;CD92;110E 116D 11C1;CD92;110E 116D 11C1; # (춒; 춒; 춒; 춒; 춒; ) HANGUL SYLLABLE CYOP +CD93;CD93;110E 116D 11C2;CD93;110E 116D 11C2; # (춓; 춓; 춓; 춓; 춓; ) HANGUL SYLLABLE CYOH +CD94;CD94;110E 116E;CD94;110E 116E; # (추; 추; 추; 추; 추; ) HANGUL SYLLABLE CU +CD95;CD95;110E 116E 11A8;CD95;110E 116E 11A8; # (축; 축; 축; 축; 축; ) HANGUL SYLLABLE CUG +CD96;CD96;110E 116E 11A9;CD96;110E 116E 11A9; # (춖; 춖; 춖; 춖; 춖; ) HANGUL SYLLABLE CUGG +CD97;CD97;110E 116E 11AA;CD97;110E 116E 11AA; # (춗; 춗; 춗; 춗; 춗; ) HANGUL SYLLABLE CUGS +CD98;CD98;110E 116E 11AB;CD98;110E 116E 11AB; # (춘; 춘; 춘; 춘; 춘; ) HANGUL SYLLABLE CUN +CD99;CD99;110E 116E 11AC;CD99;110E 116E 11AC; # (춙; 춙; 춙; 춙; 춙; ) HANGUL SYLLABLE CUNJ +CD9A;CD9A;110E 116E 11AD;CD9A;110E 116E 11AD; # (춚; 춚; 춚; 춚; 춚; ) HANGUL SYLLABLE CUNH +CD9B;CD9B;110E 116E 11AE;CD9B;110E 116E 11AE; # (춛; 춛; 춛; 춛; 춛; ) HANGUL SYLLABLE CUD +CD9C;CD9C;110E 116E 11AF;CD9C;110E 116E 11AF; # (출; 출; 출; 출; 출; ) HANGUL SYLLABLE CUL +CD9D;CD9D;110E 116E 11B0;CD9D;110E 116E 11B0; # (춝; 춝; 춝; 춝; 춝; ) HANGUL SYLLABLE CULG +CD9E;CD9E;110E 116E 11B1;CD9E;110E 116E 11B1; # (춞; 춞; 춞; 춞; 춞; ) HANGUL SYLLABLE CULM +CD9F;CD9F;110E 116E 11B2;CD9F;110E 116E 11B2; # (춟; 춟; 춟; 춟; 춟; ) HANGUL SYLLABLE CULB +CDA0;CDA0;110E 116E 11B3;CDA0;110E 116E 11B3; # (춠; 춠; 춠; 춠; 춠; ) HANGUL SYLLABLE CULS +CDA1;CDA1;110E 116E 11B4;CDA1;110E 116E 11B4; # (춡; 춡; 춡; 춡; 춡; ) HANGUL SYLLABLE CULT +CDA2;CDA2;110E 116E 11B5;CDA2;110E 116E 11B5; # (춢; 춢; 춢; 춢; 춢; ) HANGUL SYLLABLE CULP +CDA3;CDA3;110E 116E 11B6;CDA3;110E 116E 11B6; # (춣; 춣; 춣; 춣; 춣; ) HANGUL SYLLABLE CULH +CDA4;CDA4;110E 116E 11B7;CDA4;110E 116E 11B7; # (춤; 춤; 춤; 춤; 춤; ) HANGUL SYLLABLE CUM +CDA5;CDA5;110E 116E 11B8;CDA5;110E 116E 11B8; # (춥; 춥; 춥; 춥; 춥; ) HANGUL SYLLABLE CUB +CDA6;CDA6;110E 116E 11B9;CDA6;110E 116E 11B9; # (춦; 춦; 춦; 춦; 춦; ) HANGUL SYLLABLE CUBS +CDA7;CDA7;110E 116E 11BA;CDA7;110E 116E 11BA; # (춧; 춧; 춧; 춧; 춧; ) HANGUL SYLLABLE CUS +CDA8;CDA8;110E 116E 11BB;CDA8;110E 116E 11BB; # (춨; 춨; 춨; 춨; 춨; ) HANGUL SYLLABLE CUSS +CDA9;CDA9;110E 116E 11BC;CDA9;110E 116E 11BC; # (충; 충; 충; 충; 충; ) HANGUL SYLLABLE CUNG +CDAA;CDAA;110E 116E 11BD;CDAA;110E 116E 11BD; # (춪; 춪; 춪; 춪; 춪; ) HANGUL SYLLABLE CUJ +CDAB;CDAB;110E 116E 11BE;CDAB;110E 116E 11BE; # (춫; 춫; 춫; 춫; 춫; ) HANGUL SYLLABLE CUC +CDAC;CDAC;110E 116E 11BF;CDAC;110E 116E 11BF; # (춬; 춬; 춬; 춬; 춬; ) HANGUL SYLLABLE CUK +CDAD;CDAD;110E 116E 11C0;CDAD;110E 116E 11C0; # (춭; 춭; 춭; 춭; 춭; ) HANGUL SYLLABLE CUT +CDAE;CDAE;110E 116E 11C1;CDAE;110E 116E 11C1; # (춮; 춮; 춮; 춮; 춮; ) HANGUL SYLLABLE CUP +CDAF;CDAF;110E 116E 11C2;CDAF;110E 116E 11C2; # (춯; 춯; 춯; 춯; 춯; ) HANGUL SYLLABLE CUH +CDB0;CDB0;110E 116F;CDB0;110E 116F; # (춰; 춰; 춰; 춰; 춰; ) HANGUL SYLLABLE CWEO +CDB1;CDB1;110E 116F 11A8;CDB1;110E 116F 11A8; # (춱; 춱; 춱; 춱; 춱; ) HANGUL SYLLABLE CWEOG +CDB2;CDB2;110E 116F 11A9;CDB2;110E 116F 11A9; # (춲; 춲; 춲; 춲; 춲; ) HANGUL SYLLABLE CWEOGG +CDB3;CDB3;110E 116F 11AA;CDB3;110E 116F 11AA; # (춳; 춳; 춳; 춳; 춳; ) HANGUL SYLLABLE CWEOGS +CDB4;CDB4;110E 116F 11AB;CDB4;110E 116F 11AB; # (춴; 춴; 춴; 춴; 춴; ) HANGUL SYLLABLE CWEON +CDB5;CDB5;110E 116F 11AC;CDB5;110E 116F 11AC; # (춵; 춵; 춵; 춵; 춵; ) HANGUL SYLLABLE CWEONJ +CDB6;CDB6;110E 116F 11AD;CDB6;110E 116F 11AD; # (춶; 춶; 춶; 춶; 춶; ) HANGUL SYLLABLE CWEONH +CDB7;CDB7;110E 116F 11AE;CDB7;110E 116F 11AE; # (춷; 춷; 춷; 춷; 춷; ) HANGUL SYLLABLE CWEOD +CDB8;CDB8;110E 116F 11AF;CDB8;110E 116F 11AF; # (춸; 춸; 춸; 춸; 춸; ) HANGUL SYLLABLE CWEOL +CDB9;CDB9;110E 116F 11B0;CDB9;110E 116F 11B0; # (춹; 춹; 춹; 춹; 춹; ) HANGUL SYLLABLE CWEOLG +CDBA;CDBA;110E 116F 11B1;CDBA;110E 116F 11B1; # (춺; 춺; 춺; 춺; 춺; ) HANGUL SYLLABLE CWEOLM +CDBB;CDBB;110E 116F 11B2;CDBB;110E 116F 11B2; # (춻; 춻; 춻; 춻; 춻; ) HANGUL SYLLABLE CWEOLB +CDBC;CDBC;110E 116F 11B3;CDBC;110E 116F 11B3; # (춼; 춼; 춼; 춼; 춼; ) HANGUL SYLLABLE CWEOLS +CDBD;CDBD;110E 116F 11B4;CDBD;110E 116F 11B4; # (춽; 춽; 춽; 춽; 춽; ) HANGUL SYLLABLE CWEOLT +CDBE;CDBE;110E 116F 11B5;CDBE;110E 116F 11B5; # (춾; 춾; 춾; 춾; 춾; ) HANGUL SYLLABLE CWEOLP +CDBF;CDBF;110E 116F 11B6;CDBF;110E 116F 11B6; # (춿; 춿; 춿; 춿; 춿; ) HANGUL SYLLABLE CWEOLH +CDC0;CDC0;110E 116F 11B7;CDC0;110E 116F 11B7; # (췀; 췀; 췀; 췀; 췀; ) HANGUL SYLLABLE CWEOM +CDC1;CDC1;110E 116F 11B8;CDC1;110E 116F 11B8; # (췁; 췁; 췁; 췁; 췁; ) HANGUL SYLLABLE CWEOB +CDC2;CDC2;110E 116F 11B9;CDC2;110E 116F 11B9; # (췂; 췂; 췂; 췂; 췂; ) HANGUL SYLLABLE CWEOBS +CDC3;CDC3;110E 116F 11BA;CDC3;110E 116F 11BA; # (췃; 췃; 췃; 췃; 췃; ) HANGUL SYLLABLE CWEOS +CDC4;CDC4;110E 116F 11BB;CDC4;110E 116F 11BB; # (췄; 췄; 췄; 췄; 췄; ) HANGUL SYLLABLE CWEOSS +CDC5;CDC5;110E 116F 11BC;CDC5;110E 116F 11BC; # (췅; 췅; 췅; 췅; 췅; ) HANGUL SYLLABLE CWEONG +CDC6;CDC6;110E 116F 11BD;CDC6;110E 116F 11BD; # (췆; 췆; 췆; 췆; 췆; ) HANGUL SYLLABLE CWEOJ +CDC7;CDC7;110E 116F 11BE;CDC7;110E 116F 11BE; # (췇; 췇; 췇; 췇; 췇; ) HANGUL SYLLABLE CWEOC +CDC8;CDC8;110E 116F 11BF;CDC8;110E 116F 11BF; # (췈; 췈; 췈; 췈; 췈; ) HANGUL SYLLABLE CWEOK +CDC9;CDC9;110E 116F 11C0;CDC9;110E 116F 11C0; # (췉; 췉; 췉; 췉; 췉; ) HANGUL SYLLABLE CWEOT +CDCA;CDCA;110E 116F 11C1;CDCA;110E 116F 11C1; # (췊; 췊; 췊; 췊; 췊; ) HANGUL SYLLABLE CWEOP +CDCB;CDCB;110E 116F 11C2;CDCB;110E 116F 11C2; # (췋; 췋; 췋; 췋; 췋; ) HANGUL SYLLABLE CWEOH +CDCC;CDCC;110E 1170;CDCC;110E 1170; # (췌; 췌; 췌; 췌; 췌; ) HANGUL SYLLABLE CWE +CDCD;CDCD;110E 1170 11A8;CDCD;110E 1170 11A8; # (췍; 췍; 췍; 췍; 췍; ) HANGUL SYLLABLE CWEG +CDCE;CDCE;110E 1170 11A9;CDCE;110E 1170 11A9; # (췎; 췎; 췎; 췎; 췎; ) HANGUL SYLLABLE CWEGG +CDCF;CDCF;110E 1170 11AA;CDCF;110E 1170 11AA; # (췏; 췏; 췏; 췏; 췏; ) HANGUL SYLLABLE CWEGS +CDD0;CDD0;110E 1170 11AB;CDD0;110E 1170 11AB; # (췐; 췐; 췐; 췐; 췐; ) HANGUL SYLLABLE CWEN +CDD1;CDD1;110E 1170 11AC;CDD1;110E 1170 11AC; # (췑; 췑; 췑; 췑; 췑; ) HANGUL SYLLABLE CWENJ +CDD2;CDD2;110E 1170 11AD;CDD2;110E 1170 11AD; # (췒; 췒; 췒; 췒; 췒; ) HANGUL SYLLABLE CWENH +CDD3;CDD3;110E 1170 11AE;CDD3;110E 1170 11AE; # (췓; 췓; 췓; 췓; 췓; ) HANGUL SYLLABLE CWED +CDD4;CDD4;110E 1170 11AF;CDD4;110E 1170 11AF; # (췔; 췔; 췔; 췔; 췔; ) HANGUL SYLLABLE CWEL +CDD5;CDD5;110E 1170 11B0;CDD5;110E 1170 11B0; # (췕; 췕; 췕; 췕; 췕; ) HANGUL SYLLABLE CWELG +CDD6;CDD6;110E 1170 11B1;CDD6;110E 1170 11B1; # (췖; 췖; 췖; 췖; 췖; ) HANGUL SYLLABLE CWELM +CDD7;CDD7;110E 1170 11B2;CDD7;110E 1170 11B2; # (췗; 췗; 췗; 췗; 췗; ) HANGUL SYLLABLE CWELB +CDD8;CDD8;110E 1170 11B3;CDD8;110E 1170 11B3; # (췘; 췘; 췘; 췘; 췘; ) HANGUL SYLLABLE CWELS +CDD9;CDD9;110E 1170 11B4;CDD9;110E 1170 11B4; # (췙; 췙; 췙; 췙; 췙; ) HANGUL SYLLABLE CWELT +CDDA;CDDA;110E 1170 11B5;CDDA;110E 1170 11B5; # (췚; 췚; 췚; 췚; 췚; ) HANGUL SYLLABLE CWELP +CDDB;CDDB;110E 1170 11B6;CDDB;110E 1170 11B6; # (췛; 췛; 췛; 췛; 췛; ) HANGUL SYLLABLE CWELH +CDDC;CDDC;110E 1170 11B7;CDDC;110E 1170 11B7; # (췜; 췜; 췜; 췜; 췜; ) HANGUL SYLLABLE CWEM +CDDD;CDDD;110E 1170 11B8;CDDD;110E 1170 11B8; # (췝; 췝; 췝; 췝; 췝; ) HANGUL SYLLABLE CWEB +CDDE;CDDE;110E 1170 11B9;CDDE;110E 1170 11B9; # (췞; 췞; 췞; 췞; 췞; ) HANGUL SYLLABLE CWEBS +CDDF;CDDF;110E 1170 11BA;CDDF;110E 1170 11BA; # (췟; 췟; 췟; 췟; 췟; ) HANGUL SYLLABLE CWES +CDE0;CDE0;110E 1170 11BB;CDE0;110E 1170 11BB; # (췠; 췠; 췠; 췠; 췠; ) HANGUL SYLLABLE CWESS +CDE1;CDE1;110E 1170 11BC;CDE1;110E 1170 11BC; # (췡; 췡; 췡; 췡; 췡; ) HANGUL SYLLABLE CWENG +CDE2;CDE2;110E 1170 11BD;CDE2;110E 1170 11BD; # (췢; 췢; 췢; 췢; 췢; ) HANGUL SYLLABLE CWEJ +CDE3;CDE3;110E 1170 11BE;CDE3;110E 1170 11BE; # (췣; 췣; 췣; 췣; 췣; ) HANGUL SYLLABLE CWEC +CDE4;CDE4;110E 1170 11BF;CDE4;110E 1170 11BF; # (췤; 췤; 췤; 췤; 췤; ) HANGUL SYLLABLE CWEK +CDE5;CDE5;110E 1170 11C0;CDE5;110E 1170 11C0; # (췥; 췥; 췥; 췥; 췥; ) HANGUL SYLLABLE CWET +CDE6;CDE6;110E 1170 11C1;CDE6;110E 1170 11C1; # (췦; 췦; 췦; 췦; 췦; ) HANGUL SYLLABLE CWEP +CDE7;CDE7;110E 1170 11C2;CDE7;110E 1170 11C2; # (췧; 췧; 췧; 췧; 췧; ) HANGUL SYLLABLE CWEH +CDE8;CDE8;110E 1171;CDE8;110E 1171; # (취; 취; 취; 취; 취; ) HANGUL SYLLABLE CWI +CDE9;CDE9;110E 1171 11A8;CDE9;110E 1171 11A8; # (췩; 췩; 췩; 췩; 췩; ) HANGUL SYLLABLE CWIG +CDEA;CDEA;110E 1171 11A9;CDEA;110E 1171 11A9; # (췪; 췪; 췪; 췪; 췪; ) HANGUL SYLLABLE CWIGG +CDEB;CDEB;110E 1171 11AA;CDEB;110E 1171 11AA; # (췫; 췫; 췫; 췫; 췫; ) HANGUL SYLLABLE CWIGS +CDEC;CDEC;110E 1171 11AB;CDEC;110E 1171 11AB; # (췬; 췬; 췬; 췬; 췬; ) HANGUL SYLLABLE CWIN +CDED;CDED;110E 1171 11AC;CDED;110E 1171 11AC; # (췭; 췭; 췭; 췭; 췭; ) HANGUL SYLLABLE CWINJ +CDEE;CDEE;110E 1171 11AD;CDEE;110E 1171 11AD; # (췮; 췮; 췮; 췮; 췮; ) HANGUL SYLLABLE CWINH +CDEF;CDEF;110E 1171 11AE;CDEF;110E 1171 11AE; # (췯; 췯; 췯; 췯; 췯; ) HANGUL SYLLABLE CWID +CDF0;CDF0;110E 1171 11AF;CDF0;110E 1171 11AF; # (췰; 췰; 췰; 췰; 췰; ) HANGUL SYLLABLE CWIL +CDF1;CDF1;110E 1171 11B0;CDF1;110E 1171 11B0; # (췱; 췱; 췱; 췱; 췱; ) HANGUL SYLLABLE CWILG +CDF2;CDF2;110E 1171 11B1;CDF2;110E 1171 11B1; # (췲; 췲; 췲; 췲; 췲; ) HANGUL SYLLABLE CWILM +CDF3;CDF3;110E 1171 11B2;CDF3;110E 1171 11B2; # (췳; 췳; 췳; 췳; 췳; ) HANGUL SYLLABLE CWILB +CDF4;CDF4;110E 1171 11B3;CDF4;110E 1171 11B3; # (췴; 췴; 췴; 췴; 췴; ) HANGUL SYLLABLE CWILS +CDF5;CDF5;110E 1171 11B4;CDF5;110E 1171 11B4; # (췵; 췵; 췵; 췵; 췵; ) HANGUL SYLLABLE CWILT +CDF6;CDF6;110E 1171 11B5;CDF6;110E 1171 11B5; # (췶; 췶; 췶; 췶; 췶; ) HANGUL SYLLABLE CWILP +CDF7;CDF7;110E 1171 11B6;CDF7;110E 1171 11B6; # (췷; 췷; 췷; 췷; 췷; ) HANGUL SYLLABLE CWILH +CDF8;CDF8;110E 1171 11B7;CDF8;110E 1171 11B7; # (췸; 췸; 췸; 췸; 췸; ) HANGUL SYLLABLE CWIM +CDF9;CDF9;110E 1171 11B8;CDF9;110E 1171 11B8; # (췹; 췹; 췹; 췹; 췹; ) HANGUL SYLLABLE CWIB +CDFA;CDFA;110E 1171 11B9;CDFA;110E 1171 11B9; # (췺; 췺; 췺; 췺; 췺; ) HANGUL SYLLABLE CWIBS +CDFB;CDFB;110E 1171 11BA;CDFB;110E 1171 11BA; # (췻; 췻; 췻; 췻; 췻; ) HANGUL SYLLABLE CWIS +CDFC;CDFC;110E 1171 11BB;CDFC;110E 1171 11BB; # (췼; 췼; 췼; 췼; 췼; ) HANGUL SYLLABLE CWISS +CDFD;CDFD;110E 1171 11BC;CDFD;110E 1171 11BC; # (췽; 췽; 췽; 췽; 췽; ) HANGUL SYLLABLE CWING +CDFE;CDFE;110E 1171 11BD;CDFE;110E 1171 11BD; # (췾; 췾; 췾; 췾; 췾; ) HANGUL SYLLABLE CWIJ +CDFF;CDFF;110E 1171 11BE;CDFF;110E 1171 11BE; # (췿; 췿; 췿; 췿; 췿; ) HANGUL SYLLABLE CWIC +CE00;CE00;110E 1171 11BF;CE00;110E 1171 11BF; # (츀; 츀; 츀; 츀; 츀; ) HANGUL SYLLABLE CWIK +CE01;CE01;110E 1171 11C0;CE01;110E 1171 11C0; # (츁; 츁; 츁; 츁; 츁; ) HANGUL SYLLABLE CWIT +CE02;CE02;110E 1171 11C1;CE02;110E 1171 11C1; # (츂; 츂; 츂; 츂; 츂; ) HANGUL SYLLABLE CWIP +CE03;CE03;110E 1171 11C2;CE03;110E 1171 11C2; # (츃; 츃; 츃; 츃; 츃; ) HANGUL SYLLABLE CWIH +CE04;CE04;110E 1172;CE04;110E 1172; # (츄; 츄; 츄; 츄; 츄; ) HANGUL SYLLABLE CYU +CE05;CE05;110E 1172 11A8;CE05;110E 1172 11A8; # (츅; 츅; 츅; 츅; 츅; ) HANGUL SYLLABLE CYUG +CE06;CE06;110E 1172 11A9;CE06;110E 1172 11A9; # (츆; 츆; 츆; 츆; 츆; ) HANGUL SYLLABLE CYUGG +CE07;CE07;110E 1172 11AA;CE07;110E 1172 11AA; # (츇; 츇; 츇; 츇; 츇; ) HANGUL SYLLABLE CYUGS +CE08;CE08;110E 1172 11AB;CE08;110E 1172 11AB; # (츈; 츈; 츈; 츈; 츈; ) HANGUL SYLLABLE CYUN +CE09;CE09;110E 1172 11AC;CE09;110E 1172 11AC; # (츉; 츉; 츉; 츉; 츉; ) HANGUL SYLLABLE CYUNJ +CE0A;CE0A;110E 1172 11AD;CE0A;110E 1172 11AD; # (츊; 츊; 츊; 츊; 츊; ) HANGUL SYLLABLE CYUNH +CE0B;CE0B;110E 1172 11AE;CE0B;110E 1172 11AE; # (츋; 츋; 츋; 츋; 츋; ) HANGUL SYLLABLE CYUD +CE0C;CE0C;110E 1172 11AF;CE0C;110E 1172 11AF; # (츌; 츌; 츌; 츌; 츌; ) HANGUL SYLLABLE CYUL +CE0D;CE0D;110E 1172 11B0;CE0D;110E 1172 11B0; # (츍; 츍; 츍; 츍; 츍; ) HANGUL SYLLABLE CYULG +CE0E;CE0E;110E 1172 11B1;CE0E;110E 1172 11B1; # (츎; 츎; 츎; 츎; 츎; ) HANGUL SYLLABLE CYULM +CE0F;CE0F;110E 1172 11B2;CE0F;110E 1172 11B2; # (츏; 츏; 츏; 츏; 츏; ) HANGUL SYLLABLE CYULB +CE10;CE10;110E 1172 11B3;CE10;110E 1172 11B3; # (츐; 츐; 츐; 츐; 츐; ) HANGUL SYLLABLE CYULS +CE11;CE11;110E 1172 11B4;CE11;110E 1172 11B4; # (츑; 츑; 츑; 츑; 츑; ) HANGUL SYLLABLE CYULT +CE12;CE12;110E 1172 11B5;CE12;110E 1172 11B5; # (츒; 츒; 츒; 츒; 츒; ) HANGUL SYLLABLE CYULP +CE13;CE13;110E 1172 11B6;CE13;110E 1172 11B6; # (츓; 츓; 츓; 츓; 츓; ) HANGUL SYLLABLE CYULH +CE14;CE14;110E 1172 11B7;CE14;110E 1172 11B7; # (츔; 츔; 츔; 츔; 츔; ) HANGUL SYLLABLE CYUM +CE15;CE15;110E 1172 11B8;CE15;110E 1172 11B8; # (츕; 츕; 츕; 츕; 츕; ) HANGUL SYLLABLE CYUB +CE16;CE16;110E 1172 11B9;CE16;110E 1172 11B9; # (츖; 츖; 츖; 츖; 츖; ) HANGUL SYLLABLE CYUBS +CE17;CE17;110E 1172 11BA;CE17;110E 1172 11BA; # (츗; 츗; 츗; 츗; 츗; ) HANGUL SYLLABLE CYUS +CE18;CE18;110E 1172 11BB;CE18;110E 1172 11BB; # (츘; 츘; 츘; 츘; 츘; ) HANGUL SYLLABLE CYUSS +CE19;CE19;110E 1172 11BC;CE19;110E 1172 11BC; # (츙; 츙; 츙; 츙; 츙; ) HANGUL SYLLABLE CYUNG +CE1A;CE1A;110E 1172 11BD;CE1A;110E 1172 11BD; # (츚; 츚; 츚; 츚; 츚; ) HANGUL SYLLABLE CYUJ +CE1B;CE1B;110E 1172 11BE;CE1B;110E 1172 11BE; # (츛; 츛; 츛; 츛; 츛; ) HANGUL SYLLABLE CYUC +CE1C;CE1C;110E 1172 11BF;CE1C;110E 1172 11BF; # (츜; 츜; 츜; 츜; 츜; ) HANGUL SYLLABLE CYUK +CE1D;CE1D;110E 1172 11C0;CE1D;110E 1172 11C0; # (츝; 츝; 츝; 츝; 츝; ) HANGUL SYLLABLE CYUT +CE1E;CE1E;110E 1172 11C1;CE1E;110E 1172 11C1; # (츞; 츞; 츞; 츞; 츞; ) HANGUL SYLLABLE CYUP +CE1F;CE1F;110E 1172 11C2;CE1F;110E 1172 11C2; # (츟; 츟; 츟; 츟; 츟; ) HANGUL SYLLABLE CYUH +CE20;CE20;110E 1173;CE20;110E 1173; # (츠; 츠; 츠; 츠; 츠; ) HANGUL SYLLABLE CEU +CE21;CE21;110E 1173 11A8;CE21;110E 1173 11A8; # (측; 측; 측; 측; 측; ) HANGUL SYLLABLE CEUG +CE22;CE22;110E 1173 11A9;CE22;110E 1173 11A9; # (츢; 츢; 츢; 츢; 츢; ) HANGUL SYLLABLE CEUGG +CE23;CE23;110E 1173 11AA;CE23;110E 1173 11AA; # (츣; 츣; 츣; 츣; 츣; ) HANGUL SYLLABLE CEUGS +CE24;CE24;110E 1173 11AB;CE24;110E 1173 11AB; # (츤; 츤; 츤; 츤; 츤; ) HANGUL SYLLABLE CEUN +CE25;CE25;110E 1173 11AC;CE25;110E 1173 11AC; # (츥; 츥; 츥; 츥; 츥; ) HANGUL SYLLABLE CEUNJ +CE26;CE26;110E 1173 11AD;CE26;110E 1173 11AD; # (츦; 츦; 츦; 츦; 츦; ) HANGUL SYLLABLE CEUNH +CE27;CE27;110E 1173 11AE;CE27;110E 1173 11AE; # (츧; 츧; 츧; 츧; 츧; ) HANGUL SYLLABLE CEUD +CE28;CE28;110E 1173 11AF;CE28;110E 1173 11AF; # (츨; 츨; 츨; 츨; 츨; ) HANGUL SYLLABLE CEUL +CE29;CE29;110E 1173 11B0;CE29;110E 1173 11B0; # (츩; 츩; 츩; 츩; 츩; ) HANGUL SYLLABLE CEULG +CE2A;CE2A;110E 1173 11B1;CE2A;110E 1173 11B1; # (츪; 츪; 츪; 츪; 츪; ) HANGUL SYLLABLE CEULM +CE2B;CE2B;110E 1173 11B2;CE2B;110E 1173 11B2; # (츫; 츫; 츫; 츫; 츫; ) HANGUL SYLLABLE CEULB +CE2C;CE2C;110E 1173 11B3;CE2C;110E 1173 11B3; # (츬; 츬; 츬; 츬; 츬; ) HANGUL SYLLABLE CEULS +CE2D;CE2D;110E 1173 11B4;CE2D;110E 1173 11B4; # (츭; 츭; 츭; 츭; 츭; ) HANGUL SYLLABLE CEULT +CE2E;CE2E;110E 1173 11B5;CE2E;110E 1173 11B5; # (츮; 츮; 츮; 츮; 츮; ) HANGUL SYLLABLE CEULP +CE2F;CE2F;110E 1173 11B6;CE2F;110E 1173 11B6; # (츯; 츯; 츯; 츯; 츯; ) HANGUL SYLLABLE CEULH +CE30;CE30;110E 1173 11B7;CE30;110E 1173 11B7; # (츰; 츰; 츰; 츰; 츰; ) HANGUL SYLLABLE CEUM +CE31;CE31;110E 1173 11B8;CE31;110E 1173 11B8; # (츱; 츱; 츱; 츱; 츱; ) HANGUL SYLLABLE CEUB +CE32;CE32;110E 1173 11B9;CE32;110E 1173 11B9; # (츲; 츲; 츲; 츲; 츲; ) HANGUL SYLLABLE CEUBS +CE33;CE33;110E 1173 11BA;CE33;110E 1173 11BA; # (츳; 츳; 츳; 츳; 츳; ) HANGUL SYLLABLE CEUS +CE34;CE34;110E 1173 11BB;CE34;110E 1173 11BB; # (츴; 츴; 츴; 츴; 츴; ) HANGUL SYLLABLE CEUSS +CE35;CE35;110E 1173 11BC;CE35;110E 1173 11BC; # (층; 층; 층; 층; 층; ) HANGUL SYLLABLE CEUNG +CE36;CE36;110E 1173 11BD;CE36;110E 1173 11BD; # (츶; 츶; 츶; 츶; 츶; ) HANGUL SYLLABLE CEUJ +CE37;CE37;110E 1173 11BE;CE37;110E 1173 11BE; # (츷; 츷; 츷; 츷; 츷; ) HANGUL SYLLABLE CEUC +CE38;CE38;110E 1173 11BF;CE38;110E 1173 11BF; # (츸; 츸; 츸; 츸; 츸; ) HANGUL SYLLABLE CEUK +CE39;CE39;110E 1173 11C0;CE39;110E 1173 11C0; # (츹; 츹; 츹; 츹; 츹; ) HANGUL SYLLABLE CEUT +CE3A;CE3A;110E 1173 11C1;CE3A;110E 1173 11C1; # (츺; 츺; 츺; 츺; 츺; ) HANGUL SYLLABLE CEUP +CE3B;CE3B;110E 1173 11C2;CE3B;110E 1173 11C2; # (츻; 츻; 츻; 츻; 츻; ) HANGUL SYLLABLE CEUH +CE3C;CE3C;110E 1174;CE3C;110E 1174; # (츼; 츼; 츼; 츼; 츼; ) HANGUL SYLLABLE CYI +CE3D;CE3D;110E 1174 11A8;CE3D;110E 1174 11A8; # (츽; 츽; 츽; 츽; 츽; ) HANGUL SYLLABLE CYIG +CE3E;CE3E;110E 1174 11A9;CE3E;110E 1174 11A9; # (츾; 츾; 츾; 츾; 츾; ) HANGUL SYLLABLE CYIGG +CE3F;CE3F;110E 1174 11AA;CE3F;110E 1174 11AA; # (츿; 츿; 츿; 츿; 츿; ) HANGUL SYLLABLE CYIGS +CE40;CE40;110E 1174 11AB;CE40;110E 1174 11AB; # (칀; 칀; 칀; 칀; 칀; ) HANGUL SYLLABLE CYIN +CE41;CE41;110E 1174 11AC;CE41;110E 1174 11AC; # (칁; 칁; 칁; 칁; 칁; ) HANGUL SYLLABLE CYINJ +CE42;CE42;110E 1174 11AD;CE42;110E 1174 11AD; # (칂; 칂; 칂; 칂; 칂; ) HANGUL SYLLABLE CYINH +CE43;CE43;110E 1174 11AE;CE43;110E 1174 11AE; # (칃; 칃; 칃; 칃; 칃; ) HANGUL SYLLABLE CYID +CE44;CE44;110E 1174 11AF;CE44;110E 1174 11AF; # (칄; 칄; 칄; 칄; 칄; ) HANGUL SYLLABLE CYIL +CE45;CE45;110E 1174 11B0;CE45;110E 1174 11B0; # (칅; 칅; 칅; 칅; 칅; ) HANGUL SYLLABLE CYILG +CE46;CE46;110E 1174 11B1;CE46;110E 1174 11B1; # (칆; 칆; 칆; 칆; 칆; ) HANGUL SYLLABLE CYILM +CE47;CE47;110E 1174 11B2;CE47;110E 1174 11B2; # (칇; 칇; 칇; 칇; 칇; ) HANGUL SYLLABLE CYILB +CE48;CE48;110E 1174 11B3;CE48;110E 1174 11B3; # (칈; 칈; 칈; 칈; 칈; ) HANGUL SYLLABLE CYILS +CE49;CE49;110E 1174 11B4;CE49;110E 1174 11B4; # (칉; 칉; 칉; 칉; 칉; ) HANGUL SYLLABLE CYILT +CE4A;CE4A;110E 1174 11B5;CE4A;110E 1174 11B5; # (칊; 칊; 칊; 칊; 칊; ) HANGUL SYLLABLE CYILP +CE4B;CE4B;110E 1174 11B6;CE4B;110E 1174 11B6; # (칋; 칋; 칋; 칋; 칋; ) HANGUL SYLLABLE CYILH +CE4C;CE4C;110E 1174 11B7;CE4C;110E 1174 11B7; # (칌; 칌; 칌; 칌; 칌; ) HANGUL SYLLABLE CYIM +CE4D;CE4D;110E 1174 11B8;CE4D;110E 1174 11B8; # (칍; 칍; 칍; 칍; 칍; ) HANGUL SYLLABLE CYIB +CE4E;CE4E;110E 1174 11B9;CE4E;110E 1174 11B9; # (칎; 칎; 칎; 칎; 칎; ) HANGUL SYLLABLE CYIBS +CE4F;CE4F;110E 1174 11BA;CE4F;110E 1174 11BA; # (칏; 칏; 칏; 칏; 칏; ) HANGUL SYLLABLE CYIS +CE50;CE50;110E 1174 11BB;CE50;110E 1174 11BB; # (칐; 칐; 칐; 칐; 칐; ) HANGUL SYLLABLE CYISS +CE51;CE51;110E 1174 11BC;CE51;110E 1174 11BC; # (칑; 칑; 칑; 칑; 칑; ) HANGUL SYLLABLE CYING +CE52;CE52;110E 1174 11BD;CE52;110E 1174 11BD; # (칒; 칒; 칒; 칒; 칒; ) HANGUL SYLLABLE CYIJ +CE53;CE53;110E 1174 11BE;CE53;110E 1174 11BE; # (칓; 칓; 칓; 칓; 칓; ) HANGUL SYLLABLE CYIC +CE54;CE54;110E 1174 11BF;CE54;110E 1174 11BF; # (칔; 칔; 칔; 칔; 칔; ) HANGUL SYLLABLE CYIK +CE55;CE55;110E 1174 11C0;CE55;110E 1174 11C0; # (칕; 칕; 칕; 칕; 칕; ) HANGUL SYLLABLE CYIT +CE56;CE56;110E 1174 11C1;CE56;110E 1174 11C1; # (칖; 칖; 칖; 칖; 칖; ) HANGUL SYLLABLE CYIP +CE57;CE57;110E 1174 11C2;CE57;110E 1174 11C2; # (칗; 칗; 칗; 칗; 칗; ) HANGUL SYLLABLE CYIH +CE58;CE58;110E 1175;CE58;110E 1175; # (치; 치; 치; 치; 치; ) HANGUL SYLLABLE CI +CE59;CE59;110E 1175 11A8;CE59;110E 1175 11A8; # (칙; 칙; 칙; 칙; 칙; ) HANGUL SYLLABLE CIG +CE5A;CE5A;110E 1175 11A9;CE5A;110E 1175 11A9; # (칚; 칚; 칚; 칚; 칚; ) HANGUL SYLLABLE CIGG +CE5B;CE5B;110E 1175 11AA;CE5B;110E 1175 11AA; # (칛; 칛; 칛; 칛; 칛; ) HANGUL SYLLABLE CIGS +CE5C;CE5C;110E 1175 11AB;CE5C;110E 1175 11AB; # (친; 친; 친; 친; 친; ) HANGUL SYLLABLE CIN +CE5D;CE5D;110E 1175 11AC;CE5D;110E 1175 11AC; # (칝; 칝; 칝; 칝; 칝; ) HANGUL SYLLABLE CINJ +CE5E;CE5E;110E 1175 11AD;CE5E;110E 1175 11AD; # (칞; 칞; 칞; 칞; 칞; ) HANGUL SYLLABLE CINH +CE5F;CE5F;110E 1175 11AE;CE5F;110E 1175 11AE; # (칟; 칟; 칟; 칟; 칟; ) HANGUL SYLLABLE CID +CE60;CE60;110E 1175 11AF;CE60;110E 1175 11AF; # (칠; 칠; 칠; 칠; 칠; ) HANGUL SYLLABLE CIL +CE61;CE61;110E 1175 11B0;CE61;110E 1175 11B0; # (칡; 칡; 칡; 칡; 칡; ) HANGUL SYLLABLE CILG +CE62;CE62;110E 1175 11B1;CE62;110E 1175 11B1; # (칢; 칢; 칢; 칢; 칢; ) HANGUL SYLLABLE CILM +CE63;CE63;110E 1175 11B2;CE63;110E 1175 11B2; # (칣; 칣; 칣; 칣; 칣; ) HANGUL SYLLABLE CILB +CE64;CE64;110E 1175 11B3;CE64;110E 1175 11B3; # (칤; 칤; 칤; 칤; 칤; ) HANGUL SYLLABLE CILS +CE65;CE65;110E 1175 11B4;CE65;110E 1175 11B4; # (칥; 칥; 칥; 칥; 칥; ) HANGUL SYLLABLE CILT +CE66;CE66;110E 1175 11B5;CE66;110E 1175 11B5; # (칦; 칦; 칦; 칦; 칦; ) HANGUL SYLLABLE CILP +CE67;CE67;110E 1175 11B6;CE67;110E 1175 11B6; # (칧; 칧; 칧; 칧; 칧; ) HANGUL SYLLABLE CILH +CE68;CE68;110E 1175 11B7;CE68;110E 1175 11B7; # (침; 침; 침; 침; 침; ) HANGUL SYLLABLE CIM +CE69;CE69;110E 1175 11B8;CE69;110E 1175 11B8; # (칩; 칩; 칩; 칩; 칩; ) HANGUL SYLLABLE CIB +CE6A;CE6A;110E 1175 11B9;CE6A;110E 1175 11B9; # (칪; 칪; 칪; 칪; 칪; ) HANGUL SYLLABLE CIBS +CE6B;CE6B;110E 1175 11BA;CE6B;110E 1175 11BA; # (칫; 칫; 칫; 칫; 칫; ) HANGUL SYLLABLE CIS +CE6C;CE6C;110E 1175 11BB;CE6C;110E 1175 11BB; # (칬; 칬; 칬; 칬; 칬; ) HANGUL SYLLABLE CISS +CE6D;CE6D;110E 1175 11BC;CE6D;110E 1175 11BC; # (칭; 칭; 칭; 칭; 칭; ) HANGUL SYLLABLE CING +CE6E;CE6E;110E 1175 11BD;CE6E;110E 1175 11BD; # (칮; 칮; 칮; 칮; 칮; ) HANGUL SYLLABLE CIJ +CE6F;CE6F;110E 1175 11BE;CE6F;110E 1175 11BE; # (칯; 칯; 칯; 칯; 칯; ) HANGUL SYLLABLE CIC +CE70;CE70;110E 1175 11BF;CE70;110E 1175 11BF; # (칰; 칰; 칰; 칰; 칰; ) HANGUL SYLLABLE CIK +CE71;CE71;110E 1175 11C0;CE71;110E 1175 11C0; # (칱; 칱; 칱; 칱; 칱; ) HANGUL SYLLABLE CIT +CE72;CE72;110E 1175 11C1;CE72;110E 1175 11C1; # (칲; 칲; 칲; 칲; 칲; ) HANGUL SYLLABLE CIP +CE73;CE73;110E 1175 11C2;CE73;110E 1175 11C2; # (칳; 칳; 칳; 칳; 칳; ) HANGUL SYLLABLE CIH +CE74;CE74;110F 1161;CE74;110F 1161; # (카; 카; 카; 카; 카; ) HANGUL SYLLABLE KA +CE75;CE75;110F 1161 11A8;CE75;110F 1161 11A8; # (칵; 칵; 칵; 칵; 칵; ) HANGUL SYLLABLE KAG +CE76;CE76;110F 1161 11A9;CE76;110F 1161 11A9; # (칶; 칶; 칶; 칶; 칶; ) HANGUL SYLLABLE KAGG +CE77;CE77;110F 1161 11AA;CE77;110F 1161 11AA; # (칷; 칷; 칷; 칷; 칷; ) HANGUL SYLLABLE KAGS +CE78;CE78;110F 1161 11AB;CE78;110F 1161 11AB; # (칸; 칸; 칸; 칸; 칸; ) HANGUL SYLLABLE KAN +CE79;CE79;110F 1161 11AC;CE79;110F 1161 11AC; # (칹; 칹; 칹; 칹; 칹; ) HANGUL SYLLABLE KANJ +CE7A;CE7A;110F 1161 11AD;CE7A;110F 1161 11AD; # (칺; 칺; 칺; 칺; 칺; ) HANGUL SYLLABLE KANH +CE7B;CE7B;110F 1161 11AE;CE7B;110F 1161 11AE; # (칻; 칻; 칻; 칻; 칻; ) HANGUL SYLLABLE KAD +CE7C;CE7C;110F 1161 11AF;CE7C;110F 1161 11AF; # (칼; 칼; 칼; 칼; 칼; ) HANGUL SYLLABLE KAL +CE7D;CE7D;110F 1161 11B0;CE7D;110F 1161 11B0; # (칽; 칽; 칽; 칽; 칽; ) HANGUL SYLLABLE KALG +CE7E;CE7E;110F 1161 11B1;CE7E;110F 1161 11B1; # (칾; 칾; 칾; 칾; 칾; ) HANGUL SYLLABLE KALM +CE7F;CE7F;110F 1161 11B2;CE7F;110F 1161 11B2; # (칿; 칿; 칿; 칿; 칿; ) HANGUL SYLLABLE KALB +CE80;CE80;110F 1161 11B3;CE80;110F 1161 11B3; # (캀; 캀; 캀; 캀; 캀; ) HANGUL SYLLABLE KALS +CE81;CE81;110F 1161 11B4;CE81;110F 1161 11B4; # (캁; 캁; 캁; 캁; 캁; ) HANGUL SYLLABLE KALT +CE82;CE82;110F 1161 11B5;CE82;110F 1161 11B5; # (캂; 캂; 캂; 캂; 캂; ) HANGUL SYLLABLE KALP +CE83;CE83;110F 1161 11B6;CE83;110F 1161 11B6; # (캃; 캃; 캃; 캃; 캃; ) HANGUL SYLLABLE KALH +CE84;CE84;110F 1161 11B7;CE84;110F 1161 11B7; # (캄; 캄; 캄; 캄; 캄; ) HANGUL SYLLABLE KAM +CE85;CE85;110F 1161 11B8;CE85;110F 1161 11B8; # (캅; 캅; 캅; 캅; 캅; ) HANGUL SYLLABLE KAB +CE86;CE86;110F 1161 11B9;CE86;110F 1161 11B9; # (캆; 캆; 캆; 캆; 캆; ) HANGUL SYLLABLE KABS +CE87;CE87;110F 1161 11BA;CE87;110F 1161 11BA; # (캇; 캇; 캇; 캇; 캇; ) HANGUL SYLLABLE KAS +CE88;CE88;110F 1161 11BB;CE88;110F 1161 11BB; # (캈; 캈; 캈; 캈; 캈; ) HANGUL SYLLABLE KASS +CE89;CE89;110F 1161 11BC;CE89;110F 1161 11BC; # (캉; 캉; 캉; 캉; 캉; ) HANGUL SYLLABLE KANG +CE8A;CE8A;110F 1161 11BD;CE8A;110F 1161 11BD; # (캊; 캊; 캊; 캊; 캊; ) HANGUL SYLLABLE KAJ +CE8B;CE8B;110F 1161 11BE;CE8B;110F 1161 11BE; # (캋; 캋; 캋; 캋; 캋; ) HANGUL SYLLABLE KAC +CE8C;CE8C;110F 1161 11BF;CE8C;110F 1161 11BF; # (캌; 캌; 캌; 캌; 캌; ) HANGUL SYLLABLE KAK +CE8D;CE8D;110F 1161 11C0;CE8D;110F 1161 11C0; # (캍; 캍; 캍; 캍; 캍; ) HANGUL SYLLABLE KAT +CE8E;CE8E;110F 1161 11C1;CE8E;110F 1161 11C1; # (캎; 캎; 캎; 캎; 캎; ) HANGUL SYLLABLE KAP +CE8F;CE8F;110F 1161 11C2;CE8F;110F 1161 11C2; # (캏; 캏; 캏; 캏; 캏; ) HANGUL SYLLABLE KAH +CE90;CE90;110F 1162;CE90;110F 1162; # (캐; 캐; 캐; 캐; 캐; ) HANGUL SYLLABLE KAE +CE91;CE91;110F 1162 11A8;CE91;110F 1162 11A8; # (캑; 캑; 캑; 캑; 캑; ) HANGUL SYLLABLE KAEG +CE92;CE92;110F 1162 11A9;CE92;110F 1162 11A9; # (캒; 캒; 캒; 캒; 캒; ) HANGUL SYLLABLE KAEGG +CE93;CE93;110F 1162 11AA;CE93;110F 1162 11AA; # (캓; 캓; 캓; 캓; 캓; ) HANGUL SYLLABLE KAEGS +CE94;CE94;110F 1162 11AB;CE94;110F 1162 11AB; # (캔; 캔; 캔; 캔; 캔; ) HANGUL SYLLABLE KAEN +CE95;CE95;110F 1162 11AC;CE95;110F 1162 11AC; # (캕; 캕; 캕; 캕; 캕; ) HANGUL SYLLABLE KAENJ +CE96;CE96;110F 1162 11AD;CE96;110F 1162 11AD; # (캖; 캖; 캖; 캖; 캖; ) HANGUL SYLLABLE KAENH +CE97;CE97;110F 1162 11AE;CE97;110F 1162 11AE; # (캗; 캗; 캗; 캗; 캗; ) HANGUL SYLLABLE KAED +CE98;CE98;110F 1162 11AF;CE98;110F 1162 11AF; # (캘; 캘; 캘; 캘; 캘; ) HANGUL SYLLABLE KAEL +CE99;CE99;110F 1162 11B0;CE99;110F 1162 11B0; # (캙; 캙; 캙; 캙; 캙; ) HANGUL SYLLABLE KAELG +CE9A;CE9A;110F 1162 11B1;CE9A;110F 1162 11B1; # (캚; 캚; 캚; 캚; 캚; ) HANGUL SYLLABLE KAELM +CE9B;CE9B;110F 1162 11B2;CE9B;110F 1162 11B2; # (캛; 캛; 캛; 캛; 캛; ) HANGUL SYLLABLE KAELB +CE9C;CE9C;110F 1162 11B3;CE9C;110F 1162 11B3; # (캜; 캜; 캜; 캜; 캜; ) HANGUL SYLLABLE KAELS +CE9D;CE9D;110F 1162 11B4;CE9D;110F 1162 11B4; # (캝; 캝; 캝; 캝; 캝; ) HANGUL SYLLABLE KAELT +CE9E;CE9E;110F 1162 11B5;CE9E;110F 1162 11B5; # (캞; 캞; 캞; 캞; 캞; ) HANGUL SYLLABLE KAELP +CE9F;CE9F;110F 1162 11B6;CE9F;110F 1162 11B6; # (캟; 캟; 캟; 캟; 캟; ) HANGUL SYLLABLE KAELH +CEA0;CEA0;110F 1162 11B7;CEA0;110F 1162 11B7; # (캠; 캠; 캠; 캠; 캠; ) HANGUL SYLLABLE KAEM +CEA1;CEA1;110F 1162 11B8;CEA1;110F 1162 11B8; # (캡; 캡; 캡; 캡; 캡; ) HANGUL SYLLABLE KAEB +CEA2;CEA2;110F 1162 11B9;CEA2;110F 1162 11B9; # (캢; 캢; 캢; 캢; 캢; ) HANGUL SYLLABLE KAEBS +CEA3;CEA3;110F 1162 11BA;CEA3;110F 1162 11BA; # (캣; 캣; 캣; 캣; 캣; ) HANGUL SYLLABLE KAES +CEA4;CEA4;110F 1162 11BB;CEA4;110F 1162 11BB; # (캤; 캤; 캤; 캤; 캤; ) HANGUL SYLLABLE KAESS +CEA5;CEA5;110F 1162 11BC;CEA5;110F 1162 11BC; # (캥; 캥; 캥; 캥; 캥; ) HANGUL SYLLABLE KAENG +CEA6;CEA6;110F 1162 11BD;CEA6;110F 1162 11BD; # (캦; 캦; 캦; 캦; 캦; ) HANGUL SYLLABLE KAEJ +CEA7;CEA7;110F 1162 11BE;CEA7;110F 1162 11BE; # (캧; 캧; 캧; 캧; 캧; ) HANGUL SYLLABLE KAEC +CEA8;CEA8;110F 1162 11BF;CEA8;110F 1162 11BF; # (캨; 캨; 캨; 캨; 캨; ) HANGUL SYLLABLE KAEK +CEA9;CEA9;110F 1162 11C0;CEA9;110F 1162 11C0; # (캩; 캩; 캩; 캩; 캩; ) HANGUL SYLLABLE KAET +CEAA;CEAA;110F 1162 11C1;CEAA;110F 1162 11C1; # (캪; 캪; 캪; 캪; 캪; ) HANGUL SYLLABLE KAEP +CEAB;CEAB;110F 1162 11C2;CEAB;110F 1162 11C2; # (캫; 캫; 캫; 캫; 캫; ) HANGUL SYLLABLE KAEH +CEAC;CEAC;110F 1163;CEAC;110F 1163; # (캬; 캬; 캬; 캬; 캬; ) HANGUL SYLLABLE KYA +CEAD;CEAD;110F 1163 11A8;CEAD;110F 1163 11A8; # (캭; 캭; 캭; 캭; 캭; ) HANGUL SYLLABLE KYAG +CEAE;CEAE;110F 1163 11A9;CEAE;110F 1163 11A9; # (캮; 캮; 캮; 캮; 캮; ) HANGUL SYLLABLE KYAGG +CEAF;CEAF;110F 1163 11AA;CEAF;110F 1163 11AA; # (캯; 캯; 캯; 캯; 캯; ) HANGUL SYLLABLE KYAGS +CEB0;CEB0;110F 1163 11AB;CEB0;110F 1163 11AB; # (캰; 캰; 캰; 캰; 캰; ) HANGUL SYLLABLE KYAN +CEB1;CEB1;110F 1163 11AC;CEB1;110F 1163 11AC; # (캱; 캱; 캱; 캱; 캱; ) HANGUL SYLLABLE KYANJ +CEB2;CEB2;110F 1163 11AD;CEB2;110F 1163 11AD; # (캲; 캲; 캲; 캲; 캲; ) HANGUL SYLLABLE KYANH +CEB3;CEB3;110F 1163 11AE;CEB3;110F 1163 11AE; # (캳; 캳; 캳; 캳; 캳; ) HANGUL SYLLABLE KYAD +CEB4;CEB4;110F 1163 11AF;CEB4;110F 1163 11AF; # (캴; 캴; 캴; 캴; 캴; ) HANGUL SYLLABLE KYAL +CEB5;CEB5;110F 1163 11B0;CEB5;110F 1163 11B0; # (캵; 캵; 캵; 캵; 캵; ) HANGUL SYLLABLE KYALG +CEB6;CEB6;110F 1163 11B1;CEB6;110F 1163 11B1; # (캶; 캶; 캶; 캶; 캶; ) HANGUL SYLLABLE KYALM +CEB7;CEB7;110F 1163 11B2;CEB7;110F 1163 11B2; # (캷; 캷; 캷; 캷; 캷; ) HANGUL SYLLABLE KYALB +CEB8;CEB8;110F 1163 11B3;CEB8;110F 1163 11B3; # (캸; 캸; 캸; 캸; 캸; ) HANGUL SYLLABLE KYALS +CEB9;CEB9;110F 1163 11B4;CEB9;110F 1163 11B4; # (캹; 캹; 캹; 캹; 캹; ) HANGUL SYLLABLE KYALT +CEBA;CEBA;110F 1163 11B5;CEBA;110F 1163 11B5; # (캺; 캺; 캺; 캺; 캺; ) HANGUL SYLLABLE KYALP +CEBB;CEBB;110F 1163 11B6;CEBB;110F 1163 11B6; # (캻; 캻; 캻; 캻; 캻; ) HANGUL SYLLABLE KYALH +CEBC;CEBC;110F 1163 11B7;CEBC;110F 1163 11B7; # (캼; 캼; 캼; 캼; 캼; ) HANGUL SYLLABLE KYAM +CEBD;CEBD;110F 1163 11B8;CEBD;110F 1163 11B8; # (캽; 캽; 캽; 캽; 캽; ) HANGUL SYLLABLE KYAB +CEBE;CEBE;110F 1163 11B9;CEBE;110F 1163 11B9; # (캾; 캾; 캾; 캾; 캾; ) HANGUL SYLLABLE KYABS +CEBF;CEBF;110F 1163 11BA;CEBF;110F 1163 11BA; # (캿; 캿; 캿; 캿; 캿; ) HANGUL SYLLABLE KYAS +CEC0;CEC0;110F 1163 11BB;CEC0;110F 1163 11BB; # (컀; 컀; 컀; 컀; 컀; ) HANGUL SYLLABLE KYASS +CEC1;CEC1;110F 1163 11BC;CEC1;110F 1163 11BC; # (컁; 컁; 컁; 컁; 컁; ) HANGUL SYLLABLE KYANG +CEC2;CEC2;110F 1163 11BD;CEC2;110F 1163 11BD; # (컂; 컂; 컂; 컂; 컂; ) HANGUL SYLLABLE KYAJ +CEC3;CEC3;110F 1163 11BE;CEC3;110F 1163 11BE; # (컃; 컃; 컃; 컃; 컃; ) HANGUL SYLLABLE KYAC +CEC4;CEC4;110F 1163 11BF;CEC4;110F 1163 11BF; # (컄; 컄; 컄; 컄; 컄; ) HANGUL SYLLABLE KYAK +CEC5;CEC5;110F 1163 11C0;CEC5;110F 1163 11C0; # (컅; 컅; 컅; 컅; 컅; ) HANGUL SYLLABLE KYAT +CEC6;CEC6;110F 1163 11C1;CEC6;110F 1163 11C1; # (컆; 컆; 컆; 컆; 컆; ) HANGUL SYLLABLE KYAP +CEC7;CEC7;110F 1163 11C2;CEC7;110F 1163 11C2; # (컇; 컇; 컇; 컇; 컇; ) HANGUL SYLLABLE KYAH +CEC8;CEC8;110F 1164;CEC8;110F 1164; # (컈; 컈; 컈; 컈; 컈; ) HANGUL SYLLABLE KYAE +CEC9;CEC9;110F 1164 11A8;CEC9;110F 1164 11A8; # (컉; 컉; 컉; 컉; 컉; ) HANGUL SYLLABLE KYAEG +CECA;CECA;110F 1164 11A9;CECA;110F 1164 11A9; # (컊; 컊; 컊; 컊; 컊; ) HANGUL SYLLABLE KYAEGG +CECB;CECB;110F 1164 11AA;CECB;110F 1164 11AA; # (컋; 컋; 컋; 컋; 컋; ) HANGUL SYLLABLE KYAEGS +CECC;CECC;110F 1164 11AB;CECC;110F 1164 11AB; # (컌; 컌; 컌; 컌; 컌; ) HANGUL SYLLABLE KYAEN +CECD;CECD;110F 1164 11AC;CECD;110F 1164 11AC; # (컍; 컍; 컍; 컍; 컍; ) HANGUL SYLLABLE KYAENJ +CECE;CECE;110F 1164 11AD;CECE;110F 1164 11AD; # (컎; 컎; 컎; 컎; 컎; ) HANGUL SYLLABLE KYAENH +CECF;CECF;110F 1164 11AE;CECF;110F 1164 11AE; # (컏; 컏; 컏; 컏; 컏; ) HANGUL SYLLABLE KYAED +CED0;CED0;110F 1164 11AF;CED0;110F 1164 11AF; # (컐; 컐; 컐; 컐; 컐; ) HANGUL SYLLABLE KYAEL +CED1;CED1;110F 1164 11B0;CED1;110F 1164 11B0; # (컑; 컑; 컑; 컑; 컑; ) HANGUL SYLLABLE KYAELG +CED2;CED2;110F 1164 11B1;CED2;110F 1164 11B1; # (컒; 컒; 컒; 컒; 컒; ) HANGUL SYLLABLE KYAELM +CED3;CED3;110F 1164 11B2;CED3;110F 1164 11B2; # (컓; 컓; 컓; 컓; 컓; ) HANGUL SYLLABLE KYAELB +CED4;CED4;110F 1164 11B3;CED4;110F 1164 11B3; # (컔; 컔; 컔; 컔; 컔; ) HANGUL SYLLABLE KYAELS +CED5;CED5;110F 1164 11B4;CED5;110F 1164 11B4; # (컕; 컕; 컕; 컕; 컕; ) HANGUL SYLLABLE KYAELT +CED6;CED6;110F 1164 11B5;CED6;110F 1164 11B5; # (컖; 컖; 컖; 컖; 컖; ) HANGUL SYLLABLE KYAELP +CED7;CED7;110F 1164 11B6;CED7;110F 1164 11B6; # (컗; 컗; 컗; 컗; 컗; ) HANGUL SYLLABLE KYAELH +CED8;CED8;110F 1164 11B7;CED8;110F 1164 11B7; # (컘; 컘; 컘; 컘; 컘; ) HANGUL SYLLABLE KYAEM +CED9;CED9;110F 1164 11B8;CED9;110F 1164 11B8; # (컙; 컙; 컙; 컙; 컙; ) HANGUL SYLLABLE KYAEB +CEDA;CEDA;110F 1164 11B9;CEDA;110F 1164 11B9; # (컚; 컚; 컚; 컚; 컚; ) HANGUL SYLLABLE KYAEBS +CEDB;CEDB;110F 1164 11BA;CEDB;110F 1164 11BA; # (컛; 컛; 컛; 컛; 컛; ) HANGUL SYLLABLE KYAES +CEDC;CEDC;110F 1164 11BB;CEDC;110F 1164 11BB; # (컜; 컜; 컜; 컜; 컜; ) HANGUL SYLLABLE KYAESS +CEDD;CEDD;110F 1164 11BC;CEDD;110F 1164 11BC; # (컝; 컝; 컝; 컝; 컝; ) HANGUL SYLLABLE KYAENG +CEDE;CEDE;110F 1164 11BD;CEDE;110F 1164 11BD; # (컞; 컞; 컞; 컞; 컞; ) HANGUL SYLLABLE KYAEJ +CEDF;CEDF;110F 1164 11BE;CEDF;110F 1164 11BE; # (컟; 컟; 컟; 컟; 컟; ) HANGUL SYLLABLE KYAEC +CEE0;CEE0;110F 1164 11BF;CEE0;110F 1164 11BF; # (컠; 컠; 컠; 컠; 컠; ) HANGUL SYLLABLE KYAEK +CEE1;CEE1;110F 1164 11C0;CEE1;110F 1164 11C0; # (컡; 컡; 컡; 컡; 컡; ) HANGUL SYLLABLE KYAET +CEE2;CEE2;110F 1164 11C1;CEE2;110F 1164 11C1; # (컢; 컢; 컢; 컢; 컢; ) HANGUL SYLLABLE KYAEP +CEE3;CEE3;110F 1164 11C2;CEE3;110F 1164 11C2; # (컣; 컣; 컣; 컣; 컣; ) HANGUL SYLLABLE KYAEH +CEE4;CEE4;110F 1165;CEE4;110F 1165; # (커; 커; 커; 커; 커; ) HANGUL SYLLABLE KEO +CEE5;CEE5;110F 1165 11A8;CEE5;110F 1165 11A8; # (컥; 컥; 컥; 컥; 컥; ) HANGUL SYLLABLE KEOG +CEE6;CEE6;110F 1165 11A9;CEE6;110F 1165 11A9; # (컦; 컦; 컦; 컦; 컦; ) HANGUL SYLLABLE KEOGG +CEE7;CEE7;110F 1165 11AA;CEE7;110F 1165 11AA; # (컧; 컧; 컧; 컧; 컧; ) HANGUL SYLLABLE KEOGS +CEE8;CEE8;110F 1165 11AB;CEE8;110F 1165 11AB; # (컨; 컨; 컨; 컨; 컨; ) HANGUL SYLLABLE KEON +CEE9;CEE9;110F 1165 11AC;CEE9;110F 1165 11AC; # (컩; 컩; 컩; 컩; 컩; ) HANGUL SYLLABLE KEONJ +CEEA;CEEA;110F 1165 11AD;CEEA;110F 1165 11AD; # (컪; 컪; 컪; 컪; 컪; ) HANGUL SYLLABLE KEONH +CEEB;CEEB;110F 1165 11AE;CEEB;110F 1165 11AE; # (컫; 컫; 컫; 컫; 컫; ) HANGUL SYLLABLE KEOD +CEEC;CEEC;110F 1165 11AF;CEEC;110F 1165 11AF; # (컬; 컬; 컬; 컬; 컬; ) HANGUL SYLLABLE KEOL +CEED;CEED;110F 1165 11B0;CEED;110F 1165 11B0; # (컭; 컭; 컭; 컭; 컭; ) HANGUL SYLLABLE KEOLG +CEEE;CEEE;110F 1165 11B1;CEEE;110F 1165 11B1; # (컮; 컮; 컮; 컮; 컮; ) HANGUL SYLLABLE KEOLM +CEEF;CEEF;110F 1165 11B2;CEEF;110F 1165 11B2; # (컯; 컯; 컯; 컯; 컯; ) HANGUL SYLLABLE KEOLB +CEF0;CEF0;110F 1165 11B3;CEF0;110F 1165 11B3; # (컰; 컰; 컰; 컰; 컰; ) HANGUL SYLLABLE KEOLS +CEF1;CEF1;110F 1165 11B4;CEF1;110F 1165 11B4; # (컱; 컱; 컱; 컱; 컱; ) HANGUL SYLLABLE KEOLT +CEF2;CEF2;110F 1165 11B5;CEF2;110F 1165 11B5; # (컲; 컲; 컲; 컲; 컲; ) HANGUL SYLLABLE KEOLP +CEF3;CEF3;110F 1165 11B6;CEF3;110F 1165 11B6; # (컳; 컳; 컳; 컳; 컳; ) HANGUL SYLLABLE KEOLH +CEF4;CEF4;110F 1165 11B7;CEF4;110F 1165 11B7; # (컴; 컴; 컴; 컴; 컴; ) HANGUL SYLLABLE KEOM +CEF5;CEF5;110F 1165 11B8;CEF5;110F 1165 11B8; # (컵; 컵; 컵; 컵; 컵; ) HANGUL SYLLABLE KEOB +CEF6;CEF6;110F 1165 11B9;CEF6;110F 1165 11B9; # (컶; 컶; 컶; 컶; 컶; ) HANGUL SYLLABLE KEOBS +CEF7;CEF7;110F 1165 11BA;CEF7;110F 1165 11BA; # (컷; 컷; 컷; 컷; 컷; ) HANGUL SYLLABLE KEOS +CEF8;CEF8;110F 1165 11BB;CEF8;110F 1165 11BB; # (컸; 컸; 컸; 컸; 컸; ) HANGUL SYLLABLE KEOSS +CEF9;CEF9;110F 1165 11BC;CEF9;110F 1165 11BC; # (컹; 컹; 컹; 컹; 컹; ) HANGUL SYLLABLE KEONG +CEFA;CEFA;110F 1165 11BD;CEFA;110F 1165 11BD; # (컺; 컺; 컺; 컺; 컺; ) HANGUL SYLLABLE KEOJ +CEFB;CEFB;110F 1165 11BE;CEFB;110F 1165 11BE; # (컻; 컻; 컻; 컻; 컻; ) HANGUL SYLLABLE KEOC +CEFC;CEFC;110F 1165 11BF;CEFC;110F 1165 11BF; # (컼; 컼; 컼; 컼; 컼; ) HANGUL SYLLABLE KEOK +CEFD;CEFD;110F 1165 11C0;CEFD;110F 1165 11C0; # (컽; 컽; 컽; 컽; 컽; ) HANGUL SYLLABLE KEOT +CEFE;CEFE;110F 1165 11C1;CEFE;110F 1165 11C1; # (컾; 컾; 컾; 컾; 컾; ) HANGUL SYLLABLE KEOP +CEFF;CEFF;110F 1165 11C2;CEFF;110F 1165 11C2; # (컿; 컿; 컿; 컿; 컿; ) HANGUL SYLLABLE KEOH +CF00;CF00;110F 1166;CF00;110F 1166; # (케; 케; 케; 케; 케; ) HANGUL SYLLABLE KE +CF01;CF01;110F 1166 11A8;CF01;110F 1166 11A8; # (켁; 켁; 켁; 켁; 켁; ) HANGUL SYLLABLE KEG +CF02;CF02;110F 1166 11A9;CF02;110F 1166 11A9; # (켂; 켂; 켂; 켂; 켂; ) HANGUL SYLLABLE KEGG +CF03;CF03;110F 1166 11AA;CF03;110F 1166 11AA; # (켃; 켃; 켃; 켃; 켃; ) HANGUL SYLLABLE KEGS +CF04;CF04;110F 1166 11AB;CF04;110F 1166 11AB; # (켄; 켄; 켄; 켄; 켄; ) HANGUL SYLLABLE KEN +CF05;CF05;110F 1166 11AC;CF05;110F 1166 11AC; # (켅; 켅; 켅; 켅; 켅; ) HANGUL SYLLABLE KENJ +CF06;CF06;110F 1166 11AD;CF06;110F 1166 11AD; # (켆; 켆; 켆; 켆; 켆; ) HANGUL SYLLABLE KENH +CF07;CF07;110F 1166 11AE;CF07;110F 1166 11AE; # (켇; 켇; 켇; 켇; 켇; ) HANGUL SYLLABLE KED +CF08;CF08;110F 1166 11AF;CF08;110F 1166 11AF; # (켈; 켈; 켈; 켈; 켈; ) HANGUL SYLLABLE KEL +CF09;CF09;110F 1166 11B0;CF09;110F 1166 11B0; # (켉; 켉; 켉; 켉; 켉; ) HANGUL SYLLABLE KELG +CF0A;CF0A;110F 1166 11B1;CF0A;110F 1166 11B1; # (켊; 켊; 켊; 켊; 켊; ) HANGUL SYLLABLE KELM +CF0B;CF0B;110F 1166 11B2;CF0B;110F 1166 11B2; # (켋; 켋; 켋; 켋; 켋; ) HANGUL SYLLABLE KELB +CF0C;CF0C;110F 1166 11B3;CF0C;110F 1166 11B3; # (켌; 켌; 켌; 켌; 켌; ) HANGUL SYLLABLE KELS +CF0D;CF0D;110F 1166 11B4;CF0D;110F 1166 11B4; # (켍; 켍; 켍; 켍; 켍; ) HANGUL SYLLABLE KELT +CF0E;CF0E;110F 1166 11B5;CF0E;110F 1166 11B5; # (켎; 켎; 켎; 켎; 켎; ) HANGUL SYLLABLE KELP +CF0F;CF0F;110F 1166 11B6;CF0F;110F 1166 11B6; # (켏; 켏; 켏; 켏; 켏; ) HANGUL SYLLABLE KELH +CF10;CF10;110F 1166 11B7;CF10;110F 1166 11B7; # (켐; 켐; 켐; 켐; 켐; ) HANGUL SYLLABLE KEM +CF11;CF11;110F 1166 11B8;CF11;110F 1166 11B8; # (켑; 켑; 켑; 켑; 켑; ) HANGUL SYLLABLE KEB +CF12;CF12;110F 1166 11B9;CF12;110F 1166 11B9; # (켒; 켒; 켒; 켒; 켒; ) HANGUL SYLLABLE KEBS +CF13;CF13;110F 1166 11BA;CF13;110F 1166 11BA; # (켓; 켓; 켓; 켓; 켓; ) HANGUL SYLLABLE KES +CF14;CF14;110F 1166 11BB;CF14;110F 1166 11BB; # (켔; 켔; 켔; 켔; 켔; ) HANGUL SYLLABLE KESS +CF15;CF15;110F 1166 11BC;CF15;110F 1166 11BC; # (켕; 켕; 켕; 켕; 켕; ) HANGUL SYLLABLE KENG +CF16;CF16;110F 1166 11BD;CF16;110F 1166 11BD; # (켖; 켖; 켖; 켖; 켖; ) HANGUL SYLLABLE KEJ +CF17;CF17;110F 1166 11BE;CF17;110F 1166 11BE; # (켗; 켗; 켗; 켗; 켗; ) HANGUL SYLLABLE KEC +CF18;CF18;110F 1166 11BF;CF18;110F 1166 11BF; # (켘; 켘; 켘; 켘; 켘; ) HANGUL SYLLABLE KEK +CF19;CF19;110F 1166 11C0;CF19;110F 1166 11C0; # (켙; 켙; 켙; 켙; 켙; ) HANGUL SYLLABLE KET +CF1A;CF1A;110F 1166 11C1;CF1A;110F 1166 11C1; # (켚; 켚; 켚; 켚; 켚; ) HANGUL SYLLABLE KEP +CF1B;CF1B;110F 1166 11C2;CF1B;110F 1166 11C2; # (켛; 켛; 켛; 켛; 켛; ) HANGUL SYLLABLE KEH +CF1C;CF1C;110F 1167;CF1C;110F 1167; # (켜; 켜; 켜; 켜; 켜; ) HANGUL SYLLABLE KYEO +CF1D;CF1D;110F 1167 11A8;CF1D;110F 1167 11A8; # (켝; 켝; 켝; 켝; 켝; ) HANGUL SYLLABLE KYEOG +CF1E;CF1E;110F 1167 11A9;CF1E;110F 1167 11A9; # (켞; 켞; 켞; 켞; 켞; ) HANGUL SYLLABLE KYEOGG +CF1F;CF1F;110F 1167 11AA;CF1F;110F 1167 11AA; # (켟; 켟; 켟; 켟; 켟; ) HANGUL SYLLABLE KYEOGS +CF20;CF20;110F 1167 11AB;CF20;110F 1167 11AB; # (켠; 켠; 켠; 켠; 켠; ) HANGUL SYLLABLE KYEON +CF21;CF21;110F 1167 11AC;CF21;110F 1167 11AC; # (켡; 켡; 켡; 켡; 켡; ) HANGUL SYLLABLE KYEONJ +CF22;CF22;110F 1167 11AD;CF22;110F 1167 11AD; # (켢; 켢; 켢; 켢; 켢; ) HANGUL SYLLABLE KYEONH +CF23;CF23;110F 1167 11AE;CF23;110F 1167 11AE; # (켣; 켣; 켣; 켣; 켣; ) HANGUL SYLLABLE KYEOD +CF24;CF24;110F 1167 11AF;CF24;110F 1167 11AF; # (켤; 켤; 켤; 켤; 켤; ) HANGUL SYLLABLE KYEOL +CF25;CF25;110F 1167 11B0;CF25;110F 1167 11B0; # (켥; 켥; 켥; 켥; 켥; ) HANGUL SYLLABLE KYEOLG +CF26;CF26;110F 1167 11B1;CF26;110F 1167 11B1; # (켦; 켦; 켦; 켦; 켦; ) HANGUL SYLLABLE KYEOLM +CF27;CF27;110F 1167 11B2;CF27;110F 1167 11B2; # (켧; 켧; 켧; 켧; 켧; ) HANGUL SYLLABLE KYEOLB +CF28;CF28;110F 1167 11B3;CF28;110F 1167 11B3; # (켨; 켨; 켨; 켨; 켨; ) HANGUL SYLLABLE KYEOLS +CF29;CF29;110F 1167 11B4;CF29;110F 1167 11B4; # (켩; 켩; 켩; 켩; 켩; ) HANGUL SYLLABLE KYEOLT +CF2A;CF2A;110F 1167 11B5;CF2A;110F 1167 11B5; # (켪; 켪; 켪; 켪; 켪; ) HANGUL SYLLABLE KYEOLP +CF2B;CF2B;110F 1167 11B6;CF2B;110F 1167 11B6; # (켫; 켫; 켫; 켫; 켫; ) HANGUL SYLLABLE KYEOLH +CF2C;CF2C;110F 1167 11B7;CF2C;110F 1167 11B7; # (켬; 켬; 켬; 켬; 켬; ) HANGUL SYLLABLE KYEOM +CF2D;CF2D;110F 1167 11B8;CF2D;110F 1167 11B8; # (켭; 켭; 켭; 켭; 켭; ) HANGUL SYLLABLE KYEOB +CF2E;CF2E;110F 1167 11B9;CF2E;110F 1167 11B9; # (켮; 켮; 켮; 켮; 켮; ) HANGUL SYLLABLE KYEOBS +CF2F;CF2F;110F 1167 11BA;CF2F;110F 1167 11BA; # (켯; 켯; 켯; 켯; 켯; ) HANGUL SYLLABLE KYEOS +CF30;CF30;110F 1167 11BB;CF30;110F 1167 11BB; # (켰; 켰; 켰; 켰; 켰; ) HANGUL SYLLABLE KYEOSS +CF31;CF31;110F 1167 11BC;CF31;110F 1167 11BC; # (켱; 켱; 켱; 켱; 켱; ) HANGUL SYLLABLE KYEONG +CF32;CF32;110F 1167 11BD;CF32;110F 1167 11BD; # (켲; 켲; 켲; 켲; 켲; ) HANGUL SYLLABLE KYEOJ +CF33;CF33;110F 1167 11BE;CF33;110F 1167 11BE; # (켳; 켳; 켳; 켳; 켳; ) HANGUL SYLLABLE KYEOC +CF34;CF34;110F 1167 11BF;CF34;110F 1167 11BF; # (켴; 켴; 켴; 켴; 켴; ) HANGUL SYLLABLE KYEOK +CF35;CF35;110F 1167 11C0;CF35;110F 1167 11C0; # (켵; 켵; 켵; 켵; 켵; ) HANGUL SYLLABLE KYEOT +CF36;CF36;110F 1167 11C1;CF36;110F 1167 11C1; # (켶; 켶; 켶; 켶; 켶; ) HANGUL SYLLABLE KYEOP +CF37;CF37;110F 1167 11C2;CF37;110F 1167 11C2; # (켷; 켷; 켷; 켷; 켷; ) HANGUL SYLLABLE KYEOH +CF38;CF38;110F 1168;CF38;110F 1168; # (켸; 켸; 켸; 켸; 켸; ) HANGUL SYLLABLE KYE +CF39;CF39;110F 1168 11A8;CF39;110F 1168 11A8; # (켹; 켹; 켹; 켹; 켹; ) HANGUL SYLLABLE KYEG +CF3A;CF3A;110F 1168 11A9;CF3A;110F 1168 11A9; # (켺; 켺; 켺; 켺; 켺; ) HANGUL SYLLABLE KYEGG +CF3B;CF3B;110F 1168 11AA;CF3B;110F 1168 11AA; # (켻; 켻; 켻; 켻; 켻; ) HANGUL SYLLABLE KYEGS +CF3C;CF3C;110F 1168 11AB;CF3C;110F 1168 11AB; # (켼; 켼; 켼; 켼; 켼; ) HANGUL SYLLABLE KYEN +CF3D;CF3D;110F 1168 11AC;CF3D;110F 1168 11AC; # (켽; 켽; 켽; 켽; 켽; ) HANGUL SYLLABLE KYENJ +CF3E;CF3E;110F 1168 11AD;CF3E;110F 1168 11AD; # (켾; 켾; 켾; 켾; 켾; ) HANGUL SYLLABLE KYENH +CF3F;CF3F;110F 1168 11AE;CF3F;110F 1168 11AE; # (켿; 켿; 켿; 켿; 켿; ) HANGUL SYLLABLE KYED +CF40;CF40;110F 1168 11AF;CF40;110F 1168 11AF; # (콀; 콀; 콀; 콀; 콀; ) HANGUL SYLLABLE KYEL +CF41;CF41;110F 1168 11B0;CF41;110F 1168 11B0; # (콁; 콁; 콁; 콁; 콁; ) HANGUL SYLLABLE KYELG +CF42;CF42;110F 1168 11B1;CF42;110F 1168 11B1; # (콂; 콂; 콂; 콂; 콂; ) HANGUL SYLLABLE KYELM +CF43;CF43;110F 1168 11B2;CF43;110F 1168 11B2; # (콃; 콃; 콃; 콃; 콃; ) HANGUL SYLLABLE KYELB +CF44;CF44;110F 1168 11B3;CF44;110F 1168 11B3; # (콄; 콄; 콄; 콄; 콄; ) HANGUL SYLLABLE KYELS +CF45;CF45;110F 1168 11B4;CF45;110F 1168 11B4; # (콅; 콅; 콅; 콅; 콅; ) HANGUL SYLLABLE KYELT +CF46;CF46;110F 1168 11B5;CF46;110F 1168 11B5; # (콆; 콆; 콆; 콆; 콆; ) HANGUL SYLLABLE KYELP +CF47;CF47;110F 1168 11B6;CF47;110F 1168 11B6; # (콇; 콇; 콇; 콇; 콇; ) HANGUL SYLLABLE KYELH +CF48;CF48;110F 1168 11B7;CF48;110F 1168 11B7; # (콈; 콈; 콈; 콈; 콈; ) HANGUL SYLLABLE KYEM +CF49;CF49;110F 1168 11B8;CF49;110F 1168 11B8; # (콉; 콉; 콉; 콉; 콉; ) HANGUL SYLLABLE KYEB +CF4A;CF4A;110F 1168 11B9;CF4A;110F 1168 11B9; # (콊; 콊; 콊; 콊; 콊; ) HANGUL SYLLABLE KYEBS +CF4B;CF4B;110F 1168 11BA;CF4B;110F 1168 11BA; # (콋; 콋; 콋; 콋; 콋; ) HANGUL SYLLABLE KYES +CF4C;CF4C;110F 1168 11BB;CF4C;110F 1168 11BB; # (콌; 콌; 콌; 콌; 콌; ) HANGUL SYLLABLE KYESS +CF4D;CF4D;110F 1168 11BC;CF4D;110F 1168 11BC; # (콍; 콍; 콍; 콍; 콍; ) HANGUL SYLLABLE KYENG +CF4E;CF4E;110F 1168 11BD;CF4E;110F 1168 11BD; # (콎; 콎; 콎; 콎; 콎; ) HANGUL SYLLABLE KYEJ +CF4F;CF4F;110F 1168 11BE;CF4F;110F 1168 11BE; # (콏; 콏; 콏; 콏; 콏; ) HANGUL SYLLABLE KYEC +CF50;CF50;110F 1168 11BF;CF50;110F 1168 11BF; # (콐; 콐; 콐; 콐; 콐; ) HANGUL SYLLABLE KYEK +CF51;CF51;110F 1168 11C0;CF51;110F 1168 11C0; # (콑; 콑; 콑; 콑; 콑; ) HANGUL SYLLABLE KYET +CF52;CF52;110F 1168 11C1;CF52;110F 1168 11C1; # (콒; 콒; 콒; 콒; 콒; ) HANGUL SYLLABLE KYEP +CF53;CF53;110F 1168 11C2;CF53;110F 1168 11C2; # (콓; 콓; 콓; 콓; 콓; ) HANGUL SYLLABLE KYEH +CF54;CF54;110F 1169;CF54;110F 1169; # (코; 코; 코; 코; 코; ) HANGUL SYLLABLE KO +CF55;CF55;110F 1169 11A8;CF55;110F 1169 11A8; # (콕; 콕; 콕; 콕; 콕; ) HANGUL SYLLABLE KOG +CF56;CF56;110F 1169 11A9;CF56;110F 1169 11A9; # (콖; 콖; 콖; 콖; 콖; ) HANGUL SYLLABLE KOGG +CF57;CF57;110F 1169 11AA;CF57;110F 1169 11AA; # (콗; 콗; 콗; 콗; 콗; ) HANGUL SYLLABLE KOGS +CF58;CF58;110F 1169 11AB;CF58;110F 1169 11AB; # (콘; 콘; 콘; 콘; 콘; ) HANGUL SYLLABLE KON +CF59;CF59;110F 1169 11AC;CF59;110F 1169 11AC; # (콙; 콙; 콙; 콙; 콙; ) HANGUL SYLLABLE KONJ +CF5A;CF5A;110F 1169 11AD;CF5A;110F 1169 11AD; # (콚; 콚; 콚; 콚; 콚; ) HANGUL SYLLABLE KONH +CF5B;CF5B;110F 1169 11AE;CF5B;110F 1169 11AE; # (콛; 콛; 콛; 콛; 콛; ) HANGUL SYLLABLE KOD +CF5C;CF5C;110F 1169 11AF;CF5C;110F 1169 11AF; # (콜; 콜; 콜; 콜; 콜; ) HANGUL SYLLABLE KOL +CF5D;CF5D;110F 1169 11B0;CF5D;110F 1169 11B0; # (콝; 콝; 콝; 콝; 콝; ) HANGUL SYLLABLE KOLG +CF5E;CF5E;110F 1169 11B1;CF5E;110F 1169 11B1; # (콞; 콞; 콞; 콞; 콞; ) HANGUL SYLLABLE KOLM +CF5F;CF5F;110F 1169 11B2;CF5F;110F 1169 11B2; # (콟; 콟; 콟; 콟; 콟; ) HANGUL SYLLABLE KOLB +CF60;CF60;110F 1169 11B3;CF60;110F 1169 11B3; # (콠; 콠; 콠; 콠; 콠; ) HANGUL SYLLABLE KOLS +CF61;CF61;110F 1169 11B4;CF61;110F 1169 11B4; # (콡; 콡; 콡; 콡; 콡; ) HANGUL SYLLABLE KOLT +CF62;CF62;110F 1169 11B5;CF62;110F 1169 11B5; # (콢; 콢; 콢; 콢; 콢; ) HANGUL SYLLABLE KOLP +CF63;CF63;110F 1169 11B6;CF63;110F 1169 11B6; # (콣; 콣; 콣; 콣; 콣; ) HANGUL SYLLABLE KOLH +CF64;CF64;110F 1169 11B7;CF64;110F 1169 11B7; # (콤; 콤; 콤; 콤; 콤; ) HANGUL SYLLABLE KOM +CF65;CF65;110F 1169 11B8;CF65;110F 1169 11B8; # (콥; 콥; 콥; 콥; 콥; ) HANGUL SYLLABLE KOB +CF66;CF66;110F 1169 11B9;CF66;110F 1169 11B9; # (콦; 콦; 콦; 콦; 콦; ) HANGUL SYLLABLE KOBS +CF67;CF67;110F 1169 11BA;CF67;110F 1169 11BA; # (콧; 콧; 콧; 콧; 콧; ) HANGUL SYLLABLE KOS +CF68;CF68;110F 1169 11BB;CF68;110F 1169 11BB; # (콨; 콨; 콨; 콨; 콨; ) HANGUL SYLLABLE KOSS +CF69;CF69;110F 1169 11BC;CF69;110F 1169 11BC; # (콩; 콩; 콩; 콩; 콩; ) HANGUL SYLLABLE KONG +CF6A;CF6A;110F 1169 11BD;CF6A;110F 1169 11BD; # (콪; 콪; 콪; 콪; 콪; ) HANGUL SYLLABLE KOJ +CF6B;CF6B;110F 1169 11BE;CF6B;110F 1169 11BE; # (콫; 콫; 콫; 콫; 콫; ) HANGUL SYLLABLE KOC +CF6C;CF6C;110F 1169 11BF;CF6C;110F 1169 11BF; # (콬; 콬; 콬; 콬; 콬; ) HANGUL SYLLABLE KOK +CF6D;CF6D;110F 1169 11C0;CF6D;110F 1169 11C0; # (콭; 콭; 콭; 콭; 콭; ) HANGUL SYLLABLE KOT +CF6E;CF6E;110F 1169 11C1;CF6E;110F 1169 11C1; # (콮; 콮; 콮; 콮; 콮; ) HANGUL SYLLABLE KOP +CF6F;CF6F;110F 1169 11C2;CF6F;110F 1169 11C2; # (콯; 콯; 콯; 콯; 콯; ) HANGUL SYLLABLE KOH +CF70;CF70;110F 116A;CF70;110F 116A; # (콰; 콰; 콰; 콰; 콰; ) HANGUL SYLLABLE KWA +CF71;CF71;110F 116A 11A8;CF71;110F 116A 11A8; # (콱; 콱; 콱; 콱; 콱; ) HANGUL SYLLABLE KWAG +CF72;CF72;110F 116A 11A9;CF72;110F 116A 11A9; # (콲; 콲; 콲; 콲; 콲; ) HANGUL SYLLABLE KWAGG +CF73;CF73;110F 116A 11AA;CF73;110F 116A 11AA; # (콳; 콳; 콳; 콳; 콳; ) HANGUL SYLLABLE KWAGS +CF74;CF74;110F 116A 11AB;CF74;110F 116A 11AB; # (콴; 콴; 콴; 콴; 콴; ) HANGUL SYLLABLE KWAN +CF75;CF75;110F 116A 11AC;CF75;110F 116A 11AC; # (콵; 콵; 콵; 콵; 콵; ) HANGUL SYLLABLE KWANJ +CF76;CF76;110F 116A 11AD;CF76;110F 116A 11AD; # (콶; 콶; 콶; 콶; 콶; ) HANGUL SYLLABLE KWANH +CF77;CF77;110F 116A 11AE;CF77;110F 116A 11AE; # (콷; 콷; 콷; 콷; 콷; ) HANGUL SYLLABLE KWAD +CF78;CF78;110F 116A 11AF;CF78;110F 116A 11AF; # (콸; 콸; 콸; 콸; 콸; ) HANGUL SYLLABLE KWAL +CF79;CF79;110F 116A 11B0;CF79;110F 116A 11B0; # (콹; 콹; 콹; 콹; 콹; ) HANGUL SYLLABLE KWALG +CF7A;CF7A;110F 116A 11B1;CF7A;110F 116A 11B1; # (콺; 콺; 콺; 콺; 콺; ) HANGUL SYLLABLE KWALM +CF7B;CF7B;110F 116A 11B2;CF7B;110F 116A 11B2; # (콻; 콻; 콻; 콻; 콻; ) HANGUL SYLLABLE KWALB +CF7C;CF7C;110F 116A 11B3;CF7C;110F 116A 11B3; # (콼; 콼; 콼; 콼; 콼; ) HANGUL SYLLABLE KWALS +CF7D;CF7D;110F 116A 11B4;CF7D;110F 116A 11B4; # (콽; 콽; 콽; 콽; 콽; ) HANGUL SYLLABLE KWALT +CF7E;CF7E;110F 116A 11B5;CF7E;110F 116A 11B5; # (콾; 콾; 콾; 콾; 콾; ) HANGUL SYLLABLE KWALP +CF7F;CF7F;110F 116A 11B6;CF7F;110F 116A 11B6; # (콿; 콿; 콿; 콿; 콿; ) HANGUL SYLLABLE KWALH +CF80;CF80;110F 116A 11B7;CF80;110F 116A 11B7; # (쾀; 쾀; 쾀; 쾀; 쾀; ) HANGUL SYLLABLE KWAM +CF81;CF81;110F 116A 11B8;CF81;110F 116A 11B8; # (쾁; 쾁; 쾁; 쾁; 쾁; ) HANGUL SYLLABLE KWAB +CF82;CF82;110F 116A 11B9;CF82;110F 116A 11B9; # (쾂; 쾂; 쾂; 쾂; 쾂; ) HANGUL SYLLABLE KWABS +CF83;CF83;110F 116A 11BA;CF83;110F 116A 11BA; # (쾃; 쾃; 쾃; 쾃; 쾃; ) HANGUL SYLLABLE KWAS +CF84;CF84;110F 116A 11BB;CF84;110F 116A 11BB; # (쾄; 쾄; 쾄; 쾄; 쾄; ) HANGUL SYLLABLE KWASS +CF85;CF85;110F 116A 11BC;CF85;110F 116A 11BC; # (쾅; 쾅; 쾅; 쾅; 쾅; ) HANGUL SYLLABLE KWANG +CF86;CF86;110F 116A 11BD;CF86;110F 116A 11BD; # (쾆; 쾆; 쾆; 쾆; 쾆; ) HANGUL SYLLABLE KWAJ +CF87;CF87;110F 116A 11BE;CF87;110F 116A 11BE; # (쾇; 쾇; 쾇; 쾇; 쾇; ) HANGUL SYLLABLE KWAC +CF88;CF88;110F 116A 11BF;CF88;110F 116A 11BF; # (쾈; 쾈; 쾈; 쾈; 쾈; ) HANGUL SYLLABLE KWAK +CF89;CF89;110F 116A 11C0;CF89;110F 116A 11C0; # (쾉; 쾉; 쾉; 쾉; 쾉; ) HANGUL SYLLABLE KWAT +CF8A;CF8A;110F 116A 11C1;CF8A;110F 116A 11C1; # (쾊; 쾊; 쾊; 쾊; 쾊; ) HANGUL SYLLABLE KWAP +CF8B;CF8B;110F 116A 11C2;CF8B;110F 116A 11C2; # (쾋; 쾋; 쾋; 쾋; 쾋; ) HANGUL SYLLABLE KWAH +CF8C;CF8C;110F 116B;CF8C;110F 116B; # (쾌; 쾌; 쾌; 쾌; 쾌; ) HANGUL SYLLABLE KWAE +CF8D;CF8D;110F 116B 11A8;CF8D;110F 116B 11A8; # (쾍; 쾍; 쾍; 쾍; 쾍; ) HANGUL SYLLABLE KWAEG +CF8E;CF8E;110F 116B 11A9;CF8E;110F 116B 11A9; # (쾎; 쾎; 쾎; 쾎; 쾎; ) HANGUL SYLLABLE KWAEGG +CF8F;CF8F;110F 116B 11AA;CF8F;110F 116B 11AA; # (쾏; 쾏; 쾏; 쾏; 쾏; ) HANGUL SYLLABLE KWAEGS +CF90;CF90;110F 116B 11AB;CF90;110F 116B 11AB; # (쾐; 쾐; 쾐; 쾐; 쾐; ) HANGUL SYLLABLE KWAEN +CF91;CF91;110F 116B 11AC;CF91;110F 116B 11AC; # (쾑; 쾑; 쾑; 쾑; 쾑; ) HANGUL SYLLABLE KWAENJ +CF92;CF92;110F 116B 11AD;CF92;110F 116B 11AD; # (쾒; 쾒; 쾒; 쾒; 쾒; ) HANGUL SYLLABLE KWAENH +CF93;CF93;110F 116B 11AE;CF93;110F 116B 11AE; # (쾓; 쾓; 쾓; 쾓; 쾓; ) HANGUL SYLLABLE KWAED +CF94;CF94;110F 116B 11AF;CF94;110F 116B 11AF; # (쾔; 쾔; 쾔; 쾔; 쾔; ) HANGUL SYLLABLE KWAEL +CF95;CF95;110F 116B 11B0;CF95;110F 116B 11B0; # (쾕; 쾕; 쾕; 쾕; 쾕; ) HANGUL SYLLABLE KWAELG +CF96;CF96;110F 116B 11B1;CF96;110F 116B 11B1; # (쾖; 쾖; 쾖; 쾖; 쾖; ) HANGUL SYLLABLE KWAELM +CF97;CF97;110F 116B 11B2;CF97;110F 116B 11B2; # (쾗; 쾗; 쾗; 쾗; 쾗; ) HANGUL SYLLABLE KWAELB +CF98;CF98;110F 116B 11B3;CF98;110F 116B 11B3; # (쾘; 쾘; 쾘; 쾘; 쾘; ) HANGUL SYLLABLE KWAELS +CF99;CF99;110F 116B 11B4;CF99;110F 116B 11B4; # (쾙; 쾙; 쾙; 쾙; 쾙; ) HANGUL SYLLABLE KWAELT +CF9A;CF9A;110F 116B 11B5;CF9A;110F 116B 11B5; # (쾚; 쾚; 쾚; 쾚; 쾚; ) HANGUL SYLLABLE KWAELP +CF9B;CF9B;110F 116B 11B6;CF9B;110F 116B 11B6; # (쾛; 쾛; 쾛; 쾛; 쾛; ) HANGUL SYLLABLE KWAELH +CF9C;CF9C;110F 116B 11B7;CF9C;110F 116B 11B7; # (쾜; 쾜; 쾜; 쾜; 쾜; ) HANGUL SYLLABLE KWAEM +CF9D;CF9D;110F 116B 11B8;CF9D;110F 116B 11B8; # (쾝; 쾝; 쾝; 쾝; 쾝; ) HANGUL SYLLABLE KWAEB +CF9E;CF9E;110F 116B 11B9;CF9E;110F 116B 11B9; # (쾞; 쾞; 쾞; 쾞; 쾞; ) HANGUL SYLLABLE KWAEBS +CF9F;CF9F;110F 116B 11BA;CF9F;110F 116B 11BA; # (쾟; 쾟; 쾟; 쾟; 쾟; ) HANGUL SYLLABLE KWAES +CFA0;CFA0;110F 116B 11BB;CFA0;110F 116B 11BB; # (쾠; 쾠; 쾠; 쾠; 쾠; ) HANGUL SYLLABLE KWAESS +CFA1;CFA1;110F 116B 11BC;CFA1;110F 116B 11BC; # (쾡; 쾡; 쾡; 쾡; 쾡; ) HANGUL SYLLABLE KWAENG +CFA2;CFA2;110F 116B 11BD;CFA2;110F 116B 11BD; # (쾢; 쾢; 쾢; 쾢; 쾢; ) HANGUL SYLLABLE KWAEJ +CFA3;CFA3;110F 116B 11BE;CFA3;110F 116B 11BE; # (쾣; 쾣; 쾣; 쾣; 쾣; ) HANGUL SYLLABLE KWAEC +CFA4;CFA4;110F 116B 11BF;CFA4;110F 116B 11BF; # (쾤; 쾤; 쾤; 쾤; 쾤; ) HANGUL SYLLABLE KWAEK +CFA5;CFA5;110F 116B 11C0;CFA5;110F 116B 11C0; # (쾥; 쾥; 쾥; 쾥; 쾥; ) HANGUL SYLLABLE KWAET +CFA6;CFA6;110F 116B 11C1;CFA6;110F 116B 11C1; # (쾦; 쾦; 쾦; 쾦; 쾦; ) HANGUL SYLLABLE KWAEP +CFA7;CFA7;110F 116B 11C2;CFA7;110F 116B 11C2; # (쾧; 쾧; 쾧; 쾧; 쾧; ) HANGUL SYLLABLE KWAEH +CFA8;CFA8;110F 116C;CFA8;110F 116C; # (쾨; 쾨; 쾨; 쾨; 쾨; ) HANGUL SYLLABLE KOE +CFA9;CFA9;110F 116C 11A8;CFA9;110F 116C 11A8; # (쾩; 쾩; 쾩; 쾩; 쾩; ) HANGUL SYLLABLE KOEG +CFAA;CFAA;110F 116C 11A9;CFAA;110F 116C 11A9; # (쾪; 쾪; 쾪; 쾪; 쾪; ) HANGUL SYLLABLE KOEGG +CFAB;CFAB;110F 116C 11AA;CFAB;110F 116C 11AA; # (쾫; 쾫; 쾫; 쾫; 쾫; ) HANGUL SYLLABLE KOEGS +CFAC;CFAC;110F 116C 11AB;CFAC;110F 116C 11AB; # (쾬; 쾬; 쾬; 쾬; 쾬; ) HANGUL SYLLABLE KOEN +CFAD;CFAD;110F 116C 11AC;CFAD;110F 116C 11AC; # (쾭; 쾭; 쾭; 쾭; 쾭; ) HANGUL SYLLABLE KOENJ +CFAE;CFAE;110F 116C 11AD;CFAE;110F 116C 11AD; # (쾮; 쾮; 쾮; 쾮; 쾮; ) HANGUL SYLLABLE KOENH +CFAF;CFAF;110F 116C 11AE;CFAF;110F 116C 11AE; # (쾯; 쾯; 쾯; 쾯; 쾯; ) HANGUL SYLLABLE KOED +CFB0;CFB0;110F 116C 11AF;CFB0;110F 116C 11AF; # (쾰; 쾰; 쾰; 쾰; 쾰; ) HANGUL SYLLABLE KOEL +CFB1;CFB1;110F 116C 11B0;CFB1;110F 116C 11B0; # (쾱; 쾱; 쾱; 쾱; 쾱; ) HANGUL SYLLABLE KOELG +CFB2;CFB2;110F 116C 11B1;CFB2;110F 116C 11B1; # (쾲; 쾲; 쾲; 쾲; 쾲; ) HANGUL SYLLABLE KOELM +CFB3;CFB3;110F 116C 11B2;CFB3;110F 116C 11B2; # (쾳; 쾳; 쾳; 쾳; 쾳; ) HANGUL SYLLABLE KOELB +CFB4;CFB4;110F 116C 11B3;CFB4;110F 116C 11B3; # (쾴; 쾴; 쾴; 쾴; 쾴; ) HANGUL SYLLABLE KOELS +CFB5;CFB5;110F 116C 11B4;CFB5;110F 116C 11B4; # (쾵; 쾵; 쾵; 쾵; 쾵; ) HANGUL SYLLABLE KOELT +CFB6;CFB6;110F 116C 11B5;CFB6;110F 116C 11B5; # (쾶; 쾶; 쾶; 쾶; 쾶; ) HANGUL SYLLABLE KOELP +CFB7;CFB7;110F 116C 11B6;CFB7;110F 116C 11B6; # (쾷; 쾷; 쾷; 쾷; 쾷; ) HANGUL SYLLABLE KOELH +CFB8;CFB8;110F 116C 11B7;CFB8;110F 116C 11B7; # (쾸; 쾸; 쾸; 쾸; 쾸; ) HANGUL SYLLABLE KOEM +CFB9;CFB9;110F 116C 11B8;CFB9;110F 116C 11B8; # (쾹; 쾹; 쾹; 쾹; 쾹; ) HANGUL SYLLABLE KOEB +CFBA;CFBA;110F 116C 11B9;CFBA;110F 116C 11B9; # (쾺; 쾺; 쾺; 쾺; 쾺; ) HANGUL SYLLABLE KOEBS +CFBB;CFBB;110F 116C 11BA;CFBB;110F 116C 11BA; # (쾻; 쾻; 쾻; 쾻; 쾻; ) HANGUL SYLLABLE KOES +CFBC;CFBC;110F 116C 11BB;CFBC;110F 116C 11BB; # (쾼; 쾼; 쾼; 쾼; 쾼; ) HANGUL SYLLABLE KOESS +CFBD;CFBD;110F 116C 11BC;CFBD;110F 116C 11BC; # (쾽; 쾽; 쾽; 쾽; 쾽; ) HANGUL SYLLABLE KOENG +CFBE;CFBE;110F 116C 11BD;CFBE;110F 116C 11BD; # (쾾; 쾾; 쾾; 쾾; 쾾; ) HANGUL SYLLABLE KOEJ +CFBF;CFBF;110F 116C 11BE;CFBF;110F 116C 11BE; # (쾿; 쾿; 쾿; 쾿; 쾿; ) HANGUL SYLLABLE KOEC +CFC0;CFC0;110F 116C 11BF;CFC0;110F 116C 11BF; # (쿀; 쿀; 쿀; 쿀; 쿀; ) HANGUL SYLLABLE KOEK +CFC1;CFC1;110F 116C 11C0;CFC1;110F 116C 11C0; # (쿁; 쿁; 쿁; 쿁; 쿁; ) HANGUL SYLLABLE KOET +CFC2;CFC2;110F 116C 11C1;CFC2;110F 116C 11C1; # (쿂; 쿂; 쿂; 쿂; 쿂; ) HANGUL SYLLABLE KOEP +CFC3;CFC3;110F 116C 11C2;CFC3;110F 116C 11C2; # (쿃; 쿃; 쿃; 쿃; 쿃; ) HANGUL SYLLABLE KOEH +CFC4;CFC4;110F 116D;CFC4;110F 116D; # (쿄; 쿄; 쿄; 쿄; 쿄; ) HANGUL SYLLABLE KYO +CFC5;CFC5;110F 116D 11A8;CFC5;110F 116D 11A8; # (쿅; 쿅; 쿅; 쿅; 쿅; ) HANGUL SYLLABLE KYOG +CFC6;CFC6;110F 116D 11A9;CFC6;110F 116D 11A9; # (쿆; 쿆; 쿆; 쿆; 쿆; ) HANGUL SYLLABLE KYOGG +CFC7;CFC7;110F 116D 11AA;CFC7;110F 116D 11AA; # (쿇; 쿇; 쿇; 쿇; 쿇; ) HANGUL SYLLABLE KYOGS +CFC8;CFC8;110F 116D 11AB;CFC8;110F 116D 11AB; # (쿈; 쿈; 쿈; 쿈; 쿈; ) HANGUL SYLLABLE KYON +CFC9;CFC9;110F 116D 11AC;CFC9;110F 116D 11AC; # (쿉; 쿉; 쿉; 쿉; 쿉; ) HANGUL SYLLABLE KYONJ +CFCA;CFCA;110F 116D 11AD;CFCA;110F 116D 11AD; # (쿊; 쿊; 쿊; 쿊; 쿊; ) HANGUL SYLLABLE KYONH +CFCB;CFCB;110F 116D 11AE;CFCB;110F 116D 11AE; # (쿋; 쿋; 쿋; 쿋; 쿋; ) HANGUL SYLLABLE KYOD +CFCC;CFCC;110F 116D 11AF;CFCC;110F 116D 11AF; # (쿌; 쿌; 쿌; 쿌; 쿌; ) HANGUL SYLLABLE KYOL +CFCD;CFCD;110F 116D 11B0;CFCD;110F 116D 11B0; # (쿍; 쿍; 쿍; 쿍; 쿍; ) HANGUL SYLLABLE KYOLG +CFCE;CFCE;110F 116D 11B1;CFCE;110F 116D 11B1; # (쿎; 쿎; 쿎; 쿎; 쿎; ) HANGUL SYLLABLE KYOLM +CFCF;CFCF;110F 116D 11B2;CFCF;110F 116D 11B2; # (쿏; 쿏; 쿏; 쿏; 쿏; ) HANGUL SYLLABLE KYOLB +CFD0;CFD0;110F 116D 11B3;CFD0;110F 116D 11B3; # (쿐; 쿐; 쿐; 쿐; 쿐; ) HANGUL SYLLABLE KYOLS +CFD1;CFD1;110F 116D 11B4;CFD1;110F 116D 11B4; # (쿑; 쿑; 쿑; 쿑; 쿑; ) HANGUL SYLLABLE KYOLT +CFD2;CFD2;110F 116D 11B5;CFD2;110F 116D 11B5; # (쿒; 쿒; 쿒; 쿒; 쿒; ) HANGUL SYLLABLE KYOLP +CFD3;CFD3;110F 116D 11B6;CFD3;110F 116D 11B6; # (쿓; 쿓; 쿓; 쿓; 쿓; ) HANGUL SYLLABLE KYOLH +CFD4;CFD4;110F 116D 11B7;CFD4;110F 116D 11B7; # (쿔; 쿔; 쿔; 쿔; 쿔; ) HANGUL SYLLABLE KYOM +CFD5;CFD5;110F 116D 11B8;CFD5;110F 116D 11B8; # (쿕; 쿕; 쿕; 쿕; 쿕; ) HANGUL SYLLABLE KYOB +CFD6;CFD6;110F 116D 11B9;CFD6;110F 116D 11B9; # (쿖; 쿖; 쿖; 쿖; 쿖; ) HANGUL SYLLABLE KYOBS +CFD7;CFD7;110F 116D 11BA;CFD7;110F 116D 11BA; # (쿗; 쿗; 쿗; 쿗; 쿗; ) HANGUL SYLLABLE KYOS +CFD8;CFD8;110F 116D 11BB;CFD8;110F 116D 11BB; # (쿘; 쿘; 쿘; 쿘; 쿘; ) HANGUL SYLLABLE KYOSS +CFD9;CFD9;110F 116D 11BC;CFD9;110F 116D 11BC; # (쿙; 쿙; 쿙; 쿙; 쿙; ) HANGUL SYLLABLE KYONG +CFDA;CFDA;110F 116D 11BD;CFDA;110F 116D 11BD; # (쿚; 쿚; 쿚; 쿚; 쿚; ) HANGUL SYLLABLE KYOJ +CFDB;CFDB;110F 116D 11BE;CFDB;110F 116D 11BE; # (쿛; 쿛; 쿛; 쿛; 쿛; ) HANGUL SYLLABLE KYOC +CFDC;CFDC;110F 116D 11BF;CFDC;110F 116D 11BF; # (쿜; 쿜; 쿜; 쿜; 쿜; ) HANGUL SYLLABLE KYOK +CFDD;CFDD;110F 116D 11C0;CFDD;110F 116D 11C0; # (쿝; 쿝; 쿝; 쿝; 쿝; ) HANGUL SYLLABLE KYOT +CFDE;CFDE;110F 116D 11C1;CFDE;110F 116D 11C1; # (쿞; 쿞; 쿞; 쿞; 쿞; ) HANGUL SYLLABLE KYOP +CFDF;CFDF;110F 116D 11C2;CFDF;110F 116D 11C2; # (쿟; 쿟; 쿟; 쿟; 쿟; ) HANGUL SYLLABLE KYOH +CFE0;CFE0;110F 116E;CFE0;110F 116E; # (쿠; 쿠; 쿠; 쿠; 쿠; ) HANGUL SYLLABLE KU +CFE1;CFE1;110F 116E 11A8;CFE1;110F 116E 11A8; # (쿡; 쿡; 쿡; 쿡; 쿡; ) HANGUL SYLLABLE KUG +CFE2;CFE2;110F 116E 11A9;CFE2;110F 116E 11A9; # (쿢; 쿢; 쿢; 쿢; 쿢; ) HANGUL SYLLABLE KUGG +CFE3;CFE3;110F 116E 11AA;CFE3;110F 116E 11AA; # (쿣; 쿣; 쿣; 쿣; 쿣; ) HANGUL SYLLABLE KUGS +CFE4;CFE4;110F 116E 11AB;CFE4;110F 116E 11AB; # (쿤; 쿤; 쿤; 쿤; 쿤; ) HANGUL SYLLABLE KUN +CFE5;CFE5;110F 116E 11AC;CFE5;110F 116E 11AC; # (쿥; 쿥; 쿥; 쿥; 쿥; ) HANGUL SYLLABLE KUNJ +CFE6;CFE6;110F 116E 11AD;CFE6;110F 116E 11AD; # (쿦; 쿦; 쿦; 쿦; 쿦; ) HANGUL SYLLABLE KUNH +CFE7;CFE7;110F 116E 11AE;CFE7;110F 116E 11AE; # (쿧; 쿧; 쿧; 쿧; 쿧; ) HANGUL SYLLABLE KUD +CFE8;CFE8;110F 116E 11AF;CFE8;110F 116E 11AF; # (쿨; 쿨; 쿨; 쿨; 쿨; ) HANGUL SYLLABLE KUL +CFE9;CFE9;110F 116E 11B0;CFE9;110F 116E 11B0; # (쿩; 쿩; 쿩; 쿩; 쿩; ) HANGUL SYLLABLE KULG +CFEA;CFEA;110F 116E 11B1;CFEA;110F 116E 11B1; # (쿪; 쿪; 쿪; 쿪; 쿪; ) HANGUL SYLLABLE KULM +CFEB;CFEB;110F 116E 11B2;CFEB;110F 116E 11B2; # (쿫; 쿫; 쿫; 쿫; 쿫; ) HANGUL SYLLABLE KULB +CFEC;CFEC;110F 116E 11B3;CFEC;110F 116E 11B3; # (쿬; 쿬; 쿬; 쿬; 쿬; ) HANGUL SYLLABLE KULS +CFED;CFED;110F 116E 11B4;CFED;110F 116E 11B4; # (쿭; 쿭; 쿭; 쿭; 쿭; ) HANGUL SYLLABLE KULT +CFEE;CFEE;110F 116E 11B5;CFEE;110F 116E 11B5; # (쿮; 쿮; 쿮; 쿮; 쿮; ) HANGUL SYLLABLE KULP +CFEF;CFEF;110F 116E 11B6;CFEF;110F 116E 11B6; # (쿯; 쿯; 쿯; 쿯; 쿯; ) HANGUL SYLLABLE KULH +CFF0;CFF0;110F 116E 11B7;CFF0;110F 116E 11B7; # (쿰; 쿰; 쿰; 쿰; 쿰; ) HANGUL SYLLABLE KUM +CFF1;CFF1;110F 116E 11B8;CFF1;110F 116E 11B8; # (쿱; 쿱; 쿱; 쿱; 쿱; ) HANGUL SYLLABLE KUB +CFF2;CFF2;110F 116E 11B9;CFF2;110F 116E 11B9; # (쿲; 쿲; 쿲; 쿲; 쿲; ) HANGUL SYLLABLE KUBS +CFF3;CFF3;110F 116E 11BA;CFF3;110F 116E 11BA; # (쿳; 쿳; 쿳; 쿳; 쿳; ) HANGUL SYLLABLE KUS +CFF4;CFF4;110F 116E 11BB;CFF4;110F 116E 11BB; # (쿴; 쿴; 쿴; 쿴; 쿴; ) HANGUL SYLLABLE KUSS +CFF5;CFF5;110F 116E 11BC;CFF5;110F 116E 11BC; # (쿵; 쿵; 쿵; 쿵; 쿵; ) HANGUL SYLLABLE KUNG +CFF6;CFF6;110F 116E 11BD;CFF6;110F 116E 11BD; # (쿶; 쿶; 쿶; 쿶; 쿶; ) HANGUL SYLLABLE KUJ +CFF7;CFF7;110F 116E 11BE;CFF7;110F 116E 11BE; # (쿷; 쿷; 쿷; 쿷; 쿷; ) HANGUL SYLLABLE KUC +CFF8;CFF8;110F 116E 11BF;CFF8;110F 116E 11BF; # (쿸; 쿸; 쿸; 쿸; 쿸; ) HANGUL SYLLABLE KUK +CFF9;CFF9;110F 116E 11C0;CFF9;110F 116E 11C0; # (쿹; 쿹; 쿹; 쿹; 쿹; ) HANGUL SYLLABLE KUT +CFFA;CFFA;110F 116E 11C1;CFFA;110F 116E 11C1; # (쿺; 쿺; 쿺; 쿺; 쿺; ) HANGUL SYLLABLE KUP +CFFB;CFFB;110F 116E 11C2;CFFB;110F 116E 11C2; # (쿻; 쿻; 쿻; 쿻; 쿻; ) HANGUL SYLLABLE KUH +CFFC;CFFC;110F 116F;CFFC;110F 116F; # (쿼; 쿼; 쿼; 쿼; 쿼; ) HANGUL SYLLABLE KWEO +CFFD;CFFD;110F 116F 11A8;CFFD;110F 116F 11A8; # (쿽; 쿽; 쿽; 쿽; 쿽; ) HANGUL SYLLABLE KWEOG +CFFE;CFFE;110F 116F 11A9;CFFE;110F 116F 11A9; # (쿾; 쿾; 쿾; 쿾; 쿾; ) HANGUL SYLLABLE KWEOGG +CFFF;CFFF;110F 116F 11AA;CFFF;110F 116F 11AA; # (쿿; 쿿; 쿿; 쿿; 쿿; ) HANGUL SYLLABLE KWEOGS +D000;D000;110F 116F 11AB;D000;110F 116F 11AB; # (퀀; 퀀; 퀀; 퀀; 퀀; ) HANGUL SYLLABLE KWEON +D001;D001;110F 116F 11AC;D001;110F 116F 11AC; # (퀁; 퀁; 퀁; 퀁; 퀁; ) HANGUL SYLLABLE KWEONJ +D002;D002;110F 116F 11AD;D002;110F 116F 11AD; # (퀂; 퀂; 퀂; 퀂; 퀂; ) HANGUL SYLLABLE KWEONH +D003;D003;110F 116F 11AE;D003;110F 116F 11AE; # (퀃; 퀃; 퀃; 퀃; 퀃; ) HANGUL SYLLABLE KWEOD +D004;D004;110F 116F 11AF;D004;110F 116F 11AF; # (퀄; 퀄; 퀄; 퀄; 퀄; ) HANGUL SYLLABLE KWEOL +D005;D005;110F 116F 11B0;D005;110F 116F 11B0; # (퀅; 퀅; 퀅; 퀅; 퀅; ) HANGUL SYLLABLE KWEOLG +D006;D006;110F 116F 11B1;D006;110F 116F 11B1; # (퀆; 퀆; 퀆; 퀆; 퀆; ) HANGUL SYLLABLE KWEOLM +D007;D007;110F 116F 11B2;D007;110F 116F 11B2; # (퀇; 퀇; 퀇; 퀇; 퀇; ) HANGUL SYLLABLE KWEOLB +D008;D008;110F 116F 11B3;D008;110F 116F 11B3; # (퀈; 퀈; 퀈; 퀈; 퀈; ) HANGUL SYLLABLE KWEOLS +D009;D009;110F 116F 11B4;D009;110F 116F 11B4; # (퀉; 퀉; 퀉; 퀉; 퀉; ) HANGUL SYLLABLE KWEOLT +D00A;D00A;110F 116F 11B5;D00A;110F 116F 11B5; # (퀊; 퀊; 퀊; 퀊; 퀊; ) HANGUL SYLLABLE KWEOLP +D00B;D00B;110F 116F 11B6;D00B;110F 116F 11B6; # (퀋; 퀋; 퀋; 퀋; 퀋; ) HANGUL SYLLABLE KWEOLH +D00C;D00C;110F 116F 11B7;D00C;110F 116F 11B7; # (퀌; 퀌; 퀌; 퀌; 퀌; ) HANGUL SYLLABLE KWEOM +D00D;D00D;110F 116F 11B8;D00D;110F 116F 11B8; # (퀍; 퀍; 퀍; 퀍; 퀍; ) HANGUL SYLLABLE KWEOB +D00E;D00E;110F 116F 11B9;D00E;110F 116F 11B9; # (퀎; 퀎; 퀎; 퀎; 퀎; ) HANGUL SYLLABLE KWEOBS +D00F;D00F;110F 116F 11BA;D00F;110F 116F 11BA; # (퀏; 퀏; 퀏; 퀏; 퀏; ) HANGUL SYLLABLE KWEOS +D010;D010;110F 116F 11BB;D010;110F 116F 11BB; # (퀐; 퀐; 퀐; 퀐; 퀐; ) HANGUL SYLLABLE KWEOSS +D011;D011;110F 116F 11BC;D011;110F 116F 11BC; # (퀑; 퀑; 퀑; 퀑; 퀑; ) HANGUL SYLLABLE KWEONG +D012;D012;110F 116F 11BD;D012;110F 116F 11BD; # (퀒; 퀒; 퀒; 퀒; 퀒; ) HANGUL SYLLABLE KWEOJ +D013;D013;110F 116F 11BE;D013;110F 116F 11BE; # (퀓; 퀓; 퀓; 퀓; 퀓; ) HANGUL SYLLABLE KWEOC +D014;D014;110F 116F 11BF;D014;110F 116F 11BF; # (퀔; 퀔; 퀔; 퀔; 퀔; ) HANGUL SYLLABLE KWEOK +D015;D015;110F 116F 11C0;D015;110F 116F 11C0; # (퀕; 퀕; 퀕; 퀕; 퀕; ) HANGUL SYLLABLE KWEOT +D016;D016;110F 116F 11C1;D016;110F 116F 11C1; # (퀖; 퀖; 퀖; 퀖; 퀖; ) HANGUL SYLLABLE KWEOP +D017;D017;110F 116F 11C2;D017;110F 116F 11C2; # (퀗; 퀗; 퀗; 퀗; 퀗; ) HANGUL SYLLABLE KWEOH +D018;D018;110F 1170;D018;110F 1170; # (퀘; 퀘; 퀘; 퀘; 퀘; ) HANGUL SYLLABLE KWE +D019;D019;110F 1170 11A8;D019;110F 1170 11A8; # (퀙; 퀙; 퀙; 퀙; 퀙; ) HANGUL SYLLABLE KWEG +D01A;D01A;110F 1170 11A9;D01A;110F 1170 11A9; # (퀚; 퀚; 퀚; 퀚; 퀚; ) HANGUL SYLLABLE KWEGG +D01B;D01B;110F 1170 11AA;D01B;110F 1170 11AA; # (퀛; 퀛; 퀛; 퀛; 퀛; ) HANGUL SYLLABLE KWEGS +D01C;D01C;110F 1170 11AB;D01C;110F 1170 11AB; # (퀜; 퀜; 퀜; 퀜; 퀜; ) HANGUL SYLLABLE KWEN +D01D;D01D;110F 1170 11AC;D01D;110F 1170 11AC; # (퀝; 퀝; 퀝; 퀝; 퀝; ) HANGUL SYLLABLE KWENJ +D01E;D01E;110F 1170 11AD;D01E;110F 1170 11AD; # (퀞; 퀞; 퀞; 퀞; 퀞; ) HANGUL SYLLABLE KWENH +D01F;D01F;110F 1170 11AE;D01F;110F 1170 11AE; # (퀟; 퀟; 퀟; 퀟; 퀟; ) HANGUL SYLLABLE KWED +D020;D020;110F 1170 11AF;D020;110F 1170 11AF; # (퀠; 퀠; 퀠; 퀠; 퀠; ) HANGUL SYLLABLE KWEL +D021;D021;110F 1170 11B0;D021;110F 1170 11B0; # (퀡; 퀡; 퀡; 퀡; 퀡; ) HANGUL SYLLABLE KWELG +D022;D022;110F 1170 11B1;D022;110F 1170 11B1; # (퀢; 퀢; 퀢; 퀢; 퀢; ) HANGUL SYLLABLE KWELM +D023;D023;110F 1170 11B2;D023;110F 1170 11B2; # (퀣; 퀣; 퀣; 퀣; 퀣; ) HANGUL SYLLABLE KWELB +D024;D024;110F 1170 11B3;D024;110F 1170 11B3; # (퀤; 퀤; 퀤; 퀤; 퀤; ) HANGUL SYLLABLE KWELS +D025;D025;110F 1170 11B4;D025;110F 1170 11B4; # (퀥; 퀥; 퀥; 퀥; 퀥; ) HANGUL SYLLABLE KWELT +D026;D026;110F 1170 11B5;D026;110F 1170 11B5; # (퀦; 퀦; 퀦; 퀦; 퀦; ) HANGUL SYLLABLE KWELP +D027;D027;110F 1170 11B6;D027;110F 1170 11B6; # (퀧; 퀧; 퀧; 퀧; 퀧; ) HANGUL SYLLABLE KWELH +D028;D028;110F 1170 11B7;D028;110F 1170 11B7; # (퀨; 퀨; 퀨; 퀨; 퀨; ) HANGUL SYLLABLE KWEM +D029;D029;110F 1170 11B8;D029;110F 1170 11B8; # (퀩; 퀩; 퀩; 퀩; 퀩; ) HANGUL SYLLABLE KWEB +D02A;D02A;110F 1170 11B9;D02A;110F 1170 11B9; # (퀪; 퀪; 퀪; 퀪; 퀪; ) HANGUL SYLLABLE KWEBS +D02B;D02B;110F 1170 11BA;D02B;110F 1170 11BA; # (퀫; 퀫; 퀫; 퀫; 퀫; ) HANGUL SYLLABLE KWES +D02C;D02C;110F 1170 11BB;D02C;110F 1170 11BB; # (퀬; 퀬; 퀬; 퀬; 퀬; ) HANGUL SYLLABLE KWESS +D02D;D02D;110F 1170 11BC;D02D;110F 1170 11BC; # (퀭; 퀭; 퀭; 퀭; 퀭; ) HANGUL SYLLABLE KWENG +D02E;D02E;110F 1170 11BD;D02E;110F 1170 11BD; # (퀮; 퀮; 퀮; 퀮; 퀮; ) HANGUL SYLLABLE KWEJ +D02F;D02F;110F 1170 11BE;D02F;110F 1170 11BE; # (퀯; 퀯; 퀯; 퀯; 퀯; ) HANGUL SYLLABLE KWEC +D030;D030;110F 1170 11BF;D030;110F 1170 11BF; # (퀰; 퀰; 퀰; 퀰; 퀰; ) HANGUL SYLLABLE KWEK +D031;D031;110F 1170 11C0;D031;110F 1170 11C0; # (퀱; 퀱; 퀱; 퀱; 퀱; ) HANGUL SYLLABLE KWET +D032;D032;110F 1170 11C1;D032;110F 1170 11C1; # (퀲; 퀲; 퀲; 퀲; 퀲; ) HANGUL SYLLABLE KWEP +D033;D033;110F 1170 11C2;D033;110F 1170 11C2; # (퀳; 퀳; 퀳; 퀳; 퀳; ) HANGUL SYLLABLE KWEH +D034;D034;110F 1171;D034;110F 1171; # (퀴; 퀴; 퀴; 퀴; 퀴; ) HANGUL SYLLABLE KWI +D035;D035;110F 1171 11A8;D035;110F 1171 11A8; # (퀵; 퀵; 퀵; 퀵; 퀵; ) HANGUL SYLLABLE KWIG +D036;D036;110F 1171 11A9;D036;110F 1171 11A9; # (퀶; 퀶; 퀶; 퀶; 퀶; ) HANGUL SYLLABLE KWIGG +D037;D037;110F 1171 11AA;D037;110F 1171 11AA; # (퀷; 퀷; 퀷; 퀷; 퀷; ) HANGUL SYLLABLE KWIGS +D038;D038;110F 1171 11AB;D038;110F 1171 11AB; # (퀸; 퀸; 퀸; 퀸; 퀸; ) HANGUL SYLLABLE KWIN +D039;D039;110F 1171 11AC;D039;110F 1171 11AC; # (퀹; 퀹; 퀹; 퀹; 퀹; ) HANGUL SYLLABLE KWINJ +D03A;D03A;110F 1171 11AD;D03A;110F 1171 11AD; # (퀺; 퀺; 퀺; 퀺; 퀺; ) HANGUL SYLLABLE KWINH +D03B;D03B;110F 1171 11AE;D03B;110F 1171 11AE; # (퀻; 퀻; 퀻; 퀻; 퀻; ) HANGUL SYLLABLE KWID +D03C;D03C;110F 1171 11AF;D03C;110F 1171 11AF; # (퀼; 퀼; 퀼; 퀼; 퀼; ) HANGUL SYLLABLE KWIL +D03D;D03D;110F 1171 11B0;D03D;110F 1171 11B0; # (퀽; 퀽; 퀽; 퀽; 퀽; ) HANGUL SYLLABLE KWILG +D03E;D03E;110F 1171 11B1;D03E;110F 1171 11B1; # (퀾; 퀾; 퀾; 퀾; 퀾; ) HANGUL SYLLABLE KWILM +D03F;D03F;110F 1171 11B2;D03F;110F 1171 11B2; # (퀿; 퀿; 퀿; 퀿; 퀿; ) HANGUL SYLLABLE KWILB +D040;D040;110F 1171 11B3;D040;110F 1171 11B3; # (큀; 큀; 큀; 큀; 큀; ) HANGUL SYLLABLE KWILS +D041;D041;110F 1171 11B4;D041;110F 1171 11B4; # (큁; 큁; 큁; 큁; 큁; ) HANGUL SYLLABLE KWILT +D042;D042;110F 1171 11B5;D042;110F 1171 11B5; # (큂; 큂; 큂; 큂; 큂; ) HANGUL SYLLABLE KWILP +D043;D043;110F 1171 11B6;D043;110F 1171 11B6; # (큃; 큃; 큃; 큃; 큃; ) HANGUL SYLLABLE KWILH +D044;D044;110F 1171 11B7;D044;110F 1171 11B7; # (큄; 큄; 큄; 큄; 큄; ) HANGUL SYLLABLE KWIM +D045;D045;110F 1171 11B8;D045;110F 1171 11B8; # (큅; 큅; 큅; 큅; 큅; ) HANGUL SYLLABLE KWIB +D046;D046;110F 1171 11B9;D046;110F 1171 11B9; # (큆; 큆; 큆; 큆; 큆; ) HANGUL SYLLABLE KWIBS +D047;D047;110F 1171 11BA;D047;110F 1171 11BA; # (큇; 큇; 큇; 큇; 큇; ) HANGUL SYLLABLE KWIS +D048;D048;110F 1171 11BB;D048;110F 1171 11BB; # (큈; 큈; 큈; 큈; 큈; ) HANGUL SYLLABLE KWISS +D049;D049;110F 1171 11BC;D049;110F 1171 11BC; # (큉; 큉; 큉; 큉; 큉; ) HANGUL SYLLABLE KWING +D04A;D04A;110F 1171 11BD;D04A;110F 1171 11BD; # (큊; 큊; 큊; 큊; 큊; ) HANGUL SYLLABLE KWIJ +D04B;D04B;110F 1171 11BE;D04B;110F 1171 11BE; # (큋; 큋; 큋; 큋; 큋; ) HANGUL SYLLABLE KWIC +D04C;D04C;110F 1171 11BF;D04C;110F 1171 11BF; # (큌; 큌; 큌; 큌; 큌; ) HANGUL SYLLABLE KWIK +D04D;D04D;110F 1171 11C0;D04D;110F 1171 11C0; # (큍; 큍; 큍; 큍; 큍; ) HANGUL SYLLABLE KWIT +D04E;D04E;110F 1171 11C1;D04E;110F 1171 11C1; # (큎; 큎; 큎; 큎; 큎; ) HANGUL SYLLABLE KWIP +D04F;D04F;110F 1171 11C2;D04F;110F 1171 11C2; # (큏; 큏; 큏; 큏; 큏; ) HANGUL SYLLABLE KWIH +D050;D050;110F 1172;D050;110F 1172; # (큐; 큐; 큐; 큐; 큐; ) HANGUL SYLLABLE KYU +D051;D051;110F 1172 11A8;D051;110F 1172 11A8; # (큑; 큑; 큑; 큑; 큑; ) HANGUL SYLLABLE KYUG +D052;D052;110F 1172 11A9;D052;110F 1172 11A9; # (큒; 큒; 큒; 큒; 큒; ) HANGUL SYLLABLE KYUGG +D053;D053;110F 1172 11AA;D053;110F 1172 11AA; # (큓; 큓; 큓; 큓; 큓; ) HANGUL SYLLABLE KYUGS +D054;D054;110F 1172 11AB;D054;110F 1172 11AB; # (큔; 큔; 큔; 큔; 큔; ) HANGUL SYLLABLE KYUN +D055;D055;110F 1172 11AC;D055;110F 1172 11AC; # (큕; 큕; 큕; 큕; 큕; ) HANGUL SYLLABLE KYUNJ +D056;D056;110F 1172 11AD;D056;110F 1172 11AD; # (큖; 큖; 큖; 큖; 큖; ) HANGUL SYLLABLE KYUNH +D057;D057;110F 1172 11AE;D057;110F 1172 11AE; # (큗; 큗; 큗; 큗; 큗; ) HANGUL SYLLABLE KYUD +D058;D058;110F 1172 11AF;D058;110F 1172 11AF; # (큘; 큘; 큘; 큘; 큘; ) HANGUL SYLLABLE KYUL +D059;D059;110F 1172 11B0;D059;110F 1172 11B0; # (큙; 큙; 큙; 큙; 큙; ) HANGUL SYLLABLE KYULG +D05A;D05A;110F 1172 11B1;D05A;110F 1172 11B1; # (큚; 큚; 큚; 큚; 큚; ) HANGUL SYLLABLE KYULM +D05B;D05B;110F 1172 11B2;D05B;110F 1172 11B2; # (큛; 큛; 큛; 큛; 큛; ) HANGUL SYLLABLE KYULB +D05C;D05C;110F 1172 11B3;D05C;110F 1172 11B3; # (큜; 큜; 큜; 큜; 큜; ) HANGUL SYLLABLE KYULS +D05D;D05D;110F 1172 11B4;D05D;110F 1172 11B4; # (큝; 큝; 큝; 큝; 큝; ) HANGUL SYLLABLE KYULT +D05E;D05E;110F 1172 11B5;D05E;110F 1172 11B5; # (큞; 큞; 큞; 큞; 큞; ) HANGUL SYLLABLE KYULP +D05F;D05F;110F 1172 11B6;D05F;110F 1172 11B6; # (큟; 큟; 큟; 큟; 큟; ) HANGUL SYLLABLE KYULH +D060;D060;110F 1172 11B7;D060;110F 1172 11B7; # (큠; 큠; 큠; 큠; 큠; ) HANGUL SYLLABLE KYUM +D061;D061;110F 1172 11B8;D061;110F 1172 11B8; # (큡; 큡; 큡; 큡; 큡; ) HANGUL SYLLABLE KYUB +D062;D062;110F 1172 11B9;D062;110F 1172 11B9; # (큢; 큢; 큢; 큢; 큢; ) HANGUL SYLLABLE KYUBS +D063;D063;110F 1172 11BA;D063;110F 1172 11BA; # (큣; 큣; 큣; 큣; 큣; ) HANGUL SYLLABLE KYUS +D064;D064;110F 1172 11BB;D064;110F 1172 11BB; # (큤; 큤; 큤; 큤; 큤; ) HANGUL SYLLABLE KYUSS +D065;D065;110F 1172 11BC;D065;110F 1172 11BC; # (큥; 큥; 큥; 큥; 큥; ) HANGUL SYLLABLE KYUNG +D066;D066;110F 1172 11BD;D066;110F 1172 11BD; # (큦; 큦; 큦; 큦; 큦; ) HANGUL SYLLABLE KYUJ +D067;D067;110F 1172 11BE;D067;110F 1172 11BE; # (큧; 큧; 큧; 큧; 큧; ) HANGUL SYLLABLE KYUC +D068;D068;110F 1172 11BF;D068;110F 1172 11BF; # (큨; 큨; 큨; 큨; 큨; ) HANGUL SYLLABLE KYUK +D069;D069;110F 1172 11C0;D069;110F 1172 11C0; # (큩; 큩; 큩; 큩; 큩; ) HANGUL SYLLABLE KYUT +D06A;D06A;110F 1172 11C1;D06A;110F 1172 11C1; # (큪; 큪; 큪; 큪; 큪; ) HANGUL SYLLABLE KYUP +D06B;D06B;110F 1172 11C2;D06B;110F 1172 11C2; # (큫; 큫; 큫; 큫; 큫; ) HANGUL SYLLABLE KYUH +D06C;D06C;110F 1173;D06C;110F 1173; # (크; 크; 크; 크; 크; ) HANGUL SYLLABLE KEU +D06D;D06D;110F 1173 11A8;D06D;110F 1173 11A8; # (큭; 큭; 큭; 큭; 큭; ) HANGUL SYLLABLE KEUG +D06E;D06E;110F 1173 11A9;D06E;110F 1173 11A9; # (큮; 큮; 큮; 큮; 큮; ) HANGUL SYLLABLE KEUGG +D06F;D06F;110F 1173 11AA;D06F;110F 1173 11AA; # (큯; 큯; 큯; 큯; 큯; ) HANGUL SYLLABLE KEUGS +D070;D070;110F 1173 11AB;D070;110F 1173 11AB; # (큰; 큰; 큰; 큰; 큰; ) HANGUL SYLLABLE KEUN +D071;D071;110F 1173 11AC;D071;110F 1173 11AC; # (큱; 큱; 큱; 큱; 큱; ) HANGUL SYLLABLE KEUNJ +D072;D072;110F 1173 11AD;D072;110F 1173 11AD; # (큲; 큲; 큲; 큲; 큲; ) HANGUL SYLLABLE KEUNH +D073;D073;110F 1173 11AE;D073;110F 1173 11AE; # (큳; 큳; 큳; 큳; 큳; ) HANGUL SYLLABLE KEUD +D074;D074;110F 1173 11AF;D074;110F 1173 11AF; # (클; 클; 클; 클; 클; ) HANGUL SYLLABLE KEUL +D075;D075;110F 1173 11B0;D075;110F 1173 11B0; # (큵; 큵; 큵; 큵; 큵; ) HANGUL SYLLABLE KEULG +D076;D076;110F 1173 11B1;D076;110F 1173 11B1; # (큶; 큶; 큶; 큶; 큶; ) HANGUL SYLLABLE KEULM +D077;D077;110F 1173 11B2;D077;110F 1173 11B2; # (큷; 큷; 큷; 큷; 큷; ) HANGUL SYLLABLE KEULB +D078;D078;110F 1173 11B3;D078;110F 1173 11B3; # (큸; 큸; 큸; 큸; 큸; ) HANGUL SYLLABLE KEULS +D079;D079;110F 1173 11B4;D079;110F 1173 11B4; # (큹; 큹; 큹; 큹; 큹; ) HANGUL SYLLABLE KEULT +D07A;D07A;110F 1173 11B5;D07A;110F 1173 11B5; # (큺; 큺; 큺; 큺; 큺; ) HANGUL SYLLABLE KEULP +D07B;D07B;110F 1173 11B6;D07B;110F 1173 11B6; # (큻; 큻; 큻; 큻; 큻; ) HANGUL SYLLABLE KEULH +D07C;D07C;110F 1173 11B7;D07C;110F 1173 11B7; # (큼; 큼; 큼; 큼; 큼; ) HANGUL SYLLABLE KEUM +D07D;D07D;110F 1173 11B8;D07D;110F 1173 11B8; # (큽; 큽; 큽; 큽; 큽; ) HANGUL SYLLABLE KEUB +D07E;D07E;110F 1173 11B9;D07E;110F 1173 11B9; # (큾; 큾; 큾; 큾; 큾; ) HANGUL SYLLABLE KEUBS +D07F;D07F;110F 1173 11BA;D07F;110F 1173 11BA; # (큿; 큿; 큿; 큿; 큿; ) HANGUL SYLLABLE KEUS +D080;D080;110F 1173 11BB;D080;110F 1173 11BB; # (킀; 킀; 킀; 킀; 킀; ) HANGUL SYLLABLE KEUSS +D081;D081;110F 1173 11BC;D081;110F 1173 11BC; # (킁; 킁; 킁; 킁; 킁; ) HANGUL SYLLABLE KEUNG +D082;D082;110F 1173 11BD;D082;110F 1173 11BD; # (킂; 킂; 킂; 킂; 킂; ) HANGUL SYLLABLE KEUJ +D083;D083;110F 1173 11BE;D083;110F 1173 11BE; # (킃; 킃; 킃; 킃; 킃; ) HANGUL SYLLABLE KEUC +D084;D084;110F 1173 11BF;D084;110F 1173 11BF; # (킄; 킄; 킄; 킄; 킄; ) HANGUL SYLLABLE KEUK +D085;D085;110F 1173 11C0;D085;110F 1173 11C0; # (킅; 킅; 킅; 킅; 킅; ) HANGUL SYLLABLE KEUT +D086;D086;110F 1173 11C1;D086;110F 1173 11C1; # (킆; 킆; 킆; 킆; 킆; ) HANGUL SYLLABLE KEUP +D087;D087;110F 1173 11C2;D087;110F 1173 11C2; # (킇; 킇; 킇; 킇; 킇; ) HANGUL SYLLABLE KEUH +D088;D088;110F 1174;D088;110F 1174; # (킈; 킈; 킈; 킈; 킈; ) HANGUL SYLLABLE KYI +D089;D089;110F 1174 11A8;D089;110F 1174 11A8; # (킉; 킉; 킉; 킉; 킉; ) HANGUL SYLLABLE KYIG +D08A;D08A;110F 1174 11A9;D08A;110F 1174 11A9; # (킊; 킊; 킊; 킊; 킊; ) HANGUL SYLLABLE KYIGG +D08B;D08B;110F 1174 11AA;D08B;110F 1174 11AA; # (킋; 킋; 킋; 킋; 킋; ) HANGUL SYLLABLE KYIGS +D08C;D08C;110F 1174 11AB;D08C;110F 1174 11AB; # (킌; 킌; 킌; 킌; 킌; ) HANGUL SYLLABLE KYIN +D08D;D08D;110F 1174 11AC;D08D;110F 1174 11AC; # (킍; 킍; 킍; 킍; 킍; ) HANGUL SYLLABLE KYINJ +D08E;D08E;110F 1174 11AD;D08E;110F 1174 11AD; # (킎; 킎; 킎; 킎; 킎; ) HANGUL SYLLABLE KYINH +D08F;D08F;110F 1174 11AE;D08F;110F 1174 11AE; # (킏; 킏; 킏; 킏; 킏; ) HANGUL SYLLABLE KYID +D090;D090;110F 1174 11AF;D090;110F 1174 11AF; # (킐; 킐; 킐; 킐; 킐; ) HANGUL SYLLABLE KYIL +D091;D091;110F 1174 11B0;D091;110F 1174 11B0; # (킑; 킑; 킑; 킑; 킑; ) HANGUL SYLLABLE KYILG +D092;D092;110F 1174 11B1;D092;110F 1174 11B1; # (킒; 킒; 킒; 킒; 킒; ) HANGUL SYLLABLE KYILM +D093;D093;110F 1174 11B2;D093;110F 1174 11B2; # (킓; 킓; 킓; 킓; 킓; ) HANGUL SYLLABLE KYILB +D094;D094;110F 1174 11B3;D094;110F 1174 11B3; # (킔; 킔; 킔; 킔; 킔; ) HANGUL SYLLABLE KYILS +D095;D095;110F 1174 11B4;D095;110F 1174 11B4; # (킕; 킕; 킕; 킕; 킕; ) HANGUL SYLLABLE KYILT +D096;D096;110F 1174 11B5;D096;110F 1174 11B5; # (킖; 킖; 킖; 킖; 킖; ) HANGUL SYLLABLE KYILP +D097;D097;110F 1174 11B6;D097;110F 1174 11B6; # (킗; 킗; 킗; 킗; 킗; ) HANGUL SYLLABLE KYILH +D098;D098;110F 1174 11B7;D098;110F 1174 11B7; # (킘; 킘; 킘; 킘; 킘; ) HANGUL SYLLABLE KYIM +D099;D099;110F 1174 11B8;D099;110F 1174 11B8; # (킙; 킙; 킙; 킙; 킙; ) HANGUL SYLLABLE KYIB +D09A;D09A;110F 1174 11B9;D09A;110F 1174 11B9; # (킚; 킚; 킚; 킚; 킚; ) HANGUL SYLLABLE KYIBS +D09B;D09B;110F 1174 11BA;D09B;110F 1174 11BA; # (킛; 킛; 킛; 킛; 킛; ) HANGUL SYLLABLE KYIS +D09C;D09C;110F 1174 11BB;D09C;110F 1174 11BB; # (킜; 킜; 킜; 킜; 킜; ) HANGUL SYLLABLE KYISS +D09D;D09D;110F 1174 11BC;D09D;110F 1174 11BC; # (킝; 킝; 킝; 킝; 킝; ) HANGUL SYLLABLE KYING +D09E;D09E;110F 1174 11BD;D09E;110F 1174 11BD; # (킞; 킞; 킞; 킞; 킞; ) HANGUL SYLLABLE KYIJ +D09F;D09F;110F 1174 11BE;D09F;110F 1174 11BE; # (킟; 킟; 킟; 킟; 킟; ) HANGUL SYLLABLE KYIC +D0A0;D0A0;110F 1174 11BF;D0A0;110F 1174 11BF; # (킠; 킠; 킠; 킠; 킠; ) HANGUL SYLLABLE KYIK +D0A1;D0A1;110F 1174 11C0;D0A1;110F 1174 11C0; # (킡; 킡; 킡; 킡; 킡; ) HANGUL SYLLABLE KYIT +D0A2;D0A2;110F 1174 11C1;D0A2;110F 1174 11C1; # (킢; 킢; 킢; 킢; 킢; ) HANGUL SYLLABLE KYIP +D0A3;D0A3;110F 1174 11C2;D0A3;110F 1174 11C2; # (킣; 킣; 킣; 킣; 킣; ) HANGUL SYLLABLE KYIH +D0A4;D0A4;110F 1175;D0A4;110F 1175; # (키; 키; 키; 키; 키; ) HANGUL SYLLABLE KI +D0A5;D0A5;110F 1175 11A8;D0A5;110F 1175 11A8; # (킥; 킥; 킥; 킥; 킥; ) HANGUL SYLLABLE KIG +D0A6;D0A6;110F 1175 11A9;D0A6;110F 1175 11A9; # (킦; 킦; 킦; 킦; 킦; ) HANGUL SYLLABLE KIGG +D0A7;D0A7;110F 1175 11AA;D0A7;110F 1175 11AA; # (킧; 킧; 킧; 킧; 킧; ) HANGUL SYLLABLE KIGS +D0A8;D0A8;110F 1175 11AB;D0A8;110F 1175 11AB; # (킨; 킨; 킨; 킨; 킨; ) HANGUL SYLLABLE KIN +D0A9;D0A9;110F 1175 11AC;D0A9;110F 1175 11AC; # (킩; 킩; 킩; 킩; 킩; ) HANGUL SYLLABLE KINJ +D0AA;D0AA;110F 1175 11AD;D0AA;110F 1175 11AD; # (킪; 킪; 킪; 킪; 킪; ) HANGUL SYLLABLE KINH +D0AB;D0AB;110F 1175 11AE;D0AB;110F 1175 11AE; # (킫; 킫; 킫; 킫; 킫; ) HANGUL SYLLABLE KID +D0AC;D0AC;110F 1175 11AF;D0AC;110F 1175 11AF; # (킬; 킬; 킬; 킬; 킬; ) HANGUL SYLLABLE KIL +D0AD;D0AD;110F 1175 11B0;D0AD;110F 1175 11B0; # (킭; 킭; 킭; 킭; 킭; ) HANGUL SYLLABLE KILG +D0AE;D0AE;110F 1175 11B1;D0AE;110F 1175 11B1; # (킮; 킮; 킮; 킮; 킮; ) HANGUL SYLLABLE KILM +D0AF;D0AF;110F 1175 11B2;D0AF;110F 1175 11B2; # (킯; 킯; 킯; 킯; 킯; ) HANGUL SYLLABLE KILB +D0B0;D0B0;110F 1175 11B3;D0B0;110F 1175 11B3; # (킰; 킰; 킰; 킰; 킰; ) HANGUL SYLLABLE KILS +D0B1;D0B1;110F 1175 11B4;D0B1;110F 1175 11B4; # (킱; 킱; 킱; 킱; 킱; ) HANGUL SYLLABLE KILT +D0B2;D0B2;110F 1175 11B5;D0B2;110F 1175 11B5; # (킲; 킲; 킲; 킲; 킲; ) HANGUL SYLLABLE KILP +D0B3;D0B3;110F 1175 11B6;D0B3;110F 1175 11B6; # (킳; 킳; 킳; 킳; 킳; ) HANGUL SYLLABLE KILH +D0B4;D0B4;110F 1175 11B7;D0B4;110F 1175 11B7; # (킴; 킴; 킴; 킴; 킴; ) HANGUL SYLLABLE KIM +D0B5;D0B5;110F 1175 11B8;D0B5;110F 1175 11B8; # (킵; 킵; 킵; 킵; 킵; ) HANGUL SYLLABLE KIB +D0B6;D0B6;110F 1175 11B9;D0B6;110F 1175 11B9; # (킶; 킶; 킶; 킶; 킶; ) HANGUL SYLLABLE KIBS +D0B7;D0B7;110F 1175 11BA;D0B7;110F 1175 11BA; # (킷; 킷; 킷; 킷; 킷; ) HANGUL SYLLABLE KIS +D0B8;D0B8;110F 1175 11BB;D0B8;110F 1175 11BB; # (킸; 킸; 킸; 킸; 킸; ) HANGUL SYLLABLE KISS +D0B9;D0B9;110F 1175 11BC;D0B9;110F 1175 11BC; # (킹; 킹; 킹; 킹; 킹; ) HANGUL SYLLABLE KING +D0BA;D0BA;110F 1175 11BD;D0BA;110F 1175 11BD; # (킺; 킺; 킺; 킺; 킺; ) HANGUL SYLLABLE KIJ +D0BB;D0BB;110F 1175 11BE;D0BB;110F 1175 11BE; # (킻; 킻; 킻; 킻; 킻; ) HANGUL SYLLABLE KIC +D0BC;D0BC;110F 1175 11BF;D0BC;110F 1175 11BF; # (킼; 킼; 킼; 킼; 킼; ) HANGUL SYLLABLE KIK +D0BD;D0BD;110F 1175 11C0;D0BD;110F 1175 11C0; # (킽; 킽; 킽; 킽; 킽; ) HANGUL SYLLABLE KIT +D0BE;D0BE;110F 1175 11C1;D0BE;110F 1175 11C1; # (킾; 킾; 킾; 킾; 킾; ) HANGUL SYLLABLE KIP +D0BF;D0BF;110F 1175 11C2;D0BF;110F 1175 11C2; # (킿; 킿; 킿; 킿; 킿; ) HANGUL SYLLABLE KIH +D0C0;D0C0;1110 1161;D0C0;1110 1161; # (타; 타; 타; 타; 타; ) HANGUL SYLLABLE TA +D0C1;D0C1;1110 1161 11A8;D0C1;1110 1161 11A8; # (탁; 탁; 탁; 탁; 탁; ) HANGUL SYLLABLE TAG +D0C2;D0C2;1110 1161 11A9;D0C2;1110 1161 11A9; # (탂; 탂; 탂; 탂; 탂; ) HANGUL SYLLABLE TAGG +D0C3;D0C3;1110 1161 11AA;D0C3;1110 1161 11AA; # (탃; 탃; 탃; 탃; 탃; ) HANGUL SYLLABLE TAGS +D0C4;D0C4;1110 1161 11AB;D0C4;1110 1161 11AB; # (탄; 탄; 탄; 탄; 탄; ) HANGUL SYLLABLE TAN +D0C5;D0C5;1110 1161 11AC;D0C5;1110 1161 11AC; # (탅; 탅; 탅; 탅; 탅; ) HANGUL SYLLABLE TANJ +D0C6;D0C6;1110 1161 11AD;D0C6;1110 1161 11AD; # (탆; 탆; 탆; 탆; 탆; ) HANGUL SYLLABLE TANH +D0C7;D0C7;1110 1161 11AE;D0C7;1110 1161 11AE; # (탇; 탇; 탇; 탇; 탇; ) HANGUL SYLLABLE TAD +D0C8;D0C8;1110 1161 11AF;D0C8;1110 1161 11AF; # (탈; 탈; 탈; 탈; 탈; ) HANGUL SYLLABLE TAL +D0C9;D0C9;1110 1161 11B0;D0C9;1110 1161 11B0; # (탉; 탉; 탉; 탉; 탉; ) HANGUL SYLLABLE TALG +D0CA;D0CA;1110 1161 11B1;D0CA;1110 1161 11B1; # (탊; 탊; 탊; 탊; 탊; ) HANGUL SYLLABLE TALM +D0CB;D0CB;1110 1161 11B2;D0CB;1110 1161 11B2; # (탋; 탋; 탋; 탋; 탋; ) HANGUL SYLLABLE TALB +D0CC;D0CC;1110 1161 11B3;D0CC;1110 1161 11B3; # (탌; 탌; 탌; 탌; 탌; ) HANGUL SYLLABLE TALS +D0CD;D0CD;1110 1161 11B4;D0CD;1110 1161 11B4; # (탍; 탍; 탍; 탍; 탍; ) HANGUL SYLLABLE TALT +D0CE;D0CE;1110 1161 11B5;D0CE;1110 1161 11B5; # (탎; 탎; 탎; 탎; 탎; ) HANGUL SYLLABLE TALP +D0CF;D0CF;1110 1161 11B6;D0CF;1110 1161 11B6; # (탏; 탏; 탏; 탏; 탏; ) HANGUL SYLLABLE TALH +D0D0;D0D0;1110 1161 11B7;D0D0;1110 1161 11B7; # (탐; 탐; 탐; 탐; 탐; ) HANGUL SYLLABLE TAM +D0D1;D0D1;1110 1161 11B8;D0D1;1110 1161 11B8; # (탑; 탑; 탑; 탑; 탑; ) HANGUL SYLLABLE TAB +D0D2;D0D2;1110 1161 11B9;D0D2;1110 1161 11B9; # (탒; 탒; 탒; 탒; 탒; ) HANGUL SYLLABLE TABS +D0D3;D0D3;1110 1161 11BA;D0D3;1110 1161 11BA; # (탓; 탓; 탓; 탓; 탓; ) HANGUL SYLLABLE TAS +D0D4;D0D4;1110 1161 11BB;D0D4;1110 1161 11BB; # (탔; 탔; 탔; 탔; 탔; ) HANGUL SYLLABLE TASS +D0D5;D0D5;1110 1161 11BC;D0D5;1110 1161 11BC; # (탕; 탕; 탕; 탕; 탕; ) HANGUL SYLLABLE TANG +D0D6;D0D6;1110 1161 11BD;D0D6;1110 1161 11BD; # (탖; 탖; 탖; 탖; 탖; ) HANGUL SYLLABLE TAJ +D0D7;D0D7;1110 1161 11BE;D0D7;1110 1161 11BE; # (탗; 탗; 탗; 탗; 탗; ) HANGUL SYLLABLE TAC +D0D8;D0D8;1110 1161 11BF;D0D8;1110 1161 11BF; # (탘; 탘; 탘; 탘; 탘; ) HANGUL SYLLABLE TAK +D0D9;D0D9;1110 1161 11C0;D0D9;1110 1161 11C0; # (탙; 탙; 탙; 탙; 탙; ) HANGUL SYLLABLE TAT +D0DA;D0DA;1110 1161 11C1;D0DA;1110 1161 11C1; # (탚; 탚; 탚; 탚; 탚; ) HANGUL SYLLABLE TAP +D0DB;D0DB;1110 1161 11C2;D0DB;1110 1161 11C2; # (탛; 탛; 탛; 탛; 탛; ) HANGUL SYLLABLE TAH +D0DC;D0DC;1110 1162;D0DC;1110 1162; # (태; 태; 태; 태; 태; ) HANGUL SYLLABLE TAE +D0DD;D0DD;1110 1162 11A8;D0DD;1110 1162 11A8; # (택; 택; 택; 택; 택; ) HANGUL SYLLABLE TAEG +D0DE;D0DE;1110 1162 11A9;D0DE;1110 1162 11A9; # (탞; 탞; 탞; 탞; 탞; ) HANGUL SYLLABLE TAEGG +D0DF;D0DF;1110 1162 11AA;D0DF;1110 1162 11AA; # (탟; 탟; 탟; 탟; 탟; ) HANGUL SYLLABLE TAEGS +D0E0;D0E0;1110 1162 11AB;D0E0;1110 1162 11AB; # (탠; 탠; 탠; 탠; 탠; ) HANGUL SYLLABLE TAEN +D0E1;D0E1;1110 1162 11AC;D0E1;1110 1162 11AC; # (탡; 탡; 탡; 탡; 탡; ) HANGUL SYLLABLE TAENJ +D0E2;D0E2;1110 1162 11AD;D0E2;1110 1162 11AD; # (탢; 탢; 탢; 탢; 탢; ) HANGUL SYLLABLE TAENH +D0E3;D0E3;1110 1162 11AE;D0E3;1110 1162 11AE; # (탣; 탣; 탣; 탣; 탣; ) HANGUL SYLLABLE TAED +D0E4;D0E4;1110 1162 11AF;D0E4;1110 1162 11AF; # (탤; 탤; 탤; 탤; 탤; ) HANGUL SYLLABLE TAEL +D0E5;D0E5;1110 1162 11B0;D0E5;1110 1162 11B0; # (탥; 탥; 탥; 탥; 탥; ) HANGUL SYLLABLE TAELG +D0E6;D0E6;1110 1162 11B1;D0E6;1110 1162 11B1; # (탦; 탦; 탦; 탦; 탦; ) HANGUL SYLLABLE TAELM +D0E7;D0E7;1110 1162 11B2;D0E7;1110 1162 11B2; # (탧; 탧; 탧; 탧; 탧; ) HANGUL SYLLABLE TAELB +D0E8;D0E8;1110 1162 11B3;D0E8;1110 1162 11B3; # (탨; 탨; 탨; 탨; 탨; ) HANGUL SYLLABLE TAELS +D0E9;D0E9;1110 1162 11B4;D0E9;1110 1162 11B4; # (탩; 탩; 탩; 탩; 탩; ) HANGUL SYLLABLE TAELT +D0EA;D0EA;1110 1162 11B5;D0EA;1110 1162 11B5; # (탪; 탪; 탪; 탪; 탪; ) HANGUL SYLLABLE TAELP +D0EB;D0EB;1110 1162 11B6;D0EB;1110 1162 11B6; # (탫; 탫; 탫; 탫; 탫; ) HANGUL SYLLABLE TAELH +D0EC;D0EC;1110 1162 11B7;D0EC;1110 1162 11B7; # (탬; 탬; 탬; 탬; 탬; ) HANGUL SYLLABLE TAEM +D0ED;D0ED;1110 1162 11B8;D0ED;1110 1162 11B8; # (탭; 탭; 탭; 탭; 탭; ) HANGUL SYLLABLE TAEB +D0EE;D0EE;1110 1162 11B9;D0EE;1110 1162 11B9; # (탮; 탮; 탮; 탮; 탮; ) HANGUL SYLLABLE TAEBS +D0EF;D0EF;1110 1162 11BA;D0EF;1110 1162 11BA; # (탯; 탯; 탯; 탯; 탯; ) HANGUL SYLLABLE TAES +D0F0;D0F0;1110 1162 11BB;D0F0;1110 1162 11BB; # (탰; 탰; 탰; 탰; 탰; ) HANGUL SYLLABLE TAESS +D0F1;D0F1;1110 1162 11BC;D0F1;1110 1162 11BC; # (탱; 탱; 탱; 탱; 탱; ) HANGUL SYLLABLE TAENG +D0F2;D0F2;1110 1162 11BD;D0F2;1110 1162 11BD; # (탲; 탲; 탲; 탲; 탲; ) HANGUL SYLLABLE TAEJ +D0F3;D0F3;1110 1162 11BE;D0F3;1110 1162 11BE; # (탳; 탳; 탳; 탳; 탳; ) HANGUL SYLLABLE TAEC +D0F4;D0F4;1110 1162 11BF;D0F4;1110 1162 11BF; # (탴; 탴; 탴; 탴; 탴; ) HANGUL SYLLABLE TAEK +D0F5;D0F5;1110 1162 11C0;D0F5;1110 1162 11C0; # (탵; 탵; 탵; 탵; 탵; ) HANGUL SYLLABLE TAET +D0F6;D0F6;1110 1162 11C1;D0F6;1110 1162 11C1; # (탶; 탶; 탶; 탶; 탶; ) HANGUL SYLLABLE TAEP +D0F7;D0F7;1110 1162 11C2;D0F7;1110 1162 11C2; # (탷; 탷; 탷; 탷; 탷; ) HANGUL SYLLABLE TAEH +D0F8;D0F8;1110 1163;D0F8;1110 1163; # (탸; 탸; 탸; 탸; 탸; ) HANGUL SYLLABLE TYA +D0F9;D0F9;1110 1163 11A8;D0F9;1110 1163 11A8; # (탹; 탹; 탹; 탹; 탹; ) HANGUL SYLLABLE TYAG +D0FA;D0FA;1110 1163 11A9;D0FA;1110 1163 11A9; # (탺; 탺; 탺; 탺; 탺; ) HANGUL SYLLABLE TYAGG +D0FB;D0FB;1110 1163 11AA;D0FB;1110 1163 11AA; # (탻; 탻; 탻; 탻; 탻; ) HANGUL SYLLABLE TYAGS +D0FC;D0FC;1110 1163 11AB;D0FC;1110 1163 11AB; # (탼; 탼; 탼; 탼; 탼; ) HANGUL SYLLABLE TYAN +D0FD;D0FD;1110 1163 11AC;D0FD;1110 1163 11AC; # (탽; 탽; 탽; 탽; 탽; ) HANGUL SYLLABLE TYANJ +D0FE;D0FE;1110 1163 11AD;D0FE;1110 1163 11AD; # (탾; 탾; 탾; 탾; 탾; ) HANGUL SYLLABLE TYANH +D0FF;D0FF;1110 1163 11AE;D0FF;1110 1163 11AE; # (탿; 탿; 탿; 탿; 탿; ) HANGUL SYLLABLE TYAD +D100;D100;1110 1163 11AF;D100;1110 1163 11AF; # (턀; 턀; 턀; 턀; 턀; ) HANGUL SYLLABLE TYAL +D101;D101;1110 1163 11B0;D101;1110 1163 11B0; # (턁; 턁; 턁; 턁; 턁; ) HANGUL SYLLABLE TYALG +D102;D102;1110 1163 11B1;D102;1110 1163 11B1; # (턂; 턂; 턂; 턂; 턂; ) HANGUL SYLLABLE TYALM +D103;D103;1110 1163 11B2;D103;1110 1163 11B2; # (턃; 턃; 턃; 턃; 턃; ) HANGUL SYLLABLE TYALB +D104;D104;1110 1163 11B3;D104;1110 1163 11B3; # (턄; 턄; 턄; 턄; 턄; ) HANGUL SYLLABLE TYALS +D105;D105;1110 1163 11B4;D105;1110 1163 11B4; # (턅; 턅; 턅; 턅; 턅; ) HANGUL SYLLABLE TYALT +D106;D106;1110 1163 11B5;D106;1110 1163 11B5; # (턆; 턆; 턆; 턆; 턆; ) HANGUL SYLLABLE TYALP +D107;D107;1110 1163 11B6;D107;1110 1163 11B6; # (턇; 턇; 턇; 턇; 턇; ) HANGUL SYLLABLE TYALH +D108;D108;1110 1163 11B7;D108;1110 1163 11B7; # (턈; 턈; 턈; 턈; 턈; ) HANGUL SYLLABLE TYAM +D109;D109;1110 1163 11B8;D109;1110 1163 11B8; # (턉; 턉; 턉; 턉; 턉; ) HANGUL SYLLABLE TYAB +D10A;D10A;1110 1163 11B9;D10A;1110 1163 11B9; # (턊; 턊; 턊; 턊; 턊; ) HANGUL SYLLABLE TYABS +D10B;D10B;1110 1163 11BA;D10B;1110 1163 11BA; # (턋; 턋; 턋; 턋; 턋; ) HANGUL SYLLABLE TYAS +D10C;D10C;1110 1163 11BB;D10C;1110 1163 11BB; # (턌; 턌; 턌; 턌; 턌; ) HANGUL SYLLABLE TYASS +D10D;D10D;1110 1163 11BC;D10D;1110 1163 11BC; # (턍; 턍; 턍; 턍; 턍; ) HANGUL SYLLABLE TYANG +D10E;D10E;1110 1163 11BD;D10E;1110 1163 11BD; # (턎; 턎; 턎; 턎; 턎; ) HANGUL SYLLABLE TYAJ +D10F;D10F;1110 1163 11BE;D10F;1110 1163 11BE; # (턏; 턏; 턏; 턏; 턏; ) HANGUL SYLLABLE TYAC +D110;D110;1110 1163 11BF;D110;1110 1163 11BF; # (턐; 턐; 턐; 턐; 턐; ) HANGUL SYLLABLE TYAK +D111;D111;1110 1163 11C0;D111;1110 1163 11C0; # (턑; 턑; 턑; 턑; 턑; ) HANGUL SYLLABLE TYAT +D112;D112;1110 1163 11C1;D112;1110 1163 11C1; # (턒; 턒; 턒; 턒; 턒; ) HANGUL SYLLABLE TYAP +D113;D113;1110 1163 11C2;D113;1110 1163 11C2; # (턓; 턓; 턓; 턓; 턓; ) HANGUL SYLLABLE TYAH +D114;D114;1110 1164;D114;1110 1164; # (턔; 턔; 턔; 턔; 턔; ) HANGUL SYLLABLE TYAE +D115;D115;1110 1164 11A8;D115;1110 1164 11A8; # (턕; 턕; 턕; 턕; 턕; ) HANGUL SYLLABLE TYAEG +D116;D116;1110 1164 11A9;D116;1110 1164 11A9; # (턖; 턖; 턖; 턖; 턖; ) HANGUL SYLLABLE TYAEGG +D117;D117;1110 1164 11AA;D117;1110 1164 11AA; # (턗; 턗; 턗; 턗; 턗; ) HANGUL SYLLABLE TYAEGS +D118;D118;1110 1164 11AB;D118;1110 1164 11AB; # (턘; 턘; 턘; 턘; 턘; ) HANGUL SYLLABLE TYAEN +D119;D119;1110 1164 11AC;D119;1110 1164 11AC; # (턙; 턙; 턙; 턙; 턙; ) HANGUL SYLLABLE TYAENJ +D11A;D11A;1110 1164 11AD;D11A;1110 1164 11AD; # (턚; 턚; 턚; 턚; 턚; ) HANGUL SYLLABLE TYAENH +D11B;D11B;1110 1164 11AE;D11B;1110 1164 11AE; # (턛; 턛; 턛; 턛; 턛; ) HANGUL SYLLABLE TYAED +D11C;D11C;1110 1164 11AF;D11C;1110 1164 11AF; # (턜; 턜; 턜; 턜; 턜; ) HANGUL SYLLABLE TYAEL +D11D;D11D;1110 1164 11B0;D11D;1110 1164 11B0; # (턝; 턝; 턝; 턝; 턝; ) HANGUL SYLLABLE TYAELG +D11E;D11E;1110 1164 11B1;D11E;1110 1164 11B1; # (턞; 턞; 턞; 턞; 턞; ) HANGUL SYLLABLE TYAELM +D11F;D11F;1110 1164 11B2;D11F;1110 1164 11B2; # (턟; 턟; 턟; 턟; 턟; ) HANGUL SYLLABLE TYAELB +D120;D120;1110 1164 11B3;D120;1110 1164 11B3; # (턠; 턠; 턠; 턠; 턠; ) HANGUL SYLLABLE TYAELS +D121;D121;1110 1164 11B4;D121;1110 1164 11B4; # (턡; 턡; 턡; 턡; 턡; ) HANGUL SYLLABLE TYAELT +D122;D122;1110 1164 11B5;D122;1110 1164 11B5; # (턢; 턢; 턢; 턢; 턢; ) HANGUL SYLLABLE TYAELP +D123;D123;1110 1164 11B6;D123;1110 1164 11B6; # (턣; 턣; 턣; 턣; 턣; ) HANGUL SYLLABLE TYAELH +D124;D124;1110 1164 11B7;D124;1110 1164 11B7; # (턤; 턤; 턤; 턤; 턤; ) HANGUL SYLLABLE TYAEM +D125;D125;1110 1164 11B8;D125;1110 1164 11B8; # (턥; 턥; 턥; 턥; 턥; ) HANGUL SYLLABLE TYAEB +D126;D126;1110 1164 11B9;D126;1110 1164 11B9; # (턦; 턦; 턦; 턦; 턦; ) HANGUL SYLLABLE TYAEBS +D127;D127;1110 1164 11BA;D127;1110 1164 11BA; # (턧; 턧; 턧; 턧; 턧; ) HANGUL SYLLABLE TYAES +D128;D128;1110 1164 11BB;D128;1110 1164 11BB; # (턨; 턨; 턨; 턨; 턨; ) HANGUL SYLLABLE TYAESS +D129;D129;1110 1164 11BC;D129;1110 1164 11BC; # (턩; 턩; 턩; 턩; 턩; ) HANGUL SYLLABLE TYAENG +D12A;D12A;1110 1164 11BD;D12A;1110 1164 11BD; # (턪; 턪; 턪; 턪; 턪; ) HANGUL SYLLABLE TYAEJ +D12B;D12B;1110 1164 11BE;D12B;1110 1164 11BE; # (턫; 턫; 턫; 턫; 턫; ) HANGUL SYLLABLE TYAEC +D12C;D12C;1110 1164 11BF;D12C;1110 1164 11BF; # (턬; 턬; 턬; 턬; 턬; ) HANGUL SYLLABLE TYAEK +D12D;D12D;1110 1164 11C0;D12D;1110 1164 11C0; # (턭; 턭; 턭; 턭; 턭; ) HANGUL SYLLABLE TYAET +D12E;D12E;1110 1164 11C1;D12E;1110 1164 11C1; # (턮; 턮; 턮; 턮; 턮; ) HANGUL SYLLABLE TYAEP +D12F;D12F;1110 1164 11C2;D12F;1110 1164 11C2; # (턯; 턯; 턯; 턯; 턯; ) HANGUL SYLLABLE TYAEH +D130;D130;1110 1165;D130;1110 1165; # (터; 터; 터; 터; 터; ) HANGUL SYLLABLE TEO +D131;D131;1110 1165 11A8;D131;1110 1165 11A8; # (턱; 턱; 턱; 턱; 턱; ) HANGUL SYLLABLE TEOG +D132;D132;1110 1165 11A9;D132;1110 1165 11A9; # (턲; 턲; 턲; 턲; 턲; ) HANGUL SYLLABLE TEOGG +D133;D133;1110 1165 11AA;D133;1110 1165 11AA; # (턳; 턳; 턳; 턳; 턳; ) HANGUL SYLLABLE TEOGS +D134;D134;1110 1165 11AB;D134;1110 1165 11AB; # (턴; 턴; 턴; 턴; 턴; ) HANGUL SYLLABLE TEON +D135;D135;1110 1165 11AC;D135;1110 1165 11AC; # (턵; 턵; 턵; 턵; 턵; ) HANGUL SYLLABLE TEONJ +D136;D136;1110 1165 11AD;D136;1110 1165 11AD; # (턶; 턶; 턶; 턶; 턶; ) HANGUL SYLLABLE TEONH +D137;D137;1110 1165 11AE;D137;1110 1165 11AE; # (턷; 턷; 턷; 턷; 턷; ) HANGUL SYLLABLE TEOD +D138;D138;1110 1165 11AF;D138;1110 1165 11AF; # (털; 털; 털; 털; 털; ) HANGUL SYLLABLE TEOL +D139;D139;1110 1165 11B0;D139;1110 1165 11B0; # (턹; 턹; 턹; 턹; 턹; ) HANGUL SYLLABLE TEOLG +D13A;D13A;1110 1165 11B1;D13A;1110 1165 11B1; # (턺; 턺; 턺; 턺; 턺; ) HANGUL SYLLABLE TEOLM +D13B;D13B;1110 1165 11B2;D13B;1110 1165 11B2; # (턻; 턻; 턻; 턻; 턻; ) HANGUL SYLLABLE TEOLB +D13C;D13C;1110 1165 11B3;D13C;1110 1165 11B3; # (턼; 턼; 턼; 턼; 턼; ) HANGUL SYLLABLE TEOLS +D13D;D13D;1110 1165 11B4;D13D;1110 1165 11B4; # (턽; 턽; 턽; 턽; 턽; ) HANGUL SYLLABLE TEOLT +D13E;D13E;1110 1165 11B5;D13E;1110 1165 11B5; # (턾; 턾; 턾; 턾; 턾; ) HANGUL SYLLABLE TEOLP +D13F;D13F;1110 1165 11B6;D13F;1110 1165 11B6; # (턿; 턿; 턿; 턿; 턿; ) HANGUL SYLLABLE TEOLH +D140;D140;1110 1165 11B7;D140;1110 1165 11B7; # (텀; 텀; 텀; 텀; 텀; ) HANGUL SYLLABLE TEOM +D141;D141;1110 1165 11B8;D141;1110 1165 11B8; # (텁; 텁; 텁; 텁; 텁; ) HANGUL SYLLABLE TEOB +D142;D142;1110 1165 11B9;D142;1110 1165 11B9; # (텂; 텂; 텂; 텂; 텂; ) HANGUL SYLLABLE TEOBS +D143;D143;1110 1165 11BA;D143;1110 1165 11BA; # (텃; 텃; 텃; 텃; 텃; ) HANGUL SYLLABLE TEOS +D144;D144;1110 1165 11BB;D144;1110 1165 11BB; # (텄; 텄; 텄; 텄; 텄; ) HANGUL SYLLABLE TEOSS +D145;D145;1110 1165 11BC;D145;1110 1165 11BC; # (텅; 텅; 텅; 텅; 텅; ) HANGUL SYLLABLE TEONG +D146;D146;1110 1165 11BD;D146;1110 1165 11BD; # (텆; 텆; 텆; 텆; 텆; ) HANGUL SYLLABLE TEOJ +D147;D147;1110 1165 11BE;D147;1110 1165 11BE; # (텇; 텇; 텇; 텇; 텇; ) HANGUL SYLLABLE TEOC +D148;D148;1110 1165 11BF;D148;1110 1165 11BF; # (텈; 텈; 텈; 텈; 텈; ) HANGUL SYLLABLE TEOK +D149;D149;1110 1165 11C0;D149;1110 1165 11C0; # (텉; 텉; 텉; 텉; 텉; ) HANGUL SYLLABLE TEOT +D14A;D14A;1110 1165 11C1;D14A;1110 1165 11C1; # (텊; 텊; 텊; 텊; 텊; ) HANGUL SYLLABLE TEOP +D14B;D14B;1110 1165 11C2;D14B;1110 1165 11C2; # (텋; 텋; 텋; 텋; 텋; ) HANGUL SYLLABLE TEOH +D14C;D14C;1110 1166;D14C;1110 1166; # (테; 테; 테; 테; 테; ) HANGUL SYLLABLE TE +D14D;D14D;1110 1166 11A8;D14D;1110 1166 11A8; # (텍; 텍; 텍; 텍; 텍; ) HANGUL SYLLABLE TEG +D14E;D14E;1110 1166 11A9;D14E;1110 1166 11A9; # (텎; 텎; 텎; 텎; 텎; ) HANGUL SYLLABLE TEGG +D14F;D14F;1110 1166 11AA;D14F;1110 1166 11AA; # (텏; 텏; 텏; 텏; 텏; ) HANGUL SYLLABLE TEGS +D150;D150;1110 1166 11AB;D150;1110 1166 11AB; # (텐; 텐; 텐; 텐; 텐; ) HANGUL SYLLABLE TEN +D151;D151;1110 1166 11AC;D151;1110 1166 11AC; # (텑; 텑; 텑; 텑; 텑; ) HANGUL SYLLABLE TENJ +D152;D152;1110 1166 11AD;D152;1110 1166 11AD; # (텒; 텒; 텒; 텒; 텒; ) HANGUL SYLLABLE TENH +D153;D153;1110 1166 11AE;D153;1110 1166 11AE; # (텓; 텓; 텓; 텓; 텓; ) HANGUL SYLLABLE TED +D154;D154;1110 1166 11AF;D154;1110 1166 11AF; # (텔; 텔; 텔; 텔; 텔; ) HANGUL SYLLABLE TEL +D155;D155;1110 1166 11B0;D155;1110 1166 11B0; # (텕; 텕; 텕; 텕; 텕; ) HANGUL SYLLABLE TELG +D156;D156;1110 1166 11B1;D156;1110 1166 11B1; # (텖; 텖; 텖; 텖; 텖; ) HANGUL SYLLABLE TELM +D157;D157;1110 1166 11B2;D157;1110 1166 11B2; # (텗; 텗; 텗; 텗; 텗; ) HANGUL SYLLABLE TELB +D158;D158;1110 1166 11B3;D158;1110 1166 11B3; # (텘; 텘; 텘; 텘; 텘; ) HANGUL SYLLABLE TELS +D159;D159;1110 1166 11B4;D159;1110 1166 11B4; # (텙; 텙; 텙; 텙; 텙; ) HANGUL SYLLABLE TELT +D15A;D15A;1110 1166 11B5;D15A;1110 1166 11B5; # (텚; 텚; 텚; 텚; 텚; ) HANGUL SYLLABLE TELP +D15B;D15B;1110 1166 11B6;D15B;1110 1166 11B6; # (텛; 텛; 텛; 텛; 텛; ) HANGUL SYLLABLE TELH +D15C;D15C;1110 1166 11B7;D15C;1110 1166 11B7; # (템; 템; 템; 템; 템; ) HANGUL SYLLABLE TEM +D15D;D15D;1110 1166 11B8;D15D;1110 1166 11B8; # (텝; 텝; 텝; 텝; 텝; ) HANGUL SYLLABLE TEB +D15E;D15E;1110 1166 11B9;D15E;1110 1166 11B9; # (텞; 텞; 텞; 텞; 텞; ) HANGUL SYLLABLE TEBS +D15F;D15F;1110 1166 11BA;D15F;1110 1166 11BA; # (텟; 텟; 텟; 텟; 텟; ) HANGUL SYLLABLE TES +D160;D160;1110 1166 11BB;D160;1110 1166 11BB; # (텠; 텠; 텠; 텠; 텠; ) HANGUL SYLLABLE TESS +D161;D161;1110 1166 11BC;D161;1110 1166 11BC; # (텡; 텡; 텡; 텡; 텡; ) HANGUL SYLLABLE TENG +D162;D162;1110 1166 11BD;D162;1110 1166 11BD; # (텢; 텢; 텢; 텢; 텢; ) HANGUL SYLLABLE TEJ +D163;D163;1110 1166 11BE;D163;1110 1166 11BE; # (텣; 텣; 텣; 텣; 텣; ) HANGUL SYLLABLE TEC +D164;D164;1110 1166 11BF;D164;1110 1166 11BF; # (텤; 텤; 텤; 텤; 텤; ) HANGUL SYLLABLE TEK +D165;D165;1110 1166 11C0;D165;1110 1166 11C0; # (텥; 텥; 텥; 텥; 텥; ) HANGUL SYLLABLE TET +D166;D166;1110 1166 11C1;D166;1110 1166 11C1; # (텦; 텦; 텦; 텦; 텦; ) HANGUL SYLLABLE TEP +D167;D167;1110 1166 11C2;D167;1110 1166 11C2; # (텧; 텧; 텧; 텧; 텧; ) HANGUL SYLLABLE TEH +D168;D168;1110 1167;D168;1110 1167; # (텨; 텨; 텨; 텨; 텨; ) HANGUL SYLLABLE TYEO +D169;D169;1110 1167 11A8;D169;1110 1167 11A8; # (텩; 텩; 텩; 텩; 텩; ) HANGUL SYLLABLE TYEOG +D16A;D16A;1110 1167 11A9;D16A;1110 1167 11A9; # (텪; 텪; 텪; 텪; 텪; ) HANGUL SYLLABLE TYEOGG +D16B;D16B;1110 1167 11AA;D16B;1110 1167 11AA; # (텫; 텫; 텫; 텫; 텫; ) HANGUL SYLLABLE TYEOGS +D16C;D16C;1110 1167 11AB;D16C;1110 1167 11AB; # (텬; 텬; 텬; 텬; 텬; ) HANGUL SYLLABLE TYEON +D16D;D16D;1110 1167 11AC;D16D;1110 1167 11AC; # (텭; 텭; 텭; 텭; 텭; ) HANGUL SYLLABLE TYEONJ +D16E;D16E;1110 1167 11AD;D16E;1110 1167 11AD; # (텮; 텮; 텮; 텮; 텮; ) HANGUL SYLLABLE TYEONH +D16F;D16F;1110 1167 11AE;D16F;1110 1167 11AE; # (텯; 텯; 텯; 텯; 텯; ) HANGUL SYLLABLE TYEOD +D170;D170;1110 1167 11AF;D170;1110 1167 11AF; # (텰; 텰; 텰; 텰; 텰; ) HANGUL SYLLABLE TYEOL +D171;D171;1110 1167 11B0;D171;1110 1167 11B0; # (텱; 텱; 텱; 텱; 텱; ) HANGUL SYLLABLE TYEOLG +D172;D172;1110 1167 11B1;D172;1110 1167 11B1; # (텲; 텲; 텲; 텲; 텲; ) HANGUL SYLLABLE TYEOLM +D173;D173;1110 1167 11B2;D173;1110 1167 11B2; # (텳; 텳; 텳; 텳; 텳; ) HANGUL SYLLABLE TYEOLB +D174;D174;1110 1167 11B3;D174;1110 1167 11B3; # (텴; 텴; 텴; 텴; 텴; ) HANGUL SYLLABLE TYEOLS +D175;D175;1110 1167 11B4;D175;1110 1167 11B4; # (텵; 텵; 텵; 텵; 텵; ) HANGUL SYLLABLE TYEOLT +D176;D176;1110 1167 11B5;D176;1110 1167 11B5; # (텶; 텶; 텶; 텶; 텶; ) HANGUL SYLLABLE TYEOLP +D177;D177;1110 1167 11B6;D177;1110 1167 11B6; # (텷; 텷; 텷; 텷; 텷; ) HANGUL SYLLABLE TYEOLH +D178;D178;1110 1167 11B7;D178;1110 1167 11B7; # (텸; 텸; 텸; 텸; 텸; ) HANGUL SYLLABLE TYEOM +D179;D179;1110 1167 11B8;D179;1110 1167 11B8; # (텹; 텹; 텹; 텹; 텹; ) HANGUL SYLLABLE TYEOB +D17A;D17A;1110 1167 11B9;D17A;1110 1167 11B9; # (텺; 텺; 텺; 텺; 텺; ) HANGUL SYLLABLE TYEOBS +D17B;D17B;1110 1167 11BA;D17B;1110 1167 11BA; # (텻; 텻; 텻; 텻; 텻; ) HANGUL SYLLABLE TYEOS +D17C;D17C;1110 1167 11BB;D17C;1110 1167 11BB; # (텼; 텼; 텼; 텼; 텼; ) HANGUL SYLLABLE TYEOSS +D17D;D17D;1110 1167 11BC;D17D;1110 1167 11BC; # (텽; 텽; 텽; 텽; 텽; ) HANGUL SYLLABLE TYEONG +D17E;D17E;1110 1167 11BD;D17E;1110 1167 11BD; # (텾; 텾; 텾; 텾; 텾; ) HANGUL SYLLABLE TYEOJ +D17F;D17F;1110 1167 11BE;D17F;1110 1167 11BE; # (텿; 텿; 텿; 텿; 텿; ) HANGUL SYLLABLE TYEOC +D180;D180;1110 1167 11BF;D180;1110 1167 11BF; # (톀; 톀; 톀; 톀; 톀; ) HANGUL SYLLABLE TYEOK +D181;D181;1110 1167 11C0;D181;1110 1167 11C0; # (톁; 톁; 톁; 톁; 톁; ) HANGUL SYLLABLE TYEOT +D182;D182;1110 1167 11C1;D182;1110 1167 11C1; # (톂; 톂; 톂; 톂; 톂; ) HANGUL SYLLABLE TYEOP +D183;D183;1110 1167 11C2;D183;1110 1167 11C2; # (톃; 톃; 톃; 톃; 톃; ) HANGUL SYLLABLE TYEOH +D184;D184;1110 1168;D184;1110 1168; # (톄; 톄; 톄; 톄; 톄; ) HANGUL SYLLABLE TYE +D185;D185;1110 1168 11A8;D185;1110 1168 11A8; # (톅; 톅; 톅; 톅; 톅; ) HANGUL SYLLABLE TYEG +D186;D186;1110 1168 11A9;D186;1110 1168 11A9; # (톆; 톆; 톆; 톆; 톆; ) HANGUL SYLLABLE TYEGG +D187;D187;1110 1168 11AA;D187;1110 1168 11AA; # (톇; 톇; 톇; 톇; 톇; ) HANGUL SYLLABLE TYEGS +D188;D188;1110 1168 11AB;D188;1110 1168 11AB; # (톈; 톈; 톈; 톈; 톈; ) HANGUL SYLLABLE TYEN +D189;D189;1110 1168 11AC;D189;1110 1168 11AC; # (톉; 톉; 톉; 톉; 톉; ) HANGUL SYLLABLE TYENJ +D18A;D18A;1110 1168 11AD;D18A;1110 1168 11AD; # (톊; 톊; 톊; 톊; 톊; ) HANGUL SYLLABLE TYENH +D18B;D18B;1110 1168 11AE;D18B;1110 1168 11AE; # (톋; 톋; 톋; 톋; 톋; ) HANGUL SYLLABLE TYED +D18C;D18C;1110 1168 11AF;D18C;1110 1168 11AF; # (톌; 톌; 톌; 톌; 톌; ) HANGUL SYLLABLE TYEL +D18D;D18D;1110 1168 11B0;D18D;1110 1168 11B0; # (톍; 톍; 톍; 톍; 톍; ) HANGUL SYLLABLE TYELG +D18E;D18E;1110 1168 11B1;D18E;1110 1168 11B1; # (톎; 톎; 톎; 톎; 톎; ) HANGUL SYLLABLE TYELM +D18F;D18F;1110 1168 11B2;D18F;1110 1168 11B2; # (톏; 톏; 톏; 톏; 톏; ) HANGUL SYLLABLE TYELB +D190;D190;1110 1168 11B3;D190;1110 1168 11B3; # (톐; 톐; 톐; 톐; 톐; ) HANGUL SYLLABLE TYELS +D191;D191;1110 1168 11B4;D191;1110 1168 11B4; # (톑; 톑; 톑; 톑; 톑; ) HANGUL SYLLABLE TYELT +D192;D192;1110 1168 11B5;D192;1110 1168 11B5; # (톒; 톒; 톒; 톒; 톒; ) HANGUL SYLLABLE TYELP +D193;D193;1110 1168 11B6;D193;1110 1168 11B6; # (톓; 톓; 톓; 톓; 톓; ) HANGUL SYLLABLE TYELH +D194;D194;1110 1168 11B7;D194;1110 1168 11B7; # (톔; 톔; 톔; 톔; 톔; ) HANGUL SYLLABLE TYEM +D195;D195;1110 1168 11B8;D195;1110 1168 11B8; # (톕; 톕; 톕; 톕; 톕; ) HANGUL SYLLABLE TYEB +D196;D196;1110 1168 11B9;D196;1110 1168 11B9; # (톖; 톖; 톖; 톖; 톖; ) HANGUL SYLLABLE TYEBS +D197;D197;1110 1168 11BA;D197;1110 1168 11BA; # (톗; 톗; 톗; 톗; 톗; ) HANGUL SYLLABLE TYES +D198;D198;1110 1168 11BB;D198;1110 1168 11BB; # (톘; 톘; 톘; 톘; 톘; ) HANGUL SYLLABLE TYESS +D199;D199;1110 1168 11BC;D199;1110 1168 11BC; # (톙; 톙; 톙; 톙; 톙; ) HANGUL SYLLABLE TYENG +D19A;D19A;1110 1168 11BD;D19A;1110 1168 11BD; # (톚; 톚; 톚; 톚; 톚; ) HANGUL SYLLABLE TYEJ +D19B;D19B;1110 1168 11BE;D19B;1110 1168 11BE; # (톛; 톛; 톛; 톛; 톛; ) HANGUL SYLLABLE TYEC +D19C;D19C;1110 1168 11BF;D19C;1110 1168 11BF; # (톜; 톜; 톜; 톜; 톜; ) HANGUL SYLLABLE TYEK +D19D;D19D;1110 1168 11C0;D19D;1110 1168 11C0; # (톝; 톝; 톝; 톝; 톝; ) HANGUL SYLLABLE TYET +D19E;D19E;1110 1168 11C1;D19E;1110 1168 11C1; # (톞; 톞; 톞; 톞; 톞; ) HANGUL SYLLABLE TYEP +D19F;D19F;1110 1168 11C2;D19F;1110 1168 11C2; # (톟; 톟; 톟; 톟; 톟; ) HANGUL SYLLABLE TYEH +D1A0;D1A0;1110 1169;D1A0;1110 1169; # (토; 토; 토; 토; 토; ) HANGUL SYLLABLE TO +D1A1;D1A1;1110 1169 11A8;D1A1;1110 1169 11A8; # (톡; 톡; 톡; 톡; 톡; ) HANGUL SYLLABLE TOG +D1A2;D1A2;1110 1169 11A9;D1A2;1110 1169 11A9; # (톢; 톢; 톢; 톢; 톢; ) HANGUL SYLLABLE TOGG +D1A3;D1A3;1110 1169 11AA;D1A3;1110 1169 11AA; # (톣; 톣; 톣; 톣; 톣; ) HANGUL SYLLABLE TOGS +D1A4;D1A4;1110 1169 11AB;D1A4;1110 1169 11AB; # (톤; 톤; 톤; 톤; 톤; ) HANGUL SYLLABLE TON +D1A5;D1A5;1110 1169 11AC;D1A5;1110 1169 11AC; # (톥; 톥; 톥; 톥; 톥; ) HANGUL SYLLABLE TONJ +D1A6;D1A6;1110 1169 11AD;D1A6;1110 1169 11AD; # (톦; 톦; 톦; 톦; 톦; ) HANGUL SYLLABLE TONH +D1A7;D1A7;1110 1169 11AE;D1A7;1110 1169 11AE; # (톧; 톧; 톧; 톧; 톧; ) HANGUL SYLLABLE TOD +D1A8;D1A8;1110 1169 11AF;D1A8;1110 1169 11AF; # (톨; 톨; 톨; 톨; 톨; ) HANGUL SYLLABLE TOL +D1A9;D1A9;1110 1169 11B0;D1A9;1110 1169 11B0; # (톩; 톩; 톩; 톩; 톩; ) HANGUL SYLLABLE TOLG +D1AA;D1AA;1110 1169 11B1;D1AA;1110 1169 11B1; # (톪; 톪; 톪; 톪; 톪; ) HANGUL SYLLABLE TOLM +D1AB;D1AB;1110 1169 11B2;D1AB;1110 1169 11B2; # (톫; 톫; 톫; 톫; 톫; ) HANGUL SYLLABLE TOLB +D1AC;D1AC;1110 1169 11B3;D1AC;1110 1169 11B3; # (톬; 톬; 톬; 톬; 톬; ) HANGUL SYLLABLE TOLS +D1AD;D1AD;1110 1169 11B4;D1AD;1110 1169 11B4; # (톭; 톭; 톭; 톭; 톭; ) HANGUL SYLLABLE TOLT +D1AE;D1AE;1110 1169 11B5;D1AE;1110 1169 11B5; # (톮; 톮; 톮; 톮; 톮; ) HANGUL SYLLABLE TOLP +D1AF;D1AF;1110 1169 11B6;D1AF;1110 1169 11B6; # (톯; 톯; 톯; 톯; 톯; ) HANGUL SYLLABLE TOLH +D1B0;D1B0;1110 1169 11B7;D1B0;1110 1169 11B7; # (톰; 톰; 톰; 톰; 톰; ) HANGUL SYLLABLE TOM +D1B1;D1B1;1110 1169 11B8;D1B1;1110 1169 11B8; # (톱; 톱; 톱; 톱; 톱; ) HANGUL SYLLABLE TOB +D1B2;D1B2;1110 1169 11B9;D1B2;1110 1169 11B9; # (톲; 톲; 톲; 톲; 톲; ) HANGUL SYLLABLE TOBS +D1B3;D1B3;1110 1169 11BA;D1B3;1110 1169 11BA; # (톳; 톳; 톳; 톳; 톳; ) HANGUL SYLLABLE TOS +D1B4;D1B4;1110 1169 11BB;D1B4;1110 1169 11BB; # (톴; 톴; 톴; 톴; 톴; ) HANGUL SYLLABLE TOSS +D1B5;D1B5;1110 1169 11BC;D1B5;1110 1169 11BC; # (통; 통; 통; 통; 통; ) HANGUL SYLLABLE TONG +D1B6;D1B6;1110 1169 11BD;D1B6;1110 1169 11BD; # (톶; 톶; 톶; 톶; 톶; ) HANGUL SYLLABLE TOJ +D1B7;D1B7;1110 1169 11BE;D1B7;1110 1169 11BE; # (톷; 톷; 톷; 톷; 톷; ) HANGUL SYLLABLE TOC +D1B8;D1B8;1110 1169 11BF;D1B8;1110 1169 11BF; # (톸; 톸; 톸; 톸; 톸; ) HANGUL SYLLABLE TOK +D1B9;D1B9;1110 1169 11C0;D1B9;1110 1169 11C0; # (톹; 톹; 톹; 톹; 톹; ) HANGUL SYLLABLE TOT +D1BA;D1BA;1110 1169 11C1;D1BA;1110 1169 11C1; # (톺; 톺; 톺; 톺; 톺; ) HANGUL SYLLABLE TOP +D1BB;D1BB;1110 1169 11C2;D1BB;1110 1169 11C2; # (톻; 톻; 톻; 톻; 톻; ) HANGUL SYLLABLE TOH +D1BC;D1BC;1110 116A;D1BC;1110 116A; # (톼; 톼; 톼; 톼; 톼; ) HANGUL SYLLABLE TWA +D1BD;D1BD;1110 116A 11A8;D1BD;1110 116A 11A8; # (톽; 톽; 톽; 톽; 톽; ) HANGUL SYLLABLE TWAG +D1BE;D1BE;1110 116A 11A9;D1BE;1110 116A 11A9; # (톾; 톾; 톾; 톾; 톾; ) HANGUL SYLLABLE TWAGG +D1BF;D1BF;1110 116A 11AA;D1BF;1110 116A 11AA; # (톿; 톿; 톿; 톿; 톿; ) HANGUL SYLLABLE TWAGS +D1C0;D1C0;1110 116A 11AB;D1C0;1110 116A 11AB; # (퇀; 퇀; 퇀; 퇀; 퇀; ) HANGUL SYLLABLE TWAN +D1C1;D1C1;1110 116A 11AC;D1C1;1110 116A 11AC; # (퇁; 퇁; 퇁; 퇁; 퇁; ) HANGUL SYLLABLE TWANJ +D1C2;D1C2;1110 116A 11AD;D1C2;1110 116A 11AD; # (퇂; 퇂; 퇂; 퇂; 퇂; ) HANGUL SYLLABLE TWANH +D1C3;D1C3;1110 116A 11AE;D1C3;1110 116A 11AE; # (퇃; 퇃; 퇃; 퇃; 퇃; ) HANGUL SYLLABLE TWAD +D1C4;D1C4;1110 116A 11AF;D1C4;1110 116A 11AF; # (퇄; 퇄; 퇄; 퇄; 퇄; ) HANGUL SYLLABLE TWAL +D1C5;D1C5;1110 116A 11B0;D1C5;1110 116A 11B0; # (퇅; 퇅; 퇅; 퇅; 퇅; ) HANGUL SYLLABLE TWALG +D1C6;D1C6;1110 116A 11B1;D1C6;1110 116A 11B1; # (퇆; 퇆; 퇆; 퇆; 퇆; ) HANGUL SYLLABLE TWALM +D1C7;D1C7;1110 116A 11B2;D1C7;1110 116A 11B2; # (퇇; 퇇; 퇇; 퇇; 퇇; ) HANGUL SYLLABLE TWALB +D1C8;D1C8;1110 116A 11B3;D1C8;1110 116A 11B3; # (퇈; 퇈; 퇈; 퇈; 퇈; ) HANGUL SYLLABLE TWALS +D1C9;D1C9;1110 116A 11B4;D1C9;1110 116A 11B4; # (퇉; 퇉; 퇉; 퇉; 퇉; ) HANGUL SYLLABLE TWALT +D1CA;D1CA;1110 116A 11B5;D1CA;1110 116A 11B5; # (퇊; 퇊; 퇊; 퇊; 퇊; ) HANGUL SYLLABLE TWALP +D1CB;D1CB;1110 116A 11B6;D1CB;1110 116A 11B6; # (퇋; 퇋; 퇋; 퇋; 퇋; ) HANGUL SYLLABLE TWALH +D1CC;D1CC;1110 116A 11B7;D1CC;1110 116A 11B7; # (퇌; 퇌; 퇌; 퇌; 퇌; ) HANGUL SYLLABLE TWAM +D1CD;D1CD;1110 116A 11B8;D1CD;1110 116A 11B8; # (퇍; 퇍; 퇍; 퇍; 퇍; ) HANGUL SYLLABLE TWAB +D1CE;D1CE;1110 116A 11B9;D1CE;1110 116A 11B9; # (퇎; 퇎; 퇎; 퇎; 퇎; ) HANGUL SYLLABLE TWABS +D1CF;D1CF;1110 116A 11BA;D1CF;1110 116A 11BA; # (퇏; 퇏; 퇏; 퇏; 퇏; ) HANGUL SYLLABLE TWAS +D1D0;D1D0;1110 116A 11BB;D1D0;1110 116A 11BB; # (퇐; 퇐; 퇐; 퇐; 퇐; ) HANGUL SYLLABLE TWASS +D1D1;D1D1;1110 116A 11BC;D1D1;1110 116A 11BC; # (퇑; 퇑; 퇑; 퇑; 퇑; ) HANGUL SYLLABLE TWANG +D1D2;D1D2;1110 116A 11BD;D1D2;1110 116A 11BD; # (퇒; 퇒; 퇒; 퇒; 퇒; ) HANGUL SYLLABLE TWAJ +D1D3;D1D3;1110 116A 11BE;D1D3;1110 116A 11BE; # (퇓; 퇓; 퇓; 퇓; 퇓; ) HANGUL SYLLABLE TWAC +D1D4;D1D4;1110 116A 11BF;D1D4;1110 116A 11BF; # (퇔; 퇔; 퇔; 퇔; 퇔; ) HANGUL SYLLABLE TWAK +D1D5;D1D5;1110 116A 11C0;D1D5;1110 116A 11C0; # (퇕; 퇕; 퇕; 퇕; 퇕; ) HANGUL SYLLABLE TWAT +D1D6;D1D6;1110 116A 11C1;D1D6;1110 116A 11C1; # (퇖; 퇖; 퇖; 퇖; 퇖; ) HANGUL SYLLABLE TWAP +D1D7;D1D7;1110 116A 11C2;D1D7;1110 116A 11C2; # (퇗; 퇗; 퇗; 퇗; 퇗; ) HANGUL SYLLABLE TWAH +D1D8;D1D8;1110 116B;D1D8;1110 116B; # (퇘; 퇘; 퇘; 퇘; 퇘; ) HANGUL SYLLABLE TWAE +D1D9;D1D9;1110 116B 11A8;D1D9;1110 116B 11A8; # (퇙; 퇙; 퇙; 퇙; 퇙; ) HANGUL SYLLABLE TWAEG +D1DA;D1DA;1110 116B 11A9;D1DA;1110 116B 11A9; # (퇚; 퇚; 퇚; 퇚; 퇚; ) HANGUL SYLLABLE TWAEGG +D1DB;D1DB;1110 116B 11AA;D1DB;1110 116B 11AA; # (퇛; 퇛; 퇛; 퇛; 퇛; ) HANGUL SYLLABLE TWAEGS +D1DC;D1DC;1110 116B 11AB;D1DC;1110 116B 11AB; # (퇜; 퇜; 퇜; 퇜; 퇜; ) HANGUL SYLLABLE TWAEN +D1DD;D1DD;1110 116B 11AC;D1DD;1110 116B 11AC; # (퇝; 퇝; 퇝; 퇝; 퇝; ) HANGUL SYLLABLE TWAENJ +D1DE;D1DE;1110 116B 11AD;D1DE;1110 116B 11AD; # (퇞; 퇞; 퇞; 퇞; 퇞; ) HANGUL SYLLABLE TWAENH +D1DF;D1DF;1110 116B 11AE;D1DF;1110 116B 11AE; # (퇟; 퇟; 퇟; 퇟; 퇟; ) HANGUL SYLLABLE TWAED +D1E0;D1E0;1110 116B 11AF;D1E0;1110 116B 11AF; # (퇠; 퇠; 퇠; 퇠; 퇠; ) HANGUL SYLLABLE TWAEL +D1E1;D1E1;1110 116B 11B0;D1E1;1110 116B 11B0; # (퇡; 퇡; 퇡; 퇡; 퇡; ) HANGUL SYLLABLE TWAELG +D1E2;D1E2;1110 116B 11B1;D1E2;1110 116B 11B1; # (퇢; 퇢; 퇢; 퇢; 퇢; ) HANGUL SYLLABLE TWAELM +D1E3;D1E3;1110 116B 11B2;D1E3;1110 116B 11B2; # (퇣; 퇣; 퇣; 퇣; 퇣; ) HANGUL SYLLABLE TWAELB +D1E4;D1E4;1110 116B 11B3;D1E4;1110 116B 11B3; # (퇤; 퇤; 퇤; 퇤; 퇤; ) HANGUL SYLLABLE TWAELS +D1E5;D1E5;1110 116B 11B4;D1E5;1110 116B 11B4; # (퇥; 퇥; 퇥; 퇥; 퇥; ) HANGUL SYLLABLE TWAELT +D1E6;D1E6;1110 116B 11B5;D1E6;1110 116B 11B5; # (퇦; 퇦; 퇦; 퇦; 퇦; ) HANGUL SYLLABLE TWAELP +D1E7;D1E7;1110 116B 11B6;D1E7;1110 116B 11B6; # (퇧; 퇧; 퇧; 퇧; 퇧; ) HANGUL SYLLABLE TWAELH +D1E8;D1E8;1110 116B 11B7;D1E8;1110 116B 11B7; # (퇨; 퇨; 퇨; 퇨; 퇨; ) HANGUL SYLLABLE TWAEM +D1E9;D1E9;1110 116B 11B8;D1E9;1110 116B 11B8; # (퇩; 퇩; 퇩; 퇩; 퇩; ) HANGUL SYLLABLE TWAEB +D1EA;D1EA;1110 116B 11B9;D1EA;1110 116B 11B9; # (퇪; 퇪; 퇪; 퇪; 퇪; ) HANGUL SYLLABLE TWAEBS +D1EB;D1EB;1110 116B 11BA;D1EB;1110 116B 11BA; # (퇫; 퇫; 퇫; 퇫; 퇫; ) HANGUL SYLLABLE TWAES +D1EC;D1EC;1110 116B 11BB;D1EC;1110 116B 11BB; # (퇬; 퇬; 퇬; 퇬; 퇬; ) HANGUL SYLLABLE TWAESS +D1ED;D1ED;1110 116B 11BC;D1ED;1110 116B 11BC; # (퇭; 퇭; 퇭; 퇭; 퇭; ) HANGUL SYLLABLE TWAENG +D1EE;D1EE;1110 116B 11BD;D1EE;1110 116B 11BD; # (퇮; 퇮; 퇮; 퇮; 퇮; ) HANGUL SYLLABLE TWAEJ +D1EF;D1EF;1110 116B 11BE;D1EF;1110 116B 11BE; # (퇯; 퇯; 퇯; 퇯; 퇯; ) HANGUL SYLLABLE TWAEC +D1F0;D1F0;1110 116B 11BF;D1F0;1110 116B 11BF; # (퇰; 퇰; 퇰; 퇰; 퇰; ) HANGUL SYLLABLE TWAEK +D1F1;D1F1;1110 116B 11C0;D1F1;1110 116B 11C0; # (퇱; 퇱; 퇱; 퇱; 퇱; ) HANGUL SYLLABLE TWAET +D1F2;D1F2;1110 116B 11C1;D1F2;1110 116B 11C1; # (퇲; 퇲; 퇲; 퇲; 퇲; ) HANGUL SYLLABLE TWAEP +D1F3;D1F3;1110 116B 11C2;D1F3;1110 116B 11C2; # (퇳; 퇳; 퇳; 퇳; 퇳; ) HANGUL SYLLABLE TWAEH +D1F4;D1F4;1110 116C;D1F4;1110 116C; # (퇴; 퇴; 퇴; 퇴; 퇴; ) HANGUL SYLLABLE TOE +D1F5;D1F5;1110 116C 11A8;D1F5;1110 116C 11A8; # (퇵; 퇵; 퇵; 퇵; 퇵; ) HANGUL SYLLABLE TOEG +D1F6;D1F6;1110 116C 11A9;D1F6;1110 116C 11A9; # (퇶; 퇶; 퇶; 퇶; 퇶; ) HANGUL SYLLABLE TOEGG +D1F7;D1F7;1110 116C 11AA;D1F7;1110 116C 11AA; # (퇷; 퇷; 퇷; 퇷; 퇷; ) HANGUL SYLLABLE TOEGS +D1F8;D1F8;1110 116C 11AB;D1F8;1110 116C 11AB; # (퇸; 퇸; 퇸; 퇸; 퇸; ) HANGUL SYLLABLE TOEN +D1F9;D1F9;1110 116C 11AC;D1F9;1110 116C 11AC; # (퇹; 퇹; 퇹; 퇹; 퇹; ) HANGUL SYLLABLE TOENJ +D1FA;D1FA;1110 116C 11AD;D1FA;1110 116C 11AD; # (퇺; 퇺; 퇺; 퇺; 퇺; ) HANGUL SYLLABLE TOENH +D1FB;D1FB;1110 116C 11AE;D1FB;1110 116C 11AE; # (퇻; 퇻; 퇻; 퇻; 퇻; ) HANGUL SYLLABLE TOED +D1FC;D1FC;1110 116C 11AF;D1FC;1110 116C 11AF; # (퇼; 퇼; 퇼; 퇼; 퇼; ) HANGUL SYLLABLE TOEL +D1FD;D1FD;1110 116C 11B0;D1FD;1110 116C 11B0; # (퇽; 퇽; 퇽; 퇽; 퇽; ) HANGUL SYLLABLE TOELG +D1FE;D1FE;1110 116C 11B1;D1FE;1110 116C 11B1; # (퇾; 퇾; 퇾; 퇾; 퇾; ) HANGUL SYLLABLE TOELM +D1FF;D1FF;1110 116C 11B2;D1FF;1110 116C 11B2; # (퇿; 퇿; 퇿; 퇿; 퇿; ) HANGUL SYLLABLE TOELB +D200;D200;1110 116C 11B3;D200;1110 116C 11B3; # (툀; 툀; 툀; 툀; 툀; ) HANGUL SYLLABLE TOELS +D201;D201;1110 116C 11B4;D201;1110 116C 11B4; # (툁; 툁; 툁; 툁; 툁; ) HANGUL SYLLABLE TOELT +D202;D202;1110 116C 11B5;D202;1110 116C 11B5; # (툂; 툂; 툂; 툂; 툂; ) HANGUL SYLLABLE TOELP +D203;D203;1110 116C 11B6;D203;1110 116C 11B6; # (툃; 툃; 툃; 툃; 툃; ) HANGUL SYLLABLE TOELH +D204;D204;1110 116C 11B7;D204;1110 116C 11B7; # (툄; 툄; 툄; 툄; 툄; ) HANGUL SYLLABLE TOEM +D205;D205;1110 116C 11B8;D205;1110 116C 11B8; # (툅; 툅; 툅; 툅; 툅; ) HANGUL SYLLABLE TOEB +D206;D206;1110 116C 11B9;D206;1110 116C 11B9; # (툆; 툆; 툆; 툆; 툆; ) HANGUL SYLLABLE TOEBS +D207;D207;1110 116C 11BA;D207;1110 116C 11BA; # (툇; 툇; 툇; 툇; 툇; ) HANGUL SYLLABLE TOES +D208;D208;1110 116C 11BB;D208;1110 116C 11BB; # (툈; 툈; 툈; 툈; 툈; ) HANGUL SYLLABLE TOESS +D209;D209;1110 116C 11BC;D209;1110 116C 11BC; # (툉; 툉; 툉; 툉; 툉; ) HANGUL SYLLABLE TOENG +D20A;D20A;1110 116C 11BD;D20A;1110 116C 11BD; # (툊; 툊; 툊; 툊; 툊; ) HANGUL SYLLABLE TOEJ +D20B;D20B;1110 116C 11BE;D20B;1110 116C 11BE; # (툋; 툋; 툋; 툋; 툋; ) HANGUL SYLLABLE TOEC +D20C;D20C;1110 116C 11BF;D20C;1110 116C 11BF; # (툌; 툌; 툌; 툌; 툌; ) HANGUL SYLLABLE TOEK +D20D;D20D;1110 116C 11C0;D20D;1110 116C 11C0; # (툍; 툍; 툍; 툍; 툍; ) HANGUL SYLLABLE TOET +D20E;D20E;1110 116C 11C1;D20E;1110 116C 11C1; # (툎; 툎; 툎; 툎; 툎; ) HANGUL SYLLABLE TOEP +D20F;D20F;1110 116C 11C2;D20F;1110 116C 11C2; # (툏; 툏; 툏; 툏; 툏; ) HANGUL SYLLABLE TOEH +D210;D210;1110 116D;D210;1110 116D; # (툐; 툐; 툐; 툐; 툐; ) HANGUL SYLLABLE TYO +D211;D211;1110 116D 11A8;D211;1110 116D 11A8; # (툑; 툑; 툑; 툑; 툑; ) HANGUL SYLLABLE TYOG +D212;D212;1110 116D 11A9;D212;1110 116D 11A9; # (툒; 툒; 툒; 툒; 툒; ) HANGUL SYLLABLE TYOGG +D213;D213;1110 116D 11AA;D213;1110 116D 11AA; # (툓; 툓; 툓; 툓; 툓; ) HANGUL SYLLABLE TYOGS +D214;D214;1110 116D 11AB;D214;1110 116D 11AB; # (툔; 툔; 툔; 툔; 툔; ) HANGUL SYLLABLE TYON +D215;D215;1110 116D 11AC;D215;1110 116D 11AC; # (툕; 툕; 툕; 툕; 툕; ) HANGUL SYLLABLE TYONJ +D216;D216;1110 116D 11AD;D216;1110 116D 11AD; # (툖; 툖; 툖; 툖; 툖; ) HANGUL SYLLABLE TYONH +D217;D217;1110 116D 11AE;D217;1110 116D 11AE; # (툗; 툗; 툗; 툗; 툗; ) HANGUL SYLLABLE TYOD +D218;D218;1110 116D 11AF;D218;1110 116D 11AF; # (툘; 툘; 툘; 툘; 툘; ) HANGUL SYLLABLE TYOL +D219;D219;1110 116D 11B0;D219;1110 116D 11B0; # (툙; 툙; 툙; 툙; 툙; ) HANGUL SYLLABLE TYOLG +D21A;D21A;1110 116D 11B1;D21A;1110 116D 11B1; # (툚; 툚; 툚; 툚; 툚; ) HANGUL SYLLABLE TYOLM +D21B;D21B;1110 116D 11B2;D21B;1110 116D 11B2; # (툛; 툛; 툛; 툛; 툛; ) HANGUL SYLLABLE TYOLB +D21C;D21C;1110 116D 11B3;D21C;1110 116D 11B3; # (툜; 툜; 툜; 툜; 툜; ) HANGUL SYLLABLE TYOLS +D21D;D21D;1110 116D 11B4;D21D;1110 116D 11B4; # (툝; 툝; 툝; 툝; 툝; ) HANGUL SYLLABLE TYOLT +D21E;D21E;1110 116D 11B5;D21E;1110 116D 11B5; # (툞; 툞; 툞; 툞; 툞; ) HANGUL SYLLABLE TYOLP +D21F;D21F;1110 116D 11B6;D21F;1110 116D 11B6; # (툟; 툟; 툟; 툟; 툟; ) HANGUL SYLLABLE TYOLH +D220;D220;1110 116D 11B7;D220;1110 116D 11B7; # (툠; 툠; 툠; 툠; 툠; ) HANGUL SYLLABLE TYOM +D221;D221;1110 116D 11B8;D221;1110 116D 11B8; # (툡; 툡; 툡; 툡; 툡; ) HANGUL SYLLABLE TYOB +D222;D222;1110 116D 11B9;D222;1110 116D 11B9; # (툢; 툢; 툢; 툢; 툢; ) HANGUL SYLLABLE TYOBS +D223;D223;1110 116D 11BA;D223;1110 116D 11BA; # (툣; 툣; 툣; 툣; 툣; ) HANGUL SYLLABLE TYOS +D224;D224;1110 116D 11BB;D224;1110 116D 11BB; # (툤; 툤; 툤; 툤; 툤; ) HANGUL SYLLABLE TYOSS +D225;D225;1110 116D 11BC;D225;1110 116D 11BC; # (툥; 툥; 툥; 툥; 툥; ) HANGUL SYLLABLE TYONG +D226;D226;1110 116D 11BD;D226;1110 116D 11BD; # (툦; 툦; 툦; 툦; 툦; ) HANGUL SYLLABLE TYOJ +D227;D227;1110 116D 11BE;D227;1110 116D 11BE; # (툧; 툧; 툧; 툧; 툧; ) HANGUL SYLLABLE TYOC +D228;D228;1110 116D 11BF;D228;1110 116D 11BF; # (툨; 툨; 툨; 툨; 툨; ) HANGUL SYLLABLE TYOK +D229;D229;1110 116D 11C0;D229;1110 116D 11C0; # (툩; 툩; 툩; 툩; 툩; ) HANGUL SYLLABLE TYOT +D22A;D22A;1110 116D 11C1;D22A;1110 116D 11C1; # (툪; 툪; 툪; 툪; 툪; ) HANGUL SYLLABLE TYOP +D22B;D22B;1110 116D 11C2;D22B;1110 116D 11C2; # (툫; 툫; 툫; 툫; 툫; ) HANGUL SYLLABLE TYOH +D22C;D22C;1110 116E;D22C;1110 116E; # (투; 투; 투; 투; 투; ) HANGUL SYLLABLE TU +D22D;D22D;1110 116E 11A8;D22D;1110 116E 11A8; # (툭; 툭; 툭; 툭; 툭; ) HANGUL SYLLABLE TUG +D22E;D22E;1110 116E 11A9;D22E;1110 116E 11A9; # (툮; 툮; 툮; 툮; 툮; ) HANGUL SYLLABLE TUGG +D22F;D22F;1110 116E 11AA;D22F;1110 116E 11AA; # (툯; 툯; 툯; 툯; 툯; ) HANGUL SYLLABLE TUGS +D230;D230;1110 116E 11AB;D230;1110 116E 11AB; # (툰; 툰; 툰; 툰; 툰; ) HANGUL SYLLABLE TUN +D231;D231;1110 116E 11AC;D231;1110 116E 11AC; # (툱; 툱; 툱; 툱; 툱; ) HANGUL SYLLABLE TUNJ +D232;D232;1110 116E 11AD;D232;1110 116E 11AD; # (툲; 툲; 툲; 툲; 툲; ) HANGUL SYLLABLE TUNH +D233;D233;1110 116E 11AE;D233;1110 116E 11AE; # (툳; 툳; 툳; 툳; 툳; ) HANGUL SYLLABLE TUD +D234;D234;1110 116E 11AF;D234;1110 116E 11AF; # (툴; 툴; 툴; 툴; 툴; ) HANGUL SYLLABLE TUL +D235;D235;1110 116E 11B0;D235;1110 116E 11B0; # (툵; 툵; 툵; 툵; 툵; ) HANGUL SYLLABLE TULG +D236;D236;1110 116E 11B1;D236;1110 116E 11B1; # (툶; 툶; 툶; 툶; 툶; ) HANGUL SYLLABLE TULM +D237;D237;1110 116E 11B2;D237;1110 116E 11B2; # (툷; 툷; 툷; 툷; 툷; ) HANGUL SYLLABLE TULB +D238;D238;1110 116E 11B3;D238;1110 116E 11B3; # (툸; 툸; 툸; 툸; 툸; ) HANGUL SYLLABLE TULS +D239;D239;1110 116E 11B4;D239;1110 116E 11B4; # (툹; 툹; 툹; 툹; 툹; ) HANGUL SYLLABLE TULT +D23A;D23A;1110 116E 11B5;D23A;1110 116E 11B5; # (툺; 툺; 툺; 툺; 툺; ) HANGUL SYLLABLE TULP +D23B;D23B;1110 116E 11B6;D23B;1110 116E 11B6; # (툻; 툻; 툻; 툻; 툻; ) HANGUL SYLLABLE TULH +D23C;D23C;1110 116E 11B7;D23C;1110 116E 11B7; # (툼; 툼; 툼; 툼; 툼; ) HANGUL SYLLABLE TUM +D23D;D23D;1110 116E 11B8;D23D;1110 116E 11B8; # (툽; 툽; 툽; 툽; 툽; ) HANGUL SYLLABLE TUB +D23E;D23E;1110 116E 11B9;D23E;1110 116E 11B9; # (툾; 툾; 툾; 툾; 툾; ) HANGUL SYLLABLE TUBS +D23F;D23F;1110 116E 11BA;D23F;1110 116E 11BA; # (툿; 툿; 툿; 툿; 툿; ) HANGUL SYLLABLE TUS +D240;D240;1110 116E 11BB;D240;1110 116E 11BB; # (퉀; 퉀; 퉀; 퉀; 퉀; ) HANGUL SYLLABLE TUSS +D241;D241;1110 116E 11BC;D241;1110 116E 11BC; # (퉁; 퉁; 퉁; 퉁; 퉁; ) HANGUL SYLLABLE TUNG +D242;D242;1110 116E 11BD;D242;1110 116E 11BD; # (퉂; 퉂; 퉂; 퉂; 퉂; ) HANGUL SYLLABLE TUJ +D243;D243;1110 116E 11BE;D243;1110 116E 11BE; # (퉃; 퉃; 퉃; 퉃; 퉃; ) HANGUL SYLLABLE TUC +D244;D244;1110 116E 11BF;D244;1110 116E 11BF; # (퉄; 퉄; 퉄; 퉄; 퉄; ) HANGUL SYLLABLE TUK +D245;D245;1110 116E 11C0;D245;1110 116E 11C0; # (퉅; 퉅; 퉅; 퉅; 퉅; ) HANGUL SYLLABLE TUT +D246;D246;1110 116E 11C1;D246;1110 116E 11C1; # (퉆; 퉆; 퉆; 퉆; 퉆; ) HANGUL SYLLABLE TUP +D247;D247;1110 116E 11C2;D247;1110 116E 11C2; # (퉇; 퉇; 퉇; 퉇; 퉇; ) HANGUL SYLLABLE TUH +D248;D248;1110 116F;D248;1110 116F; # (퉈; 퉈; 퉈; 퉈; 퉈; ) HANGUL SYLLABLE TWEO +D249;D249;1110 116F 11A8;D249;1110 116F 11A8; # (퉉; 퉉; 퉉; 퉉; 퉉; ) HANGUL SYLLABLE TWEOG +D24A;D24A;1110 116F 11A9;D24A;1110 116F 11A9; # (퉊; 퉊; 퉊; 퉊; 퉊; ) HANGUL SYLLABLE TWEOGG +D24B;D24B;1110 116F 11AA;D24B;1110 116F 11AA; # (퉋; 퉋; 퉋; 퉋; 퉋; ) HANGUL SYLLABLE TWEOGS +D24C;D24C;1110 116F 11AB;D24C;1110 116F 11AB; # (퉌; 퉌; 퉌; 퉌; 퉌; ) HANGUL SYLLABLE TWEON +D24D;D24D;1110 116F 11AC;D24D;1110 116F 11AC; # (퉍; 퉍; 퉍; 퉍; 퉍; ) HANGUL SYLLABLE TWEONJ +D24E;D24E;1110 116F 11AD;D24E;1110 116F 11AD; # (퉎; 퉎; 퉎; 퉎; 퉎; ) HANGUL SYLLABLE TWEONH +D24F;D24F;1110 116F 11AE;D24F;1110 116F 11AE; # (퉏; 퉏; 퉏; 퉏; 퉏; ) HANGUL SYLLABLE TWEOD +D250;D250;1110 116F 11AF;D250;1110 116F 11AF; # (퉐; 퉐; 퉐; 퉐; 퉐; ) HANGUL SYLLABLE TWEOL +D251;D251;1110 116F 11B0;D251;1110 116F 11B0; # (퉑; 퉑; 퉑; 퉑; 퉑; ) HANGUL SYLLABLE TWEOLG +D252;D252;1110 116F 11B1;D252;1110 116F 11B1; # (퉒; 퉒; 퉒; 퉒; 퉒; ) HANGUL SYLLABLE TWEOLM +D253;D253;1110 116F 11B2;D253;1110 116F 11B2; # (퉓; 퉓; 퉓; 퉓; 퉓; ) HANGUL SYLLABLE TWEOLB +D254;D254;1110 116F 11B3;D254;1110 116F 11B3; # (퉔; 퉔; 퉔; 퉔; 퉔; ) HANGUL SYLLABLE TWEOLS +D255;D255;1110 116F 11B4;D255;1110 116F 11B4; # (퉕; 퉕; 퉕; 퉕; 퉕; ) HANGUL SYLLABLE TWEOLT +D256;D256;1110 116F 11B5;D256;1110 116F 11B5; # (퉖; 퉖; 퉖; 퉖; 퉖; ) HANGUL SYLLABLE TWEOLP +D257;D257;1110 116F 11B6;D257;1110 116F 11B6; # (퉗; 퉗; 퉗; 퉗; 퉗; ) HANGUL SYLLABLE TWEOLH +D258;D258;1110 116F 11B7;D258;1110 116F 11B7; # (퉘; 퉘; 퉘; 퉘; 퉘; ) HANGUL SYLLABLE TWEOM +D259;D259;1110 116F 11B8;D259;1110 116F 11B8; # (퉙; 퉙; 퉙; 퉙; 퉙; ) HANGUL SYLLABLE TWEOB +D25A;D25A;1110 116F 11B9;D25A;1110 116F 11B9; # (퉚; 퉚; 퉚; 퉚; 퉚; ) HANGUL SYLLABLE TWEOBS +D25B;D25B;1110 116F 11BA;D25B;1110 116F 11BA; # (퉛; 퉛; 퉛; 퉛; 퉛; ) HANGUL SYLLABLE TWEOS +D25C;D25C;1110 116F 11BB;D25C;1110 116F 11BB; # (퉜; 퉜; 퉜; 퉜; 퉜; ) HANGUL SYLLABLE TWEOSS +D25D;D25D;1110 116F 11BC;D25D;1110 116F 11BC; # (퉝; 퉝; 퉝; 퉝; 퉝; ) HANGUL SYLLABLE TWEONG +D25E;D25E;1110 116F 11BD;D25E;1110 116F 11BD; # (퉞; 퉞; 퉞; 퉞; 퉞; ) HANGUL SYLLABLE TWEOJ +D25F;D25F;1110 116F 11BE;D25F;1110 116F 11BE; # (퉟; 퉟; 퉟; 퉟; 퉟; ) HANGUL SYLLABLE TWEOC +D260;D260;1110 116F 11BF;D260;1110 116F 11BF; # (퉠; 퉠; 퉠; 퉠; 퉠; ) HANGUL SYLLABLE TWEOK +D261;D261;1110 116F 11C0;D261;1110 116F 11C0; # (퉡; 퉡; 퉡; 퉡; 퉡; ) HANGUL SYLLABLE TWEOT +D262;D262;1110 116F 11C1;D262;1110 116F 11C1; # (퉢; 퉢; 퉢; 퉢; 퉢; ) HANGUL SYLLABLE TWEOP +D263;D263;1110 116F 11C2;D263;1110 116F 11C2; # (퉣; 퉣; 퉣; 퉣; 퉣; ) HANGUL SYLLABLE TWEOH +D264;D264;1110 1170;D264;1110 1170; # (퉤; 퉤; 퉤; 퉤; 퉤; ) HANGUL SYLLABLE TWE +D265;D265;1110 1170 11A8;D265;1110 1170 11A8; # (퉥; 퉥; 퉥; 퉥; 퉥; ) HANGUL SYLLABLE TWEG +D266;D266;1110 1170 11A9;D266;1110 1170 11A9; # (퉦; 퉦; 퉦; 퉦; 퉦; ) HANGUL SYLLABLE TWEGG +D267;D267;1110 1170 11AA;D267;1110 1170 11AA; # (퉧; 퉧; 퉧; 퉧; 퉧; ) HANGUL SYLLABLE TWEGS +D268;D268;1110 1170 11AB;D268;1110 1170 11AB; # (퉨; 퉨; 퉨; 퉨; 퉨; ) HANGUL SYLLABLE TWEN +D269;D269;1110 1170 11AC;D269;1110 1170 11AC; # (퉩; 퉩; 퉩; 퉩; 퉩; ) HANGUL SYLLABLE TWENJ +D26A;D26A;1110 1170 11AD;D26A;1110 1170 11AD; # (퉪; 퉪; 퉪; 퉪; 퉪; ) HANGUL SYLLABLE TWENH +D26B;D26B;1110 1170 11AE;D26B;1110 1170 11AE; # (퉫; 퉫; 퉫; 퉫; 퉫; ) HANGUL SYLLABLE TWED +D26C;D26C;1110 1170 11AF;D26C;1110 1170 11AF; # (퉬; 퉬; 퉬; 퉬; 퉬; ) HANGUL SYLLABLE TWEL +D26D;D26D;1110 1170 11B0;D26D;1110 1170 11B0; # (퉭; 퉭; 퉭; 퉭; 퉭; ) HANGUL SYLLABLE TWELG +D26E;D26E;1110 1170 11B1;D26E;1110 1170 11B1; # (퉮; 퉮; 퉮; 퉮; 퉮; ) HANGUL SYLLABLE TWELM +D26F;D26F;1110 1170 11B2;D26F;1110 1170 11B2; # (퉯; 퉯; 퉯; 퉯; 퉯; ) HANGUL SYLLABLE TWELB +D270;D270;1110 1170 11B3;D270;1110 1170 11B3; # (퉰; 퉰; 퉰; 퉰; 퉰; ) HANGUL SYLLABLE TWELS +D271;D271;1110 1170 11B4;D271;1110 1170 11B4; # (퉱; 퉱; 퉱; 퉱; 퉱; ) HANGUL SYLLABLE TWELT +D272;D272;1110 1170 11B5;D272;1110 1170 11B5; # (퉲; 퉲; 퉲; 퉲; 퉲; ) HANGUL SYLLABLE TWELP +D273;D273;1110 1170 11B6;D273;1110 1170 11B6; # (퉳; 퉳; 퉳; 퉳; 퉳; ) HANGUL SYLLABLE TWELH +D274;D274;1110 1170 11B7;D274;1110 1170 11B7; # (퉴; 퉴; 퉴; 퉴; 퉴; ) HANGUL SYLLABLE TWEM +D275;D275;1110 1170 11B8;D275;1110 1170 11B8; # (퉵; 퉵; 퉵; 퉵; 퉵; ) HANGUL SYLLABLE TWEB +D276;D276;1110 1170 11B9;D276;1110 1170 11B9; # (퉶; 퉶; 퉶; 퉶; 퉶; ) HANGUL SYLLABLE TWEBS +D277;D277;1110 1170 11BA;D277;1110 1170 11BA; # (퉷; 퉷; 퉷; 퉷; 퉷; ) HANGUL SYLLABLE TWES +D278;D278;1110 1170 11BB;D278;1110 1170 11BB; # (퉸; 퉸; 퉸; 퉸; 퉸; ) HANGUL SYLLABLE TWESS +D279;D279;1110 1170 11BC;D279;1110 1170 11BC; # (퉹; 퉹; 퉹; 퉹; 퉹; ) HANGUL SYLLABLE TWENG +D27A;D27A;1110 1170 11BD;D27A;1110 1170 11BD; # (퉺; 퉺; 퉺; 퉺; 퉺; ) HANGUL SYLLABLE TWEJ +D27B;D27B;1110 1170 11BE;D27B;1110 1170 11BE; # (퉻; 퉻; 퉻; 퉻; 퉻; ) HANGUL SYLLABLE TWEC +D27C;D27C;1110 1170 11BF;D27C;1110 1170 11BF; # (퉼; 퉼; 퉼; 퉼; 퉼; ) HANGUL SYLLABLE TWEK +D27D;D27D;1110 1170 11C0;D27D;1110 1170 11C0; # (퉽; 퉽; 퉽; 퉽; 퉽; ) HANGUL SYLLABLE TWET +D27E;D27E;1110 1170 11C1;D27E;1110 1170 11C1; # (퉾; 퉾; 퉾; 퉾; 퉾; ) HANGUL SYLLABLE TWEP +D27F;D27F;1110 1170 11C2;D27F;1110 1170 11C2; # (퉿; 퉿; 퉿; 퉿; 퉿; ) HANGUL SYLLABLE TWEH +D280;D280;1110 1171;D280;1110 1171; # (튀; 튀; 튀; 튀; 튀; ) HANGUL SYLLABLE TWI +D281;D281;1110 1171 11A8;D281;1110 1171 11A8; # (튁; 튁; 튁; 튁; 튁; ) HANGUL SYLLABLE TWIG +D282;D282;1110 1171 11A9;D282;1110 1171 11A9; # (튂; 튂; 튂; 튂; 튂; ) HANGUL SYLLABLE TWIGG +D283;D283;1110 1171 11AA;D283;1110 1171 11AA; # (튃; 튃; 튃; 튃; 튃; ) HANGUL SYLLABLE TWIGS +D284;D284;1110 1171 11AB;D284;1110 1171 11AB; # (튄; 튄; 튄; 튄; 튄; ) HANGUL SYLLABLE TWIN +D285;D285;1110 1171 11AC;D285;1110 1171 11AC; # (튅; 튅; 튅; 튅; 튅; ) HANGUL SYLLABLE TWINJ +D286;D286;1110 1171 11AD;D286;1110 1171 11AD; # (튆; 튆; 튆; 튆; 튆; ) HANGUL SYLLABLE TWINH +D287;D287;1110 1171 11AE;D287;1110 1171 11AE; # (튇; 튇; 튇; 튇; 튇; ) HANGUL SYLLABLE TWID +D288;D288;1110 1171 11AF;D288;1110 1171 11AF; # (튈; 튈; 튈; 튈; 튈; ) HANGUL SYLLABLE TWIL +D289;D289;1110 1171 11B0;D289;1110 1171 11B0; # (튉; 튉; 튉; 튉; 튉; ) HANGUL SYLLABLE TWILG +D28A;D28A;1110 1171 11B1;D28A;1110 1171 11B1; # (튊; 튊; 튊; 튊; 튊; ) HANGUL SYLLABLE TWILM +D28B;D28B;1110 1171 11B2;D28B;1110 1171 11B2; # (튋; 튋; 튋; 튋; 튋; ) HANGUL SYLLABLE TWILB +D28C;D28C;1110 1171 11B3;D28C;1110 1171 11B3; # (튌; 튌; 튌; 튌; 튌; ) HANGUL SYLLABLE TWILS +D28D;D28D;1110 1171 11B4;D28D;1110 1171 11B4; # (튍; 튍; 튍; 튍; 튍; ) HANGUL SYLLABLE TWILT +D28E;D28E;1110 1171 11B5;D28E;1110 1171 11B5; # (튎; 튎; 튎; 튎; 튎; ) HANGUL SYLLABLE TWILP +D28F;D28F;1110 1171 11B6;D28F;1110 1171 11B6; # (튏; 튏; 튏; 튏; 튏; ) HANGUL SYLLABLE TWILH +D290;D290;1110 1171 11B7;D290;1110 1171 11B7; # (튐; 튐; 튐; 튐; 튐; ) HANGUL SYLLABLE TWIM +D291;D291;1110 1171 11B8;D291;1110 1171 11B8; # (튑; 튑; 튑; 튑; 튑; ) HANGUL SYLLABLE TWIB +D292;D292;1110 1171 11B9;D292;1110 1171 11B9; # (튒; 튒; 튒; 튒; 튒; ) HANGUL SYLLABLE TWIBS +D293;D293;1110 1171 11BA;D293;1110 1171 11BA; # (튓; 튓; 튓; 튓; 튓; ) HANGUL SYLLABLE TWIS +D294;D294;1110 1171 11BB;D294;1110 1171 11BB; # (튔; 튔; 튔; 튔; 튔; ) HANGUL SYLLABLE TWISS +D295;D295;1110 1171 11BC;D295;1110 1171 11BC; # (튕; 튕; 튕; 튕; 튕; ) HANGUL SYLLABLE TWING +D296;D296;1110 1171 11BD;D296;1110 1171 11BD; # (튖; 튖; 튖; 튖; 튖; ) HANGUL SYLLABLE TWIJ +D297;D297;1110 1171 11BE;D297;1110 1171 11BE; # (튗; 튗; 튗; 튗; 튗; ) HANGUL SYLLABLE TWIC +D298;D298;1110 1171 11BF;D298;1110 1171 11BF; # (튘; 튘; 튘; 튘; 튘; ) HANGUL SYLLABLE TWIK +D299;D299;1110 1171 11C0;D299;1110 1171 11C0; # (튙; 튙; 튙; 튙; 튙; ) HANGUL SYLLABLE TWIT +D29A;D29A;1110 1171 11C1;D29A;1110 1171 11C1; # (튚; 튚; 튚; 튚; 튚; ) HANGUL SYLLABLE TWIP +D29B;D29B;1110 1171 11C2;D29B;1110 1171 11C2; # (튛; 튛; 튛; 튛; 튛; ) HANGUL SYLLABLE TWIH +D29C;D29C;1110 1172;D29C;1110 1172; # (튜; 튜; 튜; 튜; 튜; ) HANGUL SYLLABLE TYU +D29D;D29D;1110 1172 11A8;D29D;1110 1172 11A8; # (튝; 튝; 튝; 튝; 튝; ) HANGUL SYLLABLE TYUG +D29E;D29E;1110 1172 11A9;D29E;1110 1172 11A9; # (튞; 튞; 튞; 튞; 튞; ) HANGUL SYLLABLE TYUGG +D29F;D29F;1110 1172 11AA;D29F;1110 1172 11AA; # (튟; 튟; 튟; 튟; 튟; ) HANGUL SYLLABLE TYUGS +D2A0;D2A0;1110 1172 11AB;D2A0;1110 1172 11AB; # (튠; 튠; 튠; 튠; 튠; ) HANGUL SYLLABLE TYUN +D2A1;D2A1;1110 1172 11AC;D2A1;1110 1172 11AC; # (튡; 튡; 튡; 튡; 튡; ) HANGUL SYLLABLE TYUNJ +D2A2;D2A2;1110 1172 11AD;D2A2;1110 1172 11AD; # (튢; 튢; 튢; 튢; 튢; ) HANGUL SYLLABLE TYUNH +D2A3;D2A3;1110 1172 11AE;D2A3;1110 1172 11AE; # (튣; 튣; 튣; 튣; 튣; ) HANGUL SYLLABLE TYUD +D2A4;D2A4;1110 1172 11AF;D2A4;1110 1172 11AF; # (튤; 튤; 튤; 튤; 튤; ) HANGUL SYLLABLE TYUL +D2A5;D2A5;1110 1172 11B0;D2A5;1110 1172 11B0; # (튥; 튥; 튥; 튥; 튥; ) HANGUL SYLLABLE TYULG +D2A6;D2A6;1110 1172 11B1;D2A6;1110 1172 11B1; # (튦; 튦; 튦; 튦; 튦; ) HANGUL SYLLABLE TYULM +D2A7;D2A7;1110 1172 11B2;D2A7;1110 1172 11B2; # (튧; 튧; 튧; 튧; 튧; ) HANGUL SYLLABLE TYULB +D2A8;D2A8;1110 1172 11B3;D2A8;1110 1172 11B3; # (튨; 튨; 튨; 튨; 튨; ) HANGUL SYLLABLE TYULS +D2A9;D2A9;1110 1172 11B4;D2A9;1110 1172 11B4; # (튩; 튩; 튩; 튩; 튩; ) HANGUL SYLLABLE TYULT +D2AA;D2AA;1110 1172 11B5;D2AA;1110 1172 11B5; # (튪; 튪; 튪; 튪; 튪; ) HANGUL SYLLABLE TYULP +D2AB;D2AB;1110 1172 11B6;D2AB;1110 1172 11B6; # (튫; 튫; 튫; 튫; 튫; ) HANGUL SYLLABLE TYULH +D2AC;D2AC;1110 1172 11B7;D2AC;1110 1172 11B7; # (튬; 튬; 튬; 튬; 튬; ) HANGUL SYLLABLE TYUM +D2AD;D2AD;1110 1172 11B8;D2AD;1110 1172 11B8; # (튭; 튭; 튭; 튭; 튭; ) HANGUL SYLLABLE TYUB +D2AE;D2AE;1110 1172 11B9;D2AE;1110 1172 11B9; # (튮; 튮; 튮; 튮; 튮; ) HANGUL SYLLABLE TYUBS +D2AF;D2AF;1110 1172 11BA;D2AF;1110 1172 11BA; # (튯; 튯; 튯; 튯; 튯; ) HANGUL SYLLABLE TYUS +D2B0;D2B0;1110 1172 11BB;D2B0;1110 1172 11BB; # (튰; 튰; 튰; 튰; 튰; ) HANGUL SYLLABLE TYUSS +D2B1;D2B1;1110 1172 11BC;D2B1;1110 1172 11BC; # (튱; 튱; 튱; 튱; 튱; ) HANGUL SYLLABLE TYUNG +D2B2;D2B2;1110 1172 11BD;D2B2;1110 1172 11BD; # (튲; 튲; 튲; 튲; 튲; ) HANGUL SYLLABLE TYUJ +D2B3;D2B3;1110 1172 11BE;D2B3;1110 1172 11BE; # (튳; 튳; 튳; 튳; 튳; ) HANGUL SYLLABLE TYUC +D2B4;D2B4;1110 1172 11BF;D2B4;1110 1172 11BF; # (튴; 튴; 튴; 튴; 튴; ) HANGUL SYLLABLE TYUK +D2B5;D2B5;1110 1172 11C0;D2B5;1110 1172 11C0; # (튵; 튵; 튵; 튵; 튵; ) HANGUL SYLLABLE TYUT +D2B6;D2B6;1110 1172 11C1;D2B6;1110 1172 11C1; # (튶; 튶; 튶; 튶; 튶; ) HANGUL SYLLABLE TYUP +D2B7;D2B7;1110 1172 11C2;D2B7;1110 1172 11C2; # (튷; 튷; 튷; 튷; 튷; ) HANGUL SYLLABLE TYUH +D2B8;D2B8;1110 1173;D2B8;1110 1173; # (트; 트; 트; 트; 트; ) HANGUL SYLLABLE TEU +D2B9;D2B9;1110 1173 11A8;D2B9;1110 1173 11A8; # (특; 특; 특; 특; 특; ) HANGUL SYLLABLE TEUG +D2BA;D2BA;1110 1173 11A9;D2BA;1110 1173 11A9; # (튺; 튺; 튺; 튺; 튺; ) HANGUL SYLLABLE TEUGG +D2BB;D2BB;1110 1173 11AA;D2BB;1110 1173 11AA; # (튻; 튻; 튻; 튻; 튻; ) HANGUL SYLLABLE TEUGS +D2BC;D2BC;1110 1173 11AB;D2BC;1110 1173 11AB; # (튼; 튼; 튼; 튼; 튼; ) HANGUL SYLLABLE TEUN +D2BD;D2BD;1110 1173 11AC;D2BD;1110 1173 11AC; # (튽; 튽; 튽; 튽; 튽; ) HANGUL SYLLABLE TEUNJ +D2BE;D2BE;1110 1173 11AD;D2BE;1110 1173 11AD; # (튾; 튾; 튾; 튾; 튾; ) HANGUL SYLLABLE TEUNH +D2BF;D2BF;1110 1173 11AE;D2BF;1110 1173 11AE; # (튿; 튿; 튿; 튿; 튿; ) HANGUL SYLLABLE TEUD +D2C0;D2C0;1110 1173 11AF;D2C0;1110 1173 11AF; # (틀; 틀; 틀; 틀; 틀; ) HANGUL SYLLABLE TEUL +D2C1;D2C1;1110 1173 11B0;D2C1;1110 1173 11B0; # (틁; 틁; 틁; 틁; 틁; ) HANGUL SYLLABLE TEULG +D2C2;D2C2;1110 1173 11B1;D2C2;1110 1173 11B1; # (틂; 틂; 틂; 틂; 틂; ) HANGUL SYLLABLE TEULM +D2C3;D2C3;1110 1173 11B2;D2C3;1110 1173 11B2; # (틃; 틃; 틃; 틃; 틃; ) HANGUL SYLLABLE TEULB +D2C4;D2C4;1110 1173 11B3;D2C4;1110 1173 11B3; # (틄; 틄; 틄; 틄; 틄; ) HANGUL SYLLABLE TEULS +D2C5;D2C5;1110 1173 11B4;D2C5;1110 1173 11B4; # (틅; 틅; 틅; 틅; 틅; ) HANGUL SYLLABLE TEULT +D2C6;D2C6;1110 1173 11B5;D2C6;1110 1173 11B5; # (틆; 틆; 틆; 틆; 틆; ) HANGUL SYLLABLE TEULP +D2C7;D2C7;1110 1173 11B6;D2C7;1110 1173 11B6; # (틇; 틇; 틇; 틇; 틇; ) HANGUL SYLLABLE TEULH +D2C8;D2C8;1110 1173 11B7;D2C8;1110 1173 11B7; # (틈; 틈; 틈; 틈; 틈; ) HANGUL SYLLABLE TEUM +D2C9;D2C9;1110 1173 11B8;D2C9;1110 1173 11B8; # (틉; 틉; 틉; 틉; 틉; ) HANGUL SYLLABLE TEUB +D2CA;D2CA;1110 1173 11B9;D2CA;1110 1173 11B9; # (틊; 틊; 틊; 틊; 틊; ) HANGUL SYLLABLE TEUBS +D2CB;D2CB;1110 1173 11BA;D2CB;1110 1173 11BA; # (틋; 틋; 틋; 틋; 틋; ) HANGUL SYLLABLE TEUS +D2CC;D2CC;1110 1173 11BB;D2CC;1110 1173 11BB; # (틌; 틌; 틌; 틌; 틌; ) HANGUL SYLLABLE TEUSS +D2CD;D2CD;1110 1173 11BC;D2CD;1110 1173 11BC; # (틍; 틍; 틍; 틍; 틍; ) HANGUL SYLLABLE TEUNG +D2CE;D2CE;1110 1173 11BD;D2CE;1110 1173 11BD; # (틎; 틎; 틎; 틎; 틎; ) HANGUL SYLLABLE TEUJ +D2CF;D2CF;1110 1173 11BE;D2CF;1110 1173 11BE; # (틏; 틏; 틏; 틏; 틏; ) HANGUL SYLLABLE TEUC +D2D0;D2D0;1110 1173 11BF;D2D0;1110 1173 11BF; # (틐; 틐; 틐; 틐; 틐; ) HANGUL SYLLABLE TEUK +D2D1;D2D1;1110 1173 11C0;D2D1;1110 1173 11C0; # (틑; 틑; 틑; 틑; 틑; ) HANGUL SYLLABLE TEUT +D2D2;D2D2;1110 1173 11C1;D2D2;1110 1173 11C1; # (틒; 틒; 틒; 틒; 틒; ) HANGUL SYLLABLE TEUP +D2D3;D2D3;1110 1173 11C2;D2D3;1110 1173 11C2; # (틓; 틓; 틓; 틓; 틓; ) HANGUL SYLLABLE TEUH +D2D4;D2D4;1110 1174;D2D4;1110 1174; # (틔; 틔; 틔; 틔; 틔; ) HANGUL SYLLABLE TYI +D2D5;D2D5;1110 1174 11A8;D2D5;1110 1174 11A8; # (틕; 틕; 틕; 틕; 틕; ) HANGUL SYLLABLE TYIG +D2D6;D2D6;1110 1174 11A9;D2D6;1110 1174 11A9; # (틖; 틖; 틖; 틖; 틖; ) HANGUL SYLLABLE TYIGG +D2D7;D2D7;1110 1174 11AA;D2D7;1110 1174 11AA; # (틗; 틗; 틗; 틗; 틗; ) HANGUL SYLLABLE TYIGS +D2D8;D2D8;1110 1174 11AB;D2D8;1110 1174 11AB; # (틘; 틘; 틘; 틘; 틘; ) HANGUL SYLLABLE TYIN +D2D9;D2D9;1110 1174 11AC;D2D9;1110 1174 11AC; # (틙; 틙; 틙; 틙; 틙; ) HANGUL SYLLABLE TYINJ +D2DA;D2DA;1110 1174 11AD;D2DA;1110 1174 11AD; # (틚; 틚; 틚; 틚; 틚; ) HANGUL SYLLABLE TYINH +D2DB;D2DB;1110 1174 11AE;D2DB;1110 1174 11AE; # (틛; 틛; 틛; 틛; 틛; ) HANGUL SYLLABLE TYID +D2DC;D2DC;1110 1174 11AF;D2DC;1110 1174 11AF; # (틜; 틜; 틜; 틜; 틜; ) HANGUL SYLLABLE TYIL +D2DD;D2DD;1110 1174 11B0;D2DD;1110 1174 11B0; # (틝; 틝; 틝; 틝; 틝; ) HANGUL SYLLABLE TYILG +D2DE;D2DE;1110 1174 11B1;D2DE;1110 1174 11B1; # (틞; 틞; 틞; 틞; 틞; ) HANGUL SYLLABLE TYILM +D2DF;D2DF;1110 1174 11B2;D2DF;1110 1174 11B2; # (틟; 틟; 틟; 틟; 틟; ) HANGUL SYLLABLE TYILB +D2E0;D2E0;1110 1174 11B3;D2E0;1110 1174 11B3; # (틠; 틠; 틠; 틠; 틠; ) HANGUL SYLLABLE TYILS +D2E1;D2E1;1110 1174 11B4;D2E1;1110 1174 11B4; # (틡; 틡; 틡; 틡; 틡; ) HANGUL SYLLABLE TYILT +D2E2;D2E2;1110 1174 11B5;D2E2;1110 1174 11B5; # (틢; 틢; 틢; 틢; 틢; ) HANGUL SYLLABLE TYILP +D2E3;D2E3;1110 1174 11B6;D2E3;1110 1174 11B6; # (틣; 틣; 틣; 틣; 틣; ) HANGUL SYLLABLE TYILH +D2E4;D2E4;1110 1174 11B7;D2E4;1110 1174 11B7; # (틤; 틤; 틤; 틤; 틤; ) HANGUL SYLLABLE TYIM +D2E5;D2E5;1110 1174 11B8;D2E5;1110 1174 11B8; # (틥; 틥; 틥; 틥; 틥; ) HANGUL SYLLABLE TYIB +D2E6;D2E6;1110 1174 11B9;D2E6;1110 1174 11B9; # (틦; 틦; 틦; 틦; 틦; ) HANGUL SYLLABLE TYIBS +D2E7;D2E7;1110 1174 11BA;D2E7;1110 1174 11BA; # (틧; 틧; 틧; 틧; 틧; ) HANGUL SYLLABLE TYIS +D2E8;D2E8;1110 1174 11BB;D2E8;1110 1174 11BB; # (틨; 틨; 틨; 틨; 틨; ) HANGUL SYLLABLE TYISS +D2E9;D2E9;1110 1174 11BC;D2E9;1110 1174 11BC; # (틩; 틩; 틩; 틩; 틩; ) HANGUL SYLLABLE TYING +D2EA;D2EA;1110 1174 11BD;D2EA;1110 1174 11BD; # (틪; 틪; 틪; 틪; 틪; ) HANGUL SYLLABLE TYIJ +D2EB;D2EB;1110 1174 11BE;D2EB;1110 1174 11BE; # (틫; 틫; 틫; 틫; 틫; ) HANGUL SYLLABLE TYIC +D2EC;D2EC;1110 1174 11BF;D2EC;1110 1174 11BF; # (틬; 틬; 틬; 틬; 틬; ) HANGUL SYLLABLE TYIK +D2ED;D2ED;1110 1174 11C0;D2ED;1110 1174 11C0; # (틭; 틭; 틭; 틭; 틭; ) HANGUL SYLLABLE TYIT +D2EE;D2EE;1110 1174 11C1;D2EE;1110 1174 11C1; # (틮; 틮; 틮; 틮; 틮; ) HANGUL SYLLABLE TYIP +D2EF;D2EF;1110 1174 11C2;D2EF;1110 1174 11C2; # (틯; 틯; 틯; 틯; 틯; ) HANGUL SYLLABLE TYIH +D2F0;D2F0;1110 1175;D2F0;1110 1175; # (티; 티; 티; 티; 티; ) HANGUL SYLLABLE TI +D2F1;D2F1;1110 1175 11A8;D2F1;1110 1175 11A8; # (틱; 틱; 틱; 틱; 틱; ) HANGUL SYLLABLE TIG +D2F2;D2F2;1110 1175 11A9;D2F2;1110 1175 11A9; # (틲; 틲; 틲; 틲; 틲; ) HANGUL SYLLABLE TIGG +D2F3;D2F3;1110 1175 11AA;D2F3;1110 1175 11AA; # (틳; 틳; 틳; 틳; 틳; ) HANGUL SYLLABLE TIGS +D2F4;D2F4;1110 1175 11AB;D2F4;1110 1175 11AB; # (틴; 틴; 틴; 틴; 틴; ) HANGUL SYLLABLE TIN +D2F5;D2F5;1110 1175 11AC;D2F5;1110 1175 11AC; # (틵; 틵; 틵; 틵; 틵; ) HANGUL SYLLABLE TINJ +D2F6;D2F6;1110 1175 11AD;D2F6;1110 1175 11AD; # (틶; 틶; 틶; 틶; 틶; ) HANGUL SYLLABLE TINH +D2F7;D2F7;1110 1175 11AE;D2F7;1110 1175 11AE; # (틷; 틷; 틷; 틷; 틷; ) HANGUL SYLLABLE TID +D2F8;D2F8;1110 1175 11AF;D2F8;1110 1175 11AF; # (틸; 틸; 틸; 틸; 틸; ) HANGUL SYLLABLE TIL +D2F9;D2F9;1110 1175 11B0;D2F9;1110 1175 11B0; # (틹; 틹; 틹; 틹; 틹; ) HANGUL SYLLABLE TILG +D2FA;D2FA;1110 1175 11B1;D2FA;1110 1175 11B1; # (틺; 틺; 틺; 틺; 틺; ) HANGUL SYLLABLE TILM +D2FB;D2FB;1110 1175 11B2;D2FB;1110 1175 11B2; # (틻; 틻; 틻; 틻; 틻; ) HANGUL SYLLABLE TILB +D2FC;D2FC;1110 1175 11B3;D2FC;1110 1175 11B3; # (틼; 틼; 틼; 틼; 틼; ) HANGUL SYLLABLE TILS +D2FD;D2FD;1110 1175 11B4;D2FD;1110 1175 11B4; # (틽; 틽; 틽; 틽; 틽; ) HANGUL SYLLABLE TILT +D2FE;D2FE;1110 1175 11B5;D2FE;1110 1175 11B5; # (틾; 틾; 틾; 틾; 틾; ) HANGUL SYLLABLE TILP +D2FF;D2FF;1110 1175 11B6;D2FF;1110 1175 11B6; # (틿; 틿; 틿; 틿; 틿; ) HANGUL SYLLABLE TILH +D300;D300;1110 1175 11B7;D300;1110 1175 11B7; # (팀; 팀; 팀; 팀; 팀; ) HANGUL SYLLABLE TIM +D301;D301;1110 1175 11B8;D301;1110 1175 11B8; # (팁; 팁; 팁; 팁; 팁; ) HANGUL SYLLABLE TIB +D302;D302;1110 1175 11B9;D302;1110 1175 11B9; # (팂; 팂; 팂; 팂; 팂; ) HANGUL SYLLABLE TIBS +D303;D303;1110 1175 11BA;D303;1110 1175 11BA; # (팃; 팃; 팃; 팃; 팃; ) HANGUL SYLLABLE TIS +D304;D304;1110 1175 11BB;D304;1110 1175 11BB; # (팄; 팄; 팄; 팄; 팄; ) HANGUL SYLLABLE TISS +D305;D305;1110 1175 11BC;D305;1110 1175 11BC; # (팅; 팅; 팅; 팅; 팅; ) HANGUL SYLLABLE TING +D306;D306;1110 1175 11BD;D306;1110 1175 11BD; # (팆; 팆; 팆; 팆; 팆; ) HANGUL SYLLABLE TIJ +D307;D307;1110 1175 11BE;D307;1110 1175 11BE; # (팇; 팇; 팇; 팇; 팇; ) HANGUL SYLLABLE TIC +D308;D308;1110 1175 11BF;D308;1110 1175 11BF; # (팈; 팈; 팈; 팈; 팈; ) HANGUL SYLLABLE TIK +D309;D309;1110 1175 11C0;D309;1110 1175 11C0; # (팉; 팉; 팉; 팉; 팉; ) HANGUL SYLLABLE TIT +D30A;D30A;1110 1175 11C1;D30A;1110 1175 11C1; # (팊; 팊; 팊; 팊; 팊; ) HANGUL SYLLABLE TIP +D30B;D30B;1110 1175 11C2;D30B;1110 1175 11C2; # (팋; 팋; 팋; 팋; 팋; ) HANGUL SYLLABLE TIH +D30C;D30C;1111 1161;D30C;1111 1161; # (파; 파; 파; 파; 파; ) HANGUL SYLLABLE PA +D30D;D30D;1111 1161 11A8;D30D;1111 1161 11A8; # (팍; 팍; 팍; 팍; 팍; ) HANGUL SYLLABLE PAG +D30E;D30E;1111 1161 11A9;D30E;1111 1161 11A9; # (팎; 팎; 팎; 팎; 팎; ) HANGUL SYLLABLE PAGG +D30F;D30F;1111 1161 11AA;D30F;1111 1161 11AA; # (팏; 팏; 팏; 팏; 팏; ) HANGUL SYLLABLE PAGS +D310;D310;1111 1161 11AB;D310;1111 1161 11AB; # (판; 판; 판; 판; 판; ) HANGUL SYLLABLE PAN +D311;D311;1111 1161 11AC;D311;1111 1161 11AC; # (팑; 팑; 팑; 팑; 팑; ) HANGUL SYLLABLE PANJ +D312;D312;1111 1161 11AD;D312;1111 1161 11AD; # (팒; 팒; 팒; 팒; 팒; ) HANGUL SYLLABLE PANH +D313;D313;1111 1161 11AE;D313;1111 1161 11AE; # (팓; 팓; 팓; 팓; 팓; ) HANGUL SYLLABLE PAD +D314;D314;1111 1161 11AF;D314;1111 1161 11AF; # (팔; 팔; 팔; 팔; 팔; ) HANGUL SYLLABLE PAL +D315;D315;1111 1161 11B0;D315;1111 1161 11B0; # (팕; 팕; 팕; 팕; 팕; ) HANGUL SYLLABLE PALG +D316;D316;1111 1161 11B1;D316;1111 1161 11B1; # (팖; 팖; 팖; 팖; 팖; ) HANGUL SYLLABLE PALM +D317;D317;1111 1161 11B2;D317;1111 1161 11B2; # (팗; 팗; 팗; 팗; 팗; ) HANGUL SYLLABLE PALB +D318;D318;1111 1161 11B3;D318;1111 1161 11B3; # (팘; 팘; 팘; 팘; 팘; ) HANGUL SYLLABLE PALS +D319;D319;1111 1161 11B4;D319;1111 1161 11B4; # (팙; 팙; 팙; 팙; 팙; ) HANGUL SYLLABLE PALT +D31A;D31A;1111 1161 11B5;D31A;1111 1161 11B5; # (팚; 팚; 팚; 팚; 팚; ) HANGUL SYLLABLE PALP +D31B;D31B;1111 1161 11B6;D31B;1111 1161 11B6; # (팛; 팛; 팛; 팛; 팛; ) HANGUL SYLLABLE PALH +D31C;D31C;1111 1161 11B7;D31C;1111 1161 11B7; # (팜; 팜; 팜; 팜; 팜; ) HANGUL SYLLABLE PAM +D31D;D31D;1111 1161 11B8;D31D;1111 1161 11B8; # (팝; 팝; 팝; 팝; 팝; ) HANGUL SYLLABLE PAB +D31E;D31E;1111 1161 11B9;D31E;1111 1161 11B9; # (팞; 팞; 팞; 팞; 팞; ) HANGUL SYLLABLE PABS +D31F;D31F;1111 1161 11BA;D31F;1111 1161 11BA; # (팟; 팟; 팟; 팟; 팟; ) HANGUL SYLLABLE PAS +D320;D320;1111 1161 11BB;D320;1111 1161 11BB; # (팠; 팠; 팠; 팠; 팠; ) HANGUL SYLLABLE PASS +D321;D321;1111 1161 11BC;D321;1111 1161 11BC; # (팡; 팡; 팡; 팡; 팡; ) HANGUL SYLLABLE PANG +D322;D322;1111 1161 11BD;D322;1111 1161 11BD; # (팢; 팢; 팢; 팢; 팢; ) HANGUL SYLLABLE PAJ +D323;D323;1111 1161 11BE;D323;1111 1161 11BE; # (팣; 팣; 팣; 팣; 팣; ) HANGUL SYLLABLE PAC +D324;D324;1111 1161 11BF;D324;1111 1161 11BF; # (팤; 팤; 팤; 팤; 팤; ) HANGUL SYLLABLE PAK +D325;D325;1111 1161 11C0;D325;1111 1161 11C0; # (팥; 팥; 팥; 팥; 팥; ) HANGUL SYLLABLE PAT +D326;D326;1111 1161 11C1;D326;1111 1161 11C1; # (팦; 팦; 팦; 팦; 팦; ) HANGUL SYLLABLE PAP +D327;D327;1111 1161 11C2;D327;1111 1161 11C2; # (팧; 팧; 팧; 팧; 팧; ) HANGUL SYLLABLE PAH +D328;D328;1111 1162;D328;1111 1162; # (패; 패; 패; 패; 패; ) HANGUL SYLLABLE PAE +D329;D329;1111 1162 11A8;D329;1111 1162 11A8; # (팩; 팩; 팩; 팩; 팩; ) HANGUL SYLLABLE PAEG +D32A;D32A;1111 1162 11A9;D32A;1111 1162 11A9; # (팪; 팪; 팪; 팪; 팪; ) HANGUL SYLLABLE PAEGG +D32B;D32B;1111 1162 11AA;D32B;1111 1162 11AA; # (팫; 팫; 팫; 팫; 팫; ) HANGUL SYLLABLE PAEGS +D32C;D32C;1111 1162 11AB;D32C;1111 1162 11AB; # (팬; 팬; 팬; 팬; 팬; ) HANGUL SYLLABLE PAEN +D32D;D32D;1111 1162 11AC;D32D;1111 1162 11AC; # (팭; 팭; 팭; 팭; 팭; ) HANGUL SYLLABLE PAENJ +D32E;D32E;1111 1162 11AD;D32E;1111 1162 11AD; # (팮; 팮; 팮; 팮; 팮; ) HANGUL SYLLABLE PAENH +D32F;D32F;1111 1162 11AE;D32F;1111 1162 11AE; # (팯; 팯; 팯; 팯; 팯; ) HANGUL SYLLABLE PAED +D330;D330;1111 1162 11AF;D330;1111 1162 11AF; # (팰; 팰; 팰; 팰; 팰; ) HANGUL SYLLABLE PAEL +D331;D331;1111 1162 11B0;D331;1111 1162 11B0; # (팱; 팱; 팱; 팱; 팱; ) HANGUL SYLLABLE PAELG +D332;D332;1111 1162 11B1;D332;1111 1162 11B1; # (팲; 팲; 팲; 팲; 팲; ) HANGUL SYLLABLE PAELM +D333;D333;1111 1162 11B2;D333;1111 1162 11B2; # (팳; 팳; 팳; 팳; 팳; ) HANGUL SYLLABLE PAELB +D334;D334;1111 1162 11B3;D334;1111 1162 11B3; # (팴; 팴; 팴; 팴; 팴; ) HANGUL SYLLABLE PAELS +D335;D335;1111 1162 11B4;D335;1111 1162 11B4; # (팵; 팵; 팵; 팵; 팵; ) HANGUL SYLLABLE PAELT +D336;D336;1111 1162 11B5;D336;1111 1162 11B5; # (팶; 팶; 팶; 팶; 팶; ) HANGUL SYLLABLE PAELP +D337;D337;1111 1162 11B6;D337;1111 1162 11B6; # (팷; 팷; 팷; 팷; 팷; ) HANGUL SYLLABLE PAELH +D338;D338;1111 1162 11B7;D338;1111 1162 11B7; # (팸; 팸; 팸; 팸; 팸; ) HANGUL SYLLABLE PAEM +D339;D339;1111 1162 11B8;D339;1111 1162 11B8; # (팹; 팹; 팹; 팹; 팹; ) HANGUL SYLLABLE PAEB +D33A;D33A;1111 1162 11B9;D33A;1111 1162 11B9; # (팺; 팺; 팺; 팺; 팺; ) HANGUL SYLLABLE PAEBS +D33B;D33B;1111 1162 11BA;D33B;1111 1162 11BA; # (팻; 팻; 팻; 팻; 팻; ) HANGUL SYLLABLE PAES +D33C;D33C;1111 1162 11BB;D33C;1111 1162 11BB; # (팼; 팼; 팼; 팼; 팼; ) HANGUL SYLLABLE PAESS +D33D;D33D;1111 1162 11BC;D33D;1111 1162 11BC; # (팽; 팽; 팽; 팽; 팽; ) HANGUL SYLLABLE PAENG +D33E;D33E;1111 1162 11BD;D33E;1111 1162 11BD; # (팾; 팾; 팾; 팾; 팾; ) HANGUL SYLLABLE PAEJ +D33F;D33F;1111 1162 11BE;D33F;1111 1162 11BE; # (팿; 팿; 팿; 팿; 팿; ) HANGUL SYLLABLE PAEC +D340;D340;1111 1162 11BF;D340;1111 1162 11BF; # (퍀; 퍀; 퍀; 퍀; 퍀; ) HANGUL SYLLABLE PAEK +D341;D341;1111 1162 11C0;D341;1111 1162 11C0; # (퍁; 퍁; 퍁; 퍁; 퍁; ) HANGUL SYLLABLE PAET +D342;D342;1111 1162 11C1;D342;1111 1162 11C1; # (퍂; 퍂; 퍂; 퍂; 퍂; ) HANGUL SYLLABLE PAEP +D343;D343;1111 1162 11C2;D343;1111 1162 11C2; # (퍃; 퍃; 퍃; 퍃; 퍃; ) HANGUL SYLLABLE PAEH +D344;D344;1111 1163;D344;1111 1163; # (퍄; 퍄; 퍄; 퍄; 퍄; ) HANGUL SYLLABLE PYA +D345;D345;1111 1163 11A8;D345;1111 1163 11A8; # (퍅; 퍅; 퍅; 퍅; 퍅; ) HANGUL SYLLABLE PYAG +D346;D346;1111 1163 11A9;D346;1111 1163 11A9; # (퍆; 퍆; 퍆; 퍆; 퍆; ) HANGUL SYLLABLE PYAGG +D347;D347;1111 1163 11AA;D347;1111 1163 11AA; # (퍇; 퍇; 퍇; 퍇; 퍇; ) HANGUL SYLLABLE PYAGS +D348;D348;1111 1163 11AB;D348;1111 1163 11AB; # (퍈; 퍈; 퍈; 퍈; 퍈; ) HANGUL SYLLABLE PYAN +D349;D349;1111 1163 11AC;D349;1111 1163 11AC; # (퍉; 퍉; 퍉; 퍉; 퍉; ) HANGUL SYLLABLE PYANJ +D34A;D34A;1111 1163 11AD;D34A;1111 1163 11AD; # (퍊; 퍊; 퍊; 퍊; 퍊; ) HANGUL SYLLABLE PYANH +D34B;D34B;1111 1163 11AE;D34B;1111 1163 11AE; # (퍋; 퍋; 퍋; 퍋; 퍋; ) HANGUL SYLLABLE PYAD +D34C;D34C;1111 1163 11AF;D34C;1111 1163 11AF; # (퍌; 퍌; 퍌; 퍌; 퍌; ) HANGUL SYLLABLE PYAL +D34D;D34D;1111 1163 11B0;D34D;1111 1163 11B0; # (퍍; 퍍; 퍍; 퍍; 퍍; ) HANGUL SYLLABLE PYALG +D34E;D34E;1111 1163 11B1;D34E;1111 1163 11B1; # (퍎; 퍎; 퍎; 퍎; 퍎; ) HANGUL SYLLABLE PYALM +D34F;D34F;1111 1163 11B2;D34F;1111 1163 11B2; # (퍏; 퍏; 퍏; 퍏; 퍏; ) HANGUL SYLLABLE PYALB +D350;D350;1111 1163 11B3;D350;1111 1163 11B3; # (퍐; 퍐; 퍐; 퍐; 퍐; ) HANGUL SYLLABLE PYALS +D351;D351;1111 1163 11B4;D351;1111 1163 11B4; # (퍑; 퍑; 퍑; 퍑; 퍑; ) HANGUL SYLLABLE PYALT +D352;D352;1111 1163 11B5;D352;1111 1163 11B5; # (퍒; 퍒; 퍒; 퍒; 퍒; ) HANGUL SYLLABLE PYALP +D353;D353;1111 1163 11B6;D353;1111 1163 11B6; # (퍓; 퍓; 퍓; 퍓; 퍓; ) HANGUL SYLLABLE PYALH +D354;D354;1111 1163 11B7;D354;1111 1163 11B7; # (퍔; 퍔; 퍔; 퍔; 퍔; ) HANGUL SYLLABLE PYAM +D355;D355;1111 1163 11B8;D355;1111 1163 11B8; # (퍕; 퍕; 퍕; 퍕; 퍕; ) HANGUL SYLLABLE PYAB +D356;D356;1111 1163 11B9;D356;1111 1163 11B9; # (퍖; 퍖; 퍖; 퍖; 퍖; ) HANGUL SYLLABLE PYABS +D357;D357;1111 1163 11BA;D357;1111 1163 11BA; # (퍗; 퍗; 퍗; 퍗; 퍗; ) HANGUL SYLLABLE PYAS +D358;D358;1111 1163 11BB;D358;1111 1163 11BB; # (퍘; 퍘; 퍘; 퍘; 퍘; ) HANGUL SYLLABLE PYASS +D359;D359;1111 1163 11BC;D359;1111 1163 11BC; # (퍙; 퍙; 퍙; 퍙; 퍙; ) HANGUL SYLLABLE PYANG +D35A;D35A;1111 1163 11BD;D35A;1111 1163 11BD; # (퍚; 퍚; 퍚; 퍚; 퍚; ) HANGUL SYLLABLE PYAJ +D35B;D35B;1111 1163 11BE;D35B;1111 1163 11BE; # (퍛; 퍛; 퍛; 퍛; 퍛; ) HANGUL SYLLABLE PYAC +D35C;D35C;1111 1163 11BF;D35C;1111 1163 11BF; # (퍜; 퍜; 퍜; 퍜; 퍜; ) HANGUL SYLLABLE PYAK +D35D;D35D;1111 1163 11C0;D35D;1111 1163 11C0; # (퍝; 퍝; 퍝; 퍝; 퍝; ) HANGUL SYLLABLE PYAT +D35E;D35E;1111 1163 11C1;D35E;1111 1163 11C1; # (퍞; 퍞; 퍞; 퍞; 퍞; ) HANGUL SYLLABLE PYAP +D35F;D35F;1111 1163 11C2;D35F;1111 1163 11C2; # (퍟; 퍟; 퍟; 퍟; 퍟; ) HANGUL SYLLABLE PYAH +D360;D360;1111 1164;D360;1111 1164; # (퍠; 퍠; 퍠; 퍠; 퍠; ) HANGUL SYLLABLE PYAE +D361;D361;1111 1164 11A8;D361;1111 1164 11A8; # (퍡; 퍡; 퍡; 퍡; 퍡; ) HANGUL SYLLABLE PYAEG +D362;D362;1111 1164 11A9;D362;1111 1164 11A9; # (퍢; 퍢; 퍢; 퍢; 퍢; ) HANGUL SYLLABLE PYAEGG +D363;D363;1111 1164 11AA;D363;1111 1164 11AA; # (퍣; 퍣; 퍣; 퍣; 퍣; ) HANGUL SYLLABLE PYAEGS +D364;D364;1111 1164 11AB;D364;1111 1164 11AB; # (퍤; 퍤; 퍤; 퍤; 퍤; ) HANGUL SYLLABLE PYAEN +D365;D365;1111 1164 11AC;D365;1111 1164 11AC; # (퍥; 퍥; 퍥; 퍥; 퍥; ) HANGUL SYLLABLE PYAENJ +D366;D366;1111 1164 11AD;D366;1111 1164 11AD; # (퍦; 퍦; 퍦; 퍦; 퍦; ) HANGUL SYLLABLE PYAENH +D367;D367;1111 1164 11AE;D367;1111 1164 11AE; # (퍧; 퍧; 퍧; 퍧; 퍧; ) HANGUL SYLLABLE PYAED +D368;D368;1111 1164 11AF;D368;1111 1164 11AF; # (퍨; 퍨; 퍨; 퍨; 퍨; ) HANGUL SYLLABLE PYAEL +D369;D369;1111 1164 11B0;D369;1111 1164 11B0; # (퍩; 퍩; 퍩; 퍩; 퍩; ) HANGUL SYLLABLE PYAELG +D36A;D36A;1111 1164 11B1;D36A;1111 1164 11B1; # (퍪; 퍪; 퍪; 퍪; 퍪; ) HANGUL SYLLABLE PYAELM +D36B;D36B;1111 1164 11B2;D36B;1111 1164 11B2; # (퍫; 퍫; 퍫; 퍫; 퍫; ) HANGUL SYLLABLE PYAELB +D36C;D36C;1111 1164 11B3;D36C;1111 1164 11B3; # (퍬; 퍬; 퍬; 퍬; 퍬; ) HANGUL SYLLABLE PYAELS +D36D;D36D;1111 1164 11B4;D36D;1111 1164 11B4; # (퍭; 퍭; 퍭; 퍭; 퍭; ) HANGUL SYLLABLE PYAELT +D36E;D36E;1111 1164 11B5;D36E;1111 1164 11B5; # (퍮; 퍮; 퍮; 퍮; 퍮; ) HANGUL SYLLABLE PYAELP +D36F;D36F;1111 1164 11B6;D36F;1111 1164 11B6; # (퍯; 퍯; 퍯; 퍯; 퍯; ) HANGUL SYLLABLE PYAELH +D370;D370;1111 1164 11B7;D370;1111 1164 11B7; # (퍰; 퍰; 퍰; 퍰; 퍰; ) HANGUL SYLLABLE PYAEM +D371;D371;1111 1164 11B8;D371;1111 1164 11B8; # (퍱; 퍱; 퍱; 퍱; 퍱; ) HANGUL SYLLABLE PYAEB +D372;D372;1111 1164 11B9;D372;1111 1164 11B9; # (퍲; 퍲; 퍲; 퍲; 퍲; ) HANGUL SYLLABLE PYAEBS +D373;D373;1111 1164 11BA;D373;1111 1164 11BA; # (퍳; 퍳; 퍳; 퍳; 퍳; ) HANGUL SYLLABLE PYAES +D374;D374;1111 1164 11BB;D374;1111 1164 11BB; # (퍴; 퍴; 퍴; 퍴; 퍴; ) HANGUL SYLLABLE PYAESS +D375;D375;1111 1164 11BC;D375;1111 1164 11BC; # (퍵; 퍵; 퍵; 퍵; 퍵; ) HANGUL SYLLABLE PYAENG +D376;D376;1111 1164 11BD;D376;1111 1164 11BD; # (퍶; 퍶; 퍶; 퍶; 퍶; ) HANGUL SYLLABLE PYAEJ +D377;D377;1111 1164 11BE;D377;1111 1164 11BE; # (퍷; 퍷; 퍷; 퍷; 퍷; ) HANGUL SYLLABLE PYAEC +D378;D378;1111 1164 11BF;D378;1111 1164 11BF; # (퍸; 퍸; 퍸; 퍸; 퍸; ) HANGUL SYLLABLE PYAEK +D379;D379;1111 1164 11C0;D379;1111 1164 11C0; # (퍹; 퍹; 퍹; 퍹; 퍹; ) HANGUL SYLLABLE PYAET +D37A;D37A;1111 1164 11C1;D37A;1111 1164 11C1; # (퍺; 퍺; 퍺; 퍺; 퍺; ) HANGUL SYLLABLE PYAEP +D37B;D37B;1111 1164 11C2;D37B;1111 1164 11C2; # (퍻; 퍻; 퍻; 퍻; 퍻; ) HANGUL SYLLABLE PYAEH +D37C;D37C;1111 1165;D37C;1111 1165; # (퍼; 퍼; 퍼; 퍼; 퍼; ) HANGUL SYLLABLE PEO +D37D;D37D;1111 1165 11A8;D37D;1111 1165 11A8; # (퍽; 퍽; 퍽; 퍽; 퍽; ) HANGUL SYLLABLE PEOG +D37E;D37E;1111 1165 11A9;D37E;1111 1165 11A9; # (퍾; 퍾; 퍾; 퍾; 퍾; ) HANGUL SYLLABLE PEOGG +D37F;D37F;1111 1165 11AA;D37F;1111 1165 11AA; # (퍿; 퍿; 퍿; 퍿; 퍿; ) HANGUL SYLLABLE PEOGS +D380;D380;1111 1165 11AB;D380;1111 1165 11AB; # (펀; 펀; 펀; 펀; 펀; ) HANGUL SYLLABLE PEON +D381;D381;1111 1165 11AC;D381;1111 1165 11AC; # (펁; 펁; 펁; 펁; 펁; ) HANGUL SYLLABLE PEONJ +D382;D382;1111 1165 11AD;D382;1111 1165 11AD; # (펂; 펂; 펂; 펂; 펂; ) HANGUL SYLLABLE PEONH +D383;D383;1111 1165 11AE;D383;1111 1165 11AE; # (펃; 펃; 펃; 펃; 펃; ) HANGUL SYLLABLE PEOD +D384;D384;1111 1165 11AF;D384;1111 1165 11AF; # (펄; 펄; 펄; 펄; 펄; ) HANGUL SYLLABLE PEOL +D385;D385;1111 1165 11B0;D385;1111 1165 11B0; # (펅; 펅; 펅; 펅; 펅; ) HANGUL SYLLABLE PEOLG +D386;D386;1111 1165 11B1;D386;1111 1165 11B1; # (펆; 펆; 펆; 펆; 펆; ) HANGUL SYLLABLE PEOLM +D387;D387;1111 1165 11B2;D387;1111 1165 11B2; # (펇; 펇; 펇; 펇; 펇; ) HANGUL SYLLABLE PEOLB +D388;D388;1111 1165 11B3;D388;1111 1165 11B3; # (펈; 펈; 펈; 펈; 펈; ) HANGUL SYLLABLE PEOLS +D389;D389;1111 1165 11B4;D389;1111 1165 11B4; # (펉; 펉; 펉; 펉; 펉; ) HANGUL SYLLABLE PEOLT +D38A;D38A;1111 1165 11B5;D38A;1111 1165 11B5; # (펊; 펊; 펊; 펊; 펊; ) HANGUL SYLLABLE PEOLP +D38B;D38B;1111 1165 11B6;D38B;1111 1165 11B6; # (펋; 펋; 펋; 펋; 펋; ) HANGUL SYLLABLE PEOLH +D38C;D38C;1111 1165 11B7;D38C;1111 1165 11B7; # (펌; 펌; 펌; 펌; 펌; ) HANGUL SYLLABLE PEOM +D38D;D38D;1111 1165 11B8;D38D;1111 1165 11B8; # (펍; 펍; 펍; 펍; 펍; ) HANGUL SYLLABLE PEOB +D38E;D38E;1111 1165 11B9;D38E;1111 1165 11B9; # (펎; 펎; 펎; 펎; 펎; ) HANGUL SYLLABLE PEOBS +D38F;D38F;1111 1165 11BA;D38F;1111 1165 11BA; # (펏; 펏; 펏; 펏; 펏; ) HANGUL SYLLABLE PEOS +D390;D390;1111 1165 11BB;D390;1111 1165 11BB; # (펐; 펐; 펐; 펐; 펐; ) HANGUL SYLLABLE PEOSS +D391;D391;1111 1165 11BC;D391;1111 1165 11BC; # (펑; 펑; 펑; 펑; 펑; ) HANGUL SYLLABLE PEONG +D392;D392;1111 1165 11BD;D392;1111 1165 11BD; # (펒; 펒; 펒; 펒; 펒; ) HANGUL SYLLABLE PEOJ +D393;D393;1111 1165 11BE;D393;1111 1165 11BE; # (펓; 펓; 펓; 펓; 펓; ) HANGUL SYLLABLE PEOC +D394;D394;1111 1165 11BF;D394;1111 1165 11BF; # (펔; 펔; 펔; 펔; 펔; ) HANGUL SYLLABLE PEOK +D395;D395;1111 1165 11C0;D395;1111 1165 11C0; # (펕; 펕; 펕; 펕; 펕; ) HANGUL SYLLABLE PEOT +D396;D396;1111 1165 11C1;D396;1111 1165 11C1; # (펖; 펖; 펖; 펖; 펖; ) HANGUL SYLLABLE PEOP +D397;D397;1111 1165 11C2;D397;1111 1165 11C2; # (펗; 펗; 펗; 펗; 펗; ) HANGUL SYLLABLE PEOH +D398;D398;1111 1166;D398;1111 1166; # (페; 페; 페; 페; 페; ) HANGUL SYLLABLE PE +D399;D399;1111 1166 11A8;D399;1111 1166 11A8; # (펙; 펙; 펙; 펙; 펙; ) HANGUL SYLLABLE PEG +D39A;D39A;1111 1166 11A9;D39A;1111 1166 11A9; # (펚; 펚; 펚; 펚; 펚; ) HANGUL SYLLABLE PEGG +D39B;D39B;1111 1166 11AA;D39B;1111 1166 11AA; # (펛; 펛; 펛; 펛; 펛; ) HANGUL SYLLABLE PEGS +D39C;D39C;1111 1166 11AB;D39C;1111 1166 11AB; # (펜; 펜; 펜; 펜; 펜; ) HANGUL SYLLABLE PEN +D39D;D39D;1111 1166 11AC;D39D;1111 1166 11AC; # (펝; 펝; 펝; 펝; 펝; ) HANGUL SYLLABLE PENJ +D39E;D39E;1111 1166 11AD;D39E;1111 1166 11AD; # (펞; 펞; 펞; 펞; 펞; ) HANGUL SYLLABLE PENH +D39F;D39F;1111 1166 11AE;D39F;1111 1166 11AE; # (펟; 펟; 펟; 펟; 펟; ) HANGUL SYLLABLE PED +D3A0;D3A0;1111 1166 11AF;D3A0;1111 1166 11AF; # (펠; 펠; 펠; 펠; 펠; ) HANGUL SYLLABLE PEL +D3A1;D3A1;1111 1166 11B0;D3A1;1111 1166 11B0; # (펡; 펡; 펡; 펡; 펡; ) HANGUL SYLLABLE PELG +D3A2;D3A2;1111 1166 11B1;D3A2;1111 1166 11B1; # (펢; 펢; 펢; 펢; 펢; ) HANGUL SYLLABLE PELM +D3A3;D3A3;1111 1166 11B2;D3A3;1111 1166 11B2; # (펣; 펣; 펣; 펣; 펣; ) HANGUL SYLLABLE PELB +D3A4;D3A4;1111 1166 11B3;D3A4;1111 1166 11B3; # (펤; 펤; 펤; 펤; 펤; ) HANGUL SYLLABLE PELS +D3A5;D3A5;1111 1166 11B4;D3A5;1111 1166 11B4; # (펥; 펥; 펥; 펥; 펥; ) HANGUL SYLLABLE PELT +D3A6;D3A6;1111 1166 11B5;D3A6;1111 1166 11B5; # (펦; 펦; 펦; 펦; 펦; ) HANGUL SYLLABLE PELP +D3A7;D3A7;1111 1166 11B6;D3A7;1111 1166 11B6; # (펧; 펧; 펧; 펧; 펧; ) HANGUL SYLLABLE PELH +D3A8;D3A8;1111 1166 11B7;D3A8;1111 1166 11B7; # (펨; 펨; 펨; 펨; 펨; ) HANGUL SYLLABLE PEM +D3A9;D3A9;1111 1166 11B8;D3A9;1111 1166 11B8; # (펩; 펩; 펩; 펩; 펩; ) HANGUL SYLLABLE PEB +D3AA;D3AA;1111 1166 11B9;D3AA;1111 1166 11B9; # (펪; 펪; 펪; 펪; 펪; ) HANGUL SYLLABLE PEBS +D3AB;D3AB;1111 1166 11BA;D3AB;1111 1166 11BA; # (펫; 펫; 펫; 펫; 펫; ) HANGUL SYLLABLE PES +D3AC;D3AC;1111 1166 11BB;D3AC;1111 1166 11BB; # (펬; 펬; 펬; 펬; 펬; ) HANGUL SYLLABLE PESS +D3AD;D3AD;1111 1166 11BC;D3AD;1111 1166 11BC; # (펭; 펭; 펭; 펭; 펭; ) HANGUL SYLLABLE PENG +D3AE;D3AE;1111 1166 11BD;D3AE;1111 1166 11BD; # (펮; 펮; 펮; 펮; 펮; ) HANGUL SYLLABLE PEJ +D3AF;D3AF;1111 1166 11BE;D3AF;1111 1166 11BE; # (펯; 펯; 펯; 펯; 펯; ) HANGUL SYLLABLE PEC +D3B0;D3B0;1111 1166 11BF;D3B0;1111 1166 11BF; # (펰; 펰; 펰; 펰; 펰; ) HANGUL SYLLABLE PEK +D3B1;D3B1;1111 1166 11C0;D3B1;1111 1166 11C0; # (펱; 펱; 펱; 펱; 펱; ) HANGUL SYLLABLE PET +D3B2;D3B2;1111 1166 11C1;D3B2;1111 1166 11C1; # (펲; 펲; 펲; 펲; 펲; ) HANGUL SYLLABLE PEP +D3B3;D3B3;1111 1166 11C2;D3B3;1111 1166 11C2; # (펳; 펳; 펳; 펳; 펳; ) HANGUL SYLLABLE PEH +D3B4;D3B4;1111 1167;D3B4;1111 1167; # (펴; 펴; 펴; 펴; 펴; ) HANGUL SYLLABLE PYEO +D3B5;D3B5;1111 1167 11A8;D3B5;1111 1167 11A8; # (펵; 펵; 펵; 펵; 펵; ) HANGUL SYLLABLE PYEOG +D3B6;D3B6;1111 1167 11A9;D3B6;1111 1167 11A9; # (펶; 펶; 펶; 펶; 펶; ) HANGUL SYLLABLE PYEOGG +D3B7;D3B7;1111 1167 11AA;D3B7;1111 1167 11AA; # (펷; 펷; 펷; 펷; 펷; ) HANGUL SYLLABLE PYEOGS +D3B8;D3B8;1111 1167 11AB;D3B8;1111 1167 11AB; # (편; 편; 편; 편; 편; ) HANGUL SYLLABLE PYEON +D3B9;D3B9;1111 1167 11AC;D3B9;1111 1167 11AC; # (펹; 펹; 펹; 펹; 펹; ) HANGUL SYLLABLE PYEONJ +D3BA;D3BA;1111 1167 11AD;D3BA;1111 1167 11AD; # (펺; 펺; 펺; 펺; 펺; ) HANGUL SYLLABLE PYEONH +D3BB;D3BB;1111 1167 11AE;D3BB;1111 1167 11AE; # (펻; 펻; 펻; 펻; 펻; ) HANGUL SYLLABLE PYEOD +D3BC;D3BC;1111 1167 11AF;D3BC;1111 1167 11AF; # (펼; 펼; 펼; 펼; 펼; ) HANGUL SYLLABLE PYEOL +D3BD;D3BD;1111 1167 11B0;D3BD;1111 1167 11B0; # (펽; 펽; 펽; 펽; 펽; ) HANGUL SYLLABLE PYEOLG +D3BE;D3BE;1111 1167 11B1;D3BE;1111 1167 11B1; # (펾; 펾; 펾; 펾; 펾; ) HANGUL SYLLABLE PYEOLM +D3BF;D3BF;1111 1167 11B2;D3BF;1111 1167 11B2; # (펿; 펿; 펿; 펿; 펿; ) HANGUL SYLLABLE PYEOLB +D3C0;D3C0;1111 1167 11B3;D3C0;1111 1167 11B3; # (폀; 폀; 폀; 폀; 폀; ) HANGUL SYLLABLE PYEOLS +D3C1;D3C1;1111 1167 11B4;D3C1;1111 1167 11B4; # (폁; 폁; 폁; 폁; 폁; ) HANGUL SYLLABLE PYEOLT +D3C2;D3C2;1111 1167 11B5;D3C2;1111 1167 11B5; # (폂; 폂; 폂; 폂; 폂; ) HANGUL SYLLABLE PYEOLP +D3C3;D3C3;1111 1167 11B6;D3C3;1111 1167 11B6; # (폃; 폃; 폃; 폃; 폃; ) HANGUL SYLLABLE PYEOLH +D3C4;D3C4;1111 1167 11B7;D3C4;1111 1167 11B7; # (폄; 폄; 폄; 폄; 폄; ) HANGUL SYLLABLE PYEOM +D3C5;D3C5;1111 1167 11B8;D3C5;1111 1167 11B8; # (폅; 폅; 폅; 폅; 폅; ) HANGUL SYLLABLE PYEOB +D3C6;D3C6;1111 1167 11B9;D3C6;1111 1167 11B9; # (폆; 폆; 폆; 폆; 폆; ) HANGUL SYLLABLE PYEOBS +D3C7;D3C7;1111 1167 11BA;D3C7;1111 1167 11BA; # (폇; 폇; 폇; 폇; 폇; ) HANGUL SYLLABLE PYEOS +D3C8;D3C8;1111 1167 11BB;D3C8;1111 1167 11BB; # (폈; 폈; 폈; 폈; 폈; ) HANGUL SYLLABLE PYEOSS +D3C9;D3C9;1111 1167 11BC;D3C9;1111 1167 11BC; # (평; 평; 평; 평; 평; ) HANGUL SYLLABLE PYEONG +D3CA;D3CA;1111 1167 11BD;D3CA;1111 1167 11BD; # (폊; 폊; 폊; 폊; 폊; ) HANGUL SYLLABLE PYEOJ +D3CB;D3CB;1111 1167 11BE;D3CB;1111 1167 11BE; # (폋; 폋; 폋; 폋; 폋; ) HANGUL SYLLABLE PYEOC +D3CC;D3CC;1111 1167 11BF;D3CC;1111 1167 11BF; # (폌; 폌; 폌; 폌; 폌; ) HANGUL SYLLABLE PYEOK +D3CD;D3CD;1111 1167 11C0;D3CD;1111 1167 11C0; # (폍; 폍; 폍; 폍; 폍; ) HANGUL SYLLABLE PYEOT +D3CE;D3CE;1111 1167 11C1;D3CE;1111 1167 11C1; # (폎; 폎; 폎; 폎; 폎; ) HANGUL SYLLABLE PYEOP +D3CF;D3CF;1111 1167 11C2;D3CF;1111 1167 11C2; # (폏; 폏; 폏; 폏; 폏; ) HANGUL SYLLABLE PYEOH +D3D0;D3D0;1111 1168;D3D0;1111 1168; # (폐; 폐; 폐; 폐; 폐; ) HANGUL SYLLABLE PYE +D3D1;D3D1;1111 1168 11A8;D3D1;1111 1168 11A8; # (폑; 폑; 폑; 폑; 폑; ) HANGUL SYLLABLE PYEG +D3D2;D3D2;1111 1168 11A9;D3D2;1111 1168 11A9; # (폒; 폒; 폒; 폒; 폒; ) HANGUL SYLLABLE PYEGG +D3D3;D3D3;1111 1168 11AA;D3D3;1111 1168 11AA; # (폓; 폓; 폓; 폓; 폓; ) HANGUL SYLLABLE PYEGS +D3D4;D3D4;1111 1168 11AB;D3D4;1111 1168 11AB; # (폔; 폔; 폔; 폔; 폔; ) HANGUL SYLLABLE PYEN +D3D5;D3D5;1111 1168 11AC;D3D5;1111 1168 11AC; # (폕; 폕; 폕; 폕; 폕; ) HANGUL SYLLABLE PYENJ +D3D6;D3D6;1111 1168 11AD;D3D6;1111 1168 11AD; # (폖; 폖; 폖; 폖; 폖; ) HANGUL SYLLABLE PYENH +D3D7;D3D7;1111 1168 11AE;D3D7;1111 1168 11AE; # (폗; 폗; 폗; 폗; 폗; ) HANGUL SYLLABLE PYED +D3D8;D3D8;1111 1168 11AF;D3D8;1111 1168 11AF; # (폘; 폘; 폘; 폘; 폘; ) HANGUL SYLLABLE PYEL +D3D9;D3D9;1111 1168 11B0;D3D9;1111 1168 11B0; # (폙; 폙; 폙; 폙; 폙; ) HANGUL SYLLABLE PYELG +D3DA;D3DA;1111 1168 11B1;D3DA;1111 1168 11B1; # (폚; 폚; 폚; 폚; 폚; ) HANGUL SYLLABLE PYELM +D3DB;D3DB;1111 1168 11B2;D3DB;1111 1168 11B2; # (폛; 폛; 폛; 폛; 폛; ) HANGUL SYLLABLE PYELB +D3DC;D3DC;1111 1168 11B3;D3DC;1111 1168 11B3; # (폜; 폜; 폜; 폜; 폜; ) HANGUL SYLLABLE PYELS +D3DD;D3DD;1111 1168 11B4;D3DD;1111 1168 11B4; # (폝; 폝; 폝; 폝; 폝; ) HANGUL SYLLABLE PYELT +D3DE;D3DE;1111 1168 11B5;D3DE;1111 1168 11B5; # (폞; 폞; 폞; 폞; 폞; ) HANGUL SYLLABLE PYELP +D3DF;D3DF;1111 1168 11B6;D3DF;1111 1168 11B6; # (폟; 폟; 폟; 폟; 폟; ) HANGUL SYLLABLE PYELH +D3E0;D3E0;1111 1168 11B7;D3E0;1111 1168 11B7; # (폠; 폠; 폠; 폠; 폠; ) HANGUL SYLLABLE PYEM +D3E1;D3E1;1111 1168 11B8;D3E1;1111 1168 11B8; # (폡; 폡; 폡; 폡; 폡; ) HANGUL SYLLABLE PYEB +D3E2;D3E2;1111 1168 11B9;D3E2;1111 1168 11B9; # (폢; 폢; 폢; 폢; 폢; ) HANGUL SYLLABLE PYEBS +D3E3;D3E3;1111 1168 11BA;D3E3;1111 1168 11BA; # (폣; 폣; 폣; 폣; 폣; ) HANGUL SYLLABLE PYES +D3E4;D3E4;1111 1168 11BB;D3E4;1111 1168 11BB; # (폤; 폤; 폤; 폤; 폤; ) HANGUL SYLLABLE PYESS +D3E5;D3E5;1111 1168 11BC;D3E5;1111 1168 11BC; # (폥; 폥; 폥; 폥; 폥; ) HANGUL SYLLABLE PYENG +D3E6;D3E6;1111 1168 11BD;D3E6;1111 1168 11BD; # (폦; 폦; 폦; 폦; 폦; ) HANGUL SYLLABLE PYEJ +D3E7;D3E7;1111 1168 11BE;D3E7;1111 1168 11BE; # (폧; 폧; 폧; 폧; 폧; ) HANGUL SYLLABLE PYEC +D3E8;D3E8;1111 1168 11BF;D3E8;1111 1168 11BF; # (폨; 폨; 폨; 폨; 폨; ) HANGUL SYLLABLE PYEK +D3E9;D3E9;1111 1168 11C0;D3E9;1111 1168 11C0; # (폩; 폩; 폩; 폩; 폩; ) HANGUL SYLLABLE PYET +D3EA;D3EA;1111 1168 11C1;D3EA;1111 1168 11C1; # (폪; 폪; 폪; 폪; 폪; ) HANGUL SYLLABLE PYEP +D3EB;D3EB;1111 1168 11C2;D3EB;1111 1168 11C2; # (폫; 폫; 폫; 폫; 폫; ) HANGUL SYLLABLE PYEH +D3EC;D3EC;1111 1169;D3EC;1111 1169; # (포; 포; 포; 포; 포; ) HANGUL SYLLABLE PO +D3ED;D3ED;1111 1169 11A8;D3ED;1111 1169 11A8; # (폭; 폭; 폭; 폭; 폭; ) HANGUL SYLLABLE POG +D3EE;D3EE;1111 1169 11A9;D3EE;1111 1169 11A9; # (폮; 폮; 폮; 폮; 폮; ) HANGUL SYLLABLE POGG +D3EF;D3EF;1111 1169 11AA;D3EF;1111 1169 11AA; # (폯; 폯; 폯; 폯; 폯; ) HANGUL SYLLABLE POGS +D3F0;D3F0;1111 1169 11AB;D3F0;1111 1169 11AB; # (폰; 폰; 폰; 폰; 폰; ) HANGUL SYLLABLE PON +D3F1;D3F1;1111 1169 11AC;D3F1;1111 1169 11AC; # (폱; 폱; 폱; 폱; 폱; ) HANGUL SYLLABLE PONJ +D3F2;D3F2;1111 1169 11AD;D3F2;1111 1169 11AD; # (폲; 폲; 폲; 폲; 폲; ) HANGUL SYLLABLE PONH +D3F3;D3F3;1111 1169 11AE;D3F3;1111 1169 11AE; # (폳; 폳; 폳; 폳; 폳; ) HANGUL SYLLABLE POD +D3F4;D3F4;1111 1169 11AF;D3F4;1111 1169 11AF; # (폴; 폴; 폴; 폴; 폴; ) HANGUL SYLLABLE POL +D3F5;D3F5;1111 1169 11B0;D3F5;1111 1169 11B0; # (폵; 폵; 폵; 폵; 폵; ) HANGUL SYLLABLE POLG +D3F6;D3F6;1111 1169 11B1;D3F6;1111 1169 11B1; # (폶; 폶; 폶; 폶; 폶; ) HANGUL SYLLABLE POLM +D3F7;D3F7;1111 1169 11B2;D3F7;1111 1169 11B2; # (폷; 폷; 폷; 폷; 폷; ) HANGUL SYLLABLE POLB +D3F8;D3F8;1111 1169 11B3;D3F8;1111 1169 11B3; # (폸; 폸; 폸; 폸; 폸; ) HANGUL SYLLABLE POLS +D3F9;D3F9;1111 1169 11B4;D3F9;1111 1169 11B4; # (폹; 폹; 폹; 폹; 폹; ) HANGUL SYLLABLE POLT +D3FA;D3FA;1111 1169 11B5;D3FA;1111 1169 11B5; # (폺; 폺; 폺; 폺; 폺; ) HANGUL SYLLABLE POLP +D3FB;D3FB;1111 1169 11B6;D3FB;1111 1169 11B6; # (폻; 폻; 폻; 폻; 폻; ) HANGUL SYLLABLE POLH +D3FC;D3FC;1111 1169 11B7;D3FC;1111 1169 11B7; # (폼; 폼; 폼; 폼; 폼; ) HANGUL SYLLABLE POM +D3FD;D3FD;1111 1169 11B8;D3FD;1111 1169 11B8; # (폽; 폽; 폽; 폽; 폽; ) HANGUL SYLLABLE POB +D3FE;D3FE;1111 1169 11B9;D3FE;1111 1169 11B9; # (폾; 폾; 폾; 폾; 폾; ) HANGUL SYLLABLE POBS +D3FF;D3FF;1111 1169 11BA;D3FF;1111 1169 11BA; # (폿; 폿; 폿; 폿; 폿; ) HANGUL SYLLABLE POS +D400;D400;1111 1169 11BB;D400;1111 1169 11BB; # (퐀; 퐀; 퐀; 퐀; 퐀; ) HANGUL SYLLABLE POSS +D401;D401;1111 1169 11BC;D401;1111 1169 11BC; # (퐁; 퐁; 퐁; 퐁; 퐁; ) HANGUL SYLLABLE PONG +D402;D402;1111 1169 11BD;D402;1111 1169 11BD; # (퐂; 퐂; 퐂; 퐂; 퐂; ) HANGUL SYLLABLE POJ +D403;D403;1111 1169 11BE;D403;1111 1169 11BE; # (퐃; 퐃; 퐃; 퐃; 퐃; ) HANGUL SYLLABLE POC +D404;D404;1111 1169 11BF;D404;1111 1169 11BF; # (퐄; 퐄; 퐄; 퐄; 퐄; ) HANGUL SYLLABLE POK +D405;D405;1111 1169 11C0;D405;1111 1169 11C0; # (퐅; 퐅; 퐅; 퐅; 퐅; ) HANGUL SYLLABLE POT +D406;D406;1111 1169 11C1;D406;1111 1169 11C1; # (퐆; 퐆; 퐆; 퐆; 퐆; ) HANGUL SYLLABLE POP +D407;D407;1111 1169 11C2;D407;1111 1169 11C2; # (퐇; 퐇; 퐇; 퐇; 퐇; ) HANGUL SYLLABLE POH +D408;D408;1111 116A;D408;1111 116A; # (퐈; 퐈; 퐈; 퐈; 퐈; ) HANGUL SYLLABLE PWA +D409;D409;1111 116A 11A8;D409;1111 116A 11A8; # (퐉; 퐉; 퐉; 퐉; 퐉; ) HANGUL SYLLABLE PWAG +D40A;D40A;1111 116A 11A9;D40A;1111 116A 11A9; # (퐊; 퐊; 퐊; 퐊; 퐊; ) HANGUL SYLLABLE PWAGG +D40B;D40B;1111 116A 11AA;D40B;1111 116A 11AA; # (퐋; 퐋; 퐋; 퐋; 퐋; ) HANGUL SYLLABLE PWAGS +D40C;D40C;1111 116A 11AB;D40C;1111 116A 11AB; # (퐌; 퐌; 퐌; 퐌; 퐌; ) HANGUL SYLLABLE PWAN +D40D;D40D;1111 116A 11AC;D40D;1111 116A 11AC; # (퐍; 퐍; 퐍; 퐍; 퐍; ) HANGUL SYLLABLE PWANJ +D40E;D40E;1111 116A 11AD;D40E;1111 116A 11AD; # (퐎; 퐎; 퐎; 퐎; 퐎; ) HANGUL SYLLABLE PWANH +D40F;D40F;1111 116A 11AE;D40F;1111 116A 11AE; # (퐏; 퐏; 퐏; 퐏; 퐏; ) HANGUL SYLLABLE PWAD +D410;D410;1111 116A 11AF;D410;1111 116A 11AF; # (퐐; 퐐; 퐐; 퐐; 퐐; ) HANGUL SYLLABLE PWAL +D411;D411;1111 116A 11B0;D411;1111 116A 11B0; # (퐑; 퐑; 퐑; 퐑; 퐑; ) HANGUL SYLLABLE PWALG +D412;D412;1111 116A 11B1;D412;1111 116A 11B1; # (퐒; 퐒; 퐒; 퐒; 퐒; ) HANGUL SYLLABLE PWALM +D413;D413;1111 116A 11B2;D413;1111 116A 11B2; # (퐓; 퐓; 퐓; 퐓; 퐓; ) HANGUL SYLLABLE PWALB +D414;D414;1111 116A 11B3;D414;1111 116A 11B3; # (퐔; 퐔; 퐔; 퐔; 퐔; ) HANGUL SYLLABLE PWALS +D415;D415;1111 116A 11B4;D415;1111 116A 11B4; # (퐕; 퐕; 퐕; 퐕; 퐕; ) HANGUL SYLLABLE PWALT +D416;D416;1111 116A 11B5;D416;1111 116A 11B5; # (퐖; 퐖; 퐖; 퐖; 퐖; ) HANGUL SYLLABLE PWALP +D417;D417;1111 116A 11B6;D417;1111 116A 11B6; # (퐗; 퐗; 퐗; 퐗; 퐗; ) HANGUL SYLLABLE PWALH +D418;D418;1111 116A 11B7;D418;1111 116A 11B7; # (퐘; 퐘; 퐘; 퐘; 퐘; ) HANGUL SYLLABLE PWAM +D419;D419;1111 116A 11B8;D419;1111 116A 11B8; # (퐙; 퐙; 퐙; 퐙; 퐙; ) HANGUL SYLLABLE PWAB +D41A;D41A;1111 116A 11B9;D41A;1111 116A 11B9; # (퐚; 퐚; 퐚; 퐚; 퐚; ) HANGUL SYLLABLE PWABS +D41B;D41B;1111 116A 11BA;D41B;1111 116A 11BA; # (퐛; 퐛; 퐛; 퐛; 퐛; ) HANGUL SYLLABLE PWAS +D41C;D41C;1111 116A 11BB;D41C;1111 116A 11BB; # (퐜; 퐜; 퐜; 퐜; 퐜; ) HANGUL SYLLABLE PWASS +D41D;D41D;1111 116A 11BC;D41D;1111 116A 11BC; # (퐝; 퐝; 퐝; 퐝; 퐝; ) HANGUL SYLLABLE PWANG +D41E;D41E;1111 116A 11BD;D41E;1111 116A 11BD; # (퐞; 퐞; 퐞; 퐞; 퐞; ) HANGUL SYLLABLE PWAJ +D41F;D41F;1111 116A 11BE;D41F;1111 116A 11BE; # (퐟; 퐟; 퐟; 퐟; 퐟; ) HANGUL SYLLABLE PWAC +D420;D420;1111 116A 11BF;D420;1111 116A 11BF; # (퐠; 퐠; 퐠; 퐠; 퐠; ) HANGUL SYLLABLE PWAK +D421;D421;1111 116A 11C0;D421;1111 116A 11C0; # (퐡; 퐡; 퐡; 퐡; 퐡; ) HANGUL SYLLABLE PWAT +D422;D422;1111 116A 11C1;D422;1111 116A 11C1; # (퐢; 퐢; 퐢; 퐢; 퐢; ) HANGUL SYLLABLE PWAP +D423;D423;1111 116A 11C2;D423;1111 116A 11C2; # (퐣; 퐣; 퐣; 퐣; 퐣; ) HANGUL SYLLABLE PWAH +D424;D424;1111 116B;D424;1111 116B; # (퐤; 퐤; 퐤; 퐤; 퐤; ) HANGUL SYLLABLE PWAE +D425;D425;1111 116B 11A8;D425;1111 116B 11A8; # (퐥; 퐥; 퐥; 퐥; 퐥; ) HANGUL SYLLABLE PWAEG +D426;D426;1111 116B 11A9;D426;1111 116B 11A9; # (퐦; 퐦; 퐦; 퐦; 퐦; ) HANGUL SYLLABLE PWAEGG +D427;D427;1111 116B 11AA;D427;1111 116B 11AA; # (퐧; 퐧; 퐧; 퐧; 퐧; ) HANGUL SYLLABLE PWAEGS +D428;D428;1111 116B 11AB;D428;1111 116B 11AB; # (퐨; 퐨; 퐨; 퐨; 퐨; ) HANGUL SYLLABLE PWAEN +D429;D429;1111 116B 11AC;D429;1111 116B 11AC; # (퐩; 퐩; 퐩; 퐩; 퐩; ) HANGUL SYLLABLE PWAENJ +D42A;D42A;1111 116B 11AD;D42A;1111 116B 11AD; # (퐪; 퐪; 퐪; 퐪; 퐪; ) HANGUL SYLLABLE PWAENH +D42B;D42B;1111 116B 11AE;D42B;1111 116B 11AE; # (퐫; 퐫; 퐫; 퐫; 퐫; ) HANGUL SYLLABLE PWAED +D42C;D42C;1111 116B 11AF;D42C;1111 116B 11AF; # (퐬; 퐬; 퐬; 퐬; 퐬; ) HANGUL SYLLABLE PWAEL +D42D;D42D;1111 116B 11B0;D42D;1111 116B 11B0; # (퐭; 퐭; 퐭; 퐭; 퐭; ) HANGUL SYLLABLE PWAELG +D42E;D42E;1111 116B 11B1;D42E;1111 116B 11B1; # (퐮; 퐮; 퐮; 퐮; 퐮; ) HANGUL SYLLABLE PWAELM +D42F;D42F;1111 116B 11B2;D42F;1111 116B 11B2; # (퐯; 퐯; 퐯; 퐯; 퐯; ) HANGUL SYLLABLE PWAELB +D430;D430;1111 116B 11B3;D430;1111 116B 11B3; # (퐰; 퐰; 퐰; 퐰; 퐰; ) HANGUL SYLLABLE PWAELS +D431;D431;1111 116B 11B4;D431;1111 116B 11B4; # (퐱; 퐱; 퐱; 퐱; 퐱; ) HANGUL SYLLABLE PWAELT +D432;D432;1111 116B 11B5;D432;1111 116B 11B5; # (퐲; 퐲; 퐲; 퐲; 퐲; ) HANGUL SYLLABLE PWAELP +D433;D433;1111 116B 11B6;D433;1111 116B 11B6; # (퐳; 퐳; 퐳; 퐳; 퐳; ) HANGUL SYLLABLE PWAELH +D434;D434;1111 116B 11B7;D434;1111 116B 11B7; # (퐴; 퐴; 퐴; 퐴; 퐴; ) HANGUL SYLLABLE PWAEM +D435;D435;1111 116B 11B8;D435;1111 116B 11B8; # (퐵; 퐵; 퐵; 퐵; 퐵; ) HANGUL SYLLABLE PWAEB +D436;D436;1111 116B 11B9;D436;1111 116B 11B9; # (퐶; 퐶; 퐶; 퐶; 퐶; ) HANGUL SYLLABLE PWAEBS +D437;D437;1111 116B 11BA;D437;1111 116B 11BA; # (퐷; 퐷; 퐷; 퐷; 퐷; ) HANGUL SYLLABLE PWAES +D438;D438;1111 116B 11BB;D438;1111 116B 11BB; # (퐸; 퐸; 퐸; 퐸; 퐸; ) HANGUL SYLLABLE PWAESS +D439;D439;1111 116B 11BC;D439;1111 116B 11BC; # (퐹; 퐹; 퐹; 퐹; 퐹; ) HANGUL SYLLABLE PWAENG +D43A;D43A;1111 116B 11BD;D43A;1111 116B 11BD; # (퐺; 퐺; 퐺; 퐺; 퐺; ) HANGUL SYLLABLE PWAEJ +D43B;D43B;1111 116B 11BE;D43B;1111 116B 11BE; # (퐻; 퐻; 퐻; 퐻; 퐻; ) HANGUL SYLLABLE PWAEC +D43C;D43C;1111 116B 11BF;D43C;1111 116B 11BF; # (퐼; 퐼; 퐼; 퐼; 퐼; ) HANGUL SYLLABLE PWAEK +D43D;D43D;1111 116B 11C0;D43D;1111 116B 11C0; # (퐽; 퐽; 퐽; 퐽; 퐽; ) HANGUL SYLLABLE PWAET +D43E;D43E;1111 116B 11C1;D43E;1111 116B 11C1; # (퐾; 퐾; 퐾; 퐾; 퐾; ) HANGUL SYLLABLE PWAEP +D43F;D43F;1111 116B 11C2;D43F;1111 116B 11C2; # (퐿; 퐿; 퐿; 퐿; 퐿; ) HANGUL SYLLABLE PWAEH +D440;D440;1111 116C;D440;1111 116C; # (푀; 푀; 푀; 푀; 푀; ) HANGUL SYLLABLE POE +D441;D441;1111 116C 11A8;D441;1111 116C 11A8; # (푁; 푁; 푁; 푁; 푁; ) HANGUL SYLLABLE POEG +D442;D442;1111 116C 11A9;D442;1111 116C 11A9; # (푂; 푂; 푂; 푂; 푂; ) HANGUL SYLLABLE POEGG +D443;D443;1111 116C 11AA;D443;1111 116C 11AA; # (푃; 푃; 푃; 푃; 푃; ) HANGUL SYLLABLE POEGS +D444;D444;1111 116C 11AB;D444;1111 116C 11AB; # (푄; 푄; 푄; 푄; 푄; ) HANGUL SYLLABLE POEN +D445;D445;1111 116C 11AC;D445;1111 116C 11AC; # (푅; 푅; 푅; 푅; 푅; ) HANGUL SYLLABLE POENJ +D446;D446;1111 116C 11AD;D446;1111 116C 11AD; # (푆; 푆; 푆; 푆; 푆; ) HANGUL SYLLABLE POENH +D447;D447;1111 116C 11AE;D447;1111 116C 11AE; # (푇; 푇; 푇; 푇; 푇; ) HANGUL SYLLABLE POED +D448;D448;1111 116C 11AF;D448;1111 116C 11AF; # (푈; 푈; 푈; 푈; 푈; ) HANGUL SYLLABLE POEL +D449;D449;1111 116C 11B0;D449;1111 116C 11B0; # (푉; 푉; 푉; 푉; 푉; ) HANGUL SYLLABLE POELG +D44A;D44A;1111 116C 11B1;D44A;1111 116C 11B1; # (푊; 푊; 푊; 푊; 푊; ) HANGUL SYLLABLE POELM +D44B;D44B;1111 116C 11B2;D44B;1111 116C 11B2; # (푋; 푋; 푋; 푋; 푋; ) HANGUL SYLLABLE POELB +D44C;D44C;1111 116C 11B3;D44C;1111 116C 11B3; # (푌; 푌; 푌; 푌; 푌; ) HANGUL SYLLABLE POELS +D44D;D44D;1111 116C 11B4;D44D;1111 116C 11B4; # (푍; 푍; 푍; 푍; 푍; ) HANGUL SYLLABLE POELT +D44E;D44E;1111 116C 11B5;D44E;1111 116C 11B5; # (푎; 푎; 푎; 푎; 푎; ) HANGUL SYLLABLE POELP +D44F;D44F;1111 116C 11B6;D44F;1111 116C 11B6; # (푏; 푏; 푏; 푏; 푏; ) HANGUL SYLLABLE POELH +D450;D450;1111 116C 11B7;D450;1111 116C 11B7; # (푐; 푐; 푐; 푐; 푐; ) HANGUL SYLLABLE POEM +D451;D451;1111 116C 11B8;D451;1111 116C 11B8; # (푑; 푑; 푑; 푑; 푑; ) HANGUL SYLLABLE POEB +D452;D452;1111 116C 11B9;D452;1111 116C 11B9; # (푒; 푒; 푒; 푒; 푒; ) HANGUL SYLLABLE POEBS +D453;D453;1111 116C 11BA;D453;1111 116C 11BA; # (푓; 푓; 푓; 푓; 푓; ) HANGUL SYLLABLE POES +D454;D454;1111 116C 11BB;D454;1111 116C 11BB; # (푔; 푔; 푔; 푔; 푔; ) HANGUL SYLLABLE POESS +D455;D455;1111 116C 11BC;D455;1111 116C 11BC; # (푕; 푕; 푕; 푕; 푕; ) HANGUL SYLLABLE POENG +D456;D456;1111 116C 11BD;D456;1111 116C 11BD; # (푖; 푖; 푖; 푖; 푖; ) HANGUL SYLLABLE POEJ +D457;D457;1111 116C 11BE;D457;1111 116C 11BE; # (푗; 푗; 푗; 푗; 푗; ) HANGUL SYLLABLE POEC +D458;D458;1111 116C 11BF;D458;1111 116C 11BF; # (푘; 푘; 푘; 푘; 푘; ) HANGUL SYLLABLE POEK +D459;D459;1111 116C 11C0;D459;1111 116C 11C0; # (푙; 푙; 푙; 푙; 푙; ) HANGUL SYLLABLE POET +D45A;D45A;1111 116C 11C1;D45A;1111 116C 11C1; # (푚; 푚; 푚; 푚; 푚; ) HANGUL SYLLABLE POEP +D45B;D45B;1111 116C 11C2;D45B;1111 116C 11C2; # (푛; 푛; 푛; 푛; 푛; ) HANGUL SYLLABLE POEH +D45C;D45C;1111 116D;D45C;1111 116D; # (표; 표; 표; 표; 표; ) HANGUL SYLLABLE PYO +D45D;D45D;1111 116D 11A8;D45D;1111 116D 11A8; # (푝; 푝; 푝; 푝; 푝; ) HANGUL SYLLABLE PYOG +D45E;D45E;1111 116D 11A9;D45E;1111 116D 11A9; # (푞; 푞; 푞; 푞; 푞; ) HANGUL SYLLABLE PYOGG +D45F;D45F;1111 116D 11AA;D45F;1111 116D 11AA; # (푟; 푟; 푟; 푟; 푟; ) HANGUL SYLLABLE PYOGS +D460;D460;1111 116D 11AB;D460;1111 116D 11AB; # (푠; 푠; 푠; 푠; 푠; ) HANGUL SYLLABLE PYON +D461;D461;1111 116D 11AC;D461;1111 116D 11AC; # (푡; 푡; 푡; 푡; 푡; ) HANGUL SYLLABLE PYONJ +D462;D462;1111 116D 11AD;D462;1111 116D 11AD; # (푢; 푢; 푢; 푢; 푢; ) HANGUL SYLLABLE PYONH +D463;D463;1111 116D 11AE;D463;1111 116D 11AE; # (푣; 푣; 푣; 푣; 푣; ) HANGUL SYLLABLE PYOD +D464;D464;1111 116D 11AF;D464;1111 116D 11AF; # (푤; 푤; 푤; 푤; 푤; ) HANGUL SYLLABLE PYOL +D465;D465;1111 116D 11B0;D465;1111 116D 11B0; # (푥; 푥; 푥; 푥; 푥; ) HANGUL SYLLABLE PYOLG +D466;D466;1111 116D 11B1;D466;1111 116D 11B1; # (푦; 푦; 푦; 푦; 푦; ) HANGUL SYLLABLE PYOLM +D467;D467;1111 116D 11B2;D467;1111 116D 11B2; # (푧; 푧; 푧; 푧; 푧; ) HANGUL SYLLABLE PYOLB +D468;D468;1111 116D 11B3;D468;1111 116D 11B3; # (푨; 푨; 푨; 푨; 푨; ) HANGUL SYLLABLE PYOLS +D469;D469;1111 116D 11B4;D469;1111 116D 11B4; # (푩; 푩; 푩; 푩; 푩; ) HANGUL SYLLABLE PYOLT +D46A;D46A;1111 116D 11B5;D46A;1111 116D 11B5; # (푪; 푪; 푪; 푪; 푪; ) HANGUL SYLLABLE PYOLP +D46B;D46B;1111 116D 11B6;D46B;1111 116D 11B6; # (푫; 푫; 푫; 푫; 푫; ) HANGUL SYLLABLE PYOLH +D46C;D46C;1111 116D 11B7;D46C;1111 116D 11B7; # (푬; 푬; 푬; 푬; 푬; ) HANGUL SYLLABLE PYOM +D46D;D46D;1111 116D 11B8;D46D;1111 116D 11B8; # (푭; 푭; 푭; 푭; 푭; ) HANGUL SYLLABLE PYOB +D46E;D46E;1111 116D 11B9;D46E;1111 116D 11B9; # (푮; 푮; 푮; 푮; 푮; ) HANGUL SYLLABLE PYOBS +D46F;D46F;1111 116D 11BA;D46F;1111 116D 11BA; # (푯; 푯; 푯; 푯; 푯; ) HANGUL SYLLABLE PYOS +D470;D470;1111 116D 11BB;D470;1111 116D 11BB; # (푰; 푰; 푰; 푰; 푰; ) HANGUL SYLLABLE PYOSS +D471;D471;1111 116D 11BC;D471;1111 116D 11BC; # (푱; 푱; 푱; 푱; 푱; ) HANGUL SYLLABLE PYONG +D472;D472;1111 116D 11BD;D472;1111 116D 11BD; # (푲; 푲; 푲; 푲; 푲; ) HANGUL SYLLABLE PYOJ +D473;D473;1111 116D 11BE;D473;1111 116D 11BE; # (푳; 푳; 푳; 푳; 푳; ) HANGUL SYLLABLE PYOC +D474;D474;1111 116D 11BF;D474;1111 116D 11BF; # (푴; 푴; 푴; 푴; 푴; ) HANGUL SYLLABLE PYOK +D475;D475;1111 116D 11C0;D475;1111 116D 11C0; # (푵; 푵; 푵; 푵; 푵; ) HANGUL SYLLABLE PYOT +D476;D476;1111 116D 11C1;D476;1111 116D 11C1; # (푶; 푶; 푶; 푶; 푶; ) HANGUL SYLLABLE PYOP +D477;D477;1111 116D 11C2;D477;1111 116D 11C2; # (푷; 푷; 푷; 푷; 푷; ) HANGUL SYLLABLE PYOH +D478;D478;1111 116E;D478;1111 116E; # (푸; 푸; 푸; 푸; 푸; ) HANGUL SYLLABLE PU +D479;D479;1111 116E 11A8;D479;1111 116E 11A8; # (푹; 푹; 푹; 푹; 푹; ) HANGUL SYLLABLE PUG +D47A;D47A;1111 116E 11A9;D47A;1111 116E 11A9; # (푺; 푺; 푺; 푺; 푺; ) HANGUL SYLLABLE PUGG +D47B;D47B;1111 116E 11AA;D47B;1111 116E 11AA; # (푻; 푻; 푻; 푻; 푻; ) HANGUL SYLLABLE PUGS +D47C;D47C;1111 116E 11AB;D47C;1111 116E 11AB; # (푼; 푼; 푼; 푼; 푼; ) HANGUL SYLLABLE PUN +D47D;D47D;1111 116E 11AC;D47D;1111 116E 11AC; # (푽; 푽; 푽; 푽; 푽; ) HANGUL SYLLABLE PUNJ +D47E;D47E;1111 116E 11AD;D47E;1111 116E 11AD; # (푾; 푾; 푾; 푾; 푾; ) HANGUL SYLLABLE PUNH +D47F;D47F;1111 116E 11AE;D47F;1111 116E 11AE; # (푿; 푿; 푿; 푿; 푿; ) HANGUL SYLLABLE PUD +D480;D480;1111 116E 11AF;D480;1111 116E 11AF; # (풀; 풀; 풀; 풀; 풀; ) HANGUL SYLLABLE PUL +D481;D481;1111 116E 11B0;D481;1111 116E 11B0; # (풁; 풁; 풁; 풁; 풁; ) HANGUL SYLLABLE PULG +D482;D482;1111 116E 11B1;D482;1111 116E 11B1; # (풂; 풂; 풂; 풂; 풂; ) HANGUL SYLLABLE PULM +D483;D483;1111 116E 11B2;D483;1111 116E 11B2; # (풃; 풃; 풃; 풃; 풃; ) HANGUL SYLLABLE PULB +D484;D484;1111 116E 11B3;D484;1111 116E 11B3; # (풄; 풄; 풄; 풄; 풄; ) HANGUL SYLLABLE PULS +D485;D485;1111 116E 11B4;D485;1111 116E 11B4; # (풅; 풅; 풅; 풅; 풅; ) HANGUL SYLLABLE PULT +D486;D486;1111 116E 11B5;D486;1111 116E 11B5; # (풆; 풆; 풆; 풆; 풆; ) HANGUL SYLLABLE PULP +D487;D487;1111 116E 11B6;D487;1111 116E 11B6; # (풇; 풇; 풇; 풇; 풇; ) HANGUL SYLLABLE PULH +D488;D488;1111 116E 11B7;D488;1111 116E 11B7; # (품; 품; 품; 품; 품; ) HANGUL SYLLABLE PUM +D489;D489;1111 116E 11B8;D489;1111 116E 11B8; # (풉; 풉; 풉; 풉; 풉; ) HANGUL SYLLABLE PUB +D48A;D48A;1111 116E 11B9;D48A;1111 116E 11B9; # (풊; 풊; 풊; 풊; 풊; ) HANGUL SYLLABLE PUBS +D48B;D48B;1111 116E 11BA;D48B;1111 116E 11BA; # (풋; 풋; 풋; 풋; 풋; ) HANGUL SYLLABLE PUS +D48C;D48C;1111 116E 11BB;D48C;1111 116E 11BB; # (풌; 풌; 풌; 풌; 풌; ) HANGUL SYLLABLE PUSS +D48D;D48D;1111 116E 11BC;D48D;1111 116E 11BC; # (풍; 풍; 풍; 풍; 풍; ) HANGUL SYLLABLE PUNG +D48E;D48E;1111 116E 11BD;D48E;1111 116E 11BD; # (풎; 풎; 풎; 풎; 풎; ) HANGUL SYLLABLE PUJ +D48F;D48F;1111 116E 11BE;D48F;1111 116E 11BE; # (풏; 풏; 풏; 풏; 풏; ) HANGUL SYLLABLE PUC +D490;D490;1111 116E 11BF;D490;1111 116E 11BF; # (풐; 풐; 풐; 풐; 풐; ) HANGUL SYLLABLE PUK +D491;D491;1111 116E 11C0;D491;1111 116E 11C0; # (풑; 풑; 풑; 풑; 풑; ) HANGUL SYLLABLE PUT +D492;D492;1111 116E 11C1;D492;1111 116E 11C1; # (풒; 풒; 풒; 풒; 풒; ) HANGUL SYLLABLE PUP +D493;D493;1111 116E 11C2;D493;1111 116E 11C2; # (풓; 풓; 풓; 풓; 풓; ) HANGUL SYLLABLE PUH +D494;D494;1111 116F;D494;1111 116F; # (풔; 풔; 풔; 풔; 풔; ) HANGUL SYLLABLE PWEO +D495;D495;1111 116F 11A8;D495;1111 116F 11A8; # (풕; 풕; 풕; 풕; 풕; ) HANGUL SYLLABLE PWEOG +D496;D496;1111 116F 11A9;D496;1111 116F 11A9; # (풖; 풖; 풖; 풖; 풖; ) HANGUL SYLLABLE PWEOGG +D497;D497;1111 116F 11AA;D497;1111 116F 11AA; # (풗; 풗; 풗; 풗; 풗; ) HANGUL SYLLABLE PWEOGS +D498;D498;1111 116F 11AB;D498;1111 116F 11AB; # (풘; 풘; 풘; 풘; 풘; ) HANGUL SYLLABLE PWEON +D499;D499;1111 116F 11AC;D499;1111 116F 11AC; # (풙; 풙; 풙; 풙; 풙; ) HANGUL SYLLABLE PWEONJ +D49A;D49A;1111 116F 11AD;D49A;1111 116F 11AD; # (풚; 풚; 풚; 풚; 풚; ) HANGUL SYLLABLE PWEONH +D49B;D49B;1111 116F 11AE;D49B;1111 116F 11AE; # (풛; 풛; 풛; 풛; 풛; ) HANGUL SYLLABLE PWEOD +D49C;D49C;1111 116F 11AF;D49C;1111 116F 11AF; # (풜; 풜; 풜; 풜; 풜; ) HANGUL SYLLABLE PWEOL +D49D;D49D;1111 116F 11B0;D49D;1111 116F 11B0; # (풝; 풝; 풝; 풝; 풝; ) HANGUL SYLLABLE PWEOLG +D49E;D49E;1111 116F 11B1;D49E;1111 116F 11B1; # (풞; 풞; 풞; 풞; 풞; ) HANGUL SYLLABLE PWEOLM +D49F;D49F;1111 116F 11B2;D49F;1111 116F 11B2; # (풟; 풟; 풟; 풟; 풟; ) HANGUL SYLLABLE PWEOLB +D4A0;D4A0;1111 116F 11B3;D4A0;1111 116F 11B3; # (풠; 풠; 풠; 풠; 풠; ) HANGUL SYLLABLE PWEOLS +D4A1;D4A1;1111 116F 11B4;D4A1;1111 116F 11B4; # (풡; 풡; 풡; 풡; 풡; ) HANGUL SYLLABLE PWEOLT +D4A2;D4A2;1111 116F 11B5;D4A2;1111 116F 11B5; # (풢; 풢; 풢; 풢; 풢; ) HANGUL SYLLABLE PWEOLP +D4A3;D4A3;1111 116F 11B6;D4A3;1111 116F 11B6; # (풣; 풣; 풣; 풣; 풣; ) HANGUL SYLLABLE PWEOLH +D4A4;D4A4;1111 116F 11B7;D4A4;1111 116F 11B7; # (풤; 풤; 풤; 풤; 풤; ) HANGUL SYLLABLE PWEOM +D4A5;D4A5;1111 116F 11B8;D4A5;1111 116F 11B8; # (풥; 풥; 풥; 풥; 풥; ) HANGUL SYLLABLE PWEOB +D4A6;D4A6;1111 116F 11B9;D4A6;1111 116F 11B9; # (풦; 풦; 풦; 풦; 풦; ) HANGUL SYLLABLE PWEOBS +D4A7;D4A7;1111 116F 11BA;D4A7;1111 116F 11BA; # (풧; 풧; 풧; 풧; 풧; ) HANGUL SYLLABLE PWEOS +D4A8;D4A8;1111 116F 11BB;D4A8;1111 116F 11BB; # (풨; 풨; 풨; 풨; 풨; ) HANGUL SYLLABLE PWEOSS +D4A9;D4A9;1111 116F 11BC;D4A9;1111 116F 11BC; # (풩; 풩; 풩; 풩; 풩; ) HANGUL SYLLABLE PWEONG +D4AA;D4AA;1111 116F 11BD;D4AA;1111 116F 11BD; # (풪; 풪; 풪; 풪; 풪; ) HANGUL SYLLABLE PWEOJ +D4AB;D4AB;1111 116F 11BE;D4AB;1111 116F 11BE; # (풫; 풫; 풫; 풫; 풫; ) HANGUL SYLLABLE PWEOC +D4AC;D4AC;1111 116F 11BF;D4AC;1111 116F 11BF; # (풬; 풬; 풬; 풬; 풬; ) HANGUL SYLLABLE PWEOK +D4AD;D4AD;1111 116F 11C0;D4AD;1111 116F 11C0; # (풭; 풭; 풭; 풭; 풭; ) HANGUL SYLLABLE PWEOT +D4AE;D4AE;1111 116F 11C1;D4AE;1111 116F 11C1; # (풮; 풮; 풮; 풮; 풮; ) HANGUL SYLLABLE PWEOP +D4AF;D4AF;1111 116F 11C2;D4AF;1111 116F 11C2; # (풯; 풯; 풯; 풯; 풯; ) HANGUL SYLLABLE PWEOH +D4B0;D4B0;1111 1170;D4B0;1111 1170; # (풰; 풰; 풰; 풰; 풰; ) HANGUL SYLLABLE PWE +D4B1;D4B1;1111 1170 11A8;D4B1;1111 1170 11A8; # (풱; 풱; 풱; 풱; 풱; ) HANGUL SYLLABLE PWEG +D4B2;D4B2;1111 1170 11A9;D4B2;1111 1170 11A9; # (풲; 풲; 풲; 풲; 풲; ) HANGUL SYLLABLE PWEGG +D4B3;D4B3;1111 1170 11AA;D4B3;1111 1170 11AA; # (풳; 풳; 풳; 풳; 풳; ) HANGUL SYLLABLE PWEGS +D4B4;D4B4;1111 1170 11AB;D4B4;1111 1170 11AB; # (풴; 풴; 풴; 풴; 풴; ) HANGUL SYLLABLE PWEN +D4B5;D4B5;1111 1170 11AC;D4B5;1111 1170 11AC; # (풵; 풵; 풵; 풵; 풵; ) HANGUL SYLLABLE PWENJ +D4B6;D4B6;1111 1170 11AD;D4B6;1111 1170 11AD; # (풶; 풶; 풶; 풶; 풶; ) HANGUL SYLLABLE PWENH +D4B7;D4B7;1111 1170 11AE;D4B7;1111 1170 11AE; # (풷; 풷; 풷; 풷; 풷; ) HANGUL SYLLABLE PWED +D4B8;D4B8;1111 1170 11AF;D4B8;1111 1170 11AF; # (풸; 풸; 풸; 풸; 풸; ) HANGUL SYLLABLE PWEL +D4B9;D4B9;1111 1170 11B0;D4B9;1111 1170 11B0; # (풹; 풹; 풹; 풹; 풹; ) HANGUL SYLLABLE PWELG +D4BA;D4BA;1111 1170 11B1;D4BA;1111 1170 11B1; # (풺; 풺; 풺; 풺; 풺; ) HANGUL SYLLABLE PWELM +D4BB;D4BB;1111 1170 11B2;D4BB;1111 1170 11B2; # (풻; 풻; 풻; 풻; 풻; ) HANGUL SYLLABLE PWELB +D4BC;D4BC;1111 1170 11B3;D4BC;1111 1170 11B3; # (풼; 풼; 풼; 풼; 풼; ) HANGUL SYLLABLE PWELS +D4BD;D4BD;1111 1170 11B4;D4BD;1111 1170 11B4; # (풽; 풽; 풽; 풽; 풽; ) HANGUL SYLLABLE PWELT +D4BE;D4BE;1111 1170 11B5;D4BE;1111 1170 11B5; # (풾; 풾; 풾; 풾; 풾; ) HANGUL SYLLABLE PWELP +D4BF;D4BF;1111 1170 11B6;D4BF;1111 1170 11B6; # (풿; 풿; 풿; 풿; 풿; ) HANGUL SYLLABLE PWELH +D4C0;D4C0;1111 1170 11B7;D4C0;1111 1170 11B7; # (퓀; 퓀; 퓀; 퓀; 퓀; ) HANGUL SYLLABLE PWEM +D4C1;D4C1;1111 1170 11B8;D4C1;1111 1170 11B8; # (퓁; 퓁; 퓁; 퓁; 퓁; ) HANGUL SYLLABLE PWEB +D4C2;D4C2;1111 1170 11B9;D4C2;1111 1170 11B9; # (퓂; 퓂; 퓂; 퓂; 퓂; ) HANGUL SYLLABLE PWEBS +D4C3;D4C3;1111 1170 11BA;D4C3;1111 1170 11BA; # (퓃; 퓃; 퓃; 퓃; 퓃; ) HANGUL SYLLABLE PWES +D4C4;D4C4;1111 1170 11BB;D4C4;1111 1170 11BB; # (퓄; 퓄; 퓄; 퓄; 퓄; ) HANGUL SYLLABLE PWESS +D4C5;D4C5;1111 1170 11BC;D4C5;1111 1170 11BC; # (퓅; 퓅; 퓅; 퓅; 퓅; ) HANGUL SYLLABLE PWENG +D4C6;D4C6;1111 1170 11BD;D4C6;1111 1170 11BD; # (퓆; 퓆; 퓆; 퓆; 퓆; ) HANGUL SYLLABLE PWEJ +D4C7;D4C7;1111 1170 11BE;D4C7;1111 1170 11BE; # (퓇; 퓇; 퓇; 퓇; 퓇; ) HANGUL SYLLABLE PWEC +D4C8;D4C8;1111 1170 11BF;D4C8;1111 1170 11BF; # (퓈; 퓈; 퓈; 퓈; 퓈; ) HANGUL SYLLABLE PWEK +D4C9;D4C9;1111 1170 11C0;D4C9;1111 1170 11C0; # (퓉; 퓉; 퓉; 퓉; 퓉; ) HANGUL SYLLABLE PWET +D4CA;D4CA;1111 1170 11C1;D4CA;1111 1170 11C1; # (퓊; 퓊; 퓊; 퓊; 퓊; ) HANGUL SYLLABLE PWEP +D4CB;D4CB;1111 1170 11C2;D4CB;1111 1170 11C2; # (퓋; 퓋; 퓋; 퓋; 퓋; ) HANGUL SYLLABLE PWEH +D4CC;D4CC;1111 1171;D4CC;1111 1171; # (퓌; 퓌; 퓌; 퓌; 퓌; ) HANGUL SYLLABLE PWI +D4CD;D4CD;1111 1171 11A8;D4CD;1111 1171 11A8; # (퓍; 퓍; 퓍; 퓍; 퓍; ) HANGUL SYLLABLE PWIG +D4CE;D4CE;1111 1171 11A9;D4CE;1111 1171 11A9; # (퓎; 퓎; 퓎; 퓎; 퓎; ) HANGUL SYLLABLE PWIGG +D4CF;D4CF;1111 1171 11AA;D4CF;1111 1171 11AA; # (퓏; 퓏; 퓏; 퓏; 퓏; ) HANGUL SYLLABLE PWIGS +D4D0;D4D0;1111 1171 11AB;D4D0;1111 1171 11AB; # (퓐; 퓐; 퓐; 퓐; 퓐; ) HANGUL SYLLABLE PWIN +D4D1;D4D1;1111 1171 11AC;D4D1;1111 1171 11AC; # (퓑; 퓑; 퓑; 퓑; 퓑; ) HANGUL SYLLABLE PWINJ +D4D2;D4D2;1111 1171 11AD;D4D2;1111 1171 11AD; # (퓒; 퓒; 퓒; 퓒; 퓒; ) HANGUL SYLLABLE PWINH +D4D3;D4D3;1111 1171 11AE;D4D3;1111 1171 11AE; # (퓓; 퓓; 퓓; 퓓; 퓓; ) HANGUL SYLLABLE PWID +D4D4;D4D4;1111 1171 11AF;D4D4;1111 1171 11AF; # (퓔; 퓔; 퓔; 퓔; 퓔; ) HANGUL SYLLABLE PWIL +D4D5;D4D5;1111 1171 11B0;D4D5;1111 1171 11B0; # (퓕; 퓕; 퓕; 퓕; 퓕; ) HANGUL SYLLABLE PWILG +D4D6;D4D6;1111 1171 11B1;D4D6;1111 1171 11B1; # (퓖; 퓖; 퓖; 퓖; 퓖; ) HANGUL SYLLABLE PWILM +D4D7;D4D7;1111 1171 11B2;D4D7;1111 1171 11B2; # (퓗; 퓗; 퓗; 퓗; 퓗; ) HANGUL SYLLABLE PWILB +D4D8;D4D8;1111 1171 11B3;D4D8;1111 1171 11B3; # (퓘; 퓘; 퓘; 퓘; 퓘; ) HANGUL SYLLABLE PWILS +D4D9;D4D9;1111 1171 11B4;D4D9;1111 1171 11B4; # (퓙; 퓙; 퓙; 퓙; 퓙; ) HANGUL SYLLABLE PWILT +D4DA;D4DA;1111 1171 11B5;D4DA;1111 1171 11B5; # (퓚; 퓚; 퓚; 퓚; 퓚; ) HANGUL SYLLABLE PWILP +D4DB;D4DB;1111 1171 11B6;D4DB;1111 1171 11B6; # (퓛; 퓛; 퓛; 퓛; 퓛; ) HANGUL SYLLABLE PWILH +D4DC;D4DC;1111 1171 11B7;D4DC;1111 1171 11B7; # (퓜; 퓜; 퓜; 퓜; 퓜; ) HANGUL SYLLABLE PWIM +D4DD;D4DD;1111 1171 11B8;D4DD;1111 1171 11B8; # (퓝; 퓝; 퓝; 퓝; 퓝; ) HANGUL SYLLABLE PWIB +D4DE;D4DE;1111 1171 11B9;D4DE;1111 1171 11B9; # (퓞; 퓞; 퓞; 퓞; 퓞; ) HANGUL SYLLABLE PWIBS +D4DF;D4DF;1111 1171 11BA;D4DF;1111 1171 11BA; # (퓟; 퓟; 퓟; 퓟; 퓟; ) HANGUL SYLLABLE PWIS +D4E0;D4E0;1111 1171 11BB;D4E0;1111 1171 11BB; # (퓠; 퓠; 퓠; 퓠; 퓠; ) HANGUL SYLLABLE PWISS +D4E1;D4E1;1111 1171 11BC;D4E1;1111 1171 11BC; # (퓡; 퓡; 퓡; 퓡; 퓡; ) HANGUL SYLLABLE PWING +D4E2;D4E2;1111 1171 11BD;D4E2;1111 1171 11BD; # (퓢; 퓢; 퓢; 퓢; 퓢; ) HANGUL SYLLABLE PWIJ +D4E3;D4E3;1111 1171 11BE;D4E3;1111 1171 11BE; # (퓣; 퓣; 퓣; 퓣; 퓣; ) HANGUL SYLLABLE PWIC +D4E4;D4E4;1111 1171 11BF;D4E4;1111 1171 11BF; # (퓤; 퓤; 퓤; 퓤; 퓤; ) HANGUL SYLLABLE PWIK +D4E5;D4E5;1111 1171 11C0;D4E5;1111 1171 11C0; # (퓥; 퓥; 퓥; 퓥; 퓥; ) HANGUL SYLLABLE PWIT +D4E6;D4E6;1111 1171 11C1;D4E6;1111 1171 11C1; # (퓦; 퓦; 퓦; 퓦; 퓦; ) HANGUL SYLLABLE PWIP +D4E7;D4E7;1111 1171 11C2;D4E7;1111 1171 11C2; # (퓧; 퓧; 퓧; 퓧; 퓧; ) HANGUL SYLLABLE PWIH +D4E8;D4E8;1111 1172;D4E8;1111 1172; # (퓨; 퓨; 퓨; 퓨; 퓨; ) HANGUL SYLLABLE PYU +D4E9;D4E9;1111 1172 11A8;D4E9;1111 1172 11A8; # (퓩; 퓩; 퓩; 퓩; 퓩; ) HANGUL SYLLABLE PYUG +D4EA;D4EA;1111 1172 11A9;D4EA;1111 1172 11A9; # (퓪; 퓪; 퓪; 퓪; 퓪; ) HANGUL SYLLABLE PYUGG +D4EB;D4EB;1111 1172 11AA;D4EB;1111 1172 11AA; # (퓫; 퓫; 퓫; 퓫; 퓫; ) HANGUL SYLLABLE PYUGS +D4EC;D4EC;1111 1172 11AB;D4EC;1111 1172 11AB; # (퓬; 퓬; 퓬; 퓬; 퓬; ) HANGUL SYLLABLE PYUN +D4ED;D4ED;1111 1172 11AC;D4ED;1111 1172 11AC; # (퓭; 퓭; 퓭; 퓭; 퓭; ) HANGUL SYLLABLE PYUNJ +D4EE;D4EE;1111 1172 11AD;D4EE;1111 1172 11AD; # (퓮; 퓮; 퓮; 퓮; 퓮; ) HANGUL SYLLABLE PYUNH +D4EF;D4EF;1111 1172 11AE;D4EF;1111 1172 11AE; # (퓯; 퓯; 퓯; 퓯; 퓯; ) HANGUL SYLLABLE PYUD +D4F0;D4F0;1111 1172 11AF;D4F0;1111 1172 11AF; # (퓰; 퓰; 퓰; 퓰; 퓰; ) HANGUL SYLLABLE PYUL +D4F1;D4F1;1111 1172 11B0;D4F1;1111 1172 11B0; # (퓱; 퓱; 퓱; 퓱; 퓱; ) HANGUL SYLLABLE PYULG +D4F2;D4F2;1111 1172 11B1;D4F2;1111 1172 11B1; # (퓲; 퓲; 퓲; 퓲; 퓲; ) HANGUL SYLLABLE PYULM +D4F3;D4F3;1111 1172 11B2;D4F3;1111 1172 11B2; # (퓳; 퓳; 퓳; 퓳; 퓳; ) HANGUL SYLLABLE PYULB +D4F4;D4F4;1111 1172 11B3;D4F4;1111 1172 11B3; # (퓴; 퓴; 퓴; 퓴; 퓴; ) HANGUL SYLLABLE PYULS +D4F5;D4F5;1111 1172 11B4;D4F5;1111 1172 11B4; # (퓵; 퓵; 퓵; 퓵; 퓵; ) HANGUL SYLLABLE PYULT +D4F6;D4F6;1111 1172 11B5;D4F6;1111 1172 11B5; # (퓶; 퓶; 퓶; 퓶; 퓶; ) HANGUL SYLLABLE PYULP +D4F7;D4F7;1111 1172 11B6;D4F7;1111 1172 11B6; # (퓷; 퓷; 퓷; 퓷; 퓷; ) HANGUL SYLLABLE PYULH +D4F8;D4F8;1111 1172 11B7;D4F8;1111 1172 11B7; # (퓸; 퓸; 퓸; 퓸; 퓸; ) HANGUL SYLLABLE PYUM +D4F9;D4F9;1111 1172 11B8;D4F9;1111 1172 11B8; # (퓹; 퓹; 퓹; 퓹; 퓹; ) HANGUL SYLLABLE PYUB +D4FA;D4FA;1111 1172 11B9;D4FA;1111 1172 11B9; # (퓺; 퓺; 퓺; 퓺; 퓺; ) HANGUL SYLLABLE PYUBS +D4FB;D4FB;1111 1172 11BA;D4FB;1111 1172 11BA; # (퓻; 퓻; 퓻; 퓻; 퓻; ) HANGUL SYLLABLE PYUS +D4FC;D4FC;1111 1172 11BB;D4FC;1111 1172 11BB; # (퓼; 퓼; 퓼; 퓼; 퓼; ) HANGUL SYLLABLE PYUSS +D4FD;D4FD;1111 1172 11BC;D4FD;1111 1172 11BC; # (퓽; 퓽; 퓽; 퓽; 퓽; ) HANGUL SYLLABLE PYUNG +D4FE;D4FE;1111 1172 11BD;D4FE;1111 1172 11BD; # (퓾; 퓾; 퓾; 퓾; 퓾; ) HANGUL SYLLABLE PYUJ +D4FF;D4FF;1111 1172 11BE;D4FF;1111 1172 11BE; # (퓿; 퓿; 퓿; 퓿; 퓿; ) HANGUL SYLLABLE PYUC +D500;D500;1111 1172 11BF;D500;1111 1172 11BF; # (픀; 픀; 픀; 픀; 픀; ) HANGUL SYLLABLE PYUK +D501;D501;1111 1172 11C0;D501;1111 1172 11C0; # (픁; 픁; 픁; 픁; 픁; ) HANGUL SYLLABLE PYUT +D502;D502;1111 1172 11C1;D502;1111 1172 11C1; # (픂; 픂; 픂; 픂; 픂; ) HANGUL SYLLABLE PYUP +D503;D503;1111 1172 11C2;D503;1111 1172 11C2; # (픃; 픃; 픃; 픃; 픃; ) HANGUL SYLLABLE PYUH +D504;D504;1111 1173;D504;1111 1173; # (프; 프; 프; 프; 프; ) HANGUL SYLLABLE PEU +D505;D505;1111 1173 11A8;D505;1111 1173 11A8; # (픅; 픅; 픅; 픅; 픅; ) HANGUL SYLLABLE PEUG +D506;D506;1111 1173 11A9;D506;1111 1173 11A9; # (픆; 픆; 픆; 픆; 픆; ) HANGUL SYLLABLE PEUGG +D507;D507;1111 1173 11AA;D507;1111 1173 11AA; # (픇; 픇; 픇; 픇; 픇; ) HANGUL SYLLABLE PEUGS +D508;D508;1111 1173 11AB;D508;1111 1173 11AB; # (픈; 픈; 픈; 픈; 픈; ) HANGUL SYLLABLE PEUN +D509;D509;1111 1173 11AC;D509;1111 1173 11AC; # (픉; 픉; 픉; 픉; 픉; ) HANGUL SYLLABLE PEUNJ +D50A;D50A;1111 1173 11AD;D50A;1111 1173 11AD; # (픊; 픊; 픊; 픊; 픊; ) HANGUL SYLLABLE PEUNH +D50B;D50B;1111 1173 11AE;D50B;1111 1173 11AE; # (픋; 픋; 픋; 픋; 픋; ) HANGUL SYLLABLE PEUD +D50C;D50C;1111 1173 11AF;D50C;1111 1173 11AF; # (플; 플; 플; 플; 플; ) HANGUL SYLLABLE PEUL +D50D;D50D;1111 1173 11B0;D50D;1111 1173 11B0; # (픍; 픍; 픍; 픍; 픍; ) HANGUL SYLLABLE PEULG +D50E;D50E;1111 1173 11B1;D50E;1111 1173 11B1; # (픎; 픎; 픎; 픎; 픎; ) HANGUL SYLLABLE PEULM +D50F;D50F;1111 1173 11B2;D50F;1111 1173 11B2; # (픏; 픏; 픏; 픏; 픏; ) HANGUL SYLLABLE PEULB +D510;D510;1111 1173 11B3;D510;1111 1173 11B3; # (픐; 픐; 픐; 픐; 픐; ) HANGUL SYLLABLE PEULS +D511;D511;1111 1173 11B4;D511;1111 1173 11B4; # (픑; 픑; 픑; 픑; 픑; ) HANGUL SYLLABLE PEULT +D512;D512;1111 1173 11B5;D512;1111 1173 11B5; # (픒; 픒; 픒; 픒; 픒; ) HANGUL SYLLABLE PEULP +D513;D513;1111 1173 11B6;D513;1111 1173 11B6; # (픓; 픓; 픓; 픓; 픓; ) HANGUL SYLLABLE PEULH +D514;D514;1111 1173 11B7;D514;1111 1173 11B7; # (픔; 픔; 픔; 픔; 픔; ) HANGUL SYLLABLE PEUM +D515;D515;1111 1173 11B8;D515;1111 1173 11B8; # (픕; 픕; 픕; 픕; 픕; ) HANGUL SYLLABLE PEUB +D516;D516;1111 1173 11B9;D516;1111 1173 11B9; # (픖; 픖; 픖; 픖; 픖; ) HANGUL SYLLABLE PEUBS +D517;D517;1111 1173 11BA;D517;1111 1173 11BA; # (픗; 픗; 픗; 픗; 픗; ) HANGUL SYLLABLE PEUS +D518;D518;1111 1173 11BB;D518;1111 1173 11BB; # (픘; 픘; 픘; 픘; 픘; ) HANGUL SYLLABLE PEUSS +D519;D519;1111 1173 11BC;D519;1111 1173 11BC; # (픙; 픙; 픙; 픙; 픙; ) HANGUL SYLLABLE PEUNG +D51A;D51A;1111 1173 11BD;D51A;1111 1173 11BD; # (픚; 픚; 픚; 픚; 픚; ) HANGUL SYLLABLE PEUJ +D51B;D51B;1111 1173 11BE;D51B;1111 1173 11BE; # (픛; 픛; 픛; 픛; 픛; ) HANGUL SYLLABLE PEUC +D51C;D51C;1111 1173 11BF;D51C;1111 1173 11BF; # (픜; 픜; 픜; 픜; 픜; ) HANGUL SYLLABLE PEUK +D51D;D51D;1111 1173 11C0;D51D;1111 1173 11C0; # (픝; 픝; 픝; 픝; 픝; ) HANGUL SYLLABLE PEUT +D51E;D51E;1111 1173 11C1;D51E;1111 1173 11C1; # (픞; 픞; 픞; 픞; 픞; ) HANGUL SYLLABLE PEUP +D51F;D51F;1111 1173 11C2;D51F;1111 1173 11C2; # (픟; 픟; 픟; 픟; 픟; ) HANGUL SYLLABLE PEUH +D520;D520;1111 1174;D520;1111 1174; # (픠; 픠; 픠; 픠; 픠; ) HANGUL SYLLABLE PYI +D521;D521;1111 1174 11A8;D521;1111 1174 11A8; # (픡; 픡; 픡; 픡; 픡; ) HANGUL SYLLABLE PYIG +D522;D522;1111 1174 11A9;D522;1111 1174 11A9; # (픢; 픢; 픢; 픢; 픢; ) HANGUL SYLLABLE PYIGG +D523;D523;1111 1174 11AA;D523;1111 1174 11AA; # (픣; 픣; 픣; 픣; 픣; ) HANGUL SYLLABLE PYIGS +D524;D524;1111 1174 11AB;D524;1111 1174 11AB; # (픤; 픤; 픤; 픤; 픤; ) HANGUL SYLLABLE PYIN +D525;D525;1111 1174 11AC;D525;1111 1174 11AC; # (픥; 픥; 픥; 픥; 픥; ) HANGUL SYLLABLE PYINJ +D526;D526;1111 1174 11AD;D526;1111 1174 11AD; # (픦; 픦; 픦; 픦; 픦; ) HANGUL SYLLABLE PYINH +D527;D527;1111 1174 11AE;D527;1111 1174 11AE; # (픧; 픧; 픧; 픧; 픧; ) HANGUL SYLLABLE PYID +D528;D528;1111 1174 11AF;D528;1111 1174 11AF; # (픨; 픨; 픨; 픨; 픨; ) HANGUL SYLLABLE PYIL +D529;D529;1111 1174 11B0;D529;1111 1174 11B0; # (픩; 픩; 픩; 픩; 픩; ) HANGUL SYLLABLE PYILG +D52A;D52A;1111 1174 11B1;D52A;1111 1174 11B1; # (픪; 픪; 픪; 픪; 픪; ) HANGUL SYLLABLE PYILM +D52B;D52B;1111 1174 11B2;D52B;1111 1174 11B2; # (픫; 픫; 픫; 픫; 픫; ) HANGUL SYLLABLE PYILB +D52C;D52C;1111 1174 11B3;D52C;1111 1174 11B3; # (픬; 픬; 픬; 픬; 픬; ) HANGUL SYLLABLE PYILS +D52D;D52D;1111 1174 11B4;D52D;1111 1174 11B4; # (픭; 픭; 픭; 픭; 픭; ) HANGUL SYLLABLE PYILT +D52E;D52E;1111 1174 11B5;D52E;1111 1174 11B5; # (픮; 픮; 픮; 픮; 픮; ) HANGUL SYLLABLE PYILP +D52F;D52F;1111 1174 11B6;D52F;1111 1174 11B6; # (픯; 픯; 픯; 픯; 픯; ) HANGUL SYLLABLE PYILH +D530;D530;1111 1174 11B7;D530;1111 1174 11B7; # (픰; 픰; 픰; 픰; 픰; ) HANGUL SYLLABLE PYIM +D531;D531;1111 1174 11B8;D531;1111 1174 11B8; # (픱; 픱; 픱; 픱; 픱; ) HANGUL SYLLABLE PYIB +D532;D532;1111 1174 11B9;D532;1111 1174 11B9; # (픲; 픲; 픲; 픲; 픲; ) HANGUL SYLLABLE PYIBS +D533;D533;1111 1174 11BA;D533;1111 1174 11BA; # (픳; 픳; 픳; 픳; 픳; ) HANGUL SYLLABLE PYIS +D534;D534;1111 1174 11BB;D534;1111 1174 11BB; # (픴; 픴; 픴; 픴; 픴; ) HANGUL SYLLABLE PYISS +D535;D535;1111 1174 11BC;D535;1111 1174 11BC; # (픵; 픵; 픵; 픵; 픵; ) HANGUL SYLLABLE PYING +D536;D536;1111 1174 11BD;D536;1111 1174 11BD; # (픶; 픶; 픶; 픶; 픶; ) HANGUL SYLLABLE PYIJ +D537;D537;1111 1174 11BE;D537;1111 1174 11BE; # (픷; 픷; 픷; 픷; 픷; ) HANGUL SYLLABLE PYIC +D538;D538;1111 1174 11BF;D538;1111 1174 11BF; # (픸; 픸; 픸; 픸; 픸; ) HANGUL SYLLABLE PYIK +D539;D539;1111 1174 11C0;D539;1111 1174 11C0; # (픹; 픹; 픹; 픹; 픹; ) HANGUL SYLLABLE PYIT +D53A;D53A;1111 1174 11C1;D53A;1111 1174 11C1; # (픺; 픺; 픺; 픺; 픺; ) HANGUL SYLLABLE PYIP +D53B;D53B;1111 1174 11C2;D53B;1111 1174 11C2; # (픻; 픻; 픻; 픻; 픻; ) HANGUL SYLLABLE PYIH +D53C;D53C;1111 1175;D53C;1111 1175; # (피; 피; 피; 피; 피; ) HANGUL SYLLABLE PI +D53D;D53D;1111 1175 11A8;D53D;1111 1175 11A8; # (픽; 픽; 픽; 픽; 픽; ) HANGUL SYLLABLE PIG +D53E;D53E;1111 1175 11A9;D53E;1111 1175 11A9; # (픾; 픾; 픾; 픾; 픾; ) HANGUL SYLLABLE PIGG +D53F;D53F;1111 1175 11AA;D53F;1111 1175 11AA; # (픿; 픿; 픿; 픿; 픿; ) HANGUL SYLLABLE PIGS +D540;D540;1111 1175 11AB;D540;1111 1175 11AB; # (핀; 핀; 핀; 핀; 핀; ) HANGUL SYLLABLE PIN +D541;D541;1111 1175 11AC;D541;1111 1175 11AC; # (핁; 핁; 핁; 핁; 핁; ) HANGUL SYLLABLE PINJ +D542;D542;1111 1175 11AD;D542;1111 1175 11AD; # (핂; 핂; 핂; 핂; 핂; ) HANGUL SYLLABLE PINH +D543;D543;1111 1175 11AE;D543;1111 1175 11AE; # (핃; 핃; 핃; 핃; 핃; ) HANGUL SYLLABLE PID +D544;D544;1111 1175 11AF;D544;1111 1175 11AF; # (필; 필; 필; 필; 필; ) HANGUL SYLLABLE PIL +D545;D545;1111 1175 11B0;D545;1111 1175 11B0; # (핅; 핅; 핅; 핅; 핅; ) HANGUL SYLLABLE PILG +D546;D546;1111 1175 11B1;D546;1111 1175 11B1; # (핆; 핆; 핆; 핆; 핆; ) HANGUL SYLLABLE PILM +D547;D547;1111 1175 11B2;D547;1111 1175 11B2; # (핇; 핇; 핇; 핇; 핇; ) HANGUL SYLLABLE PILB +D548;D548;1111 1175 11B3;D548;1111 1175 11B3; # (핈; 핈; 핈; 핈; 핈; ) HANGUL SYLLABLE PILS +D549;D549;1111 1175 11B4;D549;1111 1175 11B4; # (핉; 핉; 핉; 핉; 핉; ) HANGUL SYLLABLE PILT +D54A;D54A;1111 1175 11B5;D54A;1111 1175 11B5; # (핊; 핊; 핊; 핊; 핊; ) HANGUL SYLLABLE PILP +D54B;D54B;1111 1175 11B6;D54B;1111 1175 11B6; # (핋; 핋; 핋; 핋; 핋; ) HANGUL SYLLABLE PILH +D54C;D54C;1111 1175 11B7;D54C;1111 1175 11B7; # (핌; 핌; 핌; 핌; 핌; ) HANGUL SYLLABLE PIM +D54D;D54D;1111 1175 11B8;D54D;1111 1175 11B8; # (핍; 핍; 핍; 핍; 핍; ) HANGUL SYLLABLE PIB +D54E;D54E;1111 1175 11B9;D54E;1111 1175 11B9; # (핎; 핎; 핎; 핎; 핎; ) HANGUL SYLLABLE PIBS +D54F;D54F;1111 1175 11BA;D54F;1111 1175 11BA; # (핏; 핏; 핏; 핏; 핏; ) HANGUL SYLLABLE PIS +D550;D550;1111 1175 11BB;D550;1111 1175 11BB; # (핐; 핐; 핐; 핐; 핐; ) HANGUL SYLLABLE PISS +D551;D551;1111 1175 11BC;D551;1111 1175 11BC; # (핑; 핑; 핑; 핑; 핑; ) HANGUL SYLLABLE PING +D552;D552;1111 1175 11BD;D552;1111 1175 11BD; # (핒; 핒; 핒; 핒; 핒; ) HANGUL SYLLABLE PIJ +D553;D553;1111 1175 11BE;D553;1111 1175 11BE; # (핓; 핓; 핓; 핓; 핓; ) HANGUL SYLLABLE PIC +D554;D554;1111 1175 11BF;D554;1111 1175 11BF; # (핔; 핔; 핔; 핔; 핔; ) HANGUL SYLLABLE PIK +D555;D555;1111 1175 11C0;D555;1111 1175 11C0; # (핕; 핕; 핕; 핕; 핕; ) HANGUL SYLLABLE PIT +D556;D556;1111 1175 11C1;D556;1111 1175 11C1; # (핖; 핖; 핖; 핖; 핖; ) HANGUL SYLLABLE PIP +D557;D557;1111 1175 11C2;D557;1111 1175 11C2; # (핗; 핗; 핗; 핗; 핗; ) HANGUL SYLLABLE PIH +D558;D558;1112 1161;D558;1112 1161; # (하; 하; 하; 하; 하; ) HANGUL SYLLABLE HA +D559;D559;1112 1161 11A8;D559;1112 1161 11A8; # (학; 학; 학; 학; 학; ) HANGUL SYLLABLE HAG +D55A;D55A;1112 1161 11A9;D55A;1112 1161 11A9; # (핚; 핚; 핚; 핚; 핚; ) HANGUL SYLLABLE HAGG +D55B;D55B;1112 1161 11AA;D55B;1112 1161 11AA; # (핛; 핛; 핛; 핛; 핛; ) HANGUL SYLLABLE HAGS +D55C;D55C;1112 1161 11AB;D55C;1112 1161 11AB; # (한; 한; 한; 한; 한; ) HANGUL SYLLABLE HAN +D55D;D55D;1112 1161 11AC;D55D;1112 1161 11AC; # (핝; 핝; 핝; 핝; 핝; ) HANGUL SYLLABLE HANJ +D55E;D55E;1112 1161 11AD;D55E;1112 1161 11AD; # (핞; 핞; 핞; 핞; 핞; ) HANGUL SYLLABLE HANH +D55F;D55F;1112 1161 11AE;D55F;1112 1161 11AE; # (핟; 핟; 핟; 핟; 핟; ) HANGUL SYLLABLE HAD +D560;D560;1112 1161 11AF;D560;1112 1161 11AF; # (할; 할; 할; 할; 할; ) HANGUL SYLLABLE HAL +D561;D561;1112 1161 11B0;D561;1112 1161 11B0; # (핡; 핡; 핡; 핡; 핡; ) HANGUL SYLLABLE HALG +D562;D562;1112 1161 11B1;D562;1112 1161 11B1; # (핢; 핢; 핢; 핢; 핢; ) HANGUL SYLLABLE HALM +D563;D563;1112 1161 11B2;D563;1112 1161 11B2; # (핣; 핣; 핣; 핣; 핣; ) HANGUL SYLLABLE HALB +D564;D564;1112 1161 11B3;D564;1112 1161 11B3; # (핤; 핤; 핤; 핤; 핤; ) HANGUL SYLLABLE HALS +D565;D565;1112 1161 11B4;D565;1112 1161 11B4; # (핥; 핥; 핥; 핥; 핥; ) HANGUL SYLLABLE HALT +D566;D566;1112 1161 11B5;D566;1112 1161 11B5; # (핦; 핦; 핦; 핦; 핦; ) HANGUL SYLLABLE HALP +D567;D567;1112 1161 11B6;D567;1112 1161 11B6; # (핧; 핧; 핧; 핧; 핧; ) HANGUL SYLLABLE HALH +D568;D568;1112 1161 11B7;D568;1112 1161 11B7; # (함; 함; 함; 함; 함; ) HANGUL SYLLABLE HAM +D569;D569;1112 1161 11B8;D569;1112 1161 11B8; # (합; 합; 합; 합; 합; ) HANGUL SYLLABLE HAB +D56A;D56A;1112 1161 11B9;D56A;1112 1161 11B9; # (핪; 핪; 핪; 핪; 핪; ) HANGUL SYLLABLE HABS +D56B;D56B;1112 1161 11BA;D56B;1112 1161 11BA; # (핫; 핫; 핫; 핫; 핫; ) HANGUL SYLLABLE HAS +D56C;D56C;1112 1161 11BB;D56C;1112 1161 11BB; # (핬; 핬; 핬; 핬; 핬; ) HANGUL SYLLABLE HASS +D56D;D56D;1112 1161 11BC;D56D;1112 1161 11BC; # (항; 항; 항; 항; 항; ) HANGUL SYLLABLE HANG +D56E;D56E;1112 1161 11BD;D56E;1112 1161 11BD; # (핮; 핮; 핮; 핮; 핮; ) HANGUL SYLLABLE HAJ +D56F;D56F;1112 1161 11BE;D56F;1112 1161 11BE; # (핯; 핯; 핯; 핯; 핯; ) HANGUL SYLLABLE HAC +D570;D570;1112 1161 11BF;D570;1112 1161 11BF; # (핰; 핰; 핰; 핰; 핰; ) HANGUL SYLLABLE HAK +D571;D571;1112 1161 11C0;D571;1112 1161 11C0; # (핱; 핱; 핱; 핱; 핱; ) HANGUL SYLLABLE HAT +D572;D572;1112 1161 11C1;D572;1112 1161 11C1; # (핲; 핲; 핲; 핲; 핲; ) HANGUL SYLLABLE HAP +D573;D573;1112 1161 11C2;D573;1112 1161 11C2; # (핳; 핳; 핳; 핳; 핳; ) HANGUL SYLLABLE HAH +D574;D574;1112 1162;D574;1112 1162; # (해; 해; 해; 해; 해; ) HANGUL SYLLABLE HAE +D575;D575;1112 1162 11A8;D575;1112 1162 11A8; # (핵; 핵; 핵; 핵; 핵; ) HANGUL SYLLABLE HAEG +D576;D576;1112 1162 11A9;D576;1112 1162 11A9; # (핶; 핶; 핶; 핶; 핶; ) HANGUL SYLLABLE HAEGG +D577;D577;1112 1162 11AA;D577;1112 1162 11AA; # (핷; 핷; 핷; 핷; 핷; ) HANGUL SYLLABLE HAEGS +D578;D578;1112 1162 11AB;D578;1112 1162 11AB; # (핸; 핸; 핸; 핸; 핸; ) HANGUL SYLLABLE HAEN +D579;D579;1112 1162 11AC;D579;1112 1162 11AC; # (핹; 핹; 핹; 핹; 핹; ) HANGUL SYLLABLE HAENJ +D57A;D57A;1112 1162 11AD;D57A;1112 1162 11AD; # (핺; 핺; 핺; 핺; 핺; ) HANGUL SYLLABLE HAENH +D57B;D57B;1112 1162 11AE;D57B;1112 1162 11AE; # (핻; 핻; 핻; 핻; 핻; ) HANGUL SYLLABLE HAED +D57C;D57C;1112 1162 11AF;D57C;1112 1162 11AF; # (핼; 핼; 핼; 핼; 핼; ) HANGUL SYLLABLE HAEL +D57D;D57D;1112 1162 11B0;D57D;1112 1162 11B0; # (핽; 핽; 핽; 핽; 핽; ) HANGUL SYLLABLE HAELG +D57E;D57E;1112 1162 11B1;D57E;1112 1162 11B1; # (핾; 핾; 핾; 핾; 핾; ) HANGUL SYLLABLE HAELM +D57F;D57F;1112 1162 11B2;D57F;1112 1162 11B2; # (핿; 핿; 핿; 핿; 핿; ) HANGUL SYLLABLE HAELB +D580;D580;1112 1162 11B3;D580;1112 1162 11B3; # (햀; 햀; 햀; 햀; 햀; ) HANGUL SYLLABLE HAELS +D581;D581;1112 1162 11B4;D581;1112 1162 11B4; # (햁; 햁; 햁; 햁; 햁; ) HANGUL SYLLABLE HAELT +D582;D582;1112 1162 11B5;D582;1112 1162 11B5; # (햂; 햂; 햂; 햂; 햂; ) HANGUL SYLLABLE HAELP +D583;D583;1112 1162 11B6;D583;1112 1162 11B6; # (햃; 햃; 햃; 햃; 햃; ) HANGUL SYLLABLE HAELH +D584;D584;1112 1162 11B7;D584;1112 1162 11B7; # (햄; 햄; 햄; 햄; 햄; ) HANGUL SYLLABLE HAEM +D585;D585;1112 1162 11B8;D585;1112 1162 11B8; # (햅; 햅; 햅; 햅; 햅; ) HANGUL SYLLABLE HAEB +D586;D586;1112 1162 11B9;D586;1112 1162 11B9; # (햆; 햆; 햆; 햆; 햆; ) HANGUL SYLLABLE HAEBS +D587;D587;1112 1162 11BA;D587;1112 1162 11BA; # (햇; 햇; 햇; 햇; 햇; ) HANGUL SYLLABLE HAES +D588;D588;1112 1162 11BB;D588;1112 1162 11BB; # (했; 했; 했; 했; 했; ) HANGUL SYLLABLE HAESS +D589;D589;1112 1162 11BC;D589;1112 1162 11BC; # (행; 행; 행; 행; 행; ) HANGUL SYLLABLE HAENG +D58A;D58A;1112 1162 11BD;D58A;1112 1162 11BD; # (햊; 햊; 햊; 햊; 햊; ) HANGUL SYLLABLE HAEJ +D58B;D58B;1112 1162 11BE;D58B;1112 1162 11BE; # (햋; 햋; 햋; 햋; 햋; ) HANGUL SYLLABLE HAEC +D58C;D58C;1112 1162 11BF;D58C;1112 1162 11BF; # (햌; 햌; 햌; 햌; 햌; ) HANGUL SYLLABLE HAEK +D58D;D58D;1112 1162 11C0;D58D;1112 1162 11C0; # (햍; 햍; 햍; 햍; 햍; ) HANGUL SYLLABLE HAET +D58E;D58E;1112 1162 11C1;D58E;1112 1162 11C1; # (햎; 햎; 햎; 햎; 햎; ) HANGUL SYLLABLE HAEP +D58F;D58F;1112 1162 11C2;D58F;1112 1162 11C2; # (햏; 햏; 햏; 햏; 햏; ) HANGUL SYLLABLE HAEH +D590;D590;1112 1163;D590;1112 1163; # (햐; 햐; 햐; 햐; 햐; ) HANGUL SYLLABLE HYA +D591;D591;1112 1163 11A8;D591;1112 1163 11A8; # (햑; 햑; 햑; 햑; 햑; ) HANGUL SYLLABLE HYAG +D592;D592;1112 1163 11A9;D592;1112 1163 11A9; # (햒; 햒; 햒; 햒; 햒; ) HANGUL SYLLABLE HYAGG +D593;D593;1112 1163 11AA;D593;1112 1163 11AA; # (햓; 햓; 햓; 햓; 햓; ) HANGUL SYLLABLE HYAGS +D594;D594;1112 1163 11AB;D594;1112 1163 11AB; # (햔; 햔; 햔; 햔; 햔; ) HANGUL SYLLABLE HYAN +D595;D595;1112 1163 11AC;D595;1112 1163 11AC; # (햕; 햕; 햕; 햕; 햕; ) HANGUL SYLLABLE HYANJ +D596;D596;1112 1163 11AD;D596;1112 1163 11AD; # (햖; 햖; 햖; 햖; 햖; ) HANGUL SYLLABLE HYANH +D597;D597;1112 1163 11AE;D597;1112 1163 11AE; # (햗; 햗; 햗; 햗; 햗; ) HANGUL SYLLABLE HYAD +D598;D598;1112 1163 11AF;D598;1112 1163 11AF; # (햘; 햘; 햘; 햘; 햘; ) HANGUL SYLLABLE HYAL +D599;D599;1112 1163 11B0;D599;1112 1163 11B0; # (햙; 햙; 햙; 햙; 햙; ) HANGUL SYLLABLE HYALG +D59A;D59A;1112 1163 11B1;D59A;1112 1163 11B1; # (햚; 햚; 햚; 햚; 햚; ) HANGUL SYLLABLE HYALM +D59B;D59B;1112 1163 11B2;D59B;1112 1163 11B2; # (햛; 햛; 햛; 햛; 햛; ) HANGUL SYLLABLE HYALB +D59C;D59C;1112 1163 11B3;D59C;1112 1163 11B3; # (햜; 햜; 햜; 햜; 햜; ) HANGUL SYLLABLE HYALS +D59D;D59D;1112 1163 11B4;D59D;1112 1163 11B4; # (햝; 햝; 햝; 햝; 햝; ) HANGUL SYLLABLE HYALT +D59E;D59E;1112 1163 11B5;D59E;1112 1163 11B5; # (햞; 햞; 햞; 햞; 햞; ) HANGUL SYLLABLE HYALP +D59F;D59F;1112 1163 11B6;D59F;1112 1163 11B6; # (햟; 햟; 햟; 햟; 햟; ) HANGUL SYLLABLE HYALH +D5A0;D5A0;1112 1163 11B7;D5A0;1112 1163 11B7; # (햠; 햠; 햠; 햠; 햠; ) HANGUL SYLLABLE HYAM +D5A1;D5A1;1112 1163 11B8;D5A1;1112 1163 11B8; # (햡; 햡; 햡; 햡; 햡; ) HANGUL SYLLABLE HYAB +D5A2;D5A2;1112 1163 11B9;D5A2;1112 1163 11B9; # (햢; 햢; 햢; 햢; 햢; ) HANGUL SYLLABLE HYABS +D5A3;D5A3;1112 1163 11BA;D5A3;1112 1163 11BA; # (햣; 햣; 햣; 햣; 햣; ) HANGUL SYLLABLE HYAS +D5A4;D5A4;1112 1163 11BB;D5A4;1112 1163 11BB; # (햤; 햤; 햤; 햤; 햤; ) HANGUL SYLLABLE HYASS +D5A5;D5A5;1112 1163 11BC;D5A5;1112 1163 11BC; # (향; 향; 향; 향; 향; ) HANGUL SYLLABLE HYANG +D5A6;D5A6;1112 1163 11BD;D5A6;1112 1163 11BD; # (햦; 햦; 햦; 햦; 햦; ) HANGUL SYLLABLE HYAJ +D5A7;D5A7;1112 1163 11BE;D5A7;1112 1163 11BE; # (햧; 햧; 햧; 햧; 햧; ) HANGUL SYLLABLE HYAC +D5A8;D5A8;1112 1163 11BF;D5A8;1112 1163 11BF; # (햨; 햨; 햨; 햨; 햨; ) HANGUL SYLLABLE HYAK +D5A9;D5A9;1112 1163 11C0;D5A9;1112 1163 11C0; # (햩; 햩; 햩; 햩; 햩; ) HANGUL SYLLABLE HYAT +D5AA;D5AA;1112 1163 11C1;D5AA;1112 1163 11C1; # (햪; 햪; 햪; 햪; 햪; ) HANGUL SYLLABLE HYAP +D5AB;D5AB;1112 1163 11C2;D5AB;1112 1163 11C2; # (햫; 햫; 햫; 햫; 햫; ) HANGUL SYLLABLE HYAH +D5AC;D5AC;1112 1164;D5AC;1112 1164; # (햬; 햬; 햬; 햬; 햬; ) HANGUL SYLLABLE HYAE +D5AD;D5AD;1112 1164 11A8;D5AD;1112 1164 11A8; # (햭; 햭; 햭; 햭; 햭; ) HANGUL SYLLABLE HYAEG +D5AE;D5AE;1112 1164 11A9;D5AE;1112 1164 11A9; # (햮; 햮; 햮; 햮; 햮; ) HANGUL SYLLABLE HYAEGG +D5AF;D5AF;1112 1164 11AA;D5AF;1112 1164 11AA; # (햯; 햯; 햯; 햯; 햯; ) HANGUL SYLLABLE HYAEGS +D5B0;D5B0;1112 1164 11AB;D5B0;1112 1164 11AB; # (햰; 햰; 햰; 햰; 햰; ) HANGUL SYLLABLE HYAEN +D5B1;D5B1;1112 1164 11AC;D5B1;1112 1164 11AC; # (햱; 햱; 햱; 햱; 햱; ) HANGUL SYLLABLE HYAENJ +D5B2;D5B2;1112 1164 11AD;D5B2;1112 1164 11AD; # (햲; 햲; 햲; 햲; 햲; ) HANGUL SYLLABLE HYAENH +D5B3;D5B3;1112 1164 11AE;D5B3;1112 1164 11AE; # (햳; 햳; 햳; 햳; 햳; ) HANGUL SYLLABLE HYAED +D5B4;D5B4;1112 1164 11AF;D5B4;1112 1164 11AF; # (햴; 햴; 햴; 햴; 햴; ) HANGUL SYLLABLE HYAEL +D5B5;D5B5;1112 1164 11B0;D5B5;1112 1164 11B0; # (햵; 햵; 햵; 햵; 햵; ) HANGUL SYLLABLE HYAELG +D5B6;D5B6;1112 1164 11B1;D5B6;1112 1164 11B1; # (햶; 햶; 햶; 햶; 햶; ) HANGUL SYLLABLE HYAELM +D5B7;D5B7;1112 1164 11B2;D5B7;1112 1164 11B2; # (햷; 햷; 햷; 햷; 햷; ) HANGUL SYLLABLE HYAELB +D5B8;D5B8;1112 1164 11B3;D5B8;1112 1164 11B3; # (햸; 햸; 햸; 햸; 햸; ) HANGUL SYLLABLE HYAELS +D5B9;D5B9;1112 1164 11B4;D5B9;1112 1164 11B4; # (햹; 햹; 햹; 햹; 햹; ) HANGUL SYLLABLE HYAELT +D5BA;D5BA;1112 1164 11B5;D5BA;1112 1164 11B5; # (햺; 햺; 햺; 햺; 햺; ) HANGUL SYLLABLE HYAELP +D5BB;D5BB;1112 1164 11B6;D5BB;1112 1164 11B6; # (햻; 햻; 햻; 햻; 햻; ) HANGUL SYLLABLE HYAELH +D5BC;D5BC;1112 1164 11B7;D5BC;1112 1164 11B7; # (햼; 햼; 햼; 햼; 햼; ) HANGUL SYLLABLE HYAEM +D5BD;D5BD;1112 1164 11B8;D5BD;1112 1164 11B8; # (햽; 햽; 햽; 햽; 햽; ) HANGUL SYLLABLE HYAEB +D5BE;D5BE;1112 1164 11B9;D5BE;1112 1164 11B9; # (햾; 햾; 햾; 햾; 햾; ) HANGUL SYLLABLE HYAEBS +D5BF;D5BF;1112 1164 11BA;D5BF;1112 1164 11BA; # (햿; 햿; 햿; 햿; 햿; ) HANGUL SYLLABLE HYAES +D5C0;D5C0;1112 1164 11BB;D5C0;1112 1164 11BB; # (헀; 헀; 헀; 헀; 헀; ) HANGUL SYLLABLE HYAESS +D5C1;D5C1;1112 1164 11BC;D5C1;1112 1164 11BC; # (헁; 헁; 헁; 헁; 헁; ) HANGUL SYLLABLE HYAENG +D5C2;D5C2;1112 1164 11BD;D5C2;1112 1164 11BD; # (헂; 헂; 헂; 헂; 헂; ) HANGUL SYLLABLE HYAEJ +D5C3;D5C3;1112 1164 11BE;D5C3;1112 1164 11BE; # (헃; 헃; 헃; 헃; 헃; ) HANGUL SYLLABLE HYAEC +D5C4;D5C4;1112 1164 11BF;D5C4;1112 1164 11BF; # (헄; 헄; 헄; 헄; 헄; ) HANGUL SYLLABLE HYAEK +D5C5;D5C5;1112 1164 11C0;D5C5;1112 1164 11C0; # (헅; 헅; 헅; 헅; 헅; ) HANGUL SYLLABLE HYAET +D5C6;D5C6;1112 1164 11C1;D5C6;1112 1164 11C1; # (헆; 헆; 헆; 헆; 헆; ) HANGUL SYLLABLE HYAEP +D5C7;D5C7;1112 1164 11C2;D5C7;1112 1164 11C2; # (헇; 헇; 헇; 헇; 헇; ) HANGUL SYLLABLE HYAEH +D5C8;D5C8;1112 1165;D5C8;1112 1165; # (허; 허; 허; 허; 허; ) HANGUL SYLLABLE HEO +D5C9;D5C9;1112 1165 11A8;D5C9;1112 1165 11A8; # (헉; 헉; 헉; 헉; 헉; ) HANGUL SYLLABLE HEOG +D5CA;D5CA;1112 1165 11A9;D5CA;1112 1165 11A9; # (헊; 헊; 헊; 헊; 헊; ) HANGUL SYLLABLE HEOGG +D5CB;D5CB;1112 1165 11AA;D5CB;1112 1165 11AA; # (헋; 헋; 헋; 헋; 헋; ) HANGUL SYLLABLE HEOGS +D5CC;D5CC;1112 1165 11AB;D5CC;1112 1165 11AB; # (헌; 헌; 헌; 헌; 헌; ) HANGUL SYLLABLE HEON +D5CD;D5CD;1112 1165 11AC;D5CD;1112 1165 11AC; # (헍; 헍; 헍; 헍; 헍; ) HANGUL SYLLABLE HEONJ +D5CE;D5CE;1112 1165 11AD;D5CE;1112 1165 11AD; # (헎; 헎; 헎; 헎; 헎; ) HANGUL SYLLABLE HEONH +D5CF;D5CF;1112 1165 11AE;D5CF;1112 1165 11AE; # (헏; 헏; 헏; 헏; 헏; ) HANGUL SYLLABLE HEOD +D5D0;D5D0;1112 1165 11AF;D5D0;1112 1165 11AF; # (헐; 헐; 헐; 헐; 헐; ) HANGUL SYLLABLE HEOL +D5D1;D5D1;1112 1165 11B0;D5D1;1112 1165 11B0; # (헑; 헑; 헑; 헑; 헑; ) HANGUL SYLLABLE HEOLG +D5D2;D5D2;1112 1165 11B1;D5D2;1112 1165 11B1; # (헒; 헒; 헒; 헒; 헒; ) HANGUL SYLLABLE HEOLM +D5D3;D5D3;1112 1165 11B2;D5D3;1112 1165 11B2; # (헓; 헓; 헓; 헓; 헓; ) HANGUL SYLLABLE HEOLB +D5D4;D5D4;1112 1165 11B3;D5D4;1112 1165 11B3; # (헔; 헔; 헔; 헔; 헔; ) HANGUL SYLLABLE HEOLS +D5D5;D5D5;1112 1165 11B4;D5D5;1112 1165 11B4; # (헕; 헕; 헕; 헕; 헕; ) HANGUL SYLLABLE HEOLT +D5D6;D5D6;1112 1165 11B5;D5D6;1112 1165 11B5; # (헖; 헖; 헖; 헖; 헖; ) HANGUL SYLLABLE HEOLP +D5D7;D5D7;1112 1165 11B6;D5D7;1112 1165 11B6; # (헗; 헗; 헗; 헗; 헗; ) HANGUL SYLLABLE HEOLH +D5D8;D5D8;1112 1165 11B7;D5D8;1112 1165 11B7; # (험; 험; 험; 험; 험; ) HANGUL SYLLABLE HEOM +D5D9;D5D9;1112 1165 11B8;D5D9;1112 1165 11B8; # (헙; 헙; 헙; 헙; 헙; ) HANGUL SYLLABLE HEOB +D5DA;D5DA;1112 1165 11B9;D5DA;1112 1165 11B9; # (헚; 헚; 헚; 헚; 헚; ) HANGUL SYLLABLE HEOBS +D5DB;D5DB;1112 1165 11BA;D5DB;1112 1165 11BA; # (헛; 헛; 헛; 헛; 헛; ) HANGUL SYLLABLE HEOS +D5DC;D5DC;1112 1165 11BB;D5DC;1112 1165 11BB; # (헜; 헜; 헜; 헜; 헜; ) HANGUL SYLLABLE HEOSS +D5DD;D5DD;1112 1165 11BC;D5DD;1112 1165 11BC; # (헝; 헝; 헝; 헝; 헝; ) HANGUL SYLLABLE HEONG +D5DE;D5DE;1112 1165 11BD;D5DE;1112 1165 11BD; # (헞; 헞; 헞; 헞; 헞; ) HANGUL SYLLABLE HEOJ +D5DF;D5DF;1112 1165 11BE;D5DF;1112 1165 11BE; # (헟; 헟; 헟; 헟; 헟; ) HANGUL SYLLABLE HEOC +D5E0;D5E0;1112 1165 11BF;D5E0;1112 1165 11BF; # (헠; 헠; 헠; 헠; 헠; ) HANGUL SYLLABLE HEOK +D5E1;D5E1;1112 1165 11C0;D5E1;1112 1165 11C0; # (헡; 헡; 헡; 헡; 헡; ) HANGUL SYLLABLE HEOT +D5E2;D5E2;1112 1165 11C1;D5E2;1112 1165 11C1; # (헢; 헢; 헢; 헢; 헢; ) HANGUL SYLLABLE HEOP +D5E3;D5E3;1112 1165 11C2;D5E3;1112 1165 11C2; # (헣; 헣; 헣; 헣; 헣; ) HANGUL SYLLABLE HEOH +D5E4;D5E4;1112 1166;D5E4;1112 1166; # (헤; 헤; 헤; 헤; 헤; ) HANGUL SYLLABLE HE +D5E5;D5E5;1112 1166 11A8;D5E5;1112 1166 11A8; # (헥; 헥; 헥; 헥; 헥; ) HANGUL SYLLABLE HEG +D5E6;D5E6;1112 1166 11A9;D5E6;1112 1166 11A9; # (헦; 헦; 헦; 헦; 헦; ) HANGUL SYLLABLE HEGG +D5E7;D5E7;1112 1166 11AA;D5E7;1112 1166 11AA; # (헧; 헧; 헧; 헧; 헧; ) HANGUL SYLLABLE HEGS +D5E8;D5E8;1112 1166 11AB;D5E8;1112 1166 11AB; # (헨; 헨; 헨; 헨; 헨; ) HANGUL SYLLABLE HEN +D5E9;D5E9;1112 1166 11AC;D5E9;1112 1166 11AC; # (헩; 헩; 헩; 헩; 헩; ) HANGUL SYLLABLE HENJ +D5EA;D5EA;1112 1166 11AD;D5EA;1112 1166 11AD; # (헪; 헪; 헪; 헪; 헪; ) HANGUL SYLLABLE HENH +D5EB;D5EB;1112 1166 11AE;D5EB;1112 1166 11AE; # (헫; 헫; 헫; 헫; 헫; ) HANGUL SYLLABLE HED +D5EC;D5EC;1112 1166 11AF;D5EC;1112 1166 11AF; # (헬; 헬; 헬; 헬; 헬; ) HANGUL SYLLABLE HEL +D5ED;D5ED;1112 1166 11B0;D5ED;1112 1166 11B0; # (헭; 헭; 헭; 헭; 헭; ) HANGUL SYLLABLE HELG +D5EE;D5EE;1112 1166 11B1;D5EE;1112 1166 11B1; # (헮; 헮; 헮; 헮; 헮; ) HANGUL SYLLABLE HELM +D5EF;D5EF;1112 1166 11B2;D5EF;1112 1166 11B2; # (헯; 헯; 헯; 헯; 헯; ) HANGUL SYLLABLE HELB +D5F0;D5F0;1112 1166 11B3;D5F0;1112 1166 11B3; # (헰; 헰; 헰; 헰; 헰; ) HANGUL SYLLABLE HELS +D5F1;D5F1;1112 1166 11B4;D5F1;1112 1166 11B4; # (헱; 헱; 헱; 헱; 헱; ) HANGUL SYLLABLE HELT +D5F2;D5F2;1112 1166 11B5;D5F2;1112 1166 11B5; # (헲; 헲; 헲; 헲; 헲; ) HANGUL SYLLABLE HELP +D5F3;D5F3;1112 1166 11B6;D5F3;1112 1166 11B6; # (헳; 헳; 헳; 헳; 헳; ) HANGUL SYLLABLE HELH +D5F4;D5F4;1112 1166 11B7;D5F4;1112 1166 11B7; # (헴; 헴; 헴; 헴; 헴; ) HANGUL SYLLABLE HEM +D5F5;D5F5;1112 1166 11B8;D5F5;1112 1166 11B8; # (헵; 헵; 헵; 헵; 헵; ) HANGUL SYLLABLE HEB +D5F6;D5F6;1112 1166 11B9;D5F6;1112 1166 11B9; # (헶; 헶; 헶; 헶; 헶; ) HANGUL SYLLABLE HEBS +D5F7;D5F7;1112 1166 11BA;D5F7;1112 1166 11BA; # (헷; 헷; 헷; 헷; 헷; ) HANGUL SYLLABLE HES +D5F8;D5F8;1112 1166 11BB;D5F8;1112 1166 11BB; # (헸; 헸; 헸; 헸; 헸; ) HANGUL SYLLABLE HESS +D5F9;D5F9;1112 1166 11BC;D5F9;1112 1166 11BC; # (헹; 헹; 헹; 헹; 헹; ) HANGUL SYLLABLE HENG +D5FA;D5FA;1112 1166 11BD;D5FA;1112 1166 11BD; # (헺; 헺; 헺; 헺; 헺; ) HANGUL SYLLABLE HEJ +D5FB;D5FB;1112 1166 11BE;D5FB;1112 1166 11BE; # (헻; 헻; 헻; 헻; 헻; ) HANGUL SYLLABLE HEC +D5FC;D5FC;1112 1166 11BF;D5FC;1112 1166 11BF; # (헼; 헼; 헼; 헼; 헼; ) HANGUL SYLLABLE HEK +D5FD;D5FD;1112 1166 11C0;D5FD;1112 1166 11C0; # (헽; 헽; 헽; 헽; 헽; ) HANGUL SYLLABLE HET +D5FE;D5FE;1112 1166 11C1;D5FE;1112 1166 11C1; # (헾; 헾; 헾; 헾; 헾; ) HANGUL SYLLABLE HEP +D5FF;D5FF;1112 1166 11C2;D5FF;1112 1166 11C2; # (헿; 헿; 헿; 헿; 헿; ) HANGUL SYLLABLE HEH +D600;D600;1112 1167;D600;1112 1167; # (혀; 혀; 혀; 혀; 혀; ) HANGUL SYLLABLE HYEO +D601;D601;1112 1167 11A8;D601;1112 1167 11A8; # (혁; 혁; 혁; 혁; 혁; ) HANGUL SYLLABLE HYEOG +D602;D602;1112 1167 11A9;D602;1112 1167 11A9; # (혂; 혂; 혂; 혂; 혂; ) HANGUL SYLLABLE HYEOGG +D603;D603;1112 1167 11AA;D603;1112 1167 11AA; # (혃; 혃; 혃; 혃; 혃; ) HANGUL SYLLABLE HYEOGS +D604;D604;1112 1167 11AB;D604;1112 1167 11AB; # (현; 현; 현; 현; 현; ) HANGUL SYLLABLE HYEON +D605;D605;1112 1167 11AC;D605;1112 1167 11AC; # (혅; 혅; 혅; 혅; 혅; ) HANGUL SYLLABLE HYEONJ +D606;D606;1112 1167 11AD;D606;1112 1167 11AD; # (혆; 혆; 혆; 혆; 혆; ) HANGUL SYLLABLE HYEONH +D607;D607;1112 1167 11AE;D607;1112 1167 11AE; # (혇; 혇; 혇; 혇; 혇; ) HANGUL SYLLABLE HYEOD +D608;D608;1112 1167 11AF;D608;1112 1167 11AF; # (혈; 혈; 혈; 혈; 혈; ) HANGUL SYLLABLE HYEOL +D609;D609;1112 1167 11B0;D609;1112 1167 11B0; # (혉; 혉; 혉; 혉; 혉; ) HANGUL SYLLABLE HYEOLG +D60A;D60A;1112 1167 11B1;D60A;1112 1167 11B1; # (혊; 혊; 혊; 혊; 혊; ) HANGUL SYLLABLE HYEOLM +D60B;D60B;1112 1167 11B2;D60B;1112 1167 11B2; # (혋; 혋; 혋; 혋; 혋; ) HANGUL SYLLABLE HYEOLB +D60C;D60C;1112 1167 11B3;D60C;1112 1167 11B3; # (혌; 혌; 혌; 혌; 혌; ) HANGUL SYLLABLE HYEOLS +D60D;D60D;1112 1167 11B4;D60D;1112 1167 11B4; # (혍; 혍; 혍; 혍; 혍; ) HANGUL SYLLABLE HYEOLT +D60E;D60E;1112 1167 11B5;D60E;1112 1167 11B5; # (혎; 혎; 혎; 혎; 혎; ) HANGUL SYLLABLE HYEOLP +D60F;D60F;1112 1167 11B6;D60F;1112 1167 11B6; # (혏; 혏; 혏; 혏; 혏; ) HANGUL SYLLABLE HYEOLH +D610;D610;1112 1167 11B7;D610;1112 1167 11B7; # (혐; 혐; 혐; 혐; 혐; ) HANGUL SYLLABLE HYEOM +D611;D611;1112 1167 11B8;D611;1112 1167 11B8; # (협; 협; 협; 협; 협; ) HANGUL SYLLABLE HYEOB +D612;D612;1112 1167 11B9;D612;1112 1167 11B9; # (혒; 혒; 혒; 혒; 혒; ) HANGUL SYLLABLE HYEOBS +D613;D613;1112 1167 11BA;D613;1112 1167 11BA; # (혓; 혓; 혓; 혓; 혓; ) HANGUL SYLLABLE HYEOS +D614;D614;1112 1167 11BB;D614;1112 1167 11BB; # (혔; 혔; 혔; 혔; 혔; ) HANGUL SYLLABLE HYEOSS +D615;D615;1112 1167 11BC;D615;1112 1167 11BC; # (형; 형; 형; 형; 형; ) HANGUL SYLLABLE HYEONG +D616;D616;1112 1167 11BD;D616;1112 1167 11BD; # (혖; 혖; 혖; 혖; 혖; ) HANGUL SYLLABLE HYEOJ +D617;D617;1112 1167 11BE;D617;1112 1167 11BE; # (혗; 혗; 혗; 혗; 혗; ) HANGUL SYLLABLE HYEOC +D618;D618;1112 1167 11BF;D618;1112 1167 11BF; # (혘; 혘; 혘; 혘; 혘; ) HANGUL SYLLABLE HYEOK +D619;D619;1112 1167 11C0;D619;1112 1167 11C0; # (혙; 혙; 혙; 혙; 혙; ) HANGUL SYLLABLE HYEOT +D61A;D61A;1112 1167 11C1;D61A;1112 1167 11C1; # (혚; 혚; 혚; 혚; 혚; ) HANGUL SYLLABLE HYEOP +D61B;D61B;1112 1167 11C2;D61B;1112 1167 11C2; # (혛; 혛; 혛; 혛; 혛; ) HANGUL SYLLABLE HYEOH +D61C;D61C;1112 1168;D61C;1112 1168; # (혜; 혜; 혜; 혜; 혜; ) HANGUL SYLLABLE HYE +D61D;D61D;1112 1168 11A8;D61D;1112 1168 11A8; # (혝; 혝; 혝; 혝; 혝; ) HANGUL SYLLABLE HYEG +D61E;D61E;1112 1168 11A9;D61E;1112 1168 11A9; # (혞; 혞; 혞; 혞; 혞; ) HANGUL SYLLABLE HYEGG +D61F;D61F;1112 1168 11AA;D61F;1112 1168 11AA; # (혟; 혟; 혟; 혟; 혟; ) HANGUL SYLLABLE HYEGS +D620;D620;1112 1168 11AB;D620;1112 1168 11AB; # (혠; 혠; 혠; 혠; 혠; ) HANGUL SYLLABLE HYEN +D621;D621;1112 1168 11AC;D621;1112 1168 11AC; # (혡; 혡; 혡; 혡; 혡; ) HANGUL SYLLABLE HYENJ +D622;D622;1112 1168 11AD;D622;1112 1168 11AD; # (혢; 혢; 혢; 혢; 혢; ) HANGUL SYLLABLE HYENH +D623;D623;1112 1168 11AE;D623;1112 1168 11AE; # (혣; 혣; 혣; 혣; 혣; ) HANGUL SYLLABLE HYED +D624;D624;1112 1168 11AF;D624;1112 1168 11AF; # (혤; 혤; 혤; 혤; 혤; ) HANGUL SYLLABLE HYEL +D625;D625;1112 1168 11B0;D625;1112 1168 11B0; # (혥; 혥; 혥; 혥; 혥; ) HANGUL SYLLABLE HYELG +D626;D626;1112 1168 11B1;D626;1112 1168 11B1; # (혦; 혦; 혦; 혦; 혦; ) HANGUL SYLLABLE HYELM +D627;D627;1112 1168 11B2;D627;1112 1168 11B2; # (혧; 혧; 혧; 혧; 혧; ) HANGUL SYLLABLE HYELB +D628;D628;1112 1168 11B3;D628;1112 1168 11B3; # (혨; 혨; 혨; 혨; 혨; ) HANGUL SYLLABLE HYELS +D629;D629;1112 1168 11B4;D629;1112 1168 11B4; # (혩; 혩; 혩; 혩; 혩; ) HANGUL SYLLABLE HYELT +D62A;D62A;1112 1168 11B5;D62A;1112 1168 11B5; # (혪; 혪; 혪; 혪; 혪; ) HANGUL SYLLABLE HYELP +D62B;D62B;1112 1168 11B6;D62B;1112 1168 11B6; # (혫; 혫; 혫; 혫; 혫; ) HANGUL SYLLABLE HYELH +D62C;D62C;1112 1168 11B7;D62C;1112 1168 11B7; # (혬; 혬; 혬; 혬; 혬; ) HANGUL SYLLABLE HYEM +D62D;D62D;1112 1168 11B8;D62D;1112 1168 11B8; # (혭; 혭; 혭; 혭; 혭; ) HANGUL SYLLABLE HYEB +D62E;D62E;1112 1168 11B9;D62E;1112 1168 11B9; # (혮; 혮; 혮; 혮; 혮; ) HANGUL SYLLABLE HYEBS +D62F;D62F;1112 1168 11BA;D62F;1112 1168 11BA; # (혯; 혯; 혯; 혯; 혯; ) HANGUL SYLLABLE HYES +D630;D630;1112 1168 11BB;D630;1112 1168 11BB; # (혰; 혰; 혰; 혰; 혰; ) HANGUL SYLLABLE HYESS +D631;D631;1112 1168 11BC;D631;1112 1168 11BC; # (혱; 혱; 혱; 혱; 혱; ) HANGUL SYLLABLE HYENG +D632;D632;1112 1168 11BD;D632;1112 1168 11BD; # (혲; 혲; 혲; 혲; 혲; ) HANGUL SYLLABLE HYEJ +D633;D633;1112 1168 11BE;D633;1112 1168 11BE; # (혳; 혳; 혳; 혳; 혳; ) HANGUL SYLLABLE HYEC +D634;D634;1112 1168 11BF;D634;1112 1168 11BF; # (혴; 혴; 혴; 혴; 혴; ) HANGUL SYLLABLE HYEK +D635;D635;1112 1168 11C0;D635;1112 1168 11C0; # (혵; 혵; 혵; 혵; 혵; ) HANGUL SYLLABLE HYET +D636;D636;1112 1168 11C1;D636;1112 1168 11C1; # (혶; 혶; 혶; 혶; 혶; ) HANGUL SYLLABLE HYEP +D637;D637;1112 1168 11C2;D637;1112 1168 11C2; # (혷; 혷; 혷; 혷; 혷; ) HANGUL SYLLABLE HYEH +D638;D638;1112 1169;D638;1112 1169; # (호; 호; 호; 호; 호; ) HANGUL SYLLABLE HO +D639;D639;1112 1169 11A8;D639;1112 1169 11A8; # (혹; 혹; 혹; 혹; 혹; ) HANGUL SYLLABLE HOG +D63A;D63A;1112 1169 11A9;D63A;1112 1169 11A9; # (혺; 혺; 혺; 혺; 혺; ) HANGUL SYLLABLE HOGG +D63B;D63B;1112 1169 11AA;D63B;1112 1169 11AA; # (혻; 혻; 혻; 혻; 혻; ) HANGUL SYLLABLE HOGS +D63C;D63C;1112 1169 11AB;D63C;1112 1169 11AB; # (혼; 혼; 혼; 혼; 혼; ) HANGUL SYLLABLE HON +D63D;D63D;1112 1169 11AC;D63D;1112 1169 11AC; # (혽; 혽; 혽; 혽; 혽; ) HANGUL SYLLABLE HONJ +D63E;D63E;1112 1169 11AD;D63E;1112 1169 11AD; # (혾; 혾; 혾; 혾; 혾; ) HANGUL SYLLABLE HONH +D63F;D63F;1112 1169 11AE;D63F;1112 1169 11AE; # (혿; 혿; 혿; 혿; 혿; ) HANGUL SYLLABLE HOD +D640;D640;1112 1169 11AF;D640;1112 1169 11AF; # (홀; 홀; 홀; 홀; 홀; ) HANGUL SYLLABLE HOL +D641;D641;1112 1169 11B0;D641;1112 1169 11B0; # (홁; 홁; 홁; 홁; 홁; ) HANGUL SYLLABLE HOLG +D642;D642;1112 1169 11B1;D642;1112 1169 11B1; # (홂; 홂; 홂; 홂; 홂; ) HANGUL SYLLABLE HOLM +D643;D643;1112 1169 11B2;D643;1112 1169 11B2; # (홃; 홃; 홃; 홃; 홃; ) HANGUL SYLLABLE HOLB +D644;D644;1112 1169 11B3;D644;1112 1169 11B3; # (홄; 홄; 홄; 홄; 홄; ) HANGUL SYLLABLE HOLS +D645;D645;1112 1169 11B4;D645;1112 1169 11B4; # (홅; 홅; 홅; 홅; 홅; ) HANGUL SYLLABLE HOLT +D646;D646;1112 1169 11B5;D646;1112 1169 11B5; # (홆; 홆; 홆; 홆; 홆; ) HANGUL SYLLABLE HOLP +D647;D647;1112 1169 11B6;D647;1112 1169 11B6; # (홇; 홇; 홇; 홇; 홇; ) HANGUL SYLLABLE HOLH +D648;D648;1112 1169 11B7;D648;1112 1169 11B7; # (홈; 홈; 홈; 홈; 홈; ) HANGUL SYLLABLE HOM +D649;D649;1112 1169 11B8;D649;1112 1169 11B8; # (홉; 홉; 홉; 홉; 홉; ) HANGUL SYLLABLE HOB +D64A;D64A;1112 1169 11B9;D64A;1112 1169 11B9; # (홊; 홊; 홊; 홊; 홊; ) HANGUL SYLLABLE HOBS +D64B;D64B;1112 1169 11BA;D64B;1112 1169 11BA; # (홋; 홋; 홋; 홋; 홋; ) HANGUL SYLLABLE HOS +D64C;D64C;1112 1169 11BB;D64C;1112 1169 11BB; # (홌; 홌; 홌; 홌; 홌; ) HANGUL SYLLABLE HOSS +D64D;D64D;1112 1169 11BC;D64D;1112 1169 11BC; # (홍; 홍; 홍; 홍; 홍; ) HANGUL SYLLABLE HONG +D64E;D64E;1112 1169 11BD;D64E;1112 1169 11BD; # (홎; 홎; 홎; 홎; 홎; ) HANGUL SYLLABLE HOJ +D64F;D64F;1112 1169 11BE;D64F;1112 1169 11BE; # (홏; 홏; 홏; 홏; 홏; ) HANGUL SYLLABLE HOC +D650;D650;1112 1169 11BF;D650;1112 1169 11BF; # (홐; 홐; 홐; 홐; 홐; ) HANGUL SYLLABLE HOK +D651;D651;1112 1169 11C0;D651;1112 1169 11C0; # (홑; 홑; 홑; 홑; 홑; ) HANGUL SYLLABLE HOT +D652;D652;1112 1169 11C1;D652;1112 1169 11C1; # (홒; 홒; 홒; 홒; 홒; ) HANGUL SYLLABLE HOP +D653;D653;1112 1169 11C2;D653;1112 1169 11C2; # (홓; 홓; 홓; 홓; 홓; ) HANGUL SYLLABLE HOH +D654;D654;1112 116A;D654;1112 116A; # (화; 화; 화; 화; 화; ) HANGUL SYLLABLE HWA +D655;D655;1112 116A 11A8;D655;1112 116A 11A8; # (확; 확; 확; 확; 확; ) HANGUL SYLLABLE HWAG +D656;D656;1112 116A 11A9;D656;1112 116A 11A9; # (홖; 홖; 홖; 홖; 홖; ) HANGUL SYLLABLE HWAGG +D657;D657;1112 116A 11AA;D657;1112 116A 11AA; # (홗; 홗; 홗; 홗; 홗; ) HANGUL SYLLABLE HWAGS +D658;D658;1112 116A 11AB;D658;1112 116A 11AB; # (환; 환; 환; 환; 환; ) HANGUL SYLLABLE HWAN +D659;D659;1112 116A 11AC;D659;1112 116A 11AC; # (홙; 홙; 홙; 홙; 홙; ) HANGUL SYLLABLE HWANJ +D65A;D65A;1112 116A 11AD;D65A;1112 116A 11AD; # (홚; 홚; 홚; 홚; 홚; ) HANGUL SYLLABLE HWANH +D65B;D65B;1112 116A 11AE;D65B;1112 116A 11AE; # (홛; 홛; 홛; 홛; 홛; ) HANGUL SYLLABLE HWAD +D65C;D65C;1112 116A 11AF;D65C;1112 116A 11AF; # (활; 활; 활; 활; 활; ) HANGUL SYLLABLE HWAL +D65D;D65D;1112 116A 11B0;D65D;1112 116A 11B0; # (홝; 홝; 홝; 홝; 홝; ) HANGUL SYLLABLE HWALG +D65E;D65E;1112 116A 11B1;D65E;1112 116A 11B1; # (홞; 홞; 홞; 홞; 홞; ) HANGUL SYLLABLE HWALM +D65F;D65F;1112 116A 11B2;D65F;1112 116A 11B2; # (홟; 홟; 홟; 홟; 홟; ) HANGUL SYLLABLE HWALB +D660;D660;1112 116A 11B3;D660;1112 116A 11B3; # (홠; 홠; 홠; 홠; 홠; ) HANGUL SYLLABLE HWALS +D661;D661;1112 116A 11B4;D661;1112 116A 11B4; # (홡; 홡; 홡; 홡; 홡; ) HANGUL SYLLABLE HWALT +D662;D662;1112 116A 11B5;D662;1112 116A 11B5; # (홢; 홢; 홢; 홢; 홢; ) HANGUL SYLLABLE HWALP +D663;D663;1112 116A 11B6;D663;1112 116A 11B6; # (홣; 홣; 홣; 홣; 홣; ) HANGUL SYLLABLE HWALH +D664;D664;1112 116A 11B7;D664;1112 116A 11B7; # (홤; 홤; 홤; 홤; 홤; ) HANGUL SYLLABLE HWAM +D665;D665;1112 116A 11B8;D665;1112 116A 11B8; # (홥; 홥; 홥; 홥; 홥; ) HANGUL SYLLABLE HWAB +D666;D666;1112 116A 11B9;D666;1112 116A 11B9; # (홦; 홦; 홦; 홦; 홦; ) HANGUL SYLLABLE HWABS +D667;D667;1112 116A 11BA;D667;1112 116A 11BA; # (홧; 홧; 홧; 홧; 홧; ) HANGUL SYLLABLE HWAS +D668;D668;1112 116A 11BB;D668;1112 116A 11BB; # (홨; 홨; 홨; 홨; 홨; ) HANGUL SYLLABLE HWASS +D669;D669;1112 116A 11BC;D669;1112 116A 11BC; # (황; 황; 황; 황; 황; ) HANGUL SYLLABLE HWANG +D66A;D66A;1112 116A 11BD;D66A;1112 116A 11BD; # (홪; 홪; 홪; 홪; 홪; ) HANGUL SYLLABLE HWAJ +D66B;D66B;1112 116A 11BE;D66B;1112 116A 11BE; # (홫; 홫; 홫; 홫; 홫; ) HANGUL SYLLABLE HWAC +D66C;D66C;1112 116A 11BF;D66C;1112 116A 11BF; # (홬; 홬; 홬; 홬; 홬; ) HANGUL SYLLABLE HWAK +D66D;D66D;1112 116A 11C0;D66D;1112 116A 11C0; # (홭; 홭; 홭; 홭; 홭; ) HANGUL SYLLABLE HWAT +D66E;D66E;1112 116A 11C1;D66E;1112 116A 11C1; # (홮; 홮; 홮; 홮; 홮; ) HANGUL SYLLABLE HWAP +D66F;D66F;1112 116A 11C2;D66F;1112 116A 11C2; # (홯; 홯; 홯; 홯; 홯; ) HANGUL SYLLABLE HWAH +D670;D670;1112 116B;D670;1112 116B; # (홰; 홰; 홰; 홰; 홰; ) HANGUL SYLLABLE HWAE +D671;D671;1112 116B 11A8;D671;1112 116B 11A8; # (홱; 홱; 홱; 홱; 홱; ) HANGUL SYLLABLE HWAEG +D672;D672;1112 116B 11A9;D672;1112 116B 11A9; # (홲; 홲; 홲; 홲; 홲; ) HANGUL SYLLABLE HWAEGG +D673;D673;1112 116B 11AA;D673;1112 116B 11AA; # (홳; 홳; 홳; 홳; 홳; ) HANGUL SYLLABLE HWAEGS +D674;D674;1112 116B 11AB;D674;1112 116B 11AB; # (홴; 홴; 홴; 홴; 홴; ) HANGUL SYLLABLE HWAEN +D675;D675;1112 116B 11AC;D675;1112 116B 11AC; # (홵; 홵; 홵; 홵; 홵; ) HANGUL SYLLABLE HWAENJ +D676;D676;1112 116B 11AD;D676;1112 116B 11AD; # (홶; 홶; 홶; 홶; 홶; ) HANGUL SYLLABLE HWAENH +D677;D677;1112 116B 11AE;D677;1112 116B 11AE; # (홷; 홷; 홷; 홷; 홷; ) HANGUL SYLLABLE HWAED +D678;D678;1112 116B 11AF;D678;1112 116B 11AF; # (홸; 홸; 홸; 홸; 홸; ) HANGUL SYLLABLE HWAEL +D679;D679;1112 116B 11B0;D679;1112 116B 11B0; # (홹; 홹; 홹; 홹; 홹; ) HANGUL SYLLABLE HWAELG +D67A;D67A;1112 116B 11B1;D67A;1112 116B 11B1; # (홺; 홺; 홺; 홺; 홺; ) HANGUL SYLLABLE HWAELM +D67B;D67B;1112 116B 11B2;D67B;1112 116B 11B2; # (홻; 홻; 홻; 홻; 홻; ) HANGUL SYLLABLE HWAELB +D67C;D67C;1112 116B 11B3;D67C;1112 116B 11B3; # (홼; 홼; 홼; 홼; 홼; ) HANGUL SYLLABLE HWAELS +D67D;D67D;1112 116B 11B4;D67D;1112 116B 11B4; # (홽; 홽; 홽; 홽; 홽; ) HANGUL SYLLABLE HWAELT +D67E;D67E;1112 116B 11B5;D67E;1112 116B 11B5; # (홾; 홾; 홾; 홾; 홾; ) HANGUL SYLLABLE HWAELP +D67F;D67F;1112 116B 11B6;D67F;1112 116B 11B6; # (홿; 홿; 홿; 홿; 홿; ) HANGUL SYLLABLE HWAELH +D680;D680;1112 116B 11B7;D680;1112 116B 11B7; # (횀; 횀; 횀; 횀; 횀; ) HANGUL SYLLABLE HWAEM +D681;D681;1112 116B 11B8;D681;1112 116B 11B8; # (횁; 횁; 횁; 횁; 횁; ) HANGUL SYLLABLE HWAEB +D682;D682;1112 116B 11B9;D682;1112 116B 11B9; # (횂; 횂; 횂; 횂; 횂; ) HANGUL SYLLABLE HWAEBS +D683;D683;1112 116B 11BA;D683;1112 116B 11BA; # (횃; 횃; 횃; 횃; 횃; ) HANGUL SYLLABLE HWAES +D684;D684;1112 116B 11BB;D684;1112 116B 11BB; # (횄; 횄; 횄; 횄; 횄; ) HANGUL SYLLABLE HWAESS +D685;D685;1112 116B 11BC;D685;1112 116B 11BC; # (횅; 횅; 횅; 횅; 횅; ) HANGUL SYLLABLE HWAENG +D686;D686;1112 116B 11BD;D686;1112 116B 11BD; # (횆; 횆; 횆; 횆; 횆; ) HANGUL SYLLABLE HWAEJ +D687;D687;1112 116B 11BE;D687;1112 116B 11BE; # (횇; 횇; 횇; 횇; 횇; ) HANGUL SYLLABLE HWAEC +D688;D688;1112 116B 11BF;D688;1112 116B 11BF; # (횈; 횈; 횈; 횈; 횈; ) HANGUL SYLLABLE HWAEK +D689;D689;1112 116B 11C0;D689;1112 116B 11C0; # (횉; 횉; 횉; 횉; 횉; ) HANGUL SYLLABLE HWAET +D68A;D68A;1112 116B 11C1;D68A;1112 116B 11C1; # (횊; 횊; 횊; 횊; 횊; ) HANGUL SYLLABLE HWAEP +D68B;D68B;1112 116B 11C2;D68B;1112 116B 11C2; # (횋; 횋; 횋; 횋; 횋; ) HANGUL SYLLABLE HWAEH +D68C;D68C;1112 116C;D68C;1112 116C; # (회; 회; 회; 회; 회; ) HANGUL SYLLABLE HOE +D68D;D68D;1112 116C 11A8;D68D;1112 116C 11A8; # (획; 획; 획; 획; 획; ) HANGUL SYLLABLE HOEG +D68E;D68E;1112 116C 11A9;D68E;1112 116C 11A9; # (횎; 횎; 횎; 횎; 횎; ) HANGUL SYLLABLE HOEGG +D68F;D68F;1112 116C 11AA;D68F;1112 116C 11AA; # (횏; 횏; 횏; 횏; 횏; ) HANGUL SYLLABLE HOEGS +D690;D690;1112 116C 11AB;D690;1112 116C 11AB; # (횐; 횐; 횐; 횐; 횐; ) HANGUL SYLLABLE HOEN +D691;D691;1112 116C 11AC;D691;1112 116C 11AC; # (횑; 횑; 횑; 횑; 횑; ) HANGUL SYLLABLE HOENJ +D692;D692;1112 116C 11AD;D692;1112 116C 11AD; # (횒; 횒; 횒; 횒; 횒; ) HANGUL SYLLABLE HOENH +D693;D693;1112 116C 11AE;D693;1112 116C 11AE; # (횓; 횓; 횓; 횓; 횓; ) HANGUL SYLLABLE HOED +D694;D694;1112 116C 11AF;D694;1112 116C 11AF; # (횔; 횔; 횔; 횔; 횔; ) HANGUL SYLLABLE HOEL +D695;D695;1112 116C 11B0;D695;1112 116C 11B0; # (횕; 횕; 횕; 횕; 횕; ) HANGUL SYLLABLE HOELG +D696;D696;1112 116C 11B1;D696;1112 116C 11B1; # (횖; 횖; 횖; 횖; 횖; ) HANGUL SYLLABLE HOELM +D697;D697;1112 116C 11B2;D697;1112 116C 11B2; # (횗; 횗; 횗; 횗; 횗; ) HANGUL SYLLABLE HOELB +D698;D698;1112 116C 11B3;D698;1112 116C 11B3; # (횘; 횘; 횘; 횘; 횘; ) HANGUL SYLLABLE HOELS +D699;D699;1112 116C 11B4;D699;1112 116C 11B4; # (횙; 횙; 횙; 횙; 횙; ) HANGUL SYLLABLE HOELT +D69A;D69A;1112 116C 11B5;D69A;1112 116C 11B5; # (횚; 횚; 횚; 횚; 횚; ) HANGUL SYLLABLE HOELP +D69B;D69B;1112 116C 11B6;D69B;1112 116C 11B6; # (횛; 횛; 횛; 횛; 횛; ) HANGUL SYLLABLE HOELH +D69C;D69C;1112 116C 11B7;D69C;1112 116C 11B7; # (횜; 횜; 횜; 횜; 횜; ) HANGUL SYLLABLE HOEM +D69D;D69D;1112 116C 11B8;D69D;1112 116C 11B8; # (횝; 횝; 횝; 횝; 횝; ) HANGUL SYLLABLE HOEB +D69E;D69E;1112 116C 11B9;D69E;1112 116C 11B9; # (횞; 횞; 횞; 횞; 횞; ) HANGUL SYLLABLE HOEBS +D69F;D69F;1112 116C 11BA;D69F;1112 116C 11BA; # (횟; 횟; 횟; 횟; 횟; ) HANGUL SYLLABLE HOES +D6A0;D6A0;1112 116C 11BB;D6A0;1112 116C 11BB; # (횠; 횠; 횠; 횠; 횠; ) HANGUL SYLLABLE HOESS +D6A1;D6A1;1112 116C 11BC;D6A1;1112 116C 11BC; # (횡; 횡; 횡; 횡; 횡; ) HANGUL SYLLABLE HOENG +D6A2;D6A2;1112 116C 11BD;D6A2;1112 116C 11BD; # (횢; 횢; 횢; 횢; 횢; ) HANGUL SYLLABLE HOEJ +D6A3;D6A3;1112 116C 11BE;D6A3;1112 116C 11BE; # (횣; 횣; 횣; 횣; 횣; ) HANGUL SYLLABLE HOEC +D6A4;D6A4;1112 116C 11BF;D6A4;1112 116C 11BF; # (횤; 횤; 횤; 횤; 횤; ) HANGUL SYLLABLE HOEK +D6A5;D6A5;1112 116C 11C0;D6A5;1112 116C 11C0; # (횥; 횥; 횥; 횥; 횥; ) HANGUL SYLLABLE HOET +D6A6;D6A6;1112 116C 11C1;D6A6;1112 116C 11C1; # (횦; 횦; 횦; 횦; 횦; ) HANGUL SYLLABLE HOEP +D6A7;D6A7;1112 116C 11C2;D6A7;1112 116C 11C2; # (횧; 횧; 횧; 횧; 횧; ) HANGUL SYLLABLE HOEH +D6A8;D6A8;1112 116D;D6A8;1112 116D; # (효; 효; 효; 효; 효; ) HANGUL SYLLABLE HYO +D6A9;D6A9;1112 116D 11A8;D6A9;1112 116D 11A8; # (횩; 횩; 횩; 횩; 횩; ) HANGUL SYLLABLE HYOG +D6AA;D6AA;1112 116D 11A9;D6AA;1112 116D 11A9; # (횪; 횪; 횪; 횪; 횪; ) HANGUL SYLLABLE HYOGG +D6AB;D6AB;1112 116D 11AA;D6AB;1112 116D 11AA; # (횫; 횫; 횫; 횫; 횫; ) HANGUL SYLLABLE HYOGS +D6AC;D6AC;1112 116D 11AB;D6AC;1112 116D 11AB; # (횬; 횬; 횬; 횬; 횬; ) HANGUL SYLLABLE HYON +D6AD;D6AD;1112 116D 11AC;D6AD;1112 116D 11AC; # (횭; 횭; 횭; 횭; 횭; ) HANGUL SYLLABLE HYONJ +D6AE;D6AE;1112 116D 11AD;D6AE;1112 116D 11AD; # (횮; 횮; 횮; 횮; 횮; ) HANGUL SYLLABLE HYONH +D6AF;D6AF;1112 116D 11AE;D6AF;1112 116D 11AE; # (횯; 횯; 횯; 횯; 횯; ) HANGUL SYLLABLE HYOD +D6B0;D6B0;1112 116D 11AF;D6B0;1112 116D 11AF; # (횰; 횰; 횰; 횰; 횰; ) HANGUL SYLLABLE HYOL +D6B1;D6B1;1112 116D 11B0;D6B1;1112 116D 11B0; # (횱; 횱; 횱; 횱; 횱; ) HANGUL SYLLABLE HYOLG +D6B2;D6B2;1112 116D 11B1;D6B2;1112 116D 11B1; # (횲; 횲; 횲; 횲; 횲; ) HANGUL SYLLABLE HYOLM +D6B3;D6B3;1112 116D 11B2;D6B3;1112 116D 11B2; # (횳; 횳; 횳; 횳; 횳; ) HANGUL SYLLABLE HYOLB +D6B4;D6B4;1112 116D 11B3;D6B4;1112 116D 11B3; # (횴; 횴; 횴; 횴; 횴; ) HANGUL SYLLABLE HYOLS +D6B5;D6B5;1112 116D 11B4;D6B5;1112 116D 11B4; # (횵; 횵; 횵; 횵; 횵; ) HANGUL SYLLABLE HYOLT +D6B6;D6B6;1112 116D 11B5;D6B6;1112 116D 11B5; # (횶; 횶; 횶; 횶; 횶; ) HANGUL SYLLABLE HYOLP +D6B7;D6B7;1112 116D 11B6;D6B7;1112 116D 11B6; # (횷; 횷; 횷; 횷; 횷; ) HANGUL SYLLABLE HYOLH +D6B8;D6B8;1112 116D 11B7;D6B8;1112 116D 11B7; # (횸; 횸; 횸; 횸; 횸; ) HANGUL SYLLABLE HYOM +D6B9;D6B9;1112 116D 11B8;D6B9;1112 116D 11B8; # (횹; 횹; 횹; 횹; 횹; ) HANGUL SYLLABLE HYOB +D6BA;D6BA;1112 116D 11B9;D6BA;1112 116D 11B9; # (횺; 횺; 횺; 횺; 횺; ) HANGUL SYLLABLE HYOBS +D6BB;D6BB;1112 116D 11BA;D6BB;1112 116D 11BA; # (횻; 횻; 횻; 횻; 횻; ) HANGUL SYLLABLE HYOS +D6BC;D6BC;1112 116D 11BB;D6BC;1112 116D 11BB; # (횼; 횼; 횼; 횼; 횼; ) HANGUL SYLLABLE HYOSS +D6BD;D6BD;1112 116D 11BC;D6BD;1112 116D 11BC; # (횽; 횽; 횽; 횽; 횽; ) HANGUL SYLLABLE HYONG +D6BE;D6BE;1112 116D 11BD;D6BE;1112 116D 11BD; # (횾; 횾; 횾; 횾; 횾; ) HANGUL SYLLABLE HYOJ +D6BF;D6BF;1112 116D 11BE;D6BF;1112 116D 11BE; # (횿; 횿; 횿; 횿; 횿; ) HANGUL SYLLABLE HYOC +D6C0;D6C0;1112 116D 11BF;D6C0;1112 116D 11BF; # (훀; 훀; 훀; 훀; 훀; ) HANGUL SYLLABLE HYOK +D6C1;D6C1;1112 116D 11C0;D6C1;1112 116D 11C0; # (훁; 훁; 훁; 훁; 훁; ) HANGUL SYLLABLE HYOT +D6C2;D6C2;1112 116D 11C1;D6C2;1112 116D 11C1; # (훂; 훂; 훂; 훂; 훂; ) HANGUL SYLLABLE HYOP +D6C3;D6C3;1112 116D 11C2;D6C3;1112 116D 11C2; # (훃; 훃; 훃; 훃; 훃; ) HANGUL SYLLABLE HYOH +D6C4;D6C4;1112 116E;D6C4;1112 116E; # (후; 후; 후; 후; 후; ) HANGUL SYLLABLE HU +D6C5;D6C5;1112 116E 11A8;D6C5;1112 116E 11A8; # (훅; 훅; 훅; 훅; 훅; ) HANGUL SYLLABLE HUG +D6C6;D6C6;1112 116E 11A9;D6C6;1112 116E 11A9; # (훆; 훆; 훆; 훆; 훆; ) HANGUL SYLLABLE HUGG +D6C7;D6C7;1112 116E 11AA;D6C7;1112 116E 11AA; # (훇; 훇; 훇; 훇; 훇; ) HANGUL SYLLABLE HUGS +D6C8;D6C8;1112 116E 11AB;D6C8;1112 116E 11AB; # (훈; 훈; 훈; 훈; 훈; ) HANGUL SYLLABLE HUN +D6C9;D6C9;1112 116E 11AC;D6C9;1112 116E 11AC; # (훉; 훉; 훉; 훉; 훉; ) HANGUL SYLLABLE HUNJ +D6CA;D6CA;1112 116E 11AD;D6CA;1112 116E 11AD; # (훊; 훊; 훊; 훊; 훊; ) HANGUL SYLLABLE HUNH +D6CB;D6CB;1112 116E 11AE;D6CB;1112 116E 11AE; # (훋; 훋; 훋; 훋; 훋; ) HANGUL SYLLABLE HUD +D6CC;D6CC;1112 116E 11AF;D6CC;1112 116E 11AF; # (훌; 훌; 훌; 훌; 훌; ) HANGUL SYLLABLE HUL +D6CD;D6CD;1112 116E 11B0;D6CD;1112 116E 11B0; # (훍; 훍; 훍; 훍; 훍; ) HANGUL SYLLABLE HULG +D6CE;D6CE;1112 116E 11B1;D6CE;1112 116E 11B1; # (훎; 훎; 훎; 훎; 훎; ) HANGUL SYLLABLE HULM +D6CF;D6CF;1112 116E 11B2;D6CF;1112 116E 11B2; # (훏; 훏; 훏; 훏; 훏; ) HANGUL SYLLABLE HULB +D6D0;D6D0;1112 116E 11B3;D6D0;1112 116E 11B3; # (훐; 훐; 훐; 훐; 훐; ) HANGUL SYLLABLE HULS +D6D1;D6D1;1112 116E 11B4;D6D1;1112 116E 11B4; # (훑; 훑; 훑; 훑; 훑; ) HANGUL SYLLABLE HULT +D6D2;D6D2;1112 116E 11B5;D6D2;1112 116E 11B5; # (훒; 훒; 훒; 훒; 훒; ) HANGUL SYLLABLE HULP +D6D3;D6D3;1112 116E 11B6;D6D3;1112 116E 11B6; # (훓; 훓; 훓; 훓; 훓; ) HANGUL SYLLABLE HULH +D6D4;D6D4;1112 116E 11B7;D6D4;1112 116E 11B7; # (훔; 훔; 훔; 훔; 훔; ) HANGUL SYLLABLE HUM +D6D5;D6D5;1112 116E 11B8;D6D5;1112 116E 11B8; # (훕; 훕; 훕; 훕; 훕; ) HANGUL SYLLABLE HUB +D6D6;D6D6;1112 116E 11B9;D6D6;1112 116E 11B9; # (훖; 훖; 훖; 훖; 훖; ) HANGUL SYLLABLE HUBS +D6D7;D6D7;1112 116E 11BA;D6D7;1112 116E 11BA; # (훗; 훗; 훗; 훗; 훗; ) HANGUL SYLLABLE HUS +D6D8;D6D8;1112 116E 11BB;D6D8;1112 116E 11BB; # (훘; 훘; 훘; 훘; 훘; ) HANGUL SYLLABLE HUSS +D6D9;D6D9;1112 116E 11BC;D6D9;1112 116E 11BC; # (훙; 훙; 훙; 훙; 훙; ) HANGUL SYLLABLE HUNG +D6DA;D6DA;1112 116E 11BD;D6DA;1112 116E 11BD; # (훚; 훚; 훚; 훚; 훚; ) HANGUL SYLLABLE HUJ +D6DB;D6DB;1112 116E 11BE;D6DB;1112 116E 11BE; # (훛; 훛; 훛; 훛; 훛; ) HANGUL SYLLABLE HUC +D6DC;D6DC;1112 116E 11BF;D6DC;1112 116E 11BF; # (훜; 훜; 훜; 훜; 훜; ) HANGUL SYLLABLE HUK +D6DD;D6DD;1112 116E 11C0;D6DD;1112 116E 11C0; # (훝; 훝; 훝; 훝; 훝; ) HANGUL SYLLABLE HUT +D6DE;D6DE;1112 116E 11C1;D6DE;1112 116E 11C1; # (훞; 훞; 훞; 훞; 훞; ) HANGUL SYLLABLE HUP +D6DF;D6DF;1112 116E 11C2;D6DF;1112 116E 11C2; # (훟; 훟; 훟; 훟; 훟; ) HANGUL SYLLABLE HUH +D6E0;D6E0;1112 116F;D6E0;1112 116F; # (훠; 훠; 훠; 훠; 훠; ) HANGUL SYLLABLE HWEO +D6E1;D6E1;1112 116F 11A8;D6E1;1112 116F 11A8; # (훡; 훡; 훡; 훡; 훡; ) HANGUL SYLLABLE HWEOG +D6E2;D6E2;1112 116F 11A9;D6E2;1112 116F 11A9; # (훢; 훢; 훢; 훢; 훢; ) HANGUL SYLLABLE HWEOGG +D6E3;D6E3;1112 116F 11AA;D6E3;1112 116F 11AA; # (훣; 훣; 훣; 훣; 훣; ) HANGUL SYLLABLE HWEOGS +D6E4;D6E4;1112 116F 11AB;D6E4;1112 116F 11AB; # (훤; 훤; 훤; 훤; 훤; ) HANGUL SYLLABLE HWEON +D6E5;D6E5;1112 116F 11AC;D6E5;1112 116F 11AC; # (훥; 훥; 훥; 훥; 훥; ) HANGUL SYLLABLE HWEONJ +D6E6;D6E6;1112 116F 11AD;D6E6;1112 116F 11AD; # (훦; 훦; 훦; 훦; 훦; ) HANGUL SYLLABLE HWEONH +D6E7;D6E7;1112 116F 11AE;D6E7;1112 116F 11AE; # (훧; 훧; 훧; 훧; 훧; ) HANGUL SYLLABLE HWEOD +D6E8;D6E8;1112 116F 11AF;D6E8;1112 116F 11AF; # (훨; 훨; 훨; 훨; 훨; ) HANGUL SYLLABLE HWEOL +D6E9;D6E9;1112 116F 11B0;D6E9;1112 116F 11B0; # (훩; 훩; 훩; 훩; 훩; ) HANGUL SYLLABLE HWEOLG +D6EA;D6EA;1112 116F 11B1;D6EA;1112 116F 11B1; # (훪; 훪; 훪; 훪; 훪; ) HANGUL SYLLABLE HWEOLM +D6EB;D6EB;1112 116F 11B2;D6EB;1112 116F 11B2; # (훫; 훫; 훫; 훫; 훫; ) HANGUL SYLLABLE HWEOLB +D6EC;D6EC;1112 116F 11B3;D6EC;1112 116F 11B3; # (훬; 훬; 훬; 훬; 훬; ) HANGUL SYLLABLE HWEOLS +D6ED;D6ED;1112 116F 11B4;D6ED;1112 116F 11B4; # (훭; 훭; 훭; 훭; 훭; ) HANGUL SYLLABLE HWEOLT +D6EE;D6EE;1112 116F 11B5;D6EE;1112 116F 11B5; # (훮; 훮; 훮; 훮; 훮; ) HANGUL SYLLABLE HWEOLP +D6EF;D6EF;1112 116F 11B6;D6EF;1112 116F 11B6; # (훯; 훯; 훯; 훯; 훯; ) HANGUL SYLLABLE HWEOLH +D6F0;D6F0;1112 116F 11B7;D6F0;1112 116F 11B7; # (훰; 훰; 훰; 훰; 훰; ) HANGUL SYLLABLE HWEOM +D6F1;D6F1;1112 116F 11B8;D6F1;1112 116F 11B8; # (훱; 훱; 훱; 훱; 훱; ) HANGUL SYLLABLE HWEOB +D6F2;D6F2;1112 116F 11B9;D6F2;1112 116F 11B9; # (훲; 훲; 훲; 훲; 훲; ) HANGUL SYLLABLE HWEOBS +D6F3;D6F3;1112 116F 11BA;D6F3;1112 116F 11BA; # (훳; 훳; 훳; 훳; 훳; ) HANGUL SYLLABLE HWEOS +D6F4;D6F4;1112 116F 11BB;D6F4;1112 116F 11BB; # (훴; 훴; 훴; 훴; 훴; ) HANGUL SYLLABLE HWEOSS +D6F5;D6F5;1112 116F 11BC;D6F5;1112 116F 11BC; # (훵; 훵; 훵; 훵; 훵; ) HANGUL SYLLABLE HWEONG +D6F6;D6F6;1112 116F 11BD;D6F6;1112 116F 11BD; # (훶; 훶; 훶; 훶; 훶; ) HANGUL SYLLABLE HWEOJ +D6F7;D6F7;1112 116F 11BE;D6F7;1112 116F 11BE; # (훷; 훷; 훷; 훷; 훷; ) HANGUL SYLLABLE HWEOC +D6F8;D6F8;1112 116F 11BF;D6F8;1112 116F 11BF; # (훸; 훸; 훸; 훸; 훸; ) HANGUL SYLLABLE HWEOK +D6F9;D6F9;1112 116F 11C0;D6F9;1112 116F 11C0; # (훹; 훹; 훹; 훹; 훹; ) HANGUL SYLLABLE HWEOT +D6FA;D6FA;1112 116F 11C1;D6FA;1112 116F 11C1; # (훺; 훺; 훺; 훺; 훺; ) HANGUL SYLLABLE HWEOP +D6FB;D6FB;1112 116F 11C2;D6FB;1112 116F 11C2; # (훻; 훻; 훻; 훻; 훻; ) HANGUL SYLLABLE HWEOH +D6FC;D6FC;1112 1170;D6FC;1112 1170; # (훼; 훼; 훼; 훼; 훼; ) HANGUL SYLLABLE HWE +D6FD;D6FD;1112 1170 11A8;D6FD;1112 1170 11A8; # (훽; 훽; 훽; 훽; 훽; ) HANGUL SYLLABLE HWEG +D6FE;D6FE;1112 1170 11A9;D6FE;1112 1170 11A9; # (훾; 훾; 훾; 훾; 훾; ) HANGUL SYLLABLE HWEGG +D6FF;D6FF;1112 1170 11AA;D6FF;1112 1170 11AA; # (훿; 훿; 훿; 훿; 훿; ) HANGUL SYLLABLE HWEGS +D700;D700;1112 1170 11AB;D700;1112 1170 11AB; # (휀; 휀; 휀; 휀; 휀; ) HANGUL SYLLABLE HWEN +D701;D701;1112 1170 11AC;D701;1112 1170 11AC; # (휁; 휁; 휁; 휁; 휁; ) HANGUL SYLLABLE HWENJ +D702;D702;1112 1170 11AD;D702;1112 1170 11AD; # (휂; 휂; 휂; 휂; 휂; ) HANGUL SYLLABLE HWENH +D703;D703;1112 1170 11AE;D703;1112 1170 11AE; # (휃; 휃; 휃; 휃; 휃; ) HANGUL SYLLABLE HWED +D704;D704;1112 1170 11AF;D704;1112 1170 11AF; # (휄; 휄; 휄; 휄; 휄; ) HANGUL SYLLABLE HWEL +D705;D705;1112 1170 11B0;D705;1112 1170 11B0; # (휅; 휅; 휅; 휅; 휅; ) HANGUL SYLLABLE HWELG +D706;D706;1112 1170 11B1;D706;1112 1170 11B1; # (휆; 휆; 휆; 휆; 휆; ) HANGUL SYLLABLE HWELM +D707;D707;1112 1170 11B2;D707;1112 1170 11B2; # (휇; 휇; 휇; 휇; 휇; ) HANGUL SYLLABLE HWELB +D708;D708;1112 1170 11B3;D708;1112 1170 11B3; # (휈; 휈; 휈; 휈; 휈; ) HANGUL SYLLABLE HWELS +D709;D709;1112 1170 11B4;D709;1112 1170 11B4; # (휉; 휉; 휉; 휉; 휉; ) HANGUL SYLLABLE HWELT +D70A;D70A;1112 1170 11B5;D70A;1112 1170 11B5; # (휊; 휊; 휊; 휊; 휊; ) HANGUL SYLLABLE HWELP +D70B;D70B;1112 1170 11B6;D70B;1112 1170 11B6; # (휋; 휋; 휋; 휋; 휋; ) HANGUL SYLLABLE HWELH +D70C;D70C;1112 1170 11B7;D70C;1112 1170 11B7; # (휌; 휌; 휌; 휌; 휌; ) HANGUL SYLLABLE HWEM +D70D;D70D;1112 1170 11B8;D70D;1112 1170 11B8; # (휍; 휍; 휍; 휍; 휍; ) HANGUL SYLLABLE HWEB +D70E;D70E;1112 1170 11B9;D70E;1112 1170 11B9; # (휎; 휎; 휎; 휎; 휎; ) HANGUL SYLLABLE HWEBS +D70F;D70F;1112 1170 11BA;D70F;1112 1170 11BA; # (휏; 휏; 휏; 휏; 휏; ) HANGUL SYLLABLE HWES +D710;D710;1112 1170 11BB;D710;1112 1170 11BB; # (휐; 휐; 휐; 휐; 휐; ) HANGUL SYLLABLE HWESS +D711;D711;1112 1170 11BC;D711;1112 1170 11BC; # (휑; 휑; 휑; 휑; 휑; ) HANGUL SYLLABLE HWENG +D712;D712;1112 1170 11BD;D712;1112 1170 11BD; # (휒; 휒; 휒; 휒; 휒; ) HANGUL SYLLABLE HWEJ +D713;D713;1112 1170 11BE;D713;1112 1170 11BE; # (휓; 휓; 휓; 휓; 휓; ) HANGUL SYLLABLE HWEC +D714;D714;1112 1170 11BF;D714;1112 1170 11BF; # (휔; 휔; 휔; 휔; 휔; ) HANGUL SYLLABLE HWEK +D715;D715;1112 1170 11C0;D715;1112 1170 11C0; # (휕; 휕; 휕; 휕; 휕; ) HANGUL SYLLABLE HWET +D716;D716;1112 1170 11C1;D716;1112 1170 11C1; # (휖; 휖; 휖; 휖; 휖; ) HANGUL SYLLABLE HWEP +D717;D717;1112 1170 11C2;D717;1112 1170 11C2; # (휗; 휗; 휗; 휗; 휗; ) HANGUL SYLLABLE HWEH +D718;D718;1112 1171;D718;1112 1171; # (휘; 휘; 휘; 휘; 휘; ) HANGUL SYLLABLE HWI +D719;D719;1112 1171 11A8;D719;1112 1171 11A8; # (휙; 휙; 휙; 휙; 휙; ) HANGUL SYLLABLE HWIG +D71A;D71A;1112 1171 11A9;D71A;1112 1171 11A9; # (휚; 휚; 휚; 휚; 휚; ) HANGUL SYLLABLE HWIGG +D71B;D71B;1112 1171 11AA;D71B;1112 1171 11AA; # (휛; 휛; 휛; 휛; 휛; ) HANGUL SYLLABLE HWIGS +D71C;D71C;1112 1171 11AB;D71C;1112 1171 11AB; # (휜; 휜; 휜; 휜; 휜; ) HANGUL SYLLABLE HWIN +D71D;D71D;1112 1171 11AC;D71D;1112 1171 11AC; # (휝; 휝; 휝; 휝; 휝; ) HANGUL SYLLABLE HWINJ +D71E;D71E;1112 1171 11AD;D71E;1112 1171 11AD; # (휞; 휞; 휞; 휞; 휞; ) HANGUL SYLLABLE HWINH +D71F;D71F;1112 1171 11AE;D71F;1112 1171 11AE; # (휟; 휟; 휟; 휟; 휟; ) HANGUL SYLLABLE HWID +D720;D720;1112 1171 11AF;D720;1112 1171 11AF; # (휠; 휠; 휠; 휠; 휠; ) HANGUL SYLLABLE HWIL +D721;D721;1112 1171 11B0;D721;1112 1171 11B0; # (휡; 휡; 휡; 휡; 휡; ) HANGUL SYLLABLE HWILG +D722;D722;1112 1171 11B1;D722;1112 1171 11B1; # (휢; 휢; 휢; 휢; 휢; ) HANGUL SYLLABLE HWILM +D723;D723;1112 1171 11B2;D723;1112 1171 11B2; # (휣; 휣; 휣; 휣; 휣; ) HANGUL SYLLABLE HWILB +D724;D724;1112 1171 11B3;D724;1112 1171 11B3; # (휤; 휤; 휤; 휤; 휤; ) HANGUL SYLLABLE HWILS +D725;D725;1112 1171 11B4;D725;1112 1171 11B4; # (휥; 휥; 휥; 휥; 휥; ) HANGUL SYLLABLE HWILT +D726;D726;1112 1171 11B5;D726;1112 1171 11B5; # (휦; 휦; 휦; 휦; 휦; ) HANGUL SYLLABLE HWILP +D727;D727;1112 1171 11B6;D727;1112 1171 11B6; # (휧; 휧; 휧; 휧; 휧; ) HANGUL SYLLABLE HWILH +D728;D728;1112 1171 11B7;D728;1112 1171 11B7; # (휨; 휨; 휨; 휨; 휨; ) HANGUL SYLLABLE HWIM +D729;D729;1112 1171 11B8;D729;1112 1171 11B8; # (휩; 휩; 휩; 휩; 휩; ) HANGUL SYLLABLE HWIB +D72A;D72A;1112 1171 11B9;D72A;1112 1171 11B9; # (휪; 휪; 휪; 휪; 휪; ) HANGUL SYLLABLE HWIBS +D72B;D72B;1112 1171 11BA;D72B;1112 1171 11BA; # (휫; 휫; 휫; 휫; 휫; ) HANGUL SYLLABLE HWIS +D72C;D72C;1112 1171 11BB;D72C;1112 1171 11BB; # (휬; 휬; 휬; 휬; 휬; ) HANGUL SYLLABLE HWISS +D72D;D72D;1112 1171 11BC;D72D;1112 1171 11BC; # (휭; 휭; 휭; 휭; 휭; ) HANGUL SYLLABLE HWING +D72E;D72E;1112 1171 11BD;D72E;1112 1171 11BD; # (휮; 휮; 휮; 휮; 휮; ) HANGUL SYLLABLE HWIJ +D72F;D72F;1112 1171 11BE;D72F;1112 1171 11BE; # (휯; 휯; 휯; 휯; 휯; ) HANGUL SYLLABLE HWIC +D730;D730;1112 1171 11BF;D730;1112 1171 11BF; # (휰; 휰; 휰; 휰; 휰; ) HANGUL SYLLABLE HWIK +D731;D731;1112 1171 11C0;D731;1112 1171 11C0; # (휱; 휱; 휱; 휱; 휱; ) HANGUL SYLLABLE HWIT +D732;D732;1112 1171 11C1;D732;1112 1171 11C1; # (휲; 휲; 휲; 휲; 휲; ) HANGUL SYLLABLE HWIP +D733;D733;1112 1171 11C2;D733;1112 1171 11C2; # (휳; 휳; 휳; 휳; 휳; ) HANGUL SYLLABLE HWIH +D734;D734;1112 1172;D734;1112 1172; # (휴; 휴; 휴; 휴; 휴; ) HANGUL SYLLABLE HYU +D735;D735;1112 1172 11A8;D735;1112 1172 11A8; # (휵; 휵; 휵; 휵; 휵; ) HANGUL SYLLABLE HYUG +D736;D736;1112 1172 11A9;D736;1112 1172 11A9; # (휶; 휶; 휶; 휶; 휶; ) HANGUL SYLLABLE HYUGG +D737;D737;1112 1172 11AA;D737;1112 1172 11AA; # (휷; 휷; 휷; 휷; 휷; ) HANGUL SYLLABLE HYUGS +D738;D738;1112 1172 11AB;D738;1112 1172 11AB; # (휸; 휸; 휸; 휸; 휸; ) HANGUL SYLLABLE HYUN +D739;D739;1112 1172 11AC;D739;1112 1172 11AC; # (휹; 휹; 휹; 휹; 휹; ) HANGUL SYLLABLE HYUNJ +D73A;D73A;1112 1172 11AD;D73A;1112 1172 11AD; # (휺; 휺; 휺; 휺; 휺; ) HANGUL SYLLABLE HYUNH +D73B;D73B;1112 1172 11AE;D73B;1112 1172 11AE; # (휻; 휻; 휻; 휻; 휻; ) HANGUL SYLLABLE HYUD +D73C;D73C;1112 1172 11AF;D73C;1112 1172 11AF; # (휼; 휼; 휼; 휼; 휼; ) HANGUL SYLLABLE HYUL +D73D;D73D;1112 1172 11B0;D73D;1112 1172 11B0; # (휽; 휽; 휽; 휽; 휽; ) HANGUL SYLLABLE HYULG +D73E;D73E;1112 1172 11B1;D73E;1112 1172 11B1; # (휾; 휾; 휾; 휾; 휾; ) HANGUL SYLLABLE HYULM +D73F;D73F;1112 1172 11B2;D73F;1112 1172 11B2; # (휿; 휿; 휿; 휿; 휿; ) HANGUL SYLLABLE HYULB +D740;D740;1112 1172 11B3;D740;1112 1172 11B3; # (흀; 흀; 흀; 흀; 흀; ) HANGUL SYLLABLE HYULS +D741;D741;1112 1172 11B4;D741;1112 1172 11B4; # (흁; 흁; 흁; 흁; 흁; ) HANGUL SYLLABLE HYULT +D742;D742;1112 1172 11B5;D742;1112 1172 11B5; # (흂; 흂; 흂; 흂; 흂; ) HANGUL SYLLABLE HYULP +D743;D743;1112 1172 11B6;D743;1112 1172 11B6; # (흃; 흃; 흃; 흃; 흃; ) HANGUL SYLLABLE HYULH +D744;D744;1112 1172 11B7;D744;1112 1172 11B7; # (흄; 흄; 흄; 흄; 흄; ) HANGUL SYLLABLE HYUM +D745;D745;1112 1172 11B8;D745;1112 1172 11B8; # (흅; 흅; 흅; 흅; 흅; ) HANGUL SYLLABLE HYUB +D746;D746;1112 1172 11B9;D746;1112 1172 11B9; # (흆; 흆; 흆; 흆; 흆; ) HANGUL SYLLABLE HYUBS +D747;D747;1112 1172 11BA;D747;1112 1172 11BA; # (흇; 흇; 흇; 흇; 흇; ) HANGUL SYLLABLE HYUS +D748;D748;1112 1172 11BB;D748;1112 1172 11BB; # (흈; 흈; 흈; 흈; 흈; ) HANGUL SYLLABLE HYUSS +D749;D749;1112 1172 11BC;D749;1112 1172 11BC; # (흉; 흉; 흉; 흉; 흉; ) HANGUL SYLLABLE HYUNG +D74A;D74A;1112 1172 11BD;D74A;1112 1172 11BD; # (흊; 흊; 흊; 흊; 흊; ) HANGUL SYLLABLE HYUJ +D74B;D74B;1112 1172 11BE;D74B;1112 1172 11BE; # (흋; 흋; 흋; 흋; 흋; ) HANGUL SYLLABLE HYUC +D74C;D74C;1112 1172 11BF;D74C;1112 1172 11BF; # (흌; 흌; 흌; 흌; 흌; ) HANGUL SYLLABLE HYUK +D74D;D74D;1112 1172 11C0;D74D;1112 1172 11C0; # (흍; 흍; 흍; 흍; 흍; ) HANGUL SYLLABLE HYUT +D74E;D74E;1112 1172 11C1;D74E;1112 1172 11C1; # (흎; 흎; 흎; 흎; 흎; ) HANGUL SYLLABLE HYUP +D74F;D74F;1112 1172 11C2;D74F;1112 1172 11C2; # (흏; 흏; 흏; 흏; 흏; ) HANGUL SYLLABLE HYUH +D750;D750;1112 1173;D750;1112 1173; # (흐; 흐; 흐; 흐; 흐; ) HANGUL SYLLABLE HEU +D751;D751;1112 1173 11A8;D751;1112 1173 11A8; # (흑; 흑; 흑; 흑; 흑; ) HANGUL SYLLABLE HEUG +D752;D752;1112 1173 11A9;D752;1112 1173 11A9; # (흒; 흒; 흒; 흒; 흒; ) HANGUL SYLLABLE HEUGG +D753;D753;1112 1173 11AA;D753;1112 1173 11AA; # (흓; 흓; 흓; 흓; 흓; ) HANGUL SYLLABLE HEUGS +D754;D754;1112 1173 11AB;D754;1112 1173 11AB; # (흔; 흔; 흔; 흔; 흔; ) HANGUL SYLLABLE HEUN +D755;D755;1112 1173 11AC;D755;1112 1173 11AC; # (흕; 흕; 흕; 흕; 흕; ) HANGUL SYLLABLE HEUNJ +D756;D756;1112 1173 11AD;D756;1112 1173 11AD; # (흖; 흖; 흖; 흖; 흖; ) HANGUL SYLLABLE HEUNH +D757;D757;1112 1173 11AE;D757;1112 1173 11AE; # (흗; 흗; 흗; 흗; 흗; ) HANGUL SYLLABLE HEUD +D758;D758;1112 1173 11AF;D758;1112 1173 11AF; # (흘; 흘; 흘; 흘; 흘; ) HANGUL SYLLABLE HEUL +D759;D759;1112 1173 11B0;D759;1112 1173 11B0; # (흙; 흙; 흙; 흙; 흙; ) HANGUL SYLLABLE HEULG +D75A;D75A;1112 1173 11B1;D75A;1112 1173 11B1; # (흚; 흚; 흚; 흚; 흚; ) HANGUL SYLLABLE HEULM +D75B;D75B;1112 1173 11B2;D75B;1112 1173 11B2; # (흛; 흛; 흛; 흛; 흛; ) HANGUL SYLLABLE HEULB +D75C;D75C;1112 1173 11B3;D75C;1112 1173 11B3; # (흜; 흜; 흜; 흜; 흜; ) HANGUL SYLLABLE HEULS +D75D;D75D;1112 1173 11B4;D75D;1112 1173 11B4; # (흝; 흝; 흝; 흝; 흝; ) HANGUL SYLLABLE HEULT +D75E;D75E;1112 1173 11B5;D75E;1112 1173 11B5; # (흞; 흞; 흞; 흞; 흞; ) HANGUL SYLLABLE HEULP +D75F;D75F;1112 1173 11B6;D75F;1112 1173 11B6; # (흟; 흟; 흟; 흟; 흟; ) HANGUL SYLLABLE HEULH +D760;D760;1112 1173 11B7;D760;1112 1173 11B7; # (흠; 흠; 흠; 흠; 흠; ) HANGUL SYLLABLE HEUM +D761;D761;1112 1173 11B8;D761;1112 1173 11B8; # (흡; 흡; 흡; 흡; 흡; ) HANGUL SYLLABLE HEUB +D762;D762;1112 1173 11B9;D762;1112 1173 11B9; # (흢; 흢; 흢; 흢; 흢; ) HANGUL SYLLABLE HEUBS +D763;D763;1112 1173 11BA;D763;1112 1173 11BA; # (흣; 흣; 흣; 흣; 흣; ) HANGUL SYLLABLE HEUS +D764;D764;1112 1173 11BB;D764;1112 1173 11BB; # (흤; 흤; 흤; 흤; 흤; ) HANGUL SYLLABLE HEUSS +D765;D765;1112 1173 11BC;D765;1112 1173 11BC; # (흥; 흥; 흥; 흥; 흥; ) HANGUL SYLLABLE HEUNG +D766;D766;1112 1173 11BD;D766;1112 1173 11BD; # (흦; 흦; 흦; 흦; 흦; ) HANGUL SYLLABLE HEUJ +D767;D767;1112 1173 11BE;D767;1112 1173 11BE; # (흧; 흧; 흧; 흧; 흧; ) HANGUL SYLLABLE HEUC +D768;D768;1112 1173 11BF;D768;1112 1173 11BF; # (흨; 흨; 흨; 흨; 흨; ) HANGUL SYLLABLE HEUK +D769;D769;1112 1173 11C0;D769;1112 1173 11C0; # (흩; 흩; 흩; 흩; 흩; ) HANGUL SYLLABLE HEUT +D76A;D76A;1112 1173 11C1;D76A;1112 1173 11C1; # (흪; 흪; 흪; 흪; 흪; ) HANGUL SYLLABLE HEUP +D76B;D76B;1112 1173 11C2;D76B;1112 1173 11C2; # (흫; 흫; 흫; 흫; 흫; ) HANGUL SYLLABLE HEUH +D76C;D76C;1112 1174;D76C;1112 1174; # (희; 희; 희; 희; 희; ) HANGUL SYLLABLE HYI +D76D;D76D;1112 1174 11A8;D76D;1112 1174 11A8; # (흭; 흭; 흭; 흭; 흭; ) HANGUL SYLLABLE HYIG +D76E;D76E;1112 1174 11A9;D76E;1112 1174 11A9; # (흮; 흮; 흮; 흮; 흮; ) HANGUL SYLLABLE HYIGG +D76F;D76F;1112 1174 11AA;D76F;1112 1174 11AA; # (흯; 흯; 흯; 흯; 흯; ) HANGUL SYLLABLE HYIGS +D770;D770;1112 1174 11AB;D770;1112 1174 11AB; # (흰; 흰; 흰; 흰; 흰; ) HANGUL SYLLABLE HYIN +D771;D771;1112 1174 11AC;D771;1112 1174 11AC; # (흱; 흱; 흱; 흱; 흱; ) HANGUL SYLLABLE HYINJ +D772;D772;1112 1174 11AD;D772;1112 1174 11AD; # (흲; 흲; 흲; 흲; 흲; ) HANGUL SYLLABLE HYINH +D773;D773;1112 1174 11AE;D773;1112 1174 11AE; # (흳; 흳; 흳; 흳; 흳; ) HANGUL SYLLABLE HYID +D774;D774;1112 1174 11AF;D774;1112 1174 11AF; # (흴; 흴; 흴; 흴; 흴; ) HANGUL SYLLABLE HYIL +D775;D775;1112 1174 11B0;D775;1112 1174 11B0; # (흵; 흵; 흵; 흵; 흵; ) HANGUL SYLLABLE HYILG +D776;D776;1112 1174 11B1;D776;1112 1174 11B1; # (흶; 흶; 흶; 흶; 흶; ) HANGUL SYLLABLE HYILM +D777;D777;1112 1174 11B2;D777;1112 1174 11B2; # (흷; 흷; 흷; 흷; 흷; ) HANGUL SYLLABLE HYILB +D778;D778;1112 1174 11B3;D778;1112 1174 11B3; # (흸; 흸; 흸; 흸; 흸; ) HANGUL SYLLABLE HYILS +D779;D779;1112 1174 11B4;D779;1112 1174 11B4; # (흹; 흹; 흹; 흹; 흹; ) HANGUL SYLLABLE HYILT +D77A;D77A;1112 1174 11B5;D77A;1112 1174 11B5; # (흺; 흺; 흺; 흺; 흺; ) HANGUL SYLLABLE HYILP +D77B;D77B;1112 1174 11B6;D77B;1112 1174 11B6; # (흻; 흻; 흻; 흻; 흻; ) HANGUL SYLLABLE HYILH +D77C;D77C;1112 1174 11B7;D77C;1112 1174 11B7; # (흼; 흼; 흼; 흼; 흼; ) HANGUL SYLLABLE HYIM +D77D;D77D;1112 1174 11B8;D77D;1112 1174 11B8; # (흽; 흽; 흽; 흽; 흽; ) HANGUL SYLLABLE HYIB +D77E;D77E;1112 1174 11B9;D77E;1112 1174 11B9; # (흾; 흾; 흾; 흾; 흾; ) HANGUL SYLLABLE HYIBS +D77F;D77F;1112 1174 11BA;D77F;1112 1174 11BA; # (흿; 흿; 흿; 흿; 흿; ) HANGUL SYLLABLE HYIS +D780;D780;1112 1174 11BB;D780;1112 1174 11BB; # (힀; 힀; 힀; 힀; 힀; ) HANGUL SYLLABLE HYISS +D781;D781;1112 1174 11BC;D781;1112 1174 11BC; # (힁; 힁; 힁; 힁; 힁; ) HANGUL SYLLABLE HYING +D782;D782;1112 1174 11BD;D782;1112 1174 11BD; # (힂; 힂; 힂; 힂; 힂; ) HANGUL SYLLABLE HYIJ +D783;D783;1112 1174 11BE;D783;1112 1174 11BE; # (힃; 힃; 힃; 힃; 힃; ) HANGUL SYLLABLE HYIC +D784;D784;1112 1174 11BF;D784;1112 1174 11BF; # (힄; 힄; 힄; 힄; 힄; ) HANGUL SYLLABLE HYIK +D785;D785;1112 1174 11C0;D785;1112 1174 11C0; # (힅; 힅; 힅; 힅; 힅; ) HANGUL SYLLABLE HYIT +D786;D786;1112 1174 11C1;D786;1112 1174 11C1; # (힆; 힆; 힆; 힆; 힆; ) HANGUL SYLLABLE HYIP +D787;D787;1112 1174 11C2;D787;1112 1174 11C2; # (힇; 힇; 힇; 힇; 힇; ) HANGUL SYLLABLE HYIH +D788;D788;1112 1175;D788;1112 1175; # (히; 히; 히; 히; 히; ) HANGUL SYLLABLE HI +D789;D789;1112 1175 11A8;D789;1112 1175 11A8; # (힉; 힉; 힉; 힉; 힉; ) HANGUL SYLLABLE HIG +D78A;D78A;1112 1175 11A9;D78A;1112 1175 11A9; # (힊; 힊; 힊; 힊; 힊; ) HANGUL SYLLABLE HIGG +D78B;D78B;1112 1175 11AA;D78B;1112 1175 11AA; # (힋; 힋; 힋; 힋; 힋; ) HANGUL SYLLABLE HIGS +D78C;D78C;1112 1175 11AB;D78C;1112 1175 11AB; # (힌; 힌; 힌; 힌; 힌; ) HANGUL SYLLABLE HIN +D78D;D78D;1112 1175 11AC;D78D;1112 1175 11AC; # (힍; 힍; 힍; 힍; 힍; ) HANGUL SYLLABLE HINJ +D78E;D78E;1112 1175 11AD;D78E;1112 1175 11AD; # (힎; 힎; 힎; 힎; 힎; ) HANGUL SYLLABLE HINH +D78F;D78F;1112 1175 11AE;D78F;1112 1175 11AE; # (힏; 힏; 힏; 힏; 힏; ) HANGUL SYLLABLE HID +D790;D790;1112 1175 11AF;D790;1112 1175 11AF; # (힐; 힐; 힐; 힐; 힐; ) HANGUL SYLLABLE HIL +D791;D791;1112 1175 11B0;D791;1112 1175 11B0; # (힑; 힑; 힑; 힑; 힑; ) HANGUL SYLLABLE HILG +D792;D792;1112 1175 11B1;D792;1112 1175 11B1; # (힒; 힒; 힒; 힒; 힒; ) HANGUL SYLLABLE HILM +D793;D793;1112 1175 11B2;D793;1112 1175 11B2; # (힓; 힓; 힓; 힓; 힓; ) HANGUL SYLLABLE HILB +D794;D794;1112 1175 11B3;D794;1112 1175 11B3; # (힔; 힔; 힔; 힔; 힔; ) HANGUL SYLLABLE HILS +D795;D795;1112 1175 11B4;D795;1112 1175 11B4; # (힕; 힕; 힕; 힕; 힕; ) HANGUL SYLLABLE HILT +D796;D796;1112 1175 11B5;D796;1112 1175 11B5; # (힖; 힖; 힖; 힖; 힖; ) HANGUL SYLLABLE HILP +D797;D797;1112 1175 11B6;D797;1112 1175 11B6; # (힗; 힗; 힗; 힗; 힗; ) HANGUL SYLLABLE HILH +D798;D798;1112 1175 11B7;D798;1112 1175 11B7; # (힘; 힘; 힘; 힘; 힘; ) HANGUL SYLLABLE HIM +D799;D799;1112 1175 11B8;D799;1112 1175 11B8; # (힙; 힙; 힙; 힙; 힙; ) HANGUL SYLLABLE HIB +D79A;D79A;1112 1175 11B9;D79A;1112 1175 11B9; # (힚; 힚; 힚; 힚; 힚; ) HANGUL SYLLABLE HIBS +D79B;D79B;1112 1175 11BA;D79B;1112 1175 11BA; # (힛; 힛; 힛; 힛; 힛; ) HANGUL SYLLABLE HIS +D79C;D79C;1112 1175 11BB;D79C;1112 1175 11BB; # (힜; 힜; 힜; 힜; 힜; ) HANGUL SYLLABLE HISS +D79D;D79D;1112 1175 11BC;D79D;1112 1175 11BC; # (힝; 힝; 힝; 힝; 힝; ) HANGUL SYLLABLE HING +D79E;D79E;1112 1175 11BD;D79E;1112 1175 11BD; # (힞; 힞; 힞; 힞; 힞; ) HANGUL SYLLABLE HIJ +D79F;D79F;1112 1175 11BE;D79F;1112 1175 11BE; # (힟; 힟; 힟; 힟; 힟; ) HANGUL SYLLABLE HIC +D7A0;D7A0;1112 1175 11BF;D7A0;1112 1175 11BF; # (힠; 힠; 힠; 힠; 힠; ) HANGUL SYLLABLE HIK +D7A1;D7A1;1112 1175 11C0;D7A1;1112 1175 11C0; # (힡; 힡; 힡; 힡; 힡; ) HANGUL SYLLABLE HIT +D7A2;D7A2;1112 1175 11C1;D7A2;1112 1175 11C1; # (힢; 힢; 힢; 힢; 힢; ) HANGUL SYLLABLE HIP +D7A3;D7A3;1112 1175 11C2;D7A3;1112 1175 11C2; # (힣; 힣; 힣; 힣; 힣; ) HANGUL SYLLABLE HIH +F900;8C48;8C48;8C48;8C48; # (豈; 豈; 豈; 豈; 豈; ) CJK COMPATIBILITY IDEOGRAPH-F900 +F901;66F4;66F4;66F4;66F4; # (更; 更; 更; 更; 更; ) CJK COMPATIBILITY IDEOGRAPH-F901 +F902;8ECA;8ECA;8ECA;8ECA; # (車; 車; 車; 車; 車; ) CJK COMPATIBILITY IDEOGRAPH-F902 +F903;8CC8;8CC8;8CC8;8CC8; # (賈; 賈; 賈; 賈; 賈; ) CJK COMPATIBILITY IDEOGRAPH-F903 +F904;6ED1;6ED1;6ED1;6ED1; # (滑; 滑; 滑; 滑; 滑; ) CJK COMPATIBILITY IDEOGRAPH-F904 +F905;4E32;4E32;4E32;4E32; # (串; 串; 串; 串; 串; ) CJK COMPATIBILITY IDEOGRAPH-F905 +F906;53E5;53E5;53E5;53E5; # (句; 句; 句; 句; 句; ) CJK COMPATIBILITY IDEOGRAPH-F906 +F907;9F9C;9F9C;9F9C;9F9C; # (龜; 龜; 龜; 龜; 龜; ) CJK COMPATIBILITY IDEOGRAPH-F907 +F908;9F9C;9F9C;9F9C;9F9C; # (龜; 龜; 龜; 龜; 龜; ) CJK COMPATIBILITY IDEOGRAPH-F908 +F909;5951;5951;5951;5951; # (契; 契; 契; 契; 契; ) CJK COMPATIBILITY IDEOGRAPH-F909 +F90A;91D1;91D1;91D1;91D1; # (金; 金; 金; 金; 金; ) CJK COMPATIBILITY IDEOGRAPH-F90A +F90B;5587;5587;5587;5587; # (喇; 喇; 喇; 喇; 喇; ) CJK COMPATIBILITY IDEOGRAPH-F90B +F90C;5948;5948;5948;5948; # (奈; 奈; 奈; 奈; 奈; ) CJK COMPATIBILITY IDEOGRAPH-F90C +F90D;61F6;61F6;61F6;61F6; # (懶; 懶; 懶; 懶; 懶; ) CJK COMPATIBILITY IDEOGRAPH-F90D +F90E;7669;7669;7669;7669; # (癩; 癩; 癩; 癩; 癩; ) CJK COMPATIBILITY IDEOGRAPH-F90E +F90F;7F85;7F85;7F85;7F85; # (羅; 羅; 羅; 羅; 羅; ) CJK COMPATIBILITY IDEOGRAPH-F90F +F910;863F;863F;863F;863F; # (蘿; 蘿; 蘿; 蘿; 蘿; ) CJK COMPATIBILITY IDEOGRAPH-F910 +F911;87BA;87BA;87BA;87BA; # (螺; 螺; 螺; 螺; 螺; ) CJK COMPATIBILITY IDEOGRAPH-F911 +F912;88F8;88F8;88F8;88F8; # (裸; 裸; 裸; 裸; 裸; ) CJK COMPATIBILITY IDEOGRAPH-F912 +F913;908F;908F;908F;908F; # (邏; 邏; 邏; 邏; 邏; ) CJK COMPATIBILITY IDEOGRAPH-F913 +F914;6A02;6A02;6A02;6A02; # (樂; 樂; 樂; 樂; 樂; ) CJK COMPATIBILITY IDEOGRAPH-F914 +F915;6D1B;6D1B;6D1B;6D1B; # (洛; 洛; 洛; 洛; 洛; ) CJK COMPATIBILITY IDEOGRAPH-F915 +F916;70D9;70D9;70D9;70D9; # (烙; 烙; 烙; 烙; 烙; ) CJK COMPATIBILITY IDEOGRAPH-F916 +F917;73DE;73DE;73DE;73DE; # (珞; 珞; 珞; 珞; 珞; ) CJK COMPATIBILITY IDEOGRAPH-F917 +F918;843D;843D;843D;843D; # (落; 落; 落; 落; 落; ) CJK COMPATIBILITY IDEOGRAPH-F918 +F919;916A;916A;916A;916A; # (酪; 酪; 酪; 酪; 酪; ) CJK COMPATIBILITY IDEOGRAPH-F919 +F91A;99F1;99F1;99F1;99F1; # (駱; 駱; 駱; 駱; 駱; ) CJK COMPATIBILITY IDEOGRAPH-F91A +F91B;4E82;4E82;4E82;4E82; # (亂; 亂; 亂; 亂; 亂; ) CJK COMPATIBILITY IDEOGRAPH-F91B +F91C;5375;5375;5375;5375; # (卵; 卵; 卵; 卵; 卵; ) CJK COMPATIBILITY IDEOGRAPH-F91C +F91D;6B04;6B04;6B04;6B04; # (欄; 欄; 欄; 欄; 欄; ) CJK COMPATIBILITY IDEOGRAPH-F91D +F91E;721B;721B;721B;721B; # (爛; 爛; 爛; 爛; 爛; ) CJK COMPATIBILITY IDEOGRAPH-F91E +F91F;862D;862D;862D;862D; # (蘭; 蘭; 蘭; 蘭; 蘭; ) CJK COMPATIBILITY IDEOGRAPH-F91F +F920;9E1E;9E1E;9E1E;9E1E; # (鸞; 鸞; 鸞; 鸞; 鸞; ) CJK COMPATIBILITY IDEOGRAPH-F920 +F921;5D50;5D50;5D50;5D50; # (嵐; 嵐; 嵐; 嵐; 嵐; ) CJK COMPATIBILITY IDEOGRAPH-F921 +F922;6FEB;6FEB;6FEB;6FEB; # (濫; 濫; 濫; 濫; 濫; ) CJK COMPATIBILITY IDEOGRAPH-F922 +F923;85CD;85CD;85CD;85CD; # (藍; 藍; 藍; 藍; 藍; ) CJK COMPATIBILITY IDEOGRAPH-F923 +F924;8964;8964;8964;8964; # (襤; 襤; 襤; 襤; 襤; ) CJK COMPATIBILITY IDEOGRAPH-F924 +F925;62C9;62C9;62C9;62C9; # (拉; 拉; 拉; 拉; 拉; ) CJK COMPATIBILITY IDEOGRAPH-F925 +F926;81D8;81D8;81D8;81D8; # (臘; 臘; 臘; 臘; 臘; ) CJK COMPATIBILITY IDEOGRAPH-F926 +F927;881F;881F;881F;881F; # (蠟; 蠟; 蠟; 蠟; 蠟; ) CJK COMPATIBILITY IDEOGRAPH-F927 +F928;5ECA;5ECA;5ECA;5ECA; # (廊; 廊; 廊; 廊; 廊; ) CJK COMPATIBILITY IDEOGRAPH-F928 +F929;6717;6717;6717;6717; # (朗; 朗; 朗; 朗; 朗; ) CJK COMPATIBILITY IDEOGRAPH-F929 +F92A;6D6A;6D6A;6D6A;6D6A; # (浪; 浪; 浪; 浪; 浪; ) CJK COMPATIBILITY IDEOGRAPH-F92A +F92B;72FC;72FC;72FC;72FC; # (狼; 狼; 狼; 狼; 狼; ) CJK COMPATIBILITY IDEOGRAPH-F92B +F92C;90CE;90CE;90CE;90CE; # (郎; 郎; 郎; 郎; 郎; ) CJK COMPATIBILITY IDEOGRAPH-F92C +F92D;4F86;4F86;4F86;4F86; # (來; 來; 來; 來; 來; ) CJK COMPATIBILITY IDEOGRAPH-F92D +F92E;51B7;51B7;51B7;51B7; # (冷; 冷; 冷; 冷; 冷; ) CJK COMPATIBILITY IDEOGRAPH-F92E +F92F;52DE;52DE;52DE;52DE; # (勞; 勞; 勞; 勞; 勞; ) CJK COMPATIBILITY IDEOGRAPH-F92F +F930;64C4;64C4;64C4;64C4; # (擄; 擄; 擄; 擄; 擄; ) CJK COMPATIBILITY IDEOGRAPH-F930 +F931;6AD3;6AD3;6AD3;6AD3; # (櫓; 櫓; 櫓; 櫓; 櫓; ) CJK COMPATIBILITY IDEOGRAPH-F931 +F932;7210;7210;7210;7210; # (爐; 爐; 爐; 爐; 爐; ) CJK COMPATIBILITY IDEOGRAPH-F932 +F933;76E7;76E7;76E7;76E7; # (盧; 盧; 盧; 盧; 盧; ) CJK COMPATIBILITY IDEOGRAPH-F933 +F934;8001;8001;8001;8001; # (老; 老; 老; 老; 老; ) CJK COMPATIBILITY IDEOGRAPH-F934 +F935;8606;8606;8606;8606; # (蘆; 蘆; 蘆; 蘆; 蘆; ) CJK COMPATIBILITY IDEOGRAPH-F935 +F936;865C;865C;865C;865C; # (虜; 虜; 虜; 虜; 虜; ) CJK COMPATIBILITY IDEOGRAPH-F936 +F937;8DEF;8DEF;8DEF;8DEF; # (路; 路; 路; 路; 路; ) CJK COMPATIBILITY IDEOGRAPH-F937 +F938;9732;9732;9732;9732; # (露; 露; 露; 露; 露; ) CJK COMPATIBILITY IDEOGRAPH-F938 +F939;9B6F;9B6F;9B6F;9B6F; # (魯; 魯; 魯; 魯; 魯; ) CJK COMPATIBILITY IDEOGRAPH-F939 +F93A;9DFA;9DFA;9DFA;9DFA; # (鷺; 鷺; 鷺; 鷺; 鷺; ) CJK COMPATIBILITY IDEOGRAPH-F93A +F93B;788C;788C;788C;788C; # (碌; 碌; 碌; 碌; 碌; ) CJK COMPATIBILITY IDEOGRAPH-F93B +F93C;797F;797F;797F;797F; # (祿; 祿; 祿; 祿; 祿; ) CJK COMPATIBILITY IDEOGRAPH-F93C +F93D;7DA0;7DA0;7DA0;7DA0; # (綠; 綠; 綠; 綠; 綠; ) CJK COMPATIBILITY IDEOGRAPH-F93D +F93E;83C9;83C9;83C9;83C9; # (菉; 菉; 菉; 菉; 菉; ) CJK COMPATIBILITY IDEOGRAPH-F93E +F93F;9304;9304;9304;9304; # (錄; 錄; 錄; 錄; 錄; ) CJK COMPATIBILITY IDEOGRAPH-F93F +F940;9E7F;9E7F;9E7F;9E7F; # (鹿; 鹿; 鹿; 鹿; 鹿; ) CJK COMPATIBILITY IDEOGRAPH-F940 +F941;8AD6;8AD6;8AD6;8AD6; # (論; 論; 論; 論; 論; ) CJK COMPATIBILITY IDEOGRAPH-F941 +F942;58DF;58DF;58DF;58DF; # (壟; 壟; 壟; 壟; 壟; ) CJK COMPATIBILITY IDEOGRAPH-F942 +F943;5F04;5F04;5F04;5F04; # (弄; 弄; 弄; 弄; 弄; ) CJK COMPATIBILITY IDEOGRAPH-F943 +F944;7C60;7C60;7C60;7C60; # (籠; 籠; 籠; 籠; 籠; ) CJK COMPATIBILITY IDEOGRAPH-F944 +F945;807E;807E;807E;807E; # (聾; 聾; 聾; 聾; 聾; ) CJK COMPATIBILITY IDEOGRAPH-F945 +F946;7262;7262;7262;7262; # (牢; 牢; 牢; 牢; 牢; ) CJK COMPATIBILITY IDEOGRAPH-F946 +F947;78CA;78CA;78CA;78CA; # (磊; 磊; 磊; 磊; 磊; ) CJK COMPATIBILITY IDEOGRAPH-F947 +F948;8CC2;8CC2;8CC2;8CC2; # (賂; 賂; 賂; 賂; 賂; ) CJK COMPATIBILITY IDEOGRAPH-F948 +F949;96F7;96F7;96F7;96F7; # (雷; 雷; 雷; 雷; 雷; ) CJK COMPATIBILITY IDEOGRAPH-F949 +F94A;58D8;58D8;58D8;58D8; # (壘; 壘; 壘; 壘; 壘; ) CJK COMPATIBILITY IDEOGRAPH-F94A +F94B;5C62;5C62;5C62;5C62; # (屢; 屢; 屢; 屢; 屢; ) CJK COMPATIBILITY IDEOGRAPH-F94B +F94C;6A13;6A13;6A13;6A13; # (樓; 樓; 樓; 樓; 樓; ) CJK COMPATIBILITY IDEOGRAPH-F94C +F94D;6DDA;6DDA;6DDA;6DDA; # (淚; 淚; 淚; 淚; 淚; ) CJK COMPATIBILITY IDEOGRAPH-F94D +F94E;6F0F;6F0F;6F0F;6F0F; # (漏; 漏; 漏; 漏; 漏; ) CJK COMPATIBILITY IDEOGRAPH-F94E +F94F;7D2F;7D2F;7D2F;7D2F; # (累; 累; 累; 累; 累; ) CJK COMPATIBILITY IDEOGRAPH-F94F +F950;7E37;7E37;7E37;7E37; # (縷; 縷; 縷; 縷; 縷; ) CJK COMPATIBILITY IDEOGRAPH-F950 +F951;964B;964B;964B;964B; # (陋; 陋; 陋; 陋; 陋; ) CJK COMPATIBILITY IDEOGRAPH-F951 +F952;52D2;52D2;52D2;52D2; # (勒; 勒; 勒; 勒; 勒; ) CJK COMPATIBILITY IDEOGRAPH-F952 +F953;808B;808B;808B;808B; # (肋; 肋; 肋; 肋; 肋; ) CJK COMPATIBILITY IDEOGRAPH-F953 +F954;51DC;51DC;51DC;51DC; # (凜; 凜; 凜; 凜; 凜; ) CJK COMPATIBILITY IDEOGRAPH-F954 +F955;51CC;51CC;51CC;51CC; # (凌; 凌; 凌; 凌; 凌; ) CJK COMPATIBILITY IDEOGRAPH-F955 +F956;7A1C;7A1C;7A1C;7A1C; # (稜; 稜; 稜; 稜; 稜; ) CJK COMPATIBILITY IDEOGRAPH-F956 +F957;7DBE;7DBE;7DBE;7DBE; # (綾; 綾; 綾; 綾; 綾; ) CJK COMPATIBILITY IDEOGRAPH-F957 +F958;83F1;83F1;83F1;83F1; # (菱; 菱; 菱; 菱; 菱; ) CJK COMPATIBILITY IDEOGRAPH-F958 +F959;9675;9675;9675;9675; # (陵; 陵; 陵; 陵; 陵; ) CJK COMPATIBILITY IDEOGRAPH-F959 +F95A;8B80;8B80;8B80;8B80; # (讀; 讀; 讀; 讀; 讀; ) CJK COMPATIBILITY IDEOGRAPH-F95A +F95B;62CF;62CF;62CF;62CF; # (拏; 拏; 拏; 拏; 拏; ) CJK COMPATIBILITY IDEOGRAPH-F95B +F95C;6A02;6A02;6A02;6A02; # (樂; 樂; 樂; 樂; 樂; ) CJK COMPATIBILITY IDEOGRAPH-F95C +F95D;8AFE;8AFE;8AFE;8AFE; # (諾; 諾; 諾; 諾; 諾; ) CJK COMPATIBILITY IDEOGRAPH-F95D +F95E;4E39;4E39;4E39;4E39; # (丹; 丹; 丹; 丹; 丹; ) CJK COMPATIBILITY IDEOGRAPH-F95E +F95F;5BE7;5BE7;5BE7;5BE7; # (寧; 寧; 寧; 寧; 寧; ) CJK COMPATIBILITY IDEOGRAPH-F95F +F960;6012;6012;6012;6012; # (怒; 怒; 怒; 怒; 怒; ) CJK COMPATIBILITY IDEOGRAPH-F960 +F961;7387;7387;7387;7387; # (率; 率; 率; 率; 率; ) CJK COMPATIBILITY IDEOGRAPH-F961 +F962;7570;7570;7570;7570; # (異; 異; 異; 異; 異; ) CJK COMPATIBILITY IDEOGRAPH-F962 +F963;5317;5317;5317;5317; # (北; 北; 北; 北; 北; ) CJK COMPATIBILITY IDEOGRAPH-F963 +F964;78FB;78FB;78FB;78FB; # (磻; 磻; 磻; 磻; 磻; ) CJK COMPATIBILITY IDEOGRAPH-F964 +F965;4FBF;4FBF;4FBF;4FBF; # (便; 便; 便; 便; 便; ) CJK COMPATIBILITY IDEOGRAPH-F965 +F966;5FA9;5FA9;5FA9;5FA9; # (復; 復; 復; 復; 復; ) CJK COMPATIBILITY IDEOGRAPH-F966 +F967;4E0D;4E0D;4E0D;4E0D; # (不; 不; 不; 不; 不; ) CJK COMPATIBILITY IDEOGRAPH-F967 +F968;6CCC;6CCC;6CCC;6CCC; # (泌; 泌; 泌; 泌; 泌; ) CJK COMPATIBILITY IDEOGRAPH-F968 +F969;6578;6578;6578;6578; # (數; 數; 數; 數; 數; ) CJK COMPATIBILITY IDEOGRAPH-F969 +F96A;7D22;7D22;7D22;7D22; # (索; 索; 索; 索; 索; ) CJK COMPATIBILITY IDEOGRAPH-F96A +F96B;53C3;53C3;53C3;53C3; # (參; 參; 參; 參; 參; ) CJK COMPATIBILITY IDEOGRAPH-F96B +F96C;585E;585E;585E;585E; # (塞; 塞; 塞; 塞; 塞; ) CJK COMPATIBILITY IDEOGRAPH-F96C +F96D;7701;7701;7701;7701; # (省; 省; 省; 省; 省; ) CJK COMPATIBILITY IDEOGRAPH-F96D +F96E;8449;8449;8449;8449; # (葉; 葉; 葉; 葉; 葉; ) CJK COMPATIBILITY IDEOGRAPH-F96E +F96F;8AAA;8AAA;8AAA;8AAA; # (說; 說; 說; 說; 說; ) CJK COMPATIBILITY IDEOGRAPH-F96F +F970;6BBA;6BBA;6BBA;6BBA; # (殺; 殺; 殺; 殺; 殺; ) CJK COMPATIBILITY IDEOGRAPH-F970 +F971;8FB0;8FB0;8FB0;8FB0; # (辰; 辰; 辰; 辰; 辰; ) CJK COMPATIBILITY IDEOGRAPH-F971 +F972;6C88;6C88;6C88;6C88; # (沈; 沈; 沈; 沈; 沈; ) CJK COMPATIBILITY IDEOGRAPH-F972 +F973;62FE;62FE;62FE;62FE; # (拾; 拾; 拾; 拾; 拾; ) CJK COMPATIBILITY IDEOGRAPH-F973 +F974;82E5;82E5;82E5;82E5; # (若; 若; 若; 若; 若; ) CJK COMPATIBILITY IDEOGRAPH-F974 +F975;63A0;63A0;63A0;63A0; # (掠; 掠; 掠; 掠; 掠; ) CJK COMPATIBILITY IDEOGRAPH-F975 +F976;7565;7565;7565;7565; # (略; 略; 略; 略; 略; ) CJK COMPATIBILITY IDEOGRAPH-F976 +F977;4EAE;4EAE;4EAE;4EAE; # (亮; 亮; 亮; 亮; 亮; ) CJK COMPATIBILITY IDEOGRAPH-F977 +F978;5169;5169;5169;5169; # (兩; 兩; 兩; 兩; 兩; ) CJK COMPATIBILITY IDEOGRAPH-F978 +F979;51C9;51C9;51C9;51C9; # (凉; 凉; 凉; 凉; 凉; ) CJK COMPATIBILITY IDEOGRAPH-F979 +F97A;6881;6881;6881;6881; # (梁; 梁; 梁; 梁; 梁; ) CJK COMPATIBILITY IDEOGRAPH-F97A +F97B;7CE7;7CE7;7CE7;7CE7; # (糧; 糧; 糧; 糧; 糧; ) CJK COMPATIBILITY IDEOGRAPH-F97B +F97C;826F;826F;826F;826F; # (良; 良; 良; 良; 良; ) CJK COMPATIBILITY IDEOGRAPH-F97C +F97D;8AD2;8AD2;8AD2;8AD2; # (諒; 諒; 諒; 諒; 諒; ) CJK COMPATIBILITY IDEOGRAPH-F97D +F97E;91CF;91CF;91CF;91CF; # (量; 量; 量; 量; 量; ) CJK COMPATIBILITY IDEOGRAPH-F97E +F97F;52F5;52F5;52F5;52F5; # (勵; 勵; 勵; 勵; 勵; ) CJK COMPATIBILITY IDEOGRAPH-F97F +F980;5442;5442;5442;5442; # (呂; 呂; 呂; 呂; 呂; ) CJK COMPATIBILITY IDEOGRAPH-F980 +F981;5973;5973;5973;5973; # (女; 女; 女; 女; 女; ) CJK COMPATIBILITY IDEOGRAPH-F981 +F982;5EEC;5EEC;5EEC;5EEC; # (廬; 廬; 廬; 廬; 廬; ) CJK COMPATIBILITY IDEOGRAPH-F982 +F983;65C5;65C5;65C5;65C5; # (旅; 旅; 旅; 旅; 旅; ) CJK COMPATIBILITY IDEOGRAPH-F983 +F984;6FFE;6FFE;6FFE;6FFE; # (濾; 濾; 濾; 濾; 濾; ) CJK COMPATIBILITY IDEOGRAPH-F984 +F985;792A;792A;792A;792A; # (礪; 礪; 礪; 礪; 礪; ) CJK COMPATIBILITY IDEOGRAPH-F985 +F986;95AD;95AD;95AD;95AD; # (閭; 閭; 閭; 閭; 閭; ) CJK COMPATIBILITY IDEOGRAPH-F986 +F987;9A6A;9A6A;9A6A;9A6A; # (驪; 驪; 驪; 驪; 驪; ) CJK COMPATIBILITY IDEOGRAPH-F987 +F988;9E97;9E97;9E97;9E97; # (麗; 麗; 麗; 麗; 麗; ) CJK COMPATIBILITY IDEOGRAPH-F988 +F989;9ECE;9ECE;9ECE;9ECE; # (黎; 黎; 黎; 黎; 黎; ) CJK COMPATIBILITY IDEOGRAPH-F989 +F98A;529B;529B;529B;529B; # (力; 力; 力; 力; 力; ) CJK COMPATIBILITY IDEOGRAPH-F98A +F98B;66C6;66C6;66C6;66C6; # (曆; 曆; 曆; 曆; 曆; ) CJK COMPATIBILITY IDEOGRAPH-F98B +F98C;6B77;6B77;6B77;6B77; # (歷; 歷; 歷; 歷; 歷; ) CJK COMPATIBILITY IDEOGRAPH-F98C +F98D;8F62;8F62;8F62;8F62; # (轢; 轢; 轢; 轢; 轢; ) CJK COMPATIBILITY IDEOGRAPH-F98D +F98E;5E74;5E74;5E74;5E74; # (年; 年; 年; 年; 年; ) CJK COMPATIBILITY IDEOGRAPH-F98E +F98F;6190;6190;6190;6190; # (憐; 憐; 憐; 憐; 憐; ) CJK COMPATIBILITY IDEOGRAPH-F98F +F990;6200;6200;6200;6200; # (戀; 戀; 戀; 戀; 戀; ) CJK COMPATIBILITY IDEOGRAPH-F990 +F991;649A;649A;649A;649A; # (撚; 撚; 撚; 撚; 撚; ) CJK COMPATIBILITY IDEOGRAPH-F991 +F992;6F23;6F23;6F23;6F23; # (漣; 漣; 漣; 漣; 漣; ) CJK COMPATIBILITY IDEOGRAPH-F992 +F993;7149;7149;7149;7149; # (煉; 煉; 煉; 煉; 煉; ) CJK COMPATIBILITY IDEOGRAPH-F993 +F994;7489;7489;7489;7489; # (璉; 璉; 璉; 璉; 璉; ) CJK COMPATIBILITY IDEOGRAPH-F994 +F995;79CA;79CA;79CA;79CA; # (秊; 秊; 秊; 秊; 秊; ) CJK COMPATIBILITY IDEOGRAPH-F995 +F996;7DF4;7DF4;7DF4;7DF4; # (練; 練; 練; 練; 練; ) CJK COMPATIBILITY IDEOGRAPH-F996 +F997;806F;806F;806F;806F; # (聯; 聯; 聯; 聯; 聯; ) CJK COMPATIBILITY IDEOGRAPH-F997 +F998;8F26;8F26;8F26;8F26; # (輦; 輦; 輦; 輦; 輦; ) CJK COMPATIBILITY IDEOGRAPH-F998 +F999;84EE;84EE;84EE;84EE; # (蓮; 蓮; 蓮; 蓮; 蓮; ) CJK COMPATIBILITY IDEOGRAPH-F999 +F99A;9023;9023;9023;9023; # (連; 連; 連; 連; 連; ) CJK COMPATIBILITY IDEOGRAPH-F99A +F99B;934A;934A;934A;934A; # (鍊; 鍊; 鍊; 鍊; 鍊; ) CJK COMPATIBILITY IDEOGRAPH-F99B +F99C;5217;5217;5217;5217; # (列; 列; 列; 列; 列; ) CJK COMPATIBILITY IDEOGRAPH-F99C +F99D;52A3;52A3;52A3;52A3; # (劣; 劣; 劣; 劣; 劣; ) CJK COMPATIBILITY IDEOGRAPH-F99D +F99E;54BD;54BD;54BD;54BD; # (咽; 咽; 咽; 咽; 咽; ) CJK COMPATIBILITY IDEOGRAPH-F99E +F99F;70C8;70C8;70C8;70C8; # (烈; 烈; 烈; 烈; 烈; ) CJK COMPATIBILITY IDEOGRAPH-F99F +F9A0;88C2;88C2;88C2;88C2; # (裂; 裂; 裂; 裂; 裂; ) CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9A1;8AAA;8AAA;8AAA;8AAA; # (說; 說; 說; 說; 說; ) CJK COMPATIBILITY IDEOGRAPH-F9A1 +F9A2;5EC9;5EC9;5EC9;5EC9; # (廉; 廉; 廉; 廉; 廉; ) CJK COMPATIBILITY IDEOGRAPH-F9A2 +F9A3;5FF5;5FF5;5FF5;5FF5; # (念; 念; 念; 念; 念; ) CJK COMPATIBILITY IDEOGRAPH-F9A3 +F9A4;637B;637B;637B;637B; # (捻; 捻; 捻; 捻; 捻; ) CJK COMPATIBILITY IDEOGRAPH-F9A4 +F9A5;6BAE;6BAE;6BAE;6BAE; # (殮; 殮; 殮; 殮; 殮; ) CJK COMPATIBILITY IDEOGRAPH-F9A5 +F9A6;7C3E;7C3E;7C3E;7C3E; # (簾; 簾; 簾; 簾; 簾; ) CJK COMPATIBILITY IDEOGRAPH-F9A6 +F9A7;7375;7375;7375;7375; # (獵; 獵; 獵; 獵; 獵; ) CJK COMPATIBILITY IDEOGRAPH-F9A7 +F9A8;4EE4;4EE4;4EE4;4EE4; # (令; 令; 令; 令; 令; ) CJK COMPATIBILITY IDEOGRAPH-F9A8 +F9A9;56F9;56F9;56F9;56F9; # (囹; 囹; 囹; 囹; 囹; ) CJK COMPATIBILITY IDEOGRAPH-F9A9 +F9AA;5BE7;5BE7;5BE7;5BE7; # (寧; 寧; 寧; 寧; 寧; ) CJK COMPATIBILITY IDEOGRAPH-F9AA +F9AB;5DBA;5DBA;5DBA;5DBA; # (嶺; 嶺; 嶺; 嶺; 嶺; ) CJK COMPATIBILITY IDEOGRAPH-F9AB +F9AC;601C;601C;601C;601C; # (怜; 怜; 怜; 怜; 怜; ) CJK COMPATIBILITY IDEOGRAPH-F9AC +F9AD;73B2;73B2;73B2;73B2; # (玲; 玲; 玲; 玲; 玲; ) CJK COMPATIBILITY IDEOGRAPH-F9AD +F9AE;7469;7469;7469;7469; # (瑩; 瑩; 瑩; 瑩; 瑩; ) CJK COMPATIBILITY IDEOGRAPH-F9AE +F9AF;7F9A;7F9A;7F9A;7F9A; # (羚; 羚; 羚; 羚; 羚; ) CJK COMPATIBILITY IDEOGRAPH-F9AF +F9B0;8046;8046;8046;8046; # (聆; 聆; 聆; 聆; 聆; ) CJK COMPATIBILITY IDEOGRAPH-F9B0 +F9B1;9234;9234;9234;9234; # (鈴; 鈴; 鈴; 鈴; 鈴; ) CJK COMPATIBILITY IDEOGRAPH-F9B1 +F9B2;96F6;96F6;96F6;96F6; # (零; 零; 零; 零; 零; ) CJK COMPATIBILITY IDEOGRAPH-F9B2 +F9B3;9748;9748;9748;9748; # (靈; 靈; 靈; 靈; 靈; ) CJK COMPATIBILITY IDEOGRAPH-F9B3 +F9B4;9818;9818;9818;9818; # (領; 領; 領; 領; 領; ) CJK COMPATIBILITY IDEOGRAPH-F9B4 +F9B5;4F8B;4F8B;4F8B;4F8B; # (例; 例; 例; 例; 例; ) CJK COMPATIBILITY IDEOGRAPH-F9B5 +F9B6;79AE;79AE;79AE;79AE; # (禮; 禮; 禮; 禮; 禮; ) CJK COMPATIBILITY IDEOGRAPH-F9B6 +F9B7;91B4;91B4;91B4;91B4; # (醴; 醴; 醴; 醴; 醴; ) CJK COMPATIBILITY IDEOGRAPH-F9B7 +F9B8;96B8;96B8;96B8;96B8; # (隸; 隸; 隸; 隸; 隸; ) CJK COMPATIBILITY IDEOGRAPH-F9B8 +F9B9;60E1;60E1;60E1;60E1; # (惡; 惡; 惡; 惡; 惡; ) CJK COMPATIBILITY IDEOGRAPH-F9B9 +F9BA;4E86;4E86;4E86;4E86; # (了; 了; 了; 了; 了; ) CJK COMPATIBILITY IDEOGRAPH-F9BA +F9BB;50DA;50DA;50DA;50DA; # (僚; 僚; 僚; 僚; 僚; ) CJK COMPATIBILITY IDEOGRAPH-F9BB +F9BC;5BEE;5BEE;5BEE;5BEE; # (寮; 寮; 寮; 寮; 寮; ) CJK COMPATIBILITY IDEOGRAPH-F9BC +F9BD;5C3F;5C3F;5C3F;5C3F; # (尿; 尿; 尿; 尿; 尿; ) CJK COMPATIBILITY IDEOGRAPH-F9BD +F9BE;6599;6599;6599;6599; # (料; 料; 料; 料; 料; ) CJK COMPATIBILITY IDEOGRAPH-F9BE +F9BF;6A02;6A02;6A02;6A02; # (樂; 樂; 樂; 樂; 樂; ) CJK COMPATIBILITY IDEOGRAPH-F9BF +F9C0;71CE;71CE;71CE;71CE; # (燎; 燎; 燎; 燎; 燎; ) CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9C1;7642;7642;7642;7642; # (療; 療; 療; 療; 療; ) CJK COMPATIBILITY IDEOGRAPH-F9C1 +F9C2;84FC;84FC;84FC;84FC; # (蓼; 蓼; 蓼; 蓼; 蓼; ) CJK COMPATIBILITY IDEOGRAPH-F9C2 +F9C3;907C;907C;907C;907C; # (遼; 遼; 遼; 遼; 遼; ) CJK COMPATIBILITY IDEOGRAPH-F9C3 +F9C4;9F8D;9F8D;9F8D;9F8D; # (龍; 龍; 龍; 龍; 龍; ) CJK COMPATIBILITY IDEOGRAPH-F9C4 +F9C5;6688;6688;6688;6688; # (暈; 暈; 暈; 暈; 暈; ) CJK COMPATIBILITY IDEOGRAPH-F9C5 +F9C6;962E;962E;962E;962E; # (阮; 阮; 阮; 阮; 阮; ) CJK COMPATIBILITY IDEOGRAPH-F9C6 +F9C7;5289;5289;5289;5289; # (劉; 劉; 劉; 劉; 劉; ) CJK COMPATIBILITY IDEOGRAPH-F9C7 +F9C8;677B;677B;677B;677B; # (杻; 杻; 杻; 杻; 杻; ) CJK COMPATIBILITY IDEOGRAPH-F9C8 +F9C9;67F3;67F3;67F3;67F3; # (柳; 柳; 柳; 柳; 柳; ) CJK COMPATIBILITY IDEOGRAPH-F9C9 +F9CA;6D41;6D41;6D41;6D41; # (流; 流; 流; 流; 流; ) CJK COMPATIBILITY IDEOGRAPH-F9CA +F9CB;6E9C;6E9C;6E9C;6E9C; # (溜; 溜; 溜; 溜; 溜; ) CJK COMPATIBILITY IDEOGRAPH-F9CB +F9CC;7409;7409;7409;7409; # (琉; 琉; 琉; 琉; 琉; ) CJK COMPATIBILITY IDEOGRAPH-F9CC +F9CD;7559;7559;7559;7559; # (留; 留; 留; 留; 留; ) CJK COMPATIBILITY IDEOGRAPH-F9CD +F9CE;786B;786B;786B;786B; # (硫; 硫; 硫; 硫; 硫; ) CJK COMPATIBILITY IDEOGRAPH-F9CE +F9CF;7D10;7D10;7D10;7D10; # (紐; 紐; 紐; 紐; 紐; ) CJK COMPATIBILITY IDEOGRAPH-F9CF +F9D0;985E;985E;985E;985E; # (類; 類; 類; 類; 類; ) CJK COMPATIBILITY IDEOGRAPH-F9D0 +F9D1;516D;516D;516D;516D; # (六; 六; 六; 六; 六; ) CJK COMPATIBILITY IDEOGRAPH-F9D1 +F9D2;622E;622E;622E;622E; # (戮; 戮; 戮; 戮; 戮; ) CJK COMPATIBILITY IDEOGRAPH-F9D2 +F9D3;9678;9678;9678;9678; # (陸; 陸; 陸; 陸; 陸; ) CJK COMPATIBILITY IDEOGRAPH-F9D3 +F9D4;502B;502B;502B;502B; # (倫; 倫; 倫; 倫; 倫; ) CJK COMPATIBILITY IDEOGRAPH-F9D4 +F9D5;5D19;5D19;5D19;5D19; # (崙; 崙; 崙; 崙; 崙; ) CJK COMPATIBILITY IDEOGRAPH-F9D5 +F9D6;6DEA;6DEA;6DEA;6DEA; # (淪; 淪; 淪; 淪; 淪; ) CJK COMPATIBILITY IDEOGRAPH-F9D6 +F9D7;8F2A;8F2A;8F2A;8F2A; # (輪; 輪; 輪; 輪; 輪; ) CJK COMPATIBILITY IDEOGRAPH-F9D7 +F9D8;5F8B;5F8B;5F8B;5F8B; # (律; 律; 律; 律; 律; ) CJK COMPATIBILITY IDEOGRAPH-F9D8 +F9D9;6144;6144;6144;6144; # (慄; 慄; 慄; 慄; 慄; ) CJK COMPATIBILITY IDEOGRAPH-F9D9 +F9DA;6817;6817;6817;6817; # (栗; 栗; 栗; 栗; 栗; ) CJK COMPATIBILITY IDEOGRAPH-F9DA +F9DB;7387;7387;7387;7387; # (率; 率; 率; 率; 率; ) CJK COMPATIBILITY IDEOGRAPH-F9DB +F9DC;9686;9686;9686;9686; # (隆; 隆; 隆; 隆; 隆; ) CJK COMPATIBILITY IDEOGRAPH-F9DC +F9DD;5229;5229;5229;5229; # (利; 利; 利; 利; 利; ) CJK COMPATIBILITY IDEOGRAPH-F9DD +F9DE;540F;540F;540F;540F; # (吏; 吏; 吏; 吏; 吏; ) CJK COMPATIBILITY IDEOGRAPH-F9DE +F9DF;5C65;5C65;5C65;5C65; # (履; 履; 履; 履; 履; ) CJK COMPATIBILITY IDEOGRAPH-F9DF +F9E0;6613;6613;6613;6613; # (易; 易; 易; 易; 易; ) CJK COMPATIBILITY IDEOGRAPH-F9E0 +F9E1;674E;674E;674E;674E; # (李; 李; 李; 李; 李; ) CJK COMPATIBILITY IDEOGRAPH-F9E1 +F9E2;68A8;68A8;68A8;68A8; # (梨; 梨; 梨; 梨; 梨; ) CJK COMPATIBILITY IDEOGRAPH-F9E2 +F9E3;6CE5;6CE5;6CE5;6CE5; # (泥; 泥; 泥; 泥; 泥; ) CJK COMPATIBILITY IDEOGRAPH-F9E3 +F9E4;7406;7406;7406;7406; # (理; 理; 理; 理; 理; ) CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9E5;75E2;75E2;75E2;75E2; # (痢; 痢; 痢; 痢; 痢; ) CJK COMPATIBILITY IDEOGRAPH-F9E5 +F9E6;7F79;7F79;7F79;7F79; # (罹; 罹; 罹; 罹; 罹; ) CJK COMPATIBILITY IDEOGRAPH-F9E6 +F9E7;88CF;88CF;88CF;88CF; # (裏; 裏; 裏; 裏; 裏; ) CJK COMPATIBILITY IDEOGRAPH-F9E7 +F9E8;88E1;88E1;88E1;88E1; # (裡; 裡; 裡; 裡; 裡; ) CJK COMPATIBILITY IDEOGRAPH-F9E8 +F9E9;91CC;91CC;91CC;91CC; # (里; 里; 里; 里; 里; ) CJK COMPATIBILITY IDEOGRAPH-F9E9 +F9EA;96E2;96E2;96E2;96E2; # (離; 離; 離; 離; 離; ) CJK COMPATIBILITY IDEOGRAPH-F9EA +F9EB;533F;533F;533F;533F; # (匿; 匿; 匿; 匿; 匿; ) CJK COMPATIBILITY IDEOGRAPH-F9EB +F9EC;6EBA;6EBA;6EBA;6EBA; # (溺; 溺; 溺; 溺; 溺; ) CJK COMPATIBILITY IDEOGRAPH-F9EC +F9ED;541D;541D;541D;541D; # (吝; 吝; 吝; 吝; 吝; ) CJK COMPATIBILITY IDEOGRAPH-F9ED +F9EE;71D0;71D0;71D0;71D0; # (燐; 燐; 燐; 燐; 燐; ) CJK COMPATIBILITY IDEOGRAPH-F9EE +F9EF;7498;7498;7498;7498; # (璘; 璘; 璘; 璘; 璘; ) CJK COMPATIBILITY IDEOGRAPH-F9EF +F9F0;85FA;85FA;85FA;85FA; # (藺; 藺; 藺; 藺; 藺; ) CJK COMPATIBILITY IDEOGRAPH-F9F0 +F9F1;96A3;96A3;96A3;96A3; # (隣; 隣; 隣; 隣; 隣; ) CJK COMPATIBILITY IDEOGRAPH-F9F1 +F9F2;9C57;9C57;9C57;9C57; # (鱗; 鱗; 鱗; 鱗; 鱗; ) CJK COMPATIBILITY IDEOGRAPH-F9F2 +F9F3;9E9F;9E9F;9E9F;9E9F; # (麟; 麟; 麟; 麟; 麟; ) CJK COMPATIBILITY IDEOGRAPH-F9F3 +F9F4;6797;6797;6797;6797; # (林; 林; 林; 林; 林; ) CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9F5;6DCB;6DCB;6DCB;6DCB; # (淋; 淋; 淋; 淋; 淋; ) CJK COMPATIBILITY IDEOGRAPH-F9F5 +F9F6;81E8;81E8;81E8;81E8; # (臨; 臨; 臨; 臨; 臨; ) CJK COMPATIBILITY IDEOGRAPH-F9F6 +F9F7;7ACB;7ACB;7ACB;7ACB; # (立; 立; 立; 立; 立; ) CJK COMPATIBILITY IDEOGRAPH-F9F7 +F9F8;7B20;7B20;7B20;7B20; # (笠; 笠; 笠; 笠; 笠; ) CJK COMPATIBILITY IDEOGRAPH-F9F8 +F9F9;7C92;7C92;7C92;7C92; # (粒; 粒; 粒; 粒; 粒; ) CJK COMPATIBILITY IDEOGRAPH-F9F9 +F9FA;72C0;72C0;72C0;72C0; # (狀; 狀; 狀; 狀; 狀; ) CJK COMPATIBILITY IDEOGRAPH-F9FA +F9FB;7099;7099;7099;7099; # (炙; 炙; 炙; 炙; 炙; ) CJK COMPATIBILITY IDEOGRAPH-F9FB +F9FC;8B58;8B58;8B58;8B58; # (識; 識; 識; 識; 識; ) CJK COMPATIBILITY IDEOGRAPH-F9FC +F9FD;4EC0;4EC0;4EC0;4EC0; # (什; 什; 什; 什; 什; ) CJK COMPATIBILITY IDEOGRAPH-F9FD +F9FE;8336;8336;8336;8336; # (茶; 茶; 茶; 茶; 茶; ) CJK COMPATIBILITY IDEOGRAPH-F9FE +F9FF;523A;523A;523A;523A; # (刺; 刺; 刺; 刺; 刺; ) CJK COMPATIBILITY IDEOGRAPH-F9FF +FA00;5207;5207;5207;5207; # (切; 切; 切; 切; 切; ) CJK COMPATIBILITY IDEOGRAPH-FA00 +FA01;5EA6;5EA6;5EA6;5EA6; # (度; 度; 度; 度; 度; ) CJK COMPATIBILITY IDEOGRAPH-FA01 +FA02;62D3;62D3;62D3;62D3; # (拓; 拓; 拓; 拓; 拓; ) CJK COMPATIBILITY IDEOGRAPH-FA02 +FA03;7CD6;7CD6;7CD6;7CD6; # (糖; 糖; 糖; 糖; 糖; ) CJK COMPATIBILITY IDEOGRAPH-FA03 +FA04;5B85;5B85;5B85;5B85; # (宅; 宅; 宅; 宅; 宅; ) CJK COMPATIBILITY IDEOGRAPH-FA04 +FA05;6D1E;6D1E;6D1E;6D1E; # (洞; 洞; 洞; 洞; 洞; ) CJK COMPATIBILITY IDEOGRAPH-FA05 +FA06;66B4;66B4;66B4;66B4; # (暴; 暴; 暴; 暴; 暴; ) CJK COMPATIBILITY IDEOGRAPH-FA06 +FA07;8F3B;8F3B;8F3B;8F3B; # (輻; 輻; 輻; 輻; 輻; ) CJK COMPATIBILITY IDEOGRAPH-FA07 +FA08;884C;884C;884C;884C; # (行; 行; 行; 行; 行; ) CJK COMPATIBILITY IDEOGRAPH-FA08 +FA09;964D;964D;964D;964D; # (降; 降; 降; 降; 降; ) CJK COMPATIBILITY IDEOGRAPH-FA09 +FA0A;898B;898B;898B;898B; # (見; 見; 見; 見; 見; ) CJK COMPATIBILITY IDEOGRAPH-FA0A +FA0B;5ED3;5ED3;5ED3;5ED3; # (廓; 廓; 廓; 廓; 廓; ) CJK COMPATIBILITY IDEOGRAPH-FA0B +FA0C;5140;5140;5140;5140; # (兀; 兀; 兀; 兀; 兀; ) CJK COMPATIBILITY IDEOGRAPH-FA0C +FA0D;55C0;55C0;55C0;55C0; # (嗀; 嗀; 嗀; 嗀; 嗀; ) CJK COMPATIBILITY IDEOGRAPH-FA0D +FA10;585A;585A;585A;585A; # (塚; 塚; 塚; 塚; 塚; ) CJK COMPATIBILITY IDEOGRAPH-FA10 +FA12;6674;6674;6674;6674; # (晴; 晴; 晴; 晴; 晴; ) CJK COMPATIBILITY IDEOGRAPH-FA12 +FA15;51DE;51DE;51DE;51DE; # (凞; 凞; 凞; 凞; 凞; ) CJK COMPATIBILITY IDEOGRAPH-FA15 +FA16;732A;732A;732A;732A; # (猪; 猪; 猪; 猪; 猪; ) CJK COMPATIBILITY IDEOGRAPH-FA16 +FA17;76CA;76CA;76CA;76CA; # (益; 益; 益; 益; 益; ) CJK COMPATIBILITY IDEOGRAPH-FA17 +FA18;793C;793C;793C;793C; # (礼; 礼; 礼; 礼; 礼; ) CJK COMPATIBILITY IDEOGRAPH-FA18 +FA19;795E;795E;795E;795E; # (神; 神; 神; 神; 神; ) CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A;7965;7965;7965;7965; # (祥; 祥; 祥; 祥; 祥; ) CJK COMPATIBILITY IDEOGRAPH-FA1A +FA1B;798F;798F;798F;798F; # (福; 福; 福; 福; 福; ) CJK COMPATIBILITY IDEOGRAPH-FA1B +FA1C;9756;9756;9756;9756; # (靖; 靖; 靖; 靖; 靖; ) CJK COMPATIBILITY IDEOGRAPH-FA1C +FA1D;7CBE;7CBE;7CBE;7CBE; # (精; 精; 精; 精; 精; ) CJK COMPATIBILITY IDEOGRAPH-FA1D +FA1E;7FBD;7FBD;7FBD;7FBD; # (羽; 羽; 羽; 羽; 羽; ) CJK COMPATIBILITY IDEOGRAPH-FA1E +FA20;8612;8612;8612;8612; # (蘒; 蘒; 蘒; 蘒; 蘒; ) CJK COMPATIBILITY IDEOGRAPH-FA20 +FA22;8AF8;8AF8;8AF8;8AF8; # (諸; 諸; 諸; 諸; 諸; ) CJK COMPATIBILITY IDEOGRAPH-FA22 +FA25;9038;9038;9038;9038; # (逸; 逸; 逸; 逸; 逸; ) CJK COMPATIBILITY IDEOGRAPH-FA25 +FA26;90FD;90FD;90FD;90FD; # (都; 都; 都; 都; 都; ) CJK COMPATIBILITY IDEOGRAPH-FA26 +FA2A;98EF;98EF;98EF;98EF; # (飯; 飯; 飯; 飯; 飯; ) CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B;98FC;98FC;98FC;98FC; # (飼; 飼; 飼; 飼; 飼; ) CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C;9928;9928;9928;9928; # (館; 館; 館; 館; 館; ) CJK COMPATIBILITY IDEOGRAPH-FA2C +FA2D;9DB4;9DB4;9DB4;9DB4; # (鶴; 鶴; 鶴; 鶴; 鶴; ) CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30;4FAE;4FAE;4FAE;4FAE; # (侮; 侮; 侮; 侮; 侮; ) CJK COMPATIBILITY IDEOGRAPH-FA30 +FA31;50E7;50E7;50E7;50E7; # (僧; 僧; 僧; 僧; 僧; ) CJK COMPATIBILITY IDEOGRAPH-FA31 +FA32;514D;514D;514D;514D; # (免; 免; 免; 免; 免; ) CJK COMPATIBILITY IDEOGRAPH-FA32 +FA33;52C9;52C9;52C9;52C9; # (勉; 勉; 勉; 勉; 勉; ) CJK COMPATIBILITY IDEOGRAPH-FA33 +FA34;52E4;52E4;52E4;52E4; # (勤; 勤; 勤; 勤; 勤; ) CJK COMPATIBILITY IDEOGRAPH-FA34 +FA35;5351;5351;5351;5351; # (卑; 卑; 卑; 卑; 卑; ) CJK COMPATIBILITY IDEOGRAPH-FA35 +FA36;559D;559D;559D;559D; # (喝; 喝; 喝; 喝; 喝; ) CJK COMPATIBILITY IDEOGRAPH-FA36 +FA37;5606;5606;5606;5606; # (嘆; 嘆; 嘆; 嘆; 嘆; ) CJK COMPATIBILITY IDEOGRAPH-FA37 +FA38;5668;5668;5668;5668; # (器; 器; 器; 器; 器; ) CJK COMPATIBILITY IDEOGRAPH-FA38 +FA39;5840;5840;5840;5840; # (塀; 塀; 塀; 塀; 塀; ) CJK COMPATIBILITY IDEOGRAPH-FA39 +FA3A;58A8;58A8;58A8;58A8; # (墨; 墨; 墨; 墨; 墨; ) CJK COMPATIBILITY IDEOGRAPH-FA3A +FA3B;5C64;5C64;5C64;5C64; # (層; 層; 層; 層; 層; ) CJK COMPATIBILITY IDEOGRAPH-FA3B +FA3C;5C6E;5C6E;5C6E;5C6E; # (屮; 屮; 屮; 屮; 屮; ) CJK COMPATIBILITY IDEOGRAPH-FA3C +FA3D;6094;6094;6094;6094; # (悔; 悔; 悔; 悔; 悔; ) CJK COMPATIBILITY IDEOGRAPH-FA3D +FA3E;6168;6168;6168;6168; # (慨; 慨; 慨; 慨; 慨; ) CJK COMPATIBILITY IDEOGRAPH-FA3E +FA3F;618E;618E;618E;618E; # (憎; 憎; 憎; 憎; 憎; ) CJK COMPATIBILITY IDEOGRAPH-FA3F +FA40;61F2;61F2;61F2;61F2; # (懲; 懲; 懲; 懲; 懲; ) CJK COMPATIBILITY IDEOGRAPH-FA40 +FA41;654F;654F;654F;654F; # (敏; 敏; 敏; 敏; 敏; ) CJK COMPATIBILITY IDEOGRAPH-FA41 +FA42;65E2;65E2;65E2;65E2; # (既; 既; 既; 既; 既; ) CJK COMPATIBILITY IDEOGRAPH-FA42 +FA43;6691;6691;6691;6691; # (暑; 暑; 暑; 暑; 暑; ) CJK COMPATIBILITY IDEOGRAPH-FA43 +FA44;6885;6885;6885;6885; # (梅; 梅; 梅; 梅; 梅; ) CJK COMPATIBILITY IDEOGRAPH-FA44 +FA45;6D77;6D77;6D77;6D77; # (海; 海; 海; 海; 海; ) CJK COMPATIBILITY IDEOGRAPH-FA45 +FA46;6E1A;6E1A;6E1A;6E1A; # (渚; 渚; 渚; 渚; 渚; ) CJK COMPATIBILITY IDEOGRAPH-FA46 +FA47;6F22;6F22;6F22;6F22; # (漢; 漢; 漢; 漢; 漢; ) CJK COMPATIBILITY IDEOGRAPH-FA47 +FA48;716E;716E;716E;716E; # (煮; 煮; 煮; 煮; 煮; ) CJK COMPATIBILITY IDEOGRAPH-FA48 +FA49;722B;722B;722B;722B; # (爫; 爫; 爫; 爫; 爫; ) CJK COMPATIBILITY IDEOGRAPH-FA49 +FA4A;7422;7422;7422;7422; # (琢; 琢; 琢; 琢; 琢; ) CJK COMPATIBILITY IDEOGRAPH-FA4A +FA4B;7891;7891;7891;7891; # (碑; 碑; 碑; 碑; 碑; ) CJK COMPATIBILITY IDEOGRAPH-FA4B +FA4C;793E;793E;793E;793E; # (社; 社; 社; 社; 社; ) CJK COMPATIBILITY IDEOGRAPH-FA4C +FA4D;7949;7949;7949;7949; # (祉; 祉; 祉; 祉; 祉; ) CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4E;7948;7948;7948;7948; # (祈; 祈; 祈; 祈; 祈; ) CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4F;7950;7950;7950;7950; # (祐; 祐; 祐; 祐; 祐; ) CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50;7956;7956;7956;7956; # (祖; 祖; 祖; 祖; 祖; ) CJK COMPATIBILITY IDEOGRAPH-FA50 +FA51;795D;795D;795D;795D; # (祝; 祝; 祝; 祝; 祝; ) CJK COMPATIBILITY IDEOGRAPH-FA51 +FA52;798D;798D;798D;798D; # (禍; 禍; 禍; 禍; 禍; ) CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53;798E;798E;798E;798E; # (禎; 禎; 禎; 禎; 禎; ) CJK COMPATIBILITY IDEOGRAPH-FA53 +FA54;7A40;7A40;7A40;7A40; # (穀; 穀; 穀; 穀; 穀; ) CJK COMPATIBILITY IDEOGRAPH-FA54 +FA55;7A81;7A81;7A81;7A81; # (突; 突; 突; 突; 突; ) CJK COMPATIBILITY IDEOGRAPH-FA55 +FA56;7BC0;7BC0;7BC0;7BC0; # (節; 節; 節; 節; 節; ) CJK COMPATIBILITY IDEOGRAPH-FA56 +FA57;7DF4;7DF4;7DF4;7DF4; # (練; 練; 練; 練; 練; ) CJK COMPATIBILITY IDEOGRAPH-FA57 +FA58;7E09;7E09;7E09;7E09; # (縉; 縉; 縉; 縉; 縉; ) CJK COMPATIBILITY IDEOGRAPH-FA58 +FA59;7E41;7E41;7E41;7E41; # (繁; 繁; 繁; 繁; 繁; ) CJK COMPATIBILITY IDEOGRAPH-FA59 +FA5A;7F72;7F72;7F72;7F72; # (署; 署; 署; 署; 署; ) CJK COMPATIBILITY IDEOGRAPH-FA5A +FA5B;8005;8005;8005;8005; # (者; 者; 者; 者; 者; ) CJK COMPATIBILITY IDEOGRAPH-FA5B +FA5C;81ED;81ED;81ED;81ED; # (臭; 臭; 臭; 臭; 臭; ) CJK COMPATIBILITY IDEOGRAPH-FA5C +FA5D;8279;8279;8279;8279; # (艹; 艹; 艹; 艹; 艹; ) CJK COMPATIBILITY IDEOGRAPH-FA5D +FA5E;8279;8279;8279;8279; # (艹; 艹; 艹; 艹; 艹; ) CJK COMPATIBILITY IDEOGRAPH-FA5E +FA5F;8457;8457;8457;8457; # (著; 著; 著; 著; 著; ) CJK COMPATIBILITY IDEOGRAPH-FA5F +FA60;8910;8910;8910;8910; # (褐; 褐; 褐; 褐; 褐; ) CJK COMPATIBILITY IDEOGRAPH-FA60 +FA61;8996;8996;8996;8996; # (視; 視; 視; 視; 視; ) CJK COMPATIBILITY IDEOGRAPH-FA61 +FA62;8B01;8B01;8B01;8B01; # (謁; 謁; 謁; 謁; 謁; ) CJK COMPATIBILITY IDEOGRAPH-FA62 +FA63;8B39;8B39;8B39;8B39; # (謹; 謹; 謹; 謹; 謹; ) CJK COMPATIBILITY IDEOGRAPH-FA63 +FA64;8CD3;8CD3;8CD3;8CD3; # (賓; 賓; 賓; 賓; 賓; ) CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65;8D08;8D08;8D08;8D08; # (贈; 贈; 贈; 贈; 贈; ) CJK COMPATIBILITY IDEOGRAPH-FA65 +FA66;8FB6;8FB6;8FB6;8FB6; # (辶; 辶; 辶; 辶; 辶; ) CJK COMPATIBILITY IDEOGRAPH-FA66 +FA67;9038;9038;9038;9038; # (逸; 逸; 逸; 逸; 逸; ) CJK COMPATIBILITY IDEOGRAPH-FA67 +FA68;96E3;96E3;96E3;96E3; # (難; 難; 難; 難; 難; ) CJK COMPATIBILITY IDEOGRAPH-FA68 +FA69;97FF;97FF;97FF;97FF; # (響; 響; 響; 響; 響; ) CJK COMPATIBILITY IDEOGRAPH-FA69 +FA6A;983B;983B;983B;983B; # (頻; 頻; 頻; 頻; 頻; ) CJK COMPATIBILITY IDEOGRAPH-FA6A +FB00;FB00;FB00;0066 0066;0066 0066; # (ff; ff; ff; ff; ff; ) LATIN SMALL LIGATURE FF +FB01;FB01;FB01;0066 0069;0066 0069; # (fi; fi; fi; fi; fi; ) LATIN SMALL LIGATURE FI +FB02;FB02;FB02;0066 006C;0066 006C; # (fl; fl; fl; fl; fl; ) LATIN SMALL LIGATURE FL +FB03;FB03;FB03;0066 0066 0069;0066 0066 0069; # (ffi; ffi; ffi; ffi; ffi; ) LATIN SMALL LIGATURE FFI +FB04;FB04;FB04;0066 0066 006C;0066 0066 006C; # (ffl; ffl; ffl; ffl; ffl; ) LATIN SMALL LIGATURE FFL +FB05;FB05;FB05;0073 0074;0073 0074; # (ſt; ſt; ſt; st; st; ) LATIN SMALL LIGATURE LONG S T +FB06;FB06;FB06;0073 0074;0073 0074; # (st; st; st; st; st; ) LATIN SMALL LIGATURE ST +FB13;FB13;FB13;0574 0576;0574 0576; # (ﬓ; ﬓ; ﬓ; մն; մն; ) ARMENIAN SMALL LIGATURE MEN NOW +FB14;FB14;FB14;0574 0565;0574 0565; # (ﬔ; ﬔ; ﬔ; մե; մե; ) ARMENIAN SMALL LIGATURE MEN ECH +FB15;FB15;FB15;0574 056B;0574 056B; # (ﬕ; ﬕ; ﬕ; մի; մի; ) ARMENIAN SMALL LIGATURE MEN INI +FB16;FB16;FB16;057E 0576;057E 0576; # (ﬖ; ﬖ; ﬖ; վն; վն; ) ARMENIAN SMALL LIGATURE VEW NOW +FB17;FB17;FB17;0574 056D;0574 056D; # (ﬗ; ﬗ; ﬗ; մխ; մխ; ) ARMENIAN SMALL LIGATURE MEN XEH +FB1D;05D9 05B4;05D9 05B4;05D9 05B4;05D9 05B4; # (יִ; י◌ִ; י◌ִ; י◌ִ; י◌ִ; ) HEBREW LETTER YOD WITH HIRIQ +FB1F;05F2 05B7;05F2 05B7;05F2 05B7;05F2 05B7; # (ײַ; ײ◌ַ; ײ◌ַ; ײ◌ַ; ײ◌ַ; ) HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB20;FB20;FB20;05E2;05E2; # (ﬠ; ﬠ; ﬠ; ע; ע; ) HEBREW LETTER ALTERNATIVE AYIN +FB21;FB21;FB21;05D0;05D0; # (ﬡ; ﬡ; ﬡ; א; א; ) HEBREW LETTER WIDE ALEF +FB22;FB22;FB22;05D3;05D3; # (ﬢ; ﬢ; ﬢ; ד; ד; ) HEBREW LETTER WIDE DALET +FB23;FB23;FB23;05D4;05D4; # (ﬣ; ﬣ; ﬣ; ה; ה; ) HEBREW LETTER WIDE HE +FB24;FB24;FB24;05DB;05DB; # (ﬤ; ﬤ; ﬤ; כ; כ; ) HEBREW LETTER WIDE KAF +FB25;FB25;FB25;05DC;05DC; # (ﬥ; ﬥ; ﬥ; ל; ל; ) HEBREW LETTER WIDE LAMED +FB26;FB26;FB26;05DD;05DD; # (ﬦ; ﬦ; ﬦ; ם; ם; ) HEBREW LETTER WIDE FINAL MEM +FB27;FB27;FB27;05E8;05E8; # (ﬧ; ﬧ; ﬧ; ר; ר; ) HEBREW LETTER WIDE RESH +FB28;FB28;FB28;05EA;05EA; # (ﬨ; ﬨ; ﬨ; ת; ת; ) HEBREW LETTER WIDE TAV +FB29;FB29;FB29;002B;002B; # (﬩; ﬩; ﬩; +; +; ) HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A;05E9 05C1;05E9 05C1;05E9 05C1;05E9 05C1; # (שׁ; ש◌ׁ; ש◌ׁ; ש◌ׁ; ש◌ׁ; ) HEBREW LETTER SHIN WITH SHIN DOT +FB2B;05E9 05C2;05E9 05C2;05E9 05C2;05E9 05C2; # (שׂ; ש◌ׂ; ש◌ׂ; ש◌ׂ; ש◌ׂ; ) HEBREW LETTER SHIN WITH SIN DOT +FB2C;05E9 05BC 05C1;05E9 05BC 05C1;05E9 05BC 05C1;05E9 05BC 05C1; # (שּׁ; ש◌ּ◌ׁ; ש◌ּ◌ׁ; ש◌ּ◌ׁ; ש◌ּ◌ׁ; ) HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D;05E9 05BC 05C2;05E9 05BC 05C2;05E9 05BC 05C2;05E9 05BC 05C2; # (שּׂ; ש◌ּ◌ׂ; ש◌ּ◌ׂ; ש◌ּ◌ׂ; ש◌ּ◌ׂ; ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E;05D0 05B7;05D0 05B7;05D0 05B7;05D0 05B7; # (אַ; א◌ַ; א◌ַ; א◌ַ; א◌ַ; ) HEBREW LETTER ALEF WITH PATAH +FB2F;05D0 05B8;05D0 05B8;05D0 05B8;05D0 05B8; # (אָ; א◌ָ; א◌ָ; א◌ָ; א◌ָ; ) HEBREW LETTER ALEF WITH QAMATS +FB30;05D0 05BC;05D0 05BC;05D0 05BC;05D0 05BC; # (אּ; א◌ּ; א◌ּ; א◌ּ; א◌ּ; ) HEBREW LETTER ALEF WITH MAPIQ +FB31;05D1 05BC;05D1 05BC;05D1 05BC;05D1 05BC; # (בּ; ב◌ּ; ב◌ּ; ב◌ּ; ב◌ּ; ) HEBREW LETTER BET WITH DAGESH +FB32;05D2 05BC;05D2 05BC;05D2 05BC;05D2 05BC; # (גּ; ג◌ּ; ג◌ּ; ג◌ּ; ג◌ּ; ) HEBREW LETTER GIMEL WITH DAGESH +FB33;05D3 05BC;05D3 05BC;05D3 05BC;05D3 05BC; # (דּ; ד◌ּ; ד◌ּ; ד◌ּ; ד◌ּ; ) HEBREW LETTER DALET WITH DAGESH +FB34;05D4 05BC;05D4 05BC;05D4 05BC;05D4 05BC; # (הּ; ה◌ּ; ה◌ּ; ה◌ּ; ה◌ּ; ) HEBREW LETTER HE WITH MAPIQ +FB35;05D5 05BC;05D5 05BC;05D5 05BC;05D5 05BC; # (וּ; ו◌ּ; ו◌ּ; ו◌ּ; ו◌ּ; ) HEBREW LETTER VAV WITH DAGESH +FB36;05D6 05BC;05D6 05BC;05D6 05BC;05D6 05BC; # (זּ; ז◌ּ; ז◌ּ; ז◌ּ; ז◌ּ; ) HEBREW LETTER ZAYIN WITH DAGESH +FB38;05D8 05BC;05D8 05BC;05D8 05BC;05D8 05BC; # (טּ; ט◌ּ; ט◌ּ; ט◌ּ; ט◌ּ; ) HEBREW LETTER TET WITH DAGESH +FB39;05D9 05BC;05D9 05BC;05D9 05BC;05D9 05BC; # (יּ; י◌ּ; י◌ּ; י◌ּ; י◌ּ; ) HEBREW LETTER YOD WITH DAGESH +FB3A;05DA 05BC;05DA 05BC;05DA 05BC;05DA 05BC; # (ךּ; ך◌ּ; ך◌ּ; ך◌ּ; ך◌ּ; ) HEBREW LETTER FINAL KAF WITH DAGESH +FB3B;05DB 05BC;05DB 05BC;05DB 05BC;05DB 05BC; # (כּ; כ◌ּ; כ◌ּ; כ◌ּ; כ◌ּ; ) HEBREW LETTER KAF WITH DAGESH +FB3C;05DC 05BC;05DC 05BC;05DC 05BC;05DC 05BC; # (לּ; ל◌ּ; ל◌ּ; ל◌ּ; ל◌ּ; ) HEBREW LETTER LAMED WITH DAGESH +FB3E;05DE 05BC;05DE 05BC;05DE 05BC;05DE 05BC; # (מּ; מ◌ּ; מ◌ּ; מ◌ּ; מ◌ּ; ) HEBREW LETTER MEM WITH DAGESH +FB40;05E0 05BC;05E0 05BC;05E0 05BC;05E0 05BC; # (נּ; נ◌ּ; נ◌ּ; נ◌ּ; נ◌ּ; ) HEBREW LETTER NUN WITH DAGESH +FB41;05E1 05BC;05E1 05BC;05E1 05BC;05E1 05BC; # (סּ; ס◌ּ; ס◌ּ; ס◌ּ; ס◌ּ; ) HEBREW LETTER SAMEKH WITH DAGESH +FB43;05E3 05BC;05E3 05BC;05E3 05BC;05E3 05BC; # (ףּ; ף◌ּ; ף◌ּ; ף◌ּ; ף◌ּ; ) HEBREW LETTER FINAL PE WITH DAGESH +FB44;05E4 05BC;05E4 05BC;05E4 05BC;05E4 05BC; # (פּ; פ◌ּ; פ◌ּ; פ◌ּ; פ◌ּ; ) HEBREW LETTER PE WITH DAGESH +FB46;05E6 05BC;05E6 05BC;05E6 05BC;05E6 05BC; # (צּ; צ◌ּ; צ◌ּ; צ◌ּ; צ◌ּ; ) HEBREW LETTER TSADI WITH DAGESH +FB47;05E7 05BC;05E7 05BC;05E7 05BC;05E7 05BC; # (קּ; ק◌ּ; ק◌ּ; ק◌ּ; ק◌ּ; ) HEBREW LETTER QOF WITH DAGESH +FB48;05E8 05BC;05E8 05BC;05E8 05BC;05E8 05BC; # (רּ; ר◌ּ; ר◌ּ; ר◌ּ; ר◌ּ; ) HEBREW LETTER RESH WITH DAGESH +FB49;05E9 05BC;05E9 05BC;05E9 05BC;05E9 05BC; # (שּ; ש◌ּ; ש◌ּ; ש◌ּ; ש◌ּ; ) HEBREW LETTER SHIN WITH DAGESH +FB4A;05EA 05BC;05EA 05BC;05EA 05BC;05EA 05BC; # (תּ; ת◌ּ; ת◌ּ; ת◌ּ; ת◌ּ; ) HEBREW LETTER TAV WITH DAGESH +FB4B;05D5 05B9;05D5 05B9;05D5 05B9;05D5 05B9; # (וֹ; ו◌ֹ; ו◌ֹ; ו◌ֹ; ו◌ֹ; ) HEBREW LETTER VAV WITH HOLAM +FB4C;05D1 05BF;05D1 05BF;05D1 05BF;05D1 05BF; # (בֿ; ב◌ֿ; ב◌ֿ; ב◌ֿ; ב◌ֿ; ) HEBREW LETTER BET WITH RAFE +FB4D;05DB 05BF;05DB 05BF;05DB 05BF;05DB 05BF; # (כֿ; כ◌ֿ; כ◌ֿ; כ◌ֿ; כ◌ֿ; ) HEBREW LETTER KAF WITH RAFE +FB4E;05E4 05BF;05E4 05BF;05E4 05BF;05E4 05BF; # (פֿ; פ◌ֿ; פ◌ֿ; פ◌ֿ; פ◌ֿ; ) HEBREW LETTER PE WITH RAFE +FB4F;FB4F;FB4F;05D0 05DC;05D0 05DC; # (ﭏ; ﭏ; ﭏ; אל; אל; ) HEBREW LIGATURE ALEF LAMED +FB50;FB50;FB50;0671;0671; # (ﭐ; ﭐ; ﭐ; ٱ; ٱ; ) ARABIC LETTER ALEF WASLA ISOLATED FORM +FB51;FB51;FB51;0671;0671; # (ﭑ; ﭑ; ﭑ; ٱ; ٱ; ) ARABIC LETTER ALEF WASLA FINAL FORM +FB52;FB52;FB52;067B;067B; # (ﭒ; ﭒ; ﭒ; ٻ; ٻ; ) ARABIC LETTER BEEH ISOLATED FORM +FB53;FB53;FB53;067B;067B; # (ﭓ; ﭓ; ﭓ; ٻ; ٻ; ) ARABIC LETTER BEEH FINAL FORM +FB54;FB54;FB54;067B;067B; # (ﭔ; ﭔ; ﭔ; ٻ; ٻ; ) ARABIC LETTER BEEH INITIAL FORM +FB55;FB55;FB55;067B;067B; # (ﭕ; ﭕ; ﭕ; ٻ; ٻ; ) ARABIC LETTER BEEH MEDIAL FORM +FB56;FB56;FB56;067E;067E; # (ﭖ; ﭖ; ﭖ; پ; پ; ) ARABIC LETTER PEH ISOLATED FORM +FB57;FB57;FB57;067E;067E; # (ﭗ; ﭗ; ﭗ; پ; پ; ) ARABIC LETTER PEH FINAL FORM +FB58;FB58;FB58;067E;067E; # (ﭘ; ﭘ; ﭘ; پ; پ; ) ARABIC LETTER PEH INITIAL FORM +FB59;FB59;FB59;067E;067E; # (ﭙ; ﭙ; ﭙ; پ; پ; ) ARABIC LETTER PEH MEDIAL FORM +FB5A;FB5A;FB5A;0680;0680; # (ﭚ; ﭚ; ﭚ; ڀ; ڀ; ) ARABIC LETTER BEHEH ISOLATED FORM +FB5B;FB5B;FB5B;0680;0680; # (ﭛ; ﭛ; ﭛ; ڀ; ڀ; ) ARABIC LETTER BEHEH FINAL FORM +FB5C;FB5C;FB5C;0680;0680; # (ﭜ; ﭜ; ﭜ; ڀ; ڀ; ) ARABIC LETTER BEHEH INITIAL FORM +FB5D;FB5D;FB5D;0680;0680; # (ﭝ; ﭝ; ﭝ; ڀ; ڀ; ) ARABIC LETTER BEHEH MEDIAL FORM +FB5E;FB5E;FB5E;067A;067A; # (ﭞ; ﭞ; ﭞ; ٺ; ٺ; ) ARABIC LETTER TTEHEH ISOLATED FORM +FB5F;FB5F;FB5F;067A;067A; # (ﭟ; ﭟ; ﭟ; ٺ; ٺ; ) ARABIC LETTER TTEHEH FINAL FORM +FB60;FB60;FB60;067A;067A; # (ﭠ; ﭠ; ﭠ; ٺ; ٺ; ) ARABIC LETTER TTEHEH INITIAL FORM +FB61;FB61;FB61;067A;067A; # (ﭡ; ﭡ; ﭡ; ٺ; ٺ; ) ARABIC LETTER TTEHEH MEDIAL FORM +FB62;FB62;FB62;067F;067F; # (ﭢ; ﭢ; ﭢ; ٿ; ٿ; ) ARABIC LETTER TEHEH ISOLATED FORM +FB63;FB63;FB63;067F;067F; # (ﭣ; ﭣ; ﭣ; ٿ; ٿ; ) ARABIC LETTER TEHEH FINAL FORM +FB64;FB64;FB64;067F;067F; # (ﭤ; ﭤ; ﭤ; ٿ; ٿ; ) ARABIC LETTER TEHEH INITIAL FORM +FB65;FB65;FB65;067F;067F; # (ﭥ; ﭥ; ﭥ; ٿ; ٿ; ) ARABIC LETTER TEHEH MEDIAL FORM +FB66;FB66;FB66;0679;0679; # (ﭦ; ﭦ; ﭦ; ٹ; ٹ; ) ARABIC LETTER TTEH ISOLATED FORM +FB67;FB67;FB67;0679;0679; # (ﭧ; ﭧ; ﭧ; ٹ; ٹ; ) ARABIC LETTER TTEH FINAL FORM +FB68;FB68;FB68;0679;0679; # (ﭨ; ﭨ; ﭨ; ٹ; ٹ; ) ARABIC LETTER TTEH INITIAL FORM +FB69;FB69;FB69;0679;0679; # (ﭩ; ﭩ; ﭩ; ٹ; ٹ; ) ARABIC LETTER TTEH MEDIAL FORM +FB6A;FB6A;FB6A;06A4;06A4; # (ﭪ; ﭪ; ﭪ; ڤ; ڤ; ) ARABIC LETTER VEH ISOLATED FORM +FB6B;FB6B;FB6B;06A4;06A4; # (ﭫ; ﭫ; ﭫ; ڤ; ڤ; ) ARABIC LETTER VEH FINAL FORM +FB6C;FB6C;FB6C;06A4;06A4; # (ﭬ; ﭬ; ﭬ; ڤ; ڤ; ) ARABIC LETTER VEH INITIAL FORM +FB6D;FB6D;FB6D;06A4;06A4; # (ﭭ; ﭭ; ﭭ; ڤ; ڤ; ) ARABIC LETTER VEH MEDIAL FORM +FB6E;FB6E;FB6E;06A6;06A6; # (ﭮ; ﭮ; ﭮ; ڦ; ڦ; ) ARABIC LETTER PEHEH ISOLATED FORM +FB6F;FB6F;FB6F;06A6;06A6; # (ﭯ; ﭯ; ﭯ; ڦ; ڦ; ) ARABIC LETTER PEHEH FINAL FORM +FB70;FB70;FB70;06A6;06A6; # (ﭰ; ﭰ; ﭰ; ڦ; ڦ; ) ARABIC LETTER PEHEH INITIAL FORM +FB71;FB71;FB71;06A6;06A6; # (ﭱ; ﭱ; ﭱ; ڦ; ڦ; ) ARABIC LETTER PEHEH MEDIAL FORM +FB72;FB72;FB72;0684;0684; # (ﭲ; ﭲ; ﭲ; ڄ; ڄ; ) ARABIC LETTER DYEH ISOLATED FORM +FB73;FB73;FB73;0684;0684; # (ﭳ; ﭳ; ﭳ; ڄ; ڄ; ) ARABIC LETTER DYEH FINAL FORM +FB74;FB74;FB74;0684;0684; # (ﭴ; ﭴ; ﭴ; ڄ; ڄ; ) ARABIC LETTER DYEH INITIAL FORM +FB75;FB75;FB75;0684;0684; # (ﭵ; ﭵ; ﭵ; ڄ; ڄ; ) ARABIC LETTER DYEH MEDIAL FORM +FB76;FB76;FB76;0683;0683; # (ﭶ; ﭶ; ﭶ; ڃ; ڃ; ) ARABIC LETTER NYEH ISOLATED FORM +FB77;FB77;FB77;0683;0683; # (ﭷ; ﭷ; ﭷ; ڃ; ڃ; ) ARABIC LETTER NYEH FINAL FORM +FB78;FB78;FB78;0683;0683; # (ﭸ; ﭸ; ﭸ; ڃ; ڃ; ) ARABIC LETTER NYEH INITIAL FORM +FB79;FB79;FB79;0683;0683; # (ﭹ; ﭹ; ﭹ; ڃ; ڃ; ) ARABIC LETTER NYEH MEDIAL FORM +FB7A;FB7A;FB7A;0686;0686; # (ﭺ; ﭺ; ﭺ; چ; چ; ) ARABIC LETTER TCHEH ISOLATED FORM +FB7B;FB7B;FB7B;0686;0686; # (ﭻ; ﭻ; ﭻ; چ; چ; ) ARABIC LETTER TCHEH FINAL FORM +FB7C;FB7C;FB7C;0686;0686; # (ﭼ; ﭼ; ﭼ; چ; چ; ) ARABIC LETTER TCHEH INITIAL FORM +FB7D;FB7D;FB7D;0686;0686; # (ﭽ; ﭽ; ﭽ; چ; چ; ) ARABIC LETTER TCHEH MEDIAL FORM +FB7E;FB7E;FB7E;0687;0687; # (ﭾ; ﭾ; ﭾ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH ISOLATED FORM +FB7F;FB7F;FB7F;0687;0687; # (ﭿ; ﭿ; ﭿ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH FINAL FORM +FB80;FB80;FB80;0687;0687; # (ﮀ; ﮀ; ﮀ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH INITIAL FORM +FB81;FB81;FB81;0687;0687; # (ﮁ; ﮁ; ﮁ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH MEDIAL FORM +FB82;FB82;FB82;068D;068D; # (ﮂ; ﮂ; ﮂ; ڍ; ڍ; ) ARABIC LETTER DDAHAL ISOLATED FORM +FB83;FB83;FB83;068D;068D; # (ﮃ; ﮃ; ﮃ; ڍ; ڍ; ) ARABIC LETTER DDAHAL FINAL FORM +FB84;FB84;FB84;068C;068C; # (ﮄ; ﮄ; ﮄ; ڌ; ڌ; ) ARABIC LETTER DAHAL ISOLATED FORM +FB85;FB85;FB85;068C;068C; # (ﮅ; ﮅ; ﮅ; ڌ; ڌ; ) ARABIC LETTER DAHAL FINAL FORM +FB86;FB86;FB86;068E;068E; # (ﮆ; ﮆ; ﮆ; ڎ; ڎ; ) ARABIC LETTER DUL ISOLATED FORM +FB87;FB87;FB87;068E;068E; # (ﮇ; ﮇ; ﮇ; ڎ; ڎ; ) ARABIC LETTER DUL FINAL FORM +FB88;FB88;FB88;0688;0688; # (ﮈ; ﮈ; ﮈ; ڈ; ڈ; ) ARABIC LETTER DDAL ISOLATED FORM +FB89;FB89;FB89;0688;0688; # (ﮉ; ﮉ; ﮉ; ڈ; ڈ; ) ARABIC LETTER DDAL FINAL FORM +FB8A;FB8A;FB8A;0698;0698; # (ﮊ; ﮊ; ﮊ; ژ; ژ; ) ARABIC LETTER JEH ISOLATED FORM +FB8B;FB8B;FB8B;0698;0698; # (ﮋ; ﮋ; ﮋ; ژ; ژ; ) ARABIC LETTER JEH FINAL FORM +FB8C;FB8C;FB8C;0691;0691; # (ﮌ; ﮌ; ﮌ; ڑ; ڑ; ) ARABIC LETTER RREH ISOLATED FORM +FB8D;FB8D;FB8D;0691;0691; # (ﮍ; ﮍ; ﮍ; ڑ; ڑ; ) ARABIC LETTER RREH FINAL FORM +FB8E;FB8E;FB8E;06A9;06A9; # (ﮎ; ﮎ; ﮎ; ک; ک; ) ARABIC LETTER KEHEH ISOLATED FORM +FB8F;FB8F;FB8F;06A9;06A9; # (ﮏ; ﮏ; ﮏ; ک; ک; ) ARABIC LETTER KEHEH FINAL FORM +FB90;FB90;FB90;06A9;06A9; # (ﮐ; ﮐ; ﮐ; ک; ک; ) ARABIC LETTER KEHEH INITIAL FORM +FB91;FB91;FB91;06A9;06A9; # (ﮑ; ﮑ; ﮑ; ک; ک; ) ARABIC LETTER KEHEH MEDIAL FORM +FB92;FB92;FB92;06AF;06AF; # (ﮒ; ﮒ; ﮒ; گ; گ; ) ARABIC LETTER GAF ISOLATED FORM +FB93;FB93;FB93;06AF;06AF; # (ﮓ; ﮓ; ﮓ; گ; گ; ) ARABIC LETTER GAF FINAL FORM +FB94;FB94;FB94;06AF;06AF; # (ﮔ; ﮔ; ﮔ; گ; گ; ) ARABIC LETTER GAF INITIAL FORM +FB95;FB95;FB95;06AF;06AF; # (ﮕ; ﮕ; ﮕ; گ; گ; ) ARABIC LETTER GAF MEDIAL FORM +FB96;FB96;FB96;06B3;06B3; # (ﮖ; ﮖ; ﮖ; ڳ; ڳ; ) ARABIC LETTER GUEH ISOLATED FORM +FB97;FB97;FB97;06B3;06B3; # (ﮗ; ﮗ; ﮗ; ڳ; ڳ; ) ARABIC LETTER GUEH FINAL FORM +FB98;FB98;FB98;06B3;06B3; # (ﮘ; ﮘ; ﮘ; ڳ; ڳ; ) ARABIC LETTER GUEH INITIAL FORM +FB99;FB99;FB99;06B3;06B3; # (ﮙ; ﮙ; ﮙ; ڳ; ڳ; ) ARABIC LETTER GUEH MEDIAL FORM +FB9A;FB9A;FB9A;06B1;06B1; # (ﮚ; ﮚ; ﮚ; ڱ; ڱ; ) ARABIC LETTER NGOEH ISOLATED FORM +FB9B;FB9B;FB9B;06B1;06B1; # (ﮛ; ﮛ; ﮛ; ڱ; ڱ; ) ARABIC LETTER NGOEH FINAL FORM +FB9C;FB9C;FB9C;06B1;06B1; # (ﮜ; ﮜ; ﮜ; ڱ; ڱ; ) ARABIC LETTER NGOEH INITIAL FORM +FB9D;FB9D;FB9D;06B1;06B1; # (ﮝ; ﮝ; ﮝ; ڱ; ڱ; ) ARABIC LETTER NGOEH MEDIAL FORM +FB9E;FB9E;FB9E;06BA;06BA; # (ﮞ; ﮞ; ﮞ; ں; ں; ) ARABIC LETTER NOON GHUNNA ISOLATED FORM +FB9F;FB9F;FB9F;06BA;06BA; # (ﮟ; ﮟ; ﮟ; ں; ں; ) ARABIC LETTER NOON GHUNNA FINAL FORM +FBA0;FBA0;FBA0;06BB;06BB; # (ﮠ; ﮠ; ﮠ; ڻ; ڻ; ) ARABIC LETTER RNOON ISOLATED FORM +FBA1;FBA1;FBA1;06BB;06BB; # (ﮡ; ﮡ; ﮡ; ڻ; ڻ; ) ARABIC LETTER RNOON FINAL FORM +FBA2;FBA2;FBA2;06BB;06BB; # (ﮢ; ﮢ; ﮢ; ڻ; ڻ; ) ARABIC LETTER RNOON INITIAL FORM +FBA3;FBA3;FBA3;06BB;06BB; # (ﮣ; ﮣ; ﮣ; ڻ; ڻ; ) ARABIC LETTER RNOON MEDIAL FORM +FBA4;FBA4;FBA4;06C0;06D5 0654; # (ﮤ; ﮤ; ﮤ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +FBA5;FBA5;FBA5;06C0;06D5 0654; # (ﮥ; ﮥ; ﮥ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA6;FBA6;FBA6;06C1;06C1; # (ﮦ; ﮦ; ﮦ; ہ; ہ; ) ARABIC LETTER HEH GOAL ISOLATED FORM +FBA7;FBA7;FBA7;06C1;06C1; # (ﮧ; ﮧ; ﮧ; ہ; ہ; ) ARABIC LETTER HEH GOAL FINAL FORM +FBA8;FBA8;FBA8;06C1;06C1; # (ﮨ; ﮨ; ﮨ; ہ; ہ; ) ARABIC LETTER HEH GOAL INITIAL FORM +FBA9;FBA9;FBA9;06C1;06C1; # (ﮩ; ﮩ; ﮩ; ہ; ہ; ) ARABIC LETTER HEH GOAL MEDIAL FORM +FBAA;FBAA;FBAA;06BE;06BE; # (ﮪ; ﮪ; ﮪ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +FBAB;FBAB;FBAB;06BE;06BE; # (ﮫ; ﮫ; ﮫ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAC;FBAC;FBAC;06BE;06BE; # (ﮬ; ﮬ; ﮬ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD;FBAD;FBAD;06BE;06BE; # (ﮭ; ﮭ; ﮭ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAE;FBAE;FBAE;06D2;06D2; # (ﮮ; ﮮ; ﮮ; ے; ے; ) ARABIC LETTER YEH BARREE ISOLATED FORM +FBAF;FBAF;FBAF;06D2;06D2; # (ﮯ; ﮯ; ﮯ; ے; ے; ) ARABIC LETTER YEH BARREE FINAL FORM +FBB0;FBB0;FBB0;06D3;06D2 0654; # (ﮰ; ﮰ; ﮰ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +FBB1;FBB1;FBB1;06D3;06D2 0654; # (ﮱ; ﮱ; ﮱ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3;FBD3;FBD3;06AD;06AD; # (ﯓ; ﯓ; ﯓ; ڭ; ڭ; ) ARABIC LETTER NG ISOLATED FORM +FBD4;FBD4;FBD4;06AD;06AD; # (ﯔ; ﯔ; ﯔ; ڭ; ڭ; ) ARABIC LETTER NG FINAL FORM +FBD5;FBD5;FBD5;06AD;06AD; # (ﯕ; ﯕ; ﯕ; ڭ; ڭ; ) ARABIC LETTER NG INITIAL FORM +FBD6;FBD6;FBD6;06AD;06AD; # (ﯖ; ﯖ; ﯖ; ڭ; ڭ; ) ARABIC LETTER NG MEDIAL FORM +FBD7;FBD7;FBD7;06C7;06C7; # (ﯗ; ﯗ; ﯗ; ۇ; ۇ; ) ARABIC LETTER U ISOLATED FORM +FBD8;FBD8;FBD8;06C7;06C7; # (ﯘ; ﯘ; ﯘ; ۇ; ۇ; ) ARABIC LETTER U FINAL FORM +FBD9;FBD9;FBD9;06C6;06C6; # (ﯙ; ﯙ; ﯙ; ۆ; ۆ; ) ARABIC LETTER OE ISOLATED FORM +FBDA;FBDA;FBDA;06C6;06C6; # (ﯚ; ﯚ; ﯚ; ۆ; ۆ; ) ARABIC LETTER OE FINAL FORM +FBDB;FBDB;FBDB;06C8;06C8; # (ﯛ; ﯛ; ﯛ; ۈ; ۈ; ) ARABIC LETTER YU ISOLATED FORM +FBDC;FBDC;FBDC;06C8;06C8; # (ﯜ; ﯜ; ﯜ; ۈ; ۈ; ) ARABIC LETTER YU FINAL FORM +FBDD;FBDD;FBDD;06C7 0674;06C7 0674; # (ﯝ; ﯝ; ﯝ; ۇٴ; ۇٴ; ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +FBDE;FBDE;FBDE;06CB;06CB; # (ﯞ; ﯞ; ﯞ; ۋ; ۋ; ) ARABIC LETTER VE ISOLATED FORM +FBDF;FBDF;FBDF;06CB;06CB; # (ﯟ; ﯟ; ﯟ; ۋ; ۋ; ) ARABIC LETTER VE FINAL FORM +FBE0;FBE0;FBE0;06C5;06C5; # (ﯠ; ﯠ; ﯠ; ۅ; ۅ; ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM +FBE1;FBE1;FBE1;06C5;06C5; # (ﯡ; ﯡ; ﯡ; ۅ; ۅ; ) ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE2;FBE2;FBE2;06C9;06C9; # (ﯢ; ﯢ; ﯢ; ۉ; ۉ; ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM +FBE3;FBE3;FBE3;06C9;06C9; # (ﯣ; ﯣ; ﯣ; ۉ; ۉ; ) ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE4;FBE4;FBE4;06D0;06D0; # (ﯤ; ﯤ; ﯤ; ې; ې; ) ARABIC LETTER E ISOLATED FORM +FBE5;FBE5;FBE5;06D0;06D0; # (ﯥ; ﯥ; ﯥ; ې; ې; ) ARABIC LETTER E FINAL FORM +FBE6;FBE6;FBE6;06D0;06D0; # (ﯦ; ﯦ; ﯦ; ې; ې; ) ARABIC LETTER E INITIAL FORM +FBE7;FBE7;FBE7;06D0;06D0; # (ﯧ; ﯧ; ﯧ; ې; ې; ) ARABIC LETTER E MEDIAL FORM +FBE8;FBE8;FBE8;0649;0649; # (ﯨ; ﯨ; ﯨ; ى; ى; ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9;FBE9;FBE9;0649;0649; # (ﯩ; ﯩ; ﯩ; ى; ى; ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBEA;FBEA;FBEA;0626 0627;064A 0654 0627; # (ﯪ; ﯪ; ﯪ; ئا; ي◌ٔا; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FBEB;FBEB;FBEB;0626 0627;064A 0654 0627; # (ﯫ; ﯫ; ﯫ; ئا; ي◌ٔا; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEC;FBEC;FBEC;0626 06D5;064A 0654 06D5; # (ﯬ; ﯬ; ﯬ; ئە; ي◌ٔە; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBED;FBED;FBED;0626 06D5;064A 0654 06D5; # (ﯭ; ﯭ; ﯭ; ئە; ي◌ٔە; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEE;FBEE;FBEE;0626 0648;064A 0654 0648; # (ﯮ; ﯮ; ﯮ; ئو; ي◌ٔو; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBEF;FBEF;FBEF;0626 0648;064A 0654 0648; # (ﯯ; ﯯ; ﯯ; ئو; ي◌ٔو; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF0;FBF0;FBF0;0626 06C7;064A 0654 06C7; # (ﯰ; ﯰ; ﯰ; ئۇ; ي◌ٔۇ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF1;FBF1;FBF1;0626 06C7;064A 0654 06C7; # (ﯱ; ﯱ; ﯱ; ئۇ; ي◌ٔۇ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF2;FBF2;FBF2;0626 06C6;064A 0654 06C6; # (ﯲ; ﯲ; ﯲ; ئۆ; ي◌ٔۆ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF3;FBF3;FBF3;0626 06C6;064A 0654 06C6; # (ﯳ; ﯳ; ﯳ; ئۆ; ي◌ٔۆ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF4;FBF4;FBF4;0626 06C8;064A 0654 06C8; # (ﯴ; ﯴ; ﯴ; ئۈ; ي◌ٔۈ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBF5;FBF5;FBF5;0626 06C8;064A 0654 06C8; # (ﯵ; ﯵ; ﯵ; ئۈ; ي◌ٔۈ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF6;FBF6;FBF6;0626 06D0;064A 0654 06D0; # (ﯶ; ﯶ; ﯶ; ئې; ي◌ٔې; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +FBF7;FBF7;FBF7;0626 06D0;064A 0654 06D0; # (ﯷ; ﯷ; ﯷ; ئې; ي◌ٔې; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF8;FBF8;FBF8;0626 06D0;064A 0654 06D0; # (ﯸ; ﯸ; ﯸ; ئې; ي◌ٔې; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF9;FBF9;FBF9;0626 0649;064A 0654 0649; # (ﯹ; ﯹ; ﯹ; ئى; ي◌ٔى; ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FBFA;FBFA;FBFA;0626 0649;064A 0654 0649; # (ﯺ; ﯺ; ﯺ; ئى; ي◌ٔى; ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBFB;FBFB;FBFB;0626 0649;064A 0654 0649; # (ﯻ; ﯻ; ﯻ; ئى; ي◌ٔى; ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFC;FBFC;FBFC;06CC;06CC; # (ﯼ; ﯼ; ﯼ; ی; ی; ) ARABIC LETTER FARSI YEH ISOLATED FORM +FBFD;FBFD;FBFD;06CC;06CC; # (ﯽ; ﯽ; ﯽ; ی; ی; ) ARABIC LETTER FARSI YEH FINAL FORM +FBFE;FBFE;FBFE;06CC;06CC; # (ﯾ; ﯾ; ﯾ; ی; ی; ) ARABIC LETTER FARSI YEH INITIAL FORM +FBFF;FBFF;FBFF;06CC;06CC; # (ﯿ; ﯿ; ﯿ; ی; ی; ) ARABIC LETTER FARSI YEH MEDIAL FORM +FC00;FC00;FC00;0626 062C;064A 0654 062C; # (ﰀ; ﰀ; ﰀ; ئج; ي◌ٔج; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC01;FC01;FC01;0626 062D;064A 0654 062D; # (ﰁ; ﰁ; ﰁ; ئح; ي◌ٔح; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC02;FC02;FC02;0626 0645;064A 0654 0645; # (ﰂ; ﰂ; ﰂ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC03;FC03;FC03;0626 0649;064A 0654 0649; # (ﰃ; ﰃ; ﰃ; ئى; ي◌ٔى; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC04;FC04;FC04;0626 064A;064A 0654 064A; # (ﰄ; ﰄ; ﰄ; ئي; ي◌ٔي; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FC05;FC05;FC05;0628 062C;0628 062C; # (ﰅ; ﰅ; ﰅ; بج; بج; ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC06;FC06;FC06;0628 062D;0628 062D; # (ﰆ; ﰆ; ﰆ; بح; بح; ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FC07;FC07;FC07;0628 062E;0628 062E; # (ﰇ; ﰇ; ﰇ; بخ; بخ; ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FC08;FC08;FC08;0628 0645;0628 0645; # (ﰈ; ﰈ; ﰈ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC09;FC09;FC09;0628 0649;0628 0649; # (ﰉ; ﰉ; ﰉ; بى; بى; ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC0A;FC0A;FC0A;0628 064A;0628 064A; # (ﰊ; ﰊ; ﰊ; بي; بي; ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +FC0B;FC0B;FC0B;062A 062C;062A 062C; # (ﰋ; ﰋ; ﰋ; تج; تج; ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FC0C;FC0C;FC0C;062A 062D;062A 062D; # (ﰌ; ﰌ; ﰌ; تح; تح; ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FC0D;FC0D;FC0D;062A 062E;062A 062E; # (ﰍ; ﰍ; ﰍ; تخ; تخ; ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FC0E;FC0E;FC0E;062A 0645;062A 0645; # (ﰎ; ﰎ; ﰎ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FC0F;FC0F;FC0F;062A 0649;062A 0649; # (ﰏ; ﰏ; ﰏ; تى; تى; ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC10;FC10;FC10;062A 064A;062A 064A; # (ﰐ; ﰐ; ﰐ; تي; تي; ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +FC11;FC11;FC11;062B 062C;062B 062C; # (ﰑ; ﰑ; ﰑ; ثج; ثج; ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC12;FC12;FC12;062B 0645;062B 0645; # (ﰒ; ﰒ; ﰒ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC13;FC13;FC13;062B 0649;062B 0649; # (ﰓ; ﰓ; ﰓ; ثى; ثى; ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC14;FC14;FC14;062B 064A;062B 064A; # (ﰔ; ﰔ; ﰔ; ثي; ثي; ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +FC15;FC15;FC15;062C 062D;062C 062D; # (ﰕ; ﰕ; ﰕ; جح; جح; ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FC16;FC16;FC16;062C 0645;062C 0645; # (ﰖ; ﰖ; ﰖ; جم; جم; ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FC17;FC17;FC17;062D 062C;062D 062C; # (ﰗ; ﰗ; ﰗ; حج; حج; ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FC18;FC18;FC18;062D 0645;062D 0645; # (ﰘ; ﰘ; ﰘ; حم; حم; ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FC19;FC19;FC19;062E 062C;062E 062C; # (ﰙ; ﰙ; ﰙ; خج; خج; ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A;FC1A;FC1A;062E 062D;062E 062D; # (ﰚ; ﰚ; ﰚ; خح; خح; ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FC1B;FC1B;FC1B;062E 0645;062E 0645; # (ﰛ; ﰛ; ﰛ; خم; خم; ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FC1C;FC1C;FC1C;0633 062C;0633 062C; # (ﰜ; ﰜ; ﰜ; سج; سج; ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FC1D;FC1D;FC1D;0633 062D;0633 062D; # (ﰝ; ﰝ; ﰝ; سح; سح; ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FC1E;FC1E;FC1E;0633 062E;0633 062E; # (ﰞ; ﰞ; ﰞ; سخ; سخ; ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FC1F;FC1F;FC1F;0633 0645;0633 0645; # (ﰟ; ﰟ; ﰟ; سم; سم; ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FC20;FC20;FC20;0635 062D;0635 062D; # (ﰠ; ﰠ; ﰠ; صح; صح; ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FC21;FC21;FC21;0635 0645;0635 0645; # (ﰡ; ﰡ; ﰡ; صم; صم; ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FC22;FC22;FC22;0636 062C;0636 062C; # (ﰢ; ﰢ; ﰢ; ضج; ضج; ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FC23;FC23;FC23;0636 062D;0636 062D; # (ﰣ; ﰣ; ﰣ; ضح; ضح; ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FC24;FC24;FC24;0636 062E;0636 062E; # (ﰤ; ﰤ; ﰤ; ضخ; ضخ; ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FC25;FC25;FC25;0636 0645;0636 0645; # (ﰥ; ﰥ; ﰥ; ضم; ضم; ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FC26;FC26;FC26;0637 062D;0637 062D; # (ﰦ; ﰦ; ﰦ; طح; طح; ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FC27;FC27;FC27;0637 0645;0637 0645; # (ﰧ; ﰧ; ﰧ; طم; طم; ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FC28;FC28;FC28;0638 0645;0638 0645; # (ﰨ; ﰨ; ﰨ; ظم; ظم; ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +FC29;FC29;FC29;0639 062C;0639 062C; # (ﰩ; ﰩ; ﰩ; عج; عج; ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FC2A;FC2A;FC2A;0639 0645;0639 0645; # (ﰪ; ﰪ; ﰪ; عم; عم; ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FC2B;FC2B;FC2B;063A 062C;063A 062C; # (ﰫ; ﰫ; ﰫ; غج; غج; ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FC2C;FC2C;FC2C;063A 0645;063A 0645; # (ﰬ; ﰬ; ﰬ; غم; غم; ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FC2D;FC2D;FC2D;0641 062C;0641 062C; # (ﰭ; ﰭ; ﰭ; فج; فج; ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FC2E;FC2E;FC2E;0641 062D;0641 062D; # (ﰮ; ﰮ; ﰮ; فح; فح; ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FC2F;FC2F;FC2F;0641 062E;0641 062E; # (ﰯ; ﰯ; ﰯ; فخ; فخ; ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FC30;FC30;FC30;0641 0645;0641 0645; # (ﰰ; ﰰ; ﰰ; فم; فم; ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FC31;FC31;FC31;0641 0649;0641 0649; # (ﰱ; ﰱ; ﰱ; فى; فى; ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC32;FC32;FC32;0641 064A;0641 064A; # (ﰲ; ﰲ; ﰲ; في; في; ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +FC33;FC33;FC33;0642 062D;0642 062D; # (ﰳ; ﰳ; ﰳ; قح; قح; ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FC34;FC34;FC34;0642 0645;0642 0645; # (ﰴ; ﰴ; ﰴ; قم; قم; ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FC35;FC35;FC35;0642 0649;0642 0649; # (ﰵ; ﰵ; ﰵ; قى; قى; ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC36;FC36;FC36;0642 064A;0642 064A; # (ﰶ; ﰶ; ﰶ; قي; قي; ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +FC37;FC37;FC37;0643 0627;0643 0627; # (ﰷ; ﰷ; ﰷ; كا; كا; ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FC38;FC38;FC38;0643 062C;0643 062C; # (ﰸ; ﰸ; ﰸ; كج; كج; ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FC39;FC39;FC39;0643 062D;0643 062D; # (ﰹ; ﰹ; ﰹ; كح; كح; ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FC3A;FC3A;FC3A;0643 062E;0643 062E; # (ﰺ; ﰺ; ﰺ; كخ; كخ; ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FC3B;FC3B;FC3B;0643 0644;0643 0644; # (ﰻ; ﰻ; ﰻ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FC3C;FC3C;FC3C;0643 0645;0643 0645; # (ﰼ; ﰼ; ﰼ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FC3D;FC3D;FC3D;0643 0649;0643 0649; # (ﰽ; ﰽ; ﰽ; كى; كى; ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC3E;FC3E;FC3E;0643 064A;0643 064A; # (ﰾ; ﰾ; ﰾ; كي; كي; ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +FC3F;FC3F;FC3F;0644 062C;0644 062C; # (ﰿ; ﰿ; ﰿ; لج; لج; ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FC40;FC40;FC40;0644 062D;0644 062D; # (ﱀ; ﱀ; ﱀ; لح; لح; ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FC41;FC41;FC41;0644 062E;0644 062E; # (ﱁ; ﱁ; ﱁ; لخ; لخ; ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FC42;FC42;FC42;0644 0645;0644 0645; # (ﱂ; ﱂ; ﱂ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FC43;FC43;FC43;0644 0649;0644 0649; # (ﱃ; ﱃ; ﱃ; لى; لى; ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC44;FC44;FC44;0644 064A;0644 064A; # (ﱄ; ﱄ; ﱄ; لي; لي; ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +FC45;FC45;FC45;0645 062C;0645 062C; # (ﱅ; ﱅ; ﱅ; مج; مج; ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FC46;FC46;FC46;0645 062D;0645 062D; # (ﱆ; ﱆ; ﱆ; مح; مح; ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FC47;FC47;FC47;0645 062E;0645 062E; # (ﱇ; ﱇ; ﱇ; مخ; مخ; ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FC48;FC48;FC48;0645 0645;0645 0645; # (ﱈ; ﱈ; ﱈ; مم; مم; ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FC49;FC49;FC49;0645 0649;0645 0649; # (ﱉ; ﱉ; ﱉ; مى; مى; ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A;FC4A;FC4A;0645 064A;0645 064A; # (ﱊ; ﱊ; ﱊ; مي; مي; ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +FC4B;FC4B;FC4B;0646 062C;0646 062C; # (ﱋ; ﱋ; ﱋ; نج; نج; ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FC4C;FC4C;FC4C;0646 062D;0646 062D; # (ﱌ; ﱌ; ﱌ; نح; نح; ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FC4D;FC4D;FC4D;0646 062E;0646 062E; # (ﱍ; ﱍ; ﱍ; نخ; نخ; ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC4E;FC4E;FC4E;0646 0645;0646 0645; # (ﱎ; ﱎ; ﱎ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FC4F;FC4F;FC4F;0646 0649;0646 0649; # (ﱏ; ﱏ; ﱏ; نى; نى; ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC50;FC50;FC50;0646 064A;0646 064A; # (ﱐ; ﱐ; ﱐ; ني; ني; ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +FC51;FC51;FC51;0647 062C;0647 062C; # (ﱑ; ﱑ; ﱑ; هج; هج; ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FC52;FC52;FC52;0647 0645;0647 0645; # (ﱒ; ﱒ; ﱒ; هم; هم; ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FC53;FC53;FC53;0647 0649;0647 0649; # (ﱓ; ﱓ; ﱓ; هى; هى; ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54;FC54;FC54;0647 064A;0647 064A; # (ﱔ; ﱔ; ﱔ; هي; هي; ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +FC55;FC55;FC55;064A 062C;064A 062C; # (ﱕ; ﱕ; ﱕ; يج; يج; ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FC56;FC56;FC56;064A 062D;064A 062D; # (ﱖ; ﱖ; ﱖ; يح; يح; ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FC57;FC57;FC57;064A 062E;064A 062E; # (ﱗ; ﱗ; ﱗ; يخ; يخ; ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC58;FC58;FC58;064A 0645;064A 0645; # (ﱘ; ﱘ; ﱘ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FC59;FC59;FC59;064A 0649;064A 0649; # (ﱙ; ﱙ; ﱙ; يى; يى; ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC5A;FC5A;FC5A;064A 064A;064A 064A; # (ﱚ; ﱚ; ﱚ; يي; يي; ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +FC5B;FC5B;FC5B;0630 0670;0630 0670; # (ﱛ; ﱛ; ﱛ; ذ◌ٰ; ذ◌ٰ; ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5C;FC5C;FC5C;0631 0670;0631 0670; # (ﱜ; ﱜ; ﱜ; ر◌ٰ; ر◌ٰ; ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5D;FC5D;FC5D;0649 0670;0649 0670; # (ﱝ; ﱝ; ﱝ; ى◌ٰ; ى◌ٰ; ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5E;FC5E;FC5E;0020 064C 0651;0020 064C 0651; # (ﱞ; ﱞ; ﱞ; ◌ٌ◌ّ; ◌ٌ◌ّ; ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +FC5F;FC5F;FC5F;0020 064D 0651;0020 064D 0651; # (ﱟ; ﱟ; ﱟ; ◌ٍ◌ّ; ◌ٍ◌ّ; ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +FC60;FC60;FC60;0020 064E 0651;0020 064E 0651; # (ﱠ; ﱠ; ﱠ; ◌َ◌ّ; ◌َ◌ّ; ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +FC61;FC61;FC61;0020 064F 0651;0020 064F 0651; # (ﱡ; ﱡ; ﱡ; ◌ُ◌ّ; ◌ُ◌ّ; ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +FC62;FC62;FC62;0020 0650 0651;0020 0650 0651; # (ﱢ; ﱢ; ﱢ; ◌ِ◌ّ; ◌ِ◌ّ; ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +FC63;FC63;FC63;0020 0651 0670;0020 0651 0670; # (ﱣ; ﱣ; ﱣ; ◌ّ◌ٰ; ◌ّ◌ٰ; ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64;FC64;FC64;0626 0631;064A 0654 0631; # (ﱤ; ﱤ; ﱤ; ئر; ي◌ٔر; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65;FC65;FC65;0626 0632;064A 0654 0632; # (ﱥ; ﱥ; ﱥ; ئز; ي◌ٔز; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC66;FC66;FC66;0626 0645;064A 0654 0645; # (ﱦ; ﱦ; ﱦ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC67;FC67;FC67;0626 0646;064A 0654 0646; # (ﱧ; ﱧ; ﱧ; ئن; ي◌ٔن; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC68;FC68;FC68;0626 0649;064A 0654 0649; # (ﱨ; ﱨ; ﱨ; ئى; ي◌ٔى; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC69;FC69;FC69;0626 064A;064A 0654 064A; # (ﱩ; ﱩ; ﱩ; ئي; ي◌ٔي; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC6A;FC6A;FC6A;0628 0631;0628 0631; # (ﱪ; ﱪ; ﱪ; بر; بر; ) ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B;FC6B;FC6B;0628 0632;0628 0632; # (ﱫ; ﱫ; ﱫ; بز; بز; ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC6C;FC6C;FC6C;0628 0645;0628 0645; # (ﱬ; ﱬ; ﱬ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC6D;FC6D;FC6D;0628 0646;0628 0646; # (ﱭ; ﱭ; ﱭ; بن; بن; ) ARABIC LIGATURE BEH WITH NOON FINAL FORM +FC6E;FC6E;FC6E;0628 0649;0628 0649; # (ﱮ; ﱮ; ﱮ; بى; بى; ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC6F;FC6F;FC6F;0628 064A;0628 064A; # (ﱯ; ﱯ; ﱯ; بي; بي; ) ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC70;FC70;FC70;062A 0631;062A 0631; # (ﱰ; ﱰ; ﱰ; تر; تر; ) ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71;FC71;FC71;062A 0632;062A 0632; # (ﱱ; ﱱ; ﱱ; تز; تز; ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FC72;FC72;FC72;062A 0645;062A 0645; # (ﱲ; ﱲ; ﱲ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC73;FC73;FC73;062A 0646;062A 0646; # (ﱳ; ﱳ; ﱳ; تن; تن; ) ARABIC LIGATURE TEH WITH NOON FINAL FORM +FC74;FC74;FC74;062A 0649;062A 0649; # (ﱴ; ﱴ; ﱴ; تى; تى; ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC75;FC75;FC75;062A 064A;062A 064A; # (ﱵ; ﱵ; ﱵ; تي; تي; ) ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC76;FC76;FC76;062B 0631;062B 0631; # (ﱶ; ﱶ; ﱶ; ثر; ثر; ) ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77;FC77;FC77;062B 0632;062B 0632; # (ﱷ; ﱷ; ﱷ; ثز; ثز; ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FC78;FC78;FC78;062B 0645;062B 0645; # (ﱸ; ﱸ; ﱸ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC79;FC79;FC79;062B 0646;062B 0646; # (ﱹ; ﱹ; ﱹ; ثن; ثن; ) ARABIC LIGATURE THEH WITH NOON FINAL FORM +FC7A;FC7A;FC7A;062B 0649;062B 0649; # (ﱺ; ﱺ; ﱺ; ثى; ثى; ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC7B;FC7B;FC7B;062B 064A;062B 064A; # (ﱻ; ﱻ; ﱻ; ثي; ثي; ) ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC7C;FC7C;FC7C;0641 0649;0641 0649; # (ﱼ; ﱼ; ﱼ; فى; فى; ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC7D;FC7D;FC7D;0641 064A;0641 064A; # (ﱽ; ﱽ; ﱽ; في; في; ) ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC7E;FC7E;FC7E;0642 0649;0642 0649; # (ﱾ; ﱾ; ﱾ; قى; قى; ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC7F;FC7F;FC7F;0642 064A;0642 064A; # (ﱿ; ﱿ; ﱿ; قي; قي; ) ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC80;FC80;FC80;0643 0627;0643 0627; # (ﲀ; ﲀ; ﲀ; كا; كا; ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC81;FC81;FC81;0643 0644;0643 0644; # (ﲁ; ﲁ; ﲁ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC82;FC82;FC82;0643 0645;0643 0645; # (ﲂ; ﲂ; ﲂ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC83;FC83;FC83;0643 0649;0643 0649; # (ﲃ; ﲃ; ﲃ; كى; كى; ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC84;FC84;FC84;0643 064A;0643 064A; # (ﲄ; ﲄ; ﲄ; كي; كي; ) ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC85;FC85;FC85;0644 0645;0644 0645; # (ﲅ; ﲅ; ﲅ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC86;FC86;FC86;0644 0649;0644 0649; # (ﲆ; ﲆ; ﲆ; لى; لى; ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC87;FC87;FC87;0644 064A;0644 064A; # (ﲇ; ﲇ; ﲇ; لي; لي; ) ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC88;FC88;FC88;0645 0627;0645 0627; # (ﲈ; ﲈ; ﲈ; ما; ما; ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FC89;FC89;FC89;0645 0645;0645 0645; # (ﲉ; ﲉ; ﲉ; مم; مم; ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC8A;FC8A;FC8A;0646 0631;0646 0631; # (ﲊ; ﲊ; ﲊ; نر; نر; ) ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B;FC8B;FC8B;0646 0632;0646 0632; # (ﲋ; ﲋ; ﲋ; نز; نز; ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FC8C;FC8C;FC8C;0646 0645;0646 0645; # (ﲌ; ﲌ; ﲌ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC8D;FC8D;FC8D;0646 0646;0646 0646; # (ﲍ; ﲍ; ﲍ; نن; نن; ) ARABIC LIGATURE NOON WITH NOON FINAL FORM +FC8E;FC8E;FC8E;0646 0649;0646 0649; # (ﲎ; ﲎ; ﲎ; نى; نى; ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC8F;FC8F;FC8F;0646 064A;0646 064A; # (ﲏ; ﲏ; ﲏ; ني; ني; ) ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC90;FC90;FC90;0649 0670;0649 0670; # (ﲐ; ﲐ; ﲐ; ى◌ٰ; ى◌ٰ; ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC91;FC91;FC91;064A 0631;064A 0631; # (ﲑ; ﲑ; ﲑ; ير; ير; ) ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92;FC92;FC92;064A 0632;064A 0632; # (ﲒ; ﲒ; ﲒ; يز; يز; ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FC93;FC93;FC93;064A 0645;064A 0645; # (ﲓ; ﲓ; ﲓ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC94;FC94;FC94;064A 0646;064A 0646; # (ﲔ; ﲔ; ﲔ; ين; ين; ) ARABIC LIGATURE YEH WITH NOON FINAL FORM +FC95;FC95;FC95;064A 0649;064A 0649; # (ﲕ; ﲕ; ﲕ; يى; يى; ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC96;FC96;FC96;064A 064A;064A 064A; # (ﲖ; ﲖ; ﲖ; يي; يي; ) ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC97;FC97;FC97;0626 062C;064A 0654 062C; # (ﲗ; ﲗ; ﲗ; ئج; ي◌ٔج; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC98;FC98;FC98;0626 062D;064A 0654 062D; # (ﲘ; ﲘ; ﲘ; ئح; ي◌ٔح; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC99;FC99;FC99;0626 062E;064A 0654 062E; # (ﲙ; ﲙ; ﲙ; ئخ; ي◌ٔخ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC9A;FC9A;FC9A;0626 0645;064A 0654 0645; # (ﲚ; ﲚ; ﲚ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FC9B;FC9B;FC9B;0626 0647;064A 0654 0647; # (ﲛ; ﲛ; ﲛ; ئه; ي◌ٔه; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FC9C;FC9C;FC9C;0628 062C;0628 062C; # (ﲜ; ﲜ; ﲜ; بج; بج; ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC9D;FC9D;FC9D;0628 062D;0628 062D; # (ﲝ; ﲝ; ﲝ; بح; بح; ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC9E;FC9E;FC9E;0628 062E;0628 062E; # (ﲞ; ﲞ; ﲞ; بخ; بخ; ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC9F;FC9F;FC9F;0628 0645;0628 0645; # (ﲟ; ﲟ; ﲟ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCA0;FCA0;FCA0;0628 0647;0628 0647; # (ﲠ; ﲠ; ﲠ; به; به; ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCA1;FCA1;FCA1;062A 062C;062A 062C; # (ﲡ; ﲡ; ﲡ; تج; تج; ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FCA2;FCA2;FCA2;062A 062D;062A 062D; # (ﲢ; ﲢ; ﲢ; تح; تح; ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FCA3;FCA3;FCA3;062A 062E;062A 062E; # (ﲣ; ﲣ; ﲣ; تخ; تخ; ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FCA4;FCA4;FCA4;062A 0645;062A 0645; # (ﲤ; ﲤ; ﲤ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCA5;FCA5;FCA5;062A 0647;062A 0647; # (ﲥ; ﲥ; ﲥ; ته; ته; ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCA6;FCA6;FCA6;062B 0645;062B 0645; # (ﲦ; ﲦ; ﲦ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCA7;FCA7;FCA7;062C 062D;062C 062D; # (ﲧ; ﲧ; ﲧ; جح; جح; ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FCA8;FCA8;FCA8;062C 0645;062C 0645; # (ﲨ; ﲨ; ﲨ; جم; جم; ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FCA9;FCA9;FCA9;062D 062C;062D 062C; # (ﲩ; ﲩ; ﲩ; حج; حج; ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FCAA;FCAA;FCAA;062D 0645;062D 0645; # (ﲪ; ﲪ; ﲪ; حم; حم; ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FCAB;FCAB;FCAB;062E 062C;062E 062C; # (ﲫ; ﲫ; ﲫ; خج; خج; ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FCAC;FCAC;FCAC;062E 0645;062E 0645; # (ﲬ; ﲬ; ﲬ; خم; خم; ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FCAD;FCAD;FCAD;0633 062C;0633 062C; # (ﲭ; ﲭ; ﲭ; سج; سج; ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FCAE;FCAE;FCAE;0633 062D;0633 062D; # (ﲮ; ﲮ; ﲮ; سح; سح; ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FCAF;FCAF;FCAF;0633 062E;0633 062E; # (ﲯ; ﲯ; ﲯ; سخ; سخ; ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FCB0;FCB0;FCB0;0633 0645;0633 0645; # (ﲰ; ﲰ; ﲰ; سم; سم; ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCB1;FCB1;FCB1;0635 062D;0635 062D; # (ﲱ; ﲱ; ﲱ; صح; صح; ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FCB2;FCB2;FCB2;0635 062E;0635 062E; # (ﲲ; ﲲ; ﲲ; صخ; صخ; ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FCB3;FCB3;FCB3;0635 0645;0635 0645; # (ﲳ; ﲳ; ﲳ; صم; صم; ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FCB4;FCB4;FCB4;0636 062C;0636 062C; # (ﲴ; ﲴ; ﲴ; ضج; ضج; ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FCB5;FCB5;FCB5;0636 062D;0636 062D; # (ﲵ; ﲵ; ﲵ; ضح; ضح; ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FCB6;FCB6;FCB6;0636 062E;0636 062E; # (ﲶ; ﲶ; ﲶ; ضخ; ضخ; ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FCB7;FCB7;FCB7;0636 0645;0636 0645; # (ﲷ; ﲷ; ﲷ; ضم; ضم; ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FCB8;FCB8;FCB8;0637 062D;0637 062D; # (ﲸ; ﲸ; ﲸ; طح; طح; ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FCB9;FCB9;FCB9;0638 0645;0638 0645; # (ﲹ; ﲹ; ﲹ; ظم; ظم; ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FCBA;FCBA;FCBA;0639 062C;0639 062C; # (ﲺ; ﲺ; ﲺ; عج; عج; ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FCBB;FCBB;FCBB;0639 0645;0639 0645; # (ﲻ; ﲻ; ﲻ; عم; عم; ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FCBC;FCBC;FCBC;063A 062C;063A 062C; # (ﲼ; ﲼ; ﲼ; غج; غج; ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FCBD;FCBD;FCBD;063A 0645;063A 0645; # (ﲽ; ﲽ; ﲽ; غم; غم; ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FCBE;FCBE;FCBE;0641 062C;0641 062C; # (ﲾ; ﲾ; ﲾ; فج; فج; ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FCBF;FCBF;FCBF;0641 062D;0641 062D; # (ﲿ; ﲿ; ﲿ; فح; فح; ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FCC0;FCC0;FCC0;0641 062E;0641 062E; # (ﳀ; ﳀ; ﳀ; فخ; فخ; ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FCC1;FCC1;FCC1;0641 0645;0641 0645; # (ﳁ; ﳁ; ﳁ; فم; فم; ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FCC2;FCC2;FCC2;0642 062D;0642 062D; # (ﳂ; ﳂ; ﳂ; قح; قح; ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FCC3;FCC3;FCC3;0642 0645;0642 0645; # (ﳃ; ﳃ; ﳃ; قم; قم; ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FCC4;FCC4;FCC4;0643 062C;0643 062C; # (ﳄ; ﳄ; ﳄ; كج; كج; ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FCC5;FCC5;FCC5;0643 062D;0643 062D; # (ﳅ; ﳅ; ﳅ; كح; كح; ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FCC6;FCC6;FCC6;0643 062E;0643 062E; # (ﳆ; ﳆ; ﳆ; كخ; كخ; ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FCC7;FCC7;FCC7;0643 0644;0643 0644; # (ﳇ; ﳇ; ﳇ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCC8;FCC8;FCC8;0643 0645;0643 0645; # (ﳈ; ﳈ; ﳈ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCC9;FCC9;FCC9;0644 062C;0644 062C; # (ﳉ; ﳉ; ﳉ; لج; لج; ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FCCA;FCCA;FCCA;0644 062D;0644 062D; # (ﳊ; ﳊ; ﳊ; لح; لح; ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FCCB;FCCB;FCCB;0644 062E;0644 062E; # (ﳋ; ﳋ; ﳋ; لخ; لخ; ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FCCC;FCCC;FCCC;0644 0645;0644 0645; # (ﳌ; ﳌ; ﳌ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCCD;FCCD;FCCD;0644 0647;0644 0647; # (ﳍ; ﳍ; ﳍ; له; له; ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FCCE;FCCE;FCCE;0645 062C;0645 062C; # (ﳎ; ﳎ; ﳎ; مج; مج; ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FCCF;FCCF;FCCF;0645 062D;0645 062D; # (ﳏ; ﳏ; ﳏ; مح; مح; ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FCD0;FCD0;FCD0;0645 062E;0645 062E; # (ﳐ; ﳐ; ﳐ; مخ; مخ; ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FCD1;FCD1;FCD1;0645 0645;0645 0645; # (ﳑ; ﳑ; ﳑ; مم; مم; ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FCD2;FCD2;FCD2;0646 062C;0646 062C; # (ﳒ; ﳒ; ﳒ; نج; نج; ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FCD3;FCD3;FCD3;0646 062D;0646 062D; # (ﳓ; ﳓ; ﳓ; نح; نح; ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FCD4;FCD4;FCD4;0646 062E;0646 062E; # (ﳔ; ﳔ; ﳔ; نخ; نخ; ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FCD5;FCD5;FCD5;0646 0645;0646 0645; # (ﳕ; ﳕ; ﳕ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCD6;FCD6;FCD6;0646 0647;0646 0647; # (ﳖ; ﳖ; ﳖ; نه; نه; ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCD7;FCD7;FCD7;0647 062C;0647 062C; # (ﳗ; ﳗ; ﳗ; هج; هج; ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FCD8;FCD8;FCD8;0647 0645;0647 0645; # (ﳘ; ﳘ; ﳘ; هم; هم; ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FCD9;FCD9;FCD9;0647 0670;0647 0670; # (ﳙ; ﳙ; ﳙ; ه◌ٰ; ه◌ٰ; ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCDA;FCDA;FCDA;064A 062C;064A 062C; # (ﳚ; ﳚ; ﳚ; يج; يج; ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FCDB;FCDB;FCDB;064A 062D;064A 062D; # (ﳛ; ﳛ; ﳛ; يح; يح; ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FCDC;FCDC;FCDC;064A 062E;064A 062E; # (ﳜ; ﳜ; ﳜ; يخ; يخ; ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FCDD;FCDD;FCDD;064A 0645;064A 0645; # (ﳝ; ﳝ; ﳝ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCDE;FCDE;FCDE;064A 0647;064A 0647; # (ﳞ; ﳞ; ﳞ; يه; يه; ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCDF;FCDF;FCDF;0626 0645;064A 0654 0645; # (ﳟ; ﳟ; ﳟ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FCE0;FCE0;FCE0;0626 0647;064A 0654 0647; # (ﳠ; ﳠ; ﳠ; ئه; ي◌ٔه; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FCE1;FCE1;FCE1;0628 0645;0628 0645; # (ﳡ; ﳡ; ﳡ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FCE2;FCE2;FCE2;0628 0647;0628 0647; # (ﳢ; ﳢ; ﳢ; به; به; ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FCE3;FCE3;FCE3;062A 0645;062A 0645; # (ﳣ; ﳣ; ﳣ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FCE4;FCE4;FCE4;062A 0647;062A 0647; # (ﳤ; ﳤ; ﳤ; ته; ته; ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FCE5;FCE5;FCE5;062B 0645;062B 0645; # (ﳥ; ﳥ; ﳥ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FCE6;FCE6;FCE6;062B 0647;062B 0647; # (ﳦ; ﳦ; ﳦ; ثه; ثه; ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FCE7;FCE7;FCE7;0633 0645;0633 0645; # (ﳧ; ﳧ; ﳧ; سم; سم; ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FCE8;FCE8;FCE8;0633 0647;0633 0647; # (ﳨ; ﳨ; ﳨ; سه; سه; ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FCE9;FCE9;FCE9;0634 0645;0634 0645; # (ﳩ; ﳩ; ﳩ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FCEA;FCEA;FCEA;0634 0647;0634 0647; # (ﳪ; ﳪ; ﳪ; شه; شه; ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FCEB;FCEB;FCEB;0643 0644;0643 0644; # (ﳫ; ﳫ; ﳫ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FCEC;FCEC;FCEC;0643 0645;0643 0645; # (ﳬ; ﳬ; ﳬ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FCED;FCED;FCED;0644 0645;0644 0645; # (ﳭ; ﳭ; ﳭ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FCEE;FCEE;FCEE;0646 0645;0646 0645; # (ﳮ; ﳮ; ﳮ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FCEF;FCEF;FCEF;0646 0647;0646 0647; # (ﳯ; ﳯ; ﳯ; نه; نه; ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FCF0;FCF0;FCF0;064A 0645;064A 0645; # (ﳰ; ﳰ; ﳰ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FCF1;FCF1;FCF1;064A 0647;064A 0647; # (ﳱ; ﳱ; ﳱ; يه; يه; ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FCF2;FCF2;FCF2;0640 064E 0651;0640 064E 0651; # (ﳲ; ﳲ; ﳲ; ـ◌َ◌ّ; ـ◌َ◌ّ; ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FCF3;FCF3;FCF3;0640 064F 0651;0640 064F 0651; # (ﳳ; ﳳ; ﳳ; ـ◌ُ◌ّ; ـ◌ُ◌ّ; ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FCF4;FCF4;FCF4;0640 0650 0651;0640 0650 0651; # (ﳴ; ﳴ; ﳴ; ـ◌ِ◌ّ; ـ◌ِ◌ّ; ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FCF5;FCF5;FCF5;0637 0649;0637 0649; # (ﳵ; ﳵ; ﳵ; طى; طى; ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FCF6;FCF6;FCF6;0637 064A;0637 064A; # (ﳶ; ﳶ; ﳶ; طي; طي; ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +FCF7;FCF7;FCF7;0639 0649;0639 0649; # (ﳷ; ﳷ; ﳷ; عى; عى; ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FCF8;FCF8;FCF8;0639 064A;0639 064A; # (ﳸ; ﳸ; ﳸ; عي; عي; ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +FCF9;FCF9;FCF9;063A 0649;063A 0649; # (ﳹ; ﳹ; ﳹ; غى; غى; ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FCFA;FCFA;FCFA;063A 064A;063A 064A; # (ﳺ; ﳺ; ﳺ; غي; غي; ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +FCFB;FCFB;FCFB;0633 0649;0633 0649; # (ﳻ; ﳻ; ﳻ; سى; سى; ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FCFC;FCFC;FCFC;0633 064A;0633 064A; # (ﳼ; ﳼ; ﳼ; سي; سي; ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +FCFD;FCFD;FCFD;0634 0649;0634 0649; # (ﳽ; ﳽ; ﳽ; شى; شى; ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FCFE;FCFE;FCFE;0634 064A;0634 064A; # (ﳾ; ﳾ; ﳾ; شي; شي; ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +FCFF;FCFF;FCFF;062D 0649;062D 0649; # (ﳿ; ﳿ; ﳿ; حى; حى; ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD00;FD00;FD00;062D 064A;062D 064A; # (ﴀ; ﴀ; ﴀ; حي; حي; ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +FD01;FD01;FD01;062C 0649;062C 0649; # (ﴁ; ﴁ; ﴁ; جى; جى; ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD02;FD02;FD02;062C 064A;062C 064A; # (ﴂ; ﴂ; ﴂ; جي; جي; ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +FD03;FD03;FD03;062E 0649;062E 0649; # (ﴃ; ﴃ; ﴃ; خى; خى; ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD04;FD04;FD04;062E 064A;062E 064A; # (ﴄ; ﴄ; ﴄ; خي; خي; ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +FD05;FD05;FD05;0635 0649;0635 0649; # (ﴅ; ﴅ; ﴅ; صى; صى; ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD06;FD06;FD06;0635 064A;0635 064A; # (ﴆ; ﴆ; ﴆ; صي; صي; ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +FD07;FD07;FD07;0636 0649;0636 0649; # (ﴇ; ﴇ; ﴇ; ضى; ضى; ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD08;FD08;FD08;0636 064A;0636 064A; # (ﴈ; ﴈ; ﴈ; ضي; ضي; ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +FD09;FD09;FD09;0634 062C;0634 062C; # (ﴉ; ﴉ; ﴉ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD0A;FD0A;FD0A;0634 062D;0634 062D; # (ﴊ; ﴊ; ﴊ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD0B;FD0B;FD0B;0634 062E;0634 062E; # (ﴋ; ﴋ; ﴋ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD0C;FD0C;FD0C;0634 0645;0634 0645; # (ﴌ; ﴌ; ﴌ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD0D;FD0D;FD0D;0634 0631;0634 0631; # (ﴍ; ﴍ; ﴍ; شر; شر; ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD0E;FD0E;FD0E;0633 0631;0633 0631; # (ﴎ; ﴎ; ﴎ; سر; سر; ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FD0F;FD0F;FD0F;0635 0631;0635 0631; # (ﴏ; ﴏ; ﴏ; صر; صر; ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FD10;FD10;FD10;0636 0631;0636 0631; # (ﴐ; ﴐ; ﴐ; ضر; ضر; ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD11;FD11;FD11;0637 0649;0637 0649; # (ﴑ; ﴑ; ﴑ; طى; طى; ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FD12;FD12;FD12;0637 064A;0637 064A; # (ﴒ; ﴒ; ﴒ; طي; طي; ) ARABIC LIGATURE TAH WITH YEH FINAL FORM +FD13;FD13;FD13;0639 0649;0639 0649; # (ﴓ; ﴓ; ﴓ; عى; عى; ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FD14;FD14;FD14;0639 064A;0639 064A; # (ﴔ; ﴔ; ﴔ; عي; عي; ) ARABIC LIGATURE AIN WITH YEH FINAL FORM +FD15;FD15;FD15;063A 0649;063A 0649; # (ﴕ; ﴕ; ﴕ; غى; غى; ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FD16;FD16;FD16;063A 064A;063A 064A; # (ﴖ; ﴖ; ﴖ; غي; غي; ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FD17;FD17;FD17;0633 0649;0633 0649; # (ﴗ; ﴗ; ﴗ; سى; سى; ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FD18;FD18;FD18;0633 064A;0633 064A; # (ﴘ; ﴘ; ﴘ; سي; سي; ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FD19;FD19;FD19;0634 0649;0634 0649; # (ﴙ; ﴙ; ﴙ; شى; شى; ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FD1A;FD1A;FD1A;0634 064A;0634 064A; # (ﴚ; ﴚ; ﴚ; شي; شي; ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FD1B;FD1B;FD1B;062D 0649;062D 0649; # (ﴛ; ﴛ; ﴛ; حى; حى; ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FD1C;FD1C;FD1C;062D 064A;062D 064A; # (ﴜ; ﴜ; ﴜ; حي; حي; ) ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD1D;FD1D;FD1D;062C 0649;062C 0649; # (ﴝ; ﴝ; ﴝ; جى; جى; ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD1E;FD1E;FD1E;062C 064A;062C 064A; # (ﴞ; ﴞ; ﴞ; جي; جي; ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD1F;FD1F;FD1F;062E 0649;062E 0649; # (ﴟ; ﴟ; ﴟ; خى; خى; ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD20;FD20;FD20;062E 064A;062E 064A; # (ﴠ; ﴠ; ﴠ; خي; خي; ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD21;FD21;FD21;0635 0649;0635 0649; # (ﴡ; ﴡ; ﴡ; صى; صى; ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD22;FD22;FD22;0635 064A;0635 064A; # (ﴢ; ﴢ; ﴢ; صي; صي; ) ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD23;FD23;FD23;0636 0649;0636 0649; # (ﴣ; ﴣ; ﴣ; ضى; ضى; ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD24;FD24;FD24;0636 064A;0636 064A; # (ﴤ; ﴤ; ﴤ; ضي; ضي; ) ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD25;FD25;FD25;0634 062C;0634 062C; # (ﴥ; ﴥ; ﴥ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD26;FD26;FD26;0634 062D;0634 062D; # (ﴦ; ﴦ; ﴦ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD27;FD27;FD27;0634 062E;0634 062E; # (ﴧ; ﴧ; ﴧ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD28;FD28;FD28;0634 0645;0634 0645; # (ﴨ; ﴨ; ﴨ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD29;FD29;FD29;0634 0631;0634 0631; # (ﴩ; ﴩ; ﴩ; شر; شر; ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD2A;FD2A;FD2A;0633 0631;0633 0631; # (ﴪ; ﴪ; ﴪ; سر; سر; ) ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD2B;FD2B;FD2B;0635 0631;0635 0631; # (ﴫ; ﴫ; ﴫ; صر; صر; ) ARABIC LIGATURE SAD WITH REH FINAL FORM +FD2C;FD2C;FD2C;0636 0631;0636 0631; # (ﴬ; ﴬ; ﴬ; ضر; ضر; ) ARABIC LIGATURE DAD WITH REH FINAL FORM +FD2D;FD2D;FD2D;0634 062C;0634 062C; # (ﴭ; ﴭ; ﴭ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD2E;FD2E;FD2E;0634 062D;0634 062D; # (ﴮ; ﴮ; ﴮ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD2F;FD2F;FD2F;0634 062E;0634 062E; # (ﴯ; ﴯ; ﴯ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD30;FD30;FD30;0634 0645;0634 0645; # (ﴰ; ﴰ; ﴰ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FD31;FD31;FD31;0633 0647;0633 0647; # (ﴱ; ﴱ; ﴱ; سه; سه; ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FD32;FD32;FD32;0634 0647;0634 0647; # (ﴲ; ﴲ; ﴲ; شه; شه; ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FD33;FD33;FD33;0637 0645;0637 0645; # (ﴳ; ﴳ; ﴳ; طم; طم; ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD34;FD34;FD34;0633 062C;0633 062C; # (ﴴ; ﴴ; ﴴ; سج; سج; ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FD35;FD35;FD35;0633 062D;0633 062D; # (ﴵ; ﴵ; ﴵ; سح; سح; ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FD36;FD36;FD36;0633 062E;0633 062E; # (ﴶ; ﴶ; ﴶ; سخ; سخ; ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FD37;FD37;FD37;0634 062C;0634 062C; # (ﴷ; ﴷ; ﴷ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD38;FD38;FD38;0634 062D;0634 062D; # (ﴸ; ﴸ; ﴸ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD39;FD39;FD39;0634 062E;0634 062E; # (ﴹ; ﴹ; ﴹ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD3A;FD3A;FD3A;0637 0645;0637 0645; # (ﴺ; ﴺ; ﴺ; طم; طم; ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FD3B;FD3B;FD3B;0638 0645;0638 0645; # (ﴻ; ﴻ; ﴻ; ظم; ظم; ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FD3C;FD3C;FD3C;0627 064B;0627 064B; # (ﴼ; ﴼ; ﴼ; ا◌ً; ا◌ً; ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D;FD3D;FD3D;0627 064B;0627 064B; # (ﴽ; ﴽ; ﴽ; ا◌ً; ا◌ً; ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50;FD50;FD50;062A 062C 0645;062A 062C 0645; # (ﵐ; ﵐ; ﵐ; تجم; تجم; ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD51;FD51;FD51;062A 062D 062C;062A 062D 062C; # (ﵑ; ﵑ; ﵑ; تحج; تحج; ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD52;FD52;FD52;062A 062D 062C;062A 062D 062C; # (ﵒ; ﵒ; ﵒ; تحج; تحج; ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD53;FD53;FD53;062A 062D 0645;062A 062D 0645; # (ﵓ; ﵓ; ﵓ; تحم; تحم; ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FD54;FD54;FD54;062A 062E 0645;062A 062E 0645; # (ﵔ; ﵔ; ﵔ; تخم; تخم; ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FD55;FD55;FD55;062A 0645 062C;062A 0645 062C; # (ﵕ; ﵕ; ﵕ; تمج; تمج; ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56;FD56;FD56;062A 0645 062D;062A 0645 062D; # (ﵖ; ﵖ; ﵖ; تمح; تمح; ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57;FD57;FD57;062A 0645 062E;062A 0645 062E; # (ﵗ; ﵗ; ﵗ; تمخ; تمخ; ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD58;FD58;FD58;062C 0645 062D;062C 0645 062D; # (ﵘ; ﵘ; ﵘ; جمح; جمح; ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FD59;FD59;FD59;062C 0645 062D;062C 0645 062D; # (ﵙ; ﵙ; ﵙ; جمح; جمح; ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5A;FD5A;FD5A;062D 0645 064A;062D 0645 064A; # (ﵚ; ﵚ; ﵚ; حمي; حمي; ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD5B;FD5B;FD5B;062D 0645 0649;062D 0645 0649; # (ﵛ; ﵛ; ﵛ; حمى; حمى; ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5C;FD5C;FD5C;0633 062D 062C;0633 062D 062C; # (ﵜ; ﵜ; ﵜ; سحج; سحج; ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FD5D;FD5D;FD5D;0633 062C 062D;0633 062C 062D; # (ﵝ; ﵝ; ﵝ; سجح; سجح; ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E;FD5E;FD5E;0633 062C 0649;0633 062C 0649; # (ﵞ; ﵞ; ﵞ; سجى; سجى; ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD5F;FD5F;FD5F;0633 0645 062D;0633 0645 062D; # (ﵟ; ﵟ; ﵟ; سمح; سمح; ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD60;FD60;FD60;0633 0645 062D;0633 0645 062D; # (ﵠ; ﵠ; ﵠ; سمح; سمح; ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD61;FD61;FD61;0633 0645 062C;0633 0645 062C; # (ﵡ; ﵡ; ﵡ; سمج; سمج; ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD62;FD62;FD62;0633 0645 0645;0633 0645 0645; # (ﵢ; ﵢ; ﵢ; سمم; سمم; ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD63;FD63;FD63;0633 0645 0645;0633 0645 0645; # (ﵣ; ﵣ; ﵣ; سمم; سمم; ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD64;FD64;FD64;0635 062D 062D;0635 062D 062D; # (ﵤ; ﵤ; ﵤ; صحح; صحح; ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FD65;FD65;FD65;0635 062D 062D;0635 062D 062D; # (ﵥ; ﵥ; ﵥ; صحح; صحح; ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD66;FD66;FD66;0635 0645 0645;0635 0645 0645; # (ﵦ; ﵦ; ﵦ; صمم; صمم; ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD67;FD67;FD67;0634 062D 0645;0634 062D 0645; # (ﵧ; ﵧ; ﵧ; شحم; شحم; ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FD68;FD68;FD68;0634 062D 0645;0634 062D 0645; # (ﵨ; ﵨ; ﵨ; شحم; شحم; ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD69;FD69;FD69;0634 062C 064A;0634 062C 064A; # (ﵩ; ﵩ; ﵩ; شجي; شجي; ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD6A;FD6A;FD6A;0634 0645 062E;0634 0645 062E; # (ﵪ; ﵪ; ﵪ; شمخ; شمخ; ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6B;FD6B;FD6B;0634 0645 062E;0634 0645 062E; # (ﵫ; ﵫ; ﵫ; شمخ; شمخ; ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6C;FD6C;FD6C;0634 0645 0645;0634 0645 0645; # (ﵬ; ﵬ; ﵬ; شمم; شمم; ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD6D;FD6D;FD6D;0634 0645 0645;0634 0645 0645; # (ﵭ; ﵭ; ﵭ; شمم; شمم; ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6E;FD6E;FD6E;0636 062D 0649;0636 062D 0649; # (ﵮ; ﵮ; ﵮ; ضحى; ضحى; ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FD6F;FD6F;FD6F;0636 062E 0645;0636 062E 0645; # (ﵯ; ﵯ; ﵯ; ضخم; ضخم; ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD70;FD70;FD70;0636 062E 0645;0636 062E 0645; # (ﵰ; ﵰ; ﵰ; ضخم; ضخم; ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD71;FD71;FD71;0637 0645 062D;0637 0645 062D; # (ﵱ; ﵱ; ﵱ; طمح; طمح; ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD72;FD72;FD72;0637 0645 062D;0637 0645 062D; # (ﵲ; ﵲ; ﵲ; طمح; طمح; ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD73;FD73;FD73;0637 0645 0645;0637 0645 0645; # (ﵳ; ﵳ; ﵳ; طمم; طمم; ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74;FD74;FD74;0637 0645 064A;0637 0645 064A; # (ﵴ; ﵴ; ﵴ; طمي; طمي; ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD75;FD75;FD75;0639 062C 0645;0639 062C 0645; # (ﵵ; ﵵ; ﵵ; عجم; عجم; ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FD76;FD76;FD76;0639 0645 0645;0639 0645 0645; # (ﵶ; ﵶ; ﵶ; عمم; عمم; ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD77;FD77;FD77;0639 0645 0645;0639 0645 0645; # (ﵷ; ﵷ; ﵷ; عمم; عمم; ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD78;FD78;FD78;0639 0645 0649;0639 0645 0649; # (ﵸ; ﵸ; ﵸ; عمى; عمى; ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD79;FD79;FD79;063A 0645 0645;063A 0645 0645; # (ﵹ; ﵹ; ﵹ; غمم; غمم; ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7A;FD7A;FD7A;063A 0645 064A;063A 0645 064A; # (ﵺ; ﵺ; ﵺ; غمي; غمي; ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD7B;FD7B;FD7B;063A 0645 0649;063A 0645 0649; # (ﵻ; ﵻ; ﵻ; غمى; غمى; ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7C;FD7C;FD7C;0641 062E 0645;0641 062E 0645; # (ﵼ; ﵼ; ﵼ; فخم; فخم; ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FD7D;FD7D;FD7D;0641 062E 0645;0641 062E 0645; # (ﵽ; ﵽ; ﵽ; فخم; فخم; ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7E;FD7E;FD7E;0642 0645 062D;0642 0645 062D; # (ﵾ; ﵾ; ﵾ; قمح; قمح; ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F;FD7F;FD7F;0642 0645 0645;0642 0645 0645; # (ﵿ; ﵿ; ﵿ; قمم; قمم; ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FD80;FD80;FD80;0644 062D 0645;0644 062D 0645; # (ﶀ; ﶀ; ﶀ; لحم; لحم; ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD81;FD81;FD81;0644 062D 064A;0644 062D 064A; # (ﶁ; ﶁ; ﶁ; لحي; لحي; ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FD82;FD82;FD82;0644 062D 0649;0644 062D 0649; # (ﶂ; ﶂ; ﶂ; لحى; لحى; ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD83;FD83;FD83;0644 062C 062C;0644 062C 062C; # (ﶃ; ﶃ; ﶃ; لجج; لجج; ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84;FD84;FD84;0644 062C 062C;0644 062C 062C; # (ﶄ; ﶄ; ﶄ; لجج; لجج; ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FD85;FD85;FD85;0644 062E 0645;0644 062E 0645; # (ﶅ; ﶅ; ﶅ; لخم; لخم; ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FD86;FD86;FD86;0644 062E 0645;0644 062E 0645; # (ﶆ; ﶆ; ﶆ; لخم; لخم; ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD87;FD87;FD87;0644 0645 062D;0644 0645 062D; # (ﶇ; ﶇ; ﶇ; لمح; لمح; ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FD88;FD88;FD88;0644 0645 062D;0644 0645 062D; # (ﶈ; ﶈ; ﶈ; لمح; لمح; ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD89;FD89;FD89;0645 062D 062C;0645 062D 062C; # (ﶉ; ﶉ; ﶉ; محج; محج; ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A;FD8A;FD8A;0645 062D 0645;0645 062D 0645; # (ﶊ; ﶊ; ﶊ; محم; محم; ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8B;FD8B;FD8B;0645 062D 064A;0645 062D 064A; # (ﶋ; ﶋ; ﶋ; محي; محي; ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD8C;FD8C;FD8C;0645 062C 062D;0645 062C 062D; # (ﶌ; ﶌ; ﶌ; مجح; مجح; ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD8D;FD8D;FD8D;0645 062C 0645;0645 062C 0645; # (ﶍ; ﶍ; ﶍ; مجم; مجم; ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FD8E;FD8E;FD8E;0645 062E 062C;0645 062E 062C; # (ﶎ; ﶎ; ﶎ; مخج; مخج; ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F;FD8F;FD8F;0645 062E 0645;0645 062E 0645; # (ﶏ; ﶏ; ﶏ; مخم; مخم; ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92;FD92;FD92;0645 062C 062E;0645 062C 062E; # (ﶒ; ﶒ; ﶒ; مجخ; مجخ; ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD93;FD93;FD93;0647 0645 062C;0647 0645 062C; # (ﶓ; ﶓ; ﶓ; همج; همج; ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94;FD94;FD94;0647 0645 0645;0647 0645 0645; # (ﶔ; ﶔ; ﶔ; همم; همم; ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FD95;FD95;FD95;0646 062D 0645;0646 062D 0645; # (ﶕ; ﶕ; ﶕ; نحم; نحم; ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96;FD96;FD96;0646 062D 0649;0646 062D 0649; # (ﶖ; ﶖ; ﶖ; نحى; نحى; ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FD97;FD97;FD97;0646 062C 0645;0646 062C 0645; # (ﶗ; ﶗ; ﶗ; نجم; نجم; ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD98;FD98;FD98;0646 062C 0645;0646 062C 0645; # (ﶘ; ﶘ; ﶘ; نجم; نجم; ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD99;FD99;FD99;0646 062C 0649;0646 062C 0649; # (ﶙ; ﶙ; ﶙ; نجى; نجى; ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9A;FD9A;FD9A;0646 0645 064A;0646 0645 064A; # (ﶚ; ﶚ; ﶚ; نمي; نمي; ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FD9B;FD9B;FD9B;0646 0645 0649;0646 0645 0649; # (ﶛ; ﶛ; ﶛ; نمى; نمى; ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9C;FD9C;FD9C;064A 0645 0645;064A 0645 0645; # (ﶜ; ﶜ; ﶜ; يمم; يمم; ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FD9D;FD9D;FD9D;064A 0645 0645;064A 0645 0645; # (ﶝ; ﶝ; ﶝ; يمم; يمم; ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9E;FD9E;FD9E;0628 062E 064A;0628 062E 064A; # (ﶞ; ﶞ; ﶞ; بخي; بخي; ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FD9F;FD9F;FD9F;062A 062C 064A;062A 062C 064A; # (ﶟ; ﶟ; ﶟ; تجي; تجي; ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FDA0;FDA0;FDA0;062A 062C 0649;062A 062C 0649; # (ﶠ; ﶠ; ﶠ; تجى; تجى; ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDA1;FDA1;FDA1;062A 062E 064A;062A 062E 064A; # (ﶡ; ﶡ; ﶡ; تخي; تخي; ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FDA2;FDA2;FDA2;062A 062E 0649;062A 062E 0649; # (ﶢ; ﶢ; ﶢ; تخى; تخى; ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA3;FDA3;FDA3;062A 0645 064A;062A 0645 064A; # (ﶣ; ﶣ; ﶣ; تمي; تمي; ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FDA4;FDA4;FDA4;062A 0645 0649;062A 0645 0649; # (ﶤ; ﶤ; ﶤ; تمى; تمى; ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5;FDA5;FDA5;062C 0645 064A;062C 0645 064A; # (ﶥ; ﶥ; ﶥ; جمي; جمي; ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FDA6;FDA6;FDA6;062C 062D 0649;062C 062D 0649; # (ﶦ; ﶦ; ﶦ; جحى; جحى; ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDA7;FDA7;FDA7;062C 0645 0649;062C 0645 0649; # (ﶧ; ﶧ; ﶧ; جمى; جمى; ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA8;FDA8;FDA8;0633 062E 0649;0633 062E 0649; # (ﶨ; ﶨ; ﶨ; سخى; سخى; ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA9;FDA9;FDA9;0635 062D 064A;0635 062D 064A; # (ﶩ; ﶩ; ﶩ; صحي; صحي; ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FDAA;FDAA;FDAA;0634 062D 064A;0634 062D 064A; # (ﶪ; ﶪ; ﶪ; شحي; شحي; ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FDAB;FDAB;FDAB;0636 062D 064A;0636 062D 064A; # (ﶫ; ﶫ; ﶫ; ضحي; ضحي; ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FDAC;FDAC;FDAC;0644 062C 064A;0644 062C 064A; # (ﶬ; ﶬ; ﶬ; لجي; لجي; ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FDAD;FDAD;FDAD;0644 0645 064A;0644 0645 064A; # (ﶭ; ﶭ; ﶭ; لمي; لمي; ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FDAE;FDAE;FDAE;064A 062D 064A;064A 062D 064A; # (ﶮ; ﶮ; ﶮ; يحي; يحي; ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FDAF;FDAF;FDAF;064A 062C 064A;064A 062C 064A; # (ﶯ; ﶯ; ﶯ; يجي; يجي; ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FDB0;FDB0;FDB0;064A 0645 064A;064A 0645 064A; # (ﶰ; ﶰ; ﶰ; يمي; يمي; ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FDB1;FDB1;FDB1;0645 0645 064A;0645 0645 064A; # (ﶱ; ﶱ; ﶱ; ممي; ممي; ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FDB2;FDB2;FDB2;0642 0645 064A;0642 0645 064A; # (ﶲ; ﶲ; ﶲ; قمي; قمي; ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FDB3;FDB3;FDB3;0646 062D 064A;0646 062D 064A; # (ﶳ; ﶳ; ﶳ; نحي; نحي; ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB4;FDB4;FDB4;0642 0645 062D;0642 0645 062D; # (ﶴ; ﶴ; ﶴ; قمح; قمح; ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FDB5;FDB5;FDB5;0644 062D 0645;0644 062D 0645; # (ﶵ; ﶵ; ﶵ; لحم; لحم; ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB6;FDB6;FDB6;0639 0645 064A;0639 0645 064A; # (ﶶ; ﶶ; ﶶ; عمي; عمي; ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FDB7;FDB7;FDB7;0643 0645 064A;0643 0645 064A; # (ﶷ; ﶷ; ﶷ; كمي; كمي; ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB8;FDB8;FDB8;0646 062C 062D;0646 062C 062D; # (ﶸ; ﶸ; ﶸ; نجح; نجح; ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDB9;FDB9;FDB9;0645 062E 064A;0645 062E 064A; # (ﶹ; ﶹ; ﶹ; مخي; مخي; ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBA;FDBA;FDBA;0644 062C 0645;0644 062C 0645; # (ﶺ; ﶺ; ﶺ; لجم; لجم; ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBB;FDBB;FDBB;0643 0645 0645;0643 0645 0645; # (ﶻ; ﶻ; ﶻ; كمم; كمم; ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDBC;FDBC;FDBC;0644 062C 0645;0644 062C 0645; # (ﶼ; ﶼ; ﶼ; لجم; لجم; ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDBD;FDBD;FDBD;0646 062C 062D;0646 062C 062D; # (ﶽ; ﶽ; ﶽ; نجح; نجح; ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FDBE;FDBE;FDBE;062C 062D 064A;062C 062D 064A; # (ﶾ; ﶾ; ﶾ; جحي; جحي; ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDBF;FDBF;FDBF;062D 062C 064A;062D 062C 064A; # (ﶿ; ﶿ; ﶿ; حجي; حجي; ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FDC0;FDC0;FDC0;0645 062C 064A;0645 062C 064A; # (ﷀ; ﷀ; ﷀ; مجي; مجي; ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FDC1;FDC1;FDC1;0641 0645 064A;0641 0645 064A; # (ﷁ; ﷁ; ﷁ; فمي; فمي; ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FDC2;FDC2;FDC2;0628 062D 064A;0628 062D 064A; # (ﷂ; ﷂ; ﷂ; بحي; بحي; ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC3;FDC3;FDC3;0643 0645 0645;0643 0645 0645; # (ﷃ; ﷃ; ﷃ; كمم; كمم; ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDC4;FDC4;FDC4;0639 062C 0645;0639 062C 0645; # (ﷄ; ﷄ; ﷄ; عجم; عجم; ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FDC5;FDC5;FDC5;0635 0645 0645;0635 0645 0645; # (ﷅ; ﷅ; ﷅ; صمم; صمم; ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FDC6;FDC6;FDC6;0633 062E 064A;0633 062E 064A; # (ﷆ; ﷆ; ﷆ; سخي; سخي; ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FDC7;FDC7;FDC7;0646 062C 064A;0646 062C 064A; # (ﷇ; ﷇ; ﷇ; نجي; نجي; ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0;FDF0;FDF0;0635 0644 06D2;0635 0644 06D2; # (ﷰ; ﷰ; ﷰ; صلے; صلے; ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF1;FDF1;FDF1;0642 0644 06D2;0642 0644 06D2; # (ﷱ; ﷱ; ﷱ; قلے; قلے; ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF2;FDF2;FDF2;0627 0644 0644 0647;0627 0644 0644 0647; # (ﷲ; ﷲ; ﷲ; الله; الله; ) ARABIC LIGATURE ALLAH ISOLATED FORM +FDF3;FDF3;FDF3;0627 0643 0628 0631;0627 0643 0628 0631; # (ﷳ; ﷳ; ﷳ; اكبر; اكبر; ) ARABIC LIGATURE AKBAR ISOLATED FORM +FDF4;FDF4;FDF4;0645 062D 0645 062F;0645 062D 0645 062F; # (ﷴ; ﷴ; ﷴ; محمد; محمد; ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FDF5;FDF5;FDF5;0635 0644 0639 0645;0635 0644 0639 0645; # (ﷵ; ﷵ; ﷵ; صلعم; صلعم; ) ARABIC LIGATURE SALAM ISOLATED FORM +FDF6;FDF6;FDF6;0631 0633 0648 0644;0631 0633 0648 0644; # (ﷶ; ﷶ; ﷶ; رسول; رسول; ) ARABIC LIGATURE RASOUL ISOLATED FORM +FDF7;FDF7;FDF7;0639 0644 064A 0647;0639 0644 064A 0647; # (ﷷ; ﷷ; ﷷ; عليه; عليه; ) ARABIC LIGATURE ALAYHE ISOLATED FORM +FDF8;FDF8;FDF8;0648 0633 0644 0645;0648 0633 0644 0645; # (ﷸ; ﷸ; ﷸ; وسلم; وسلم; ) ARABIC LIGATURE WASALLAM ISOLATED FORM +FDF9;FDF9;FDF9;0635 0644 0649;0635 0644 0649; # (ﷹ; ﷹ; ﷹ; صلى; صلى; ) ARABIC LIGATURE SALLA ISOLATED FORM +FDFA;FDFA;FDFA;0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645; # (ﷺ; ﷺ; ﷺ; صلى الله عليه وسلم; صلى الله عليه وسلم; ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDFB;FDFB;FDFB;062C 0644 0020 062C 0644 0627 0644 0647;062C 0644 0020 062C 0644 0627 0644 0647; # (ﷻ; ﷻ; ﷻ; جل جلاله; جل جلاله; ) ARABIC LIGATURE JALLAJALALOUHOU +FDFC;FDFC;FDFC;0631 06CC 0627 0644;0631 06CC 0627 0644; # (﷼; ﷼; ﷼; ریال; ریال; ) RIAL SIGN +FE30;FE30;FE30;002E 002E;002E 002E; # (︰; ︰; ︰; ..; ..; ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31;FE31;FE31;2014;2014; # (︱; ︱; ︱; —; —; ) PRESENTATION FORM FOR VERTICAL EM DASH +FE32;FE32;FE32;2013;2013; # (︲; ︲; ︲; –; –; ) PRESENTATION FORM FOR VERTICAL EN DASH +FE33;FE33;FE33;005F;005F; # (︳; ︳; ︳; _; _; ) PRESENTATION FORM FOR VERTICAL LOW LINE +FE34;FE34;FE34;005F;005F; # (︴; ︴; ︴; _; _; ) PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35;FE35;FE35;0028;0028; # (︵; ︵; ︵; (; (; ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36;FE36;FE36;0029;0029; # (︶; ︶; ︶; ); ); ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37;FE37;FE37;007B;007B; # (︷; ︷; ︷; {; {; ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38;FE38;FE38;007D;007D; # (︸; ︸; ︸; }; }; ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39;FE39;FE39;3014;3014; # (︹; ︹; ︹; 〔; 〔; ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A;FE3A;FE3A;3015;3015; # (︺; ︺; ︺; 〕; 〕; ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B;FE3B;FE3B;3010;3010; # (︻; ︻; ︻; 【; 【; ) PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C;FE3C;FE3C;3011;3011; # (︼; ︼; ︼; 】; 】; ) PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D;FE3D;FE3D;300A;300A; # (︽; ︽; ︽; 《; 《; ) PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E;FE3E;FE3E;300B;300B; # (︾; ︾; ︾; 》; 》; ) PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F;FE3F;FE3F;3008;3008; # (︿; ︿; ︿; 〈; 〈; ) PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40;FE40;FE40;3009;3009; # (﹀; ﹀; ﹀; 〉; 〉; ) PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41;FE41;FE41;300C;300C; # (﹁; ﹁; ﹁; 「; 「; ) PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42;FE42;FE42;300D;300D; # (﹂; ﹂; ﹂; 」; 」; ) PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43;FE43;FE43;300E;300E; # (﹃; ﹃; ﹃; 『; 『; ) PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44;FE44;FE44;300F;300F; # (﹄; ﹄; ﹄; 』; 』; ) PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE49;FE49;FE49;0020 0305;0020 0305; # (﹉; ﹉; ﹉; ◌̅; ◌̅; ) DASHED OVERLINE +FE4A;FE4A;FE4A;0020 0305;0020 0305; # (﹊; ﹊; ﹊; ◌̅; ◌̅; ) CENTRELINE OVERLINE +FE4B;FE4B;FE4B;0020 0305;0020 0305; # (﹋; ﹋; ﹋; ◌̅; ◌̅; ) WAVY OVERLINE +FE4C;FE4C;FE4C;0020 0305;0020 0305; # (﹌; ﹌; ﹌; ◌̅; ◌̅; ) DOUBLE WAVY OVERLINE +FE4D;FE4D;FE4D;005F;005F; # (﹍; ﹍; ﹍; _; _; ) DASHED LOW LINE +FE4E;FE4E;FE4E;005F;005F; # (﹎; ﹎; ﹎; _; _; ) CENTRELINE LOW LINE +FE4F;FE4F;FE4F;005F;005F; # (﹏; ﹏; ﹏; _; _; ) WAVY LOW LINE +FE50;FE50;FE50;002C;002C; # (﹐; ﹐; ﹐; ,; ,; ) SMALL COMMA +FE51;FE51;FE51;3001;3001; # (﹑; ﹑; ﹑; 、; 、; ) SMALL IDEOGRAPHIC COMMA +FE52;FE52;FE52;002E;002E; # (﹒; ﹒; ﹒; .; .; ) SMALL FULL STOP +FE54;FE54;FE54;003B;003B; # (﹔; ﹔; ﹔; ;; ;; ) SMALL SEMICOLON +FE55;FE55;FE55;003A;003A; # (﹕; ﹕; ﹕; :; :; ) SMALL COLON +FE56;FE56;FE56;003F;003F; # (﹖; ﹖; ﹖; ?; ?; ) SMALL QUESTION MARK +FE57;FE57;FE57;0021;0021; # (﹗; ﹗; ﹗; !; !; ) SMALL EXCLAMATION MARK +FE58;FE58;FE58;2014;2014; # (﹘; ﹘; ﹘; —; —; ) SMALL EM DASH +FE59;FE59;FE59;0028;0028; # (﹙; ﹙; ﹙; (; (; ) SMALL LEFT PARENTHESIS +FE5A;FE5A;FE5A;0029;0029; # (﹚; ﹚; ﹚; ); ); ) SMALL RIGHT PARENTHESIS +FE5B;FE5B;FE5B;007B;007B; # (﹛; ﹛; ﹛; {; {; ) SMALL LEFT CURLY BRACKET +FE5C;FE5C;FE5C;007D;007D; # (﹜; ﹜; ﹜; }; }; ) SMALL RIGHT CURLY BRACKET +FE5D;FE5D;FE5D;3014;3014; # (﹝; ﹝; ﹝; 〔; 〔; ) SMALL LEFT TORTOISE SHELL BRACKET +FE5E;FE5E;FE5E;3015;3015; # (﹞; ﹞; ﹞; 〕; 〕; ) SMALL RIGHT TORTOISE SHELL BRACKET +FE5F;FE5F;FE5F;0023;0023; # (﹟; ﹟; ﹟; #; #; ) SMALL NUMBER SIGN +FE60;FE60;FE60;0026;0026; # (﹠; ﹠; ﹠; &; &; ) SMALL AMPERSAND +FE61;FE61;FE61;002A;002A; # (﹡; ﹡; ﹡; *; *; ) SMALL ASTERISK +FE62;FE62;FE62;002B;002B; # (﹢; ﹢; ﹢; +; +; ) SMALL PLUS SIGN +FE63;FE63;FE63;002D;002D; # (﹣; ﹣; ﹣; -; -; ) SMALL HYPHEN-MINUS +FE64;FE64;FE64;003C;003C; # (﹤; ﹤; ﹤; <; <; ) SMALL LESS-THAN SIGN +FE65;FE65;FE65;003E;003E; # (﹥; ﹥; ﹥; >; >; ) SMALL GREATER-THAN SIGN +FE66;FE66;FE66;003D;003D; # (﹦; ﹦; ﹦; =; =; ) SMALL EQUALS SIGN +FE68;FE68;FE68;005C;005C; # (﹨; ﹨; ﹨; \; \; ) SMALL REVERSE SOLIDUS +FE69;FE69;FE69;0024;0024; # (﹩; ﹩; ﹩; $; $; ) SMALL DOLLAR SIGN +FE6A;FE6A;FE6A;0025;0025; # (﹪; ﹪; ﹪; %; %; ) SMALL PERCENT SIGN +FE6B;FE6B;FE6B;0040;0040; # (﹫; ﹫; ﹫; @; @; ) SMALL COMMERCIAL AT +FE70;FE70;FE70;0020 064B;0020 064B; # (ﹰ; ﹰ; ﹰ; ◌ً; ◌ً; ) ARABIC FATHATAN ISOLATED FORM +FE71;FE71;FE71;0640 064B;0640 064B; # (ﹱ; ﹱ; ﹱ; ـ◌ً; ـ◌ً; ) ARABIC TATWEEL WITH FATHATAN ABOVE +FE72;FE72;FE72;0020 064C;0020 064C; # (ﹲ; ﹲ; ﹲ; ◌ٌ; ◌ٌ; ) ARABIC DAMMATAN ISOLATED FORM +FE74;FE74;FE74;0020 064D;0020 064D; # (ﹴ; ﹴ; ﹴ; ◌ٍ; ◌ٍ; ) ARABIC KASRATAN ISOLATED FORM +FE76;FE76;FE76;0020 064E;0020 064E; # (ﹶ; ﹶ; ﹶ; ◌َ; ◌َ; ) ARABIC FATHA ISOLATED FORM +FE77;FE77;FE77;0640 064E;0640 064E; # (ﹷ; ﹷ; ﹷ; ـ◌َ; ـ◌َ; ) ARABIC FATHA MEDIAL FORM +FE78;FE78;FE78;0020 064F;0020 064F; # (ﹸ; ﹸ; ﹸ; ◌ُ; ◌ُ; ) ARABIC DAMMA ISOLATED FORM +FE79;FE79;FE79;0640 064F;0640 064F; # (ﹹ; ﹹ; ﹹ; ـ◌ُ; ـ◌ُ; ) ARABIC DAMMA MEDIAL FORM +FE7A;FE7A;FE7A;0020 0650;0020 0650; # (ﹺ; ﹺ; ﹺ; ◌ِ; ◌ِ; ) ARABIC KASRA ISOLATED FORM +FE7B;FE7B;FE7B;0640 0650;0640 0650; # (ﹻ; ﹻ; ﹻ; ـ◌ِ; ـ◌ِ; ) ARABIC KASRA MEDIAL FORM +FE7C;FE7C;FE7C;0020 0651;0020 0651; # (ﹼ; ﹼ; ﹼ; ◌ّ; ◌ّ; ) ARABIC SHADDA ISOLATED FORM +FE7D;FE7D;FE7D;0640 0651;0640 0651; # (ﹽ; ﹽ; ﹽ; ـ◌ّ; ـ◌ّ; ) ARABIC SHADDA MEDIAL FORM +FE7E;FE7E;FE7E;0020 0652;0020 0652; # (ﹾ; ﹾ; ﹾ; ◌ْ; ◌ْ; ) ARABIC SUKUN ISOLATED FORM +FE7F;FE7F;FE7F;0640 0652;0640 0652; # (ﹿ; ﹿ; ﹿ; ـ◌ْ; ـ◌ْ; ) ARABIC SUKUN MEDIAL FORM +FE80;FE80;FE80;0621;0621; # (ﺀ; ﺀ; ﺀ; ء; ء; ) ARABIC LETTER HAMZA ISOLATED FORM +FE81;FE81;FE81;0622;0627 0653; # (ﺁ; ﺁ; ﺁ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +FE82;FE82;FE82;0622;0627 0653; # (ﺂ; ﺂ; ﺂ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE83;FE83;FE83;0623;0627 0654; # (ﺃ; ﺃ; ﺃ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +FE84;FE84;FE84;0623;0627 0654; # (ﺄ; ﺄ; ﺄ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE85;FE85;FE85;0624;0648 0654; # (ﺅ; ﺅ; ﺅ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +FE86;FE86;FE86;0624;0648 0654; # (ﺆ; ﺆ; ﺆ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE87;FE87;FE87;0625;0627 0655; # (ﺇ; ﺇ; ﺇ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +FE88;FE88;FE88;0625;0627 0655; # (ﺈ; ﺈ; ﺈ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE89;FE89;FE89;0626;064A 0654; # (ﺉ; ﺉ; ﺉ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FE8A;FE8A;FE8A;0626;064A 0654; # (ﺊ; ﺊ; ﺊ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE8B;FE8B;FE8B;0626;064A 0654; # (ﺋ; ﺋ; ﺋ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C;FE8C;FE8C;0626;064A 0654; # (ﺌ; ﺌ; ﺌ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8D;FE8D;FE8D;0627;0627; # (ﺍ; ﺍ; ﺍ; ا; ا; ) ARABIC LETTER ALEF ISOLATED FORM +FE8E;FE8E;FE8E;0627;0627; # (ﺎ; ﺎ; ﺎ; ا; ا; ) ARABIC LETTER ALEF FINAL FORM +FE8F;FE8F;FE8F;0628;0628; # (ﺏ; ﺏ; ﺏ; ب; ب; ) ARABIC LETTER BEH ISOLATED FORM +FE90;FE90;FE90;0628;0628; # (ﺐ; ﺐ; ﺐ; ب; ب; ) ARABIC LETTER BEH FINAL FORM +FE91;FE91;FE91;0628;0628; # (ﺑ; ﺑ; ﺑ; ب; ب; ) ARABIC LETTER BEH INITIAL FORM +FE92;FE92;FE92;0628;0628; # (ﺒ; ﺒ; ﺒ; ب; ب; ) ARABIC LETTER BEH MEDIAL FORM +FE93;FE93;FE93;0629;0629; # (ﺓ; ﺓ; ﺓ; ة; ة; ) ARABIC LETTER TEH MARBUTA ISOLATED FORM +FE94;FE94;FE94;0629;0629; # (ﺔ; ﺔ; ﺔ; ة; ة; ) ARABIC LETTER TEH MARBUTA FINAL FORM +FE95;FE95;FE95;062A;062A; # (ﺕ; ﺕ; ﺕ; ت; ت; ) ARABIC LETTER TEH ISOLATED FORM +FE96;FE96;FE96;062A;062A; # (ﺖ; ﺖ; ﺖ; ت; ت; ) ARABIC LETTER TEH FINAL FORM +FE97;FE97;FE97;062A;062A; # (ﺗ; ﺗ; ﺗ; ت; ت; ) ARABIC LETTER TEH INITIAL FORM +FE98;FE98;FE98;062A;062A; # (ﺘ; ﺘ; ﺘ; ت; ت; ) ARABIC LETTER TEH MEDIAL FORM +FE99;FE99;FE99;062B;062B; # (ﺙ; ﺙ; ﺙ; ث; ث; ) ARABIC LETTER THEH ISOLATED FORM +FE9A;FE9A;FE9A;062B;062B; # (ﺚ; ﺚ; ﺚ; ث; ث; ) ARABIC LETTER THEH FINAL FORM +FE9B;FE9B;FE9B;062B;062B; # (ﺛ; ﺛ; ﺛ; ث; ث; ) ARABIC LETTER THEH INITIAL FORM +FE9C;FE9C;FE9C;062B;062B; # (ﺜ; ﺜ; ﺜ; ث; ث; ) ARABIC LETTER THEH MEDIAL FORM +FE9D;FE9D;FE9D;062C;062C; # (ﺝ; ﺝ; ﺝ; ج; ج; ) ARABIC LETTER JEEM ISOLATED FORM +FE9E;FE9E;FE9E;062C;062C; # (ﺞ; ﺞ; ﺞ; ج; ج; ) ARABIC LETTER JEEM FINAL FORM +FE9F;FE9F;FE9F;062C;062C; # (ﺟ; ﺟ; ﺟ; ج; ج; ) ARABIC LETTER JEEM INITIAL FORM +FEA0;FEA0;FEA0;062C;062C; # (ﺠ; ﺠ; ﺠ; ج; ج; ) ARABIC LETTER JEEM MEDIAL FORM +FEA1;FEA1;FEA1;062D;062D; # (ﺡ; ﺡ; ﺡ; ح; ح; ) ARABIC LETTER HAH ISOLATED FORM +FEA2;FEA2;FEA2;062D;062D; # (ﺢ; ﺢ; ﺢ; ح; ح; ) ARABIC LETTER HAH FINAL FORM +FEA3;FEA3;FEA3;062D;062D; # (ﺣ; ﺣ; ﺣ; ح; ح; ) ARABIC LETTER HAH INITIAL FORM +FEA4;FEA4;FEA4;062D;062D; # (ﺤ; ﺤ; ﺤ; ح; ح; ) ARABIC LETTER HAH MEDIAL FORM +FEA5;FEA5;FEA5;062E;062E; # (ﺥ; ﺥ; ﺥ; خ; خ; ) ARABIC LETTER KHAH ISOLATED FORM +FEA6;FEA6;FEA6;062E;062E; # (ﺦ; ﺦ; ﺦ; خ; خ; ) ARABIC LETTER KHAH FINAL FORM +FEA7;FEA7;FEA7;062E;062E; # (ﺧ; ﺧ; ﺧ; خ; خ; ) ARABIC LETTER KHAH INITIAL FORM +FEA8;FEA8;FEA8;062E;062E; # (ﺨ; ﺨ; ﺨ; خ; خ; ) ARABIC LETTER KHAH MEDIAL FORM +FEA9;FEA9;FEA9;062F;062F; # (ﺩ; ﺩ; ﺩ; د; د; ) ARABIC LETTER DAL ISOLATED FORM +FEAA;FEAA;FEAA;062F;062F; # (ﺪ; ﺪ; ﺪ; د; د; ) ARABIC LETTER DAL FINAL FORM +FEAB;FEAB;FEAB;0630;0630; # (ﺫ; ﺫ; ﺫ; ذ; ذ; ) ARABIC LETTER THAL ISOLATED FORM +FEAC;FEAC;FEAC;0630;0630; # (ﺬ; ﺬ; ﺬ; ذ; ذ; ) ARABIC LETTER THAL FINAL FORM +FEAD;FEAD;FEAD;0631;0631; # (ﺭ; ﺭ; ﺭ; ر; ر; ) ARABIC LETTER REH ISOLATED FORM +FEAE;FEAE;FEAE;0631;0631; # (ﺮ; ﺮ; ﺮ; ر; ر; ) ARABIC LETTER REH FINAL FORM +FEAF;FEAF;FEAF;0632;0632; # (ﺯ; ﺯ; ﺯ; ز; ز; ) ARABIC LETTER ZAIN ISOLATED FORM +FEB0;FEB0;FEB0;0632;0632; # (ﺰ; ﺰ; ﺰ; ز; ز; ) ARABIC LETTER ZAIN FINAL FORM +FEB1;FEB1;FEB1;0633;0633; # (ﺱ; ﺱ; ﺱ; س; س; ) ARABIC LETTER SEEN ISOLATED FORM +FEB2;FEB2;FEB2;0633;0633; # (ﺲ; ﺲ; ﺲ; س; س; ) ARABIC LETTER SEEN FINAL FORM +FEB3;FEB3;FEB3;0633;0633; # (ﺳ; ﺳ; ﺳ; س; س; ) ARABIC LETTER SEEN INITIAL FORM +FEB4;FEB4;FEB4;0633;0633; # (ﺴ; ﺴ; ﺴ; س; س; ) ARABIC LETTER SEEN MEDIAL FORM +FEB5;FEB5;FEB5;0634;0634; # (ﺵ; ﺵ; ﺵ; ش; ش; ) ARABIC LETTER SHEEN ISOLATED FORM +FEB6;FEB6;FEB6;0634;0634; # (ﺶ; ﺶ; ﺶ; ش; ش; ) ARABIC LETTER SHEEN FINAL FORM +FEB7;FEB7;FEB7;0634;0634; # (ﺷ; ﺷ; ﺷ; ش; ش; ) ARABIC LETTER SHEEN INITIAL FORM +FEB8;FEB8;FEB8;0634;0634; # (ﺸ; ﺸ; ﺸ; ش; ش; ) ARABIC LETTER SHEEN MEDIAL FORM +FEB9;FEB9;FEB9;0635;0635; # (ﺹ; ﺹ; ﺹ; ص; ص; ) ARABIC LETTER SAD ISOLATED FORM +FEBA;FEBA;FEBA;0635;0635; # (ﺺ; ﺺ; ﺺ; ص; ص; ) ARABIC LETTER SAD FINAL FORM +FEBB;FEBB;FEBB;0635;0635; # (ﺻ; ﺻ; ﺻ; ص; ص; ) ARABIC LETTER SAD INITIAL FORM +FEBC;FEBC;FEBC;0635;0635; # (ﺼ; ﺼ; ﺼ; ص; ص; ) ARABIC LETTER SAD MEDIAL FORM +FEBD;FEBD;FEBD;0636;0636; # (ﺽ; ﺽ; ﺽ; ض; ض; ) ARABIC LETTER DAD ISOLATED FORM +FEBE;FEBE;FEBE;0636;0636; # (ﺾ; ﺾ; ﺾ; ض; ض; ) ARABIC LETTER DAD FINAL FORM +FEBF;FEBF;FEBF;0636;0636; # (ﺿ; ﺿ; ﺿ; ض; ض; ) ARABIC LETTER DAD INITIAL FORM +FEC0;FEC0;FEC0;0636;0636; # (ﻀ; ﻀ; ﻀ; ض; ض; ) ARABIC LETTER DAD MEDIAL FORM +FEC1;FEC1;FEC1;0637;0637; # (ﻁ; ﻁ; ﻁ; ط; ط; ) ARABIC LETTER TAH ISOLATED FORM +FEC2;FEC2;FEC2;0637;0637; # (ﻂ; ﻂ; ﻂ; ط; ط; ) ARABIC LETTER TAH FINAL FORM +FEC3;FEC3;FEC3;0637;0637; # (ﻃ; ﻃ; ﻃ; ط; ط; ) ARABIC LETTER TAH INITIAL FORM +FEC4;FEC4;FEC4;0637;0637; # (ﻄ; ﻄ; ﻄ; ط; ط; ) ARABIC LETTER TAH MEDIAL FORM +FEC5;FEC5;FEC5;0638;0638; # (ﻅ; ﻅ; ﻅ; ظ; ظ; ) ARABIC LETTER ZAH ISOLATED FORM +FEC6;FEC6;FEC6;0638;0638; # (ﻆ; ﻆ; ﻆ; ظ; ظ; ) ARABIC LETTER ZAH FINAL FORM +FEC7;FEC7;FEC7;0638;0638; # (ﻇ; ﻇ; ﻇ; ظ; ظ; ) ARABIC LETTER ZAH INITIAL FORM +FEC8;FEC8;FEC8;0638;0638; # (ﻈ; ﻈ; ﻈ; ظ; ظ; ) ARABIC LETTER ZAH MEDIAL FORM +FEC9;FEC9;FEC9;0639;0639; # (ﻉ; ﻉ; ﻉ; ع; ع; ) ARABIC LETTER AIN ISOLATED FORM +FECA;FECA;FECA;0639;0639; # (ﻊ; ﻊ; ﻊ; ع; ع; ) ARABIC LETTER AIN FINAL FORM +FECB;FECB;FECB;0639;0639; # (ﻋ; ﻋ; ﻋ; ع; ع; ) ARABIC LETTER AIN INITIAL FORM +FECC;FECC;FECC;0639;0639; # (ﻌ; ﻌ; ﻌ; ع; ع; ) ARABIC LETTER AIN MEDIAL FORM +FECD;FECD;FECD;063A;063A; # (ﻍ; ﻍ; ﻍ; غ; غ; ) ARABIC LETTER GHAIN ISOLATED FORM +FECE;FECE;FECE;063A;063A; # (ﻎ; ﻎ; ﻎ; غ; غ; ) ARABIC LETTER GHAIN FINAL FORM +FECF;FECF;FECF;063A;063A; # (ﻏ; ﻏ; ﻏ; غ; غ; ) ARABIC LETTER GHAIN INITIAL FORM +FED0;FED0;FED0;063A;063A; # (ﻐ; ﻐ; ﻐ; غ; غ; ) ARABIC LETTER GHAIN MEDIAL FORM +FED1;FED1;FED1;0641;0641; # (ﻑ; ﻑ; ﻑ; ف; ف; ) ARABIC LETTER FEH ISOLATED FORM +FED2;FED2;FED2;0641;0641; # (ﻒ; ﻒ; ﻒ; ف; ف; ) ARABIC LETTER FEH FINAL FORM +FED3;FED3;FED3;0641;0641; # (ﻓ; ﻓ; ﻓ; ف; ف; ) ARABIC LETTER FEH INITIAL FORM +FED4;FED4;FED4;0641;0641; # (ﻔ; ﻔ; ﻔ; ف; ف; ) ARABIC LETTER FEH MEDIAL FORM +FED5;FED5;FED5;0642;0642; # (ﻕ; ﻕ; ﻕ; ق; ق; ) ARABIC LETTER QAF ISOLATED FORM +FED6;FED6;FED6;0642;0642; # (ﻖ; ﻖ; ﻖ; ق; ق; ) ARABIC LETTER QAF FINAL FORM +FED7;FED7;FED7;0642;0642; # (ﻗ; ﻗ; ﻗ; ق; ق; ) ARABIC LETTER QAF INITIAL FORM +FED8;FED8;FED8;0642;0642; # (ﻘ; ﻘ; ﻘ; ق; ق; ) ARABIC LETTER QAF MEDIAL FORM +FED9;FED9;FED9;0643;0643; # (ﻙ; ﻙ; ﻙ; ك; ك; ) ARABIC LETTER KAF ISOLATED FORM +FEDA;FEDA;FEDA;0643;0643; # (ﻚ; ﻚ; ﻚ; ك; ك; ) ARABIC LETTER KAF FINAL FORM +FEDB;FEDB;FEDB;0643;0643; # (ﻛ; ﻛ; ﻛ; ك; ك; ) ARABIC LETTER KAF INITIAL FORM +FEDC;FEDC;FEDC;0643;0643; # (ﻜ; ﻜ; ﻜ; ك; ك; ) ARABIC LETTER KAF MEDIAL FORM +FEDD;FEDD;FEDD;0644;0644; # (ﻝ; ﻝ; ﻝ; ل; ل; ) ARABIC LETTER LAM ISOLATED FORM +FEDE;FEDE;FEDE;0644;0644; # (ﻞ; ﻞ; ﻞ; ل; ل; ) ARABIC LETTER LAM FINAL FORM +FEDF;FEDF;FEDF;0644;0644; # (ﻟ; ﻟ; ﻟ; ل; ل; ) ARABIC LETTER LAM INITIAL FORM +FEE0;FEE0;FEE0;0644;0644; # (ﻠ; ﻠ; ﻠ; ل; ل; ) ARABIC LETTER LAM MEDIAL FORM +FEE1;FEE1;FEE1;0645;0645; # (ﻡ; ﻡ; ﻡ; م; م; ) ARABIC LETTER MEEM ISOLATED FORM +FEE2;FEE2;FEE2;0645;0645; # (ﻢ; ﻢ; ﻢ; م; م; ) ARABIC LETTER MEEM FINAL FORM +FEE3;FEE3;FEE3;0645;0645; # (ﻣ; ﻣ; ﻣ; م; م; ) ARABIC LETTER MEEM INITIAL FORM +FEE4;FEE4;FEE4;0645;0645; # (ﻤ; ﻤ; ﻤ; م; م; ) ARABIC LETTER MEEM MEDIAL FORM +FEE5;FEE5;FEE5;0646;0646; # (ﻥ; ﻥ; ﻥ; ن; ن; ) ARABIC LETTER NOON ISOLATED FORM +FEE6;FEE6;FEE6;0646;0646; # (ﻦ; ﻦ; ﻦ; ن; ن; ) ARABIC LETTER NOON FINAL FORM +FEE7;FEE7;FEE7;0646;0646; # (ﻧ; ﻧ; ﻧ; ن; ن; ) ARABIC LETTER NOON INITIAL FORM +FEE8;FEE8;FEE8;0646;0646; # (ﻨ; ﻨ; ﻨ; ن; ن; ) ARABIC LETTER NOON MEDIAL FORM +FEE9;FEE9;FEE9;0647;0647; # (ﻩ; ﻩ; ﻩ; ه; ه; ) ARABIC LETTER HEH ISOLATED FORM +FEEA;FEEA;FEEA;0647;0647; # (ﻪ; ﻪ; ﻪ; ه; ه; ) ARABIC LETTER HEH FINAL FORM +FEEB;FEEB;FEEB;0647;0647; # (ﻫ; ﻫ; ﻫ; ه; ه; ) ARABIC LETTER HEH INITIAL FORM +FEEC;FEEC;FEEC;0647;0647; # (ﻬ; ﻬ; ﻬ; ه; ه; ) ARABIC LETTER HEH MEDIAL FORM +FEED;FEED;FEED;0648;0648; # (ﻭ; ﻭ; ﻭ; و; و; ) ARABIC LETTER WAW ISOLATED FORM +FEEE;FEEE;FEEE;0648;0648; # (ﻮ; ﻮ; ﻮ; و; و; ) ARABIC LETTER WAW FINAL FORM +FEEF;FEEF;FEEF;0649;0649; # (ﻯ; ﻯ; ﻯ; ى; ى; ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FEF0;FEF0;FEF0;0649;0649; # (ﻰ; ﻰ; ﻰ; ى; ى; ) ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF1;FEF1;FEF1;064A;064A; # (ﻱ; ﻱ; ﻱ; ي; ي; ) ARABIC LETTER YEH ISOLATED FORM +FEF2;FEF2;FEF2;064A;064A; # (ﻲ; ﻲ; ﻲ; ي; ي; ) ARABIC LETTER YEH FINAL FORM +FEF3;FEF3;FEF3;064A;064A; # (ﻳ; ﻳ; ﻳ; ي; ي; ) ARABIC LETTER YEH INITIAL FORM +FEF4;FEF4;FEF4;064A;064A; # (ﻴ; ﻴ; ﻴ; ي; ي; ) ARABIC LETTER YEH MEDIAL FORM +FEF5;FEF5;FEF5;0644 0622;0644 0627 0653; # (ﻵ; ﻵ; ﻵ; لآ; لا◌ٓ; ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF6;FEF6;FEF6;0644 0622;0644 0627 0653; # (ﻶ; ﻶ; ﻶ; لآ; لا◌ٓ; ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF7;FEF7;FEF7;0644 0623;0644 0627 0654; # (ﻷ; ﻷ; ﻷ; لأ; لا◌ٔ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEF8;FEF8;FEF8;0644 0623;0644 0627 0654; # (ﻸ; ﻸ; ﻸ; لأ; لا◌ٔ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF9;FEF9;FEF9;0644 0625;0644 0627 0655; # (ﻹ; ﻹ; ﻹ; لإ; لا◌ٕ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFA;FEFA;FEFA;0644 0625;0644 0627 0655; # (ﻺ; ﻺ; ﻺ; لإ; لا◌ٕ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFB;FEFB;FEFB;0644 0627;0644 0627; # (ﻻ; ﻻ; ﻻ; لا; لا; ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FEFC;FEFC;FEFC;0644 0627;0644 0627; # (ﻼ; ﻼ; ﻼ; لا; لا; ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF01;FF01;FF01;0021;0021; # (!; !; !; !; !; ) FULLWIDTH EXCLAMATION MARK +FF02;FF02;FF02;0022;0022; # ("; "; "; "; "; ) FULLWIDTH QUOTATION MARK +FF03;FF03;FF03;0023;0023; # (#; #; #; #; #; ) FULLWIDTH NUMBER SIGN +FF04;FF04;FF04;0024;0024; # ($; $; $; $; $; ) FULLWIDTH DOLLAR SIGN +FF05;FF05;FF05;0025;0025; # (%; %; %; %; %; ) FULLWIDTH PERCENT SIGN +FF06;FF06;FF06;0026;0026; # (&; &; &; &; &; ) FULLWIDTH AMPERSAND +FF07;FF07;FF07;0027;0027; # ('; '; '; '; '; ) FULLWIDTH APOSTROPHE +FF08;FF08;FF08;0028;0028; # ((; (; (; (; (; ) FULLWIDTH LEFT PARENTHESIS +FF09;FF09;FF09;0029;0029; # (); ); ); ); ); ) FULLWIDTH RIGHT PARENTHESIS +FF0A;FF0A;FF0A;002A;002A; # (*; *; *; *; *; ) FULLWIDTH ASTERISK +FF0B;FF0B;FF0B;002B;002B; # (+; +; +; +; +; ) FULLWIDTH PLUS SIGN +FF0C;FF0C;FF0C;002C;002C; # (,; ,; ,; ,; ,; ) FULLWIDTH COMMA +FF0D;FF0D;FF0D;002D;002D; # (-; -; -; -; -; ) FULLWIDTH HYPHEN-MINUS +FF0E;FF0E;FF0E;002E;002E; # (.; .; .; .; .; ) FULLWIDTH FULL STOP +FF0F;FF0F;FF0F;002F;002F; # (/; /; /; /; /; ) FULLWIDTH SOLIDUS +FF10;FF10;FF10;0030;0030; # (0; 0; 0; 0; 0; ) FULLWIDTH DIGIT ZERO +FF11;FF11;FF11;0031;0031; # (1; 1; 1; 1; 1; ) FULLWIDTH DIGIT ONE +FF12;FF12;FF12;0032;0032; # (2; 2; 2; 2; 2; ) FULLWIDTH DIGIT TWO +FF13;FF13;FF13;0033;0033; # (3; 3; 3; 3; 3; ) FULLWIDTH DIGIT THREE +FF14;FF14;FF14;0034;0034; # (4; 4; 4; 4; 4; ) FULLWIDTH DIGIT FOUR +FF15;FF15;FF15;0035;0035; # (5; 5; 5; 5; 5; ) FULLWIDTH DIGIT FIVE +FF16;FF16;FF16;0036;0036; # (6; 6; 6; 6; 6; ) FULLWIDTH DIGIT SIX +FF17;FF17;FF17;0037;0037; # (7; 7; 7; 7; 7; ) FULLWIDTH DIGIT SEVEN +FF18;FF18;FF18;0038;0038; # (8; 8; 8; 8; 8; ) FULLWIDTH DIGIT EIGHT +FF19;FF19;FF19;0039;0039; # (9; 9; 9; 9; 9; ) FULLWIDTH DIGIT NINE +FF1A;FF1A;FF1A;003A;003A; # (:; :; :; :; :; ) FULLWIDTH COLON +FF1B;FF1B;FF1B;003B;003B; # (;; ;; ;; ;; ;; ) FULLWIDTH SEMICOLON +FF1C;FF1C;FF1C;003C;003C; # (<; <; <; <; <; ) FULLWIDTH LESS-THAN SIGN +FF1D;FF1D;FF1D;003D;003D; # (=; =; =; =; =; ) FULLWIDTH EQUALS SIGN +FF1E;FF1E;FF1E;003E;003E; # (>; >; >; >; >; ) FULLWIDTH GREATER-THAN SIGN +FF1F;FF1F;FF1F;003F;003F; # (?; ?; ?; ?; ?; ) FULLWIDTH QUESTION MARK +FF20;FF20;FF20;0040;0040; # (@; @; @; @; @; ) FULLWIDTH COMMERCIAL AT +FF21;FF21;FF21;0041;0041; # (A; A; A; A; A; ) FULLWIDTH LATIN CAPITAL LETTER A +FF22;FF22;FF22;0042;0042; # (B; B; B; B; B; ) FULLWIDTH LATIN CAPITAL LETTER B +FF23;FF23;FF23;0043;0043; # (C; C; C; C; C; ) FULLWIDTH LATIN CAPITAL LETTER C +FF24;FF24;FF24;0044;0044; # (D; D; D; D; D; ) FULLWIDTH LATIN CAPITAL LETTER D +FF25;FF25;FF25;0045;0045; # (E; E; E; E; E; ) FULLWIDTH LATIN CAPITAL LETTER E +FF26;FF26;FF26;0046;0046; # (F; F; F; F; F; ) FULLWIDTH LATIN CAPITAL LETTER F +FF27;FF27;FF27;0047;0047; # (G; G; G; G; G; ) FULLWIDTH LATIN CAPITAL LETTER G +FF28;FF28;FF28;0048;0048; # (H; H; H; H; H; ) FULLWIDTH LATIN CAPITAL LETTER H +FF29;FF29;FF29;0049;0049; # (I; I; I; I; I; ) FULLWIDTH LATIN CAPITAL LETTER I +FF2A;FF2A;FF2A;004A;004A; # (J; J; J; J; J; ) FULLWIDTH LATIN CAPITAL LETTER J +FF2B;FF2B;FF2B;004B;004B; # (K; K; K; K; K; ) FULLWIDTH LATIN CAPITAL LETTER K +FF2C;FF2C;FF2C;004C;004C; # (L; L; L; L; L; ) FULLWIDTH LATIN CAPITAL LETTER L +FF2D;FF2D;FF2D;004D;004D; # (M; M; M; M; M; ) FULLWIDTH LATIN CAPITAL LETTER M +FF2E;FF2E;FF2E;004E;004E; # (N; N; N; N; N; ) FULLWIDTH LATIN CAPITAL LETTER N +FF2F;FF2F;FF2F;004F;004F; # (O; O; O; O; O; ) FULLWIDTH LATIN CAPITAL LETTER O +FF30;FF30;FF30;0050;0050; # (P; P; P; P; P; ) FULLWIDTH LATIN CAPITAL LETTER P +FF31;FF31;FF31;0051;0051; # (Q; Q; Q; Q; Q; ) FULLWIDTH LATIN CAPITAL LETTER Q +FF32;FF32;FF32;0052;0052; # (R; R; R; R; R; ) FULLWIDTH LATIN CAPITAL LETTER R +FF33;FF33;FF33;0053;0053; # (S; S; S; S; S; ) FULLWIDTH LATIN CAPITAL LETTER S +FF34;FF34;FF34;0054;0054; # (T; T; T; T; T; ) FULLWIDTH LATIN CAPITAL LETTER T +FF35;FF35;FF35;0055;0055; # (U; U; U; U; U; ) FULLWIDTH LATIN CAPITAL LETTER U +FF36;FF36;FF36;0056;0056; # (V; V; V; V; V; ) FULLWIDTH LATIN CAPITAL LETTER V +FF37;FF37;FF37;0057;0057; # (W; W; W; W; W; ) FULLWIDTH LATIN CAPITAL LETTER W +FF38;FF38;FF38;0058;0058; # (X; X; X; X; X; ) FULLWIDTH LATIN CAPITAL LETTER X +FF39;FF39;FF39;0059;0059; # (Y; Y; Y; Y; Y; ) FULLWIDTH LATIN CAPITAL LETTER Y +FF3A;FF3A;FF3A;005A;005A; # (Z; Z; Z; Z; Z; ) FULLWIDTH LATIN CAPITAL LETTER Z +FF3B;FF3B;FF3B;005B;005B; # ([; [; [; [; [; ) FULLWIDTH LEFT SQUARE BRACKET +FF3C;FF3C;FF3C;005C;005C; # (\; \; \; \; \; ) FULLWIDTH REVERSE SOLIDUS +FF3D;FF3D;FF3D;005D;005D; # (]; ]; ]; ]; ]; ) FULLWIDTH RIGHT SQUARE BRACKET +FF3E;FF3E;FF3E;005E;005E; # (^; ^; ^; ^; ^; ) FULLWIDTH CIRCUMFLEX ACCENT +FF3F;FF3F;FF3F;005F;005F; # (_; _; _; _; _; ) FULLWIDTH LOW LINE +FF40;FF40;FF40;0060;0060; # (`; `; `; `; `; ) FULLWIDTH GRAVE ACCENT +FF41;FF41;FF41;0061;0061; # (a; a; a; a; a; ) FULLWIDTH LATIN SMALL LETTER A +FF42;FF42;FF42;0062;0062; # (b; b; b; b; b; ) FULLWIDTH LATIN SMALL LETTER B +FF43;FF43;FF43;0063;0063; # (c; c; c; c; c; ) FULLWIDTH LATIN SMALL LETTER C +FF44;FF44;FF44;0064;0064; # (d; d; d; d; d; ) FULLWIDTH LATIN SMALL LETTER D +FF45;FF45;FF45;0065;0065; # (e; e; e; e; e; ) FULLWIDTH LATIN SMALL LETTER E +FF46;FF46;FF46;0066;0066; # (f; f; f; f; f; ) FULLWIDTH LATIN SMALL LETTER F +FF47;FF47;FF47;0067;0067; # (g; g; g; g; g; ) FULLWIDTH LATIN SMALL LETTER G +FF48;FF48;FF48;0068;0068; # (h; h; h; h; h; ) FULLWIDTH LATIN SMALL LETTER H +FF49;FF49;FF49;0069;0069; # (i; i; i; i; i; ) FULLWIDTH LATIN SMALL LETTER I +FF4A;FF4A;FF4A;006A;006A; # (j; j; j; j; j; ) FULLWIDTH LATIN SMALL LETTER J +FF4B;FF4B;FF4B;006B;006B; # (k; k; k; k; k; ) FULLWIDTH LATIN SMALL LETTER K +FF4C;FF4C;FF4C;006C;006C; # (l; l; l; l; l; ) FULLWIDTH LATIN SMALL LETTER L +FF4D;FF4D;FF4D;006D;006D; # (m; m; m; m; m; ) FULLWIDTH LATIN SMALL LETTER M +FF4E;FF4E;FF4E;006E;006E; # (n; n; n; n; n; ) FULLWIDTH LATIN SMALL LETTER N +FF4F;FF4F;FF4F;006F;006F; # (o; o; o; o; o; ) FULLWIDTH LATIN SMALL LETTER O +FF50;FF50;FF50;0070;0070; # (p; p; p; p; p; ) FULLWIDTH LATIN SMALL LETTER P +FF51;FF51;FF51;0071;0071; # (q; q; q; q; q; ) FULLWIDTH LATIN SMALL LETTER Q +FF52;FF52;FF52;0072;0072; # (r; r; r; r; r; ) FULLWIDTH LATIN SMALL LETTER R +FF53;FF53;FF53;0073;0073; # (s; s; s; s; s; ) FULLWIDTH LATIN SMALL LETTER S +FF54;FF54;FF54;0074;0074; # (t; t; t; t; t; ) FULLWIDTH LATIN SMALL LETTER T +FF55;FF55;FF55;0075;0075; # (u; u; u; u; u; ) FULLWIDTH LATIN SMALL LETTER U +FF56;FF56;FF56;0076;0076; # (v; v; v; v; v; ) FULLWIDTH LATIN SMALL LETTER V +FF57;FF57;FF57;0077;0077; # (w; w; w; w; w; ) FULLWIDTH LATIN SMALL LETTER W +FF58;FF58;FF58;0078;0078; # (x; x; x; x; x; ) FULLWIDTH LATIN SMALL LETTER X +FF59;FF59;FF59;0079;0079; # (y; y; y; y; y; ) FULLWIDTH LATIN SMALL LETTER Y +FF5A;FF5A;FF5A;007A;007A; # (z; z; z; z; z; ) FULLWIDTH LATIN SMALL LETTER Z +FF5B;FF5B;FF5B;007B;007B; # ({; {; {; {; {; ) FULLWIDTH LEFT CURLY BRACKET +FF5C;FF5C;FF5C;007C;007C; # (|; |; |; |; |; ) FULLWIDTH VERTICAL LINE +FF5D;FF5D;FF5D;007D;007D; # (}; }; }; }; }; ) FULLWIDTH RIGHT CURLY BRACKET +FF5E;FF5E;FF5E;007E;007E; # (~; ~; ~; ~; ~; ) FULLWIDTH TILDE +FF5F;FF5F;FF5F;2985;2985; # (⦅; ⦅; ⦅; ⦅; ⦅; ) FULLWIDTH LEFT WHITE PARENTHESIS +FF60;FF60;FF60;2986;2986; # (⦆; ⦆; ⦆; ⦆; ⦆; ) FULLWIDTH RIGHT WHITE PARENTHESIS +FF61;FF61;FF61;3002;3002; # (。; 。; 。; 。; 。; ) HALFWIDTH IDEOGRAPHIC FULL STOP +FF62;FF62;FF62;300C;300C; # (「; 「; 「; 「; 「; ) HALFWIDTH LEFT CORNER BRACKET +FF63;FF63;FF63;300D;300D; # (」; 」; 」; 」; 」; ) HALFWIDTH RIGHT CORNER BRACKET +FF64;FF64;FF64;3001;3001; # (、; 、; 、; 、; 、; ) HALFWIDTH IDEOGRAPHIC COMMA +FF65;FF65;FF65;30FB;30FB; # (・; ・; ・; ・; ・; ) HALFWIDTH KATAKANA MIDDLE DOT +FF66;FF66;FF66;30F2;30F2; # (ヲ; ヲ; ヲ; ヲ; ヲ; ) HALFWIDTH KATAKANA LETTER WO +FF67;FF67;FF67;30A1;30A1; # (ァ; ァ; ァ; ァ; ァ; ) HALFWIDTH KATAKANA LETTER SMALL A +FF68;FF68;FF68;30A3;30A3; # (ィ; ィ; ィ; ィ; ィ; ) HALFWIDTH KATAKANA LETTER SMALL I +FF69;FF69;FF69;30A5;30A5; # (ゥ; ゥ; ゥ; ゥ; ゥ; ) HALFWIDTH KATAKANA LETTER SMALL U +FF6A;FF6A;FF6A;30A7;30A7; # (ェ; ェ; ェ; ェ; ェ; ) HALFWIDTH KATAKANA LETTER SMALL E +FF6B;FF6B;FF6B;30A9;30A9; # (ォ; ォ; ォ; ォ; ォ; ) HALFWIDTH KATAKANA LETTER SMALL O +FF6C;FF6C;FF6C;30E3;30E3; # (ャ; ャ; ャ; ャ; ャ; ) HALFWIDTH KATAKANA LETTER SMALL YA +FF6D;FF6D;FF6D;30E5;30E5; # (ュ; ュ; ュ; ュ; ュ; ) HALFWIDTH KATAKANA LETTER SMALL YU +FF6E;FF6E;FF6E;30E7;30E7; # (ョ; ョ; ョ; ョ; ョ; ) HALFWIDTH KATAKANA LETTER SMALL YO +FF6F;FF6F;FF6F;30C3;30C3; # (ッ; ッ; ッ; ッ; ッ; ) HALFWIDTH KATAKANA LETTER SMALL TU +FF70;FF70;FF70;30FC;30FC; # (ー; ー; ー; ー; ー; ) HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71;FF71;FF71;30A2;30A2; # (ア; ア; ア; ア; ア; ) HALFWIDTH KATAKANA LETTER A +FF72;FF72;FF72;30A4;30A4; # (イ; イ; イ; イ; イ; ) HALFWIDTH KATAKANA LETTER I +FF73;FF73;FF73;30A6;30A6; # (ウ; ウ; ウ; ウ; ウ; ) HALFWIDTH KATAKANA LETTER U +FF74;FF74;FF74;30A8;30A8; # (エ; エ; エ; エ; エ; ) HALFWIDTH KATAKANA LETTER E +FF75;FF75;FF75;30AA;30AA; # (オ; オ; オ; オ; オ; ) HALFWIDTH KATAKANA LETTER O +FF76;FF76;FF76;30AB;30AB; # (カ; カ; カ; カ; カ; ) HALFWIDTH KATAKANA LETTER KA +FF77;FF77;FF77;30AD;30AD; # (キ; キ; キ; キ; キ; ) HALFWIDTH KATAKANA LETTER KI +FF78;FF78;FF78;30AF;30AF; # (ク; ク; ク; ク; ク; ) HALFWIDTH KATAKANA LETTER KU +FF79;FF79;FF79;30B1;30B1; # (ケ; ケ; ケ; ケ; ケ; ) HALFWIDTH KATAKANA LETTER KE +FF7A;FF7A;FF7A;30B3;30B3; # (コ; コ; コ; コ; コ; ) HALFWIDTH KATAKANA LETTER KO +FF7B;FF7B;FF7B;30B5;30B5; # (サ; サ; サ; サ; サ; ) HALFWIDTH KATAKANA LETTER SA +FF7C;FF7C;FF7C;30B7;30B7; # (シ; シ; シ; シ; シ; ) HALFWIDTH KATAKANA LETTER SI +FF7D;FF7D;FF7D;30B9;30B9; # (ス; ス; ス; ス; ス; ) HALFWIDTH KATAKANA LETTER SU +FF7E;FF7E;FF7E;30BB;30BB; # (セ; セ; セ; セ; セ; ) HALFWIDTH KATAKANA LETTER SE +FF7F;FF7F;FF7F;30BD;30BD; # (ソ; ソ; ソ; ソ; ソ; ) HALFWIDTH KATAKANA LETTER SO +FF80;FF80;FF80;30BF;30BF; # (タ; タ; タ; タ; タ; ) HALFWIDTH KATAKANA LETTER TA +FF81;FF81;FF81;30C1;30C1; # (チ; チ; チ; チ; チ; ) HALFWIDTH KATAKANA LETTER TI +FF82;FF82;FF82;30C4;30C4; # (ツ; ツ; ツ; ツ; ツ; ) HALFWIDTH KATAKANA LETTER TU +FF83;FF83;FF83;30C6;30C6; # (テ; テ; テ; テ; テ; ) HALFWIDTH KATAKANA LETTER TE +FF84;FF84;FF84;30C8;30C8; # (ト; ト; ト; ト; ト; ) HALFWIDTH KATAKANA LETTER TO +FF85;FF85;FF85;30CA;30CA; # (ナ; ナ; ナ; ナ; ナ; ) HALFWIDTH KATAKANA LETTER NA +FF86;FF86;FF86;30CB;30CB; # (ニ; ニ; ニ; ニ; ニ; ) HALFWIDTH KATAKANA LETTER NI +FF87;FF87;FF87;30CC;30CC; # (ヌ; ヌ; ヌ; ヌ; ヌ; ) HALFWIDTH KATAKANA LETTER NU +FF88;FF88;FF88;30CD;30CD; # (ネ; ネ; ネ; ネ; ネ; ) HALFWIDTH KATAKANA LETTER NE +FF89;FF89;FF89;30CE;30CE; # (ノ; ノ; ノ; ノ; ノ; ) HALFWIDTH KATAKANA LETTER NO +FF8A;FF8A;FF8A;30CF;30CF; # (ハ; ハ; ハ; ハ; ハ; ) HALFWIDTH KATAKANA LETTER HA +FF8B;FF8B;FF8B;30D2;30D2; # (ヒ; ヒ; ヒ; ヒ; ヒ; ) HALFWIDTH KATAKANA LETTER HI +FF8C;FF8C;FF8C;30D5;30D5; # (フ; フ; フ; フ; フ; ) HALFWIDTH KATAKANA LETTER HU +FF8D;FF8D;FF8D;30D8;30D8; # (ヘ; ヘ; ヘ; ヘ; ヘ; ) HALFWIDTH KATAKANA LETTER HE +FF8E;FF8E;FF8E;30DB;30DB; # (ホ; ホ; ホ; ホ; ホ; ) HALFWIDTH KATAKANA LETTER HO +FF8F;FF8F;FF8F;30DE;30DE; # (マ; マ; マ; マ; マ; ) HALFWIDTH KATAKANA LETTER MA +FF90;FF90;FF90;30DF;30DF; # (ミ; ミ; ミ; ミ; ミ; ) HALFWIDTH KATAKANA LETTER MI +FF91;FF91;FF91;30E0;30E0; # (ム; ム; ム; ム; ム; ) HALFWIDTH KATAKANA LETTER MU +FF92;FF92;FF92;30E1;30E1; # (メ; メ; メ; メ; メ; ) HALFWIDTH KATAKANA LETTER ME +FF93;FF93;FF93;30E2;30E2; # (モ; モ; モ; モ; モ; ) HALFWIDTH KATAKANA LETTER MO +FF94;FF94;FF94;30E4;30E4; # (ヤ; ヤ; ヤ; ヤ; ヤ; ) HALFWIDTH KATAKANA LETTER YA +FF95;FF95;FF95;30E6;30E6; # (ユ; ユ; ユ; ユ; ユ; ) HALFWIDTH KATAKANA LETTER YU +FF96;FF96;FF96;30E8;30E8; # (ヨ; ヨ; ヨ; ヨ; ヨ; ) HALFWIDTH KATAKANA LETTER YO +FF97;FF97;FF97;30E9;30E9; # (ラ; ラ; ラ; ラ; ラ; ) HALFWIDTH KATAKANA LETTER RA +FF98;FF98;FF98;30EA;30EA; # (リ; リ; リ; リ; リ; ) HALFWIDTH KATAKANA LETTER RI +FF99;FF99;FF99;30EB;30EB; # (ル; ル; ル; ル; ル; ) HALFWIDTH KATAKANA LETTER RU +FF9A;FF9A;FF9A;30EC;30EC; # (レ; レ; レ; レ; レ; ) HALFWIDTH KATAKANA LETTER RE +FF9B;FF9B;FF9B;30ED;30ED; # (ロ; ロ; ロ; ロ; ロ; ) HALFWIDTH KATAKANA LETTER RO +FF9C;FF9C;FF9C;30EF;30EF; # (ワ; ワ; ワ; ワ; ワ; ) HALFWIDTH KATAKANA LETTER WA +FF9D;FF9D;FF9D;30F3;30F3; # (ン; ン; ン; ン; ン; ) HALFWIDTH KATAKANA LETTER N +FF9E;FF9E;FF9E;3099;3099; # (゙; ゙; ゙; ◌゙; ◌゙; ) HALFWIDTH KATAKANA VOICED SOUND MARK +FF9F;FF9F;FF9F;309A;309A; # (゚; ゚; ゚; ◌゚; ◌゚; ) HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0;FFA0;FFA0;1160;1160; # (ᅠ; ᅠ; ᅠ; ᅠ; ᅠ; ) HALFWIDTH HANGUL FILLER +FFA1;FFA1;FFA1;1100;1100; # (ᄀ; ᄀ; ᄀ; ᄀ; ᄀ; ) HALFWIDTH HANGUL LETTER KIYEOK +FFA2;FFA2;FFA2;1101;1101; # (ᄁ; ᄁ; ᄁ; ᄁ; ᄁ; ) HALFWIDTH HANGUL LETTER SSANGKIYEOK +FFA3;FFA3;FFA3;11AA;11AA; # (ᆪ; ᆪ; ᆪ; ᆪ; ᆪ; ) HALFWIDTH HANGUL LETTER KIYEOK-SIOS +FFA4;FFA4;FFA4;1102;1102; # (ᄂ; ᄂ; ᄂ; ᄂ; ᄂ; ) HALFWIDTH HANGUL LETTER NIEUN +FFA5;FFA5;FFA5;11AC;11AC; # (ᆬ; ᆬ; ᆬ; ᆬ; ᆬ; ) HALFWIDTH HANGUL LETTER NIEUN-CIEUC +FFA6;FFA6;FFA6;11AD;11AD; # (ᆭ; ᆭ; ᆭ; ᆭ; ᆭ; ) HALFWIDTH HANGUL LETTER NIEUN-HIEUH +FFA7;FFA7;FFA7;1103;1103; # (ᄃ; ᄃ; ᄃ; ᄃ; ᄃ; ) HALFWIDTH HANGUL LETTER TIKEUT +FFA8;FFA8;FFA8;1104;1104; # (ᄄ; ᄄ; ᄄ; ᄄ; ᄄ; ) HALFWIDTH HANGUL LETTER SSANGTIKEUT +FFA9;FFA9;FFA9;1105;1105; # (ᄅ; ᄅ; ᄅ; ᄅ; ᄅ; ) HALFWIDTH HANGUL LETTER RIEUL +FFAA;FFAA;FFAA;11B0;11B0; # (ᆰ; ᆰ; ᆰ; ᆰ; ᆰ; ) HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +FFAB;FFAB;FFAB;11B1;11B1; # (ᆱ; ᆱ; ᆱ; ᆱ; ᆱ; ) HALFWIDTH HANGUL LETTER RIEUL-MIEUM +FFAC;FFAC;FFAC;11B2;11B2; # (ᆲ; ᆲ; ᆲ; ᆲ; ᆲ; ) HALFWIDTH HANGUL LETTER RIEUL-PIEUP +FFAD;FFAD;FFAD;11B3;11B3; # (ᆳ; ᆳ; ᆳ; ᆳ; ᆳ; ) HALFWIDTH HANGUL LETTER RIEUL-SIOS +FFAE;FFAE;FFAE;11B4;11B4; # (ᆴ; ᆴ; ᆴ; ᆴ; ᆴ; ) HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +FFAF;FFAF;FFAF;11B5;11B5; # (ᆵ; ᆵ; ᆵ; ᆵ; ᆵ; ) HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +FFB0;FFB0;FFB0;111A;111A; # (ᄚ; ᄚ; ᄚ; ᄚ; ᄚ; ) HALFWIDTH HANGUL LETTER RIEUL-HIEUH +FFB1;FFB1;FFB1;1106;1106; # (ᄆ; ᄆ; ᄆ; ᄆ; ᄆ; ) HALFWIDTH HANGUL LETTER MIEUM +FFB2;FFB2;FFB2;1107;1107; # (ᄇ; ᄇ; ᄇ; ᄇ; ᄇ; ) HALFWIDTH HANGUL LETTER PIEUP +FFB3;FFB3;FFB3;1108;1108; # (ᄈ; ᄈ; ᄈ; ᄈ; ᄈ; ) HALFWIDTH HANGUL LETTER SSANGPIEUP +FFB4;FFB4;FFB4;1121;1121; # (ᄡ; ᄡ; ᄡ; ᄡ; ᄡ; ) HALFWIDTH HANGUL LETTER PIEUP-SIOS +FFB5;FFB5;FFB5;1109;1109; # (ᄉ; ᄉ; ᄉ; ᄉ; ᄉ; ) HALFWIDTH HANGUL LETTER SIOS +FFB6;FFB6;FFB6;110A;110A; # (ᄊ; ᄊ; ᄊ; ᄊ; ᄊ; ) HALFWIDTH HANGUL LETTER SSANGSIOS +FFB7;FFB7;FFB7;110B;110B; # (ᄋ; ᄋ; ᄋ; ᄋ; ᄋ; ) HALFWIDTH HANGUL LETTER IEUNG +FFB8;FFB8;FFB8;110C;110C; # (ᄌ; ᄌ; ᄌ; ᄌ; ᄌ; ) HALFWIDTH HANGUL LETTER CIEUC +FFB9;FFB9;FFB9;110D;110D; # (ᄍ; ᄍ; ᄍ; ᄍ; ᄍ; ) HALFWIDTH HANGUL LETTER SSANGCIEUC +FFBA;FFBA;FFBA;110E;110E; # (ᄎ; ᄎ; ᄎ; ᄎ; ᄎ; ) HALFWIDTH HANGUL LETTER CHIEUCH +FFBB;FFBB;FFBB;110F;110F; # (ᄏ; ᄏ; ᄏ; ᄏ; ᄏ; ) HALFWIDTH HANGUL LETTER KHIEUKH +FFBC;FFBC;FFBC;1110;1110; # (ᄐ; ᄐ; ᄐ; ᄐ; ᄐ; ) HALFWIDTH HANGUL LETTER THIEUTH +FFBD;FFBD;FFBD;1111;1111; # (ᄑ; ᄑ; ᄑ; ᄑ; ᄑ; ) HALFWIDTH HANGUL LETTER PHIEUPH +FFBE;FFBE;FFBE;1112;1112; # (ᄒ; ᄒ; ᄒ; ᄒ; ᄒ; ) HALFWIDTH HANGUL LETTER HIEUH +FFC2;FFC2;FFC2;1161;1161; # (ᅡ; ᅡ; ᅡ; ᅡ; ᅡ; ) HALFWIDTH HANGUL LETTER A +FFC3;FFC3;FFC3;1162;1162; # (ᅢ; ᅢ; ᅢ; ᅢ; ᅢ; ) HALFWIDTH HANGUL LETTER AE +FFC4;FFC4;FFC4;1163;1163; # (ᅣ; ᅣ; ᅣ; ᅣ; ᅣ; ) HALFWIDTH HANGUL LETTER YA +FFC5;FFC5;FFC5;1164;1164; # (ᅤ; ᅤ; ᅤ; ᅤ; ᅤ; ) HALFWIDTH HANGUL LETTER YAE +FFC6;FFC6;FFC6;1165;1165; # (ᅥ; ᅥ; ᅥ; ᅥ; ᅥ; ) HALFWIDTH HANGUL LETTER EO +FFC7;FFC7;FFC7;1166;1166; # (ᅦ; ᅦ; ᅦ; ᅦ; ᅦ; ) HALFWIDTH HANGUL LETTER E +FFCA;FFCA;FFCA;1167;1167; # (ᅧ; ᅧ; ᅧ; ᅧ; ᅧ; ) HALFWIDTH HANGUL LETTER YEO +FFCB;FFCB;FFCB;1168;1168; # (ᅨ; ᅨ; ᅨ; ᅨ; ᅨ; ) HALFWIDTH HANGUL LETTER YE +FFCC;FFCC;FFCC;1169;1169; # (ᅩ; ᅩ; ᅩ; ᅩ; ᅩ; ) HALFWIDTH HANGUL LETTER O +FFCD;FFCD;FFCD;116A;116A; # (ᅪ; ᅪ; ᅪ; ᅪ; ᅪ; ) HALFWIDTH HANGUL LETTER WA +FFCE;FFCE;FFCE;116B;116B; # (ᅫ; ᅫ; ᅫ; ᅫ; ᅫ; ) HALFWIDTH HANGUL LETTER WAE +FFCF;FFCF;FFCF;116C;116C; # (ᅬ; ᅬ; ᅬ; ᅬ; ᅬ; ) HALFWIDTH HANGUL LETTER OE +FFD2;FFD2;FFD2;116D;116D; # (ᅭ; ᅭ; ᅭ; ᅭ; ᅭ; ) HALFWIDTH HANGUL LETTER YO +FFD3;FFD3;FFD3;116E;116E; # (ᅮ; ᅮ; ᅮ; ᅮ; ᅮ; ) HALFWIDTH HANGUL LETTER U +FFD4;FFD4;FFD4;116F;116F; # (ᅯ; ᅯ; ᅯ; ᅯ; ᅯ; ) HALFWIDTH HANGUL LETTER WEO +FFD5;FFD5;FFD5;1170;1170; # (ᅰ; ᅰ; ᅰ; ᅰ; ᅰ; ) HALFWIDTH HANGUL LETTER WE +FFD6;FFD6;FFD6;1171;1171; # (ᅱ; ᅱ; ᅱ; ᅱ; ᅱ; ) HALFWIDTH HANGUL LETTER WI +FFD7;FFD7;FFD7;1172;1172; # (ᅲ; ᅲ; ᅲ; ᅲ; ᅲ; ) HALFWIDTH HANGUL LETTER YU +FFDA;FFDA;FFDA;1173;1173; # (ᅳ; ᅳ; ᅳ; ᅳ; ᅳ; ) HALFWIDTH HANGUL LETTER EU +FFDB;FFDB;FFDB;1174;1174; # (ᅴ; ᅴ; ᅴ; ᅴ; ᅴ; ) HALFWIDTH HANGUL LETTER YI +FFDC;FFDC;FFDC;1175;1175; # (ᅵ; ᅵ; ᅵ; ᅵ; ᅵ; ) HALFWIDTH HANGUL LETTER I +FFE0;FFE0;FFE0;00A2;00A2; # (¢; ¢; ¢; ¢; ¢; ) FULLWIDTH CENT SIGN +FFE1;FFE1;FFE1;00A3;00A3; # (£; £; £; £; £; ) FULLWIDTH POUND SIGN +FFE2;FFE2;FFE2;00AC;00AC; # (¬; ¬; ¬; ¬; ¬; ) FULLWIDTH NOT SIGN +FFE3;FFE3;FFE3;0020 0304;0020 0304; # ( ̄;  ̄;  ̄; ◌̄; ◌̄; ) FULLWIDTH MACRON +FFE4;FFE4;FFE4;00A6;00A6; # (¦; ¦; ¦; ¦; ¦; ) FULLWIDTH BROKEN BAR +FFE5;FFE5;FFE5;00A5;00A5; # (¥; ¥; ¥; ¥; ¥; ) FULLWIDTH YEN SIGN +FFE6;FFE6;FFE6;20A9;20A9; # (₩; ₩; ₩; ₩; ₩; ) FULLWIDTH WON SIGN +FFE8;FFE8;FFE8;2502;2502; # (│; │; │; │; │; ) HALFWIDTH FORMS LIGHT VERTICAL +FFE9;FFE9;FFE9;2190;2190; # (←; ←; ←; ←; ←; ) HALFWIDTH LEFTWARDS ARROW +FFEA;FFEA;FFEA;2191;2191; # (↑; ↑; ↑; ↑; ↑; ) HALFWIDTH UPWARDS ARROW +FFEB;FFEB;FFEB;2192;2192; # (→; →; →; →; →; ) HALFWIDTH RIGHTWARDS ARROW +FFEC;FFEC;FFEC;2193;2193; # (↓; ↓; ↓; ↓; ↓; ) HALFWIDTH DOWNWARDS ARROW +FFED;FFED;FFED;25A0;25A0; # (■; ■; ■; ■; ■; ) HALFWIDTH BLACK SQUARE +FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE +1D15E;1D157 1D165;1D157 1D165;1D157 1D165;1D157 1D165; # (𝅗𝅥𝅗𝅥; 𝅗𝅗𝅥𝅥; 𝅗𝅗𝅥𝅥; 𝅗𝅗𝅥𝅥; 𝅗𝅗𝅥𝅥; ) MUSICAL SYMBOL HALF NOTE +1D15F;1D158 1D165;1D158 1D165;1D158 1D165;1D158 1D165; # (𝅘𝅥𝅘𝅥; 𝅘𝅘𝅥𝅥; 𝅘𝅘𝅥𝅥; 𝅘𝅘𝅥𝅥; 𝅘𝅘𝅥𝅥; ) MUSICAL SYMBOL QUARTER NOTE +1D160;1D158 1D165 1D16E;1D158 1D165 1D16E;1D158 1D165 1D16E;1D158 1D165 1D16E; # (𝅘𝅥𝅮𝅘𝅥𝅮; 𝅘𝅘𝅥𝅥𝅮𝅮; 𝅘𝅘𝅥𝅥𝅮𝅮; 𝅘𝅘𝅥𝅥𝅮𝅮; 𝅘𝅘𝅥𝅥𝅮𝅮; ) MUSICAL SYMBOL EIGHTH NOTE +1D161;1D158 1D165 1D16F;1D158 1D165 1D16F;1D158 1D165 1D16F;1D158 1D165 1D16F; # (𝅘𝅥𝅯𝅘𝅥𝅯; 𝅘𝅘𝅥𝅥𝅯𝅯; 𝅘𝅘𝅥𝅥𝅯𝅯; 𝅘𝅘𝅥𝅥𝅯𝅯; 𝅘𝅘𝅥𝅥𝅯𝅯; ) MUSICAL SYMBOL SIXTEENTH NOTE +1D162;1D158 1D165 1D170;1D158 1D165 1D170;1D158 1D165 1D170;1D158 1D165 1D170; # (𝅘𝅥𝅰𝅘𝅥𝅰; 𝅘𝅘𝅥𝅥𝅰𝅰; 𝅘𝅘𝅥𝅥𝅰𝅰; 𝅘𝅘𝅥𝅥𝅰𝅰; 𝅘𝅘𝅥𝅥𝅰𝅰; ) MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163;1D158 1D165 1D171;1D158 1D165 1D171;1D158 1D165 1D171;1D158 1D165 1D171; # (𝅘𝅥𝅱𝅘𝅥𝅱; 𝅘𝅘𝅥𝅥𝅱𝅱; 𝅘𝅘𝅥𝅥𝅱𝅱; 𝅘𝅘𝅥𝅥𝅱𝅱; 𝅘𝅘𝅥𝅥𝅱𝅱; ) MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164;1D158 1D165 1D172;1D158 1D165 1D172;1D158 1D165 1D172;1D158 1D165 1D172; # (𝅘𝅥𝅲𝅘𝅥𝅲; 𝅘𝅘𝅥𝅥𝅲𝅲; 𝅘𝅘𝅥𝅥𝅲𝅲; 𝅘𝅘𝅥𝅥𝅲𝅲; 𝅘𝅘𝅥𝅥𝅲𝅲; ) MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D1BB;1D1B9 1D165;1D1B9 1D165;1D1B9 1D165;1D1B9 1D165; # (𝆹𝅥𝆹𝅥; 𝆹𝆹𝅥𝅥; 𝆹𝆹𝅥𝅥; 𝆹𝆹𝅥𝅥; 𝆹𝆹𝅥𝅥; ) MUSICAL SYMBOL MINIMA +1D1BC;1D1BA 1D165;1D1BA 1D165;1D1BA 1D165;1D1BA 1D165; # (𝆺𝅥𝆺𝅥; 𝆺𝆺𝅥𝅥; 𝆺𝆺𝅥𝅥; 𝆺𝆺𝅥𝅥; 𝆺𝆺𝅥𝅥; ) MUSICAL SYMBOL MINIMA BLACK +1D1BD;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E; # (𝆹𝅥𝅮𝆹𝅥𝅮; 𝆹𝆹𝅥𝅥𝅮𝅮; 𝆹𝆹𝅥𝅥𝅮𝅮; 𝆹𝆹𝅥𝅥𝅮𝅮; 𝆹𝆹𝅥𝅥𝅮𝅮; ) MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E; # (𝆺𝅥𝅮𝆺𝅥𝅮; 𝆺𝆺𝅥𝅥𝅮𝅮; 𝆺𝆺𝅥𝅥𝅮𝅮; 𝆺𝆺𝅥𝅥𝅮𝅮; 𝆺𝆺𝅥𝅥𝅮𝅮; ) MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F; # (𝆹𝅥𝅯𝆹𝅥𝅯; 𝆹𝆹𝅥𝅥𝅯𝅯; 𝆹𝆹𝅥𝅥𝅯𝅯; 𝆹𝆹𝅥𝅥𝅯𝅯; 𝆹𝆹𝅥𝅥𝅯𝅯; ) MUSICAL SYMBOL FUSA WHITE +1D1C0;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F; # (𝆺𝅥𝅯𝆺𝅥𝅯; 𝆺𝆺𝅥𝅥𝅯𝅯; 𝆺𝆺𝅥𝅥𝅯𝅯; 𝆺𝆺𝅥𝅥𝅯𝅯; 𝆺𝆺𝅥𝅥𝅯𝅯; ) MUSICAL SYMBOL FUSA BLACK +1D400;1D400;1D400;0041;0041; # (𝐀𝐀; 𝐀𝐀; 𝐀𝐀; A; A; ) MATHEMATICAL BOLD CAPITAL A +1D401;1D401;1D401;0042;0042; # (𝐁𝐁; 𝐁𝐁; 𝐁𝐁; B; B; ) MATHEMATICAL BOLD CAPITAL B +1D402;1D402;1D402;0043;0043; # (𝐂𝐂; 𝐂𝐂; 𝐂𝐂; C; C; ) MATHEMATICAL BOLD CAPITAL C +1D403;1D403;1D403;0044;0044; # (𝐃𝐃; 𝐃𝐃; 𝐃𝐃; D; D; ) MATHEMATICAL BOLD CAPITAL D +1D404;1D404;1D404;0045;0045; # (𝐄𝐄; 𝐄𝐄; 𝐄𝐄; E; E; ) MATHEMATICAL BOLD CAPITAL E +1D405;1D405;1D405;0046;0046; # (𝐅𝐅; 𝐅𝐅; 𝐅𝐅; F; F; ) MATHEMATICAL BOLD CAPITAL F +1D406;1D406;1D406;0047;0047; # (𝐆𝐆; 𝐆𝐆; 𝐆𝐆; G; G; ) MATHEMATICAL BOLD CAPITAL G +1D407;1D407;1D407;0048;0048; # (𝐇𝐇; 𝐇𝐇; 𝐇𝐇; H; H; ) MATHEMATICAL BOLD CAPITAL H +1D408;1D408;1D408;0049;0049; # (𝐈𝐈; 𝐈𝐈; 𝐈𝐈; I; I; ) MATHEMATICAL BOLD CAPITAL I +1D409;1D409;1D409;004A;004A; # (𝐉𝐉; 𝐉𝐉; 𝐉𝐉; J; J; ) MATHEMATICAL BOLD CAPITAL J +1D40A;1D40A;1D40A;004B;004B; # (𝐊𝐊; 𝐊𝐊; 𝐊𝐊; K; K; ) MATHEMATICAL BOLD CAPITAL K +1D40B;1D40B;1D40B;004C;004C; # (𝐋𝐋; 𝐋𝐋; 𝐋𝐋; L; L; ) MATHEMATICAL BOLD CAPITAL L +1D40C;1D40C;1D40C;004D;004D; # (𝐌𝐌; 𝐌𝐌; 𝐌𝐌; M; M; ) MATHEMATICAL BOLD CAPITAL M +1D40D;1D40D;1D40D;004E;004E; # (𝐍𝐍; 𝐍𝐍; 𝐍𝐍; N; N; ) MATHEMATICAL BOLD CAPITAL N +1D40E;1D40E;1D40E;004F;004F; # (𝐎𝐎; 𝐎𝐎; 𝐎𝐎; O; O; ) MATHEMATICAL BOLD CAPITAL O +1D40F;1D40F;1D40F;0050;0050; # (𝐏𝐏; 𝐏𝐏; 𝐏𝐏; P; P; ) MATHEMATICAL BOLD CAPITAL P +1D410;1D410;1D410;0051;0051; # (𝐐𝐐; 𝐐𝐐; 𝐐𝐐; Q; Q; ) MATHEMATICAL BOLD CAPITAL Q +1D411;1D411;1D411;0052;0052; # (𝐑𝐑; 𝐑𝐑; 𝐑𝐑; R; R; ) MATHEMATICAL BOLD CAPITAL R +1D412;1D412;1D412;0053;0053; # (𝐒𝐒; 𝐒𝐒; 𝐒𝐒; S; S; ) MATHEMATICAL BOLD CAPITAL S +1D413;1D413;1D413;0054;0054; # (𝐓𝐓; 𝐓𝐓; 𝐓𝐓; T; T; ) MATHEMATICAL BOLD CAPITAL T +1D414;1D414;1D414;0055;0055; # (𝐔𝐔; 𝐔𝐔; 𝐔𝐔; U; U; ) MATHEMATICAL BOLD CAPITAL U +1D415;1D415;1D415;0056;0056; # (𝐕𝐕; 𝐕𝐕; 𝐕𝐕; V; V; ) MATHEMATICAL BOLD CAPITAL V +1D416;1D416;1D416;0057;0057; # (𝐖𝐖; 𝐖𝐖; 𝐖𝐖; W; W; ) MATHEMATICAL BOLD CAPITAL W +1D417;1D417;1D417;0058;0058; # (𝐗𝐗; 𝐗𝐗; 𝐗𝐗; X; X; ) MATHEMATICAL BOLD CAPITAL X +1D418;1D418;1D418;0059;0059; # (𝐘𝐘; 𝐘𝐘; 𝐘𝐘; Y; Y; ) MATHEMATICAL BOLD CAPITAL Y +1D419;1D419;1D419;005A;005A; # (𝐙𝐙; 𝐙𝐙; 𝐙𝐙; Z; Z; ) MATHEMATICAL BOLD CAPITAL Z +1D41A;1D41A;1D41A;0061;0061; # (𝐚𝐚; 𝐚𝐚; 𝐚𝐚; a; a; ) MATHEMATICAL BOLD SMALL A +1D41B;1D41B;1D41B;0062;0062; # (𝐛𝐛; 𝐛𝐛; 𝐛𝐛; b; b; ) MATHEMATICAL BOLD SMALL B +1D41C;1D41C;1D41C;0063;0063; # (𝐜𝐜; 𝐜𝐜; 𝐜𝐜; c; c; ) MATHEMATICAL BOLD SMALL C +1D41D;1D41D;1D41D;0064;0064; # (𝐝𝐝; 𝐝𝐝; 𝐝𝐝; d; d; ) MATHEMATICAL BOLD SMALL D +1D41E;1D41E;1D41E;0065;0065; # (𝐞𝐞; 𝐞𝐞; 𝐞𝐞; e; e; ) MATHEMATICAL BOLD SMALL E +1D41F;1D41F;1D41F;0066;0066; # (𝐟𝐟; 𝐟𝐟; 𝐟𝐟; f; f; ) MATHEMATICAL BOLD SMALL F +1D420;1D420;1D420;0067;0067; # (𝐠𝐠; 𝐠𝐠; 𝐠𝐠; g; g; ) MATHEMATICAL BOLD SMALL G +1D421;1D421;1D421;0068;0068; # (𝐡𝐡; 𝐡𝐡; 𝐡𝐡; h; h; ) MATHEMATICAL BOLD SMALL H +1D422;1D422;1D422;0069;0069; # (𝐢𝐢; 𝐢𝐢; 𝐢𝐢; i; i; ) MATHEMATICAL BOLD SMALL I +1D423;1D423;1D423;006A;006A; # (𝐣𝐣; 𝐣𝐣; 𝐣𝐣; j; j; ) MATHEMATICAL BOLD SMALL J +1D424;1D424;1D424;006B;006B; # (𝐤𝐤; 𝐤𝐤; 𝐤𝐤; k; k; ) MATHEMATICAL BOLD SMALL K +1D425;1D425;1D425;006C;006C; # (𝐥𝐥; 𝐥𝐥; 𝐥𝐥; l; l; ) MATHEMATICAL BOLD SMALL L +1D426;1D426;1D426;006D;006D; # (𝐦𝐦; 𝐦𝐦; 𝐦𝐦; m; m; ) MATHEMATICAL BOLD SMALL M +1D427;1D427;1D427;006E;006E; # (𝐧𝐧; 𝐧𝐧; 𝐧𝐧; n; n; ) MATHEMATICAL BOLD SMALL N +1D428;1D428;1D428;006F;006F; # (𝐨𝐨; 𝐨𝐨; 𝐨𝐨; o; o; ) MATHEMATICAL BOLD SMALL O +1D429;1D429;1D429;0070;0070; # (𝐩𝐩; 𝐩𝐩; 𝐩𝐩; p; p; ) MATHEMATICAL BOLD SMALL P +1D42A;1D42A;1D42A;0071;0071; # (𝐪𝐪; 𝐪𝐪; 𝐪𝐪; q; q; ) MATHEMATICAL BOLD SMALL Q +1D42B;1D42B;1D42B;0072;0072; # (𝐫𝐫; 𝐫𝐫; 𝐫𝐫; r; r; ) MATHEMATICAL BOLD SMALL R +1D42C;1D42C;1D42C;0073;0073; # (𝐬𝐬; 𝐬𝐬; 𝐬𝐬; s; s; ) MATHEMATICAL BOLD SMALL S +1D42D;1D42D;1D42D;0074;0074; # (𝐭𝐭; 𝐭𝐭; 𝐭𝐭; t; t; ) MATHEMATICAL BOLD SMALL T +1D42E;1D42E;1D42E;0075;0075; # (𝐮𝐮; 𝐮𝐮; 𝐮𝐮; u; u; ) MATHEMATICAL BOLD SMALL U +1D42F;1D42F;1D42F;0076;0076; # (𝐯𝐯; 𝐯𝐯; 𝐯𝐯; v; v; ) MATHEMATICAL BOLD SMALL V +1D430;1D430;1D430;0077;0077; # (𝐰𝐰; 𝐰𝐰; 𝐰𝐰; w; w; ) MATHEMATICAL BOLD SMALL W +1D431;1D431;1D431;0078;0078; # (𝐱𝐱; 𝐱𝐱; 𝐱𝐱; x; x; ) MATHEMATICAL BOLD SMALL X +1D432;1D432;1D432;0079;0079; # (𝐲𝐲; 𝐲𝐲; 𝐲𝐲; y; y; ) MATHEMATICAL BOLD SMALL Y +1D433;1D433;1D433;007A;007A; # (𝐳𝐳; 𝐳𝐳; 𝐳𝐳; z; z; ) MATHEMATICAL BOLD SMALL Z +1D434;1D434;1D434;0041;0041; # (𝐴𝐴; 𝐴𝐴; 𝐴𝐴; A; A; ) MATHEMATICAL ITALIC CAPITAL A +1D435;1D435;1D435;0042;0042; # (𝐵𝐵; 𝐵𝐵; 𝐵𝐵; B; B; ) MATHEMATICAL ITALIC CAPITAL B +1D436;1D436;1D436;0043;0043; # (𝐶𝐶; 𝐶𝐶; 𝐶𝐶; C; C; ) MATHEMATICAL ITALIC CAPITAL C +1D437;1D437;1D437;0044;0044; # (𝐷𝐷; 𝐷𝐷; 𝐷𝐷; D; D; ) MATHEMATICAL ITALIC CAPITAL D +1D438;1D438;1D438;0045;0045; # (𝐸𝐸; 𝐸𝐸; 𝐸𝐸; E; E; ) MATHEMATICAL ITALIC CAPITAL E +1D439;1D439;1D439;0046;0046; # (𝐹𝐹; 𝐹𝐹; 𝐹𝐹; F; F; ) MATHEMATICAL ITALIC CAPITAL F +1D43A;1D43A;1D43A;0047;0047; # (𝐺𝐺; 𝐺𝐺; 𝐺𝐺; G; G; ) MATHEMATICAL ITALIC CAPITAL G +1D43B;1D43B;1D43B;0048;0048; # (𝐻𝐻; 𝐻𝐻; 𝐻𝐻; H; H; ) MATHEMATICAL ITALIC CAPITAL H +1D43C;1D43C;1D43C;0049;0049; # (𝐼𝐼; 𝐼𝐼; 𝐼𝐼; I; I; ) MATHEMATICAL ITALIC CAPITAL I +1D43D;1D43D;1D43D;004A;004A; # (𝐽𝐽; 𝐽𝐽; 𝐽𝐽; J; J; ) MATHEMATICAL ITALIC CAPITAL J +1D43E;1D43E;1D43E;004B;004B; # (𝐾𝐾; 𝐾𝐾; 𝐾𝐾; K; K; ) MATHEMATICAL ITALIC CAPITAL K +1D43F;1D43F;1D43F;004C;004C; # (𝐿𝐿; 𝐿𝐿; 𝐿𝐿; L; L; ) MATHEMATICAL ITALIC CAPITAL L +1D440;1D440;1D440;004D;004D; # (𝑀𝑀; 𝑀𝑀; 𝑀𝑀; M; M; ) MATHEMATICAL ITALIC CAPITAL M +1D441;1D441;1D441;004E;004E; # (𝑁𝑁; 𝑁𝑁; 𝑁𝑁; N; N; ) MATHEMATICAL ITALIC CAPITAL N +1D442;1D442;1D442;004F;004F; # (𝑂𝑂; 𝑂𝑂; 𝑂𝑂; O; O; ) MATHEMATICAL ITALIC CAPITAL O +1D443;1D443;1D443;0050;0050; # (𝑃𝑃; 𝑃𝑃; 𝑃𝑃; P; P; ) MATHEMATICAL ITALIC CAPITAL P +1D444;1D444;1D444;0051;0051; # (𝑄𝑄; 𝑄𝑄; 𝑄𝑄; Q; Q; ) MATHEMATICAL ITALIC CAPITAL Q +1D445;1D445;1D445;0052;0052; # (𝑅𝑅; 𝑅𝑅; 𝑅𝑅; R; R; ) MATHEMATICAL ITALIC CAPITAL R +1D446;1D446;1D446;0053;0053; # (𝑆𝑆; 𝑆𝑆; 𝑆𝑆; S; S; ) MATHEMATICAL ITALIC CAPITAL S +1D447;1D447;1D447;0054;0054; # (𝑇𝑇; 𝑇𝑇; 𝑇𝑇; T; T; ) MATHEMATICAL ITALIC CAPITAL T +1D448;1D448;1D448;0055;0055; # (𝑈𝑈; 𝑈𝑈; 𝑈𝑈; U; U; ) MATHEMATICAL ITALIC CAPITAL U +1D449;1D449;1D449;0056;0056; # (𝑉𝑉; 𝑉𝑉; 𝑉𝑉; V; V; ) MATHEMATICAL ITALIC CAPITAL V +1D44A;1D44A;1D44A;0057;0057; # (𝑊𝑊; 𝑊𝑊; 𝑊𝑊; W; W; ) MATHEMATICAL ITALIC CAPITAL W +1D44B;1D44B;1D44B;0058;0058; # (𝑋𝑋; 𝑋𝑋; 𝑋𝑋; X; X; ) MATHEMATICAL ITALIC CAPITAL X +1D44C;1D44C;1D44C;0059;0059; # (𝑌𝑌; 𝑌𝑌; 𝑌𝑌; Y; Y; ) MATHEMATICAL ITALIC CAPITAL Y +1D44D;1D44D;1D44D;005A;005A; # (𝑍𝑍; 𝑍𝑍; 𝑍𝑍; Z; Z; ) MATHEMATICAL ITALIC CAPITAL Z +1D44E;1D44E;1D44E;0061;0061; # (𝑎𝑎; 𝑎𝑎; 𝑎𝑎; a; a; ) MATHEMATICAL ITALIC SMALL A +1D44F;1D44F;1D44F;0062;0062; # (𝑏𝑏; 𝑏𝑏; 𝑏𝑏; b; b; ) MATHEMATICAL ITALIC SMALL B +1D450;1D450;1D450;0063;0063; # (𝑐𝑐; 𝑐𝑐; 𝑐𝑐; c; c; ) MATHEMATICAL ITALIC SMALL C +1D451;1D451;1D451;0064;0064; # (𝑑𝑑; 𝑑𝑑; 𝑑𝑑; d; d; ) MATHEMATICAL ITALIC SMALL D +1D452;1D452;1D452;0065;0065; # (𝑒𝑒; 𝑒𝑒; 𝑒𝑒; e; e; ) MATHEMATICAL ITALIC SMALL E +1D453;1D453;1D453;0066;0066; # (𝑓𝑓; 𝑓𝑓; 𝑓𝑓; f; f; ) MATHEMATICAL ITALIC SMALL F +1D454;1D454;1D454;0067;0067; # (𝑔𝑔; 𝑔𝑔; 𝑔𝑔; g; g; ) MATHEMATICAL ITALIC SMALL G +1D456;1D456;1D456;0069;0069; # (𝑖𝑖; 𝑖𝑖; 𝑖𝑖; i; i; ) MATHEMATICAL ITALIC SMALL I +1D457;1D457;1D457;006A;006A; # (𝑗𝑗; 𝑗𝑗; 𝑗𝑗; j; j; ) MATHEMATICAL ITALIC SMALL J +1D458;1D458;1D458;006B;006B; # (𝑘𝑘; 𝑘𝑘; 𝑘𝑘; k; k; ) MATHEMATICAL ITALIC SMALL K +1D459;1D459;1D459;006C;006C; # (𝑙𝑙; 𝑙𝑙; 𝑙𝑙; l; l; ) MATHEMATICAL ITALIC SMALL L +1D45A;1D45A;1D45A;006D;006D; # (𝑚𝑚; 𝑚𝑚; 𝑚𝑚; m; m; ) MATHEMATICAL ITALIC SMALL M +1D45B;1D45B;1D45B;006E;006E; # (𝑛𝑛; 𝑛𝑛; 𝑛𝑛; n; n; ) MATHEMATICAL ITALIC SMALL N +1D45C;1D45C;1D45C;006F;006F; # (𝑜𝑜; 𝑜𝑜; 𝑜𝑜; o; o; ) MATHEMATICAL ITALIC SMALL O +1D45D;1D45D;1D45D;0070;0070; # (𝑝𝑝; 𝑝𝑝; 𝑝𝑝; p; p; ) MATHEMATICAL ITALIC SMALL P +1D45E;1D45E;1D45E;0071;0071; # (𝑞𝑞; 𝑞𝑞; 𝑞𝑞; q; q; ) MATHEMATICAL ITALIC SMALL Q +1D45F;1D45F;1D45F;0072;0072; # (𝑟𝑟; 𝑟𝑟; 𝑟𝑟; r; r; ) MATHEMATICAL ITALIC SMALL R +1D460;1D460;1D460;0073;0073; # (𝑠𝑠; 𝑠𝑠; 𝑠𝑠; s; s; ) MATHEMATICAL ITALIC SMALL S +1D461;1D461;1D461;0074;0074; # (𝑡𝑡; 𝑡𝑡; 𝑡𝑡; t; t; ) MATHEMATICAL ITALIC SMALL T +1D462;1D462;1D462;0075;0075; # (𝑢𝑢; 𝑢𝑢; 𝑢𝑢; u; u; ) MATHEMATICAL ITALIC SMALL U +1D463;1D463;1D463;0076;0076; # (𝑣𝑣; 𝑣𝑣; 𝑣𝑣; v; v; ) MATHEMATICAL ITALIC SMALL V +1D464;1D464;1D464;0077;0077; # (𝑤𝑤; 𝑤𝑤; 𝑤𝑤; w; w; ) MATHEMATICAL ITALIC SMALL W +1D465;1D465;1D465;0078;0078; # (𝑥𝑥; 𝑥𝑥; 𝑥𝑥; x; x; ) MATHEMATICAL ITALIC SMALL X +1D466;1D466;1D466;0079;0079; # (𝑦𝑦; 𝑦𝑦; 𝑦𝑦; y; y; ) MATHEMATICAL ITALIC SMALL Y +1D467;1D467;1D467;007A;007A; # (𝑧𝑧; 𝑧𝑧; 𝑧𝑧; z; z; ) MATHEMATICAL ITALIC SMALL Z +1D468;1D468;1D468;0041;0041; # (𝑨𝑨; 𝑨𝑨; 𝑨𝑨; A; A; ) MATHEMATICAL BOLD ITALIC CAPITAL A +1D469;1D469;1D469;0042;0042; # (𝑩𝑩; 𝑩𝑩; 𝑩𝑩; B; B; ) MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A;1D46A;1D46A;0043;0043; # (𝑪𝑪; 𝑪𝑪; 𝑪𝑪; C; C; ) MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B;1D46B;1D46B;0044;0044; # (𝑫𝑫; 𝑫𝑫; 𝑫𝑫; D; D; ) MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C;1D46C;1D46C;0045;0045; # (𝑬𝑬; 𝑬𝑬; 𝑬𝑬; E; E; ) MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D;1D46D;1D46D;0046;0046; # (𝑭𝑭; 𝑭𝑭; 𝑭𝑭; F; F; ) MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E;1D46E;1D46E;0047;0047; # (𝑮𝑮; 𝑮𝑮; 𝑮𝑮; G; G; ) MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F;1D46F;1D46F;0048;0048; # (𝑯𝑯; 𝑯𝑯; 𝑯𝑯; H; H; ) MATHEMATICAL BOLD ITALIC CAPITAL H +1D470;1D470;1D470;0049;0049; # (𝑰𝑰; 𝑰𝑰; 𝑰𝑰; I; I; ) MATHEMATICAL BOLD ITALIC CAPITAL I +1D471;1D471;1D471;004A;004A; # (𝑱𝑱; 𝑱𝑱; 𝑱𝑱; J; J; ) MATHEMATICAL BOLD ITALIC CAPITAL J +1D472;1D472;1D472;004B;004B; # (𝑲𝑲; 𝑲𝑲; 𝑲𝑲; K; K; ) MATHEMATICAL BOLD ITALIC CAPITAL K +1D473;1D473;1D473;004C;004C; # (𝑳𝑳; 𝑳𝑳; 𝑳𝑳; L; L; ) MATHEMATICAL BOLD ITALIC CAPITAL L +1D474;1D474;1D474;004D;004D; # (𝑴𝑴; 𝑴𝑴; 𝑴𝑴; M; M; ) MATHEMATICAL BOLD ITALIC CAPITAL M +1D475;1D475;1D475;004E;004E; # (𝑵𝑵; 𝑵𝑵; 𝑵𝑵; N; N; ) MATHEMATICAL BOLD ITALIC CAPITAL N +1D476;1D476;1D476;004F;004F; # (𝑶𝑶; 𝑶𝑶; 𝑶𝑶; O; O; ) MATHEMATICAL BOLD ITALIC CAPITAL O +1D477;1D477;1D477;0050;0050; # (𝑷𝑷; 𝑷𝑷; 𝑷𝑷; P; P; ) MATHEMATICAL BOLD ITALIC CAPITAL P +1D478;1D478;1D478;0051;0051; # (𝑸𝑸; 𝑸𝑸; 𝑸𝑸; Q; Q; ) MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479;1D479;1D479;0052;0052; # (𝑹𝑹; 𝑹𝑹; 𝑹𝑹; R; R; ) MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A;1D47A;1D47A;0053;0053; # (𝑺𝑺; 𝑺𝑺; 𝑺𝑺; S; S; ) MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B;1D47B;1D47B;0054;0054; # (𝑻𝑻; 𝑻𝑻; 𝑻𝑻; T; T; ) MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C;1D47C;1D47C;0055;0055; # (𝑼𝑼; 𝑼𝑼; 𝑼𝑼; U; U; ) MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D;1D47D;1D47D;0056;0056; # (𝑽𝑽; 𝑽𝑽; 𝑽𝑽; V; V; ) MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E;1D47E;1D47E;0057;0057; # (𝑾𝑾; 𝑾𝑾; 𝑾𝑾; W; W; ) MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F;1D47F;1D47F;0058;0058; # (𝑿𝑿; 𝑿𝑿; 𝑿𝑿; X; X; ) MATHEMATICAL BOLD ITALIC CAPITAL X +1D480;1D480;1D480;0059;0059; # (𝒀𝒀; 𝒀𝒀; 𝒀𝒀; Y; Y; ) MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481;1D481;1D481;005A;005A; # (𝒁𝒁; 𝒁𝒁; 𝒁𝒁; Z; Z; ) MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482;1D482;1D482;0061;0061; # (𝒂𝒂; 𝒂𝒂; 𝒂𝒂; a; a; ) MATHEMATICAL BOLD ITALIC SMALL A +1D483;1D483;1D483;0062;0062; # (𝒃𝒃; 𝒃𝒃; 𝒃𝒃; b; b; ) MATHEMATICAL BOLD ITALIC SMALL B +1D484;1D484;1D484;0063;0063; # (𝒄𝒄; 𝒄𝒄; 𝒄𝒄; c; c; ) MATHEMATICAL BOLD ITALIC SMALL C +1D485;1D485;1D485;0064;0064; # (𝒅𝒅; 𝒅𝒅; 𝒅𝒅; d; d; ) MATHEMATICAL BOLD ITALIC SMALL D +1D486;1D486;1D486;0065;0065; # (𝒆𝒆; 𝒆𝒆; 𝒆𝒆; e; e; ) MATHEMATICAL BOLD ITALIC SMALL E +1D487;1D487;1D487;0066;0066; # (𝒇𝒇; 𝒇𝒇; 𝒇𝒇; f; f; ) MATHEMATICAL BOLD ITALIC SMALL F +1D488;1D488;1D488;0067;0067; # (𝒈𝒈; 𝒈𝒈; 𝒈𝒈; g; g; ) MATHEMATICAL BOLD ITALIC SMALL G +1D489;1D489;1D489;0068;0068; # (𝒉𝒉; 𝒉𝒉; 𝒉𝒉; h; h; ) MATHEMATICAL BOLD ITALIC SMALL H +1D48A;1D48A;1D48A;0069;0069; # (𝒊𝒊; 𝒊𝒊; 𝒊𝒊; i; i; ) MATHEMATICAL BOLD ITALIC SMALL I +1D48B;1D48B;1D48B;006A;006A; # (𝒋𝒋; 𝒋𝒋; 𝒋𝒋; j; j; ) MATHEMATICAL BOLD ITALIC SMALL J +1D48C;1D48C;1D48C;006B;006B; # (𝒌𝒌; 𝒌𝒌; 𝒌𝒌; k; k; ) MATHEMATICAL BOLD ITALIC SMALL K +1D48D;1D48D;1D48D;006C;006C; # (𝒍𝒍; 𝒍𝒍; 𝒍𝒍; l; l; ) MATHEMATICAL BOLD ITALIC SMALL L +1D48E;1D48E;1D48E;006D;006D; # (𝒎𝒎; 𝒎𝒎; 𝒎𝒎; m; m; ) MATHEMATICAL BOLD ITALIC SMALL M +1D48F;1D48F;1D48F;006E;006E; # (𝒏𝒏; 𝒏𝒏; 𝒏𝒏; n; n; ) MATHEMATICAL BOLD ITALIC SMALL N +1D490;1D490;1D490;006F;006F; # (𝒐𝒐; 𝒐𝒐; 𝒐𝒐; o; o; ) MATHEMATICAL BOLD ITALIC SMALL O +1D491;1D491;1D491;0070;0070; # (𝒑𝒑; 𝒑𝒑; 𝒑𝒑; p; p; ) MATHEMATICAL BOLD ITALIC SMALL P +1D492;1D492;1D492;0071;0071; # (𝒒𝒒; 𝒒𝒒; 𝒒𝒒; q; q; ) MATHEMATICAL BOLD ITALIC SMALL Q +1D493;1D493;1D493;0072;0072; # (𝒓𝒓; 𝒓𝒓; 𝒓𝒓; r; r; ) MATHEMATICAL BOLD ITALIC SMALL R +1D494;1D494;1D494;0073;0073; # (𝒔𝒔; 𝒔𝒔; 𝒔𝒔; s; s; ) MATHEMATICAL BOLD ITALIC SMALL S +1D495;1D495;1D495;0074;0074; # (𝒕𝒕; 𝒕𝒕; 𝒕𝒕; t; t; ) MATHEMATICAL BOLD ITALIC SMALL T +1D496;1D496;1D496;0075;0075; # (𝒖𝒖; 𝒖𝒖; 𝒖𝒖; u; u; ) MATHEMATICAL BOLD ITALIC SMALL U +1D497;1D497;1D497;0076;0076; # (𝒗𝒗; 𝒗𝒗; 𝒗𝒗; v; v; ) MATHEMATICAL BOLD ITALIC SMALL V +1D498;1D498;1D498;0077;0077; # (𝒘𝒘; 𝒘𝒘; 𝒘𝒘; w; w; ) MATHEMATICAL BOLD ITALIC SMALL W +1D499;1D499;1D499;0078;0078; # (𝒙𝒙; 𝒙𝒙; 𝒙𝒙; x; x; ) MATHEMATICAL BOLD ITALIC SMALL X +1D49A;1D49A;1D49A;0079;0079; # (𝒚𝒚; 𝒚𝒚; 𝒚𝒚; y; y; ) MATHEMATICAL BOLD ITALIC SMALL Y +1D49B;1D49B;1D49B;007A;007A; # (𝒛𝒛; 𝒛𝒛; 𝒛𝒛; z; z; ) MATHEMATICAL BOLD ITALIC SMALL Z +1D49C;1D49C;1D49C;0041;0041; # (𝒜𝒜; 𝒜𝒜; 𝒜𝒜; A; A; ) MATHEMATICAL SCRIPT CAPITAL A +1D49E;1D49E;1D49E;0043;0043; # (𝒞𝒞; 𝒞𝒞; 𝒞𝒞; C; C; ) MATHEMATICAL SCRIPT CAPITAL C +1D49F;1D49F;1D49F;0044;0044; # (𝒟𝒟; 𝒟𝒟; 𝒟𝒟; D; D; ) MATHEMATICAL SCRIPT CAPITAL D +1D4A2;1D4A2;1D4A2;0047;0047; # (𝒢𝒢; 𝒢𝒢; 𝒢𝒢; G; G; ) MATHEMATICAL SCRIPT CAPITAL G +1D4A5;1D4A5;1D4A5;004A;004A; # (𝒥𝒥; 𝒥𝒥; 𝒥𝒥; J; J; ) MATHEMATICAL SCRIPT CAPITAL J +1D4A6;1D4A6;1D4A6;004B;004B; # (𝒦𝒦; 𝒦𝒦; 𝒦𝒦; K; K; ) MATHEMATICAL SCRIPT CAPITAL K +1D4A9;1D4A9;1D4A9;004E;004E; # (𝒩𝒩; 𝒩𝒩; 𝒩𝒩; N; N; ) MATHEMATICAL SCRIPT CAPITAL N +1D4AA;1D4AA;1D4AA;004F;004F; # (𝒪𝒪; 𝒪𝒪; 𝒪𝒪; O; O; ) MATHEMATICAL SCRIPT CAPITAL O +1D4AB;1D4AB;1D4AB;0050;0050; # (𝒫𝒫; 𝒫𝒫; 𝒫𝒫; P; P; ) MATHEMATICAL SCRIPT CAPITAL P +1D4AC;1D4AC;1D4AC;0051;0051; # (𝒬𝒬; 𝒬𝒬; 𝒬𝒬; Q; Q; ) MATHEMATICAL SCRIPT CAPITAL Q +1D4AE;1D4AE;1D4AE;0053;0053; # (𝒮𝒮; 𝒮𝒮; 𝒮𝒮; S; S; ) MATHEMATICAL SCRIPT CAPITAL S +1D4AF;1D4AF;1D4AF;0054;0054; # (𝒯𝒯; 𝒯𝒯; 𝒯𝒯; T; T; ) MATHEMATICAL SCRIPT CAPITAL T +1D4B0;1D4B0;1D4B0;0055;0055; # (𝒰𝒰; 𝒰𝒰; 𝒰𝒰; U; U; ) MATHEMATICAL SCRIPT CAPITAL U +1D4B1;1D4B1;1D4B1;0056;0056; # (𝒱𝒱; 𝒱𝒱; 𝒱𝒱; V; V; ) MATHEMATICAL SCRIPT CAPITAL V +1D4B2;1D4B2;1D4B2;0057;0057; # (𝒲𝒲; 𝒲𝒲; 𝒲𝒲; W; W; ) MATHEMATICAL SCRIPT CAPITAL W +1D4B3;1D4B3;1D4B3;0058;0058; # (𝒳𝒳; 𝒳𝒳; 𝒳𝒳; X; X; ) MATHEMATICAL SCRIPT CAPITAL X +1D4B4;1D4B4;1D4B4;0059;0059; # (𝒴𝒴; 𝒴𝒴; 𝒴𝒴; Y; Y; ) MATHEMATICAL SCRIPT CAPITAL Y +1D4B5;1D4B5;1D4B5;005A;005A; # (𝒵𝒵; 𝒵𝒵; 𝒵𝒵; Z; Z; ) MATHEMATICAL SCRIPT CAPITAL Z +1D4B6;1D4B6;1D4B6;0061;0061; # (𝒶𝒶; 𝒶𝒶; 𝒶𝒶; a; a; ) MATHEMATICAL SCRIPT SMALL A +1D4B7;1D4B7;1D4B7;0062;0062; # (𝒷𝒷; 𝒷𝒷; 𝒷𝒷; b; b; ) MATHEMATICAL SCRIPT SMALL B +1D4B8;1D4B8;1D4B8;0063;0063; # (𝒸𝒸; 𝒸𝒸; 𝒸𝒸; c; c; ) MATHEMATICAL SCRIPT SMALL C +1D4B9;1D4B9;1D4B9;0064;0064; # (𝒹𝒹; 𝒹𝒹; 𝒹𝒹; d; d; ) MATHEMATICAL SCRIPT SMALL D +1D4BB;1D4BB;1D4BB;0066;0066; # (𝒻𝒻; 𝒻𝒻; 𝒻𝒻; f; f; ) MATHEMATICAL SCRIPT SMALL F +1D4BD;1D4BD;1D4BD;0068;0068; # (𝒽𝒽; 𝒽𝒽; 𝒽𝒽; h; h; ) MATHEMATICAL SCRIPT SMALL H +1D4BE;1D4BE;1D4BE;0069;0069; # (𝒾𝒾; 𝒾𝒾; 𝒾𝒾; i; i; ) MATHEMATICAL SCRIPT SMALL I +1D4BF;1D4BF;1D4BF;006A;006A; # (𝒿𝒿; 𝒿𝒿; 𝒿𝒿; j; j; ) MATHEMATICAL SCRIPT SMALL J +1D4C0;1D4C0;1D4C0;006B;006B; # (𝓀𝓀; 𝓀𝓀; 𝓀𝓀; k; k; ) MATHEMATICAL SCRIPT SMALL K +1D4C2;1D4C2;1D4C2;006D;006D; # (𝓂𝓂; 𝓂𝓂; 𝓂𝓂; m; m; ) MATHEMATICAL SCRIPT SMALL M +1D4C3;1D4C3;1D4C3;006E;006E; # (𝓃𝓃; 𝓃𝓃; 𝓃𝓃; n; n; ) MATHEMATICAL SCRIPT SMALL N +1D4C5;1D4C5;1D4C5;0070;0070; # (𝓅𝓅; 𝓅𝓅; 𝓅𝓅; p; p; ) MATHEMATICAL SCRIPT SMALL P +1D4C6;1D4C6;1D4C6;0071;0071; # (𝓆𝓆; 𝓆𝓆; 𝓆𝓆; q; q; ) MATHEMATICAL SCRIPT SMALL Q +1D4C7;1D4C7;1D4C7;0072;0072; # (𝓇𝓇; 𝓇𝓇; 𝓇𝓇; r; r; ) MATHEMATICAL SCRIPT SMALL R +1D4C8;1D4C8;1D4C8;0073;0073; # (𝓈𝓈; 𝓈𝓈; 𝓈𝓈; s; s; ) MATHEMATICAL SCRIPT SMALL S +1D4C9;1D4C9;1D4C9;0074;0074; # (𝓉𝓉; 𝓉𝓉; 𝓉𝓉; t; t; ) MATHEMATICAL SCRIPT SMALL T +1D4CA;1D4CA;1D4CA;0075;0075; # (𝓊𝓊; 𝓊𝓊; 𝓊𝓊; u; u; ) MATHEMATICAL SCRIPT SMALL U +1D4CB;1D4CB;1D4CB;0076;0076; # (𝓋𝓋; 𝓋𝓋; 𝓋𝓋; v; v; ) MATHEMATICAL SCRIPT SMALL V +1D4CC;1D4CC;1D4CC;0077;0077; # (𝓌𝓌; 𝓌𝓌; 𝓌𝓌; w; w; ) MATHEMATICAL SCRIPT SMALL W +1D4CD;1D4CD;1D4CD;0078;0078; # (𝓍𝓍; 𝓍𝓍; 𝓍𝓍; x; x; ) MATHEMATICAL SCRIPT SMALL X +1D4CE;1D4CE;1D4CE;0079;0079; # (𝓎𝓎; 𝓎𝓎; 𝓎𝓎; y; y; ) MATHEMATICAL SCRIPT SMALL Y +1D4CF;1D4CF;1D4CF;007A;007A; # (𝓏𝓏; 𝓏𝓏; 𝓏𝓏; z; z; ) MATHEMATICAL SCRIPT SMALL Z +1D4D0;1D4D0;1D4D0;0041;0041; # (𝓐𝓐; 𝓐𝓐; 𝓐𝓐; A; A; ) MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1;1D4D1;1D4D1;0042;0042; # (𝓑𝓑; 𝓑𝓑; 𝓑𝓑; B; B; ) MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2;1D4D2;1D4D2;0043;0043; # (𝓒𝓒; 𝓒𝓒; 𝓒𝓒; C; C; ) MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3;1D4D3;1D4D3;0044;0044; # (𝓓𝓓; 𝓓𝓓; 𝓓𝓓; D; D; ) MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4;1D4D4;1D4D4;0045;0045; # (𝓔𝓔; 𝓔𝓔; 𝓔𝓔; E; E; ) MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5;1D4D5;1D4D5;0046;0046; # (𝓕𝓕; 𝓕𝓕; 𝓕𝓕; F; F; ) MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6;1D4D6;1D4D6;0047;0047; # (𝓖𝓖; 𝓖𝓖; 𝓖𝓖; G; G; ) MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7;1D4D7;1D4D7;0048;0048; # (𝓗𝓗; 𝓗𝓗; 𝓗𝓗; H; H; ) MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8;1D4D8;1D4D8;0049;0049; # (𝓘𝓘; 𝓘𝓘; 𝓘𝓘; I; I; ) MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9;1D4D9;1D4D9;004A;004A; # (𝓙𝓙; 𝓙𝓙; 𝓙𝓙; J; J; ) MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA;1D4DA;1D4DA;004B;004B; # (𝓚𝓚; 𝓚𝓚; 𝓚𝓚; K; K; ) MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB;1D4DB;1D4DB;004C;004C; # (𝓛𝓛; 𝓛𝓛; 𝓛𝓛; L; L; ) MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC;1D4DC;1D4DC;004D;004D; # (𝓜𝓜; 𝓜𝓜; 𝓜𝓜; M; M; ) MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD;1D4DD;1D4DD;004E;004E; # (𝓝𝓝; 𝓝𝓝; 𝓝𝓝; N; N; ) MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE;1D4DE;1D4DE;004F;004F; # (𝓞𝓞; 𝓞𝓞; 𝓞𝓞; O; O; ) MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF;1D4DF;1D4DF;0050;0050; # (𝓟𝓟; 𝓟𝓟; 𝓟𝓟; P; P; ) MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0;1D4E0;1D4E0;0051;0051; # (𝓠𝓠; 𝓠𝓠; 𝓠𝓠; Q; Q; ) MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1;1D4E1;1D4E1;0052;0052; # (𝓡𝓡; 𝓡𝓡; 𝓡𝓡; R; R; ) MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2;1D4E2;1D4E2;0053;0053; # (𝓢𝓢; 𝓢𝓢; 𝓢𝓢; S; S; ) MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3;1D4E3;1D4E3;0054;0054; # (𝓣𝓣; 𝓣𝓣; 𝓣𝓣; T; T; ) MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4;1D4E4;1D4E4;0055;0055; # (𝓤𝓤; 𝓤𝓤; 𝓤𝓤; U; U; ) MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5;1D4E5;1D4E5;0056;0056; # (𝓥𝓥; 𝓥𝓥; 𝓥𝓥; V; V; ) MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6;1D4E6;1D4E6;0057;0057; # (𝓦𝓦; 𝓦𝓦; 𝓦𝓦; W; W; ) MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7;1D4E7;1D4E7;0058;0058; # (𝓧𝓧; 𝓧𝓧; 𝓧𝓧; X; X; ) MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8;1D4E8;1D4E8;0059;0059; # (𝓨𝓨; 𝓨𝓨; 𝓨𝓨; Y; Y; ) MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9;1D4E9;1D4E9;005A;005A; # (𝓩𝓩; 𝓩𝓩; 𝓩𝓩; Z; Z; ) MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA;1D4EA;1D4EA;0061;0061; # (𝓪𝓪; 𝓪𝓪; 𝓪𝓪; a; a; ) MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB;1D4EB;1D4EB;0062;0062; # (𝓫𝓫; 𝓫𝓫; 𝓫𝓫; b; b; ) MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC;1D4EC;1D4EC;0063;0063; # (𝓬𝓬; 𝓬𝓬; 𝓬𝓬; c; c; ) MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED;1D4ED;1D4ED;0064;0064; # (𝓭𝓭; 𝓭𝓭; 𝓭𝓭; d; d; ) MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE;1D4EE;1D4EE;0065;0065; # (𝓮𝓮; 𝓮𝓮; 𝓮𝓮; e; e; ) MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF;1D4EF;1D4EF;0066;0066; # (𝓯𝓯; 𝓯𝓯; 𝓯𝓯; f; f; ) MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0;1D4F0;1D4F0;0067;0067; # (𝓰𝓰; 𝓰𝓰; 𝓰𝓰; g; g; ) MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1;1D4F1;1D4F1;0068;0068; # (𝓱𝓱; 𝓱𝓱; 𝓱𝓱; h; h; ) MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2;1D4F2;1D4F2;0069;0069; # (𝓲𝓲; 𝓲𝓲; 𝓲𝓲; i; i; ) MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3;1D4F3;1D4F3;006A;006A; # (𝓳𝓳; 𝓳𝓳; 𝓳𝓳; j; j; ) MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4;1D4F4;1D4F4;006B;006B; # (𝓴𝓴; 𝓴𝓴; 𝓴𝓴; k; k; ) MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5;1D4F5;1D4F5;006C;006C; # (𝓵𝓵; 𝓵𝓵; 𝓵𝓵; l; l; ) MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6;1D4F6;1D4F6;006D;006D; # (𝓶𝓶; 𝓶𝓶; 𝓶𝓶; m; m; ) MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7;1D4F7;1D4F7;006E;006E; # (𝓷𝓷; 𝓷𝓷; 𝓷𝓷; n; n; ) MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8;1D4F8;1D4F8;006F;006F; # (𝓸𝓸; 𝓸𝓸; 𝓸𝓸; o; o; ) MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9;1D4F9;1D4F9;0070;0070; # (𝓹𝓹; 𝓹𝓹; 𝓹𝓹; p; p; ) MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA;1D4FA;1D4FA;0071;0071; # (𝓺𝓺; 𝓺𝓺; 𝓺𝓺; q; q; ) MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB;1D4FB;1D4FB;0072;0072; # (𝓻𝓻; 𝓻𝓻; 𝓻𝓻; r; r; ) MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC;1D4FC;1D4FC;0073;0073; # (𝓼𝓼; 𝓼𝓼; 𝓼𝓼; s; s; ) MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD;1D4FD;1D4FD;0074;0074; # (𝓽𝓽; 𝓽𝓽; 𝓽𝓽; t; t; ) MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE;1D4FE;1D4FE;0075;0075; # (𝓾𝓾; 𝓾𝓾; 𝓾𝓾; u; u; ) MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF;1D4FF;1D4FF;0076;0076; # (𝓿𝓿; 𝓿𝓿; 𝓿𝓿; v; v; ) MATHEMATICAL BOLD SCRIPT SMALL V +1D500;1D500;1D500;0077;0077; # (𝔀𝔀; 𝔀𝔀; 𝔀𝔀; w; w; ) MATHEMATICAL BOLD SCRIPT SMALL W +1D501;1D501;1D501;0078;0078; # (𝔁𝔁; 𝔁𝔁; 𝔁𝔁; x; x; ) MATHEMATICAL BOLD SCRIPT SMALL X +1D502;1D502;1D502;0079;0079; # (𝔂𝔂; 𝔂𝔂; 𝔂𝔂; y; y; ) MATHEMATICAL BOLD SCRIPT SMALL Y +1D503;1D503;1D503;007A;007A; # (𝔃𝔃; 𝔃𝔃; 𝔃𝔃; z; z; ) MATHEMATICAL BOLD SCRIPT SMALL Z +1D504;1D504;1D504;0041;0041; # (𝔄𝔄; 𝔄𝔄; 𝔄𝔄; A; A; ) MATHEMATICAL FRAKTUR CAPITAL A +1D505;1D505;1D505;0042;0042; # (𝔅𝔅; 𝔅𝔅; 𝔅𝔅; B; B; ) MATHEMATICAL FRAKTUR CAPITAL B +1D507;1D507;1D507;0044;0044; # (𝔇𝔇; 𝔇𝔇; 𝔇𝔇; D; D; ) MATHEMATICAL FRAKTUR CAPITAL D +1D508;1D508;1D508;0045;0045; # (𝔈𝔈; 𝔈𝔈; 𝔈𝔈; E; E; ) MATHEMATICAL FRAKTUR CAPITAL E +1D509;1D509;1D509;0046;0046; # (𝔉𝔉; 𝔉𝔉; 𝔉𝔉; F; F; ) MATHEMATICAL FRAKTUR CAPITAL F +1D50A;1D50A;1D50A;0047;0047; # (𝔊𝔊; 𝔊𝔊; 𝔊𝔊; G; G; ) MATHEMATICAL FRAKTUR CAPITAL G +1D50D;1D50D;1D50D;004A;004A; # (𝔍𝔍; 𝔍𝔍; 𝔍𝔍; J; J; ) MATHEMATICAL FRAKTUR CAPITAL J +1D50E;1D50E;1D50E;004B;004B; # (𝔎𝔎; 𝔎𝔎; 𝔎𝔎; K; K; ) MATHEMATICAL FRAKTUR CAPITAL K +1D50F;1D50F;1D50F;004C;004C; # (𝔏𝔏; 𝔏𝔏; 𝔏𝔏; L; L; ) MATHEMATICAL FRAKTUR CAPITAL L +1D510;1D510;1D510;004D;004D; # (𝔐𝔐; 𝔐𝔐; 𝔐𝔐; M; M; ) MATHEMATICAL FRAKTUR CAPITAL M +1D511;1D511;1D511;004E;004E; # (𝔑𝔑; 𝔑𝔑; 𝔑𝔑; N; N; ) MATHEMATICAL FRAKTUR CAPITAL N +1D512;1D512;1D512;004F;004F; # (𝔒𝔒; 𝔒𝔒; 𝔒𝔒; O; O; ) MATHEMATICAL FRAKTUR CAPITAL O +1D513;1D513;1D513;0050;0050; # (𝔓𝔓; 𝔓𝔓; 𝔓𝔓; P; P; ) MATHEMATICAL FRAKTUR CAPITAL P +1D514;1D514;1D514;0051;0051; # (𝔔𝔔; 𝔔𝔔; 𝔔𝔔; Q; Q; ) MATHEMATICAL FRAKTUR CAPITAL Q +1D516;1D516;1D516;0053;0053; # (𝔖𝔖; 𝔖𝔖; 𝔖𝔖; S; S; ) MATHEMATICAL FRAKTUR CAPITAL S +1D517;1D517;1D517;0054;0054; # (𝔗𝔗; 𝔗𝔗; 𝔗𝔗; T; T; ) MATHEMATICAL FRAKTUR CAPITAL T +1D518;1D518;1D518;0055;0055; # (𝔘𝔘; 𝔘𝔘; 𝔘𝔘; U; U; ) MATHEMATICAL FRAKTUR CAPITAL U +1D519;1D519;1D519;0056;0056; # (𝔙𝔙; 𝔙𝔙; 𝔙𝔙; V; V; ) MATHEMATICAL FRAKTUR CAPITAL V +1D51A;1D51A;1D51A;0057;0057; # (𝔚𝔚; 𝔚𝔚; 𝔚𝔚; W; W; ) MATHEMATICAL FRAKTUR CAPITAL W +1D51B;1D51B;1D51B;0058;0058; # (𝔛𝔛; 𝔛𝔛; 𝔛𝔛; X; X; ) MATHEMATICAL FRAKTUR CAPITAL X +1D51C;1D51C;1D51C;0059;0059; # (𝔜𝔜; 𝔜𝔜; 𝔜𝔜; Y; Y; ) MATHEMATICAL FRAKTUR CAPITAL Y +1D51E;1D51E;1D51E;0061;0061; # (𝔞𝔞; 𝔞𝔞; 𝔞𝔞; a; a; ) MATHEMATICAL FRAKTUR SMALL A +1D51F;1D51F;1D51F;0062;0062; # (𝔟𝔟; 𝔟𝔟; 𝔟𝔟; b; b; ) MATHEMATICAL FRAKTUR SMALL B +1D520;1D520;1D520;0063;0063; # (𝔠𝔠; 𝔠𝔠; 𝔠𝔠; c; c; ) MATHEMATICAL FRAKTUR SMALL C +1D521;1D521;1D521;0064;0064; # (𝔡𝔡; 𝔡𝔡; 𝔡𝔡; d; d; ) MATHEMATICAL FRAKTUR SMALL D +1D522;1D522;1D522;0065;0065; # (𝔢𝔢; 𝔢𝔢; 𝔢𝔢; e; e; ) MATHEMATICAL FRAKTUR SMALL E +1D523;1D523;1D523;0066;0066; # (𝔣𝔣; 𝔣𝔣; 𝔣𝔣; f; f; ) MATHEMATICAL FRAKTUR SMALL F +1D524;1D524;1D524;0067;0067; # (𝔤𝔤; 𝔤𝔤; 𝔤𝔤; g; g; ) MATHEMATICAL FRAKTUR SMALL G +1D525;1D525;1D525;0068;0068; # (𝔥𝔥; 𝔥𝔥; 𝔥𝔥; h; h; ) MATHEMATICAL FRAKTUR SMALL H +1D526;1D526;1D526;0069;0069; # (𝔦𝔦; 𝔦𝔦; 𝔦𝔦; i; i; ) MATHEMATICAL FRAKTUR SMALL I +1D527;1D527;1D527;006A;006A; # (𝔧𝔧; 𝔧𝔧; 𝔧𝔧; j; j; ) MATHEMATICAL FRAKTUR SMALL J +1D528;1D528;1D528;006B;006B; # (𝔨𝔨; 𝔨𝔨; 𝔨𝔨; k; k; ) MATHEMATICAL FRAKTUR SMALL K +1D529;1D529;1D529;006C;006C; # (𝔩𝔩; 𝔩𝔩; 𝔩𝔩; l; l; ) MATHEMATICAL FRAKTUR SMALL L +1D52A;1D52A;1D52A;006D;006D; # (𝔪𝔪; 𝔪𝔪; 𝔪𝔪; m; m; ) MATHEMATICAL FRAKTUR SMALL M +1D52B;1D52B;1D52B;006E;006E; # (𝔫𝔫; 𝔫𝔫; 𝔫𝔫; n; n; ) MATHEMATICAL FRAKTUR SMALL N +1D52C;1D52C;1D52C;006F;006F; # (𝔬𝔬; 𝔬𝔬; 𝔬𝔬; o; o; ) MATHEMATICAL FRAKTUR SMALL O +1D52D;1D52D;1D52D;0070;0070; # (𝔭𝔭; 𝔭𝔭; 𝔭𝔭; p; p; ) MATHEMATICAL FRAKTUR SMALL P +1D52E;1D52E;1D52E;0071;0071; # (𝔮𝔮; 𝔮𝔮; 𝔮𝔮; q; q; ) MATHEMATICAL FRAKTUR SMALL Q +1D52F;1D52F;1D52F;0072;0072; # (𝔯𝔯; 𝔯𝔯; 𝔯𝔯; r; r; ) MATHEMATICAL FRAKTUR SMALL R +1D530;1D530;1D530;0073;0073; # (𝔰𝔰; 𝔰𝔰; 𝔰𝔰; s; s; ) MATHEMATICAL FRAKTUR SMALL S +1D531;1D531;1D531;0074;0074; # (𝔱𝔱; 𝔱𝔱; 𝔱𝔱; t; t; ) MATHEMATICAL FRAKTUR SMALL T +1D532;1D532;1D532;0075;0075; # (𝔲𝔲; 𝔲𝔲; 𝔲𝔲; u; u; ) MATHEMATICAL FRAKTUR SMALL U +1D533;1D533;1D533;0076;0076; # (𝔳𝔳; 𝔳𝔳; 𝔳𝔳; v; v; ) MATHEMATICAL FRAKTUR SMALL V +1D534;1D534;1D534;0077;0077; # (𝔴𝔴; 𝔴𝔴; 𝔴𝔴; w; w; ) MATHEMATICAL FRAKTUR SMALL W +1D535;1D535;1D535;0078;0078; # (𝔵𝔵; 𝔵𝔵; 𝔵𝔵; x; x; ) MATHEMATICAL FRAKTUR SMALL X +1D536;1D536;1D536;0079;0079; # (𝔶𝔶; 𝔶𝔶; 𝔶𝔶; y; y; ) MATHEMATICAL FRAKTUR SMALL Y +1D537;1D537;1D537;007A;007A; # (𝔷𝔷; 𝔷𝔷; 𝔷𝔷; z; z; ) MATHEMATICAL FRAKTUR SMALL Z +1D538;1D538;1D538;0041;0041; # (𝔸𝔸; 𝔸𝔸; 𝔸𝔸; A; A; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539;1D539;1D539;0042;0042; # (𝔹𝔹; 𝔹𝔹; 𝔹𝔹; B; B; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B;1D53B;1D53B;0044;0044; # (𝔻𝔻; 𝔻𝔻; 𝔻𝔻; D; D; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C;1D53C;1D53C;0045;0045; # (𝔼𝔼; 𝔼𝔼; 𝔼𝔼; E; E; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D;1D53D;1D53D;0046;0046; # (𝔽𝔽; 𝔽𝔽; 𝔽𝔽; F; F; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E;1D53E;1D53E;0047;0047; # (𝔾𝔾; 𝔾𝔾; 𝔾𝔾; G; G; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540;1D540;1D540;0049;0049; # (𝕀𝕀; 𝕀𝕀; 𝕀𝕀; I; I; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541;1D541;1D541;004A;004A; # (𝕁𝕁; 𝕁𝕁; 𝕁𝕁; J; J; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542;1D542;1D542;004B;004B; # (𝕂𝕂; 𝕂𝕂; 𝕂𝕂; K; K; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543;1D543;1D543;004C;004C; # (𝕃𝕃; 𝕃𝕃; 𝕃𝕃; L; L; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544;1D544;1D544;004D;004D; # (𝕄𝕄; 𝕄𝕄; 𝕄𝕄; M; M; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546;1D546;1D546;004F;004F; # (𝕆𝕆; 𝕆𝕆; 𝕆𝕆; O; O; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A;1D54A;1D54A;0053;0053; # (𝕊𝕊; 𝕊𝕊; 𝕊𝕊; S; S; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B;1D54B;1D54B;0054;0054; # (𝕋𝕋; 𝕋𝕋; 𝕋𝕋; T; T; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C;1D54C;1D54C;0055;0055; # (𝕌𝕌; 𝕌𝕌; 𝕌𝕌; U; U; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D;1D54D;1D54D;0056;0056; # (𝕍𝕍; 𝕍𝕍; 𝕍𝕍; V; V; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E;1D54E;1D54E;0057;0057; # (𝕎𝕎; 𝕎𝕎; 𝕎𝕎; W; W; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F;1D54F;1D54F;0058;0058; # (𝕏𝕏; 𝕏𝕏; 𝕏𝕏; X; X; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550;1D550;1D550;0059;0059; # (𝕐𝕐; 𝕐𝕐; 𝕐𝕐; Y; Y; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552;1D552;1D552;0061;0061; # (𝕒𝕒; 𝕒𝕒; 𝕒𝕒; a; a; ) MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553;1D553;1D553;0062;0062; # (𝕓𝕓; 𝕓𝕓; 𝕓𝕓; b; b; ) MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554;1D554;1D554;0063;0063; # (𝕔𝕔; 𝕔𝕔; 𝕔𝕔; c; c; ) MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555;1D555;1D555;0064;0064; # (𝕕𝕕; 𝕕𝕕; 𝕕𝕕; d; d; ) MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556;1D556;1D556;0065;0065; # (𝕖𝕖; 𝕖𝕖; 𝕖𝕖; e; e; ) MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557;1D557;1D557;0066;0066; # (𝕗𝕗; 𝕗𝕗; 𝕗𝕗; f; f; ) MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558;1D558;1D558;0067;0067; # (𝕘𝕘; 𝕘𝕘; 𝕘𝕘; g; g; ) MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559;1D559;1D559;0068;0068; # (𝕙𝕙; 𝕙𝕙; 𝕙𝕙; h; h; ) MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A;1D55A;1D55A;0069;0069; # (𝕚𝕚; 𝕚𝕚; 𝕚𝕚; i; i; ) MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B;1D55B;1D55B;006A;006A; # (𝕛𝕛; 𝕛𝕛; 𝕛𝕛; j; j; ) MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C;1D55C;1D55C;006B;006B; # (𝕜𝕜; 𝕜𝕜; 𝕜𝕜; k; k; ) MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D;1D55D;1D55D;006C;006C; # (𝕝𝕝; 𝕝𝕝; 𝕝𝕝; l; l; ) MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E;1D55E;1D55E;006D;006D; # (𝕞𝕞; 𝕞𝕞; 𝕞𝕞; m; m; ) MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F;1D55F;1D55F;006E;006E; # (𝕟𝕟; 𝕟𝕟; 𝕟𝕟; n; n; ) MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560;1D560;1D560;006F;006F; # (𝕠𝕠; 𝕠𝕠; 𝕠𝕠; o; o; ) MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561;1D561;1D561;0070;0070; # (𝕡𝕡; 𝕡𝕡; 𝕡𝕡; p; p; ) MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562;1D562;1D562;0071;0071; # (𝕢𝕢; 𝕢𝕢; 𝕢𝕢; q; q; ) MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563;1D563;1D563;0072;0072; # (𝕣𝕣; 𝕣𝕣; 𝕣𝕣; r; r; ) MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564;1D564;1D564;0073;0073; # (𝕤𝕤; 𝕤𝕤; 𝕤𝕤; s; s; ) MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565;1D565;1D565;0074;0074; # (𝕥𝕥; 𝕥𝕥; 𝕥𝕥; t; t; ) MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566;1D566;1D566;0075;0075; # (𝕦𝕦; 𝕦𝕦; 𝕦𝕦; u; u; ) MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567;1D567;1D567;0076;0076; # (𝕧𝕧; 𝕧𝕧; 𝕧𝕧; v; v; ) MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568;1D568;1D568;0077;0077; # (𝕨𝕨; 𝕨𝕨; 𝕨𝕨; w; w; ) MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569;1D569;1D569;0078;0078; # (𝕩𝕩; 𝕩𝕩; 𝕩𝕩; x; x; ) MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A;1D56A;1D56A;0079;0079; # (𝕪𝕪; 𝕪𝕪; 𝕪𝕪; y; y; ) MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B;1D56B;1D56B;007A;007A; # (𝕫𝕫; 𝕫𝕫; 𝕫𝕫; z; z; ) MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C;1D56C;1D56C;0041;0041; # (𝕬𝕬; 𝕬𝕬; 𝕬𝕬; A; A; ) MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D;1D56D;1D56D;0042;0042; # (𝕭𝕭; 𝕭𝕭; 𝕭𝕭; B; B; ) MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E;1D56E;1D56E;0043;0043; # (𝕮𝕮; 𝕮𝕮; 𝕮𝕮; C; C; ) MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F;1D56F;1D56F;0044;0044; # (𝕯𝕯; 𝕯𝕯; 𝕯𝕯; D; D; ) MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570;1D570;1D570;0045;0045; # (𝕰𝕰; 𝕰𝕰; 𝕰𝕰; E; E; ) MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571;1D571;1D571;0046;0046; # (𝕱𝕱; 𝕱𝕱; 𝕱𝕱; F; F; ) MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572;1D572;1D572;0047;0047; # (𝕲𝕲; 𝕲𝕲; 𝕲𝕲; G; G; ) MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573;1D573;1D573;0048;0048; # (𝕳𝕳; 𝕳𝕳; 𝕳𝕳; H; H; ) MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574;1D574;1D574;0049;0049; # (𝕴𝕴; 𝕴𝕴; 𝕴𝕴; I; I; ) MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575;1D575;1D575;004A;004A; # (𝕵𝕵; 𝕵𝕵; 𝕵𝕵; J; J; ) MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576;1D576;1D576;004B;004B; # (𝕶𝕶; 𝕶𝕶; 𝕶𝕶; K; K; ) MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577;1D577;1D577;004C;004C; # (𝕷𝕷; 𝕷𝕷; 𝕷𝕷; L; L; ) MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578;1D578;1D578;004D;004D; # (𝕸𝕸; 𝕸𝕸; 𝕸𝕸; M; M; ) MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579;1D579;1D579;004E;004E; # (𝕹𝕹; 𝕹𝕹; 𝕹𝕹; N; N; ) MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A;1D57A;1D57A;004F;004F; # (𝕺𝕺; 𝕺𝕺; 𝕺𝕺; O; O; ) MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B;1D57B;1D57B;0050;0050; # (𝕻𝕻; 𝕻𝕻; 𝕻𝕻; P; P; ) MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C;1D57C;1D57C;0051;0051; # (𝕼𝕼; 𝕼𝕼; 𝕼𝕼; Q; Q; ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D;1D57D;1D57D;0052;0052; # (𝕽𝕽; 𝕽𝕽; 𝕽𝕽; R; R; ) MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E;1D57E;1D57E;0053;0053; # (𝕾𝕾; 𝕾𝕾; 𝕾𝕾; S; S; ) MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F;1D57F;1D57F;0054;0054; # (𝕿𝕿; 𝕿𝕿; 𝕿𝕿; T; T; ) MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580;1D580;1D580;0055;0055; # (𝖀𝖀; 𝖀𝖀; 𝖀𝖀; U; U; ) MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581;1D581;1D581;0056;0056; # (𝖁𝖁; 𝖁𝖁; 𝖁𝖁; V; V; ) MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582;1D582;1D582;0057;0057; # (𝖂𝖂; 𝖂𝖂; 𝖂𝖂; W; W; ) MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583;1D583;1D583;0058;0058; # (𝖃𝖃; 𝖃𝖃; 𝖃𝖃; X; X; ) MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584;1D584;1D584;0059;0059; # (𝖄𝖄; 𝖄𝖄; 𝖄𝖄; Y; Y; ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585;1D585;1D585;005A;005A; # (𝖅𝖅; 𝖅𝖅; 𝖅𝖅; Z; Z; ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586;1D586;1D586;0061;0061; # (𝖆𝖆; 𝖆𝖆; 𝖆𝖆; a; a; ) MATHEMATICAL BOLD FRAKTUR SMALL A +1D587;1D587;1D587;0062;0062; # (𝖇𝖇; 𝖇𝖇; 𝖇𝖇; b; b; ) MATHEMATICAL BOLD FRAKTUR SMALL B +1D588;1D588;1D588;0063;0063; # (𝖈𝖈; 𝖈𝖈; 𝖈𝖈; c; c; ) MATHEMATICAL BOLD FRAKTUR SMALL C +1D589;1D589;1D589;0064;0064; # (𝖉𝖉; 𝖉𝖉; 𝖉𝖉; d; d; ) MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A;1D58A;1D58A;0065;0065; # (𝖊𝖊; 𝖊𝖊; 𝖊𝖊; e; e; ) MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B;1D58B;1D58B;0066;0066; # (𝖋𝖋; 𝖋𝖋; 𝖋𝖋; f; f; ) MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C;1D58C;1D58C;0067;0067; # (𝖌𝖌; 𝖌𝖌; 𝖌𝖌; g; g; ) MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D;1D58D;1D58D;0068;0068; # (𝖍𝖍; 𝖍𝖍; 𝖍𝖍; h; h; ) MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E;1D58E;1D58E;0069;0069; # (𝖎𝖎; 𝖎𝖎; 𝖎𝖎; i; i; ) MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F;1D58F;1D58F;006A;006A; # (𝖏𝖏; 𝖏𝖏; 𝖏𝖏; j; j; ) MATHEMATICAL BOLD FRAKTUR SMALL J +1D590;1D590;1D590;006B;006B; # (𝖐𝖐; 𝖐𝖐; 𝖐𝖐; k; k; ) MATHEMATICAL BOLD FRAKTUR SMALL K +1D591;1D591;1D591;006C;006C; # (𝖑𝖑; 𝖑𝖑; 𝖑𝖑; l; l; ) MATHEMATICAL BOLD FRAKTUR SMALL L +1D592;1D592;1D592;006D;006D; # (𝖒𝖒; 𝖒𝖒; 𝖒𝖒; m; m; ) MATHEMATICAL BOLD FRAKTUR SMALL M +1D593;1D593;1D593;006E;006E; # (𝖓𝖓; 𝖓𝖓; 𝖓𝖓; n; n; ) MATHEMATICAL BOLD FRAKTUR SMALL N +1D594;1D594;1D594;006F;006F; # (𝖔𝖔; 𝖔𝖔; 𝖔𝖔; o; o; ) MATHEMATICAL BOLD FRAKTUR SMALL O +1D595;1D595;1D595;0070;0070; # (𝖕𝖕; 𝖕𝖕; 𝖕𝖕; p; p; ) MATHEMATICAL BOLD FRAKTUR SMALL P +1D596;1D596;1D596;0071;0071; # (𝖖𝖖; 𝖖𝖖; 𝖖𝖖; q; q; ) MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597;1D597;1D597;0072;0072; # (𝖗𝖗; 𝖗𝖗; 𝖗𝖗; r; r; ) MATHEMATICAL BOLD FRAKTUR SMALL R +1D598;1D598;1D598;0073;0073; # (𝖘𝖘; 𝖘𝖘; 𝖘𝖘; s; s; ) MATHEMATICAL BOLD FRAKTUR SMALL S +1D599;1D599;1D599;0074;0074; # (𝖙𝖙; 𝖙𝖙; 𝖙𝖙; t; t; ) MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A;1D59A;1D59A;0075;0075; # (𝖚𝖚; 𝖚𝖚; 𝖚𝖚; u; u; ) MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B;1D59B;1D59B;0076;0076; # (𝖛𝖛; 𝖛𝖛; 𝖛𝖛; v; v; ) MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C;1D59C;1D59C;0077;0077; # (𝖜𝖜; 𝖜𝖜; 𝖜𝖜; w; w; ) MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D;1D59D;1D59D;0078;0078; # (𝖝𝖝; 𝖝𝖝; 𝖝𝖝; x; x; ) MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E;1D59E;1D59E;0079;0079; # (𝖞𝖞; 𝖞𝖞; 𝖞𝖞; y; y; ) MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F;1D59F;1D59F;007A;007A; # (𝖟𝖟; 𝖟𝖟; 𝖟𝖟; z; z; ) MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0;1D5A0;1D5A0;0041;0041; # (𝖠𝖠; 𝖠𝖠; 𝖠𝖠; A; A; ) MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1;1D5A1;1D5A1;0042;0042; # (𝖡𝖡; 𝖡𝖡; 𝖡𝖡; B; B; ) MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2;1D5A2;1D5A2;0043;0043; # (𝖢𝖢; 𝖢𝖢; 𝖢𝖢; C; C; ) MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3;1D5A3;1D5A3;0044;0044; # (𝖣𝖣; 𝖣𝖣; 𝖣𝖣; D; D; ) MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4;1D5A4;1D5A4;0045;0045; # (𝖤𝖤; 𝖤𝖤; 𝖤𝖤; E; E; ) MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5;1D5A5;1D5A5;0046;0046; # (𝖥𝖥; 𝖥𝖥; 𝖥𝖥; F; F; ) MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6;1D5A6;1D5A6;0047;0047; # (𝖦𝖦; 𝖦𝖦; 𝖦𝖦; G; G; ) MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7;1D5A7;1D5A7;0048;0048; # (𝖧𝖧; 𝖧𝖧; 𝖧𝖧; H; H; ) MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8;1D5A8;1D5A8;0049;0049; # (𝖨𝖨; 𝖨𝖨; 𝖨𝖨; I; I; ) MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9;1D5A9;1D5A9;004A;004A; # (𝖩𝖩; 𝖩𝖩; 𝖩𝖩; J; J; ) MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA;1D5AA;1D5AA;004B;004B; # (𝖪𝖪; 𝖪𝖪; 𝖪𝖪; K; K; ) MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB;1D5AB;1D5AB;004C;004C; # (𝖫𝖫; 𝖫𝖫; 𝖫𝖫; L; L; ) MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC;1D5AC;1D5AC;004D;004D; # (𝖬𝖬; 𝖬𝖬; 𝖬𝖬; M; M; ) MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD;1D5AD;1D5AD;004E;004E; # (𝖭𝖭; 𝖭𝖭; 𝖭𝖭; N; N; ) MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE;1D5AE;1D5AE;004F;004F; # (𝖮𝖮; 𝖮𝖮; 𝖮𝖮; O; O; ) MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF;1D5AF;1D5AF;0050;0050; # (𝖯𝖯; 𝖯𝖯; 𝖯𝖯; P; P; ) MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0;1D5B0;1D5B0;0051;0051; # (𝖰𝖰; 𝖰𝖰; 𝖰𝖰; Q; Q; ) MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1;1D5B1;1D5B1;0052;0052; # (𝖱𝖱; 𝖱𝖱; 𝖱𝖱; R; R; ) MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2;1D5B2;1D5B2;0053;0053; # (𝖲𝖲; 𝖲𝖲; 𝖲𝖲; S; S; ) MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3;1D5B3;1D5B3;0054;0054; # (𝖳𝖳; 𝖳𝖳; 𝖳𝖳; T; T; ) MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4;1D5B4;1D5B4;0055;0055; # (𝖴𝖴; 𝖴𝖴; 𝖴𝖴; U; U; ) MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5;1D5B5;1D5B5;0056;0056; # (𝖵𝖵; 𝖵𝖵; 𝖵𝖵; V; V; ) MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6;1D5B6;1D5B6;0057;0057; # (𝖶𝖶; 𝖶𝖶; 𝖶𝖶; W; W; ) MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7;1D5B7;1D5B7;0058;0058; # (𝖷𝖷; 𝖷𝖷; 𝖷𝖷; X; X; ) MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8;1D5B8;1D5B8;0059;0059; # (𝖸𝖸; 𝖸𝖸; 𝖸𝖸; Y; Y; ) MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9;1D5B9;1D5B9;005A;005A; # (𝖹𝖹; 𝖹𝖹; 𝖹𝖹; Z; Z; ) MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA;1D5BA;1D5BA;0061;0061; # (𝖺𝖺; 𝖺𝖺; 𝖺𝖺; a; a; ) MATHEMATICAL SANS-SERIF SMALL A +1D5BB;1D5BB;1D5BB;0062;0062; # (𝖻𝖻; 𝖻𝖻; 𝖻𝖻; b; b; ) MATHEMATICAL SANS-SERIF SMALL B +1D5BC;1D5BC;1D5BC;0063;0063; # (𝖼𝖼; 𝖼𝖼; 𝖼𝖼; c; c; ) MATHEMATICAL SANS-SERIF SMALL C +1D5BD;1D5BD;1D5BD;0064;0064; # (𝖽𝖽; 𝖽𝖽; 𝖽𝖽; d; d; ) MATHEMATICAL SANS-SERIF SMALL D +1D5BE;1D5BE;1D5BE;0065;0065; # (𝖾𝖾; 𝖾𝖾; 𝖾𝖾; e; e; ) MATHEMATICAL SANS-SERIF SMALL E +1D5BF;1D5BF;1D5BF;0066;0066; # (𝖿𝖿; 𝖿𝖿; 𝖿𝖿; f; f; ) MATHEMATICAL SANS-SERIF SMALL F +1D5C0;1D5C0;1D5C0;0067;0067; # (𝗀𝗀; 𝗀𝗀; 𝗀𝗀; g; g; ) MATHEMATICAL SANS-SERIF SMALL G +1D5C1;1D5C1;1D5C1;0068;0068; # (𝗁𝗁; 𝗁𝗁; 𝗁𝗁; h; h; ) MATHEMATICAL SANS-SERIF SMALL H +1D5C2;1D5C2;1D5C2;0069;0069; # (𝗂𝗂; 𝗂𝗂; 𝗂𝗂; i; i; ) MATHEMATICAL SANS-SERIF SMALL I +1D5C3;1D5C3;1D5C3;006A;006A; # (𝗃𝗃; 𝗃𝗃; 𝗃𝗃; j; j; ) MATHEMATICAL SANS-SERIF SMALL J +1D5C4;1D5C4;1D5C4;006B;006B; # (𝗄𝗄; 𝗄𝗄; 𝗄𝗄; k; k; ) MATHEMATICAL SANS-SERIF SMALL K +1D5C5;1D5C5;1D5C5;006C;006C; # (𝗅𝗅; 𝗅𝗅; 𝗅𝗅; l; l; ) MATHEMATICAL SANS-SERIF SMALL L +1D5C6;1D5C6;1D5C6;006D;006D; # (𝗆𝗆; 𝗆𝗆; 𝗆𝗆; m; m; ) MATHEMATICAL SANS-SERIF SMALL M +1D5C7;1D5C7;1D5C7;006E;006E; # (𝗇𝗇; 𝗇𝗇; 𝗇𝗇; n; n; ) MATHEMATICAL SANS-SERIF SMALL N +1D5C8;1D5C8;1D5C8;006F;006F; # (𝗈𝗈; 𝗈𝗈; 𝗈𝗈; o; o; ) MATHEMATICAL SANS-SERIF SMALL O +1D5C9;1D5C9;1D5C9;0070;0070; # (𝗉𝗉; 𝗉𝗉; 𝗉𝗉; p; p; ) MATHEMATICAL SANS-SERIF SMALL P +1D5CA;1D5CA;1D5CA;0071;0071; # (𝗊𝗊; 𝗊𝗊; 𝗊𝗊; q; q; ) MATHEMATICAL SANS-SERIF SMALL Q +1D5CB;1D5CB;1D5CB;0072;0072; # (𝗋𝗋; 𝗋𝗋; 𝗋𝗋; r; r; ) MATHEMATICAL SANS-SERIF SMALL R +1D5CC;1D5CC;1D5CC;0073;0073; # (𝗌𝗌; 𝗌𝗌; 𝗌𝗌; s; s; ) MATHEMATICAL SANS-SERIF SMALL S +1D5CD;1D5CD;1D5CD;0074;0074; # (𝗍𝗍; 𝗍𝗍; 𝗍𝗍; t; t; ) MATHEMATICAL SANS-SERIF SMALL T +1D5CE;1D5CE;1D5CE;0075;0075; # (𝗎𝗎; 𝗎𝗎; 𝗎𝗎; u; u; ) MATHEMATICAL SANS-SERIF SMALL U +1D5CF;1D5CF;1D5CF;0076;0076; # (𝗏𝗏; 𝗏𝗏; 𝗏𝗏; v; v; ) MATHEMATICAL SANS-SERIF SMALL V +1D5D0;1D5D0;1D5D0;0077;0077; # (𝗐𝗐; 𝗐𝗐; 𝗐𝗐; w; w; ) MATHEMATICAL SANS-SERIF SMALL W +1D5D1;1D5D1;1D5D1;0078;0078; # (𝗑𝗑; 𝗑𝗑; 𝗑𝗑; x; x; ) MATHEMATICAL SANS-SERIF SMALL X +1D5D2;1D5D2;1D5D2;0079;0079; # (𝗒𝗒; 𝗒𝗒; 𝗒𝗒; y; y; ) MATHEMATICAL SANS-SERIF SMALL Y +1D5D3;1D5D3;1D5D3;007A;007A; # (𝗓𝗓; 𝗓𝗓; 𝗓𝗓; z; z; ) MATHEMATICAL SANS-SERIF SMALL Z +1D5D4;1D5D4;1D5D4;0041;0041; # (𝗔𝗔; 𝗔𝗔; 𝗔𝗔; A; A; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5;1D5D5;1D5D5;0042;0042; # (𝗕𝗕; 𝗕𝗕; 𝗕𝗕; B; B; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6;1D5D6;1D5D6;0043;0043; # (𝗖𝗖; 𝗖𝗖; 𝗖𝗖; C; C; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7;1D5D7;1D5D7;0044;0044; # (𝗗𝗗; 𝗗𝗗; 𝗗𝗗; D; D; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8;1D5D8;1D5D8;0045;0045; # (𝗘𝗘; 𝗘𝗘; 𝗘𝗘; E; E; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9;1D5D9;1D5D9;0046;0046; # (𝗙𝗙; 𝗙𝗙; 𝗙𝗙; F; F; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA;1D5DA;1D5DA;0047;0047; # (𝗚𝗚; 𝗚𝗚; 𝗚𝗚; G; G; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB;1D5DB;1D5DB;0048;0048; # (𝗛𝗛; 𝗛𝗛; 𝗛𝗛; H; H; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC;1D5DC;1D5DC;0049;0049; # (𝗜𝗜; 𝗜𝗜; 𝗜𝗜; I; I; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD;1D5DD;1D5DD;004A;004A; # (𝗝𝗝; 𝗝𝗝; 𝗝𝗝; J; J; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE;1D5DE;1D5DE;004B;004B; # (𝗞𝗞; 𝗞𝗞; 𝗞𝗞; K; K; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF;1D5DF;1D5DF;004C;004C; # (𝗟𝗟; 𝗟𝗟; 𝗟𝗟; L; L; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0;1D5E0;1D5E0;004D;004D; # (𝗠𝗠; 𝗠𝗠; 𝗠𝗠; M; M; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1;1D5E1;1D5E1;004E;004E; # (𝗡𝗡; 𝗡𝗡; 𝗡𝗡; N; N; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2;1D5E2;1D5E2;004F;004F; # (𝗢𝗢; 𝗢𝗢; 𝗢𝗢; O; O; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3;1D5E3;1D5E3;0050;0050; # (𝗣𝗣; 𝗣𝗣; 𝗣𝗣; P; P; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4;1D5E4;1D5E4;0051;0051; # (𝗤𝗤; 𝗤𝗤; 𝗤𝗤; Q; Q; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5;1D5E5;1D5E5;0052;0052; # (𝗥𝗥; 𝗥𝗥; 𝗥𝗥; R; R; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6;1D5E6;1D5E6;0053;0053; # (𝗦𝗦; 𝗦𝗦; 𝗦𝗦; S; S; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7;1D5E7;1D5E7;0054;0054; # (𝗧𝗧; 𝗧𝗧; 𝗧𝗧; T; T; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8;1D5E8;1D5E8;0055;0055; # (𝗨𝗨; 𝗨𝗨; 𝗨𝗨; U; U; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9;1D5E9;1D5E9;0056;0056; # (𝗩𝗩; 𝗩𝗩; 𝗩𝗩; V; V; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA;1D5EA;1D5EA;0057;0057; # (𝗪𝗪; 𝗪𝗪; 𝗪𝗪; W; W; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB;1D5EB;1D5EB;0058;0058; # (𝗫𝗫; 𝗫𝗫; 𝗫𝗫; X; X; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC;1D5EC;1D5EC;0059;0059; # (𝗬𝗬; 𝗬𝗬; 𝗬𝗬; Y; Y; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED;1D5ED;1D5ED;005A;005A; # (𝗭𝗭; 𝗭𝗭; 𝗭𝗭; Z; Z; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE;1D5EE;1D5EE;0061;0061; # (𝗮𝗮; 𝗮𝗮; 𝗮𝗮; a; a; ) MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF;1D5EF;1D5EF;0062;0062; # (𝗯𝗯; 𝗯𝗯; 𝗯𝗯; b; b; ) MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0;1D5F0;1D5F0;0063;0063; # (𝗰𝗰; 𝗰𝗰; 𝗰𝗰; c; c; ) MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1;1D5F1;1D5F1;0064;0064; # (𝗱𝗱; 𝗱𝗱; 𝗱𝗱; d; d; ) MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2;1D5F2;1D5F2;0065;0065; # (𝗲𝗲; 𝗲𝗲; 𝗲𝗲; e; e; ) MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3;1D5F3;1D5F3;0066;0066; # (𝗳𝗳; 𝗳𝗳; 𝗳𝗳; f; f; ) MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4;1D5F4;1D5F4;0067;0067; # (𝗴𝗴; 𝗴𝗴; 𝗴𝗴; g; g; ) MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5;1D5F5;1D5F5;0068;0068; # (𝗵𝗵; 𝗵𝗵; 𝗵𝗵; h; h; ) MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6;1D5F6;1D5F6;0069;0069; # (𝗶𝗶; 𝗶𝗶; 𝗶𝗶; i; i; ) MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7;1D5F7;1D5F7;006A;006A; # (𝗷𝗷; 𝗷𝗷; 𝗷𝗷; j; j; ) MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8;1D5F8;1D5F8;006B;006B; # (𝗸𝗸; 𝗸𝗸; 𝗸𝗸; k; k; ) MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9;1D5F9;1D5F9;006C;006C; # (𝗹𝗹; 𝗹𝗹; 𝗹𝗹; l; l; ) MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA;1D5FA;1D5FA;006D;006D; # (𝗺𝗺; 𝗺𝗺; 𝗺𝗺; m; m; ) MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB;1D5FB;1D5FB;006E;006E; # (𝗻𝗻; 𝗻𝗻; 𝗻𝗻; n; n; ) MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC;1D5FC;1D5FC;006F;006F; # (𝗼𝗼; 𝗼𝗼; 𝗼𝗼; o; o; ) MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD;1D5FD;1D5FD;0070;0070; # (𝗽𝗽; 𝗽𝗽; 𝗽𝗽; p; p; ) MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE;1D5FE;1D5FE;0071;0071; # (𝗾𝗾; 𝗾𝗾; 𝗾𝗾; q; q; ) MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF;1D5FF;1D5FF;0072;0072; # (𝗿𝗿; 𝗿𝗿; 𝗿𝗿; r; r; ) MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600;1D600;1D600;0073;0073; # (𝘀𝘀; 𝘀𝘀; 𝘀𝘀; s; s; ) MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601;1D601;1D601;0074;0074; # (𝘁𝘁; 𝘁𝘁; 𝘁𝘁; t; t; ) MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602;1D602;1D602;0075;0075; # (𝘂𝘂; 𝘂𝘂; 𝘂𝘂; u; u; ) MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603;1D603;1D603;0076;0076; # (𝘃𝘃; 𝘃𝘃; 𝘃𝘃; v; v; ) MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604;1D604;1D604;0077;0077; # (𝘄𝘄; 𝘄𝘄; 𝘄𝘄; w; w; ) MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605;1D605;1D605;0078;0078; # (𝘅𝘅; 𝘅𝘅; 𝘅𝘅; x; x; ) MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606;1D606;1D606;0079;0079; # (𝘆𝘆; 𝘆𝘆; 𝘆𝘆; y; y; ) MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607;1D607;1D607;007A;007A; # (𝘇𝘇; 𝘇𝘇; 𝘇𝘇; z; z; ) MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608;1D608;1D608;0041;0041; # (𝘈𝘈; 𝘈𝘈; 𝘈𝘈; A; A; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609;1D609;1D609;0042;0042; # (𝘉𝘉; 𝘉𝘉; 𝘉𝘉; B; B; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A;1D60A;1D60A;0043;0043; # (𝘊𝘊; 𝘊𝘊; 𝘊𝘊; C; C; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B;1D60B;1D60B;0044;0044; # (𝘋𝘋; 𝘋𝘋; 𝘋𝘋; D; D; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C;1D60C;1D60C;0045;0045; # (𝘌𝘌; 𝘌𝘌; 𝘌𝘌; E; E; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D;1D60D;1D60D;0046;0046; # (𝘍𝘍; 𝘍𝘍; 𝘍𝘍; F; F; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E;1D60E;1D60E;0047;0047; # (𝘎𝘎; 𝘎𝘎; 𝘎𝘎; G; G; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F;1D60F;1D60F;0048;0048; # (𝘏𝘏; 𝘏𝘏; 𝘏𝘏; H; H; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610;1D610;1D610;0049;0049; # (𝘐𝘐; 𝘐𝘐; 𝘐𝘐; I; I; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611;1D611;1D611;004A;004A; # (𝘑𝘑; 𝘑𝘑; 𝘑𝘑; J; J; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612;1D612;1D612;004B;004B; # (𝘒𝘒; 𝘒𝘒; 𝘒𝘒; K; K; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613;1D613;1D613;004C;004C; # (𝘓𝘓; 𝘓𝘓; 𝘓𝘓; L; L; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614;1D614;1D614;004D;004D; # (𝘔𝘔; 𝘔𝘔; 𝘔𝘔; M; M; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615;1D615;1D615;004E;004E; # (𝘕𝘕; 𝘕𝘕; 𝘕𝘕; N; N; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616;1D616;1D616;004F;004F; # (𝘖𝘖; 𝘖𝘖; 𝘖𝘖; O; O; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617;1D617;1D617;0050;0050; # (𝘗𝘗; 𝘗𝘗; 𝘗𝘗; P; P; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618;1D618;1D618;0051;0051; # (𝘘𝘘; 𝘘𝘘; 𝘘𝘘; Q; Q; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619;1D619;1D619;0052;0052; # (𝘙𝘙; 𝘙𝘙; 𝘙𝘙; R; R; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A;1D61A;1D61A;0053;0053; # (𝘚𝘚; 𝘚𝘚; 𝘚𝘚; S; S; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B;1D61B;1D61B;0054;0054; # (𝘛𝘛; 𝘛𝘛; 𝘛𝘛; T; T; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C;1D61C;1D61C;0055;0055; # (𝘜𝘜; 𝘜𝘜; 𝘜𝘜; U; U; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D;1D61D;1D61D;0056;0056; # (𝘝𝘝; 𝘝𝘝; 𝘝𝘝; V; V; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E;1D61E;1D61E;0057;0057; # (𝘞𝘞; 𝘞𝘞; 𝘞𝘞; W; W; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F;1D61F;1D61F;0058;0058; # (𝘟𝘟; 𝘟𝘟; 𝘟𝘟; X; X; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620;1D620;1D620;0059;0059; # (𝘠𝘠; 𝘠𝘠; 𝘠𝘠; Y; Y; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621;1D621;1D621;005A;005A; # (𝘡𝘡; 𝘡𝘡; 𝘡𝘡; Z; Z; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622;1D622;1D622;0061;0061; # (𝘢𝘢; 𝘢𝘢; 𝘢𝘢; a; a; ) MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623;1D623;1D623;0062;0062; # (𝘣𝘣; 𝘣𝘣; 𝘣𝘣; b; b; ) MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624;1D624;1D624;0063;0063; # (𝘤𝘤; 𝘤𝘤; 𝘤𝘤; c; c; ) MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625;1D625;1D625;0064;0064; # (𝘥𝘥; 𝘥𝘥; 𝘥𝘥; d; d; ) MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626;1D626;1D626;0065;0065; # (𝘦𝘦; 𝘦𝘦; 𝘦𝘦; e; e; ) MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627;1D627;1D627;0066;0066; # (𝘧𝘧; 𝘧𝘧; 𝘧𝘧; f; f; ) MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628;1D628;1D628;0067;0067; # (𝘨𝘨; 𝘨𝘨; 𝘨𝘨; g; g; ) MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629;1D629;1D629;0068;0068; # (𝘩𝘩; 𝘩𝘩; 𝘩𝘩; h; h; ) MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A;1D62A;1D62A;0069;0069; # (𝘪𝘪; 𝘪𝘪; 𝘪𝘪; i; i; ) MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B;1D62B;1D62B;006A;006A; # (𝘫𝘫; 𝘫𝘫; 𝘫𝘫; j; j; ) MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C;1D62C;1D62C;006B;006B; # (𝘬𝘬; 𝘬𝘬; 𝘬𝘬; k; k; ) MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D;1D62D;1D62D;006C;006C; # (𝘭𝘭; 𝘭𝘭; 𝘭𝘭; l; l; ) MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E;1D62E;1D62E;006D;006D; # (𝘮𝘮; 𝘮𝘮; 𝘮𝘮; m; m; ) MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F;1D62F;1D62F;006E;006E; # (𝘯𝘯; 𝘯𝘯; 𝘯𝘯; n; n; ) MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630;1D630;1D630;006F;006F; # (𝘰𝘰; 𝘰𝘰; 𝘰𝘰; o; o; ) MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631;1D631;1D631;0070;0070; # (𝘱𝘱; 𝘱𝘱; 𝘱𝘱; p; p; ) MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632;1D632;1D632;0071;0071; # (𝘲𝘲; 𝘲𝘲; 𝘲𝘲; q; q; ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633;1D633;1D633;0072;0072; # (𝘳𝘳; 𝘳𝘳; 𝘳𝘳; r; r; ) MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634;1D634;1D634;0073;0073; # (𝘴𝘴; 𝘴𝘴; 𝘴𝘴; s; s; ) MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635;1D635;1D635;0074;0074; # (𝘵𝘵; 𝘵𝘵; 𝘵𝘵; t; t; ) MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636;1D636;1D636;0075;0075; # (𝘶𝘶; 𝘶𝘶; 𝘶𝘶; u; u; ) MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637;1D637;1D637;0076;0076; # (𝘷𝘷; 𝘷𝘷; 𝘷𝘷; v; v; ) MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638;1D638;1D638;0077;0077; # (𝘸𝘸; 𝘸𝘸; 𝘸𝘸; w; w; ) MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639;1D639;1D639;0078;0078; # (𝘹𝘹; 𝘹𝘹; 𝘹𝘹; x; x; ) MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A;1D63A;1D63A;0079;0079; # (𝘺𝘺; 𝘺𝘺; 𝘺𝘺; y; y; ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B;1D63B;1D63B;007A;007A; # (𝘻𝘻; 𝘻𝘻; 𝘻𝘻; z; z; ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C;1D63C;1D63C;0041;0041; # (𝘼𝘼; 𝘼𝘼; 𝘼𝘼; A; A; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D;1D63D;1D63D;0042;0042; # (𝘽𝘽; 𝘽𝘽; 𝘽𝘽; B; B; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E;1D63E;1D63E;0043;0043; # (𝘾𝘾; 𝘾𝘾; 𝘾𝘾; C; C; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F;1D63F;1D63F;0044;0044; # (𝘿𝘿; 𝘿𝘿; 𝘿𝘿; D; D; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640;1D640;1D640;0045;0045; # (𝙀𝙀; 𝙀𝙀; 𝙀𝙀; E; E; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641;1D641;1D641;0046;0046; # (𝙁𝙁; 𝙁𝙁; 𝙁𝙁; F; F; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642;1D642;1D642;0047;0047; # (𝙂𝙂; 𝙂𝙂; 𝙂𝙂; G; G; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643;1D643;1D643;0048;0048; # (𝙃𝙃; 𝙃𝙃; 𝙃𝙃; H; H; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644;1D644;1D644;0049;0049; # (𝙄𝙄; 𝙄𝙄; 𝙄𝙄; I; I; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645;1D645;1D645;004A;004A; # (𝙅𝙅; 𝙅𝙅; 𝙅𝙅; J; J; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646;1D646;1D646;004B;004B; # (𝙆𝙆; 𝙆𝙆; 𝙆𝙆; K; K; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647;1D647;1D647;004C;004C; # (𝙇𝙇; 𝙇𝙇; 𝙇𝙇; L; L; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648;1D648;1D648;004D;004D; # (𝙈𝙈; 𝙈𝙈; 𝙈𝙈; M; M; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649;1D649;1D649;004E;004E; # (𝙉𝙉; 𝙉𝙉; 𝙉𝙉; N; N; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A;1D64A;1D64A;004F;004F; # (𝙊𝙊; 𝙊𝙊; 𝙊𝙊; O; O; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B;1D64B;1D64B;0050;0050; # (𝙋𝙋; 𝙋𝙋; 𝙋𝙋; P; P; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C;1D64C;1D64C;0051;0051; # (𝙌𝙌; 𝙌𝙌; 𝙌𝙌; Q; Q; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D;1D64D;1D64D;0052;0052; # (𝙍𝙍; 𝙍𝙍; 𝙍𝙍; R; R; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E;1D64E;1D64E;0053;0053; # (𝙎𝙎; 𝙎𝙎; 𝙎𝙎; S; S; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F;1D64F;1D64F;0054;0054; # (𝙏𝙏; 𝙏𝙏; 𝙏𝙏; T; T; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650;1D650;1D650;0055;0055; # (𝙐𝙐; 𝙐𝙐; 𝙐𝙐; U; U; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651;1D651;1D651;0056;0056; # (𝙑𝙑; 𝙑𝙑; 𝙑𝙑; V; V; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652;1D652;1D652;0057;0057; # (𝙒𝙒; 𝙒𝙒; 𝙒𝙒; W; W; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653;1D653;1D653;0058;0058; # (𝙓𝙓; 𝙓𝙓; 𝙓𝙓; X; X; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654;1D654;1D654;0059;0059; # (𝙔𝙔; 𝙔𝙔; 𝙔𝙔; Y; Y; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655;1D655;1D655;005A;005A; # (𝙕𝙕; 𝙕𝙕; 𝙕𝙕; Z; Z; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656;1D656;1D656;0061;0061; # (𝙖𝙖; 𝙖𝙖; 𝙖𝙖; a; a; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657;1D657;1D657;0062;0062; # (𝙗𝙗; 𝙗𝙗; 𝙗𝙗; b; b; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658;1D658;1D658;0063;0063; # (𝙘𝙘; 𝙘𝙘; 𝙘𝙘; c; c; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659;1D659;1D659;0064;0064; # (𝙙𝙙; 𝙙𝙙; 𝙙𝙙; d; d; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A;1D65A;1D65A;0065;0065; # (𝙚𝙚; 𝙚𝙚; 𝙚𝙚; e; e; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B;1D65B;1D65B;0066;0066; # (𝙛𝙛; 𝙛𝙛; 𝙛𝙛; f; f; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C;1D65C;1D65C;0067;0067; # (𝙜𝙜; 𝙜𝙜; 𝙜𝙜; g; g; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D;1D65D;1D65D;0068;0068; # (𝙝𝙝; 𝙝𝙝; 𝙝𝙝; h; h; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E;1D65E;1D65E;0069;0069; # (𝙞𝙞; 𝙞𝙞; 𝙞𝙞; i; i; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F;1D65F;1D65F;006A;006A; # (𝙟𝙟; 𝙟𝙟; 𝙟𝙟; j; j; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660;1D660;1D660;006B;006B; # (𝙠𝙠; 𝙠𝙠; 𝙠𝙠; k; k; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661;1D661;1D661;006C;006C; # (𝙡𝙡; 𝙡𝙡; 𝙡𝙡; l; l; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662;1D662;1D662;006D;006D; # (𝙢𝙢; 𝙢𝙢; 𝙢𝙢; m; m; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663;1D663;1D663;006E;006E; # (𝙣𝙣; 𝙣𝙣; 𝙣𝙣; n; n; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664;1D664;1D664;006F;006F; # (𝙤𝙤; 𝙤𝙤; 𝙤𝙤; o; o; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665;1D665;1D665;0070;0070; # (𝙥𝙥; 𝙥𝙥; 𝙥𝙥; p; p; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666;1D666;1D666;0071;0071; # (𝙦𝙦; 𝙦𝙦; 𝙦𝙦; q; q; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667;1D667;1D667;0072;0072; # (𝙧𝙧; 𝙧𝙧; 𝙧𝙧; r; r; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668;1D668;1D668;0073;0073; # (𝙨𝙨; 𝙨𝙨; 𝙨𝙨; s; s; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669;1D669;1D669;0074;0074; # (𝙩𝙩; 𝙩𝙩; 𝙩𝙩; t; t; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A;1D66A;1D66A;0075;0075; # (𝙪𝙪; 𝙪𝙪; 𝙪𝙪; u; u; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B;1D66B;1D66B;0076;0076; # (𝙫𝙫; 𝙫𝙫; 𝙫𝙫; v; v; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C;1D66C;1D66C;0077;0077; # (𝙬𝙬; 𝙬𝙬; 𝙬𝙬; w; w; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D;1D66D;1D66D;0078;0078; # (𝙭𝙭; 𝙭𝙭; 𝙭𝙭; x; x; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E;1D66E;1D66E;0079;0079; # (𝙮𝙮; 𝙮𝙮; 𝙮𝙮; y; y; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F;1D66F;1D66F;007A;007A; # (𝙯𝙯; 𝙯𝙯; 𝙯𝙯; z; z; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670;1D670;1D670;0041;0041; # (𝙰𝙰; 𝙰𝙰; 𝙰𝙰; A; A; ) MATHEMATICAL MONOSPACE CAPITAL A +1D671;1D671;1D671;0042;0042; # (𝙱𝙱; 𝙱𝙱; 𝙱𝙱; B; B; ) MATHEMATICAL MONOSPACE CAPITAL B +1D672;1D672;1D672;0043;0043; # (𝙲𝙲; 𝙲𝙲; 𝙲𝙲; C; C; ) MATHEMATICAL MONOSPACE CAPITAL C +1D673;1D673;1D673;0044;0044; # (𝙳𝙳; 𝙳𝙳; 𝙳𝙳; D; D; ) MATHEMATICAL MONOSPACE CAPITAL D +1D674;1D674;1D674;0045;0045; # (𝙴𝙴; 𝙴𝙴; 𝙴𝙴; E; E; ) MATHEMATICAL MONOSPACE CAPITAL E +1D675;1D675;1D675;0046;0046; # (𝙵𝙵; 𝙵𝙵; 𝙵𝙵; F; F; ) MATHEMATICAL MONOSPACE CAPITAL F +1D676;1D676;1D676;0047;0047; # (𝙶𝙶; 𝙶𝙶; 𝙶𝙶; G; G; ) MATHEMATICAL MONOSPACE CAPITAL G +1D677;1D677;1D677;0048;0048; # (𝙷𝙷; 𝙷𝙷; 𝙷𝙷; H; H; ) MATHEMATICAL MONOSPACE CAPITAL H +1D678;1D678;1D678;0049;0049; # (𝙸𝙸; 𝙸𝙸; 𝙸𝙸; I; I; ) MATHEMATICAL MONOSPACE CAPITAL I +1D679;1D679;1D679;004A;004A; # (𝙹𝙹; 𝙹𝙹; 𝙹𝙹; J; J; ) MATHEMATICAL MONOSPACE CAPITAL J +1D67A;1D67A;1D67A;004B;004B; # (𝙺𝙺; 𝙺𝙺; 𝙺𝙺; K; K; ) MATHEMATICAL MONOSPACE CAPITAL K +1D67B;1D67B;1D67B;004C;004C; # (𝙻𝙻; 𝙻𝙻; 𝙻𝙻; L; L; ) MATHEMATICAL MONOSPACE CAPITAL L +1D67C;1D67C;1D67C;004D;004D; # (𝙼𝙼; 𝙼𝙼; 𝙼𝙼; M; M; ) MATHEMATICAL MONOSPACE CAPITAL M +1D67D;1D67D;1D67D;004E;004E; # (𝙽𝙽; 𝙽𝙽; 𝙽𝙽; N; N; ) MATHEMATICAL MONOSPACE CAPITAL N +1D67E;1D67E;1D67E;004F;004F; # (𝙾𝙾; 𝙾𝙾; 𝙾𝙾; O; O; ) MATHEMATICAL MONOSPACE CAPITAL O +1D67F;1D67F;1D67F;0050;0050; # (𝙿𝙿; 𝙿𝙿; 𝙿𝙿; P; P; ) MATHEMATICAL MONOSPACE CAPITAL P +1D680;1D680;1D680;0051;0051; # (𝚀𝚀; 𝚀𝚀; 𝚀𝚀; Q; Q; ) MATHEMATICAL MONOSPACE CAPITAL Q +1D681;1D681;1D681;0052;0052; # (𝚁𝚁; 𝚁𝚁; 𝚁𝚁; R; R; ) MATHEMATICAL MONOSPACE CAPITAL R +1D682;1D682;1D682;0053;0053; # (𝚂𝚂; 𝚂𝚂; 𝚂𝚂; S; S; ) MATHEMATICAL MONOSPACE CAPITAL S +1D683;1D683;1D683;0054;0054; # (𝚃𝚃; 𝚃𝚃; 𝚃𝚃; T; T; ) MATHEMATICAL MONOSPACE CAPITAL T +1D684;1D684;1D684;0055;0055; # (𝚄𝚄; 𝚄𝚄; 𝚄𝚄; U; U; ) MATHEMATICAL MONOSPACE CAPITAL U +1D685;1D685;1D685;0056;0056; # (𝚅𝚅; 𝚅𝚅; 𝚅𝚅; V; V; ) MATHEMATICAL MONOSPACE CAPITAL V +1D686;1D686;1D686;0057;0057; # (𝚆𝚆; 𝚆𝚆; 𝚆𝚆; W; W; ) MATHEMATICAL MONOSPACE CAPITAL W +1D687;1D687;1D687;0058;0058; # (𝚇𝚇; 𝚇𝚇; 𝚇𝚇; X; X; ) MATHEMATICAL MONOSPACE CAPITAL X +1D688;1D688;1D688;0059;0059; # (𝚈𝚈; 𝚈𝚈; 𝚈𝚈; Y; Y; ) MATHEMATICAL MONOSPACE CAPITAL Y +1D689;1D689;1D689;005A;005A; # (𝚉𝚉; 𝚉𝚉; 𝚉𝚉; Z; Z; ) MATHEMATICAL MONOSPACE CAPITAL Z +1D68A;1D68A;1D68A;0061;0061; # (𝚊𝚊; 𝚊𝚊; 𝚊𝚊; a; a; ) MATHEMATICAL MONOSPACE SMALL A +1D68B;1D68B;1D68B;0062;0062; # (𝚋𝚋; 𝚋𝚋; 𝚋𝚋; b; b; ) MATHEMATICAL MONOSPACE SMALL B +1D68C;1D68C;1D68C;0063;0063; # (𝚌𝚌; 𝚌𝚌; 𝚌𝚌; c; c; ) MATHEMATICAL MONOSPACE SMALL C +1D68D;1D68D;1D68D;0064;0064; # (𝚍𝚍; 𝚍𝚍; 𝚍𝚍; d; d; ) MATHEMATICAL MONOSPACE SMALL D +1D68E;1D68E;1D68E;0065;0065; # (𝚎𝚎; 𝚎𝚎; 𝚎𝚎; e; e; ) MATHEMATICAL MONOSPACE SMALL E +1D68F;1D68F;1D68F;0066;0066; # (𝚏𝚏; 𝚏𝚏; 𝚏𝚏; f; f; ) MATHEMATICAL MONOSPACE SMALL F +1D690;1D690;1D690;0067;0067; # (𝚐𝚐; 𝚐𝚐; 𝚐𝚐; g; g; ) MATHEMATICAL MONOSPACE SMALL G +1D691;1D691;1D691;0068;0068; # (𝚑𝚑; 𝚑𝚑; 𝚑𝚑; h; h; ) MATHEMATICAL MONOSPACE SMALL H +1D692;1D692;1D692;0069;0069; # (𝚒𝚒; 𝚒𝚒; 𝚒𝚒; i; i; ) MATHEMATICAL MONOSPACE SMALL I +1D693;1D693;1D693;006A;006A; # (𝚓𝚓; 𝚓𝚓; 𝚓𝚓; j; j; ) MATHEMATICAL MONOSPACE SMALL J +1D694;1D694;1D694;006B;006B; # (𝚔𝚔; 𝚔𝚔; 𝚔𝚔; k; k; ) MATHEMATICAL MONOSPACE SMALL K +1D695;1D695;1D695;006C;006C; # (𝚕𝚕; 𝚕𝚕; 𝚕𝚕; l; l; ) MATHEMATICAL MONOSPACE SMALL L +1D696;1D696;1D696;006D;006D; # (𝚖𝚖; 𝚖𝚖; 𝚖𝚖; m; m; ) MATHEMATICAL MONOSPACE SMALL M +1D697;1D697;1D697;006E;006E; # (𝚗𝚗; 𝚗𝚗; 𝚗𝚗; n; n; ) MATHEMATICAL MONOSPACE SMALL N +1D698;1D698;1D698;006F;006F; # (𝚘𝚘; 𝚘𝚘; 𝚘𝚘; o; o; ) MATHEMATICAL MONOSPACE SMALL O +1D699;1D699;1D699;0070;0070; # (𝚙𝚙; 𝚙𝚙; 𝚙𝚙; p; p; ) MATHEMATICAL MONOSPACE SMALL P +1D69A;1D69A;1D69A;0071;0071; # (𝚚𝚚; 𝚚𝚚; 𝚚𝚚; q; q; ) MATHEMATICAL MONOSPACE SMALL Q +1D69B;1D69B;1D69B;0072;0072; # (𝚛𝚛; 𝚛𝚛; 𝚛𝚛; r; r; ) MATHEMATICAL MONOSPACE SMALL R +1D69C;1D69C;1D69C;0073;0073; # (𝚜𝚜; 𝚜𝚜; 𝚜𝚜; s; s; ) MATHEMATICAL MONOSPACE SMALL S +1D69D;1D69D;1D69D;0074;0074; # (𝚝𝚝; 𝚝𝚝; 𝚝𝚝; t; t; ) MATHEMATICAL MONOSPACE SMALL T +1D69E;1D69E;1D69E;0075;0075; # (𝚞𝚞; 𝚞𝚞; 𝚞𝚞; u; u; ) MATHEMATICAL MONOSPACE SMALL U +1D69F;1D69F;1D69F;0076;0076; # (𝚟𝚟; 𝚟𝚟; 𝚟𝚟; v; v; ) MATHEMATICAL MONOSPACE SMALL V +1D6A0;1D6A0;1D6A0;0077;0077; # (𝚠𝚠; 𝚠𝚠; 𝚠𝚠; w; w; ) MATHEMATICAL MONOSPACE SMALL W +1D6A1;1D6A1;1D6A1;0078;0078; # (𝚡𝚡; 𝚡𝚡; 𝚡𝚡; x; x; ) MATHEMATICAL MONOSPACE SMALL X +1D6A2;1D6A2;1D6A2;0079;0079; # (𝚢𝚢; 𝚢𝚢; 𝚢𝚢; y; y; ) MATHEMATICAL MONOSPACE SMALL Y +1D6A3;1D6A3;1D6A3;007A;007A; # (𝚣𝚣; 𝚣𝚣; 𝚣𝚣; z; z; ) MATHEMATICAL MONOSPACE SMALL Z +1D6A8;1D6A8;1D6A8;0391;0391; # (𝚨𝚨; 𝚨𝚨; 𝚨𝚨; Α; Α; ) MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9;1D6A9;1D6A9;0392;0392; # (𝚩𝚩; 𝚩𝚩; 𝚩𝚩; Β; Β; ) MATHEMATICAL BOLD CAPITAL BETA +1D6AA;1D6AA;1D6AA;0393;0393; # (𝚪𝚪; 𝚪𝚪; 𝚪𝚪; Γ; Γ; ) MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB;1D6AB;1D6AB;0394;0394; # (𝚫𝚫; 𝚫𝚫; 𝚫𝚫; Δ; Δ; ) MATHEMATICAL BOLD CAPITAL DELTA +1D6AC;1D6AC;1D6AC;0395;0395; # (𝚬𝚬; 𝚬𝚬; 𝚬𝚬; Ε; Ε; ) MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD;1D6AD;1D6AD;0396;0396; # (𝚭𝚭; 𝚭𝚭; 𝚭𝚭; Ζ; Ζ; ) MATHEMATICAL BOLD CAPITAL ZETA +1D6AE;1D6AE;1D6AE;0397;0397; # (𝚮𝚮; 𝚮𝚮; 𝚮𝚮; Η; Η; ) MATHEMATICAL BOLD CAPITAL ETA +1D6AF;1D6AF;1D6AF;0398;0398; # (𝚯𝚯; 𝚯𝚯; 𝚯𝚯; Θ; Θ; ) MATHEMATICAL BOLD CAPITAL THETA +1D6B0;1D6B0;1D6B0;0399;0399; # (𝚰𝚰; 𝚰𝚰; 𝚰𝚰; Ι; Ι; ) MATHEMATICAL BOLD CAPITAL IOTA +1D6B1;1D6B1;1D6B1;039A;039A; # (𝚱𝚱; 𝚱𝚱; 𝚱𝚱; Κ; Κ; ) MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2;1D6B2;1D6B2;039B;039B; # (𝚲𝚲; 𝚲𝚲; 𝚲𝚲; Λ; Λ; ) MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3;1D6B3;1D6B3;039C;039C; # (𝚳𝚳; 𝚳𝚳; 𝚳𝚳; Μ; Μ; ) MATHEMATICAL BOLD CAPITAL MU +1D6B4;1D6B4;1D6B4;039D;039D; # (𝚴𝚴; 𝚴𝚴; 𝚴𝚴; Ν; Ν; ) MATHEMATICAL BOLD CAPITAL NU +1D6B5;1D6B5;1D6B5;039E;039E; # (𝚵𝚵; 𝚵𝚵; 𝚵𝚵; Ξ; Ξ; ) MATHEMATICAL BOLD CAPITAL XI +1D6B6;1D6B6;1D6B6;039F;039F; # (𝚶𝚶; 𝚶𝚶; 𝚶𝚶; Ο; Ο; ) MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7;1D6B7;1D6B7;03A0;03A0; # (𝚷𝚷; 𝚷𝚷; 𝚷𝚷; Π; Π; ) MATHEMATICAL BOLD CAPITAL PI +1D6B8;1D6B8;1D6B8;03A1;03A1; # (𝚸𝚸; 𝚸𝚸; 𝚸𝚸; Ρ; Ρ; ) MATHEMATICAL BOLD CAPITAL RHO +1D6B9;1D6B9;1D6B9;0398;0398; # (𝚹𝚹; 𝚹𝚹; 𝚹𝚹; Θ; Θ; ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA;1D6BA;1D6BA;03A3;03A3; # (𝚺𝚺; 𝚺𝚺; 𝚺𝚺; Σ; Σ; ) MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB;1D6BB;1D6BB;03A4;03A4; # (𝚻𝚻; 𝚻𝚻; 𝚻𝚻; Τ; Τ; ) MATHEMATICAL BOLD CAPITAL TAU +1D6BC;1D6BC;1D6BC;03A5;03A5; # (𝚼𝚼; 𝚼𝚼; 𝚼𝚼; Υ; Υ; ) MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD;1D6BD;1D6BD;03A6;03A6; # (𝚽𝚽; 𝚽𝚽; 𝚽𝚽; Φ; Φ; ) MATHEMATICAL BOLD CAPITAL PHI +1D6BE;1D6BE;1D6BE;03A7;03A7; # (𝚾𝚾; 𝚾𝚾; 𝚾𝚾; Χ; Χ; ) MATHEMATICAL BOLD CAPITAL CHI +1D6BF;1D6BF;1D6BF;03A8;03A8; # (𝚿𝚿; 𝚿𝚿; 𝚿𝚿; Ψ; Ψ; ) MATHEMATICAL BOLD CAPITAL PSI +1D6C0;1D6C0;1D6C0;03A9;03A9; # (𝛀𝛀; 𝛀𝛀; 𝛀𝛀; Ω; Ω; ) MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1;1D6C1;1D6C1;2207;2207; # (𝛁𝛁; 𝛁𝛁; 𝛁𝛁; ∇; ∇; ) MATHEMATICAL BOLD NABLA +1D6C2;1D6C2;1D6C2;03B1;03B1; # (𝛂𝛂; 𝛂𝛂; 𝛂𝛂; α; α; ) MATHEMATICAL BOLD SMALL ALPHA +1D6C3;1D6C3;1D6C3;03B2;03B2; # (𝛃𝛃; 𝛃𝛃; 𝛃𝛃; β; β; ) MATHEMATICAL BOLD SMALL BETA +1D6C4;1D6C4;1D6C4;03B3;03B3; # (𝛄𝛄; 𝛄𝛄; 𝛄𝛄; γ; γ; ) MATHEMATICAL BOLD SMALL GAMMA +1D6C5;1D6C5;1D6C5;03B4;03B4; # (𝛅𝛅; 𝛅𝛅; 𝛅𝛅; δ; δ; ) MATHEMATICAL BOLD SMALL DELTA +1D6C6;1D6C6;1D6C6;03B5;03B5; # (𝛆𝛆; 𝛆𝛆; 𝛆𝛆; ε; ε; ) MATHEMATICAL BOLD SMALL EPSILON +1D6C7;1D6C7;1D6C7;03B6;03B6; # (𝛇𝛇; 𝛇𝛇; 𝛇𝛇; ζ; ζ; ) MATHEMATICAL BOLD SMALL ZETA +1D6C8;1D6C8;1D6C8;03B7;03B7; # (𝛈𝛈; 𝛈𝛈; 𝛈𝛈; η; η; ) MATHEMATICAL BOLD SMALL ETA +1D6C9;1D6C9;1D6C9;03B8;03B8; # (𝛉𝛉; 𝛉𝛉; 𝛉𝛉; θ; θ; ) MATHEMATICAL BOLD SMALL THETA +1D6CA;1D6CA;1D6CA;03B9;03B9; # (𝛊𝛊; 𝛊𝛊; 𝛊𝛊; ι; ι; ) MATHEMATICAL BOLD SMALL IOTA +1D6CB;1D6CB;1D6CB;03BA;03BA; # (𝛋𝛋; 𝛋𝛋; 𝛋𝛋; κ; κ; ) MATHEMATICAL BOLD SMALL KAPPA +1D6CC;1D6CC;1D6CC;03BB;03BB; # (𝛌𝛌; 𝛌𝛌; 𝛌𝛌; λ; λ; ) MATHEMATICAL BOLD SMALL LAMDA +1D6CD;1D6CD;1D6CD;03BC;03BC; # (𝛍𝛍; 𝛍𝛍; 𝛍𝛍; μ; μ; ) MATHEMATICAL BOLD SMALL MU +1D6CE;1D6CE;1D6CE;03BD;03BD; # (𝛎𝛎; 𝛎𝛎; 𝛎𝛎; ν; ν; ) MATHEMATICAL BOLD SMALL NU +1D6CF;1D6CF;1D6CF;03BE;03BE; # (𝛏𝛏; 𝛏𝛏; 𝛏𝛏; ξ; ξ; ) MATHEMATICAL BOLD SMALL XI +1D6D0;1D6D0;1D6D0;03BF;03BF; # (𝛐𝛐; 𝛐𝛐; 𝛐𝛐; ο; ο; ) MATHEMATICAL BOLD SMALL OMICRON +1D6D1;1D6D1;1D6D1;03C0;03C0; # (𝛑𝛑; 𝛑𝛑; 𝛑𝛑; π; π; ) MATHEMATICAL BOLD SMALL PI +1D6D2;1D6D2;1D6D2;03C1;03C1; # (𝛒𝛒; 𝛒𝛒; 𝛒𝛒; ρ; ρ; ) MATHEMATICAL BOLD SMALL RHO +1D6D3;1D6D3;1D6D3;03C2;03C2; # (𝛓𝛓; 𝛓𝛓; 𝛓𝛓; ς; ς; ) MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4;1D6D4;1D6D4;03C3;03C3; # (𝛔𝛔; 𝛔𝛔; 𝛔𝛔; σ; σ; ) MATHEMATICAL BOLD SMALL SIGMA +1D6D5;1D6D5;1D6D5;03C4;03C4; # (𝛕𝛕; 𝛕𝛕; 𝛕𝛕; τ; τ; ) MATHEMATICAL BOLD SMALL TAU +1D6D6;1D6D6;1D6D6;03C5;03C5; # (𝛖𝛖; 𝛖𝛖; 𝛖𝛖; υ; υ; ) MATHEMATICAL BOLD SMALL UPSILON +1D6D7;1D6D7;1D6D7;03C6;03C6; # (𝛗𝛗; 𝛗𝛗; 𝛗𝛗; φ; φ; ) MATHEMATICAL BOLD SMALL PHI +1D6D8;1D6D8;1D6D8;03C7;03C7; # (𝛘𝛘; 𝛘𝛘; 𝛘𝛘; χ; χ; ) MATHEMATICAL BOLD SMALL CHI +1D6D9;1D6D9;1D6D9;03C8;03C8; # (𝛙𝛙; 𝛙𝛙; 𝛙𝛙; ψ; ψ; ) MATHEMATICAL BOLD SMALL PSI +1D6DA;1D6DA;1D6DA;03C9;03C9; # (𝛚𝛚; 𝛚𝛚; 𝛚𝛚; ω; ω; ) MATHEMATICAL BOLD SMALL OMEGA +1D6DB;1D6DB;1D6DB;2202;2202; # (𝛛𝛛; 𝛛𝛛; 𝛛𝛛; ∂; ∂; ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC;1D6DC;1D6DC;03B5;03B5; # (𝛜𝛜; 𝛜𝛜; 𝛜𝛜; ε; ε; ) MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD;1D6DD;1D6DD;03B8;03B8; # (𝛝𝛝; 𝛝𝛝; 𝛝𝛝; θ; θ; ) MATHEMATICAL BOLD THETA SYMBOL +1D6DE;1D6DE;1D6DE;03BA;03BA; # (𝛞𝛞; 𝛞𝛞; 𝛞𝛞; κ; κ; ) MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF;1D6DF;1D6DF;03C6;03C6; # (𝛟𝛟; 𝛟𝛟; 𝛟𝛟; φ; φ; ) MATHEMATICAL BOLD PHI SYMBOL +1D6E0;1D6E0;1D6E0;03C1;03C1; # (𝛠𝛠; 𝛠𝛠; 𝛠𝛠; ρ; ρ; ) MATHEMATICAL BOLD RHO SYMBOL +1D6E1;1D6E1;1D6E1;03C0;03C0; # (𝛡𝛡; 𝛡𝛡; 𝛡𝛡; π; π; ) MATHEMATICAL BOLD PI SYMBOL +1D6E2;1D6E2;1D6E2;0391;0391; # (𝛢𝛢; 𝛢𝛢; 𝛢𝛢; Α; Α; ) MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3;1D6E3;1D6E3;0392;0392; # (𝛣𝛣; 𝛣𝛣; 𝛣𝛣; Β; Β; ) MATHEMATICAL ITALIC CAPITAL BETA +1D6E4;1D6E4;1D6E4;0393;0393; # (𝛤𝛤; 𝛤𝛤; 𝛤𝛤; Γ; Γ; ) MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5;1D6E5;1D6E5;0394;0394; # (𝛥𝛥; 𝛥𝛥; 𝛥𝛥; Δ; Δ; ) MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6;1D6E6;1D6E6;0395;0395; # (𝛦𝛦; 𝛦𝛦; 𝛦𝛦; Ε; Ε; ) MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7;1D6E7;1D6E7;0396;0396; # (𝛧𝛧; 𝛧𝛧; 𝛧𝛧; Ζ; Ζ; ) MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8;1D6E8;1D6E8;0397;0397; # (𝛨𝛨; 𝛨𝛨; 𝛨𝛨; Η; Η; ) MATHEMATICAL ITALIC CAPITAL ETA +1D6E9;1D6E9;1D6E9;0398;0398; # (𝛩𝛩; 𝛩𝛩; 𝛩𝛩; Θ; Θ; ) MATHEMATICAL ITALIC CAPITAL THETA +1D6EA;1D6EA;1D6EA;0399;0399; # (𝛪𝛪; 𝛪𝛪; 𝛪𝛪; Ι; Ι; ) MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB;1D6EB;1D6EB;039A;039A; # (𝛫𝛫; 𝛫𝛫; 𝛫𝛫; Κ; Κ; ) MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC;1D6EC;1D6EC;039B;039B; # (𝛬𝛬; 𝛬𝛬; 𝛬𝛬; Λ; Λ; ) MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED;1D6ED;1D6ED;039C;039C; # (𝛭𝛭; 𝛭𝛭; 𝛭𝛭; Μ; Μ; ) MATHEMATICAL ITALIC CAPITAL MU +1D6EE;1D6EE;1D6EE;039D;039D; # (𝛮𝛮; 𝛮𝛮; 𝛮𝛮; Ν; Ν; ) MATHEMATICAL ITALIC CAPITAL NU +1D6EF;1D6EF;1D6EF;039E;039E; # (𝛯𝛯; 𝛯𝛯; 𝛯𝛯; Ξ; Ξ; ) MATHEMATICAL ITALIC CAPITAL XI +1D6F0;1D6F0;1D6F0;039F;039F; # (𝛰𝛰; 𝛰𝛰; 𝛰𝛰; Ο; Ο; ) MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1;1D6F1;1D6F1;03A0;03A0; # (𝛱𝛱; 𝛱𝛱; 𝛱𝛱; Π; Π; ) MATHEMATICAL ITALIC CAPITAL PI +1D6F2;1D6F2;1D6F2;03A1;03A1; # (𝛲𝛲; 𝛲𝛲; 𝛲𝛲; Ρ; Ρ; ) MATHEMATICAL ITALIC CAPITAL RHO +1D6F3;1D6F3;1D6F3;0398;0398; # (𝛳𝛳; 𝛳𝛳; 𝛳𝛳; Θ; Θ; ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4;1D6F4;1D6F4;03A3;03A3; # (𝛴𝛴; 𝛴𝛴; 𝛴𝛴; Σ; Σ; ) MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5;1D6F5;1D6F5;03A4;03A4; # (𝛵𝛵; 𝛵𝛵; 𝛵𝛵; Τ; Τ; ) MATHEMATICAL ITALIC CAPITAL TAU +1D6F6;1D6F6;1D6F6;03A5;03A5; # (𝛶𝛶; 𝛶𝛶; 𝛶𝛶; Υ; Υ; ) MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7;1D6F7;1D6F7;03A6;03A6; # (𝛷𝛷; 𝛷𝛷; 𝛷𝛷; Φ; Φ; ) MATHEMATICAL ITALIC CAPITAL PHI +1D6F8;1D6F8;1D6F8;03A7;03A7; # (𝛸𝛸; 𝛸𝛸; 𝛸𝛸; Χ; Χ; ) MATHEMATICAL ITALIC CAPITAL CHI +1D6F9;1D6F9;1D6F9;03A8;03A8; # (𝛹𝛹; 𝛹𝛹; 𝛹𝛹; Ψ; Ψ; ) MATHEMATICAL ITALIC CAPITAL PSI +1D6FA;1D6FA;1D6FA;03A9;03A9; # (𝛺𝛺; 𝛺𝛺; 𝛺𝛺; Ω; Ω; ) MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB;1D6FB;1D6FB;2207;2207; # (𝛻𝛻; 𝛻𝛻; 𝛻𝛻; ∇; ∇; ) MATHEMATICAL ITALIC NABLA +1D6FC;1D6FC;1D6FC;03B1;03B1; # (𝛼𝛼; 𝛼𝛼; 𝛼𝛼; α; α; ) MATHEMATICAL ITALIC SMALL ALPHA +1D6FD;1D6FD;1D6FD;03B2;03B2; # (𝛽𝛽; 𝛽𝛽; 𝛽𝛽; β; β; ) MATHEMATICAL ITALIC SMALL BETA +1D6FE;1D6FE;1D6FE;03B3;03B3; # (𝛾𝛾; 𝛾𝛾; 𝛾𝛾; γ; γ; ) MATHEMATICAL ITALIC SMALL GAMMA +1D6FF;1D6FF;1D6FF;03B4;03B4; # (𝛿𝛿; 𝛿𝛿; 𝛿𝛿; δ; δ; ) MATHEMATICAL ITALIC SMALL DELTA +1D700;1D700;1D700;03B5;03B5; # (𝜀𝜀; 𝜀𝜀; 𝜀𝜀; ε; ε; ) MATHEMATICAL ITALIC SMALL EPSILON +1D701;1D701;1D701;03B6;03B6; # (𝜁𝜁; 𝜁𝜁; 𝜁𝜁; ζ; ζ; ) MATHEMATICAL ITALIC SMALL ZETA +1D702;1D702;1D702;03B7;03B7; # (𝜂𝜂; 𝜂𝜂; 𝜂𝜂; η; η; ) MATHEMATICAL ITALIC SMALL ETA +1D703;1D703;1D703;03B8;03B8; # (𝜃𝜃; 𝜃𝜃; 𝜃𝜃; θ; θ; ) MATHEMATICAL ITALIC SMALL THETA +1D704;1D704;1D704;03B9;03B9; # (𝜄𝜄; 𝜄𝜄; 𝜄𝜄; ι; ι; ) MATHEMATICAL ITALIC SMALL IOTA +1D705;1D705;1D705;03BA;03BA; # (𝜅𝜅; 𝜅𝜅; 𝜅𝜅; κ; κ; ) MATHEMATICAL ITALIC SMALL KAPPA +1D706;1D706;1D706;03BB;03BB; # (𝜆𝜆; 𝜆𝜆; 𝜆𝜆; λ; λ; ) MATHEMATICAL ITALIC SMALL LAMDA +1D707;1D707;1D707;03BC;03BC; # (𝜇𝜇; 𝜇𝜇; 𝜇𝜇; μ; μ; ) MATHEMATICAL ITALIC SMALL MU +1D708;1D708;1D708;03BD;03BD; # (𝜈𝜈; 𝜈𝜈; 𝜈𝜈; ν; ν; ) MATHEMATICAL ITALIC SMALL NU +1D709;1D709;1D709;03BE;03BE; # (𝜉𝜉; 𝜉𝜉; 𝜉𝜉; ξ; ξ; ) MATHEMATICAL ITALIC SMALL XI +1D70A;1D70A;1D70A;03BF;03BF; # (𝜊𝜊; 𝜊𝜊; 𝜊𝜊; ο; ο; ) MATHEMATICAL ITALIC SMALL OMICRON +1D70B;1D70B;1D70B;03C0;03C0; # (𝜋𝜋; 𝜋𝜋; 𝜋𝜋; π; π; ) MATHEMATICAL ITALIC SMALL PI +1D70C;1D70C;1D70C;03C1;03C1; # (𝜌𝜌; 𝜌𝜌; 𝜌𝜌; ρ; ρ; ) MATHEMATICAL ITALIC SMALL RHO +1D70D;1D70D;1D70D;03C2;03C2; # (𝜍𝜍; 𝜍𝜍; 𝜍𝜍; ς; ς; ) MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E;1D70E;1D70E;03C3;03C3; # (𝜎𝜎; 𝜎𝜎; 𝜎𝜎; σ; σ; ) MATHEMATICAL ITALIC SMALL SIGMA +1D70F;1D70F;1D70F;03C4;03C4; # (𝜏𝜏; 𝜏𝜏; 𝜏𝜏; τ; τ; ) MATHEMATICAL ITALIC SMALL TAU +1D710;1D710;1D710;03C5;03C5; # (𝜐𝜐; 𝜐𝜐; 𝜐𝜐; υ; υ; ) MATHEMATICAL ITALIC SMALL UPSILON +1D711;1D711;1D711;03C6;03C6; # (𝜑𝜑; 𝜑𝜑; 𝜑𝜑; φ; φ; ) MATHEMATICAL ITALIC SMALL PHI +1D712;1D712;1D712;03C7;03C7; # (𝜒𝜒; 𝜒𝜒; 𝜒𝜒; χ; χ; ) MATHEMATICAL ITALIC SMALL CHI +1D713;1D713;1D713;03C8;03C8; # (𝜓𝜓; 𝜓𝜓; 𝜓𝜓; ψ; ψ; ) MATHEMATICAL ITALIC SMALL PSI +1D714;1D714;1D714;03C9;03C9; # (𝜔𝜔; 𝜔𝜔; 𝜔𝜔; ω; ω; ) MATHEMATICAL ITALIC SMALL OMEGA +1D715;1D715;1D715;2202;2202; # (𝜕𝜕; 𝜕𝜕; 𝜕𝜕; ∂; ∂; ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716;1D716;1D716;03B5;03B5; # (𝜖𝜖; 𝜖𝜖; 𝜖𝜖; ε; ε; ) MATHEMATICAL ITALIC EPSILON SYMBOL +1D717;1D717;1D717;03B8;03B8; # (𝜗𝜗; 𝜗𝜗; 𝜗𝜗; θ; θ; ) MATHEMATICAL ITALIC THETA SYMBOL +1D718;1D718;1D718;03BA;03BA; # (𝜘𝜘; 𝜘𝜘; 𝜘𝜘; κ; κ; ) MATHEMATICAL ITALIC KAPPA SYMBOL +1D719;1D719;1D719;03C6;03C6; # (𝜙𝜙; 𝜙𝜙; 𝜙𝜙; φ; φ; ) MATHEMATICAL ITALIC PHI SYMBOL +1D71A;1D71A;1D71A;03C1;03C1; # (𝜚𝜚; 𝜚𝜚; 𝜚𝜚; ρ; ρ; ) MATHEMATICAL ITALIC RHO SYMBOL +1D71B;1D71B;1D71B;03C0;03C0; # (𝜛𝜛; 𝜛𝜛; 𝜛𝜛; π; π; ) MATHEMATICAL ITALIC PI SYMBOL +1D71C;1D71C;1D71C;0391;0391; # (𝜜𝜜; 𝜜𝜜; 𝜜𝜜; Α; Α; ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D;1D71D;1D71D;0392;0392; # (𝜝𝜝; 𝜝𝜝; 𝜝𝜝; Β; Β; ) MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E;1D71E;1D71E;0393;0393; # (𝜞𝜞; 𝜞𝜞; 𝜞𝜞; Γ; Γ; ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F;1D71F;1D71F;0394;0394; # (𝜟𝜟; 𝜟𝜟; 𝜟𝜟; Δ; Δ; ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720;1D720;1D720;0395;0395; # (𝜠𝜠; 𝜠𝜠; 𝜠𝜠; Ε; Ε; ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721;1D721;1D721;0396;0396; # (𝜡𝜡; 𝜡𝜡; 𝜡𝜡; Ζ; Ζ; ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722;1D722;1D722;0397;0397; # (𝜢𝜢; 𝜢𝜢; 𝜢𝜢; Η; Η; ) MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723;1D723;1D723;0398;0398; # (𝜣𝜣; 𝜣𝜣; 𝜣𝜣; Θ; Θ; ) MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724;1D724;1D724;0399;0399; # (𝜤𝜤; 𝜤𝜤; 𝜤𝜤; Ι; Ι; ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725;1D725;1D725;039A;039A; # (𝜥𝜥; 𝜥𝜥; 𝜥𝜥; Κ; Κ; ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726;1D726;1D726;039B;039B; # (𝜦𝜦; 𝜦𝜦; 𝜦𝜦; Λ; Λ; ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727;1D727;1D727;039C;039C; # (𝜧𝜧; 𝜧𝜧; 𝜧𝜧; Μ; Μ; ) MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728;1D728;1D728;039D;039D; # (𝜨𝜨; 𝜨𝜨; 𝜨𝜨; Ν; Ν; ) MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729;1D729;1D729;039E;039E; # (𝜩𝜩; 𝜩𝜩; 𝜩𝜩; Ξ; Ξ; ) MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A;1D72A;1D72A;039F;039F; # (𝜪𝜪; 𝜪𝜪; 𝜪𝜪; Ο; Ο; ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B;1D72B;1D72B;03A0;03A0; # (𝜫𝜫; 𝜫𝜫; 𝜫𝜫; Π; Π; ) MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C;1D72C;1D72C;03A1;03A1; # (𝜬𝜬; 𝜬𝜬; 𝜬𝜬; Ρ; Ρ; ) MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D;1D72D;1D72D;0398;0398; # (𝜭𝜭; 𝜭𝜭; 𝜭𝜭; Θ; Θ; ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E;1D72E;1D72E;03A3;03A3; # (𝜮𝜮; 𝜮𝜮; 𝜮𝜮; Σ; Σ; ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F;1D72F;1D72F;03A4;03A4; # (𝜯𝜯; 𝜯𝜯; 𝜯𝜯; Τ; Τ; ) MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730;1D730;1D730;03A5;03A5; # (𝜰𝜰; 𝜰𝜰; 𝜰𝜰; Υ; Υ; ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731;1D731;1D731;03A6;03A6; # (𝜱𝜱; 𝜱𝜱; 𝜱𝜱; Φ; Φ; ) MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732;1D732;1D732;03A7;03A7; # (𝜲𝜲; 𝜲𝜲; 𝜲𝜲; Χ; Χ; ) MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733;1D733;1D733;03A8;03A8; # (𝜳𝜳; 𝜳𝜳; 𝜳𝜳; Ψ; Ψ; ) MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734;1D734;1D734;03A9;03A9; # (𝜴𝜴; 𝜴𝜴; 𝜴𝜴; Ω; Ω; ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735;1D735;1D735;2207;2207; # (𝜵𝜵; 𝜵𝜵; 𝜵𝜵; ∇; ∇; ) MATHEMATICAL BOLD ITALIC NABLA +1D736;1D736;1D736;03B1;03B1; # (𝜶𝜶; 𝜶𝜶; 𝜶𝜶; α; α; ) MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737;1D737;1D737;03B2;03B2; # (𝜷𝜷; 𝜷𝜷; 𝜷𝜷; β; β; ) MATHEMATICAL BOLD ITALIC SMALL BETA +1D738;1D738;1D738;03B3;03B3; # (𝜸𝜸; 𝜸𝜸; 𝜸𝜸; γ; γ; ) MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739;1D739;1D739;03B4;03B4; # (𝜹𝜹; 𝜹𝜹; 𝜹𝜹; δ; δ; ) MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A;1D73A;1D73A;03B5;03B5; # (𝜺𝜺; 𝜺𝜺; 𝜺𝜺; ε; ε; ) MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B;1D73B;1D73B;03B6;03B6; # (𝜻𝜻; 𝜻𝜻; 𝜻𝜻; ζ; ζ; ) MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C;1D73C;1D73C;03B7;03B7; # (𝜼𝜼; 𝜼𝜼; 𝜼𝜼; η; η; ) MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D;1D73D;1D73D;03B8;03B8; # (𝜽𝜽; 𝜽𝜽; 𝜽𝜽; θ; θ; ) MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E;1D73E;1D73E;03B9;03B9; # (𝜾𝜾; 𝜾𝜾; 𝜾𝜾; ι; ι; ) MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F;1D73F;1D73F;03BA;03BA; # (𝜿𝜿; 𝜿𝜿; 𝜿𝜿; κ; κ; ) MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740;1D740;1D740;03BB;03BB; # (𝝀𝝀; 𝝀𝝀; 𝝀𝝀; λ; λ; ) MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741;1D741;1D741;03BC;03BC; # (𝝁𝝁; 𝝁𝝁; 𝝁𝝁; μ; μ; ) MATHEMATICAL BOLD ITALIC SMALL MU +1D742;1D742;1D742;03BD;03BD; # (𝝂𝝂; 𝝂𝝂; 𝝂𝝂; ν; ν; ) MATHEMATICAL BOLD ITALIC SMALL NU +1D743;1D743;1D743;03BE;03BE; # (𝝃𝝃; 𝝃𝝃; 𝝃𝝃; ξ; ξ; ) MATHEMATICAL BOLD ITALIC SMALL XI +1D744;1D744;1D744;03BF;03BF; # (𝝄𝝄; 𝝄𝝄; 𝝄𝝄; ο; ο; ) MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745;1D745;1D745;03C0;03C0; # (𝝅𝝅; 𝝅𝝅; 𝝅𝝅; π; π; ) MATHEMATICAL BOLD ITALIC SMALL PI +1D746;1D746;1D746;03C1;03C1; # (𝝆𝝆; 𝝆𝝆; 𝝆𝝆; ρ; ρ; ) MATHEMATICAL BOLD ITALIC SMALL RHO +1D747;1D747;1D747;03C2;03C2; # (𝝇𝝇; 𝝇𝝇; 𝝇𝝇; ς; ς; ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748;1D748;1D748;03C3;03C3; # (𝝈𝝈; 𝝈𝝈; 𝝈𝝈; σ; σ; ) MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749;1D749;1D749;03C4;03C4; # (𝝉𝝉; 𝝉𝝉; 𝝉𝝉; τ; τ; ) MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A;1D74A;1D74A;03C5;03C5; # (𝝊𝝊; 𝝊𝝊; 𝝊𝝊; υ; υ; ) MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B;1D74B;1D74B;03C6;03C6; # (𝝋𝝋; 𝝋𝝋; 𝝋𝝋; φ; φ; ) MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C;1D74C;1D74C;03C7;03C7; # (𝝌𝝌; 𝝌𝝌; 𝝌𝝌; χ; χ; ) MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D;1D74D;1D74D;03C8;03C8; # (𝝍𝝍; 𝝍𝝍; 𝝍𝝍; ψ; ψ; ) MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E;1D74E;1D74E;03C9;03C9; # (𝝎𝝎; 𝝎𝝎; 𝝎𝝎; ω; ω; ) MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F;1D74F;1D74F;2202;2202; # (𝝏𝝏; 𝝏𝝏; 𝝏𝝏; ∂; ∂; ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750;1D750;1D750;03B5;03B5; # (𝝐𝝐; 𝝐𝝐; 𝝐𝝐; ε; ε; ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751;1D751;1D751;03B8;03B8; # (𝝑𝝑; 𝝑𝝑; 𝝑𝝑; θ; θ; ) MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752;1D752;1D752;03BA;03BA; # (𝝒𝝒; 𝝒𝝒; 𝝒𝝒; κ; κ; ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753;1D753;1D753;03C6;03C6; # (𝝓𝝓; 𝝓𝝓; 𝝓𝝓; φ; φ; ) MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754;1D754;1D754;03C1;03C1; # (𝝔𝝔; 𝝔𝝔; 𝝔𝝔; ρ; ρ; ) MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755;1D755;1D755;03C0;03C0; # (𝝕𝝕; 𝝕𝝕; 𝝕𝝕; π; π; ) MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756;1D756;1D756;0391;0391; # (𝝖𝝖; 𝝖𝝖; 𝝖𝝖; Α; Α; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757;1D757;1D757;0392;0392; # (𝝗𝝗; 𝝗𝝗; 𝝗𝝗; Β; Β; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758;1D758;1D758;0393;0393; # (𝝘𝝘; 𝝘𝝘; 𝝘𝝘; Γ; Γ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759;1D759;1D759;0394;0394; # (𝝙𝝙; 𝝙𝝙; 𝝙𝝙; Δ; Δ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A;1D75A;1D75A;0395;0395; # (𝝚𝝚; 𝝚𝝚; 𝝚𝝚; Ε; Ε; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B;1D75B;1D75B;0396;0396; # (𝝛𝝛; 𝝛𝝛; 𝝛𝝛; Ζ; Ζ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C;1D75C;1D75C;0397;0397; # (𝝜𝝜; 𝝜𝝜; 𝝜𝝜; Η; Η; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D;1D75D;1D75D;0398;0398; # (𝝝𝝝; 𝝝𝝝; 𝝝𝝝; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E;1D75E;1D75E;0399;0399; # (𝝞𝝞; 𝝞𝝞; 𝝞𝝞; Ι; Ι; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F;1D75F;1D75F;039A;039A; # (𝝟𝝟; 𝝟𝝟; 𝝟𝝟; Κ; Κ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760;1D760;1D760;039B;039B; # (𝝠𝝠; 𝝠𝝠; 𝝠𝝠; Λ; Λ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761;1D761;1D761;039C;039C; # (𝝡𝝡; 𝝡𝝡; 𝝡𝝡; Μ; Μ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762;1D762;1D762;039D;039D; # (𝝢𝝢; 𝝢𝝢; 𝝢𝝢; Ν; Ν; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763;1D763;1D763;039E;039E; # (𝝣𝝣; 𝝣𝝣; 𝝣𝝣; Ξ; Ξ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764;1D764;1D764;039F;039F; # (𝝤𝝤; 𝝤𝝤; 𝝤𝝤; Ο; Ο; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765;1D765;1D765;03A0;03A0; # (𝝥𝝥; 𝝥𝝥; 𝝥𝝥; Π; Π; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766;1D766;1D766;03A1;03A1; # (𝝦𝝦; 𝝦𝝦; 𝝦𝝦; Ρ; Ρ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767;1D767;1D767;0398;0398; # (𝝧𝝧; 𝝧𝝧; 𝝧𝝧; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768;1D768;1D768;03A3;03A3; # (𝝨𝝨; 𝝨𝝨; 𝝨𝝨; Σ; Σ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769;1D769;1D769;03A4;03A4; # (𝝩𝝩; 𝝩𝝩; 𝝩𝝩; Τ; Τ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A;1D76A;1D76A;03A5;03A5; # (𝝪𝝪; 𝝪𝝪; 𝝪𝝪; Υ; Υ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B;1D76B;1D76B;03A6;03A6; # (𝝫𝝫; 𝝫𝝫; 𝝫𝝫; Φ; Φ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C;1D76C;1D76C;03A7;03A7; # (𝝬𝝬; 𝝬𝝬; 𝝬𝝬; Χ; Χ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D;1D76D;1D76D;03A8;03A8; # (𝝭𝝭; 𝝭𝝭; 𝝭𝝭; Ψ; Ψ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E;1D76E;1D76E;03A9;03A9; # (𝝮𝝮; 𝝮𝝮; 𝝮𝝮; Ω; Ω; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F;1D76F;1D76F;2207;2207; # (𝝯𝝯; 𝝯𝝯; 𝝯𝝯; ∇; ∇; ) MATHEMATICAL SANS-SERIF BOLD NABLA +1D770;1D770;1D770;03B1;03B1; # (𝝰𝝰; 𝝰𝝰; 𝝰𝝰; α; α; ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771;1D771;1D771;03B2;03B2; # (𝝱𝝱; 𝝱𝝱; 𝝱𝝱; β; β; ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772;1D772;1D772;03B3;03B3; # (𝝲𝝲; 𝝲𝝲; 𝝲𝝲; γ; γ; ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773;1D773;1D773;03B4;03B4; # (𝝳𝝳; 𝝳𝝳; 𝝳𝝳; δ; δ; ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774;1D774;1D774;03B5;03B5; # (𝝴𝝴; 𝝴𝝴; 𝝴𝝴; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775;1D775;1D775;03B6;03B6; # (𝝵𝝵; 𝝵𝝵; 𝝵𝝵; ζ; ζ; ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776;1D776;1D776;03B7;03B7; # (𝝶𝝶; 𝝶𝝶; 𝝶𝝶; η; η; ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777;1D777;1D777;03B8;03B8; # (𝝷𝝷; 𝝷𝝷; 𝝷𝝷; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778;1D778;1D778;03B9;03B9; # (𝝸𝝸; 𝝸𝝸; 𝝸𝝸; ι; ι; ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779;1D779;1D779;03BA;03BA; # (𝝹𝝹; 𝝹𝝹; 𝝹𝝹; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A;1D77A;1D77A;03BB;03BB; # (𝝺𝝺; 𝝺𝝺; 𝝺𝝺; λ; λ; ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B;1D77B;1D77B;03BC;03BC; # (𝝻𝝻; 𝝻𝝻; 𝝻𝝻; μ; μ; ) MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C;1D77C;1D77C;03BD;03BD; # (𝝼𝝼; 𝝼𝝼; 𝝼𝝼; ν; ν; ) MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D;1D77D;1D77D;03BE;03BE; # (𝝽𝝽; 𝝽𝝽; 𝝽𝝽; ξ; ξ; ) MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E;1D77E;1D77E;03BF;03BF; # (𝝾𝝾; 𝝾𝝾; 𝝾𝝾; ο; ο; ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F;1D77F;1D77F;03C0;03C0; # (𝝿𝝿; 𝝿𝝿; 𝝿𝝿; π; π; ) MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780;1D780;1D780;03C1;03C1; # (𝞀𝞀; 𝞀𝞀; 𝞀𝞀; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781;1D781;1D781;03C2;03C2; # (𝞁𝞁; 𝞁𝞁; 𝞁𝞁; ς; ς; ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782;1D782;1D782;03C3;03C3; # (𝞂𝞂; 𝞂𝞂; 𝞂𝞂; σ; σ; ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783;1D783;1D783;03C4;03C4; # (𝞃𝞃; 𝞃𝞃; 𝞃𝞃; τ; τ; ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784;1D784;1D784;03C5;03C5; # (𝞄𝞄; 𝞄𝞄; 𝞄𝞄; υ; υ; ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785;1D785;1D785;03C6;03C6; # (𝞅𝞅; 𝞅𝞅; 𝞅𝞅; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786;1D786;1D786;03C7;03C7; # (𝞆𝞆; 𝞆𝞆; 𝞆𝞆; χ; χ; ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787;1D787;1D787;03C8;03C8; # (𝞇𝞇; 𝞇𝞇; 𝞇𝞇; ψ; ψ; ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788;1D788;1D788;03C9;03C9; # (𝞈𝞈; 𝞈𝞈; 𝞈𝞈; ω; ω; ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789;1D789;1D789;2202;2202; # (𝞉𝞉; 𝞉𝞉; 𝞉𝞉; ∂; ∂; ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A;1D78A;1D78A;03B5;03B5; # (𝞊𝞊; 𝞊𝞊; 𝞊𝞊; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B;1D78B;1D78B;03B8;03B8; # (𝞋𝞋; 𝞋𝞋; 𝞋𝞋; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C;1D78C;1D78C;03BA;03BA; # (𝞌𝞌; 𝞌𝞌; 𝞌𝞌; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D;1D78D;1D78D;03C6;03C6; # (𝞍𝞍; 𝞍𝞍; 𝞍𝞍; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E;1D78E;1D78E;03C1;03C1; # (𝞎𝞎; 𝞎𝞎; 𝞎𝞎; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F;1D78F;1D78F;03C0;03C0; # (𝞏𝞏; 𝞏𝞏; 𝞏𝞏; π; π; ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790;1D790;1D790;0391;0391; # (𝞐𝞐; 𝞐𝞐; 𝞐𝞐; Α; Α; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791;1D791;1D791;0392;0392; # (𝞑𝞑; 𝞑𝞑; 𝞑𝞑; Β; Β; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792;1D792;1D792;0393;0393; # (𝞒𝞒; 𝞒𝞒; 𝞒𝞒; Γ; Γ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793;1D793;1D793;0394;0394; # (𝞓𝞓; 𝞓𝞓; 𝞓𝞓; Δ; Δ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794;1D794;1D794;0395;0395; # (𝞔𝞔; 𝞔𝞔; 𝞔𝞔; Ε; Ε; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795;1D795;1D795;0396;0396; # (𝞕𝞕; 𝞕𝞕; 𝞕𝞕; Ζ; Ζ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796;1D796;1D796;0397;0397; # (𝞖𝞖; 𝞖𝞖; 𝞖𝞖; Η; Η; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797;1D797;1D797;0398;0398; # (𝞗𝞗; 𝞗𝞗; 𝞗𝞗; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798;1D798;1D798;0399;0399; # (𝞘𝞘; 𝞘𝞘; 𝞘𝞘; Ι; Ι; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799;1D799;1D799;039A;039A; # (𝞙𝞙; 𝞙𝞙; 𝞙𝞙; Κ; Κ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A;1D79A;1D79A;039B;039B; # (𝞚𝞚; 𝞚𝞚; 𝞚𝞚; Λ; Λ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B;1D79B;1D79B;039C;039C; # (𝞛𝞛; 𝞛𝞛; 𝞛𝞛; Μ; Μ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C;1D79C;1D79C;039D;039D; # (𝞜𝞜; 𝞜𝞜; 𝞜𝞜; Ν; Ν; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D;1D79D;1D79D;039E;039E; # (𝞝𝞝; 𝞝𝞝; 𝞝𝞝; Ξ; Ξ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E;1D79E;1D79E;039F;039F; # (𝞞𝞞; 𝞞𝞞; 𝞞𝞞; Ο; Ο; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F;1D79F;1D79F;03A0;03A0; # (𝞟𝞟; 𝞟𝞟; 𝞟𝞟; Π; Π; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0;1D7A0;1D7A0;03A1;03A1; # (𝞠𝞠; 𝞠𝞠; 𝞠𝞠; Ρ; Ρ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1;1D7A1;1D7A1;0398;0398; # (𝞡𝞡; 𝞡𝞡; 𝞡𝞡; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2;1D7A2;1D7A2;03A3;03A3; # (𝞢𝞢; 𝞢𝞢; 𝞢𝞢; Σ; Σ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3;1D7A3;1D7A3;03A4;03A4; # (𝞣𝞣; 𝞣𝞣; 𝞣𝞣; Τ; Τ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4;1D7A4;1D7A4;03A5;03A5; # (𝞤𝞤; 𝞤𝞤; 𝞤𝞤; Υ; Υ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5;1D7A5;1D7A5;03A6;03A6; # (𝞥𝞥; 𝞥𝞥; 𝞥𝞥; Φ; Φ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6;1D7A6;1D7A6;03A7;03A7; # (𝞦𝞦; 𝞦𝞦; 𝞦𝞦; Χ; Χ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7;1D7A7;1D7A7;03A8;03A8; # (𝞧𝞧; 𝞧𝞧; 𝞧𝞧; Ψ; Ψ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8;1D7A8;1D7A8;03A9;03A9; # (𝞨𝞨; 𝞨𝞨; 𝞨𝞨; Ω; Ω; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9;1D7A9;1D7A9;2207;2207; # (𝞩𝞩; 𝞩𝞩; 𝞩𝞩; ∇; ∇; ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA;1D7AA;1D7AA;03B1;03B1; # (𝞪𝞪; 𝞪𝞪; 𝞪𝞪; α; α; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB;1D7AB;1D7AB;03B2;03B2; # (𝞫𝞫; 𝞫𝞫; 𝞫𝞫; β; β; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC;1D7AC;1D7AC;03B3;03B3; # (𝞬𝞬; 𝞬𝞬; 𝞬𝞬; γ; γ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD;1D7AD;1D7AD;03B4;03B4; # (𝞭𝞭; 𝞭𝞭; 𝞭𝞭; δ; δ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE;1D7AE;1D7AE;03B5;03B5; # (𝞮𝞮; 𝞮𝞮; 𝞮𝞮; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF;1D7AF;1D7AF;03B6;03B6; # (𝞯𝞯; 𝞯𝞯; 𝞯𝞯; ζ; ζ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0;1D7B0;1D7B0;03B7;03B7; # (𝞰𝞰; 𝞰𝞰; 𝞰𝞰; η; η; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1;1D7B1;1D7B1;03B8;03B8; # (𝞱𝞱; 𝞱𝞱; 𝞱𝞱; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2;1D7B2;1D7B2;03B9;03B9; # (𝞲𝞲; 𝞲𝞲; 𝞲𝞲; ι; ι; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3;1D7B3;1D7B3;03BA;03BA; # (𝞳𝞳; 𝞳𝞳; 𝞳𝞳; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4;1D7B4;1D7B4;03BB;03BB; # (𝞴𝞴; 𝞴𝞴; 𝞴𝞴; λ; λ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5;1D7B5;1D7B5;03BC;03BC; # (𝞵𝞵; 𝞵𝞵; 𝞵𝞵; μ; μ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6;1D7B6;1D7B6;03BD;03BD; # (𝞶𝞶; 𝞶𝞶; 𝞶𝞶; ν; ν; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7;1D7B7;1D7B7;03BE;03BE; # (𝞷𝞷; 𝞷𝞷; 𝞷𝞷; ξ; ξ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8;1D7B8;1D7B8;03BF;03BF; # (𝞸𝞸; 𝞸𝞸; 𝞸𝞸; ο; ο; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9;1D7B9;1D7B9;03C0;03C0; # (𝞹𝞹; 𝞹𝞹; 𝞹𝞹; π; π; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA;1D7BA;1D7BA;03C1;03C1; # (𝞺𝞺; 𝞺𝞺; 𝞺𝞺; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB;1D7BB;1D7BB;03C2;03C2; # (𝞻𝞻; 𝞻𝞻; 𝞻𝞻; ς; ς; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC;1D7BC;1D7BC;03C3;03C3; # (𝞼𝞼; 𝞼𝞼; 𝞼𝞼; σ; σ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD;1D7BD;1D7BD;03C4;03C4; # (𝞽𝞽; 𝞽𝞽; 𝞽𝞽; τ; τ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE;1D7BE;1D7BE;03C5;03C5; # (𝞾𝞾; 𝞾𝞾; 𝞾𝞾; υ; υ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF;1D7BF;1D7BF;03C6;03C6; # (𝞿𝞿; 𝞿𝞿; 𝞿𝞿; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0;1D7C0;1D7C0;03C7;03C7; # (𝟀𝟀; 𝟀𝟀; 𝟀𝟀; χ; χ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1;1D7C1;1D7C1;03C8;03C8; # (𝟁𝟁; 𝟁𝟁; 𝟁𝟁; ψ; ψ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2;1D7C2;1D7C2;03C9;03C9; # (𝟂𝟂; 𝟂𝟂; 𝟂𝟂; ω; ω; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3;1D7C3;1D7C3;2202;2202; # (𝟃𝟃; 𝟃𝟃; 𝟃𝟃; ∂; ∂; ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4;1D7C4;1D7C4;03B5;03B5; # (𝟄𝟄; 𝟄𝟄; 𝟄𝟄; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5;1D7C5;1D7C5;03B8;03B8; # (𝟅𝟅; 𝟅𝟅; 𝟅𝟅; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6;1D7C6;1D7C6;03BA;03BA; # (𝟆𝟆; 𝟆𝟆; 𝟆𝟆; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7;1D7C7;1D7C7;03C6;03C6; # (𝟇𝟇; 𝟇𝟇; 𝟇𝟇; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8;1D7C8;1D7C8;03C1;03C1; # (𝟈𝟈; 𝟈𝟈; 𝟈𝟈; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9;1D7C9;1D7C9;03C0;03C0; # (𝟉𝟉; 𝟉𝟉; 𝟉𝟉; π; π; ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE;1D7CE;1D7CE;0030;0030; # (𝟎𝟎; 𝟎𝟎; 𝟎𝟎; 0; 0; ) MATHEMATICAL BOLD DIGIT ZERO +1D7CF;1D7CF;1D7CF;0031;0031; # (𝟏𝟏; 𝟏𝟏; 𝟏𝟏; 1; 1; ) MATHEMATICAL BOLD DIGIT ONE +1D7D0;1D7D0;1D7D0;0032;0032; # (𝟐𝟐; 𝟐𝟐; 𝟐𝟐; 2; 2; ) MATHEMATICAL BOLD DIGIT TWO +1D7D1;1D7D1;1D7D1;0033;0033; # (𝟑𝟑; 𝟑𝟑; 𝟑𝟑; 3; 3; ) MATHEMATICAL BOLD DIGIT THREE +1D7D2;1D7D2;1D7D2;0034;0034; # (𝟒𝟒; 𝟒𝟒; 𝟒𝟒; 4; 4; ) MATHEMATICAL BOLD DIGIT FOUR +1D7D3;1D7D3;1D7D3;0035;0035; # (𝟓𝟓; 𝟓𝟓; 𝟓𝟓; 5; 5; ) MATHEMATICAL BOLD DIGIT FIVE +1D7D4;1D7D4;1D7D4;0036;0036; # (𝟔𝟔; 𝟔𝟔; 𝟔𝟔; 6; 6; ) MATHEMATICAL BOLD DIGIT SIX +1D7D5;1D7D5;1D7D5;0037;0037; # (𝟕𝟕; 𝟕𝟕; 𝟕𝟕; 7; 7; ) MATHEMATICAL BOLD DIGIT SEVEN +1D7D6;1D7D6;1D7D6;0038;0038; # (𝟖𝟖; 𝟖𝟖; 𝟖𝟖; 8; 8; ) MATHEMATICAL BOLD DIGIT EIGHT +1D7D7;1D7D7;1D7D7;0039;0039; # (𝟗𝟗; 𝟗𝟗; 𝟗𝟗; 9; 9; ) MATHEMATICAL BOLD DIGIT NINE +1D7D8;1D7D8;1D7D8;0030;0030; # (𝟘𝟘; 𝟘𝟘; 𝟘𝟘; 0; 0; ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9;1D7D9;1D7D9;0031;0031; # (𝟙𝟙; 𝟙𝟙; 𝟙𝟙; 1; 1; ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA;1D7DA;1D7DA;0032;0032; # (𝟚𝟚; 𝟚𝟚; 𝟚𝟚; 2; 2; ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB;1D7DB;1D7DB;0033;0033; # (𝟛𝟛; 𝟛𝟛; 𝟛𝟛; 3; 3; ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC;1D7DC;1D7DC;0034;0034; # (𝟜𝟜; 𝟜𝟜; 𝟜𝟜; 4; 4; ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD;1D7DD;1D7DD;0035;0035; # (𝟝𝟝; 𝟝𝟝; 𝟝𝟝; 5; 5; ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE;1D7DE;1D7DE;0036;0036; # (𝟞𝟞; 𝟞𝟞; 𝟞𝟞; 6; 6; ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF;1D7DF;1D7DF;0037;0037; # (𝟟𝟟; 𝟟𝟟; 𝟟𝟟; 7; 7; ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0;1D7E0;1D7E0;0038;0038; # (𝟠𝟠; 𝟠𝟠; 𝟠𝟠; 8; 8; ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1;1D7E1;1D7E1;0039;0039; # (𝟡𝟡; 𝟡𝟡; 𝟡𝟡; 9; 9; ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2;1D7E2;1D7E2;0030;0030; # (𝟢𝟢; 𝟢𝟢; 𝟢𝟢; 0; 0; ) MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3;1D7E3;1D7E3;0031;0031; # (𝟣𝟣; 𝟣𝟣; 𝟣𝟣; 1; 1; ) MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4;1D7E4;1D7E4;0032;0032; # (𝟤𝟤; 𝟤𝟤; 𝟤𝟤; 2; 2; ) MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5;1D7E5;1D7E5;0033;0033; # (𝟥𝟥; 𝟥𝟥; 𝟥𝟥; 3; 3; ) MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6;1D7E6;1D7E6;0034;0034; # (𝟦𝟦; 𝟦𝟦; 𝟦𝟦; 4; 4; ) MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7;1D7E7;1D7E7;0035;0035; # (𝟧𝟧; 𝟧𝟧; 𝟧𝟧; 5; 5; ) MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8;1D7E8;1D7E8;0036;0036; # (𝟨𝟨; 𝟨𝟨; 𝟨𝟨; 6; 6; ) MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9;1D7E9;1D7E9;0037;0037; # (𝟩𝟩; 𝟩𝟩; 𝟩𝟩; 7; 7; ) MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA;1D7EA;1D7EA;0038;0038; # (𝟪𝟪; 𝟪𝟪; 𝟪𝟪; 8; 8; ) MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB;1D7EB;1D7EB;0039;0039; # (𝟫𝟫; 𝟫𝟫; 𝟫𝟫; 9; 9; ) MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC;1D7EC;1D7EC;0030;0030; # (𝟬𝟬; 𝟬𝟬; 𝟬𝟬; 0; 0; ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED;1D7ED;1D7ED;0031;0031; # (𝟭𝟭; 𝟭𝟭; 𝟭𝟭; 1; 1; ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE;1D7EE;1D7EE;0032;0032; # (𝟮𝟮; 𝟮𝟮; 𝟮𝟮; 2; 2; ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF;1D7EF;1D7EF;0033;0033; # (𝟯𝟯; 𝟯𝟯; 𝟯𝟯; 3; 3; ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0;1D7F0;1D7F0;0034;0034; # (𝟰𝟰; 𝟰𝟰; 𝟰𝟰; 4; 4; ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1;1D7F1;1D7F1;0035;0035; # (𝟱𝟱; 𝟱𝟱; 𝟱𝟱; 5; 5; ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2;1D7F2;1D7F2;0036;0036; # (𝟲𝟲; 𝟲𝟲; 𝟲𝟲; 6; 6; ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3;1D7F3;1D7F3;0037;0037; # (𝟳𝟳; 𝟳𝟳; 𝟳𝟳; 7; 7; ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4;1D7F4;1D7F4;0038;0038; # (𝟴𝟴; 𝟴𝟴; 𝟴𝟴; 8; 8; ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5;1D7F5;1D7F5;0039;0039; # (𝟵𝟵; 𝟵𝟵; 𝟵𝟵; 9; 9; ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6;1D7F6;1D7F6;0030;0030; # (𝟶𝟶; 𝟶𝟶; 𝟶𝟶; 0; 0; ) MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7;1D7F7;1D7F7;0031;0031; # (𝟷𝟷; 𝟷𝟷; 𝟷𝟷; 1; 1; ) MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8;1D7F8;1D7F8;0032;0032; # (𝟸𝟸; 𝟸𝟸; 𝟸𝟸; 2; 2; ) MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9;1D7F9;1D7F9;0033;0033; # (𝟹𝟹; 𝟹𝟹; 𝟹𝟹; 3; 3; ) MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA;1D7FA;1D7FA;0034;0034; # (𝟺𝟺; 𝟺𝟺; 𝟺𝟺; 4; 4; ) MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB;1D7FB;1D7FB;0035;0035; # (𝟻𝟻; 𝟻𝟻; 𝟻𝟻; 5; 5; ) MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC;1D7FC;1D7FC;0036;0036; # (𝟼𝟼; 𝟼𝟼; 𝟼𝟼; 6; 6; ) MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD;1D7FD;1D7FD;0037;0037; # (𝟽𝟽; 𝟽𝟽; 𝟽𝟽; 7; 7; ) MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE;1D7FE;1D7FE;0038;0038; # (𝟾𝟾; 𝟾𝟾; 𝟾𝟾; 8; 8; ) MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF;1D7FF;1D7FF;0039;0039; # (𝟿𝟿; 𝟿𝟿; 𝟿𝟿; 9; 9; ) MATHEMATICAL MONOSPACE DIGIT NINE +2F800;4E3D;4E3D;4E3D;4E3D; # (丽丽; 丽; 丽; 丽; 丽; ) CJK COMPATIBILITY IDEOGRAPH-2F800 +2F801;4E38;4E38;4E38;4E38; # (丸丸; 丸; 丸; 丸; 丸; ) CJK COMPATIBILITY IDEOGRAPH-2F801 +2F802;4E41;4E41;4E41;4E41; # (乁乁; 乁; 乁; 乁; 乁; ) CJK COMPATIBILITY IDEOGRAPH-2F802 +2F803;20122;20122;20122;20122; # (𠄢𠄢; 𠄢𠄢; 𠄢𠄢; 𠄢𠄢; 𠄢𠄢; ) CJK COMPATIBILITY IDEOGRAPH-2F803 +2F804;4F60;4F60;4F60;4F60; # (你你; 你; 你; 你; 你; ) CJK COMPATIBILITY IDEOGRAPH-2F804 +2F805;4FAE;4FAE;4FAE;4FAE; # (侮侮; 侮; 侮; 侮; 侮; ) CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806;4FBB;4FBB;4FBB;4FBB; # (侻侻; 侻; 侻; 侻; 侻; ) CJK COMPATIBILITY IDEOGRAPH-2F806 +2F807;5002;5002;5002;5002; # (倂倂; 倂; 倂; 倂; 倂; ) CJK COMPATIBILITY IDEOGRAPH-2F807 +2F808;507A;507A;507A;507A; # (偺偺; 偺; 偺; 偺; 偺; ) CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809;5099;5099;5099;5099; # (備備; 備; 備; 備; 備; ) CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80A;50E7;50E7;50E7;50E7; # (僧僧; 僧; 僧; 僧; 僧; ) CJK COMPATIBILITY IDEOGRAPH-2F80A +2F80B;50CF;50CF;50CF;50CF; # (像像; 像; 像; 像; 像; ) CJK COMPATIBILITY IDEOGRAPH-2F80B +2F80C;349E;349E;349E;349E; # (㒞㒞; 㒞; 㒞; 㒞; 㒞; ) CJK COMPATIBILITY IDEOGRAPH-2F80C +2F80D;2063A;2063A;2063A;2063A; # (𠘺𠘺; 𠘺𠘺; 𠘺𠘺; 𠘺𠘺; 𠘺𠘺; ) CJK COMPATIBILITY IDEOGRAPH-2F80D +2F80E;514D;514D;514D;514D; # (免免; 免; 免; 免; 免; ) CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F;5154;5154;5154;5154; # (兔兔; 兔; 兔; 兔; 兔; ) CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810;5164;5164;5164;5164; # (兤兤; 兤; 兤; 兤; 兤; ) CJK COMPATIBILITY IDEOGRAPH-2F810 +2F811;5177;5177;5177;5177; # (具具; 具; 具; 具; 具; ) CJK COMPATIBILITY IDEOGRAPH-2F811 +2F812;2051C;2051C;2051C;2051C; # (𠔜𠔜; 𠔜𠔜; 𠔜𠔜; 𠔜𠔜; 𠔜𠔜; ) CJK COMPATIBILITY IDEOGRAPH-2F812 +2F813;34B9;34B9;34B9;34B9; # (㒹㒹; 㒹; 㒹; 㒹; 㒹; ) CJK COMPATIBILITY IDEOGRAPH-2F813 +2F814;5167;5167;5167;5167; # (內內; 內; 內; 內; 內; ) CJK COMPATIBILITY IDEOGRAPH-2F814 +2F815;518D;518D;518D;518D; # (再再; 再; 再; 再; 再; ) CJK COMPATIBILITY IDEOGRAPH-2F815 +2F816;2054B;2054B;2054B;2054B; # (𠕋𠕋; 𠕋𠕋; 𠕋𠕋; 𠕋𠕋; 𠕋𠕋; ) CJK COMPATIBILITY IDEOGRAPH-2F816 +2F817;5197;5197;5197;5197; # (冗冗; 冗; 冗; 冗; 冗; ) CJK COMPATIBILITY IDEOGRAPH-2F817 +2F818;51A4;51A4;51A4;51A4; # (冤冤; 冤; 冤; 冤; 冤; ) CJK COMPATIBILITY IDEOGRAPH-2F818 +2F819;4ECC;4ECC;4ECC;4ECC; # (仌仌; 仌; 仌; 仌; 仌; ) CJK COMPATIBILITY IDEOGRAPH-2F819 +2F81A;51AC;51AC;51AC;51AC; # (冬冬; 冬; 冬; 冬; 冬; ) CJK COMPATIBILITY IDEOGRAPH-2F81A +2F81B;51B5;51B5;51B5;51B5; # (况况; 况; 况; 况; 况; ) CJK COMPATIBILITY IDEOGRAPH-2F81B +2F81C;291DF;291DF;291DF;291DF; # (𩇟𩇟; 𩇟𩇟; 𩇟𩇟; 𩇟𩇟; 𩇟𩇟; ) CJK COMPATIBILITY IDEOGRAPH-2F81C +2F81D;51F5;51F5;51F5;51F5; # (凵凵; 凵; 凵; 凵; 凵; ) CJK COMPATIBILITY IDEOGRAPH-2F81D +2F81E;5203;5203;5203;5203; # (刃刃; 刃; 刃; 刃; 刃; ) CJK COMPATIBILITY IDEOGRAPH-2F81E +2F81F;34DF;34DF;34DF;34DF; # (㓟㓟; 㓟; 㓟; 㓟; 㓟; ) CJK COMPATIBILITY IDEOGRAPH-2F81F +2F820;523B;523B;523B;523B; # (刻刻; 刻; 刻; 刻; 刻; ) CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821;5246;5246;5246;5246; # (剆剆; 剆; 剆; 剆; 剆; ) CJK COMPATIBILITY IDEOGRAPH-2F821 +2F822;5272;5272;5272;5272; # (割割; 割; 割; 割; 割; ) CJK COMPATIBILITY IDEOGRAPH-2F822 +2F823;5277;5277;5277;5277; # (剷剷; 剷; 剷; 剷; 剷; ) CJK COMPATIBILITY IDEOGRAPH-2F823 +2F824;3515;3515;3515;3515; # (㔕㔕; 㔕; 㔕; 㔕; 㔕; ) CJK COMPATIBILITY IDEOGRAPH-2F824 +2F825;52C7;52C7;52C7;52C7; # (勇勇; 勇; 勇; 勇; 勇; ) CJK COMPATIBILITY IDEOGRAPH-2F825 +2F826;52C9;52C9;52C9;52C9; # (勉勉; 勉; 勉; 勉; 勉; ) CJK COMPATIBILITY IDEOGRAPH-2F826 +2F827;52E4;52E4;52E4;52E4; # (勤勤; 勤; 勤; 勤; 勤; ) CJK COMPATIBILITY IDEOGRAPH-2F827 +2F828;52FA;52FA;52FA;52FA; # (勺勺; 勺; 勺; 勺; 勺; ) CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829;5305;5305;5305;5305; # (包包; 包; 包; 包; 包; ) CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A;5306;5306;5306;5306; # (匆匆; 匆; 匆; 匆; 匆; ) CJK COMPATIBILITY IDEOGRAPH-2F82A +2F82B;5317;5317;5317;5317; # (北北; 北; 北; 北; 北; ) CJK COMPATIBILITY IDEOGRAPH-2F82B +2F82C;5349;5349;5349;5349; # (卉卉; 卉; 卉; 卉; 卉; ) CJK COMPATIBILITY IDEOGRAPH-2F82C +2F82D;5351;5351;5351;5351; # (卑卑; 卑; 卑; 卑; 卑; ) CJK COMPATIBILITY IDEOGRAPH-2F82D +2F82E;535A;535A;535A;535A; # (博博; 博; 博; 博; 博; ) CJK COMPATIBILITY IDEOGRAPH-2F82E +2F82F;5373;5373;5373;5373; # (即即; 即; 即; 即; 即; ) CJK COMPATIBILITY IDEOGRAPH-2F82F +2F830;537D;537D;537D;537D; # (卽卽; 卽; 卽; 卽; 卽; ) CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831;537F;537F;537F;537F; # (卿卿; 卿; 卿; 卿; 卿; ) CJK COMPATIBILITY IDEOGRAPH-2F831 +2F832;537F;537F;537F;537F; # (卿卿; 卿; 卿; 卿; 卿; ) CJK COMPATIBILITY IDEOGRAPH-2F832 +2F833;537F;537F;537F;537F; # (卿卿; 卿; 卿; 卿; 卿; ) CJK COMPATIBILITY IDEOGRAPH-2F833 +2F834;20A2C;20A2C;20A2C;20A2C; # (𠨬𠨬; 𠨬𠨬; 𠨬𠨬; 𠨬𠨬; 𠨬𠨬; ) CJK COMPATIBILITY IDEOGRAPH-2F834 +2F835;7070;7070;7070;7070; # (灰灰; 灰; 灰; 灰; 灰; ) CJK COMPATIBILITY IDEOGRAPH-2F835 +2F836;53CA;53CA;53CA;53CA; # (及及; 及; 及; 及; 及; ) CJK COMPATIBILITY IDEOGRAPH-2F836 +2F837;53DF;53DF;53DF;53DF; # (叟叟; 叟; 叟; 叟; 叟; ) CJK COMPATIBILITY IDEOGRAPH-2F837 +2F838;20B63;20B63;20B63;20B63; # (𠭣𠭣; 𠭣𠭣; 𠭣𠭣; 𠭣𠭣; 𠭣𠭣; ) CJK COMPATIBILITY IDEOGRAPH-2F838 +2F839;53EB;53EB;53EB;53EB; # (叫叫; 叫; 叫; 叫; 叫; ) CJK COMPATIBILITY IDEOGRAPH-2F839 +2F83A;53F1;53F1;53F1;53F1; # (叱叱; 叱; 叱; 叱; 叱; ) CJK COMPATIBILITY IDEOGRAPH-2F83A +2F83B;5406;5406;5406;5406; # (吆吆; 吆; 吆; 吆; 吆; ) CJK COMPATIBILITY IDEOGRAPH-2F83B +2F83C;549E;549E;549E;549E; # (咞咞; 咞; 咞; 咞; 咞; ) CJK COMPATIBILITY IDEOGRAPH-2F83C +2F83D;5438;5438;5438;5438; # (吸吸; 吸; 吸; 吸; 吸; ) CJK COMPATIBILITY IDEOGRAPH-2F83D +2F83E;5448;5448;5448;5448; # (呈呈; 呈; 呈; 呈; 呈; ) CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F;5468;5468;5468;5468; # (周周; 周; 周; 周; 周; ) CJK COMPATIBILITY IDEOGRAPH-2F83F +2F840;54A2;54A2;54A2;54A2; # (咢咢; 咢; 咢; 咢; 咢; ) CJK COMPATIBILITY IDEOGRAPH-2F840 +2F841;54F6;54F6;54F6;54F6; # (哶哶; 哶; 哶; 哶; 哶; ) CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842;5510;5510;5510;5510; # (唐唐; 唐; 唐; 唐; 唐; ) CJK COMPATIBILITY IDEOGRAPH-2F842 +2F843;5553;5553;5553;5553; # (啓啓; 啓; 啓; 啓; 啓; ) CJK COMPATIBILITY IDEOGRAPH-2F843 +2F844;5563;5563;5563;5563; # (啣啣; 啣; 啣; 啣; 啣; ) CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845;5584;5584;5584;5584; # (善善; 善; 善; 善; 善; ) CJK COMPATIBILITY IDEOGRAPH-2F845 +2F846;5584;5584;5584;5584; # (善善; 善; 善; 善; 善; ) CJK COMPATIBILITY IDEOGRAPH-2F846 +2F847;5599;5599;5599;5599; # (喙喙; 喙; 喙; 喙; 喙; ) CJK COMPATIBILITY IDEOGRAPH-2F847 +2F848;55AB;55AB;55AB;55AB; # (喫喫; 喫; 喫; 喫; 喫; ) CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849;55B3;55B3;55B3;55B3; # (喳喳; 喳; 喳; 喳; 喳; ) CJK COMPATIBILITY IDEOGRAPH-2F849 +2F84A;55C2;55C2;55C2;55C2; # (嗂嗂; 嗂; 嗂; 嗂; 嗂; ) CJK COMPATIBILITY IDEOGRAPH-2F84A +2F84B;5716;5716;5716;5716; # (圖圖; 圖; 圖; 圖; 圖; ) CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84C;5606;5606;5606;5606; # (嘆嘆; 嘆; 嘆; 嘆; 嘆; ) CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84D;5717;5717;5717;5717; # (圗圗; 圗; 圗; 圗; 圗; ) CJK COMPATIBILITY IDEOGRAPH-2F84D +2F84E;5651;5651;5651;5651; # (噑噑; 噑; 噑; 噑; 噑; ) CJK COMPATIBILITY IDEOGRAPH-2F84E +2F84F;5674;5674;5674;5674; # (噴噴; 噴; 噴; 噴; 噴; ) CJK COMPATIBILITY IDEOGRAPH-2F84F +2F850;5207;5207;5207;5207; # (切切; 切; 切; 切; 切; ) CJK COMPATIBILITY IDEOGRAPH-2F850 +2F851;58EE;58EE;58EE;58EE; # (壮壮; 壮; 壮; 壮; 壮; ) CJK COMPATIBILITY IDEOGRAPH-2F851 +2F852;57CE;57CE;57CE;57CE; # (城城; 城; 城; 城; 城; ) CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853;57F4;57F4;57F4;57F4; # (埴埴; 埴; 埴; 埴; 埴; ) CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854;580D;580D;580D;580D; # (堍堍; 堍; 堍; 堍; 堍; ) CJK COMPATIBILITY IDEOGRAPH-2F854 +2F855;578B;578B;578B;578B; # (型型; 型; 型; 型; 型; ) CJK COMPATIBILITY IDEOGRAPH-2F855 +2F856;5832;5832;5832;5832; # (堲堲; 堲; 堲; 堲; 堲; ) CJK COMPATIBILITY IDEOGRAPH-2F856 +2F857;5831;5831;5831;5831; # (報報; 報; 報; 報; 報; ) CJK COMPATIBILITY IDEOGRAPH-2F857 +2F858;58AC;58AC;58AC;58AC; # (墬墬; 墬; 墬; 墬; 墬; ) CJK COMPATIBILITY IDEOGRAPH-2F858 +2F859;214E4;214E4;214E4;214E4; # (𡓤𡓤; 𡓤𡓤; 𡓤𡓤; 𡓤𡓤; 𡓤𡓤; ) CJK COMPATIBILITY IDEOGRAPH-2F859 +2F85A;58F2;58F2;58F2;58F2; # (売売; 売; 売; 売; 売; ) CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B;58F7;58F7;58F7;58F7; # (壷壷; 壷; 壷; 壷; 壷; ) CJK COMPATIBILITY IDEOGRAPH-2F85B +2F85C;5906;5906;5906;5906; # (夆夆; 夆; 夆; 夆; 夆; ) CJK COMPATIBILITY IDEOGRAPH-2F85C +2F85D;591A;591A;591A;591A; # (多多; 多; 多; 多; 多; ) CJK COMPATIBILITY IDEOGRAPH-2F85D +2F85E;5922;5922;5922;5922; # (夢夢; 夢; 夢; 夢; 夢; ) CJK COMPATIBILITY IDEOGRAPH-2F85E +2F85F;5962;5962;5962;5962; # (奢奢; 奢; 奢; 奢; 奢; ) CJK COMPATIBILITY IDEOGRAPH-2F85F +2F860;216A8;216A8;216A8;216A8; # (𡚨𡚨; 𡚨𡚨; 𡚨𡚨; 𡚨𡚨; 𡚨𡚨; ) CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861;216EA;216EA;216EA;216EA; # (𡛪𡛪; 𡛪𡛪; 𡛪𡛪; 𡛪𡛪; 𡛪𡛪; ) CJK COMPATIBILITY IDEOGRAPH-2F861 +2F862;59EC;59EC;59EC;59EC; # (姬姬; 姬; 姬; 姬; 姬; ) CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863;5A1B;5A1B;5A1B;5A1B; # (娛娛; 娛; 娛; 娛; 娛; ) CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864;5A27;5A27;5A27;5A27; # (娧娧; 娧; 娧; 娧; 娧; ) CJK COMPATIBILITY IDEOGRAPH-2F864 +2F865;59D8;59D8;59D8;59D8; # (姘姘; 姘; 姘; 姘; 姘; ) CJK COMPATIBILITY IDEOGRAPH-2F865 +2F866;5A66;5A66;5A66;5A66; # (婦婦; 婦; 婦; 婦; 婦; ) CJK COMPATIBILITY IDEOGRAPH-2F866 +2F867;36EE;36EE;36EE;36EE; # (㛮㛮; 㛮; 㛮; 㛮; 㛮; ) CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868;2136A;2136A;2136A;2136A; # (㛼㛼; 𡍪𡍪; 𡍪𡍪; 𡍪𡍪; 𡍪𡍪; ) CJK COMPATIBILITY IDEOGRAPH-2F868 +2F869;5B08;5B08;5B08;5B08; # (嬈嬈; 嬈; 嬈; 嬈; 嬈; ) CJK COMPATIBILITY IDEOGRAPH-2F869 +2F86A;5B3E;5B3E;5B3E;5B3E; # (嬾嬾; 嬾; 嬾; 嬾; 嬾; ) CJK COMPATIBILITY IDEOGRAPH-2F86A +2F86B;5B3E;5B3E;5B3E;5B3E; # (嬾嬾; 嬾; 嬾; 嬾; 嬾; ) CJK COMPATIBILITY IDEOGRAPH-2F86B +2F86C;219C8;219C8;219C8;219C8; # (𡧈𡧈; 𡧈𡧈; 𡧈𡧈; 𡧈𡧈; 𡧈𡧈; ) CJK COMPATIBILITY IDEOGRAPH-2F86C +2F86D;5BC3;5BC3;5BC3;5BC3; # (寃寃; 寃; 寃; 寃; 寃; ) CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E;5BD8;5BD8;5BD8;5BD8; # (寘寘; 寘; 寘; 寘; 寘; ) CJK COMPATIBILITY IDEOGRAPH-2F86E +2F86F;5BE7;5BE7;5BE7;5BE7; # (寧寧; 寧; 寧; 寧; 寧; ) CJK COMPATIBILITY IDEOGRAPH-2F86F +2F870;5BF3;5BF3;5BF3;5BF3; # (寳寳; 寳; 寳; 寳; 寳; ) CJK COMPATIBILITY IDEOGRAPH-2F870 +2F871;21B18;21B18;21B18;21B18; # (𡬘𡬘; 𡬘𡬘; 𡬘𡬘; 𡬘𡬘; 𡬘𡬘; ) CJK COMPATIBILITY IDEOGRAPH-2F871 +2F872;5BFF;5BFF;5BFF;5BFF; # (寿寿; 寿; 寿; 寿; 寿; ) CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873;5C06;5C06;5C06;5C06; # (将将; 将; 将; 将; 将; ) CJK COMPATIBILITY IDEOGRAPH-2F873 +2F874;5F33;5F33;5F33;5F33; # (当当; 弳; 弳; 弳; 弳; ) CJK COMPATIBILITY IDEOGRAPH-2F874 +2F875;5C22;5C22;5C22;5C22; # (尢尢; 尢; 尢; 尢; 尢; ) CJK COMPATIBILITY IDEOGRAPH-2F875 +2F876;3781;3781;3781;3781; # (㞁㞁; 㞁; 㞁; 㞁; 㞁; ) CJK COMPATIBILITY IDEOGRAPH-2F876 +2F877;5C60;5C60;5C60;5C60; # (屠屠; 屠; 屠; 屠; 屠; ) CJK COMPATIBILITY IDEOGRAPH-2F877 +2F878;5C6E;5C6E;5C6E;5C6E; # (屮屮; 屮; 屮; 屮; 屮; ) CJK COMPATIBILITY IDEOGRAPH-2F878 +2F879;5CC0;5CC0;5CC0;5CC0; # (峀峀; 峀; 峀; 峀; 峀; ) CJK COMPATIBILITY IDEOGRAPH-2F879 +2F87A;5C8D;5C8D;5C8D;5C8D; # (岍岍; 岍; 岍; 岍; 岍; ) CJK COMPATIBILITY IDEOGRAPH-2F87A +2F87B;21DE4;21DE4;21DE4;21DE4; # (𡷤𡷤; 𡷤𡷤; 𡷤𡷤; 𡷤𡷤; 𡷤𡷤; ) CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87C;5D43;5D43;5D43;5D43; # (嵃嵃; 嵃; 嵃; 嵃; 嵃; ) CJK COMPATIBILITY IDEOGRAPH-2F87C +2F87D;21DE6;21DE6;21DE6;21DE6; # (𡷦𡷦; 𡷦𡷦; 𡷦𡷦; 𡷦𡷦; 𡷦𡷦; ) CJK COMPATIBILITY IDEOGRAPH-2F87D +2F87E;5D6E;5D6E;5D6E;5D6E; # (嵮嵮; 嵮; 嵮; 嵮; 嵮; ) CJK COMPATIBILITY IDEOGRAPH-2F87E +2F87F;5D6B;5D6B;5D6B;5D6B; # (嵫嵫; 嵫; 嵫; 嵫; 嵫; ) CJK COMPATIBILITY IDEOGRAPH-2F87F +2F880;5D7C;5D7C;5D7C;5D7C; # (嵼嵼; 嵼; 嵼; 嵼; 嵼; ) CJK COMPATIBILITY IDEOGRAPH-2F880 +2F881;5DE1;5DE1;5DE1;5DE1; # (巡巡; 巡; 巡; 巡; 巡; ) CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882;5DE2;5DE2;5DE2;5DE2; # (巢巢; 巢; 巢; 巢; 巢; ) CJK COMPATIBILITY IDEOGRAPH-2F882 +2F883;382F;382F;382F;382F; # (㠯㠯; 㠯; 㠯; 㠯; 㠯; ) CJK COMPATIBILITY IDEOGRAPH-2F883 +2F884;5DFD;5DFD;5DFD;5DFD; # (巽巽; 巽; 巽; 巽; 巽; ) CJK COMPATIBILITY IDEOGRAPH-2F884 +2F885;5E28;5E28;5E28;5E28; # (帨帨; 帨; 帨; 帨; 帨; ) CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886;5E3D;5E3D;5E3D;5E3D; # (帽帽; 帽; 帽; 帽; 帽; ) CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887;5E69;5E69;5E69;5E69; # (幩幩; 幩; 幩; 幩; 幩; ) CJK COMPATIBILITY IDEOGRAPH-2F887 +2F888;3862;3862;3862;3862; # (㡢㡢; 㡢; 㡢; 㡢; 㡢; ) CJK COMPATIBILITY IDEOGRAPH-2F888 +2F889;22183;22183;22183;22183; # (𢆃𢆃; 𢆃𢆃; 𢆃𢆃; 𢆃𢆃; 𢆃𢆃; ) CJK COMPATIBILITY IDEOGRAPH-2F889 +2F88A;387C;387C;387C;387C; # (㡼㡼; 㡼; 㡼; 㡼; 㡼; ) CJK COMPATIBILITY IDEOGRAPH-2F88A +2F88B;5EB0;5EB0;5EB0;5EB0; # (庰庰; 庰; 庰; 庰; 庰; ) CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C;5EB3;5EB3;5EB3;5EB3; # (庳庳; 庳; 庳; 庳; 庳; ) CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D;5EB6;5EB6;5EB6;5EB6; # (庶庶; 庶; 庶; 庶; 庶; ) CJK COMPATIBILITY IDEOGRAPH-2F88D +2F88E;5ECA;5ECA;5ECA;5ECA; # (廊廊; 廊; 廊; 廊; 廊; ) CJK COMPATIBILITY IDEOGRAPH-2F88E +2F88F;2A392;2A392;2A392;2A392; # (𪎒𪎒; 𪎒𪎒; 𪎒𪎒; 𪎒𪎒; 𪎒𪎒; ) CJK COMPATIBILITY IDEOGRAPH-2F88F +2F890;5EFE;5EFE;5EFE;5EFE; # (廾廾; 廾; 廾; 廾; 廾; ) CJK COMPATIBILITY IDEOGRAPH-2F890 +2F891;22331;22331;22331;22331; # (𢌱𢌱; 𢌱𢌱; 𢌱𢌱; 𢌱𢌱; 𢌱𢌱; ) CJK COMPATIBILITY IDEOGRAPH-2F891 +2F892;22331;22331;22331;22331; # (𢌱𢌱; 𢌱𢌱; 𢌱𢌱; 𢌱𢌱; 𢌱𢌱; ) CJK COMPATIBILITY IDEOGRAPH-2F892 +2F893;8201;8201;8201;8201; # (舁舁; 舁; 舁; 舁; 舁; ) CJK COMPATIBILITY IDEOGRAPH-2F893 +2F894;5F22;5F22;5F22;5F22; # (弢弢; 弢; 弢; 弢; 弢; ) CJK COMPATIBILITY IDEOGRAPH-2F894 +2F895;5F22;5F22;5F22;5F22; # (弢弢; 弢; 弢; 弢; 弢; ) CJK COMPATIBILITY IDEOGRAPH-2F895 +2F896;38C7;38C7;38C7;38C7; # (㣇㣇; 㣇; 㣇; 㣇; 㣇; ) CJK COMPATIBILITY IDEOGRAPH-2F896 +2F897;232B8;232B8;232B8;232B8; # (𣊸𣊸; 𣊸𣊸; 𣊸𣊸; 𣊸𣊸; 𣊸𣊸; ) CJK COMPATIBILITY IDEOGRAPH-2F897 +2F898;261DA;261DA;261DA;261DA; # (𦇚𦇚; 𦇚𦇚; 𦇚𦇚; 𦇚𦇚; 𦇚𦇚; ) CJK COMPATIBILITY IDEOGRAPH-2F898 +2F899;5F62;5F62;5F62;5F62; # (形形; 形; 形; 形; 形; ) CJK COMPATIBILITY IDEOGRAPH-2F899 +2F89A;5F6B;5F6B;5F6B;5F6B; # (彫彫; 彫; 彫; 彫; 彫; ) CJK COMPATIBILITY IDEOGRAPH-2F89A +2F89B;38E3;38E3;38E3;38E3; # (㣣㣣; 㣣; 㣣; 㣣; 㣣; ) CJK COMPATIBILITY IDEOGRAPH-2F89B +2F89C;5F9A;5F9A;5F9A;5F9A; # (徚徚; 徚; 徚; 徚; 徚; ) CJK COMPATIBILITY IDEOGRAPH-2F89C +2F89D;5FCD;5FCD;5FCD;5FCD; # (忍忍; 忍; 忍; 忍; 忍; ) CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E;5FD7;5FD7;5FD7;5FD7; # (志志; 志; 志; 志; 志; ) CJK COMPATIBILITY IDEOGRAPH-2F89E +2F89F;5FF9;5FF9;5FF9;5FF9; # (忹忹; 忹; 忹; 忹; 忹; ) CJK COMPATIBILITY IDEOGRAPH-2F89F +2F8A0;6081;6081;6081;6081; # (悁悁; 悁; 悁; 悁; 悁; ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 +2F8A1;393A;393A;393A;393A; # (㤺㤺; 㤺; 㤺; 㤺; 㤺; ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8A2;391C;391C;391C;391C; # (㤜㤜; 㤜; 㤜; 㤜; 㤜; ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A3;6094;6094;6094;6094; # (悔悔; 悔; 悔; 悔; 悔; ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A4;226D4;226D4;226D4;226D4; # (𢛔𢛔; 𢛔𢛔; 𢛔𢛔; 𢛔𢛔; 𢛔𢛔; ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 +2F8A5;60C7;60C7;60C7;60C7; # (惇惇; 惇; 惇; 惇; 惇; ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 +2F8A6;6148;6148;6148;6148; # (慈慈; 慈; 慈; 慈; 慈; ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7;614C;614C;614C;614C; # (慌慌; 慌; 慌; 慌; 慌; ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A8;614E;614E;614E;614E; # (慎慎; 慎; 慎; 慎; 慎; ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 +2F8A9;614C;614C;614C;614C; # (慌慌; 慌; 慌; 慌; 慌; ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 +2F8AA;617A;617A;617A;617A; # (慺慺; 慺; 慺; 慺; 慺; ) CJK COMPATIBILITY IDEOGRAPH-2F8AA +2F8AB;618E;618E;618E;618E; # (憎憎; 憎; 憎; 憎; 憎; ) CJK COMPATIBILITY IDEOGRAPH-2F8AB +2F8AC;61B2;61B2;61B2;61B2; # (憲憲; 憲; 憲; 憲; 憲; ) CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AD;61A4;61A4;61A4;61A4; # (憤憤; 憤; 憤; 憤; 憤; ) CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE;61AF;61AF;61AF;61AF; # (憯憯; 憯; 憯; 憯; 憯; ) CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AF;61DE;61DE;61DE;61DE; # (懞懞; 懞; 懞; 懞; 懞; ) CJK COMPATIBILITY IDEOGRAPH-2F8AF +2F8B0;61F2;61F2;61F2;61F2; # (懲懲; 懲; 懲; 懲; 懲; ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 +2F8B1;61F6;61F6;61F6;61F6; # (懶懶; 懶; 懶; 懶; 懶; ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 +2F8B2;6210;6210;6210;6210; # (成成; 成; 成; 成; 成; ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3;621B;621B;621B;621B; # (戛戛; 戛; 戛; 戛; 戛; ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 +2F8B4;625D;625D;625D;625D; # (扝扝; 扝; 扝; 扝; 扝; ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 +2F8B5;62B1;62B1;62B1;62B1; # (抱抱; 抱; 抱; 抱; 抱; ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 +2F8B6;62D4;62D4;62D4;62D4; # (拔拔; 拔; 拔; 拔; 拔; ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8B7;6350;6350;6350;6350; # (捐捐; 捐; 捐; 捐; 捐; ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 +2F8B8;22B0C;22B0C;22B0C;22B0C; # (𢬌𢬌; 𢬌𢬌; 𢬌𢬌; 𢬌𢬌; 𢬌𢬌; ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8B9;633D;633D;633D;633D; # (挽挽; 挽; 挽; 挽; 挽; ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8BA;62FC;62FC;62FC;62FC; # (拼拼; 拼; 拼; 拼; 拼; ) CJK COMPATIBILITY IDEOGRAPH-2F8BA +2F8BB;6368;6368;6368;6368; # (捨捨; 捨; 捨; 捨; 捨; ) CJK COMPATIBILITY IDEOGRAPH-2F8BB +2F8BC;6383;6383;6383;6383; # (掃掃; 掃; 掃; 掃; 掃; ) CJK COMPATIBILITY IDEOGRAPH-2F8BC +2F8BD;63E4;63E4;63E4;63E4; # (揤揤; 揤; 揤; 揤; 揤; ) CJK COMPATIBILITY IDEOGRAPH-2F8BD +2F8BE;22BF1;22BF1;22BF1;22BF1; # (𢯱𢯱; 𢯱𢯱; 𢯱𢯱; 𢯱𢯱; 𢯱𢯱; ) CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8BF;6422;6422;6422;6422; # (搢搢; 搢; 搢; 搢; 搢; ) CJK COMPATIBILITY IDEOGRAPH-2F8BF +2F8C0;63C5;63C5;63C5;63C5; # (揅揅; 揅; 揅; 揅; 揅; ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8C1;63A9;63A9;63A9;63A9; # (掩掩; 掩; 掩; 掩; 掩; ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 +2F8C2;3A2E;3A2E;3A2E;3A2E; # (㨮㨮; 㨮; 㨮; 㨮; 㨮; ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C3;6469;6469;6469;6469; # (摩摩; 摩; 摩; 摩; 摩; ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C4;647E;647E;647E;647E; # (摾摾; 摾; 摾; 摾; 摾; ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 +2F8C5;649D;649D;649D;649D; # (撝撝; 撝; 撝; 撝; 撝; ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 +2F8C6;6477;6477;6477;6477; # (摷摷; 摷; 摷; 摷; 摷; ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C7;3A6C;3A6C;3A6C;3A6C; # (㩬㩬; 㩬; 㩬; 㩬; 㩬; ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8C8;654F;654F;654F;654F; # (敏敏; 敏; 敏; 敏; 敏; ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 +2F8C9;656C;656C;656C;656C; # (敬敬; 敬; 敬; 敬; 敬; ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 +2F8CA;2300A;2300A;2300A;2300A; # (𣀊𣀊; 𣀊𣀊; 𣀊𣀊; 𣀊𣀊; 𣀊𣀊; ) CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F8CB;65E3;65E3;65E3;65E3; # (旣旣; 旣; 旣; 旣; 旣; ) CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F8CC;66F8;66F8;66F8;66F8; # (書書; 書; 書; 書; 書; ) CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8CD;6649;6649;6649;6649; # (晉晉; 晉; 晉; 晉; 晉; ) CJK COMPATIBILITY IDEOGRAPH-2F8CD +2F8CE;3B19;3B19;3B19;3B19; # (㬙㬙; 㬙; 㬙; 㬙; 㬙; ) CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8CF;6691;6691;6691;6691; # (暑暑; 暑; 暑; 暑; 暑; ) CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D0;3B08;3B08;3B08;3B08; # (㬈㬈; 㬈; 㬈; 㬈; 㬈; ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8D1;3AE4;3AE4;3AE4;3AE4; # (㫤㫤; 㫤; 㫤; 㫤; 㫤; ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D2;5192;5192;5192;5192; # (冒冒; 冒; 冒; 冒; 冒; ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3;5195;5195;5195;5195; # (冕冕; 冕; 冕; 冕; 冕; ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F8D4;6700;6700;6700;6700; # (最最; 最; 最; 最; 最; ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F8D5;669C;669C;669C;669C; # (暜暜; 暜; 暜; 暜; 暜; ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 +2F8D6;80AD;80AD;80AD;80AD; # (肭肭; 肭; 肭; 肭; 肭; ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F8D7;43D9;43D9;43D9;43D9; # (䏙䏙; 䏙; 䏙; 䏙; 䏙; ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F8D8;6717;6717;6717;6717; # (朗朗; 朗; 朗; 朗; 朗; ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 +2F8D9;671B;671B;671B;671B; # (望望; 望; 望; 望; 望; ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA;6721;6721;6721;6721; # (朡朡; 朡; 朡; 朡; 朡; ) CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F8DB;675E;675E;675E;675E; # (杞杞; 杞; 杞; 杞; 杞; ) CJK COMPATIBILITY IDEOGRAPH-2F8DB +2F8DC;6753;6753;6753;6753; # (杓杓; 杓; 杓; 杓; 杓; ) CJK COMPATIBILITY IDEOGRAPH-2F8DC +2F8DD;233C3;233C3;233C3;233C3; # (𣏃𣏃; 𣏃𣏃; 𣏃𣏃; 𣏃𣏃; 𣏃𣏃; ) CJK COMPATIBILITY IDEOGRAPH-2F8DD +2F8DE;3B49;3B49;3B49;3B49; # (㭉㭉; 㭉; 㭉; 㭉; 㭉; ) CJK COMPATIBILITY IDEOGRAPH-2F8DE +2F8DF;67FA;67FA;67FA;67FA; # (柺柺; 柺; 柺; 柺; 柺; ) CJK COMPATIBILITY IDEOGRAPH-2F8DF +2F8E0;6785;6785;6785;6785; # (枅枅; 枅; 枅; 枅; 枅; ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 +2F8E1;6852;6852;6852;6852; # (桒桒; 桒; 桒; 桒; 桒; ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 +2F8E2;6885;6885;6885;6885; # (梅梅; 梅; 梅; 梅; 梅; ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E3;2346D;2346D;2346D;2346D; # (𣑭𣑭; 𣑭𣑭; 𣑭𣑭; 𣑭𣑭; 𣑭𣑭; ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8E4;688E;688E;688E;688E; # (梎梎; 梎; 梎; 梎; 梎; ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 +2F8E5;681F;681F;681F;681F; # (栟栟; 栟; 栟; 栟; 栟; ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 +2F8E6;6914;6914;6914;6914; # (椔椔; 椔; 椔; 椔; 椔; ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E7;3B9D;3B9D;3B9D;3B9D; # (㮝㮝; 㮝; 㮝; 㮝; 㮝; ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8E8;6942;6942;6942;6942; # (楂楂; 楂; 楂; 楂; 楂; ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9;69A3;69A3;69A3;69A3; # (榣榣; 榣; 榣; 榣; 榣; ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA;69EA;69EA;69EA;69EA; # (槪槪; 槪; 槪; 槪; 槪; ) CJK COMPATIBILITY IDEOGRAPH-2F8EA +2F8EB;6AA8;6AA8;6AA8;6AA8; # (檨檨; 檨; 檨; 檨; 檨; ) CJK COMPATIBILITY IDEOGRAPH-2F8EB +2F8EC;236A3;236A3;236A3;236A3; # (𣚣𣚣; 𣚣𣚣; 𣚣𣚣; 𣚣𣚣; 𣚣𣚣; ) CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8ED;6ADB;6ADB;6ADB;6ADB; # (櫛櫛; 櫛; 櫛; 櫛; 櫛; ) CJK COMPATIBILITY IDEOGRAPH-2F8ED +2F8EE;3C18;3C18;3C18;3C18; # (㰘㰘; 㰘; 㰘; 㰘; 㰘; ) CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8EF;6B21;6B21;6B21;6B21; # (次次; 次; 次; 次; 次; ) CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F0;238A7;238A7;238A7;238A7; # (𣢧𣢧; 𣢧𣢧; 𣢧𣢧; 𣢧𣢧; 𣢧𣢧; ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F1;6B54;6B54;6B54;6B54; # (歔歔; 歔; 歔; 歔; 歔; ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F8F2;3C4E;3C4E;3C4E;3C4E; # (㱎㱎; 㱎; 㱎; 㱎; 㱎; ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F8F3;6B72;6B72;6B72;6B72; # (歲歲; 歲; 歲; 歲; 歲; ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 +2F8F4;6B9F;6B9F;6B9F;6B9F; # (殟殟; 殟; 殟; 殟; 殟; ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 +2F8F5;6BBA;6BBA;6BBA;6BBA; # (殺殺; 殺; 殺; 殺; 殺; ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6;6BBB;6BBB;6BBB;6BBB; # (殻殻; 殻; 殻; 殻; 殻; ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F8F7;23A8D;23A8D;23A8D;23A8D; # (𣪍𣪍; 𣪍𣪍; 𣪍𣪍; 𣪍𣪍; 𣪍𣪍; ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F8;21D0B;21D0B;21D0B;21D0B; # (𡴋𡴋; 𡴋𡴋; 𡴋𡴋; 𡴋𡴋; 𡴋𡴋; ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F8F9;23AFA;23AFA;23AFA;23AFA; # (𣫺𣫺; 𣫺𣫺; 𣫺𣫺; 𣫺𣫺; 𣫺𣫺; ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FA;6C4E;6C4E;6C4E;6C4E; # (汎汎; 汎; 汎; 汎; 汎; ) CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FB;23CBC;23CBC;23CBC;23CBC; # (𣲼𣲼; 𣲼𣲼; 𣲼𣲼; 𣲼𣲼; 𣲼𣲼; ) CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F8FC;6CBF;6CBF;6CBF;6CBF; # (沿沿; 沿; 沿; 沿; 沿; ) CJK COMPATIBILITY IDEOGRAPH-2F8FC +2F8FD;6CCD;6CCD;6CCD;6CCD; # (泍泍; 泍; 泍; 泍; 泍; ) CJK COMPATIBILITY IDEOGRAPH-2F8FD +2F8FE;6C67;6C67;6C67;6C67; # (汧汧; 汧; 汧; 汧; 汧; ) CJK COMPATIBILITY IDEOGRAPH-2F8FE +2F8FF;6D16;6D16;6D16;6D16; # (洖洖; 洖; 洖; 洖; 洖; ) CJK COMPATIBILITY IDEOGRAPH-2F8FF +2F900;6D3E;6D3E;6D3E;6D3E; # (派派; 派; 派; 派; 派; ) CJK COMPATIBILITY IDEOGRAPH-2F900 +2F901;6D77;6D77;6D77;6D77; # (海海; 海; 海; 海; 海; ) CJK COMPATIBILITY IDEOGRAPH-2F901 +2F902;6D41;6D41;6D41;6D41; # (流流; 流; 流; 流; 流; ) CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903;6D69;6D69;6D69;6D69; # (浩浩; 浩; 浩; 浩; 浩; ) CJK COMPATIBILITY IDEOGRAPH-2F903 +2F904;6D78;6D78;6D78;6D78; # (浸浸; 浸; 浸; 浸; 浸; ) CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905;6D85;6D85;6D85;6D85; # (涅涅; 涅; 涅; 涅; 涅; ) CJK COMPATIBILITY IDEOGRAPH-2F905 +2F906;23D1E;23D1E;23D1E;23D1E; # (𣴞𣴞; 𣴞𣴞; 𣴞𣴞; 𣴞𣴞; 𣴞𣴞; ) CJK COMPATIBILITY IDEOGRAPH-2F906 +2F907;6D34;6D34;6D34;6D34; # (洴洴; 洴; 洴; 洴; 洴; ) CJK COMPATIBILITY IDEOGRAPH-2F907 +2F908;6E2F;6E2F;6E2F;6E2F; # (港港; 港; 港; 港; 港; ) CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909;6E6E;6E6E;6E6E;6E6E; # (湮湮; 湮; 湮; 湮; 湮; ) CJK COMPATIBILITY IDEOGRAPH-2F909 +2F90A;3D33;3D33;3D33;3D33; # (㴳㴳; 㴳; 㴳; 㴳; 㴳; ) CJK COMPATIBILITY IDEOGRAPH-2F90A +2F90B;6ECB;6ECB;6ECB;6ECB; # (滋滋; 滋; 滋; 滋; 滋; ) CJK COMPATIBILITY IDEOGRAPH-2F90B +2F90C;6EC7;6EC7;6EC7;6EC7; # (滇滇; 滇; 滇; 滇; 滇; ) CJK COMPATIBILITY IDEOGRAPH-2F90C +2F90D;23ED1;23ED1;23ED1;23ED1; # (𣻑𣻑; 𣻑𣻑; 𣻑𣻑; 𣻑𣻑; 𣻑𣻑; ) CJK COMPATIBILITY IDEOGRAPH-2F90D +2F90E;6DF9;6DF9;6DF9;6DF9; # (淹淹; 淹; 淹; 淹; 淹; ) CJK COMPATIBILITY IDEOGRAPH-2F90E +2F90F;6F6E;6F6E;6F6E;6F6E; # (潮潮; 潮; 潮; 潮; 潮; ) CJK COMPATIBILITY IDEOGRAPH-2F90F +2F910;23F5E;23F5E;23F5E;23F5E; # (𣽞𣽞; 𣽞𣽞; 𣽞𣽞; 𣽞𣽞; 𣽞𣽞; ) CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911;23F8E;23F8E;23F8E;23F8E; # (𣾎𣾎; 𣾎𣾎; 𣾎𣾎; 𣾎𣾎; 𣾎𣾎; ) CJK COMPATIBILITY IDEOGRAPH-2F911 +2F912;6FC6;6FC6;6FC6;6FC6; # (濆濆; 濆; 濆; 濆; 濆; ) CJK COMPATIBILITY IDEOGRAPH-2F912 +2F913;7039;7039;7039;7039; # (瀹瀹; 瀹; 瀹; 瀹; 瀹; ) CJK COMPATIBILITY IDEOGRAPH-2F913 +2F914;701E;701E;701E;701E; # (瀞瀞; 瀞; 瀞; 瀞; 瀞; ) CJK COMPATIBILITY IDEOGRAPH-2F914 +2F915;701B;701B;701B;701B; # (瀛瀛; 瀛; 瀛; 瀛; 瀛; ) CJK COMPATIBILITY IDEOGRAPH-2F915 +2F916;3D96;3D96;3D96;3D96; # (㶖㶖; 㶖; 㶖; 㶖; 㶖; ) CJK COMPATIBILITY IDEOGRAPH-2F916 +2F917;704A;704A;704A;704A; # (灊灊; 灊; 灊; 灊; 灊; ) CJK COMPATIBILITY IDEOGRAPH-2F917 +2F918;707D;707D;707D;707D; # (災災; 災; 災; 災; 災; ) CJK COMPATIBILITY IDEOGRAPH-2F918 +2F919;7077;7077;7077;7077; # (灷灷; 灷; 灷; 灷; 灷; ) CJK COMPATIBILITY IDEOGRAPH-2F919 +2F91A;70AD;70AD;70AD;70AD; # (炭炭; 炭; 炭; 炭; 炭; ) CJK COMPATIBILITY IDEOGRAPH-2F91A +2F91B;20525;20525;20525;20525; # (𠔥𠔥; 𠔥𠔥; 𠔥𠔥; 𠔥𠔥; 𠔥𠔥; ) CJK COMPATIBILITY IDEOGRAPH-2F91B +2F91C;7145;7145;7145;7145; # (煅煅; 煅; 煅; 煅; 煅; ) CJK COMPATIBILITY IDEOGRAPH-2F91C +2F91D;24263;24263;24263;24263; # (𤉣𤉣; 𤉣𤉣; 𤉣𤉣; 𤉣𤉣; 𤉣𤉣; ) CJK COMPATIBILITY IDEOGRAPH-2F91D +2F91E;719C;719C;719C;719C; # (熜熜; 熜; 熜; 熜; 熜; ) CJK COMPATIBILITY IDEOGRAPH-2F91E +2F91F;43AB;43AB;43AB;43AB; # (𤎫𤎫; 䎫; 䎫; 䎫; 䎫; ) CJK COMPATIBILITY IDEOGRAPH-2F91F +2F920;7228;7228;7228;7228; # (爨爨; 爨; 爨; 爨; 爨; ) CJK COMPATIBILITY IDEOGRAPH-2F920 +2F921;7235;7235;7235;7235; # (爵爵; 爵; 爵; 爵; 爵; ) CJK COMPATIBILITY IDEOGRAPH-2F921 +2F922;7250;7250;7250;7250; # (牐牐; 牐; 牐; 牐; 牐; ) CJK COMPATIBILITY IDEOGRAPH-2F922 +2F923;24608;24608;24608;24608; # (𤘈𤘈; 𤘈𤘈; 𤘈𤘈; 𤘈𤘈; 𤘈𤘈; ) CJK COMPATIBILITY IDEOGRAPH-2F923 +2F924;7280;7280;7280;7280; # (犀犀; 犀; 犀; 犀; 犀; ) CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925;7295;7295;7295;7295; # (犕犕; 犕; 犕; 犕; 犕; ) CJK COMPATIBILITY IDEOGRAPH-2F925 +2F926;24735;24735;24735;24735; # (𤜵𤜵; 𤜵𤜵; 𤜵𤜵; 𤜵𤜵; 𤜵𤜵; ) CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927;24814;24814;24814;24814; # (𤠔𤠔; 𤠔𤠔; 𤠔𤠔; 𤠔𤠔; 𤠔𤠔; ) CJK COMPATIBILITY IDEOGRAPH-2F927 +2F928;737A;737A;737A;737A; # (獺獺; 獺; 獺; 獺; 獺; ) CJK COMPATIBILITY IDEOGRAPH-2F928 +2F929;738B;738B;738B;738B; # (王王; 王; 王; 王; 王; ) CJK COMPATIBILITY IDEOGRAPH-2F929 +2F92A;3EAC;3EAC;3EAC;3EAC; # (㺬㺬; 㺬; 㺬; 㺬; 㺬; ) CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92B;73A5;73A5;73A5;73A5; # (玥玥; 玥; 玥; 玥; 玥; ) CJK COMPATIBILITY IDEOGRAPH-2F92B +2F92C;3EB8;3EB8;3EB8;3EB8; # (㺸㺸; 㺸; 㺸; 㺸; 㺸; ) CJK COMPATIBILITY IDEOGRAPH-2F92C +2F92D;3EB8;3EB8;3EB8;3EB8; # (㺸㺸; 㺸; 㺸; 㺸; 㺸; ) CJK COMPATIBILITY IDEOGRAPH-2F92D +2F92E;7447;7447;7447;7447; # (瑇瑇; 瑇; 瑇; 瑇; 瑇; ) CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F;745C;745C;745C;745C; # (瑜瑜; 瑜; 瑜; 瑜; 瑜; ) CJK COMPATIBILITY IDEOGRAPH-2F92F +2F930;7471;7471;7471;7471; # (瑱瑱; 瑱; 瑱; 瑱; 瑱; ) CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931;7485;7485;7485;7485; # (璅璅; 璅; 璅; 璅; 璅; ) CJK COMPATIBILITY IDEOGRAPH-2F931 +2F932;74CA;74CA;74CA;74CA; # (瓊瓊; 瓊; 瓊; 瓊; 瓊; ) CJK COMPATIBILITY IDEOGRAPH-2F932 +2F933;3F1B;3F1B;3F1B;3F1B; # (㼛㼛; 㼛; 㼛; 㼛; 㼛; ) CJK COMPATIBILITY IDEOGRAPH-2F933 +2F934;7524;7524;7524;7524; # (甤甤; 甤; 甤; 甤; 甤; ) CJK COMPATIBILITY IDEOGRAPH-2F934 +2F935;24C36;24C36;24C36;24C36; # (𤰶𤰶; 𤰶𤰶; 𤰶𤰶; 𤰶𤰶; 𤰶𤰶; ) CJK COMPATIBILITY IDEOGRAPH-2F935 +2F936;753E;753E;753E;753E; # (甾甾; 甾; 甾; 甾; 甾; ) CJK COMPATIBILITY IDEOGRAPH-2F936 +2F937;24C92;24C92;24C92;24C92; # (𤲒𤲒; 𤲒𤲒; 𤲒𤲒; 𤲒𤲒; 𤲒𤲒; ) CJK COMPATIBILITY IDEOGRAPH-2F937 +2F938;7570;7570;7570;7570; # (異異; 異; 異; 異; 異; ) CJK COMPATIBILITY IDEOGRAPH-2F938 +2F939;2219F;2219F;2219F;2219F; # (𢆟𢆟; 𢆟𢆟; 𢆟𢆟; 𢆟𢆟; 𢆟𢆟; ) CJK COMPATIBILITY IDEOGRAPH-2F939 +2F93A;7610;7610;7610;7610; # (瘐瘐; 瘐; 瘐; 瘐; 瘐; ) CJK COMPATIBILITY IDEOGRAPH-2F93A +2F93B;24FA1;24FA1;24FA1;24FA1; # (𤾡𤾡; 𤾡𤾡; 𤾡𤾡; 𤾡𤾡; 𤾡𤾡; ) CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C;24FB8;24FB8;24FB8;24FB8; # (𤾸𤾸; 𤾸𤾸; 𤾸𤾸; 𤾸𤾸; 𤾸𤾸; ) CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D;25044;25044;25044;25044; # (𥁄𥁄; 𥁄𥁄; 𥁄𥁄; 𥁄𥁄; 𥁄𥁄; ) CJK COMPATIBILITY IDEOGRAPH-2F93D +2F93E;3FFC;3FFC;3FFC;3FFC; # (㿼㿼; 㿼; 㿼; 㿼; 㿼; ) CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F;4008;4008;4008;4008; # (䀈䀈; 䀈; 䀈; 䀈; 䀈; ) CJK COMPATIBILITY IDEOGRAPH-2F93F +2F940;76F4;76F4;76F4;76F4; # (直直; 直; 直; 直; 直; ) CJK COMPATIBILITY IDEOGRAPH-2F940 +2F941;250F3;250F3;250F3;250F3; # (𥃳𥃳; 𥃳𥃳; 𥃳𥃳; 𥃳𥃳; 𥃳𥃳; ) CJK COMPATIBILITY IDEOGRAPH-2F941 +2F942;250F2;250F2;250F2;250F2; # (𥃲𥃲; 𥃲𥃲; 𥃲𥃲; 𥃲𥃲; 𥃲𥃲; ) CJK COMPATIBILITY IDEOGRAPH-2F942 +2F943;25119;25119;25119;25119; # (𥄙𥄙; 𥄙𥄙; 𥄙𥄙; 𥄙𥄙; 𥄙𥄙; ) CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944;25133;25133;25133;25133; # (𥄳𥄳; 𥄳𥄳; 𥄳𥄳; 𥄳𥄳; 𥄳𥄳; ) CJK COMPATIBILITY IDEOGRAPH-2F944 +2F945;771E;771E;771E;771E; # (眞眞; 眞; 眞; 眞; 眞; ) CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946;771F;771F;771F;771F; # (真真; 真; 真; 真; 真; ) CJK COMPATIBILITY IDEOGRAPH-2F946 +2F947;771F;771F;771F;771F; # (真真; 真; 真; 真; 真; ) CJK COMPATIBILITY IDEOGRAPH-2F947 +2F948;774A;774A;774A;774A; # (睊睊; 睊; 睊; 睊; 睊; ) CJK COMPATIBILITY IDEOGRAPH-2F948 +2F949;4039;4039;4039;4039; # (䀹䀹; 䀹; 䀹; 䀹; 䀹; ) CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94A;778B;778B;778B;778B; # (瞋瞋; 瞋; 瞋; 瞋; 瞋; ) CJK COMPATIBILITY IDEOGRAPH-2F94A +2F94B;4046;4046;4046;4046; # (䁆䁆; 䁆; 䁆; 䁆; 䁆; ) CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C;4096;4096;4096;4096; # (䂖䂖; 䂖; 䂖; 䂖; 䂖; ) CJK COMPATIBILITY IDEOGRAPH-2F94C +2F94D;2541D;2541D;2541D;2541D; # (𥐝𥐝; 𥐝𥐝; 𥐝𥐝; 𥐝𥐝; 𥐝𥐝; ) CJK COMPATIBILITY IDEOGRAPH-2F94D +2F94E;784E;784E;784E;784E; # (硎硎; 硎; 硎; 硎; 硎; ) CJK COMPATIBILITY IDEOGRAPH-2F94E +2F94F;788C;788C;788C;788C; # (碌碌; 碌; 碌; 碌; 碌; ) CJK COMPATIBILITY IDEOGRAPH-2F94F +2F950;78CC;78CC;78CC;78CC; # (磌磌; 磌; 磌; 磌; 磌; ) CJK COMPATIBILITY IDEOGRAPH-2F950 +2F951;40E3;40E3;40E3;40E3; # (䃣䃣; 䃣; 䃣; 䃣; 䃣; ) CJK COMPATIBILITY IDEOGRAPH-2F951 +2F952;25626;25626;25626;25626; # (𥘦𥘦; 𥘦𥘦; 𥘦𥘦; 𥘦𥘦; 𥘦𥘦; ) CJK COMPATIBILITY IDEOGRAPH-2F952 +2F953;7956;7956;7956;7956; # (祖祖; 祖; 祖; 祖; 祖; ) CJK COMPATIBILITY IDEOGRAPH-2F953 +2F954;2569A;2569A;2569A;2569A; # (𥚚𥚚; 𥚚𥚚; 𥚚𥚚; 𥚚𥚚; 𥚚𥚚; ) CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955;256C5;256C5;256C5;256C5; # (𥛅𥛅; 𥛅𥛅; 𥛅𥛅; 𥛅𥛅; 𥛅𥛅; ) CJK COMPATIBILITY IDEOGRAPH-2F955 +2F956;798F;798F;798F;798F; # (福福; 福; 福; 福; 福; ) CJK COMPATIBILITY IDEOGRAPH-2F956 +2F957;79EB;79EB;79EB;79EB; # (秫秫; 秫; 秫; 秫; 秫; ) CJK COMPATIBILITY IDEOGRAPH-2F957 +2F958;412F;412F;412F;412F; # (䄯䄯; 䄯; 䄯; 䄯; 䄯; ) CJK COMPATIBILITY IDEOGRAPH-2F958 +2F959;7A40;7A40;7A40;7A40; # (穀穀; 穀; 穀; 穀; 穀; ) CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A;7A4A;7A4A;7A4A;7A4A; # (穊穊; 穊; 穊; 穊; 穊; ) CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B;7A4F;7A4F;7A4F;7A4F; # (穏穏; 穏; 穏; 穏; 穏; ) CJK COMPATIBILITY IDEOGRAPH-2F95B +2F95C;2597C;2597C;2597C;2597C; # (𥥼𥥼; 𥥼𥥼; 𥥼𥥼; 𥥼𥥼; 𥥼𥥼; ) CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D;25AA7;25AA7;25AA7;25AA7; # (𥪧𥪧; 𥪧𥪧; 𥪧𥪧; 𥪧𥪧; 𥪧𥪧; ) CJK COMPATIBILITY IDEOGRAPH-2F95D +2F95E;25AA7;25AA7;25AA7;25AA7; # (𥪧𥪧; 𥪧𥪧; 𥪧𥪧; 𥪧𥪧; 𥪧𥪧; ) CJK COMPATIBILITY IDEOGRAPH-2F95E +2F95F;7AAE;7AAE;7AAE;7AAE; # (竮竮; 窮; 窮; 窮; 窮; ) CJK COMPATIBILITY IDEOGRAPH-2F95F +2F960;4202;4202;4202;4202; # (䈂䈂; 䈂; 䈂; 䈂; 䈂; ) CJK COMPATIBILITY IDEOGRAPH-2F960 +2F961;25BAB;25BAB;25BAB;25BAB; # (𥮫𥮫; 𥮫𥮫; 𥮫𥮫; 𥮫𥮫; 𥮫𥮫; ) CJK COMPATIBILITY IDEOGRAPH-2F961 +2F962;7BC6;7BC6;7BC6;7BC6; # (篆篆; 篆; 篆; 篆; 篆; ) CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963;7BC9;7BC9;7BC9;7BC9; # (築築; 築; 築; 築; 築; ) CJK COMPATIBILITY IDEOGRAPH-2F963 +2F964;4227;4227;4227;4227; # (䈧䈧; 䈧; 䈧; 䈧; 䈧; ) CJK COMPATIBILITY IDEOGRAPH-2F964 +2F965;25C80;25C80;25C80;25C80; # (𥲀𥲀; 𥲀𥲀; 𥲀𥲀; 𥲀𥲀; 𥲀𥲀; ) CJK COMPATIBILITY IDEOGRAPH-2F965 +2F966;7CD2;7CD2;7CD2;7CD2; # (糒糒; 糒; 糒; 糒; 糒; ) CJK COMPATIBILITY IDEOGRAPH-2F966 +2F967;42A0;42A0;42A0;42A0; # (䊠䊠; 䊠; 䊠; 䊠; 䊠; ) CJK COMPATIBILITY IDEOGRAPH-2F967 +2F968;7CE8;7CE8;7CE8;7CE8; # (糨糨; 糨; 糨; 糨; 糨; ) CJK COMPATIBILITY IDEOGRAPH-2F968 +2F969;7CE3;7CE3;7CE3;7CE3; # (糣糣; 糣; 糣; 糣; 糣; ) CJK COMPATIBILITY IDEOGRAPH-2F969 +2F96A;7D00;7D00;7D00;7D00; # (紀紀; 紀; 紀; 紀; 紀; ) CJK COMPATIBILITY IDEOGRAPH-2F96A +2F96B;25F86;25F86;25F86;25F86; # (𥾆𥾆; 𥾆𥾆; 𥾆𥾆; 𥾆𥾆; 𥾆𥾆; ) CJK COMPATIBILITY IDEOGRAPH-2F96B +2F96C;7D63;7D63;7D63;7D63; # (絣絣; 絣; 絣; 絣; 絣; ) CJK COMPATIBILITY IDEOGRAPH-2F96C +2F96D;4301;4301;4301;4301; # (䌁䌁; 䌁; 䌁; 䌁; 䌁; ) CJK COMPATIBILITY IDEOGRAPH-2F96D +2F96E;7DC7;7DC7;7DC7;7DC7; # (緇緇; 緇; 緇; 緇; 緇; ) CJK COMPATIBILITY IDEOGRAPH-2F96E +2F96F;7E02;7E02;7E02;7E02; # (縂縂; 縂; 縂; 縂; 縂; ) CJK COMPATIBILITY IDEOGRAPH-2F96F +2F970;7E45;7E45;7E45;7E45; # (繅繅; 繅; 繅; 繅; 繅; ) CJK COMPATIBILITY IDEOGRAPH-2F970 +2F971;4334;4334;4334;4334; # (䌴䌴; 䌴; 䌴; 䌴; 䌴; ) CJK COMPATIBILITY IDEOGRAPH-2F971 +2F972;26228;26228;26228;26228; # (𦈨𦈨; 𦈨𦈨; 𦈨𦈨; 𦈨𦈨; 𦈨𦈨; ) CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973;26247;26247;26247;26247; # (𦉇𦉇; 𦉇𦉇; 𦉇𦉇; 𦉇𦉇; 𦉇𦉇; ) CJK COMPATIBILITY IDEOGRAPH-2F973 +2F974;4359;4359;4359;4359; # (䍙䍙; 䍙; 䍙; 䍙; 䍙; ) CJK COMPATIBILITY IDEOGRAPH-2F974 +2F975;262D9;262D9;262D9;262D9; # (𦋙𦋙; 𦋙𦋙; 𦋙𦋙; 𦋙𦋙; 𦋙𦋙; ) CJK COMPATIBILITY IDEOGRAPH-2F975 +2F976;7F7A;7F7A;7F7A;7F7A; # (罺罺; 罺; 罺; 罺; 罺; ) CJK COMPATIBILITY IDEOGRAPH-2F976 +2F977;2633E;2633E;2633E;2633E; # (𦌾𦌾; 𦌾𦌾; 𦌾𦌾; 𦌾𦌾; 𦌾𦌾; ) CJK COMPATIBILITY IDEOGRAPH-2F977 +2F978;7F95;7F95;7F95;7F95; # (羕羕; 羕; 羕; 羕; 羕; ) CJK COMPATIBILITY IDEOGRAPH-2F978 +2F979;7FFA;7FFA;7FFA;7FFA; # (翺翺; 翺; 翺; 翺; 翺; ) CJK COMPATIBILITY IDEOGRAPH-2F979 +2F97A;8005;8005;8005;8005; # (者者; 者; 者; 者; 者; ) CJK COMPATIBILITY IDEOGRAPH-2F97A +2F97B;264DA;264DA;264DA;264DA; # (𦓚𦓚; 𦓚𦓚; 𦓚𦓚; 𦓚𦓚; 𦓚𦓚; ) CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C;26523;26523;26523;26523; # (𦔣𦔣; 𦔣𦔣; 𦔣𦔣; 𦔣𦔣; 𦔣𦔣; ) CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97D;8060;8060;8060;8060; # (聠聠; 聠; 聠; 聠; 聠; ) CJK COMPATIBILITY IDEOGRAPH-2F97D +2F97E;265A8;265A8;265A8;265A8; # (𦖨𦖨; 𦖨𦖨; 𦖨𦖨; 𦖨𦖨; 𦖨𦖨; ) CJK COMPATIBILITY IDEOGRAPH-2F97E +2F97F;8070;8070;8070;8070; # (聰聰; 聰; 聰; 聰; 聰; ) CJK COMPATIBILITY IDEOGRAPH-2F97F +2F980;2335F;2335F;2335F;2335F; # (𣍟𣍟; 𣍟𣍟; 𣍟𣍟; 𣍟𣍟; 𣍟𣍟; ) CJK COMPATIBILITY IDEOGRAPH-2F980 +2F981;43D5;43D5;43D5;43D5; # (䏕䏕; 䏕; 䏕; 䏕; 䏕; ) CJK COMPATIBILITY IDEOGRAPH-2F981 +2F982;80B2;80B2;80B2;80B2; # (育育; 育; 育; 育; 育; ) CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983;8103;8103;8103;8103; # (脃脃; 脃; 脃; 脃; 脃; ) CJK COMPATIBILITY IDEOGRAPH-2F983 +2F984;440B;440B;440B;440B; # (䐋䐋; 䐋; 䐋; 䐋; 䐋; ) CJK COMPATIBILITY IDEOGRAPH-2F984 +2F985;813E;813E;813E;813E; # (脾脾; 脾; 脾; 脾; 脾; ) CJK COMPATIBILITY IDEOGRAPH-2F985 +2F986;5AB5;5AB5;5AB5;5AB5; # (媵媵; 媵; 媵; 媵; 媵; ) CJK COMPATIBILITY IDEOGRAPH-2F986 +2F987;267A7;267A7;267A7;267A7; # (𦞧𦞧; 𦞧𦞧; 𦞧𦞧; 𦞧𦞧; 𦞧𦞧; ) CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988;267B5;267B5;267B5;267B5; # (𦞵𦞵; 𦞵𦞵; 𦞵𦞵; 𦞵𦞵; 𦞵𦞵; ) CJK COMPATIBILITY IDEOGRAPH-2F988 +2F989;23393;23393;23393;23393; # (𣎓𣎓; 𣎓𣎓; 𣎓𣎓; 𣎓𣎓; 𣎓𣎓; ) CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A;2339C;2339C;2339C;2339C; # (𣎜𣎜; 𣎜𣎜; 𣎜𣎜; 𣎜𣎜; 𣎜𣎜; ) CJK COMPATIBILITY IDEOGRAPH-2F98A +2F98B;8201;8201;8201;8201; # (舁舁; 舁; 舁; 舁; 舁; ) CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C;8204;8204;8204;8204; # (舄舄; 舄; 舄; 舄; 舄; ) CJK COMPATIBILITY IDEOGRAPH-2F98C +2F98D;8F9E;8F9E;8F9E;8F9E; # (辞辞; 辞; 辞; 辞; 辞; ) CJK COMPATIBILITY IDEOGRAPH-2F98D +2F98E;446B;446B;446B;446B; # (䑫䑫; 䑫; 䑫; 䑫; 䑫; ) CJK COMPATIBILITY IDEOGRAPH-2F98E +2F98F;8291;8291;8291;8291; # (芑芑; 芑; 芑; 芑; 芑; ) CJK COMPATIBILITY IDEOGRAPH-2F98F +2F990;828B;828B;828B;828B; # (芋芋; 芋; 芋; 芋; 芋; ) CJK COMPATIBILITY IDEOGRAPH-2F990 +2F991;829D;829D;829D;829D; # (芝芝; 芝; 芝; 芝; 芝; ) CJK COMPATIBILITY IDEOGRAPH-2F991 +2F992;52B3;52B3;52B3;52B3; # (劳劳; 劳; 劳; 劳; 劳; ) CJK COMPATIBILITY IDEOGRAPH-2F992 +2F993;82B1;82B1;82B1;82B1; # (花花; 花; 花; 花; 花; ) CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994;82B3;82B3;82B3;82B3; # (芳芳; 芳; 芳; 芳; 芳; ) CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995;82BD;82BD;82BD;82BD; # (芽芽; 芽; 芽; 芽; 芽; ) CJK COMPATIBILITY IDEOGRAPH-2F995 +2F996;82E6;82E6;82E6;82E6; # (苦苦; 苦; 苦; 苦; 苦; ) CJK COMPATIBILITY IDEOGRAPH-2F996 +2F997;26B3C;26B3C;26B3C;26B3C; # (𦬼𦬼; 𦬼𦬼; 𦬼𦬼; 𦬼𦬼; 𦬼𦬼; ) CJK COMPATIBILITY IDEOGRAPH-2F997 +2F998;82E5;82E5;82E5;82E5; # (若若; 若; 若; 若; 若; ) CJK COMPATIBILITY IDEOGRAPH-2F998 +2F999;831D;831D;831D;831D; # (茝茝; 茝; 茝; 茝; 茝; ) CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99A;8363;8363;8363;8363; # (荣荣; 荣; 荣; 荣; 荣; ) CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B;83AD;83AD;83AD;83AD; # (莭莭; 莭; 莭; 莭; 莭; ) CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99C;8323;8323;8323;8323; # (茣茣; 茣; 茣; 茣; 茣; ) CJK COMPATIBILITY IDEOGRAPH-2F99C +2F99D;83BD;83BD;83BD;83BD; # (莽莽; 莽; 莽; 莽; 莽; ) CJK COMPATIBILITY IDEOGRAPH-2F99D +2F99E;83E7;83E7;83E7;83E7; # (菧菧; 菧; 菧; 菧; 菧; ) CJK COMPATIBILITY IDEOGRAPH-2F99E +2F99F;8457;8457;8457;8457; # (著著; 著; 著; 著; 著; ) CJK COMPATIBILITY IDEOGRAPH-2F99F +2F9A0;8353;8353;8353;8353; # (荓荓; 荓; 荓; 荓; 荓; ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F9A1;83CA;83CA;83CA;83CA; # (菊菊; 菊; 菊; 菊; 菊; ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2;83CC;83CC;83CC;83CC; # (菌菌; 菌; 菌; 菌; 菌; ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3;83DC;83DC;83DC;83DC; # (菜菜; 菜; 菜; 菜; 菜; ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F9A4;26C36;26C36;26C36;26C36; # (𦰶𦰶; 𦰶𦰶; 𦰶𦰶; 𦰶𦰶; 𦰶𦰶; ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A5;26D6B;26D6B;26D6B;26D6B; # (𦵫𦵫; 𦵫𦵫; 𦵫𦵫; 𦵫𦵫; 𦵫𦵫; ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9A6;26CD5;26CD5;26CD5;26CD5; # (𦳕𦳕; 𦳕𦳕; 𦳕𦳕; 𦳕𦳕; 𦳕𦳕; ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A7;452B;452B;452B;452B; # (䔫䔫; 䔫; 䔫; 䔫; 䔫; ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9A8;84F1;84F1;84F1;84F1; # (蓱蓱; 蓱; 蓱; 蓱; 蓱; ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9;84F3;84F3;84F3;84F3; # (蓳蓳; 蓳; 蓳; 蓳; 蓳; ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 +2F9AA;8516;8516;8516;8516; # (蔖蔖; 蔖; 蔖; 蔖; 蔖; ) CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AB;273CA;273CA;273CA;273CA; # (𧏊𧏊; 𧏊𧏊; 𧏊𧏊; 𧏊𧏊; 𧏊𧏊; ) CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9AC;8564;8564;8564;8564; # (蕤蕤; 蕤; 蕤; 蕤; 蕤; ) CJK COMPATIBILITY IDEOGRAPH-2F9AC +2F9AD;26F2C;26F2C;26F2C;26F2C; # (𦼬𦼬; 𦼬𦼬; 𦼬𦼬; 𦼬𦼬; 𦼬𦼬; ) CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9AE;455D;455D;455D;455D; # (䕝䕝; 䕝; 䕝; 䕝; 䕝; ) CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF;4561;4561;4561;4561; # (䕡䕡; 䕡; 䕡; 䕡; 䕡; ) CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B0;26FB1;26FB1;26FB1;26FB1; # (𦾱𦾱; 𦾱𦾱; 𦾱𦾱; 𦾱𦾱; 𦾱𦾱; ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1;270D2;270D2;270D2;270D2; # (𧃒𧃒; 𧃒𧃒; 𧃒𧃒; 𧃒𧃒; 𧃒𧃒; ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9B2;456B;456B;456B;456B; # (䕫䕫; 䕫; 䕫; 䕫; 䕫; ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9B3;8650;8650;8650;8650; # (虐虐; 虐; 虐; 虐; 虐; ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 +2F9B4;865C;865C;865C;865C; # (虜虜; 虜; 虜; 虜; 虜; ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5;8667;8667;8667;8667; # (虧虧; 虧; 虧; 虧; 虧; ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6;8669;8669;8669;8669; # (虩虩; 虩; 虩; 虩; 虩; ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F9B7;86A9;86A9;86A9;86A9; # (蚩蚩; 蚩; 蚩; 蚩; 蚩; ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9B8;8688;8688;8688;8688; # (蚈蚈; 蚈; 蚈; 蚈; 蚈; ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B9;870E;870E;870E;870E; # (蜎蜎; 蜎; 蜎; 蜎; 蜎; ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BA;86E2;86E2;86E2;86E2; # (蛢蛢; 蛢; 蛢; 蛢; 蛢; ) CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9BB;8779;8779;8779;8779; # (蝹蝹; 蝹; 蝹; 蝹; 蝹; ) CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BC;8728;8728;8728;8728; # (蜨蜨; 蜨; 蜨; 蜨; 蜨; ) CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD;876B;876B;876B;876B; # (蝫蝫; 蝫; 蝫; 蝫; 蝫; ) CJK COMPATIBILITY IDEOGRAPH-2F9BD +2F9BE;8786;8786;8786;8786; # (螆螆; 螆; 螆; 螆; 螆; ) CJK COMPATIBILITY IDEOGRAPH-2F9BE +2F9BF;4D57;4D57;4D57;4D57; # (䗗䗗; 䵗; 䵗; 䵗; 䵗; ) CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C0;87E1;87E1;87E1;87E1; # (蟡蟡; 蟡; 蟡; 蟡; 蟡; ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1;8801;8801;8801;8801; # (蠁蠁; 蠁; 蠁; 蠁; 蠁; ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 +2F9C2;45F9;45F9;45F9;45F9; # (䗹䗹; 䗹; 䗹; 䗹; 䗹; ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C3;8860;8860;8860;8860; # (衠衠; 衠; 衠; 衠; 衠; ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4;8863;8863;8863;8863; # (衣衣; 衣; 衣; 衣; 衣; ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F9C5;27667;27667;27667;27667; # (𧙧𧙧; 𧙧𧙧; 𧙧𧙧; 𧙧𧙧; 𧙧𧙧; ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9C6;88D7;88D7;88D7;88D7; # (裗裗; 裗; 裗; 裗; 裗; ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7;88DE;88DE;88DE;88DE; # (裞裞; 裞; 裞; 裞; 裞; ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 +2F9C8;4635;4635;4635;4635; # (䘵䘵; 䘵; 䘵; 䘵; 䘵; ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9C9;88FA;88FA;88FA;88FA; # (裺裺; 裺; 裺; 裺; 裺; ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 +2F9CA;34BB;34BB;34BB;34BB; # (㒻㒻; 㒻; 㒻; 㒻; 㒻; ) CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F9CB;278AE;278AE;278AE;278AE; # (𧢮𧢮; 𧢮𧢮; 𧢮𧢮; 𧢮𧢮; 𧢮𧢮; ) CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC;27966;27966;27966;27966; # (𧥦𧥦; 𧥦𧥦; 𧥦𧥦; 𧥦𧥦; 𧥦𧥦; ) CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9CD;46BE;46BE;46BE;46BE; # (䚾䚾; 䚾; 䚾; 䚾; 䚾; ) CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE;46C7;46C7;46C7;46C7; # (䛇䛇; 䛇; 䛇; 䛇; 䛇; ) CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9CF;8AA0;8AA0;8AA0;8AA0; # (誠誠; 誠; 誠; 誠; 誠; ) CJK COMPATIBILITY IDEOGRAPH-2F9CF +2F9D0;8AED;8AED;8AED;8AED; # (諭諭; 諭; 諭; 諭; 諭; ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 +2F9D1;8B8A;8B8A;8B8A;8B8A; # (變變; 變; 變; 變; 變; ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2F9D2;8C55;8C55;8C55;8C55; # (豕豕; 豕; 豕; 豕; 豕; ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F9D3;27CA8;27CA8;27CA8;27CA8; # (𧲨𧲨; 𧲨𧲨; 𧲨𧲨; 𧲨𧲨; 𧲨𧲨; ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 +2F9D4;8CAB;8CAB;8CAB;8CAB; # (貫貫; 貫; 貫; 貫; 貫; ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5;8CC1;8CC1;8CC1;8CC1; # (賁賁; 賁; 賁; 賁; 賁; ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 +2F9D6;8D1B;8D1B;8D1B;8D1B; # (贛贛; 贛; 贛; 贛; 贛; ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2F9D7;8D77;8D77;8D77;8D77; # (起起; 起; 起; 起; 起; ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9D8;27F2F;27F2F;27F2F;27F2F; # (𧼯𧼯; 𧼯𧼯; 𧼯𧼯; 𧼯𧼯; 𧼯𧼯; ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9D9;20804;20804;20804;20804; # (𠠄𠠄; 𠠄𠠄; 𠠄𠠄; 𠠄𠠄; 𠠄𠠄; ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DA;8DCB;8DCB;8DCB;8DCB; # (跋跋; 跋; 跋; 跋; 跋; ) CJK COMPATIBILITY IDEOGRAPH-2F9DA +2F9DB;8DBC;8DBC;8DBC;8DBC; # (趼趼; 趼; 趼; 趼; 趼; ) CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DC;8DF0;8DF0;8DF0;8DF0; # (跰跰; 跰; 跰; 跰; 跰; ) CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9DD;208DE;208DE;208DE;208DE; # (𠣞𠣞; 𠣞𠣞; 𠣞𠣞; 𠣞𠣞; 𠣞𠣞; ) CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F9DE;8ED4;8ED4;8ED4;8ED4; # (軔軔; 軔; 軔; 軔; 軔; ) CJK COMPATIBILITY IDEOGRAPH-2F9DE +2F9DF;8F38;8F38;8F38;8F38; # (輸輸; 輸; 輸; 輸; 輸; ) CJK COMPATIBILITY IDEOGRAPH-2F9DF +2F9E0;285D2;285D2;285D2;285D2; # (𨗒𨗒; 𨗒𨗒; 𨗒𨗒; 𨗒𨗒; 𨗒𨗒; ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1;285ED;285ED;285ED;285ED; # (𨗭𨗭; 𨗭𨗭; 𨗭𨗭; 𨗭𨗭; 𨗭𨗭; ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E2;9094;9094;9094;9094; # (邔邔; 邔; 邔; 邔; 邔; ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 +2F9E3;90F1;90F1;90F1;90F1; # (郱郱; 郱; 郱; 郱; 郱; ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 +2F9E4;9111;9111;9111;9111; # (鄑鄑; 鄑; 鄑; 鄑; 鄑; ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E5;2872E;2872E;2872E;2872E; # (𨜮𨜮; 𨜮𨜮; 𨜮𨜮; 𨜮𨜮; 𨜮𨜮; ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9E6;911B;911B;911B;911B; # (鄛鄛; 鄛; 鄛; 鄛; 鄛; ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2F9E7;9238;9238;9238;9238; # (鈸鈸; 鈸; 鈸; 鈸; 鈸; ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 +2F9E8;92D7;92D7;92D7;92D7; # (鋗鋗; 鋗; 鋗; 鋗; 鋗; ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9;92D8;92D8;92D8;92D8; # (鋘鋘; 鋘; 鋘; 鋘; 鋘; ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 +2F9EA;927C;927C;927C;927C; # (鉼鉼; 鉼; 鉼; 鉼; 鉼; ) CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9EB;93F9;93F9;93F9;93F9; # (鏹鏹; 鏹; 鏹; 鏹; 鏹; ) CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC;9415;9415;9415;9415; # (鐕鐕; 鐕; 鐕; 鐕; 鐕; ) CJK COMPATIBILITY IDEOGRAPH-2F9EC +2F9ED;28BFA;28BFA;28BFA;28BFA; # (𨯺𨯺; 𨯺𨯺; 𨯺𨯺; 𨯺𨯺; 𨯺𨯺; ) CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9EE;958B;958B;958B;958B; # (開開; 開; 開; 開; 開; ) CJK COMPATIBILITY IDEOGRAPH-2F9EE +2F9EF;4995;4995;4995;4995; # (䦕䦕; 䦕; 䦕; 䦕; 䦕; ) CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F0;95B7;95B7;95B7;95B7; # (閷閷; 閷; 閷; 閷; 閷; ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2F9F1;28D77;28D77;28D77;28D77; # (𨵷𨵷; 𨵷𨵷; 𨵷𨵷; 𨵷𨵷; 𨵷𨵷; ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F2;49E6;49E6;49E6;49E6; # (䧦䧦; 䧦; 䧦; 䧦; 䧦; ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F3;96C3;96C3;96C3;96C3; # (雃雃; 雃; 雃; 雃; 雃; ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 +2F9F4;5DB2;5DB2;5DB2;5DB2; # (嶲嶲; 嶲; 嶲; 嶲; 嶲; ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 +2F9F5;9723;9723;9723;9723; # (霣霣; 霣; 霣; 霣; 霣; ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 +2F9F6;29145;29145;29145;29145; # (𩅅𩅅; 𩅅𩅅; 𩅅𩅅; 𩅅𩅅; 𩅅𩅅; ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F9F7;2921A;2921A;2921A;2921A; # (𩈚𩈚; 𩈚𩈚; 𩈚𩈚; 𩈚𩈚; 𩈚𩈚; ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9F8;4A6E;4A6E;4A6E;4A6E; # (䩮䩮; 䩮; 䩮; 䩮; 䩮; ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9;4A76;4A76;4A76;4A76; # (䩶䩶; 䩶; 䩶; 䩶; 䩶; ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FA;97E0;97E0;97E0;97E0; # (韠韠; 韠; 韠; 韠; 韠; ) CJK COMPATIBILITY IDEOGRAPH-2F9FA +2F9FB;2940A;2940A;2940A;2940A; # (𩐊𩐊; 𩐊𩐊; 𩐊𩐊; 𩐊𩐊; 𩐊𩐊; ) CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FC;4AB2;4AB2;4AB2;4AB2; # (䪲䪲; 䪲; 䪲; 䪲; 䪲; ) CJK COMPATIBILITY IDEOGRAPH-2F9FC +2F9FD;29496;29496;29496;29496; # (𩒖𩒖; 𩒖𩒖; 𩒖𩒖; 𩒖𩒖; 𩒖𩒖; ) CJK COMPATIBILITY IDEOGRAPH-2F9FD +2F9FE;980B;980B;980B;980B; # (頋頋; 頋; 頋; 頋; 頋; ) CJK COMPATIBILITY IDEOGRAPH-2F9FE +2F9FF;980B;980B;980B;980B; # (頋頋; 頋; 頋; 頋; 頋; ) CJK COMPATIBILITY IDEOGRAPH-2F9FF +2FA00;9829;9829;9829;9829; # (頩頩; 頩; 頩; 頩; 頩; ) CJK COMPATIBILITY IDEOGRAPH-2FA00 +2FA01;295B6;295B6;295B6;295B6; # (𩖶𩖶; 𩖶𩖶; 𩖶𩖶; 𩖶𩖶; 𩖶𩖶; ) CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA02;98E2;98E2;98E2;98E2; # (飢飢; 飢; 飢; 飢; 飢; ) CJK COMPATIBILITY IDEOGRAPH-2FA02 +2FA03;4B33;4B33;4B33;4B33; # (䬳䬳; 䬳; 䬳; 䬳; 䬳; ) CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA04;9929;9929;9929;9929; # (餩餩; 餩; 餩; 餩; 餩; ) CJK COMPATIBILITY IDEOGRAPH-2FA04 +2FA05;99A7;99A7;99A7;99A7; # (馧馧; 馧; 馧; 馧; 馧; ) CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FA06;99C2;99C2;99C2;99C2; # (駂駂; 駂; 駂; 駂; 駂; ) CJK COMPATIBILITY IDEOGRAPH-2FA06 +2FA07;99FE;99FE;99FE;99FE; # (駾駾; 駾; 駾; 駾; 駾; ) CJK COMPATIBILITY IDEOGRAPH-2FA07 +2FA08;4BCE;4BCE;4BCE;4BCE; # (䯎䯎; 䯎; 䯎; 䯎; 䯎; ) CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA09;29B30;29B30;29B30;29B30; # (𩬰𩬰; 𩬰𩬰; 𩬰𩬰; 𩬰𩬰; 𩬰𩬰; ) CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA0A;9B12;9B12;9B12;9B12; # (鬒鬒; 鬒; 鬒; 鬒; 鬒; ) CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FA0B;9C40;9C40;9C40;9C40; # (鱀鱀; 鱀; 鱀; 鱀; 鱀; ) CJK COMPATIBILITY IDEOGRAPH-2FA0B +2FA0C;9CFD;9CFD;9CFD;9CFD; # (鳽鳽; 鳽; 鳽; 鳽; 鳽; ) CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0D;4CCE;4CCE;4CCE;4CCE; # (䳎䳎; 䳎; 䳎; 䳎; 䳎; ) CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E;4CED;4CED;4CED;4CED; # (䳭䳭; 䳭; 䳭; 䳭; 䳭; ) CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA0F;9D67;9D67;9D67;9D67; # (鵧鵧; 鵧; 鵧; 鵧; 鵧; ) CJK COMPATIBILITY IDEOGRAPH-2FA0F +2FA10;2A0CE;2A0CE;2A0CE;2A0CE; # (𪃎𪃎; 𪃎𪃎; 𪃎𪃎; 𪃎𪃎; 𪃎𪃎; ) CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA11;4CF8;4CF8;4CF8;4CF8; # (䳸䳸; 䳸; 䳸; 䳸; 䳸; ) CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA12;2A105;2A105;2A105;2A105; # (𪄅𪄅; 𪄅𪄅; 𪄅𪄅; 𪄅𪄅; 𪄅𪄅; ) CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13;2A20E;2A20E;2A20E;2A20E; # (𪈎𪈎; 𪈎𪈎; 𪈎𪈎; 𪈎𪈎; 𪈎𪈎; ) CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14;2A291;2A291;2A291;2A291; # (𪊑𪊑; 𪊑𪊑; 𪊑𪊑; 𪊑𪊑; 𪊑𪊑; ) CJK COMPATIBILITY IDEOGRAPH-2FA14 +2FA15;9EBB;9EBB;9EBB;9EBB; # (麻麻; 麻; 麻; 麻; 麻; ) CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FA16;4D56;4D56;4D56;4D56; # (䵖䵖; 䵖; 䵖; 䵖; 䵖; ) CJK COMPATIBILITY IDEOGRAPH-2FA16 +2FA17;9EF9;9EF9;9EF9;9EF9; # (黹黹; 黹; 黹; 黹; 黹; ) CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FA18;9EFE;9EFE;9EFE;9EFE; # (黾黾; 黾; 黾; 黾; 黾; ) CJK COMPATIBILITY IDEOGRAPH-2FA18 +2FA19;9F05;9F05;9F05;9F05; # (鼅鼅; 鼅; 鼅; 鼅; 鼅; ) CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FA1A;9F0F;9F0F;9F0F;9F0F; # (鼏鼏; 鼏; 鼏; 鼏; 鼏; ) CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FA1B;9F16;9F16;9F16;9F16; # (鼖鼖; 鼖; 鼖; 鼖; 鼖; ) CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FA1C;9F3B;9F3B;9F3B;9F3B; # (鼻鼻; 鼻; 鼻; 鼻; 鼻; ) CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FA1D;2A600;2A600;2A600;2A600; # (𪘀𪘀; 𪘀𪘀; 𪘀𪘀; 𪘀𪘀; 𪘀𪘀; ) CJK COMPATIBILITY IDEOGRAPH-2FA1D +# +@Part2 # Canonical Order Test +# +0061 0315 0300 05AE 0300 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̕◌̀◌֮◌̀b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 0300 0315 0300 05AE 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̀◌̕◌̀◌֮b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0301 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062; # (a◌̕◌̀◌֮◌́b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE ACCENT, LATIN SMALL LETTER B +0061 0301 0315 0300 05AE 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062; # (a◌́◌̕◌̀◌֮b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0302 0062;00E0 05AE 0302 0315 0062;0061 05AE 0300 0302 0315 0062;00E0 05AE 0302 0315 0062;0061 05AE 0300 0302 0315 0062; # (a◌̕◌̀◌֮◌̂b; à◌֮◌̂◌̕b; a◌֮◌̀◌̂◌̕b; à◌֮◌̂◌̕b; a◌֮◌̀◌̂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CIRCUMFLEX ACCENT, LATIN SMALL LETTER B +0061 0302 0315 0300 05AE 0062;1EA7 05AE 0315 0062;0061 05AE 0302 0300 0315 0062;1EA7 05AE 0315 0062;0061 05AE 0302 0300 0315 0062; # (a◌̂◌̕◌̀◌֮b; ầ◌֮◌̕b; a◌֮◌̂◌̀◌̕b; ầ◌֮◌̕b; a◌֮◌̂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CIRCUMFLEX ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0303 0062;00E0 05AE 0303 0315 0062;0061 05AE 0300 0303 0315 0062;00E0 05AE 0303 0315 0062;0061 05AE 0300 0303 0315 0062; # (a◌̕◌̀◌֮◌̃b; à◌֮◌̃◌̕b; a◌֮◌̀◌̃◌̕b; à◌֮◌̃◌̕b; a◌֮◌̀◌̃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TILDE, LATIN SMALL LETTER B +0061 0303 0315 0300 05AE 0062;00E3 05AE 0300 0315 0062;0061 05AE 0303 0300 0315 0062;00E3 05AE 0300 0315 0062;0061 05AE 0303 0300 0315 0062; # (a◌̃◌̕◌̀◌֮b; ã◌֮◌̀◌̕b; a◌֮◌̃◌̀◌̕b; ã◌֮◌̀◌̕b; a◌֮◌̃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TILDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0304 0062;00E0 05AE 0304 0315 0062;0061 05AE 0300 0304 0315 0062;00E0 05AE 0304 0315 0062;0061 05AE 0300 0304 0315 0062; # (a◌̕◌̀◌֮◌̄b; à◌֮◌̄◌̕b; a◌֮◌̀◌̄◌̕b; à◌֮◌̄◌̕b; a◌֮◌̀◌̄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON, LATIN SMALL LETTER B +0061 0304 0315 0300 05AE 0062;0101 05AE 0300 0315 0062;0061 05AE 0304 0300 0315 0062;0101 05AE 0300 0315 0062;0061 05AE 0304 0300 0315 0062; # (a◌̄◌̕◌̀◌֮b; ā◌֮◌̀◌̕b; a◌֮◌̄◌̀◌̕b; ā◌֮◌̀◌̕b; a◌֮◌̄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0305 0062;00E0 05AE 0305 0315 0062;0061 05AE 0300 0305 0315 0062;00E0 05AE 0305 0315 0062;0061 05AE 0300 0305 0315 0062; # (a◌̕◌̀◌֮◌̅b; à◌֮◌̅◌̕b; a◌֮◌̀◌̅◌̕b; à◌֮◌̅◌̕b; a◌֮◌̀◌̅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OVERLINE, LATIN SMALL LETTER B +0061 0305 0315 0300 05AE 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062; # (a◌̅◌̕◌̀◌֮b; a◌֮◌̅◌̀◌̕b; a◌֮◌̅◌̀◌̕b; a◌֮◌̅◌̀◌̕b; a◌֮◌̅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OVERLINE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0306 0062;00E0 05AE 0306 0315 0062;0061 05AE 0300 0306 0315 0062;00E0 05AE 0306 0315 0062;0061 05AE 0300 0306 0315 0062; # (a◌̕◌̀◌֮◌̆b; à◌֮◌̆◌̕b; a◌֮◌̀◌̆◌̕b; à◌֮◌̆◌̕b; a◌֮◌̀◌̆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BREVE, LATIN SMALL LETTER B +0061 0306 0315 0300 05AE 0062;1EB1 05AE 0315 0062;0061 05AE 0306 0300 0315 0062;1EB1 05AE 0315 0062;0061 05AE 0306 0300 0315 0062; # (a◌̆◌̕◌̀◌֮b; ằ◌֮◌̕b; a◌֮◌̆◌̀◌̕b; ằ◌֮◌̕b; a◌֮◌̆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BREVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0307 0062;00E0 05AE 0307 0315 0062;0061 05AE 0300 0307 0315 0062;00E0 05AE 0307 0315 0062;0061 05AE 0300 0307 0315 0062; # (a◌̕◌̀◌֮◌̇b; à◌֮◌̇◌̕b; a◌֮◌̀◌̇◌̕b; à◌֮◌̇◌̕b; a◌֮◌̀◌̇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOT ABOVE, LATIN SMALL LETTER B +0061 0307 0315 0300 05AE 0062;0227 05AE 0300 0315 0062;0061 05AE 0307 0300 0315 0062;0227 05AE 0300 0315 0062;0061 05AE 0307 0300 0315 0062; # (a◌̇◌̕◌̀◌֮b; ȧ◌֮◌̀◌̕b; a◌֮◌̇◌̀◌̕b; ȧ◌֮◌̀◌̕b; a◌֮◌̇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0308 0062;00E0 05AE 0308 0315 0062;0061 05AE 0300 0308 0315 0062;00E0 05AE 0308 0315 0062;0061 05AE 0300 0308 0315 0062; # (a◌̕◌̀◌֮◌̈b; à◌֮◌̈◌̕b; a◌֮◌̀◌̈◌̕b; à◌֮◌̈◌̕b; a◌֮◌̀◌̈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DIAERESIS, LATIN SMALL LETTER B +0061 0308 0315 0300 05AE 0062;00E4 05AE 0300 0315 0062;0061 05AE 0308 0300 0315 0062;00E4 05AE 0300 0315 0062;0061 05AE 0308 0300 0315 0062; # (a◌̈◌̕◌̀◌֮b; ä◌֮◌̀◌̕b; a◌֮◌̈◌̀◌̕b; ä◌֮◌̀◌̕b; a◌֮◌̈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0309 0062;00E0 05AE 0309 0315 0062;0061 05AE 0300 0309 0315 0062;00E0 05AE 0309 0315 0062;0061 05AE 0300 0309 0315 0062; # (a◌̕◌̀◌֮◌̉b; à◌֮◌̉◌̕b; a◌֮◌̀◌̉◌̕b; à◌֮◌̉◌̕b; a◌֮◌̀◌̉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING HOOK ABOVE, LATIN SMALL LETTER B +0061 0309 0315 0300 05AE 0062;1EA3 05AE 0300 0315 0062;0061 05AE 0309 0300 0315 0062;1EA3 05AE 0300 0315 0062;0061 05AE 0309 0300 0315 0062; # (a◌̉◌̕◌̀◌֮b; ả◌֮◌̀◌̕b; a◌֮◌̉◌̀◌̕b; ả◌֮◌̀◌̕b; a◌֮◌̉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING HOOK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030A 0062;00E0 05AE 030A 0315 0062;0061 05AE 0300 030A 0315 0062;00E0 05AE 030A 0315 0062;0061 05AE 0300 030A 0315 0062; # (a◌̕◌̀◌֮◌̊b; à◌֮◌̊◌̕b; a◌֮◌̀◌̊◌̕b; à◌֮◌̊◌̕b; a◌֮◌̀◌̊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RING ABOVE, LATIN SMALL LETTER B +0061 030A 0315 0300 05AE 0062;00E5 05AE 0300 0315 0062;0061 05AE 030A 0300 0315 0062;00E5 05AE 0300 0315 0062;0061 05AE 030A 0300 0315 0062; # (a◌̊◌̕◌̀◌֮b; å◌֮◌̀◌̕b; a◌֮◌̊◌̀◌̕b; å◌֮◌̀◌̕b; a◌֮◌̊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030B 0062;00E0 05AE 030B 0315 0062;0061 05AE 0300 030B 0315 0062;00E0 05AE 030B 0315 0062;0061 05AE 0300 030B 0315 0062; # (a◌̕◌̀◌֮◌̋b; à◌֮◌̋◌̕b; a◌֮◌̀◌̋◌̕b; à◌֮◌̋◌̕b; a◌֮◌̀◌̋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE ACUTE ACCENT, LATIN SMALL LETTER B +0061 030B 0315 0300 05AE 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062; # (a◌̋◌̕◌̀◌֮b; a◌֮◌̋◌̀◌̕b; a◌֮◌̋◌̀◌̕b; a◌֮◌̋◌̀◌̕b; a◌֮◌̋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030C 0062;00E0 05AE 030C 0315 0062;0061 05AE 0300 030C 0315 0062;00E0 05AE 030C 0315 0062;0061 05AE 0300 030C 0315 0062; # (a◌̕◌̀◌֮◌̌b; à◌֮◌̌◌̕b; a◌֮◌̀◌̌◌̕b; à◌֮◌̌◌̕b; a◌֮◌̀◌̌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CARON, LATIN SMALL LETTER B +0061 030C 0315 0300 05AE 0062;01CE 05AE 0300 0315 0062;0061 05AE 030C 0300 0315 0062;01CE 05AE 0300 0315 0062;0061 05AE 030C 0300 0315 0062; # (a◌̌◌̕◌̀◌֮b; ǎ◌֮◌̀◌̕b; a◌֮◌̌◌̀◌̕b; ǎ◌֮◌̀◌̕b; a◌֮◌̌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CARON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030D 0062;00E0 05AE 030D 0315 0062;0061 05AE 0300 030D 0315 0062;00E0 05AE 030D 0315 0062;0061 05AE 0300 030D 0315 0062; # (a◌̕◌̀◌֮◌̍b; à◌֮◌̍◌̕b; a◌֮◌̀◌̍◌̕b; à◌֮◌̍◌̕b; a◌֮◌̀◌̍◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING VERTICAL LINE ABOVE, LATIN SMALL LETTER B +0061 030D 0315 0300 05AE 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062; # (a◌̍◌̕◌̀◌֮b; a◌֮◌̍◌̀◌̕b; a◌֮◌̍◌̀◌̕b; a◌֮◌̍◌̀◌̕b; a◌֮◌̍◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING VERTICAL LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030E 0062;00E0 05AE 030E 0315 0062;0061 05AE 0300 030E 0315 0062;00E0 05AE 030E 0315 0062;0061 05AE 0300 030E 0315 0062; # (a◌̕◌̀◌֮◌̎b; à◌֮◌̎◌̕b; a◌֮◌̀◌̎◌̕b; à◌֮◌̎◌̕b; a◌֮◌̀◌̎◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE VERTICAL LINE ABOVE, LATIN SMALL LETTER B +0061 030E 0315 0300 05AE 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062; # (a◌̎◌̕◌̀◌֮b; a◌֮◌̎◌̀◌̕b; a◌֮◌̎◌̀◌̕b; a◌֮◌̎◌̀◌̕b; a◌֮◌̎◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030F 0062;00E0 05AE 030F 0315 0062;0061 05AE 0300 030F 0315 0062;00E0 05AE 030F 0315 0062;0061 05AE 0300 030F 0315 0062; # (a◌̕◌̀◌֮◌̏b; à◌֮◌̏◌̕b; a◌֮◌̀◌̏◌̕b; à◌֮◌̏◌̕b; a◌֮◌̀◌̏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE GRAVE ACCENT, LATIN SMALL LETTER B +0061 030F 0315 0300 05AE 0062;0201 05AE 0300 0315 0062;0061 05AE 030F 0300 0315 0062;0201 05AE 0300 0315 0062;0061 05AE 030F 0300 0315 0062; # (a◌̏◌̕◌̀◌֮b; ȁ◌֮◌̀◌̕b; a◌֮◌̏◌̀◌̕b; ȁ◌֮◌̀◌̕b; a◌֮◌̏◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0310 0062;00E0 05AE 0310 0315 0062;0061 05AE 0300 0310 0315 0062;00E0 05AE 0310 0315 0062;0061 05AE 0300 0310 0315 0062; # (a◌̕◌̀◌֮◌̐b; à◌֮◌̐◌̕b; a◌֮◌̀◌̐◌̕b; à◌֮◌̐◌̕b; a◌֮◌̀◌̐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CANDRABINDU, LATIN SMALL LETTER B +0061 0310 0315 0300 05AE 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062; # (a◌̐◌̕◌̀◌֮b; a◌֮◌̐◌̀◌̕b; a◌֮◌̐◌̀◌̕b; a◌֮◌̐◌̀◌̕b; a◌֮◌̐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CANDRABINDU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0311 0062;00E0 05AE 0311 0315 0062;0061 05AE 0300 0311 0315 0062;00E0 05AE 0311 0315 0062;0061 05AE 0300 0311 0315 0062; # (a◌̕◌̀◌֮◌̑b; à◌֮◌̑◌̕b; a◌֮◌̀◌̑◌̕b; à◌֮◌̑◌̕b; a◌֮◌̀◌̑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING INVERTED BREVE, LATIN SMALL LETTER B +0061 0311 0315 0300 05AE 0062;0203 05AE 0300 0315 0062;0061 05AE 0311 0300 0315 0062;0203 05AE 0300 0315 0062;0061 05AE 0311 0300 0315 0062; # (a◌̑◌̕◌̀◌֮b; ȃ◌֮◌̀◌̕b; a◌֮◌̑◌̀◌̕b; ȃ◌֮◌̀◌̕b; a◌֮◌̑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING INVERTED BREVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0312 0062;00E0 05AE 0312 0315 0062;0061 05AE 0300 0312 0315 0062;00E0 05AE 0312 0315 0062;0061 05AE 0300 0312 0315 0062; # (a◌̕◌̀◌֮◌̒b; à◌֮◌̒◌̕b; a◌֮◌̀◌̒◌̕b; à◌֮◌̒◌̕b; a◌֮◌̀◌̒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TURNED COMMA ABOVE, LATIN SMALL LETTER B +0061 0312 0315 0300 05AE 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062; # (a◌̒◌̕◌̀◌֮b; a◌֮◌̒◌̀◌̕b; a◌֮◌̒◌̀◌̕b; a◌֮◌̒◌̀◌̕b; a◌֮◌̒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TURNED COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0313 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062; # (a◌̕◌̀◌֮◌̓b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING COMMA ABOVE, LATIN SMALL LETTER B +0061 0313 0315 0300 05AE 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062; # (a◌̓◌̕◌̀◌֮b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0314 0062;00E0 05AE 0314 0315 0062;0061 05AE 0300 0314 0315 0062;00E0 05AE 0314 0315 0062;0061 05AE 0300 0314 0315 0062; # (a◌̕◌̀◌֮◌̔b; à◌֮◌̔◌̕b; a◌֮◌̀◌̔◌̕b; à◌֮◌̔◌̕b; a◌֮◌̀◌̔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING REVERSED COMMA ABOVE, LATIN SMALL LETTER B +0061 0314 0315 0300 05AE 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062; # (a◌̔◌̕◌̀◌֮b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING REVERSED COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0362 0315 0300 0315 0062;00E0 0315 0315 0362 0062;0061 0300 0315 0315 0362 0062;00E0 0315 0315 0362 0062;0061 0300 0315 0315 0362 0062; # (a◌͢◌̕◌̀◌̕b; à◌̕◌̕◌͢b; a◌̀◌̕◌̕◌͢b; à◌̕◌̕◌͢b; a◌̀◌̕◌̕◌͢b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 0315 0362 0315 0300 0062;00E0 0315 0315 0362 0062;0061 0300 0315 0315 0362 0062;00E0 0315 0315 0362 0062;0061 0300 0315 0315 0362 0062; # (a◌̕◌͢◌̕◌̀b; à◌̕◌̕◌͢b; a◌̀◌̕◌̕◌͢b; à◌̕◌̕◌͢b; a◌̀◌̕◌̕◌͢b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 059A 0316 302A 0316 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062; # (a◌֚◌̖◌〪◌̖b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 0316 059A 0316 302A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062; # (a◌̖◌֚◌̖◌〪b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0317 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062; # (a◌֚◌̖◌〪◌̗b; a◌〪◌̖◌̗◌֚b; a◌〪◌̖◌̗◌֚b; a◌〪◌̖◌̗◌֚b; a◌〪◌̖◌̗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING ACUTE ACCENT BELOW, LATIN SMALL LETTER B +0061 0317 059A 0316 302A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062; # (a◌̗◌֚◌̖◌〪b; a◌〪◌̗◌̖◌֚b; a◌〪◌̗◌̖◌֚b; a◌〪◌̗◌̖◌֚b; a◌〪◌̗◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ACUTE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0318 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062; # (a◌֚◌̖◌〪◌̘b; a◌〪◌̖◌̘◌֚b; a◌〪◌̖◌̘◌֚b; a◌〪◌̖◌̘◌֚b; a◌〪◌̖◌̘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT TACK BELOW, LATIN SMALL LETTER B +0061 0318 059A 0316 302A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062; # (a◌̘◌֚◌̖◌〪b; a◌〪◌̘◌̖◌֚b; a◌〪◌̘◌̖◌֚b; a◌〪◌̘◌̖◌֚b; a◌〪◌̘◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0319 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062; # (a◌֚◌̖◌〪◌̙b; a◌〪◌̖◌̙◌֚b; a◌〪◌̖◌̙◌֚b; a◌〪◌̖◌̙◌֚b; a◌〪◌̖◌̙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT TACK BELOW, LATIN SMALL LETTER B +0061 0319 059A 0316 302A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062; # (a◌̙◌֚◌̖◌〪b; a◌〪◌̙◌̖◌֚b; a◌〪◌̙◌̖◌֚b; a◌〪◌̙◌̖◌֚b; a◌〪◌̙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0362 0315 0300 031A 0062;00E0 0315 031A 0362 0062;0061 0300 0315 031A 0362 0062;00E0 0315 031A 0362 0062;0061 0300 0315 031A 0362 0062; # (a◌͢◌̕◌̀◌̚b; à◌̕◌̚◌͢b; a◌̀◌̕◌̚◌͢b; à◌̕◌̚◌͢b; a◌̀◌̕◌̚◌͢b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING LEFT ANGLE ABOVE, LATIN SMALL LETTER B +0061 031A 0362 0315 0300 0062;00E0 031A 0315 0362 0062;0061 0300 031A 0315 0362 0062;00E0 031A 0315 0362 0062;0061 0300 031A 0315 0362 0062; # (a◌̚◌͢◌̕◌̀b; à◌̚◌̕◌͢b; a◌̀◌̚◌̕◌͢b; à◌̚◌̕◌͢b; a◌̀◌̚◌̕◌͢b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE ABOVE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 302A 031B 0321 031B 0062;0061 0321 031B 031B 302A 0062;0061 0321 031B 031B 302A 0062;0061 0321 031B 031B 302A 0062;0061 0321 031B 031B 302A 0062; # (a◌〪◌̛◌̡◌̛b; a◌̡◌̛◌̛◌〪b; a◌̡◌̛◌̛◌〪b; a◌̡◌̛◌̛◌〪b; a◌̡◌̛◌̛◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, COMBINING HORN, LATIN SMALL LETTER B +0061 031B 302A 031B 0321 0062;0061 0321 031B 031B 302A 0062;0061 0321 031B 031B 302A 0062;0061 0321 031B 031B 302A 0062;0061 0321 031B 031B 302A 0062; # (a◌̛◌〪◌̛◌̡b; a◌̡◌̛◌̛◌〪b; a◌̡◌̛◌̛◌〪b; a◌̡◌̛◌̛◌〪b; a◌̡◌̛◌̛◌〪b; ) LATIN SMALL LETTER A, COMBINING HORN, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 059A 0316 302A 031C 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062; # (a◌֚◌̖◌〪◌̜b; a◌〪◌̖◌̜◌֚b; a◌〪◌̖◌̜◌֚b; a◌〪◌̖◌̜◌֚b; a◌〪◌̖◌̜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT HALF RING BELOW, LATIN SMALL LETTER B +0061 031C 059A 0316 302A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062; # (a◌̜◌֚◌̖◌〪b; a◌〪◌̜◌̖◌֚b; a◌〪◌̜◌̖◌֚b; a◌〪◌̜◌̖◌֚b; a◌〪◌̜◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 031D 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062; # (a◌֚◌̖◌〪◌̝b; a◌〪◌̖◌̝◌֚b; a◌〪◌̖◌̝◌֚b; a◌〪◌̖◌̝◌֚b; a◌〪◌̖◌̝◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING UP TACK BELOW, LATIN SMALL LETTER B +0061 031D 059A 0316 302A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062; # (a◌̝◌֚◌̖◌〪b; a◌〪◌̝◌̖◌֚b; a◌〪◌̝◌̖◌֚b; a◌〪◌̝◌̖◌֚b; a◌〪◌̝◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UP TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 031E 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062; # (a◌֚◌̖◌〪◌̞b; a◌〪◌̖◌̞◌֚b; a◌〪◌̖◌̞◌֚b; a◌〪◌̖◌̞◌֚b; a◌〪◌̖◌̞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOWN TACK BELOW, LATIN SMALL LETTER B +0061 031E 059A 0316 302A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062; # (a◌̞◌֚◌̖◌〪b; a◌〪◌̞◌̖◌֚b; a◌〪◌̞◌̖◌֚b; a◌〪◌̞◌̖◌֚b; a◌〪◌̞◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOWN TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 031F 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062; # (a◌֚◌̖◌〪◌̟b; a◌〪◌̖◌̟◌֚b; a◌〪◌̖◌̟◌֚b; a◌〪◌̖◌̟◌֚b; a◌〪◌̖◌̟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING PLUS SIGN BELOW, LATIN SMALL LETTER B +0061 031F 059A 0316 302A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062; # (a◌̟◌֚◌̖◌〪b; a◌〪◌̟◌̖◌֚b; a◌〪◌̟◌̖◌֚b; a◌〪◌̟◌̖◌֚b; a◌〪◌̟◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PLUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0320 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062; # (a◌֚◌̖◌〪◌̠b; a◌〪◌̖◌̠◌֚b; a◌〪◌̖◌̠◌֚b; a◌〪◌̖◌̠◌֚b; a◌〪◌̖◌̠◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING MINUS SIGN BELOW, LATIN SMALL LETTER B +0061 0320 059A 0316 302A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062; # (a◌̠◌֚◌̖◌〪b; a◌〪◌̠◌̖◌֚b; a◌〪◌̠◌̖◌֚b; a◌〪◌̠◌̖◌֚b; a◌〪◌̠◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MINUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 031B 0321 0F74 0321 0062;0061 0F74 0321 0321 031B 0062;0061 0F74 0321 0321 031B 0062;0061 0F74 0321 0321 031B 0062;0061 0F74 0321 0321 031B 0062; # (a◌̛◌̡◌ུ◌̡b; a◌ུ◌̡◌̡◌̛b; a◌ུ◌̡◌̡◌̛b; a◌ུ◌̡◌̡◌̛b; a◌ུ◌̡◌̡◌̛b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 0321 031B 0321 0F74 0062;0061 0F74 0321 0321 031B 0062;0061 0F74 0321 0321 031B 0062;0061 0F74 0321 0321 031B 0062;0061 0F74 0321 0321 031B 0062; # (a◌̡◌̛◌̡◌ུb; a◌ུ◌̡◌̡◌̛b; a◌ུ◌̡◌̡◌̛b; a◌ུ◌̡◌̡◌̛b; a◌ུ◌̡◌̡◌̛b; ) LATIN SMALL LETTER A, COMBINING PALATALIZED HOOK BELOW, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 031B 0321 0F74 0322 0062;0061 0F74 0321 0322 031B 0062;0061 0F74 0321 0322 031B 0062;0061 0F74 0321 0322 031B 0062;0061 0F74 0321 0322 031B 0062; # (a◌̛◌̡◌ུ◌̢b; a◌ུ◌̡◌̢◌̛b; a◌ུ◌̡◌̢◌̛b; a◌ུ◌̡◌̢◌̛b; a◌ུ◌̡◌̢◌̛b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING RETROFLEX HOOK BELOW, LATIN SMALL LETTER B +0061 0322 031B 0321 0F74 0062;0061 0F74 0322 0321 031B 0062;0061 0F74 0322 0321 031B 0062;0061 0F74 0322 0321 031B 0062;0061 0F74 0322 0321 031B 0062; # (a◌̢◌̛◌̡◌ུb; a◌ུ◌̢◌̡◌̛b; a◌ུ◌̢◌̡◌̛b; a◌ུ◌̢◌̡◌̛b; a◌ུ◌̢◌̡◌̛b; ) LATIN SMALL LETTER A, COMBINING RETROFLEX HOOK BELOW, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 059A 0316 302A 0323 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062; # (a◌֚◌̖◌〪◌̣b; a◌〪◌̖◌̣◌֚b; a◌〪◌̖◌̣◌֚b; a◌〪◌̖◌̣◌֚b; a◌〪◌̖◌̣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOT BELOW, LATIN SMALL LETTER B +0061 0323 059A 0316 302A 0062;1EA1 302A 0316 059A 0062;0061 302A 0323 0316 059A 0062;1EA1 302A 0316 059A 0062;0061 302A 0323 0316 059A 0062; # (a◌̣◌֚◌̖◌〪b; ạ◌〪◌̖◌֚b; a◌〪◌̣◌̖◌֚b; ạ◌〪◌̖◌֚b; a◌〪◌̣◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0324 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062; # (a◌֚◌̖◌〪◌̤b; a◌〪◌̖◌̤◌֚b; a◌〪◌̖◌̤◌֚b; a◌〪◌̖◌̤◌֚b; a◌〪◌̖◌̤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DIAERESIS BELOW, LATIN SMALL LETTER B +0061 0324 059A 0316 302A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062; # (a◌̤◌֚◌̖◌〪b; a◌〪◌̤◌̖◌֚b; a◌〪◌̤◌̖◌֚b; a◌〪◌̤◌̖◌֚b; a◌〪◌̤◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0325 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062; # (a◌֚◌̖◌〪◌̥b; a◌〪◌̖◌̥◌֚b; a◌〪◌̖◌̥◌֚b; a◌〪◌̖◌̥◌֚b; a◌〪◌̖◌̥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RING BELOW, LATIN SMALL LETTER B +0061 0325 059A 0316 302A 0062;1E01 302A 0316 059A 0062;0061 302A 0325 0316 059A 0062;1E01 302A 0316 059A 0062;0061 302A 0325 0316 059A 0062; # (a◌̥◌֚◌̖◌〪b; ḁ◌〪◌̖◌֚b; a◌〪◌̥◌̖◌֚b; ḁ◌〪◌̖◌֚b; a◌〪◌̥◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0326 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062; # (a◌֚◌̖◌〪◌̦b; a◌〪◌̖◌̦◌֚b; a◌〪◌̖◌̦◌֚b; a◌〪◌̖◌̦◌֚b; a◌〪◌̖◌̦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING COMMA BELOW, LATIN SMALL LETTER B +0061 0326 059A 0316 302A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062; # (a◌̦◌֚◌̖◌〪b; a◌〪◌̦◌̖◌֚b; a◌〪◌̦◌̖◌֚b; a◌〪◌̦◌̖◌֚b; a◌〪◌̦◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING COMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 031B 0321 0F74 0327 0062;0061 0F74 0321 0327 031B 0062;0061 0F74 0321 0327 031B 0062;0061 0F74 0321 0327 031B 0062;0061 0F74 0321 0327 031B 0062; # (a◌̛◌̡◌ུ◌̧b; a◌ུ◌̡◌̧◌̛b; a◌ུ◌̡◌̧◌̛b; a◌ུ◌̡◌̧◌̛b; a◌ུ◌̡◌̧◌̛b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING CEDILLA, LATIN SMALL LETTER B +0061 0327 031B 0321 0F74 0062;0061 0F74 0327 0321 031B 0062;0061 0F74 0327 0321 031B 0062;0061 0F74 0327 0321 031B 0062;0061 0F74 0327 0321 031B 0062; # (a◌̧◌̛◌̡◌ུb; a◌ུ◌̧◌̡◌̛b; a◌ུ◌̧◌̡◌̛b; a◌ུ◌̧◌̡◌̛b; a◌ུ◌̧◌̡◌̛b; ) LATIN SMALL LETTER A, COMBINING CEDILLA, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 031B 0321 0F74 0328 0062;0061 0F74 0321 0328 031B 0062;0061 0F74 0321 0328 031B 0062;0061 0F74 0321 0328 031B 0062;0061 0F74 0321 0328 031B 0062; # (a◌̛◌̡◌ུ◌̨b; a◌ུ◌̡◌̨◌̛b; a◌ུ◌̡◌̨◌̛b; a◌ུ◌̡◌̨◌̛b; a◌ུ◌̡◌̨◌̛b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING OGONEK, LATIN SMALL LETTER B +0061 0328 031B 0321 0F74 0062;0105 0F74 0321 031B 0062;0061 0F74 0328 0321 031B 0062;0105 0F74 0321 031B 0062;0061 0F74 0328 0321 031B 0062; # (a◌̨◌̛◌̡◌ུb; ą◌ུ◌̡◌̛b; a◌ུ◌̨◌̡◌̛b; ą◌ུ◌̡◌̛b; a◌ུ◌̨◌̡◌̛b; ) LATIN SMALL LETTER A, COMBINING OGONEK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 059A 0316 302A 0329 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062; # (a◌֚◌̖◌〪◌̩b; a◌〪◌̖◌̩◌֚b; a◌〪◌̖◌̩◌֚b; a◌〪◌̖◌̩◌֚b; a◌〪◌̖◌̩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING VERTICAL LINE BELOW, LATIN SMALL LETTER B +0061 0329 059A 0316 302A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062; # (a◌̩◌֚◌̖◌〪b; a◌〪◌̩◌̖◌֚b; a◌〪◌̩◌̖◌֚b; a◌〪◌̩◌̖◌֚b; a◌〪◌̩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 032A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062; # (a◌֚◌̖◌〪◌̪b; a◌〪◌̖◌̪◌֚b; a◌〪◌̖◌̪◌֚b; a◌〪◌̖◌̪◌֚b; a◌〪◌̖◌̪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING BRIDGE BELOW, LATIN SMALL LETTER B +0061 032A 059A 0316 302A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062; # (a◌̪◌֚◌̖◌〪b; a◌〪◌̪◌̖◌֚b; a◌〪◌̪◌̖◌֚b; a◌〪◌̪◌̖◌֚b; a◌〪◌̪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 032B 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062; # (a◌֚◌̖◌〪◌̫b; a◌〪◌̖◌̫◌֚b; a◌〪◌̖◌̫◌֚b; a◌〪◌̖◌̫◌֚b; a◌〪◌̖◌̫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING INVERTED DOUBLE ARCH BELOW, LATIN SMALL LETTER B +0061 032B 059A 0316 302A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062; # (a◌̫◌֚◌̖◌〪b; a◌〪◌̫◌̖◌֚b; a◌〪◌̫◌̖◌֚b; a◌〪◌̫◌̖◌֚b; a◌〪◌̫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED DOUBLE ARCH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 032C 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062; # (a◌֚◌̖◌〪◌̬b; a◌〪◌̖◌̬◌֚b; a◌〪◌̖◌̬◌֚b; a◌〪◌̖◌̬◌֚b; a◌〪◌̖◌̬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING CARON BELOW, LATIN SMALL LETTER B +0061 032C 059A 0316 302A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062; # (a◌̬◌֚◌̖◌〪b; a◌〪◌̬◌̖◌֚b; a◌〪◌̬◌̖◌֚b; a◌〪◌̬◌̖◌֚b; a◌〪◌̬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CARON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 032D 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062; # (a◌֚◌̖◌〪◌̭b; a◌〪◌̖◌̭◌֚b; a◌〪◌̖◌̭◌֚b; a◌〪◌̖◌̭◌֚b; a◌〪◌̖◌̭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING CIRCUMFLEX ACCENT BELOW, LATIN SMALL LETTER B +0061 032D 059A 0316 302A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062; # (a◌̭◌֚◌̖◌〪b; a◌〪◌̭◌̖◌֚b; a◌〪◌̭◌̖◌֚b; a◌〪◌̭◌̖◌֚b; a◌〪◌̭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CIRCUMFLEX ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 032E 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062; # (a◌֚◌̖◌〪◌̮b; a◌〪◌̖◌̮◌֚b; a◌〪◌̖◌̮◌֚b; a◌〪◌̖◌̮◌֚b; a◌〪◌̖◌̮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING BREVE BELOW, LATIN SMALL LETTER B +0061 032E 059A 0316 302A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062; # (a◌̮◌֚◌̖◌〪b; a◌〪◌̮◌̖◌֚b; a◌〪◌̮◌̖◌֚b; a◌〪◌̮◌̖◌֚b; a◌〪◌̮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 032F 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062; # (a◌֚◌̖◌〪◌̯b; a◌〪◌̖◌̯◌֚b; a◌〪◌̖◌̯◌֚b; a◌〪◌̖◌̯◌֚b; a◌〪◌̖◌̯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING INVERTED BREVE BELOW, LATIN SMALL LETTER B +0061 032F 059A 0316 302A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062; # (a◌̯◌֚◌̖◌〪b; a◌〪◌̯◌̖◌֚b; a◌〪◌̯◌̖◌֚b; a◌〪◌̯◌̖◌֚b; a◌〪◌̯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0330 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062; # (a◌֚◌̖◌〪◌̰b; a◌〪◌̖◌̰◌֚b; a◌〪◌̖◌̰◌֚b; a◌〪◌̖◌̰◌֚b; a◌〪◌̖◌̰◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING TILDE BELOW, LATIN SMALL LETTER B +0061 0330 059A 0316 302A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062; # (a◌̰◌֚◌̖◌〪b; a◌〪◌̰◌̖◌֚b; a◌〪◌̰◌̖◌֚b; a◌〪◌̰◌̖◌֚b; a◌〪◌̰◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0331 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062; # (a◌֚◌̖◌〪◌̱b; a◌〪◌̖◌̱◌֚b; a◌〪◌̖◌̱◌֚b; a◌〪◌̖◌̱◌֚b; a◌〪◌̖◌̱◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING MACRON BELOW, LATIN SMALL LETTER B +0061 0331 059A 0316 302A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062; # (a◌̱◌֚◌̖◌〪b; a◌〪◌̱◌̖◌֚b; a◌〪◌̱◌̖◌֚b; a◌〪◌̱◌̖◌֚b; a◌〪◌̱◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0332 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062; # (a◌֚◌̖◌〪◌̲b; a◌〪◌̖◌̲◌֚b; a◌〪◌̖◌̲◌֚b; a◌〪◌̖◌̲◌֚b; a◌〪◌̖◌̲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LOW LINE, LATIN SMALL LETTER B +0061 0332 059A 0316 302A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062; # (a◌̲◌֚◌̖◌〪b; a◌〪◌̲◌̖◌֚b; a◌〪◌̲◌̖◌֚b; a◌〪◌̲◌̖◌֚b; a◌〪◌̲◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0333 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062; # (a◌֚◌̖◌〪◌̳b; a◌〪◌̖◌̳◌֚b; a◌〪◌̖◌̳◌֚b; a◌〪◌̖◌̳◌֚b; a◌〪◌̖◌̳◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOUBLE LOW LINE, LATIN SMALL LETTER B +0061 0333 059A 0316 302A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062; # (a◌̳◌֚◌̖◌〪b; a◌〪◌̳◌̖◌֚b; a◌〪◌̳◌̖◌֚b; a◌〪◌̳◌̖◌֚b; a◌〪◌̳◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 093C 0334 0334 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062; # (a◌़◌̴◌̴b; a◌̴◌̴◌़b; a◌̴◌̴◌़b; a◌̴◌̴◌़b; a◌̴◌̴◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0334 093C 0334 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062;0061 0334 0334 093C 0062; # (a◌̴◌़◌̴b; a◌̴◌̴◌़b; a◌̴◌̴◌़b; a◌̴◌̴◌़b; a◌̴◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING TILDE OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 0335 0062;0061 0334 0335 093C 0062;0061 0334 0335 093C 0062;0061 0334 0335 093C 0062;0061 0334 0335 093C 0062; # (a◌़◌̴◌̵b; a◌̴◌̵◌़b; a◌̴◌̵◌़b; a◌̴◌̵◌़b; a◌̴◌̵◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER B +0061 0335 093C 0334 0062;0061 0335 0334 093C 0062;0061 0335 0334 093C 0062;0061 0335 0334 093C 0062;0061 0335 0334 093C 0062; # (a◌̵◌़◌̴b; a◌̵◌̴◌़b; a◌̵◌̴◌़b; a◌̵◌̴◌़b; a◌̵◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING SHORT STROKE OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 0336 0062;0061 0334 0336 093C 0062;0061 0334 0336 093C 0062;0061 0334 0336 093C 0062;0061 0334 0336 093C 0062; # (a◌़◌̴◌̶b; a◌̴◌̶◌़b; a◌̴◌̶◌़b; a◌̴◌̶◌़b; a◌̴◌̶◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING LONG STROKE OVERLAY, LATIN SMALL LETTER B +0061 0336 093C 0334 0062;0061 0336 0334 093C 0062;0061 0336 0334 093C 0062;0061 0336 0334 093C 0062;0061 0336 0334 093C 0062; # (a◌̶◌़◌̴b; a◌̶◌̴◌़b; a◌̶◌̴◌़b; a◌̶◌̴◌़b; a◌̶◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING LONG STROKE OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 0337 0062;0061 0334 0337 093C 0062;0061 0334 0337 093C 0062;0061 0334 0337 093C 0062;0061 0334 0337 093C 0062; # (a◌़◌̴◌̷b; a◌̴◌̷◌़b; a◌̴◌̷◌़b; a◌̴◌̷◌़b; a◌̴◌̷◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING SHORT SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 0337 093C 0334 0062;0061 0337 0334 093C 0062;0061 0337 0334 093C 0062;0061 0337 0334 093C 0062;0061 0337 0334 093C 0062; # (a◌̷◌़◌̴b; a◌̷◌̴◌़b; a◌̷◌̴◌़b; a◌̷◌̴◌़b; a◌̷◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING SHORT SOLIDUS OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 0338 0062;0061 0334 0338 093C 0062;0061 0334 0338 093C 0062;0061 0334 0338 093C 0062;0061 0334 0338 093C 0062; # (a◌़◌̴◌̸b; a◌̴◌̸◌़b; a◌̴◌̸◌़b; a◌̴◌̸◌़b; a◌̴◌̸◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING LONG SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 0338 093C 0334 0062;0061 0338 0334 093C 0062;0061 0338 0334 093C 0062;0061 0338 0334 093C 0062;0061 0338 0334 093C 0062; # (a◌̸◌़◌̴b; a◌̸◌̴◌़b; a◌̸◌̴◌़b; a◌̸◌̴◌़b; a◌̸◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING LONG SOLIDUS OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 059A 0316 302A 0339 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062; # (a◌֚◌̖◌〪◌̹b; a◌〪◌̖◌̹◌֚b; a◌〪◌̖◌̹◌֚b; a◌〪◌̖◌̹◌֚b; a◌〪◌̖◌̹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT HALF RING BELOW, LATIN SMALL LETTER B +0061 0339 059A 0316 302A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062; # (a◌̹◌֚◌̖◌〪b; a◌〪◌̹◌̖◌֚b; a◌〪◌̹◌̖◌֚b; a◌〪◌̹◌̖◌֚b; a◌〪◌̹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 033A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062; # (a◌֚◌̖◌〪◌̺b; a◌〪◌̖◌̺◌֚b; a◌〪◌̖◌̺◌֚b; a◌〪◌̖◌̺◌֚b; a◌〪◌̖◌̺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING INVERTED BRIDGE BELOW, LATIN SMALL LETTER B +0061 033A 059A 0316 302A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062; # (a◌̺◌֚◌̖◌〪b; a◌〪◌̺◌̖◌֚b; a◌〪◌̺◌̖◌֚b; a◌〪◌̺◌̖◌֚b; a◌〪◌̺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 033B 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062; # (a◌֚◌̖◌〪◌̻b; a◌〪◌̖◌̻◌֚b; a◌〪◌̖◌̻◌֚b; a◌〪◌̖◌̻◌֚b; a◌〪◌̖◌̻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING SQUARE BELOW, LATIN SMALL LETTER B +0061 033B 059A 0316 302A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062; # (a◌̻◌֚◌̖◌〪b; a◌〪◌̻◌̖◌֚b; a◌〪◌̻◌̖◌֚b; a◌〪◌̻◌̖◌֚b; a◌〪◌̻◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SQUARE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 033C 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062; # (a◌֚◌̖◌〪◌̼b; a◌〪◌̖◌̼◌֚b; a◌〪◌̖◌̼◌֚b; a◌〪◌̖◌̼◌֚b; a◌〪◌̖◌̼◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING SEAGULL BELOW, LATIN SMALL LETTER B +0061 033C 059A 0316 302A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062; # (a◌̼◌֚◌̖◌〪b; a◌〪◌̼◌̖◌֚b; a◌〪◌̼◌̖◌֚b; a◌〪◌̼◌̖◌֚b; a◌〪◌̼◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SEAGULL BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 033D 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062; # (a◌̕◌̀◌֮◌̽b; à◌֮◌̽◌̕b; a◌֮◌̀◌̽◌̕b; à◌֮◌̽◌̕b; a◌֮◌̀◌̽◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING X ABOVE, LATIN SMALL LETTER B +0061 033D 0315 0300 05AE 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062; # (a◌̽◌̕◌̀◌֮b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING X ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 033E 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062; # (a◌̕◌̀◌֮◌̾b; à◌֮◌̾◌̕b; a◌֮◌̀◌̾◌̕b; à◌֮◌̾◌̕b; a◌֮◌̀◌̾◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING VERTICAL TILDE, LATIN SMALL LETTER B +0061 033E 0315 0300 05AE 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062; # (a◌̾◌̕◌̀◌֮b; a◌֮◌̾◌̀◌̕b; a◌֮◌̾◌̀◌̕b; a◌֮◌̾◌̀◌̕b; a◌֮◌̾◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING VERTICAL TILDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 033F 0062;00E0 05AE 033F 0315 0062;0061 05AE 0300 033F 0315 0062;00E0 05AE 033F 0315 0062;0061 05AE 0300 033F 0315 0062; # (a◌̕◌̀◌֮◌̿b; à◌֮◌̿◌̕b; a◌֮◌̀◌̿◌̕b; à◌֮◌̿◌̕b; a◌֮◌̀◌̿◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE OVERLINE, LATIN SMALL LETTER B +0061 033F 0315 0300 05AE 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062; # (a◌̿◌̕◌̀◌֮b; a◌֮◌̿◌̀◌̕b; a◌֮◌̿◌̀◌̕b; a◌֮◌̿◌̀◌̕b; a◌֮◌̿◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE OVERLINE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0340 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̕◌̀◌֮◌̀b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRAVE TONE MARK, LATIN SMALL LETTER B +0061 0340 0315 0300 05AE 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̀◌̕◌̀◌֮b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE TONE MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0341 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062; # (a◌̕◌̀◌֮◌́b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE TONE MARK, LATIN SMALL LETTER B +0061 0341 0315 0300 05AE 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062; # (a◌́◌̕◌̀◌֮b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE TONE MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0342 0062;00E0 05AE 0342 0315 0062;0061 05AE 0300 0342 0315 0062;00E0 05AE 0342 0315 0062;0061 05AE 0300 0342 0315 0062; # (a◌̕◌̀◌֮◌͂b; à◌֮◌͂◌̕b; a◌֮◌̀◌͂◌̕b; à◌֮◌͂◌̕b; a◌֮◌̀◌͂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK PERISPOMENI, LATIN SMALL LETTER B +0061 0342 0315 0300 05AE 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062; # (a◌͂◌̕◌̀◌֮b; a◌֮◌͂◌̀◌̕b; a◌֮◌͂◌̀◌̕b; a◌֮◌͂◌̀◌̕b; a◌֮◌͂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK PERISPOMENI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0343 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062; # (a◌̕◌̀◌֮◌̓b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK KORONIS, LATIN SMALL LETTER B +0061 0343 0315 0300 05AE 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062; # (a◌̓◌̕◌̀◌֮b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK KORONIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0344 0062;00E0 05AE 0308 0301 0315 0062;0061 05AE 0300 0308 0301 0315 0062;00E0 05AE 0308 0301 0315 0062;0061 05AE 0300 0308 0301 0315 0062; # (a◌̕◌̀◌֮◌̈́b; à◌֮◌̈◌́◌̕b; a◌֮◌̀◌̈◌́◌̕b; à◌֮◌̈◌́◌̕b; a◌֮◌̀◌̈◌́◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK DIALYTIKA TONOS, LATIN SMALL LETTER B +0061 0344 0315 0300 05AE 0062;00E4 05AE 0301 0300 0315 0062;0061 05AE 0308 0301 0300 0315 0062;00E4 05AE 0301 0300 0315 0062;0061 05AE 0308 0301 0300 0315 0062; # (a◌̈́◌̕◌̀◌֮b; ä◌֮◌́◌̀◌̕b; a◌֮◌̈◌́◌̀◌̕b; ä◌֮◌́◌̀◌̕b; a◌֮◌̈◌́◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK DIALYTIKA TONOS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0345 0360 0345 0062;0061 0360 0345 0345 0062;0061 0360 0345 0345 0062;0061 0360 0345 0345 0062;0061 0360 0345 0345 0062; # (a◌ͅ◌͠◌ͅb; a◌͠◌ͅ◌ͅb; a◌͠◌ͅ◌ͅb; a◌͠◌ͅ◌ͅb; a◌͠◌ͅ◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE TILDE, COMBINING GREEK YPOGEGRAMMENI, LATIN SMALL LETTER B +0061 0345 0345 0360 0062;0061 0360 0345 0345 0062;0061 0360 0345 0345 0062;0061 0360 0345 0345 0062;0061 0360 0345 0345 0062; # (a◌ͅ◌ͅ◌͠b; a◌͠◌ͅ◌ͅb; a◌͠◌ͅ◌ͅb; a◌͠◌ͅ◌ͅb; a◌͠◌ͅ◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE TILDE, LATIN SMALL LETTER B +0061 0315 0300 05AE 0346 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062; # (a◌̕◌̀◌֮◌͆b; à◌֮◌͆◌̕b; a◌֮◌̀◌͆◌̕b; à◌֮◌͆◌̕b; a◌֮◌̀◌͆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BRIDGE ABOVE, LATIN SMALL LETTER B +0061 0346 0315 0300 05AE 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062; # (a◌͆◌̕◌̀◌֮b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BRIDGE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0347 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062; # (a◌֚◌̖◌〪◌͇b; a◌〪◌̖◌͇◌֚b; a◌〪◌̖◌͇◌֚b; a◌〪◌̖◌͇◌֚b; a◌〪◌̖◌͇◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING EQUALS SIGN BELOW, LATIN SMALL LETTER B +0061 0347 059A 0316 302A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062; # (a◌͇◌֚◌̖◌〪b; a◌〪◌͇◌̖◌֚b; a◌〪◌͇◌̖◌֚b; a◌〪◌͇◌̖◌֚b; a◌〪◌͇◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING EQUALS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0348 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062; # (a◌֚◌̖◌〪◌͈b; a◌〪◌̖◌͈◌֚b; a◌〪◌̖◌͈◌֚b; a◌〪◌̖◌͈◌֚b; a◌〪◌̖◌͈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOUBLE VERTICAL LINE BELOW, LATIN SMALL LETTER B +0061 0348 059A 0316 302A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062; # (a◌͈◌֚◌̖◌〪b; a◌〪◌͈◌̖◌֚b; a◌〪◌͈◌̖◌֚b; a◌〪◌͈◌̖◌֚b; a◌〪◌͈◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0349 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062; # (a◌֚◌̖◌〪◌͉b; a◌〪◌̖◌͉◌֚b; a◌〪◌̖◌͉◌֚b; a◌〪◌̖◌͉◌֚b; a◌〪◌̖◌͉◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT ANGLE BELOW, LATIN SMALL LETTER B +0061 0349 059A 0316 302A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062; # (a◌͉◌֚◌̖◌〪b; a◌〪◌͉◌̖◌֚b; a◌〪◌͉◌̖◌֚b; a◌〪◌͉◌̖◌֚b; a◌〪◌͉◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 034A 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062; # (a◌̕◌̀◌֮◌͊b; à◌֮◌͊◌̕b; a◌֮◌̀◌͊◌̕b; à◌֮◌͊◌̕b; a◌֮◌̀◌͊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING NOT TILDE ABOVE, LATIN SMALL LETTER B +0061 034A 0315 0300 05AE 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062; # (a◌͊◌̕◌̀◌֮b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING NOT TILDE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 034B 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062; # (a◌̕◌̀◌֮◌͋b; à◌֮◌͋◌̕b; a◌֮◌̀◌͋◌̕b; à◌֮◌͋◌̕b; a◌֮◌̀◌͋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING HOMOTHETIC ABOVE, LATIN SMALL LETTER B +0061 034B 0315 0300 05AE 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062; # (a◌͋◌̕◌̀◌֮b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING HOMOTHETIC ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 034C 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062; # (a◌̕◌̀◌֮◌͌b; à◌֮◌͌◌̕b; a◌֮◌̀◌͌◌̕b; à◌֮◌͌◌̕b; a◌֮◌̀◌͌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ALMOST EQUAL TO ABOVE, LATIN SMALL LETTER B +0061 034C 0315 0300 05AE 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062; # (a◌͌◌̕◌̀◌֮b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ALMOST EQUAL TO ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 034D 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062; # (a◌֚◌̖◌〪◌͍b; a◌〪◌̖◌͍◌֚b; a◌〪◌̖◌͍◌֚b; a◌〪◌̖◌͍◌֚b; a◌〪◌̖◌͍◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT RIGHT ARROW BELOW, LATIN SMALL LETTER B +0061 034D 059A 0316 302A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062; # (a◌͍◌֚◌̖◌〪b; a◌〪◌͍◌̖◌֚b; a◌〪◌͍◌̖◌֚b; a◌〪◌͍◌̖◌֚b; a◌〪◌͍◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 034E 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062; # (a◌֚◌̖◌〪◌͎b; a◌〪◌̖◌͎◌֚b; a◌〪◌̖◌͎◌֚b; a◌〪◌̖◌͎◌֚b; a◌〪◌̖◌͎◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING UPWARDS ARROW BELOW, LATIN SMALL LETTER B +0061 034E 059A 0316 302A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062; # (a◌͎◌֚◌̖◌〪b; a◌〪◌͎◌̖◌֚b; a◌〪◌͎◌̖◌֚b; a◌〪◌͎◌̖◌֚b; a◌〪◌͎◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UPWARDS ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0345 0360 0362 0360 0062;0061 0362 0360 0360 0345 0062;0061 0362 0360 0360 0345 0062;0061 0362 0360 0360 0345 0062;0061 0362 0360 0360 0345 0062; # (a◌ͅ◌͠◌͢◌͠b; a◌͢◌͠◌͠◌ͅb; a◌͢◌͠◌͠◌ͅb; a◌͢◌͠◌͠◌ͅb; a◌͢◌͠◌͠◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE TILDE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING DOUBLE TILDE, LATIN SMALL LETTER B +0061 0360 0345 0360 0362 0062;0061 0362 0360 0360 0345 0062;0061 0362 0360 0360 0345 0062;0061 0362 0360 0360 0345 0062;0061 0362 0360 0360 0345 0062; # (a◌͠◌ͅ◌͠◌͢b; a◌͢◌͠◌͠◌ͅb; a◌͢◌͠◌͠◌ͅb; a◌͢◌͠◌͠◌ͅb; a◌͢◌͠◌͠◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE TILDE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, LATIN SMALL LETTER B +0061 0345 0360 0362 0361 0062;0061 0362 0360 0361 0345 0062;0061 0362 0360 0361 0345 0062;0061 0362 0360 0361 0345 0062;0061 0362 0360 0361 0345 0062; # (a◌ͅ◌͠◌͢◌͡b; a◌͢◌͠◌͡◌ͅb; a◌͢◌͠◌͡◌ͅb; a◌͢◌͠◌͡◌ͅb; a◌͢◌͠◌͡◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE TILDE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING DOUBLE INVERTED BREVE, LATIN SMALL LETTER B +0061 0361 0345 0360 0362 0062;0061 0362 0361 0360 0345 0062;0061 0362 0361 0360 0345 0062;0061 0362 0361 0360 0345 0062;0061 0362 0361 0360 0345 0062; # (a◌͡◌ͅ◌͠◌͢b; a◌͢◌͡◌͠◌ͅb; a◌͢◌͡◌͠◌ͅb; a◌͢◌͡◌͠◌ͅb; a◌͢◌͡◌͠◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE INVERTED BREVE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE TILDE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, LATIN SMALL LETTER B +0061 0360 0362 0315 0362 0062;0061 0315 0362 0362 0360 0062;0061 0315 0362 0362 0360 0062;0061 0315 0362 0362 0360 0062;0061 0315 0362 0362 0360 0062; # (a◌͠◌͢◌̕◌͢b; a◌̕◌͢◌͢◌͠b; a◌̕◌͢◌͢◌͠b; a◌̕◌͢◌͢◌͠b; a◌̕◌͢◌͢◌͠b; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, LATIN SMALL LETTER B +0061 0362 0360 0362 0315 0062;0061 0315 0362 0362 0360 0062;0061 0315 0362 0362 0360 0062;0061 0315 0362 0362 0360 0062;0061 0315 0362 0362 0360 0062; # (a◌͢◌͠◌͢◌̕b; a◌̕◌͢◌͢◌͠b; a◌̕◌͢◌͢◌͠b; a◌̕◌͢◌͢◌͠b; a◌̕◌͢◌͢◌͠b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING DOUBLE TILDE, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0363 0062;00E0 05AE 0363 0315 0062;0061 05AE 0300 0363 0315 0062;00E0 05AE 0363 0315 0062;0061 05AE 0300 0363 0315 0062; # (a◌̕◌̀◌֮◌ͣb; à◌֮◌ͣ◌̕b; a◌֮◌̀◌ͣ◌̕b; à◌֮◌ͣ◌̕b; a◌֮◌̀◌ͣ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER A, LATIN SMALL LETTER B +0061 0363 0315 0300 05AE 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062; # (a◌ͣ◌̕◌̀◌֮b; a◌֮◌ͣ◌̀◌̕b; a◌֮◌ͣ◌̀◌̕b; a◌֮◌ͣ◌̀◌̕b; a◌֮◌ͣ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0364 0062;00E0 05AE 0364 0315 0062;0061 05AE 0300 0364 0315 0062;00E0 05AE 0364 0315 0062;0061 05AE 0300 0364 0315 0062; # (a◌̕◌̀◌֮◌ͤb; à◌֮◌ͤ◌̕b; a◌֮◌̀◌ͤ◌̕b; à◌֮◌ͤ◌̕b; a◌֮◌̀◌ͤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER E, LATIN SMALL LETTER B +0061 0364 0315 0300 05AE 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062; # (a◌ͤ◌̕◌̀◌֮b; a◌֮◌ͤ◌̀◌̕b; a◌֮◌ͤ◌̀◌̕b; a◌֮◌ͤ◌̀◌̕b; a◌֮◌ͤ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER E, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0365 0062;00E0 05AE 0365 0315 0062;0061 05AE 0300 0365 0315 0062;00E0 05AE 0365 0315 0062;0061 05AE 0300 0365 0315 0062; # (a◌̕◌̀◌֮◌ͥb; à◌֮◌ͥ◌̕b; a◌֮◌̀◌ͥ◌̕b; à◌֮◌ͥ◌̕b; a◌֮◌̀◌ͥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER I, LATIN SMALL LETTER B +0061 0365 0315 0300 05AE 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062; # (a◌ͥ◌̕◌̀◌֮b; a◌֮◌ͥ◌̀◌̕b; a◌֮◌ͥ◌̀◌̕b; a◌֮◌ͥ◌̀◌̕b; a◌֮◌ͥ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0366 0062;00E0 05AE 0366 0315 0062;0061 05AE 0300 0366 0315 0062;00E0 05AE 0366 0315 0062;0061 05AE 0300 0366 0315 0062; # (a◌̕◌̀◌֮◌ͦb; à◌֮◌ͦ◌̕b; a◌֮◌̀◌ͦ◌̕b; à◌֮◌ͦ◌̕b; a◌֮◌̀◌ͦ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER O, LATIN SMALL LETTER B +0061 0366 0315 0300 05AE 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062; # (a◌ͦ◌̕◌̀◌֮b; a◌֮◌ͦ◌̀◌̕b; a◌֮◌ͦ◌̀◌̕b; a◌֮◌ͦ◌̀◌̕b; a◌֮◌ͦ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER O, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0367 0062;00E0 05AE 0367 0315 0062;0061 05AE 0300 0367 0315 0062;00E0 05AE 0367 0315 0062;0061 05AE 0300 0367 0315 0062; # (a◌̕◌̀◌֮◌ͧb; à◌֮◌ͧ◌̕b; a◌֮◌̀◌ͧ◌̕b; à◌֮◌ͧ◌̕b; a◌֮◌̀◌ͧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER U, LATIN SMALL LETTER B +0061 0367 0315 0300 05AE 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062; # (a◌ͧ◌̕◌̀◌֮b; a◌֮◌ͧ◌̀◌̕b; a◌֮◌ͧ◌̀◌̕b; a◌֮◌ͧ◌̀◌̕b; a◌֮◌ͧ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER U, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0368 0062;00E0 05AE 0368 0315 0062;0061 05AE 0300 0368 0315 0062;00E0 05AE 0368 0315 0062;0061 05AE 0300 0368 0315 0062; # (a◌̕◌̀◌֮◌ͨb; à◌֮◌ͨ◌̕b; a◌֮◌̀◌ͨ◌̕b; à◌֮◌ͨ◌̕b; a◌֮◌̀◌ͨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER C, LATIN SMALL LETTER B +0061 0368 0315 0300 05AE 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062; # (a◌ͨ◌̕◌̀◌֮b; a◌֮◌ͨ◌̀◌̕b; a◌֮◌ͨ◌̀◌̕b; a◌֮◌ͨ◌̀◌̕b; a◌֮◌ͨ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER C, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0369 0062;00E0 05AE 0369 0315 0062;0061 05AE 0300 0369 0315 0062;00E0 05AE 0369 0315 0062;0061 05AE 0300 0369 0315 0062; # (a◌̕◌̀◌֮◌ͩb; à◌֮◌ͩ◌̕b; a◌֮◌̀◌ͩ◌̕b; à◌֮◌ͩ◌̕b; a◌֮◌̀◌ͩ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER D, LATIN SMALL LETTER B +0061 0369 0315 0300 05AE 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062; # (a◌ͩ◌̕◌̀◌֮b; a◌֮◌ͩ◌̀◌̕b; a◌֮◌ͩ◌̀◌̕b; a◌֮◌ͩ◌̀◌̕b; a◌֮◌ͩ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER D, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036A 0062;00E0 05AE 036A 0315 0062;0061 05AE 0300 036A 0315 0062;00E0 05AE 036A 0315 0062;0061 05AE 0300 036A 0315 0062; # (a◌̕◌̀◌֮◌ͪb; à◌֮◌ͪ◌̕b; a◌֮◌̀◌ͪ◌̕b; à◌֮◌ͪ◌̕b; a◌֮◌̀◌ͪ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER H, LATIN SMALL LETTER B +0061 036A 0315 0300 05AE 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062; # (a◌ͪ◌̕◌̀◌֮b; a◌֮◌ͪ◌̀◌̕b; a◌֮◌ͪ◌̀◌̕b; a◌֮◌ͪ◌̀◌̕b; a◌֮◌ͪ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER H, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036B 0062;00E0 05AE 036B 0315 0062;0061 05AE 0300 036B 0315 0062;00E0 05AE 036B 0315 0062;0061 05AE 0300 036B 0315 0062; # (a◌̕◌̀◌֮◌ͫb; à◌֮◌ͫ◌̕b; a◌֮◌̀◌ͫ◌̕b; à◌֮◌ͫ◌̕b; a◌֮◌̀◌ͫ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER M, LATIN SMALL LETTER B +0061 036B 0315 0300 05AE 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062; # (a◌ͫ◌̕◌̀◌֮b; a◌֮◌ͫ◌̀◌̕b; a◌֮◌ͫ◌̀◌̕b; a◌֮◌ͫ◌̀◌̕b; a◌֮◌ͫ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER M, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036C 0062;00E0 05AE 036C 0315 0062;0061 05AE 0300 036C 0315 0062;00E0 05AE 036C 0315 0062;0061 05AE 0300 036C 0315 0062; # (a◌̕◌̀◌֮◌ͬb; à◌֮◌ͬ◌̕b; a◌֮◌̀◌ͬ◌̕b; à◌֮◌ͬ◌̕b; a◌֮◌̀◌ͬ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER R, LATIN SMALL LETTER B +0061 036C 0315 0300 05AE 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062; # (a◌ͬ◌̕◌̀◌֮b; a◌֮◌ͬ◌̀◌̕b; a◌֮◌ͬ◌̀◌̕b; a◌֮◌ͬ◌̀◌̕b; a◌֮◌ͬ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER R, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036D 0062;00E0 05AE 036D 0315 0062;0061 05AE 0300 036D 0315 0062;00E0 05AE 036D 0315 0062;0061 05AE 0300 036D 0315 0062; # (a◌̕◌̀◌֮◌ͭb; à◌֮◌ͭ◌̕b; a◌֮◌̀◌ͭ◌̕b; à◌֮◌ͭ◌̕b; a◌֮◌̀◌ͭ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER T, LATIN SMALL LETTER B +0061 036D 0315 0300 05AE 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062; # (a◌ͭ◌̕◌̀◌֮b; a◌֮◌ͭ◌̀◌̕b; a◌֮◌ͭ◌̀◌̕b; a◌֮◌ͭ◌̀◌̕b; a◌֮◌ͭ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER T, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036E 0062;00E0 05AE 036E 0315 0062;0061 05AE 0300 036E 0315 0062;00E0 05AE 036E 0315 0062;0061 05AE 0300 036E 0315 0062; # (a◌̕◌̀◌֮◌ͮb; à◌֮◌ͮ◌̕b; a◌֮◌̀◌ͮ◌̕b; à◌֮◌ͮ◌̕b; a◌֮◌̀◌ͮ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER V, LATIN SMALL LETTER B +0061 036E 0315 0300 05AE 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062; # (a◌ͮ◌̕◌̀◌֮b; a◌֮◌ͮ◌̀◌̕b; a◌֮◌ͮ◌̀◌̕b; a◌֮◌ͮ◌̀◌̕b; a◌֮◌ͮ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER V, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036F 0062;00E0 05AE 036F 0315 0062;0061 05AE 0300 036F 0315 0062;00E0 05AE 036F 0315 0062;0061 05AE 0300 036F 0315 0062; # (a◌̕◌̀◌֮◌ͯb; à◌֮◌ͯ◌̕b; a◌֮◌̀◌ͯ◌̕b; à◌֮◌ͯ◌̕b; a◌֮◌̀◌ͯ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER X, LATIN SMALL LETTER B +0061 036F 0315 0300 05AE 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062; # (a◌ͯ◌̕◌̀◌֮b; a◌֮◌ͯ◌̀◌̕b; a◌֮◌ͯ◌̀◌̕b; a◌֮◌ͯ◌̀◌̕b; a◌֮◌ͯ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER X, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0483 0062;00E0 05AE 0483 0315 0062;0061 05AE 0300 0483 0315 0062;00E0 05AE 0483 0315 0062;0061 05AE 0300 0483 0315 0062; # (a◌̕◌̀◌֮◌҃b; à◌֮◌҃◌̕b; a◌֮◌̀◌҃◌̕b; à◌֮◌҃◌̕b; a◌֮◌̀◌҃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO, LATIN SMALL LETTER B +0061 0483 0315 0300 05AE 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062; # (a◌҃◌̕◌̀◌֮b; a◌֮◌҃◌̀◌̕b; a◌֮◌҃◌̀◌̕b; a◌֮◌҃◌̀◌̕b; a◌֮◌҃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0484 0062;00E0 05AE 0484 0315 0062;0061 05AE 0300 0484 0315 0062;00E0 05AE 0484 0315 0062;0061 05AE 0300 0484 0315 0062; # (a◌̕◌̀◌֮◌҄b; à◌֮◌҄◌̕b; a◌֮◌̀◌҄◌̕b; à◌֮◌҄◌̕b; a◌֮◌̀◌҄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC PALATALIZATION, LATIN SMALL LETTER B +0061 0484 0315 0300 05AE 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062; # (a◌҄◌̕◌̀◌֮b; a◌֮◌҄◌̀◌̕b; a◌֮◌҄◌̀◌̕b; a◌֮◌҄◌̀◌̕b; a◌֮◌҄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PALATALIZATION, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0485 0062;00E0 05AE 0485 0315 0062;0061 05AE 0300 0485 0315 0062;00E0 05AE 0485 0315 0062;0061 05AE 0300 0485 0315 0062; # (a◌̕◌̀◌֮◌҅b; à◌֮◌҅◌̕b; a◌֮◌̀◌҅◌̕b; à◌֮◌҅◌̕b; a◌֮◌̀◌҅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC DASIA PNEUMATA, LATIN SMALL LETTER B +0061 0485 0315 0300 05AE 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062; # (a◌҅◌̕◌̀◌֮b; a◌֮◌҅◌̀◌̕b; a◌֮◌҅◌̀◌̕b; a◌֮◌҅◌̀◌̕b; a◌֮◌҅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC DASIA PNEUMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0486 0062;00E0 05AE 0486 0315 0062;0061 05AE 0300 0486 0315 0062;00E0 05AE 0486 0315 0062;0061 05AE 0300 0486 0315 0062; # (a◌̕◌̀◌֮◌҆b; à◌֮◌҆◌̕b; a◌֮◌̀◌҆◌̕b; à◌֮◌҆◌̕b; a◌֮◌̀◌҆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC PSILI PNEUMATA, LATIN SMALL LETTER B +0061 0486 0315 0300 05AE 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062; # (a◌҆◌̕◌̀◌֮b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0591 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062; # (a◌֚◌̖◌〪◌֑b; a◌〪◌̖◌֑◌֚b; a◌〪◌̖◌֑◌֚b; a◌〪◌̖◌֑◌֚b; a◌〪◌̖◌֑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT ETNAHTA, LATIN SMALL LETTER B +0061 0591 059A 0316 302A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062; # (a◌֑◌֚◌̖◌〪b; a◌〪◌֑◌̖◌֚b; a◌〪◌֑◌̖◌֚b; a◌〪◌֑◌̖◌֚b; a◌〪◌֑◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ETNAHTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0592 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062; # (a◌̕◌̀◌֮◌֒b; à◌֮◌֒◌̕b; a◌֮◌̀◌֒◌̕b; à◌֮◌֒◌̕b; a◌֮◌̀◌֒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT SEGOL, LATIN SMALL LETTER B +0061 0592 0315 0300 05AE 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062; # (a◌֒◌̕◌̀◌֮b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT SEGOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0593 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062; # (a◌̕◌̀◌֮◌֓b; à◌֮◌֓◌̕b; a◌֮◌̀◌֓◌̕b; à◌֮◌֓◌̕b; a◌֮◌̀◌֓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT SHALSHELET, LATIN SMALL LETTER B +0061 0593 0315 0300 05AE 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062; # (a◌֓◌̕◌̀◌֮b; a◌֮◌֓◌̀◌̕b; a◌֮◌֓◌̀◌̕b; a◌֮◌֓◌̀◌̕b; a◌֮◌֓◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT SHALSHELET, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0594 0062;00E0 05AE 0594 0315 0062;0061 05AE 0300 0594 0315 0062;00E0 05AE 0594 0315 0062;0061 05AE 0300 0594 0315 0062; # (a◌̕◌̀◌֮◌֔b; à◌֮◌֔◌̕b; a◌֮◌̀◌֔◌̕b; à◌֮◌֔◌̕b; a◌֮◌̀◌֔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZAQEF QATAN, LATIN SMALL LETTER B +0061 0594 0315 0300 05AE 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062; # (a◌֔◌̕◌̀◌֮b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZAQEF QATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0595 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062; # (a◌̕◌̀◌֮◌֕b; à◌֮◌֕◌̕b; a◌֮◌̀◌֕◌̕b; à◌֮◌֕◌̕b; a◌֮◌̀◌֕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZAQEF GADOL, LATIN SMALL LETTER B +0061 0595 0315 0300 05AE 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062; # (a◌֕◌̕◌̀◌֮b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZAQEF GADOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0596 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062; # (a◌֚◌̖◌〪◌֖b; a◌〪◌̖◌֖◌֚b; a◌〪◌̖◌֖◌֚b; a◌〪◌̖◌֖◌֚b; a◌〪◌̖◌֖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT TIPEHA, LATIN SMALL LETTER B +0061 0596 059A 0316 302A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062; # (a◌֖◌֚◌̖◌〪b; a◌〪◌֖◌̖◌֚b; a◌〪◌֖◌̖◌֚b; a◌〪◌֖◌̖◌֚b; a◌〪◌֖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TIPEHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0597 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062; # (a◌̕◌̀◌֮◌֗b; à◌֮◌֗◌̕b; a◌֮◌̀◌֗◌̕b; à◌֮◌֗◌̕b; a◌֮◌̀◌֗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT REVIA, LATIN SMALL LETTER B +0061 0597 0315 0300 05AE 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062; # (a◌֗◌̕◌̀◌֮b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT REVIA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0598 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062; # (a◌̕◌̀◌֮◌֘b; à◌֮◌֘◌̕b; a◌֮◌̀◌֘◌̕b; à◌֮◌֘◌̕b; a◌֮◌̀◌֘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZARQA, LATIN SMALL LETTER B +0061 0598 0315 0300 05AE 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062; # (a◌֘◌̕◌̀◌֮b; a◌֮◌֘◌̀◌̕b; a◌֮◌֘◌̀◌̕b; a◌֮◌֘◌̀◌̕b; a◌֮◌֘◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZARQA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0599 0062;00E0 05AE 0599 0315 0062;0061 05AE 0300 0599 0315 0062;00E0 05AE 0599 0315 0062;0061 05AE 0300 0599 0315 0062; # (a◌̕◌̀◌֮◌֙b; à◌֮◌֙◌̕b; a◌֮◌̀◌֙◌̕b; à◌֮◌֙◌̕b; a◌֮◌̀◌֙◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT PASHTA, LATIN SMALL LETTER B +0061 0599 0315 0300 05AE 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062; # (a◌֙◌̕◌̀◌֮b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT PASHTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 302E 059A 0316 059A 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062; # (a◌〮◌֚◌̖◌֚b; a◌̖◌֚◌֚◌〮b; a◌̖◌֚◌֚◌〮b; a◌̖◌֚◌֚◌〮b; a◌̖◌֚◌֚◌〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, LATIN SMALL LETTER B +0061 059A 302E 059A 0316 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062; # (a◌֚◌〮◌֚◌̖b; a◌̖◌֚◌֚◌〮b; a◌̖◌֚◌֚◌〮b; a◌̖◌֚◌֚◌〮b; a◌̖◌֚◌֚◌〮b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 059A 0316 302A 059B 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062; # (a◌֚◌̖◌〪◌֛b; a◌〪◌̖◌֛◌֚b; a◌〪◌̖◌֛◌֚b; a◌〪◌̖◌֛◌֚b; a◌〪◌̖◌֛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT TEVIR, LATIN SMALL LETTER B +0061 059B 059A 0316 302A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062; # (a◌֛◌֚◌̖◌〪b; a◌〪◌֛◌̖◌֚b; a◌〪◌֛◌̖◌֚b; a◌〪◌֛◌̖◌֚b; a◌〪◌֛◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TEVIR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 059C 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062; # (a◌̕◌̀◌֮◌֜b; à◌֮◌֜◌̕b; a◌֮◌̀◌֜◌̕b; à◌֮◌֜◌̕b; a◌֮◌̀◌֜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERESH, LATIN SMALL LETTER B +0061 059C 0315 0300 05AE 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062; # (a◌֜◌̕◌̀◌֮b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERESH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 059D 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062; # (a◌̕◌̀◌֮◌֝b; à◌֮◌֝◌̕b; a◌֮◌̀◌֝◌̕b; à◌֮◌֝◌̕b; a◌֮◌̀◌֝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERESH MUQDAM, LATIN SMALL LETTER B +0061 059D 0315 0300 05AE 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062; # (a◌֝◌̕◌̀◌֮b; a◌֮◌֝◌̀◌̕b; a◌֮◌֝◌̀◌̕b; a◌֮◌֝◌̀◌̕b; a◌֮◌֝◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERESH MUQDAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 059E 0062;00E0 05AE 059E 0315 0062;0061 05AE 0300 059E 0315 0062;00E0 05AE 059E 0315 0062;0061 05AE 0300 059E 0315 0062; # (a◌̕◌̀◌֮◌֞b; à◌֮◌֞◌̕b; a◌֮◌̀◌֞◌̕b; à◌֮◌֞◌̕b; a◌֮◌̀◌֞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERSHAYIM, LATIN SMALL LETTER B +0061 059E 0315 0300 05AE 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062; # (a◌֞◌̕◌̀◌֮b; a◌֮◌֞◌̀◌̕b; a◌֮◌֞◌̀◌̕b; a◌֮◌֞◌̀◌̕b; a◌֮◌֞◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERSHAYIM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 059F 0062;00E0 05AE 059F 0315 0062;0061 05AE 0300 059F 0315 0062;00E0 05AE 059F 0315 0062;0061 05AE 0300 059F 0315 0062; # (a◌̕◌̀◌֮◌֟b; à◌֮◌֟◌̕b; a◌֮◌̀◌֟◌̕b; à◌֮◌֟◌̕b; a◌֮◌̀◌֟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT QARNEY PARA, LATIN SMALL LETTER B +0061 059F 0315 0300 05AE 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062; # (a◌֟◌̕◌̀◌֮b; a◌֮◌֟◌̀◌̕b; a◌֮◌֟◌̀◌̕b; a◌֮◌֟◌̀◌̕b; a◌֮◌֟◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT QARNEY PARA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A0 0062;00E0 05AE 05A0 0315 0062;0061 05AE 0300 05A0 0315 0062;00E0 05AE 05A0 0315 0062;0061 05AE 0300 05A0 0315 0062; # (a◌̕◌̀◌֮◌֠b; à◌֮◌֠◌̕b; a◌֮◌̀◌֠◌̕b; à◌֮◌֠◌̕b; a◌֮◌̀◌֠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT TELISHA GEDOLA, LATIN SMALL LETTER B +0061 05A0 0315 0300 05AE 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062; # (a◌֠◌̕◌̀◌֮b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT TELISHA GEDOLA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A1 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062; # (a◌̕◌̀◌֮◌֡b; à◌֮◌֡◌̕b; a◌֮◌̀◌֡◌̕b; à◌֮◌֡◌̕b; a◌֮◌̀◌֡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT PAZER, LATIN SMALL LETTER B +0061 05A1 0315 0300 05AE 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062; # (a◌֡◌̕◌̀◌֮b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT PAZER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 05A3 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062; # (a◌֚◌̖◌〪◌֣b; a◌〪◌̖◌֣◌֚b; a◌〪◌̖◌֣◌֚b; a◌〪◌̖◌֣◌֚b; a◌〪◌̖◌֣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MUNAH, LATIN SMALL LETTER B +0061 05A3 059A 0316 302A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062; # (a◌֣◌֚◌̖◌〪b; a◌〪◌֣◌̖◌֚b; a◌〪◌֣◌̖◌֚b; a◌〪◌֣◌̖◌֚b; a◌〪◌֣◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MUNAH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 05A4 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062; # (a◌֚◌̖◌〪◌֤b; a◌〪◌̖◌֤◌֚b; a◌〪◌̖◌֤◌֚b; a◌〪◌̖◌֤◌֚b; a◌〪◌̖◌֤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MAHAPAKH, LATIN SMALL LETTER B +0061 05A4 059A 0316 302A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062; # (a◌֤◌֚◌̖◌〪b; a◌〪◌֤◌̖◌֚b; a◌〪◌֤◌̖◌֚b; a◌〪◌֤◌̖◌֚b; a◌〪◌֤◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MAHAPAKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 05A5 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062; # (a◌֚◌̖◌〪◌֥b; a◌〪◌̖◌֥◌֚b; a◌〪◌̖◌֥◌֚b; a◌〪◌̖◌֥◌֚b; a◌〪◌̖◌֥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MERKHA, LATIN SMALL LETTER B +0061 05A5 059A 0316 302A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062; # (a◌֥◌֚◌̖◌〪b; a◌〪◌֥◌̖◌֚b; a◌〪◌֥◌̖◌֚b; a◌〪◌֥◌̖◌֚b; a◌〪◌֥◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 05A6 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062; # (a◌֚◌̖◌〪◌֦b; a◌〪◌̖◌֦◌֚b; a◌〪◌̖◌֦◌֚b; a◌〪◌̖◌֦◌֚b; a◌〪◌̖◌֦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MERKHA KEFULA, LATIN SMALL LETTER B +0061 05A6 059A 0316 302A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062; # (a◌֦◌֚◌̖◌〪b; a◌〪◌֦◌̖◌֚b; a◌〪◌֦◌̖◌֚b; a◌〪◌֦◌̖◌֚b; a◌〪◌֦◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA KEFULA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 05A7 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062; # (a◌֚◌̖◌〪◌֧b; a◌〪◌̖◌֧◌֚b; a◌〪◌̖◌֧◌֚b; a◌〪◌̖◌֧◌֚b; a◌〪◌̖◌֧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT DARGA, LATIN SMALL LETTER B +0061 05A7 059A 0316 302A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062; # (a◌֧◌֚◌̖◌〪b; a◌〪◌֧◌̖◌֚b; a◌〪◌֧◌̖◌֚b; a◌〪◌֧◌̖◌֚b; a◌〪◌֧◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT DARGA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A8 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062; # (a◌̕◌̀◌֮◌֨b; à◌֮◌֨◌̕b; a◌֮◌̀◌֨◌̕b; à◌֮◌֨◌̕b; a◌֮◌̀◌֨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT QADMA, LATIN SMALL LETTER B +0061 05A8 0315 0300 05AE 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062; # (a◌֨◌̕◌̀◌֮b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT QADMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A9 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062; # (a◌̕◌̀◌֮◌֩b; à◌֮◌֩◌̕b; a◌֮◌̀◌֩◌̕b; à◌֮◌֩◌̕b; a◌֮◌̀◌֩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT TELISHA QETANA, LATIN SMALL LETTER B +0061 05A9 0315 0300 05AE 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062; # (a◌֩◌̕◌̀◌֮b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT TELISHA QETANA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 05AA 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062; # (a◌֚◌̖◌〪◌֪b; a◌〪◌̖◌֪◌֚b; a◌〪◌̖◌֪◌֚b; a◌〪◌̖◌֪◌֚b; a◌〪◌̖◌֪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT YERAH BEN YOMO, LATIN SMALL LETTER B +0061 05AA 059A 0316 302A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062; # (a◌֪◌֚◌̖◌〪b; a◌〪◌֪◌̖◌֚b; a◌〪◌֪◌̖◌֚b; a◌〪◌֪◌̖◌֚b; a◌〪◌֪◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YERAH BEN YOMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 05AB 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062; # (a◌̕◌̀◌֮◌֫b; à◌֮◌֫◌̕b; a◌֮◌̀◌֫◌̕b; à◌֮◌֫◌̕b; a◌֮◌̀◌֫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT OLE, LATIN SMALL LETTER B +0061 05AB 0315 0300 05AE 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062; # (a◌֫◌̕◌̀◌֮b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT OLE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05AC 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062; # (a◌̕◌̀◌֮◌֬b; à◌֮◌֬◌̕b; a◌֮◌̀◌֬◌̕b; à◌֮◌֬◌̕b; a◌֮◌̀◌֬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ILUY, LATIN SMALL LETTER B +0061 05AC 0315 0300 05AE 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062; # (a◌֬◌̕◌̀◌֮b; a◌֮◌֬◌̀◌̕b; a◌֮◌֬◌̀◌̕b; a◌֮◌֬◌̀◌̕b; a◌֮◌֬◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ILUY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 302E 059A 0316 05AD 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062; # (a◌〮◌֚◌̖◌֭b; a◌̖◌֚◌֭◌〮b; a◌̖◌֚◌֭◌〮b; a◌̖◌֚◌֭◌〮b; a◌̖◌֚◌֭◌〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT DEHI, LATIN SMALL LETTER B +0061 05AD 302E 059A 0316 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062; # (a◌֭◌〮◌֚◌̖b; a◌̖◌֭◌֚◌〮b; a◌̖◌֭◌֚◌〮b; a◌̖◌֭◌֚◌〮b; a◌̖◌֭◌֚◌〮b; ) LATIN SMALL LETTER A, HEBREW ACCENT DEHI, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 05AE 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062; # (a◌̀◌𝅭𝅭֮◌֮b; à𝅭𝅭◌֮◌֮b; a𝅭𝅭◌֮◌֮◌̀b; à𝅭𝅭◌֮◌֮b; a𝅭𝅭◌֮◌֮◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05AE 0300 05AE 1D16D 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062; # (a◌֮◌̀◌𝅭𝅭֮b; à𝅭𝅭◌֮◌֮b; a𝅭𝅭◌֮◌֮◌̀b; à𝅭𝅭◌֮◌֮b; a𝅭𝅭◌֮◌֮◌̀b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZINOR, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE 05AF 0062;00E0 05AE 05AF 0315 0062;0061 05AE 0300 05AF 0315 0062;00E0 05AE 05AF 0315 0062;0061 05AE 0300 05AF 0315 0062; # (a◌̕◌̀◌֮◌֯b; à◌֮◌֯◌̕b; a◌֮◌̀◌֯◌̕b; à◌֮◌֯◌̕b; a◌֮◌̀◌֯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW MARK MASORA CIRCLE, LATIN SMALL LETTER B +0061 05AF 0315 0300 05AE 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062; # (a◌֯◌̕◌̀◌֮b; a◌֮◌֯◌̀◌̕b; a◌֮◌֯◌̀◌̕b; a◌֮◌֯◌̀◌̕b; a◌֮◌֯◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW MARK MASORA CIRCLE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B1 05B0 094D 05B0 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062; # (a◌ֱ◌ְ◌्◌ְb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, HEBREW POINT SHEVA, LATIN SMALL LETTER B +0061 05B0 05B1 05B0 094D 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062; # (a◌ְ◌ֱ◌ְ◌्b; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, LATIN SMALL LETTER B +0061 05B2 05B1 05B0 05B1 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062; # (a◌ֲ◌ֱ◌ְ◌ֱb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, HEBREW POINT HATAF SEGOL, LATIN SMALL LETTER B +0061 05B1 05B2 05B1 05B0 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062; # (a◌ֱ◌ֲ◌ֱ◌ְb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF SEGOL, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, LATIN SMALL LETTER B +0061 05B3 05B2 05B1 05B2 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062; # (a◌ֳ◌ֲ◌ֱ◌ֲb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, HEBREW POINT HATAF PATAH, LATIN SMALL LETTER B +0061 05B2 05B3 05B2 05B1 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062; # (a◌ֲ◌ֳ◌ֲ◌ֱb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, LATIN SMALL LETTER B +0061 05B4 05B3 05B2 05B3 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062; # (a◌ִ◌ֳ◌ֲ◌ֳb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; ) LATIN SMALL LETTER A, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF QAMATS, LATIN SMALL LETTER B +0061 05B3 05B4 05B3 05B2 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062; # (a◌ֳ◌ִ◌ֳ◌ֲb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF QAMATS, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, LATIN SMALL LETTER B +0061 05B5 05B4 05B3 05B4 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062; # (a◌ֵ◌ִ◌ֳ◌ִb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; ) LATIN SMALL LETTER A, HEBREW POINT TSERE, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, HEBREW POINT HIRIQ, LATIN SMALL LETTER B +0061 05B4 05B5 05B4 05B3 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062; # (a◌ִ◌ֵ◌ִ◌ֳb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; ) LATIN SMALL LETTER A, HEBREW POINT HIRIQ, HEBREW POINT TSERE, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, LATIN SMALL LETTER B +0061 05B6 05B5 05B4 05B5 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062; # (a◌ֶ◌ֵ◌ִ◌ֵb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; ) LATIN SMALL LETTER A, HEBREW POINT SEGOL, HEBREW POINT TSERE, HEBREW POINT HIRIQ, HEBREW POINT TSERE, LATIN SMALL LETTER B +0061 05B5 05B6 05B5 05B4 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062; # (a◌ֵ◌ֶ◌ֵ◌ִb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; ) LATIN SMALL LETTER A, HEBREW POINT TSERE, HEBREW POINT SEGOL, HEBREW POINT TSERE, HEBREW POINT HIRIQ, LATIN SMALL LETTER B +0061 05B7 05B6 05B5 05B6 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062; # (a◌ַ◌ֶ◌ֵ◌ֶb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; ) LATIN SMALL LETTER A, HEBREW POINT PATAH, HEBREW POINT SEGOL, HEBREW POINT TSERE, HEBREW POINT SEGOL, LATIN SMALL LETTER B +0061 05B6 05B7 05B6 05B5 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062; # (a◌ֶ◌ַ◌ֶ◌ֵb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; ) LATIN SMALL LETTER A, HEBREW POINT SEGOL, HEBREW POINT PATAH, HEBREW POINT SEGOL, HEBREW POINT TSERE, LATIN SMALL LETTER B +0061 05B8 05B7 05B6 05B7 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062; # (a◌ָ◌ַ◌ֶ◌ַb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; ) LATIN SMALL LETTER A, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT SEGOL, HEBREW POINT PATAH, LATIN SMALL LETTER B +0061 05B7 05B8 05B7 05B6 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062; # (a◌ַ◌ָ◌ַ◌ֶb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; ) LATIN SMALL LETTER A, HEBREW POINT PATAH, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT SEGOL, LATIN SMALL LETTER B +0061 05B9 05B8 05B7 05B8 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062; # (a◌ֹ◌ָ◌ַ◌ָb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT QAMATS, LATIN SMALL LETTER B +0061 05B8 05B9 05B8 05B7 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062; # (a◌ָ◌ֹ◌ָ◌ַb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT QAMATS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, LATIN SMALL LETTER B +0061 05BB 05B9 05B8 05B9 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062; # (a◌ֻ◌ֹ◌ָ◌ֹb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; ) LATIN SMALL LETTER A, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT HOLAM, LATIN SMALL LETTER B +0061 05B9 05BB 05B9 05B8 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062; # (a◌ֹ◌ֻ◌ֹ◌ָb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, LATIN SMALL LETTER B +0061 05BC 05BB 05B9 05BB 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062; # (a◌ּ◌ֻ◌ֹ◌ֻb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; ) LATIN SMALL LETTER A, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QUBUTS, LATIN SMALL LETTER B +0061 05BB 05BC 05BB 05B9 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062; # (a◌ֻ◌ּ◌ֻ◌ֹb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; ) LATIN SMALL LETTER A, HEBREW POINT QUBUTS, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, LATIN SMALL LETTER B +0061 05BD 05BC 05BB 05BC 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062; # (a◌ֽ◌ּ◌ֻ◌ּb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; ) LATIN SMALL LETTER A, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, HEBREW POINT DAGESH OR MAPIQ, LATIN SMALL LETTER B +0061 05BC 05BD 05BC 05BB 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062; # (a◌ּ◌ֽ◌ּ◌ֻb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; ) LATIN SMALL LETTER A, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, LATIN SMALL LETTER B +0061 05BF 05BD 05BC 05BD 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062; # (a◌ֿ◌ֽ◌ּ◌ֽb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; ) LATIN SMALL LETTER A, HEBREW POINT RAFE, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT METEG, LATIN SMALL LETTER B +0061 05BD 05BF 05BD 05BC 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062; # (a◌ֽ◌ֿ◌ֽ◌ּb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; ) LATIN SMALL LETTER A, HEBREW POINT METEG, HEBREW POINT RAFE, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, LATIN SMALL LETTER B +0061 05C1 05BF 05BD 05BF 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062; # (a◌ׁ◌ֿ◌ֽ◌ֿb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; ) LATIN SMALL LETTER A, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, HEBREW POINT METEG, HEBREW POINT RAFE, LATIN SMALL LETTER B +0061 05BF 05C1 05BF 05BD 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062; # (a◌ֿ◌ׁ◌ֿ◌ֽb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; ) LATIN SMALL LETTER A, HEBREW POINT RAFE, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, HEBREW POINT METEG, LATIN SMALL LETTER B +0061 05C2 05C1 05BF 05C1 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062; # (a◌ׂ◌ׁ◌ֿ◌ׁb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; ) LATIN SMALL LETTER A, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, HEBREW POINT SHIN DOT, LATIN SMALL LETTER B +0061 05C1 05C2 05C1 05BF 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062; # (a◌ׁ◌ׂ◌ׁ◌ֿb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; ) LATIN SMALL LETTER A, HEBREW POINT SHIN DOT, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, LATIN SMALL LETTER B +0061 FB1E 05C2 05C1 05C2 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062; # (a◌ﬞ◌ׂ◌ׁ◌ׂb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; ) LATIN SMALL LETTER A, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, HEBREW POINT SIN DOT, LATIN SMALL LETTER B +0061 05C2 FB1E 05C2 05C1 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062; # (a◌ׂ◌ﬞ◌ׂ◌ׁb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; ) LATIN SMALL LETTER A, HEBREW POINT SIN DOT, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE 05C4 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062; # (a◌̕◌̀◌֮◌ׄb; à◌֮◌ׄ◌̕b; a◌֮◌̀◌ׄ◌̕b; à◌֮◌ׄ◌̕b; a◌֮◌̀◌ׄ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW MARK UPPER DOT, LATIN SMALL LETTER B +0061 05C4 0315 0300 05AE 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062; # (a◌ׄ◌̕◌̀◌֮b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW MARK UPPER DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 064C 064B FB1E 064B 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062; # (a◌ٌ◌ً◌ﬞ◌ًb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; ) LATIN SMALL LETTER A, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, ARABIC FATHATAN, LATIN SMALL LETTER B +0061 064B 064C 064B FB1E 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062; # (a◌ً◌ٌ◌ً◌ﬞb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; ) LATIN SMALL LETTER A, ARABIC FATHATAN, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, LATIN SMALL LETTER B +0061 064D 064C 064B 064C 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062; # (a◌ٍ◌ٌ◌ً◌ٌb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; ) LATIN SMALL LETTER A, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, ARABIC DAMMATAN, LATIN SMALL LETTER B +0061 064C 064D 064C 064B 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062; # (a◌ٌ◌ٍ◌ٌ◌ًb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; ) LATIN SMALL LETTER A, ARABIC DAMMATAN, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, LATIN SMALL LETTER B +0061 064E 064D 064C 064D 0062;0061 064C 064D 064D 064E 0062;0061 064C 064D 064D 064E 0062;0061 064C 064D 064D 064E 0062;0061 064C 064D 064D 064E 0062; # (a◌َ◌ٍ◌ٌ◌ٍb; a◌ٌ◌ٍ◌ٍ◌َb; a◌ٌ◌ٍ◌ٍ◌َb; a◌ٌ◌ٍ◌ٍ◌َb; a◌ٌ◌ٍ◌ٍ◌َb; ) LATIN SMALL LETTER A, ARABIC FATHA, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC KASRATAN, LATIN SMALL LETTER B +0061 064D 064E 064D 064C 0062;0061 064C 064D 064D 064E 0062;0061 064C 064D 064D 064E 0062;0061 064C 064D 064D 064E 0062;0061 064C 064D 064D 064E 0062; # (a◌ٍ◌َ◌ٍ◌ٌb; a◌ٌ◌ٍ◌ٍ◌َb; a◌ٌ◌ٍ◌ٍ◌َb; a◌ٌ◌ٍ◌ٍ◌َb; a◌ٌ◌ٍ◌ٍ◌َb; ) LATIN SMALL LETTER A, ARABIC KASRATAN, ARABIC FATHA, ARABIC KASRATAN, ARABIC DAMMATAN, LATIN SMALL LETTER B +0061 064F 064E 064D 064E 0062;0061 064D 064E 064E 064F 0062;0061 064D 064E 064E 064F 0062;0061 064D 064E 064E 064F 0062;0061 064D 064E 064E 064F 0062; # (a◌ُ◌َ◌ٍ◌َb; a◌ٍ◌َ◌َ◌ُb; a◌ٍ◌َ◌َ◌ُb; a◌ٍ◌َ◌َ◌ُb; a◌ٍ◌َ◌َ◌ُb; ) LATIN SMALL LETTER A, ARABIC DAMMA, ARABIC FATHA, ARABIC KASRATAN, ARABIC FATHA, LATIN SMALL LETTER B +0061 064E 064F 064E 064D 0062;0061 064D 064E 064E 064F 0062;0061 064D 064E 064E 064F 0062;0061 064D 064E 064E 064F 0062;0061 064D 064E 064E 064F 0062; # (a◌َ◌ُ◌َ◌ٍb; a◌ٍ◌َ◌َ◌ُb; a◌ٍ◌َ◌َ◌ُb; a◌ٍ◌َ◌َ◌ُb; a◌ٍ◌َ◌َ◌ُb; ) LATIN SMALL LETTER A, ARABIC FATHA, ARABIC DAMMA, ARABIC FATHA, ARABIC KASRATAN, LATIN SMALL LETTER B +0061 0650 064F 064E 064F 0062;0061 064E 064F 064F 0650 0062;0061 064E 064F 064F 0650 0062;0061 064E 064F 064F 0650 0062;0061 064E 064F 064F 0650 0062; # (a◌ِ◌ُ◌َ◌ُb; a◌َ◌ُ◌ُ◌ِb; a◌َ◌ُ◌ُ◌ِb; a◌َ◌ُ◌ُ◌ِb; a◌َ◌ُ◌ُ◌ِb; ) LATIN SMALL LETTER A, ARABIC KASRA, ARABIC DAMMA, ARABIC FATHA, ARABIC DAMMA, LATIN SMALL LETTER B +0061 064F 0650 064F 064E 0062;0061 064E 064F 064F 0650 0062;0061 064E 064F 064F 0650 0062;0061 064E 064F 064F 0650 0062;0061 064E 064F 064F 0650 0062; # (a◌ُ◌ِ◌ُ◌َb; a◌َ◌ُ◌ُ◌ِb; a◌َ◌ُ◌ُ◌ِb; a◌َ◌ُ◌ُ◌ِb; a◌َ◌ُ◌ُ◌ِb; ) LATIN SMALL LETTER A, ARABIC DAMMA, ARABIC KASRA, ARABIC DAMMA, ARABIC FATHA, LATIN SMALL LETTER B +0061 0651 0650 064F 0650 0062;0061 064F 0650 0650 0651 0062;0061 064F 0650 0650 0651 0062;0061 064F 0650 0650 0651 0062;0061 064F 0650 0650 0651 0062; # (a◌ّ◌ِ◌ُ◌ِb; a◌ُ◌ِ◌ِ◌ّb; a◌ُ◌ِ◌ِ◌ّb; a◌ُ◌ِ◌ِ◌ّb; a◌ُ◌ِ◌ِ◌ّb; ) LATIN SMALL LETTER A, ARABIC SHADDA, ARABIC KASRA, ARABIC DAMMA, ARABIC KASRA, LATIN SMALL LETTER B +0061 0650 0651 0650 064F 0062;0061 064F 0650 0650 0651 0062;0061 064F 0650 0650 0651 0062;0061 064F 0650 0650 0651 0062;0061 064F 0650 0650 0651 0062; # (a◌ِ◌ّ◌ِ◌ُb; a◌ُ◌ِ◌ِ◌ّb; a◌ُ◌ِ◌ِ◌ّb; a◌ُ◌ِ◌ِ◌ّb; a◌ُ◌ِ◌ِ◌ّb; ) LATIN SMALL LETTER A, ARABIC KASRA, ARABIC SHADDA, ARABIC KASRA, ARABIC DAMMA, LATIN SMALL LETTER B +0061 0652 0651 0650 0651 0062;0061 0650 0651 0651 0652 0062;0061 0650 0651 0651 0652 0062;0061 0650 0651 0651 0652 0062;0061 0650 0651 0651 0652 0062; # (a◌ْ◌ّ◌ِ◌ّb; a◌ِ◌ّ◌ّ◌ْb; a◌ِ◌ّ◌ّ◌ْb; a◌ِ◌ّ◌ّ◌ْb; a◌ِ◌ّ◌ّ◌ْb; ) LATIN SMALL LETTER A, ARABIC SUKUN, ARABIC SHADDA, ARABIC KASRA, ARABIC SHADDA, LATIN SMALL LETTER B +0061 0651 0652 0651 0650 0062;0061 0650 0651 0651 0652 0062;0061 0650 0651 0651 0652 0062;0061 0650 0651 0651 0652 0062;0061 0650 0651 0651 0652 0062; # (a◌ّ◌ْ◌ّ◌ِb; a◌ِ◌ّ◌ّ◌ْb; a◌ِ◌ّ◌ّ◌ْb; a◌ِ◌ّ◌ّ◌ْb; a◌ِ◌ّ◌ّ◌ْb; ) LATIN SMALL LETTER A, ARABIC SHADDA, ARABIC SUKUN, ARABIC SHADDA, ARABIC KASRA, LATIN SMALL LETTER B +0061 0670 0652 0651 0652 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062; # (a◌ٰ◌ْ◌ّ◌ْb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; ) LATIN SMALL LETTER A, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC SHADDA, ARABIC SUKUN, LATIN SMALL LETTER B +0061 0652 0670 0652 0651 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062; # (a◌ْ◌ٰ◌ْ◌ّb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; ) LATIN SMALL LETTER A, ARABIC SUKUN, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC SHADDA, LATIN SMALL LETTER B +0061 0315 0300 05AE 0653 0062;00E0 05AE 0653 0315 0062;0061 05AE 0300 0653 0315 0062;00E0 05AE 0653 0315 0062;0061 05AE 0300 0653 0315 0062; # (a◌̕◌̀◌֮◌ٓb; à◌֮◌ٓ◌̕b; a◌֮◌̀◌ٓ◌̕b; à◌֮◌ٓ◌̕b; a◌֮◌̀◌ٓ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MADDAH ABOVE, LATIN SMALL LETTER B +0061 0653 0315 0300 05AE 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062; # (a◌ٓ◌̕◌̀◌֮b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MADDAH ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0654 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062; # (a◌̕◌̀◌֮◌ٔb; à◌֮◌ٔ◌̕b; a◌֮◌̀◌ٔ◌̕b; à◌֮◌ٔ◌̕b; a◌֮◌̀◌ٔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC HAMZA ABOVE, LATIN SMALL LETTER B +0061 0654 0315 0300 05AE 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062; # (a◌ٔ◌̕◌̀◌֮b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC HAMZA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0655 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062; # (a◌֚◌̖◌〪◌ٕb; a◌〪◌̖◌ٕ◌֚b; a◌〪◌̖◌ٕ◌֚b; a◌〪◌̖◌ٕ◌֚b; a◌〪◌̖◌ٕ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC HAMZA BELOW, LATIN SMALL LETTER B +0061 0655 059A 0316 302A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062; # (a◌ٕ◌֚◌̖◌〪b; a◌〪◌ٕ◌̖◌֚b; a◌〪◌ٕ◌̖◌֚b; a◌〪◌ٕ◌̖◌֚b; a◌〪◌ٕ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0711 0670 0652 0670 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062; # (a◌ܑ◌ٰ◌ْ◌ٰb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; ) LATIN SMALL LETTER A, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER B +0061 0670 0711 0670 0652 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062; # (a◌ٰ◌ܑ◌ٰ◌ْb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; ) LATIN SMALL LETTER A, ARABIC LETTER SUPERSCRIPT ALEF, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D6 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062; # (a◌̕◌̀◌֮◌ۖb; à◌֮◌ۖ◌̕b; a◌֮◌̀◌ۖ◌̕b; à◌֮◌ۖ◌̕b; a◌֮◌̀◌ۖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA, LATIN SMALL LETTER B +0061 06D6 0315 0300 05AE 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062; # (a◌ۖ◌̕◌̀◌֮b; a◌֮◌ۖ◌̀◌̕b; a◌֮◌ۖ◌̀◌̕b; a◌֮◌ۖ◌̀◌̕b; a◌֮◌ۖ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D7 0062;00E0 05AE 06D7 0315 0062;0061 05AE 0300 06D7 0315 0062;00E0 05AE 06D7 0315 0062;0061 05AE 0300 06D7 0315 0062; # (a◌̕◌̀◌֮◌ۗb; à◌֮◌ۗ◌̕b; a◌֮◌̀◌ۗ◌̕b; à◌֮◌ۗ◌̕b; a◌֮◌̀◌ۗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA, LATIN SMALL LETTER B +0061 06D7 0315 0300 05AE 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062; # (a◌ۗ◌̕◌̀◌֮b; a◌֮◌ۗ◌̀◌̕b; a◌֮◌ۗ◌̀◌̕b; a◌֮◌ۗ◌̀◌̕b; a◌֮◌ۗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D8 0062;00E0 05AE 06D8 0315 0062;0061 05AE 0300 06D8 0315 0062;00E0 05AE 06D8 0315 0062;0061 05AE 0300 06D8 0315 0062; # (a◌̕◌̀◌֮◌ۘb; à◌֮◌ۘ◌̕b; a◌֮◌̀◌ۘ◌̕b; à◌֮◌ۘ◌̕b; a◌֮◌̀◌ۘ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MEEM INITIAL FORM, LATIN SMALL LETTER B +0061 06D8 0315 0300 05AE 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062; # (a◌ۘ◌̕◌̀◌֮b; a◌֮◌ۘ◌̀◌̕b; a◌֮◌ۘ◌̀◌̕b; a◌֮◌ۘ◌̀◌̕b; a◌֮◌ۘ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MEEM INITIAL FORM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D9 0062;00E0 05AE 06D9 0315 0062;0061 05AE 0300 06D9 0315 0062;00E0 05AE 06D9 0315 0062;0061 05AE 0300 06D9 0315 0062; # (a◌̕◌̀◌֮◌ۙb; à◌֮◌ۙ◌̕b; a◌֮◌̀◌ۙ◌̕b; à◌֮◌ۙ◌̕b; a◌֮◌̀◌ۙ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LAM ALEF, LATIN SMALL LETTER B +0061 06D9 0315 0300 05AE 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062; # (a◌ۙ◌̕◌̀◌֮b; a◌֮◌ۙ◌̀◌̕b; a◌֮◌ۙ◌̀◌̕b; a◌֮◌ۙ◌̀◌̕b; a◌֮◌ۙ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LAM ALEF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DA 0062;00E0 05AE 06DA 0315 0062;0061 05AE 0300 06DA 0315 0062;00E0 05AE 06DA 0315 0062;0061 05AE 0300 06DA 0315 0062; # (a◌̕◌̀◌֮◌ۚb; à◌֮◌ۚ◌̕b; a◌֮◌̀◌ۚ◌̕b; à◌֮◌ۚ◌̕b; a◌֮◌̀◌ۚ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH JEEM, LATIN SMALL LETTER B +0061 06DA 0315 0300 05AE 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062; # (a◌ۚ◌̕◌̀◌֮b; a◌֮◌ۚ◌̀◌̕b; a◌֮◌ۚ◌̀◌̕b; a◌֮◌ۚ◌̀◌̕b; a◌֮◌ۚ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH JEEM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DB 0062;00E0 05AE 06DB 0315 0062;0061 05AE 0300 06DB 0315 0062;00E0 05AE 06DB 0315 0062;0061 05AE 0300 06DB 0315 0062; # (a◌̕◌̀◌֮◌ۛb; à◌֮◌ۛ◌̕b; a◌֮◌̀◌ۛ◌̕b; à◌֮◌ۛ◌̕b; a◌֮◌̀◌ۛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER B +0061 06DB 0315 0300 05AE 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062; # (a◌ۛ◌̕◌̀◌֮b; a◌֮◌ۛ◌̀◌̕b; a◌֮◌ۛ◌̀◌̕b; a◌֮◌ۛ◌̀◌̕b; a◌֮◌ۛ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH THREE DOTS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DC 0062;00E0 05AE 06DC 0315 0062;0061 05AE 0300 06DC 0315 0062;00E0 05AE 06DC 0315 0062;0061 05AE 0300 06DC 0315 0062; # (a◌̕◌̀◌֮◌ۜb; à◌֮◌ۜ◌̕b; a◌֮◌̀◌ۜ◌̕b; à◌֮◌ۜ◌̕b; a◌֮◌̀◌ۜ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SEEN, LATIN SMALL LETTER B +0061 06DC 0315 0300 05AE 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062; # (a◌ۜ◌̕◌̀◌֮b; a◌֮◌ۜ◌̀◌̕b; a◌֮◌ۜ◌̀◌̕b; a◌֮◌ۜ◌̀◌̕b; a◌֮◌ۜ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SEEN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DF 0062;00E0 05AE 06DF 0315 0062;0061 05AE 0300 06DF 0315 0062;00E0 05AE 06DF 0315 0062;0061 05AE 0300 06DF 0315 0062; # (a◌̕◌̀◌֮◌۟b; à◌֮◌۟◌̕b; a◌֮◌̀◌۟◌̕b; à◌֮◌۟◌̕b; a◌֮◌̀◌۟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH ROUNDED ZERO, LATIN SMALL LETTER B +0061 06DF 0315 0300 05AE 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062; # (a◌۟◌̕◌̀◌֮b; a◌֮◌۟◌̀◌̕b; a◌֮◌۟◌̀◌̕b; a◌֮◌۟◌̀◌̕b; a◌֮◌۟◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH ROUNDED ZERO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E0 0062;00E0 05AE 06E0 0315 0062;0061 05AE 0300 06E0 0315 0062;00E0 05AE 06E0 0315 0062;0061 05AE 0300 06E0 0315 0062; # (a◌̕◌̀◌֮◌۠b; à◌֮◌۠◌̕b; a◌֮◌̀◌۠◌̕b; à◌֮◌۠◌̕b; a◌֮◌̀◌۠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO, LATIN SMALL LETTER B +0061 06E0 0315 0300 05AE 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062; # (a◌۠◌̕◌̀◌֮b; a◌֮◌۠◌̀◌̕b; a◌֮◌۠◌̀◌̕b; a◌֮◌۠◌̀◌̕b; a◌֮◌۠◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E1 0062;00E0 05AE 06E1 0315 0062;0061 05AE 0300 06E1 0315 0062;00E0 05AE 06E1 0315 0062;0061 05AE 0300 06E1 0315 0062; # (a◌̕◌̀◌֮◌ۡb; à◌֮◌ۡ◌̕b; a◌֮◌̀◌ۡ◌̕b; à◌֮◌ۡ◌̕b; a◌֮◌̀◌ۡ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH DOTLESS HEAD OF KHAH, LATIN SMALL LETTER B +0061 06E1 0315 0300 05AE 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062; # (a◌ۡ◌̕◌̀◌֮b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH DOTLESS HEAD OF KHAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E2 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062; # (a◌̕◌̀◌֮◌ۢb; à◌֮◌ۢ◌̕b; a◌֮◌̀◌ۢ◌̕b; à◌֮◌ۢ◌̕b; a◌֮◌̀◌ۢ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MEEM ISOLATED FORM, LATIN SMALL LETTER B +0061 06E2 0315 0300 05AE 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062; # (a◌ۢ◌̕◌̀◌֮b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MEEM ISOLATED FORM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 06E3 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062; # (a◌֚◌̖◌〪◌ۣb; a◌〪◌̖◌ۣ◌֚b; a◌〪◌̖◌ۣ◌֚b; a◌〪◌̖◌ۣ◌֚b; a◌〪◌̖◌ۣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SMALL LOW SEEN, LATIN SMALL LETTER B +0061 06E3 059A 0316 302A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062; # (a◌ۣ◌֚◌̖◌〪b; a◌〪◌ۣ◌̖◌֚b; a◌〪◌ۣ◌̖◌֚b; a◌〪◌ۣ◌̖◌֚b; a◌〪◌ۣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW SEEN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E4 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062; # (a◌̕◌̀◌֮◌ۤb; à◌֮◌ۤ◌̕b; a◌֮◌̀◌ۤ◌̕b; à◌֮◌ۤ◌̕b; a◌֮◌̀◌ۤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MADDA, LATIN SMALL LETTER B +0061 06E4 0315 0300 05AE 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062; # (a◌ۤ◌̕◌̀◌֮b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E7 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062; # (a◌̕◌̀◌֮◌ۧb; à◌֮◌ۧ◌̕b; a◌֮◌̀◌ۧ◌̕b; à◌֮◌ۧ◌̕b; a◌֮◌̀◌ۧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH YEH, LATIN SMALL LETTER B +0061 06E7 0315 0300 05AE 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062; # (a◌ۧ◌̕◌̀◌֮b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH YEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E8 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062; # (a◌̕◌̀◌֮◌ۨb; à◌֮◌ۨ◌̕b; a◌֮◌̀◌ۨ◌̕b; à◌֮◌ۨ◌̕b; a◌֮◌̀◌ۨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH NOON, LATIN SMALL LETTER B +0061 06E8 0315 0300 05AE 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062; # (a◌ۨ◌̕◌̀◌֮b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH NOON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 06EA 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062; # (a◌֚◌̖◌〪◌۪b; a◌〪◌̖◌۪◌֚b; a◌〪◌̖◌۪◌֚b; a◌〪◌̖◌۪◌֚b; a◌〪◌̖◌۪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC EMPTY CENTRE LOW STOP, LATIN SMALL LETTER B +0061 06EA 059A 0316 302A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062; # (a◌۪◌֚◌̖◌〪b; a◌〪◌۪◌̖◌֚b; a◌〪◌۪◌̖◌֚b; a◌〪◌۪◌̖◌֚b; a◌〪◌۪◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE LOW STOP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 06EB 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062; # (a◌̕◌̀◌֮◌۫b; à◌֮◌۫◌̕b; a◌֮◌̀◌۫◌̕b; à◌֮◌۫◌̕b; a◌֮◌̀◌۫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC EMPTY CENTRE HIGH STOP, LATIN SMALL LETTER B +0061 06EB 0315 0300 05AE 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062; # (a◌۫◌̕◌̀◌֮b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE HIGH STOP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06EC 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062; # (a◌̕◌̀◌֮◌۬b; à◌֮◌۬◌̕b; a◌֮◌̀◌۬◌̕b; à◌֮◌۬◌̕b; a◌֮◌̀◌۬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, LATIN SMALL LETTER B +0061 06EC 0315 0300 05AE 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062; # (a◌۬◌̕◌̀◌֮b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 06ED 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062; # (a◌֚◌̖◌〪◌ۭb; a◌〪◌̖◌ۭ◌֚b; a◌〪◌̖◌ۭ◌֚b; a◌〪◌̖◌ۭ◌֚b; a◌〪◌̖◌ۭ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SMALL LOW MEEM, LATIN SMALL LETTER B +0061 06ED 059A 0316 302A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062; # (a◌ۭ◌֚◌̖◌〪b; a◌〪◌ۭ◌̖◌֚b; a◌〪◌ۭ◌̖◌֚b; a◌〪◌ۭ◌̖◌֚b; a◌〪◌ۭ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW MEEM, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0C55 0711 0670 0711 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062; # (a◌ౕ◌ܑ◌ٰ◌ܑb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; ) LATIN SMALL LETTER A, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, SYRIAC LETTER SUPERSCRIPT ALAPH, LATIN SMALL LETTER B +0061 0711 0C55 0711 0670 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062; # (a◌ܑ◌ౕ◌ܑ◌ٰb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; ) LATIN SMALL LETTER A, SYRIAC LETTER SUPERSCRIPT ALAPH, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER B +0061 0315 0300 05AE 0730 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062; # (a◌̕◌̀◌֮◌ܰb; à◌֮◌ܰ◌̕b; a◌֮◌̀◌ܰ◌̕b; à◌֮◌ܰ◌̕b; a◌֮◌̀◌ܰ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC PTHAHA ABOVE, LATIN SMALL LETTER B +0061 0730 0315 0300 05AE 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062; # (a◌ܰ◌̕◌̀◌֮b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0731 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062; # (a◌֚◌̖◌〪◌ܱb; a◌〪◌̖◌ܱ◌֚b; a◌〪◌̖◌ܱ◌֚b; a◌〪◌̖◌ܱ◌֚b; a◌〪◌̖◌ܱ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC PTHAHA BELOW, LATIN SMALL LETTER B +0061 0731 059A 0316 302A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062; # (a◌ܱ◌֚◌̖◌〪b; a◌〪◌ܱ◌̖◌֚b; a◌〪◌ܱ◌̖◌֚b; a◌〪◌ܱ◌̖◌֚b; a◌〪◌ܱ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0732 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062; # (a◌̕◌̀◌֮◌ܲb; à◌֮◌ܲ◌̕b; a◌֮◌̀◌ܲ◌̕b; à◌֮◌ܲ◌̕b; a◌֮◌̀◌ܲ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC PTHAHA DOTTED, LATIN SMALL LETTER B +0061 0732 0315 0300 05AE 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062; # (a◌ܲ◌̕◌̀◌֮b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA DOTTED, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0733 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062; # (a◌̕◌̀◌֮◌ܳb; à◌֮◌ܳ◌̕b; a◌֮◌̀◌ܳ◌̕b; à◌֮◌ܳ◌̕b; a◌֮◌̀◌ܳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ZQAPHA ABOVE, LATIN SMALL LETTER B +0061 0733 0315 0300 05AE 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062; # (a◌ܳ◌̕◌̀◌֮b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0734 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062; # (a◌֚◌̖◌〪◌ܴb; a◌〪◌̖◌ܴ◌֚b; a◌〪◌̖◌ܴ◌֚b; a◌〪◌̖◌ܴ◌֚b; a◌〪◌̖◌ܴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC ZQAPHA BELOW, LATIN SMALL LETTER B +0061 0734 059A 0316 302A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062; # (a◌ܴ◌֚◌̖◌〪b; a◌〪◌ܴ◌̖◌֚b; a◌〪◌ܴ◌̖◌֚b; a◌〪◌ܴ◌̖◌֚b; a◌〪◌ܴ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0735 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062; # (a◌̕◌̀◌֮◌ܵb; à◌֮◌ܵ◌̕b; a◌֮◌̀◌ܵ◌̕b; à◌֮◌ܵ◌̕b; a◌֮◌̀◌ܵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ZQAPHA DOTTED, LATIN SMALL LETTER B +0061 0735 0315 0300 05AE 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062; # (a◌ܵ◌̕◌̀◌֮b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA DOTTED, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0736 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062; # (a◌̕◌̀◌֮◌ܶb; à◌֮◌ܶ◌̕b; a◌֮◌̀◌ܶ◌̕b; à◌֮◌ܶ◌̕b; a◌֮◌̀◌ܶ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC RBASA ABOVE, LATIN SMALL LETTER B +0061 0736 0315 0300 05AE 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062; # (a◌ܶ◌̕◌̀◌֮b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC RBASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0737 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062; # (a◌֚◌̖◌〪◌ܷb; a◌〪◌̖◌ܷ◌֚b; a◌〪◌̖◌ܷ◌֚b; a◌〪◌̖◌ܷ◌֚b; a◌〪◌̖◌ܷ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC RBASA BELOW, LATIN SMALL LETTER B +0061 0737 059A 0316 302A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062; # (a◌ܷ◌֚◌̖◌〪b; a◌〪◌ܷ◌̖◌֚b; a◌〪◌ܷ◌̖◌֚b; a◌〪◌ܷ◌̖◌֚b; a◌〪◌ܷ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0738 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062; # (a◌֚◌̖◌〪◌ܸb; a◌〪◌̖◌ܸ◌֚b; a◌〪◌̖◌ܸ◌֚b; a◌〪◌̖◌ܸ◌֚b; a◌〪◌̖◌ܸ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC DOTTED ZLAMA HORIZONTAL, LATIN SMALL LETTER B +0061 0738 059A 0316 302A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062; # (a◌ܸ◌֚◌̖◌〪b; a◌〪◌ܸ◌̖◌֚b; a◌〪◌ܸ◌̖◌֚b; a◌〪◌ܸ◌̖◌֚b; a◌〪◌ܸ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA HORIZONTAL, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0739 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062; # (a◌֚◌̖◌〪◌ܹb; a◌〪◌̖◌ܹ◌֚b; a◌〪◌̖◌ܹ◌֚b; a◌〪◌̖◌ܹ◌֚b; a◌〪◌̖◌ܹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC DOTTED ZLAMA ANGULAR, LATIN SMALL LETTER B +0061 0739 059A 0316 302A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062; # (a◌ܹ◌֚◌̖◌〪b; a◌〪◌ܹ◌̖◌֚b; a◌〪◌ܹ◌̖◌֚b; a◌〪◌ܹ◌̖◌֚b; a◌〪◌ܹ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA ANGULAR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 073A 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062; # (a◌̕◌̀◌֮◌ܺb; à◌֮◌ܺ◌̕b; a◌֮◌̀◌ܺ◌̕b; à◌֮◌ܺ◌̕b; a◌֮◌̀◌ܺ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC HBASA ABOVE, LATIN SMALL LETTER B +0061 073A 0315 0300 05AE 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062; # (a◌ܺ◌̕◌̀◌֮b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC HBASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 073B 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062; # (a◌֚◌̖◌〪◌ܻb; a◌〪◌̖◌ܻ◌֚b; a◌〪◌̖◌ܻ◌֚b; a◌〪◌̖◌ܻ◌֚b; a◌〪◌̖◌ܻ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC HBASA BELOW, LATIN SMALL LETTER B +0061 073B 059A 0316 302A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062; # (a◌ܻ◌֚◌̖◌〪b; a◌〪◌ܻ◌̖◌֚b; a◌〪◌ܻ◌̖◌֚b; a◌〪◌ܻ◌̖◌֚b; a◌〪◌ܻ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 073C 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062; # (a◌֚◌̖◌〪◌ܼb; a◌〪◌̖◌ܼ◌֚b; a◌〪◌̖◌ܼ◌֚b; a◌〪◌̖◌ܼ◌֚b; a◌〪◌̖◌ܼ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC HBASA-ESASA DOTTED, LATIN SMALL LETTER B +0061 073C 059A 0316 302A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062; # (a◌ܼ◌֚◌̖◌〪b; a◌〪◌ܼ◌̖◌֚b; a◌〪◌ܼ◌̖◌֚b; a◌〪◌ܼ◌̖◌֚b; a◌〪◌ܼ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA-ESASA DOTTED, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 073D 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062; # (a◌̕◌̀◌֮◌ܽb; à◌֮◌ܽ◌̕b; a◌֮◌̀◌ܽ◌̕b; à◌֮◌ܽ◌̕b; a◌֮◌̀◌ܽ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ESASA ABOVE, LATIN SMALL LETTER B +0061 073D 0315 0300 05AE 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062; # (a◌ܽ◌̕◌̀◌֮b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ESASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 073E 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062; # (a◌֚◌̖◌〪◌ܾb; a◌〪◌̖◌ܾ◌֚b; a◌〪◌̖◌ܾ◌֚b; a◌〪◌̖◌ܾ◌֚b; a◌〪◌̖◌ܾ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC ESASA BELOW, LATIN SMALL LETTER B +0061 073E 059A 0316 302A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062; # (a◌ܾ◌֚◌̖◌〪b; a◌〪◌ܾ◌̖◌֚b; a◌〪◌ܾ◌̖◌֚b; a◌〪◌ܾ◌̖◌֚b; a◌〪◌ܾ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ESASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 073F 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062; # (a◌̕◌̀◌֮◌ܿb; à◌֮◌ܿ◌̕b; a◌֮◌̀◌ܿ◌̕b; à◌֮◌ܿ◌̕b; a◌֮◌̀◌ܿ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC RWAHA, LATIN SMALL LETTER B +0061 073F 0315 0300 05AE 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062; # (a◌ܿ◌̕◌̀◌֮b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC RWAHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0740 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062; # (a◌̕◌̀◌֮◌݀b; à◌֮◌݀◌̕b; a◌֮◌̀◌݀◌̕b; à◌֮◌݀◌̕b; a◌֮◌̀◌݀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC FEMININE DOT, LATIN SMALL LETTER B +0061 0740 0315 0300 05AE 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062; # (a◌݀◌̕◌̀◌֮b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC FEMININE DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0741 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062; # (a◌̕◌̀◌֮◌݁b; à◌֮◌݁◌̕b; a◌֮◌̀◌݁◌̕b; à◌֮◌݁◌̕b; a◌֮◌̀◌݁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC QUSHSHAYA, LATIN SMALL LETTER B +0061 0741 0315 0300 05AE 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062; # (a◌݁◌̕◌̀◌֮b; a◌֮◌݁◌̀◌̕b; a◌֮◌݁◌̀◌̕b; a◌֮◌݁◌̀◌̕b; a◌֮◌݁◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC QUSHSHAYA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0742 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062; # (a◌֚◌̖◌〪◌݂b; a◌〪◌̖◌݂◌֚b; a◌〪◌̖◌݂◌֚b; a◌〪◌̖◌݂◌֚b; a◌〪◌̖◌݂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC RUKKAKHA, LATIN SMALL LETTER B +0061 0742 059A 0316 302A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062; # (a◌݂◌֚◌̖◌〪b; a◌〪◌݂◌̖◌֚b; a◌〪◌݂◌̖◌֚b; a◌〪◌݂◌̖◌֚b; a◌〪◌݂◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RUKKAKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0743 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062; # (a◌̕◌̀◌֮◌݃b; à◌֮◌݃◌̕b; a◌֮◌̀◌݃◌̕b; à◌֮◌݃◌̕b; a◌֮◌̀◌݃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC TWO VERTICAL DOTS ABOVE, LATIN SMALL LETTER B +0061 0743 0315 0300 05AE 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062; # (a◌݃◌̕◌̀◌֮b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0744 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062; # (a◌֚◌̖◌〪◌݄b; a◌〪◌̖◌݄◌֚b; a◌〪◌̖◌݄◌֚b; a◌〪◌̖◌݄◌֚b; a◌〪◌̖◌݄◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC TWO VERTICAL DOTS BELOW, LATIN SMALL LETTER B +0061 0744 059A 0316 302A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062; # (a◌݄◌֚◌̖◌〪b; a◌〪◌݄◌̖◌֚b; a◌〪◌݄◌̖◌֚b; a◌〪◌݄◌̖◌֚b; a◌〪◌݄◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0745 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062; # (a◌̕◌̀◌֮◌݅b; à◌֮◌݅◌̕b; a◌֮◌̀◌݅◌̕b; à◌֮◌݅◌̕b; a◌֮◌̀◌݅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC THREE DOTS ABOVE, LATIN SMALL LETTER B +0061 0745 0315 0300 05AE 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062; # (a◌݅◌̕◌̀◌֮b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0746 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062; # (a◌֚◌̖◌〪◌݆b; a◌〪◌̖◌݆◌֚b; a◌〪◌̖◌݆◌֚b; a◌〪◌̖◌݆◌֚b; a◌〪◌̖◌݆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC THREE DOTS BELOW, LATIN SMALL LETTER B +0061 0746 059A 0316 302A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062; # (a◌݆◌֚◌̖◌〪b; a◌〪◌݆◌̖◌֚b; a◌〪◌݆◌̖◌֚b; a◌〪◌݆◌̖◌֚b; a◌〪◌݆◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0747 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062; # (a◌̕◌̀◌֮◌݇b; à◌֮◌݇◌̕b; a◌֮◌̀◌݇◌̕b; à◌֮◌݇◌̕b; a◌֮◌̀◌݇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC OBLIQUE LINE ABOVE, LATIN SMALL LETTER B +0061 0747 0315 0300 05AE 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062; # (a◌݇◌̕◌̀◌֮b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0748 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062; # (a◌֚◌̖◌〪◌݈b; a◌〪◌̖◌݈◌֚b; a◌〪◌̖◌݈◌֚b; a◌〪◌̖◌݈◌֚b; a◌〪◌̖◌݈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC OBLIQUE LINE BELOW, LATIN SMALL LETTER B +0061 0748 059A 0316 302A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062; # (a◌݈◌֚◌̖◌〪b; a◌〪◌݈◌̖◌֚b; a◌〪◌݈◌̖◌֚b; a◌〪◌݈◌̖◌֚b; a◌〪◌݈◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0749 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062; # (a◌̕◌̀◌֮◌݉b; à◌֮◌݉◌̕b; a◌֮◌̀◌݉◌̕b; à◌֮◌݉◌̕b; a◌֮◌̀◌݉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC MUSIC, LATIN SMALL LETTER B +0061 0749 0315 0300 05AE 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062; # (a◌݉◌̕◌̀◌֮b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC MUSIC, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 074A 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062; # (a◌̕◌̀◌֮◌݊b; à◌֮◌݊◌̕b; a◌֮◌̀◌݊◌̕b; à◌֮◌݊◌̕b; a◌֮◌̀◌݊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC BARREKH, LATIN SMALL LETTER B +0061 074A 0315 0300 05AE 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062; # (a◌݊◌̕◌̀◌֮b; a◌֮◌݊◌̀◌̕b; a◌֮◌݊◌̀◌̕b; a◌֮◌݊◌̀◌̕b; a◌֮◌݊◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC BARREKH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 0334 093C 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062; # (a◌゙◌़◌̴◌़b; a◌̴◌़◌़◌゙b; a◌̴◌़◌़◌゙b; a◌̴◌़◌़◌゙b; a◌̴◌़◌़◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, DEVANAGARI SIGN NUKTA, LATIN SMALL LETTER B +0061 093C 3099 093C 0334 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062;0061 0334 093C 093C 3099 0062; # (a◌़◌゙◌़◌̴b; a◌̴◌़◌़◌゙b; a◌̴◌़◌़◌゙b; a◌̴◌़◌़◌゙b; a◌̴◌़◌़◌゙b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 094D 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062; # (a◌ְ◌्◌゙◌्b; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN VIRAMA, LATIN SMALL LETTER B +0061 094D 05B0 094D 3099 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062; # (a◌्◌ְ◌्◌゙b; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0951 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062; # (a◌̕◌̀◌֮◌॑b; à◌֮◌॑◌̕b; a◌֮◌̀◌॑◌̕b; à◌֮◌॑◌̕b; a◌֮◌̀◌॑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI STRESS SIGN UDATTA, LATIN SMALL LETTER B +0061 0951 0315 0300 05AE 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062; # (a◌॑◌̕◌̀◌֮b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN UDATTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0952 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062; # (a◌֚◌̖◌〪◌॒b; a◌〪◌̖◌॒◌֚b; a◌〪◌̖◌॒◌֚b; a◌〪◌̖◌॒◌֚b; a◌〪◌̖◌॒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, DEVANAGARI STRESS SIGN ANUDATTA, LATIN SMALL LETTER B +0061 0952 059A 0316 302A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062; # (a◌॒◌֚◌̖◌〪b; a◌〪◌॒◌̖◌֚b; a◌〪◌॒◌̖◌֚b; a◌〪◌॒◌̖◌֚b; a◌〪◌॒◌̖◌֚b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0953 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062; # (a◌̕◌̀◌֮◌॓b; à◌֮◌॓◌̕b; a◌֮◌̀◌॓◌̕b; à◌֮◌॓◌̕b; a◌֮◌̀◌॓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI GRAVE ACCENT, LATIN SMALL LETTER B +0061 0953 0315 0300 05AE 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062; # (a◌॓◌̕◌̀◌֮b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0954 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062; # (a◌̕◌̀◌֮◌॔b; à◌֮◌॔◌̕b; a◌֮◌̀◌॔◌̕b; à◌֮◌॔◌̕b; a◌֮◌̀◌॔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI ACUTE ACCENT, LATIN SMALL LETTER B +0061 0954 0315 0300 05AE 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062; # (a◌॔◌̕◌̀◌֮b; a◌֮◌॔◌̀◌̕b; a◌֮◌॔◌̀◌̕b; a◌֮◌॔◌̀◌̕b; a◌֮◌॔◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 0334 09BC 0062;0061 0334 093C 09BC 3099 0062;0061 0334 093C 09BC 3099 0062;0061 0334 093C 09BC 3099 0062;0061 0334 093C 09BC 3099 0062; # (a◌゙◌़◌̴◌়b; a◌̴◌़◌়◌゙b; a◌̴◌़◌়◌゙b; a◌̴◌़◌়◌゙b; a◌̴◌़◌়◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BENGALI SIGN NUKTA, LATIN SMALL LETTER B +0061 09BC 3099 093C 0334 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062;0061 0334 09BC 093C 3099 0062; # (a◌়◌゙◌़◌̴b; a◌̴◌়◌़◌゙b; a◌̴◌়◌़◌゙b; a◌̴◌়◌़◌゙b; a◌̴◌়◌़◌゙b; ) LATIN SMALL LETTER A, BENGALI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 09CD 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062; # (a◌ְ◌्◌゙◌্b; a◌゙◌्◌্◌ְb; a◌゙◌्◌্◌ְb; a◌゙◌्◌্◌ְb; a◌゙◌्◌্◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BENGALI SIGN VIRAMA, LATIN SMALL LETTER B +0061 09CD 05B0 094D 3099 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062; # (a◌্◌ְ◌्◌゙b; a◌゙◌্◌्◌ְb; a◌゙◌্◌्◌ְb; a◌゙◌্◌्◌ְb; a◌゙◌্◌्◌ְb; ) LATIN SMALL LETTER A, BENGALI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 0A3C 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062;0061 0334 093C 0A3C 3099 0062; # (a◌゙◌़◌̴◌਼b; a◌̴◌़◌਼◌゙b; a◌̴◌़◌਼◌゙b; a◌̴◌़◌਼◌゙b; a◌̴◌़◌਼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, GURMUKHI SIGN NUKTA, LATIN SMALL LETTER B +0061 0A3C 3099 093C 0334 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062;0061 0334 0A3C 093C 3099 0062; # (a◌਼◌゙◌़◌̴b; a◌̴◌਼◌़◌゙b; a◌̴◌਼◌़◌゙b; a◌̴◌਼◌़◌゙b; a◌̴◌਼◌़◌゙b; ) LATIN SMALL LETTER A, GURMUKHI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 0A4D 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062; # (a◌ְ◌्◌゙◌੍b; a◌゙◌्◌੍◌ְb; a◌゙◌्◌੍◌ְb; a◌゙◌्◌੍◌ְb; a◌゙◌्◌੍◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GURMUKHI SIGN VIRAMA, LATIN SMALL LETTER B +0061 0A4D 05B0 094D 3099 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062; # (a◌੍◌ְ◌्◌゙b; a◌゙◌੍◌्◌ְb; a◌゙◌੍◌्◌ְb; a◌゙◌੍◌्◌ְb; a◌゙◌੍◌्◌ְb; ) LATIN SMALL LETTER A, GURMUKHI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 0ABC 0062;0061 0334 093C 0ABC 3099 0062;0061 0334 093C 0ABC 3099 0062;0061 0334 093C 0ABC 3099 0062;0061 0334 093C 0ABC 3099 0062; # (a◌゙◌़◌̴◌઼b; a◌̴◌़◌઼◌゙b; a◌̴◌़◌઼◌゙b; a◌̴◌़◌઼◌゙b; a◌̴◌़◌઼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, GUJARATI SIGN NUKTA, LATIN SMALL LETTER B +0061 0ABC 3099 093C 0334 0062;0061 0334 0ABC 093C 3099 0062;0061 0334 0ABC 093C 3099 0062;0061 0334 0ABC 093C 3099 0062;0061 0334 0ABC 093C 3099 0062; # (a◌઼◌゙◌़◌̴b; a◌̴◌઼◌़◌゙b; a◌̴◌઼◌़◌゙b; a◌̴◌઼◌़◌゙b; a◌̴◌઼◌़◌゙b; ) LATIN SMALL LETTER A, GUJARATI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 0ACD 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062; # (a◌ְ◌्◌゙◌્b; a◌゙◌्◌્◌ְb; a◌゙◌्◌્◌ְb; a◌゙◌्◌્◌ְb; a◌゙◌्◌્◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GUJARATI SIGN VIRAMA, LATIN SMALL LETTER B +0061 0ACD 05B0 094D 3099 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062; # (a◌્◌ְ◌्◌゙b; a◌゙◌્◌्◌ְb; a◌゙◌્◌्◌ְb; a◌゙◌્◌्◌ְb; a◌゙◌્◌्◌ְb; ) LATIN SMALL LETTER A, GUJARATI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 0B3C 0062;0061 0334 093C 0B3C 3099 0062;0061 0334 093C 0B3C 3099 0062;0061 0334 093C 0B3C 3099 0062;0061 0334 093C 0B3C 3099 0062; # (a◌゙◌़◌̴◌଼b; a◌̴◌़◌଼◌゙b; a◌̴◌़◌଼◌゙b; a◌̴◌़◌଼◌゙b; a◌̴◌़◌଼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, ORIYA SIGN NUKTA, LATIN SMALL LETTER B +0061 0B3C 3099 093C 0334 0062;0061 0334 0B3C 093C 3099 0062;0061 0334 0B3C 093C 3099 0062;0061 0334 0B3C 093C 3099 0062;0061 0334 0B3C 093C 3099 0062; # (a◌଼◌゙◌़◌̴b; a◌̴◌଼◌़◌゙b; a◌̴◌଼◌़◌゙b; a◌̴◌଼◌़◌゙b; a◌̴◌଼◌़◌゙b; ) LATIN SMALL LETTER A, ORIYA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 0B4D 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062; # (a◌ְ◌्◌゙◌୍b; a◌゙◌्◌୍◌ְb; a◌゙◌्◌୍◌ְb; a◌゙◌्◌୍◌ְb; a◌゙◌्◌୍◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ORIYA SIGN VIRAMA, LATIN SMALL LETTER B +0061 0B4D 05B0 094D 3099 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062; # (a◌୍◌ְ◌्◌゙b; a◌゙◌୍◌्◌ְb; a◌゙◌୍◌्◌ְb; a◌゙◌୍◌्◌ְb; a◌゙◌୍◌्◌ְb; ) LATIN SMALL LETTER A, ORIYA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0BCD 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062; # (a◌ְ◌्◌゙◌்b; a◌゙◌्◌்◌ְb; a◌゙◌्◌்◌ְb; a◌゙◌्◌்◌ְb; a◌゙◌्◌்◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAMIL SIGN VIRAMA, LATIN SMALL LETTER B +0061 0BCD 05B0 094D 3099 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062; # (a◌்◌ְ◌्◌゙b; a◌゙◌்◌्◌ְb; a◌゙◌்◌्◌ְb; a◌゙◌்◌्◌ְb; a◌゙◌்◌्◌ְb; ) LATIN SMALL LETTER A, TAMIL SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0C4D 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062; # (a◌ְ◌्◌゙◌్b; a◌゙◌्◌్◌ְb; a◌゙◌्◌్◌ְb; a◌゙◌्◌్◌ְb; a◌゙◌्◌్◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TELUGU SIGN VIRAMA, LATIN SMALL LETTER B +0061 0C4D 05B0 094D 3099 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062; # (a◌్◌ְ◌्◌゙b; a◌゙◌్◌्◌ְb; a◌゙◌్◌्◌ְb; a◌゙◌్◌्◌ְb; a◌゙◌్◌्◌ְb; ) LATIN SMALL LETTER A, TELUGU SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0C56 0C55 0711 0C55 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062; # (a◌ౖ◌ౕ◌ܑ◌ౕb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; ) LATIN SMALL LETTER A, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, TELUGU LENGTH MARK, LATIN SMALL LETTER B +0061 0C55 0C56 0C55 0711 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062; # (a◌ౕ◌ౖ◌ౕ◌ܑb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; ) LATIN SMALL LETTER A, TELUGU LENGTH MARK, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, LATIN SMALL LETTER B +0061 0E38 0C56 0C55 0C56 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062; # (a◌ุ◌ౖ◌ౕ◌ౖb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; ) LATIN SMALL LETTER A, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, TELUGU AI LENGTH MARK, LATIN SMALL LETTER B +0061 0C56 0E38 0C56 0C55 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062; # (a◌ౖ◌ุ◌ౖ◌ౕb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; ) LATIN SMALL LETTER A, TELUGU AI LENGTH MARK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0CCD 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062; # (a◌ְ◌्◌゙◌್b; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KANNADA SIGN VIRAMA, LATIN SMALL LETTER B +0061 0CCD 05B0 094D 3099 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062; # (a◌್◌ְ◌्◌゙b; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; ) LATIN SMALL LETTER A, KANNADA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0D4D 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062; # (a◌ְ◌्◌゙◌്b; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN VIRAMA, LATIN SMALL LETTER B +0061 0D4D 05B0 094D 3099 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062; # (a◌്◌ְ◌्◌゙b; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0DCA 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062; # (a◌ְ◌्◌゙◌්b; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SINHALA SIGN AL-LAKUNA, LATIN SMALL LETTER B +0061 0DCA 05B0 094D 3099 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062; # (a◌්◌ְ◌्◌゙b; a◌゙◌්◌्◌ְb; a◌゙◌්◌्◌ְb; a◌゙◌්◌्◌ְb; a◌゙◌්◌्◌ְb; ) LATIN SMALL LETTER A, SINHALA SIGN AL-LAKUNA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0E48 0E38 0C56 0E38 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062; # (a◌่◌ุ◌ౖ◌ุb; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0E38 0E48 0E38 0C56 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062; # (a◌ุ◌่◌ุ◌ౖb; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER SARA U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, LATIN SMALL LETTER B +0061 0E48 0E38 0C56 0E39 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062; # (a◌่◌ุ◌ౖ◌ูb; a◌ౖ◌ุ◌ู◌่b; a◌ౖ◌ุ◌ู◌่b; a◌ౖ◌ุ◌ู◌่b; a◌ౖ◌ุ◌ู◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, THAI CHARACTER SARA UU, LATIN SMALL LETTER B +0061 0E39 0E48 0E38 0C56 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062; # (a◌ู◌่◌ุ◌ౖb; a◌ౖ◌ู◌ุ◌่b; a◌ౖ◌ู◌ุ◌่b; a◌ౖ◌ู◌ุ◌่b; a◌ౖ◌ู◌ุ◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER SARA UU, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0E3A 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062; # (a◌ְ◌्◌゙◌ฺb; a◌゙◌्◌ฺ◌ְb; a◌゙◌्◌ฺ◌ְb; a◌゙◌्◌ฺ◌ְb; a◌゙◌्◌ฺ◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, THAI CHARACTER PHINTHU, LATIN SMALL LETTER B +0061 0E3A 05B0 094D 3099 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062; # (a◌ฺ◌ְ◌्◌゙b; a◌゙◌ฺ◌्◌ְb; a◌゙◌ฺ◌्◌ְb; a◌゙◌ฺ◌्◌ְb; a◌゙◌ฺ◌्◌ְb; ) LATIN SMALL LETTER A, THAI CHARACTER PHINTHU, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E48 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062; # (a◌ຸ◌่◌ุ◌่b; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI EK, LATIN SMALL LETTER B +0061 0E48 0EB8 0E48 0E38 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062; # (a◌่◌ຸ◌่◌ุb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E49 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062; # (a◌ຸ◌่◌ุ◌้b; a◌ุ◌่◌้◌ຸb; a◌ุ◌่◌้◌ຸb; a◌ุ◌่◌้◌ຸb; a◌ุ◌่◌้◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI THO, LATIN SMALL LETTER B +0061 0E49 0EB8 0E48 0E38 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062; # (a◌้◌ຸ◌่◌ุb; a◌ุ◌้◌่◌ຸb; a◌ุ◌้◌่◌ຸb; a◌ุ◌้◌่◌ຸb; a◌ุ◌้◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI THO, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E4A 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062; # (a◌ຸ◌่◌ุ◌๊b; a◌ุ◌่◌๊◌ຸb; a◌ุ◌่◌๊◌ຸb; a◌ุ◌่◌๊◌ຸb; a◌ุ◌่◌๊◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI TRI, LATIN SMALL LETTER B +0061 0E4A 0EB8 0E48 0E38 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062; # (a◌๊◌ຸ◌่◌ุb; a◌ุ◌๊◌่◌ຸb; a◌ุ◌๊◌่◌ຸb; a◌ุ◌๊◌่◌ຸb; a◌ุ◌๊◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI TRI, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E4B 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062; # (a◌ຸ◌่◌ุ◌๋b; a◌ุ◌่◌๋◌ຸb; a◌ุ◌่◌๋◌ຸb; a◌ุ◌่◌๋◌ຸb; a◌ุ◌่◌๋◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI CHATTAWA, LATIN SMALL LETTER B +0061 0E4B 0EB8 0E48 0E38 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062; # (a◌๋◌ຸ◌่◌ุb; a◌ุ◌๋◌่◌ຸb; a◌ุ◌๋◌่◌ຸb; a◌ุ◌๋◌่◌ຸb; a◌ุ◌๋◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI CHATTAWA, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EC8 0EB8 0E48 0EB8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062; # (a◌່◌ຸ◌่◌ຸb; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; ) LATIN SMALL LETTER A, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0EB8 0EC8 0EB8 0E48 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062; # (a◌ຸ◌່◌ຸ◌่b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LATIN SMALL LETTER B +0061 0EC8 0EB8 0E48 0EB9 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062; # (a◌່◌ຸ◌่◌ູb; a◌่◌ຸ◌ູ◌່b; a◌่◌ຸ◌ູ◌່b; a◌่◌ຸ◌ູ◌່b; a◌่◌ຸ◌ູ◌່b; ) LATIN SMALL LETTER A, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LAO VOWEL SIGN UU, LATIN SMALL LETTER B +0061 0EB9 0EC8 0EB8 0E48 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062; # (a◌ູ◌່◌ຸ◌่b; a◌่◌ູ◌ຸ◌່b; a◌่◌ູ◌ຸ◌່b; a◌่◌ູ◌ຸ◌່b; a◌่◌ູ◌ຸ◌່b; ) LATIN SMALL LETTER A, LAO VOWEL SIGN UU, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0EC8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062; # (a◌ཱ◌່◌ຸ◌່b; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI EK, LATIN SMALL LETTER B +0061 0EC8 0F71 0EC8 0EB8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062; # (a◌່◌ཱ◌່◌ຸb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI EK, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0EC9 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062; # (a◌ཱ◌່◌ຸ◌້b; a◌ຸ◌່◌້◌ཱb; a◌ຸ◌່◌້◌ཱb; a◌ຸ◌່◌້◌ཱb; a◌ຸ◌່◌້◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI THO, LATIN SMALL LETTER B +0061 0EC9 0F71 0EC8 0EB8 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062; # (a◌້◌ཱ◌່◌ຸb; a◌ຸ◌້◌່◌ཱb; a◌ຸ◌້◌່◌ཱb; a◌ຸ◌້◌່◌ཱb; a◌ຸ◌້◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI THO, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0ECA 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062; # (a◌ཱ◌່◌ຸ◌໊b; a◌ຸ◌່◌໊◌ཱb; a◌ຸ◌່◌໊◌ཱb; a◌ຸ◌່◌໊◌ཱb; a◌ຸ◌່◌໊◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI TI, LATIN SMALL LETTER B +0061 0ECA 0F71 0EC8 0EB8 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062; # (a◌໊◌ཱ◌່◌ຸb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI TI, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0ECB 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062; # (a◌ཱ◌່◌ຸ◌໋b; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI CATAWA, LATIN SMALL LETTER B +0061 0ECB 0F71 0EC8 0EB8 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062; # (a◌໋◌ཱ◌່◌ຸb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI CATAWA, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 059A 0316 302A 0F18 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062; # (a◌֚◌̖◌〪◌༘b; a◌〪◌̖◌༘◌֚b; a◌〪◌̖◌༘◌֚b; a◌〪◌̖◌༘◌֚b; a◌〪◌̖◌༘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, LATIN SMALL LETTER B +0061 0F18 059A 0316 302A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062; # (a◌༘◌֚◌̖◌〪b; a◌〪◌༘◌̖◌֚b; a◌〪◌༘◌̖◌֚b; a◌〪◌༘◌̖◌֚b; a◌〪◌༘◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0F19 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062; # (a◌֚◌̖◌〪◌༙b; a◌〪◌̖◌༙◌֚b; a◌〪◌̖◌༙◌֚b; a◌〪◌̖◌༙◌֚b; a◌〪◌̖◌༙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, LATIN SMALL LETTER B +0061 0F19 059A 0316 302A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062; # (a◌༙◌֚◌̖◌〪b; a◌〪◌༙◌̖◌֚b; a◌〪◌༙◌̖◌֚b; a◌〪◌༙◌̖◌֚b; a◌〪◌༙◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0F35 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062; # (a◌֚◌̖◌〪◌༵b; a◌〪◌̖◌༵◌֚b; a◌〪◌̖◌༵◌֚b; a◌〪◌̖◌༵◌֚b; a◌〪◌̖◌༵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN MARK NGAS BZUNG NYI ZLA, LATIN SMALL LETTER B +0061 0F35 059A 0316 302A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062; # (a◌༵◌֚◌̖◌〪b; a◌〪◌༵◌̖◌֚b; a◌〪◌༵◌̖◌֚b; a◌〪◌༵◌̖◌֚b; a◌〪◌༵◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG NYI ZLA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 0F37 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062; # (a◌֚◌̖◌〪◌༷b; a◌〪◌̖◌༷◌֚b; a◌〪◌̖◌༷◌֚b; a◌〪◌̖◌༷◌֚b; a◌〪◌̖◌༷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN MARK NGAS BZUNG SGOR RTAGS, LATIN SMALL LETTER B +0061 0F37 059A 0316 302A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062; # (a◌༷◌֚◌̖◌〪b; a◌〪◌༷◌̖◌֚b; a◌〪◌༷◌̖◌֚b; a◌〪◌༷◌̖◌֚b; a◌〪◌༷◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG SGOR RTAGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 302A 031B 0321 0F39 0062;0061 0321 031B 0F39 302A 0062;0061 0321 031B 0F39 302A 0062;0061 0321 031B 0F39 302A 0062;0061 0321 031B 0F39 302A 0062; # (a◌〪◌̛◌̡◌༹b; a◌̡◌̛◌༹◌〪b; a◌̡◌̛◌༹◌〪b; a◌̡◌̛◌༹◌〪b; a◌̡◌̛◌༹◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, TIBETAN MARK TSA -PHRU, LATIN SMALL LETTER B +0061 0F39 302A 031B 0321 0062;0061 0321 0F39 031B 302A 0062;0061 0321 0F39 031B 302A 0062;0061 0321 0F39 031B 302A 0062;0061 0321 0F39 031B 302A 0062; # (a◌༹◌〪◌̛◌̡b; a◌̡◌༹◌̛◌〪b; a◌̡◌༹◌̛◌〪b; a◌̡◌༹◌̛◌〪b; a◌̡◌༹◌̛◌〪b; ) LATIN SMALL LETTER A, TIBETAN MARK TSA -PHRU, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 0F72 0F71 0EC8 0F71 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062; # (a◌ི◌ཱ◌່◌ཱb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F71 0F72 0F71 0EC8 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062; # (a◌ཱ◌ི◌ཱ◌່b; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F72 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062; # (a◌ུ◌ི◌ཱ◌ིb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN I, LATIN SMALL LETTER B +0061 0F72 0F74 0F72 0F71 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062; # (a◌ི◌ུ◌ི◌ཱb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0321 0F74 0F72 0F74 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062; # (a◌̡◌ུ◌ི◌ུb; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; ) LATIN SMALL LETTER A, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F74 0321 0F74 0F72 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062; # (a◌ུ◌̡◌ུ◌ིb; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7A 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062; # (a◌ུ◌ི◌ཱ◌ེb; a◌ཱ◌ི◌ེ◌ུb; a◌ཱ◌ི◌ེ◌ུb; a◌ཱ◌ི◌ེ◌ུb; a◌ཱ◌ི◌ེ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN E, LATIN SMALL LETTER B +0061 0F7A 0F74 0F72 0F71 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062; # (a◌ེ◌ུ◌ི◌ཱb; a◌ཱ◌ེ◌ི◌ུb; a◌ཱ◌ེ◌ི◌ུb; a◌ཱ◌ེ◌ི◌ུb; a◌ཱ◌ེ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN E, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7B 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062; # (a◌ུ◌ི◌ཱ◌ཻb; a◌ཱ◌ི◌ཻ◌ུb; a◌ཱ◌ི◌ཻ◌ུb; a◌ཱ◌ི◌ཻ◌ུb; a◌ཱ◌ི◌ཻ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN EE, LATIN SMALL LETTER B +0061 0F7B 0F74 0F72 0F71 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062; # (a◌ཻ◌ུ◌ི◌ཱb; a◌ཱ◌ཻ◌ི◌ུb; a◌ཱ◌ཻ◌ི◌ུb; a◌ཱ◌ཻ◌ི◌ུb; a◌ཱ◌ཻ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN EE, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7C 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062; # (a◌ུ◌ི◌ཱ◌ོb; a◌ཱ◌ི◌ོ◌ུb; a◌ཱ◌ི◌ོ◌ུb; a◌ཱ◌ི◌ོ◌ུb; a◌ཱ◌ི◌ོ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN O, LATIN SMALL LETTER B +0061 0F7C 0F74 0F72 0F71 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062; # (a◌ོ◌ུ◌ི◌ཱb; a◌ཱ◌ོ◌ི◌ུb; a◌ཱ◌ོ◌ི◌ུb; a◌ཱ◌ོ◌ི◌ུb; a◌ཱ◌ོ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN O, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7D 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062; # (a◌ུ◌ི◌ཱ◌ཽb; a◌ཱ◌ི◌ཽ◌ུb; a◌ཱ◌ི◌ཽ◌ུb; a◌ཱ◌ི◌ཽ◌ུb; a◌ཱ◌ི◌ཽ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN OO, LATIN SMALL LETTER B +0061 0F7D 0F74 0F72 0F71 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062; # (a◌ཽ◌ུ◌ི◌ཱb; a◌ཱ◌ཽ◌ི◌ུb; a◌ཱ◌ཽ◌ི◌ུb; a◌ཱ◌ཽ◌ི◌ུb; a◌ཱ◌ཽ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN OO, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F80 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062; # (a◌ུ◌ི◌ཱ◌ྀb; a◌ཱ◌ི◌ྀ◌ུb; a◌ཱ◌ི◌ྀ◌ུb; a◌ཱ◌ི◌ྀ◌ུb; a◌ཱ◌ི◌ྀ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I, LATIN SMALL LETTER B +0061 0F80 0F74 0F72 0F71 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062; # (a◌ྀ◌ུ◌ི◌ཱb; a◌ཱ◌ྀ◌ི◌ུb; a◌ཱ◌ྀ◌ི◌ུb; a◌ཱ◌ྀ◌ི◌ུb; a◌ཱ◌ྀ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN REVERSED I, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F82 0062;00E0 05AE 0F82 0315 0062;0061 05AE 0300 0F82 0315 0062;00E0 05AE 0F82 0315 0062;0061 05AE 0300 0F82 0315 0062; # (a◌̕◌̀◌֮◌ྂb; à◌֮◌ྂ◌̕b; a◌֮◌̀◌ྂ◌̕b; à◌֮◌ྂ◌̕b; a◌֮◌̀◌ྂ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN NYI ZLA NAA DA, LATIN SMALL LETTER B +0061 0F82 0315 0300 05AE 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062; # (a◌ྂ◌̕◌̀◌֮b; a◌֮◌ྂ◌̀◌̕b; a◌֮◌ྂ◌̀◌̕b; a◌֮◌ྂ◌̀◌̕b; a◌֮◌ྂ◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN NYI ZLA NAA DA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F83 0062;00E0 05AE 0F83 0315 0062;0061 05AE 0300 0F83 0315 0062;00E0 05AE 0F83 0315 0062;0061 05AE 0300 0F83 0315 0062; # (a◌̕◌̀◌֮◌ྃb; à◌֮◌ྃ◌̕b; a◌֮◌̀◌ྃ◌̕b; à◌֮◌ྃ◌̕b; a◌֮◌̀◌ྃ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN SNA LDAN, LATIN SMALL LETTER B +0061 0F83 0315 0300 05AE 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062; # (a◌ྃ◌̕◌̀◌֮b; a◌֮◌ྃ◌̀◌̕b; a◌֮◌ྃ◌̀◌̕b; a◌֮◌ྃ◌̀◌̕b; a◌֮◌ྃ◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN SNA LDAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 0F84 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062; # (a◌ְ◌्◌゙◌྄b; a◌゙◌्◌྄◌ְb; a◌゙◌्◌྄◌ְb; a◌゙◌्◌྄◌ְb; a◌゙◌्◌྄◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TIBETAN MARK HALANTA, LATIN SMALL LETTER B +0061 0F84 05B0 094D 3099 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062; # (a◌྄◌ְ◌्◌゙b; a◌゙◌྄◌्◌ְb; a◌゙◌྄◌्◌ְb; a◌゙◌྄◌्◌ְb; a◌゙◌྄◌्◌ְb; ) LATIN SMALL LETTER A, TIBETAN MARK HALANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F86 0062;00E0 05AE 0F86 0315 0062;0061 05AE 0300 0F86 0315 0062;00E0 05AE 0F86 0315 0062;0061 05AE 0300 0F86 0315 0062; # (a◌̕◌̀◌֮◌྆b; à◌֮◌྆◌̕b; a◌֮◌̀◌྆◌̕b; à◌֮◌྆◌̕b; a◌֮◌̀◌྆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN LCI RTAGS, LATIN SMALL LETTER B +0061 0F86 0315 0300 05AE 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062; # (a◌྆◌̕◌̀◌֮b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN LCI RTAGS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F87 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062; # (a◌̕◌̀◌֮◌྇b; à◌֮◌྇◌̕b; a◌֮◌̀◌྇◌̕b; à◌֮◌྇◌̕b; a◌֮◌̀◌྇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN YANG RTAGS, LATIN SMALL LETTER B +0061 0F87 0315 0300 05AE 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062; # (a◌྇◌̕◌̀◌֮b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN YANG RTAGS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 0FC6 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062; # (a◌֚◌̖◌〪◌࿆b; a◌〪◌̖◌࿆◌֚b; a◌〪◌̖◌࿆◌֚b; a◌〪◌̖◌࿆◌֚b; a◌〪◌̖◌࿆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN SYMBOL PADMA GDAN, LATIN SMALL LETTER B +0061 0FC6 059A 0316 302A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062; # (a◌࿆◌֚◌̖◌〪b; a◌〪◌࿆◌̖◌֚b; a◌〪◌࿆◌̖◌֚b; a◌〪◌࿆◌̖◌֚b; a◌〪◌࿆◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN SYMBOL PADMA GDAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 1037 0062;0061 0334 093C 1037 3099 0062;0061 0334 093C 1037 3099 0062;0061 0334 093C 1037 3099 0062;0061 0334 093C 1037 3099 0062; # (a◌゙◌़◌̴◌့b; a◌̴◌़◌့◌゙b; a◌̴◌़◌့◌゙b; a◌̴◌़◌့◌゙b; a◌̴◌़◌့◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, MYANMAR SIGN DOT BELOW, LATIN SMALL LETTER B +0061 1037 3099 093C 0334 0062;0061 0334 1037 093C 3099 0062;0061 0334 1037 093C 3099 0062;0061 0334 1037 093C 3099 0062;0061 0334 1037 093C 3099 0062; # (a◌့◌゙◌़◌̴b; a◌̴◌့◌़◌゙b; a◌̴◌့◌़◌゙b; a◌̴◌့◌़◌゙b; a◌̴◌့◌़◌゙b; ) LATIN SMALL LETTER A, MYANMAR SIGN DOT BELOW, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 1039 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062; # (a◌ְ◌्◌゙◌္b; a◌゙◌्◌္◌ְb; a◌゙◌्◌္◌ְb; a◌゙◌्◌္◌ְb; a◌゙◌्◌္◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MYANMAR SIGN VIRAMA, LATIN SMALL LETTER B +0061 1039 05B0 094D 3099 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062; # (a◌္◌ְ◌्◌゙b; a◌゙◌္◌्◌ְb; a◌゙◌္◌्◌ְb; a◌゙◌္◌्◌ְb; a◌゙◌္◌्◌ְb; ) LATIN SMALL LETTER A, MYANMAR SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1714 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062; # (a◌ְ◌्◌゙◌᜔b; a◌゙◌्◌᜔◌ְb; a◌゙◌्◌᜔◌ְb; a◌゙◌्◌᜔◌ְb; a◌゙◌्◌᜔◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAGALOG SIGN VIRAMA, LATIN SMALL LETTER B +0061 1714 05B0 094D 3099 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062; # (a◌᜔◌ְ◌्◌゙b; a◌゙◌᜔◌्◌ְb; a◌゙◌᜔◌्◌ְb; a◌゙◌᜔◌्◌ְb; a◌゙◌᜔◌्◌ְb; ) LATIN SMALL LETTER A, TAGALOG SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1734 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062; # (a◌ְ◌्◌゙◌᜴b; a◌゙◌्◌᜴◌ְb; a◌゙◌्◌᜴◌ְb; a◌゙◌्◌᜴◌ְb; a◌゙◌्◌᜴◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, HANUNOO SIGN PAMUDPOD, LATIN SMALL LETTER B +0061 1734 05B0 094D 3099 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062; # (a◌᜴◌ְ◌्◌゙b; a◌゙◌᜴◌्◌ְb; a◌゙◌᜴◌्◌ְb; a◌゙◌᜴◌्◌ְb; a◌゙◌᜴◌्◌ְb; ) LATIN SMALL LETTER A, HANUNOO SIGN PAMUDPOD, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 17D2 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062; # (a◌ְ◌्◌゙◌្b; a◌゙◌्◌្◌ְb; a◌゙◌्◌្◌ְb; a◌゙◌्◌្◌ְb; a◌゙◌्◌្◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHMER SIGN COENG, LATIN SMALL LETTER B +0061 17D2 05B0 094D 3099 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062; # (a◌្◌ְ◌्◌゙b; a◌゙◌្◌्◌ְb; a◌゙◌្◌्◌ְb; a◌゙◌្◌्◌ְb; a◌゙◌្◌्◌ְb; ) LATIN SMALL LETTER A, KHMER SIGN COENG, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 18A9 0062;00E0 1D16D 05AE 18A9 0062;0061 1D16D 05AE 18A9 0300 0062;00E0 1D16D 05AE 18A9 0062;0061 1D16D 05AE 18A9 0300 0062; # (a◌̀◌𝅭𝅭֮◌ᢩb; à𝅭𝅭◌֮◌ᢩb; a𝅭𝅭◌֮◌ᢩ◌̀b; à𝅭𝅭◌֮◌ᢩb; a𝅭𝅭◌֮◌ᢩ◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, MONGOLIAN LETTER ALI GALI DAGALGA, LATIN SMALL LETTER B +0061 18A9 0300 05AE 1D16D 0062;00E0 1D16D 18A9 05AE 0062;0061 1D16D 18A9 05AE 0300 0062;00E0 1D16D 18A9 05AE 0062;0061 1D16D 18A9 05AE 0300 0062; # (a◌ᢩ◌̀◌𝅭𝅭֮b; à𝅭𝅭◌ᢩ◌֮b; a𝅭𝅭◌ᢩ◌֮◌̀b; à𝅭𝅭◌ᢩ◌֮b; a𝅭𝅭◌ᢩ◌֮◌̀b; ) LATIN SMALL LETTER A, MONGOLIAN LETTER ALI GALI DAGALGA, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D0 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062; # (a◌̕◌̀◌֮◌⃐b; à◌֮◌⃐◌̕b; a◌֮◌̀◌⃐◌̕b; à◌֮◌⃐◌̕b; a◌֮◌̀◌⃐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT HARPOON ABOVE, LATIN SMALL LETTER B +0061 20D0 0315 0300 05AE 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062; # (a◌⃐◌̕◌̀◌֮b; a◌֮◌⃐◌̀◌̕b; a◌֮◌⃐◌̀◌̕b; a◌֮◌⃐◌̀◌̕b; a◌֮◌⃐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT HARPOON ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D1 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062; # (a◌̕◌̀◌֮◌⃑b; à◌֮◌⃑◌̕b; a◌֮◌̀◌⃑◌̕b; à◌֮◌⃑◌̕b; a◌֮◌̀◌⃑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT HARPOON ABOVE, LATIN SMALL LETTER B +0061 20D1 0315 0300 05AE 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062; # (a◌⃑◌̕◌̀◌֮b; a◌֮◌⃑◌̀◌̕b; a◌֮◌⃑◌̀◌̕b; a◌֮◌⃑◌̀◌̕b; a◌֮◌⃑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT HARPOON ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 093C 0334 20D2 0062;0061 0334 20D2 093C 0062;0061 0334 20D2 093C 0062;0061 0334 20D2 093C 0062;0061 0334 20D2 093C 0062; # (a◌़◌̴◌⃒b; a◌̴◌⃒◌़b; a◌̴◌⃒◌़b; a◌̴◌⃒◌़b; a◌̴◌⃒◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING LONG VERTICAL LINE OVERLAY, LATIN SMALL LETTER B +0061 20D2 093C 0334 0062;0061 20D2 0334 093C 0062;0061 20D2 0334 093C 0062;0061 20D2 0334 093C 0062;0061 20D2 0334 093C 0062; # (a◌⃒◌़◌̴b; a◌⃒◌̴◌़b; a◌⃒◌̴◌़b; a◌⃒◌̴◌़b; a◌⃒◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING LONG VERTICAL LINE OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 20D3 0062;0061 0334 20D3 093C 0062;0061 0334 20D3 093C 0062;0061 0334 20D3 093C 0062;0061 0334 20D3 093C 0062; # (a◌़◌̴◌⃓b; a◌̴◌⃓◌़b; a◌̴◌⃓◌़b; a◌̴◌⃓◌़b; a◌̴◌⃓◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING SHORT VERTICAL LINE OVERLAY, LATIN SMALL LETTER B +0061 20D3 093C 0334 0062;0061 20D3 0334 093C 0062;0061 20D3 0334 093C 0062;0061 20D3 0334 093C 0062;0061 20D3 0334 093C 0062; # (a◌⃓◌़◌̴b; a◌⃓◌̴◌़b; a◌⃓◌̴◌़b; a◌⃓◌̴◌़b; a◌⃓◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING SHORT VERTICAL LINE OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D4 0062;00E0 05AE 20D4 0315 0062;0061 05AE 0300 20D4 0315 0062;00E0 05AE 20D4 0315 0062;0061 05AE 0300 20D4 0315 0062; # (a◌̕◌̀◌֮◌⃔b; à◌֮◌⃔◌̕b; a◌֮◌̀◌⃔◌̕b; à◌֮◌⃔◌̕b; a◌֮◌̀◌⃔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ANTICLOCKWISE ARROW ABOVE, LATIN SMALL LETTER B +0061 20D4 0315 0300 05AE 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062; # (a◌⃔◌̕◌̀◌֮b; a◌֮◌⃔◌̀◌̕b; a◌֮◌⃔◌̀◌̕b; a◌֮◌⃔◌̀◌̕b; a◌֮◌⃔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ANTICLOCKWISE ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D5 0062;00E0 05AE 20D5 0315 0062;0061 05AE 0300 20D5 0315 0062;00E0 05AE 20D5 0315 0062;0061 05AE 0300 20D5 0315 0062; # (a◌̕◌̀◌֮◌⃕b; à◌֮◌⃕◌̕b; a◌֮◌̀◌⃕◌̕b; à◌֮◌⃕◌̕b; a◌֮◌̀◌⃕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CLOCKWISE ARROW ABOVE, LATIN SMALL LETTER B +0061 20D5 0315 0300 05AE 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062; # (a◌⃕◌̕◌̀◌֮b; a◌֮◌⃕◌̀◌̕b; a◌֮◌⃕◌̀◌̕b; a◌֮◌⃕◌̀◌̕b; a◌֮◌⃕◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CLOCKWISE ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D6 0062;00E0 05AE 20D6 0315 0062;0061 05AE 0300 20D6 0315 0062;00E0 05AE 20D6 0315 0062;0061 05AE 0300 20D6 0315 0062; # (a◌̕◌̀◌֮◌⃖b; à◌֮◌⃖◌̕b; a◌֮◌̀◌⃖◌̕b; à◌֮◌⃖◌̕b; a◌֮◌̀◌⃖◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT ARROW ABOVE, LATIN SMALL LETTER B +0061 20D6 0315 0300 05AE 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062; # (a◌⃖◌̕◌̀◌֮b; a◌֮◌⃖◌̀◌̕b; a◌֮◌⃖◌̀◌̕b; a◌֮◌⃖◌̀◌̕b; a◌֮◌⃖◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D7 0062;00E0 05AE 20D7 0315 0062;0061 05AE 0300 20D7 0315 0062;00E0 05AE 20D7 0315 0062;0061 05AE 0300 20D7 0315 0062; # (a◌̕◌̀◌֮◌⃗b; à◌֮◌⃗◌̕b; a◌֮◌̀◌⃗◌̕b; à◌֮◌⃗◌̕b; a◌֮◌̀◌⃗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT ARROW ABOVE, LATIN SMALL LETTER B +0061 20D7 0315 0300 05AE 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062; # (a◌⃗◌̕◌̀◌֮b; a◌֮◌⃗◌̀◌̕b; a◌֮◌⃗◌̀◌̕b; a◌֮◌⃗◌̀◌̕b; a◌֮◌⃗◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 093C 0334 20D8 0062;0061 0334 20D8 093C 0062;0061 0334 20D8 093C 0062;0061 0334 20D8 093C 0062;0061 0334 20D8 093C 0062; # (a◌़◌̴◌⃘b; a◌̴◌⃘◌़b; a◌̴◌⃘◌़b; a◌̴◌⃘◌़b; a◌̴◌⃘◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING RING OVERLAY, LATIN SMALL LETTER B +0061 20D8 093C 0334 0062;0061 20D8 0334 093C 0062;0061 20D8 0334 093C 0062;0061 20D8 0334 093C 0062;0061 20D8 0334 093C 0062; # (a◌⃘◌़◌̴b; a◌⃘◌̴◌़b; a◌⃘◌̴◌़b; a◌⃘◌̴◌़b; a◌⃘◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING RING OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 20D9 0062;0061 0334 20D9 093C 0062;0061 0334 20D9 093C 0062;0061 0334 20D9 093C 0062;0061 0334 20D9 093C 0062; # (a◌़◌̴◌⃙b; a◌̴◌⃙◌़b; a◌̴◌⃙◌़b; a◌̴◌⃙◌़b; a◌̴◌⃙◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING CLOCKWISE RING OVERLAY, LATIN SMALL LETTER B +0061 20D9 093C 0334 0062;0061 20D9 0334 093C 0062;0061 20D9 0334 093C 0062;0061 20D9 0334 093C 0062;0061 20D9 0334 093C 0062; # (a◌⃙◌़◌̴b; a◌⃙◌̴◌़b; a◌⃙◌̴◌़b; a◌⃙◌̴◌़b; a◌⃙◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING CLOCKWISE RING OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 20DA 0062;0061 0334 20DA 093C 0062;0061 0334 20DA 093C 0062;0061 0334 20DA 093C 0062;0061 0334 20DA 093C 0062; # (a◌़◌̴◌⃚b; a◌̴◌⃚◌़b; a◌̴◌⃚◌़b; a◌̴◌⃚◌़b; a◌̴◌⃚◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING ANTICLOCKWISE RING OVERLAY, LATIN SMALL LETTER B +0061 20DA 093C 0334 0062;0061 20DA 0334 093C 0062;0061 20DA 0334 093C 0062;0061 20DA 0334 093C 0062;0061 20DA 0334 093C 0062; # (a◌⃚◌़◌̴b; a◌⃚◌̴◌़b; a◌⃚◌̴◌़b; a◌⃚◌̴◌़b; a◌⃚◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING ANTICLOCKWISE RING OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 20DB 0062;00E0 05AE 20DB 0315 0062;0061 05AE 0300 20DB 0315 0062;00E0 05AE 20DB 0315 0062;0061 05AE 0300 20DB 0315 0062; # (a◌̕◌̀◌֮◌⃛b; à◌֮◌⃛◌̕b; a◌֮◌̀◌⃛◌̕b; à◌֮◌⃛◌̕b; a◌֮◌̀◌⃛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING THREE DOTS ABOVE, LATIN SMALL LETTER B +0061 20DB 0315 0300 05AE 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062; # (a◌⃛◌̕◌̀◌֮b; a◌֮◌⃛◌̀◌̕b; a◌֮◌⃛◌̀◌̕b; a◌֮◌⃛◌̀◌̕b; a◌֮◌⃛◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING THREE DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20DC 0062;00E0 05AE 20DC 0315 0062;0061 05AE 0300 20DC 0315 0062;00E0 05AE 20DC 0315 0062;0061 05AE 0300 20DC 0315 0062; # (a◌̕◌̀◌֮◌⃜b; à◌֮◌⃜◌̕b; a◌֮◌̀◌⃜◌̕b; à◌֮◌⃜◌̕b; a◌֮◌̀◌⃜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING FOUR DOTS ABOVE, LATIN SMALL LETTER B +0061 20DC 0315 0300 05AE 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062; # (a◌⃜◌̕◌̀◌֮b; a◌֮◌⃜◌̀◌̕b; a◌֮◌⃜◌̀◌̕b; a◌֮◌⃜◌̀◌̕b; a◌֮◌⃜◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING FOUR DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20E1 0062;00E0 05AE 20E1 0315 0062;0061 05AE 0300 20E1 0315 0062;00E0 05AE 20E1 0315 0062;0061 05AE 0300 20E1 0315 0062; # (a◌̕◌̀◌֮◌⃡b; à◌֮◌⃡◌̕b; a◌֮◌̀◌⃡◌̕b; à◌֮◌⃡◌̕b; a◌֮◌̀◌⃡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT RIGHT ARROW ABOVE, LATIN SMALL LETTER B +0061 20E1 0315 0300 05AE 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062; # (a◌⃡◌̕◌̀◌֮b; a◌֮◌⃡◌̀◌̕b; a◌֮◌⃡◌̀◌̕b; a◌֮◌⃡◌̀◌̕b; a◌֮◌⃡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT RIGHT ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 093C 0334 20E5 0062;0061 0334 20E5 093C 0062;0061 0334 20E5 093C 0062;0061 0334 20E5 093C 0062;0061 0334 20E5 093C 0062; # (a◌़◌̴◌⃥b; a◌̴◌⃥◌़b; a◌̴◌⃥◌़b; a◌̴◌⃥◌़b; a◌̴◌⃥◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING REVERSE SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 20E5 093C 0334 0062;0061 20E5 0334 093C 0062;0061 20E5 0334 093C 0062;0061 20E5 0334 093C 0062;0061 20E5 0334 093C 0062; # (a◌⃥◌़◌̴b; a◌⃥◌̴◌़b; a◌⃥◌̴◌़b; a◌⃥◌̴◌़b; a◌⃥◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING REVERSE SOLIDUS OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 20E6 0062;0061 0334 20E6 093C 0062;0061 0334 20E6 093C 0062;0061 0334 20E6 093C 0062;0061 0334 20E6 093C 0062; # (a◌़◌̴◌⃦b; a◌̴◌⃦◌़b; a◌̴◌⃦◌़b; a◌̴◌⃦◌़b; a◌̴◌⃦◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING DOUBLE VERTICAL STROKE OVERLAY, LATIN SMALL LETTER B +0061 20E6 093C 0334 0062;0061 20E6 0334 093C 0062;0061 20E6 0334 093C 0062;0061 20E6 0334 093C 0062;0061 20E6 0334 093C 0062; # (a◌⃦◌़◌̴b; a◌⃦◌̴◌़b; a◌⃦◌̴◌़b; a◌⃦◌̴◌़b; a◌⃦◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL STROKE OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 20E7 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062; # (a◌̕◌̀◌֮◌⃧b; à◌֮◌⃧◌̕b; a◌֮◌̀◌⃧◌̕b; à◌֮◌⃧◌̕b; a◌֮◌̀◌⃧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ANNUITY SYMBOL, LATIN SMALL LETTER B +0061 20E7 0315 0300 05AE 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062; # (a◌⃧◌̕◌̀◌֮b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ANNUITY SYMBOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 20E8 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062; # (a◌֚◌̖◌〪◌⃨b; a◌〪◌̖◌⃨◌֚b; a◌〪◌̖◌⃨◌֚b; a◌〪◌̖◌⃨◌֚b; a◌〪◌̖◌⃨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING TRIPLE UNDERDOT, LATIN SMALL LETTER B +0061 20E8 059A 0316 302A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062; # (a◌⃨◌֚◌̖◌〪b; a◌〪◌⃨◌̖◌֚b; a◌〪◌⃨◌̖◌֚b; a◌〪◌⃨◌̖◌֚b; a◌〪◌⃨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TRIPLE UNDERDOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 20E9 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062; # (a◌̕◌̀◌֮◌⃩b; à◌֮◌⃩◌̕b; a◌֮◌̀◌⃩◌̕b; à◌֮◌⃩◌̕b; a◌֮◌̀◌⃩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING WIDE BRIDGE ABOVE, LATIN SMALL LETTER B +0061 20E9 0315 0300 05AE 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062; # (a◌⃩◌̕◌̀◌֮b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING WIDE BRIDGE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 093C 0334 20EA 0062;0061 0334 20EA 093C 0062;0061 0334 20EA 093C 0062;0061 0334 20EA 093C 0062;0061 0334 20EA 093C 0062; # (a◌़◌̴◌⃪b; a◌̴◌⃪◌़b; a◌̴◌⃪◌़b; a◌̴◌⃪◌़b; a◌̴◌⃪◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, COMBINING LEFTWARDS ARROW OVERLAY, LATIN SMALL LETTER B +0061 20EA 093C 0334 0062;0061 20EA 0334 093C 0062;0061 20EA 0334 093C 0062;0061 20EA 0334 093C 0062;0061 20EA 0334 093C 0062; # (a◌⃪◌़◌̴b; a◌⃪◌̴◌़b; a◌⃪◌̴◌़b; a◌⃪◌̴◌़b; a◌⃪◌̴◌़b; ) LATIN SMALL LETTER A, COMBINING LEFTWARDS ARROW OVERLAY, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0316 302A 031B 302A 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062; # (a◌̖◌〪◌̛◌〪b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 302A 0316 302A 031B 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062; # (a◌〪◌̖◌〪◌̛b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 302B 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062; # (a◌̀◌𝅭𝅭֮◌〫b; à𝅭𝅭◌֮◌〫b; a𝅭𝅭◌֮◌〫◌̀b; à𝅭𝅭◌֮◌〫b; a𝅭𝅭◌֮◌〫◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, IDEOGRAPHIC RISING TONE MARK, LATIN SMALL LETTER B +0061 302B 0300 05AE 1D16D 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062; # (a◌〫◌̀◌𝅭𝅭֮b; à𝅭𝅭◌〫◌֮b; a𝅭𝅭◌〫◌֮◌̀b; à𝅭𝅭◌〫◌֮b; a𝅭𝅭◌〫◌֮◌̀b; ) LATIN SMALL LETTER A, IDEOGRAPHIC RISING TONE MARK, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 0362 0315 0300 302C 0062;00E0 0315 302C 0362 0062;0061 0300 0315 302C 0362 0062;00E0 0315 302C 0362 0062;0061 0300 0315 302C 0362 0062; # (a◌͢◌̕◌̀◌〬b; à◌̕◌〬◌͢b; a◌̀◌̕◌〬◌͢b; à◌̕◌〬◌͢b; a◌̀◌̕◌〬◌͢b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, IDEOGRAPHIC DEPARTING TONE MARK, LATIN SMALL LETTER B +0061 302C 0362 0315 0300 0062;00E0 302C 0315 0362 0062;0061 0300 302C 0315 0362 0062;00E0 302C 0315 0362 0062;0061 0300 302C 0315 0362 0062; # (a◌〬◌͢◌̕◌̀b; à◌〬◌̕◌͢b; a◌̀◌〬◌̕◌͢b; à◌〬◌̕◌͢b; a◌̀◌〬◌̕◌͢b; ) LATIN SMALL LETTER A, IDEOGRAPHIC DEPARTING TONE MARK, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 302E 059A 0316 302D 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062; # (a◌〮◌֚◌̖◌〭b; a◌̖◌֚◌〭◌〮b; a◌̖◌֚◌〭◌〮b; a◌̖◌֚◌〭◌〮b; a◌̖◌֚◌〭◌〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC ENTERING TONE MARK, LATIN SMALL LETTER B +0061 302D 302E 059A 0316 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062; # (a◌〭◌〮◌֚◌̖b; a◌̖◌〭◌֚◌〮b; a◌̖◌〭◌֚◌〮b; a◌̖◌〭◌֚◌〮b; a◌̖◌〭◌֚◌〮b; ) LATIN SMALL LETTER A, IDEOGRAPHIC ENTERING TONE MARK, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 1D16D 302E 059A 302E 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062; # (a𝅭𝅭◌〮◌֚◌〮b; a◌֚◌〮◌〮𝅭𝅭b; a◌֚◌〮◌〮𝅭𝅭b; a◌֚◌〮◌〮𝅭𝅭b; a◌֚◌〮◌〮𝅭𝅭b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, HANGUL SINGLE DOT TONE MARK, LATIN SMALL LETTER B +0061 302E 1D16D 302E 059A 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062; # (a◌〮𝅭𝅭◌〮◌֚b; a◌֚◌〮◌〮𝅭𝅭b; a◌֚◌〮◌〮𝅭𝅭b; a◌֚◌〮◌〮𝅭𝅭b; a◌֚◌〮◌〮𝅭𝅭b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, LATIN SMALL LETTER B +0061 1D16D 302E 059A 302F 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062; # (a𝅭𝅭◌〮◌֚◌〯b; a◌֚◌〮◌〯𝅭𝅭b; a◌֚◌〮◌〯𝅭𝅭b; a◌֚◌〮◌〯𝅭𝅭b; a◌֚◌〮◌〯𝅭𝅭b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, HANGUL DOUBLE DOT TONE MARK, LATIN SMALL LETTER B +0061 302F 1D16D 302E 059A 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062; # (a◌〯𝅭𝅭◌〮◌֚b; a◌֚◌〯◌〮𝅭𝅭b; a◌֚◌〯◌〮𝅭𝅭b; a◌֚◌〯◌〮𝅭𝅭b; a◌֚◌〯◌〮𝅭𝅭b; ) LATIN SMALL LETTER A, HANGUL DOUBLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, LATIN SMALL LETTER B +0061 094D 3099 093C 3099 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062; # (a◌्◌゙◌़◌゙b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 094D 3099 093C 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062; # (a◌゙◌्◌゙◌़b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, LATIN SMALL LETTER B +0061 094D 3099 093C 309A 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062; # (a◌्◌゙◌़◌゚b; a◌़◌゙◌゚◌्b; a◌़◌゙◌゚◌्b; a◌़◌゙◌゚◌्b; a◌़◌゙◌゚◌्b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, LATIN SMALL LETTER B +0061 309A 094D 3099 093C 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062; # (a◌゚◌्◌゙◌़b; a◌़◌゚◌゙◌्b; a◌़◌゚◌゙◌्b; a◌़◌゚◌゙◌्b; a◌़◌゚◌゙◌्b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, LATIN SMALL LETTER B +0061 064B FB1E 05C2 FB1E 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062; # (a◌ً◌ﬞ◌ׂ◌ﬞb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; ) LATIN SMALL LETTER A, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT JUDEO-SPANISH VARIKA, LATIN SMALL LETTER B +0061 FB1E 064B FB1E 05C2 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062; # (a◌ﬞ◌ً◌ﬞ◌ׂb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; ) LATIN SMALL LETTER A, HEBREW POINT JUDEO-SPANISH VARIKA, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE FE20 0062;00E0 05AE FE20 0315 0062;0061 05AE 0300 FE20 0315 0062;00E0 05AE FE20 0315 0062;0061 05AE 0300 FE20 0315 0062; # (a◌̕◌̀◌֮◌︠b; à◌֮◌︠◌̕b; a◌֮◌̀◌︠◌̕b; à◌֮◌︠◌̕b; a◌֮◌̀◌︠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LIGATURE LEFT HALF, LATIN SMALL LETTER B +0061 FE20 0315 0300 05AE 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062; # (a◌︠◌̕◌̀◌֮b; a◌֮◌︠◌̀◌̕b; a◌֮◌︠◌̀◌̕b; a◌֮◌︠◌̀◌̕b; a◌֮◌︠◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LIGATURE LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE21 0062;00E0 05AE FE21 0315 0062;0061 05AE 0300 FE21 0315 0062;00E0 05AE FE21 0315 0062;0061 05AE 0300 FE21 0315 0062; # (a◌̕◌̀◌֮◌︡b; à◌֮◌︡◌̕b; a◌֮◌̀◌︡◌̕b; à◌֮◌︡◌̕b; a◌֮◌̀◌︡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LIGATURE RIGHT HALF, LATIN SMALL LETTER B +0061 FE21 0315 0300 05AE 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062; # (a◌︡◌̕◌̀◌֮b; a◌֮◌︡◌̀◌̕b; a◌֮◌︡◌̀◌̕b; a◌֮◌︡◌̀◌̕b; a◌֮◌︡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LIGATURE RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE22 0062;00E0 05AE FE22 0315 0062;0061 05AE 0300 FE22 0315 0062;00E0 05AE FE22 0315 0062;0061 05AE 0300 FE22 0315 0062; # (a◌̕◌̀◌֮◌︢b; à◌֮◌︢◌̕b; a◌֮◌̀◌︢◌̕b; à◌֮◌︢◌̕b; a◌֮◌̀◌︢◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE TILDE LEFT HALF, LATIN SMALL LETTER B +0061 FE22 0315 0300 05AE 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062; # (a◌︢◌̕◌̀◌֮b; a◌֮◌︢◌̀◌̕b; a◌֮◌︢◌̀◌̕b; a◌֮◌︢◌̀◌̕b; a◌֮◌︢◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE23 0062;00E0 05AE FE23 0315 0062;0061 05AE 0300 FE23 0315 0062;00E0 05AE FE23 0315 0062;0061 05AE 0300 FE23 0315 0062; # (a◌̕◌̀◌֮◌︣b; à◌֮◌︣◌̕b; a◌֮◌̀◌︣◌̕b; à◌֮◌︣◌̕b; a◌֮◌̀◌︣◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE TILDE RIGHT HALF, LATIN SMALL LETTER B +0061 FE23 0315 0300 05AE 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062; # (a◌︣◌̕◌̀◌֮b; a◌֮◌︣◌̀◌̕b; a◌֮◌︣◌̀◌̕b; a◌֮◌︣◌̀◌̕b; a◌֮◌︣◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 302A 031B 0321 1D165 0062;0061 0321 031B 1D165 302A 0062;0061 0321 031B 1D165 302A 0062;0061 0321 031B 1D165 302A 0062;0061 0321 031B 1D165 302A 0062; # (a◌〪◌̛◌̡𝅥𝅥b; a◌̡◌̛𝅥𝅥◌〪b; a◌̡◌̛𝅥𝅥◌〪b; a◌̡◌̛𝅥𝅥◌〪b; a◌̡◌̛𝅥𝅥◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING STEM, LATIN SMALL LETTER B +0061 1D165 302A 031B 0321 0062;0061 0321 1D165 031B 302A 0062;0061 0321 1D165 031B 302A 0062;0061 0321 1D165 031B 302A 0062;0061 0321 1D165 031B 302A 0062; # (a𝅥𝅥◌〪◌̛◌̡b; a◌̡𝅥𝅥◌̛◌〪b; a◌̡𝅥𝅥◌̛◌〪b; a◌̡𝅥𝅥◌̛◌〪b; a◌̡𝅥𝅥◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STEM, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 302A 031B 0321 1D166 0062;0061 0321 031B 1D166 302A 0062;0061 0321 031B 1D166 302A 0062;0061 0321 031B 1D166 302A 0062;0061 0321 031B 1D166 302A 0062; # (a◌〪◌̛◌̡𝅦𝅦b; a◌̡◌̛𝅦𝅦◌〪b; a◌̡◌̛𝅦𝅦◌〪b; a◌̡◌̛𝅦𝅦◌〪b; a◌̡◌̛𝅦𝅦◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, LATIN SMALL LETTER B +0061 1D166 302A 031B 0321 0062;0061 0321 1D166 031B 302A 0062;0061 0321 1D166 031B 302A 0062;0061 0321 1D166 031B 302A 0062;0061 0321 1D166 031B 302A 0062; # (a𝅦𝅦◌〪◌̛◌̡b; a◌̡𝅦𝅦◌̛◌〪b; a◌̡𝅦𝅦◌̛◌〪b; a◌̡𝅦𝅦◌̛◌〪b; a◌̡𝅦𝅦◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 093C 0334 1D167 0062;0061 0334 1D167 093C 0062;0061 0334 1D167 093C 0062;0061 0334 1D167 093C 0062;0061 0334 1D167 093C 0062; # (a◌़◌̴◌𝅧◌𝅧b; a◌̴◌𝅧◌𝅧◌़b; a◌̴◌𝅧◌𝅧◌़b; a◌̴◌𝅧◌𝅧◌़b; a◌̴◌𝅧◌𝅧◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-1, LATIN SMALL LETTER B +0061 1D167 093C 0334 0062;0061 1D167 0334 093C 0062;0061 1D167 0334 093C 0062;0061 1D167 0334 093C 0062;0061 1D167 0334 093C 0062; # (a◌𝅧◌𝅧◌़◌̴b; a◌𝅧◌𝅧◌̴◌़b; a◌𝅧◌𝅧◌̴◌़b; a◌𝅧◌𝅧◌̴◌़b; a◌𝅧◌𝅧◌̴◌़b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-1, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 1D168 0062;0061 0334 1D168 093C 0062;0061 0334 1D168 093C 0062;0061 0334 1D168 093C 0062;0061 0334 1D168 093C 0062; # (a◌़◌̴◌𝅨◌𝅨b; a◌̴◌𝅨◌𝅨◌़b; a◌̴◌𝅨◌𝅨◌़b; a◌̴◌𝅨◌𝅨◌़b; a◌̴◌𝅨◌𝅨◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-2, LATIN SMALL LETTER B +0061 1D168 093C 0334 0062;0061 1D168 0334 093C 0062;0061 1D168 0334 093C 0062;0061 1D168 0334 093C 0062;0061 1D168 0334 093C 0062; # (a◌𝅨◌𝅨◌़◌̴b; a◌𝅨◌𝅨◌̴◌़b; a◌𝅨◌𝅨◌̴◌़b; a◌𝅨◌𝅨◌̴◌़b; a◌𝅨◌𝅨◌̴◌़b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-2, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 0334 1D169 0062;0061 0334 1D169 093C 0062;0061 0334 1D169 093C 0062;0061 0334 1D169 093C 0062;0061 0334 1D169 093C 0062; # (a◌़◌̴◌𝅩◌𝅩b; a◌̴◌𝅩◌𝅩◌़b; a◌̴◌𝅩◌𝅩◌़b; a◌̴◌𝅩◌𝅩◌़b; a◌̴◌𝅩◌𝅩◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-3, LATIN SMALL LETTER B +0061 1D169 093C 0334 0062;0061 1D169 0334 093C 0062;0061 1D169 0334 093C 0062;0061 1D169 0334 093C 0062;0061 1D169 0334 093C 0062; # (a◌𝅩◌𝅩◌़◌̴b; a◌𝅩◌𝅩◌̴◌़b; a◌𝅩◌𝅩◌̴◌़b; a◌𝅩◌𝅩◌̴◌़b; a◌𝅩◌𝅩◌̴◌़b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-3, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05AE 1D16D 302E 1D16D 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062; # (a◌𝅭𝅭֮◌〮𝅭𝅭b; a◌〮𝅭𝅭𝅭𝅭◌֮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 1D16D 05AE 1D16D 302E 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062; # (a𝅭𝅭◌𝅭𝅭֮◌〮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; a◌〮𝅭𝅭𝅭𝅭◌֮b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, LATIN SMALL LETTER B +0061 302A 031B 0321 1D16E 0062;0061 0321 031B 1D16E 302A 0062;0061 0321 031B 1D16E 302A 0062;0061 0321 031B 1D16E 302A 0062;0061 0321 031B 1D16E 302A 0062; # (a◌〪◌̛◌̡𝅮𝅮b; a◌̡◌̛𝅮𝅮◌〪b; a◌̡◌̛𝅮𝅮◌〪b; a◌̡◌̛𝅮𝅮◌〪b; a◌̡◌̛𝅮𝅮◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING FLAG-1, LATIN SMALL LETTER B +0061 1D16E 302A 031B 0321 0062;0061 0321 1D16E 031B 302A 0062;0061 0321 1D16E 031B 302A 0062;0061 0321 1D16E 031B 302A 0062;0061 0321 1D16E 031B 302A 0062; # (a𝅮𝅮◌〪◌̛◌̡b; a◌̡𝅮𝅮◌̛◌〪b; a◌̡𝅮𝅮◌̛◌〪b; a◌̡𝅮𝅮◌̛◌〪b; a◌̡𝅮𝅮◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-1, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 302A 031B 0321 1D16F 0062;0061 0321 031B 1D16F 302A 0062;0061 0321 031B 1D16F 302A 0062;0061 0321 031B 1D16F 302A 0062;0061 0321 031B 1D16F 302A 0062; # (a◌〪◌̛◌̡𝅯𝅯b; a◌̡◌̛𝅯𝅯◌〪b; a◌̡◌̛𝅯𝅯◌〪b; a◌̡◌̛𝅯𝅯◌〪b; a◌̡◌̛𝅯𝅯◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING FLAG-2, LATIN SMALL LETTER B +0061 1D16F 302A 031B 0321 0062;0061 0321 1D16F 031B 302A 0062;0061 0321 1D16F 031B 302A 0062;0061 0321 1D16F 031B 302A 0062;0061 0321 1D16F 031B 302A 0062; # (a𝅯𝅯◌〪◌̛◌̡b; a◌̡𝅯𝅯◌̛◌〪b; a◌̡𝅯𝅯◌̛◌〪b; a◌̡𝅯𝅯◌̛◌〪b; a◌̡𝅯𝅯◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-2, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 302A 031B 0321 1D170 0062;0061 0321 031B 1D170 302A 0062;0061 0321 031B 1D170 302A 0062;0061 0321 031B 1D170 302A 0062;0061 0321 031B 1D170 302A 0062; # (a◌〪◌̛◌̡𝅰𝅰b; a◌̡◌̛𝅰𝅰◌〪b; a◌̡◌̛𝅰𝅰◌〪b; a◌̡◌̛𝅰𝅰◌〪b; a◌̡◌̛𝅰𝅰◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING FLAG-3, LATIN SMALL LETTER B +0061 1D170 302A 031B 0321 0062;0061 0321 1D170 031B 302A 0062;0061 0321 1D170 031B 302A 0062;0061 0321 1D170 031B 302A 0062;0061 0321 1D170 031B 302A 0062; # (a𝅰𝅰◌〪◌̛◌̡b; a◌̡𝅰𝅰◌̛◌〪b; a◌̡𝅰𝅰◌̛◌〪b; a◌̡𝅰𝅰◌̛◌〪b; a◌̡𝅰𝅰◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-3, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 302A 031B 0321 1D171 0062;0061 0321 031B 1D171 302A 0062;0061 0321 031B 1D171 302A 0062;0061 0321 031B 1D171 302A 0062;0061 0321 031B 1D171 302A 0062; # (a◌〪◌̛◌̡𝅱𝅱b; a◌̡◌̛𝅱𝅱◌〪b; a◌̡◌̛𝅱𝅱◌〪b; a◌̡◌̛𝅱𝅱◌〪b; a◌̡◌̛𝅱𝅱◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING FLAG-4, LATIN SMALL LETTER B +0061 1D171 302A 031B 0321 0062;0061 0321 1D171 031B 302A 0062;0061 0321 1D171 031B 302A 0062;0061 0321 1D171 031B 302A 0062;0061 0321 1D171 031B 302A 0062; # (a𝅱𝅱◌〪◌̛◌̡b; a◌̡𝅱𝅱◌̛◌〪b; a◌̡𝅱𝅱◌̛◌〪b; a◌̡𝅱𝅱◌̛◌〪b; a◌̡𝅱𝅱◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-4, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 302A 031B 0321 1D172 0062;0061 0321 031B 1D172 302A 0062;0061 0321 031B 1D172 302A 0062;0061 0321 031B 1D172 302A 0062;0061 0321 031B 1D172 302A 0062; # (a◌〪◌̛◌̡𝅲𝅲b; a◌̡◌̛𝅲𝅲◌〪b; a◌̡◌̛𝅲𝅲◌〪b; a◌̡◌̛𝅲𝅲◌〪b; a◌̡◌̛𝅲𝅲◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, MUSICAL SYMBOL COMBINING FLAG-5, LATIN SMALL LETTER B +0061 1D172 302A 031B 0321 0062;0061 0321 1D172 031B 302A 0062;0061 0321 1D172 031B 302A 0062;0061 0321 1D172 031B 302A 0062;0061 0321 1D172 031B 302A 0062; # (a𝅲𝅲◌〪◌̛◌̡b; a◌̡𝅲𝅲◌̛◌〪b; a◌̡𝅲𝅲◌̛◌〪b; a◌̡𝅲𝅲◌̛◌〪b; a◌̡𝅲𝅲◌̛◌〪b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-5, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 059A 0316 302A 1D17B 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062; # (a◌֚◌̖◌〪◌𝅻◌𝅻b; a◌〪◌̖◌𝅻◌𝅻◌֚b; a◌〪◌̖◌𝅻◌𝅻◌֚b; a◌〪◌̖◌𝅻◌𝅻◌֚b; a◌〪◌̖◌𝅻◌𝅻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING ACCENT, LATIN SMALL LETTER B +0061 1D17B 059A 0316 302A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062; # (a◌𝅻◌𝅻◌֚◌̖◌〪b; a◌〪◌𝅻◌𝅻◌̖◌֚b; a◌〪◌𝅻◌𝅻◌̖◌֚b; a◌〪◌𝅻◌𝅻◌̖◌֚b; a◌〪◌𝅻◌𝅻◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D17C 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062; # (a◌֚◌̖◌〪◌𝅼◌𝅼b; a◌〪◌̖◌𝅼◌𝅼◌֚b; a◌〪◌̖◌𝅼◌𝅼◌֚b; a◌〪◌̖◌𝅼◌𝅼◌֚b; a◌〪◌̖◌𝅼◌𝅼◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING STACCATO, LATIN SMALL LETTER B +0061 1D17C 059A 0316 302A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062; # (a◌𝅼◌𝅼◌֚◌̖◌〪b; a◌〪◌𝅼◌𝅼◌̖◌֚b; a◌〪◌𝅼◌𝅼◌̖◌֚b; a◌〪◌𝅼◌𝅼◌̖◌֚b; a◌〪◌𝅼◌𝅼◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D17D 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062; # (a◌֚◌̖◌〪◌𝅽◌𝅽b; a◌〪◌̖◌𝅽◌𝅽◌֚b; a◌〪◌̖◌𝅽◌𝅽◌֚b; a◌〪◌̖◌𝅽◌𝅽◌֚b; a◌〪◌̖◌𝅽◌𝅽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING TENUTO, LATIN SMALL LETTER B +0061 1D17D 059A 0316 302A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062; # (a◌𝅽◌𝅽◌֚◌̖◌〪b; a◌〪◌𝅽◌𝅽◌̖◌֚b; a◌〪◌𝅽◌𝅽◌̖◌֚b; a◌〪◌𝅽◌𝅽◌̖◌֚b; a◌〪◌𝅽◌𝅽◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TENUTO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D17E 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062; # (a◌֚◌̖◌〪◌𝅾◌𝅾b; a◌〪◌̖◌𝅾◌𝅾◌֚b; a◌〪◌̖◌𝅾◌𝅾◌֚b; a◌〪◌̖◌𝅾◌𝅾◌֚b; a◌〪◌̖◌𝅾◌𝅾◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING STACCATISSIMO, LATIN SMALL LETTER B +0061 1D17E 059A 0316 302A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062; # (a◌𝅾◌𝅾◌֚◌̖◌〪b; a◌〪◌𝅾◌𝅾◌̖◌֚b; a◌〪◌𝅾◌𝅾◌̖◌֚b; a◌〪◌𝅾◌𝅾◌̖◌֚b; a◌〪◌𝅾◌𝅾◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATISSIMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D17F 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062; # (a◌֚◌̖◌〪◌𝅿◌𝅿b; a◌〪◌̖◌𝅿◌𝅿◌֚b; a◌〪◌̖◌𝅿◌𝅿◌֚b; a◌〪◌̖◌𝅿◌𝅿◌֚b; a◌〪◌̖◌𝅿◌𝅿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING MARCATO, LATIN SMALL LETTER B +0061 1D17F 059A 0316 302A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062; # (a◌𝅿◌𝅿◌֚◌̖◌〪b; a◌〪◌𝅿◌𝅿◌̖◌֚b; a◌〪◌𝅿◌𝅿◌̖◌֚b; a◌〪◌𝅿◌𝅿◌̖◌֚b; a◌〪◌𝅿◌𝅿◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D180 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062; # (a◌֚◌̖◌〪◌𝆀◌𝆀b; a◌〪◌̖◌𝆀◌𝆀◌֚b; a◌〪◌̖◌𝆀◌𝆀◌֚b; a◌〪◌̖◌𝆀◌𝆀◌֚b; a◌〪◌̖◌𝆀◌𝆀◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, LATIN SMALL LETTER B +0061 1D180 059A 0316 302A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062; # (a◌𝆀◌𝆀◌֚◌̖◌〪b; a◌〪◌𝆀◌𝆀◌̖◌֚b; a◌〪◌𝆀◌𝆀◌̖◌֚b; a◌〪◌𝆀◌𝆀◌̖◌֚b; a◌〪◌𝆀◌𝆀◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D181 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062; # (a◌֚◌̖◌〪◌𝆁◌𝆁b; a◌〪◌̖◌𝆁◌𝆁◌֚b; a◌〪◌̖◌𝆁◌𝆁◌֚b; a◌〪◌̖◌𝆁◌𝆁◌֚b; a◌〪◌̖◌𝆁◌𝆁◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, LATIN SMALL LETTER B +0061 1D181 059A 0316 302A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062; # (a◌𝆁◌𝆁◌֚◌̖◌〪b; a◌〪◌𝆁◌𝆁◌̖◌֚b; a◌〪◌𝆁◌𝆁◌̖◌֚b; a◌〪◌𝆁◌𝆁◌̖◌֚b; a◌〪◌𝆁◌𝆁◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D182 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062; # (a◌֚◌̖◌〪◌𝆂◌𝆂b; a◌〪◌̖◌𝆂◌𝆂◌֚b; a◌〪◌̖◌𝆂◌𝆂◌֚b; a◌〪◌̖◌𝆂◌𝆂◌֚b; a◌〪◌̖◌𝆂◌𝆂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING LOURE, LATIN SMALL LETTER B +0061 1D182 059A 0316 302A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062; # (a◌𝆂◌𝆂◌֚◌̖◌〪b; a◌〪◌𝆂◌𝆂◌̖◌֚b; a◌〪◌𝆂◌𝆂◌̖◌֚b; a◌〪◌𝆂◌𝆂◌̖◌֚b; a◌〪◌𝆂◌𝆂◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING LOURE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D185 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062; # (a◌̕◌̀◌֮◌𝆅◌𝆅b; à◌֮◌𝆅◌𝆅◌̕b; a◌֮◌̀◌𝆅◌𝆅◌̕b; à◌֮◌𝆅◌𝆅◌̕b; a◌֮◌̀◌𝆅◌𝆅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING DOIT, LATIN SMALL LETTER B +0061 1D185 0315 0300 05AE 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062; # (a◌𝆅◌𝆅◌̕◌̀◌֮b; a◌֮◌𝆅◌𝆅◌̀◌̕b; a◌֮◌𝆅◌𝆅◌̀◌̕b; a◌֮◌𝆅◌𝆅◌̀◌̕b; a◌֮◌𝆅◌𝆅◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOIT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D186 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062; # (a◌̕◌̀◌֮◌𝆆◌𝆆b; à◌֮◌𝆆◌𝆆◌̕b; a◌֮◌̀◌𝆆◌𝆆◌̕b; à◌֮◌𝆆◌𝆆◌̕b; a◌֮◌̀◌𝆆◌𝆆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING RIP, LATIN SMALL LETTER B +0061 1D186 0315 0300 05AE 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062; # (a◌𝆆◌𝆆◌̕◌̀◌֮b; a◌֮◌𝆆◌𝆆◌̀◌̕b; a◌֮◌𝆆◌𝆆◌̀◌̕b; a◌֮◌𝆆◌𝆆◌̀◌̕b; a◌֮◌𝆆◌𝆆◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING RIP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D187 0062;00E0 05AE 1D187 0315 0062;0061 05AE 0300 1D187 0315 0062;00E0 05AE 1D187 0315 0062;0061 05AE 0300 1D187 0315 0062; # (a◌̕◌̀◌֮◌𝆇◌𝆇b; à◌֮◌𝆇◌𝆇◌̕b; a◌֮◌̀◌𝆇◌𝆇◌̕b; à◌֮◌𝆇◌𝆇◌̕b; a◌֮◌̀◌𝆇◌𝆇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING FLIP, LATIN SMALL LETTER B +0061 1D187 0315 0300 05AE 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062; # (a◌𝆇◌𝆇◌̕◌̀◌֮b; a◌֮◌𝆇◌𝆇◌̀◌̕b; a◌֮◌𝆇◌𝆇◌̀◌̕b; a◌֮◌𝆇◌𝆇◌̀◌̕b; a◌֮◌𝆇◌𝆇◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLIP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D188 0062;00E0 05AE 1D188 0315 0062;0061 05AE 0300 1D188 0315 0062;00E0 05AE 1D188 0315 0062;0061 05AE 0300 1D188 0315 0062; # (a◌̕◌̀◌֮◌𝆈◌𝆈b; à◌֮◌𝆈◌𝆈◌̕b; a◌֮◌̀◌𝆈◌𝆈◌̕b; à◌֮◌𝆈◌𝆈◌̕b; a◌֮◌̀◌𝆈◌𝆈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING SMEAR, LATIN SMALL LETTER B +0061 1D188 0315 0300 05AE 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062; # (a◌𝆈◌𝆈◌̕◌̀◌֮b; a◌֮◌𝆈◌𝆈◌̀◌̕b; a◌֮◌𝆈◌𝆈◌̀◌̕b; a◌֮◌𝆈◌𝆈◌̀◌̕b; a◌֮◌𝆈◌𝆈◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SMEAR, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D189 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062; # (a◌̕◌̀◌֮◌𝆉◌𝆉b; à◌֮◌𝆉◌𝆉◌̕b; a◌֮◌̀◌𝆉◌𝆉◌̕b; à◌֮◌𝆉◌𝆉◌̕b; a◌֮◌̀◌𝆉◌𝆉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING BEND, LATIN SMALL LETTER B +0061 1D189 0315 0300 05AE 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062; # (a◌𝆉◌𝆉◌̕◌̀◌֮b; a◌֮◌𝆉◌𝆉◌̀◌̕b; a◌֮◌𝆉◌𝆉◌̀◌̕b; a◌֮◌𝆉◌𝆉◌̀◌̕b; a◌֮◌𝆉◌𝆉◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING BEND, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 302A 1D18A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062; # (a◌֚◌̖◌〪◌𝆊◌𝆊b; a◌〪◌̖◌𝆊◌𝆊◌֚b; a◌〪◌̖◌𝆊◌𝆊◌֚b; a◌〪◌̖◌𝆊◌𝆊◌֚b; a◌〪◌̖◌𝆊◌𝆊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, LATIN SMALL LETTER B +0061 1D18A 059A 0316 302A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062; # (a◌𝆊◌𝆊◌֚◌̖◌〪b; a◌〪◌𝆊◌𝆊◌̖◌֚b; a◌〪◌𝆊◌𝆊◌̖◌֚b; a◌〪◌𝆊◌𝆊◌̖◌֚b; a◌〪◌𝆊◌𝆊◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 1D18B 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062; # (a◌֚◌̖◌〪◌𝆋◌𝆋b; a◌〪◌̖◌𝆋◌𝆋◌֚b; a◌〪◌̖◌𝆋◌𝆋◌֚b; a◌〪◌̖◌𝆋◌𝆋◌֚b; a◌〪◌̖◌𝆋◌𝆋◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, LATIN SMALL LETTER B +0061 1D18B 059A 0316 302A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062; # (a◌𝆋◌𝆋◌֚◌̖◌〪b; a◌〪◌𝆋◌𝆋◌̖◌֚b; a◌〪◌𝆋◌𝆋◌̖◌֚b; a◌〪◌𝆋◌𝆋◌̖◌֚b; a◌〪◌𝆋◌𝆋◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AA 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062; # (a◌̕◌̀◌֮◌𝆪◌𝆪b; à◌֮◌𝆪◌𝆪◌̕b; a◌֮◌̀◌𝆪◌𝆪◌̕b; à◌֮◌𝆪◌𝆪◌̕b; a◌֮◌̀◌𝆪◌𝆪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING DOWN BOW, LATIN SMALL LETTER B +0061 1D1AA 0315 0300 05AE 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062; # (a◌𝆪◌𝆪◌̕◌̀◌֮b; a◌֮◌𝆪◌𝆪◌̀◌̕b; a◌֮◌𝆪◌𝆪◌̀◌̕b; a◌֮◌𝆪◌𝆪◌̀◌̕b; a◌֮◌𝆪◌𝆪◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOWN BOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AB 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062; # (a◌̕◌̀◌֮◌𝆫◌𝆫b; à◌֮◌𝆫◌𝆫◌̕b; a◌֮◌̀◌𝆫◌𝆫◌̕b; à◌֮◌𝆫◌𝆫◌̕b; a◌֮◌̀◌𝆫◌𝆫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING UP BOW, LATIN SMALL LETTER B +0061 1D1AB 0315 0300 05AE 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062; # (a◌𝆫◌𝆫◌̕◌̀◌֮b; a◌֮◌𝆫◌𝆫◌̀◌̕b; a◌֮◌𝆫◌𝆫◌̀◌̕b; a◌֮◌𝆫◌𝆫◌̀◌̕b; a◌֮◌𝆫◌𝆫◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING UP BOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AC 0062;00E0 05AE 1D1AC 0315 0062;0061 05AE 0300 1D1AC 0315 0062;00E0 05AE 1D1AC 0315 0062;0061 05AE 0300 1D1AC 0315 0062; # (a◌̕◌̀◌֮◌𝆬◌𝆬b; à◌֮◌𝆬◌𝆬◌̕b; a◌֮◌̀◌𝆬◌𝆬◌̕b; à◌֮◌𝆬◌𝆬◌̕b; a◌֮◌̀◌𝆬◌𝆬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING HARMONIC, LATIN SMALL LETTER B +0061 1D1AC 0315 0300 05AE 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062; # (a◌𝆬◌𝆬◌̕◌̀◌֮b; a◌֮◌𝆬◌𝆬◌̀◌̕b; a◌֮◌𝆬◌𝆬◌̀◌̕b; a◌֮◌𝆬◌𝆬◌̀◌̕b; a◌֮◌𝆬◌𝆬◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING HARMONIC, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AD 0062;00E0 05AE 1D1AD 0315 0062;0061 05AE 0300 1D1AD 0315 0062;00E0 05AE 1D1AD 0315 0062;0061 05AE 0300 1D1AD 0315 0062; # (a◌̕◌̀◌֮◌𝆭◌𝆭b; à◌֮◌𝆭◌𝆭◌̕b; a◌֮◌̀◌𝆭◌𝆭◌̕b; à◌֮◌𝆭◌𝆭◌̕b; a◌֮◌̀◌𝆭◌𝆭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING SNAP PIZZICATO, LATIN SMALL LETTER B +0061 1D1AD 0315 0300 05AE 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062; # (a◌𝆭◌𝆭◌̕◌̀◌֮b; a◌֮◌𝆭◌𝆭◌̀◌̕b; a◌֮◌𝆭◌𝆭◌̀◌̕b; a◌֮◌𝆭◌𝆭◌̀◌̕b; a◌֮◌𝆭◌𝆭◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SNAP PIZZICATO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +# +# END OF FILE diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 8e3fef6b6fe4a0..4d0c968760d15d 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -6,6 +6,7 @@ """ +from functools import partial import hashlib from http.client import HTTPException import sys @@ -18,20 +19,31 @@ cpython_only, check_disallow_instantiation, force_not_colorized, + is_resource_enabled, + findfile, ) +quicktest = not is_resource_enabled('cpu') + +def iterallchars(): + maxunicode = 0xffff if quicktest else sys.maxunicode + return map(chr, range(maxunicode + 1)) + class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = '9e43ee3929471739680c0e705482b4ae1c4122e4' + expectedchecksum = ('486bf97d506d0ccf0e463fd1f40c51029805af5a' + if quicktest else + '9e43ee3929471739680c0e705482b4ae1c4122e4') - @requires_resource('cpu') def test_method_checksum(self): h = hashlib.sha1() - for i in range(sys.maxunicode + 1): - char = chr(i) - data = [ + for char in iterallchars(): + s1 = char + 'abc' + s2 = char + 'ABC' + s3 = char + '123' + data = ( # Predicates (single char) "01"[char.isalnum()], "01"[char.isalpha()], @@ -44,15 +56,15 @@ def test_method_checksum(self): "01"[char.isupper()], # Predicates (multiple chars) - "01"[(char + 'abc').isalnum()], - "01"[(char + 'abc').isalpha()], - "01"[(char + '123').isdecimal()], - "01"[(char + '123').isdigit()], - "01"[(char + 'abc').islower()], - "01"[(char + '123').isnumeric()], + "01"[s1.isalnum()], + "01"[s1.isalpha()], + "01"[s3.isdecimal()], + "01"[s3.isdigit()], + "01"[s1.islower()], + "01"[s3.isnumeric()], "01"[(char + ' \t').isspace()], - "01"[(char + 'abc').istitle()], - "01"[(char + 'ABC').isupper()], + "01"[s1.istitle()], + "01"[s2.isupper()], # Mappings (single char) char.lower(), @@ -60,54 +72,54 @@ def test_method_checksum(self): char.title(), # Mappings (multiple chars) - (char + 'abc').lower(), - (char + 'ABC').upper(), - (char + 'abc').title(), - (char + 'ABC').title(), + s1.lower(), + s2.upper(), + s1.title(), + s2.title(), - ] + ) h.update(''.join(data).encode('utf-8', 'surrogatepass')) result = h.hexdigest() self.assertEqual(result, self.expectedchecksum) -class UnicodeDatabaseTest(unittest.TestCase): - db = unicodedata -class UnicodeFunctionsTest(UnicodeDatabaseTest): +class UnicodeFunctionsTest(unittest.TestCase): + db = unicodedata + old = False # Update this if the database changes. Make sure to do a full rebuild # (e.g. 'make distclean && make') to get the correct checksum. - expectedchecksum = '23ab09ed4abdf93db23b97359108ed630dd8311d' + expectedchecksum = ('35e842600fa7ae2db93739db08ef201b726a2374' + if quicktest else + '23ab09ed4abdf93db23b97359108ed630dd8311d') - @requires_resource('cpu') def test_function_checksum(self): + db = self.db data = [] h = hashlib.sha1() - for i in range(sys.maxunicode + 1): - char = chr(i) - data = [ + for char in iterallchars(): + data = "%.12g%.12g%.12g%s%s%s%s%s%s%s" % ( # Properties - format(self.db.digit(char, -1), '.12g'), - format(self.db.numeric(char, -1), '.12g'), - format(self.db.decimal(char, -1), '.12g'), - self.db.category(char), - self.db.bidirectional(char), - self.db.decomposition(char), - str(self.db.mirrored(char)), - str(self.db.combining(char)), - unicodedata.east_asian_width(char), - self.db.name(char, ""), - ] - h.update(''.join(data).encode("ascii")) + db.digit(char, -1), + db.numeric(char, -1), + db.decimal(char, -1), + db.category(char), + db.bidirectional(char), + db.decomposition(char), + db.mirrored(char), + db.combining(char), + db.east_asian_width(char), + db.name(char, ""), + ) + h.update(data.encode("ascii")) result = h.hexdigest() self.assertEqual(result, self.expectedchecksum) - @requires_resource('cpu') def test_name_inverse_lookup(self): - for i in range(sys.maxunicode + 1): - char = chr(i) - if looked_name := self.db.name(char, None): + for char in iterallchars(): + looked_name = self.db.name(char, None) + if looked_name is not None: self.assertEqual(self.db.lookup(looked_name), char) def test_no_names_in_pua(self): @@ -138,6 +150,13 @@ def test_digit(self): self.assertEqual(self.db.digit('\U00020000', None), None) self.assertEqual(self.db.digit('\U0001D7FD'), 7) + # New in 13.0.0 + self.assertEqual(self.db.digit('\U0001fbf9', None), 9) + # New in 14.0.0 + self.assertEqual(self.db.digit('\U00016ac9', None), 9) + # New in 15.0.0 + self.assertEqual(self.db.digit('\U0001e4f9', None), 9) + self.assertRaises(TypeError, self.db.digit) self.assertRaises(TypeError, self.db.digit, 'xx') self.assertRaises(ValueError, self.db.digit, 'x') @@ -147,9 +166,24 @@ def test_numeric(self): self.assertEqual(self.db.numeric('9'), 9) self.assertEqual(self.db.numeric('\u215b'), 0.125) self.assertEqual(self.db.numeric('\u2468'), 9.0) - self.assertEqual(self.db.numeric('\ua627'), 7.0) self.assertEqual(self.db.numeric('\U00020000', None), None) - self.assertEqual(self.db.numeric('\U0001012A'), 9000) + + # New in 4.1.0 + self.assertEqual(self.db.numeric('\U0001012A', None), None if self.old else 9000) + # New in 5.0.0 + self.assertEqual(self.db.numeric('\u07c0', None), None if self.old else 0.0) + # New in 5.1.0 + self.assertEqual(self.db.numeric('\ua627', None), None if self.old else 7.0) + # New in 6.0.0 + self.assertEqual(self.db.numeric('\u0b72', None), None if self.old else 0.25) + # New in 12.0.0 + self.assertEqual(self.db.numeric('\U0001ed3c', None), None if self.old else 0.5) + # New in 13.0.0 + self.assertEqual(self.db.numeric('\U0001fbf9', None), None if self.old else 9) + # New in 14.0.0 + self.assertEqual(self.db.numeric('\U00016ac9', None), None if self.old else 9) + # New in 15.0.0 + self.assertEqual(self.db.numeric('\U0001e4f9', None), None if self.old else 9) self.assertRaises(TypeError, self.db.numeric) self.assertRaises(TypeError, self.db.numeric, 'xx') @@ -163,6 +197,18 @@ def test_decimal(self): self.assertEqual(self.db.decimal('\U00020000', None), None) self.assertEqual(self.db.decimal('\U0001D7FD'), 7) + # New in 4.1.0 + self.assertEqual(self.db.decimal('\xb2', None), 2 if self.old else None) + self.assertEqual(self.db.decimal('\u1369', None), 1 if self.old else None) + # New in 5.0.0 + self.assertEqual(self.db.decimal('\u07c0', None), None if self.old else 0) + # New in 13.0.0 + self.assertEqual(self.db.decimal('\U0001fbf9', None), None if self.old else 9) + # New in 14.0.0 + self.assertEqual(self.db.decimal('\U00016ac9', None), None if self.old else 9) + # New in 15.0.0 + self.assertEqual(self.db.decimal('\U0001e4f9', None), None if self.old else 9) + self.assertRaises(TypeError, self.db.decimal) self.assertRaises(TypeError, self.db.decimal, 'xx') self.assertRaises(ValueError, self.db.decimal, 'x') @@ -172,7 +218,21 @@ def test_category(self): self.assertEqual(self.db.category('a'), 'Ll') self.assertEqual(self.db.category('A'), 'Lu') self.assertEqual(self.db.category('\U00020000'), 'Lo') - self.assertEqual(self.db.category('\U0001012A'), 'No') + + # New in 4.1.0 + self.assertEqual(self.db.category('\U0001012A'), 'Cn' if self.old else 'No') + self.assertEqual(self.db.category('\U000e01ef'), 'Cn' if self.old else 'Mn') + # New in 5.1.0 + self.assertEqual(self.db.category('\u0374'), 'Sk' if self.old else 'Lm') + # Changed in 13.0.0 + self.assertEqual(self.db.category('\u0b55'), 'Cn' if self.old else 'Mn') + self.assertEqual(self.db.category('\U0003134a'), 'Cn' if self.old else 'Lo') + # Changed in 14.0.0 + self.assertEqual(self.db.category('\u061d'), 'Cn' if self.old else 'Po') + self.assertEqual(self.db.category('\U0002b738'), 'Cn' if self.old else 'Lo') + # Changed in 15.0.0 + self.assertEqual(self.db.category('\u0cf3'), 'Cn' if self.old else 'Mc') + self.assertEqual(self.db.category('\U000323af'), 'Cn' if self.old else 'Lo') self.assertRaises(TypeError, self.db.category) self.assertRaises(TypeError, self.db.category, 'xx') @@ -183,6 +243,23 @@ def test_bidirectional(self): self.assertEqual(self.db.bidirectional('A'), 'L') self.assertEqual(self.db.bidirectional('\U00020000'), 'L') + # New in 4.1.0 + self.assertEqual(self.db.bidirectional('+'), 'ET' if self.old else 'ES') + self.assertEqual(self.db.bidirectional('\u0221'), '' if self.old else 'L') + self.assertEqual(self.db.bidirectional('\U000e01ef'), '' if self.old else 'NSM') + # New in 13.0.0 + self.assertEqual(self.db.bidirectional('\u0b55'), '' if self.old else 'NSM') + self.assertEqual(self.db.bidirectional('\U0003134a'), '' if self.old else 'L') + # New in 14.0.0 + self.assertEqual(self.db.bidirectional('\u061d'), '' if self.old else 'AL') + self.assertEqual(self.db.bidirectional('\U0002b738'), '' if self.old else 'L') + # New in 15.0.0 + self.assertEqual(self.db.bidirectional('\u0cf3'), '' if self.old else 'L') + self.assertEqual(self.db.bidirectional('\U000323af'), '' if self.old else 'L') + # New in 16.0.0 + self.assertEqual(self.db.bidirectional('\u0897'), '' if self.old else 'NSM') + self.assertEqual(self.db.bidirectional('\U0001fbef'), '' if self.old else 'ON') + self.assertRaises(TypeError, self.db.bidirectional) self.assertRaises(TypeError, self.db.bidirectional, 'xx') @@ -190,6 +267,20 @@ def test_decomposition(self): self.assertEqual(self.db.decomposition('\uFFFE'),'') self.assertEqual(self.db.decomposition('\u00bc'), '<fraction> 0031 2044 0034') + # New in 4.1.0 + self.assertEqual(self.db.decomposition('\u03f9'), '' if self.old else '<compat> 03A3') + # New in 13.0.0 + self.assertEqual(self.db.decomposition('\uab69'), '' if self.old else '<super> 028D') + self.assertEqual(self.db.decomposition('\U00011938'), '' if self.old else '11935 11930') + self.assertEqual(self.db.decomposition('\U0001fbf9'), '' if self.old else '<font> 0039') + # New in 14.0.0 + self.assertEqual(self.db.decomposition('\ua7f2'), '' if self.old else '<super> 0043') + self.assertEqual(self.db.decomposition('\U000107ba'), '' if self.old else '<super> 1DF1E') + # New in 15.0.0 + self.assertEqual(self.db.decomposition('\U0001e06d'), '' if self.old else '<super> 04B1') + # New in 16.0.0 + self.assertEqual(self.db.decomposition('\U0001CCD6'), '' if self.old else '<font> 0041') + self.assertRaises(TypeError, self.db.decomposition) self.assertRaises(TypeError, self.db.decomposition, 'xx') @@ -199,6 +290,16 @@ def test_mirrored(self): self.assertEqual(self.db.mirrored('\u2201'), 1) self.assertEqual(self.db.mirrored('\U00020000'), 0) + # New in 5.0.0 + self.assertEqual(self.db.mirrored('\u0f3a'), 0 if self.old else 1) + self.assertEqual(self.db.mirrored('\U0001d7c3'), 0 if self.old else 1) + # New in 11.0.0 + self.assertEqual(self.db.mirrored('\u29a1'), 1 if self.old else 0) + # New in 14.0.0 + self.assertEqual(self.db.mirrored('\u2e5c'), 0 if self.old else 1) + # New in 16.0.0 + self.assertEqual(self.db.mirrored('\u226D'), 0 if self.old else 1) + self.assertRaises(TypeError, self.db.mirrored) self.assertRaises(TypeError, self.db.mirrored, 'xx') @@ -208,9 +309,187 @@ def test_combining(self): self.assertEqual(self.db.combining('\u20e1'), 230) self.assertEqual(self.db.combining('\U00020000'), 0) + # New in 4.1.0 + self.assertEqual(self.db.combining('\u0350'), 0 if self.old else 230) + # New in 9.0.0 + self.assertEqual(self.db.combining('\U0001e94a'), 0 if self.old else 7) + # New in 13.0.0 + self.assertEqual(self.db.combining('\u1abf'), 0 if self.old else 220) + self.assertEqual(self.db.combining('\U00016ff1'), 0 if self.old else 6) + # New in 14.0.0 + self.assertEqual(self.db.combining('\u0c3c'), 0 if self.old else 7) + self.assertEqual(self.db.combining('\U0001e2ae'), 0 if self.old else 230) + # New in 15.0.0 + self.assertEqual(self.db.combining('\U00010efd'), 0 if self.old else 220) + # New in 16.0.0 + self.assertEqual(self.db.combining('\u0897'), 0 if self.old else 230) + self.assertRaises(TypeError, self.db.combining) self.assertRaises(TypeError, self.db.combining, 'xx') + def test_normalization(self): + # Test normalize() and is_normalized() + def check(ch, expected): + if isinstance(expected, str): + expected = [expected]*4 + forms = ('NFC', 'NFD', 'NFKC', 'NFKD') + result = [self.db.normalize(form, ch) for form in forms] + self.assertEqual(ascii(result), ascii(list(expected))) + self.assertEqual([self.db.is_normalized(form, ch) for form in forms], + [ch == y for x, y in zip(result, expected)]) + + check('', '') + check('A', 'A') + check(' ', ' ') + check('\U0010ffff', '\U0010ffff') + check('abc', 'abc') + # Broken in 4.0.0 + check('\u0340', '\u0300') + check('\u0300', '\u0300') + check('\U0002fa1d', '\U0002a600') + check('\U0002a600', '\U0002a600') + check('\u0344', '\u0308\u0301') + check('\u0308\u0301', '\u0308\u0301') + # Broken in 4.0.0 and 4.0.1 + check('\U0001d1bc', '\U0001d1ba\U0001d165') + check('\U0001d1ba\U0001d165', '\U0001d1ba\U0001d165') + check('\ufb2c', '\u05e9\u05bc\u05c1') + check('\u05e9\u05bc\u05c1', '\u05e9\u05bc\u05c1') + check('\U0001d1c0', '\U0001d1ba\U0001d165\U0001d16f') + check('\U0001d1ba\U0001d165\U0001d16f', '\U0001d1ba\U0001d165\U0001d16f') + + # Broken in 4.0.0 + check('\xa0', ['\xa0', '\xa0', ' ', ' ']) + check('\u2003', ['\u2003', '\u2003', ' ', ' ']) + check('\U0001d7ff', ['\U0001d7ff', '\U0001d7ff', '9', '9']) + + check('\xa8', ['\xa8', '\xa8', ' \u0308', ' \u0308']) + check(' \u0308', ' \u0308') + + check('\xc0', ['\xc0', 'A\u0300']*2) + check('A\u0300', ['\xc0', 'A\u0300']*2) + + check('\ud7a3', ['\ud7a3', '\u1112\u1175\u11c2']*2) + check('\u1112\u1175\u11c2', ['\ud7a3', '\u1112\u1175\u11c2']*2) + + check('\xb4', ['\xb4', '\xb4', ' \u0301', ' \u0301']) + check('\u1ffd', ['\xb4', '\xb4', ' \u0301', ' \u0301']) + check(' \u0301', ' \u0301') + + check('\xc5', ['\xc5', 'A\u030a']*2) + check('\u212b', ['\xc5', 'A\u030a']*2) + check('A\u030a', ['\xc5', 'A\u030a']*2) + + check('\u1f71', ['\u03ac', '\u03b1\u0301']*2) + check('\u03ac', ['\u03ac', '\u03b1\u0301']*2) + check('\u03b1\u0301', ['\u03ac', '\u03b1\u0301']*2) + + check('\u01c4', ['\u01c4', '\u01c4', 'D\u017d', 'DZ\u030c']) + check('D\u017d', ['D\u017d', 'DZ\u030c']*2) + check('DZ\u030c', ['D\u017d', 'DZ\u030c']*2) + + check('\u1fed', ['\u1fed', '\xa8\u0300', ' \u0308\u0300', ' \u0308\u0300']) + check('\xa8\u0300', ['\u1fed', '\xa8\u0300', ' \u0308\u0300', ' \u0308\u0300']) + check(' \u0308\u0300', ' \u0308\u0300') + + check('\u326e', ['\u326e', '\u326e', '\uac00', '\u1100\u1161']) + check('\u320e', ['\u320e', '\u320e', '(\uac00)', '(\u1100\u1161)']) + check('(\uac00)', ['(\uac00)', '(\u1100\u1161)']*2) + check('(\u1100\u1161)', ['(\uac00)', '(\u1100\u1161)']*2) + + check('\u0385', ['\u0385', '\xa8\u0301', ' \u0308\u0301', ' \u0308\u0301']) + check('\u1fee', ['\u0385', '\xa8\u0301', ' \u0308\u0301', ' \u0308\u0301']) + check('\xa8\u0301', ['\u0385', '\xa8\u0301', ' \u0308\u0301', ' \u0308\u0301']) + check(' \u0308\u0301', ' \u0308\u0301') + + check('\u1fdf', ['\u1fdf', '\u1ffe\u0342', ' \u0314\u0342', ' \u0314\u0342']) + check('\u1ffe\u0342', ['\u1fdf', '\u1ffe\u0342', ' \u0314\u0342', ' \u0314\u0342']) + check('\u1ffe', ['\u1ffe', '\u1ffe', ' \u0314', ' \u0314']) + check(' \u0314\u0342', ' \u0314\u0342') + + check('\u03d3', ['\u03d3', '\u03d2\u0301', '\u038e', '\u03a5\u0301']) + check('\u03d2\u0301', ['\u03d3', '\u03d2\u0301', '\u038e', '\u03a5\u0301']) + check('\u038e', ['\u038e', '\u03a5\u0301']*2) + check('\u1feb', ['\u038e', '\u03a5\u0301']*2) + check('\u03a5\u0301', ['\u038e', '\u03a5\u0301']*2) + + check('\u0626', ['\u0626', '\u064a\u0654']*2) + check('\u064a\u0654', ['\u0626', '\u064a\u0654']*2) + check('\ufe89', ['\ufe89', '\ufe89', '\u0626', '\u064a\u0654']) + check('\ufe8a', ['\ufe8a', '\ufe8a', '\u0626', '\u064a\u0654']) + check('\ufe8b', ['\ufe8b', '\ufe8b', '\u0626', '\u064a\u0654']) + check('\ufe8c', ['\ufe8c', '\ufe8c', '\u0626', '\u064a\u0654']) + + check('\ufef9', ['\ufef9', '\ufef9', '\u0644\u0625', '\u0644\u0627\u0655']) + check('\ufefa', ['\ufefa', '\ufefa', '\u0644\u0625', '\u0644\u0627\u0655']) + check('\ufefb', ['\ufefb', '\ufefb', '\u0644\u0627', '\u0644\u0627']) + check('\ufefc', ['\ufefc', '\ufefc', '\u0644\u0627', '\u0644\u0627']) + check('\u0644\u0625', ['\u0644\u0625', '\u0644\u0627\u0655']*2) + check('\u0644\u0627\u0655', ['\u0644\u0625', '\u0644\u0627\u0655']*2) + check('\u0644\u0627', '\u0644\u0627') + + # Broken in 4.0.0 + check('\u327c', '\u327c' if self.old else + ['\u327c', '\u327c', '\ucc38\uace0', '\u110e\u1161\u11b7\u1100\u1169']) + check('\ucc38\uace0', ['\ucc38\uace0', '\u110e\u1161\u11b7\u1100\u1169']*2) + check('\ucc38', ['\ucc38', '\u110e\u1161\u11b7']*2) + check('\u110e\u1161\u11b7\u1100\u1169', + ['\ucc38\uace0', '\u110e\u1161\u11b7\u1100\u1169']*2) + check('\u110e\u1161\u11b7\u1100', + ['\ucc38\u1100', '\u110e\u1161\u11b7\u1100']*2) + check('\u110e\u1161\u11b7', + ['\ucc38', '\u110e\u1161\u11b7']*2) + check('\u110e\u1161', + ['\ucc28', '\u110e\u1161']*2) + check('\u110e', '\u110e') + # Broken in 4.0.0-12.0.0 + check('\U00011938', '\U00011938' if self.old else + ['\U00011938', '\U00011935\U00011930']*2) + check('\U00011935\U00011930', ['\U00011938', '\U00011935\U00011930']*2) + # New in 4.0.1 + check('\u321d', '\u321d' if self.old else + ['\u321d', '\u321d', '(\uc624\uc804)', '(\u110b\u1169\u110c\u1165\u11ab)']) + check('(\uc624\uc804)', + ['(\uc624\uc804)', '(\u110b\u1169\u110c\u1165\u11ab)']*2) + check('(\u110b\u1169\u110c\u1165\u11ab)', + ['(\uc624\uc804)', '(\u110b\u1169\u110c\u1165\u11ab)']*2) + check('\u4d57', '\u4d57') + check('\u45d7', '\u45d7' if self.old else '\u45d7') + check('\U0002f9bf', '\u4d57' if self.old else '\u45d7') + # New in 4.1.0 + check('\u03a3', '\u03a3') + check('\u03f9', '\u03f9' if self.old else + ['\u03f9', '\u03f9', '\u03a3', '\u03a3']) + # New in 5.0.0 + check('\u1b06', '\u1b06' if self.old else ['\u1b06', '\u1b05\u1b35']*2) + # New in 5.2.0 + check('\U0001f213', '\U0001f213' if self.old else + ['\U0001f213', '\U0001f213', '\u30c7', '\u30c6\u3099']) + # New in 6.1.0 + check('\ufa2e', '\ufa2e' if self.old else '\u90de') + # New in 13.0.0 + check('\U00011938', '\U00011938' if self.old else + ['\U00011938', '\U00011935\U00011930', '\U00011938', '\U00011935\U00011930']) + check('\U0001fbf9', '\U0001fbf9' if self.old else + ['\U0001fbf9', '\U0001fbf9', '9', '9']) + # New in 14.0.0 + check('\U000107ba', '\U000107ba' if self.old else + ['\U000107ba', '\U000107ba', '\U0001df1e', '\U0001df1e']) + # New in 15.0.0 + check('\U0001e06d', '\U0001e06d' if self.old else + ['\U0001e06d', '\U0001e06d', '\u04b1', '\u04b1']) + # New in 16.0.0 + check('\U0001ccd6', '\U0001ccd6' if self.old else + ['\U0001ccd6', '\U0001ccd6', 'A', 'A']) + + self.assertRaises(TypeError, self.db.normalize) + self.assertRaises(TypeError, self.db.normalize, 'NFC') + self.assertRaises(ValueError, self.db.normalize, 'SPAM', 'A') + + self.assertRaises(TypeError, self.db.is_normalized) + self.assertRaises(TypeError, self.db.is_normalized, 'NFC') + self.assertRaises(ValueError, self.db.is_normalized, 'SPAM', 'A') + def test_pr29(self): # https://www.unicode.org/review/pr-29.html # See issues #1054943 and #10254. @@ -225,6 +504,7 @@ def test_pr29(self): def test_issue10254(self): # Crash reported in #10254 + # New in 4.1.0 a = 'C\u0338' * 20 + 'C\u0327' b = 'C\u0338' * 20 + '\xC7' self.assertEqual(self.db.normalize('NFC', a), b) @@ -238,6 +518,7 @@ def test_issue29456(self): u11c3_str_a = '\u1100\u1175\u11c3' u11c3_str_b = '\uae30\u11c3' self.assertEqual(self.db.normalize('NFC', u1176_str_a), u1176_str_b) + # New in 4.1.0 self.assertEqual(self.db.normalize('NFC', u11a7_str_a), u11a7_str_b) self.assertEqual(self.db.normalize('NFC', u11c3_str_a), u11c3_str_b) @@ -255,6 +536,32 @@ def test_east_asian_width(self): self.assertEqual(eaw('\u2010'), 'A') self.assertEqual(eaw('\U00020000'), 'W') + # New in 4.1.0 + self.assertEqual(eaw('\u0350'), 'N' if self.old else 'A') + self.assertEqual(eaw('\U000e01ef'), 'N' if self.old else 'A') + # New in 5.2.0 + self.assertEqual(eaw('\u115a'), 'N' if self.old else 'W') + # New in 9.0.0 + self.assertEqual(eaw('\u231a'), 'N' if self.old else 'W') + self.assertEqual(eaw('\u2614'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0001f19a'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0001f991'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0001f9c0'), 'N' if self.old else 'W') + # New in 12.0.0 + self.assertEqual(eaw('\u32ff'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0001fa95'), 'N' if self.old else 'W') + # New in 13.0.0 + self.assertEqual(eaw('\u31bb'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0003134a'), 'N' if self.old else 'W') + # New in 14.0.0 + self.assertEqual(eaw('\u9ffd'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0002b738'), 'N' if self.old else 'W') + # New in 15.0.0 + self.assertEqual(eaw('\U000323af'), 'N' if self.old else 'W') + # New in 16.0.0 + self.assertEqual(eaw('\u2630'), 'N' if self.old else 'W') + self.assertEqual(eaw('\U0001FAE9'), 'N' if self.old else 'W') + def test_east_asian_width_unassigned(self): eaw = self.db.east_asian_width # unassigned @@ -263,7 +570,8 @@ def test_east_asian_width_unassigned(self): self.assertIs(self.db.name(char, None), None) # unassigned but reserved for CJK - for char in '\uFA6E\uFADA\U0002A6E0\U0002FA20\U0003134B\U0003FFFD': + for char in ('\U0002A6E0\U0002FA20\U0003134B\U0003FFFD' + '\uFA6E\uFADA'): # New in 5.2.0 self.assertEqual(eaw(char), 'W') self.assertIs(self.db.name(char, None), None) @@ -272,11 +580,17 @@ def test_east_asian_width_unassigned(self): self.assertEqual(eaw(char), 'A') self.assertIs(self.db.name(char, None), None) - def test_east_asian_width_9_0_changes(self): - self.assertEqual(self.db.ucd_3_2_0.east_asian_width('\u231a'), 'N') - self.assertEqual(self.db.east_asian_width('\u231a'), 'W') -class UnicodeMiscTest(UnicodeDatabaseTest): +class Unicode_3_2_0_FunctionsTest(UnicodeFunctionsTest): + db = unicodedata.ucd_3_2_0 + old = True + expectedchecksum = ('76b126d719d52ba11788a627d058163106da7d56' + if quicktest else + 'ed843cb7ab5aaf149466498db27fefce81c4214c') + + +class UnicodeMiscTest(unittest.TestCase): + db = unicodedata @cpython_only def test_disallow_instantiation(self): @@ -305,32 +619,39 @@ def test_decimal_numeric_consistent(self): # i.e. if a character has a decimal value, # its numeric value should be the same. count = 0 - for i in range(0x10000): - c = chr(i) + for c in iterallchars(): dec = self.db.decimal(c, -1) if dec != -1: self.assertEqual(dec, self.db.numeric(c)) count += 1 - self.assertTrue(count >= 10) # should have tested at least the ASCII digits + self.assertTrue(count >= 10, count) # should have tested at least the ASCII digits def test_digit_numeric_consistent(self): # Test that digit and numeric are consistent, # i.e. if a character has a digit value, # its numeric value should be the same. count = 0 - for i in range(0x10000): - c = chr(i) + for c in iterallchars(): dec = self.db.digit(c, -1) if dec != -1: self.assertEqual(dec, self.db.numeric(c)) count += 1 - self.assertTrue(count >= 10) # should have tested at least the ASCII digits + self.assertTrue(count >= 10, count) # should have tested at least the ASCII digits + + def test_normalize_consistent(self): + allchars = list(iterallchars()) + for form in ('NFC', 'NFD', 'NFKC', 'NFKD'): + for c in allchars: + norm = self.db.normalize(form, c) + self.assertEqual(self.db.is_normalized(form, c), norm == c) + if norm != c: + self.assertEqual(self.db.normalize(form, norm), norm) + self.assertTrue(self.db.is_normalized(form, norm)) def test_bug_1704793(self): self.assertEqual(self.db.lookup("GOTHIC LETTER FAIHU"), '\U00010346') def test_ucd_510(self): - import unicodedata # In UCD 5.1.0, a mirrored property changed wrt. UCD 3.2.0 self.assertTrue(unicodedata.mirrored("\u0f3a")) self.assertTrue(not unicodedata.ucd_3_2_0.mirrored("\u0f3a")) @@ -346,10 +667,10 @@ def test_bug_5828(self): # Only U+0000 should have U+0000 as its upper/lower/titlecase variant self.assertEqual( [ - c for c in range(sys.maxunicode+1) - if "\x00" in chr(c).lower()+chr(c).upper()+chr(c).title() + c for c in iterallchars() + if "\x00" in (c.lower(), c.upper(), c.title()) ], - [0] + ["\x00"] ) def test_bug_4971(self): @@ -359,15 +680,16 @@ def test_bug_4971(self): self.assertEqual("\u01c6".title(), "\u01c5") def test_linebreak_7643(self): - for i in range(0x10000): - lines = (chr(i) + 'A').splitlines() - if i in (0x0a, 0x0b, 0x0c, 0x0d, 0x85, - 0x1c, 0x1d, 0x1e, 0x2028, 0x2029): + for c in iterallchars(): + lines = (c + 'A').splitlines() + if c in ('\x0a', '\x0b', '\x0c', '\x0d', '\x85', + '\x1c', '\x1d', '\x1e', '\u2028', '\u2029'): self.assertEqual(len(lines), 2, - r"\u%.4x should be a linebreak" % i) + r"%a should be a linebreak" % c) else: self.assertEqual(len(lines), 1, - r"\u%.4x should not be a linebreak" % i) + r"%a should not be a linebreak" % c) + class NormalizationTest(unittest.TestCase): @staticmethod @@ -397,23 +719,23 @@ def test_normalization(self): self.skipTest(f"Failed to download {TESTDATAURL}: {exc}") with testdata: - self.run_normalization_tests(testdata) - - def run_normalization_tests(self, testdata): - part = None - part1_data = {} + self.run_normalization_tests(testdata, unicodedata) - def NFC(str): - return unicodedata.normalize("NFC", str) - - def NFKC(str): - return unicodedata.normalize("NFKC", str) + @requires_resource('cpu') + def test_normalization_3_2_0(self): + testdatafile = findfile('NormalizationTest-3.2.0.txt', 'data') + with open(testdatafile, encoding='utf-8') as testdata: + self.run_normalization_tests(testdata, unicodedata.ucd_3_2_0) - def NFD(str): - return unicodedata.normalize("NFD", str) + def run_normalization_tests(self, testdata, ucd): + part = None + part1_data = set() - def NFKD(str): - return unicodedata.normalize("NFKD", str) + NFC = partial(ucd.normalize, "NFC") + NFKC = partial(ucd.normalize, "NFKC") + NFD = partial(ucd.normalize, "NFD") + NFKD = partial(ucd.normalize, "NFKD") + is_normalized = ucd.is_normalized for line in testdata: if '#' in line: @@ -438,25 +760,24 @@ def NFKD(str): NFKD(c3) == NFKD(c4) == NFKD(c5), line) - self.assertTrue(unicodedata.is_normalized("NFC", c2)) - self.assertTrue(unicodedata.is_normalized("NFC", c4)) + self.assertTrue(is_normalized("NFC", c2)) + self.assertTrue(is_normalized("NFC", c4)) - self.assertTrue(unicodedata.is_normalized("NFD", c3)) - self.assertTrue(unicodedata.is_normalized("NFD", c5)) + self.assertTrue(is_normalized("NFD", c3)) + self.assertTrue(is_normalized("NFD", c5)) - self.assertTrue(unicodedata.is_normalized("NFKC", c4)) - self.assertTrue(unicodedata.is_normalized("NFKD", c5)) + self.assertTrue(is_normalized("NFKC", c4)) + self.assertTrue(is_normalized("NFKD", c5)) # Record part 1 data if part == "@Part1": - part1_data[c1] = 1 + part1_data.add(c1) # Perform tests for all other data - for c in range(sys.maxunicode+1): - X = chr(c) + for X in iterallchars(): if X in part1_data: continue - self.assertTrue(X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), c) + self.assertTrue(X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), ord(X)) def test_edge_cases(self): self.assertRaises(TypeError, unicodedata.normalize) From 78dd2d5ba93564a80ef45689b107b9e02aab3224 Mon Sep 17 00:00:00 2001 From: decorator-factory <42166884+decorator-factory@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:22:30 +0300 Subject: [PATCH 1609/1674] [3.14] gh-142411: Change documentation to reflect the new docstring adjustments in 3.13 (GH-142413) (#142689) --- Doc/library/functions.rst | 4 ++-- Doc/tutorial/controlflow.rst | 23 ++++++++++------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 3167ff4454fca2..961677fa5870e6 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -334,8 +334,8 @@ are always available. They are listed here in alphabetical order. ``__debug__`` is true), ``1`` (asserts are removed, ``__debug__`` is false) or ``2`` (docstrings are removed too). - This function raises :exc:`SyntaxError` if the compiled source is invalid, - and :exc:`ValueError` if the source contains null bytes. + This function raises :exc:`SyntaxError` or :exc:`ValueError` if the compiled + source is invalid. If you want to parse Python code into its AST representation, see :func:`ast.parse`. diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 5ec8789f98c701..f3e69756401b8b 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -1039,31 +1039,28 @@ blank, visually separating the summary from the rest of the description. The following lines should be one or more paragraphs describing the object's calling conventions, its side effects, etc. -The Python parser does not strip indentation from multi-line string literals in -Python, so tools that process documentation have to strip indentation if -desired. This is done using the following convention. The first non-blank line -*after* the first line of the string determines the amount of indentation for -the entire documentation string. (We can't use the first line since it is -generally adjacent to the string's opening quotes so its indentation is not -apparent in the string literal.) Whitespace "equivalent" to this indentation is -then stripped from the start of all lines of the string. Lines that are -indented less should not occur, but if they occur all their leading whitespace -should be stripped. Equivalence of whitespace should be tested after expansion -of tabs (to 8 spaces, normally). +The Python parser strips indentation from multi-line string literals when they +serve as module, class, or function docstrings. Here is an example of a multi-line docstring:: >>> def my_function(): ... """Do nothing, but document it. ... - ... No, really, it doesn't do anything. + ... No, really, it doesn't do anything: + ... + ... >>> my_function() + ... >>> ... """ ... pass ... >>> print(my_function.__doc__) Do nothing, but document it. - No, really, it doesn't do anything. + No, really, it doesn't do anything: + + >>> my_function() + >>> .. _tut-annotations: From e0243c664ce677c2b8e356379ec04ba298af9458 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 14 Dec 2025 19:53:13 +0100 Subject: [PATCH 1610/1674] [3.14] gh-106318: Add examples for str.isnumeric() (GH-142680) (#142715) Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/stdtypes.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 9bb903688bc0d3..ffab8f854f344b 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2155,6 +2155,21 @@ expression support in the :mod:`re` module). that have the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION ONE FIFTH. Formally, numeric characters are those with the property value Numeric_Type=Digit, Numeric_Type=Decimal or Numeric_Type=Numeric. + For example: + + .. doctest:: + + >>> '0123456789'.isnumeric() + True + >>> '٠١٢٣٤٥٦٧٨٩'.isnumeric() # Arabic-indic digit zero to nine + True + >>> '⅕'.isnumeric() # Vulgar fraction one fifth + True + >>> '²'.isdecimal(), '²'.isdigit(), '²'.isnumeric() + (False, True, True) + + See also :meth:`isdecimal` and :meth:`isdigit`. Numeric characters are + a superset of decimal numbers. .. method:: str.isprintable() From bf4f5087043d8ea16ce868894bd0b9dedcf1ab3a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 14 Dec 2025 22:49:30 +0100 Subject: [PATCH 1611/1674] [3.14] gh-142724: fix error path in `_PyPegen_raise_tokenizer_init_error` (GH-142725) (#142726) Co-authored-by: AZero13 <gfunni234@gmail.com> --- Parser/pegen_errors.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index 0639a4e42436be..1c61524d60a1af 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -43,7 +43,7 @@ _PyPegen_raise_tokenizer_init_error(PyObject *filename) tuple = PyTuple_Pack(2, errstr, tmp); Py_DECREF(tmp); - if (!value) { + if (!tuple) { goto error; } PyErr_SetObject(PyExc_SyntaxError, tuple); From f17281741c623eefe364ae4d7fd643c44bffe208 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:51:52 +0100 Subject: [PATCH 1612/1674] [3.14] gh-142651: make `Mock.call_count` thread-safe (GH-142656) (#142743) gh-142651: make `Mock.call_count` thread-safe (GH-142656) (cherry picked from commit 850f95f6f64a55920cbb91b022b70b736bd20ed8) Co-authored-by: chaope <pengchaoandy@gmail.com> --- .../testmock/testthreadingmock.py | 24 ++++++++++++++++++- Lib/unittest/mock.py | 2 +- ...-12-13-06-17-44.gh-issue-142651.ZRtBu4.rst | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-13-06-17-44.gh-issue-142651.ZRtBu4.rst diff --git a/Lib/test/test_unittest/testmock/testthreadingmock.py b/Lib/test/test_unittest/testmock/testthreadingmock.py index a02b532ed447cd..3603995b090a6c 100644 --- a/Lib/test/test_unittest/testmock/testthreadingmock.py +++ b/Lib/test/test_unittest/testmock/testthreadingmock.py @@ -1,8 +1,10 @@ +import sys import time import unittest +import threading import concurrent.futures -from test.support import threading_helper +from test.support import setswitchinterval, threading_helper from unittest.mock import patch, ThreadingMock @@ -196,6 +198,26 @@ def test_reset_mock_resets_wait(self): m.wait_until_any_call_with() m.assert_called_once() + def test_call_count_thread_safe(self): + # See https://github.com/python/cpython/issues/142651. + m = ThreadingMock() + LOOPS = 100 + THREADS = 10 + def test_function(): + for _ in range(LOOPS): + m() + + oldswitchinterval = sys.getswitchinterval() + setswitchinterval(1e-6) + try: + threads = [threading.Thread(target=test_function) for _ in range(THREADS)] + with threading_helper.start_threads(threads): + pass + finally: + sys.setswitchinterval(oldswitchinterval) + + self.assertEqual(m.call_count, LOOPS * THREADS) + if __name__ == "__main__": unittest.main() diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index e370aa48b7c703..feb9730d6e980e 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1180,7 +1180,6 @@ def _mock_call(self, /, *args, **kwargs): def _increment_mock_call(self, /, *args, **kwargs): self.called = True - self.call_count += 1 # handle call_args # needs to be set here so assertions on call arguments pass before @@ -1188,6 +1187,7 @@ def _increment_mock_call(self, /, *args, **kwargs): _call = _Call((args, kwargs), two=True) self.call_args = _call self.call_args_list.append(_call) + self.call_count = len(self.call_args_list) # initial stuff for method_calls: do_method_calls = self._mock_parent is not None diff --git a/Misc/NEWS.d/next/Library/2025-12-13-06-17-44.gh-issue-142651.ZRtBu4.rst b/Misc/NEWS.d/next/Library/2025-12-13-06-17-44.gh-issue-142651.ZRtBu4.rst new file mode 100644 index 00000000000000..236900bac5d6f6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-13-06-17-44.gh-issue-142651.ZRtBu4.rst @@ -0,0 +1,3 @@ +:mod:`unittest.mock`: fix a thread safety issue where :attr:`Mock.call_count +<unittest.mock.Mock.call_count>` may return inaccurate values when the mock +is called concurrently from multiple threads. From 575174ee7824d5d25fabbc0d5255c031d6b4f6f5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:03:57 +0100 Subject: [PATCH 1613/1674] [3.14] gh-142595: add type check for namedtuple call during decimal initialization (GH-142608) (GH-142623) (cherry picked from commit be5e0dcdedb63185aaa3e2f711d14dc828cb3640) Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> --- .../2025-12-12-02-56-26.gh-issue-142595.wHvTqq.rst | 2 ++ Modules/_decimal/_decimal.c | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-12-02-56-26.gh-issue-142595.wHvTqq.rst diff --git a/Misc/NEWS.d/next/Library/2025-12-12-02-56-26.gh-issue-142595.wHvTqq.rst b/Misc/NEWS.d/next/Library/2025-12-12-02-56-26.gh-issue-142595.wHvTqq.rst new file mode 100644 index 00000000000000..987e1ae8354b18 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-12-02-56-26.gh-issue-142595.wHvTqq.rst @@ -0,0 +1,2 @@ +Added type check during initialization of the :mod:`decimal` module to +prevent a crash in case of broken stdlib. Patch by Sergey B Kirpichev. diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 602b23cfca8945..49dc45a4aff5c7 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -6040,10 +6040,14 @@ _decimal_exec(PyObject *m) /* DecimalTuple */ ASSIGN_PTR(collections, PyImport_ImportModule("collections")); - ASSIGN_PTR(state->DecimalTuple, (PyTypeObject *)PyObject_CallMethod(collections, - "namedtuple", "(ss)", "DecimalTuple", - "sign digits exponent")); - + obj = PyObject_CallMethod(collections, "namedtuple", "(ss)", "DecimalTuple", + "sign digits exponent"); + if (!PyType_Check(obj)) { + PyErr_SetString(PyExc_TypeError, + "type is expected from namedtuple call"); + goto error; + } + ASSIGN_PTR(state->DecimalTuple, (PyTypeObject *)obj); ASSIGN_PTR(obj, PyUnicode_FromString("decimal")); CHECK_INT(PyDict_SetItemString(state->DecimalTuple->tp_dict, "__module__", obj)); Py_CLEAR(obj); From 88ac9956cd9bf71635e87c39feb49c5f2b513b1a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 15 Dec 2025 23:18:47 +0100 Subject: [PATCH 1614/1674] [3.14] gh-85222: Document the global start method side effect in multiprocessing (GH-136426) (#142770) gh-85222: Document the global start method side effect in multiprocessing (GH-136426) * Document the ctx parameter in some types in multiprocessing. * Reduce duplication while still linking to the central explanation from API points with the side effect. (cherry picked from commit 0978b9a7d5eedab19d7d39bd703ed5b55fd7aa5f) Co-authored-by: AN Long <aisk@users.noreply.github.com> Co-authored-by: Carol Willing <carolcode@willingconsulting.com> Co-authored-by: R Chintan Meher <meherrihaan@gmail.com> --- Doc/library/multiprocessing.rst | 86 +++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 14 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 92605c57527887..382a0abedfc3bc 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -521,6 +521,21 @@ Reference The :mod:`multiprocessing` package mostly replicates the API of the :mod:`threading` module. +.. _global-start-method: + +Global start method +^^^^^^^^^^^^^^^^^^^ + +Python supports several ways to create and initialize a process. +The global start method sets the default mechanism for creating a process. + +Several multiprocessing functions and methods that may also instantiate +certain objects will implicitly set the global start method to the system's default, +if it hasn’t been set already. The global start method can only be set once. +If you need to change the start method from the system default, you must +proactively set the global start method before calling functions or methods, +or creating these objects. + :class:`Process` and exceptions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -910,6 +925,9 @@ For an example of the usage of queues for interprocess communication see locks/semaphores. When a process first puts an item on the queue a feeder thread is started which transfers objects from a buffer into the pipe. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + The usual :exc:`queue.Empty` and :exc:`queue.Full` exceptions from the standard library's :mod:`queue` module are raised to signal timeouts. @@ -1025,6 +1043,9 @@ For an example of the usage of queues for interprocess communication see It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + .. method:: close() Close the queue: release internal resources. @@ -1055,6 +1076,9 @@ For an example of the usage of queues for interprocess communication see :class:`JoinableQueue`, a :class:`Queue` subclass, is a queue which additionally has :meth:`task_done` and :meth:`join` methods. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + .. method:: task_done() Indicate that a formerly enqueued task is complete. Used by queue @@ -1167,8 +1191,8 @@ Miscellaneous :mod:`multiprocessing` module. If *method* is ``None`` then the default context is returned. Note that if - the global start method has not been set, this will set it to the - default method. + the global start method has not been set, this will set it to the system default + See :ref:`global-start-method` for more details. Otherwise *method* should be ``'fork'``, ``'spawn'``, ``'forkserver'``. :exc:`ValueError` is raised if the specified start method is not available. See :ref:`multiprocessing-start-methods`. @@ -1179,10 +1203,9 @@ Miscellaneous Return the name of start method used for starting processes. - If the global start method has not been set and *allow_none* is - ``False``, then the start method is set to the default and the name - is returned. If the start method has not been set and *allow_none* is - ``True`` then ``None`` is returned. + If the global start method is not set and *allow_none* is ``False``, the global start + method is set to the default, and its name is returned. See + :ref:`global-start-method` for more details. The return value can be ``'fork'``, ``'spawn'``, ``'forkserver'`` or ``None``. See :ref:`multiprocessing-start-methods`. @@ -1409,6 +1432,9 @@ object -- see :ref:`multiprocessing-managers`. A barrier object: a clone of :class:`threading.Barrier`. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + .. versionadded:: 3.3 .. class:: BoundedSemaphore([value]) @@ -1416,6 +1442,9 @@ object -- see :ref:`multiprocessing-managers`. A bounded semaphore object: a close analog of :class:`threading.BoundedSemaphore`. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + A solitary difference from its close analog exists: its ``acquire`` method's first argument is named *block*, as is consistent with :meth:`Lock.acquire`. @@ -1436,6 +1465,9 @@ object -- see :ref:`multiprocessing-managers`. If *lock* is specified then it should be a :class:`Lock` or :class:`RLock` object from :mod:`multiprocessing`. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + .. versionchanged:: 3.3 The :meth:`~threading.Condition.wait_for` method was added. @@ -1443,6 +1475,8 @@ object -- see :ref:`multiprocessing-managers`. A clone of :class:`threading.Event`. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. .. class:: Lock() @@ -1458,6 +1492,9 @@ object -- see :ref:`multiprocessing-managers`. instance of ``multiprocessing.synchronize.Lock`` initialized with a default context. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + :class:`Lock` supports the :term:`context manager` protocol and thus may be used in :keyword:`with` statements. @@ -1515,6 +1552,9 @@ object -- see :ref:`multiprocessing-managers`. instance of ``multiprocessing.synchronize.RLock`` initialized with a default context. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + :class:`RLock` supports the :term:`context manager` protocol and thus may be used in :keyword:`with` statements. @@ -1574,6 +1614,9 @@ object -- see :ref:`multiprocessing-managers`. A semaphore object: a close analog of :class:`threading.Semaphore`. + Instantiating this class may set the global start method. See + :ref:`global-start-method` for more details. + A solitary difference from its close analog exists: its ``acquire`` method's first argument is named *block*, as is consistent with :meth:`Lock.acquire`. @@ -1718,7 +1761,7 @@ processes. attributes which allow one to use it to store and retrieve strings -- see documentation for :mod:`ctypes`. -.. function:: Array(typecode_or_type, size_or_initializer, *, lock=True) +.. function:: Array(typecode_or_type, size_or_initializer, *, lock=True, ctx=None) The same as :func:`RawArray` except that depending on the value of *lock* a process-safe synchronization wrapper may be returned instead of a raw ctypes @@ -1732,9 +1775,13 @@ processes. automatically protected by a lock, so it will not necessarily be "process-safe". - Note that *lock* is a keyword-only argument. + *ctx* is a context object, or ``None`` (use the current context). If ``None``, + calling this may set the global start method. See + :ref:`global-start-method` for more details. -.. function:: Value(typecode_or_type, *args, lock=True) + Note that *lock* and *ctx* are keyword-only parameters. + +.. function:: Value(typecode_or_type, *args, lock=True, ctx=None) The same as :func:`RawValue` except that depending on the value of *lock* a process-safe synchronization wrapper may be returned instead of a raw ctypes @@ -1747,19 +1794,27 @@ processes. automatically protected by a lock, so it will not necessarily be "process-safe". - Note that *lock* is a keyword-only argument. + *ctx* is a context object, or ``None`` (use the current context). If ``None``, + calling this may set the global start method. See + :ref:`global-start-method` for more details. + + Note that *lock* and *ctx* are keyword-only parameters. .. function:: copy(obj) Return a ctypes object allocated from shared memory which is a copy of the ctypes object *obj*. -.. function:: synchronized(obj[, lock]) +.. function:: synchronized(obj, lock=None, ctx=None) Return a process-safe wrapper object for a ctypes object which uses *lock* to synchronize access. If *lock* is ``None`` (the default) then a :class:`multiprocessing.RLock` object is created automatically. + *ctx* is a context object, or ``None`` (use the current context). If ``None``, + calling this may set the global start method. See + :ref:`global-start-method` for more details. + A synchronized wrapper will have two methods in addition to those of the object it wraps: :meth:`get_obj` returns the wrapped object and :meth:`get_lock` returns the lock object used for synchronization. @@ -1877,8 +1932,9 @@ their parent process exits. The manager classes are defined in the *serializer* must be ``'pickle'`` (use :mod:`pickle` serialization) or ``'xmlrpclib'`` (use :mod:`xmlrpc.client` serialization). - *ctx* is a context object, or ``None`` (use the current context). See the - :func:`get_context` function. + *ctx* is a context object, or ``None`` (use the current context). If ``None``, + calling this may set the global start method. See + :ref:`global-start-method` for more details. *shutdown_timeout* is a timeout in seconds used to wait until the process used by the manager completes in the :meth:`shutdown` method. If the @@ -2371,7 +2427,9 @@ with the :class:`Pool` class. the worker processes. Usually a pool is created using the function :func:`multiprocessing.Pool` or the :meth:`Pool` method of a context object. In both cases *context* is set - appropriately. + appropriately. If ``None``, calling this function will have the side effect + of setting the current global start method if it has not been set already. + See the :func:`get_context` function. Note that the methods of the pool object should only be called by the process which created the pool. From b9cbdde80d0d468dd40bbcef51a36db96ee15b9c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 00:30:00 +0100 Subject: [PATCH 1615/1674] [3.14] gh-142737: Handle lost `io.open` in `_Py_FindSourceFile` (GH-142747) (GH-142773) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-142737: Handle lost `io.open` in `_Py_FindSourceFile` (GH-142747) (cherry picked from commit f277781bba684322dffffe45cd878f4652ccf7e4) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> --- Lib/test/test_traceback.py | 29 ++++++++++++++++++- ...-12-15-15-01-21.gh-issue-142737.xYXzeB.rst | 3 ++ Objects/call.c | 1 + Python/traceback.c | 3 ++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-15-15-01-21.gh-issue-142737.xYXzeB.rst diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index b21daeb1b67556..c87ad67ed05a3a 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -18,7 +18,7 @@ from test.support import (Error, captured_output, cpython_only, ALWAYS_EQ, requires_debug_ranges, has_no_debug_ranges, requires_subprocess) -from test.support.os_helper import TESTFN, unlink +from test.support.os_helper import TESTFN, temp_dir, unlink from test.support.script_helper import assert_python_ok, assert_python_failure, make_script from test.support.import_helper import forget from test.support import force_not_colorized, force_not_colorized_test_class @@ -504,6 +504,33 @@ def __del__(self): b'ZeroDivisionError: division by zero'] self.assertEqual(stderr.splitlines(), expected) + @cpython_only + def test_lost_io_open(self): + # GH-142737: Display the traceback even if io.open is lost + crasher = textwrap.dedent("""\ + import io + import traceback + # Trigger fallback mode + traceback._print_exception_bltin = None + del io.open + raise RuntimeError("should not crash") + """) + + # Create a temporary script to exercise _Py_FindSourceFile + with temp_dir() as script_dir: + script = make_script( + script_dir=script_dir, + script_basename='tb_test_no_io_open', + source=crasher) + rc, stdout, stderr = assert_python_failure(script) + + self.assertEqual(rc, 1) # Make sure it's not a crash + + expected = [b'Traceback (most recent call last):', + f' File "{script}", line 6, in <module>'.encode(), + b'RuntimeError: should not crash'] + self.assertEqual(stderr.splitlines(), expected) + def test_print_exception(self): output = StringIO() traceback.print_exception( diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-15-15-01-21.gh-issue-142737.xYXzeB.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-15-15-01-21.gh-issue-142737.xYXzeB.rst new file mode 100644 index 00000000000000..8b743d1e49de21 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-15-15-01-21.gh-issue-142737.xYXzeB.rst @@ -0,0 +1,3 @@ +Tracebacks will be displayed in fallback mode even if :func:`io.open` is lost. +Previously, this would crash the interpreter. +Patch by Bartosz Sławecki. diff --git a/Objects/call.c b/Objects/call.c index b1610dababd466..6e331a43899a06 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -726,6 +726,7 @@ _PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name, PyObject * _PyObject_CallMethodFormat(PyThreadState *tstate, PyObject *callable, const char *format, ...) { + assert(callable != NULL); va_list va; va_start(va, format); PyObject *retval = callmethod(tstate, callable, format, va); diff --git a/Python/traceback.c b/Python/traceback.c index 86273da3c8ae3c..b9c9132c0c50c1 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -416,6 +416,9 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject * npath = PyList_Size(syspath); open = PyObject_GetAttr(io, &_Py_ID(open)); + if (open == NULL) { + goto error; + } for (i = 0; i < npath; i++) { v = PyList_GetItem(syspath, i); if (v == NULL) { From 58da2a9d94afc144da0e942fb293c4176da15174 Mon Sep 17 00:00:00 2001 From: Cody Maloney <cmaloney@users.noreply.github.com> Date: Tue, 16 Dec 2025 01:55:25 -0800 Subject: [PATCH 1616/1674] [3.14] gh-142594: fix by property calls io.TextIOWrapper.detach (GH-142706) (GH-142755) (cherry picked from commit 1d3854a19a376c1fc7f71e96c620f6bc2de8cd74) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Co-authored-by: yihong <zouzou0208@gmail.com> --- Lib/test/test_io.py | 16 ++++++++++++++++ ...025-12-14-18-30-48.gh-issue-142594.belDmD.rst | 2 ++ Modules/_io/textio.c | 3 +++ 3 files changed, 21 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 6514af8b1253c3..57b42fbb65fe10 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -4194,6 +4194,22 @@ def write(self, data): self.assertEqual([b"abcdef", b"middle", b"g"*chunk_size], buf._write_stack) + def test_issue142594(self): + wrapper = None + detached = False + class ReentrantRawIO(self.RawIOBase): + @property + def closed(self): + nonlocal detached + if wrapper is not None and not detached: + detached = True + wrapper.detach() + return False + + raw = ReentrantRawIO() + wrapper = self.TextIOWrapper(raw) + wrapper.close() # should not crash + class PyTextIOWrapperTest(TextIOWrapperTest): io = pyio diff --git a/Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst b/Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst new file mode 100644 index 00000000000000..ee6a958933f7c8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-14-18-30-48.gh-issue-142594.belDmD.rst @@ -0,0 +1,2 @@ +Fix crash in ``TextIOWrapper.close()`` when the underlying buffer's +``closed`` property calls :meth:`~io.TextIOBase.detach`. diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index a136987fb52a4a..9945febea80828 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -3149,6 +3149,9 @@ _io_TextIOWrapper_close_impl(textio *self) if (r > 0) { Py_RETURN_NONE; /* stream already closed */ } + if (self->detached) { + Py_RETURN_NONE; /* gh-142594 null pointer issue */ + } else { PyObject *exc = NULL; if (self->finalizing) { From 4cbd2fa348e5291ffae684c168599c19f1a74d0b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:56:25 +0100 Subject: [PATCH 1617/1674] [3.14] gh-142020: ctypes docs: Note that find_library relies on the programs it runs (GH-142134) (GH-142748) (cherry picked from commit e4d32a3ef9eab34225fd9320632edbce834f4033) Co-authored-by: Petr Viktorin <encukou@gmail.com> --- Doc/library/ctypes.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 9c0b246c095483..6038af99009d02 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1388,6 +1388,9 @@ On Linux, :func:`~ctypes.util.find_library` tries to run external programs (``/sbin/ldconfig``, ``gcc``, ``objdump`` and ``ld``) to find the library file. It returns the filename of the library file. +Note that if the output of these programs does not correspond to the dynamic +linker used by Python, the result of this function may be misleading. + .. versionchanged:: 3.6 On Linux, the value of the environment variable ``LD_LIBRARY_PATH`` is used when searching for libraries, if a library cannot be found by any other means. @@ -2132,6 +2135,8 @@ Utility functions The exact functionality is system dependent. + See :ref:`ctypes-finding-shared-libraries` for complete documentation. + .. function:: find_msvcrt() :module: ctypes.util From c31ea74970eaf6a3e9ab0db870131c53dcc0c999 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 11:12:43 +0100 Subject: [PATCH 1618/1674] [3.14] gh-142595: Amend be5e0dcdedb (fix NULL pointer dereference) (GH-142775) (#142788) gh-142595: Amend be5e0dcdedb (fix NULL pointer dereference) (GH-142775) (cherry picked from commit 15a9762500b3d9a13206aa54d8695513efaf3b55) Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> --- Modules/_decimal/_decimal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 49dc45a4aff5c7..4516c7d847bded 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -6040,8 +6040,9 @@ _decimal_exec(PyObject *m) /* DecimalTuple */ ASSIGN_PTR(collections, PyImport_ImportModule("collections")); - obj = PyObject_CallMethod(collections, "namedtuple", "(ss)", "DecimalTuple", - "sign digits exponent"); + ASSIGN_PTR(obj, PyObject_CallMethod(collections, "namedtuple", "(ss)", + "DecimalTuple", + "sign digits exponent")); if (!PyType_Check(obj)) { PyErr_SetString(PyExc_TypeError, "type is expected from namedtuple call"); From 8150abb99183771324fdffccd316df6c7e8628c5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:27:20 +0100 Subject: [PATCH 1619/1674] [3.14] gh-124864: Extends smtplib documentation on ESMTP options format (GH-132547) (#142796) Co-authored-by: Patrick R <codeZeilen@users.noreply.github.com> --- Doc/library/smtplib.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index c5a3de52090cee..10525c90aa9072 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -440,9 +440,11 @@ An :class:`SMTP` instance has the following methods: Send mail. The required arguments are an :rfc:`822` from-address string, a list of :rfc:`822` to-address strings (a bare string will be treated as a list with 1 address), and a message string. The caller may pass a list of ESMTP options - (such as ``8bitmime``) to be used in ``MAIL FROM`` commands as *mail_options*. + (such as ``"8bitmime"``) to be used in ``MAIL FROM`` commands as *mail_options*. ESMTP options (such as ``DSN`` commands) that should be used with all ``RCPT`` - commands can be passed as *rcpt_options*. (If you need to use different ESMTP + commands can be passed as *rcpt_options*. Each option should be passed as a string + containing the full text of the option, including any potential key + (for instance, ``"NOTIFY=SUCCESS,FAILURE"``). (If you need to use different ESMTP options to different recipients you have to use the low-level methods such as :meth:`!mail`, :meth:`!rcpt` and :meth:`!data` to send the message.) From 968d51b41416d445bf5514362bd8e0e1e9a6faa1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:32:07 +0100 Subject: [PATCH 1620/1674] [3.14] gh-85204: Improve `locale.setlocale` example (GH-132683) (#142798) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/locale.rst | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 790bd3a5836423..0f49f30b9d765d 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -48,8 +48,19 @@ The :mod:`locale` module defines the following exception and functions: If *locale* is omitted or ``None``, the current setting for *category* is returned. + Example:: + + >>> import locale + >>> loc = locale.setlocale(locale.LC_ALL) # get current locale + # use German locale; name and availability varies with platform + >>> locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') + >>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut + >>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale + >>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale + >>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale + :func:`setlocale` is not thread-safe on most systems. Applications typically - start with a call of :: + start with a call of:: import locale locale.setlocale(locale.LC_ALL, '') @@ -573,18 +584,6 @@ The :mod:`locale` module defines the following exception and functions: :func:`localeconv`. -Example:: - - >>> import locale - >>> loc = locale.getlocale() # get current locale - # use German locale; name might vary with platform - >>> locale.setlocale(locale.LC_ALL, 'de_DE') - >>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut - >>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale - >>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale - >>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale - - Background, details, hints, tips and caveats -------------------------------------------- From e0a77821d65edb1178091023aa74de2ab99efbdd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:45:13 +0100 Subject: [PATCH 1621/1674] [3.14] gh-106318: Add examples for str.ljust() method (GH-142719) (#142802) Co-authored-by: Adorilson Bezerra <adorilson@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/stdtypes.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ffab8f854f344b..896b020bfa22fd 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2261,6 +2261,19 @@ expression support in the :mod:`re` module). done using the specified *fillchar* (default is an ASCII space). The original string is returned if *width* is less than or equal to ``len(s)``. + For example: + + .. doctest:: + + >>> 'Python'.ljust(10) + 'Python ' + >>> 'Python'.ljust(10, '.') + 'Python....' + >>> 'Monty Python'.ljust(10, '.') + 'Monty Python' + + See also :meth:`rjust`. + .. method:: str.lower() From fdc79776eb245e5468d871ba7967926d8254921b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:49:57 +0100 Subject: [PATCH 1622/1674] [3.14] Correct Glossary key function example to use str.casefold instead of str.lower (GH-140316) (#142807) Co-authored-by: Cameron Beck <94604154+cbkinase@users.noreply.github.com> --- Doc/glossary.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index a4066d42927f64..3a01df99c38caf 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -813,7 +813,7 @@ Glossary :func:`itertools.groupby`. There are several ways to create a key function. For example. the - :meth:`str.lower` method can serve as a key function for case insensitive + :meth:`str.casefold` method can serve as a key function for case insensitive sorts. Alternatively, a key function can be built from a :keyword:`lambda` expression such as ``lambda r: (r[0], r[2])``. Also, :func:`operator.attrgetter`, :func:`operator.itemgetter`, and From 8916a8bf176578c44fa9dde095d09bb76fdeeb6e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:51:36 +0100 Subject: [PATCH 1623/1674] [3.14] Remove duplicate content in `Mapping types - dict` documentation (GH-141036) (#142808) Co-authored-by: Owain Davies <116417456+OTheDev@users.noreply.github.com> --- Doc/library/stdtypes.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 896b020bfa22fd..c71de748e453f6 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5076,9 +5076,6 @@ can be used interchangeably to index the same dictionary entry. being added is already present, the value from the keyword argument replaces the value from the positional argument. - Providing keyword arguments as in the first example only works for keys that - are valid Python identifiers. Otherwise, any valid keys can be used. - Dictionaries compare equal if and only if they have the same ``(key, value)`` pairs (regardless of ordering). Order comparisons ('<', '<=', '>=', '>') raise :exc:`TypeError`. To illustrate dictionary creation and equality, From 988e4f1b89c73125a61117843c001ded0644693c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:52:06 +0100 Subject: [PATCH 1624/1674] [3.14] gh-141218: Fix inaccurate object comparison documentation (GH-141221) (#142810) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mohsin Mehmood <55545648+mohsinm-dev@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Doc/library/stdtypes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index c71de748e453f6..2a31bc04f6393f 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -164,7 +164,7 @@ This table summarizes the comparison operations: pair: object; numeric pair: objects; comparing -Objects of different types, except different numeric types, never compare equal. +Unless stated otherwise, objects of different types never compare equal. The ``==`` operator is always defined but for some object types (for example, class objects) is equivalent to :keyword:`is`. The ``<``, ``<=``, ``>`` and ``>=`` operators are only defined where they make sense; for example, they raise a From 6545f244b83f5bff49dd05f6712f287798858c1a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:54:44 +0100 Subject: [PATCH 1625/1674] [3.14] gh-119786: Remove mention of `_PyThreadState_BumpFramePointer` from `InternalDocs/interpreter.md` (GH-141816) (#142812) Co-authored-by: Mikhail Efimov <efimov.mikhail@gmail.com> Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> --- InternalDocs/interpreter.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/InternalDocs/interpreter.md b/InternalDocs/interpreter.md index 38e9f6fced6088..75acdf596a7f30 100644 --- a/InternalDocs/interpreter.md +++ b/InternalDocs/interpreter.md @@ -226,10 +226,11 @@ Up through 3.10, the call stack was implemented as a singly-linked list of heap allocation for the stack frame. Since 3.11, frames are no longer fully-fledged objects. Instead, a leaner internal -`_PyInterpreterFrame` structure is used, which is allocated using a custom allocator -function (`_PyThreadState_BumpFramePointer()`), which allocates and initializes a -frame structure. Usually a frame allocation is just a pointer bump, which improves -memory locality. +`_PyInterpreterFrame` structure is used. Most frames are allocated contiguously in a +per-thread stack (see `_PyThreadState_PushFrame` in [Python/pystate.c](../Python/pystate.c)), +which improves memory locality and reduces overhead. +If the current `datastack_chunk` has enough space (`_PyThreadState_HasStackSpace`) +then the lightweight `_PyFrame_PushUnchecked` can be used instead of `_PyThreadState_PushFrame`. Sometimes an actual `PyFrameObject` is needed, such as when Python code calls `sys._getframe()` or an extension module calls From 5bd413f1f4d2df9b09029fe7ec32973e0e9307b1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 13:01:50 +0100 Subject: [PATCH 1626/1674] [3.14] gh-142019: Add description about the exponent of result formatted with presentation type 'e' (GH-142084) (#142813) Co-authored-by: 1nftf <QfxZ11@proton.me> --- Doc/library/string.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 58c836c7382330..e3ad018d1d073b 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -546,6 +546,9 @@ The available presentation types for :class:`float` and | | :class:`float`, and shows all coefficient digits | | | for :class:`~decimal.Decimal`. If ``p=0``, the decimal | | | point is omitted unless the ``#`` option is used. | + | | | + | | For :class:`float`, the exponent always contains at | + | | least two digits, and is zero if the value is zero. | +---------+----------------------------------------------------------+ | ``'E'`` | Scientific notation. Same as ``'e'`` except it uses | | | an upper case 'E' as the separator character. | From c727b99cf213b864fcf720571d6170d722845c0b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 13:03:47 +0100 Subject: [PATCH 1627/1674] [3.14] gh-83926: BlockingIOError characters_written is byte count (GH-141215) (#142816) gh-83926: BlockingIOError characters_written is byte count (GH-141215) (cherry picked from commit e12c744b0a9322186146a90a5d2283d9a1049d31) Co-authored-by: Cody Maloney <cmaloney@users.noreply.github.com> --- Doc/library/exceptions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 9d3e0a4c20f9eb..3f1ec95005cbb5 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -735,8 +735,8 @@ depending on the system error code. .. attribute:: characters_written - An integer containing the number of characters written to the stream - before it blocked. This attribute is available when using the + An integer containing the number of **bytes** written to the stream + before it blocked. This attribute is available when using the buffered I/O classes from the :mod:`io` module. .. exception:: ChildProcessError From f162bcc188e0f9f16cea2df97460b5ed67649e40 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:50:56 +0100 Subject: [PATCH 1628/1674] [3.14] gh-130536: Add details to `os.path` documentation (GH-130557) (#142800) Co-authored-by: Arthur Wigo <arthur.l.wigo@gmail.com> --- Doc/library/os.path.rst | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index f18ca92bb206f3..4d3aa8b5c482e1 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -57,8 +57,9 @@ the :mod:`glob` module.) .. function:: abspath(path) Return a normalized absolutized version of the pathname *path*. On most - platforms, this is equivalent to calling the function :func:`normpath` as - follows: ``normpath(join(os.getcwd(), path))``. + platforms, this is equivalent to calling ``normpath(join(os.getcwd(), path))``. + + .. seealso:: :func:`os.path.join` and :func:`os.path.normpath`. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -243,6 +244,8 @@ the :mod:`glob` module.) begins with a slash, on Windows that it begins with two (back)slashes, or a drive letter, colon, and (back)slash together. + .. seealso:: :func:`abspath` + .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -357,14 +360,28 @@ the :mod:`glob` module.) concatenation of *path* and all members of *\*paths*, with exactly one directory separator following each non-empty part, except the last. That is, the result will only end in a separator if the last part is either empty or - ends in a separator. If a segment is an absolute path (which on Windows - requires both a drive and a root), then all previous segments are ignored and - joining continues from the absolute path segment. + ends in a separator. + + If a segment is an absolute path (which on Windows requires both a drive and + a root), then all previous segments are ignored and joining continues from the + absolute path segment. On Linux, for example:: + + >>> os.path.join('/home/foo', 'bar') + '/home/foo/bar' + >>> os.path.join('/home/foo', '/home/bar') + '/home/bar' On Windows, the drive is not reset when a rooted path segment (e.g., ``r'\foo'``) is encountered. If a segment is on a different drive or is an - absolute path, all previous segments are ignored and the drive is reset. Note - that since there is a current directory for each drive, + absolute path, all previous segments are ignored and the drive is reset. For + example:: + + >>> os.path.join('c:\\', 'foo') + 'c:\\foo' + >>> os.path.join('c:\\foo', 'd:\\bar') + 'd:\\bar' + + Note that since there is a current directory for each drive, ``os.path.join("c:", "foo")`` represents a path relative to the current directory on drive :file:`C:` (:file:`c:foo`), not :file:`c:\\foo`. @@ -518,8 +535,8 @@ the :mod:`glob` module.) *path* is empty, both *head* and *tail* are empty. Trailing slashes are stripped from *head* unless it is the root (one or more slashes only). In all cases, ``join(head, tail)`` returns a path to the same location as *path* - (but the strings may differ). Also see the functions :func:`dirname` and - :func:`basename`. + (but the strings may differ). Also see the functions :func:`join`, + :func:`dirname` and :func:`basename`. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. From d089cad6564f6ef713b5acab85cb42b28611f5e8 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 16:31:05 +0100 Subject: [PATCH 1629/1674] [3.14] gh-142495: Make `defaultdict` keep existed value when racing with `__missing__` (GH-142668) (GH-142832) (cherry picked from commit a0434075108efe6acdfba34f42545f4d80ac9a5e) Co-authored-by: Edward Xu <xuxiangad@gmail.com> --- Lib/test/test_defaultdict.py | 18 ++++++++++++++++++ ...5-12-13-23-26-42.gh-issue-142495.I88Uv_.rst | 4 ++++ Modules/_collectionsmodule.c | 10 +++++----- 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-13-23-26-42.gh-issue-142495.I88Uv_.rst diff --git a/Lib/test/test_defaultdict.py b/Lib/test/test_defaultdict.py index bdbe9b81e8fb3f..fbd7354a915a0a 100644 --- a/Lib/test/test_defaultdict.py +++ b/Lib/test/test_defaultdict.py @@ -186,5 +186,23 @@ def test_union(self): with self.assertRaises(TypeError): i |= None + def test_factory_conflict_with_set_value(self): + key = "conflict_test" + count = 0 + + def default_factory(): + nonlocal count + count += 1 + local_count = count + if count == 1: + test_dict[key] + return local_count + + test_dict = defaultdict(default_factory) + + self.assertEqual(count, 0) + self.assertEqual(test_dict[key], 2) + self.assertEqual(count, 2) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-12-13-23-26-42.gh-issue-142495.I88Uv_.rst b/Misc/NEWS.d/next/Library/2025-12-13-23-26-42.gh-issue-142495.I88Uv_.rst new file mode 100644 index 00000000000000..3e1a624fe56473 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-13-23-26-42.gh-issue-142495.I88Uv_.rst @@ -0,0 +1,4 @@ +:class:`collections.defaultdict` now prioritizes :meth:`~object.__setitem__` +when inserting default values from ``default_factory``. This prevents race +conditions where a default value would overwrite a value set before +``default_factory`` returns. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 3ba48d5d9d3c64..3b14a21fa8428e 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2231,11 +2231,11 @@ defdict_missing(PyObject *op, PyObject *key) value = _PyObject_CallNoArgs(factory); if (value == NULL) return value; - if (PyObject_SetItem(op, key, value) < 0) { - Py_DECREF(value); - return NULL; - } - return value; + PyObject *result = NULL; + (void)PyDict_SetDefaultRef(op, key, value, &result); + // 'result' is NULL, or a strong reference to 'value' or 'op[key]' + Py_DECREF(value); + return result; } static inline PyObject* From 8b6eaef82852281854853b9e92c93ce7e26af4b2 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 16 Dec 2025 16:52:26 +0100 Subject: [PATCH 1630/1674] [3.14] gh-142315: Don't pass the "real path" of Pdb script target to system functions (GH-142371) (#142497) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-142315: Don't pass the "real path" of Pdb script target to system functions (GH-142371) * Pick target depending on preconditions * Clarify the news fragment * Add test capturing missed expectation. * Add more idiomatic safe realpath helper * Restore logic where existance and directoriness are checked on realpath. * Link GH issue to test. * Extract a function to check the target. Remove the _safe_realpath, now no longer needed. * Extract method for replacing sys_path, and isolate realpath usage there. * Revert "Extract method for replacing sys_path, and isolate realpath usage there." This reverts commit 855aac3d289dd096142ed9bd23d00c22ce6e1859. * Restore _safe_realpath. --------- (cherry picked from commit d716e3b2dd33de27aaa31e8204723195c5ba706c) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> Co-authored-by: Jason R. Coombs <jaraco@jaraco.com> --- Lib/pdb.py | 32 +++++++--- Lib/test/test_pdb.py | 59 +++++++++++++++++++ ...-12-07-02-36-24.gh-issue-142315.02o5E_.rst | 2 + 3 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-07-02-36-24.gh-issue-142315.02o5E_.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 01f8f7487233af..04b7a85038a686 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -183,19 +183,37 @@ class _ExecutableTarget: class _ScriptTarget(_ExecutableTarget): def __init__(self, target): - self._target = os.path.realpath(target) + self._check(target) + self._target = self._safe_realpath(target) + + # If PYTHONSAFEPATH (-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) - if not os.path.exists(self._target): + @staticmethod + def _check(target): + """ + Check that target is plausibly a script. + """ + if not os.path.exists(target): print(f'Error: {target} does not exist') sys.exit(1) - if os.path.isdir(self._target): + if os.path.isdir(target): print(f'Error: {target} is a directory') sys.exit(1) - # 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) + @staticmethod + def _safe_realpath(path): + """ + Return the canonical path (realpath) if it is accessible from the userspace. + Otherwise (for example, if the path is a symlink to an anonymous pipe), + return the original path. + + See GH-142315. + """ + realpath = os.path.realpath(path) + return realpath if os.path.exists(realpath) else path def __repr__(self): return self._target diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index b1b8c7d49befde..e8991a6705118c 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -3561,6 +3561,24 @@ def _assert_find_function(self, file_content, func_name, expected): self.assertEqual( expected, pdb.find_function(func_name, os_helper.TESTFN)) + def _fd_dir_for_pipe_targets(self): + """Return a directory exposing live file descriptors, if any.""" + proc_fd = "/proc/self/fd" + if os.path.isdir(proc_fd) and os.path.exists(os.path.join(proc_fd, '0')): + return proc_fd + + dev_fd = "/dev/fd" + if os.path.isdir(dev_fd) and os.path.exists(os.path.join(dev_fd, '0')): + if sys.platform.startswith("freebsd"): + try: + if os.stat("/dev").st_dev == os.stat(dev_fd).st_dev: + return None + except FileNotFoundError: + return None + return dev_fd + + return None + def test_find_function_empty_file(self): self._assert_find_function(b'', 'foo', None) @@ -3619,6 +3637,47 @@ def test_spec(self): stdout, _ = self.run_pdb_script(script, commands) self.assertIn('None', stdout) + def test_script_target_anonymous_pipe(self): + """ + _ScriptTarget doesn't fail on an anonymous pipe. + + GH-142315 + """ + fd_dir = self._fd_dir_for_pipe_targets() + if fd_dir is None: + self.skipTest('anonymous pipe targets require /proc/self/fd or /dev/fd') + + read_fd, write_fd = os.pipe() + + def safe_close(fd): + try: + os.close(fd) + except OSError: + pass + + self.addCleanup(safe_close, read_fd) + self.addCleanup(safe_close, write_fd) + + pipe_path = os.path.join(fd_dir, str(read_fd)) + if not os.path.exists(pipe_path): + self.skipTest('fd directory does not expose anonymous pipes') + + script_source = 'marker = "via_pipe"\n' + os.write(write_fd, script_source.encode('utf-8')) + os.close(write_fd) + + original_path0 = sys.path[0] + self.addCleanup(sys.path.__setitem__, 0, original_path0) + + target = pdb._ScriptTarget(pipe_path) + code_text = target.code + namespace = target.namespace + exec(code_text, namespace) + + self.assertEqual(namespace['marker'], 'via_pipe') + self.assertEqual(namespace['__file__'], target.filename) + self.assertIsNone(namespace['__spec__']) + def test_find_function_first_executable_line(self): code = textwrap.dedent("""\ def foo(): pass diff --git a/Misc/NEWS.d/next/Library/2025-12-07-02-36-24.gh-issue-142315.02o5E_.rst b/Misc/NEWS.d/next/Library/2025-12-07-02-36-24.gh-issue-142315.02o5E_.rst new file mode 100644 index 00000000000000..e9c5ba3c0639f2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-07-02-36-24.gh-issue-142315.02o5E_.rst @@ -0,0 +1,2 @@ +Pdb can now run scripts from anonymous pipes used in process substitution. +Patch by Bartosz Sławecki. From 4feba4db2c02ccd83ba7c387cb047e6e0a8d4ffa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:14:20 +0100 Subject: [PATCH 1631/1674] [3.14] gh-142752: add more thread safety tests for mock (GH-142791) (#142856) gh-142752: add more thread safety tests for mock (GH-142791) (cherry picked from commit 4fd006e71247601e9a84e0fa04f96bed5129f09e) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- .../testmock/testthreadingmock.py | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/Lib/test/test_unittest/testmock/testthreadingmock.py b/Lib/test/test_unittest/testmock/testthreadingmock.py index 3603995b090a6c..dda4916434ec1b 100644 --- a/Lib/test/test_unittest/testmock/testthreadingmock.py +++ b/Lib/test/test_unittest/testmock/testthreadingmock.py @@ -219,5 +219,81 @@ def test_function(): self.assertEqual(m.call_count, LOOPS * THREADS) + def test_call_args_thread_safe(self): + m = ThreadingMock() + LOOPS = 100 + THREADS = 10 + def test_function(thread_id): + for i in range(LOOPS): + m(thread_id, i) + + oldswitchinterval = sys.getswitchinterval() + setswitchinterval(1e-6) + try: + threads = [ + threading.Thread(target=test_function, args=(thread_id,)) + for thread_id in range(THREADS) + ] + with threading_helper.start_threads(threads): + pass + finally: + sys.setswitchinterval(oldswitchinterval) + expected_calls = { + (thread_id, i) + for thread_id in range(THREADS) + for i in range(LOOPS) + } + self.assertSetEqual({call.args for call in m.call_args_list}, expected_calls) + + def test_method_calls_thread_safe(self): + m = ThreadingMock() + LOOPS = 100 + THREADS = 10 + def test_function(thread_id): + for i in range(LOOPS): + getattr(m, f"method_{thread_id}")(i) + + oldswitchinterval = sys.getswitchinterval() + setswitchinterval(1e-6) + try: + threads = [ + threading.Thread(target=test_function, args=(thread_id,)) + for thread_id in range(THREADS) + ] + with threading_helper.start_threads(threads): + pass + finally: + sys.setswitchinterval(oldswitchinterval) + for thread_id in range(THREADS): + self.assertEqual(getattr(m, f"method_{thread_id}").call_count, LOOPS) + self.assertEqual({call.args for call in getattr(m, f"method_{thread_id}").call_args_list}, + {(i,) for i in range(LOOPS)}) + + def test_mock_calls_thread_safe(self): + m = ThreadingMock() + LOOPS = 100 + THREADS = 10 + def test_function(thread_id): + for i in range(LOOPS): + m(thread_id, i) + + oldswitchinterval = sys.getswitchinterval() + setswitchinterval(1e-6) + try: + threads = [ + threading.Thread(target=test_function, args=(thread_id,)) + for thread_id in range(THREADS) + ] + with threading_helper.start_threads(threads): + pass + finally: + sys.setswitchinterval(oldswitchinterval) + expected_calls = { + (thread_id, i) + for thread_id in range(THREADS) + for i in range(LOOPS) + } + self.assertSetEqual({call.args for call in m.mock_calls}, expected_calls) + if __name__ == "__main__": unittest.main() From 897e2b46fbb0168774666b13906dfbfe29a1ec34 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:23:59 +0100 Subject: [PATCH 1632/1674] [3.14] gh-142783: Fix possible use after free in zoneinfo module (GH-142790) (GH-142862) (cherry picked from commit 8307a14d0edc14ae2f775995720e4b6d6dc865b3) Co-authored-by: wangxiaolei <fatelei@gmail.com> --- Lib/test/test_zoneinfo/test_zoneinfo.py | 20 +++++++++++++++++++ ...-12-16-14-49-19.gh-issue-142783.VPV1ig.rst | 1 + Modules/_zoneinfo.c | 16 ++++++++------- 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-16-14-49-19.gh-issue-142783.VPV1ig.rst diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py index 2f9a5dfc1a89a0..df7f0d82a2eac9 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -1551,6 +1551,26 @@ def __eq__(self, other): except CustomError: pass + def test_weak_cache_descriptor_use_after_free(self): + class BombDescriptor: + def __get__(self, obj, owner): + return {} + + class EvilZoneInfo(self.klass): + pass + + # Must be set after the class creation. + EvilZoneInfo._weak_cache = BombDescriptor() + + key = "America/Los_Angeles" + zone1 = EvilZoneInfo(key) + self.assertEqual(str(zone1), key) + + EvilZoneInfo.clear_cache() + zone2 = EvilZoneInfo(key) + self.assertEqual(str(zone2), key) + self.assertIsNot(zone2, zone1) + class CZoneInfoCacheTest(ZoneInfoCacheTest): module = c_zoneinfo diff --git a/Misc/NEWS.d/next/Library/2025-12-16-14-49-19.gh-issue-142783.VPV1ig.rst b/Misc/NEWS.d/next/Library/2025-12-16-14-49-19.gh-issue-142783.VPV1ig.rst new file mode 100644 index 00000000000000..f014771ae9a146 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-16-14-49-19.gh-issue-142783.VPV1ig.rst @@ -0,0 +1 @@ +Fix zoneinfo use-after-free with descriptor _weak_cache. a descriptor as _weak_cache could cause crashes during object creation. The fix ensures proper reference counting for descriptor-provided objects. diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 5c5383d260a040..bfb86bdbf1a3f7 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -292,16 +292,11 @@ static PyObject * get_weak_cache(zoneinfo_state *state, PyTypeObject *type) { if (type == state->ZoneInfoType) { + Py_INCREF(state->ZONEINFO_WEAK_CACHE); return state->ZONEINFO_WEAK_CACHE; } else { - PyObject *cache = - PyObject_GetAttrString((PyObject *)type, "_weak_cache"); - // We are assuming that the type lives at least as long as the function - // that calls get_weak_cache, and that it holds a reference to the - // cache, so we'll return a "borrowed reference". - Py_XDECREF(cache); - return cache; + return PyObject_GetAttrString((PyObject *)type, "_weak_cache"); } } @@ -328,6 +323,7 @@ zoneinfo_ZoneInfo_impl(PyTypeObject *type, PyObject *key) PyObject *weak_cache = get_weak_cache(state, type); instance = PyObject_CallMethod(weak_cache, "get", "O", key, Py_None); if (instance == NULL) { + Py_DECREF(weak_cache); return NULL; } @@ -335,6 +331,7 @@ zoneinfo_ZoneInfo_impl(PyTypeObject *type, PyObject *key) Py_DECREF(instance); PyObject *tmp = zoneinfo_new_instance(state, type, key); if (tmp == NULL) { + Py_DECREF(weak_cache); return NULL; } @@ -342,12 +339,14 @@ zoneinfo_ZoneInfo_impl(PyTypeObject *type, PyObject *key) PyObject_CallMethod(weak_cache, "setdefault", "OO", key, tmp); Py_DECREF(tmp); if (instance == NULL) { + Py_DECREF(weak_cache); return NULL; } ((PyZoneInfo_ZoneInfo *)instance)->source = SOURCE_CACHE; } update_strong_cache(state, type, key, instance); + Py_DECREF(weak_cache); return instance; } @@ -510,12 +509,14 @@ zoneinfo_ZoneInfo_clear_cache_impl(PyTypeObject *type, PyTypeObject *cls, PyObject *item = NULL; PyObject *pop = PyUnicode_FromString("pop"); if (pop == NULL) { + Py_DECREF(weak_cache); return NULL; } PyObject *iter = PyObject_GetIter(only_keys); if (iter == NULL) { Py_DECREF(pop); + Py_DECREF(weak_cache); return NULL; } @@ -540,6 +541,7 @@ zoneinfo_ZoneInfo_clear_cache_impl(PyTypeObject *type, PyTypeObject *cls, Py_DECREF(pop); } + Py_DECREF(weak_cache); if (PyErr_Occurred()) { return NULL; } From 57b37a9ca9882ea3cb3e961915f96a32bc354048 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 11:10:46 +0100 Subject: [PATCH 1633/1674] [3.14] gh-139743: Avoid print twice verbose version for sqlite tests (GH-142850) (GH-142865) (cherry picked from commit 454485e564f637eefd980568c090808a681a91d0) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Co-authored-by: yihong <zouzou0208@gmail.com> --- Lib/test/test_sqlite3/__init__.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_sqlite3/__init__.py b/Lib/test/test_sqlite3/__init__.py index 78a1e2078a5da0..145f3b80024829 100644 --- a/Lib/test/test_sqlite3/__init__.py +++ b/Lib/test/test_sqlite3/__init__.py @@ -6,9 +6,14 @@ import os import sqlite3 +# make sure only print once +_printed_version = False + # Implement the unittest "load tests" protocol. -def load_tests(*args): - if verbose: +def load_tests(loader, tests, pattern): + global _printed_version + if verbose and not _printed_version: print(f"test_sqlite3: testing with SQLite version {sqlite3.sqlite_version}") + _printed_version = True pkg_dir = os.path.dirname(__file__) - return load_package_tests(pkg_dir, *args) + return load_package_tests(pkg_dir, loader, tests, pattern) From f2d6f57178ee7ade43f180dc000bd193606d3bc1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 11:28:42 +0100 Subject: [PATCH 1634/1674] [3.14] gh-139320: Cover exception chaining in the docs of `contextmanager.__exit__` (GH-140169) (GH-142792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit a44509ea87021f78a9f769aff2bb3fc212bc8afc) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> --- Doc/library/stdtypes.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 2a31bc04f6393f..0036b198330ff6 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5461,9 +5461,11 @@ before the statement body is executed and exited when the statement ends: Returning a true value from this method will cause the :keyword:`with` statement to suppress the exception and continue execution with the statement immediately following the :keyword:`!with` statement. Otherwise the exception continues - propagating after this method has finished executing. Exceptions that occur - during execution of this method will replace any exception that occurred in the - body of the :keyword:`!with` statement. + propagating after this method has finished executing. + + If this method raises an exception while handling an earlier exception from the + :keyword:`with` block, the new exception is raised, and the original exception + is stored in its :attr:`~BaseException.__context__` attribute. The exception passed in should never be reraised explicitly - instead, this method should return a false value to indicate that the method completed From ce23b70ea66c7c12b4d9f1daf70a50396ef9f86b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 12:17:46 +0100 Subject: [PATCH 1635/1674] [3.14] gh-140374: Add glossary entries related to multithreading (GH-140375) (#142868) --------- (cherry picked from commit 1e9a0ee6823023a9bdaa60e6fcc71327c604a0fb) Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com> Co-authored-by: Daniele Parmeggiani <8658291+dpdani@users.noreply.github.com> --- Doc/glossary.rst | 172 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 164 insertions(+), 8 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 3a01df99c38caf..68035c2dfb57d4 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -134,6 +134,14 @@ Glossary iterator's :meth:`~object.__anext__` method until it raises a :exc:`StopAsyncIteration` exception. Introduced by :pep:`492`. + atomic operation + An operation that appears to execute as a single, indivisible step: no + other thread can observe it half-done, and its effects become visible all + at once. Python does not guarantee that high-level statements are atomic + (for example, ``x += 1`` performs multiple bytecode operations and is not + atomic). Atomicity is only guaranteed where explicitly documented. See + also :term:`race condition` and :term:`data race`. + attached thread state A :term:`thread state` that is active for the current OS thread. @@ -289,6 +297,22 @@ Glossary advanced mathematical feature. If you're not aware of a need for them, it's almost certain you can safely ignore them. + concurrency + The ability of a computer program to perform multiple tasks at the same + time. Python provides libraries for writing programs that make use of + different forms of concurrency. :mod:`asyncio` is a library for dealing + with asynchronous tasks and coroutines. :mod:`threading` provides + access to operating system threads and :mod:`multiprocessing` to + operating system processes. Multi-core processors can execute threads and + processes on different CPU cores at the same time (see + :term:`parallelism`). + + concurrent modification + When multiple threads modify shared data at the same time. Concurrent + modification without proper synchronization can cause + :term:`race conditions <race condition>`, and might also trigger a + :term:`data race <data race>`, data corruption, or both. + context This term has different meanings depending on where and how it is used. Some common meanings: @@ -363,6 +387,28 @@ Glossary the :term:`cyclic garbage collector <garbage collection>` is to identify these groups and break the reference cycles so that the memory can be reclaimed. + data race + A situation where multiple threads access the same memory location + concurrently, at least one of the accesses is a write, and the threads + do not use any synchronization to control their access. Data races + lead to :term:`non-deterministic` behavior and can cause data corruption. + Proper use of :term:`locks <lock>` and other :term:`synchronization primitives + <synchronization primitive>` prevents data races. Note that data races + can only happen in native code, but that :term:`native code` might be + exposed in a Python API. See also :term:`race condition` and + :term:`thread-safe`. + + deadlock + A situation in which two or more tasks (threads, processes, or coroutines) + wait indefinitely for each other to release resources or complete actions, + preventing any from making progress. For example, if thread A holds lock + 1 and waits for lock 2, while thread B holds lock 2 and waits for lock 1, + both threads will wait indefinitely. In Python this often arises from + acquiring multiple locks in conflicting orders or from circular + join/await dependencies. Deadlocks can be avoided by always acquiring + multiple :term:`locks <lock>` in a consistent order. See also + :term:`lock` and :term:`reentrant`. + decorator A function returning another function, usually applied as a function transformation using the ``@wrapper`` syntax. Common examples for @@ -662,6 +708,14 @@ Glossary requires the GIL to be held in order to use it. This refers to having an :term:`attached thread state`. + global state + Data that is accessible throughout a program, such as module-level + variables, class variables, or C static variables in :term:`extension modules + <extension module>`. In multi-threaded programs, global state shared + between threads typically requires synchronization to avoid + :term:`race conditions <race condition>` and + :term:`data races <data race>`. + hash-based pyc A bytecode cache file that uses the hash rather than the last-modified time of the corresponding source file to determine its validity. See @@ -706,7 +760,9 @@ Glossary tuples. Such an object cannot be altered. A new object has to be created if a different value has to be stored. They play an important role in places where a constant hash value is needed, for example as a key - in a dictionary. + in a dictionary. Immutable objects are inherently :term:`thread-safe` + because their state cannot be modified after creation, eliminating concerns + about improperly synchronized :term:`concurrent modification`. import path A list of locations (or :term:`path entries <path entry>`) that are @@ -796,8 +852,9 @@ Glossary CPython does not consistently apply the requirement that an iterator define :meth:`~iterator.__iter__`. - And also please note that the free-threading CPython does not guarantee - the thread-safety of iterator operations. + And also please note that :term:`free-threaded <free threading>` + CPython does not guarantee :term:`thread-safe` behavior of iterator + operations. key function @@ -835,10 +892,11 @@ Glossary :keyword:`if` statements. In a multi-threaded environment, the LBYL approach can risk introducing a - race condition between "the looking" and "the leaping". For example, the - code, ``if key in mapping: return mapping[key]`` can fail if another + :term:`race condition` between "the looking" and "the leaping". For example, + the code, ``if key in mapping: return mapping[key]`` can fail if another 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. + This issue can be solved with :term:`locks <lock>` or by using the + :term:`EAFP` approach. See also :term:`thread-safe`. lexical analyzer @@ -857,6 +915,19 @@ Glossary clause is optional. If omitted, all elements in ``range(256)`` are processed. + lock + A :term:`synchronization primitive` that allows only one thread at a + time to access a shared resource. A thread must acquire a lock before + accessing the protected resource and release it afterward. If a thread + attempts to acquire a lock that is already held by another thread, it + will block until the lock becomes available. Python's :mod:`threading` + module provides :class:`~threading.Lock` (a basic lock) and + :class:`~threading.RLock` (a :term:`reentrant` lock). Locks are used + to prevent :term:`race conditions <race condition>` and ensure + :term:`thread-safe` access to shared data. Alternative design patterns + to locks exist such as queues, producer/consumer patterns, and + thread-local state. See also :term:`deadlock`, and :term:`reentrant`. + loader An object that loads a module. It must define the :meth:`!exec_module` and :meth:`!create_module` methods @@ -942,8 +1013,11 @@ Glossary See :term:`method resolution order`. mutable - Mutable objects can change their value but keep their :func:`id`. See - also :term:`immutable`. + An :term:`object` with state that is allowed to change during the course + of the program. In multi-threaded programs, mutable objects that are + shared between threads require careful synchronization to avoid + :term:`race conditions <race condition>`. See also :term:`immutable`, + :term:`thread-safe`, and :term:`concurrent modification`. named tuple The term "named tuple" applies to any type or class that inherits from @@ -995,6 +1069,13 @@ Glossary See also :term:`module`. + native code + Code that is compiled to machine instructions and runs directly on the + processor, as opposed to code that is interpreted or runs in a virtual + machine. In the context of Python, native code typically refers to + C, C++, Rust or Fortran code in :term:`extension modules <extension module>` + that can be called from Python. See also :term:`extension module`. + nested scope The ability to refer to a variable in an enclosing definition. For instance, a function defined inside another function can refer to @@ -1011,6 +1092,15 @@ Glossary properties, :meth:`~object.__getattribute__`, class methods, and static methods. + non-deterministic + Behavior where the outcome of a program can vary between executions with + the same inputs. In multi-threaded programs, non-deterministic behavior + often results from :term:`race conditions <race condition>` where the + relative timing or interleaving of threads affects the result. + Proper synchronization using :term:`locks <lock>` and other + :term:`synchronization primitives <synchronization primitive>` helps + ensure deterministic behavior. + object Any data with state (attributes or value) and defined behavior (methods). Also the ultimate base class of any :term:`new-style @@ -1041,6 +1131,16 @@ Glossary See also :term:`regular package` and :term:`namespace package`. + parallelism + Executing multiple operations at the same time (e.g. on multiple CPU + cores). In Python builds with the + :term:`global interpreter lock (GIL) <global interpreter lock>`, only one + thread runs Python bytecode at a time, so taking advantage of multiple + CPU cores typically involves multiple processes + (e.g. :mod:`multiprocessing`) or native extensions that release the GIL. + In :term:`free-threaded <free threading>` Python, multiple Python threads + can run Python code simultaneously on different cores. + parameter A named entity in a :term:`function` (or method) definition that specifies an :term:`argument` (or in some cases, arguments) that the @@ -1215,6 +1315,18 @@ Glossary >>> email.mime.text.__name__ 'email.mime.text' + race condition + A condition of a program where the its behavior + depends on the relative timing or ordering of events, particularly in + multi-threaded programs. Race conditions can lead to + :term:`non-deterministic` behavior and bugs that are difficult to + reproduce. A :term:`data race` is a specific type of race condition + involving unsynchronized access to shared memory. The :term:`LBYL` + coding style is particularly susceptible to race conditions in + multi-threaded code. Using :term:`locks <lock>` and other + :term:`synchronization primitives <synchronization primitive>` + helps prevent race conditions. + 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 @@ -1236,6 +1348,25 @@ Glossary See also :term:`namespace package`. + reentrant + A property of a function or :term:`lock` that allows it to be called or + acquired multiple times by the same thread without causing errors or a + :term:`deadlock`. + + For functions, reentrancy means the function can be safely called again + before a previous invocation has completed, which is important when + functions may be called recursively or from signal handlers. Thread-unsafe + functions may be :term:`non-deterministic` if they're called reentrantly in a + multithreaded program. + + For locks, Python's :class:`threading.RLock` (reentrant lock) is + reentrant, meaning a thread that already holds the lock can acquire it + again without blocking. In contrast, :class:`threading.Lock` is not + reentrant - attempting to acquire it twice from the same thread will cause + a deadlock. + + See also :term:`lock` and :term:`deadlock`. + REPL An acronym for the "read–eval–print loop", another name for the :term:`interactive` interpreter shell. @@ -1340,6 +1471,18 @@ Glossary See also :term:`borrowed reference`. + synchronization primitive + A basic building block for coordinating (synchronizing) the execution of + multiple threads to ensure :term:`thread-safe` access to shared resources. + Python's :mod:`threading` module provides several synchronization primitives + including :class:`~threading.Lock`, :class:`~threading.RLock`, + :class:`~threading.Semaphore`, :class:`~threading.Condition`, + :class:`~threading.Event`, and :class:`~threading.Barrier`. Additionally, + the :mod:`queue` module provides multi-producer, multi-consumer queues + that are especially useful in multithreaded programs. These + primitives help prevent :term:`race conditions <race condition>` and + coordinate thread execution. See also :term:`lock`. + t-string t-strings String literals prefixed with ``t`` or ``T`` are commonly called @@ -1392,6 +1535,19 @@ Glossary See :ref:`Thread State and the Global Interpreter Lock <threads>` for more information. + thread-safe + A module, function, or class that behaves correctly when used by multiple + threads concurrently. Thread-safe code uses appropriate + :term:`synchronization primitives <synchronization primitive>` like + :term:`locks <lock>` to protect shared mutable state, or is designed + to avoid shared mutable state entirely. In the + :term:`free-threaded <free threading>` build, built-in types like + :class:`dict`, :class:`list`, and :class:`set` use internal locking + to make many operations thread-safe, although thread safety is not + necessarily guaranteed. Code that is not thread-safe may experience + :term:`race conditions <race condition>` and :term:`data races <data race>` + when used in multi-threaded programs. + token A small unit of source code, generated by the From eb1284eb265be137abdf3c8e9eb2701be22cf4eb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 12:50:22 +0100 Subject: [PATCH 1636/1674] [3.14] gh-142859: Add `Tools/check-c-api-docs` to mypy check (GH-142860) (#142871) gh-142859: Add `Tools/check-c-api-docs` to mypy check (GH-142860) (cherry picked from commit 248eb3efb3cad7799ef9b4a2dd77a66d1ae65c11) Co-authored-by: sobolevn <mail@sobolevn.me> --- .github/workflows/mypy.yml | 2 ++ Tools/check-c-api-docs/mypy.ini | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 Tools/check-c-api-docs/mypy.ini diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 5d5d77f29f6eb1..f821cdf1f6fbc8 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -25,6 +25,7 @@ on: - "Tools/build/update_file.py" - "Tools/build/verify_ensurepip_wheels.py" - "Tools/cases_generator/**" + - "Tools/check-c-api-docs/**" - "Tools/clinic/**" - "Tools/jit/**" - "Tools/peg_generator/**" @@ -57,6 +58,7 @@ jobs: "Lib/tomllib", "Tools/build", "Tools/cases_generator", + "Tools/check-c-api-docs", "Tools/clinic", "Tools/jit", "Tools/peg_generator", diff --git a/Tools/check-c-api-docs/mypy.ini b/Tools/check-c-api-docs/mypy.ini new file mode 100644 index 00000000000000..f42eb2836e2fd8 --- /dev/null +++ b/Tools/check-c-api-docs/mypy.ini @@ -0,0 +1,19 @@ +[mypy] +files = Tools/check-c-api-docs/ +pretty = True + +# We need `_colorize` import: +mypy_path = $MYPY_CONFIG_FILE_DIR/../../Misc/mypy + +# Make sure Python can still be built +# using Python 3.13 for `PYTHON_FOR_REGEN`... +python_version = 3.13 + +# ...And be strict: +strict = True +extra_checks = True +enable_error_code = + ignore-without-code, + redundant-expr, + truthy-bool, + possibly-undefined, From 06137178b0675f986ef6091b1f0990ec63b94955 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:20:34 +0100 Subject: [PATCH 1637/1674] [3.14] gh-142836: Avoid /proc fd pipes on Solaris (GH-142853) (#142854) gh-142836: Avoid /proc fd pipes on Solaris (GH-142853) (cherry picked from commit c35b812e773493f88631cd1e8be65d3a7c3b47ae) Co-authored-by: Jason R. Coombs <jaraco@jaraco.com> --- Lib/test/test_pdb.py | 13 ++++++++++++- .../2025-12-17-02-02-57.gh-issue-142836.mR-fvK.rst | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2025-12-17-02-02-57.gh-issue-142836.mR-fvK.rst diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index e8991a6705118c..16d1015cc4fca1 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -3563,10 +3563,22 @@ def _assert_find_function(self, file_content, func_name, expected): def _fd_dir_for_pipe_targets(self): """Return a directory exposing live file descriptors, if any.""" + return self._proc_fd_dir() or self._dev_fd_dir() + + def _proc_fd_dir(self): + """Return /proc-backed fd dir when it can be used for pipes.""" + # GH-142836: Opening /proc/self/fd entries for pipes raises EACCES on + # Solaris, so prefer other mechanisms there. + if sys.platform.startswith("sunos"): + return None + proc_fd = "/proc/self/fd" if os.path.isdir(proc_fd) and os.path.exists(os.path.join(proc_fd, '0')): return proc_fd + return None + def _dev_fd_dir(self): + """Return /dev-backed fd dir when usable.""" dev_fd = "/dev/fd" if os.path.isdir(dev_fd) and os.path.exists(os.path.join(dev_fd, '0')): if sys.platform.startswith("freebsd"): @@ -3576,7 +3588,6 @@ def _fd_dir_for_pipe_targets(self): except FileNotFoundError: return None return dev_fd - return None def test_find_function_empty_file(self): diff --git a/Misc/NEWS.d/next/Tests/2025-12-17-02-02-57.gh-issue-142836.mR-fvK.rst b/Misc/NEWS.d/next/Tests/2025-12-17-02-02-57.gh-issue-142836.mR-fvK.rst new file mode 100644 index 00000000000000..dd84ce9839ffa9 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2025-12-17-02-02-57.gh-issue-142836.mR-fvK.rst @@ -0,0 +1 @@ +Accommodated Solaris in ``test_pdb.test_script_target_anonymous_pipe``. From 8c92d665ee9975e1d42b2bf70ff512dac55cabaf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:06:12 +0100 Subject: [PATCH 1638/1674] [3.14] gh-112127: Fix possible use-after-free in atexit.unregister() (GH-114092) (#142878) gh-112127: Fix possible use-after-free in atexit.unregister() (GH-114092) (cherry picked from commit 2b466c47c333106dc9522ab77898e6972e25a2c6) Co-authored-by: Benjamin Johnson <ben332004@gmail.com> Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/test/_test_atexit.py | 13 +++++++++++++ Misc/ACKS | 1 + .../2025-12-17-14-41-09.gh-issue-112127.13OHQk.rst | 2 ++ Modules/atexitmodule.c | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-17-14-41-09.gh-issue-112127.13OHQk.rst diff --git a/Lib/test/_test_atexit.py b/Lib/test/_test_atexit.py index f618c1fcbca52b..490b0686a0c179 100644 --- a/Lib/test/_test_atexit.py +++ b/Lib/test/_test_atexit.py @@ -135,6 +135,19 @@ def func(): finally: atexit.unregister(func) + def test_eq_unregister_clear(self): + # Issue #112127: callback's __eq__ may call unregister or _clear + class Evil: + def __eq__(self, other): + action(other) + return NotImplemented + + for action in atexit.unregister, lambda o: atexit._clear(): + with self.subTest(action=action): + atexit.register(lambda: None) + atexit.unregister(Evil()) + atexit._clear() + if __name__ == "__main__": unittest.main() diff --git a/Misc/ACKS b/Misc/ACKS index 15957d68a574d1..5dde69f43052dd 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -904,6 +904,7 @@ Jim Jewett Pedro Diaz Jimenez Orjan Johansen Fredrik Johansson +Benjamin Johnson Benjamin K. Johnson Gregory K. Johnson Kent Johnson diff --git a/Misc/NEWS.d/next/Library/2025-12-17-14-41-09.gh-issue-112127.13OHQk.rst b/Misc/NEWS.d/next/Library/2025-12-17-14-41-09.gh-issue-112127.13OHQk.rst new file mode 100644 index 00000000000000..c983683ebd5589 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-17-14-41-09.gh-issue-112127.13OHQk.rst @@ -0,0 +1,2 @@ +Fix possible use-after-free in :func:`atexit.unregister` when the callback +is unregistered during comparison. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 4b068967a6ca6e..f777bb34e965b3 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -256,10 +256,11 @@ static int atexit_unregister_locked(PyObject *callbacks, PyObject *func) { for (Py_ssize_t i = 0; i < PyList_GET_SIZE(callbacks); ++i) { - PyObject *tuple = PyList_GET_ITEM(callbacks, i); + PyObject *tuple = Py_NewRef(PyList_GET_ITEM(callbacks, i)); assert(PyTuple_CheckExact(tuple)); PyObject *to_compare = PyTuple_GET_ITEM(tuple, 0); int cmp = PyObject_RichCompareBool(func, to_compare, Py_EQ); + Py_DECREF(tuple); if (cmp < 0) { return -1; From 8a2ea9196db505fde351ee7be83928b73ebe6c44 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:11:54 +0000 Subject: [PATCH 1639/1674] [3.14] typo fixes in docs (GH-142683) (#142839) (cherry picked from commit 39ecb17103a07175895e52c336a0b5980b773bce) Co-authored-by: SYan212 <syan235711@gmail.com> --- Doc/reference/lexical_analysis.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index c2bf45db265b33..eaa0b890d4ebbe 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -1227,7 +1227,7 @@ Whitespace is significant in these situations: string contents. * In ``fstring_replacement_field``, if ``f_debug_specifier`` is present, all whitespace after the opening brace until the ``f_debug_specifier``, - as well as whitespace immediatelly following ``f_debug_specifier``, + as well as whitespace immediately following ``f_debug_specifier``, is retained as part of the expression. .. impl-detail:: From ad6396ece5638105d694952e6ce98b6c978a4a83 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:12:23 +0100 Subject: [PATCH 1640/1674] [3.14] decimal docs: specification link and examples (GH-128698) (#142804) decimal docs: specification link and examples (GH-128698) (cherry picked from commit 2450be607cfbdb1ab9e4ed7c0fe01d715e406d18) Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> Co-authored-by: RUANG (James Roy) <longjinyii@outlook.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Doc/library/decimal.rst | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 08e87e29cd7ce6..43f2e14f92e708 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -34,10 +34,12 @@ The :mod:`decimal` module provides support for fast correctly rounded 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 - in mind, and necessarily has a paramount guiding principle -- computers must - provide an arithmetic that works in the same way as the arithmetic that - people learn at school." -- excerpt from the decimal arithmetic specification. +* Decimal "is based on a `floating-point model + <https://speleotrove.com/decimal/damodel.html#refnumber>`__ which was designed + with people in mind, and necessarily has a paramount guiding principle -- + computers must provide an arithmetic that works in the same way as the + arithmetic that people learn at school." -- excerpt from the decimal + arithmetic specification. * Decimal numbers can be represented exactly. In contrast, numbers like ``1.1`` and ``2.2`` do not have exact representations in binary @@ -238,6 +240,26 @@ floating-point flying circus: >>> c % a Decimal('0.77') +Decimals can be formatted (with :func:`format` built-in or :ref:`f-strings`) in +fixed-point or scientific notation, using the same formatting syntax (see +:ref:`formatspec`) as builtin :class:`float` type: + +.. doctest:: + + >>> format(Decimal('2.675'), "f") + '2.675' + >>> format(Decimal('2.675'), ".2f") + '2.68' + >>> f"{Decimal('2.675'):.2f}" + '2.68' + >>> format(Decimal('2.675'), ".2e") + '2.68e+0' + >>> with localcontext() as ctx: + ... ctx.rounding = ROUND_DOWN + ... print(format(Decimal('2.675'), ".2f")) + ... + 2.67 + And some mathematical functions are also available to Decimal: >>> getcontext().prec = 28 From 547e38cf3a7b8d04642fbe611076ffebd53afbed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:53:27 +0100 Subject: [PATCH 1641/1674] [3.14] gh-142876: remove reference to thread in documentation of `asyncio.Queue.shutdown` (GH-142888) (#142891) gh-142876: remove reference to thread in documentation of `asyncio.Queue.shutdown` (GH-142888) (cherry picked from commit 77c8e6a2b8e206ea8151ab1b431e32f1cad51ddd) Co-authored-by: Damian Birchler <damian@damianbirchler.net> --- Doc/library/asyncio-queue.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index d481a1921d532b..a9735ae80652df 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -107,7 +107,7 @@ Queue The queue can no longer grow. Future calls to :meth:`~Queue.put` raise :exc:`QueueShutDown`. Currently blocked callers of :meth:`~Queue.put` will be unblocked - and will raise :exc:`QueueShutDown` in the formerly blocked thread. + and will raise :exc:`QueueShutDown` in the formerly awaiting task. If *immediate* is false (the default), the queue can be wound down normally with :meth:`~Queue.get` calls to extract tasks From 338bdb24156ddf5d6f9af9dee444f7c2644bd28f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:28:37 +0100 Subject: [PATCH 1642/1674] [3.14] gh-142873: Do not check for `PyContextVar_CheckExact` twice in `PyContextVar_Set` (GH-142874) (#142893) gh-142873: Do not check for `PyContextVar_CheckExact` twice in `PyContextVar_Set` (GH-142874) (cherry picked from commit e61a447d0e0753621e8fc347e99dfc87884d68ab) Co-authored-by: sobolevn <mail@sobolevn.me> --- Python/context.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Python/context.c b/Python/context.c index d1f8b7c2482181..56a35dc731ade5 100644 --- a/Python/context.c +++ b/Python/context.c @@ -343,12 +343,6 @@ PyContextVar_Set(PyObject *ovar, PyObject *val) ENSURE_ContextVar(ovar, NULL) PyContextVar *var = (PyContextVar *)ovar; - if (!PyContextVar_CheckExact(var)) { - PyErr_SetString( - PyExc_TypeError, "an instance of ContextVar was expected"); - return NULL; - } - PyContext *ctx = context_get(); if (ctx == NULL) { return NULL; @@ -1024,12 +1018,6 @@ static PyObject * _contextvars_ContextVar_get_impl(PyContextVar *self, PyObject *default_value) /*[clinic end generated code: output=0746bd0aa2ced7bf input=30aa2ab9e433e401]*/ { - if (!PyContextVar_CheckExact(self)) { - PyErr_SetString( - PyExc_TypeError, "an instance of ContextVar was expected"); - return NULL; - } - PyObject *val; if (PyContextVar_Get((PyObject *)self, default_value, &val) < 0) { return NULL; From 25a94708e515835cd3c94a96d5a1496b84950e16 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:33:15 +0100 Subject: [PATCH 1643/1674] [3.14] gh-142766: Clear frame when `generator.close()` is called (gh-142838) (#142899) (cherry picked from commit 25397f9541be89264d35d41a67defcfeaa950844) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Lib/test/test_generators.py | 27 +++++++++++++++++++ ...-12-16-11-56-20.gh-issue-142766.Uy2HTm.rst | 1 + Objects/genobject.c | 1 + 3 files changed, 29 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-11-56-20.gh-issue-142766.Uy2HTm.rst diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index cb73179160d10d..b71c4d1c81951b 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -290,6 +290,33 @@ def __iter__(self): self.assertEqual([1, 2], list(i for i in C())) + def test_close_clears_frame(self): + # gh-142766: Test that closing a generator clears its frame + class DetectDelete: + def __init__(self): + DetectDelete.deleted = False + + def __del__(self): + DetectDelete.deleted = True + + def generator(arg): + yield + + # Test a freshly created generator (not suspended) + g = generator(DetectDelete()) + g.close() + self.assertTrue(DetectDelete.deleted) + + # Test a suspended generator + g = generator(DetectDelete()) + next(g) + g.close() + self.assertTrue(DetectDelete.deleted) + + # Clear via gi_frame.clear() + g = generator(DetectDelete()) + g.gi_frame.clear() + self.assertTrue(DetectDelete.deleted) class ModifyUnderlyingIterableTest(unittest.TestCase): iterables = [ diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-11-56-20.gh-issue-142766.Uy2HTm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-11-56-20.gh-issue-142766.Uy2HTm.rst new file mode 100644 index 00000000000000..6a14976a6dcf94 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-11-56-20.gh-issue-142766.Uy2HTm.rst @@ -0,0 +1 @@ +Clear the frame of a generator when :meth:`generator.close` is called. diff --git a/Objects/genobject.c b/Objects/genobject.c index 575752fc84002a..c64e6a8dcfee63 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -390,6 +390,7 @@ gen_close(PyObject *self, PyObject *args) if (gen->gi_frame_state == FRAME_CREATED) { gen->gi_frame_state = FRAME_COMPLETED; + gen_clear_frame(gen); Py_RETURN_NONE; } if (FRAME_STATE_FINISHED(gen->gi_frame_state)) { From 7134b407dc2d425a3e847555cde539c53adf9449 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 17 Dec 2025 20:48:18 +0100 Subject: [PATCH 1644/1674] [3.14] GH-100964: Fix reference cycle in exhausted generator frames (GH-141112) (#142902) GH-100964: Fix reference cycle in exhausted generator frames (GH-141112) (cherry picked from commit 92243dc62ce10715ab0d9074b23dea5a1bfa9dcc) Co-authored-by: Savannah Ostrowski <savannah@python.org> --- Lib/test/test_generators.py | 12 ++++++++++++ .../2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst | 1 + Python/ceval.c | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index b71c4d1c81951b..97f14314459a3c 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -134,6 +134,18 @@ def gen(): self.assertEqual(len(resurrected), 1) self.assertIsInstance(resurrected[0].gi_code, types.CodeType) + def test_exhausted_generator_frame_cycle(self): + def g(): + yield + + generator = g() + frame = generator.gi_frame + self.assertIsNone(frame.f_back) + next(generator) + self.assertIsNone(frame.f_back) + next(generator, None) + self.assertIsNone(frame.f_back) + class GeneratorTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst new file mode 100644 index 00000000000000..7c554cf8dda5d1 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-06-05-21-25.gh-issue-100964.TxPf1b.rst @@ -0,0 +1 @@ +Fix reference cycle in exhausted generator frames. Patch by Savannah Ostrowski. diff --git a/Python/ceval.c b/Python/ceval.c index faca6fe81b977a..87cf01730b472e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1920,9 +1920,9 @@ clear_gen_frame(PyThreadState *tstate, _PyInterpreterFrame * frame) tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; assert(frame->frame_obj == NULL || frame->frame_obj->f_frame == frame); + frame->previous = NULL; _PyFrame_ClearExceptCode(frame); _PyErr_ClearExcState(&gen->gi_exc_state); - frame->previous = NULL; } void From 693d8a1a10745f85a13c9560a0719eff8b7ed0b6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 18 Dec 2025 13:24:54 +0100 Subject: [PATCH 1645/1674] [3.14] gh-137063: Document that ast node types replaced by Constant are no longer available (GH-137064) (GH-142930) (cherry picked from commit fc80096a07a3a1da429e251d062a1cf0422cca41) Co-authored-by: James <snoopjedi@gmail.com> --- Doc/library/ast.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 83cb6e9f215869..424c0a92fb2227 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -139,12 +139,13 @@ Node classes The :meth:`~object.__repr__` output of :class:`~ast.AST` nodes includes the values of the node fields. -.. deprecated:: 3.8 +.. deprecated-removed:: 3.8 3.14 - 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. + Previous versions of Python provided the AST classes :class:`!ast.Num`, + :class:`!ast.Str`, :class:`!ast.Bytes`, :class:`!ast.NameConstant` and + :class:`!ast.Ellipsis`, which were deprecated in Python 3.8. These classes + were removed in Python 3.14, and their functionality has been replaced with + :class:`ast.Constant`. .. deprecated:: 3.9 @@ -2433,12 +2434,12 @@ and classes for traversing abstract syntax trees: during traversal. For this a special visitor exists (:class:`NodeTransformer`) that allows modifications. - .. deprecated:: 3.8 + .. deprecated-removed:: 3.8 3.14 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. + :meth:`!visit_NameConstant` and :meth:`!visit_Ellipsis` will not be called + in Python 3.14+. Add the :meth:`visit_Constant` method instead to handle + all constant nodes. .. class:: NodeTransformer() From f02231b8a0b2a4614ee894b4ebcb88259d460c0b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:55:50 +0100 Subject: [PATCH 1646/1674] [3.14] gh-142784: make the asyncio REPL call `loop.close()` at exit (GH-142785) (#142933) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-142784: make the asyncio REPL call `loop.close()` at exit (GH-142785) (cherry picked from commit ddfc155d3ade5f4867c6789136df73f61d4efb03) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> --- Lib/asyncio/__main__.py | 1 + .../Library/2025-12-16-04-39-27.gh-issue-142784.HBGJag.rst | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-12-16-04-39-27.gh-issue-142784.HBGJag.rst diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index e07dd52a2a5efc..898de0cb2eae30 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -236,4 +236,5 @@ def interrupt(self) -> None: break console.write('exiting asyncio REPL...\n') + loop.close() sys.exit(return_code) diff --git a/Misc/NEWS.d/next/Library/2025-12-16-04-39-27.gh-issue-142784.HBGJag.rst b/Misc/NEWS.d/next/Library/2025-12-16-04-39-27.gh-issue-142784.HBGJag.rst new file mode 100644 index 00000000000000..92a723cbc29739 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-16-04-39-27.gh-issue-142784.HBGJag.rst @@ -0,0 +1,3 @@ +The :mod:`asyncio` REPL now properly closes the loop upon the end of interactive session. +Previously, it could cause surprising warnings. +Contributed by Bartosz Sławecki. From f1288d353fc8bbd6e105ec8a914acdb09e39f336 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 18 Dec 2025 18:34:05 +0100 Subject: [PATCH 1647/1674] [3.14] gh-142681: Move NormalizationTest-3.2.0.txt to more safe place. (GH-142935) (GH-142944) (cherry picked from commit 4a8ecbad809dedd9268973d533f24117dfc2e5ba) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> --- Lib/test/{data => }/NormalizationTest-3.2.0.txt | 0 Lib/test/test_unicodedata.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename Lib/test/{data => }/NormalizationTest-3.2.0.txt (100%) diff --git a/Lib/test/data/NormalizationTest-3.2.0.txt b/Lib/test/NormalizationTest-3.2.0.txt similarity index 100% rename from Lib/test/data/NormalizationTest-3.2.0.txt rename to Lib/test/NormalizationTest-3.2.0.txt diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 4d0c968760d15d..e98539deb99d20 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -723,7 +723,7 @@ def test_normalization(self): @requires_resource('cpu') def test_normalization_3_2_0(self): - testdatafile = findfile('NormalizationTest-3.2.0.txt', 'data') + testdatafile = findfile('NormalizationTest-3.2.0.txt') with open(testdatafile, encoding='utf-8') as testdata: self.run_normalization_tests(testdata, unicodedata.ucd_3_2_0) From e48fb94d8c0841b5991056aeda4c3c4f60577dff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 18 Dec 2025 20:18:46 +0100 Subject: [PATCH 1648/1674] [3.14] gh-118342: [Enum] update docs (GH-137290) (GH-142953) gh-118342: [Enum] update docs (GH-137290) (cherry picked from commit e79c39101a9f55882f54df0bb3ecfa23238692de) Co-authored-by: Ethan Furman <ethan@stoneleaf.us> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Doc/library/enum.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index a8a7e671aadca2..0da27ba8e78284 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -947,12 +947,13 @@ Utilities and Decorators 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: + *auto* instances are only resolved when at the top level of an assignment, either by + itself or as part of a tuple: * ``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 (``<auto instance>, -3`` is used to + * ``THREE = [auto(), -3]`` will *not* work (``[<auto instance>, -3]`` is used to create the ``THREE`` enum member) .. versionchanged:: 3.11.1 From b46ce52a532623dd8669d8840b07f94cefa3e3fa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:34:54 +0100 Subject: [PATCH 1649/1674] [3.14] gh-142527: Docs: Clarify that random.seed() discards the sign of an integer input (GH-142483) (#142970) gh-142527: Docs: Clarify that random.seed() discards the sign of an integer input (GH-142483) If *a* is an integer, the sign of *a* is discarded in the C source code. Clarify this behavior to prevent foot guns, where a common use case might naively assume that flipping the sign will produce different sequences (e.g. for a train/test split of a synthetic data generator in machine learning). (cherry picked from commit 610aabfef2f90dc1a274703779615aa5b7fbbb3a) Co-authored-by: Andrej <andrej.karpathy@gmail.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/library/random.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index b1120b3a4d8eb4..dd6b56106afe98 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -78,7 +78,7 @@ Bookkeeping functions instead of the system time (see the :func:`os.urandom` function for details on availability). - If *a* is an int, it is used directly. + If *a* is an int, its absolute value is used directly. With version 2 (the default), a :class:`str`, :class:`bytes`, or :class:`bytearray` object gets converted to an :class:`int` and all of its bits are used. From dbc7fd61d8392557b8a2ab8630849e004a43fa42 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:58:24 +0100 Subject: [PATCH 1650/1674] [3.14] gh-142560: prevent use-after-free in search-like methods by exporting buffer in bytearray (GH-142938) (#142983) gh-142560: prevent use-after-free in search-like methods by exporting buffer in bytearray (GH-142938) (cherry picked from commit 220f0b107776391201a399c54dd01692c36fcdf4) Co-authored-by: wangxiaolei <fatelei@gmail.com> --- Lib/test/test_bytes.py | 31 +++++ ...-12-11-22-59-33.gh-issue-142560.GkJrkk.rst | 1 + Objects/bytearrayobject.c | 113 +++++++++++------- 3 files changed, 103 insertions(+), 42 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 8c6ac8910cab56..0ab330fdb0b107 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1969,6 +1969,37 @@ def __index__(self): self.assertEqual(instance.ba[0], ord("?"), "Assigned bytearray not altered") self.assertEqual(instance.new_ba, bytearray(0x180), "Wrong object altered") + def test_search_methods_reentrancy_raises_buffererror(self): + # gh-142560: Raise BufferError if buffer mutates during search arg conversion. + class Evil: + def __init__(self, ba): + self.ba = ba + def __buffer__(self, flags): + self.ba.clear() + return memoryview(self.ba) + def __release_buffer__(self, view: memoryview) -> None: + view.release() + def __index__(self): + self.ba.clear() + return ord("A") + + def make_case(): + ba = bytearray(b"A") + return ba, Evil(ba) + + for name in ("find", "count", "index", "rindex", "rfind"): + ba, evil = make_case() + with self.subTest(name): + with self.assertRaises(BufferError): + getattr(ba, name)(evil) + + ba, evil = make_case() + with self.assertRaises(BufferError): + evil in ba + with self.assertRaises(BufferError): + ba.split(evil) + with self.assertRaises(BufferError): + ba.rsplit(evil) class AssortedBytesTest(unittest.TestCase): # diff --git a/Misc/NEWS.d/next/Library/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst b/Misc/NEWS.d/next/Library/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst new file mode 100644 index 00000000000000..9c0657214b0751 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst @@ -0,0 +1 @@ +Fix use-after-free in :class:`bytearray` search-like methods (:meth:`~bytearray.find`, :meth:`~bytearray.count`, :meth:`~bytearray.index`, :meth:`~bytearray.rindex`, and :meth:`~bytearray.rfind`) by marking the storage as exported which causes reallocation attempts to raise :exc:`BufferError`. For :func:`~operator.contains`, :meth:`~bytearray.split`, and :meth:`~bytearray.rsplit` the :ref:`buffer protocol <bufferobjects>` is used for this. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index bb4216ecc5aeac..7ad71d93f0c1fa 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -82,6 +82,25 @@ bytearray_releasebuffer(PyObject *self, Py_buffer *view) Py_END_CRITICAL_SECTION(); } +typedef PyObject* (*_ba_bytes_op)(const char *buf, Py_ssize_t len, + PyObject *sub, Py_ssize_t start, + Py_ssize_t end); + +static PyObject * +_bytearray_with_buffer(PyByteArrayObject *self, _ba_bytes_op op, PyObject *sub, + Py_ssize_t start, Py_ssize_t end) +{ + PyObject *res; + + _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self); + + /* Increase exports to prevent bytearray storage from changing during op. */ + self->ob_exports++; + res = op(PyByteArray_AS_STRING(self), Py_SIZE(self), sub, start, end); + self->ob_exports--; + return res; +} + static int _canresize(PyByteArrayObject *self) { @@ -1300,8 +1319,7 @@ bytearray_find_impl(PyByteArrayObject *self, PyObject *sub, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=413e1cab2ae87da0 input=1de9f4558df68336]*/ { - return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - sub, start, end); + return _bytearray_with_buffer(self, _Py_bytes_find, sub, start, end); } /*[clinic input] @@ -1316,8 +1334,7 @@ bytearray_count_impl(PyByteArrayObject *self, PyObject *sub, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=a21ee2692e4f1233 input=2608c30644614724]*/ { - return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - sub, start, end); + return _bytearray_with_buffer(self, _Py_bytes_count, sub, start, end); } /*[clinic input] @@ -1364,8 +1381,7 @@ bytearray_index_impl(PyByteArrayObject *self, PyObject *sub, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=067a1e78efc672a7 input=0086ba0ab9bf44a5]*/ { - return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - sub, start, end); + return _bytearray_with_buffer(self, _Py_bytes_index, sub, start, end); } /*[clinic input] @@ -1382,8 +1398,7 @@ bytearray_rfind_impl(PyByteArrayObject *self, PyObject *sub, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=51bf886f932b283c input=ac73593305d5c1d1]*/ { - return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - sub, start, end); + return _bytearray_with_buffer(self, _Py_bytes_rfind, sub, start, end); } /*[clinic input] @@ -1400,18 +1415,22 @@ bytearray_rindex_impl(PyByteArrayObject *self, PyObject *sub, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=38e1cf66bafb08b9 input=0cf331bf5ebe0e91]*/ { - return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - sub, start, end); + return _bytearray_with_buffer(self, _Py_bytes_rindex, sub, start, end); } static int bytearray_contains(PyObject *self, PyObject *arg) { - int ret; + int ret = -1; Py_BEGIN_CRITICAL_SECTION(self); - ret = _Py_bytes_contains(PyByteArray_AS_STRING(self), + PyByteArrayObject *ba = _PyByteArray_CAST(self); + + /* Increase exports to prevent bytearray storage from changing during _Py_bytes_contains(). */ + ba->ob_exports++; + ret = _Py_bytes_contains(PyByteArray_AS_STRING(ba), PyByteArray_GET_SIZE(self), arg); + ba->ob_exports--; Py_END_CRITICAL_SECTION(); return ret; } @@ -1437,8 +1456,7 @@ bytearray_startswith_impl(PyByteArrayObject *self, PyObject *subobj, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=a3d9b6d44d3662a6 input=ea8d036d09df34b2]*/ { - return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - subobj, start, end); + return _bytearray_with_buffer(self, _Py_bytes_startswith, subobj, start, end); } /*[clinic input] @@ -1462,8 +1480,7 @@ bytearray_endswith_impl(PyByteArrayObject *self, PyObject *subobj, Py_ssize_t start, Py_ssize_t end) /*[clinic end generated code: output=e75ea8c227954caa input=c61b90bb23a689ce]*/ { - return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - subobj, start, end); + return _bytearray_with_buffer(self, _Py_bytes_endswith, subobj, start, end); } /*[clinic input] @@ -1736,26 +1753,32 @@ bytearray_split_impl(PyByteArrayObject *self, PyObject *sep, Py_ssize_t maxsplit) /*[clinic end generated code: output=833e2cf385d9a04d input=1c367486b9938909]*/ { - Py_ssize_t len = PyByteArray_GET_SIZE(self), n; - const char *s = PyByteArray_AS_STRING(self), *sub; - PyObject *list; - Py_buffer vsub; + PyObject *list = NULL; + + /* Increase exports to prevent bytearray storage from changing during _Py_bytes_contains(). */ + self->ob_exports++; + const char *sbuf = PyByteArray_AS_STRING(self); + Py_ssize_t slen = PyByteArray_GET_SIZE((PyObject *)self); if (maxsplit < 0) maxsplit = PY_SSIZE_T_MAX; - if (sep == Py_None) - return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit); + if (sep == Py_None) { + list = stringlib_split_whitespace((PyObject*)self, sbuf, slen, maxsplit); + goto done; + } - if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0) - return NULL; - sub = vsub.buf; - n = vsub.len; + Py_buffer vsub; + if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0) { + goto done; + } - list = stringlib_split( - (PyObject*) self, s, len, sub, n, maxsplit - ); + list = stringlib_split((PyObject*)self, sbuf, slen, + (const char *)vsub.buf, vsub.len, maxsplit); PyBuffer_Release(&vsub); + +done: + self->ob_exports--; return list; } @@ -1850,26 +1873,32 @@ bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep, Py_ssize_t maxsplit) /*[clinic end generated code: output=a55e0b5a03cb6190 input=3cd513c2b94a53c1]*/ { - Py_ssize_t len = PyByteArray_GET_SIZE(self), n; - const char *s = PyByteArray_AS_STRING(self), *sub; - PyObject *list; - Py_buffer vsub; + PyObject *list = NULL; + + /* Increase exports to prevent bytearray storage from changing during _Py_bytes_contains(). */ + self->ob_exports++; + const char *sbuf = PyByteArray_AS_STRING(self); + Py_ssize_t slen = PyByteArray_GET_SIZE((PyObject *)self); if (maxsplit < 0) maxsplit = PY_SSIZE_T_MAX; - if (sep == Py_None) - return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit); + if (sep == Py_None) { + list = stringlib_rsplit_whitespace((PyObject*)self, sbuf, slen, maxsplit); + goto done; + } - if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0) - return NULL; - sub = vsub.buf; - n = vsub.len; + Py_buffer vsub; + if (PyObject_GetBuffer(sep, &vsub, PyBUF_SIMPLE) != 0) { + goto done; + } - list = stringlib_rsplit( - (PyObject*) self, s, len, sub, n, maxsplit - ); + list = stringlib_rsplit((PyObject*)self, sbuf, slen, + (const char *)vsub.buf, vsub.len, maxsplit); PyBuffer_Release(&vsub); + +done: + self->ob_exports--; return list; } From dcbde6b7927179a1900d999bf3fcad03b6040ec1 Mon Sep 17 00:00:00 2001 From: stratakis <cstratak@redhat.com> Date: Sat, 20 Dec 2025 08:19:23 +0100 Subject: [PATCH 1651/1674] [3.14] gh-142776: Ensure fp file descriptor is closed on all code paths in import.c (GH-142777) (#142988) gh-142776: Ensure fp file descriptor is closed on all code paths in import.c (GH-142777) (cherry picked from commit 6a4f10325d58deb1906b39d68dc8e84f4c2bf5a4) --- .../2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst | 1 + Python/import.c | 11 +++-------- 2 files changed, 4 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst new file mode 100644 index 00000000000000..3039b04d89cb88 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst @@ -0,0 +1 @@ +Fix a file descriptor leak in import.c diff --git a/Python/import.c b/Python/import.c index 0158709ad91947..23b4bf51912a06 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4687,6 +4687,7 @@ static PyObject * _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file) /*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/ { + FILE *fp = NULL; PyObject *mod = NULL; PyThreadState *tstate = _PyThreadState_GET(); @@ -4729,16 +4730,12 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file) /* We would move this (and the fclose() below) into * _PyImport_GetModInitFunc(), but it isn't clear if the intervening * code relies on fp still being open. */ - FILE *fp; if (file != NULL) { fp = Py_fopen(info.filename, "r"); if (fp == NULL) { goto finally; } } - else { - fp = NULL; - } PyModInitFunction p0 = _PyImport_GetModInitFunc(&info, fp); if (p0 == NULL) { @@ -4762,12 +4759,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file) } #endif - // XXX Shouldn't this happen in the error cases too (i.e. in "finally")? - if (fp) { +finally: + if (fp != NULL) { fclose(fp); } - -finally: _Py_ext_module_loader_info_clear(&info); return mod; } From 586047a8d8c6839d30a0c25b6c82ff949f67de74 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 20 Dec 2025 09:02:44 +0100 Subject: [PATCH 1652/1674] [3.14] gh-143012: use `Py_ssize_t` cast for `PyBytes_FromStringAndSize` (GH-143013) (#143014) gh-143012: use `Py_ssize_t` cast for `PyBytes_FromStringAndSize` (GH-143013) (cherry picked from commit 5989095dfd08735525f2b615066bc3c231b09388) Co-authored-by: AZero13 <gfunni234@gmail.com> --- Modules/posixmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e11f16d0940f5e..da98bb1b6fbd74 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1786,7 +1786,7 @@ convertenviron(void) #ifdef MS_WINDOWS k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e)); #else - k = PyBytes_FromStringAndSize(*e, (int)(p-*e)); + k = PyBytes_FromStringAndSize(*e, (Py_ssize_t)(p-*e)); #endif if (k == NULL) { Py_DECREF(d); From 4424d1b38f04fd03e07046a64199bfd8ea52bd3d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 21 Dec 2025 00:56:47 +0100 Subject: [PATCH 1653/1674] [3.14] gh-142754: Ensure that Element & Attr instances have the ownerDocument attribute (GH-142794) (#142818) gh-142754: Ensure that Element & Attr instances have the ownerDocument attribute (GH-142794) (cherry picked from commit 1cc7551b3f9f71efbc88d96dce90f82de98b2454) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Lib/test/test_minidom.py | 10 +++++++++- Lib/xml/dom/minidom.py | 2 ++ .../2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 4fa5a4e6768b25..7717a98583f741 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -9,7 +9,7 @@ import xml.dom.minidom -from xml.dom.minidom import parse, Attr, Node, Document, parseString +from xml.dom.minidom import parse, Attr, Node, Document, Element, parseString from xml.dom.minidom import getDOMImplementation from xml.parsers.expat import ExpatError @@ -191,6 +191,14 @@ def testAppendChildNoQuadraticComplexity(self): # This example used to take at least 30 seconds. self.assertLess(end - start, 1) + def testSetAttributeNodeWithoutOwnerDocument(self): + # regression test for gh-142754 + elem = Element("test") + attr = Attr("id") + attr.value = "test-id" + elem.setAttributeNode(attr) + self.assertEqual(elem.getAttribute("id"), "test-id") + def testAppendChildFragment(self): dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes() dom.documentElement.appendChild(frag) diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 0a2ccc00f1857d..16b33b90184dc5 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -364,6 +364,7 @@ class Attr(Node): def __init__(self, qName, namespaceURI=EMPTY_NAMESPACE, localName=None, prefix=None): self.ownerElement = None + self.ownerDocument = None self._name = qName self.namespaceURI = namespaceURI self._prefix = prefix @@ -689,6 +690,7 @@ class Element(Node): def __init__(self, tagName, namespaceURI=EMPTY_NAMESPACE, prefix=None, localName=None): + self.ownerDocument = None self.parentNode = None self.tagName = self.nodeName = tagName self.prefix = prefix diff --git a/Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst b/Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst new file mode 100644 index 00000000000000..d4e158ccb8c9e6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-16-11-55-55.gh-issue-142754.xuCrt3.rst @@ -0,0 +1,4 @@ +Add the *ownerDocument* attribute to :mod:`xml.dom.minidom` elements and attributes +created by directly instantiating the ``Element`` or ``Attr`` class. Note that +this way of creating nodes is not supported; creator functions like +:py:meth:`xml.dom.Document.documentElement` should be used instead. From 27648a1818749ef44c420afe6173af6868715437 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 21 Dec 2025 01:25:25 +0100 Subject: [PATCH 1654/1674] [3.14] gh-142145: relax the no-longer-quadratic test timing (GH-143030) (#143031) gh-142145: relax the no-longer-quadratic test timing (GH-143030) * gh-142145: relax the no-longer-quadratic test timing * require cpu resource (cherry picked from commit 8d2d7bb2e754f8649a68ce4116271a4932f76907) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/test/test_minidom.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 7717a98583f741..69fae957ec7fc9 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -174,6 +174,7 @@ def testAppendChild(self): self.assertEqual(dom.documentElement.childNodes[-1].data, "Hello") dom.unlink() + @support.requires_resource('cpu') def testAppendChildNoQuadraticComplexity(self): impl = getDOMImplementation() @@ -182,14 +183,18 @@ def testAppendChildNoQuadraticComplexity(self): children = [newdoc.createElement(f"child-{i}") for i in range(1, 2 ** 15 + 1)] element = top_element - start = time.time() + start = time.monotonic() for child in children: element.appendChild(child) element = child - end = time.time() + end = time.monotonic() # This example used to take at least 30 seconds. - self.assertLess(end - start, 1) + # Conservative assertion due to the wide variety of systems and + # build configs timing based tests wind up run under. + # A --with-address-sanitizer --with-pydebug build on a rpi5 still + # completes this loop in <0.5 seconds. + self.assertLess(end - start, 4) def testSetAttributeNodeWithoutOwnerDocument(self): # regression test for gh-142754 From 362d11e54543ed9edf8cbcc6f1afe6ab1d15d0cb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 21 Dec 2025 07:52:55 +0100 Subject: [PATCH 1655/1674] [3.14] gh-70647: Better promote how to safely parse yearless dates in datetime. (GH-116179) (#143037) gh-70647: Better promote how to safely parse yearless dates in datetime. (GH-116179) * gh-70647: Better promote how to safely parse yearless dates in datetime. Every four years people encounter this because it just isn't obvious. This moves the footnote up to a note with a code example. We'd love to change the default year value for datetime but doing that could have other consequences for existing code. This documented workaround *always* works. * doctest code within note is bad, dedent. * Update to match the error message. * remove no longer referenced footnote * ignore the warning in the doctest * use Petr's suggestion for the docs to hide the warning processing * cover date.strptime (3.14) as well (cherry picked from commit b8d3fddba6e96e693ced0d3b8f6ddbd61428fd32) Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Doc/library/datetime.rst | 43 ++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 3470f42a6c622d..c17ff8986ab8da 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -2634,9 +2634,42 @@ Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's ``time.strftime(fmt, d.timetuple())`` although not all objects support a :meth:`~date.timetuple` method. -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. [#]_ +For the :meth:`.datetime.strptime` and :meth:`.date.strptime` class methods, +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. + +.. note:: + When used to parse partial dates lacking a year, :meth:`.datetime.strptime` + and :meth:`.date.strptime` will raise when encountering February 29 because + the default year of 1900 is *not* a leap year. Always add a default leap + year to partial date strings before parsing. + + +.. testsetup:: + + # doctest seems to turn the warning into an error which makes it + # show up and require matching and prevents the actual interesting + # exception from being raised. + # Manually apply the catch_warnings context manager + import warnings + catch_warnings = warnings.catch_warnings() + catch_warnings.__enter__() + warnings.simplefilter("ignore") + +.. testcleanup:: + + catch_warnings.__exit__() + +.. doctest:: + + >>> from datetime import datetime + >>> value = "2/29" + >>> datetime.strptime(value, "%m/%d") + Traceback (most recent call last): + ... + ValueError: day 29 must be in range 1..28 for month 2 in year 1900 + >>> datetime.strptime(f"1904 {value}", "%Y %m/%d") + datetime.datetime(1904, 2, 29, 0, 0) Using ``datetime.strptime(date_string, format)`` is equivalent to:: @@ -2767,7 +2800,7 @@ Notes: 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... + parser (1900) is not a leap year. Users run into that bug every leap year. .. doctest:: @@ -2794,5 +2827,3 @@ Notes: .. [#] See R. H. van Gent's `guide to the mathematics of the ISO 8601 calendar <https://web.archive.org/web/20220531051136/https://webspace.science.uu.nl/~gent0113/calendar/isocalendar.htm>`_ for a good explanation. - -.. [#] Passing ``datetime.strptime('Feb 29', '%b %d')`` will fail since 1900 is not a leap year. From 4646ddc3094e0b392d263d48474aaf9ea19e0404 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 21 Dec 2025 20:35:24 +0100 Subject: [PATCH 1656/1674] [3.14] gh-79986: Add parsing for References/In-Reply-To email headers (GH-137201) (#142573) gh-79986: Add parsing for References/In-Reply-To email headers (GH-137201) This is a followup to 46d88a113142b26c01c95c93846a89318ba87ffc (GH-13397), which added parsing for Message-ID. Similar handling is needed for the other two identification headers. (cherry picked from commit 79aa43a9797de64a3c42794f34329eab638dd67a) Co-authored-by: elenril <anton@khirnov.net> --- Lib/email/_header_value_parser.py | 32 ++++++++ Lib/email/headerregistry.py | 14 ++++ .../test_email/test__header_value_parser.py | 75 +++++++++++++++++++ Lib/test/test_email/test_headerregistry.py | 13 ++++ ...5-07-29-11-37-22.gh-issue-79986.fnJbE_.rst | 3 + 5 files changed, 137 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-07-29-11-37-22.gh-issue-79986.fnJbE_.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 41401f8f8d54da..68c2cf9585c5b4 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -874,6 +874,12 @@ class MessageID(MsgID): class InvalidMessageID(MessageID): token_type = 'invalid-message-id' +class MessageIDList(TokenList): + token_type = 'message-id-list' + + @property + def message_ids(self): + return [x for x in self if x.token_type=='msg-id'] class Header(TokenList): token_type = 'header' @@ -2171,6 +2177,32 @@ def parse_message_id(value): return message_id +def parse_message_ids(value): + """in-reply-to = "In-Reply-To:" 1*msg-id CRLF + references = "References:" 1*msg-id CRLF + """ + message_id_list = MessageIDList() + while value: + if value[0] == ',': + # message id list separated with commas - this is invalid, + # but happens rather frequently in the wild + message_id_list.defects.append( + errors.InvalidHeaderDefect("comma in msg-id list")) + message_id_list.append( + WhiteSpaceTerminal(' ', 'invalid-comma-replacement')) + value = value[1:] + continue + try: + token, value = get_msg_id(value) + message_id_list.append(token) + except errors.HeaderParseError as ex: + token = get_unstructured(value) + message_id_list.append(InvalidMessageID(token)) + message_id_list.defects.append( + errors.InvalidHeaderDefect("Invalid msg-id: {!r}".format(ex))) + break + return message_id_list + # # XXX: As I begin to add additional header parsers, I'm realizing we probably # have two level of parser routines: the get_XXX methods that get a token in diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index 543141dc427ebe..0e8698efc0b966 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -534,6 +534,18 @@ def parse(cls, value, kwds): kwds['defects'].extend(parse_tree.all_defects) +class ReferencesHeader: + + max_count = 1 + value_parser = staticmethod(parser.parse_message_ids) + + @classmethod + def parse(cls, value, kwds): + kwds['parse_tree'] = parse_tree = cls.value_parser(value) + kwds['decoded'] = str(parse_tree) + kwds['defects'].extend(parse_tree.all_defects) + + # The header factory # _default_header_map = { @@ -557,6 +569,8 @@ def parse(cls, value, kwds): 'content-disposition': ContentDispositionHeader, 'content-transfer-encoding': ContentTransferEncodingHeader, 'message-id': MessageIDHeader, + 'in-reply-to': ReferencesHeader, + 'references': ReferencesHeader, } class HeaderRegistry: diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index f7f9f9c4e2fbb5..f33844910beee4 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -2867,6 +2867,81 @@ def test_get_msg_id_ws_only_local(self): ) self.assertEqual(msg_id.token_type, 'msg-id') + def test_parse_message_ids_valid(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + "<foo@bar> <bar@foo>", + "<foo@bar> <bar@foo>", + "<foo@bar> <bar@foo>", + [], + ) + self.assertEqual(message_ids.token_type, 'message-id-list') + + def test_parse_message_ids_empty(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + " ", + " ", + " ", + [errors.InvalidHeaderDefect], + ) + self.assertEqual(message_ids.token_type, 'message-id-list') + + def test_parse_message_ids_comment(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + "<foo@bar> (foo's message from \"bar\")", + "<foo@bar> (foo's message from \"bar\")", + "<foo@bar> ", + [], + ) + self.assertEqual(message_ids.message_ids[0].value, '<foo@bar> ') + self.assertEqual(message_ids.token_type, 'message-id-list') + + def test_parse_message_ids_no_sep(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + "<foo@bar><bar@foo>", + "<foo@bar><bar@foo>", + "<foo@bar><bar@foo>", + [], + ) + self.assertEqual(message_ids.message_ids[0].value, '<foo@bar>') + self.assertEqual(message_ids.message_ids[1].value, '<bar@foo>') + self.assertEqual(message_ids.token_type, 'message-id-list') + + def test_parse_message_ids_comma_sep(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + "<foo@bar>,<bar@foo>", + "<foo@bar> <bar@foo>", + "<foo@bar> <bar@foo>", + [errors.InvalidHeaderDefect], + ) + self.assertEqual(message_ids.message_ids[0].value, '<foo@bar>') + self.assertEqual(message_ids.message_ids[1].value, '<bar@foo>') + self.assertEqual(message_ids.token_type, 'message-id-list') + + def test_parse_message_ids_invalid_id(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + "<Date: Wed, 08 Jun 2002 09:78:58 +0600>", + "<Date: Wed, 08 Jun 2002 09:78:58 +0600>", + "<Date: Wed, 08 Jun 2002 09:78:58 +0600>", + [errors.InvalidHeaderDefect]*2, + ) + self.assertEqual(message_ids.token_type, 'message-id-list') + + def test_parse_message_ids_broken_ang(self): + message_ids = self._test_parse_x( + parser.parse_message_ids, + "<foo@bar> >bar@foo", + "<foo@bar> >bar@foo", + "<foo@bar> >bar@foo", + [errors.InvalidHeaderDefect]*1, + ) + self.assertEqual(message_ids.token_type, 'message-id-list') + @parameterize diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index ff7a6da644d572..df34ec70504bc5 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1812,5 +1812,18 @@ def test_message_id_header_is_not_folded(self): h.fold(policy=policy.default.clone(max_line_length=20)), 'Message-ID:\n <ईमेलfromMessage@wők.com>\n') + def test_fold_references(self): + h = self.make_header( + 'References', + '<referenceid1thatislongerthan@maxlinelength.com> ' + '<referenceid2thatislongerthan@maxlinelength.com>' + ) + self.assertEqual( + h.fold(policy=policy.default.clone(max_line_length=20)), + 'References: ' + '<referenceid1thatislongerthan@maxlinelength.com>\n' + ' <referenceid2thatislongerthan@maxlinelength.com>\n') + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-07-29-11-37-22.gh-issue-79986.fnJbE_.rst b/Misc/NEWS.d/next/Library/2025-07-29-11-37-22.gh-issue-79986.fnJbE_.rst new file mode 100644 index 00000000000000..327bbf869bce09 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-29-11-37-22.gh-issue-79986.fnJbE_.rst @@ -0,0 +1,3 @@ +Add parsing for ``References`` and ``In-Reply-To`` headers to the :mod:`email` +library that parses the header content as lists of message id tokens. This +prevents them from being folded incorrectly. From 6a3b861cb2c47aa936b3e0064a9aad07f688f0e3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 22 Dec 2025 09:18:16 +0100 Subject: [PATCH 1657/1674] [3.14] gh-143046: Make asyncio REPL respect the `-q` flag (quiet mode) (GH-143047) (#143060) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gh-143046: Make asyncio REPL respect the `-q` flag (quiet mode) (GH-143047) (cherry picked from commit 6213a512bf42464e35ae5090358b80aaa64904cc) Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com> --- Lib/asyncio/__main__.py | 17 +++++++++-------- Lib/test/test_repl.py | 6 ++++++ ...25-12-21-17-44-28.gh-issue-143046.GBa5Ip.rst | 2 ++ 3 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-21-17-44-28.gh-issue-143046.GBa5Ip.rst diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index 898de0cb2eae30..64f9b3c54e4a4d 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -86,14 +86,15 @@ 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' - ) - - console.write(banner) + if not sys.flags.quiet: + 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' + ) + + console.write(banner) if startup_path := os.getenv("PYTHONSTARTUP"): sys.audit("cpython.run_startup", startup_path) diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index 58bd2b5d916858..17bc53d20c39d2 100644 --- a/Lib/test/test_repl.py +++ b/Lib/test/test_repl.py @@ -409,6 +409,12 @@ def test_toplevel_contextvars_async(self): expected = "toplevel contextvar test: ok" self.assertIn(expected, output, expected) + def test_quiet_mode(self): + p = spawn_repl("-q", "-m", "asyncio", custom=True) + output = kill_python(p) + self.assertEqual(p.returncode, 0) + self.assertEqual(output[:3], ">>>") + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-12-21-17-44-28.gh-issue-143046.GBa5Ip.rst b/Misc/NEWS.d/next/Library/2025-12-21-17-44-28.gh-issue-143046.GBa5Ip.rst new file mode 100644 index 00000000000000..ac819a47f4cde9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-21-17-44-28.gh-issue-143046.GBa5Ip.rst @@ -0,0 +1,2 @@ +The :mod:`asyncio` REPL no longer prints copyright and version messages in +the quiet mode (:option:`-q`). Patch by Bartosz Sławecki. From 98f6db7e82454fec596a0fced7d5d5ef297281cc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 22 Dec 2025 17:04:24 +0100 Subject: [PATCH 1658/1674] [3.14] gh-143057: avoid locking in `tracemalloc` C-APIs when it is not enabled (GH-143065) (#143071) gh-143057: avoid locking in `tracemalloc` C-APIs when it is not enabled (GH-143065) (cherry picked from commit e728b006de984ab11532f5c9cf60c57671ec37ab) Co-authored-by: Kumar Aditya <kumaraditya@python.org> --- Include/internal/pycore_tracemalloc.h | 5 ++++- .../2025-12-22-12-03-09.gh-issue-143057.Majsre.rst | 1 + Python/tracemalloc.c | 13 +++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-22-12-03-09.gh-issue-143057.Majsre.rst diff --git a/Include/internal/pycore_tracemalloc.h b/Include/internal/pycore_tracemalloc.h index 572e8025876319..41e1c91bee4fde 100644 --- a/Include/internal/pycore_tracemalloc.h +++ b/Include/internal/pycore_tracemalloc.h @@ -21,7 +21,10 @@ struct _PyTraceMalloc_Config { } initialized; /* Is tracemalloc tracing memory allocations? - Variable protected by the TABLES_LOCK(). */ + Variable protected by the TABLES_LOCK() and stored atomically. + Atomic store is used so that it can read without locking for the + general case of checking if tracemalloc is enabled. + */ int tracing; /* limit of the number of frames in a traceback, 1 by default. diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-22-12-03-09.gh-issue-143057.Majsre.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-22-12-03-09.gh-issue-143057.Majsre.rst new file mode 100644 index 00000000000000..2eac8c1cfdc10c --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-22-12-03-09.gh-issue-143057.Majsre.rst @@ -0,0 +1 @@ +Avoid locking in :c:func:`PyTraceMalloc_Track` and :c:func:`PyTraceMalloc_Untrack` when :mod:`tracemalloc` is not enabled. diff --git a/Python/tracemalloc.c b/Python/tracemalloc.c index 7066a214f1065b..8ae12e545761ef 100644 --- a/Python/tracemalloc.c +++ b/Python/tracemalloc.c @@ -840,7 +840,7 @@ _PyTraceMalloc_Start(int max_nframe) /* everything is ready: start tracing Python memory allocations */ TABLES_LOCK(); - tracemalloc_config.tracing = 1; + _Py_atomic_store_int_relaxed(&tracemalloc_config.tracing, 1); TABLES_UNLOCK(); return 0; @@ -857,7 +857,7 @@ _PyTraceMalloc_Stop(void) } /* stop tracing Python memory allocations */ - tracemalloc_config.tracing = 0; + _Py_atomic_store_int_relaxed(&tracemalloc_config.tracing, 0); /* unregister the hook on memory allocators */ PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &allocators.raw); @@ -1197,6 +1197,10 @@ int PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr, size_t size) { + if (_Py_atomic_load_int_relaxed(&tracemalloc_config.tracing) == 0) { + /* tracemalloc is not tracing: do nothing */ + return -2; + } PyGILState_STATE gil_state = PyGILState_Ensure(); TABLES_LOCK(); @@ -1218,6 +1222,11 @@ PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr, int PyTraceMalloc_Untrack(unsigned int domain, uintptr_t ptr) { + if (_Py_atomic_load_int_relaxed(&tracemalloc_config.tracing) == 0) { + /* tracemalloc is not tracing: do nothing */ + return -2; + } + TABLES_LOCK(); int result; From 33c9ebe437064ae5066767128e94c2fc9e388a50 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 22 Dec 2025 19:14:59 +0100 Subject: [PATCH 1659/1674] [3.14] gh-143010: Prevent a TOCTOU issue by only calling open once (GH-143011) (#143080) gh-143010: Prevent a TOCTOU issue by only calling open once (GH-143011) RDM: per AZero13's research the 'x' option did not exist when this code was written, This modernization can thus drop the fd trick in _create_carefully and just use open with 'x' to achieve the same goal more securely. (cherry picked from commit a88d1b8dab4cbd3180dd7f1acb44d627db90323b) Co-authored-by: AZero13 <gfunni234@gmail.com> Co-authored-by: sobolevn <mail@sobolevn.me> --- Lib/mailbox.py | 6 +----- .../Library/2025-12-20-01-49-02.gh-issue-143010._-SWX0.rst | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-20-01-49-02.gh-issue-143010._-SWX0.rst diff --git a/Lib/mailbox.py b/Lib/mailbox.py index b00d9e8634c785..364af6bb010959 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -2183,11 +2183,7 @@ def _unlock_file(f): def _create_carefully(path): """Create a file if it doesn't exist and open for reading and writing.""" - fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_RDWR, 0o666) - try: - return open(path, 'rb+') - finally: - os.close(fd) + return open(path, 'xb+') def _create_temporary(path): """Create a temp file based on path and open for reading and writing.""" diff --git a/Misc/NEWS.d/next/Library/2025-12-20-01-49-02.gh-issue-143010._-SWX0.rst b/Misc/NEWS.d/next/Library/2025-12-20-01-49-02.gh-issue-143010._-SWX0.rst new file mode 100644 index 00000000000000..4914d0b7be727b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-20-01-49-02.gh-issue-143010._-SWX0.rst @@ -0,0 +1 @@ +Fixed a bug in :mod:`mailbox` where the precise timing of an external event could result in the library opening an existing file instead of a file it expected to create. From e25083abeefa48aad12bb05e8c8ed25e83c4d249 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:42:24 +0100 Subject: [PATCH 1660/1674] [3.14] gh-89152: Note truth testing exception in `stdtypes.rst` (GH-137640) (#143081) gh-89152: Note truth testing exception in `stdtypes.rst` (GH-137640) (cherry picked from commit 3c0888b25b4c1dc1dee6d0edf05d51d3cc24486e) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> --- Doc/library/stdtypes.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 0036b198330ff6..883d7a4ecd40f3 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -46,8 +46,10 @@ Any object can be tested for truth value, for use in an :keyword:`if` or By default, an object is considered true unless its class defines either a :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: +returns zero, when called with the object. [1]_ If one of the methods raises an +exception when called, the exception is propagated and the object does +not have a truth value (for example, :data:`NotImplemented`). +Here are most of the built-in objects considered false: .. index:: single: None (Built-in object) From aee8c217bdbe46075b763f070cbc3fbc03f13939 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 23 Dec 2025 06:01:41 +0100 Subject: [PATCH 1661/1674] [3.14] gh-122431: Correct the non-negative error message in `readline.append_history_file` (GH-143075) (GH-143090) gh-122431: Correct the non-negative error message in `readline.append_history_file` (GH-143075) "positive" -> "non-negative", since zero is included. (cherry picked from commit a273bc99d2ff853f59ee6da4d897b1be72a03975) Co-authored-by: Zheng Yu <dataisland@outlook.com> --- .../next/Library/2025-12-22-22-36-21.gh-issue-122431.9E3085.rst | 1 + Modules/readline.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-22-22-36-21.gh-issue-122431.9E3085.rst diff --git a/Misc/NEWS.d/next/Library/2025-12-22-22-36-21.gh-issue-122431.9E3085.rst b/Misc/NEWS.d/next/Library/2025-12-22-22-36-21.gh-issue-122431.9E3085.rst new file mode 100644 index 00000000000000..8936ac9395f743 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-22-22-36-21.gh-issue-122431.9E3085.rst @@ -0,0 +1 @@ +Corrected the error message in :func:`readline.append_history_file` to state that ``nelements`` must be non-negative instead of positive. diff --git a/Modules/readline.c b/Modules/readline.c index 4da66ca6e7b94c..8475846eefc905 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -391,7 +391,7 @@ readline_append_history_file_impl(PyObject *module, int nelements, { if (nelements < 0) { - PyErr_SetString(PyExc_ValueError, "nelements must be positive"); + PyErr_SetString(PyExc_ValueError, "nelements must be non-negative"); return NULL; } From a007e951ef2ef2274cae9041552d3374cc5d291f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 23 Dec 2025 17:26:49 +0100 Subject: [PATCH 1662/1674] [3.14] gh-84232: Fix `pydoc` docs.python.org link generation (GH-139995) (#143098) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Éric <merwok@netwok.org> --- .gitattributes | 4 +- .pre-commit-config.yaml | 6 +- Doc/Makefile | 3 +- Doc/tools/extensions/pydoc_topics.py | 26 ++ Lib/pydoc.py | 16 +- Lib/pydoc_data/module_docs.py | 321 ++++++++++++++++++ Lib/test/test_pydoc/test_pydoc.py | 26 ++ ...-10-12-12-05-52.gh-issue-139971.UdoStU.rst | 2 + 8 files changed, 396 insertions(+), 8 deletions(-) create mode 100644 Lib/pydoc_data/module_docs.py create mode 100644 Misc/NEWS.d/next/Library/2025-10-12-12-05-52.gh-issue-139971.UdoStU.rst diff --git a/.gitattributes b/.gitattributes index 16264cacb0e34e..bca9f58e11a1ce 100644 --- a/.gitattributes +++ b/.gitattributes @@ -82,8 +82,10 @@ Include/opcode.h generated Include/opcode_ids.h generated Include/token.h generated Lib/_opcode_metadata.py generated -Lib/keyword.py generated Lib/idlelib/help.html generated +Lib/keyword.py generated +Lib/pydoc_data/topics.py generated +Lib/pydoc_data/module_docs.py generated Lib/test/certdata/*.pem generated Lib/test/certdata/*.0 generated Lib/test/levenshtein_examples.json generated diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c5767ee841eb0d..ee89e18db35e15 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,15 +40,15 @@ repos: files: ^Apple - id: ruff-format name: Run Ruff (format) on Doc/ - args: [--check] + args: [--exit-non-zero-on-fix] files: ^Doc/ - id: ruff-format name: Run Ruff (format) on Tools/build/check_warnings.py - args: [--check, --config=Tools/build/.ruff.toml] + args: [--exit-non-zero-on-fix, --config=Tools/build/.ruff.toml] files: ^Tools/build/check_warnings.py - id: ruff-format name: Run Ruff (format) on Tools/wasm/ - args: [--check, --config=Tools/wasm/.ruff.toml] + args: [--exit-non-zero-on-fix, --config=Tools/wasm/.ruff.toml] files: ^Tools/wasm/ - repo: https://github.com/psf/black-pre-commit-mirror diff --git a/Doc/Makefile b/Doc/Makefile index f16d9cacb1b6fb..4d605980a62904 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -140,7 +140,8 @@ doctest: pydoc-topics: BUILDER = pydoc-topics pydoc-topics: build @echo "Building finished; now run this:" \ - "cp build/pydoc-topics/topics.py ../Lib/pydoc_data/topics.py" + "cp build/pydoc-topics/topics.py ../Lib/pydoc_data/topics.py" \ + "&& cp build/pydoc-topics/module_docs.py ../Lib/pydoc_data/module_docs.py" .PHONY: gettext gettext: BUILDER = gettext diff --git a/Doc/tools/extensions/pydoc_topics.py b/Doc/tools/extensions/pydoc_topics.py index 01efbba628324f..a65d77433b255b 100644 --- a/Doc/tools/extensions/pydoc_topics.py +++ b/Doc/tools/extensions/pydoc_topics.py @@ -109,6 +109,7 @@ class PydocTopicsBuilder(TextBuilder): def init(self) -> None: super().init() self.topics: dict[str, str] = {} + self.module_docs: dict[str, str] = {} def get_outdated_docs(self) -> str: # Return a string describing what an update build will build. @@ -130,6 +131,15 @@ def write_documents(self, _docnames: Set[str]) -> None: continue doc_labels.setdefault(docname, []).append((topic_label, label_id)) + py_domain = env.domains['py'] + for module_name, module_info in py_domain.data['modules'].items(): + docname = module_info[0] + if docname.startswith('library/'): + doc_file = docname.replace('library/', '') + self.module_docs[module_name] = ( + f"{doc_file}#module-{module_name}" + ) + for docname, label_ids in status_iterator( doc_labels.items(), "building topics... ", @@ -161,6 +171,22 @@ def finish(self) -> None: """ self.outdir.joinpath("topics.py").write_text(topics, encoding="utf-8") + module_docs_repr = "\n".join( + f" '{module}': '{doc_file}'," + for module, doc_file in sorted(self.module_docs.items()) + ) + module_docs = f"""\ +# Autogenerated by Sphinx on {asctime()} +# as part of the release process. + +module_docs = {{ +{module_docs_repr} +}} +""" + self.outdir.joinpath("module_docs.py").write_text( + module_docs, encoding="utf-8" + ) + def _display_labels(item: tuple[str, Sequence[tuple[str, str]]]) -> str: _docname, label_ids = item diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 2a99fc40dda3fd..abd3be8b65a63d 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -579,10 +579,20 @@ def getdocloc(self, object, basedir=sysconfig.get_path('stdlib')): (file.startswith(basedir) and not file.startswith(os.path.join(basedir, 'site-packages')))) and object.__name__ not in ('xml.etree', 'test.test_pydoc.pydoc_mod')): - if docloc.startswith(("http://", "https://")): - docloc = "{}/{}.html".format(docloc.rstrip("/"), object.__name__.lower()) + + try: + from pydoc_data import module_docs + except ImportError: + module_docs = None + + if module_docs and object.__name__ in module_docs.module_docs: + doc_name = module_docs.module_docs[object.__name__] + if docloc.startswith(("http://", "https://")): + docloc = "{}/{}".format(docloc.rstrip("/"), doc_name) + else: + docloc = os.path.join(docloc, doc_name) else: - docloc = os.path.join(docloc, object.__name__.lower() + ".html") + docloc = None else: docloc = None return docloc diff --git a/Lib/pydoc_data/module_docs.py b/Lib/pydoc_data/module_docs.py new file mode 100644 index 00000000000000..f6d84a60b43a12 --- /dev/null +++ b/Lib/pydoc_data/module_docs.py @@ -0,0 +1,321 @@ +# Autogenerated by Sphinx on Sun Oct 12 12:02:22 2025 +# as part of the release process. + +module_docs = { + '__future__': '__future__#module-__future__', + '__main__': '__main__#module-__main__', + '_thread': '_thread#module-_thread', + '_tkinter': 'tkinter#module-_tkinter', + 'abc': 'abc#module-abc', + 'aifc': 'aifc#module-aifc', + 'annotationlib': 'annotationlib#module-annotationlib', + 'argparse': 'argparse#module-argparse', + 'array': 'array#module-array', + 'ast': 'ast#module-ast', + 'asynchat': 'asynchat#module-asynchat', + 'asyncio': 'asyncio#module-asyncio', + 'asyncore': 'asyncore#module-asyncore', + 'atexit': 'atexit#module-atexit', + 'audioop': 'audioop#module-audioop', + 'base64': 'base64#module-base64', + 'bdb': 'bdb#module-bdb', + 'binascii': 'binascii#module-binascii', + 'bisect': 'bisect#module-bisect', + 'builtins': 'builtins#module-builtins', + 'bz2': 'bz2#module-bz2', + 'cProfile': 'profile#module-cProfile', + 'calendar': 'calendar#module-calendar', + 'cgi': 'cgi#module-cgi', + 'cgitb': 'cgitb#module-cgitb', + 'chunk': 'chunk#module-chunk', + 'cmath': 'cmath#module-cmath', + 'cmd': 'cmd#module-cmd', + 'code': 'code#module-code', + 'codecs': 'codecs#module-codecs', + 'codeop': 'codeop#module-codeop', + 'collections': 'collections#module-collections', + 'collections.abc': 'collections.abc#module-collections.abc', + 'colorsys': 'colorsys#module-colorsys', + 'compileall': 'compileall#module-compileall', + 'compression': 'compression#module-compression', + 'compression.zstd': 'compression.zstd#module-compression.zstd', + 'concurrent.futures': 'concurrent.futures#module-concurrent.futures', + 'concurrent.interpreters': 'concurrent.interpreters#module-concurrent.interpreters', + 'configparser': 'configparser#module-configparser', + 'contextlib': 'contextlib#module-contextlib', + 'contextvars': 'contextvars#module-contextvars', + 'copy': 'copy#module-copy', + 'copyreg': 'copyreg#module-copyreg', + 'crypt': 'crypt#module-crypt', + 'csv': 'csv#module-csv', + 'ctypes': 'ctypes#module-ctypes', + 'curses': 'curses#module-curses', + 'curses.ascii': 'curses.ascii#module-curses.ascii', + 'curses.panel': 'curses.panel#module-curses.panel', + 'curses.textpad': 'curses#module-curses.textpad', + 'dataclasses': 'dataclasses#module-dataclasses', + 'datetime': 'datetime#module-datetime', + 'dbm': 'dbm#module-dbm', + 'dbm.dumb': 'dbm#module-dbm.dumb', + 'dbm.gnu': 'dbm#module-dbm.gnu', + 'dbm.ndbm': 'dbm#module-dbm.ndbm', + 'dbm.sqlite3': 'dbm#module-dbm.sqlite3', + 'decimal': 'decimal#module-decimal', + 'difflib': 'difflib#module-difflib', + 'dis': 'dis#module-dis', + 'distutils': 'distutils#module-distutils', + 'doctest': 'doctest#module-doctest', + 'email': 'email#module-email', + 'email.charset': 'email.charset#module-email.charset', + 'email.contentmanager': 'email.contentmanager#module-email.contentmanager', + 'email.encoders': 'email.encoders#module-email.encoders', + 'email.errors': 'email.errors#module-email.errors', + 'email.generator': 'email.generator#module-email.generator', + 'email.header': 'email.header#module-email.header', + 'email.headerregistry': 'email.headerregistry#module-email.headerregistry', + 'email.iterators': 'email.iterators#module-email.iterators', + 'email.message': 'email.message#module-email.message', + 'email.mime': 'email.mime#module-email.mime', + 'email.mime.application': 'email.mime#module-email.mime.application', + 'email.mime.audio': 'email.mime#module-email.mime.audio', + 'email.mime.base': 'email.mime#module-email.mime.base', + 'email.mime.image': 'email.mime#module-email.mime.image', + 'email.mime.message': 'email.mime#module-email.mime.message', + 'email.mime.multipart': 'email.mime#module-email.mime.multipart', + 'email.mime.nonmultipart': 'email.mime#module-email.mime.nonmultipart', + 'email.mime.text': 'email.mime#module-email.mime.text', + 'email.parser': 'email.parser#module-email.parser', + 'email.policy': 'email.policy#module-email.policy', + 'email.utils': 'email.utils#module-email.utils', + 'encodings': 'codecs#module-encodings', + 'encodings.idna': 'codecs#module-encodings.idna', + 'encodings.mbcs': 'codecs#module-encodings.mbcs', + 'encodings.utf_8_sig': 'codecs#module-encodings.utf_8_sig', + 'ensurepip': 'ensurepip#module-ensurepip', + 'enum': 'enum#module-enum', + 'errno': 'errno#module-errno', + 'faulthandler': 'faulthandler#module-faulthandler', + 'fcntl': 'fcntl#module-fcntl', + 'filecmp': 'filecmp#module-filecmp', + 'fileinput': 'fileinput#module-fileinput', + 'fnmatch': 'fnmatch#module-fnmatch', + 'fractions': 'fractions#module-fractions', + 'ftplib': 'ftplib#module-ftplib', + 'functools': 'functools#module-functools', + 'gc': 'gc#module-gc', + 'getopt': 'getopt#module-getopt', + 'getpass': 'getpass#module-getpass', + 'gettext': 'gettext#module-gettext', + 'glob': 'glob#module-glob', + 'graphlib': 'graphlib#module-graphlib', + 'grp': 'grp#module-grp', + 'gzip': 'gzip#module-gzip', + 'hashlib': 'hashlib#module-hashlib', + 'heapq': 'heapq#module-heapq', + 'hmac': 'hmac#module-hmac', + 'html': 'html#module-html', + 'html.entities': 'html.entities#module-html.entities', + 'html.parser': 'html.parser#module-html.parser', + 'http': 'http#module-http', + 'http.client': 'http.client#module-http.client', + 'http.cookiejar': 'http.cookiejar#module-http.cookiejar', + 'http.cookies': 'http.cookies#module-http.cookies', + 'http.server': 'http.server#module-http.server', + 'idlelib': 'idle#module-idlelib', + 'imaplib': 'imaplib#module-imaplib', + 'imghdr': 'imghdr#module-imghdr', + 'imp': 'imp#module-imp', + 'importlib': 'importlib#module-importlib', + 'importlib.abc': 'importlib#module-importlib.abc', + 'importlib.machinery': 'importlib#module-importlib.machinery', + 'importlib.metadata': 'importlib.metadata#module-importlib.metadata', + 'importlib.resources': 'importlib.resources#module-importlib.resources', + 'importlib.resources.abc': 'importlib.resources.abc#module-importlib.resources.abc', + 'importlib.util': 'importlib#module-importlib.util', + 'inspect': 'inspect#module-inspect', + 'io': 'io#module-io', + 'ipaddress': 'ipaddress#module-ipaddress', + 'itertools': 'itertools#module-itertools', + 'json': 'json#module-json', + 'json.tool': 'json#module-json.tool', + 'keyword': 'keyword#module-keyword', + 'linecache': 'linecache#module-linecache', + 'locale': 'locale#module-locale', + 'logging': 'logging#module-logging', + 'logging.config': 'logging.config#module-logging.config', + 'logging.handlers': 'logging.handlers#module-logging.handlers', + 'lzma': 'lzma#module-lzma', + 'mailbox': 'mailbox#module-mailbox', + 'mailcap': 'mailcap#module-mailcap', + 'marshal': 'marshal#module-marshal', + 'math': 'math#module-math', + 'mimetypes': 'mimetypes#module-mimetypes', + 'mmap': 'mmap#module-mmap', + 'modulefinder': 'modulefinder#module-modulefinder', + 'msilib': 'msilib#module-msilib', + 'msvcrt': 'msvcrt#module-msvcrt', + 'multiprocessing': 'multiprocessing#module-multiprocessing', + 'multiprocessing.connection': 'multiprocessing#module-multiprocessing.connection', + 'multiprocessing.dummy': 'multiprocessing#module-multiprocessing.dummy', + 'multiprocessing.managers': 'multiprocessing#module-multiprocessing.managers', + 'multiprocessing.pool': 'multiprocessing#module-multiprocessing.pool', + 'multiprocessing.shared_memory': 'multiprocessing.shared_memory#module-multiprocessing.shared_memory', + 'multiprocessing.sharedctypes': 'multiprocessing#module-multiprocessing.sharedctypes', + 'netrc': 'netrc#module-netrc', + 'nis': 'nis#module-nis', + 'nntplib': 'nntplib#module-nntplib', + 'numbers': 'numbers#module-numbers', + 'operator': 'operator#module-operator', + 'optparse': 'optparse#module-optparse', + 'os': 'os#module-os', + 'os.path': 'os.path#module-os.path', + 'ossaudiodev': 'ossaudiodev#module-ossaudiodev', + 'pathlib': 'pathlib#module-pathlib', + 'pathlib.types': 'pathlib#module-pathlib.types', + 'pdb': 'pdb#module-pdb', + 'pickle': 'pickle#module-pickle', + 'pickletools': 'pickletools#module-pickletools', + 'pipes': 'pipes#module-pipes', + 'pkgutil': 'pkgutil#module-pkgutil', + 'platform': 'platform#module-platform', + 'plistlib': 'plistlib#module-plistlib', + 'poplib': 'poplib#module-poplib', + 'posix': 'posix#module-posix', + 'pprint': 'pprint#module-pprint', + 'profile': 'profile#module-profile', + 'profiling.sampling': 'profile#module-profiling.sampling', + 'pstats': 'profile#module-pstats', + 'pty': 'pty#module-pty', + 'pwd': 'pwd#module-pwd', + 'py_compile': 'py_compile#module-py_compile', + 'pyclbr': 'pyclbr#module-pyclbr', + 'pydoc': 'pydoc#module-pydoc', + 'queue': 'queue#module-queue', + 'quopri': 'quopri#module-quopri', + 'random': 'random#module-random', + 're': 're#module-re', + 'readline': 'readline#module-readline', + 'reprlib': 'reprlib#module-reprlib', + 'resource': 'resource#module-resource', + 'rlcompleter': 'rlcompleter#module-rlcompleter', + 'runpy': 'runpy#module-runpy', + 'sched': 'sched#module-sched', + 'secrets': 'secrets#module-secrets', + 'select': 'select#module-select', + 'selectors': 'selectors#module-selectors', + 'shelve': 'shelve#module-shelve', + 'shlex': 'shlex#module-shlex', + 'shutil': 'shutil#module-shutil', + 'signal': 'signal#module-signal', + 'site': 'site#module-site', + 'sitecustomize': 'site#module-sitecustomize', + 'smtpd': 'smtpd#module-smtpd', + 'smtplib': 'smtplib#module-smtplib', + 'sndhdr': 'sndhdr#module-sndhdr', + 'socket': 'socket#module-socket', + 'socketserver': 'socketserver#module-socketserver', + 'spwd': 'spwd#module-spwd', + 'sqlite3': 'sqlite3#module-sqlite3', + 'ssl': 'ssl#module-ssl', + 'stat': 'stat#module-stat', + 'statistics': 'statistics#module-statistics', + 'string': 'string#module-string', + 'string.templatelib': 'string.templatelib#module-string.templatelib', + 'stringprep': 'stringprep#module-stringprep', + 'struct': 'struct#module-struct', + 'subprocess': 'subprocess#module-subprocess', + 'sunau': 'sunau#module-sunau', + 'symtable': 'symtable#module-symtable', + 'sys': 'sys#module-sys', + 'sys.monitoring': 'sys.monitoring#module-sys.monitoring', + 'sysconfig': 'sysconfig#module-sysconfig', + 'syslog': 'syslog#module-syslog', + 'tabnanny': 'tabnanny#module-tabnanny', + 'tarfile': 'tarfile#module-tarfile', + 'telnetlib': 'telnetlib#module-telnetlib', + 'tempfile': 'tempfile#module-tempfile', + 'termios': 'termios#module-termios', + 'test': 'test#module-test', + 'test.regrtest': 'test#module-test.regrtest', + 'test.support': 'test#module-test.support', + 'test.support.bytecode_helper': 'test#module-test.support.bytecode_helper', + 'test.support.import_helper': 'test#module-test.support.import_helper', + 'test.support.os_helper': 'test#module-test.support.os_helper', + 'test.support.script_helper': 'test#module-test.support.script_helper', + 'test.support.socket_helper': 'test#module-test.support.socket_helper', + 'test.support.threading_helper': 'test#module-test.support.threading_helper', + 'test.support.warnings_helper': 'test#module-test.support.warnings_helper', + 'textwrap': 'textwrap#module-textwrap', + 'threading': 'threading#module-threading', + 'time': 'time#module-time', + 'timeit': 'timeit#module-timeit', + 'tkinter': 'tkinter#module-tkinter', + 'tkinter.colorchooser': 'tkinter.colorchooser#module-tkinter.colorchooser', + 'tkinter.commondialog': 'dialog#module-tkinter.commondialog', + 'tkinter.dnd': 'tkinter.dnd#module-tkinter.dnd', + 'tkinter.filedialog': 'dialog#module-tkinter.filedialog', + 'tkinter.font': 'tkinter.font#module-tkinter.font', + 'tkinter.messagebox': 'tkinter.messagebox#module-tkinter.messagebox', + 'tkinter.scrolledtext': 'tkinter.scrolledtext#module-tkinter.scrolledtext', + 'tkinter.simpledialog': 'dialog#module-tkinter.simpledialog', + 'tkinter.ttk': 'tkinter.ttk#module-tkinter.ttk', + 'token': 'token#module-token', + 'tokenize': 'tokenize#module-tokenize', + 'tomllib': 'tomllib#module-tomllib', + 'trace': 'trace#module-trace', + 'traceback': 'traceback#module-traceback', + 'tracemalloc': 'tracemalloc#module-tracemalloc', + 'tty': 'tty#module-tty', + 'turtle': 'turtle#module-turtle', + 'turtledemo': 'turtle#module-turtledemo', + 'types': 'types#module-types', + 'typing': 'typing#module-typing', + 'unicodedata': 'unicodedata#module-unicodedata', + 'unittest': 'unittest#module-unittest', + 'unittest.mock': 'unittest.mock#module-unittest.mock', + 'urllib': 'urllib#module-urllib', + 'urllib.error': 'urllib.error#module-urllib.error', + 'urllib.parse': 'urllib.parse#module-urllib.parse', + 'urllib.request': 'urllib.request#module-urllib.request', + 'urllib.response': 'urllib.request#module-urllib.response', + 'urllib.robotparser': 'urllib.robotparser#module-urllib.robotparser', + 'usercustomize': 'site#module-usercustomize', + 'uu': 'uu#module-uu', + 'uuid': 'uuid#module-uuid', + 'venv': 'venv#module-venv', + 'warnings': 'warnings#module-warnings', + 'wave': 'wave#module-wave', + 'weakref': 'weakref#module-weakref', + 'webbrowser': 'webbrowser#module-webbrowser', + 'winreg': 'winreg#module-winreg', + 'winsound': 'winsound#module-winsound', + 'wsgiref': 'wsgiref#module-wsgiref', + 'wsgiref.handlers': 'wsgiref#module-wsgiref.handlers', + 'wsgiref.headers': 'wsgiref#module-wsgiref.headers', + 'wsgiref.simple_server': 'wsgiref#module-wsgiref.simple_server', + 'wsgiref.types': 'wsgiref#module-wsgiref.types', + 'wsgiref.util': 'wsgiref#module-wsgiref.util', + 'wsgiref.validate': 'wsgiref#module-wsgiref.validate', + 'xdrlib': 'xdrlib#module-xdrlib', + 'xml': 'xml#module-xml', + 'xml.dom': 'xml.dom#module-xml.dom', + 'xml.dom.minidom': 'xml.dom.minidom#module-xml.dom.minidom', + 'xml.dom.pulldom': 'xml.dom.pulldom#module-xml.dom.pulldom', + 'xml.etree.ElementInclude': 'xml.etree.elementtree#module-xml.etree.ElementInclude', + 'xml.etree.ElementTree': 'xml.etree.elementtree#module-xml.etree.ElementTree', + 'xml.parsers.expat': 'pyexpat#module-xml.parsers.expat', + 'xml.parsers.expat.errors': 'pyexpat#module-xml.parsers.expat.errors', + 'xml.parsers.expat.model': 'pyexpat#module-xml.parsers.expat.model', + 'xml.sax': 'xml.sax#module-xml.sax', + 'xml.sax.handler': 'xml.sax.handler#module-xml.sax.handler', + 'xml.sax.saxutils': 'xml.sax.utils#module-xml.sax.saxutils', + 'xml.sax.xmlreader': 'xml.sax.reader#module-xml.sax.xmlreader', + 'xmlrpc': 'xmlrpc#module-xmlrpc', + 'xmlrpc.client': 'xmlrpc.client#module-xmlrpc.client', + 'xmlrpc.server': 'xmlrpc.server#module-xmlrpc.server', + 'zipapp': 'zipapp#module-zipapp', + 'zipfile': 'zipfile#module-zipfile', + 'zipimport': 'zipimport#module-zipimport', + 'zlib': 'zlib#module-zlib', + 'zoneinfo': 'zoneinfo#module-zoneinfo', +} diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index 5de99b8329bf74..34629fdc546db9 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -473,6 +473,32 @@ def test_issue8225(self): result, doc_loc = get_pydoc_text(xml.etree) self.assertEqual(doc_loc, "", "MODULE DOCS incorrectly includes a link") + def test_online_docs_link(self): + import encodings.idna + import importlib._bootstrap + + module_docs = { + 'encodings': 'codecs#module-encodings', + 'encodings.idna': 'codecs#module-encodings.idna', + } + + with unittest.mock.patch('pydoc_data.module_docs.module_docs', module_docs): + doc = pydoc.TextDoc() + + basedir = os.path.dirname(encodings.__file__) + doc_link = doc.getdocloc(encodings, basedir=basedir) + self.assertIsNotNone(doc_link) + self.assertIn('codecs#module-encodings', doc_link) + self.assertNotIn('encodings.html', doc_link) + + doc_link = doc.getdocloc(encodings.idna, basedir=basedir) + self.assertIsNotNone(doc_link) + self.assertIn('codecs#module-encodings.idna', doc_link) + self.assertNotIn('encodings.idna.html', doc_link) + + doc_link = doc.getdocloc(importlib._bootstrap, basedir=basedir) + self.assertIsNone(doc_link) + def test_getpager_with_stdin_none(self): previous_stdin = sys.stdin try: diff --git a/Misc/NEWS.d/next/Library/2025-10-12-12-05-52.gh-issue-139971.UdoStU.rst b/Misc/NEWS.d/next/Library/2025-10-12-12-05-52.gh-issue-139971.UdoStU.rst new file mode 100644 index 00000000000000..720397e2729c0a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-12-12-05-52.gh-issue-139971.UdoStU.rst @@ -0,0 +1,2 @@ +:mod:`pydoc`: Ensure that the link to the online documentation of a +:term:`stdlib` module is correct. From e6b11c886190ae83b9b54b9e026a5443c42bc19b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:51:54 +0200 Subject: [PATCH 1663/1674] [3.14] Update pre-commit with zizmor and Ruff fixes (GH-143095) (#143102) --- .github/dependabot.yml | 7 +++++++ .github/workflows/tail-call.yml | 20 ++++++++++---------- .pre-commit-config.yaml | 12 ++++++------ Doc/tools/check-warnings.py | 7 +++++-- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c8a3165d690364..7f3376f8ddb1e2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,6 +12,11 @@ updates: update-types: - "version-update:semver-minor" - "version-update:semver-patch" + cooldown: + # https://blog.yossarian.net/2025/11/21/We-should-all-be-using-dependency-cooldowns + # Cooldowns protect against supply chain attacks by avoiding the + # highest-risk window immediately after new releases. + default-days: 14 - package-ecosystem: "pip" directory: "/Tools/" schedule: @@ -19,3 +24,5 @@ updates: labels: - "skip issue" - "skip news" + cooldown: + default-days: 14 diff --git a/.github/workflows/tail-call.yml b/.github/workflows/tail-call.yml index e99e317182eaa6..182aadda77832b 100644 --- a/.github/workflows/tail-call.yml +++ b/.github/workflows/tail-call.yml @@ -81,24 +81,24 @@ jobs: - name: Native Windows (debug) if: runner.os == 'Windows' && matrix.architecture != 'ARM64' - shell: cmd + shell: pwsh run: | choco install llvm --allow-downgrade --no-progress --version ${{ matrix.llvm }}.1.0 - set PlatformToolset=clangcl - set LLVMToolsVersion=${{ matrix.llvm }}.1.0 - set LLVMInstallDir=C:\Program Files\LLVM - call ./PCbuild/build.bat --tail-call-interp -d -p ${{ matrix.architecture }} - call ./PCbuild/rt.bat -d -p ${{ matrix.architecture }} -q --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + $env:PlatformToolset = "clangcl" + $env:LLVMToolsVersion = "${{ matrix.llvm }}.1.0" + $env:LLVMInstallDir = "C:\Program Files\LLVM" + ./PCbuild/build.bat --tail-call-interp -d -p ${{ matrix.architecture }} + ./PCbuild/rt.bat -d -p ${{ matrix.architecture }} -q --multiprocess 0 --timeout 4500 --verbose2 --verbose3 # No tests (yet): - name: Emulated Windows (release) if: runner.os == 'Windows' && matrix.architecture == 'ARM64' - shell: cmd + shell: pwsh run: | choco install llvm --allow-downgrade --no-progress --version ${{ matrix.llvm }}.1.0 - set PlatformToolset=clangcl - set LLVMToolsVersion=${{ matrix.llvm }}.1.0 - set LLVMInstallDir=C:\Program Files\LLVM + $env:PlatformToolset = "clangcl" + $env:LLVMToolsVersion = "${{ matrix.llvm }}.1.0" + $env:LLVMInstallDir = "C:\Program Files\LLVM" ./PCbuild/build.bat --tail-call-interp -p ${{ matrix.architecture }} - name: Native macOS (release) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ee89e18db35e15..ed88e9ca81b49c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.2 + rev: v0.14.10 hooks: - id: ruff-check name: Run Ruff (lint) on Apple/ @@ -52,7 +52,7 @@ repos: files: ^Tools/wasm/ - repo: https://github.com/psf/black-pre-commit-mirror - rev: 25.9.0 + rev: 25.12.0 hooks: - id: black name: Run Black on Tools/jit/ @@ -83,24 +83,24 @@ repos: files: '^\.github/CODEOWNERS|\.(gram)$' - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.34.0 + rev: 0.36.0 hooks: - id: check-dependabot - id: check-github-workflows - id: check-readthedocs - repo: https://github.com/rhysd/actionlint - rev: v1.7.7 + rev: v1.7.9 hooks: - id: actionlint - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.14.1 + rev: v1.19.0 hooks: - id: zizmor - repo: https://github.com/sphinx-contrib/sphinx-lint - rev: v1.0.0 + rev: v1.0.2 hooks: - id: sphinx-lint args: [--enable=default-role] diff --git a/Doc/tools/check-warnings.py b/Doc/tools/check-warnings.py index f9b8c45a78af49..3168f3f01cd1e2 100644 --- a/Doc/tools/check-warnings.py +++ b/Doc/tools/check-warnings.py @@ -311,8 +311,11 @@ def main(argv: list[str] | None = None) -> int: 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() + warnings = ( + Path("Doc/sphinx-warnings.txt") + .read_text(encoding="UTF-8") + .splitlines() + ) cwd = str(Path.cwd()) + os.path.sep files_with_nits = { From 64461f1ca563a0b1a10ffce614bdccf8adf612db Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 24 Dec 2025 04:04:46 +0100 Subject: [PATCH 1664/1674] [3.14] gh-109263: Start process from spawn context in multiprocessing no longer have side effect (GH-135813) (#143115) gh-109263: Start process from spawn context in multiprocessing no longer have side effect (GH-135813) (cherry picked from commit c2202a7e661d40b1837cc0109cdb9ab40ec4e486) Co-authored-by: AN Long <aisk@users.noreply.github.com> --- Lib/multiprocessing/spawn.py | 2 +- Lib/test/_test_multiprocessing.py | 19 +++++++++++++++++++ ...-06-22-18-57-19.gh-issue-109263.f92V95.rst | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-06-22-18-57-19.gh-issue-109263.f92V95.rst diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index daac1ecc34b55e..d43864c939cb63 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -184,7 +184,7 @@ def get_preparation_data(name): sys_argv=sys.argv, orig_dir=process.ORIGINAL_DIR, dir=os.getcwd(), - start_method=get_start_method(), + start_method=get_start_method(allow_none=True), ) # Figure out whether to initialise main in the subprocess as a module diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 4b437f8eb48865..d7f804a7c69701 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -5845,6 +5845,25 @@ def test_context(self): self.assertRaises(ValueError, ctx.set_start_method, None) self.check_context(ctx) + @staticmethod + def _dummy_func(): + pass + + def test_spawn_dont_set_context(self): + # Run a process with spawn or forkserver context may change + # the global start method, see gh-109263. + for method in ('fork', 'spawn', 'forkserver'): + multiprocessing.set_start_method(None, force=True) + + try: + ctx = multiprocessing.get_context(method) + except ValueError: + continue + process = ctx.Process(target=self._dummy_func) + process.start() + process.join() + self.assertIsNone(multiprocessing.get_start_method(allow_none=True)) + def test_context_check_module_types(self): try: ctx = multiprocessing.get_context('forkserver') diff --git a/Misc/NEWS.d/next/Library/2025-06-22-18-57-19.gh-issue-109263.f92V95.rst b/Misc/NEWS.d/next/Library/2025-06-22-18-57-19.gh-issue-109263.f92V95.rst new file mode 100644 index 00000000000000..6b96b5b9b2a0de --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-06-22-18-57-19.gh-issue-109263.f92V95.rst @@ -0,0 +1,2 @@ +Starting a process from spawn context in :mod:`multiprocessing` no longer +sets the start method globally. From 41f468786762348960486c166833a218a0a436af Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 24 Dec 2025 14:25:43 +0100 Subject: [PATCH 1665/1674] [3.14] gh-142145: Avoid timing measurements in quadratic behavior test (gh-143105) (#143139) Count the number of Element attribute accesses as a proxy for work done. With double the amount of work, a ratio of 2.0 indicates linear scaling and 4.0 quadratic scaling. Use 3.2 as an intermediate threshold. (cherry picked from commit 57937a8e5e293f0dcba5115f7b7a11b1e0c9a273) Co-authored-by: Sam Gross <colesbury@gmail.com> --- Lib/test/test_minidom.py | 48 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 69fae957ec7fc9..46249e5138aed5 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -2,7 +2,6 @@ import copy import pickle -import time import io from test import support import unittest @@ -178,23 +177,36 @@ def testAppendChild(self): def testAppendChildNoQuadraticComplexity(self): impl = getDOMImplementation() - newdoc = impl.createDocument(None, "some_tag", None) - top_element = newdoc.documentElement - children = [newdoc.createElement(f"child-{i}") for i in range(1, 2 ** 15 + 1)] - element = top_element - - start = time.monotonic() - for child in children: - element.appendChild(child) - element = child - end = time.monotonic() - - # This example used to take at least 30 seconds. - # Conservative assertion due to the wide variety of systems and - # build configs timing based tests wind up run under. - # A --with-address-sanitizer --with-pydebug build on a rpi5 still - # completes this loop in <0.5 seconds. - self.assertLess(end - start, 4) + def work(n): + doc = impl.createDocument(None, "some_tag", None) + element = doc.documentElement + total_calls = 0 + + # Count attribute accesses as a proxy for work done + def getattribute_counter(self, attr): + nonlocal total_calls + total_calls += 1 + return object.__getattribute__(self, attr) + + with support.swap_attr(Element, "__getattribute__", getattribute_counter): + for _ in range(n): + child = doc.createElement("child") + element.appendChild(child) + element = child + return total_calls + + # Doubling N should not ~quadruple the work. + w1 = work(1024) + w2 = work(2048) + w3 = work(4096) + + self.assertGreater(w1, 0) + r1 = w2 / w1 + r2 = w3 / w2 + self.assertLess( + max(r1, r2), 3.2, + msg=f"Possible quadratic behavior: work={w1,w2,w3} ratios={r1,r2}" + ) def testSetAttributeNodeWithoutOwnerDocument(self): # regression test for gh-142754 From b921374c78db9bef15057a937f12083a714a47f2 Mon Sep 17 00:00:00 2001 From: Sam Gross <colesbury@gmail.com> Date: Wed, 24 Dec 2025 08:31:05 -0500 Subject: [PATCH 1666/1674] [3.14] gh-143121: Skip test that leak threads under TSan (gh-143125) (#143141) (cherry picked from commit 4ee6929d606fa7b976eba229de24219f0edac3d7) --- Lib/test/_test_multiprocessing.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index d7f804a7c69701..cd64a2ca43cc3e 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3312,6 +3312,7 @@ class _TestMyManager(BaseTestCase): ALLOWED_TYPES = ('manager',) + @support.skip_if_sanitizer('TSan: leaks threads', thread=True) def test_mymanager(self): manager = MyManager(shutdown_timeout=SHUTDOWN_TIMEOUT) manager.start() @@ -3323,6 +3324,7 @@ def test_mymanager(self): # which happens on slow buildbots. self.assertIn(manager._process.exitcode, (0, -signal.SIGTERM)) + @support.skip_if_sanitizer('TSan: leaks threads', thread=True) def test_mymanager_context(self): manager = MyManager(shutdown_timeout=SHUTDOWN_TIMEOUT) with manager: @@ -3332,6 +3334,7 @@ def test_mymanager_context(self): # which happens on slow buildbots. self.assertIn(manager._process.exitcode, (0, -signal.SIGTERM)) + @support.skip_if_sanitizer('TSan: leaks threads', thread=True) def test_mymanager_context_prestarted(self): manager = MyManager(shutdown_timeout=SHUTDOWN_TIMEOUT) manager.start() @@ -3402,6 +3405,7 @@ def _putter(cls, address, authkey): # Note that xmlrpclib will deserialize object as a list not a tuple queue.put(tuple(cls.values)) + @support.skip_if_sanitizer('TSan: leaks threads', thread=True) def test_remote(self): authkey = os.urandom(32) @@ -3443,6 +3447,7 @@ def _putter(cls, address, authkey): queue = manager.get_queue() queue.put('hello world') + @support.skip_if_sanitizer("TSan: leaks threads", thread=True) def test_rapid_restart(self): authkey = os.urandom(32) manager = QueueManager( From 68098110367bf23fc03cd4a5813c266bd234e6f7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 24 Dec 2025 19:20:05 +0100 Subject: [PATCH 1667/1674] [3.14] Correctly fold unknown-8bit originating from encoded words. (GH-142517) (#143146) The unknown-8bit trick was designed to deal with unknown bytes in an ASCII message, and it works fine for that. However, I also tried to extend it to handle bytes that can't be decoded using the charset specified in an encoded word, and there it fails because there can be other non-ASCII characters that were *successfully* decoded. The fix is simple: do the unknown-8bit encoding using the utf-8 codec. This is especially appropriate since anyone trying to do recovery on an unknown byte string will probably attempt utf-8 first. (cherry picked from commit 1e17ccd030a2285ad53db5952360fffa33a8a877) Co-authored-by: R. David Murray <rdmurray@bitdance.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/email/_encoded_words.py | 2 +- Lib/test/test_email/test__header_value_parser.py | 8 ++++++++ .../2025-12-10-10-00-06.gh-issue-142517.fG4hbe.rst | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-10-10-00-06.gh-issue-142517.fG4hbe.rst diff --git a/Lib/email/_encoded_words.py b/Lib/email/_encoded_words.py index 6795a606de037e..05a34a4c105233 100644 --- a/Lib/email/_encoded_words.py +++ b/Lib/email/_encoded_words.py @@ -219,7 +219,7 @@ def encode(string, charset='utf-8', encoding=None, lang=''): """ if charset == 'unknown-8bit': - bstring = string.encode('ascii', 'surrogateescape') + bstring = string.encode('utf-8', 'surrogateescape') else: bstring = string.encode(charset) if encoding is None: diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index f33844910beee4..426ec4644e3096 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -3340,5 +3340,13 @@ def test_fold_unfoldable_element_stealing_whitespace(self): token = parser.get_address_list(text)[0] self._test(token, expected, policy=policy) + def test_encoded_word_with_undecodable_bytes(self): + self._test(parser.get_address_list( + ' =?utf-8?Q?=E5=AE=A2=E6=88=B6=E6=AD=A3=E8=A6=8F=E4=BA=A4=E7?=' + )[0], + ' =?unknown-8bit?b?5a6i5oi25q2j6KaP5Lqk5w==?=\n', + ) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2025-12-10-10-00-06.gh-issue-142517.fG4hbe.rst b/Misc/NEWS.d/next/Library/2025-12-10-10-00-06.gh-issue-142517.fG4hbe.rst new file mode 100644 index 00000000000000..d58e532ac43ebe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-10-10-00-06.gh-issue-142517.fG4hbe.rst @@ -0,0 +1,4 @@ +The non-``compat32`` :mod:`email` policies now correctly handle refolding +encoded words that contain bytes that can not be decoded in their specified +character set. Previously this resulted in an encoding exception during +folding. From 73c40bb8ba69688f66415f869e521d446bbc1526 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 24 Dec 2025 19:23:41 +0100 Subject: [PATCH 1668/1674] [3.14] gh-143135: Fix sys.flags.inspect when PYTHONINSPECT=0 (GH-143136) (GH-143153) (cherry picked from commit 3509fa5a12855805f0c6d7f8a6a3b162744a8fd4) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- .../2025-12-24-11-39-59.gh-issue-143135.3d5ovx.rst | 2 ++ Python/initconfig.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-11-39-59.gh-issue-143135.3d5ovx.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-11-39-59.gh-issue-143135.3d5ovx.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-11-39-59.gh-issue-143135.3d5ovx.rst new file mode 100644 index 00000000000000..2ff08b44355704 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-11-39-59.gh-issue-143135.3d5ovx.rst @@ -0,0 +1,2 @@ +Set :data:`sys.flags.inspect` to ``1`` when :envvar:`PYTHONINSPECT` is ``0``. +Previously, it was set to ``0`` in this case. diff --git a/Python/initconfig.c b/Python/initconfig.c index bdd223213f5dd6..2dce878770db4a 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1845,7 +1845,9 @@ config_read_env_vars(PyConfig *config) _Py_get_env_flag(use_env, &config->parser_debug, "PYTHONDEBUG"); _Py_get_env_flag(use_env, &config->verbose, "PYTHONVERBOSE"); _Py_get_env_flag(use_env, &config->optimization_level, "PYTHONOPTIMIZE"); - _Py_get_env_flag(use_env, &config->inspect, "PYTHONINSPECT"); + if (!config->inspect && _Py_GetEnv(use_env, "PYTHONINSPECT")) { + config->inspect = 1; + } int dont_write_bytecode = 0; _Py_get_env_flag(use_env, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE"); From bac24eed2a9c91b415954d1b0b2f88bc60b45964 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 24 Dec 2025 20:33:12 +0100 Subject: [PATCH 1669/1674] [3.14] Move News for gh-142560 to Core and Builtins (GH-143154) (GH-143155) (cherry picked from commit 305aff0a66ad86274a58d5a5aae445713a4c4cca) Co-authored-by: Cody Maloney <cmaloney@users.noreply.github.com> --- .../2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Misc/NEWS.d/next/{Library => Core_and_Builtins}/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst (100%) diff --git a/Misc/NEWS.d/next/Library/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst similarity index 100% rename from Misc/NEWS.d/next/Library/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst rename to Misc/NEWS.d/next/Core_and_Builtins/2025-12-11-22-59-33.gh-issue-142560.GkJrkk.rst From 240ee207708e4103e4a9f459ff9bf285511e43cc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 25 Dec 2025 12:41:10 +0100 Subject: [PATCH 1670/1674] [3.14] gh-143004: Fix possible use-after-free in collections.Counter.update() (GH-143044) (GH-143166) This happened when the Counter was mutated when incrementing the value for an existing key. (cherry picked from commit 86d904588e8c84c7fccb8faf84b343f03461970d) Co-authored-by: kaushal trivedi <155625932+Kaushalt2004@users.noreply.github.com> --- Lib/test/test_collections.py | 13 +++++++++++++ ...5-12-22-00-00-00.gh-issue-143004.uaf-counter.rst | 2 ++ Modules/_collectionsmodule.c | 5 +++++ 3 files changed, 20 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-12-22-00-00-00.gh-issue-143004.uaf-counter.rst diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 3dac736e0189b1..c1dadc4e274ec9 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -2118,6 +2118,19 @@ def test_basics(self): self.assertEqual(c.setdefault('e', 5), 5) self.assertEqual(c['e'], 5) + def test_update_reentrant_add_clears_counter(self): + c = Counter() + key = object() + + class Evil(int): + def __add__(self, other): + c.clear() + return NotImplemented + + c[key] = Evil() + c.update([key]) + self.assertEqual(c[key], 1) + def test_init(self): self.assertEqual(list(Counter(self=42).items()), [('self', 42)]) self.assertEqual(list(Counter(iterable=42).items()), [('iterable', 42)]) diff --git a/Misc/NEWS.d/next/Library/2025-12-22-00-00-00.gh-issue-143004.uaf-counter.rst b/Misc/NEWS.d/next/Library/2025-12-22-00-00-00.gh-issue-143004.uaf-counter.rst new file mode 100644 index 00000000000000..278066e9b706bf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-22-00-00-00.gh-issue-143004.uaf-counter.rst @@ -0,0 +1,2 @@ +Fix a potential use-after-free in :meth:`collections.Counter.update` when user code +mutates the Counter during an update. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 3b14a21fa8428e..45ca63e6d7c77f 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2577,7 +2577,12 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0) goto done; } else { + /* oldval is a borrowed reference. Keep it alive across + PyNumber_Add(), which can execute arbitrary user code and + mutate (or even clear) the underlying dict. */ + Py_INCREF(oldval); newval = PyNumber_Add(oldval, one); + Py_DECREF(oldval); if (newval == NULL) goto done; if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0) From 02282e5479b49743fed2cb1e405369430edc4d6a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 25 Dec 2025 13:41:42 +0100 Subject: [PATCH 1671/1674] [3.14] gh-140717: Add `exc_text` to LogRecord attributes table (GH-140718) (GH-143152) Co-authored-by: Tom Kuson <mail@tjkuson.me> --- Doc/library/logging.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 8c8f50692fa1fa..9d93ac110c9bd2 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1011,6 +1011,11 @@ the options available to you. | exc_info | You shouldn't need to | Exception tuple (à la ``sys.exc_info``) or, | | | format this yourself. | if no exception has occurred, ``None``. | +----------------+-------------------------+-----------------------------------------------+ +| exc_text | You shouldn't need to | Exception information formatted as a string. | +| | format this yourself. | This is set when :meth:`Formatter.format` is | +| | | invoked, or ``None`` if no exception has | +| | | occurred. | ++----------------+-------------------------+-----------------------------------------------+ | filename | ``%(filename)s`` | Filename portion of ``pathname``. | +----------------+-------------------------+-----------------------------------------------+ | funcName | ``%(funcName)s`` | Name of function containing the logging call. | From 8a61b71eeef01b6024dccf6705cdfaa4c6c2edaf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 25 Dec 2025 18:00:42 +0100 Subject: [PATCH 1672/1674] [3.14] gh-142975: During GC, mark frozen objects with a merged zero refcount for destruction (GH-143156) (GH-143175) gh-142975: During GC, mark frozen objects with a merged zero refcount for destruction (GH-143156) (cherry picked from commit 8611f74e089d9ac9de84dd42be9d251db27889aa) Co-authored-by: Peter Bierma <zintensitydev@gmail.com> --- Lib/test/test_free_threading/test_gc.py | 32 +++++++++++++++++++ ...-12-24-13-44-24.gh-issue-142975.8C4vIP.rst | 2 ++ Python/gc_free_threading.c | 6 +++- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-13-44-24.gh-issue-142975.8C4vIP.rst diff --git a/Lib/test/test_free_threading/test_gc.py b/Lib/test/test_free_threading/test_gc.py index 3b83e0431efa6b..8b45b6e2150c28 100644 --- a/Lib/test/test_free_threading/test_gc.py +++ b/Lib/test/test_free_threading/test_gc.py @@ -62,6 +62,38 @@ def mutator_thread(): with threading_helper.start_threads(gcs + mutators): pass + def test_freeze_object_in_brc_queue(self): + # GH-142975: Freezing objects in the BRC queue could result in some + # objects having a zero refcount without being deallocated. + + class Weird: + # We need a destructor to trigger the check for object resurrection + def __del__(self): + pass + + # This is owned by the main thread, so the subthread will have to increment + # this object's reference count. + weird = Weird() + + def evil(): + gc.freeze() + + # Decrement the reference count from this thread, which will trigger the + # slow path during resurrection and add our weird object to the BRC queue. + nonlocal weird + del weird + + # Collection will merge the object's reference count and make it zero. + gc.collect() + + # Unfreeze the object, making it visible to the GC. + gc.unfreeze() + gc.collect() + + thread = Thread(target=evil) + thread.start() + thread.join() + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-13-44-24.gh-issue-142975.8C4vIP.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-13-44-24.gh-issue-142975.8C4vIP.rst new file mode 100644 index 00000000000000..9d7f57ee60aa47 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-24-13-44-24.gh-issue-142975.8C4vIP.rst @@ -0,0 +1,2 @@ +Fix crash after unfreezing all objects tracked by the garbage collector on +the :term:`free threaded <free threading>` build. diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index 079b6b78dcd96f..70f04a73437e77 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -905,7 +905,11 @@ gc_visit_thread_stacks_mark_alive(PyInterpreterState *interp, gc_mark_args_t *ar static void queue_untracked_obj_decref(PyObject *op, struct collection_state *state) { - if (!_PyObject_GC_IS_TRACKED(op)) { + assert(Py_REFCNT(op) == 0); + // gh-142975: We have to treat frozen objects as untracked in this function + // or else they might be picked up in a future collection, which breaks the + // assumption that all incoming objects have a non-zero reference count. + if (!_PyObject_GC_IS_TRACKED(op) || gc_is_frozen(op)) { // GC objects with zero refcount are handled subsequently by the // GC as if they were cyclic trash, but we have to handle dead // non-GC objects here. Add one to the refcount so that we can From 88a4d0d34b7dc67f3daea57898c281439dce085d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 25 Dec 2025 18:09:53 +0100 Subject: [PATCH 1673/1674] [3.14] gh-143145: Fix possible reference leak in ctypes _build_result() (GH-143131) (GH-143169) The result tuple was leaked if __ctypes_from_outparam__() failed for any item. (cherry picked from commit 579c5b496b467a2b175cb30caa4f6873cb13c9a1) Signed-off-by: Yongtao Huang <yongtaoh2022@gmail.com> Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com> --- .../next/Library/2025-12-24-14-18-52.gh-issue-143145.eXLw8D.rst | 1 + Modules/_ctypes/_ctypes.c | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-12-24-14-18-52.gh-issue-143145.eXLw8D.rst diff --git a/Misc/NEWS.d/next/Library/2025-12-24-14-18-52.gh-issue-143145.eXLw8D.rst b/Misc/NEWS.d/next/Library/2025-12-24-14-18-52.gh-issue-143145.eXLw8D.rst new file mode 100644 index 00000000000000..2aff1090b1812f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-24-14-18-52.gh-issue-143145.eXLw8D.rst @@ -0,0 +1 @@ +Fixed a possible reference leak in ctypes when constructing results with multiple output parameters on error. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index bac119f2ae7a36..3d48c70bd0d227 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4551,6 +4551,7 @@ _build_result(PyObject *result, PyObject *callargs, v = PyTuple_GET_ITEM(callargs, i); v = PyObject_CallMethodNoArgs(v, &_Py_ID(__ctypes_from_outparam__)); if (v == NULL || numretvals == 1) { + Py_XDECREF(tup); Py_DECREF(callargs); return v; } From 723ed8c507860334eff4b9bad8dde8dddb604dcf Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 25 Dec 2025 18:34:02 +0100 Subject: [PATCH 1674/1674] [3.14] gh-143164: Fix incorrect error message for ctypes bitfield overflow (GH-143165) (GH-143176) (cherry picked from commit b9a48064306229287d7211e9510f578065e457fc) Signed-off-by: Yongtao Huang <yongtaoh2022@gmail.com> Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com> --- Lib/test/test_ctypes/test_struct_fields.py | 15 +++++++++++++++ ...2025-12-25-08-58-55.gh-issue-142164.XrFztf.rst | 1 + Modules/_ctypes/cfield.c | 4 ++-- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-25-08-58-55.gh-issue-142164.XrFztf.rst diff --git a/Lib/test/test_ctypes/test_struct_fields.py b/Lib/test/test_ctypes/test_struct_fields.py index b50bbcbb65c423..dc26e26d8a9fb1 100644 --- a/Lib/test/test_ctypes/test_struct_fields.py +++ b/Lib/test/test_ctypes/test_struct_fields.py @@ -130,6 +130,21 @@ class S(Structure): self.check_struct(S) self.assertEqual(S.largeField.bit_size, size * 8) + def test_bitfield_overflow_error_message(self): + with self.assertRaisesRegex( + ValueError, + r"bit field 'x' overflows its type \(2 \+ 7 > 8\)", + ): + CField( + name="x", + type=c_byte, + byte_size=1, + byte_offset=0, + index=0, + _internal_use=True, + bit_size=7, + bit_offset=2, + ) # __set__ and __get__ should raise a TypeError in case their self # argument is not a ctype instance. diff --git a/Misc/NEWS.d/next/Library/2025-12-25-08-58-55.gh-issue-142164.XrFztf.rst b/Misc/NEWS.d/next/Library/2025-12-25-08-58-55.gh-issue-142164.XrFztf.rst new file mode 100644 index 00000000000000..e75270b9e94c03 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-25-08-58-55.gh-issue-142164.XrFztf.rst @@ -0,0 +1 @@ +Fix the ctypes bitfield overflow error message to report the correct offset and size calculation. diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 662b57a5b825e2..e0d172fa435416 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -160,8 +160,8 @@ PyCField_new_impl(PyTypeObject *type, PyObject *name, PyObject *proto, if ((bitfield_size + bit_offset) > byte_size * 8) { PyErr_Format( PyExc_ValueError, - "bit field %R overflows its type (%zd + %zd >= %zd)", - name, bit_offset, byte_size*8); + "bit field %R overflows its type (%zd + %zd > %zd)", + name, bit_offset, bitfield_size, byte_size * 8); goto error; } }